OpenKalman
default-overloads.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) 2019-2021 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 
11 #ifndef OPENKALMAN_DEFAULT_OVERLOADS_HPP
12 #define OPENKALMAN_DEFAULT_OVERLOADS_HPP
13 
20 #include <type_traits>
21 
22 
23 namespace OpenKalman
24 {
25  // ---------------------------------------- //
26  // Make functions for OpenKalman matrices //
27  // ---------------------------------------- //
28 
38 #ifdef __cpp_concepts
39  template<fixed_pattern RowCoefficients, fixed_pattern ColumnCoefficients = RowCoefficients, values::number ... Args>
40  requires (sizeof...(Args) > 0) and (coordinates::dimension_of_v<RowCoefficients> * coordinates::dimension_of_v<ColumnCoefficients> == sizeof...(Args))
41 #else
42  template<typename RowCoefficients, typename ColumnCoefficients = RowCoefficients, typename ... Args,
43  std::enable_if_t<(sizeof...(Args) > 0) and (values::number<Args> and ...) and
44  (coordinates::dimension_of_v<RowCoefficients> * coordinates::dimension_of_v<ColumnCoefficients> == sizeof...(Args)), int> = 0>
45 #endif
46  auto make_matrix(const Args...args)
47  {
48  using Scalar = std::common_type_t<Args...>;
49  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<RowCoefficients>, coordinates::dimension_of_v<ColumnCoefficients>>;
50  return Matrix<RowCoefficients, ColumnCoefficients, Mat>(make_dense_object_from<Mat>(static_cast<const Scalar>(args)...));
51  }
52 
53 
60 #ifdef __cpp_concepts
61  template<values::number ... Args> requires (sizeof...(Args) > 0)
62 #else
63  template<typename ... Args, std::enable_if_t<
64  (sizeof...(Args) > 0) and (values::number<Args> and ...), int> = 0>
65 #endif
66  auto make_matrix(const Args ... args)
67  {
68  return make_matrix<Dimensions<sizeof...(Args)>, Axis>(args...);
69  }
70 
71 
80 #ifdef __cpp_concepts
81  template<values::number Scalar, fixed_pattern RowCoefficients,
82  fixed_pattern ColumnCoefficients = RowCoefficients>
83 #else
84  template<typename Scalar, typename RowCoefficients, typename ColumnCoefficients = RowCoefficients,
85  std::enable_if_t<values::number<Scalar> and
86  fixed_pattern<RowCoefficients> and fixed_pattern<ColumnCoefficients>, int> = 0>
87 #endif
88  auto make_matrix()
89  {
90  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<RowCoefficients>, coordinates::dimension_of_v<ColumnCoefficients>>;
92  }
93 
94 
103 #ifdef __cpp_concepts
104  template<fixed_pattern StaticDescriptor, values::number ... Args> requires
105  (sizeof...(Args) > 0) and (sizeof...(Args) % coordinates::dimension_of_v<StaticDescriptor> == 0)
106 #else
107  template<typename StaticDescriptor, typename ... Args, std::enable_if_t<fixed_pattern<StaticDescriptor> and
108  (sizeof...(Args) > 0) and (values::number<Args> and ...) and
109  (sizeof...(Args) % coordinates::dimension_of_v<StaticDescriptor> == 0), int> = 0>
110 #endif
111  auto make_mean(const Args ... args)
112  {
113  using Scalar = std::decay_t<std::common_type_t<Args...>>;
114  constexpr std::size_t dim = coordinates::dimension_of_v<StaticDescriptor>;
115  constexpr std::size_t cols = sizeof...(Args) / dim;
117  return Mean<StaticDescriptor, Mat>(make_dense_object_from<Mat>(static_cast<const Scalar>(args)...));
118  }
119 
120 
127 #ifdef __cpp_concepts
128  template<values::number ... Args> requires (sizeof...(Args) > 0)
129 #else
130  template<typename ... Args, std::enable_if_t<
131  (sizeof...(Args) > 0) and (values::number<Args> and ...), int> = 0>
132 #endif
133  auto make_mean(const Args ... args)
134  {
135  return make_mean<OpenKalman::Dimensions<sizeof...(Args)>>(args...);
136  }
137 
138 
147 #ifdef __cpp_concepts
148  template<values::number Scalar, fixed_pattern StaticDescriptor, std::size_t cols = 1>
149 #else
150  template<typename Scalar, typename StaticDescriptor, std::size_t cols = 1, std::enable_if_t<
151  values::number<Scalar> and fixed_pattern<StaticDescriptor>, int> = 0>
152 #endif
153  auto make_mean()
154  {
156  }
157 
158 
167 #ifdef __cpp_concepts
168  template<fixed_pattern StaticDescriptor, values::number ... Args> requires
169  (sizeof...(Args) > 0) and (sizeof...(Args) % coordinates::stat_dimension_of_v<StaticDescriptor> == 0)
170 #else
171  template<typename StaticDescriptor, typename ... Args, std::enable_if_t<
172  (sizeof...(Args) > 0) and (values::number<Args> and ...) and
173  (sizeof...(Args) % coordinates::stat_dimension_of_v<StaticDescriptor> == 0), int> = 0>
174 #endif
175  auto make_euclidean_mean(const Args ... args)
176  {
177  using Scalar = std::decay_t<std::common_type_t<Args...>>;
178  constexpr std::size_t dim = coordinates::stat_dimension_of_v<StaticDescriptor>;
179  constexpr std::size_t cols = sizeof...(Args) / dim;
181  return EuclideanMean<StaticDescriptor, Mat>(make_dense_object_from<Mat>(static_cast<const Scalar>(args)...));
182  }
183 
184 
191 #ifdef __cpp_concepts
192  template<values::number ... Args> requires (sizeof...(Args) > 0)
193 #else
194  template<typename ... Args, std::enable_if_t<
195  (sizeof...(Args) > 0) and (values::number<Args> and ...), int> = 0>
196 #endif
197  auto make_euclidean_mean(const Args ... args)
198  {
199  return make_euclidean_mean<Dimensions<sizeof...(Args)>>(args...);
200  }
201 
202 
211 #ifdef __cpp_concepts
212  template<values::number Scalar, fixed_pattern StaticDescriptor, std::size_t cols = 1>
213 #else
214  template<typename Scalar, typename StaticDescriptor, std::size_t cols = 1, std::enable_if_t<
215  values::number<Scalar> and fixed_pattern<StaticDescriptor>, int> = 0>
216 #endif
218  {
220  }
221 
222 
232 #ifdef __cpp_concepts
233  template<fixed_pattern StaticDescriptor, TriangleType triangle_type, values::number ... Args> requires
234  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
235  (sizeof...(Args) > 0) and (sizeof...(Args) == coordinates::dimension_of_v<StaticDescriptor> * coordinates::dimension_of_v<StaticDescriptor>)
236 #else
237  template<typename StaticDescriptor, TriangleType triangle_type, typename ... Args, std::enable_if_t<
238  fixed_pattern<StaticDescriptor> and (values::number<Args> and ...) and
239  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
240  (sizeof...(Args) > 0) and (sizeof...(Args) == coordinates::dimension_of_v<StaticDescriptor> * coordinates::dimension_of_v<StaticDescriptor>), int> = 0>
241 #endif
242  auto make_covariance(const Args ... args)
243  {
244  using Scalar = std::decay_t<std::common_type_t<Args...>>;
245  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<StaticDescriptor>, coordinates::dimension_of_v<StaticDescriptor>>;
248  return Covariance<StaticDescriptor, T>(SA {make_dense_object_from<Mat>(static_cast<const Scalar>(args)...)});
249  }
250 
251 
260 #ifdef __cpp_concepts
261  template<fixed_pattern StaticDescriptor, values::number ... Args> requires
262  (sizeof...(Args) > 0) and (sizeof...(Args) == coordinates::dimension_of_v<StaticDescriptor> * coordinates::dimension_of_v<StaticDescriptor>)
263 #else
264  template<typename StaticDescriptor, typename ... Args, std::enable_if_t<
265  fixed_pattern<StaticDescriptor> and (values::number<Args> and ...) and
266  (sizeof...(Args) > 0) and (sizeof...(Args) == coordinates::dimension_of_v<StaticDescriptor> * coordinates::dimension_of_v<StaticDescriptor>), int> = 0>
267 #endif
268  auto make_covariance(const Args ... args)
269  {
270  using Scalar = std::decay_t<std::common_type_t<Args...>>;
271  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<StaticDescriptor>, coordinates::dimension_of_v<StaticDescriptor>>;
272  auto mat = make_dense_object_from<Mat>(static_cast<const Scalar>(args)...);
273  using SA = HermitianAdapter<Mat>;
274  return Covariance<StaticDescriptor, SA>(SA {mat});
275  }
276 
277 
286 #ifdef __cpp_concepts
287  template<TriangleType triangle_type, values::number ... Args> requires
288  (sizeof...(Args) > 0) and (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
289  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) * static_cast<std::size_t>(values::sqrt(sizeof...(Args))))
290 #else
291  template<TriangleType triangle_type, typename ... Args, std::enable_if_t<
292  (sizeof...(Args) > 0) and (values::number<Args> and ...) and
293  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
294  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) * static_cast<std::size_t>(values::sqrt(sizeof...(Args)))), int> = 0>
295 #endif
296  auto make_covariance(const Args ... args)
297  {
298  constexpr auto dim = static_cast<std::size_t>(values::sqrt(sizeof...(Args)));
299  using StaticDescriptor = OpenKalman::Dimensions<dim>;
300  return make_covariance<StaticDescriptor, triangle_type>(args...);
301  }
302 
303 
311 #ifdef __cpp_concepts
312  template<values::number ... Args> requires (sizeof...(Args) > 0) and
313  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) * static_cast<std::size_t>(values::sqrt(sizeof...(Args))))
314 #else
315  template<typename ... Args, std::enable_if_t<(sizeof...(Args) > 0) and (values::number<Args> and ...) and
316  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) * static_cast<std::size_t>(values::sqrt(sizeof...(Args)))), int> = 0>
317 #endif
318  auto make_covariance(const Args ... args)
319  {
320  constexpr auto dim = static_cast<std::size_t>(values::sqrt(sizeof...(Args)));
321  using StaticDescriptor = OpenKalman::Dimensions<dim>;
322  return make_covariance<StaticDescriptor>(args...);
323  }
324 
325 
334 #ifdef __cpp_concepts
335  template<fixed_pattern StaticDescriptor, TriangleType triangle_type, values::number Scalar = double>
336  requires (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper)
337 #else
338  template<typename StaticDescriptor, TriangleType triangle_type, typename Scalar = double, std::enable_if_t<
339  fixed_pattern<StaticDescriptor> and
340  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
341  values::number<Scalar>, int> = 0>
342 #endif
343  auto make_covariance()
344  {
345  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<StaticDescriptor>, coordinates::dimension_of_v<StaticDescriptor>>;
348  }
349 
350 
358 #ifdef __cpp_concepts
359  template<fixed_pattern StaticDescriptor, values::number Scalar = double>
360 #else
361  template<typename StaticDescriptor, typename Scalar = double, std::enable_if_t<
362  fixed_pattern<StaticDescriptor> and values::number<Scalar>, int> = 0>
363 #endif
364  auto make_covariance()
365  {
366  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<StaticDescriptor>, coordinates::dimension_of_v<StaticDescriptor>>;
367  using SA = HermitianAdapter<Mat>;
369  }
370 
371 
382 #ifdef __cpp_concepts
383  template<fixed_pattern StaticDescriptor, TriangleType triangle_type = TriangleType::lower, values::number ... Args>
384  requires (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
385  (sizeof...(Args) > 0) and (sizeof...(Args) == coordinates::dimension_of_v<StaticDescriptor> * coordinates::dimension_of_v<StaticDescriptor>)
386 #else
387  template<typename StaticDescriptor, TriangleType triangle_type = TriangleType::lower, typename ... Args,
388  std::enable_if_t<fixed_pattern<StaticDescriptor> and (values::number<Args> and ...) and
389  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
390  (sizeof...(Args) > 0) and (sizeof...(Args) == coordinates::dimension_of_v<StaticDescriptor> * coordinates::dimension_of_v<StaticDescriptor>), int> = 0>
391 #endif
392  auto make_square_root_covariance(const Args ... args)
393  {
394  using Scalar = std::decay_t<std::common_type_t<Args...>>;
395  using Mat = Eigen3::eigen_matrix_t<Scalar, coordinates::dimension_of_v<StaticDescriptor>, coordinates::dimension_of_v<StaticDescriptor>>;
396  auto mat = make_dense_object_from<Mat>(static_cast<const Scalar>(args)...);
398  auto tri = Tri {mat};
400  }
401 
402 
411 #ifdef __cpp_concepts
412  template<TriangleType triangle_type = TriangleType::lower, values::number ... Args> requires
413  (sizeof...(Args) > 0) and (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
414  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) * static_cast<std::size_t>(values::sqrt(sizeof...(Args))))
415 #else
416  template<TriangleType triangle_type = TriangleType::lower, typename ... Args, std::enable_if_t<
417  (sizeof...(Args) > 0) and (values::number<Args> and ...) and
418  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and
419  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) *
420  static_cast<std::size_t>(values::sqrt(sizeof...(Args)))), int> = 0>
421 #endif
422  auto make_square_root_covariance(const Args ... args)
423  {
424  constexpr auto dim = static_cast<std::size_t>(values::sqrt(sizeof...(Args)));
425  using StaticDescriptor = OpenKalman::Dimensions<dim>;
426  return make_square_root_covariance<StaticDescriptor, triangle_type>(args...);
427  }
428 
429 
438 #ifdef __cpp_concepts
439  template<fixed_pattern StaticDescriptor, TriangleType triangle_type = TriangleType::lower, values::number Scalar = double>
440  requires (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper)
441 #else
442  template<typename StaticDescriptor, TriangleType triangle_type = TriangleType::lower, typename Scalar = double,
443  std::enable_if_t<fixed_pattern<StaticDescriptor> and
444  (triangle_type == TriangleType::lower or triangle_type == TriangleType::upper) and values::number<Scalar>, int> = 0>
445 #endif
447  {
448  using Mat = Eigen3::eigen_matrix_t<double, coordinates::dimension_of_v<StaticDescriptor>, coordinates::dimension_of_v<StaticDescriptor>>;
451  }
452 
453 
454  // --------------------------------------------------------------------------- //
455  // The following are only included if Eigen3 is the first-included interface //
456  // --------------------------------------------------------------------------- //
457 
458 #ifndef OPENKALMAN_FIRST_INTERFACE
459 
465 #define OPENKALMAN_FIRST_INTERFACE
466 
467  // ------------ //
468  // Matrix //
469  // ------------ //
470 
471  // Default specialization for Eigen: the nested matrix will be an Eigen::Matrix of the appropriate size.
472 #ifdef __cpp_concepts
473  template<
474  fixed_pattern RowCoefficients,
475  fixed_pattern ColumnCoefficients = RowCoefficients,
476  typed_matrix_nestable NestedMatrix =
477  Eigen3::eigen_matrix_t<double, coordinates::dimension_of_v<RowCoefficients>, coordinates::dimension_of_v<ColumnCoefficients>>>
478  requires
479  (coordinates::dimension_of_v<RowCoefficients> == index_dimension_of_v<NestedMatrix, 0>) and
480  (coordinates::dimension_of_v<ColumnCoefficients> == index_dimension_of_v<NestedMatrix, 1>) and
481  (not std::is_rvalue_reference_v<NestedMatrix>) and
482  (dynamic_pattern<RowCoefficients> == dynamic_dimension<NestedMatrix, 0>) and
483  (dynamic_pattern<ColumnCoefficients> == dynamic_dimension<NestedMatrix, 1>)
484 #else
485  template<
486  typename RowCoefficients,
487  typename ColumnCoefficients = RowCoefficients,
488  typename NestedMatrix = Eigen3::eigen_matrix_t<double, coordinates::dimension_of_v<RowCoefficients>, coordinates::dimension_of_v<ColumnCoefficients>>>
489 #endif
490  struct Matrix;
491 
492 
493  // If the arguments are a sequence of scalars, deduce a single-column matrix.
494 #ifdef __cpp_concepts
495  template<values::number ... Args> requires (sizeof...(Args) > 0)
496 #else
497  template<typename ... Args, std::enable_if_t<(sizeof...(Args) > 0) and (values::number<Args> and ...), int> = 0>
498 #endif
499  Matrix(const Args ...) -> Matrix<Dimensions<sizeof...(Args)>, Axis,
500  Eigen3::eigen_matrix_t<std::common_type_t<Args...>, sizeof...(Args), 1>>;
501 
502 
503  // ---------- //
504  // Mean //
505  // ---------- //
506 
507  // By default when using Eigen3, a Mean is an Eigen3 column vector corresponding to the StaticDescriptor.
508 #ifdef __cpp_concepts
509  template<fixed_pattern RowCoefficients,
511  requires (coordinates::dimension_of_v<RowCoefficients> == index_dimension_of_v<NestedMatrix, 0>) and
512  (not std::is_rvalue_reference_v<NestedMatrix>)
513 #else
514  template<typename RowCoefficients,
516 #endif
517  struct Mean;
518 
519 
521 #ifdef __cpp_concepts
522  template<values::number ... Args> requires (sizeof...(Args) > 0)
523 #else
524  template<typename ... Args, std::enable_if_t<(sizeof...(Args) > 0) and (values::number<Args> and ...), int> = 0>
525 #endif
526  Mean(const Args ...) -> Mean<Dimensions<sizeof...(Args)>,
527  Eigen3::eigen_matrix_t<std::common_type_t<Args...>, sizeof...(Args), 1>>;
528 
529 
530  // ------------------- //
531  // EuclideanMean //
532  // ------------------- //
533 
534 #ifdef __cpp_concepts
535  template<
536  fixed_pattern StaticDescriptor,
538  requires
539  (coordinates::stat_dimension_of_v<StaticDescriptor> == index_dimension_of_v<NestedMatrix, 0>) and
540  (not std::is_rvalue_reference_v<NestedMatrix>)
541 #else
542  template<typename StaticDescriptor,
544 #endif
545  struct EuclideanMean;
546 
547 
549 #ifdef __cpp_concepts
550  template<values::number ... Args> requires (sizeof...(Args) > 0)
551 #else
552  template<typename ... Args, std::enable_if_t<(sizeof...(Args) > 0) and (values::number<Args> and ...), int> = 0>
553 #endif
554  EuclideanMean(const Args ...) -> EuclideanMean<OpenKalman::Dimensions<sizeof...(Args)>,
555  Eigen3::eigen_matrix_t<std::common_type_t<Args...>, sizeof...(Args), 1>>;
556 
557 
558  // ---------------- //
559  // Covariance //
560  // ---------------- //
561 
562 #ifdef __cpp_concepts
563  template<fixed_pattern StaticDescriptor, covariance_nestable NestedMatrix =
565  requires (coordinates::dimension_of_v<StaticDescriptor> == index_dimension_of_v<NestedMatrix, 0>) and
566  (not std::is_rvalue_reference_v<NestedMatrix>) and values::number<scalar_type_of_t<NestedMatrix>>
567 #else
568  template<typename StaticDescriptor, typename NestedMatrix =
570 #endif
571  struct Covariance;
572 
573 
575 #if defined(__cpp_concepts) && not defined(__clang__) // Because of compiler issue in at least clang version 10.0.0
576  template<values::number ... Args> requires (sizeof...(Args) > 0) and
577  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) *
578  static_cast<std::size_t>(values::sqrt(sizeof...(Args))))
579 #else
580  template<typename ... Args, std::enable_if_t<(values::number<Args> and ...) and (sizeof...(Args) > 0) and
581  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) *
582  static_cast<std::size_t>(values::sqrt(sizeof...(Args)))), int> = 0>
583 #endif
584  explicit Covariance(const Args& ...) -> Covariance<Dimensions<static_cast<std::size_t>(values::sqrt(sizeof...(Args)))>,
585  HermitianAdapter<Eigen3::eigen_matrix_t<std::common_type_t<Args...>,
586  static_cast<std::size_t>(values::sqrt(sizeof...(Args))), static_cast<std::size_t>(values::sqrt(sizeof...(Args)))>>>;
587 
588 
589  // --------------------- //
590  // SquareRootCovariance //
591  // --------------------- //
592 
593 #ifdef __cpp_concepts
594  template<fixed_pattern StaticDescriptor, covariance_nestable NestedMatrix =
596  requires (coordinates::dimension_of_v<StaticDescriptor> == index_dimension_of_v<NestedMatrix, 0>) and
597  (not std::is_rvalue_reference_v<NestedMatrix>) and values::number<scalar_type_of_t<NestedMatrix>>
598 #else
599  template<typename StaticDescriptor, typename NestedMatrix =
601 #endif
602  struct SquareRootCovariance;
603 
604 
606 #if defined(__cpp_concepts) && not defined(__clang__) // Because of compiler issue in at least clang version 10.0.0
607  template<values::number ... Args> requires (sizeof...(Args) > 0) and
608  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) *
609  static_cast<std::size_t>(values::sqrt(sizeof...(Args))))
610 #else
611  template<typename ... Args, std::enable_if_t<(values::number<Args> and ...) and (sizeof...(Args) > 0) and
612  (sizeof...(Args) == static_cast<std::size_t>(values::sqrt(sizeof...(Args))) *
613  static_cast<std::size_t>(values::sqrt(sizeof...(Args)))), int> = 0>
614 #endif
615  explicit SquareRootCovariance(const Args& ...) -> SquareRootCovariance<
616  Dimensions<static_cast<std::size_t>(values::sqrt(sizeof...(Args)))>,
617  TriangularAdapter<Eigen3::eigen_matrix_t<std::common_type_t<Args...>,
618  static_cast<std::size_t>(values::sqrt(sizeof...(Args))), static_cast<std::size_t>(values::sqrt(sizeof...(Args)))>>>;
619 
620 
621 } // namespace OpenKalman
622 
623 #endif // OPENKALMAN_FIRST_INTERFACE
624 
625 #endif //OPENKALMAN_DEFAULT_OVERLOADS_HPP
A hermitian matrix wrapper.
Definition: HermitianAdapter.hpp:31
auto make_square_root_covariance(Arg &&arg)
Make a SquareRootCovariance from a covariance_nestable, specifying the coefficients.
Definition: SquareRootCovariance.hpp:673
TriangleType
The type of a triangular matrix.
Definition: global-definitions.hpp:60
A set of one or more column vectors, each representing a statistical mean.
Definition: forward-class-declarations.hpp:477
A triangular_adapter, where components above or below the diagonal (or both) are zero.
Definition: forward-class-declarations.hpp:257
auto make_mean(M &&m)
Make a Mean from a typed_matrix_nestable, specifying the row fixed_pattern.
Definition: Mean.hpp:420
constexpr bool number
T is a numerical type.
Definition: number.hpp:33
An upper-right triangular matrix.
std::conditional_t< sizeof...(dims)==1, Eigen::Matrix< Scalar, detail::eigen_index_convert< dims >..., detail::eigen_index_convert< 1 > >, Eigen::Matrix< Scalar, detail::eigen_index_convert< dims >... > > eigen_matrix_t
An alias for a self-contained, writable, native Eigen matrix.
Definition: eigen-forward-declarations.hpp:491
The upper or lower triangle Cholesky factor (square root) of a covariance matrix. ...
Definition: forward-class-declarations.hpp:559
Matrix(M &&) -> Matrix< Dimensions< index_dimension_of_v< M, 0 >>, Dimensions< index_dimension_of_v< M, 1 >>, passable_t< M >>
Deduce parameter types from a typed_matrix_nestable.
constexpr bool typed_matrix_nestable
Specifies a type that is nestable in a general typed matrix (e.g., matrix, mean, or euclidean_mean) ...
Definition: object-types.hpp:253
Similar to a Mean, but the coefficients are transformed into Euclidean space, based on their type...
Definition: EuclideanMean.hpp:29
The root namespace for OpenKalman.
Definition: basics.hpp:34
auto make_euclidean_mean(M &&arg)
Make a EuclideanMean from a typed_matrix_nestable, specifying the row coefficients.
Definition: EuclideanMean.hpp:320
EuclideanMean(V &&) -> EuclideanMean< vector_space_descriptor_of_t< V, 0 >, std::remove_reference_t< decltype(to_euclidean< vector_space_descriptor_of_t< V, 0 >>(nested_object(std::declval< V &&>())))>>
Deduce template parameters from a non-Euclidean-transformed typed matrix.
constexpr auto sqrt(const Arg &arg)
A constexpr alternative to std::sqrt.
Definition: sqrt.hpp:46
Covariance(M &&) -> Covariance< Dimensions< index_dimension_of_v< M, 0 >>, passable_t< M >>
Deduce Covariance type from a covariance_nestable.
A self-adjoint Covariance matrix.
Definition: Covariance.hpp:30
auto make_covariance(Arg &&arg)
Make a Covariance from a covariance_nestable, specifying the fixed_pattern.
Definition: Covariance.hpp:735
Mean(V &&) -> Mean< Dimensions< index_dimension_of_v< V, 0 >>, passable_t< V >>
Deduce template parameters from a typed_matrix_nestable, assuming untyped coordinates::pattern.
constexpr bool fixed_pattern
A coordinates::pattern for which the size is fixed at compile time.
Definition: fixed_pattern.hpp:47
constexpr bool covariance_nestable
T is an acceptable nested matrix for a covariance (including triangular_covariance).
Definition: object-types.hpp:237
SquareRootCovariance(M &&) -> SquareRootCovariance< Dimensions< index_dimension_of_v< M, 0 >>, passable_t< M >>
Deduce SquareRootCovariance type from a covariance_nestable.
A lower-left triangular matrix.
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:448