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);
        }