From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Tue, 28 Jan 2025 22:19:31 -0800 Subject: [PATCH 04/10] Replace std::to_underlying() --- include/sleipnir/optimization/problem.hpp | 9 +++++---- include/sleipnir/util/print_diagnostics.hpp | 3 ++- include/sleipnir/util/to_underlying.hpp | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 include/sleipnir/util/to_underlying.hpp diff --git a/include/sleipnir/optimization/problem.hpp b/include/sleipnir/optimization/problem.hpp index 3de6d5bf89a65fe07784350c3b1a4691dfc0c822..273363db2cf75c84d81f2fef36dcb2094303ee2e 100644 --- a/include/sleipnir/optimization/problem.hpp +++ b/include/sleipnir/optimization/problem.hpp @@ -37,6 +37,7 @@ #include "sleipnir/util/profiler.hpp" #include "sleipnir/util/spy.hpp" #include "sleipnir/util/symbol_exports.hpp" +#include "sleipnir/util/to_underlying.hpp" namespace slp { @@ -752,11 +753,11 @@ class Problem { // Print problem structure slp::println("\nProblem structure:"); slp::println(" ↳ {} cost function", - types[std::to_underlying(cost_function_type())]); + types[slp::to_underlying(cost_function_type())]); slp::println(" ↳ {} equality constraints", - types[std::to_underlying(equality_constraint_type())]); + types[slp::to_underlying(equality_constraint_type())]); slp::println(" ↳ {} inequality constraints", - types[std::to_underlying(inequality_constraint_type())]); + types[slp::to_underlying(inequality_constraint_type())]); if (m_decision_variables.size() == 1) { slp::print("\n1 decision variable\n"); @@ -768,7 +769,7 @@ class Problem { [](const gch::small_vector>& constraints) { std::array counts{}; for (const auto& constraint : constraints) { - ++counts[std::to_underlying(constraint.type())]; + ++counts[slp::to_underlying(constraint.type())]; } for (const auto& [count, name] : std::views::zip(counts, std::array{"empty", "constant", "linear", diff --git a/include/sleipnir/util/print_diagnostics.hpp b/include/sleipnir/util/print_diagnostics.hpp index e16ef1b03e675b7ccb8db6781568eec7a44aace7..69cb99957cc7da5abc4162c53a229f7f642bbe4b 100644 --- a/include/sleipnir/util/print_diagnostics.hpp +++ b/include/sleipnir/util/print_diagnostics.hpp @@ -17,6 +17,7 @@ #include "sleipnir/util/print.hpp" #include "sleipnir/util/profiler.hpp" +#include "sleipnir/util/to_underlying.hpp" namespace slp { @@ -239,7 +240,7 @@ void print_iteration_diagnostics(int iterations, IterationType type, slp::println( "│{:4} {:4} {:9.3f} {:12e} {:13e} {:12e} {:12e} {:.2e} {:<5} {:.2e} " "{:.2e} {:2d}│", - iterations, ITERATION_TYPES[std::to_underlying(type)], to_ms(time), error, + iterations, ITERATION_TYPES[slp::to_underlying(type)], to_ms(time), error, cost, infeasibility, complementarity, μ, power_of_10(δ), primal_α, dual_α, backtracks); } diff --git a/include/sleipnir/util/to_underlying.hpp b/include/sleipnir/util/to_underlying.hpp new file mode 100644 index 0000000000000000000000000000000000000000..3f9b4835b912c5a0d998c43828f255c61d0f573e --- /dev/null +++ b/include/sleipnir/util/to_underlying.hpp @@ -0,0 +1,14 @@ +// Copyright (c) Sleipnir contributors + +#pragma once + +#include + +namespace slp { + +template +constexpr std::underlying_type_t to_underlying(Enum e) noexcept { + return static_cast>(e); +} + +} // namespace slp