pf
acv_bs.h
1 #ifndef ACV_BS_H
2 #define ACV_BS_H
3 
4 
5 #include <Eigen/Dense>
6 
7 #include <pf/bootstrap_filter.h> // the boostrap particle filter
8 #include <pf/rv_samp.h> // for sampling random numbers
9 #include <pf/rv_eval.h> // for evaluating densities and pmfs
10 
11 
12 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
13 class acv_bs : public BSFilter<nparts, dimx, dimy, resampT, float_t>
14 {
15 public:
16  using ssv = Eigen::Matrix<float_t, dimx, 1>;
17  using osv = Eigen::Matrix<float_t, dimy, 1>;
18  using ssm = Eigen::Matrix<float_t, dimx, dimx>;
19  using osm = Eigen::Matrix<float_t, dimy, dimy>;
20  using esm = Eigen::Matrix<float_t, dimy,dimx>; // emission sized matrix
21 
22  // parameters that need to be stored
23  float_t m_var_s0;
24  float_t m_var_u0;
25  float_t m_nu_y;
26 
27  // higher-level parameters that need to be stored
28  ssm m_A;
29  esm m_B;
30  osm m_obs_shape_mat;
31 
32  // use these objects for sampling
33  rvsamp::UnivNormSampler<float_t> m_stdNormSampler;
34  rvsamp::UnivStudTSampler<float_t> m_t_sampler;
35  rvsamp::MVNSampler<dimx,float_t> m_state_error_sampler;
36 
37  // the constructor
38  acv_bs(float_t var_s0, float_t var_u0, float_t var_s, float_t var_u, float_t scale_y, float_t nu_y, float_t Delta);
39 
40  // methods that are required by this algorithm's abstract base class (template)
41  float_t logQ1Ev(const ssv &x1, const osv &y1);
42  float_t logMuEv(const ssv &x1);
43  float_t logGEv(const osv &yt, const ssv &xt);
44  auto fSamp(const ssv &xtm1) -> ssv;
45  auto q1Samp(const osv &y1) -> ssv;
46 };
47 
48 
49 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
50 acv_bs<nparts, dimx, dimy, resampT, float_t>::acv_bs( float_t var_s0, float_t var_u0, float_t var_s, float_t var_u, float_t scale_y, float_t nu_y, float_t Delta)
51  : m_var_s0(var_s0), m_var_u0(var_u0), m_nu_y(nu_y)
52  , m_A(ssm::Identity()), m_B(esm::Zero()), m_obs_shape_mat(scale_y * osm::Identity())
53  , m_t_sampler(nu_y), m_state_error_sampler(ssv::Zero(), ssm::Identity())
54 {
55  ssm state_error_cov(ssm::Zero());
56  state_error_cov(0,0) = var_s;
57  state_error_cov(1,1) = var_u;
58  state_error_cov(2,2) = var_s;
59  state_error_cov(3,3) = var_u;
60  m_state_error_sampler.setCovar(state_error_cov);
61 
62  m_A(0,1) = Delta;
63  m_A(2,3) = Delta;
64 
65  m_B(0,0) = 1.0;
66  m_B(1,2) = 1.0;
67 }
68 
69 
70 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
72 {
73  ssv x1samp;
74  x1samp(0) = m_stdNormSampler.sample() * std::sqrt(m_var_s0);
75  x1samp(1) = m_stdNormSampler.sample() * std::sqrt(m_var_u0);
76  x1samp(2) = m_stdNormSampler.sample() * std::sqrt(m_var_s0);
77  x1samp(3) = m_stdNormSampler.sample() * std::sqrt(m_var_u0);
78  return x1samp;
79 }
80 
81 
82 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
83 auto acv_bs<nparts, dimx, dimy, resampT, float_t>::fSamp(const ssv &xtm1) -> ssv
84 {
85  return m_A * xtm1 + m_state_error_sampler.sample();
86 }
87 
88 
89 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
90 float_t acv_bs<nparts, dimx, dimy, resampT, float_t>::logGEv(const osv &yt, const ssv &xt)
91 {
92  return rveval::evalMultivT<dimy,float_t>(yt, m_B * xt, m_obs_shape_mat, m_nu_y, true);
93 }
94 
95 
96 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
98 {
99  return rveval::evalUnivNorm<float_t>(x1(0),0.0,std::sqrt(m_var_s0), true) +
100  rveval::evalUnivNorm<float_t>(x1(1),0.0,std::sqrt(m_var_u0), true) +
101  rveval::evalUnivNorm<float_t>(x1(2),0.0,std::sqrt(m_var_s0), true) +
102  rveval::evalUnivNorm<float_t>(x1(3),0.0,std::sqrt(m_var_u0), true);
103 }
104 
105 
106 template<size_t nparts, size_t dimx, size_t dimy, typename resampT, typename float_t>
107 float_t acv_bs<nparts, dimx, dimy, resampT, float_t>::logQ1Ev(const ssv &x1samp, const osv &y1)
108 {
109  return rveval::evalUnivNorm<float_t>(x1samp(0),0.0,std::sqrt(m_var_s0), true) +
110  rveval::evalUnivNorm<float_t>(x1samp(1),0.0,std::sqrt(m_var_u0), true) +
111  rveval::evalUnivNorm<float_t>(x1samp(2),0.0,std::sqrt(m_var_s0), true) +
112  rveval::evalUnivNorm<float_t>(x1samp(3),0.0,std::sqrt(m_var_u0), true);
113 }
114 
115 
116 #endif //ACV_BS_H
bootstrap_filter.h
bootstrap particle filter
acv_bs
Definition: acv_bs.h:13
rv_samp.h
all rv samplers must inherit from this.