17 #ifndef OPENKALMAN_EIGEN_COMMA_INITIALIZERS_HPP 18 #define OPENKALMAN_EIGEN_COMMA_INITIALIZERS_HPP 25 template<
typename Derived,
typename XprType>
28 using Base = CommaInitializer<XprType>;
29 using Scalar = OpenKalman::scalar_type_of_t<XprType>;
30 using StaticDescriptor = OpenKalman::vector_space_descriptor_of_t<Derived, 0>;
33 template<
typename S, std::enable_if_t<stdex::convertible_to<S, Scalar>,
int> = 0>
36 template<
typename OtherDerived>
37 MeanCommaInitializer(XprType& xpr,
const DenseBase<OtherDerived>& other)
38 : Base {xpr, other} {}
40 ~MeanCommaInitializer()
42 this->m_xpr = OpenKalman::wrap_angles<StaticDescriptor>(Base::finished());
47 this->m_xpr = OpenKalman::wrap_angles<StaticDescriptor>(Base::finished());
56 template<
typename XprType>
59 using Scalar = OpenKalman::scalar_type_of_t<XprType>;
60 static constexpr
auto layout = OpenKalman::layout_of_v<XprType>;
61 static constexpr
auto dim = OpenKalman::index_dimension_of_v<XprType, 0>;
64 using Nested = CommaInitializer<NestedMatrix>;
67 Nested comma_initializer;
71 template<std::convertible_to<Scalar> S>
73 template<
typename S, std::enable_if_t<stdex::convertible_to<S, Scalar>,
int> = 0>
76 : matrix {}, comma_initializer {matrix,
static_cast<const Scalar&
>(s)}, diag {xpr} {}
78 template<
typename OtherDerived>
79 DiagonalCommaInitializer(XprType& xpr,
const DenseBase<OtherDerived>& other)
80 : matrix {}, comma_initializer {matrix, other}, diag {xpr} {}
82 DiagonalCommaInitializer(
const DiagonalCommaInitializer& o)
83 : matrix {o.matrix}, comma_initializer {o.comma_initializer}, diag {o.diag} {}
85 DiagonalCommaInitializer(DiagonalCommaInitializer&& o)
86 : matrix {std::move(o.matrix)},
87 comma_initializer {std::move(o.comma_initializer)}, diag {std::move(o.diag)} {}
90 template<std::convertible_to<Scalar> S>
92 template<
typename S, std::enable_if_t<stdex::convertible_to<S, Scalar>,
int> = 0>
94 auto& operator,(
const S& s)
96 comma_initializer,
static_cast<const Scalar&
>(s);
100 template<
typename OtherDerived>
101 auto& operator,(
const DenseBase<OtherDerived>& other)
103 comma_initializer, other;
107 ~DiagonalCommaInitializer()
123 template<
typename CovarianceType>
127 using Scalar = OpenKalman::scalar_type_of_t<CovNest>;
128 static constexpr
auto layout = OpenKalman::layout_of_v<CovNest>;
129 using NestedMatrix = std::conditional_t<OpenKalman::diagonal_matrix<CovNest>,
132 using Nested = CommaInitializer<NestedMatrix>;
135 Nested comma_initializer;
138 template<
typename S, std::enable_if_t<stdex::convertible_to<S, Scalar>,
int> = 0>
140 : matrix {}, comma_initializer {matrix,
static_cast<const Scalar&
>(s)}, cov {xpr} {}
142 template<
typename OtherDerived>
143 CovarianceCommaInitializer(CovarianceType& xpr,
const DenseBase<OtherDerived>& other)
144 : matrix {}, comma_initializer {matrix, other}, cov {xpr} {}
146 CovarianceCommaInitializer(
const CovarianceCommaInitializer& o)
147 : matrix {o.matrix}, comma_initializer {o.comma_initializer}, cov {o.cov} {}
149 CovarianceCommaInitializer(CovarianceCommaInitializer&& o)
150 : matrix {std::move(o.matrix)},
151 comma_initializer {std::move(o.comma_initializer)}, cov {std::move(o.cov)} {}
153 template<
typename S, std::enable_if_t<std::is_convertible_v<S, Scalar>,
int> = 0>
154 auto& operator,(
const S& s)
156 comma_initializer,
static_cast<const Scalar&
>(s);
160 template<
typename OtherDerived>
161 auto& operator,(
const DenseBase<OtherDerived>& other)
163 comma_initializer, other;
167 ~CovarianceCommaInitializer()
171 if constexpr (diagonal_matrix<CovNest>)
173 cov = CovarianceType {std::move(comma_initializer).finished()};
175 else if constexpr (triangular_covariance<CovarianceType>)
177 using T = std::conditional_t<triangular_matrix<CovNest>, CovNest, decltype(
cholesky_factor(std::declval<CovNest>()))>;
178 auto b = OpenKalman::internal::to_covariance_nestable<T>(std::move(comma_initializer).finished());
179 cov = OpenKalman::internal::to_covariance_nestable<CovNest>(std::move(b));
183 using SA = std::conditional_t<hermitian_matrix<CovNest>, CovNest, decltype(
cholesky_square(std::declval<CovNest>()))>;
184 auto b = OpenKalman::internal::to_covariance_nestable<SA>(std::move(comma_initializer).finished());
185 cov = OpenKalman::internal::to_covariance_nestable<CovNest>(std::move(b));
193 if constexpr (diagonal_matrix<CovNest>)
195 cov = CovarianceType {comma_initializer.finished()};
197 else if constexpr (triangular_covariance<CovarianceType>)
199 using T = std::conditional_t<triangular_matrix<CovNest>, CovNest, decltype(
cholesky_factor(std::declval<CovNest>()))>;
200 auto b = OpenKalman::internal::to_covariance_nestable<T>(comma_initializer.finished());
201 cov = OpenKalman::internal::to_covariance_nestable<CovNest>(std::move(b));
205 using SA = std::conditional_t<hermitian_matrix<CovNest>, CovNest, decltype(
cholesky_square(std::declval<CovNest>()))>;
206 auto b = OpenKalman::internal::to_covariance_nestable<SA>(comma_initializer.finished());
207 cov = OpenKalman::internal::to_covariance_nestable<CovNest>(std::move(b));
typename nested_object_of< T >::type nested_object_of_t
Helper type for nested_object_of.
Definition: nested_object_of.hpp:58
Definition: eigen-comma-initializers.hpp:20
Alternative version of Eigen::CommaInitializer for Mean.
Definition: eigen-comma-initializers.hpp:26
decltype(auto) constexpr cholesky_square(A &&a)
Take the Cholesky square of a triangular_matrix.
Definition: cholesky_square.hpp:33
The root namespace for OpenKalman.
Definition: basics.hpp:34
An adapter for creating a diagonal matrix or tensor.
Definition: diagonal_adapter.hpp:27
Dimensions< 1 > Axis
Alias for a 1D Euclidean coordinates::pattern object.
Definition: Dimensions.hpp:171
std::decay_t< decltype(make_dense_object< T, layout, S >(std::declval< D >()))> dense_writable_matrix_t
An alias for a dense, writable matrix, patterned on parameter T.
Definition: dense_writable_matrix_t.hpp:38
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
decltype(auto) constexpr cholesky_factor(A &&a)
Take the Cholesky factor of a matrix.
Definition: cholesky_factor.hpp:38