Skip to content

Commit ab363f4

Browse files
committed
Minor refactoring
1 parent a15b8fa commit ab363f4

35 files changed

Lines changed: 121 additions & 72 deletions

uno/ingredients/constraint_relaxation_strategies/ConstraintRelaxationStrategy.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ namespace uno {
4545

4646
bool ConstraintRelaxationStrategy::is_iterate_acceptable(Statistics& statistics, GlobalizationStrategy& globalization_strategy,
4747
const Subproblem& subproblem, const SolverWorkspace& solver_workspace, Iterate& current_iterate, Iterate& trial_iterate,
48-
const Direction& direction, double step_length, EvaluationCache& evaluation_cache) const {
48+
const Direction& direction, double step_length, Evaluations& current_evaluations, Evaluations& trial_evaluations) const {
4949
subproblem.problem.postprocess_iterate(trial_iterate);
5050
const double objective_multiplier = subproblem.problem.get_objective_multiplier();
5151

@@ -57,25 +57,25 @@ namespace uno {
5757
subproblem.problem.set_auxiliary_measure(current_iterate);
5858
//this->subproblem_definition_changed = false;
5959
//}
60-
this->evaluate_progress_measures(subproblem.problem, trial_iterate, evaluation_cache.trial_evaluations);
60+
this->evaluate_progress_measures(subproblem.problem, trial_iterate, trial_evaluations);
6161

6262
bool accept_iterate = false;
6363
if (direction.norm == 0.) {
6464
DEBUG << "Zero step acceptable\n";
65-
evaluation_cache.trial_evaluations.objective = subproblem.problem.model.evaluate_objective(trial_iterate.primals);
65+
trial_evaluations.objective = subproblem.problem.model.evaluate_objective(trial_iterate.primals);
6666
accept_iterate = true;
6767
statistics.set("Status", "0 primal step");
6868
}
6969
else {
7070
// determine acceptance wrt the globalization strategy
7171
const ProgressMeasures predicted_reductions = subproblem.compute_predicted_reductions(direction, step_length,
72-
this->progress_norm, evaluation_cache.current_evaluations, solver_workspace);
72+
this->progress_norm, current_evaluations, solver_workspace);
7373
accept_iterate = globalization_strategy.is_iterate_acceptable(statistics, current_iterate.progress, trial_iterate.progress,
7474
predicted_reductions, objective_multiplier);
7575
// check that the derivatives exist at the accepted trial iterate (an exception is thrown upon evaluation failure)
7676
if (accept_iterate) {
77-
evaluation_cache.trial_evaluations.evaluate_objective_gradient(subproblem.problem.model, trial_iterate.primals);
78-
evaluation_cache.trial_evaluations.evaluate_jacobian(subproblem.problem.model, trial_iterate.primals);
77+
trial_evaluations.evaluate_objective_gradient(subproblem.problem.model, trial_iterate.primals);
78+
trial_evaluations.evaluate_jacobian(subproblem.problem.model, trial_iterate.primals);
7979
}
8080
}
8181
return accept_iterate;

uno/ingredients/constraint_relaxation_strategies/ConstraintRelaxationStrategy.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@ namespace uno {
4343

4444
// second-order corrections
4545
[[nodiscard]] virtual bool has_second_order_corrections() const = 0;
46+
virtual void compute_second_order_correction(Iterate& current_iterate, Direction& direction,
47+
const Vector<double>& constraints) = 0;
4648

4749
// trial iterate acceptance
4850
[[nodiscard]] virtual bool is_iterate_acceptable(Statistics& statistics, const Model& model, Iterate& current_iterate,
4951
Iterate& trial_iterate, const Direction& direction, double step_length, bool uses_trust_region,
50-
EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information, UserCallbacks& user_callbacks) = 0;
52+
Evaluations& current_evaluations, Evaluations& trial_evaluations, WarmstartInformation& warmstart_information,
53+
UserCallbacks& user_callbacks) = 0;
5154

5255
[[nodiscard]] virtual std::string get_name() const = 0;
5356
[[nodiscard]] size_t get_number_subproblems_solved() const;
@@ -68,7 +71,7 @@ namespace uno {
6871
void evaluate_progress_measures(const OptimizationProblem& problem, Iterate& iterate, Evaluations& evaluations) const;
6972
bool is_iterate_acceptable(Statistics& statistics, GlobalizationStrategy& globalization_strategy, const Subproblem& subproblem,
7073
const SolverWorkspace& solver_workspace, Iterate& current_iterate, Iterate& trial_iterate, const Direction& direction,
71-
double step_length, EvaluationCache& evaluation_cache) const;
74+
double step_length, Evaluations& current_evaluations, Evaluations& trial_evaluations) const;
7275
void compute_residuals(const OptimizationProblem& problem, Iterate& iterate, Evaluations& evaluations) const;
7376
[[nodiscard]] double compute_stationarity_scaling(const Model& model, const Multipliers& multipliers) const;
7477
[[nodiscard]] double compute_complementarity_scaling(const Model& model, const Multipliers& multipliers) const;

uno/ingredients/constraint_relaxation_strategies/FeasibilityRestoration.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,20 @@ namespace uno {
173173
}
174174
}
175175

176+
void FeasibilityRestoration::compute_second_order_correction(Iterate& current_iterate, Direction& direction,
177+
const Vector<double>& constraints) {
178+
if (this->current_phase == Phase::OPTIMALITY) {
179+
const Subproblem subproblem(*this->reformulated_problem, current_iterate, *this->hessian_model, *this->inertia_correction_strategy);
180+
return this->subproblem_solver->compute_second_order_correction(subproblem, direction, constraints);
181+
}
182+
else {
183+
const Subproblem feasibility_subproblem(*this->reformulated_feasibility_problem, current_iterate, *this->feasibility_hessian_model,
184+
*this->feasibility_inertia_correction_strategy);
185+
return this->feasibility_subproblem_solver->compute_second_order_correction(feasibility_subproblem, direction,
186+
constraints);
187+
}
188+
}
189+
176190
void FeasibilityRestoration::solve_subproblem(Statistics& statistics, const Subproblem& subproblem,
177191
SubproblemSolver& subproblem_solver, const OptimizationProblem& problem, GlobalizationStrategy& globalization_strategy,
178192
Iterate& current_iterate, Direction& direction, double trust_region_radius, Evaluations& current_evaluations,
@@ -226,34 +240,36 @@ namespace uno {
226240

227241
bool FeasibilityRestoration::is_iterate_acceptable(Statistics& statistics, const Model& model,
228242
Iterate& current_iterate, Iterate& trial_iterate, const Direction& direction, double step_length,
229-
bool uses_trust_region, EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information,
230-
UserCallbacks& user_callbacks) {
243+
bool uses_trust_region, Evaluations& current_evaluations, Evaluations& trial_evaluations,
244+
WarmstartInformation& warmstart_information, UserCallbacks& user_callbacks) {
231245
bool accept_iterate = false;
232246
// determine acceptability, depending on the current phase
233247
if (this->current_phase == Phase::OPTIMALITY) {
234248
const Subproblem subproblem(*this->reformulated_problem, current_iterate, *this->hessian_model,
235249
*this->inertia_correction_strategy);
236250
accept_iterate = ConstraintRelaxationStrategy::is_iterate_acceptable(statistics, *this->globalization_strategy,
237251
subproblem, this->subproblem_solver->get_workspace(), current_iterate, trial_iterate, direction, step_length,
238-
evaluation_cache);
252+
current_evaluations, trial_evaluations);
239253
if (uses_trust_region || accept_iterate) {
240-
this->hessian_model->notify_trial_iterate(statistics, current_iterate, trial_iterate, evaluation_cache);
254+
this->hessian_model->notify_trial_iterate(statistics, current_iterate, trial_iterate, current_evaluations,
255+
trial_evaluations);
241256
}
242257
}
243258
else {
244259
const Subproblem feasibility_subproblem(*this->reformulated_feasibility_problem, current_iterate, *this->feasibility_hessian_model,
245260
*this->feasibility_inertia_correction_strategy);
246261
accept_iterate = ConstraintRelaxationStrategy::is_iterate_acceptable(statistics, this->feasibility_globalization_strategy,
247262
feasibility_subproblem, this->feasibility_subproblem_solver->get_workspace(), current_iterate, trial_iterate,
248-
direction, step_length, evaluation_cache);
263+
direction, step_length, current_evaluations, trial_evaluations);
249264
if (uses_trust_region || accept_iterate) {
250-
this->feasibility_hessian_model->notify_trial_iterate(statistics, current_iterate, trial_iterate, evaluation_cache);
265+
this->feasibility_hessian_model->notify_trial_iterate(statistics, current_iterate, trial_iterate, current_evaluations,
266+
trial_evaluations);
251267
}
252268
}
253269

254270
// possibly go from restoration phase to optimality phase
255271
if (this->current_phase == Phase::FEASIBILITY_RESTORATION && this->can_switch_to_optimality_phase(model, trial_iterate,
256-
direction, step_length, evaluation_cache.current_evaluations)) {
272+
direction, step_length, current_evaluations)) {
257273
this->switch_back_to_optimality_phase(current_iterate, trial_iterate);
258274
// set a cold start in the subproblem solver
259275
warmstart_information.whole_problem_changed();
@@ -264,19 +280,17 @@ namespace uno {
264280

265281
// check termination
266282
if (this->current_phase == Phase::OPTIMALITY) {
267-
this->compute_residuals(this->original_problem, trial_iterate, evaluation_cache.trial_evaluations);
268-
trial_iterate.status = this->check_termination(this->original_problem, trial_iterate,
269-
evaluation_cache.trial_evaluations);
283+
this->compute_residuals(this->original_problem, trial_iterate, trial_evaluations);
284+
trial_iterate.status = this->check_termination(this->original_problem, trial_iterate, trial_evaluations);
270285
if (accept_iterate) {
271286
user_callbacks.notify_acceptable_iterate(trial_iterate.primals, trial_iterate.multipliers,
272287
this->original_problem.get_objective_multiplier(), trial_iterate.progress.infeasibility,
273288
trial_iterate.residuals.stationarity, trial_iterate.residuals.complementarity);
274289
}
275290
}
276291
else {
277-
this->compute_residuals(this->feasibility_problem, trial_iterate, evaluation_cache.trial_evaluations);
278-
trial_iterate.status = this->check_termination(this->feasibility_problem, trial_iterate,
279-
evaluation_cache.trial_evaluations);
292+
this->compute_residuals(this->feasibility_problem, trial_iterate, trial_evaluations);
293+
trial_iterate.status = this->check_termination(this->feasibility_problem, trial_iterate, trial_evaluations);
280294
if (accept_iterate) {
281295
user_callbacks.notify_acceptable_iterate(trial_iterate.primals, trial_iterate.multipliers,
282296
this->feasibility_problem.get_objective_multiplier(), trial_iterate.progress.infeasibility,

uno/ingredients/constraint_relaxation_strategies/FeasibilityRestoration.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,14 @@ namespace uno {
3838

3939
// second-order corrections
4040
[[nodiscard]] bool has_second_order_corrections() const override;
41+
void compute_second_order_correction(Iterate& current_iterate, Direction& direction,
42+
const Vector<double>& constraints) override;
4143

4244
// trial iterate acceptance
4345
[[nodiscard]] bool is_iterate_acceptable(Statistics& statistics, const Model& model, Iterate& current_iterate,
4446
Iterate& trial_iterate, const Direction& direction, double step_length, bool uses_trust_region,
45-
EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information, UserCallbacks& user_callbacks) override;
47+
Evaluations& current_evaluations, Evaluations& trial_evaluations, WarmstartInformation& warmstart_information,
48+
UserCallbacks& user_callbacks) override;
4649

4750
[[nodiscard]] std::string get_name() const override;
4851

uno/ingredients/constraint_relaxation_strategies/NoRelaxation.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,23 +95,31 @@ namespace uno {
9595
return this->subproblem_solver->has_second_order_corrections();
9696
}
9797

98+
void NoRelaxation::compute_second_order_correction(Iterate& current_iterate, Direction& direction,
99+
const Vector<double>& constraints) {
100+
const Subproblem subproblem(*this->reformulated_problem, current_iterate, *this->hessian_model, *this->inertia_correction_strategy);
101+
this->subproblem_solver->compute_second_order_correction(subproblem, direction, constraints);
102+
}
103+
98104
bool NoRelaxation::is_iterate_acceptable(Statistics& statistics, const Model& /*model*/, Iterate& current_iterate,
99105
Iterate& trial_iterate, const Direction& direction, double step_length, bool uses_trust_region,
100-
EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information, UserCallbacks& user_callbacks) {
106+
Evaluations& current_evaluations, Evaluations& trial_evaluations, WarmstartInformation& warmstart_information,
107+
UserCallbacks& user_callbacks) {
101108
const Subproblem subproblem(*this->reformulated_problem, current_iterate, *this->hessian_model,
102109
*this->inertia_correction_strategy);
103110
const bool accept_iterate = ConstraintRelaxationStrategy::is_iterate_acceptable(statistics, this->globalization_strategy,
104111
subproblem, this->subproblem_solver->get_workspace(), current_iterate, trial_iterate, direction, step_length,
105-
evaluation_cache);
106-
this->compute_residuals(this->original_problem, trial_iterate, evaluation_cache.trial_evaluations);
107-
trial_iterate.status = this->check_termination(this->original_problem, trial_iterate, evaluation_cache.trial_evaluations);
112+
current_evaluations, trial_evaluations);
113+
this->compute_residuals(this->original_problem, trial_iterate, trial_evaluations);
114+
trial_iterate.status = this->check_termination(this->original_problem, trial_iterate, trial_evaluations);
108115
if (accept_iterate) {
109116
user_callbacks.notify_acceptable_iterate(trial_iterate.primals, trial_iterate.multipliers,
110117
this->original_problem.get_objective_multiplier(), trial_iterate.progress.infeasibility,
111118
trial_iterate.residuals.stationarity, trial_iterate.residuals.complementarity);
112119
}
113120
if (uses_trust_region || accept_iterate) {
114-
this->hessian_model->notify_trial_iterate(statistics, current_iterate, trial_iterate, evaluation_cache);
121+
this->hessian_model->notify_trial_iterate(statistics, current_iterate, trial_iterate, current_evaluations,
122+
trial_evaluations);
115123
}
116124
warmstart_information.no_changes();
117125
return accept_iterate;

uno/ingredients/constraint_relaxation_strategies/NoRelaxation.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,14 @@ namespace uno {
3434

3535
// second-order corrections
3636
[[nodiscard]] bool has_second_order_corrections() const override;
37+
void compute_second_order_correction(Iterate& current_iterate, Direction& direction,
38+
const Vector<double>& constraints) override;
3739

3840
// trial iterate acceptance
3941
[[nodiscard]] bool is_iterate_acceptable(Statistics& statistics, const Model& model, Iterate& current_iterate,
4042
Iterate& trial_iterate, const Direction& direction, double step_length, bool uses_trust_region,
41-
EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information, UserCallbacks& user_callbacks) override;
43+
Evaluations& current_evaluations, Evaluations& trial_evaluations, WarmstartInformation& warmstart_information,
44+
UserCallbacks& user_callbacks) override;
4245

4346
[[nodiscard]] std::string get_name() const override;
4447

uno/ingredients/globalization_mechanisms/BacktrackingLineSearch.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "optimization/Iterate.hpp"
1212
#include "ingredients/subproblem_solvers/SubproblemStatus.hpp"
1313
#include "optimization/EvaluationCache.hpp"
14+
#include "symbolic/Sum.hpp"
1415
#include "tools/Logger.hpp"
1516
#include "options/Options.hpp"
1617
#include "tools/Statistics.hpp"
@@ -87,11 +88,10 @@ namespace uno {
8788
// go a fraction along the direction by finding an acceptable step length
8889
// returns true upon success, false upon failure
8990
bool BacktrackingLineSearch::backtrack_along_direction(Statistics& statistics, const Model& model, Iterate& current_iterate,
90-
Iterate& trial_iterate, const Direction& direction, EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information,
91+
Iterate& trial_iterate, Direction& direction, EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information,
9192
UserCallbacks& user_callbacks) const {
9293
double step_length = 1.;
9394
bool termination = false;
94-
bool in_soc = false;
9595
size_t number_iterations = 0;
9696
while (!termination) {
9797
++number_iterations;
@@ -112,7 +112,8 @@ namespace uno {
112112
statistics.set("||Step||", step_length * direction.norm);
113113

114114
is_acceptable = this->constraint_relaxation_strategy->is_iterate_acceptable(statistics, model, current_iterate,
115-
trial_iterate, direction, step_length, false, evaluation_cache, warmstart_information, user_callbacks);
115+
trial_iterate, direction, step_length, false, evaluation_cache.current_evaluations, evaluation_cache.trial_evaluations,
116+
warmstart_information, user_callbacks);
116117
BacktrackingLineSearch::set_primal_statistics(statistics, model, trial_iterate, evaluation_cache.trial_evaluations);
117118
}
118119
catch (const EvaluationError&) {
@@ -126,10 +127,23 @@ namespace uno {
126127
if (Logger::level == INFO) statistics.print_current_line();
127128
}
128129
// from here on, the trial iterate was rejected
129-
else if (number_iterations == 1) {
130+
else if (number_iterations == 1 && this->constraint_relaxation_strategy->has_second_order_corrections() &&
131+
trial_iterate.progress.infeasibility > current_iterate.progress.infeasibility) {
130132
// enter second-order corrections
131-
in_soc = true;
132-
WARNING << "Entering second-order corrections\n";
133+
INFO << "Entering second-order corrections\n";
134+
double theta_soc_old = current_iterate.progress.infeasibility;
135+
Vector<double> c_k_soc(evaluation_cache.trial_evaluations.constraints);
136+
c_k_soc += direction.primal_dual_step_length * evaluation_cache.current_evaluations.constraints;
137+
/*
138+
this->constraint_relaxation_strategy->compute_second_order_correction(current_iterate, direction, c_k_soc);
139+
//Iterate iterate_k_soc();
140+
Vector<double> x_k_soc = current_iterate.primals + direction.primal_dual_step_length * direction.primals;
141+
142+
Evaluations soc_evaluations(evaluation_cache.current_evaluations);
143+
is_acceptable = this->constraint_relaxation_strategy->is_iterate_acceptable(statistics, model, current_iterate,
144+
trial_iterate, direction, step_length, false, evaluation_cache.current_evaluations, evaluation_cache.trial_evaluations,
145+
warmstart_information, user_callbacks);
146+
*/
133147
}
134148
else if (step_length >= this->minimum_step_length) {
135149
step_length = this->decrease_step_length(step_length);

uno/ingredients/globalization_mechanisms/BacktrackingLineSearch.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace uno {
2525
const bool scale_duals_with_step_length;
2626

2727
[[nodiscard]] bool backtrack_along_direction(Statistics& statistics, const Model& model, Iterate& current_iterate,
28-
Iterate& trial_iterate, const Direction& direction, EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information,
28+
Iterate& trial_iterate, Direction& direction, EvaluationCache& evaluation_cache, WarmstartInformation& warmstart_information,
2929
UserCallbacks& user_callbacks) const;
3030
[[nodiscard]] double decrease_step_length(double step_length) const;
3131
static void check_unboundedness(const Direction& direction);

uno/ingredients/globalization_mechanisms/TrustRegionStrategy.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ namespace uno {
145145
Iterate& trial_iterate, const Direction& direction, EvaluationCache& evaluation_cache,
146146
WarmstartInformation& warmstart_information, UserCallbacks& user_callbacks) {
147147
bool accept_iterate = this->constraint_relaxation_strategy->is_iterate_acceptable(statistics, model, current_iterate,
148-
trial_iterate, direction, 1., true, evaluation_cache, warmstart_information, user_callbacks);
148+
trial_iterate, direction, 1., true, evaluation_cache.current_evaluations, evaluation_cache.trial_evaluations,
149+
warmstart_information, user_callbacks);
149150
GlobalizationMechanism::set_primal_statistics(statistics, model, trial_iterate, evaluation_cache.trial_evaluations);
150151
if (accept_iterate) {
151152
// possibly increase the radius if trust region is active

0 commit comments

Comments
 (0)