16 #ifndef OPENKALMAN_LIBRARY_INTERFACES_DEFINED_HPP 17 #define OPENKALMAN_LIBRARY_INTERFACES_DEFINED_HPP 19 #include <type_traits> 30 #if defined(__cpp_concepts) and OPENKALMAN_CPP_FEATURE_CONCEPTS 31 template<
typename Derived,
typename LibraryObject>
32 concept LibraryBase_defined_for = requires {
33 typename library_interface<std::decay_t<LibraryObject>>::template LibraryBase<std::decay_t<Derived>>;
38 template<
typename Derived,
typename LibraryObject,
typename =
void>
41 template<
typename Derived,
typename LibraryObject>
43 std::void_t<typename library_interface<std::decay_t<LibraryObject>>::template LibraryBase<std::decay_t<Derived>>>>
47 template<
typename Derived,
typename LibraryObject>
57 template<
typename T,
typename Arg,
typename Indices>
58 concept get_component_defined_for = requires (Arg arg, Indices indices) {
64 template<
typename T,
typename Arg,
typename Indices,
typename =
void>
67 template<
typename T,
typename Arg,
typename Indices>
69 decltype(library_interface<std::decay_t<T>>::get_component(std::declval<Arg>(), std::declval<Indices>()))>>
73 template<
typename T,
typename Arg,
typename Indices>
83 template<
typename T,
typename Arg,
typename Scalar,
typename Indices>
84 concept set_component_defined_for = requires (Arg arg, Scalar scalar, Indices indices) {
90 template<
typename T,
typename Arg,
typename Scalar,
typename Indices,
typename =
void>
93 template<
typename T,
typename Arg,
typename Scalar,
typename Indices>
95 decltype(library_interface<std::decay_t<T>>::set_component(std::declval<Arg>(), std::declval<Scalar>(), std::declval<Indices>()))>>
99 template<
typename T,
typename Arg,
typename Scalar,
typename Indices>
108 #ifdef __cpp_concepts 109 template<
typename T,
typename Arg>
110 concept to_native_matrix_defined_for = requires (Arg arg) {
116 template<
typename T,
typename Arg,
typename =
void>
119 template<
typename T,
typename Arg>
121 decltype(library_interface<std::decay_t<T>>::to_native_matrix(std::declval<Arg>()))>>
125 template<
typename T,
typename Arg>
134 #ifdef __cpp_concepts 135 template<
typename T,
typename To,
typename From>
136 concept assign_defined_for = requires(To a, From b) {
142 template<
typename T,
typename To,
typename From,
typename =
void>
145 template<
typename T,
typename To,
typename From>
147 library_interface<std::decay_t<T>>::assign(std::declval<To>(), std::declval<From>()))>>
151 template<
typename T,
typename To,
typename From>
160 #ifdef __cpp_concepts 161 template<
typename T, Layout layout,
typename Scalar,
typename D>
162 concept make_default_defined_for = requires(D d) {
168 template<
typename T, Layout layout,
typename Scalar,
typename D,
typename =
void>
171 template<
typename T, Layout layout,
typename Scalar,
typename D>
173 library_interface<std::decay_t<T>>::template make_default<layout, Scalar>(std::declval<D>()...))>>
177 template<
typename T, Layout layout,
typename Scalar,
typename D>
186 #ifdef __cpp_concepts 187 template<
typename T,
Layout layout,
typename Arg,
typename...Scalars>
188 concept fill_components_defined_for = requires(Arg arg, Scalars...scalars) {
194 template<
typename T,
Layout layout,
typename Arg,
typename = void,
typename...Scalars>
197 template<
typename T,
Layout layout,
typename Arg,
typename...Scalars>
199 library_interface<std::decay_t<T>>::template fill_components<layout>(std::declval<Arg>(), std::declval<Scalars>()...))>, Scalars...>
203 template<
typename T,
Layout layout,
typename Arg,
typename...Scalars>
212 #ifdef __cpp_concepts 213 template<
typename T,
typename C,
typename Ds>
214 concept make_constant_defined_for = requires (C c, Ds ds) {
220 template<
typename T,
typename C,
typename Ds,
typename =
void>
223 template<
typename T,
typename C,
typename Ds>
225 decltype(library_interface<std::decay_t<T>>::make_constant(std::declval<C>(), std::declval<Ds>()))>>
229 template<
typename T,
typename C,
typename Ds>
238 #ifdef __cpp_concepts 239 template<
typename T,
typename Scalar,
typename Ds>
240 concept make_identity_matrix_defined_for = requires (Ds ds) {
246 template<
typename T,
typename Scalar,
typename Ds,
typename =
void>
249 template<
typename T,
typename Scalar,
typename Ds>
251 decltype(library_interface<std::decay_t<T>>::template make_identity_matrix<Scalar>(std::declval<Ds>()))>>
255 template<
typename T,
typename Scalar,
typename Ds>
264 #ifdef __cpp_concepts 265 template<
typename T, TriangleType triangle_type,
typename Arg>
266 concept make_triangular_matrix_defined_for = requires (Arg arg) {
272 template<
typename T, TriangleType triangle_type,
typename Arg,
typename =
void>
275 template<
typename T, TriangleType triangle_type,
typename Arg>
277 decltype(library_interface<std::decay_t<T>>::template make_triangular_matrix<triangle_type>(std::declval<Arg>()))>>
281 template<
typename T, TriangleType triangle_type,
typename Arg>
290 #ifdef __cpp_concepts 291 template<
typename T, HermitianAdapterType adapter_type,
typename Arg>
292 concept make_hermitian_adapter_defined_for = requires (Arg arg) {
298 template<
typename T, HermitianAdapterType adapter_type,
typename Arg,
typename =
void>
301 template<
typename T, HermitianAdapterType adapter_type,
typename Arg>
303 decltype(library_interface<std::decay_t<T>>::template make_hermitian_adapter<adapter_type>(std::declval<Arg>()))>>
307 template<
typename T, HermitianAdapterType adapter_type,
typename Arg>
316 #ifdef __cpp_concepts 317 template<
typename T,
typename Arg>
318 concept to_euclidean_defined_for = requires (Arg arg) {
324 template<
typename T,
typename Arg,
typename =
void>
327 template<
typename T,
typename Arg>
329 decltype(library_interface<std::decay_t<T>>::to_euclidean(std::declval<Arg>()))>>
333 template<
typename T,
typename Arg>
342 #ifdef __cpp_concepts 343 template<
typename T,
typename Arg,
typename V>
344 concept from_euclidean_defined_for = requires (Arg arg, V v) {
350 template<
typename T,
typename Arg,
typename V,
typename =
void>
353 template<
typename T,
typename Arg,
typename V>
355 decltype(library_interface<std::decay_t<T>>::from_euclidean(std::declval<Arg>(), std::declval<V>()))>>
359 template<
typename T,
typename Arg,
typename V>
368 #ifdef __cpp_concepts 369 template<
typename T,
typename Arg>
370 concept wrap_angles_defined_for = requires (Arg arg) {
376 template<
typename T,
typename Arg,
typename =
void>
379 template<
typename T,
typename Arg>
381 decltype(library_interface<std::decay_t<T>>::wrap_angles(std::declval<Arg>()))>>
385 template<
typename T,
typename Arg>
394 #ifdef __cpp_concepts 395 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup>
396 concept get_slice_defined_for = requires(Arg arg, BeginTup begin_tup, SizeTup size_tup) {
402 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup,
typename =
void>
405 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup>
407 library_interface<std::decay_t<T>>::set_slice(std::declval<Arg>(), std::declval<BeginTup>(), std::declval<SizeTup>()))>>
411 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup>
420 #ifdef __cpp_concepts 421 template<
typename T,
typename Arg,
typename Block,
typename...Begin>
422 concept set_slice_defined_for = requires(Arg arg, Block block, Begin...begin) {
428 template<
typename T,
typename Arg,
typename Block,
typename = void,
typename...Begin>
431 template<
typename T,
typename Arg,
typename Block,
typename...Begin>
433 library_interface<std::decay_t<T>>::set_slice(std::declval<Arg>(), std::declval<Block>(), std::declval<Begin>()...))>, Begin...>
437 template<
typename T,
typename Arg,
typename Block,
typename...Begin>
446 #ifdef __cpp_concepts 447 template<
typename T, TriangleType triangle_type,
typename A,
typename B>
448 concept set_triangle_defined_for = requires(
A a, B b) {
454 template<
typename T, TriangleType triangle_type,
typename A,
typename B,
typename =
void>
457 template<
typename T, TriangleType triangle_type,
typename A,
typename B>
459 library_interface<std::decay_t<T>>::template set_triangle<triangle_type>(std::declval<A>(), std::declval<B>()))>>
463 template<
typename T, TriangleType triangle_type,
typename A,
typename B>
472 #ifdef __cpp_concepts 473 template<
typename T,
typename Arg>
474 concept to_diagonal_defined_for = requires (Arg arg) {
480 template<
typename T,
typename Arg,
typename =
void>
483 template<
typename T,
typename Arg>
485 decltype(library_interface<std::decay_t<T>>::to_diagonal(std::declval<Arg>()))>>
489 template<
typename T,
typename Arg>
498 #ifdef __cpp_concepts 499 template<
typename T,
typename Arg>
500 concept diagonal_of_defined_for = requires (Arg arg) {
506 template<
typename T,
typename Arg,
typename =
void>
509 template<
typename T,
typename Arg>
511 decltype(library_interface<std::decay_t<T>>::diagonal_of(std::declval<Arg>()))>>
515 template<
typename T,
typename Arg>
524 #ifdef __cpp_concepts 525 template<
typename T,
typename Arg,
typename...Factors>
526 concept broadcast_defined_for = requires(Arg arg, Factors...factors) {
532 template<
typename T,
typename Arg,
typename = void,
typename...Factors>
535 template<
typename T,
typename Arg,
typename...Factors>
537 decltype(library_interface<std::decay_t<T>>::broadcast(std::declval<Arg>(), std::declval<Factors>()...))>, Factors...>
541 template<
typename T,
typename Arg,
typename...Factors>
550 #ifdef __cpp_concepts 551 template<
typename T,
typename DTup,
typename Op,
typename...Args>
552 concept n_ary_operation_defined_for = requires(DTup d_tup, Op op, Args...args) {
558 template<
typename T,
typename DTup,
typename Op,
typename = void,
typename...Args>
561 template<
typename T,
typename DTup,
typename Op,
typename...Args>
563 decltype(library_interface<std::decay_t<T>>::n_ary_operation(std::declval<DTup>(), std::declval<Op>(), std::declval<Args>()...))>, Args...>
567 template<
typename T,
typename DTup,
typename Op,
typename...Args>
576 #ifdef __cpp_concepts 577 template<
typename T,
typename BinaryFunction,
typename Arg, std::size_t...indices>
578 concept reduce_defined_for = requires (BinaryFunction op, Arg arg) {
584 template<
typename T,
typename BinaryFunction,
typename Arg,
typename = void, std::size_t...indices>
587 template<
typename T,
typename BinaryFunction,
typename Arg, std::size_t...indices>
589 decltype(library_interface<std::decay_t<T>>::template reduce<indices...>(std::declval<BinaryFunction>(), std::declval<Arg>()))>, indices...>
593 template<
typename T,
typename BinaryFunction,
typename Arg, std::size_t...indices>
602 #ifdef __cpp_concepts 603 template<
typename T,
typename Arg>
604 concept conjugate_defined_for = requires (Arg arg) {
610 template<
typename T,
typename Arg,
typename =
void>
613 template<
typename T,
typename Arg>
615 decltype(library_interface<std::decay_t<T>>::conjugate(std::declval<Arg>()))>>
619 template<
typename T,
typename Arg>
628 #ifdef __cpp_concepts 629 template<
typename T,
typename Arg>
630 concept transpose_defined_for = requires (Arg arg) {
636 template<
typename T,
typename Arg,
typename =
void>
639 template<
typename T,
typename Arg>
641 decltype(library_interface<std::decay_t<T>>::transpose(std::declval<Arg>()))>>
645 template<
typename T,
typename Arg>
654 #ifdef __cpp_concepts 655 template<
typename T,
typename Arg>
656 concept adjoint_defined_for = requires (Arg arg) {
662 template<
typename T,
typename Arg,
typename =
void>
665 template<
typename T,
typename Arg>
667 decltype(library_interface<std::decay_t<T>>::adjoint(std::declval<Arg>()))>>
671 template<
typename T,
typename Arg>
680 #ifdef __cpp_concepts 681 template<
typename T,
typename Arg>
682 concept determinant_defined_for = requires (Arg arg) {
688 template<
typename T,
typename Arg,
typename =
void>
691 template<
typename T,
typename Arg>
693 decltype(library_interface<std::decay_t<T>>::determinant(std::declval<Arg>()))>>
697 template<
typename T,
typename Arg>
706 #ifdef __cpp_concepts 707 template<
typename T,
typename...Args>
712 template<
typename T,
typename = void,
typename...Args>
715 template<
typename T,
typename...Args>
717 library_interface<std::decay_t<T>>::sum(std::declval<Args>()...))>, Args...>
721 template<
typename T,
typename...Args>
730 #ifdef __cpp_concepts 731 template<
typename T,
typename Arg,
typename S>
736 template<
typename T,
typename Arg,
typename S,
typename =
void>
739 template<
typename T,
typename Arg,
typename S>
741 library_interface<std::decay_t<T>>::scalar_product(std::declval<Arg>(), std::declval<S>()))>>
745 template<
typename T,
typename Arg,
typename S>
754 #ifdef __cpp_concepts 755 template<
typename T,
typename Arg,
typename S>
756 concept scalar_quotient_defined_for = requires(Arg arg, S s) {
library_interface<std::decay_t<T>>::scalar_quotient(std::forward<Arg>(arg), std::forward<S>(s)); };
760 template<
typename T,
typename Arg,
typename S,
typename =
void>
763 template<
typename T,
typename Arg,
typename S>
765 library_interface<std::decay_t<T>>::scalar_quotient(std::declval<Arg>(), std::declval<S>()))>>
769 template<
typename T,
typename Arg,
typename S>
778 #ifdef __cpp_concepts 779 template<
typename T,
typename A,
typename B>
780 concept contract_defined_for = requires(
A a, B b) {
786 template<
typename T,
typename A,
typename B,
typename =
void>
789 template<
typename T,
typename A,
typename B>
791 library_interface<std::decay_t<T>>::contract(std::declval<A>(), std::declval<B>()))>>
795 template<
typename T,
typename A,
typename B>
804 #ifdef __cpp_concepts 805 template<
typename T,
bool on_the_right,
typename A,
typename B>
806 concept contract_in_place_defined_for = requires(
A a, B b) {
812 template<
typename T,
bool on_the_right,
typename A,
typename B,
typename =
void>
815 template<
typename T,
bool on_the_right,
typename A,
typename B>
817 library_interface<std::decay_t<T>>::template contract_in_place<on_the_right>(std::declval<A>(), std::declval<B>()))>>
821 template<
typename T,
bool on_the_right,
typename A,
typename B>
830 #ifdef __cpp_concepts 831 template<
typename T, TriangleType triangle_type,
typename Arg>
832 concept cholesky_factor_defined_for = requires (Arg arg) {
838 template<
typename T, TriangleType triangle_type,
typename Arg,
typename =
void>
841 template<
typename T, TriangleType triangle_type,
typename Arg>
843 decltype(library_interface<std::decay_t<T>>::template cholesky_factor<triangle_type>(std::declval<Arg>()))>>
847 template<
typename T, TriangleType triangle_type,
typename Arg>
856 #ifdef __cpp_concepts 857 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
858 concept rank_update_self_adjoint_defined_for = requires (
A a, U u, Alpha alpha) {
864 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha,
typename =
void>
867 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
869 decltype(library_interface<std::decay_t<T>>::template rank_update_hermitian<significant_triangle>(
870 std::declval<A>(), std::declval<U>(), std::declval<Alpha>()))>>
874 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
883 #ifdef __cpp_concepts 884 template<
typename T, TriangleType triangle_type,
typename A,
typename U,
typename Alpha>
885 concept rank_update_triangular_defined_for = requires (
A a, U u, Alpha alpha) {
891 template<
typename T, TriangleType triangle_type,
typename A,
typename U,
typename Alpha,
typename =
void>
894 template<
typename T, TriangleType triangle_type,
typename A,
typename U,
typename Alpha>
896 decltype(library_interface<std::decay_t<T>>::template rank_update_triangular<triangle_type>(
897 std::declval<A>(), std::declval<U>(), std::declval<Alpha>()))>>
901 template<
typename T, TriangleType triangle_type,
typename A,
typename U,
typename Alpha>
910 #ifdef __cpp_concepts 911 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
912 concept solve_defined_for = requires(
A a, B b) {
918 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B,
typename =
void>
921 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
923 library_interface<std::decay_t<T>>::template solve<must_be_unique, must_be_exact>(std::declval<A>(), std::declval<B>()))>>
927 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
936 #ifdef __cpp_concepts 937 template<
typename T,
typename Arg>
938 concept LQ_decomposition_defined_for = requires (Arg arg) {
944 template<
typename T,
typename Arg,
typename =
void>
947 template<
typename T,
typename Arg>
949 decltype(library_interface<std::decay_t<T>>::LQ_decomposition(std::declval<Arg>()))>>
953 template<
typename T,
typename Arg>
962 #ifdef __cpp_concepts 963 template<
typename T,
typename Arg>
964 concept QR_decomposition_defined_for = requires (Arg arg) {
970 template<
typename T,
typename Arg,
typename =
void>
973 template<
typename T,
typename Arg>
975 decltype(library_interface<std::decay_t<T>>::QR_decomposition(std::declval<Arg>()))>>
979 template<
typename T,
typename Arg>
987 #endif //OPENKALMAN_LIBRARY_INTERFACES_DEFINED_HPP 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
Definition: library-interfaces-defined.hpp:971
decltype(auto) constexpr contract(A &&a, B &&b)
Matrix multiplication of A * B.
Definition: contract.hpp:54
Definition: library-interfaces-defined.hpp:481
Definition: library-interfaces-defined.hpp:143
Definition: basics.hpp:41
Definition: library-interfaces-defined.hpp:865
Definition: library-interfaces-defined.hpp:663
Definition: library-interfaces-defined.hpp:761
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
Definition: library-interfaces-defined.hpp:737
Definition: library-interfaces-defined.hpp:169
Definition: library-interfaces-defined.hpp:892
Definition: library-interfaces-defined.hpp:325
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: library-interfaces-defined.hpp:455
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
decltype(auto) constexpr to_diagonal(Arg &&arg)
Convert an indexible object into a diagonal matrix.
Definition: to_diagonal.hpp:32
Definition: library-interfaces-defined.hpp:247
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
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
Definition: library-interfaces-defined.hpp:813
decltype(auto) constexpr transpose(Arg &&arg)
Take the transpose of a matrix.
Definition: transpose.hpp:58
Definition: library-interfaces-defined.hpp:377
Definition: library-interfaces-defined.hpp:713
Definition: library-interfaces-defined.hpp:787
Definition: library-interfaces-defined.hpp:91
An interface to various routines from the linear algebra library associated with indexible object T...
Definition: library_interface.hpp:37
Forward declaration of library_interface, which must be defined for all objects used in OpenKalman...
constexpr auto determinant(Arg &&arg)
Take the determinant of a matrix.
Definition: determinant.hpp:44
Definition: library-interfaces-defined.hpp:585
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
Definition: library-interfaces-defined.hpp:221
Definition: library-interfaces-defined.hpp:273
Definition: library-interfaces-defined.hpp:611
decltype(auto) constexpr to_euclidean(Arg &&arg)
Project the vector space associated with index 0 to a Euclidean space for applying directional statis...
Definition: to_euclidean.hpp:38
decltype(auto) constexpr adjoint(Arg &&arg)
Take the adjoint of a matrix.
Definition: adjoint.hpp:33
Definition: library-interfaces-defined.hpp:559
Definition: library-interfaces-defined.hpp:429
Layout
The layout format of a multidimensional array.
Definition: global-definitions.hpp:47
Definition: library-interfaces-defined.hpp:195
decltype(auto) constexpr sum(Ts &&...ts)
Element-by-element sum of one or more objects.
Definition: sum.hpp:112
Definition: library-interfaces-defined.hpp:533
Definition: library-interfaces-defined.hpp:637
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
Definition: library-interfaces-defined.hpp:39
Definition: library-interfaces-defined.hpp:351
constexpr auto make_constant(C &&c, Descriptors &&descriptors)
Make a constant object based on a particular library object.
Definition: make_constant.hpp:37
constexpr To && assign(To &&a, From &&b)
Assign a writable object from an indexible object.
Definition: assign.hpp:51
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
Definition: library-interfaces-defined.hpp:689
Definition: library-interfaces-defined.hpp:945
Definition: library-interfaces-defined.hpp:117
Definition: library-interfaces-defined.hpp:919
Definition: library-interfaces-defined.hpp:839
Global definitions for OpenKalman.
Definition: library-interfaces-defined.hpp:507
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:448
Definition: library-interfaces-defined.hpp:65
Definition: library-interfaces-defined.hpp:299
Definition: library-interfaces-defined.hpp:403
constexpr Arg && set_slice(Arg &&arg, Block &&block, const Begin &...begin)
Assign an object to a particular slice of a matrix or tensor.
Definition: set_slice.hpp:56