public F24RotatedHybridComposition4(int dimension, double bias, String file_data, String file_m)
      throws JMetalException {
    super(dimension, bias, FUNCTION_NAME);

    // Note: dimension starts from 0
    m_o = new double[NUM_FUNC][mDimension];
    m_M = new double[NUM_FUNC][mDimension][mDimension];

    m_testPoint = new double[mDimension];
    m_testPointM = new double[mDimension];
    m_fmax = new double[NUM_FUNC];

    m_w = new double[NUM_FUNC];
    m_z = new double[NUM_FUNC][mDimension];
    m_zM = new double[NUM_FUNC][mDimension];

    // Load the shifted global optimum
    Benchmark.loadMatrixFromFile(file_data, NUM_FUNC, mDimension, m_o);
    // Load the matrix
    Benchmark.loadNMatrixFromFile(file_m, NUM_FUNC, mDimension, mDimension, m_M);

    // Initialize the hybrid composition job object
    theJob.numberOfBasicFunctions = NUM_FUNC;
    theJob.numberOfDimensions = mDimension;
    theJob.C = 2000.0;
    theJob.sigma = m_sigma;
    theJob.biases = m_func_biases;
    theJob.lambda = m_lambda;
    theJob.shiftGlobalOptimum = m_o;
    theJob.linearTransformationMatrix = m_M;
    theJob.w = m_w;
    theJob.z = m_z;
    theJob.zM = m_zM;
    // Calculate/estimate the fmax for all the functions involved
    for (int i = 0; i < NUM_FUNC; i++) {
      for (int j = 0; j < mDimension; j++) {
        m_testPoint[j] = (5.0 / m_lambda[i]);
      }
      Benchmark.rotate(m_testPointM, m_testPoint, m_M[i]);
      m_fmax[i] = Math.abs(theJob.basicFunc(i, m_testPointM));
    }
    theJob.fmax = m_fmax;
  }