16 #ifndef OPENKALMAN_TRACE_HPP 17 #define OPENKALMAN_TRACE_HPP 29 template<indexible Arg> requires (max_tensor_order_v<Arg> <= 2)
32 template<
typename Arg, std::enable_if_t<(indexible<Arg>) and (max_tensor_order_v<Arg> <= 2),
int> = 0>
33 constexpr decltype(auto)
37 using Scalar = scalar_type_of_t<Arg>;
39 if constexpr (zero<Arg> or empty_
object<Arg>)
41 return values::Fixed<Scalar, 0>{};
43 else if constexpr (
identity_matrix<Arg>)
45 return values::cast_to<Scalar>(
46 internal::smallest_vector_space_descriptor<Scalar>(get_index_dimension_of<0>(arg), get_index_dimension_of<1>(arg)));
48 else if constexpr (one_dimensional<Arg>)
50 return
internal::get_singular_component(std::forward<Arg>(arg));
52 else if constexpr (constant_matrix<Arg>)
54 std::multiplies<Scalar> op;
55 auto n = values::cast_to<Scalar>(
56 internal::smallest_vector_space_descriptor<Scalar>(get_index_dimension_of<0>(arg), get_index_dimension_of<1>(arg)));;
57 return values::operation{op, constant_coefficient{std::forward<Arg>(arg)}, n};
59 else if constexpr (constant_diagonal_matrix<Arg>)
61 std::multiplies<scalar_type_of_t<Arg>> op;
62 auto n = values::cast_to<Scalar>(
63 internal::smallest_vector_space_descriptor<Scalar>(get_index_dimension_of<0>(arg), get_index_dimension_of<1>(arg)));;
64 return values::operation{op, constant_diagonal_coefficient{std::forward<Arg>(arg)}, n};
66 else if constexpr (triangular_matrix<Arg>)
68 return reduce(std::plus<Scalar>{}, diagonal_of(std::forward<Arg>(arg)));
72 decltype(auto) diag {diagonal_of(std::forward<Arg>(arg))};
73 if constexpr(dynamic_dimension<decltype(diag), 0>)
75 auto dim = get_index_dimension_of<0>(diag);
76 if (dim >= 2)
return static_cast<Scalar>(
reduce(std::plus<Scalar>{}, std::forward<decltype(diag)>(diag)));
77 else if (dim == 1)
return static_cast<Scalar
>(internal::get_singular_component(std::forward<decltype(diag)>(diag)));
78 else return static_cast<Scalar
>(0);
80 else if constexpr (index_dimension_of_v<decltype(diag), 0> == 1)
82 return internal::get_singular_component(std::forward<decltype(diag)>(diag));
86 return reduce(std::plus<Scalar>{}, std::forward<decltype(diag)>(diag));
94 #endif //OPENKALMAN_TRACE_HPP typename scalar_type_of< T >::type scalar_type_of_t
helper template for scalar_type_of.
Definition: scalar_type_of.hpp:54
Definition: tuple_reverse.hpp:103
decltype(auto) constexpr reduce(BinaryFunction &&b, Arg &&arg)
Perform a partial reduction based on an associative binary function, across one or more indices...
Definition: reduce.hpp:143
The root namespace for OpenKalman.
Definition: basics.hpp:34