16 #ifndef OPENKALMAN_ADJOINT_HPP 17 #define OPENKALMAN_ADJOINT_HPP 29 template<indexible Arg> requires (max_tensor_order_v<Arg> <= 2)
31 template<
typename Arg, std::enable_if_t<indexible<Arg> and (max_tensor_order_v<Arg> <= 2),
int> = 0>
33 constexpr decltype(auto) adjo
int(Arg&& arg)
35 if constexpr (hermitian_matrix<Arg>)
37 return std::forward<Arg>(arg);
39 else if constexpr (diagonal_matrix<Arg> and square_shaped<Arg>)
41 return conjugate(std::forward<Arg>(arg));
43 else if constexpr (zero<Arg>)
45 return transpose(std::forward<Arg>(arg));
47 else if constexpr (constant_matrix<Arg>)
49 if constexpr (values::not_complex<constant_coefficient<Arg>>)
50 return transpose(std::forward<Arg>(arg));
51 else if constexpr (not has_dynamic_dimensions<Arg> and index_dimension_of_v<Arg, 0> == index_dimension_of_v<Arg, 1>)
52 return conjugate(std::forward<Arg>(arg));
55 constexpr std::make_index_sequence<std::max({index_count_v<Arg>, 2_uz}) - 2_uz> seq;
56 return
internal::transpose_constant(values::conj(constant_coefficient{arg}), std::forward<Arg>(arg), seq);
59 else if constexpr (
interface::adjo
int_defined_for<Arg, Arg&&>)
61 return
interface::library_
interface<std::decay_t<Arg>>::adjo
int(std::forward<Arg>(arg));
65 return transpose(conjugate(std::forward<Arg>(arg)));
The root namespace for OpenKalman.
Definition: basics.hpp:34