OpenKalman
interfaces-defined.hpp
Go to the documentation of this file.
1 /* This file is part of OpenKalman, a header-only C++ library for
2  * Kalman filters and other recursive filters.
3  *
4  * Copyright (c) 2023-2025 Christopher Lee Ogden <ogden@gatech.edu>
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
9  */
10 
16 #ifndef OPENKALMAN_INTERFACES_DEFINED_HPP
17 #define OPENKALMAN_INTERFACES_DEFINED_HPP
18 
19 #include <type_traits>
20 #include <utility>
21 #include "object_traits.hpp"
22 #include "library_interface.hpp"
24 
25 namespace OpenKalman::interface
26 {
27  // ------------------------ //
28  // get_pattern_collection //
29  // ------------------------ //
30 
31 #ifdef __cpp_concepts
32  template<typename T>
33  concept get_pattern_collection_defined_for =
34  requires { object_traits<std::remove_cvref_t<T>>::get_pattern_collection; };
35 #else
36  namespace detail
37  {
38  template<typename T, typename = void>
39  struct get_pattern_collection_defined_for_impl : std::false_type {};
40 
41  template<typename T>
43  std::void_t<decltype(object_traits<stdex::remove_cvref_t<T>>::get_pattern_collection)>>
44  : std::true_type {};
45  }
46 
47  template<typename T>
48  constexpr bool get_pattern_collection_defined_for = detail::get_pattern_collection_defined_for_impl<T>::value;
49 #endif
50 
51 
52  // -------------- //
53  // get_constant //
54  // -------------- //
55 
56 #ifdef __cpp_concepts
57  template<typename T>
58  concept get_constant_defined_for = requires (T t) {
59  {std::invoke(object_traits<std::remove_cvref_t<T>>::get_constant, t)} -> values::value;
60  };
61 #else
62  namespace detail
63  {
64  template<typename T, typename = void>
65  struct get_constant_defined_for_impl : std::false_type {};
66 
67  template<typename T>
68  struct get_constant_defined_for_impl<T, std::enable_if_t<values::value<typename std::invoke_result<
69  decltype(object_traits<stdex::remove_cvref_t<T>>::get_constant), T>::type>>>
70  : std::true_type {};
71  }
72 
73  template<typename T>
74  constexpr bool get_constant_defined_for = detail::get_constant_defined_for_impl<T>::value;
75 #endif
76 
77 
78  // --------------- //
79  // nested_object //
80  // --------------- //
81 
82 #ifdef __cpp_concepts
83  template<typename T>
84  concept nested_object_defined_for =
86 #else
87  namespace detail
88  {
89  template<typename T, typename = void>
90  struct nested_object_defined_for_impl : std::false_type {};
91 
92  template<typename T>
94  std::void_t<decltype(object_traits<stdex::remove_cvref_t<T>>::nested_object)>>
95  : std::true_type {};
96  }
97 
98  template<typename T>
99  constexpr bool nested_object_defined_for = detail::nested_object_defined_for_impl<T>::value;
100 #endif
101 
102 
103  // ----------- //
104  // is_square //
105  // ----------- //
106 
107 #ifdef __cpp_concepts
108  template<typename T, applicability b = applicability::guaranteed>
109  concept is_square_defined_for = std::convertible_to<
110  decltype(object_traits<std::remove_cvref_t<T>>::template is_square<b>), bool>;
111 #else
112  namespace detail
113  {
114  template<typename T, applicability b, typename = void>
115  struct is_square_defined_for_impl : std::false_type {};
116 
117  template<typename T, applicability b>
118  struct is_square_defined_for_impl<T, b, std::enable_if_t<stdex::convertible_to<
119  decltype(object_traits<stdex::remove_cvref_t<T>>::template is_square<b>), bool>>>
120  : std::true_type {};
121  }
122 
123  template<typename T, applicability b = applicability::guaranteed>
124  constexpr bool is_square_defined_for = detail::is_square_defined_for_impl<T, b>::value;
125 #endif
126 
127 
128  // ----------------------- //
129  // is_triangular_adapter //
130  // ----------------------- //
131 
132 #ifdef __cpp_concepts
133  template<typename T>
134  concept is_triangular_adapter_defined_for = std::convertible_to<
135  decltype(object_traits<std::remove_cvref_t<T>>::is_triangular_adapter), bool>;
136 #else
137  namespace detail
138  {
139  template<typename T, typename = void>
140  struct is_triangular_adapter_defined_for_impl : std::false_type {};
141 
142  template<typename T>
143  struct is_triangular_adapter_defined_for_impl<T, std::enable_if_t<stdex::convertible_to<
144  decltype(object_traits<stdex::remove_cvref_t<T>>::is_triangular_adapter), bool>>>
145  : std::true_type {};
146  }
147 
148  template<typename T>
149  constexpr bool is_triangular_adapter_defined_for = detail::is_triangular_adapter_defined_for_impl<T>::value;
150 #endif
151 
152 
153  // -------------- //
154  // is_hermitian //
155  // -------------- //
156 
157 #ifdef __cpp_concepts
158  template<typename T>
159  concept is_hermitian_defined_for = std::convertible_to<
160  decltype(object_traits<std::remove_cvref_t<T>>::is_hermitian), bool>;
161 #else
162  namespace detail
163  {
164  template<typename T, typename = void>
165  struct is_hermitian_defined_for_impl : std::false_type {};
166 
167  template<typename T>
168  struct is_hermitian_defined_for_impl<T, std::enable_if_t<std::is_convertible_v<
169  decltype(object_traits<stdex::remove_cvref_t<T>>::is_hermitian), bool>>>
170  : std::true_type {};
171  }
172 
173  template<typename T>
174  constexpr bool is_hermitian_defined_for = detail::is_hermitian_defined_for_impl<T>::value;
175 
176 
177  template<typename T, typename = void>
178  struct is_explicitly_hermitian : std::false_type {};
179 
180  template<typename T>
181  struct is_explicitly_hermitian<T, std::enable_if_t<object_traits<stdex::remove_cvref_t<T>>::is_hermitian>>
182  : std::true_type {};
183 #endif
184 
185 
186  // ------------------------ //
187  // hermitian_adapter_type //
188  // ------------------------ //
189 
190 #ifdef __cpp_concepts
191  template<typename T>
192  concept hermitian_adapter_type_defined_for = std::convertible_to<
193  decltype(object_traits<std::remove_cvref_t<T>>::hermitian_adapter_type), HermitianAdapterType>;
194 #else
195  namespace detail
196  {
197  template<typename T, typename = void>
198  struct hermitian_adapter_type_defined_for_impl : std::false_type {};
199 
200  template<typename T>
201  struct hermitian_adapter_type_defined_for_impl<T, std::enable_if_t<std::is_convertible_v<
202  decltype(object_traits<stdex::remove_cvref_t<T>>::hermitian_adapter_type), HermitianAdapterType>>>
203  : std::true_type {};
204  }
205 
206  template<typename T>
207  constexpr bool hermitian_adapter_type_defined_for = detail::hermitian_adapter_type_defined_for_impl<T>::value;
208 #endif
209 
210 
211  // -------------------------- //
212  // library_base_defined_for //
213  // -------------------------- //
214 
215 #if defined(__cpp_concepts) and OPENKALMAN_CPP_FEATURE_CONCEPTS
216  template<typename Derived, typename LibraryObject>
217  concept library_base_defined_for = requires {
218  typename library_interface<std::remove_cvref_t<LibraryObject>>::template library_base<std::decay_t<Derived>>;
219  };
220 #else
221  namespace detail
222  {
223  template<typename Derived, typename LibraryObject, typename = void>
224  struct LibraryBase_defined_for_impl : std::false_type {};
225 
226  template<typename Derived, typename LibraryObject>
227  struct LibraryBase_defined_for_impl<Derived, LibraryObject,
228  std::void_t<typename library_interface<stdex::remove_cvref_t<LibraryObject>>::template library_base<std::decay_t<Derived>>>>
229  : std::true_type {};
230  }
231 
232  template<typename Derived, typename LibraryObject>
233  constexpr bool library_base_defined_for = detail::LibraryBase_defined_for_impl<Derived, LibraryObject>::value;
234 #endif
235 
236 
237  // ----------- //
238  // copy_from //
239  // ----------- //
240 
241 #ifdef __cpp_concepts
242  template<typename LHS, typename RHS>
243  concept copy_from_defined_for = requires(LHS lhs, RHS rhs) {
244  std::invoke(library_interface<std::remove_cvref_t<LHS>>::copy, lhs, std::forward<RHS>(rhs));
245  };
246 #else
247  namespace detail
248  {
249  template<typename LHS, typename RHS, typename = void>
250  struct copy_from_defined_for_impl : std::false_type {};
251 
252  template<typename LHS, typename RHS>
253  struct copy_from_defined_for_impl<LHS, RHS, std::enable_if_t<std::is_invocable_v<
254  decltype(library_interface<stdex::remove_cvref_t<LHS>>::copy), LHS, RHS>>>
255  : std::true_type {};
256  }
257 
258  template<typename LHS, typename RHS>
259  constexpr bool copy_from_defined_for = detail::copy_from_defined_for_impl<LHS, RHS>::value;
260 #endif
261 
262 
263  // ------------------ //
264  // to_native_matrix //
265  // ------------------ //
266 
267 #ifdef __cpp_concepts
268  template<typename T, typename Arg>
269  concept to_native_matrix_defined_for = requires (Arg arg) {
270  std::invoke(library_interface<std::remove_cvref_t<T>>::to_native_matrix, std::forward<Arg>(arg));
271  };
272 #else
273  namespace detail
274  {
275  template<typename T, typename Arg, typename = void>
276  struct to_native_matrix_defined_for_impl: std::false_type {};
277 
278  template<typename T, typename Arg>
279  struct to_native_matrix_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
280  decltype(library_interface<stdex::remove_cvref_t<T>>::to_native_matrix), Arg&&>>>
281  : std::true_type {};
282  }
283 
284  template<typename T, typename Arg>
285  constexpr bool to_native_matrix_defined_for = detail::to_native_matrix_defined_for_impl<T, Arg>::value;
286 #endif
287 
288 
289  // -------------- //
290  // make_default //
291  // -------------- //
292 
293 #ifdef __cpp_concepts
294  template<typename T, typename layout, typename Scalar, typename D>
295  concept make_default_defined_for = requires(D d) {
296  std::invoke(library_interface<std::remove_cvref_t<T>>::template make_default<layout, Scalar>, std::forward<D>(d));
297  };
298 #else
299  namespace detail
300  {
301  template<typename T, typename layout, typename Scalar, typename D, typename = void>
302  struct make_default_defined_for_impl : std::false_type {};
303 
304  template<typename T, typename layout, typename Scalar, typename D>
305  struct make_default_defined_for_impl<T, layout, Scalar, D, std::enable_if_t<std::is_invocable_v<
306  decltype(library_interface<stdex::remove_cvref_t<T>>::template make_default<layout, Scalar>), D>>>
307  : std::true_type {};
308  }
309 
310  template<typename T, typename layout, typename Scalar, typename D>
311  constexpr bool make_default_defined_for = detail::make_default_defined_for_impl<T, layout, Scalar, D>::value;
312 #endif
313 
314 
315  // ----------------- //
316  // fill_components //
317  // ----------------- //
318 
319 #ifdef __cpp_concepts
320  template<typename T, typename layout, typename Arg, typename...Scalars>
321  concept fill_components_defined_for = requires(Arg arg, Scalars...scalars) {
322  std::invoke(library_interface<std::remove_cvref_t<T>>::template fill_components<layout>, std::forward<Arg>(arg), std::forward<Scalars>(scalars)...);
323  };
324 #else
325  namespace detail
326  {
327  template<typename T, typename layout, typename Arg, typename = void, typename...Scalars>
328  struct fill_components_defined_for_impl : std::false_type {};
329 
330  template<typename T, typename layout, typename Arg, typename...Scalars>
331  struct fill_components_defined_for_impl<T, layout, Arg, std::enable_if_t<std::is_invocable_v<
332  decltype(library_interface<stdex::remove_cvref_t<T>>::template fill_components<layout>), Arg, Scalars...>>, Scalars...>
333  : std::true_type {};
334  }
335 
336  template<typename T, typename layout, typename Arg, typename...Scalars>
337  constexpr bool fill_components_defined_for = detail::fill_components_defined_for_impl<T, layout, Arg, void, Scalars...>::value;
338 #endif
339 
340 
341  // --------------- //
342  // make_constant //
343  // --------------- //
344 
345 #ifdef __cpp_concepts
346  template<typename T, typename C, typename Ds>
347  concept make_constant_defined_for = requires (C c, Ds ds) {
348  std::invoke(library_interface<std::remove_cvref_t<T>>::make_constant, std::forward<C>(c), std::forward<Ds>(ds));
349  };
350 #else
351  namespace detail
352  {
353  template<typename T, typename C, typename Ds, typename = void>
354  struct make_constant_matrix_defined_for_impl: std::false_type {};
355 
356  template<typename T, typename C, typename Ds>
357  struct make_constant_matrix_defined_for_impl<T, C, Ds, std::enable_if_t<std::is_invocable_v<
358  decltype(library_interface<stdex::remove_cvref_t<T>>::make_constant), C, Ds>>>
359  : std::true_type {};
360  }
361 
362  template<typename T, typename C, typename Ds>
363  constexpr bool make_constant_defined_for = detail::make_constant_matrix_defined_for_impl<T, C, Ds>::value;
364 #endif
365 
366 
367  // ---------------------- //
368  // make_identity_matrix //
369  // ---------------------- //
370 
371 #ifdef __cpp_concepts
372  template<typename T, typename Scalar, typename Ds>
373  concept make_identity_matrix_defined_for = requires (Ds ds) {
374  std::invoke(library_interface<std::remove_cvref_t<T>>::template make_identity_matrix<Scalar>, std::forward<Ds>(ds));
375  };
376 #else
377  namespace detail
378  {
379  template<typename T, typename Scalar, typename Ds, typename = void>
380  struct make_identity_matrix_defined_for_impl: std::false_type {};
381 
382  template<typename T, typename Scalar, typename Ds>
383  struct make_identity_matrix_defined_for_impl<T, Scalar, Ds, std::enable_if_t<std::is_invocable_v<
384  decltype(library_interface<stdex::remove_cvref_t<T>>::template make_identity_matrix<Scalar>), Ds>>>
385  : std::true_type {};
386  }
387 
388  template<typename T, typename Scalar, typename Ds>
389  constexpr bool make_identity_matrix_defined_for = detail::make_identity_matrix_defined_for_impl<T, Scalar, Ds>::value;
390 #endif
391 
392 
393  // ------------------------ //
394  // make_triangular_matrix //
395  // ------------------------ //
396 
397 #ifdef __cpp_concepts
398  template<typename T, triangle_type tri, typename Arg>
399  concept make_triangular_matrix_defined_for = requires (Arg arg) {
400  std::invoke(library_interface<std::remove_cvref_t<T>>::template make_triangular_matrix<tri>, std::forward<Arg>(arg));
401  };
402 #else
403  namespace detail
404  {
405  template<typename T, triangle_type tri, typename Arg, typename = void>
406  struct make_triangular_matrix_defined_for_impl: std::false_type {};
407 
408  template<typename T, triangle_type tri, typename Arg>
409  struct make_triangular_matrix_defined_for_impl<T, tri, Arg, std::enable_if_t<std::is_invocable_v<
410  decltype(library_interface<stdex::remove_cvref_t<T>>::template make_triangular_matrix<tri>), Arg>>>
411  : std::true_type {};
412  }
413 
414  template<typename T, triangle_type tri, typename Arg>
415  constexpr bool make_triangular_matrix_defined_for = detail::make_triangular_matrix_defined_for_impl<T, tri, Arg>::value;
416 #endif
417 
418 
419  // ------------------------ //
420  // make_hermitian_adapter //
421  // ------------------------ //
422 
423 #ifdef __cpp_concepts
424  template<typename T, HermitianAdapterType adapter_type, typename Arg>
425  concept make_hermitian_adapter_defined_for = requires (Arg arg) {
426  std::invoke(library_interface<std::remove_cvref_t<T>>::template make_hermitian_adapter<adapter_type>, std::forward<Arg>(arg));
427  };
428 #else
429  namespace detail
430  {
431  template<typename T, HermitianAdapterType adapter_type, typename Arg, typename = void>
432  struct make_hermitian_adapter_defined_for_impl: std::false_type {};
433 
434  template<typename T, HermitianAdapterType adapter_type, typename Arg>
435  struct make_hermitian_adapter_defined_for_impl<T, adapter_type, Arg, std::enable_if_t<std::is_invocable_v<
436  decltype(library_interface<stdex::remove_cvref_t<T>>::template make_hermitian_adapter<adapter_type>), Arg>>>
437  : std::true_type {};
438  }
439 
440  template<typename T, HermitianAdapterType adapter_type, typename Arg>
441  constexpr bool make_hermitian_adapter_defined_for = detail::make_hermitian_adapter_defined_for_impl<T, adapter_type, Arg>::value;
442 #endif
443 
444 
445  // -------------- //
446  // to_euclidean //
447  // -------------- //
448 
449 #ifdef __cpp_concepts
450  template<typename T, typename Arg>
451  concept to_euclidean_defined_for = requires (Arg arg) {
452  std::invoke(library_interface<std::remove_cvref_t<T>>::to_euclidean, std::forward<Arg>(arg));
453  };
454 #else
455  namespace detail
456  {
457  template<typename T, typename Arg, typename = void>
458  struct to_euclidean_defined_for_impl: std::false_type {};
459 
460  template<typename T, typename Arg>
461  struct to_euclidean_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
462  decltype(library_interface<stdex::remove_cvref_t<T>>::to_euclidean), Arg>>>
463  : std::true_type {};
464  }
465 
466  template<typename T, typename Arg>
467  constexpr bool to_euclidean_defined_for = detail::to_euclidean_defined_for_impl<T, Arg>::value;
468 #endif
469 
470 
471  // ---------------- //
472  // from_euclidean //
473  // ---------------- //
474 
475 #ifdef __cpp_concepts
476  template<typename T, typename Arg, typename V>
477  concept from_euclidean_defined_for = requires (Arg arg, V v) {
478  std::invoke(library_interface<std::remove_cvref_t<T>>::from_euclidean, std::forward<Arg>(arg), std::forward<V>(v));
479  };
480 #else
481  namespace detail
482  {
483  template<typename T, typename Arg, typename V, typename = void>
484  struct from_euclidean_defined_for_impl: std::false_type {};
485 
486  template<typename T, typename Arg, typename V>
487  struct from_euclidean_defined_for_impl<T, Arg, V, std::enable_if_t<std::is_invocable_v<
488  decltype(library_interface<stdex::remove_cvref_t<T>>::from_euclidean), Arg, V>>>
489  : std::true_type {};
490  }
491 
492  template<typename T, typename Arg, typename V>
493  constexpr bool from_euclidean_defined_for = detail::from_euclidean_defined_for_impl<T, Arg, V>::value;
494 #endif
495 
496 
497  // ------------- //
498  // wrap_angles //
499  // ------------- //
500 
501 #ifdef __cpp_concepts
502  template<typename T, typename Arg>
503  concept wrap_angles_defined_for = requires (Arg arg) {
504  std::invoke(library_interface<std::remove_cvref_t<T>>::wrap_angles, std::forward<Arg>(arg));
505  };
506 #else
507  namespace detail
508  {
509  template<typename T, typename Arg, typename = void>
510  struct wrap_angles_defined_for_impl: std::false_type {};
511 
512  template<typename T, typename Arg>
513  struct wrap_angles_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
514  decltype(library_interface<stdex::remove_cvref_t<T>>::wrap_angles), Arg>>>
515  : std::true_type {};
516  }
517 
518  template<typename T, typename Arg>
519  constexpr bool wrap_angles_defined_for = detail::wrap_angles_defined_for_impl<T, Arg>::value;
520 #endif
521 
522 
523  // ----------- //
524  // get_slice //
525  // ----------- //
526 
527 #ifdef __cpp_concepts
528  template<typename T, typename Arg, typename BeginTup, typename SizeTup>
529  concept get_slice_defined_for = requires(Arg arg, BeginTup begin_tup, SizeTup size_tup) {
530  std::invoke(library_interface<std::remove_cvref_t<T>>::set_slice, std::forward<Arg>(arg), begin_tup, size_tup);
531  };
532 #else
533  namespace detail
534  {
535  template<typename T, typename Arg, typename BeginTup, typename SizeTup, typename = void>
536  struct get_slice_defined_for_impl : std::false_type {};
537 
538  template<typename T, typename Arg, typename BeginTup, typename SizeTup>
539  struct get_slice_defined_for_impl<T, Arg, BeginTup, SizeTup, std::enable_if_t<std::is_invocable_v<
540  decltype(library_interface<stdex::remove_cvref_t<T>>::set_slice), Arg, BeginTup, SizeTup>>>
541  : std::true_type {};
542  }
543 
544  template<typename T, typename Arg, typename BeginTup, typename SizeTup>
545  constexpr bool get_slice_defined_for = detail::get_slice_defined_for_impl<T, Arg, BeginTup, SizeTup>::value;
546 #endif
547 
548 
549  // ----------- //
550  // set_slice //
551  // ----------- //
552 
553 #ifdef __cpp_concepts
554  template<typename T, typename Arg, typename Block, typename...Begin>
555  concept set_slice_defined_for = requires(Arg arg, Block block, Begin...begin) {
556  std::invoke(library_interface<std::remove_cvref_t<T>>::set_slice, std::forward<Arg>(arg), std::forward<Block>(block), std::forward<Begin>(begin)...);
557  };
558 #else
559  namespace detail
560  {
561  template<typename T, typename Arg, typename Block, typename = void, typename...Begin>
562  struct set_slice_defined_for_impl : std::false_type {};
563 
564  template<typename T, typename Arg, typename Block, typename...Begin>
565  struct set_slice_defined_for_impl<T, Arg, Block, std::enable_if_t<std::is_invocable_v<
566  decltype(library_interface<stdex::remove_cvref_t<T>>::set_slice), Arg, Block, Begin...>>, Begin...>
567  : std::true_type {};
568  }
569 
570  template<typename T, typename Arg, typename Block, typename...Begin>
571  constexpr bool set_slice_defined_for = detail::set_slice_defined_for_impl<T, Arg, Block, Begin...>::value;
572 #endif
573 
574 
575  // -------------- //
576  // set_triangle //
577  // -------------- //
578 
579 #ifdef __cpp_concepts
580  template<typename T, triangle_type tri, typename A, typename B>
581  concept set_triangle_defined_for = requires(A a, B b) {
582  std::invoke(library_interface<std::remove_cvref_t<T>>::template set_triangle<tri>, std::forward<A>(a), std::forward<B>(b));
583  };
584 #else
585  namespace detail
586  {
587  template<typename T, triangle_type tri, typename A, typename B, typename = void>
588  struct set_triangle_defined_for_impl : std::false_type {};
589 
590  template<typename T, triangle_type tri, typename A, typename B>
591  struct set_triangle_defined_for_impl<T, tri, A, B, std::enable_if_t<std::is_invocable_v<
592  decltype(library_interface<stdex::remove_cvref_t<T>>::template set_triangle<tri>), A, B>>>
593  : std::true_type {};
594  }
595 
596  template<typename T, triangle_type tri, typename A, typename B>
597  constexpr bool set_triangle_defined_for = detail::set_triangle_defined_for_impl<T, tri, A, B>::value;
598 #endif
599 
600 
601  // ------------- //
602  // to_diagonal //
603  // ------------- //
604 
605 #ifdef __cpp_concepts
606  template<typename T, typename Arg>
607  concept to_diagonal_defined_for = requires (Arg arg) {
608  std::invoke(library_interface<std::remove_cvref_t<T>>::to_diagonal, std::forward<Arg>(arg));
609  };
610 #else
611  namespace detail
612  {
613  template<typename T, typename Arg, typename = void>
614  struct to_diagonal_defined_for_impl: std::false_type {};
615 
616  template<typename T, typename Arg>
617  struct to_diagonal_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
618  decltype(library_interface<stdex::remove_cvref_t<T>>::to_diagonal), Arg>>>
619  : std::true_type {};
620  }
621 
622  template<typename T, typename Arg>
623  constexpr bool to_diagonal_defined_for = detail::to_diagonal_defined_for_impl<T, Arg>::value;
624 #endif
625 
626 
627  // ------------- //
628  // diagonal_of //
629  // ------------- //
630 
631 #ifdef __cpp_concepts
632  template<typename T, typename Arg>
633  concept diagonal_of_defined_for = requires (Arg arg) {
634  std::invoke(library_interface<std::remove_cvref_t<T>>::diagonal_of, std::forward<Arg>(arg));
635  };
636 #else
637  namespace detail
638  {
639  template<typename T, typename Arg, typename = void>
640  struct diagonal_of_defined_for_impl: std::false_type {};
641 
642  template<typename T, typename Arg>
643  struct diagonal_of_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
644  decltype(library_interface<stdex::remove_cvref_t<T>>::diagonal_of), Arg>>>
645  : std::true_type {};
646  }
647 
648  template<typename T, typename Arg>
649  constexpr bool diagonal_of_defined_for = detail::diagonal_of_defined_for_impl<T, Arg>::value;
650 #endif
651 
652 
653  // ----------- //
654  // conjugate //
655  // ----------- //
656 
657 #ifdef __cpp_concepts
658  template<typename Arg>
659  concept conjugate_defined_for = requires (Arg arg) {
660  std::invoke(library_interface<std::remove_cvref_t<Arg>>::conjugate, std::forward<Arg>(arg));
661  };
662 #else
663  namespace detail
664  {
665  template<typename Arg, typename = void>
666  struct conjugate_defined_for_impl: std::false_type {};
667 
668  template<typename Arg>
669  struct conjugate_defined_for_impl<Arg, std::enable_if_t<std::is_invocable_v<
670  decltype(library_interface<stdex::remove_cvref_t<Arg>>::conjugate), Arg>>>
671  : std::true_type {};
672  }
673 
674  template<typename Arg>
675  constexpr bool conjugate_defined_for = detail::conjugate_defined_for_impl<Arg>::value;
676 #endif
677 
678 
679  // ----------- //
680  // transpose //
681  // ----------- //
682 
683 #ifdef __cpp_concepts
684  template<typename Arg, std::size_t indexa, std::size_t indexb>
685  concept transpose_defined_for = requires (Arg arg) {
686  std::invoke(library_interface<std::remove_cvref_t<Arg>>::template transpose<indexa, indexb>, std::forward<Arg>(arg));
687  };
688 #else
689  namespace detail
690  {
691  template<typename Arg, std::size_t indexa, std::size_t indexb, typename = void>
692  struct transpose_defined_for_impl: std::false_type {};
693 
694  template<typename Arg, std::size_t indexa, std::size_t indexb>
695  struct transpose_defined_for_impl<Arg, indexa, indexb, std::enable_if_t<std::is_invocable_v<
696  decltype(library_interface<stdex::remove_cvref_t<Arg>>::template transpose<indexa, indexb>), Arg&&>>>
697  : std::true_type {};
698  }
699 
700  template<typename Arg, std::size_t indexa, std::size_t indexb>
701  constexpr bool transpose_defined_for = detail::transpose_defined_for_impl<Arg, indexa, indexb>::value;
702 #endif
703 
704 
705 #ifdef __cpp_concepts
706  template<typename Arg>
707  concept matrix_transpose_defined_for = requires (Arg arg) {
708  std::invoke(library_interface<std::remove_cvref_t<Arg>>::transpose, std::forward<Arg>(arg));
709  };
710 #else
711  namespace detail
712  {
713  template<typename Arg, typename = void>
714  struct matrix_transpose_defined_for_impl: std::false_type {};
715 
716  template<typename Arg>
717  struct matrix_transpose_defined_for_impl<Arg, std::enable_if_t<std::is_invocable_v<
718  decltype(library_interface<stdex::remove_cvref_t<Arg>>::transpose), Arg&&>>>
719  : std::true_type {};
720  }
721 
722  template<typename Arg>
723  constexpr bool matrix_transpose_defined_for = detail::matrix_transpose_defined_for_impl<Arg>::value;
724 #endif
725 
726 
727  // --------- //
728  // adjoint //
729  // --------- //
730 
731 #ifdef __cpp_concepts
732  template<typename Arg, std::size_t indexa, std::size_t indexb>
733  concept adjoint_defined_for = requires (Arg arg) {
734  std::invoke(library_interface<std::remove_cvref_t<Arg>>::template adjoint<indexa, indexb>, std::forward<Arg>(arg));
735  };
736 #else
737  namespace detail
738  {
739  template<typename Arg, std::size_t indexa, std::size_t indexb, typename = void>
740  struct adjoint_defined_for_impl: std::false_type {};
741 
742  template<typename Arg, std::size_t indexa, std::size_t indexb>
743  struct adjoint_defined_for_impl<Arg, indexa, indexb, std::enable_if_t<std::is_invocable_v<
744  decltype(library_interface<stdex::remove_cvref_t<Arg>>::template adjoint<indexa, indexb>), Arg&&>>>
745  : std::true_type {};
746  }
747 
748  template<typename Arg, std::size_t indexa, std::size_t indexb>
749  constexpr bool adjoint_defined_for = detail::adjoint_defined_for_impl<Arg, indexa, indexb>::value;
750 #endif
751 
752 
753 #ifdef __cpp_concepts
754  template<typename Arg>
755  concept matrix_adjoint_defined_for = requires (Arg arg) {
756  std::invoke(library_interface<std::remove_cvref_t<Arg>>::adjoint, std::forward<Arg>(arg));
757  };
758 #else
759  namespace detail
760  {
761  template<typename Arg, typename = void>
762  struct matrix_adjoint_defined_for_impl: std::false_type {};
763 
764  template<typename Arg>
765  struct matrix_adjoint_defined_for_impl<Arg, std::enable_if_t<std::is_invocable_v<
766  decltype(library_interface<stdex::remove_cvref_t<Arg>>::adjoint), Arg&&>>>
767  : std::true_type {};
768  }
769 
770  template<typename Arg>
771  constexpr bool matrix_adjoint_defined_for = detail::matrix_adjoint_defined_for_impl<Arg>::value;
772 #endif
773 
774 
775  // ----------- //
776  // broadcast //
777  // ----------- //
778 
779 #ifdef __cpp_concepts
780  template<typename T, typename Arg, typename...Factors>
781  concept broadcast_defined_for = requires(Arg arg, Factors...factors) {
782  std::invoke(library_interface<std::remove_cvref_t<T>>::broadcast, std::forward<Arg>(arg), std::forward<Factors>(factors)...);
783  };
784 #else
785  namespace detail
786  {
787  template<typename T, typename Arg, typename = void, typename...Factors>
788  struct broadcast_defined_for_impl: std::false_type {};
789 
790  template<typename T, typename Arg, typename...Factors>
791  struct broadcast_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
792  decltype(library_interface<stdex::remove_cvref_t<T>>::broadcast), Arg, Factors...>>, Factors...>
793  : std::true_type {};
794  }
795 
796  template<typename T, typename Arg, typename...Factors>
797  constexpr bool broadcast_defined_for = detail::broadcast_defined_for_impl<T, Arg, void, Factors...>::value;
798 #endif
799 
800 
801  // ----------------- //
802  // n_ary_operation //
803  // ----------------- //
804 
805 #ifdef __cpp_concepts
806  template<typename T, typename DTup, typename Op, typename...Args>
807  concept n_ary_operation_defined_for = requires(DTup d_tup, Op op, Args...args) {
808  std::invoke(library_interface<std::remove_cvref_t<T>>::n_ary_operation, d_tup, std::forward<Op>(op), std::forward<Args>(args)...);
809  };
810 #else
811  namespace detail
812  {
813  template<typename T, typename DTup, typename Op, typename = void, typename...Args>
814  struct n_ary_operation_defined_for_impl: std::false_type {};
815 
816  template<typename T, typename DTup, typename Op, typename...Args>
817  struct n_ary_operation_defined_for_impl<T, DTup, Op, std::enable_if_t<std::is_invocable_v<
818  decltype(library_interface<stdex::remove_cvref_t<T>>::n_ary_operation), DTup, Op, Args...>>, Args...>
819  : std::true_type {};
820  }
821 
822  template<typename T, typename DTup, typename Op, typename...Args>
823  constexpr bool n_ary_operation_defined_for = detail::n_ary_operation_defined_for_impl<T, DTup, Op, void, Args...>::value;
824 #endif
825 
826 
827  // -------- //
828  // reduce //
829  // -------- //
830 
831 #ifdef __cpp_concepts
832  template<typename T, typename BinaryFunction, typename Arg, std::size_t...indices>
833  concept reduce_defined_for = requires (BinaryFunction op, Arg arg) {
834  std::invoke(library_interface<std::remove_cvref_t<T>>::template reduce<indices...>, std::forward<BinaryFunction>(op), std::forward<Arg>(arg));
835  };
836 #else
837  namespace detail
838  {
839  template<typename T, typename BinaryFunction, typename Arg, typename = void, std::size_t...indices>
840  struct reduce_defined_for_impl: std::false_type {};
841 
842  template<typename T, typename BinaryFunction, typename Arg, std::size_t...indices>
843  struct reduce_defined_for_impl<T, BinaryFunction, Arg, std::enable_if_t<std::is_invocable_v<
844  decltype(library_interface<stdex::remove_cvref_t<T>>::template reduce<indices...>), BinaryFunction, Arg>>, indices...>
845  : std::true_type {};
846  }
847 
848  template<typename T, typename BinaryFunction, typename Arg, std::size_t...indices>
849  constexpr bool reduce_defined_for = detail::reduce_defined_for_impl<T, BinaryFunction, Arg, void, indices...>::value;
850 #endif
851 
852 
853  // ------------- //
854  // determinant //
855  // ------------- //
856 
857 #ifdef __cpp_concepts
858  template<typename T, typename Arg>
859  concept determinant_defined_for = requires (Arg arg) {
860  std::invoke(library_interface<std::remove_cvref_t<T>>::determinant, std::forward<Arg>(arg));
861  };
862 #else
863  namespace detail
864  {
865  template<typename T, typename Arg, typename = void>
866  struct determinant_defined_for_impl: std::false_type {};
867 
868  template<typename T, typename Arg>
869  struct determinant_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
870  decltype(library_interface<stdex::remove_cvref_t<T>>::determinant), Arg>>>
871  : std::true_type {};
872  }
873 
874  template<typename T, typename Arg>
875  constexpr bool determinant_defined_for = detail::determinant_defined_for_impl<T, Arg>::value;
876 #endif
877 
878 
879  // ----- //
880  // sum //
881  // ----- //
882 
883 #ifdef __cpp_concepts
884  template<typename T, typename...Args>
885  concept sum_defined_for = requires(Args...args) { std::invoke(library_interface<std::remove_cvref_t<T>>::sum, std::forward<Args>(args)...); };
886 #else
887  namespace detail
888  {
889  template<typename T, typename = void, typename...Args>
890  struct sum_defined_for_impl : std::false_type {};
891 
892  template<typename T, typename...Args>
893  struct sum_defined_for_impl<T, std::enable_if_t<std::is_invocable_v<
894  decltype(library_interface<stdex::remove_cvref_t<T>>::sum), Args...>>, Args...>
895  : std::true_type {};
896  }
897 
898  template<typename T, typename...Args>
899  constexpr bool sum_defined_for = detail::sum_defined_for_impl<T, void, Args...>::value;
900 #endif
901 
902 
903  // ---------------- //
904  // scalar_product //
905  // ---------------- //
906 
907 #ifdef __cpp_concepts
908  template<typename T, typename Arg, typename S>
909  concept scalar_product_defined_for = requires(Arg arg, S s) { std::invoke(library_interface<std::remove_cvref_t<T>>::scalar_product, std::forward<Arg>(arg), std::forward<S>(s)); };
910 #else
911  namespace detail
912  {
913  template<typename T, typename Arg, typename S, typename = void>
914  struct scalar_product_defined_for_impl : std::false_type {};
915 
916  template<typename T, typename Arg, typename S>
917  struct scalar_product_defined_for_impl<T, Arg, S, std::enable_if_t<std::is_invocable_v<
918  decltype(library_interface<stdex::remove_cvref_t<T>>::scalar_product), Arg, S>>>
919  : std::true_type {};
920  }
921 
922  template<typename T, typename Arg, typename S>
923  constexpr bool scalar_product_defined_for = detail::scalar_product_defined_for_impl<T, Arg, S>::value;
924 #endif
925 
926 
927  // ---------------- //
928  // scalar_product //
929  // ---------------- //
930 
931 #ifdef __cpp_concepts
932  template<typename T, typename Arg, typename S>
933  concept scalar_quotient_defined_for = requires(Arg arg, S s) { std::invoke(library_interface<std::remove_cvref_t<T>>::scalar_quotient, std::forward<Arg>(arg), std::forward<S>(s)); };
934 #else
935  namespace detail
936  {
937  template<typename T, typename Arg, typename S, typename = void>
938  struct scalar_quotient_defined_for_impl : std::false_type {};
939 
940  template<typename T, typename Arg, typename S>
941  struct scalar_quotient_defined_for_impl<T, Arg, S, std::enable_if_t<std::is_invocable_v<
942  decltype(library_interface<stdex::remove_cvref_t<T>>::scalar_quotient), Arg, S>>>
943  : std::true_type {};
944  }
945 
946  template<typename T, typename Arg, typename S>
947  constexpr bool scalar_quotient_defined_for = detail::scalar_quotient_defined_for_impl<T, Arg, S>::value;
948 #endif
949 
950 
951  // ---------- //
952  // contract //
953  // ---------- //
954 
955 #ifdef __cpp_concepts
956  template<typename T, typename A, typename B>
957  concept contract_defined_for = requires(A a, B b) {
958  std::invoke(library_interface<std::remove_cvref_t<T>>::contract, std::forward<A>(a), std::forward<B>(b));
959  };
960 #else
961  namespace detail
962  {
963  template<typename T, typename A, typename B, typename = void>
964  struct contract_defined_for_impl : std::false_type {};
965 
966  template<typename T, typename A, typename B>
967  struct contract_defined_for_impl<T, A, B, std::enable_if_t<std::is_invocable_v<
968  decltype(library_interface<stdex::remove_cvref_t<T>>::contract), A, B>>>
969  : std::true_type {};
970  }
971 
972  template<typename T, typename A, typename B>
973  constexpr bool contract_defined_for = detail::contract_defined_for_impl<T, A, B>::value;
974 #endif
975 
976 
977  // ------------------- //
978  // contract_in_place //
979  // ------------------- //
980 
981 #ifdef __cpp_concepts
982  template<typename T, bool on_the_right, typename A, typename B>
983  concept contract_in_place_defined_for = requires(A a, B b) {
984  std::invoke(library_interface<std::remove_cvref_t<T>>::template contract_in_place<on_the_right>, std::forward<A>(a), std::forward<B>(b));
985  };
986 #else
987  namespace detail
988  {
989  template<typename T, bool on_the_right, typename A, typename B, typename = void>
990  struct contract_in_place_defined_for_impl : std::false_type {};
991 
992  template<typename T, bool on_the_right, typename A, typename B>
993  struct contract_in_place_defined_for_impl<T, on_the_right, A, B, std::enable_if_t<std::is_invocable_v<
994  decltype(library_interface<stdex::remove_cvref_t<T>>::template contract_in_place<on_the_right>), A, B>>>
995  : std::true_type {};
996  }
997 
998  template<typename T, bool on_the_right, typename A, typename B>
999  constexpr bool contract_in_place_defined_for = detail::contract_in_place_defined_for_impl<T, on_the_right, A, B>::value;
1000 #endif
1001 
1002 
1003  // ----------------- //
1004  // cholesky_factor //
1005  // ----------------- //
1006 
1007 #ifdef __cpp_concepts
1008  template<typename T, triangle_type tri, typename Arg>
1009  concept cholesky_factor_defined_for = requires (Arg arg) {
1010  std::invoke(library_interface<std::remove_cvref_t<T>>::template cholesky_factor<tri>, std::forward<Arg>(arg));
1011  };
1012 #else
1013  namespace detail
1014  {
1015  template<typename T, triangle_type tri, typename Arg, typename = void>
1016  struct cholesky_factor_defined_for_impl: std::false_type {};
1017 
1018  template<typename T, triangle_type tri, typename Arg>
1019  struct cholesky_factor_defined_for_impl<T, tri, Arg, std::enable_if_t<std::is_invocable_v<
1020  decltype(library_interface<stdex::remove_cvref_t<T>>::template cholesky_factor<tri>), Arg>>>
1021  : std::true_type {};
1022  }
1023 
1024  template<typename T, triangle_type tri, typename Arg>
1025  constexpr bool cholesky_factor_defined_for = detail::cholesky_factor_defined_for_impl<T, tri, Arg>::value;
1026 #endif
1027 
1028 
1029  // ----------------------- //
1030  // rank_update_hermitian //
1031  // ----------------------- //
1032 
1033 #ifdef __cpp_concepts
1034  template<typename T, HermitianAdapterType significant_triangle, typename A, typename U, typename Alpha>
1035  concept rank_update_self_adjoint_defined_for = requires (A a, U u, Alpha alpha) {
1036  std::invoke(library_interface<std::remove_cvref_t<T>>::template rank_update_hermitian<significant_triangle>, std::forward<A>(a), std::forward<U>(u), alpha);
1037  };
1038 #else
1039  namespace detail
1040  {
1041  template<typename T, HermitianAdapterType significant_triangle, typename A, typename U, typename Alpha, typename = void>
1042  struct rank_update_self_adjoint_defined_for_impl: std::false_type {};
1043 
1044  template<typename T, HermitianAdapterType significant_triangle, typename A, typename U, typename Alpha>
1045  struct rank_update_self_adjoint_defined_for_impl<T, significant_triangle, A, U, Alpha, std::enable_if_t<std::is_invocable_v<
1046  decltype(library_interface<stdex::remove_cvref_t<T>>::template rank_update_hermitian<significant_triangle>), A, U, Alpha>>>
1047  : std::true_type {};
1048  }
1049 
1050  template<typename T, HermitianAdapterType significant_triangle, typename A, typename U, typename Alpha>
1051  constexpr bool rank_update_self_adjoint_defined_for = detail::rank_update_self_adjoint_defined_for_impl<T, significant_triangle, A, U, Alpha>::value;
1052 #endif
1053 
1054 
1055  // ------------------------ //
1056  // rank_update_triangular //
1057  // ------------------------ //
1058 
1059 #ifdef __cpp_concepts
1060  template<typename T, triangle_type tri, typename A, typename U, typename Alpha>
1061  concept rank_update_triangular_defined_for = requires (A a, U u, Alpha alpha) {
1062  std::invoke(library_interface<std::remove_cvref_t<T>>::template rank_update_triangular<tri>, std::forward<A>(a), std::forward<U>(u), alpha);
1063  };
1064 #else
1065  namespace detail
1066  {
1067  template<typename T, triangle_type tri, typename A, typename U, typename Alpha, typename = void>
1068  struct rank_update_triangular_defined_for_impl: std::false_type {};
1069 
1070  template<typename T, triangle_type tri, typename A, typename U, typename Alpha>
1071  struct rank_update_triangular_defined_for_impl<T, tri, A, U, Alpha, std::enable_if_t<std::is_invocable_v<
1072  decltype(library_interface<stdex::remove_cvref_t<T>>::template rank_update_triangular<tri>), A, U, Alpha>>>
1073  : std::true_type {};
1074  }
1075 
1076  template<typename T, triangle_type tri, typename A, typename U, typename Alpha>
1077  constexpr bool rank_update_triangular_defined_for = detail::rank_update_triangular_defined_for_impl<T, tri, A, U, Alpha>::value;
1078 #endif
1079 
1080 
1081  // ------- //
1082  // solve //
1083  // ------- //
1084 
1085 #ifdef __cpp_concepts
1086  template<typename T, bool must_be_unique, bool must_be_exact, typename A, typename B>
1087  concept solve_defined_for = requires(A a, B b) {
1088  std::invoke(library_interface<std::remove_cvref_t<T>>::template solve<must_be_unique, must_be_exact>, std::forward<A>(a), std::forward<B>(b));
1089  };
1090 #else
1091  namespace detail
1092  {
1093  template<typename T, bool must_be_unique, bool must_be_exact, typename A, typename B, typename = void>
1094  struct solve_defined_for_impl : std::false_type {};
1095 
1096  template<typename T, bool must_be_unique, bool must_be_exact, typename A, typename B>
1097  struct solve_defined_for_impl<T, must_be_unique, must_be_exact, A, B, std::enable_if_t<std::is_invocable_v<
1098  decltype(library_interface<stdex::remove_cvref_t<T>>::template solve<must_be_unique, must_be_exact>), A, B>>>
1099  : std::true_type {};
1100  }
1101 
1102  template<typename T, bool must_be_unique, bool must_be_exact, typename A, typename B>
1104 #endif
1105 
1106 
1107  // ------------------ //
1108  // LQ_decomposition //
1109  // ------------------ //
1110 
1111 #ifdef __cpp_concepts
1112  template<typename T, typename Arg>
1113  concept LQ_decomposition_defined_for = requires (Arg arg) {
1114  std::invoke(library_interface<std::remove_cvref_t<T>>::LQ_decomposition, std::forward<Arg>(arg));
1115  };
1116 #else
1117  namespace detail
1118  {
1119  template<typename T, typename Arg, typename = void>
1120  struct LQ_decomposition_defined_for_impl: std::false_type {};
1121 
1122  template<typename T, typename Arg>
1123  struct LQ_decomposition_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
1124  decltype(library_interface<stdex::remove_cvref_t<T>>::LQ_decomposition), Arg>>>
1125  : std::true_type {};
1126  }
1127 
1128  template<typename T, typename Arg>
1129  constexpr bool LQ_decomposition_defined_for = detail::LQ_decomposition_defined_for_impl<T, Arg>::value;
1130 #endif
1131 
1132 
1133  // ------------------ //
1134  // LQ_decomposition //
1135  // ------------------ //
1136 
1137 #ifdef __cpp_concepts
1138  template<typename T, typename Arg>
1139  concept QR_decomposition_defined_for = requires (Arg arg) {
1140  std::invoke(library_interface<std::remove_cvref_t<T>>::QR_decomposition, std::forward<Arg>(arg));
1141  };
1142 #else
1143  namespace detail
1144  {
1145  template<typename T, typename Arg, typename = void>
1146  struct QR_decomposition_defined_for_impl: std::false_type {};
1147 
1148  template<typename T, typename Arg>
1149  struct QR_decomposition_defined_for_impl<T, Arg, std::enable_if_t<std::is_invocable_v<
1150  decltype(library_interface<stdex::remove_cvref_t<T>>::QR_decomposition), Arg>>>
1151  : std::true_type {};
1152  }
1153 
1154  template<typename T, typename Arg>
1155  constexpr bool QR_decomposition_defined_for = detail::QR_decomposition_defined_for_impl<T, Arg>::value;
1156 #endif
1157 
1158 
1159 }
1160 
1161 
1162 #endif
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
decltype(auto) constexpr contract(A &&a, B &&b)
Matrix multiplication of A * B.
Definition: contract.hpp:54
Definition: basics.hpp:41
Definition: interfaces-defined.hpp:740
decltype(auto) constexpr conjugate(Arg &&arg)
Take the complex conjugate of an indexible object.
Definition: conjugate.hpp:44
Definition: interfaces-defined.hpp:115
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
HermitianAdapterType
The type of a hermitian adapter, indicating which triangle of the nested matrix is used...
Definition: enumerations.hpp:79
constexpr bool value
T is a fixed or dynamic value that is reducible to a number.
Definition: value.hpp:45
decltype(auto) constexpr to_diagonal(Arg &&arg)
Convert an indexible object into a diagonal matrix.
Definition: to_diagonal.hpp:33
Enumerations relating to linear algebra.
Definition: interfaces-defined.hpp:178
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:890
Definition: interfaces-defined.hpp:964
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 transpose(Arg &&arg)
Swap any two indices of an indexible_object.
Definition: transpose.hpp:163
constexpr auto determinant(Arg &&arg)
Take the determinant of a matrix.
Definition: determinant.hpp:44
Definition: interfaces-defined.hpp:840
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
Definition: interfaces-defined.hpp:666
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:562
Definition: interfaces-defined.hpp:250
decltype(auto) constexpr sum(Ts &&...ts)
Element-by-element sum of one or more objects.
Definition: sum.hpp:112
Definition: interfaces-defined.hpp:788
Definition: interfaces-defined.hpp:692
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
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
decltype(auto) constexpr nested_object(Arg &&arg)
Retrieve a nested object of Arg, if it exists.
Definition: nested_object.hpp:35
Definition: interfaces-defined.hpp:1094
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:292
Definition: interfaces-defined.hpp:536
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