| 164 | } |
| 165 | |
| 166 | double minimizeComponentIca(const int col, const double mu, |
| 167 | const std::vector<double>& lambda, |
| 168 | const HighsLp& lp, double& objective, |
| 169 | std::vector<double>& residual, HighsSolution& sol) { |
| 170 | // Minimize quadratic for column col. |
| 171 | |
| 172 | // Formulas for a and b when minimizing for x_j |
| 173 | // a = (1/(2*mu)) * sum_i a_ij^2 |
| 174 | // b = -(1/(2*mu)) sum_i (2 * a_ij * (sum_{k!=j} a_ik * x_k - b_i)) + c_j (\) |
| 175 | // + sum_i a_ij * lambda_i |
| 176 | // b / 2 = -(1/(2*mu)) sum_i (2 * a_ij |
| 177 | double a = 0.0; |
| 178 | double b = 0.0; |
| 179 | |
| 180 | for (int k = lp.a_matrix_.start_[col]; k < lp.a_matrix_.start_[col + 1]; |
| 181 | k++) { |
| 182 | int row = lp.a_matrix_.index_[k]; |
| 183 | a += lp.a_matrix_.value_[k] * lp.a_matrix_.value_[k]; |
| 184 | // matlab but with b = b / 2 |
| 185 | double bracket = |
| 186 | -residual[row] - lp.a_matrix_.value_[k] * sol.col_value[col]; |
| 187 | bracket += lambda[row]; |
| 188 | // clp minimizing for delta_x |
| 189 | // double bracket_clp = - residual_[row]; |
| 190 | b += lp.a_matrix_.value_[k] * bracket; |
| 191 | } |
| 192 | |
| 193 | a = (0.5 / mu) * a; |
| 194 | b = (0.5 / mu) * b + 0.5 * lp.col_cost_[col]; |
| 195 | |
| 196 | double theta = -b / a; |
| 197 | double delta_x = 0; |
| 198 | |
| 199 | // matlab |
| 200 | double new_x; |
| 201 | if (theta > 0) |
| 202 | new_x = std::min(theta, lp.col_upper_[col]); |
| 203 | else |
| 204 | new_x = std::max(theta, lp.col_lower_[col]); |
| 205 | delta_x = new_x - sol.col_value[col]; |
| 206 | |
| 207 | // clp minimizing for delta_x |
| 208 | // if (theta > 0) |
| 209 | // delta_x = std::min(theta, lp_.col_upper_[col] - col_value_[col]); |
| 210 | // else |
| 211 | // delta_x = std::max(theta, lp_.col_lower_[col] - col_value_[col]); |
| 212 | |
| 213 | sol.col_value[col] += delta_x; |
| 214 | |
| 215 | // std::cout << "col " << col << ": " << delta_x << std::endl; |
| 216 | |
| 217 | // Update objective, row_value, residual after each component update. |
| 218 | objective += lp.col_cost_[col] * delta_x; |
| 219 | for (int k = lp.a_matrix_.start_[col]; k < lp.a_matrix_.start_[col + 1]; |
| 220 | k++) { |
| 221 | int row = lp.a_matrix_.index_[k]; |
| 222 | residual[row] -= lp.a_matrix_.value_[k] * delta_x; |
| 223 | sol.row_value[row] += lp.a_matrix_.value_[k] * delta_x; |
no outgoing calls
no test coverage detected