akreon-convex
Typed convex modeling, conic canonicalization, and primal-dual optimization in C++26.
Loading...
Searching...
No Matches
exp_cone.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 "cone.hpp"
9
10namespace conic {
11
24template <linalg::VectorContainer Slack>
25struct ExpCone : public Cone<Slack, ExpCone<Slack>, ConeType::ASYMMETRIC> {
28
30 using ConeBase::M;
31 using typename ConeBase::T;
32
33 static_assert(M % 3 == 0, "Exp cone must be a triplet");
34
40 constexpr Slack x0_impl() const {
41 Slack s{};
42 for (std::size_t i = 0; i < M / 3; ++i) s(i) = T(0);
43 for (std::size_t i = M / 3; i < 2 * M / 3; ++i) s(i) = T(1);
44 for (std::size_t i = 2 * M / 3; i < M; ++i) s(i) = T(2);
45 return s;
46 }
47
55 constexpr bool in_cone_impl(const Slack& x) const {
56 for (std::size_t i = 0; i < M / 3; ++i) {
57 const auto u = x(i);
58 const auto v = x(M / 3 + i);
59 const auto w = x(2 * M / 3 + i);
60 if (v <= T(0) || v * linalg::constexpr_exp(u / v) >= w) return false;
61 }
62 return true;
63 }
64
73 constexpr T alpha_max_impl(const Slack& x,
74 const linalg::Vector<T, M>& p) const {
75 (void)x, (void)p;
77 return T(0);
78 }
79};
80
81} // namespace conic
cone base class
Definition cone.hpp:19
static constexpr std::size_t M
helpers to get M slack size
Definition cone.hpp:24
linalg::vector_element_t< Slack > T
alias for mat type
Definition cone.hpp:21
constexpr auto w(const Slack &x, const Slack &y) const
w (self-scaling point)
Definition cone.hpp:166
forward decl for exp
Definition exp_cone.hpp:25
constexpr Slack x0_impl() const
default interior point
Definition exp_cone.hpp:40
constexpr bool in_cone_impl(const Slack &x) const
in interior of K
Definition exp_cone.hpp:55
constexpr T alpha_max_impl(const Slack &x, const linalg::Vector< T, M > &p) const
fraction to boundary dK
Definition exp_cone.hpp:73