16 #ifndef OPENKALMAN_DIAGONAL_OF_HPP 17 #define OPENKALMAN_DIAGONAL_OF_HPP 27 template<indexible Arg> requires (index_count_v<Arg> ==
dynamic_size) or (index_count_v<Arg> <= 2)
30 template<
typename Arg, std::enable_if_t<(index_count_v<Arg> == dynamic_size or index_count_v<Arg> <= 2),
int> = 0>
31 constexpr decltype(auto)
33 diagonal_of(Arg&& arg)
35 if constexpr (diagonal_adapter<Arg>)
37 return nested_
object(std::forward<Arg>(arg));
39 else if constexpr (diagonal_adapter<Arg, 1>)
41 return transpose(nested_
object(std::forward<Arg>(arg)));
43 else if constexpr (one_dimensional<Arg>)
45 return std::forward<Arg>(arg);
47 else if constexpr (constant_matrix<Arg>)
49 auto ds = all_vector_space_descriptors(std::forward<Arg>(arg));
50 if constexpr (pattern_tuple<decltype(ds)>)
52 return
internal::make_constant_diagonal_from_descriptors<Arg>(
53 constant_coefficient {std::forward<Arg>(arg)},
54 std::tuple_cat(ds, std::tuple{coordinates::Axis{}, coordinates::Axis{}}));
58 return
internal::make_constant_diagonal_from_descriptors<Arg>(constant_coefficient {std::forward<Arg>(arg)}, ds);
61 else if constexpr (constant_diagonal_matrix<Arg>)
63 auto ds = all_vector_space_descriptors(std::forward<Arg>(arg));
64 if constexpr (pattern_tuple<decltype(ds)>)
66 return
internal::make_constant_diagonal_from_descriptors<Arg>(
67 constant_diagonal_coefficient {std::forward<Arg>(arg)},
68 std::tuple_cat(all_vector_space_descriptors(std::forward<Arg>(arg)), std::tuple{coordinates::Axis{}, coordinates::Axis{}}));
72 return
internal::make_constant_diagonal_from_descriptors<Arg>(constant_diagonal_coefficient {std::forward<Arg>(arg)}, ds);
77 return
interface::library_
interface<std::decay_t<Arg>>::diagonal_of(std::forward<Arg>(arg));
constexpr bool indexible
T is a generalized tensor type.
Definition: indexible.hpp:32
The root namespace for OpenKalman.
Definition: basics.hpp:34
constexpr std::size_t dynamic_size
A constant indicating that a size or index is dynamic.
Definition: global-definitions.hpp:33