From f8d86a1e26aee24d4df5cbc3881502248290fa86 Mon Sep 17 00:00:00 2001 From: Charlie Vanaret Date: Wed, 23 Oct 2024 23:49:00 +0200 Subject: [PATCH] AMPLModel: pass the status to write_sol() --- bindings/AMPL/AMPLModel.cpp | 4 +++- uno/optimization/Result.cpp | 23 +---------------------- uno/optimization/TerminationStatus.hpp | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/bindings/AMPL/AMPLModel.cpp b/bindings/AMPL/AMPLModel.cpp index 82904b5a..310756ef 100644 --- a/bindings/AMPL/AMPLModel.cpp +++ b/bindings/AMPL/AMPLModel.cpp @@ -374,7 +374,9 @@ namespace uno { } Option_Info option_info{}; option_info.wantsol = 9; // write the solution without printing the message to stdout - write_sol_ASL(this->asl, "", iterate.primals.data(), iterate.multipliers.constraints.data(), &option_info); + std::string message = "Uno 1.1.0: "; + message.append(status_to_message(termination_status)); + write_sol_ASL(this->asl, message.data(), iterate.primals.data(), iterate.multipliers.constraints.data(), &option_info); } } diff --git a/uno/optimization/Result.cpp b/uno/optimization/Result.cpp index 1744df35..8d12e10a 100644 --- a/uno/optimization/Result.cpp +++ b/uno/optimization/Result.cpp @@ -8,28 +8,7 @@ namespace uno { void Result::print(bool print_primal_dual_solution) const { - DISCRETE << "Status:\t\t\t\t\t"; - if (this->solution.status == TerminationStatus::FEASIBLE_KKT_POINT) { - DISCRETE << "Converged with feasible KKT point\n"; - } - else if (this->solution.status == TerminationStatus::FEASIBLE_FJ_POINT) { - DISCRETE << "Converged with feasible FJ point\n"; - } - else if (this->solution.status == TerminationStatus::INFEASIBLE_STATIONARY_POINT) { - DISCRETE << "Converged with infeasible stationary point\n"; - } - else if (this->solution.status == TerminationStatus::FEASIBLE_SMALL_STEP) { - DISCRETE << "Terminated with feasible small step\n"; - } - else if (this->solution.status == TerminationStatus::INFEASIBLE_SMALL_STEP) { - DISCRETE << "Failed with infeasible small step\n"; - } - else if (this->solution.status == TerminationStatus::UNBOUNDED) { - DISCRETE << "Terminated with unbounded problem\n"; - } - else { - DISCRETE << "Failed with suboptimal point\n"; - } + DISCRETE << "Status:\t\t\t\t\t" << status_to_message(this->solution.status) << '\n'; DISCRETE << "Objective value:\t\t\t" << std::defaultfloat << std::setprecision(7) << this->solution.evaluations.objective << '\n'; DISCRETE << "Primal feasibility:\t\t\t" << this->solution.primal_feasibility << '\n'; diff --git a/uno/optimization/TerminationStatus.hpp b/uno/optimization/TerminationStatus.hpp index 4afb8f82..87c49877 100644 --- a/uno/optimization/TerminationStatus.hpp +++ b/uno/optimization/TerminationStatus.hpp @@ -14,6 +14,30 @@ namespace uno { INFEASIBLE_SMALL_STEP, UNBOUNDED }; + + inline std::string status_to_message(TerminationStatus status) { + if (status == TerminationStatus::FEASIBLE_KKT_POINT) { + return "Converged with feasible KKT point"; + } + else if (status == TerminationStatus::FEASIBLE_FJ_POINT) { + return "Converged with feasible FJ point"; + } + else if (status == TerminationStatus::INFEASIBLE_STATIONARY_POINT) { + return "Converged with infeasible stationary point"; + } + else if (status == TerminationStatus::FEASIBLE_SMALL_STEP) { + return "Terminated with feasible small step"; + } + else if (status == TerminationStatus::INFEASIBLE_SMALL_STEP) { + return "Failed with infeasible small step"; + } + else if (status == TerminationStatus::UNBOUNDED) { + return "Terminated with unbounded problem"; + } + else { + return "Failed with suboptimal point"; + } + } } // namespace #endif // UNO_TERMINATIONSTATUS_H