16 #ifndef OPENKALMAN_TOEUCLIDEANEXPR_HPP 17 #define OPENKALMAN_TOEUCLIDEANEXPR_HPP 19 #include "linear-algebra/coordinates/coordinates.hpp" 24 #include "linear-algebra/adapters/internal/AdapterBase.hpp" 31 template<indexible NestedObject>
33 template<
typename NestedObject>
35 struct ToEuclideanExpr : internal::AdapterBase<ToEuclideanExpr<NestedObject>, NestedObject>
40 #ifndef __cpp_concepts 41 static_assert(indexible<NestedObject>);
44 using Scalar = scalar_type_of_t<NestedObject>;
46 using Base = internal::AdapterBase<ToEuclideanExpr, NestedObject>;
56 template<
typename B = Base, std::enable_if_t<std::is_default_constructible_v<B>,
int> = 0>
66 template<indexible Arg> requires std::constructible_from<NestedObject, Arg&&>
68 template<
typename Arg, std::enable_if_t<indexible<Arg> and std::is_constructible_v<NestedObject, Arg&&>,
int> = 0>
77 template<indexible Arg> requires (not std::is_base_of_v<
ToEuclideanExpr, std::decay_t<Arg>>) and
78 std::assignable_from<std::add_lvalue_reference_t<NestedObject>,
79 decltype(
from_euclidean(std::declval<Arg>(), get_vector_space_descriptor<0>(std::declval<NestedObject>())))>
81 template<
typename Arg, std::enable_if_t<indexible<Arg> and (not std::is_base_of_v<ToEucl
ideanExpr, std::decay_t<Arg>>) and
82 std::is_assignable_v<std::add_lvalue_reference_t<NestedObject>,
83 decltype(from_eucl
idean(std::declval<Arg>(), get_vector_space_descriptor<0>(std::declval<NestedObject>())))>,
int> = 0>
87 using FArg = decltype(
from_euclidean(std::declval<Arg>(), get_vector_space_descriptor<0>(std::declval<NestedObject>())));
88 if constexpr ((zero<NestedObject> and zero<FArg>) or (identity_matrix<NestedObject> and identity_matrix<FArg>))
103 #ifdef __cpp_concepts 104 template<indexible Arg>
106 template<
typename Arg, std::enable_if_t<indexible<Arg>,
int> = 0>
113 template<
typename NestedObject>
118 template<
typename Arg>
122 template<
typename Arg,
typename N>
123 static constexpr
auto 126 if constexpr (values::fixed<N>)
128 if constexpr (n == 0_uz)
return Axis;
133 using Desc = coordinates::DynamicDescriptor<scalar_type_of<Arg>>;
140 template<
typename Arg>
141 static decltype(
auto)
148 template<
typename Arg>
149 static constexpr
auto 150 get_constant(
const Arg& arg)
152 if constexpr (has_untyped_index<NestedObject, 0>)
155 return std::monostate {};
159 template<
typename Arg>
160 static constexpr
auto 161 get_constant_diagonal(
const Arg& arg)
163 if constexpr (has_untyped_index<NestedObject, 0>)
166 return std::monostate {};
170 template<Applicability b>
171 static constexpr
bool 172 one_dimensional = has_untyped_index<NestedObject, 0> and OpenKalman::one_dimensional<NestedObject, b>;
175 template<Applicability b>
176 static constexpr
bool 177 is_square = has_untyped_index<NestedObject, 0> and square_shaped<NestedObject, b>;
180 template<TriangleType t>
181 static constexpr
bool 182 is_triangular = has_untyped_index<NestedObject, 0> and triangular_matrix<NestedObject, t>;
185 static constexpr
bool 186 is_triangular_adapter =
false;
189 static constexpr
bool 190 is_hermitian = has_untyped_index<NestedObject, 0> and hermitian_matrix<NestedObject>;
196 static constexpr
bool is_writable =
false;
199 #ifdef __cpp_lib_concepts 200 template<
typename Arg> requires has_untyped_index<NestedObject, 0> and raw_data_defined_for<nested_object_of_t<Arg&>>
202 template<
typename Arg, std::enable_if_t<has_untyped_index<NestedObject, 0> and raw_data_defined_for<
typename nested_
object_of<Arg&>::type>,
int> = 0>
204 static constexpr
auto *
const 212 layout = has_untyped_index<NestedObject, 0> ? layout_of_v<NestedObject> :
Layout::none;
215 #ifdef __cpp_concepts 216 template<
typename Arg> requires (layout !=
Layout::none)
218 template<Layout l = layout,
typename Arg, std::enable_if_t<l != Layout::none,
int> = 0>
229 template<
typename NestedObject>
238 template<
typename Derived>
239 using LibraryBase = internal::library_base_t<Derived, pattern_matrix_of_t<T>>;
242 #ifdef __cpp_lib_ranges 243 template<indexible Arg, std::ranges::input_range Indices> requires values::index<std::ranges::range_value_t<Indices>>
244 static constexpr values::scalar decltype(
auto)
246 template<
typename Arg,
typename Indices>
247 static constexpr decltype(
auto)
251 if constexpr (has_untyped_index<NestedObject, 0>)
258 return coordinates::to_stat_space(get_vector_space_descriptor<0>(arg), g, i);
263 #ifdef __cpp_lib_ranges 264 template<indexible Arg, std::ranges::input_range Indices> requires values::index<std::ranges::range_value_t<Indices>>
266 template<
typename Arg,
typename Indices>
271 if constexpr (has_untyped_index<NestedObject, 0>)
282 template<
typename Arg>
285 return OpenKalman::to_native_matrix<nested_object_of_t<Arg>>(std::forward<Arg>(arg));
289 template<Layout layout,
typename Scalar,
typename D>
290 static auto make_default(D&& d)
292 return make_dense_object<NestedObject, layout, Scalar>(std::forward<D>(d));
299 template<
typename C,
typename D>
302 return make_constant<NestedObject>(std::forward<C>(c), std::forward<D>(d));
306 template<
typename Scalar,
typename D>
307 static constexpr
auto make_identity_matrix(D&& d)
309 return make_identity_matrix_like<NestedObject, Scalar>(std::forward<D>(d));
319 template<
typename Arg>
323 if constexpr( has_untyped_index<NestedObject, 0>)
335 template<
typename Arg>
339 if constexpr(has_untyped_index<NestedObject, 0>)
351 template<
typename Arg,
typename...Factors>
353 broadcast(Arg&& arg,
const Factors&...factors)
359 template<
typename...Ds,
typename Operation,
typename...Args>
360 static constexpr decltype(
auto)
361 n_ary_operation(
const std::tuple<Ds...>& tup, Operation&& op, Args&&...args)
368 template<std::size_t...indices,
typename BinaryFunction,
typename Arg>
369 static constexpr decltype(
auto)
370 reduce(BinaryFunction&& b, Arg&& arg)
384 template<
typename Arg>
385 static constexpr decltype(
auto)
388 if constexpr(has_untyped_index<NestedObject, 0>)
394 return std::forward<Arg>(arg).
conjugate();
399 template<
typename Arg>
400 static constexpr decltype(
auto)
403 if constexpr(has_untyped_index<NestedObject, 0>)
409 return std::forward<Arg>(arg).
transpose();
414 template<
typename Arg>
415 static constexpr decltype(
auto)
418 if constexpr(has_untyped_index<NestedObject, 0>)
424 return std::forward<Arg>(arg).
adjoint();
429 template<
typename Arg>
430 static constexpr
auto 433 if constexpr(has_untyped_index<NestedObject, 0>)
439 return arg.determinant();
444 template<HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
445 static decltype(
auto)
452 template<TriangleType triangle,
typename A,
typename U,
typename Alpha>
459 template<
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
460 static constexpr decltype(
auto)
463 return OpenKalman::solve<must_be_unique, must_be_exact>(
464 to_native_matrix<T>(std::forward<A>(a)), std::forward<B>(b));
493 #endif //OPENKALMAN_TOEUCLIDEANEXPR_HPP constexpr auto count_indices(const T &t)
Get the number of indices available to address the components of an indexible object.
Definition: count_indices.hpp:33
decltype(auto) constexpr from_euclidean(Arg &&arg, const V &v)
Project the Euclidean vector space associated with index 0 to coordinates::pattern v after applying d...
Definition: from_euclidean.hpp:35
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:319
constexpr NestedObject & nested_object() &
Get the nested object.
Definition: AdapterBase.hpp:97
constexpr bool one_dimensional
Specifies that a type is one-dimensional in every index.
Definition: one_dimensional.hpp:83
Definition: indexible_object_traits.hpp:36
typename pattern_matrix_of< std::decay_t< T > >::type pattern_matrix_of_t
Helper template for pattern_matrix_of.
Definition: forward-class-declarations.hpp:130
decltype(auto) rank_update_hermitian(A &&a, U &&u, scalar_type_of_t< A > alpha=1)
Do a rank update on a hermitian matrix.
Definition: rank_update_hermitian.hpp:45
decltype(auto) constexpr make_hermitian_matrix(Arg &&arg)
Creates a hermitian_matrix by, if necessary, wrapping the argument in a hermitian_adapter.
Definition: make_hermitian_matrix.hpp:37
No storage layout (e.g., if the elements are calculated rather than stored).
Arg && set_component(Arg &&arg, const scalar_type_of_t< Arg > &s, const Indices &indices)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: set_component.hpp:51
decltype(auto) constexpr conjugate(Arg &&arg)
Take the conjugate of a matrix.
Definition: conjugate.hpp:33
typename scalar_type_of< T >::type scalar_type_of_t
helper template for scalar_type_of.
Definition: scalar_type_of.hpp:54
decltype(auto) to_native_matrix(Arg &&arg)
If it isn't already, convert Arg to a native object in the library associated with LibraryObject...
Definition: to_native_matrix.hpp:35
decltype(auto) constexpr QR_decomposition(A &&a)
Perform a QR decomposition of matrix A=Q[U,0], U is a upper-triangular matrix, and Q is orthogonal...
Definition: QR_decomposition.hpp:33
Definition: tuple_reverse.hpp:103
Definition of count_indices function.
decltype(auto) constexpr to_diagonal(Arg &&arg)
Convert an indexible object into a diagonal matrix.
Definition: to_diagonal.hpp:32
decltype(auto) constexpr to_dense_object(Arg &&arg)
Convert the argument to a dense, writable matrix of a particular scalar type.
Definition: to_dense_object.hpp:37
decltype(auto) constexpr reduce(BinaryFunction &&b, Arg &&arg)
Perform a partial reduction based on an associative binary function, across one or more indices...
Definition: reduce.hpp:143
Definition: AdapterBase.hpp:36
decltype(auto) constexpr broadcast(Arg &&arg, const Factors &...factors)
Broadcast an object by replicating it by factors specified for each index.
Definition: broadcast.hpp:49
The constant associated with T, assuming T is a constant_matrix.
Definition: constant_coefficient.hpp:36
decltype(auto) constexpr transpose(Arg &&arg)
Take the transpose of a matrix.
Definition: transpose.hpp:58
The root namespace for OpenKalman.
Definition: basics.hpp:34
ToEuclideanExpr(Arg &&) -> ToEuclideanExpr< Arg >
Deduction guide.
An interface to various routines from the linear algebra library associated with indexible object T...
Definition: library_interface.hpp:37
ToEuclideanExpr(Arg &&arg)
Construct from compatible indexible object.
Definition: ToEuclideanExpr.hpp:70
The constant associated with T, assuming T is a constant_diagonal_matrix.
Definition: constant_diagonal_coefficient.hpp:32
An expression that transforms vector space descriptors into Euclidean space for application of direct...
Definition: forward-class-declarations.hpp:384
constexpr auto solve(A &&a, B &&b)
Solve the equation AX = B for X, which may or may not be a unique solution.
Definition: solve.hpp:87
constexpr auto determinant(Arg &&arg)
Take the determinant of a matrix.
Definition: determinant.hpp:44
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:33
constexpr ToEuclideanExpr()
Default constructor.
Definition: ToEuclideanExpr.hpp:57
decltype(auto) constexpr adjoint(Arg &&arg)
Take the adjoint of a matrix.
Definition: adjoint.hpp:33
Layout
The layout format of a multidimensional array.
Definition: global-definitions.hpp:47
decltype(auto) constexpr LQ_decomposition(A &&a)
Perform an LQ decomposition of matrix A=[L,0]Q, L is a lower-triangular matrix, and Q is orthogonal...
Definition: LQ_decomposition.hpp:33
decltype(auto) rank_update_triangular(A &&a, U &&u, scalar_type_of_t< A > alpha=1)
Do a rank update on triangular matrix.
Definition: rank_update_triangular.hpp:48
A structure representing the dimensions associated with of a particular index.
Definition: Dimensions.hpp:42
constexpr auto make_constant(C &&c, Descriptors &&descriptors)
Make a constant object based on a particular library object.
Definition: make_constant.hpp:37
decltype(auto) constexpr get_component(Arg &&arg, const Indices &indices)
Get a component of an object at a particular set of indices.
Definition: get_component.hpp:54
decltype(auto) constexpr nested_object(Arg &&arg)
Retrieve a nested object of Arg, if it exists.
Definition: nested_object.hpp:34
Definition for identity_matrix.
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:448
constexpr auto get_vector_space_descriptor(const T &t, const N &n)
Get the coordinates::pattern object for index N of indexible object T.
Definition: get_vector_space_descriptor.hpp:56
auto & operator=(Arg &&arg)
Assign from a compatible indexible object.
Definition: ToEuclideanExpr.hpp:85