pf
cf_filters.h
Go to the documentation of this file.
1 #ifndef CF_FILTERS_H
2 #define CF_FILTERS_H
3 
4 
5 #ifdef DROPPINGTHISINRPACKAGE
6  #include <RcppEigen.h>
7  // [[Rcpp::depends(RcppEigen)]]
8 #else
9  #include <Eigen/Dense>
10 #endif
11 
12 #include <math.h> /* log */
13 
14 #include "rv_eval.h"
15 #include "pf_base.h"
16 
17 namespace pf {
18 
19 namespace filters {
20 
21 
22 
23 
25 
31 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug = false>
32 class kalman : public bases::cf_filter<dimstate, dimobs, float_t> {
33 
34 public:
35 
37  using ssv = Eigen::Matrix<float_t,dimstate,1>;
38 
40  using osv = Eigen::Matrix<float_t,dimobs,1>;
41 
43  using isv = Eigen::Matrix<float_t,diminput,1>;
44 
46  using ssMat = Eigen::Matrix<float_t,dimstate,dimstate>;
47 
49  using osMat = Eigen::Matrix<float_t,dimobs,dimobs>;
50 
52  using siMat = Eigen::Matrix<float_t,dimstate,diminput>;
53 
55  using oiMat = Eigen::Matrix<float_t,dimobs,diminput>;
56 
58  using obsStateSizeMat = Eigen::Matrix<float_t,dimobs,dimstate>;
59 
61  using stateObsSizeMat = Eigen::Matrix<float_t,dimstate,dimobs>;
62 
63 
65 
68  kalman();
69 
70 
72 
75  kalman(const ssv &initStateMean, const ssMat &initStateVar);
76 
77 
81  virtual ~kalman();
82 
83 
88  float_t getLogCondLike() const;
89 
90 
95  ssv getFiltMean() const;
96 
97 
102  ssMat getFiltVar() const;
103 
104 
109  osv getPredYMean(const ssMat &stateTrans,
110  const obsStateSizeMat &obsMat,
111  const siMat &stateInptAffector,
112  const oiMat &obsInptAffector,
113  const isv &inputData) const;
114 
115 
120  osMat getPredYVar(const ssMat &stateTrans,
121  const ssMat &cholStateVar,
122  const obsStateSizeMat &obsMat,
123  const osMat &cholObsVar) const;
124 
125 
127 
137  void update(const osv &yt,
138  const ssMat &stateTrans,
139  const ssMat &cholStateVar,
140  const siMat &stateInptAffector,
141  const isv &inputData,
142  const obsStateSizeMat &obsMat,
143  const oiMat &obsInptAffector,
144  const osMat &cholObsVar);
145 
146 private:
147 
150 
153 
156 
159 
162 
164  bool m_fresh;
165 
167  const float_t m_pi;
168 
180  void updatePrior(const ssMat &stateTransMat,
181  const ssMat &cholStateVar,
182  const siMat &stateInptAffector,
183  const isv &inputData);
184 
185 
194  void updatePosterior(const osv &yt,
195  const obsStateSizeMat &obsMat,
196  const oiMat &obsInptAffector,
197  const isv &inputData,
198  const osMat &cholObsVar);
199 };
200 
201 
202 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
204  : bases::cf_filter<dimstate,dimobs,float_t>()
205  , m_predMean(ssv::Zero())
206  , m_predVar(ssMat::Zero())
207  , m_fresh(true)
208  , m_pi(3.14159265358979)
209 {
210 }
211 
212 
213 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
214 kalman<dimstate,dimobs,diminput,float_t,debug>::kalman(const ssv &initStateMean, const ssMat &initStateVar)
215  : bases::cf_filter<dimstate,dimobs,float_t>()
216  , m_predMean(initStateMean)
217  , m_predVar(initStateVar)
218  , m_fresh(true)
219  , m_pi(3.14159265358979)
220 {
221 }
222 
223 
224 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
226 
227 
228 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
230  const ssMat &cholStateVar,
231  const siMat &stateInptAffector,
232  const isv &inputData)
233 {
234  ssMat Q = cholStateVar.transpose() * cholStateVar;
235  m_predMean = stateTransMat * m_filtMean + stateInptAffector * inputData;
236  m_predVar = stateTransMat * m_filtVar * stateTransMat.transpose() + Q;
237 
238 }
239 
240 
241 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
243  const obsStateSizeMat &obsMat,
244  const oiMat &obsInptAffector,
245  const isv &inputData,
246  const osMat &cholObsVar)
247 {
248  osMat R = cholObsVar.transpose() * cholObsVar; //obs
249  osMat sigma = obsMat * m_predVar * obsMat.transpose() + R; // pred or APA' + R
250  osMat symSigma = (sigma.transpose() + sigma )/2.0; // ensure symmetric
251  osMat siginv = symSigma.inverse();
252  stateObsSizeMat K = m_predVar * obsMat.transpose() * siginv;
253  osv obsPred = obsMat * m_predMean + obsInptAffector * inputData;
254  osv innov = yt - obsPred;
255  m_filtMean = m_predMean + K*innov;
256  m_filtVar = m_predVar - K * obsMat * m_predVar;
257 
258  // conditional likelihood stuff
259  osMat quadForm = innov.transpose() * siginv * innov;
260  osMat cholSig ( sigma.llt().matrixL() );
261  float_t logDet = 2.0*cholSig.diagonal().array().log().sum();
262  m_lastLogCondLike = -.5*innov.rows()*log(2*m_pi) - .5*logDet - .5*quadForm(0,0);
263 
264  #ifndef DROPPINGTHISINRPACKAGE
265  if constexpr(debug)
266  std::cout << "transposed innovation: " << innov.transpose() << ", quadratic formula: " << quadForm(0,0) << ", logDet: " << logDet << ", log cond like: " << m_lastLogCondLike << "\n";
267  #endif
268 
269 }
270 
271 
272 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
274 {
275  return m_lastLogCondLike;
276 }
277 
278 
279 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
281 {
282  return m_filtMean;
283 }
284 
285 
286 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
288 {
289  return m_filtVar;
290 }
291 
292 
293 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
295  const ssMat &stateTrans,
296  const ssMat &cholStateVar,
297  const siMat &stateInptAffector,
298  const isv &inData,
299  const obsStateSizeMat &obsMat,
300  const oiMat &obsInptAffector,
301  const osMat &cholObsVar)
302 {
303  // this assumes that we have latent states x_{1:...} and y_{1:...} (NOT x_{0:...})
304  // for that reason, we don't have to run updatePrior() on the first iteration
305  if (m_fresh == true)
306  {
307  this->updatePosterior(yt, obsMat, obsInptAffector, inData, cholObsVar);
308  m_fresh = false;
309  }else
310  {
311  this->updatePrior(stateTrans, cholStateVar, stateInptAffector, inData);
312  this->updatePosterior(yt, obsMat, obsInptAffector, inData, cholObsVar);
313  }
314 }
315 
316 
317 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
319  const ssMat &stateTrans,
320  const obsStateSizeMat &obsMat,
321  const siMat &stateInptAffector,
322  const oiMat &obsInptAffector,
323  const isv &futureInputData) const -> osv
324 {
325  return obsMat * (stateTrans * m_filtMean + stateInptAffector * futureInputData) + obsInptAffector * futureInputData;
326 }
327 
328 
329 template<size_t dimstate, size_t dimobs, size_t diminput, typename float_t, bool debug>
331  const ssMat &stateTrans,
332  const ssMat &cholStateVar,
333  const obsStateSizeMat &obsMat,
334  const osMat &cholObsVar) const -> osMat
335 {
336  return obsMat * (stateTrans * m_filtVar * stateTrans.transpose() + cholStateVar.transpose()*cholStateVar) * obsMat.transpose() + cholObsVar.transpose() * cholObsVar;
337 }
338 
339 
341 
347 template<size_t dimstate, size_t dimobs, typename float_t, bool debug = false>
348 class hmm : public bases::cf_filter<dimstate,dimobs,float_t>
349 {
350 
351 public:
352 
354  using ssv = Eigen::Matrix<float_t,dimstate,1>;
355 
357  using osv = Eigen::Matrix<float_t,dimobs,1>;
358 
360  using ssMat = Eigen::Matrix<float_t,dimstate,dimstate>;
361 
362 
364 
367  hmm();
368 
369 
371 
376  hmm(const ssv &initStateDistrLogProbs, const ssMat &transMatLogProbs);
377 
378 
382  virtual ~hmm();
383 
384 
386 
389  float_t getLogCondLike() const;
390 
391 
393 
397  ssv getFilterVecLogProbs() const;
398 
399 
401 
405  void update(const ssv &logCondDensVec);
406 
407 
409 
414  float_t log_sum_exp(const ssv& logProbVec);
415 
416 
418 
423  ssv log_product(const ssMat& logTransMat, const ssv& logProbVec);
424 
425 private:
426 
429 
432 
435 
437  bool m_fresh;
438 
439 };
440 
441 
442 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
444  : bases::cf_filter<dimstate,dimobs,float_t>::cf_filter()
445  , m_lastLogCondLike(0.0)
446  , m_fresh(true)
447 {
448 }
449 
450 
451 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
452 hmm<dimstate,dimobs,float_t,debug>::hmm(const ssv &initStateDistrLogProbs, const ssMat &transMatLogProbs)
453  : bases::cf_filter<dimstate,dimobs,float_t>()
454  , m_filtVecLogProbs(initStateDistrLogProbs)
455  , m_transMatLogProbsTranspose(transMatLogProbs.transpose())
456  , m_lastLogCondLike(0.0)
457  , m_fresh(true)
458 {
459  // check initial probabilities
460  if( std::abs(this->log_sum_exp(m_filtVecLogProbs)) > .001)
461  throw std::invalid_argument("Initial probabilities must sum to 1.");
462  if ( m_filtVecLogProbs.maxCoeff() > 0.0 )
463  throw std::invalid_argument("Initial probabilities cannot be greater than 1.0.");
464 
465  // check transition matrix (with log probs)
466  if( m_transMatLogProbsTranspose.maxCoeff() > 0.0)
467  throw std::invalid_argument("Initial transition probabilities cannot be greater than 1.");
468  for(size_t icol = 0; icol < dimstate; ++icol){
469  if ( std::abs(this->log_sum_exp(m_transMatLogProbsTranspose.col(icol))) > .001)
470  throw std::invalid_argument("Initial transition probabilities must sum to 1.");
471  }
472 }
473 
474 
475 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
477 
478 
479 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
481 {
482  return m_lastLogCondLike;
483 }
484 
485 
486 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
488 {
489  return m_filtVecLogProbs;
490 }
491 
492 
493 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
495 {
496 
497  float_t m = logProbVec.maxCoeff();
498  return std::log( (logProbVec.array() - m).exp().sum() ) + m;
499 }
500 
501 
502 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
503 auto hmm<dimstate,dimobs,float_t,debug>::log_product(const ssMat& logTransMat, const ssv& logProbVec) -> ssv
504 {
505  ssv col_sum;
506  float_t m = logTransMat.maxCoeff();
507  col_sum.fill(m);
508  for(size_t ic = 0; ic < dimstate; ++ic){
509  col_sum = col_sum + (logTransMat.col(ic).array() + logProbVec(ic) - m).exp().matrix();
510  }
511  return col_sum;
512 }
513 
514 
515 template<size_t dimstate, size_t dimobs, typename float_t, bool debug>
517 {
518  if( !m_fresh) { // has seen data before
519  m_filtVecLogProbs = this->log_product(m_transMatLogProbsTranspose, m_filtVecLogProbs); // now log p(x_t |y_{1:t-1})
520  m_filtVecLogProbs = m_filtVecLogProbs + logCondDensVec ; // now log p(y_t,x_t|y_{1:t-1})
521  m_lastLogCondLike = this->log_sum_exp(m_filtVecLogProbs);
522 
523  #ifndef DROPPINGTHISINRPACKAGE
524  if constexpr(debug)
525  std::cout << "logConDensVec sum " << logCondDensVec.sum() << ", p(y_t,x_t|y_{1:t-1}) sum: " << m_filtVecLogProbs.sum() << ", lastCondlike: " << m_lastLogCondLike << "\n";
526  #endif
527 
528  m_filtVecLogProbs = (m_filtVecLogProbs.array() - m_lastLogCondLike).matrix(); // now log p(x_t|y_{1:t})
529  }
530  else // hasn't seen data before and so filtVec is just time 1 state prior
531  {
532  m_filtVecLogProbs = m_filtVecLogProbs + logCondDensVec; // now it's log p(x_1, y_1)
533  m_lastLogCondLike = this->log_sum_exp(m_filtVecLogProbs); // log p(y_1)
534 
535 
536  #ifndef DROPPINGTHISINRPACKAGE
537  if constexpr(debug)
538  std::cout << "logConDensVecSum " << logCondDensVec.sum() << ", log p(x1,y1) sum: " << m_filtVecLogProbs.sum() << ", lastLogCondlike: " << m_lastLogCondLike << "\n";
539  #endif
540 
541  m_filtVecLogProbs = (m_filtVecLogProbs.array() - m_lastLogCondLike).matrix();
542  m_fresh = false;
543  }
544 }
545 
546 
547 
548 
549 
550 
551 
552 
554 
560 template<size_t dim_pred, typename float_t>
561 class gamFilter : public bases::cf_filter<1,1,float_t>
562 {
563 
564 public:
565 
567  using psv = Eigen::Matrix<float_t,dim_pred,1>;
568 
570  using tsv = Eigen::Matrix<float_t,2,1>;
571 
572 
574 
577  //gamFilter();
578 
579 
581 
586  gamFilter(const float_t &nOneTilde, const float_t &dOneTilde);
587 
588 
592  virtual ~gamFilter();
593 
594 
596 
599  float_t getLogCondLike() const;
600 
601 
603 
607  tsv getFilterVec() const;
608 
609 
611 
619  void update(const float_t& yt, const psv &xt, const psv& beta, const float_t& sigmaSquared, const float_t& delta);
620 
621 
622 private:
623 
626 
629 
631  bool m_fresh;
632 
633 };
634 
635 
636 //template<typename dim_pred, typename float_t>
637 //gamFilter<dim_pred,float_t>::gamFilter()
638 // : cf_filter<1,1,float_t>::cf_filter()
639 // , m_filtVec(tsv::Zero())
640 // , m_lastCondLike(0.0)
641 // , m_fresh(true)
642 //{
643 //}
644 
645 
646 template<size_t dim_pred, typename float_t>
647 gamFilter<dim_pred,float_t>::gamFilter(const float_t &nOneTilde, const float_t &dOneTilde)
648  : bases::cf_filter<1,1,float_t>()
649  , m_lastLogCondLike(0.0)
650  , m_fresh(true)
651 {
652  m_filtVec(0) = nOneTilde;
653  m_filtVec(1) = dOneTilde;
654 }
655 
656 
657 template<size_t dim_pred, typename float_t>
659 
660 
661 template<size_t dim_pred, typename float_t>
663 {
664  return m_lastLogCondLike;
665 }
666 
667 
668 template<size_t dim_pred, typename float_t>
670 {
671  return m_filtVec;
672 }
673 
674 
675 
676 template<size_t dim_pred, typename float_t>
677 void gamFilter<dim_pred,float_t>::update(const float_t& yt, const psv &xt, const psv& beta, const float_t& sigmaSquared, const float_t& delta)
678 {
679 
680  if(sigmaSquared <= 0 || delta <= 0)
681  throw std::invalid_argument("ME: both sigma squared and delta have to be positive.\n");
682 
683  if (m_fresh) // hasn't seen data before and so filtVec is just time 1 state prior
684  {
685  float_t tmpScale = std::sqrt(sigmaSquared*m_filtVec(1)/m_filtVec(0));
686  m_lastLogCondLike = rveval::evalScaledT<float_t>(yt, xt.dot(beta), tmpScale, m_filtVec(0), true);
687  m_filtVec(0) += 1;
688  m_filtVec(1) += (yt - xt.dot(beta))*(yt - xt.dot(beta))/sigmaSquared;
689  m_fresh = false;
690 
691  } else { // has seen data before
692 
693  m_filtVec(0) *= delta;
694  m_filtVec(1) *= delta;
695  float_t tmpScale = std::sqrt(sigmaSquared*m_filtVec(1)/m_filtVec(0));
696  m_lastLogCondLike = rveval::evalScaledT<float_t>(yt, xt.dot(beta), tmpScale, m_filtVec(0), true);
697  m_filtVec(0) += 1;
698  m_filtVec(1) += (yt - xt.dot(beta))*(yt - xt.dot(beta))/sigmaSquared;
699  }
700 }
701 
702 
704 // it's for a multivariate response.
711 template<size_t dim_obs, size_t dim_pred, typename float_t>
712 class multivGamFilter : public bases::cf_filter<1,dim_obs,float_t>
713 {
714 
715 public:
716 
718  using psv = Eigen::Matrix<float_t,dim_pred,1>;
719 
721  using bsm = Eigen::Matrix<float_t,dim_obs, dim_pred>;
722 
724  using tsv = Eigen::Matrix<float_t,2,1>;
725 
727  using osv = Eigen::Matrix<float_t, dim_obs, 1>;
728 
730  using osm = Eigen::Matrix<float_t, dim_obs, dim_obs>;
731 
732 
734 
739  multivGamFilter(const float_t &nOneTilde, const float_t &dOneTilde);
740 
741 
745  virtual ~multivGamFilter();
746 
747 
749 
752  float_t getLogCondLike() const;
753 
754 
756 
760  tsv getFilterVec() const;
761 
762 
764 
772  void update(const osv& yt, const psv &xt, const bsm& B, const osm& Sigma, const float_t& delta);
773 
774 
776 
784  osv getFcastMean(const psv &xtp1, const bsm& B, const osm& Sigma, const float_t& delta);
785 
786 
788 
796  osm getFcastCov(const psv &xtp1, const bsm& B, const osm& Sigma, const float_t& delta);
797 
798 
799 private:
800 
803 
806 
808  bool m_fresh;
809 
810 };
811 
812 
813 template<size_t dim_obs, size_t dim_pred, typename float_t>
814 multivGamFilter<dim_obs,dim_pred,float_t>::multivGamFilter(const float_t &nOneTilde, const float_t &dOneTilde)
815  : bases::cf_filter<1,dim_obs,float_t>()
816  , m_lastLogCondLike(0.0)
817  , m_fresh(true)
818 {
819  m_filtVec(0) = nOneTilde;
820  m_filtVec(1) = dOneTilde;
821 }
822 
823 
824 template<size_t dim_obs, size_t dim_pred, typename float_t>
826 
827 
828 template<size_t dim_obs, size_t dim_pred, typename float_t>
830 {
831  return m_lastLogCondLike;
832 }
833 
834 
835 template<size_t dim_obs, size_t dim_pred, typename float_t>
837 {
838  return m_filtVec;
839 }
840 
841 
842 
843 template<size_t dim_obs, size_t dim_pred, typename float_t>
844 void multivGamFilter<dim_obs,dim_pred,float_t>::update(const osv& yt, const psv &xt, const bsm& B, const osm& Sigma, const float_t& delta)
845 {
846 
847  // TODO: doesn't check that Sigma is positive definite or symmetric!
848  if(delta <= 0)
849  throw std::invalid_argument("ME: delta has to be positive (you're not even checking Sigma).\n");
850 
851  if (m_fresh) // hasn't seen data before and so filtVec is just time 1 state prior
852  {
853  osm scaleMat = Sigma * m_filtVec(1)/m_filtVec(0);
854  osv modeVec = B*xt;
855  m_lastLogCondLike = rveval::evalMultivT<dim_obs,float_t>(yt, modeVec, scaleMat, m_filtVec(0), true);
856  m_filtVec(0) += 1;
857  m_filtVec(1) += (Sigma.ldlt().solve(yt - modeVec)).squaredNorm();
858  m_fresh = false;
859 
860  } else { // has seen data before
861 
862  m_filtVec(0) *= delta;
863  m_filtVec(1) *= delta;
864 
865  osm scaleMat = Sigma * m_filtVec(1)/m_filtVec(0);
866  osv modeVec = B*xt;
867  m_lastLogCondLike = rveval::evalMultivT<dim_obs,float_t>(yt, modeVec, scaleMat, m_filtVec(0), true);
868 
869  m_filtVec(0) += 1;
870  m_filtVec(1) += (Sigma.ldlt().solve(yt - modeVec)).squaredNorm();
871  }
872 }
873 
874 
875 template<size_t dim_obs, size_t dim_pred, typename float_t>
876 auto multivGamFilter<dim_obs,dim_pred,float_t>::getFcastMean(const psv &xtp1, const bsm& B, const osm& Sigma, const float_t& delta) -> osv
877 {
878  if(delta*m_filtVec(0) > 1.0)
879  return B*xtp1;
880 }
881 
882 
883 template<size_t dim_obs, size_t dim_pred, typename float_t>
884 auto multivGamFilter<dim_obs,dim_pred,float_t>::getFcastCov(const psv &xtp1, const bsm& B, const osm& Sigma, const float_t& delta) -> osm
885 {
886  if(delta * m_filtVec(0) > 2.0)
887  return Sigma * delta * m_filtVec(1) / (delta * m_filtVec(0) - 2.0);
888 }
889 
890 } // namespace filters
891 
892 } //namespace pf
893 
894 #endif //CF_FILTERS_H
pf::filters::multivGamFilter::osm
Eigen::Matrix< float_t, dim_obs, dim_obs > osm
"observation size matrix"
Definition: cf_filters.h:730
pf::filters::kalman::getPredYMean
osv getPredYMean(const ssMat &stateTrans, const obsStateSizeMat &obsMat, const siMat &stateInptAffector, const oiMat &obsInptAffector, const isv &inputData) const
get the one-step-ahead point forecast for y
Definition: cf_filters.h:318
pf::filters::hmm::hmm
hmm()
Default constructor.
Definition: cf_filters.h:443
pf::filters::kalman::isv
Eigen::Matrix< float_t, diminput, 1 > isv
Definition: cf_filters.h:43
pf::filters::gamFilter::gamFilter
gamFilter(const float_t &nOneTilde, const float_t &dOneTilde)
Default constructor.
Definition: cf_filters.h:647
pf::filters::multivGamFilter::update
void update(const osv &yt, const psv &xt, const bsm &B, const osm &Sigma, const float_t &delta)
Perform a filtering update.
Definition: cf_filters.h:844
pf::filters::hmm::ssMat
Eigen::Matrix< float_t, dimstate, dimstate > ssMat
"state size matrix"
Definition: cf_filters.h:360
pf::filters::hmm::m_filtVecLogProbs
ssv m_filtVecLogProbs
filter vector
Definition: cf_filters.h:428
pf::filters::multivGamFilter::osv
Eigen::Matrix< float_t, dim_obs, 1 > osv
"observation size vector"
Definition: cf_filters.h:727
pf::filters::kalman::m_filtMean
ssv m_filtMean
filter mean
Definition: cf_filters.h:152
pf::filters::kalman::m_lastLogCondLike
float_t m_lastLogCondLike
latest log conditional likelihood
Definition: cf_filters.h:161
pf::filters::multivGamFilter::getFcastMean
osv getFcastMean(const psv &xtp1, const bsm &B, const osm &Sigma, const float_t &delta)
Get the forecast mean (assuming filtering has been performed already)
Definition: cf_filters.h:876
pf::filters::gamFilter::m_filtVec
tsv m_filtVec
filter vector (shape and rate)
Definition: cf_filters.h:625
pf::filters::gamFilter::m_fresh
bool m_fresh
has data been observed?
Definition: cf_filters.h:631
pf::filters::multivGamFilter::~multivGamFilter
virtual ~multivGamFilter()
The (virtual) desuctor.
Definition: cf_filters.h:825
pf::filters::kalman::ssMat
Eigen::Matrix< float_t, dimstate, dimstate > ssMat
Definition: cf_filters.h:46
pf::filters::hmm
A class template for HMM filtering.
Definition: cf_filters.h:348
pf::filters::hmm::~hmm
virtual ~hmm()
The (virtual) desuctor.
Definition: cf_filters.h:476
pf_base.h
All non Rao-Blackwellized particle filters without covariates inherit from this.
pf::filters::gamFilter
A class template for Gamma filtering.
Definition: cf_filters.h:561
pf::filters::kalman::getLogCondLike
float_t getLogCondLike() const
returns the log of the latest conditional likelihood.
Definition: cf_filters.h:273
pf::filters::kalman::update
void update(const osv &yt, const ssMat &stateTrans, const ssMat &cholStateVar, const siMat &stateInptAffector, const isv &inputData, const obsStateSizeMat &obsMat, const oiMat &obsInptAffector, const osMat &cholObsVar)
Perform a Kalman filter predict-and-update.
Definition: cf_filters.h:294
pf::filters::kalman::obsStateSizeMat
Eigen::Matrix< float_t, dimobs, dimstate > obsStateSizeMat
Definition: cf_filters.h:58
pf::filters::kalman::siMat
Eigen::Matrix< float_t, dimstate, diminput > siMat
Definition: cf_filters.h:52
pf::filters::gamFilter::getFilterVec
tsv getFilterVec() const
Get the current filter vector.
Definition: cf_filters.h:669
pf::filters::kalman::osv
Eigen::Matrix< float_t, dimobs, 1 > osv
Definition: cf_filters.h:40
pf::filters::gamFilter::m_lastLogCondLike
float_t m_lastLogCondLike
last log of the conditional likelihood
Definition: cf_filters.h:628
pf::filters::gamFilter::~gamFilter
virtual ~gamFilter()
The (virtual) desuctor.
Definition: cf_filters.h:658
pf::filters::hmm::osv
Eigen::Matrix< float_t, dimobs, 1 > osv
"observation size vector"
Definition: cf_filters.h:357
pf::filters::kalman::ssv
Eigen::Matrix< float_t, dimstate, 1 > ssv
Definition: cf_filters.h:37
pf::filters::kalman::oiMat
Eigen::Matrix< float_t, dimobs, diminput > oiMat
Definition: cf_filters.h:55
pf::filters::hmm::ssv
Eigen::Matrix< float_t, dimstate, 1 > ssv
"state size vector"
Definition: cf_filters.h:354
pf::filters::gamFilter::tsv
Eigen::Matrix< float_t, 2, 1 > tsv
"two by 1 vector"
Definition: cf_filters.h:570
pf::filters::kalman::m_predMean
ssv m_predMean
predictive state mean
Definition: cf_filters.h:149
pf::filters::multivGamFilter::getFcastCov
osm getFcastCov(const psv &xtp1, const bsm &B, const osm &Sigma, const float_t &delta)
Get the forecast covariance matrix (assuming filtering has been performed already)
Definition: cf_filters.h:884
pf::filters::kalman::getFiltMean
ssv getFiltMean() const
Get the current filter mean.
Definition: cf_filters.h:280
pf::filters::kalman::updatePosterior
void updatePosterior(const osv &yt, const obsStateSizeMat &obsMat, const oiMat &obsInptAffector, const isv &inputData, const osMat &cholObsVar)
Turns prediction into new filtering distribution.
Definition: cf_filters.h:242
pf::filters::kalman::getPredYVar
osMat getPredYVar(const ssMat &stateTrans, const ssMat &cholStateVar, const obsStateSizeMat &obsMat, const osMat &cholObsVar) const
get the one-step-ahead forecast variance
Definition: cf_filters.h:330
pf::filters::kalman::updatePrior
void updatePrior(const ssMat &stateTransMat, const ssMat &cholStateVar, const siMat &stateInptAffector, const isv &inputData)
Predicts the next state.
Definition: cf_filters.h:229
pf::filters::kalman::kalman
kalman()
Default constructor.
Definition: cf_filters.h:203
pf::filters::multivGamFilter::getFilterVec
tsv getFilterVec() const
Get the current filter vector.
Definition: cf_filters.h:836
pf::filters::multivGamFilter::tsv
Eigen::Matrix< float_t, 2, 1 > tsv
"two by 1 vector" to store size and shapes of gamma distributions
Definition: cf_filters.h:724
pf::filters::hmm::log_product
ssv log_product(const ssMat &logTransMat, const ssv &logProbVec)
Definition: cf_filters.h:503
pf::filters::kalman
A class template for Kalman filtering.
Definition: cf_filters.h:32
pf::filters::multivGamFilter::m_lastLogCondLike
float_t m_lastLogCondLike
last log of the conditional likelihood
Definition: cf_filters.h:805
pf::filters::kalman::~kalman
virtual ~kalman()
The (virtual) destructor.
Definition: cf_filters.h:225
pf::filters::hmm::getFilterVecLogProbs
ssv getFilterVecLogProbs() const
Get the current filter vector.
Definition: cf_filters.h:487
pf::filters::kalman::m_pi
const float_t m_pi
pi
Definition: cf_filters.h:167
pf::filters::kalman::osMat
Eigen::Matrix< float_t, dimobs, dimobs > osMat
Definition: cf_filters.h:49
pf::filters::gamFilter::psv
Eigen::Matrix< float_t, dim_pred, 1 > psv
"predictor size vector"
Definition: cf_filters.h:567
pf::filters::gamFilter::update
void update(const float_t &yt, const psv &xt, const psv &beta, const float_t &sigmaSquared, const float_t &delta)
Perform a filtering update.
Definition: cf_filters.h:677
pf::filters::hmm::m_fresh
bool m_fresh
has data been observed?
Definition: cf_filters.h:437
pf::filters::kalman::m_predVar
ssMat m_predVar
predictive var matrix
Definition: cf_filters.h:155
pf::filters::kalman::getFiltVar
ssMat getFiltVar() const
Get the current filter variance-covariance matrix.
Definition: cf_filters.h:287
pf::filters::kalman::stateObsSizeMat
Eigen::Matrix< float_t, dimstate, dimobs > stateObsSizeMat
Definition: cf_filters.h:61
pf::filters::multivGamFilter::m_fresh
bool m_fresh
has data been observed?
Definition: cf_filters.h:808
pf::filters::multivGamFilter::multivGamFilter
multivGamFilter(const float_t &nOneTilde, const float_t &dOneTilde)
Constructor.
Definition: cf_filters.h:814
pf::filters::multivGamFilter::psv
Eigen::Matrix< float_t, dim_pred, 1 > psv
"predictor size vector"
Definition: cf_filters.h:718
pf::filters::hmm::m_transMatLogProbsTranspose
ssMat m_transMatLogProbsTranspose
transition matrix
Definition: cf_filters.h:431
pf::filters::kalman::m_filtVar
ssMat m_filtVar
filter var matrix
Definition: cf_filters.h:158
pf::filters::multivGamFilter::m_filtVec
tsv m_filtVec
filter vector (shape and rate)
Definition: cf_filters.h:802
pf::filters::hmm::log_sum_exp
float_t log_sum_exp(const ssv &logProbVec)
log sum exp trick
Definition: cf_filters.h:494
pf::filters::kalman::m_fresh
bool m_fresh
has data been observed?
Definition: cf_filters.h:164
pf::filters::hmm::update
void update(const ssv &logCondDensVec)
Perform a HMM filter update.
Definition: cf_filters.h:516
pf::filters::multivGamFilter::getLogCondLike
float_t getLogCondLike() const
Get the latest conditional likelihood.
Definition: cf_filters.h:829
pf::filters::hmm::m_lastLogCondLike
float_t m_lastLogCondLike
last log conditional likelihood
Definition: cf_filters.h:434
pf::filters::multivGamFilter::bsm
Eigen::Matrix< float_t, dim_obs, dim_pred > bsm
"beta size matrix"
Definition: cf_filters.h:721
pf::bases::cf_filter
Abstract Base Class for all closed-form filters.
Definition: pf_base.h:681
pf::filters::multivGamFilter
Another class template for Gamma filtering, but this time.
Definition: cf_filters.h:712
pf::filters::hmm::getLogCondLike
float_t getLogCondLike() const
Get the latest conditional likelihood.
Definition: cf_filters.h:480
pf::filters::gamFilter::getLogCondLike
float_t getLogCondLike() const
Get the latest conditional likelihood.
Definition: cf_filters.h:662