akreon-convex
Typed convex modeling, conic canonicalization, and primal-dual optimization in C++26.
Loading...
Searching...
No Matches
cone_traits.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
10#include "akreon/linalg/affine/affine_traits.hpp"
11
12namespace conic {
13
15enum struct ConeType : uint8_t { SYMMETRIC = 0, ASYMMETRIC };
16
18template <linalg::VectorContainer Vec, typename Derived, ConeType Type>
19struct Cone;
20
22template <linalg::VectorContainer Vec>
23struct NonnegOrthantCone;
24
26template <linalg::VectorContainer Vec>
27struct SecondOrderCone;
28
30template <linalg::VectorContainer Vec, std::size_t N>
31struct PositiveSemidefiniteCone;
32
34template <linalg::VectorContainer Vec>
35struct ExpCone;
36
38template <linalg::VectorContainer Vec>
39struct PowerCone;
40
42template <typename Cone>
44
46template <linalg::VectorContainer Vec>
47struct cone_traits<NonnegOrthantCone<Vec>> : std::false_type {
48 using SlackT = Vec;
49 using T = linalg::vector_element_t<Vec>;
50 static constexpr ConeType CT = ConeType::SYMMETRIC;
51 static constexpr std::size_t N = linalg::vector_dim_v<Vec>;
52};
53
55template <linalg::VectorContainer Vec>
56struct cone_traits<SecondOrderCone<Vec>> : std::false_type {
57 using SlackT = Vec;
58 using T = linalg::vector_element_t<Vec>;
59 static constexpr ConeType CT = ConeType::SYMMETRIC;
60 static constexpr std::size_t N = linalg::vector_dim_v<Vec>;
61};
62
64template <linalg::VectorContainer Vec, std::size_t Dim>
65struct cone_traits<PositiveSemidefiniteCone<Vec, Dim>> : std::false_type {
66 using SlackT = Vec;
67 using T = linalg::vector_element_t<Vec>;
68 static constexpr ConeType CT = ConeType::SYMMETRIC;
69 static constexpr std::size_t N = linalg::vector_dim_v<Vec>;
70};
71
73template <linalg::VectorContainer Vec>
74struct cone_traits<ExpCone<Vec>> : std::false_type {
75 using SlackT = Vec;
76 using T = linalg::vector_element_t<Vec>;
77 static constexpr ConeType CT = ConeType::ASYMMETRIC;
78 static constexpr std::size_t N = linalg::vector_dim_v<Vec>;
79};
80
82template <linalg::VectorContainer Vec>
83struct cone_traits<PowerCone<Vec>> : std::false_type {
84 using SlackT = Vec;
85 using T = linalg::vector_element_t<Vec>;
86 static constexpr ConeType CT = ConeType::ASYMMETRIC;
87 static constexpr std::size_t N = linalg::vector_dim_v<Vec>;
88};
89
91template <class Cone>
93
95template <class Cone>
97
99template <class Cone>
100inline constexpr bool is_cone_symmetric_v =
102
104template <class Cone>
105inline constexpr std::size_t cone_dim_t =
107
109template <typename ConeTuple>
111
113template <typename... Cs>
114struct cone_tuple_traits<std::tuple<Cs...>> {
115 static constexpr std::size_t NumCones = sizeof...(Cs);
116 static constexpr std::size_t LocalConeDim =
117 (std::size_t{0} + ... + cone_dim_t<Cs>);
118};
119
121template <typename ConeTuple>
122inline constexpr std::size_t cone_tuple_num_cones_v =
124
126template <typename ConeTuple>
127inline constexpr std::size_t cone_tuple_local_cone_dim_v =
129
131template <typename ConeTuple>
132inline constexpr std::size_t cone_tuple_dim_v =
133 cone_tuple_local_cone_dim_v<ConeTuple>;
134
136template <affine::AffineMapLike Map, typename... Cs>
137struct ConeBlock;
138
140template <typename ConeBlock>
142
144template <affine::AffineMapLike Map, typename... Cs>
145struct cone_block_traits<ConeBlock<Map, Cs...>> {
146 using FMap = Map;
147 using MapT = affine::affine_mat_t<Map>;
148 using Cones = std::tuple<Cs...>;
149
150 static constexpr std::size_t NumCones = sizeof...(Cs);
151 static constexpr std::size_t LocalConeDim =
152 cone_tuple_local_cone_dim_v<Cones>;
153 static constexpr std::size_t MapRows = linalg::mat_rows_v<MapT>;
154 static constexpr std::size_t MapCols = linalg::mat_cols_v<MapT>;
155};
156
158template <typename CB>
161
163template <typename CB>
164inline constexpr std::size_t cone_block_num_cones_v =
166
168template <typename CB>
169inline constexpr std::size_t cone_block_local_cone_dim_v =
171
173template <typename CB>
174inline constexpr std::size_t cone_block_cone_dim_v =
175 cone_block_local_cone_dim_v<CB>;
176
178template <typename CB>
179inline constexpr std::size_t cone_block_map_rows_v =
181
183template <typename CB>
184inline constexpr std::size_t cone_block_map_cols_v =
186
188template <class Cblk>
189concept ConeBlockLike = requires(const Cblk& cblk) {
190 { cblk.map };
191 { cblk.cones };
192};
193
195template <typename Builder>
196concept BuilderLike = requires(const Builder& builder) {
197 { builder.coord_map };
198 { builder.cb };
199 { builder.eq_map };
200};
201
203template <linalg::RnSpace DecVarDom, affine::AffineMapLike CoordMap,
204 conic::ConeBlockLike CB, affine::AffineMapLike EqMap,
205 typename CanonicalTrace>
207
209template <typename Builder>
211
213template <linalg::RnSpace DecVarDom, affine::AffineMapLike CoordMap,
214 conic::ConeBlockLike CB, affine::AffineMapLike EqMap,
215 typename CanonicalTrace>
217 CanonicalFormBuilder<DecVarDom, CoordMap, CB, EqMap, CanonicalTrace>> {
218 using Dom = DecVarDom;
219 using Map = CoordMap;
220 using CoordinateMap = CoordMap;
221 using ConeBlock = CB;
222 using EqualityMap = EqMap;
223 using CanonicalTraceT = CanonicalTrace;
224
225 using CoordMapT = affine::affine_mat_t<CoordMap>;
226 using EqMapT = affine::affine_mat_t<EqMap>;
227
228 static constexpr std::size_t DecDim = linalg::space_dim_v<DecVarDom>;
229 static constexpr std::size_t CoordRows = linalg::mat_rows_v<CoordMapT>;
230 static constexpr std::size_t CoordCols = linalg::mat_cols_v<CoordMapT>;
231 static constexpr std::size_t CoordAuxDim =
232 CoordCols > DecDim ? CoordCols - DecDim : 0;
233
234 static constexpr std::size_t ConeRows = cone_block_map_rows_v<CB>;
235 static constexpr std::size_t ConeCols = cone_block_map_cols_v<CB>;
236 static constexpr std::size_t ConeAuxDim =
237 ConeCols > DecDim ? ConeCols - DecDim : 0;
238 static constexpr std::size_t ConeCount = cone_block_num_cones_v<CB>;
239 static constexpr std::size_t LocalConeDim = cone_block_local_cone_dim_v<CB>;
240
241 static constexpr std::size_t EqRows = linalg::mat_rows_v<EqMapT>;
242 static constexpr std::size_t EqCols = linalg::mat_cols_v<EqMapT>;
243 static constexpr std::size_t EqAuxDim = EqCols > DecDim ? EqCols - DecDim : 0;
244
245 static constexpr std::size_t FullDim = ConeCols > EqCols ? ConeCols : EqCols;
246};
247
249template <typename Builder>
252
254template <typename Builder>
257
259template <typename Builder>
262
264template <typename Builder>
267
269template <typename Builder>
271 typename builder_traits<linalg::remove_cvref_t<Builder>>::CanonicalTraceT;
272
274template <typename Builder>
275inline constexpr std::size_t builder_dec_dim_v =
277
279template <typename Builder>
280inline constexpr std::size_t builder_coord_rows_v =
282
284template <typename Builder>
285inline constexpr std::size_t builder_coord_cols_v =
287
289template <typename Builder>
290inline constexpr std::size_t builder_coord_aux_dim_v =
292
294template <typename Builder>
295inline constexpr std::size_t builder_cone_rows_v =
297
299template <typename Builder>
300inline constexpr std::size_t builder_cone_cols_v =
302
304template <typename Builder>
305inline constexpr std::size_t builder_cone_aux_dim_v =
307
309template <typename Builder>
310inline constexpr std::size_t builder_cone_count_v =
312
314template <typename Builder>
315inline constexpr std::size_t builder_local_cone_dim_v =
317
319template <typename Builder>
320inline constexpr std::size_t builder_cone_dim_v =
321 builder_local_cone_dim_v<Builder>;
322
324template <typename Builder>
325inline constexpr std::size_t builder_eq_rows_v =
327
329template <typename Builder>
330inline constexpr std::size_t builder_eq_cols_v =
332
334template <typename Builder>
335inline constexpr std::size_t builder_eq_aux_dim_v =
337
339template <typename Builder>
340inline constexpr std::size_t builder_full_dim_v =
342
343} // namespace conic
Concept for canonicalization builder objects.
concept for cone block like used in canonical form
constexpr std::size_t builder_cone_aux_dim_v
auxiliary columns visible to the current cone map
constexpr std::size_t builder_full_dim_v
widest canonical domain currently visible to cone or equality rows
constexpr std::size_t cone_block_num_cones_v
helper to extract number of cones from cone block
constexpr std::size_t builder_eq_rows_v
current equality affine-map row count
constexpr std::size_t cone_tuple_dim_v
Compatibility alias for total local cone coordinate dimension.
typename cone_block_traits< linalg::remove_cvref_t< CB > >::FMap cone_block_map_t
alias for extracting F map from cone block
constexpr std::size_t builder_coord_aux_dim_v
auxiliary columns visible to the current coordinate selector
constexpr std::size_t builder_coord_rows_v
current coordinate selector row count
typename cone_traits< linalg::remove_cvref_t< Cone > >::SlackT cone_slack_t
alias for slack type in cone
typename builder_traits< linalg::remove_cvref_t< Builder > >::ConeBlock builder_cb_t
builder cone block
constexpr std::size_t builder_eq_aux_dim_v
auxiliary columns visible to the current equality map
typename builder_traits< linalg::remove_cvref_t< Builder > >::EqualityMap builder_eq_t
builder equality map
constexpr std::size_t cone_dim_t
helper to get N from cone
constexpr std::size_t builder_cone_cols_v
current cone affine-map column count
constexpr std::size_t cone_tuple_num_cones_v
Number of cones in a fixed cone tuple.
constexpr std::size_t builder_coord_cols_v
current coordinate selector column count
constexpr std::size_t cone_block_map_cols_v
number of columns in the cone block affine map
constexpr bool is_cone_symmetric_v
helper to see if cone is symmetric
constexpr std::size_t cone_tuple_local_cone_dim_v
Total cone coordinate dimension represented by a fixed cone tuple.
constexpr std::size_t cone_block_cone_dim_v
Compatibility alias for local cone coordinate dimension.
typename cone_traits< linalg::remove_cvref_t< Cone > >::T cone_scalar_t
alias for scalar type in cone
constexpr std::size_t builder_cone_dim_v
Compatibility alias for realized local cone coordinate dimension.
constexpr std::size_t builder_cone_count_v
number of cones currently accumulated by a builder
constexpr std::size_t builder_dec_dim_v
original decision-variable dimension tracked by a builder
typename builder_traits< linalg::remove_cvref_t< Builder > >::Dom builder_dom_t
builder domain
ConeType
cone type
typename builder_traits< linalg::remove_cvref_t< Builder > >::Map builder_map_t
builder map
typename builder_traits< linalg::remove_cvref_t< Builder > >::CanonicalTraceT builder_canonical_trace_t
builder canonical trace
constexpr std::size_t cone_block_map_rows_v
number of rows in the cone block affine map
constexpr std::size_t builder_eq_cols_v
current equality affine-map column count
constexpr std::size_t builder_cone_rows_v
current cone affine-map row count
constexpr std::size_t builder_local_cone_dim_v
total local cone coordinate dimension currently realized by a builder
constexpr std::size_t cone_block_local_cone_dim_v
total coordinate dimension spanned by the cone tuple
Builder for conic canonical forms.
Cone block.
forward decl for exp
Definition exp_cone.hpp:25
forward decl for nonneg orthant cone
Definition rplus.hpp:47
forward decl for psd
Definition psd_cone.hpp:49
forward decl for power
forward decl for soc
Definition soc.hpp:128
Base builder traits.
Base cone block traits.
linalg::vector_element_t< Vec > T
linalg::vector_element_t< Vec > T
linalg::vector_element_t< Vec > T
Base cone traits.
Base traits for tuples of cones.