1313#include " ingredients/subproblem_solvers/QPSolverFactory.hpp"
1414#include " ingredients/subproblem_solvers/SubproblemStatus.hpp"
1515#include " optimization/Direction.hpp"
16+ #include " optimization/EvaluationSpace.hpp"
1617#include " optimization/WarmstartInformation.hpp"
1718#include " options/Options.hpp"
1819#include " tools/Logger.hpp"
@@ -26,13 +27,14 @@ namespace uno {
2627 activity_tolerance (options.get_double(" TR_activity_tolerance" )) {
2728 }
2829
29- void LPEQPMethod::initialize (const OptimizationProblem& problem, const HessianModel& hessian_model ,
30- RegularizationStrategy<double >& regularization_strategy) {
30+ void LPEQPMethod::initialize (const OptimizationProblem& problem, Iterate& current_iterate ,
31+ HessianModel& hessian_model, RegularizationStrategy<double >& regularization_strategy, double trust_region_radius ) {
3132 this ->initial_point .resize (problem.number_variables );
32- regularization_strategy.initialize_memory (problem, hessian_model);
3333 this ->LP_direction = Direction (problem.number_variables , problem.number_constraints );
34- this ->LP_solver ->initialize_memory (problem, this ->LP_hessian_model , this ->LP_regularization_strategy );
35- this ->QP_solver ->initialize_memory (problem, hessian_model, regularization_strategy);
34+ const Subproblem LP_subproblem{problem, current_iterate, this ->LP_hessian_model , this ->LP_regularization_strategy , trust_region_radius};
35+ this ->LP_solver ->initialize_memory (LP_subproblem);
36+ const Subproblem EQP_subproblem{problem, current_iterate, hessian_model, regularization_strategy, trust_region_radius};
37+ this ->QP_solver ->initialize_memory (EQP_subproblem);
3638 }
3739
3840 void LPEQPMethod::initialize_statistics (Statistics& /* statistics*/ , const Options& /* options*/ ) {
@@ -48,19 +50,17 @@ namespace uno {
4850 }
4951
5052 void LPEQPMethod::solve (Statistics& statistics, const OptimizationProblem& problem, Iterate& current_iterate,
51- const Multipliers& current_multipliers, Direction& direction, HessianModel& hessian_model,
52- RegularizationStrategy<double >& regularization_strategy, double trust_region_radius,
53- WarmstartInformation& /* warmstart_information*/ ) {
53+ Direction& direction, HessianModel& hessian_model, RegularizationStrategy<double >& regularization_strategy,
54+ double trust_region_radius, WarmstartInformation& /* warmstart_information*/ ) {
5455 // std::cout << "Before solving LP:\n"; warmstart_information.display();
5556 // solve LP subproblem (within trust-region to avoid unboundedness)
5657 if (trust_region_radius == INF<double >) {
5758 trust_region_radius = 100 .; // TODO option
5859 }
5960
60- Subproblem LP_subproblem{problem, current_iterate, current_multipliers, this ->LP_hessian_model ,
61- this ->LP_regularization_strategy , trust_region_radius};
61+ Subproblem LP_subproblem{problem, current_iterate, this ->LP_hessian_model , this ->LP_regularization_strategy , trust_region_radius};
6262 constexpr WarmstartInformation LP_warmstart_information{};
63- this ->solve_LP (statistics, LP_subproblem, current_multipliers , LP_warmstart_information);
63+ this ->solve_LP (statistics, LP_subproblem, current_iterate. multipliers , LP_warmstart_information);
6464 DEBUG << " d^*(LP) = " << this ->LP_direction << ' \n ' ;
6565
6666 if (this ->LP_direction .status == SubproblemStatus::INFEASIBLE) {
@@ -81,10 +81,10 @@ namespace uno {
8181 trust_region_radius);
8282
8383 // compute EQP direction
84- Subproblem EQP_subproblem{fixed_active_set_problem, current_iterate, current_multipliers, hessian_model,
84+ Subproblem EQP_subproblem{fixed_active_set_problem, current_iterate, hessian_model,
8585 regularization_strategy, trust_region_radius};
8686 constexpr WarmstartInformation EQP_warmstart_information{};
87- this ->solve_EQP (statistics, EQP_subproblem, current_multipliers , direction, EQP_warmstart_information);
87+ this ->solve_EQP (statistics, EQP_subproblem, current_iterate. multipliers , direction, EQP_warmstart_information);
8888 DEBUG << " d^*(EQP) = " << direction << ' \n ' ;
8989 // reset the initial point
9090 this ->initial_point .fill (0 .);
@@ -103,20 +103,39 @@ namespace uno {
103103 void LPEQPMethod::set_elastic_variable_values (const l1RelaxedProblem& problem, Iterate& current_iterate) {
104104 problem.set_elastic_variable_values (current_iterate, [&](Iterate& iterate, size_t /* j*/ , size_t elastic_index, double /* jacobian_coefficient*/ ) {
105105 iterate.primals [elastic_index] = 0 .;
106- iterate.feasibility_multipliers .lower_bounds [elastic_index] = 1 .;
107- iterate.feasibility_multipliers .upper_bounds [elastic_index] = 0 .;
106+ iterate.multipliers .lower_bounds [elastic_index] = 1 .;
107+ iterate.multipliers .upper_bounds [elastic_index] = 0 .;
108108 });
109109 }
110110
111111 double LPEQPMethod::proximal_coefficient () const {
112112 return 0 .;
113113 }
114114
115- // progress measures
116- double LPEQPMethod::hessian_quadratic_product (const Vector<double >& vector) const {
117- return this ->QP_solver ->hessian_quadratic_product (vector);
115+ EvaluationSpace& LPEQPMethod::get_evaluation_space () const {
116+ return this ->QP_solver ->get_evaluation_space ();
117+ }
118+
119+ void LPEQPMethod::evaluate_constraint_jacobian (const OptimizationProblem& problem, Iterate& iterate) {
120+ auto & evaluation_space = this ->QP_solver ->get_evaluation_space ();
121+ evaluation_space.evaluate_constraint_jacobian (problem, iterate);
122+ }
123+
124+ void LPEQPMethod::compute_constraint_jacobian_vector_product (const Vector<double >& vector, Vector<double >& result) const {
125+ auto & evaluation_space = this ->QP_solver ->get_evaluation_space ();
126+ evaluation_space.compute_constraint_jacobian_vector_product (vector, result);
118127 }
119128
129+ void LPEQPMethod::compute_constraint_jacobian_transposed_vector_product (const Vector<double >& vector, Vector<double >& result) const {
130+ auto & evaluation_space = this ->QP_solver ->get_evaluation_space ();
131+ evaluation_space.compute_constraint_jacobian_transposed_vector_product (vector, result);
132+ }
133+
134+ double LPEQPMethod::compute_hessian_quadratic_product (const Vector<double >& vector) const {
135+ auto & evaluation_space = this ->QP_solver ->get_evaluation_space ();
136+ return evaluation_space.compute_hessian_quadratic_product (vector);
137+ }
138+
120139 void LPEQPMethod::set_auxiliary_measure (const OptimizationProblem& /* problem*/ , Iterate& iterate) {
121140 iterate.progress .auxiliary = 0 .;
122141 }
@@ -126,7 +145,7 @@ namespace uno {
126145 return 0 .;
127146 }
128147
129- void LPEQPMethod::postprocess_iterate (const OptimizationProblem& /* problem*/ , Vector< double > & /* primals */ , Multipliers& /* multipliers */ ) {
148+ void LPEQPMethod::postprocess_iterate (const OptimizationProblem& /* problem*/ , Iterate & /* iterate */ ) {
130149 // do nothing
131150 }
132151
0 commit comments