pf
svol_apf.h
1 #ifndef SVOL_APF_H
2 #define SVOL_APF_H
3 
4 #include <Eigen/Dense>
5 #include "auxiliary_pf.h" // the auxiliary parrticle filter
6 #include "rv_eval.h" // for evaluating densities and pmfs
7 #include "rv_samp.h" // for sampling random numbers
8 
9 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
10 class svol_apf : public APF<nparts,dimx,dimy,resampT>
11 {
12 public:
13  using ssv = Eigen::Matrix<double, dimx, 1>;
14  using osv = Eigen::Matrix<double, dimy, 1>;
15 
16  // parameters
17  double m_phi;
18  double m_beta;
19  double m_sigma;
20 
21  // use this for samplign
22  UnivNormSampler m_stdNormSampler; // for sampling
23 
24  svol_apf(const double &phi, const double &beta, const double &sigma);
25 
26  // functions that we need to define
27  double logMuEv (const ssv &x1 );
28  ssv propMu (const ssv &xtm1 );
29  ssv q1Samp (const osv &y1);
30  ssv fSamp (const ssv &xtm1);
31  double logQ1Ev (const ssv &x1, const osv &y1);
32  double logGEv (const osv &yt, const ssv &xt);
33 
34 };
35 
36 
37 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
38 svol_apf<nparts,dimx,dimy,resampT>::svol_apf(const double &phi, const double &beta, const double &sigma)
40  , m_phi(phi), m_beta(beta), m_sigma(sigma)
41 {
42 }
43 
44 
45 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
47 {
48  return rveval::evalUnivNorm(x1(0),
49  0.0,
50  m_sigma/std::sqrt(1.0 - m_phi*m_phi),
51  true);
52 }
53 
54 
55 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
56 auto svol_apf<nparts,dimx,dimy,resampT>::propMu (const ssv &xtm1 ) -> ssv
57 {
58  return m_phi*xtm1;
59 }
60 
61 
62 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
63 auto svol_apf<nparts,dimx,dimy,resampT>::q1Samp (const osv &y1) -> ssv
64 {
65  ssv x1samp(1);
66  x1samp(0) = m_stdNormSampler.sample() * m_sigma / std::sqrt(1.-m_phi*m_phi);
67  return x1samp;
68 }
69 
70 
71 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
72 auto svol_apf<nparts,dimx,dimy,resampT>::fSamp (const ssv &xtm1) -> ssv
73 {
74  ssv xtsamp(1);
75  xtsamp(0) = m_phi * xtm1(0) + m_stdNormSampler.sample() * m_sigma;
76  return xtsamp;
77 }
78 
79 
80 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
81 double svol_apf<nparts,dimx,dimy,resampT>::logQ1Ev (const ssv &x1, const osv &y1)
82 {
83  return rveval::evalUnivNorm(x1(0), 0.0, m_sigma/std::sqrt(1.0 - m_phi*m_phi), true);
84 }
85 
86 
87 template<size_t nparts, size_t dimx, size_t dimy, typename resampT>
88 double svol_apf<nparts,dimx,dimy,resampT>::logGEv (const osv &yt, const ssv &xt)
89 {
90  return rveval::evalUnivNorm(yt(0),
91  0.0,
92  m_beta * std::exp(.5*xt(0)),
93  true);
94 }
95 
96 
97 
98 #endif // SVOL_APF_H
double logGEv(const osv &yt, const ssv &xt)
Evaluates the log of g.
Definition: svol_apf.h:88
A base-class for Auxiliary Particle Filtering. Filtering only, no smoothing.
Definition: auxiliary_pf.h:27
Definition: svol_apf.h:10
ssv fSamp(const ssv &xtm1)
Samples from f.
Definition: svol_apf.h:72
double logQ1Ev(const ssv &x1, const osv &y1)
Evaluates the log of q1.
Definition: svol_apf.h:81
all rv samplers must inherit from this.
double logMuEv(const ssv &x1)
Evaluates the log of mu.
Definition: svol_apf.h:46
A class that performs sampling from a univariate Normal distribution.
Definition: rv_samp.h:51
ssv propMu(const ssv &xtm1)
Evaluates the proposal distribution taking a Eigen::Matrix<double,dimx,1> from the previous time&#39;s st...
Definition: svol_apf.h:56
double sample()
Draws a random number.
ssv q1Samp(const osv &y1)
Samples from q1.
Definition: svol_apf.h:63