void ComputeMaxClusterMetrics() {
		size_t max_orig_cluster = 0;
		for(auto it = original_clusters_.clusters_begin(); it != original_clusters_.clusters_end(); it++)
			if(metrics_.original_metrics.max_cluster < original_clusters_.ClusterSize(it->first)) {
				metrics_.original_metrics.max_cluster = original_clusters_.ClusterSize(it->first);
				max_orig_cluster = it->first;
			}

		for(auto it = constructed_clusters_.clusters_begin(); it != constructed_clusters_.clusters_end(); it++) {
			metrics_.constructed_metrics.max_cluster = max<size_t>(metrics_.constructed_metrics.max_cluster,
					constructed_clusters_.ClusterSize(it->first));
		}

		metrics_.max_cluster_fillin = ComputeNotMergedFillin(max_orig_cluster);
	}
	void ComputeConstructedSingletons() {
		for(auto it = constructed_clusters_.clusters_begin(); it != constructed_clusters_.clusters_end(); it++)
					if(constructed_clusters_.IsClusterSingleton(it->first)) {
						metrics_.constructed_metrics.num_singletons++;
						auto read_name = constructed_reads_[(it->second)[0]];
						if(original_clusters_.IsClusterSingleton(original_clusters_.GetCluster(read_name)))
							metrics_.constructed_metrics.num_corr_singletons++;
					}
		metrics_.correct_singletons = metrics_.constructed_metrics.num_corr_singletons;
	}
	void ComputeLostClustersMetrics() {
		size_t lost_cluster_size = 0;
		for(auto it = original_clusters_.clusters_begin(); it != original_clusters_.clusters_end();
				it++) {
			if(IsOriginalClusterLost(it->first)) {
				metrics_.lost_clusters_number++;
				lost_cluster_size += original_clusters_.ClusterSize(it->first);
			}
		}
		metrics_.lost_clusters_size = double(lost_cluster_size) / original_reads_.size();
	}
	void ComputeErrorMetrics() {
		metrics_.constructed_metrics.num_errors = 0;
		for(auto it = constructed_clusters_.clusters_begin(); it != constructed_clusters_.clusters_end(); it++) {
			if(!IsConstructedClusterNotErroneous(it->first))
				metrics_.constructed_metrics.num_errors++;
			else {
				size_t orig_supercluster = GetOriginalSuperCluster(it->first);
				if(constructed_clusters_.ClusterSize(it->first) > original_clusters_.ClusterSize(orig_supercluster))
				metrics_.constructed_metrics.num_errors++;
			}
		}
	}
	void ComputeNotMergedMetrics() {
		double sum_fill = 0;

		for(auto it = original_clusters_.clusters_begin(); it != original_clusters_.clusters_end(); it++) {
			size_t orig_cluster_ind = it->first;
			if(original_clusters_.IsClusterSingleton(orig_cluster_ind))
				continue;

			// for each non trivial cluster we compute it "not merged"
			if(!IsClusterNotMerged(orig_cluster_ind))
				continue;

			metrics_.original_metrics.num_not_merged++;
			if(IsClusterBigAndSingletons(orig_cluster_ind))
				metrics_.original_metrics.num_nm_big_singletons++;

			size_t orig_cluster_size = original_clusters_.ClusterSize(orig_cluster_ind);
			double orig_cluster_fill = ComputeNotMergedFillin(orig_cluster_ind);

			sum_fill += orig_cluster_fill;
		}
		metrics_.avg_fillin = sum_fill / metrics_.original_metrics.num_not_merged;
	}
	void ComputeOriginalSingletons() {
		for(auto it = original_clusters_.clusters_begin(); it != original_clusters_.clusters_end(); it++)
			if(original_clusters_.IsClusterSingleton(it->first))
				metrics_.original_metrics.num_singletons++;
	}