diff --git a/include/sleipnir/optimization/SolverStatus.hpp b/include/sleipnir/optimization/SolverStatus.hpp index 9a888250..122941cd 100644 --- a/include/sleipnir/optimization/SolverStatus.hpp +++ b/include/sleipnir/optimization/SolverStatus.hpp @@ -24,6 +24,9 @@ struct SLEIPNIR_DLLEXPORT SolverStatus { /// The solver's exit condition. SolverExitCondition exitCondition = SolverExitCondition::kSuccess; + + /// The solution's cost. + double cost = 0.0; }; } // namespace sleipnir diff --git a/jormungandr/cpp/Docstrings.hpp b/jormungandr/cpp/Docstrings.hpp index 03df2cd7..e7f5dd29 100644 --- a/jormungandr/cpp/Docstrings.hpp +++ b/jormungandr/cpp/Docstrings.hpp @@ -941,6 +941,8 @@ static const char *__doc_sleipnir_SolverStatus = R"doc(Return value of OptimizationProblem::Solve() containing the cost function and constraint types and solver's exit condition.)doc"; +static const char *__doc_sleipnir_SolverStatus_cost = R"doc(The solution's cost.)doc"; + static const char *__doc_sleipnir_SolverStatus_costFunctionType = R"doc(The cost function type detected by the solver.)doc"; static const char *__doc_sleipnir_SolverStatus_equalityConstraintType = R"doc(The equality constraint type detected by the solver.)doc"; diff --git a/jormungandr/cpp/optimization/BindSolverStatus.cpp b/jormungandr/cpp/optimization/BindSolverStatus.cpp index 9987f4a0..547f8641 100644 --- a/jormungandr/cpp/optimization/BindSolverStatus.cpp +++ b/jormungandr/cpp/optimization/BindSolverStatus.cpp @@ -16,11 +16,11 @@ void BindSolverStatus(py::module_& optimization) { DOC(sleipnir, SolverStatus)}; cls.def(py::init<>()); cls.def(py::init(), + SolverExitCondition, double>(), "cost_function_type"_a = ExpressionType::kNone, "equality_constraint_type"_a = ExpressionType::kNone, "inequality_constraint_type"_a = ExpressionType::kNone, - "exit_condition"_a = SolverExitCondition::kSuccess); + "exit_condition"_a = SolverExitCondition::kSuccess, "cost"_a = 0.0); cls.def_readwrite("cost_function_type", &SolverStatus::costFunctionType, DOC(sleipnir, SolverStatus, costFunctionType)); cls.def_readwrite("equality_constraint_type", @@ -31,6 +31,8 @@ void BindSolverStatus(py::module_& optimization) { DOC(sleipnir, SolverStatus, inequalityConstraintType)); cls.def_readwrite("exit_condition", &SolverStatus::exitCondition, DOC(sleipnir, SolverStatus, exitCondition)); + cls.def_readwrite("cost", &SolverStatus::cost, + DOC(sleipnir, SolverStatus, cost)); } } // namespace sleipnir diff --git a/src/optimization/solver/InteriorPoint.cpp b/src/optimization/solver/InteriorPoint.cpp index b80fdfc3..122eb285 100644 --- a/src/optimization/solver/InteriorPoint.cpp +++ b/src/optimization/solver/InteriorPoint.cpp @@ -143,6 +143,8 @@ void InteriorPoint( // Prints final diagnostics when the solver exits scope_exit exit{[&] { + status->cost = f.Value(); + if (config.diagnostics && !feasibilityRestoration) { auto solveEndTime = std::chrono::system_clock::now();