public void ReAssignWorstFit() { //dont try if no reassignment is possible. if (NumClusters < 2) { return; } var emptyClusters = new List <Cluster>(); //todo, can also skip clusters that have not changed since the last iteration... foreach (var originalCluster in Clusters.OrderBy(x => x.NumVeads)) { while (true) { if (originalCluster.NumVeadGroups == 0) { break; } var worstVg = originalCluster.GetWorstAgreement(); var bestFits = GetClusterFits(worstVg); if (bestFits.Count == 0) { break; } //TODO //if a read fits in both, equally, test if these two clusters can be merged //TODO GB for expected results, change to Last. var bestFit = bestFits.First().Value[0]; //TODO if there is a tie for first, will originalCluster always be first? Or do we bounce back and forth between the two... //if it fits better somewhere else, move it over. if (bestFit != originalCluster) { originalCluster.Remove(worstVg); bestFit.Add(worstVg); if (originalCluster.NumVeadGroups == 0) { emptyClusters.Add(originalCluster); //TODO GB THIS GIVES MY EXPECTED RESULTS //RemoveCluster(originalCluster.Name); //break; } } else { break; } } } foreach (var cluster in emptyClusters) { _clusterLookup.Remove(cluster.Name); } }