private Double evaluateSupportVectorMachine(
      SupportVectorMachine supportVectorMachine, double[] input) {
    SupportVectorMachineModel supportVectorMachineModel = getModel();

    double result = 0d;

    Kernel kernel = supportVectorMachineModel.getKernel();

    Coefficients coefficients = supportVectorMachine.getCoefficients();
    Iterator<Coefficient> coefficientIterator = coefficients.iterator();

    SupportVectors supportVectors = supportVectorMachine.getSupportVectors();
    Iterator<SupportVector> supportVectorIterator = supportVectors.iterator();

    Map<String, double[]> vectorMap = getVectorMap();

    while (coefficientIterator.hasNext() && supportVectorIterator.hasNext()) {
      Coefficient coefficient = coefficientIterator.next();
      SupportVector supportVector = supportVectorIterator.next();

      double[] vector = vectorMap.get(supportVector.getVectorId());
      if (vector == null) {
        throw new InvalidFeatureException(supportVector);
      }

      Double value = KernelUtil.evaluate(kernel, input, vector);

      result += (coefficient.getValue() * value);
    }

    if (coefficientIterator.hasNext() || supportVectorIterator.hasNext()) {
      throw new InvalidFeatureException(supportVectorMachine);
    }

    result += coefficients.getAbsoluteValue();

    return result;
  }