docs: @Override
    public void evaluate(DoubleSolution solution) {
  
      int numberOfVariables_ = solution.getNumberOfVariables();
      int numberOfObjectives = solution.getNumberOfObjectives();
  
      double[] x = new double[numberOfVariables_];
      double[] f = new double[numberOfObjectives];
  
      for (int i = 0; i < numberOfVariables_; i++) {
        x[i] = solution.getVariableValue(i);
      }
  
      // check if the point is infeasible
      boolean infeasible = false;
      infeasible = if_infeasible(x);
      while (infeasible) {
        //re-generate a random variable
        for (int i = 0; i < numberOfVariables_; i++) {
          x[i] = generV(getLowerBound(i), getUpperBound(i));
          solution.setVariableValue(i, x[i]);
        }
        infeasible = if_infeasible(x);
      }
  
      // evaluate f1,...m-1
      for (int i = 0; i < M9 - 1; i++) {
        if (r_polyline9[i][0] == 1) {
          f[i] = Math.abs(x[0] - r_polyline9[i][1]);
        } else {
          f[i] = Math.abs((r_polyline9[i][1] * x[0] - x[1] + r_polyline9[i][2])) / Math
              .sqrt(Math.pow(r_polyline9[i][1], 2) + 1);
        }
      }
      // evaluate fm
      if (r_polyline9[M9 - 1][0] == 1) {
        f[M9 - 1] = Math.abs(x[0] - r_polyline9[M9 - 1][1]);
      } else {
        f[M9 - 1] = Math.abs((r_polyline9[M9 - 1][1] * x[0] - x[1] + r_polyline9[M9 - 1][2])) / Math
            .sqrt(Math.pow(r_polyline9[M9 - 1][1], 2) + 1);
      }
  
      for (int i = 0; i < numberOfObjectives; i++) {
        solution.setObjective(i, f[i]);
      }
  
    }