void CostCalculator_eigen::calculateCost(const real_1d_array &xWeight, double &func, real_1d_array &grad) { for (int i = 0; i < variableNumber_; ++i) xReal_(i) = xWeight[i]; // risk grad VectorXd riskGrad = varMatrix_ * xReal_; // weight change VectorXd weightChange = xReal_ - currentWeight_; func = 0.5 * xReal_.dot(riskGrad) + weightChange.cwiseAbs().dot(tradingCost_) - expectReturn_.dot(xReal_); VectorXd tmp = riskGrad + weightChange.cwiseSign().cwiseProduct(tradingCost_) - expectReturn_; for (int i = 0; i < variableNumber_; ++i) grad(i) = tmp(i); }