/// <summary> /// Evaluates all given <see cref="ClusterSet{TInstance}" />s according to the given /// <see cref="IExternalEvaluationCriterion{TInstance, TClass}" />. /// </summary> /// <param name="clustering">The cluster-sets to be evaluated.</param> /// <param name="criterion">The criterion used to evaluate the cluster-sets.</param> /// <param name="instanceClasses">The instances' classes.</param> /// <param name="maxClusters">The maximum number of clusters allowed for a cluster-set for it to be evaluated.</param> /// <returns>A list containing the evaluations for each cluster-set.</returns> /// <typeparam name="TInstance">The type of instance considered.</typeparam> /// <typeparam name="TClass">The type of class considered.</typeparam> public static ICollection <ClusterSetEvaluation <TInstance> > EvaluateClustering <TInstance, TClass>( this ClusteringResult <TInstance> clustering, IExternalEvaluationCriterion <TInstance, TClass> criterion, IDictionary <TInstance, TClass> instanceClasses, uint maxClusters) where TInstance : IComparable <TInstance> { var evals = new List <ClusterSetEvaluation <TInstance> >(); // checks only one cluster allowed if (maxClusters == 1) { evals.Add(new ClusterSetEvaluation <TInstance>(clustering[0], double.NaN)); return(evals); } // evaluates all cluster-sets foreach (var clusterSet in clustering.Reverse()) { if (clusterSet.Count < 2 || clusterSet.Count > maxClusters) { continue; } var eval = criterion.Evaluate(clusterSet, instanceClasses); evals.Add(new ClusterSetEvaluation <TInstance>(clusterSet, eval)); } return(evals); }