8#include "akreon/linalg/assert.hpp"
16template <linalg::RnSpace Space>
17 requires(linalg::space_dim_v<Space> == 1)
21template <linalg::RnSpace Space>
22 requires(linalg::space_dim_v<Space> == 1)
26template <linalg::RnSpace Space>
27 requires(linalg::space_dim_v<Space> == 1)
31template <linalg::RnSpace Space>
36template <linalg::RnSpace Space>
44template <
typename Meta,
typename Child>
45struct Huber :
Atom<Meta, Huber<Meta, Child>, Child> {
123 const auto beta =
lift_map.translation()(0);
124 if (linalg::constexpr_abs(x(0)) <=
delta) {
126 return alpha *
T(0.5) * x(0) * x(0) + beta;
127 else return T(-0.5) *
alpha * x(0) * x(0) + beta;
134 (linalg::constexpr_abs(x(0)) -
T(0.5) *
delta) +
145 constexpr auto mul()
const {
146 if constexpr (Scalar <
T(0)) {
147 const auto alpha =
T(-1) * Scalar;
159 affine::AffineMap<LiftedVarMat<T>>
new_map(
172 constexpr auto add(
T beta)
const {
210 template <AtomType Type, conic::BuilderLike Builder>
218 static constexpr std::size_t Dom = linalg::mat_cols_v<AffineMatT>;
219 static constexpr std::size_t Codom = linalg::mat_rows_v<AffineMatT>;
220 static_assert(Codom == 1,
221 "input affine map from cone block has invalid codom dim for "
222 "scalar fn domain (i.e., != 1");
224 linalg::Matrix<T, 9, Dom + 5>
F{};
225 linalg::Vector<T, 9>
g{};
228 F = linalg::set_block<0, 1, 0, Dom>(
F, a);
229 F = linalg::set_block<1, 2, 0, Dom>(
F,
T(-1) * a);
230 F(0, Dom) =
T(-1),
F(0, Dom + 1) =
T(-1);
231 F(1, Dom) =
T(1),
F(1, Dom + 1) =
T(1);
232 F(2, Dom) =
T(1),
F(2, Dom + 2) =
T(1);
233 F(3, Dom) =
T(-1),
F(3, Dom + 2) =
T(1);
234 F(4, Dom + 2) =
T(1);
236 F(5, Dom + 3) =
T(-1);
240 linalg::Matrix<T, 3, Dom + 5>
F_rsoc{};
245 F(5, Dom + 4) =
T(1);
247 F(5, Dom + 4) =
T(-1);
250 linalg::Vector<T, 3>
g_rsoc{
T(0),
T(0.5),
T(0)};
256 F = linalg::set_block<6, 9, 0, Dom + 5>(
F,
soc_coords.linear_part());
265 const auto cones = std::make_tuple(
rplus,
rsoc);
278template <
typename T,
typename Child>
VarType
Domain/variable annotation attached to domains/codomains.
typename dom_traits< linalg::remove_cvref_t< Dom > >::Space dom_space_t
constexpr std::size_t dom_size_v
CurvatureType
Curvature annotation for atom codomain.
linalg::remove_cvref_t< T > atom_decay_t
normalize atom-facing types to a stable internal form.
MonotonicityType
Monotonicity annotation for function atoms.
linalg::Vector< T, 1 > LiftedVarBias
alias for lifted var map
linalg::RowVector< T, 1 > LiftedVarMat
alias for lifted var map
Atom-local canonical emission bundle.
forward decl for nonneg orthant cone
CRTP base for convex atoms.
ChildrenT children
Tuple of normalized child atoms.
dom_point_t< Domain > PointT
Point type accepted by the atom domain.
dom_type_t< Domain > T
Scalar field for the atom domain.
static constexpr std::size_t N
Domain dimension.
Domain wrapper with a static sign label.
forward declaration - huber
constexpr auto canonicalize_impl(const Builder &builder) const
canonicalize impl
static constexpr CurvatureType Tag
curvature tag
constexpr T operator()(const PointT &x) const
eval via operator overload
affine::AffineMap< LiftedVarMat< T > > lift_map
constexpr Huber(T delta_in, const Child &child_in, const affine::AffineMap< LiftedVarMat< T > > &map_in)
CTOR.
constexpr Huber(T delta_in, const Child &child_in)
CTOR.
constexpr MonotonicityType monotonicity() const
mono
constexpr auto add(T beta) const
add
constexpr auto mul() const
mul
constexpr T eval(const PointT &x) const
eval impl