private <V extends Number> ClusterAffinityDistribution<V> evaluateDistance(ValueFactory<V> valueFactory, ComparisonMeasure comparisonMeasure, List<ClusteringField> clusteringFields, List<FieldValue> values){
ClusteringModel clusteringModel = getModel();
List<Cluster> clusters = clusteringModel.getClusters();
Value<V> adjustment;
MissingValueWeights missingValueWeights = clusteringModel.getMissingValueWeights();
if(missingValueWeights != null){
Array array = missingValueWeights.getArray();
List<? extends Number> adjustmentValues = ArrayUtil.asNumberList(array);
if(values.size() != adjustmentValues.size()){
throw new InvalidElementException(missingValueWeights);
}
adjustment = MeasureUtil.calculateAdjustment(valueFactory, values, adjustmentValues);
} else
{
adjustment = MeasureUtil.calculateAdjustment(valueFactory, values);
}
ClusterAffinityDistribution<V> result = createClusterAffinityDistribution(Classification.Type.DISTANCE, clusters);
for(Cluster cluster : clusters){
List<FieldValue> clusterValues = CacheUtil.getValue(cluster, ClusteringModelEvaluator.clusterValueCache);
if(values.size() != clusterValues.size()){
throw new InvalidElementException(cluster);
}
Value<V> distance = MeasureUtil.evaluateDistance(valueFactory, comparisonMeasure, clusteringFields, values, clusterValues, adjustment);
result.put(cluster, distance);
}
return result;
}