pf
svol_bs.h
1 #ifndef SVOL_BS_H
2 #define SVOL_BS_H
3 
4 
5 #include <Eigen/Dense>
6 
7 #include "bootstrap_filter.h" // the boostrap particle filter
8 #include "rv_samp.h" // for sampling random numbers
9 #include "rv_eval.h" // for evaluating densities and pmfs
10 
11 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
12 class svol_bs : public BSFilter<nparts, dimx, dimy, resampT>
13 {
14 public:
15  using ssv = Eigen::Matrix<double, dimx, 1>;
16  using osv = Eigen::Matrix<double, dimy, 1>;
17 
18  // parameters
19  double m_phi;
20  double m_beta;
21  double m_sigma;
22 
23  // use this for samplign
24  UnivNormSampler m_stdNormSampler; // for sampling
25 
26  // ctor
27  svol_bs(const double &phi, const double &beta, const double &sigma);
28 
29  // required functions defined by the state space model
30  double logQ1Ev(const ssv &x1, const osv &y1);
31  double logMuEv(const ssv &x1);
32  double logGEv(const osv &yt, const ssv &xt);
33  auto fSamp(const ssv &xtm1) -> ssv;
34  auto q1Samp(const osv &y1) -> ssv;
35 
36 };
37 
38 
39 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
40 svol_bs<nparts, dimx, dimy, resampT>::svol_bs(const double &phi, const double &beta, const double &sigma)
42  , m_phi(phi), m_beta(beta), m_sigma(sigma)
43 {
44 }
45 
46 
47 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
49 {
50  ssv x1samp(1);
51  x1samp(0) = m_stdNormSampler.sample() * m_sigma / std::sqrt(1.-m_phi*m_phi);
52  return x1samp;
53 }
54 
55 
56 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
57 auto svol_bs<nparts, dimx, dimy, resampT>::fSamp(const ssv &xtm1) -> ssv
58 {
59  ssv xtsamp(1);
60  xtsamp(0) = m_phi * xtm1(0) + m_stdNormSampler.sample() * m_sigma;
61  return xtsamp;
62 }
63 
64 
65 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
66 double svol_bs<nparts, dimx, dimy, resampT>::logGEv(const osv &yt, const ssv &xt)
67 {
68  return rveval::evalUnivNorm(yt(0),
69  0.0,
70  m_beta * std::exp(.5*xt(0)),
71  true);
72 }
73 
74 
75 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
77 {
78  return rveval::evalUnivNorm(x1(0),
79  0.0,
80  m_sigma/std::sqrt(1.0 - m_phi*m_phi),
81  true);
82 }
83 
84 
85 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
86 double svol_bs<nparts, dimx, dimy, resampT>::logQ1Ev(const ssv &x1samp, const osv &y1)
87 {
88  return rveval::evalUnivNorm(x1samp(0), 0.0, m_sigma/std::sqrt(1.0 - m_phi*m_phi), true);
89 }
90 
91 
92 #endif //SVOL_BS_H
bootstrap particle filter
auto fSamp(const ssv &xtm1) -> ssv
Sample from the state transition distribution.
Definition: svol_bs.h:57
all rv samplers must inherit from this.
auto q1Samp(const osv &y1) -> ssv
Samples from time 1 proposal.
Definition: svol_bs.h:48
A class that performs sampling from a univariate Normal distribution.
Definition: rv_samp.h:51
double sample()
Draws a random number.
double logMuEv(const ssv &x1)
Calculate muEv or logmuEv.
Definition: svol_bs.h:76
Definition: svol_bs.h:12
A base class for the boostrap particle filter.
Definition: bootstrap_filter.h:17
double logGEv(const osv &yt, const ssv &xt)
Calculate gEv or logGEv.
Definition: svol_bs.h:66
double logQ1Ev(const ssv &x1, const osv &y1)
Calculate q1Ev or log q1Ev.
Definition: svol_bs.h:86