16 #ifndef OPENKALMAN_TOEUCLIDEANEXPR_HPP 17 #define OPENKALMAN_TOEUCLIDEANEXPR_HPP 20 #include "coordinates/coordinates.hpp" 23 #include "../traits/count_indices.hpp" 24 #include "linear-algebra/traits/traits.hpp" 25 #include "linear-algebra/adapters/internal/AdapterBase.hpp" 32 template<indexible NestedObject>
34 template<
typename NestedObject>
36 struct ToEuclideanExpr : internal::AdapterBase<ToEuclideanExpr<NestedObject>, NestedObject>
41 #ifndef __cpp_concepts 42 static_assert(indexible<NestedObject>);
45 using Scalar = element_type_of_t<NestedObject>;
47 using Base = internal::AdapterBase<ToEuclideanExpr, NestedObject>;
57 template<
bool Enable = true, std::enable_if_t<Enable and stdex::default_initializable<Base>,
int> = 0>
67 template<indexible Arg> requires std::constructible_from<NestedObject, Arg&&>
69 template<
typename Arg, std::enable_if_t<indexible<Arg> and stdex::constructible_from<NestedObject, Arg&&>,
int> = 0>
78 template<indexible Arg> requires (not std::is_base_of_v<
ToEuclideanExpr, std::decay_t<Arg>>) and
79 std::assignable_from<std::add_lvalue_reference_t<NestedObject>,
80 decltype(
from_euclidean(std::declval<Arg>(), get_pattern_collection<0>(std::declval<NestedObject>())))>
82 template<
typename Arg, std::enable_if_t<indexible<Arg> and (not std::is_base_of_v<ToEucl
ideanExpr, std::decay_t<Arg>>) and
83 std::is_assignable_v<std::add_lvalue_reference_t<NestedObject>,
84 decltype(from_eucl
idean(std::declval<Arg>(), get_pattern_collection<0>(std::declval<NestedObject>())))>,
int> = 0>
88 using FArg = decltype(
from_euclidean(std::declval<Arg>(), get_pattern_collection<0>(std::declval<NestedObject>())));
89 if constexpr ((zero<NestedObject> and zero<FArg>) or (identity_matrix<NestedObject> and identity_matrix<FArg>))
104 #ifdef __cpp_concepts 105 template<indexible Arg>
107 template<
typename Arg, std::enable_if_t<indexible<Arg>,
int> = 0>
114 template<
typename NestedObject>
119 template<
typename Arg>
123 template<
typename Arg,
typename N>
124 static constexpr
auto 127 if constexpr (values::fixed<N>)
129 if constexpr (n == 0_uz)
return Axis;
134 using Desc = coordinates::DynamicDescriptor<element_type_of<Arg>>;
141 template<
typename Arg>
142 static decltype(
auto)
149 template<
typename Arg>
150 static constexpr
auto 151 get_constant(
const Arg& arg)
153 if constexpr (has_untyped_index<NestedObject, 0>)
156 return std::monostate {};
160 template<
typename Arg>
161 static constexpr
auto 162 get_constant_diagonal(
const Arg& arg)
164 if constexpr (has_untyped_index<NestedObject, 0>)
165 return constant_diagonal_value {arg.nested_object()};
167 return std::monostate {};
171 template<applicability b>
172 static constexpr
bool 173 one_dimensional = has_untyped_index<NestedObject, 0> and OpenKalman::one_dimensional<NestedObject, b>;
176 template<applicability b>
177 static constexpr
bool 178 is_square = has_untyped_index<NestedObject, 0> and square_shaped<NestedObject, b>;
181 template<triangle_type t>
182 static constexpr
bool 183 triangle_type_value = has_untyped_index<NestedObject, 0> and triangular_matrix<NestedObject, t>;
186 static constexpr
bool 187 is_triangular_adapter =
false;
190 static constexpr
bool 191 is_hermitian = has_untyped_index<NestedObject, 0> and hermitian_matrix<NestedObject>;
197 static constexpr
bool is_writable =
false;
200 #ifdef __cpp_lib_concepts 201 template<
typename Arg> requires has_untyped_index<NestedObject, 0> and raw_data_defined_for<nested_object_of_t<Arg&>>
203 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>
205 static constexpr
auto *
const 212 static constexpr data_layout
213 layout = has_untyped_index<NestedObject, 0> ? layout_of_v<NestedObject> :
data_layout::none;
216 #ifdef __cpp_concepts 219 template<data_layout l = layout,
typename Arg, std::enable_if_t<l != data_layout::none,
int> = 0>
230 template<
typename NestedObject>
239 template<
typename Derived>
240 using library_base = internal::library_base_t<Derived, std::decay_t<NestedObject>>;
243 #ifdef __cpp_lib_ranges 244 template<indexible Arg, std::ranges::input_range Indices> requires values::index<std::ranges::range_value_t<Indices>>
245 static constexpr values::scalar decltype(
auto)
247 template<
typename Arg,
typename Indices>
248 static constexpr decltype(
auto)
250 access(Arg&& arg,
const Indices& indices)
252 if constexpr (has_untyped_index<NestedObject, 0>)
258 auto g {[&arg, is...](std::size_t ix) {
return access(
nested_object(std::forward<Arg>(arg)), ix, is...); }};
264 #ifdef __cpp_lib_ranges 265 template<indexible Arg, std::ranges::input_range Indices> requires values::index<std::ranges::range_value_t<Indices>>
267 template<
typename Arg,
typename Indices>
272 if constexpr (has_untyped_index<NestedObject, 0>)
274 NestedInterface::set_component(
nested_object(arg), s, indices);
283 template<
typename Arg>
284 static decltype(
auto) to_native_matrix(Arg&& arg)
286 return OpenKalman::to_native_matrix<nested_object_of_t<Arg>>(std::forward<Arg>(arg));
290 template<data_layout layout,
typename Scalar,
typename D>
291 static auto make_default(D&& d)
293 return make_dense_object<NestedObject, layout, Scalar>(std::forward<D>(d));
300 template<
typename C,
typename D>
303 return make_constant<NestedObject>(std::forward<C>(c), std::forward<D>(d));
307 template<
typename Scalar,
typename D>
308 static constexpr
auto make_identity_matrix(D&& d)
310 return make_identity_matrix_like<NestedObject, Scalar>(std::forward<D>(d));
320 template<
typename Arg>
324 if constexpr( has_untyped_index<NestedObject, 0>)
335 template<
typename Arg>
339 if constexpr(has_untyped_index<NestedObject, 0>)
350 template<
typename Arg,
typename...Factors>
352 broadcast(Arg&& arg,
const Factors&...factors)
358 template<
typename...Ds,
typename Operation,
typename...Args>
359 static constexpr decltype(
auto)
360 n_ary_operation(
const std::tuple<Ds...>& tup, Operation&& op, Args&&...args)
362 using P = std::decay_t<NestedObject>;
367 template<std::size_t...indices,
typename BinaryFunction,
typename Arg>
368 static constexpr decltype(
auto)
369 reduce(BinaryFunction&& b, Arg&& arg)
371 using P = std::decay_t<NestedObject>;
383 template<
typename Arg>
384 static constexpr decltype(
auto)
387 if constexpr(has_untyped_index<NestedObject, 0>)
393 return std::forward<Arg>(arg).
conjugate();
398 template<
typename Arg>
399 static constexpr decltype(
auto)
402 if constexpr(has_untyped_index<NestedObject, 0>)
408 return std::forward<Arg>(arg).
transpose();
413 template<
typename Arg>
414 static constexpr decltype(
auto)
417 if constexpr(has_untyped_index<NestedObject, 0>)
423 return std::forward<Arg>(arg).
adjoint();
428 template<
typename Arg>
429 static constexpr
auto 432 if constexpr(has_untyped_index<NestedObject, 0>)
438 return arg.determinant();
443 template<HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
444 static decltype(
auto)
451 template<triangle_type triangle,
typename A,
typename U,
typename Alpha>
458 template<
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
459 static constexpr decltype(
auto)
462 return OpenKalman::solve<must_be_unique, must_be_exact>(
463 to_native_matrix<T>(std::forward<A>(a)), std::forward<B>(b));
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:325
constexpr bool one_dimensional
Specifies that a type is one-dimensional in every index.
Definition: one_dimensional.hpp:56
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 to_stat_space(const T &t, R &&data_view)
Maps a range reflecting vector-space data to a corresponding range in a vector space for directional ...
Definition: to_stat_space.hpp:44
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
decltype(auto) constexpr conjugate(Arg &&arg)
Take the complex conjugate of an indexible object.
Definition: conjugate.hpp:44
constexpr auto count_indices(const T &)
Get the number of indices necessary to address all the components of an indexible object...
Definition: count_indices.hpp:51
decltype(auto) constexpr get_pattern_collection(T &&t)
Get the coordinates::pattern_collection associated with indexible object T.
Definition: get_pattern_collection.hpp:59
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
decltype(auto) constexpr to_diagonal(Arg &&arg)
Convert an indexible object into a diagonal matrix.
Definition: to_diagonal.hpp:33
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:37
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 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:42
decltype(auto) constexpr access(Arg &&arg, const Indices &indices)
Access a component of an indexible object at a given set of indices.
Definition: access.hpp:74
Definition: object_traits.hpp:38
ToEuclideanExpr(Arg &&arg)
Construct from compatible indexible object.
Definition: ToEuclideanExpr.hpp:71
decltype(auto) constexpr transpose(Arg &&arg)
Swap any two indices of an indexible_object.
Definition: transpose.hpp:163
An expression that transforms vector space descriptors into Euclidean space for application of direct...
Definition: forward-class-declarations.hpp:228
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:36
constexpr ToEuclideanExpr()
Default constructor.
Definition: ToEuclideanExpr.hpp:58
constexpr NestedObject & nested_object() &
Get the nested object.
Definition: AdapterBase.hpp:76
Dimensions< 1 > Axis
Alias for a 1D Euclidean coordinates::pattern object.
Definition: Dimensions.hpp:171
constexpr auto constant_value(T &&t)
The constant value associated with a constant_object or constant_diagonal_object. ...
Definition: constant_value.hpp:37
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, stdex::extents< IndexType, Extents... > extents)
Make an indexible object in which every element is a constant value.
Definition: make_constant.hpp:39
decltype(auto) constexpr adjoint(Arg &&arg)
Take the conjugate-transpose of an indexible_object.
Definition: adjoint.hpp:35
Basic definitions for OpenKalman as a whole.
decltype(auto) constexpr nested_object(Arg &&arg)
Retrieve a nested object of Arg, if it exists.
Definition: nested_object.hpp:35
Definition for identity_matrix.
typename element_type_of< T >::type element_type_of_t
helper template for element_type_of.
Definition: element_type_of.hpp:54
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:292
auto & operator=(Arg &&arg)
Assign from a compatible indexible object.
Definition: ToEuclideanExpr.hpp:86