ssmkit  master-68aed98
recursive_bayesian_base.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include <algorithm>
5 #include <tuple>
6 
7 namespace ssmkit {
8 namespace filter {
9 
10 template <class TFilter>
12  public:
13  template <class TMeasurement, class... TArgs>
14  decltype(auto) step(const TMeasurement &measurement, const TArgs &... args) {
15  static_cast<TFilter *>(this)->predict();
16  return static_cast<TFilter *>(this)->correct(measurement);
17  }
18 
19  template <class TMeasurement, class TControl = std::tuple<>>
20  decltype(auto)
21  filter(const std::vector<TMeasurement> &measurements,
22  const std::vector<TControl> &controls = std::vector<std::tuple<>>()) {
23 
24  using TState = decltype(step(measurements.at(0)));
25  std::vector<TState> state_seq(measurements.size() + 1);
26  state_seq[0] = static_cast<TFilter *>(this)->initialize();
27  auto pm = measurements.cbegin();
28 
29  if (controls.size() == 0) {
30  std::generate_n(state_seq.begin() + 1, state_seq.size() - 1,
31  [this, &pm]() { return step(*(pm++)); });
32  } else {
33  // else what?
34  }
35 
36  return state_seq;
37 
38  }
39 
40 };
41 
42 } // namespace filter
43 } // namespace ssmkit
decltype(auto) step(const TMeasurement &measurement, const TArgs &...args)
decltype(auto) filter(const std::vector< TMeasurement > &measurements, const std::vector< TControl > &controls=std::vector< std::tuple<>>())