17 #ifndef OPENKALMAN_EIGENADAPTERBASE_HPP 18 #define OPENKALMAN_EIGENADAPTERBASE_HPP 22 template<
typename Derived,
typename Base>
23 struct EigenAdapterBase : Base, EigenCustomBase,
24 Eigen::internal::no_assignment_operator
26 using Scalar =
typename Eigen::internal::traits<Derived>::Scalar;
27 using RealScalar =
typename Eigen::NumTraits<Scalar>::Real;
28 using Nested =
typename Eigen::internal::ref_selector<Derived>::type;
29 using StorageKind =
typename Eigen::internal::traits<Derived>::StorageKind;
30 using StorageIndex =
typename Eigen::internal::traits<Derived>::StorageIndex;
31 enum CompileTimeTraits
33 RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime,
34 ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime,
35 Flags = Eigen::internal::traits<Derived>::Flags,
38 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(
bool {has_dynamic_dimensions<Derived>})
41 EigenAdapterBase() =
default;
43 EigenAdapterBase(
const EigenAdapterBase&) =
default;
45 EigenAdapterBase(EigenAdapterBase&&) =
default;
47 ~EigenAdapterBase() =
default;
49 constexpr EigenAdapterBase& operator=(
const EigenAdapterBase& other) {
return *
this; }
51 constexpr EigenAdapterBase& operator=(EigenAdapterBase&& other) {
return *
this; }
53 using typename Base::Index;
64 return get_index_dimension_of<0>(
static_cast<const Derived&
>(*this));
76 return get_index_dimension_of<1>(
static_cast<const Derived&
>(*this));
80 constexpr decltype(
auto)
82 #ifdef __cpp_lib_concepts 83 requires interface::raw_data_defined_for<Derived&>
86 return OpenKalman::internal::raw_data(static_cast<Derived&>(*
this));
90 constexpr decltype(
auto)
92 #ifdef __cpp_lib_concepts 93 requires interface::raw_data_defined_for<const Derived&>
96 return OpenKalman::internal::raw_data(static_cast<const Derived&>(*
this));
101 #ifndef __cpp_concepts 102 template<
typename T,
typename =
void>
103 struct has_outerStride : std::false_type {};
106 struct has_outerStride<T,
std::void_t<decltype(std::declval<T>().outerStride())>> : std::true_type {};
108 template<
typename T,
typename =
void>
109 struct has_innerStride : std::false_type {};
112 struct has_innerStride<T, std::void_t<decltype(std::declval<T>().innerStride())>> : std::true_type {};
121 return std::get<Base::IsRowMajor ? 0 : 1>(strides(static_cast<const Derived&>(*
this)));
122 else if constexpr (Base::IsRowMajor)
133 return std::get<Base::IsRowMajor ? 1 : 0>(strides(static_cast<const Derived&>(*
this)));
143 [[deprecated(
"Use make_zero() instead.")]]
146 static_assert(not has_dynamic_dimensions<Derived>);
147 return make_zero<Derived>();
155 [[deprecated(
"Use make_zero() instead.")]]
156 static constexpr
auto Zero(
const Index r,
const Index c)
158 return make_zero<Derived>(Dimensions{
static_cast<std::size_t
>(r)}, Dimensions{
static_cast<std::size_t
>(c)});
166 [[deprecated(
"Use make_identity_matrix_like() instead.")]]
169 if constexpr(square_shaped<Derived>)
170 return make_identity_matrix_like<Derived>();
172 return Base::Identity();
180 [[deprecated(
"Use make_identity_matrix_like() instead.")]]
181 static constexpr decltype(
auto)
Identity(const Index r, const Index c)
183 if constexpr (not dynamic_dimension<Derived, 0>)
if (r != index_dimension_of_v<Derived, 0>)
184 throw std::invalid_argument {
"In T::Identity(r, c), r (==" + std::to_string(r) +
185 ") does not equal the fixed rows of T (==" + std::to_string(index_dimension_of_v<Derived, 0>) +
")"};
187 if constexpr (not dynamic_dimension<Derived, 1>)
if (c != index_dimension_of_v<Derived, 0>)
188 throw std::invalid_argument {
"In T::Identity(r, c), c (==" + std::to_string(c) +
189 ") does not equal the fixed columns of T (==" + std::to_string(index_dimension_of_v<Derived, 1>) +
")"};
191 return make_identity_matrix_like<Derived>(
static_cast<std::size_t
>(r), static_cast<std::size_t>(c));
197 template<
typename Arg>
198 constexpr
auto& get_ultimate_nested_matrix_impl(Arg& arg)
201 using B = decltype(b);
202 static_assert(not std::is_const_v<std::remove_reference_t<B>>);
203 if constexpr(OpenKalman::internal::hermitian_expr<B> or OpenKalman::internal::triangular_expr<B> or
204 OpenKalman::internal::diagonal_expr<B> or euclidean_expr<B>)
206 return get_ultimate_nested_matrix(b);
215 template<
typename Arg>
216 constexpr
auto& get_ultimate_nested_matrix(Arg& arg)
218 if constexpr(OpenKalman::internal::hermitian_expr<Arg>)
221 else return get_ultimate_nested_matrix_impl(arg);
223 else if constexpr(OpenKalman::internal::triangular_expr<Arg>)
225 if constexpr(triangular_matrix<Arg, TriangleType::diagonal>)
return arg;
226 else return get_ultimate_nested_matrix_impl(arg);
230 return get_ultimate_nested_matrix_impl(arg);
237 #ifdef __cpp_concepts 238 template<std::convertible_to<Scalar> S>
240 template<
typename S, std::enable_if_t<std::is_convertible_v<S, Scalar>,
int> = 0>
242 auto operator<<(
const S& s)
244 if constexpr(covariance<Derived>)
246 auto& xpr =
static_cast<Derived&
>(*this);
251 auto& xpr = get_ultimate_nested_matrix(static_cast<Derived&>(*
this));
252 using Xpr = std::decay_t<decltype(xpr)>;
253 if constexpr(mean<Derived>)
257 else if constexpr((OpenKalman::internal::hermitian_expr<Xpr> or OpenKalman::internal::triangular_expr<Xpr>)
258 and diagonal_matrix<Xpr>)
264 return Eigen::CommaInitializer {xpr,
static_cast<const Scalar&
>(s)};
270 #ifdef __cpp_concepts 271 template<indexible Other>
273 template<
typename Other, std::enable_if_t<indexible<Other>,
int> = 0>
275 auto operator<<(
const Other& other)
277 if constexpr(covariance<Derived>)
279 auto& xpr =
static_cast<Derived&
>(*this);
284 auto& xpr = get_ultimate_nested_matrix(static_cast<Derived&>(*
this));
285 using Xpr = std::decay_t<decltype(xpr)>;
286 if constexpr (mean<Derived>)
290 else if constexpr ((OpenKalman::internal::hermitian_expr<Xpr> or OpenKalman::internal::triangular_expr<Xpr>)
291 and diagonal_matrix<Xpr>)
297 return Eigen::CommaInitializer {xpr, other};
307 #endif //OPENKALMAN_EIGENADAPTERBASE_HPP Definition: tuple_reverse.hpp:103
Alternative version of Eigen::CommaInitializer for Mean.
Definition: eigen-comma-initializers.hpp:26
static constexpr auto Identity()
Definition: EigenAdapterBase.hpp:167
Definition: eigen-forward-declarations.hpp:22
A generalization of the above: a custom stride is specified for each index.
static constexpr auto Zero(const Index r, const Index c)
Definition: EigenAdapterBase.hpp:156
Version of Eigen::CommaInitializer for diagonal versions of HermitianAdapter and TriangularAdapter.
Definition: eigen-comma-initializers.hpp:57
Alternative version of Eigen::CommaInitializer for Covariance and SquareRootCovariance.
Definition: eigen-comma-initializers.hpp:124
A diagonal matrix (both a lower-left and an upper-right triangular matrix).
static constexpr auto Zero()
Definition: EigenAdapterBase.hpp:144
decltype(auto) constexpr nested_object(Arg &&arg)
Retrieve a nested object of Arg, if it exists.
Definition: nested_object.hpp:34