12#include "akreon/linalg/assert.hpp"
15#include "akreon/linalg/operator/operator_traits.hpp"
20template <linalg::RnSpace Dom>
24template <linalg::RnSpace Dom>
28template <linalg::RnSpace Dom>
32template <linalg::RnSpace Dom>
37template <linalg::RnSpace Dom>
41template <linalg::RnSpace Dom>
46template <linalg::RnSpace Dom>
50template <linalg::RnSpace Dom>
55template <linalg::RnSpace Dom>
59template <linalg::RnSpace Dom>
64template <linalg::SquareMatrix Mat>
68template <linalg::SquareMatrix Mat>
72template <
typename Meta,
typename Child>
95 "ScalarView child must be the decision variable type");
106 const affine::AffineMap<SelMatT>&
map_in)
109 "ScalarView child must be the decision variable type");
120 affine::AffineMap<SelMatT>
new_map(
alpha * map.linear_part(),
132 constexpr auto add(
T beta)
const {
133 affine::AffineMap<SelMatT>
new_map(map.linear_part(),
134 TransT{beta} + map.translation());
145 template <AtomType Type, conic::BuilderLike Builder>
147 const auto cb = builder.cb;
148 return conic::make_builder<conic::builder_dom_t<Builder>>(
149 map, cb, builder.eq_map, builder.canonical_trace);
153 affine::AffineMap<SelMatT>
map;
162template <
typename Meta>
201 AK_ASSERT(idx <
N &&
"Variable index out of bounds");
202 affine::AffineMap<linalg::RowVector<T, N>>
scalar_map(
203 linalg::as_row_matrix(this->
map.linear_part().row(idx)),
204 this->map.translation()(idx));
242 affine::AffineMap<LinearMatT>
new_map(
map.linear_part(),
257 template <AtomType Type, conic::BuilderLike Builder>
259 return conic::make_builder<conic::builder_dom_t<Builder>>(
260 map, builder.cb, builder.eq_map, builder.canonical_trace);
271 auto form_tup = [
this]<std::size_t...
Is>(std::index_sequence<
Is...>) {
272 return std::make_tuple(((*
this)(
Is))...);
274 return form_tup(std::make_index_sequence<N>{});
287 template <AtomType Type, conic::BuilderLike Builder>
294 affine::AffineMap<LinearMatT>
map;
constexpr std::size_t dom_size_v
CRTP base for convex atoms.
static constexpr VarType DomSign
Domain sign declared by atom metadata.
meta_dom_t< Meta > Domain
Atom input domain.
dom_type_t< Domain > T
Scalar field for the atom domain.
static constexpr std::size_t N
Domain dimension.
Domain wrapper with a static sign label.
constexpr auto add(T beta) const
add (scalar)
std::size_t idx
index of orig var
linalg::Vector< T, 1 > TransT
constexpr ScalarView(std::size_t idx_in, const Child &child_in)
CTOR.
constexpr ScalarView(std::size_t idx_in, const Child &child_in, const affine::AffineMap< SelMatT > &map_in)
CTOR.
linalg::RowVector< T, N > SelMatT
constexpr auto canonicalize_impl(const Builder &builder) const
canonicalize
constexpr auto mul(T alpha) const
mul (scalar)
affine::AffineMap< SelMatT > map
member var
constexpr Variable()
CTOR (default)
constexpr auto mul(const LinearMatT &alpha) const
mul (scalar)
affine::AffineMap< LinearMatT > map
member vars
constexpr auto canonicalize_impl(const Builder &builder) const
canonicalize
linalg::Matrix< T, N, N > LinearMatT
constexpr auto mul(T alpha) const
mul (scalar)
constexpr auto add(const TransT &beta) const
add (scalar)
linalg::Vector< T, N > TransT
constexpr Variable(const affine::AffineMap< LinearMatT > &map_in)
CTOR.
constexpr ScalarViewT operator()(std::size_t idx) const
operator overload for index
ScalarView< ScalarMeta, Variable< Meta > > ScalarViewT
constexpr auto split() const
split
constexpr auto add_var_block(const Builder &builder) const
add_var_block