diff --git a/bindings/AMPL/uno_ampl.cpp b/bindings/AMPL/uno_ampl.cpp index 12409c776..262d1e2aa 100644 --- a/bindings/AMPL/uno_ampl.cpp +++ b/bindings/AMPL/uno_ampl.cpp @@ -11,6 +11,7 @@ #include "AMPLUserCallbacks.hpp" #include "Uno.hpp" #include "model/ModelFactory.hpp" +#include "optimization/WarmstartInformation.hpp" #include "options/DefaultOptions.hpp" #include "options/Options.hpp" #include "options/Presets.hpp" @@ -55,7 +56,17 @@ namespace uno { AMPLUserCallbacks user_callbacks{}; // solve the instance - Result result = uno.solve(*model, initial_iterate, options, user_callbacks); + WarmstartInformation warmstart_information{}; + Result result = uno.solve(*model, initial_iterate, options, user_callbacks, warmstart_information); + + + auto modified_model = AMPLModel("/media/data/AMPL/CUTEst/hs015_different_bounds", options); + WarmstartInformation warmstart_information2{}; + warmstart_information2.no_changes(); + warmstart_information2.variable_bounds_changed = true; + result = uno.solve(modified_model, result.solution, options, user_callbacks, warmstart_information2); + + if (result.optimization_status == OptimizationStatus::SUCCESS) { // check result.solution.status } diff --git a/uno/Uno.cpp b/uno/Uno.cpp index db683db00..6f1029736 100644 --- a/uno/Uno.cpp +++ b/uno/Uno.cpp @@ -33,18 +33,17 @@ namespace uno { Level Logger::level = INFO; // solve without user callbacks - Result Uno::solve(const Model& model, Iterate& current_iterate, const Options& options) { + Result Uno::solve(const Model& model, Iterate& current_iterate, const Options& options, WarmstartInformation& warmstart_information) { // pass user callbacks that do nothing NoUserCallbacks user_callbacks{}; - return this->solve(model, current_iterate, options, user_callbacks); + return this->solve(model, current_iterate, options, user_callbacks, warmstart_information); } // solve with user callbacks - Result Uno::solve(const Model& model, Iterate& current_iterate, const Options& options, UserCallbacks& user_callbacks) { + Result Uno::solve(const Model& model, Iterate& current_iterate, const Options& options, UserCallbacks& user_callbacks, + WarmstartInformation& warmstart_information) { Timer timer{}; Statistics statistics = Uno::create_statistics(model, options); - WarmstartInformation warmstart_information{}; - warmstart_information.whole_problem_changed(); size_t major_iterations = 0; OptimizationStatus optimization_status = OptimizationStatus::SUCCESS; @@ -64,7 +63,6 @@ namespace uno { DEBUG << "### Outer iteration " << major_iterations << '\n'; // compute an acceptable iterate by solving a subproblem at the current point - warmstart_information.iterate_changed(); this->globalization_mechanism.compute_next_iterate(statistics, model, current_iterate, trial_iterate, warmstart_information, user_callbacks); termination = this->termination_criteria(trial_iterate.status, major_iterations, timer.get_duration(), optimization_status); user_callbacks.notify_new_primals(trial_iterate.primals); @@ -72,6 +70,7 @@ namespace uno { // the trial iterate becomes the current iterate for the next iteration std::swap(current_iterate, trial_iterate); + warmstart_information.new_iterate(); } } catch (std::exception& exception) { @@ -98,6 +97,7 @@ namespace uno { statistics.start_new_line(); statistics.set("iter", 0); statistics.set("status", "initial point"); + this->globalization_mechanism.initialize(statistics, current_iterate, options); options.print_used(); if (Logger::level == INFO) statistics.print_current_line(); diff --git a/uno/Uno.hpp b/uno/Uno.hpp index 3e6f3b7db..7f1032cdb 100644 --- a/uno/Uno.hpp +++ b/uno/Uno.hpp @@ -15,14 +15,16 @@ namespace uno { class Statistics; class Timer; class UserCallbacks; + class WarmstartInformation; class Uno { public: Uno(GlobalizationMechanism& globalization_mechanism, const Options& options); // solve with or without user callbacks - Result solve(const Model& model, Iterate& initial_iterate, const Options& options); - Result solve(const Model& model, Iterate& initial_iterate, const Options& options, UserCallbacks& user_callbacks); + Result solve(const Model& model, Iterate& initial_iterate, const Options& options, WarmstartInformation& warmstart_information); + Result solve(const Model& model, Iterate& initial_iterate, const Options& options, UserCallbacks& user_callbacks, + WarmstartInformation& warmstart_information); static std::string current_version(); static void print_available_strategies(); diff --git a/uno/ingredients/globalization_mechanisms/TrustRegionStrategy.cpp b/uno/ingredients/globalization_mechanisms/TrustRegionStrategy.cpp index 23f0b29b2..d67263054 100644 --- a/uno/ingredients/globalization_mechanisms/TrustRegionStrategy.cpp +++ b/uno/ingredients/globalization_mechanisms/TrustRegionStrategy.cpp @@ -33,7 +33,7 @@ namespace uno { statistics.add_column("TR iter", Statistics::int_width + 2, options.get_int("statistics_minor_column_order")); statistics.add_column("TR radius", Statistics::double_width - 4, options.get_int("statistics_TR_radius_column_order")); statistics.set("TR radius", this->radius); - + this->constraint_relaxation_strategy.set_trust_region_radius(this->radius); this->constraint_relaxation_strategy.initialize(statistics, initial_iterate, options); } diff --git a/uno/ingredients/subproblem_solvers/BQPD/BQPDSolver.cpp b/uno/ingredients/subproblem_solvers/BQPD/BQPDSolver.cpp index aa7c3f789..15f644143 100644 --- a/uno/ingredients/subproblem_solvers/BQPD/BQPDSolver.cpp +++ b/uno/ingredients/subproblem_solvers/BQPD/BQPDSolver.cpp @@ -5,7 +5,6 @@ #include "BQPDSolver.hpp" #include "ingredients/constraint_relaxation_strategies/OptimizationProblem.hpp" #include "ingredients/hessian_models/HessianModel.hpp" -#include "linear_algebra/SymmetricMatrix.hpp" #include "linear_algebra/Vector.hpp" #include "optimization/Direction.hpp" #include "optimization/Iterate.hpp" diff --git a/uno/optimization/WarmstartInformation.cpp b/uno/optimization/WarmstartInformation.cpp index cdf5dcf3f..a51a9b57a 100644 --- a/uno/optimization/WarmstartInformation.cpp +++ b/uno/optimization/WarmstartInformation.cpp @@ -23,7 +23,7 @@ namespace uno { this->jacobian_sparsity_changed = false; } - void WarmstartInformation::iterate_changed() { + void WarmstartInformation::new_iterate() { this->objective_changed = true; this->constraints_changed = true; this->constraint_bounds_changed = true; diff --git a/uno/optimization/WarmstartInformation.hpp b/uno/optimization/WarmstartInformation.hpp index 48c30ac07..c8c071e77 100644 --- a/uno/optimization/WarmstartInformation.hpp +++ b/uno/optimization/WarmstartInformation.hpp @@ -16,7 +16,7 @@ namespace uno { void display() const; void no_changes(); - void iterate_changed(); + void new_iterate(); void whole_problem_changed(); void only_objective_changed(); };