OpenKalman
RecursiveLeastSquaresTransform.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) 2017-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 
16 #ifndef OPENKALMAN_RLSTRANSFORM_HPP
17 #define OPENKALMAN_RLSTRANSFORM_HPP
18 
19 namespace OpenKalman
20 {
21  namespace oin = OpenKalman::internal;
22 
28  template<typename Scalar = double>
29  struct RecursiveLeastSquaresTransform : oin::TransformBase<RecursiveLeastSquaresTransform<Scalar>>
30  {
31  private:
32 
34 
35  public:
36 
37  explicit RecursiveLeastSquaresTransform(const Scalar lambda = 0.9995) : inv_lambda {1/lambda} {}
38 
39 
40  using Base::operator();
41 
42 
50 #ifdef __cpp_concepts
51  template<distribution InputDist, distribution ... NoiseDists> requires
52  (coordinates::compares_with<typename DistributionTraits<InputDist>::StaticDescriptor,
53  typename DistributionTraits<NoiseDists>::StaticDescriptor>and ...)
54 #else
55  template<typename InputDist, typename ... NoiseDists,
56  std::enable_if_t<(distribution<InputDist> and ... and distribution<NoiseDists>) and
57  (coordinates::compares_with<typename DistributionTraits<InputDist>::StaticDescriptor,
58  typename DistributionTraits<NoiseDists>::StaticDescriptor>and ...), int> = 0>
59 #endif
60  auto operator()(const InputDist& x, const NoiseDists& ...ns) const
61  {
62  const auto scaled_x = GaussianDistribution {mean_of(x), covariance_of(x) * inv_lambda};
63  return make_self_contained((scaled_x + ... + ns));
64  }
65 
66 
68 
69 
76 #ifdef __cpp_concepts
77  template<distribution InputDist, distribution ... NoiseDists> requires
78  (coordinates::compares_with<typename DistributionTraits<InputDist>::StaticDescriptor,
79  typename DistributionTraits<NoiseDists>::StaticDescriptor> and ...)
80 #else
81  template<typename InputDist, typename ... NoiseDists,
82  std::enable_if_t<(distribution<InputDist> and ... and distribution<NoiseDists>) and
83  (coordinates::compares_with<typename DistributionTraits<InputDist>::StaticDescriptor,
84  typename DistributionTraits<NoiseDists>::StaticDescriptor> and ...), int> = 0>
85 #endif
86  auto transform_with_cross_covariance(const InputDist& x, const NoiseDists& ...ns) const
87  {
88  auto scaled_cov = make_self_contained(covariance_of(x) * inv_lambda);
89  const auto scaled_x = GaussianDistribution {mean_of(x), scaled_cov};
90  auto y = make_self_contained((scaled_x + ... + ns));
91  auto cross = Matrix {scaled_cov};
92  return std::tuple {std::move(y), std::move(cross)};
93  }
94 
95  private:
96 
97  const Scalar inv_lambda;
98 
99  };
100 
101 }
102 
103 
104 #endif //OPENKALMAN_RLSTRANSFORM_HPP
auto transform_with_cross_covariance(const InputDist &x, const NoiseDists &...ns) const
Perform RLS transform, also returning the cross-covariance.
Definition: RecursiveLeastSquaresTransform.hpp:86
Definition: TransformBase.hpp:30
A Gaussian distribution, defined in terms of a Mean and a Covariance.
Definition: GaussianDistribution.hpp:42
The root namespace for OpenKalman.
Definition: basics.hpp:34
auto operator()(const InputDist &x, const NoiseDists &...ns) const
Apply the RLS transform on an input distribution.
Definition: RecursiveLeastSquaresTransform.hpp:60
constexpr bool distribution
T is a statistical distribution of any kind that is defined in OpenKalman.
Definition: object-types.hpp:193
Propagates a recursive least squares error distribution of parameters, with a forgetting factor λ...
Definition: RecursiveLeastSquaresTransform.hpp:29
Definition: basics.hpp:48
A matrix with typed rows and columns.
Definition: forward-class-declarations.hpp:448
auto transform_with_cross_covariance(const InputDist &x, const T &t, const Ts &...ts) const
Perform one or more consecutive transforms, also returning the cross-covariance.
Definition: TransformBase.hpp:80