akreon-convex
Typed convex modeling, conic canonicalization, and primal-dual optimization in C++26.
Loading...
Searching...
No Matches
weighted_sum.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 "akreon/linalg/linalg_util.hpp"
10
11namespace convex {
12
18template <linalg::RnSpace Space>
21 using T = linalg::space_type_t<Space>;
22 static constexpr std::size_t N = linalg::space_dim_v<Space>;
23
25 using Vec = linalg::Vector<T, N>;
26
35 template <AtomLike Var>
36 constexpr auto operator()(const Vec& q, const Var& x) {
37 static_assert(is_var_type_v<Var>,
38 "Weighted sum must operate on a var type");
39 static_assert(
40 std::same_as<dom_space_t<meta_codom_t<atom_meta_t<Var>>>, Space>,
41 "Invalid q^T x operator mismatch on vector types");
42
43 const auto W = linalg::make_diag(q);
44 const auto weighted_x = x.mul(W);
45 const auto vars = weighted_x.split();
46 return std::apply([](const auto&... cs) { return Sum(cs...); }, vars);
47 }
48};
49
60template <AtomLike Var>
61constexpr auto make_weighted_sum(
62 const linalg::Vector<dom_type_t<meta_codom_t<atom_meta_t<Var>>>,
64 const Var& x) {
66 return WeightedSum<Space>()(q, x);
67}
68
69} // namespace convex
typename dom_traits< linalg::remove_cvref_t< Dom > >::Space dom_space_t
constexpr std::size_t dom_size_v
typename dom_traits< linalg::remove_cvref_t< Dom > >::T dom_type_t
constexpr auto make_weighted_sum(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 Var &x)
make weighted sum with domain deduced from the variable atom
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 - sum op
Definition sum.hpp:116
weighted sum (AKA Dot)
static constexpr std::size_t N
constexpr auto operator()(const Vec &q, const Var &x)
operator overload
linalg::space_type_t< Space > T
type
linalg::Vector< T, N > Vec
vec type for q