docs: @Override
    public void evaluate(DoubleSolution solution) {
  
      int hi=0;
      double [] fx = new double[getNumberOfObjectives()] ; // functions
  
      EBEsElementsTopology(solution); // transforma geometria a caracterÃƒÂ­sticas mecÃƒÂ¡nicas
  
      EBEsCalculus(); //  metodo matricial de la rigidez para estructuras espaciales (3D)
  
      // START OBJETIVES FUNCTION
      for(int j=0; j<getNumberOfObjectives(); j++)
      {
        // total weight
        if(OF_[j].equals("W"))
        {
          // START structure total weight ---------------------
          fx[j]=0.0;
          for(int ba=0; ba<numberOfElements_; ba++){
            int idx =(int)Element_[ba][INDEX_];
            fx[j]+=Groups_[idx][AREA]*Element_[ba][L_]*Groups_[idx][SPECIFIC_WEIGHT];
          }
          solution.setObjective(j, fx[j]);
          // END minimizing structure total weight ------------------------
        }
        // summation of deformations
        else if(OF_[j].equals("D"))
        {
          // START maximize displacement nodes ---------------------------------------------
          fx[j] = 0.0;
          for(int i=0;i<nodeCheck_.length;i++){
            double xn=DisplacementNodes_[numberOfLibertyDegree_ * (int)nodeCheck_[i][0]+aX_][hi];
            double yn=DisplacementNodes_[numberOfLibertyDegree_ * (int)nodeCheck_[i][0]+aY_][hi];
            double zn=DisplacementNodes_[numberOfLibertyDegree_ * (int)nodeCheck_[i][0]+aZ_][hi];
            fx[j]+= Math.sqrt(Math.pow(xn,2.0)+Math.pow(yn,2.0)+Math.pow(zn,2.0));
          }
          solution.setObjective(j, fx[j]);
          // END minimizing sum of displacement in nodes ---------------------------------------------
        }
        // stress square absolute error
        else if(OF_[j].equals("SSAE"))
        {
          // START strain residual minimun ---------------------------------------------
          // strain residualt global
          fx[j]=StrainResidualMin_[hi]+StrainResidualMax_[hi];
          solution.setObjective(j, fx[j]);
          // END strain residual minimun ---------------------------------------------
        }
        // Efficiency of Nash-Sutcliffe for stress and compress
        else if(OF_[j].equals("ENS"))
        {
          fx[j]=FunctionENS(0);
          solution.setObjective(j, fx[j]);
        }
        else if(OF_[j].equals("MDV"))
        {
          fx[j]=FunctionsMahalanobis_Distance_With_Variance(0);
          solution.setObjective(j, fx[j]);
        }
        else
        {
          System.out.println("Error: not considerate START OBJECTIVES FUNCTION ");
        }
      }
  
      numberOfEval_++;
  
      //if((numberOfEval_ % 1000) == 0) System.out.println(numberOfEval_);
  
      //  END OBJETIVES FUNCTION
  
      // maximizing the function objective ------------------------
      // fx[1] *= -1.0;
  
  
  
      // NOT USED -----------------------------------
  /*
      double l=0; // longitud total de todos los elementos
      // total deflection of estructure
      fx[1]=0;
      for(int ba=0; ba<numberOfElements_; ba++){
          l+=Element_[ba][L_];
          int ni = (int)Element_[ba][i_];
          int nj = (int)Element_[ba][j_];
          double dxi=DisplacementNodes_[numberOfLibertyDegree_*ni+aX_][hi];
          double dyi=DisplacementNodes_[numberOfLibertyDegree_*ni+aY_][hi];
          double dzi=DisplacementNodes_[numberOfLibertyDegree_*ni+aZ_][hi];
          double dxj=DisplacementNodes_[numberOfLibertyDegree_*nj+aX_][hi];
          double dyj=DisplacementNodes_[numberOfLibertyDegree_*nj+aY_][hi];
          double dzj=DisplacementNodes_[numberOfLibertyDegree_*nj+aZ_][hi];
          // fx[1]+=Math.sqrt(Math.pow((dxi-dxj), 2.0)+Math.pow((dyi-dyj), 2.0)+Math.pow((dzi-dzj), 2.0))/l;
          fx[1]+=(-dxi+dxj)/l;
      }
  */
      // END NOT USED ------------------------------------------------------------------------------
  
      this.evaluateConstraints(solution);
    }