16 #ifndef OPENKALMAN_SCALAR_PRODUCT_HPP 17 #define OPENKALMAN_SCALAR_PRODUCT_HPP 24 template<
typename Arg,
typename S>
26 scalar_product_impl(Arg&& arg, S&& s)
28 if constexpr (interface::scalar_product_defined_for<Arg, Arg&&, S&&>)
30 return interface::library_interface<std::decay_t<Arg>>::scalar_product(std::forward<Arg>(arg), std::forward<S>(s));
44 template<indexible Arg, values::scalar S> requires
45 requires(S s) { {
values::to_number(s)} -> std::convertible_to<scalar_type_of_t<Arg>>; }
46 static constexpr vector_space_descriptors_may_match_with<Arg>
auto 48 template<
typename Arg,
typename S>
51 scalar_product(Arg&& arg, S&& s)
53 if constexpr (zero<Arg>)
55 return std::forward<Arg>(arg);
57 else if constexpr (constant_matrix<Arg>)
61 std::multiplies<scalar_type_of_t<Arg>>{},
65 else if constexpr (constant_diagonal_matrix<Arg>)
69 std::multiplies<scalar_type_of_t<Arg>>{},
71 std::forward<S>(s)}));
73 else if constexpr (values::fixed<S>)
76 else if constexpr (values::
to_number(S{}) == 1) return
std::forward<Arg>(arg);
77 else return detail::scalar_product_impl(
std::forward<Arg>(arg),
std::forward<S>(s));
81 return detail::scalar_product_impl(std::forward<Arg>(arg), std::forward<S>(s));
88 #endif //OPENKALMAN_SCALAR_PRODUCT_HPP constexpr auto n_ary_operation(const std::tuple< Ds... > &d_tup, Operation &&operation, Args &&...args)
Perform a component-wise n-ary operation, using broadcasting to match the size of a pattern matrix...
Definition: n_ary_operation.hpp:319
Definition: tuple_reverse.hpp:103
decltype(auto) constexpr to_diagonal(Arg &&arg)
Convert an indexible object into a diagonal matrix.
Definition: to_diagonal.hpp:32
constexpr auto to_number(Arg arg)
Convert any values::value to a values::number.
Definition: to_number.hpp:34
The root namespace for OpenKalman.
Definition: basics.hpp:34
decltype(auto) constexpr diagonal_of(Arg &&arg)
Extract a column vector (or column slice for rank>2 tensors) comprising the diagonal elements...
Definition: diagonal_of.hpp:33
constexpr auto make_constant(C &&c, Descriptors &&descriptors)
Make a constant object based on a particular library object.
Definition: make_constant.hpp:37
constexpr auto make_zero(Descriptors &&descriptors)
Make a zero associated with a particular library.
Definition: make_zero.hpp:36
operation(const Operation &, const Args &...) -> operation< Operation, Args... >
Deduction guide.
constant_diagonal_coefficient(T &&) -> constant_diagonal_coefficient< std::decay_t< T >>
Deduction guide for constant_diagonal_coefficient.
constant_coefficient(const T &) -> constant_coefficient< T >
Deduction guide for constant_coefficient.