< Summary

Class:ConstrainedKMeansClusterer
Assembly:bamlab.micromissiles
File(s):/github/workspace/Assets/Scripts/Algorithms/Clustering/ConstrainedKMeansClusterer.cs
Covered lines:0
Uncovered lines:24
Coverable lines:24
Total lines:44
Line coverage:0% (0 of 24)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:2
Method coverage:0% (0 of 2)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ConstrainedKMeansClusterer(...)0%2100%
Cluster(...)0%72800%

File(s)

/github/workspace/Assets/Scripts/Algorithms/Clustering/ConstrainedKMeansClusterer.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using UnityEngine;
 4
 5// The constrained k-means clusterer performs k-means clustering under size and radius constraints.
 6public class ConstrainedKMeansClusterer : SizeAndRadiusConstrainedClustererBase {
 07  public ConstrainedKMeansClusterer(int maxSize, float maxRadius) : base(maxSize, maxRadius) {}
 8
 9  // Generate the clusters from the list of hierarchical objects.
 010  public override List<Cluster> Cluster(IEnumerable<IHierarchical> hierarchicals) {
 011    if (hierarchicals == null || !hierarchicals.Any()) {
 012      return new List<Cluster>();
 13    }
 14
 015    int numClusters = (int)Mathf.Ceil(hierarchicals.Count() / _maxSize);
 16    KMeansClusterer clusterer;
 17    List<Cluster> clusters;
 018    while (true) {
 019      clusterer = new KMeansClusterer(numClusters);
 020      clusters = clusterer.Cluster(hierarchicals);
 21
 22      // Count the number of over-populated and over-sized clusters.
 023      int numOverPopulatedClusters = 0;
 024      int numOverSizedClusters = 0;
 025      foreach (var cluster in clusters) {
 026        if (cluster.Size > _maxSize) {
 027          ++numOverPopulatedClusters;
 028        }
 029        if (cluster.Radius() > _maxRadius) {
 030          ++numOverSizedClusters;
 031        }
 032      }
 33
 34      // If all clusters satisfy the size and radius constraints, the algorithm has converged.
 035      if (numOverPopulatedClusters == 0 && numOverSizedClusters == 0) {
 036        break;
 37      }
 38
 039      numClusters +=
 40          (int)Mathf.Ceil(Mathf.Max(numOverPopulatedClusters, numOverSizedClusters) / 2f);
 041    }
 042    return clusters;
 043  }
 44}