akreon-convex
Typed convex modeling, conic canonicalization, and primal-dual optimization in C++26.
Loading...
Searching...
No Matches
canonical_trace.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 <cstddef>
9#include <cstdint>
10#include <limits>
11#include <tuple>
12#include <type_traits>
13#include <utility>
14
17
18namespace convex {
19
23 SECOND_ORDER = 1,
25 EXP = 3,
26 POWER = 4,
27 UNKNOWN = 255
28};
29
31inline constexpr std::size_t canonical_no_parent =
32 std::numeric_limits<std::size_t>::max();
33
42 std::size_t node_id{};
43
47
50
52 std::size_t child_index{};
53};
54
62 std::size_t node_id{};
63 std::size_t local_cone_index{};
64 std::size_t
67 std::size_t cone_offset{};
68 std::size_t cone_dim{};
69};
70
78 std::size_t node_id{};
79 std::size_t
81 std::size_t row_offset{};
82 std::size_t row_count{};
83};
84
92template <typename NodeRecords = std::tuple<>,
93 typename ConeRecords = std::tuple<>,
94 typename EqualityRecords = std::tuple<>>
100
102
103template <typename Trace>
105
106template <typename NodeTuple, typename ConeTuple, typename EqualityTuple>
112
113 static constexpr std::size_t NumNodes = std::tuple_size_v<NodeTuple>;
114 static constexpr std::size_t NumCones = std::tuple_size_v<ConeTuple>;
115 static constexpr std::size_t NumEqualities = std::tuple_size_v<EqualityTuple>;
116};
117
118template <typename Trace>
121
122template <typename Trace>
125
126template <typename Trace>
129
130template <typename Trace>
131inline constexpr std::size_t canonical_trace_num_nodes_v =
133
134template <typename Trace>
135inline constexpr std::size_t canonical_trace_num_cones_v =
137
138template <typename Trace>
139inline constexpr std::size_t canonical_trace_num_equalities_v =
141
142template <typename Cone>
146
147template <linalg::VectorContainer Vec>
148struct canonical_cone_kind<conic::NonnegOrthantCone<Vec>> {
150};
151
152template <linalg::VectorContainer Vec>
153struct canonical_cone_kind<conic::SecondOrderCone<Vec>> {
155};
156
157template <linalg::VectorContainer Vec, std::size_t Dim>
158struct canonical_cone_kind<conic::PositiveSemidefiniteCone<Vec, Dim>> {
159 static constexpr CanonicalConeKind value =
161};
162
163template <linalg::VectorContainer Vec>
164struct canonical_cone_kind<conic::ExpCone<Vec>> {
166};
167
168template <linalg::VectorContainer Vec>
169struct canonical_cone_kind<conic::PowerCone<Vec>> {
171};
172
173template <typename Cone>
176
177template <typename ConeTuple, std::size_t Index>
178consteval std::size_t cone_tuple_offset_before_v() {
179 using Tuple = linalg::remove_cvref_t<ConeTuple>;
180 if constexpr (Index == 0) {
181 return 0;
182 } else {
183 using PrevCone = std::tuple_element_t<Index - 1, Tuple>;
185 conic::cone_dim_t<PrevCone>;
186 }
187}
188
199template <typename Trace, typename NodeRecords, typename ConeRecords,
200 typename EqualityRecords>
201constexpr auto extend_canonical_trace(const Trace& trace,
202 const NodeRecords& nodes,
203 const ConeRecords& cones,
204 const EqualityRecords& equalities) {
205 return CanonicalTrace<decltype(std::tuple_cat(trace.nodes, nodes)),
206 decltype(std::tuple_cat(trace.cones, cones)),
207 decltype(std::tuple_cat(trace.equalities, equalities))>{
208 std::tuple_cat(trace.nodes, nodes), std::tuple_cat(trace.cones, cones),
209 std::tuple_cat(trace.equalities, equalities)};
210}
211
221template <typename ConeTuple>
222constexpr auto make_canonical_cone_records(std::size_t node_id,
223 std::size_t global_cone_start,
224 std::size_t cone_offset_start) {
225 using Tuple = linalg::remove_cvref_t<ConeTuple>;
226
227 auto make_records = [&]<std::size_t... Is>(std::index_sequence<Is...>) {
228 return std::make_tuple(CanonicalConeRecord{
229 node_id, Is, global_cone_start + Is,
232 conic::cone_dim_t<std::tuple_element_t<Is, Tuple>>}...);
233 };
234
235 return make_records(std::make_index_sequence<std::tuple_size_v<Tuple>>{});
236}
237
238} // namespace convex
typename canonical_trace_traits< linalg::remove_cvref_t< Trace > >::Equalities canonical_trace_equalities_t
constexpr auto make_canonical_cone_records(std::size_t node_id, std::size_t global_cone_start, std::size_t cone_offset_start)
Make canonical cone records for a node-emitted tuple of cones.
typename canonical_trace_traits< linalg::remove_cvref_t< Trace > >::Cones canonical_trace_cones_t
constexpr std::size_t dom_size_v
consteval std::size_t cone_tuple_offset_before_v()
constexpr std::size_t canonical_trace_num_equalities_v
constexpr std::size_t canonical_trace_num_cones_v
AtomType
Atom category used by canonicalization and DCP checks.
constexpr CanonicalConeKind canonical_cone_kind_v
constexpr std::size_t canonical_trace_num_nodes_v
CanonicalConeKind
Cone family emitted into the global cone block.
constexpr auto extend_canonical_trace(const Trace &trace, const NodeRecords &nodes, const ConeRecords &cones, const EqualityRecords &equalities)
Extends canonical trace by tuple concatenation.
constexpr std::size_t canonical_no_parent
Sentinel used when a canonical node does not have a parent node.
typename canonical_trace_traits< linalg::remove_cvref_t< Trace > >::Nodes canonical_trace_nodes_t
Cone slice emitted by one canonical trace node.
std::size_t cone_dim
Number of rows occupied by this cone.
std::size_t cone_offset
Starting row in the global cone vectors.
std::size_t node_id
Node that emitted this cone.
std::size_t local_cone_index
Cone index within the emitting node.
std::size_t global_cone_index
Cone index in the accumulated cone block.
Equality-row slice emitted by one canonical trace node.
std::size_t node_id
Node that emitted these equality rows.
std::size_t row_count
Number of equality rows in this slice.
std::size_t row_offset
Starting row in the global equality vectors.
std::size_t local_eq_index
Equality block index within the emitting node.
Structural atom emitted during canonicalization.
std::size_t node_id
Stable index of this trace node.
std::size_t child_index
Index of this node within its parent's children.
AtomType atom_type
Canonicalization role that produced this node.
std::size_t parent_id
Parent trace node in a richer lineage DAG, or canonical_no_parent for root/flat emissions.
Compile-time canonicalization trace.
NodeRecords nodes
Canonical node records.
EqualityRecords equalities
Equality slice records.
ConeRecords cones
Cone slice records.
Trace objective.
Definition trace.hpp:60
static constexpr CanonicalConeKind value