akreon-convex
Typed convex modeling, conic canonicalization, and primal-dual optimization in C++26.
Loading...
Searching...
No Matches
affine_subspace.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 "convex_set.hpp"
9
10namespace convex {
11
13template <linalg::RnSpace Space>
15
17template <linalg::RnSpace Space>
19
21template <linalg::RnSpace Dom, linalg::RnSpace Codom>
24
31template <typename Meta, typename Child>
32struct AffineSubspace : ConvexSet<Meta, AffineSubspace<Meta, Child>, Child> {
35 using ConvexBase::M;
36 using ConvexBase::N;
39
40 static_assert(M == N, "Affine subspace's linear map must be square");
41
43 using Mat = linalg::Matrix<T, M, N>;
44
46 using AmbientVec = linalg::Vector<T, M>;
47
55 constexpr explicit AffineSubspace(const Mat& A_in, const AmbientVec& b_in,
56 const Child& child_in)
57 : ConvexBase(child_in), A(A_in), b(b_in) {}
58
67 constexpr bool contains_impl(const PointT& x, T tol) const {
68 return linalg::L2<AmbientVec>()(A * x - b) < tol;
69 }
70
76 constexpr bool is_well_formed() const {
77 const auto rank = linalg::QR(A).rank();
78 return rank == N;
79 }
80
88 template <typename Other>
89 constexpr bool is_equal_impl(const Other& other) const {
90 return A == other.self().A && b == other.self().b &&
91 other.coord_map == this->coord_map;
92 }
93
106 template <linalg::SquareMatrix TMat>
107 requires(linalg::mat_cols_v<TMat> == N &&
108 std::same_as<linalg::matrix_scalar_t<TMat>, T>)
109 constexpr auto transform_impl(const affine::AffineMap<TMat>& map) const {
110 const auto [U_inv, event] =
111 linalg::MatrixInverse<TMat>()(map.linear_part());
112 static_cast<void>(event);
113 const auto A_tilde = A * U_inv;
114 const auto b_tilde = b + A_tilde * map.translation();
116 std::get<0>(this->children));
117 }
118
130 template <AtomType Type, conic::BuilderLike Builder>
131 constexpr auto canonicalize_set(const Builder& builder) const {
132 static_cast<void>(Type);
133 const auto child_builder =
134 std::get<0>(this->children)
135 .template canonicalize<AtomType::SET>(builder);
136 const auto child_coord = child_builder.coord_map;
137
138 static constexpr std::size_t ChildCodom =
139 linalg::mat_cols_v<decltype(child_coord.linear_part())>;
140 static_assert(ChildCodom == N,
141 "Convex set domain does not equal the child coordinate "
142 "linear map's codomain in size");
143
144 const auto eq_map = affine::AffineMap<Mat>(A, b).compose(child_coord);
145 const auto emission = conic::LocalEqualityEmission(eq_map);
146 return child_builder.realize(emission);
147 }
148
150 Mat A; //< basis that spans the space of R^n
151 AmbientVec b; //< offset vector which translates the basis to a new origin
152};
153
154template <typename Mat, typename Vec, typename Child>
155AffineSubspace(const Mat&, const Vec&, const Child&)
159
160} // namespace convex
typename dom_traits< linalg::remove_cvref_t< Dom > >::Space dom_space_t
constexpr std::size_t dom_size_v
linalg::remove_cvref_t< T > atom_decay_t
normalize atom-facing types to a stable internal form.
Atom-local equality emission bundle.
forward declaration of affine subspace
constexpr bool is_equal_impl(const Other &other) const
equality comparison
linalg::Vector< T, M > AmbientVec
alias for ambient vector
constexpr AffineSubspace(const Mat &A_in, const AmbientVec &b_in, const Child &child_in)
CTOR for affine subspace.
constexpr bool contains_impl(const PointT &x, T tol) const
contains function
Mat A
data members for affine subspace
constexpr auto canonicalize_set(const Builder &builder) const
canonicalize impl
linalg::Matrix< T, M, N > Mat
linear map
constexpr bool is_well_formed() const
is well formed checks to see if basis fully spans subspace
constexpr auto transform_impl(const affine::AffineMap< TMat > &map) const
transform
static constexpr std::size_t M
Codomain dimension.
Definition atom.hpp:37
ChildrenT children
Tuple of normalized child atoms.
Definition atom.hpp:240
dom_point_t< Domain > PointT
Point type accepted by the atom domain.
Definition atom.hpp:32
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.
forward declaration of convex set