public void RemoveClusterPair(ClusterNodePair clusterPair)
        {
            double outvalue;

            if (distanceMatrix.ContainsKey(clusterPair))
            {
                distanceMatrix.TryRemove(clusterPair, out outvalue);
            }
            else
            {
                distanceMatrix.TryRemove(new ClusterNodePair(clusterPair.Cluster2, clusterPair.Cluster1), out outvalue);
            }
        }
        private void BuildHierarchicalClustering(int indexNewNode, ClusterDistance.Strategy strategy, int k)
        {
            ClusterNodePair closestClusterPair = dissimilarityMatrix.GetClosestClusterPair();

            ClusterNode newNode = new ClusterNode();

            newNode.Add(closestClusterPair.Cluster1);
            newNode.Add(closestClusterPair.Cluster2);
            newNode.Id       = indexNewNode;
            newNode.Distance = dissimilarityMatrix.ReturnClusterPairDistance(closestClusterPair);
            newNode.UpdateTotalLeafs();

            nodeCollection.Remove(closestClusterPair.Cluster1);
            nodeCollection.Remove(closestClusterPair.Cluster2);
            UpdateDissimilarityMatrix(newNode, strategy);

            nodeCollection.Add(newNode);

            if (nodeCollection.Count > k)
            {
                BuildHierarchicalClustering(indexNewNode + 1, strategy, k);
            }
        }
 // get the distance value from a cluster pair. THIS METHOD DEPENDS ON THE EqualityComparer IMPLEMENTATION IN ClusterPair CLASS
 public double ReturnClusterPairDistance(ClusterNodePair clusterPair)
 {
     return(distanceMatrix.ContainsKey(clusterPair)
         ? distanceMatrix[clusterPair]
         : distanceMatrix[new ClusterNodePair(clusterPair.Cluster2, clusterPair.Cluster1)]); // Reverse
 }
 public void AddClusterPairAndDistance(ClusterNodePair clusterPair, double distance)
 {
     distanceMatrix.TryAdd(clusterPair, distance);
 }