16 #ifndef OPENKALMAN_INTERFACES_DEFINED_HPP 17 #define OPENKALMAN_INTERFACES_DEFINED_HPP 19 #include <type_traits> 37 concept get_pattern_collection_defined_for =
42 template<
typename T,
typename =
void>
47 std::void_t<decltype(object_traits<stdex::remove_cvref_t<T>>::get_pattern_collection(std::declval<T>()))>>
62 concept get_constant_defined_for =
67 template<
typename T,
typename =
void>
72 std::void_t<decltype(object_traits<stdex::remove_cvref_t<T>>::get_constant(std::declval<T>()))>>
86 template<
typename T, applicability b = applicability::guaranteed>
87 concept is_square_defined_for = std::convertible_to<
88 decltype(
object_traits<std::remove_cvref_t<T>>::
template is_square<b>),
bool>;
92 template<
typename T, applicability b,
typename =
void>
95 template<
typename T, applicability b>
97 decltype(object_traits<stdex::remove_cvref_t<T>>::template is_square<b>), bool>>>
101 template<
typename T, applicability b = applicability::guaranteed>
110 #ifdef __cpp_concepts 112 concept is_triangular_adapter_defined_for = std::convertible_to<
113 decltype(
object_traits<std::remove_cvref_t<T>>::is_triangular_adapter),
bool>;
117 template<
typename T,
typename =
void>
122 decltype(object_traits<stdex::remove_cvref_t<T>>::is_triangular_adapter), bool>>>
135 #ifdef __cpp_concepts 137 concept is_hermitian_defined_for = std::convertible_to<
138 decltype(
object_traits<std::remove_cvref_t<T>>::is_hermitian),
bool>;
142 template<
typename T,
typename =
void>
147 decltype(object_traits<stdex::remove_cvref_t<T>>::is_hermitian), bool>>>
155 template<
typename T,
typename =
void>
168 #ifdef __cpp_concepts 170 concept hermitian_adapter_type_defined_for = std::convertible_to<
175 template<
typename T,
typename =
void>
180 decltype(object_traits<stdex::remove_cvref_t<T>>::hermitian_adapter_type), HermitianAdapterType>>>
197 #if defined(__cpp_concepts) and OPENKALMAN_CPP_FEATURE_CONCEPTS 198 template<
typename Derived,
typename LibraryObject>
199 concept library_base_defined_for = requires {
205 template<
typename Derived,
typename LibraryObject,
typename =
void>
208 template<
typename Derived,
typename LibraryObject>
210 std::void_t<typename library_interface<stdex::remove_cvref_t<LibraryObject>>::template library_base<std::decay_t<Derived>>>>
214 template<
typename Derived,
typename LibraryObject>
223 #ifdef __cpp_concepts 224 template<
typename LHS,
typename RHS>
225 concept copy_from_defined_for = requires(LHS lhs, RHS rhs) {
231 template<
typename LHS,
typename RHS,
typename =
void>
234 template<
typename LHS,
typename RHS>
236 std::void_t<decltype(library_interface<stdex::remove_cvref_t<LHS>>::copy(std::declval<LHS>(), std::declval<RHS>()))>>
240 template<
typename LHS,
typename RHS>
249 #ifdef __cpp_concepts 250 template<
typename Arg>
251 concept to_diagonal_defined_for = requires (Arg arg) {
257 template<
typename Arg,
typename =
void>
260 template<
typename Arg>
262 std::void_t<decltype(library_interface<stdex::remove_cvref_t<Arg>>::to_diagonal(std::declval<Arg>()))>>
266 template<
typename Arg>
275 #ifdef __cpp_concepts 276 template<
typename Arg>
277 concept diagonal_of_defined_for = requires (Arg arg) {
283 template<
typename Arg,
typename =
void>
286 template<
typename Arg>
288 decltype(library_interface<stdex::remove_cvref_t<Arg>>::diagonal_of(std::declval<Arg>()))>>
292 template<
typename Arg>
301 #ifdef __cpp_concepts 302 template<
typename Arg>
303 concept conjugate_defined_for = requires (Arg arg) {
309 template<
typename Arg,
typename =
void>
312 template<
typename Arg>
314 std::void_t<decltype(library_interface<stdex::remove_cvref_t<Arg>>::conjugate(std::declval<Arg>()))>>
318 template<
typename Arg>
327 #ifdef __cpp_concepts 328 template<
typename Arg, std::
size_t indexa, std::
size_t indexb>
329 concept transpose_defined_for = requires (Arg arg) {
335 template<
typename Arg, std::
size_t indexa, std::
size_t indexb,
typename =
void>
338 template<
typename Arg, std::
size_t indexa, std::
size_t indexb>
340 std::void_t<decltype(library_interface<stdex::remove_cvref_t<Arg>>::template transpose<indexa, indexb>(std::declval<Arg>()))>>
344 template<
typename Arg, std::
size_t indexa, std::
size_t indexb>
353 #ifdef __cpp_concepts 354 template<
typename Arg>
355 concept conjugate_transpose_defined_for = requires (Arg arg) {
361 template<
typename Arg,
typename =
void>
364 template<
typename Arg>
366 std::void_t<decltype(library_interface<stdex::remove_cvref_t<Arg>>::conjugate_transpose(std::declval<Arg>()))>>
370 template<
typename Arg>
379 #ifdef __cpp_concepts 380 template<
typename T,
typename Arg>
381 concept to_native_matrix_defined_for = requires (Arg arg) {
387 template<
typename T,
typename Arg,
typename =
void>
390 template<
typename T,
typename Arg>
392 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::to_native_matrix(std::declval<Arg>()))>>
396 template<
typename T,
typename Arg>
405 #ifdef __cpp_concepts 406 template<
typename T,
typename layout,
typename Scalar,
typename D>
407 concept make_default_defined_for = requires(D d) {
413 template<
typename T,
typename layout,
typename Scalar,
typename D,
typename =
void>
416 template<
typename T,
typename layout,
typename Scalar,
typename D>
418 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template make_default<layout, Scalar>(std::declval<D>()))>>
422 template<
typename T,
typename layout,
typename Scalar,
typename D>
431 #ifdef __cpp_concepts 432 template<
typename T,
typename layout,
typename Arg,
typename...Scalars>
433 concept fill_components_defined_for = requires(Arg arg, Scalars...scalars) {
439 template<
typename T,
typename layout,
typename Arg,
typename = void,
typename...Scalars>
442 template<
typename T,
typename layout,
typename Arg,
typename...Scalars>
444 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template fill_components<layout>(std::declval<Arg>(), std::declval<Scalars>()...))>, Scalars...>
448 template<
typename T,
typename layout,
typename Arg,
typename...Scalars>
457 #ifdef __cpp_concepts 458 template<
typename T, triangle_type tri,
typename Arg>
459 concept make_triangular_matrix_defined_for = requires (Arg arg) {
465 template<
typename T, triangle_type tri,
typename Arg,
typename =
void>
468 template<
typename T, triangle_type tri,
typename Arg>
470 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template make_triangular_matrix<tri>(std::declval<Arg>()))>>
474 template<
typename T, triangle_type tri,
typename Arg>
483 #ifdef __cpp_concepts 484 template<
typename T, HermitianAdapterType adapter_type,
typename Arg>
485 concept make_hermitian_adapter_defined_for = requires (Arg arg) {
491 template<
typename T, HermitianAdapterType adapter_type,
typename Arg,
typename =
void>
494 template<
typename T, HermitianAdapterType adapter_type,
typename Arg>
496 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template make_hermitian_adapter<adapter_type>(std::declval<Arg>()))>>
500 template<
typename T, HermitianAdapterType adapter_type,
typename Arg>
509 #ifdef __cpp_concepts 510 template<
typename T,
typename Arg>
511 concept to_euclidean_defined_for = requires (Arg arg) {
517 template<
typename T,
typename Arg,
typename =
void>
520 template<
typename T,
typename Arg>
522 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::to_euclidean(std::declval<Arg>()))>>
526 template<
typename T,
typename Arg>
535 #ifdef __cpp_concepts 536 template<
typename T,
typename Arg,
typename V>
537 concept from_euclidean_defined_for = requires (Arg arg, V v) {
543 template<
typename T,
typename Arg,
typename V,
typename =
void>
546 template<
typename T,
typename Arg,
typename V>
548 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::from_euclidean(std::declval<Arg>(), std::declval<V>()))>>
552 template<
typename T,
typename Arg,
typename V>
561 #ifdef __cpp_concepts 562 template<
typename T,
typename Arg>
563 concept wrap_angles_defined_for = requires (Arg arg) {
569 template<
typename T,
typename Arg,
typename =
void>
572 template<
typename T,
typename Arg>
574 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::wrap_angles(std::declval<Arg>()))>>
578 template<
typename T,
typename Arg>
587 #ifdef __cpp_concepts 588 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup>
589 concept get_slice_defined_for = requires(Arg arg, BeginTup begin_tup, SizeTup size_tup) {
595 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup,
typename =
void>
598 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup>
600 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::set_slice(std::declval<Arg>(), std::declval<BeginTup>(), std::declval<SizeTup>()))>>
604 template<
typename T,
typename Arg,
typename BeginTup,
typename SizeTup>
613 #ifdef __cpp_concepts 614 template<
typename T,
typename Arg,
typename Block,
typename...Begin>
615 concept set_slice_defined_for = requires(Arg arg, Block block, Begin...begin) {
621 template<
typename T,
typename Arg,
typename Block,
typename = void,
typename...Begin>
624 template<
typename T,
typename Arg,
typename Block,
typename...Begin>
626 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::set_slice(std::declval<Arg>(), std::declval<Block>(), std::declval<Begin>()...))>, Begin...>
630 template<
typename T,
typename Arg,
typename Block,
typename...Begin>
639 #ifdef __cpp_concepts 640 template<
typename T, triangle_type tri,
typename A,
typename B>
641 concept set_triangle_defined_for = requires(
A a, B b) {
647 template<
typename T, triangle_type tri,
typename A,
typename B,
typename =
void>
650 template<
typename T, triangle_type tri,
typename A,
typename B>
652 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template set_triangle<tri>(std::declval<A>(), std::declval<B>()))>>
656 template<
typename T, triangle_type tri,
typename A,
typename B>
665 #ifdef __cpp_concepts 666 template<
typename T,
typename Arg,
typename...Factors>
667 concept broadcast_defined_for = requires(Arg arg, Factors...factors) {
673 template<
typename T,
typename Arg,
typename = void,
typename...Factors>
676 template<
typename T,
typename Arg,
typename...Factors>
678 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::broadcast(std::declval<Arg>(), std::declval<Factors>()...))>, Factors...>
682 template<
typename T,
typename Arg,
typename...Factors>
691 #ifdef __cpp_concepts 692 template<
typename T,
typename DTup,
typename Op,
typename...Args>
693 concept n_ary_operation_defined_for = requires(DTup d_tup, Op op, Args...args) {
699 template<
typename T,
typename DTup,
typename Op,
typename = void,
typename...Args>
702 template<
typename T,
typename DTup,
typename Op,
typename...Args>
704 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::n_ary_operation(std::declval<DTup>(), std::declval<Op>(), std::declval<Args>()...))>, Args...>
708 template<
typename T,
typename DTup,
typename Op,
typename...Args>
717 #ifdef __cpp_concepts 718 template<
typename T,
typename BinaryFunction,
typename Arg, std::size_t...indices>
719 concept reduce_defined_for = requires (BinaryFunction op, Arg arg) {
725 template<
typename T,
typename BinaryFunction,
typename Arg,
typename = void, std::size_t...indices>
728 template<
typename T,
typename BinaryFunction,
typename Arg, std::size_t...indices>
730 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template reduce<indices...>(std::declval<BinaryFunction>(), std::declval<Arg>()))>, indices...>
734 template<
typename T,
typename BinaryFunction,
typename Arg, std::size_t...indices>
743 #ifdef __cpp_concepts 744 template<
typename T,
typename Arg>
745 concept determinant_defined_for = requires (Arg arg) {
751 template<
typename T,
typename Arg,
typename =
void>
754 template<
typename T,
typename Arg>
756 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::determinant(std::declval<Arg>()))>>
760 template<
typename T,
typename Arg>
769 #ifdef __cpp_concepts 770 template<
typename T,
typename...Args>
771 concept sum_defined_for = requires(Args...args) {
777 template<
typename T,
typename = void,
typename...Args>
780 template<
typename T,
typename...Args>
782 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::sum(std::declval<Args>()...))>, Args...>
786 template<
typename T,
typename...Args>
795 #ifdef __cpp_concepts 796 template<
typename T,
typename Arg,
typename S>
797 concept scalar_product_defined_for = requires(Arg arg, S s) {
803 template<
typename T,
typename Arg,
typename S,
typename =
void>
806 template<
typename T,
typename Arg,
typename S>
808 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::scalar_product(std::declval<Arg>(), std::declval<S>()))>>
812 template<
typename T,
typename Arg,
typename S>
821 #ifdef __cpp_concepts 822 template<
typename T,
typename Arg,
typename S>
823 concept scalar_quotient_defined_for = requires(Arg arg, S s) {
829 template<
typename T,
typename Arg,
typename S,
typename =
void>
832 template<
typename T,
typename Arg,
typename S>
834 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::scalar_quotient(std::declval<Arg>(), std::declval<S>()))>>
838 template<
typename T,
typename Arg,
typename S>
847 #ifdef __cpp_concepts 848 template<
typename T,
typename A,
typename B>
849 concept contract_defined_for = requires(
A a, B b) {
855 template<
typename T,
typename A,
typename B,
typename =
void>
858 template<
typename T,
typename A,
typename B>
860 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::contract(std::declval<A>(), std::declval<B>()))>>
864 template<
typename T,
typename A,
typename B>
873 #ifdef __cpp_concepts 874 template<
typename T,
bool on_the_right,
typename A,
typename B>
875 concept contract_in_place_defined_for = requires(
A a, B b) {
881 template<
typename T,
bool on_the_right,
typename A,
typename B,
typename =
void>
884 template<
typename T,
bool on_the_right,
typename A,
typename B>
886 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template contract_in_place<on_the_right>(std::declval<A>(), std::declval<B>()))>>
890 template<
typename T,
bool on_the_right,
typename A,
typename B>
899 #ifdef __cpp_concepts 900 template<
typename T, triangle_type tri,
typename Arg>
901 concept cholesky_factor_defined_for = requires (Arg arg) {
907 template<
typename T, triangle_type tri,
typename Arg,
typename =
void>
910 template<
typename T, triangle_type tri,
typename Arg>
912 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template cholesky_factor<tri>(std::declval<Arg>()))>>
916 template<
typename T, triangle_type tri,
typename Arg>
925 #ifdef __cpp_concepts 926 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
927 concept rank_update_self_adjoint_defined_for = requires (
A a, U u, Alpha alpha) {
933 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha,
typename =
void>
936 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
938 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template rank_update_hermitian<significant_triangle>(std::declval<A>(), std::declval<U>(), std::declval<Alpha>()))>>
942 template<
typename T, HermitianAdapterType significant_triangle,
typename A,
typename U,
typename Alpha>
951 #ifdef __cpp_concepts 952 template<
typename T, triangle_type tri,
typename A,
typename U,
typename Alpha>
953 concept rank_update_triangular_defined_for = requires (
A a, U u, Alpha alpha) {
959 template<
typename T, triangle_type tri,
typename A,
typename U,
typename Alpha,
typename =
void>
962 template<
typename T, triangle_type tri,
typename A,
typename U,
typename Alpha>
964 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template rank_update_triangular<tri>(std::declval<A>(), std::declval<U>(), std::declval<Alpha>()))>>
968 template<
typename T, triangle_type tri,
typename A,
typename U,
typename Alpha>
977 #ifdef __cpp_concepts 978 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
979 concept solve_defined_for = requires(
A a, B b) {
985 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B,
typename =
void>
988 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
990 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::template solve<must_be_unique, must_be_exact>(std::declval<A>(), std::declval<B>()))>>
994 template<
typename T,
bool must_be_unique,
bool must_be_exact,
typename A,
typename B>
1003 #ifdef __cpp_concepts 1004 template<
typename T,
typename Arg>
1005 concept LQ_decomposition_defined_for = requires (Arg arg) {
1011 template<
typename T,
typename Arg,
typename =
void>
1014 template<
typename T,
typename Arg>
1016 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::LQ_decomposition(std::declval<Arg>()))>>
1017 : std::true_type {};
1020 template<
typename T,
typename Arg>
1029 #ifdef __cpp_concepts 1030 template<
typename T,
typename Arg>
1031 concept QR_decomposition_defined_for = requires (Arg arg) {
1037 template<
typename T,
typename Arg,
typename =
void>
1040 template<
typename T,
typename Arg>
1042 std::void_t<decltype(library_interface<stdex::remove_cvref_t<T>>::QR_decomposition(std::declval<Arg>()))>>
1043 : std::true_type {};
1046 template<
typename T,
typename Arg>
Definition: interfaces-defined.hpp:118
decltype(auto) constexpr from_euclidean(Arg &&arg, const V &v)
Project the Euclidean vector space associated with index 0 to patterns::pattern v after applying dire...
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
Definition: interfaces-defined.hpp:1038
decltype(auto) constexpr contract(A &&a, B &&b)
Matrix multiplication of A * B.
Definition: contract.hpp:54
Definition: interfaces-defined.hpp:258
Definition: interfaces-defined.hpp:176
Definition: basics.hpp:41
Definition: interfaces-defined.hpp:68
Definition: interfaces-defined.hpp:934
Definition: interfaces-defined.hpp:830
decltype(auto) constexpr conjugate(Arg &&arg)
Take the complex conjugate of an indexible object.
Definition: conjugate.hpp:44
Definition: interfaces-defined.hpp:804
Definition: interfaces-defined.hpp:414
Definition: interfaces-defined.hpp:960
Definition: interfaces-defined.hpp:518
Definition: interfaces-defined.hpp:93
decltype(auto) constexpr get_pattern_collection(T &&t)
Get the patterns::pattern_collection associated with indexible object T.
Definition: get_pattern_collection.hpp:36
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 conjugate_transpose(Arg &&arg)
Take the conjugate-transpose of an indexible_object.
Definition: conjugate_transpose.hpp:35
HermitianAdapterType
The type of a hermitian adapter, indicating which triangle of the nested matrix is used...
Definition: enumerations.hpp:79
Definition: interfaces-defined.hpp:648
constexpr bool value
T is a fixed or dynamic value that is reducible to a number.
Definition: value.hpp:45
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
Enumerations relating to linear algebra.
Definition: interfaces-defined.hpp:156
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: interfaces-defined.hpp:882
Definition: interfaces-defined.hpp:570
Definition: interfaces-defined.hpp:778
Definition: interfaces-defined.hpp:856
Definition: interfaces-defined.hpp:43
Forward declaration of object_traits, which must be defined for all objects used in OpenKalman...
An interface to various routines from the linear algebra library associated with indexible object T...
Definition: library_interface.hpp:42
Forward declaration of library_interface, which must be defined for all objects used in OpenKalman...
Definition: object_traits.hpp:38
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:44
constexpr auto determinant(Arg &&arg)
Take the determinant of a matrix.
Definition: determinant.hpp:44
Definition: interfaces-defined.hpp:726
Definition: interfaces-defined.hpp:466
Definition: interfaces-defined.hpp:310
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
Definition: interfaces-defined.hpp:700
Definition: interfaces-defined.hpp:622
Definition: interfaces-defined.hpp:232
Definition: interfaces-defined.hpp:440
decltype(auto) constexpr sum(Ts &&...ts)
Element-by-element sum of one or more objects.
Definition: sum.hpp:112
Definition: interfaces-defined.hpp:674
Definition: interfaces-defined.hpp:336
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: interfaces-defined.hpp:206
Definition: interfaces-defined.hpp:544
Definition: interfaces-defined.hpp:143
Definition: interfaces-defined.hpp:752
Definition: interfaces-defined.hpp:1012
Definition: interfaces-defined.hpp:388
decltype(auto) constexpr to_diagonal(Arg &&arg, P &&p)
Convert a column vector (or any other array with a 1D second index) into a diagonal_matrix.
Definition: to_diagonal.hpp:46
Definition: interfaces-defined.hpp:986
Definition: interfaces-defined.hpp:908
Definition: interfaces-defined.hpp:284
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:292
Definition: interfaces-defined.hpp:362
Definition: interfaces-defined.hpp:492
Definition: interfaces-defined.hpp:596
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