16 #ifndef OPENKALMAN_CHOLESKY_FACTOR_HPP 17 #define OPENKALMAN_CHOLESKY_FACTOR_HPP 30 template<triangle_type tri, hermitian_matrix<applicability::permitted> A> requires
32 constexpr triangular_matrix<tri> decltype(
auto)
34 template<triangle_type tri,
typename A, std::enable_if_t<hermitian_matrix<A, applicability::permitted> and
35 (tri != triangle_type::diagonal or diagonal_matrix<A>),
int> = 0>
36 constexpr decltype(
auto)
40 if constexpr (not square_shaped<A>)
41 if (not
is_square_shaped(a))
throw std::invalid_argument {
"Argument to cholesky_factor must be a square matrix"};
43 if constexpr (zero<A> or identity_matrix<A>)
45 return std::forward<A>(a);
47 else if constexpr (constant_diagonal_matrix<A>)
50 return to_diagonal(make_constant<A>(sq, get_pattern_collection<0>(a)));
52 else if constexpr (constant_matrix<A>)
54 auto m = [](
const auto& a){
72 auto ret {make_triangular_matrix<tri>(std::move(m))};
73 using C0 = vector_space_descriptor_of_t<A, 0>;
74 using C1 = vector_space_descriptor_of_t<A, 1>;
75 using Cret = std::conditional_t<dynamic_pattern<C0>,
C1, C0>;
77 if constexpr (coordinates::euclidean_pattern<Cret>)
return ret;
81 else if constexpr (diagonal_matrix<A>)
100 #ifdef __cpp_concepts 101 template<hermitian_matrix<applicability::permitted> A>
104 template<
typename A, std::enable_if_t<hermitian_matrix<A, applicability::permitted>,
int> = 0>
105 constexpr decltype(
auto)
111 return cholesky_factor<u>(std::forward<A>(a));
constexpr auto attach_pattern(Arg &&arg, P &&p)
Attach a pattern_collection to an indexible object.
Definition: attach_pattern.hpp:36
constexpr auto n_ary_operation(const std::tuple< Ds... > &d_tup, Operation &&operation, Args &&...args)
Perform a component-wise n-ary operation, using broadcasting to match the size of a pattern matrix...
Definition: n_ary_operation.hpp:325
A lower-left triangular matrix.
constexpr auto is_square_shaped(const T &t)
Determine whether an object is square_shaped.
Definition: is_square_shaped.hpp:69
decltype(auto) constexpr to_diagonal(Arg &&arg)
Convert an indexible object into a diagonal matrix.
Definition: to_diagonal.hpp:33
A diagonal matrix (both a lower-left and an upper-right triangular matrix).
constexpr auto get_dimension(const Arg &arg)
Get the vector dimension of coordinates::pattern Arg.
Definition: get_dimension.hpp:54
constexpr bool triangular_matrix
Specifies that an argument is an indexible object having a given triangle_type (e.g., upper, lower, or diagonal).
Definition: triangular_matrix.hpp:36
The root namespace for OpenKalman.
Definition: basics.hpp:34
An interface to various routines from the linear algebra library associated with indexible object T...
Definition: library_interface.hpp:42
constexpr auto sqrt(const Arg &arg)
A constexpr alternative to std::sqrt.
Definition: sqrt.hpp:46
decltype(auto) constexpr diagonal_of(Arg &&arg)
Extract a column vector (or column slice for rank>2 tensors) comprising the diagonal elements...
Definition: diagonal_of.hpp:36
An upper-right triangular matrix.
constexpr auto constant_value(T &&t)
The constant value associated with a constant_object or constant_diagonal_object. ...
Definition: constant_value.hpp:37
A structure representing the dimensions associated with of a particular index.
Definition: Dimensions.hpp:42
decltype(auto) constexpr cholesky_factor(A &&a)
Take the Cholesky factor of a matrix.
Definition: cholesky_factor.hpp:38