public static void TryMergeAllClusters(SetOfClusters clusterSet, int maxNumDisagreements) { var clusters = clusterSet.Clusters; for (var i = 0; i < clusters.Count(); i++) { for (var j = i + 1; j < clusters.Count(); j++) { var clusterA = clusters[i]; var clusterB = clusters[j]; var canBeMerged = TestCanBeMerged(clusterA, clusterB, maxNumDisagreements); if (!canBeMerged) { continue; } clusterSet.RemoveCluster(clusterA.Name); clusterSet.RemoveCluster(clusterB.Name); var mergedCluster = MergeClusters(clusterA, clusterB); clusterSet.AddCluster(mergedCluster); } } }
public void MergeAllBestCandidates() { var setOfClusters = new SetOfClusters(new ClusteringParameters()); var veadgroups = ClusterTestHelpers.GetSampleVeadGroups(prefix: "Original"); var cluster = new Cluster("test", veadgroups); setOfClusters.AddCluster(cluster); var veadgroups2 = ClusterTestHelpers.GetSampleVeadGroups(prefix: "Second"); var cluster2 = new Cluster("test2", veadgroups2); setOfClusters.AddCluster(cluster2); Assert.Equal(2, setOfClusters.NumClusters); var veadgroups3 = ClusterTestHelpers.GetSampleVeadGroups(1, 1, prefix: "Tester"); // If can be merged, we should have 1 cluster. var bestCluster = ClusterMerger.MergeAllBestCandidates(setOfClusters, 0, new List <Cluster> { cluster, cluster2 }, veadgroups3.First()); Assert.Equal(1, setOfClusters.NumClusters); }
public static Cluster MergeAllBestCandidates(SetOfClusters clusters, int maxNumDisagreements, List <Cluster> bestCandidates, VeadGroup testVeadGroup) { var numCandidates = bestCandidates.Count; var bestcluster = bestCandidates[0]; for (var i = 0; i < numCandidates; i++) { for (var j = i + 1; j < numCandidates; j++) { // First test if the clusters can be merged. If they can, merge them. // If they can't, return the better of the two. var clusterA = bestCandidates[i]; var clusterB = bestCandidates[j]; var canBeMerged = TestCanBeMerged(clusterA, clusterB, maxNumDisagreements, testVeadGroup); if (canBeMerged) { clusters.RemoveCluster(clusterA.Name); clusters.RemoveCluster(clusterB.Name); var mergedCluster = MergeClusters(clusterA, clusterB); clusters.AddCluster(mergedCluster); bestcluster = mergedCluster; } else { if (clusterB.NumVeads > clusterA.NumVeads) { bestcluster = clusterB; } //else, leave it as bestcluster = cA; } } } return(bestcluster); }