11#include "akreon/linalg/linalg_util.hpp"
13#ifdef AKREON_REPORT_OUTPUT
22template <std::size_t NumCones, linalg::MatrixContainer ConeMat,
23 linalg::MatrixContainer EqMat, linalg::VectorContainer Var,
24 linalg::VectorContainer ConeVar>
27 using T = linalg::matrix_scalar_t<ConeMat>;
28 static constexpr std::size_t
N = linalg::mat_cols_v<ConeMat>;
30 static constexpr std::size_t
EqRows = linalg::mat_rows_v<EqMat>;
31 using NuVar = linalg::Vector<T, EqRows>;
50 template <std::
size_t idx = 0, std::
size_t Start = 0>
52 const auto&
eq,
const ConeMat&
F,
const ConeVar& rp,
53 const Var& rd,
const NuVar& req,
const ConeVar& x,
60 if constexpr (idx >= NumCones)
62 linalg::NumericalEvent::NONE);
64 const auto Ki = std::get<idx>(
K);
66 constexpr std::size_t
KiRows = linalg::vector_dim_v<Slack>;
78 const auto [P, event] =
Ki.H(xk, yk);
79 if (linalg::is_fatal_event(event))
80 return std::tuple(std::move(
pz_rhs),
Step{}, event);
82 const auto F_blk = linalg::get_block<Start, End, 0, N>(
F);
88#ifdef AKREON_REPORT_OUTPUT
91 cone_trace.rhs_c_norm = linalg::L2<ConePoint>()(rhs_c);
106 if constexpr (idx + 1 == NumCones) {
124 linalg::NumericalEvent::NONE);
145 template <std::
size_t idx = 0, std::
size_t Start = 0>
147 const ConeVar&
py_aff,
const auto&
K,
148 const auto&
M_inv,
const auto&
eq,
const ConeMat&
F,
149 const ConeVar& rp,
const Var& rd,
const NuVar& req,
150 const ConeVar& x,
const ConeVar& y
156 if constexpr (idx >= NumCones)
158 linalg::NumericalEvent::NONE);
160 const auto Ki = std::get<idx>(
K);
162 constexpr std::size_t
KiRows = linalg::vector_dim_v<Slack>;
176 const auto [P, event] =
Ki.H(xk, yk);
177 if (linalg::is_fatal_event(event))
178 return std::tuple(std::move(
pz_rhs),
Step{}, event);
180 const auto F_blk = linalg::get_block<Start, End, 0, N>(
F);
191 [](
const auto&... cones) {
return (
T(0) + ... + cones.nu()); },
K);
204#ifdef AKREON_REPORT_OUTPUT
207 cone_trace.rhs_c_norm = linalg::L2<ConePoint>()(rhs_c);
213 std::move(
pz_rhs),
px_aff,
py_aff,
K,
M_inv,
eq,
F, rp, rd, req, x, y
222 if constexpr (idx + 1 == NumCones) {
240 linalg::NumericalEvent::NONE);
typename cone_traits< linalg::remove_cvref_t< Cone > >::SlackT cone_slack_t
alias for slack type in cone
constexpr std::size_t dom_size_v
Newton step bundle for the primal-dual interior-point iterate.
Outer PD-IPM iteration diagnostics.
linalg::Vector< T, EqRows > NuVar
constexpr auto corrector(Var &&pz_rhs, const ConeVar &px_aff, const ConeVar &py_aff, const auto &K, const auto &M_inv, const auto &eq, const ConeMat &F, const ConeVar &rp, const Var &rd, const NuVar &req, const ConeVar &x, const ConeVar &y) const
corrector (centering) direction
linalg::matrix_scalar_t< ConeMat > T
extract T and N from Mat
static constexpr std::size_t EqRows
static constexpr std::size_t N
constexpr auto predictor(Var &&pz_rhs, const auto &K, const auto &M_inv, const auto &eq, const ConeMat &F, const ConeVar &rp, const Var &rd, const NuVar &req, const ConeVar &x, const ConeVar &y) const
predictor (affine-scaling) direction