| 242 | } |
| 243 | |
| 244 | static void solveSubproblemICA(Quadratic& idata, const ICrashOptions& options) { |
| 245 | bool minor_iteration_details = false; |
| 246 | |
| 247 | std::vector<double> residual_ica(idata.lp.num_row_, 0); |
| 248 | updateResidualIca(idata.lp, idata.xk, residual_ica); |
| 249 | double objective_ica = 0; |
| 250 | |
| 251 | for (int k = 0; k < options.approximate_minimization_iterations; k++) { |
| 252 | for (int col = 0; col < idata.lp.num_col_; col++) { |
| 253 | // determine whether to minimize for col. |
| 254 | // if empty skip. |
| 255 | if (idata.lp.a_matrix_.start_[col] == idata.lp.a_matrix_.start_[col + 1]) |
| 256 | continue; |
| 257 | |
| 258 | double old_value = idata.xk.col_value[col]; |
| 259 | minimizeComponentIca(col, idata.mu, idata.lambda, idata.lp, objective_ica, |
| 260 | residual_ica, idata.xk); |
| 261 | |
| 262 | double new_value = idata.xk.col_value[col]; |
| 263 | double delta_x = new_value - old_value; |
| 264 | if (minor_iteration_details) { |
| 265 | double quadratic_objective = getQuadraticObjective(idata); |
| 266 | printMinorIterationDetails(k, col, idata.xk.col_value[col] - delta_x, |
| 267 | delta_x, objective_ica, residual_ica, |
| 268 | quadratic_objective, options.log_options); |
| 269 | } |
| 270 | |
| 271 | assert(std::fabs(objective_ica - |
| 272 | vectorProduct(idata.lp.col_cost_, idata.xk.col_value)) < |
| 273 | 1e08); |
| 274 | } |
| 275 | |
| 276 | // code below just for checking. Can comment out later if speed up is |
| 277 | // needed. |
| 278 | std::vector<double> residual_ica_check(idata.lp.num_row_, 0); |
| 279 | updateResidualIca(idata.lp, idata.xk, residual_ica_check); |
| 280 | double difference = getNorm2(residual_ica) - getNorm2(residual_ica_check); |
| 281 | assert(std::fabs(difference) < 1e08); |
| 282 | (void)difference; |
| 283 | } |
| 284 | } |
| 285 | |
| 286 | static void solveSubproblemQP(Quadratic& idata, const ICrashOptions& options) { |
| 287 | bool minor_iteration_details = false; |
no test coverage detected