akreon-convex
Typed convex modeling, conic canonicalization, and primal-dual optimization in C++26.
Loading...
Searching...
No Matches
variable.hpp
Go to the documentation of this file.
1/*
2 * Copyright © 2025-2026 Akreon LLC
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6#pragma once
7
8#include <tuple>
9#include "atom.hpp"
10
12#include "akreon/linalg/assert.hpp"
14#include "convex_traits.hpp"
15#include "akreon/linalg/operator/operator_traits.hpp"
16
17namespace convex {
18
20template <linalg::RnSpace Dom>
22
24template <linalg::RnSpace Dom>
26
28template <linalg::RnSpace Dom>
30
32template <linalg::RnSpace Dom>
35
37template <linalg::RnSpace Dom>
39
41template <linalg::RnSpace Dom>
44
46template <linalg::RnSpace Dom>
48
50template <linalg::RnSpace Dom>
53
55template <linalg::RnSpace Dom>
57
59template <linalg::RnSpace Dom>
62
64template <linalg::SquareMatrix Mat>
66
68template <linalg::SquareMatrix Mat>
71
72template <typename Meta, typename Child>
73 requires(dom_size_v<meta_dom_t<Meta>> == 1)
74struct ScalarView : Atom<Meta, ScalarView<Meta, Child>, Child> {
78 using typename BaseT::T;
79
80 static constexpr std::size_t N = dom_size_v<meta_dom_t<atom_meta_t<Child>>>;
81
82 using SelMatT = linalg::RowVector<T, N>;
83 using TransT = linalg::Vector<T, 1>;
84
91 constexpr explicit ScalarView(std::size_t idx_in, const Child& child_in)
92 : BaseT(std::make_tuple(child_in)),
95 "ScalarView child must be the decision variable type");
96 }
97
105 constexpr explicit ScalarView(std::size_t idx_in, const Child& child_in,
106 const affine::AffineMap<SelMatT>& map_in)
107 : BaseT(std::make_tuple(child_in)), map(map_in), idx(idx_in) {
109 "ScalarView child must be the decision variable type");
110 }
111
119 constexpr auto mul(T alpha) const {
120 affine::AffineMap<SelMatT> new_map(alpha * map.linear_part(),
121 map.translation());
122 return ScalarView(idx, std::get<0>(this->children), new_map);
123 }
124
132 constexpr auto add(T beta) const {
133 affine::AffineMap<SelMatT> new_map(map.linear_part(),
134 TransT{beta} + map.translation());
135 return ScalarView(idx, std::get<0>(this->children), new_map);
136 }
137
145 template <AtomType Type, conic::BuilderLike Builder>
146 constexpr auto canonicalize_impl(const Builder& builder) const {
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);
150 }
151
153 affine::AffineMap<SelMatT> map;
154 std::size_t idx;
155};
156
162template <typename Meta>
163struct Variable : Atom<Meta, Variable<Meta>> {
166 using BaseT::DomSign;
167 using BaseT::N;
169 using typename BaseT::T;
170
171 using LinearMatT = linalg::Matrix<T, N, N>;
172 using TransT = linalg::Vector<T, N>;
173
178
182 constexpr explicit Variable()
184
190 constexpr explicit Variable(const affine::AffineMap<LinearMatT>& map_in)
191 : BaseT(), map(map_in) {}
192
200 constexpr ScalarViewT operator()(std::size_t idx) const {
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));
205 return ScalarViewT(idx, *this, scalar_map);
206 }
207
215 constexpr auto mul(T alpha) const {
216 affine::AffineMap<LinearMatT> new_map(alpha * map.linear_part(),
217 map.translation());
218 return Variable(new_map);
219 }
220
228 constexpr auto mul(const LinearMatT& alpha) const {
229 affine::AffineMap<LinearMatT> new_map(alpha * map.linear_part(),
230 map.translation());
231 return Variable(new_map);
232 }
233
241 constexpr auto add(const TransT& beta) const {
242 affine::AffineMap<LinearMatT> new_map(map.linear_part(),
243 TransT{beta} + map.translation());
244 return Variable(new_map);
245 }
246
257 template <AtomType Type, conic::BuilderLike Builder>
258 constexpr auto canonicalize_impl(const Builder& builder) const {
259 return conic::make_builder<conic::builder_dom_t<Builder>>(
260 map, builder.cb, builder.eq_map, builder.canonical_trace);
261 }
262
270 constexpr auto split() const {
271 auto form_tup = [this]<std::size_t... Is>(std::index_sequence<Is...>) {
272 return std::make_tuple(((*this)(Is))...);
273 };
274 return form_tup(std::make_index_sequence<N>{});
275 }
276
287 template <AtomType Type, conic::BuilderLike Builder>
288 constexpr auto add_var_block(const Builder& builder) const {
289 const auto child_builder = this->template canonicalize<Type>(builder);
290 return child_builder;
291 }
292
294 affine::AffineMap<LinearMatT> map;
295};
296
297} // namespace convex
constexpr std::size_t dom_size_v
CRTP base for convex atoms.
Definition atom.hpp:22
static constexpr VarType DomSign
Domain sign declared by atom metadata.
Definition atom.hpp:41
meta_dom_t< Meta > Domain
Atom input domain.
Definition atom.hpp:24
dom_type_t< Domain > T
Scalar field for the atom domain.
Definition atom.hpp:30
static constexpr std::size_t N
Domain dimension.
Definition atom.hpp:35
Atom metadata bundling domain, codomain, and curvature.
Domain wrapper with a static sign label.
constexpr auto add(T beta) const
add (scalar)
Definition variable.hpp:132
std::size_t idx
index of orig var
Definition variable.hpp:154
linalg::Vector< T, 1 > TransT
Definition variable.hpp:83
constexpr ScalarView(std::size_t idx_in, const Child &child_in)
CTOR.
Definition variable.hpp:91
constexpr ScalarView(std::size_t idx_in, const Child &child_in, const affine::AffineMap< SelMatT > &map_in)
CTOR.
Definition variable.hpp:105
linalg::RowVector< T, N > SelMatT
Definition variable.hpp:82
constexpr auto canonicalize_impl(const Builder &builder) const
canonicalize
Definition variable.hpp:146
constexpr auto mul(T alpha) const
mul (scalar)
Definition variable.hpp:119
affine::AffineMap< SelMatT > map
member var
Definition variable.hpp:153
variable atom
Definition variable.hpp:163
constexpr Variable()
CTOR (default)
Definition variable.hpp:182
constexpr auto mul(const LinearMatT &alpha) const
mul (scalar)
Definition variable.hpp:228
affine::AffineMap< LinearMatT > map
member vars
Definition variable.hpp:294
constexpr auto canonicalize_impl(const Builder &builder) const
canonicalize
Definition variable.hpp:258
linalg::Matrix< T, N, N > LinearMatT
Definition variable.hpp:171
constexpr auto mul(T alpha) const
mul (scalar)
Definition variable.hpp:215
constexpr auto add(const TransT &beta) const
add (scalar)
Definition variable.hpp:241
linalg::Vector< T, N > TransT
Definition variable.hpp:172
constexpr Variable(const affine::AffineMap< LinearMatT > &map_in)
CTOR.
Definition variable.hpp:190
constexpr ScalarViewT operator()(std::size_t idx) const
operator overload for index
Definition variable.hpp:200
ScalarView< ScalarMeta, Variable< Meta > > ScalarViewT
Definition variable.hpp:177
constexpr auto split() const
split
Definition variable.hpp:270
constexpr auto add_var_block(const Builder &builder) const
add_var_block
Definition variable.hpp:288