docs: private double[] hvContributions(double[][] front) {
  
      int numberOfObjectives = front[0].length ;
      double[] contributions = new double[front.length];
      double[][] frontSubset = new double[front.length - 1][front[0].length];
      LinkedList<double[]> frontCopy = new LinkedList<double[]>();
      Collections.addAll(frontCopy, front);
      double[][] totalFront = frontCopy.toArray(frontSubset);
      double totalVolume =
          this.calculateHypervolume(totalFront, totalFront.length, numberOfObjectives);
      for (int i = 0; i < front.length; i++) {
        double[] evaluatedPoint = frontCopy.remove(i);
        frontSubset = frontCopy.toArray(frontSubset);
        // STEP4. The hypervolume (control is passed to java version of Zitzler code)
        double hv = this.calculateHypervolume(frontSubset, frontSubset.length, numberOfObjectives);
        double contribution = totalVolume - hv;
        contributions[i] = contribution;
        // put point back
        frontCopy.add(i, evaluatedPoint);
      }
      return contributions;
    }