@Override
  public DefaultWeightedValueDiscriminant<CategoryType> evaluateWithDiscriminant(
      final Vectorizable input) {
    // Convert the input to a vector.
    final Vector inputVector = input.convertToVector();

    // Find the category that has the highest match.
    double bestScore = 0.0;
    CategoryType bestCategory = null;
    for (CategoryType category : this.getCategories()) {
      final double score = this.evaluateAsDouble(inputVector, category);

      if (bestCategory == null || score > bestScore) {
        bestScore = score;
        bestCategory = category;
      }
    }

    // Return the discriminant for the category.
    return new DefaultWeightedValueDiscriminant<CategoryType>(bestCategory, bestScore);
  }
 /**
  * Evaluates how much the given input matches the prototype for the given category.
  *
  * @param input The input.
  * @param category The category to match the input against.
  * @return A real value indicating how much the input matches the category. A larger value
  *     indicates a better match.
  */
 public double evaluateAsDouble(final Vectorizable input, final CategoryType category) {
   return this.evaluateAsDouble(input.convertToVector(), category);
 }
 @Override
 public double evaluateAsDouble(final Vectorizable input) {
   return this.getWeightVector().dotProduct(input.convertToVector());
 }