13#include "akreon/linalg/operator/cholesky.hpp"
23template <linalg::Field T>
26 using Space = linalg::Matrix<T, 1, 1>;
39 template <AtomLike Var>
42 std::same_as<dom_space_t<meta_codom_t<atom_meta_t<Var>>>,
Space>,
43 "Scalar quad form requires scalar codomain");
45 "Scalar quad form must operate on scalar affine atoms");
47 const T
alpha = linalg::constexpr_sqrt_safe(T(0.5) * p);
65 template <AtomLike Var>
78template <linalg::RnSpace Space>
81 using T = linalg::space_type_t<Space>;
82 static constexpr std::size_t
N = linalg::space_dim_v<Space>;
85 using Mat = linalg::Matrix<T, N, N>;
88 using Vec = linalg::Vector<T, N>;
105 template <AtomLike Var>
108 "Use ScalarQuadForm<T> for scalar quadratic expressions");
111 std::same_as<dom_space_t<meta_codom_t<atom_meta_t<Var>>>, Space>,
112 "Invalid quad operator mismatch on vector types");
114 const auto chol = linalg::Cholesky<Mat>(
T(0.5) * P);
117 const auto LT_x = x.mul(linalg::transpose(
chol.G()));
136 template <AtomLike Var>
152template <AtomLike Var>
170template <AtomLike Var>
188template <AtomLike Var>
209template <AtomLike Var>
typename dom_traits< linalg::remove_cvref_t< Dom > >::Space dom_space_t
constexpr auto make_scalar_quad_form(const dom_type_t< meta_codom_t< atom_meta_t< Var > > > &p, const dom_type_t< meta_codom_t< atom_meta_t< Var > > > &q, const dom_type_t< meta_codom_t< atom_meta_t< Var > > > &r, const Var &x)
make scalar quad form with domain deduced from the scalar affine atom
constexpr std::size_t dom_size_v
constexpr auto make_quad_form(const linalg::Matrix< dom_type_t< meta_codom_t< atom_meta_t< Var > > >, dom_size_v< meta_codom_t< atom_meta_t< Var > > >, dom_size_v< meta_codom_t< atom_meta_t< Var > > > > &P, const linalg::Vector< dom_type_t< meta_codom_t< atom_meta_t< Var > > >, dom_size_v< meta_codom_t< atom_meta_t< Var > > > > &q, const dom_type_t< meta_codom_t< atom_meta_t< Var > > > &r, const Var &x)
make quadratic form with domain deduced from the variable atom
typename dom_traits< linalg::remove_cvref_t< Dom > >::T dom_type_t
typename meta_traits< linalg::remove_cvref_t< Meta > >::Codomain meta_codom_t
typename atom_traits< atom_decay_t< Atom > >::ConvexMeta atom_meta_t
Extract metadata type from atom.
forward declaration - norm fn
forward declaration - square fn
forward declaration - sum op