docs: public void evaluate(DoubleSolution solution) {
      int numberOfVariables = getNumberOfVariables();
      int numberOfObjectives = getNumberOfObjectives() ;
  
      double[] f = new double[numberOfObjectives];
      double[] x = new double[numberOfVariables] ;
  
      int k = getNumberOfVariables() - getNumberOfObjectives() + 1;
  
      for (int i = 0; i < numberOfVariables; i++) {
        x[i] = solution.getVariableValue(i) ;
      }
  
      double g = 0.0;
      for (int i = numberOfVariables - k; i < numberOfVariables; i++) {
        g += x[i];
      }
  
      g = 1 + (9.0 * g) / k;
  
      System.arraycopy(x, 0, f, 0, numberOfObjectives - 1);
  
      double h = 0.0;
      for (int i = 0; i < numberOfObjectives - 1; i++) {
        h += (f[i] / (1.0 + g)) * (1 + Math.sin(3.0 * Math.PI * f[i]));
      }
  
      h = numberOfObjectives - h;
  
      f[numberOfObjectives - 1] = (1 + g) * h;
  
      for (int i = 0; i < numberOfObjectives; i++) {
        solution.setObjective(i, f[i]);
      }
    }