< Summary

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

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ConstrainedKMeansClusterer(...)0%110100%
Cluster(...)0%8.058090.62%

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 {
 187  public ConstrainedKMeansClusterer(int maxSize, float maxRadius) : base(maxSize, maxRadius) {}
 8
 9  // Generate the clusters from the list of hierarchical objects.
 610  public override List<Cluster> Cluster(IEnumerable<IHierarchical> hierarchicals) {
 811    if (hierarchicals == null || !hierarchicals.Any()) {
 212      return new List<Cluster>();
 13    }
 14
 415    int numClusters = (int)Mathf.Ceil(hierarchicals.Count() / _maxSize);
 16    KMeansClusterer clusterer;
 17    List<Cluster> clusters;
 1618    while (true) {
 819      clusterer = new KMeansClusterer(numClusters);
 820      clusters = clusterer.Cluster(hierarchicals);
 21
 22      // Count the number of over-populated and over-sized clusters.
 823      int numOverPopulatedClusters = 0;
 824      int numOverSizedClusters = 0;
 7825      foreach (var cluster in clusters) {
 1826        if (cluster.Size > _maxSize) {
 027          ++numOverPopulatedClusters;
 028        }
 2229        if (cluster.Radius() > _maxRadius) {
 430          ++numOverSizedClusters;
 431        }
 1832      }
 33
 34      // If all clusters satisfy the size and radius constraints, the algorithm has converged.
 1235      if (numOverPopulatedClusters == 0 && numOverSizedClusters == 0) {
 436        break;
 37      }
 38
 439      numClusters +=
 40          (int)Mathf.Ceil(Mathf.Max(numOverPopulatedClusters, numOverSizedClusters) / 2f);
 441    }
 442    return clusters;
 643  }
 44}