// this method compute distance between clusters thas has subclusters (cluster2 represents the new cluster)
        public static double ComputeDistance(Cluster cluster1, Cluster cluster2, DissimilarityMatrix dissimilarityMatrix, Strategy strategy)
        {
            double distance1, distance2, distance = 0;

            //get the distance between cluster1 and subcluster0 of the cluster2
            distance1 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterPair(cluster1, cluster2.GetSubCluster(0)));
            //get the distance between cluster1 and subcluster1 of the cluster cluster2
            distance2 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterPair(cluster1, cluster2.GetSubCluster(1)));

            switch (strategy)
            {
            case Strategy.SingleLinkage: distance = _MinValue(distance1, distance2); break;

            case Strategy.CompleteLinkage: distance = _MaxValue(distance1, distance2); break;

            case Strategy.AverageLinkageWPGMA: distance = (distance1 + distance2) / 2; break;

            case Strategy.AverageLinkageUPGMA:
                distance = ((cluster2.GetSubCluster(0).TotalQuantityOfPatterns *distance1) / cluster2.TotalQuantityOfPatterns) + ((cluster2.GetSubCluster(1).TotalQuantityOfPatterns *distance2) / cluster2.TotalQuantityOfPatterns);
                break;

            default: break;
            }

            return(distance);
        }
        // compute the distance between all pair of clusters and store it on the dissimilarity matrix. this algorithm step is done using parallelization to improve performance.
        private void _BuildDissimilarityMatrixParallel()
        {
            double distanceBetweenTwoClusters;

            _dissimilarityMatrix = new DissimilarityMatrix();

            Parallel.ForEach(_ClusterPairCollection(), clusterPair =>
            {
                distanceBetweenTwoClusters = ClusterDistance.ComputeDistance(clusterPair.Cluster1, clusterPair.Cluster2);
                _dissimilarityMatrix.AddClusterPairAndDistance(clusterPair, distanceBetweenTwoClusters);
            });
        }
        // calcula a distancia entre todos os clusters e as armazena na matrix de dissimilaridade
        private void CreateDissimilarityMatrix()
        {
            double distanceBetweenTwoClusters;

            _dissimilarityMatrix = new DissimilarityMatrix();
            ClusterPair clusterPair;

            for (int i = 0; i < _clusters.Count(); i++)
            {
                for (int j = i + 1; j < _clusters.Count(); j++)
                {
                    clusterPair          = new ClusterPair();
                    clusterPair.Cluster1 = _clusters.GetCluster(i);
                    clusterPair.Cluster2 = _clusters.GetCluster(j);

                    distanceBetweenTwoClusters = ClusterDistance.ComputeDistance(clusterPair.Cluster1, clusterPair.Cluster2);
                    _dissimilarityMatrix.AddClusterPairAndDistance(clusterPair, distanceBetweenTwoClusters);
                }
            }
        }