MCPcopy Create free account
hub / github.com/ERGO-Code/HiGHS / minimizeComponentIca

Function minimizeComponentIca

highs/presolve/ICrashUtil.cpp:166–228  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

164}
165
166double 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;

Callers 1

solveSubproblemICAFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected