docs: @Override
    public void evaluate(DoubleSolution solution) {
      List<List<Double>> s1 ;
      List<Double> s1Temp ;
  
      s1 = new ArrayList<>() ;
  
      for (int i = 0 ; i < dTypeG; i++) {
        s1Temp = new ArrayList<>() ;
        for (int j = 0 ; j < icaComponent.get(0).size(); j++) {
          s1Temp.add(solution.getVariableValue(i*(icaComponent.get(0).size())+j)) ;
        }
        s1.add(s1Temp) ;
      }
  
      List<List<Double>> x1 = multiplyWithOutAMP(matrixA, s1) ;
      List<List<Double>> cor1 = correlation(x1, mixed) ;
  
      double sum = 0.0 ;
      for (int i = 0 ; i < icaComponent.size(); i++) {
        for (int j = 0 ; j < icaComponent.get(i).size(); j++) {
          sum += Math.pow(icaComponent.get(i).get(j) - s1.get(i).get(j), 2) ;
        }
      }
  
      double obj1 = diagonal1(cor1)+diagonal2(cor1) ;
      double obj2 = sum/(icaComponent.size() * icaComponent.get(0).size()) ;
  
      if (obj1 > f1max) {
        f1max = obj1 ;
      }
      if (obj1 < f1min) {
        f1min = obj1 ;
      }
      if (obj2 > f1max) {
        f1max = obj2 ;
      }
      if (obj2 < f1min) {
        f1min = obj2 ;
      }
  
      if (scaling) {
        obj2 = (obj2 - f2min)*(f1max - f1min)/(f2max - f2min)+f1min ;
      }
  
      solution.setObjective(0, obj1);
      solution.setObjective(1, obj2);
    }