Go to the documentation of this file.
5 #ifdef DROPPINGTHISINRPACKAGE
31 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug = false>
37 using ssv = Eigen::Matrix<float_t,dimstate,1>;
40 using osv = Eigen::Matrix<float_t,dimobs,1>;
43 using isv = Eigen::Matrix<float_t,diminput,1>;
46 using ssMat = Eigen::Matrix<float_t,dimstate,dimstate>;
49 using osMat = Eigen::Matrix<float_t,dimobs,dimobs>;
52 using siMat = Eigen::Matrix<float_t,dimstate,diminput>;
55 using oiMat = Eigen::Matrix<float_t,dimobs,diminput>;
111 const siMat &stateInptAffector,
112 const oiMat &obsInptAffector,
113 const isv &inputData)
const;
121 const ssMat &cholStateVar,
123 const osMat &cholObsVar)
const;
138 const ssMat &stateTrans,
139 const ssMat &cholStateVar,
140 const siMat &stateInptAffector,
141 const isv &inputData,
143 const oiMat &obsInptAffector,
144 const osMat &cholObsVar);
181 const ssMat &cholStateVar,
182 const siMat &stateInptAffector,
183 const isv &inputData);
196 const oiMat &obsInptAffector,
197 const isv &inputData,
198 const osMat &cholObsVar);
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())
208 , m_pi(3.14159265358979)
213 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
215 : bases::cf_filter<dimstate,dimobs,float_t>()
216 , m_predMean(initStateMean)
217 , m_predVar(initStateVar)
219 , m_pi(3.14159265358979)
224 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
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)
234 ssMat Q = cholStateVar.transpose() * cholStateVar;
235 m_predMean = stateTransMat * m_filtMean + stateInptAffector * inputData;
236 m_predVar = stateTransMat * m_filtVar * stateTransMat.transpose() + Q;
241 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
244 const oiMat &obsInptAffector,
245 const isv &inputData,
246 const osMat &cholObsVar)
248 osMat R = cholObsVar.transpose() * cholObsVar;
249 osMat sigma = obsMat * m_predVar * obsMat.transpose() + R;
250 osMat symSigma = (sigma.transpose() + sigma )/2.0;
251 osMat siginv = symSigma.inverse();
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;
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);
264 #ifndef DROPPINGTHISINRPACKAGE
266 std::cout <<
"transposed innovation: " << innov.transpose() <<
", quadratic formula: " << quadForm(0,0) <<
", logDet: " << logDet <<
", log cond like: " << m_lastLogCondLike <<
"\n";
272 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
275 return m_lastLogCondLike;
279 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
286 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
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,
300 const oiMat &obsInptAffector,
301 const osMat &cholObsVar)
307 this->updatePosterior(yt, obsMat, obsInptAffector, inData, cholObsVar);
311 this->updatePrior(stateTrans, cholStateVar, stateInptAffector, inData);
312 this->updatePosterior(yt, obsMat, obsInptAffector, inData, cholObsVar);
317 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
319 const ssMat &stateTrans,
321 const siMat &stateInptAffector,
322 const oiMat &obsInptAffector,
323 const isv &futureInputData)
const ->
osv
325 return obsMat * (stateTrans * m_filtMean + stateInptAffector * futureInputData) + obsInptAffector * futureInputData;
329 template<
size_t dimstate,
size_t dimobs,
size_t diminput,
typename float_t,
bool debug>
331 const ssMat &stateTrans,
332 const ssMat &cholStateVar,
336 return obsMat * (stateTrans * m_filtVar * stateTrans.transpose() + cholStateVar.transpose()*cholStateVar) * obsMat.transpose() + cholObsVar.transpose() * cholObsVar;
347 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug = false>
354 using ssv = Eigen::Matrix<float_t,dimstate,1>;
357 using osv = Eigen::Matrix<float_t,dimobs,1>;
360 using ssMat = Eigen::Matrix<float_t,dimstate,dimstate>;
376 hmm(
const ssv &initStateDistrLogProbs,
const ssMat &transMatLogProbs);
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)
451 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
453 : bases::cf_filter<dimstate,dimobs,float_t>()
454 , m_filtVecLogProbs(initStateDistrLogProbs)
455 , m_transMatLogProbsTranspose(transMatLogProbs.transpose())
456 , m_lastLogCondLike(0.0)
461 throw std::invalid_argument(
"Initial probabilities must sum to 1.");
463 throw std::invalid_argument(
"Initial probabilities cannot be greater than 1.0.");
467 throw std::invalid_argument(
"Initial transition probabilities cannot be greater than 1.");
468 for(
size_t icol = 0; icol < dimstate; ++icol){
470 throw std::invalid_argument(
"Initial transition probabilities must sum to 1.");
475 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
479 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
482 return m_lastLogCondLike;
486 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
489 return m_filtVecLogProbs;
493 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
497 float_t m = logProbVec.maxCoeff();
498 return std::log( (logProbVec.array() - m).exp().sum() ) + m;
502 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
506 float_t m = logTransMat.maxCoeff();
508 for(
size_t ic = 0; ic < dimstate; ++ic){
509 col_sum = col_sum + (logTransMat.col(ic).array() + logProbVec(ic) - m).exp().matrix();
515 template<
size_t dimstate,
size_t dimobs,
typename float_t,
bool debug>
519 m_filtVecLogProbs = this->log_product(m_transMatLogProbsTranspose, m_filtVecLogProbs);
520 m_filtVecLogProbs = m_filtVecLogProbs + logCondDensVec ;
521 m_lastLogCondLike = this->log_sum_exp(m_filtVecLogProbs);
523 #ifndef DROPPINGTHISINRPACKAGE
525 std::cout <<
"logConDensVec sum " << logCondDensVec.sum() <<
", p(y_t,x_t|y_{1:t-1}) sum: " << m_filtVecLogProbs.sum() <<
", lastCondlike: " << m_lastLogCondLike <<
"\n";
528 m_filtVecLogProbs = (m_filtVecLogProbs.array() - m_lastLogCondLike).matrix();
532 m_filtVecLogProbs = m_filtVecLogProbs + logCondDensVec;
533 m_lastLogCondLike = this->log_sum_exp(m_filtVecLogProbs);
536 #ifndef DROPPINGTHISINRPACKAGE
538 std::cout <<
"logConDensVecSum " << logCondDensVec.sum() <<
", log p(x1,y1) sum: " << m_filtVecLogProbs.sum() <<
", lastLogCondlike: " << m_lastLogCondLike <<
"\n";
541 m_filtVecLogProbs = (m_filtVecLogProbs.array() - m_lastLogCondLike).matrix();
560 template<
size_t dim_pred,
typename float_t>
567 using psv = Eigen::Matrix<float_t,dim_pred,1>;
570 using tsv = Eigen::Matrix<float_t,2,1>;
586 gamFilter(
const float_t &nOneTilde,
const float_t &dOneTilde);
619 void update(
const float_t& yt,
const psv &xt,
const psv& beta,
const float_t& sigmaSquared,
const float_t& delta);
646 template<
size_t dim_pred,
typename float_t>
648 : bases::cf_filter<1,1,float_t>()
649 , m_lastLogCondLike(0.0)
657 template<
size_t dim_pred,
typename float_t>
661 template<
size_t dim_pred,
typename float_t>
664 return m_lastLogCondLike;
668 template<
size_t dim_pred,
typename float_t>
676 template<
size_t dim_pred,
typename float_t>
680 if(sigmaSquared <= 0 || delta <= 0)
681 throw std::invalid_argument(
"ME: both sigma squared and delta have to be positive.\n");
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);
688 m_filtVec(1) += (yt - xt.dot(beta))*(yt - xt.dot(beta))/sigmaSquared;
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);
698 m_filtVec(1) += (yt - xt.dot(beta))*(yt - xt.dot(beta))/sigmaSquared;
711 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
718 using psv = Eigen::Matrix<float_t,dim_pred,1>;
721 using bsm = Eigen::Matrix<float_t,dim_obs, dim_pred>;
724 using tsv = Eigen::Matrix<float_t,2,1>;
727 using osv = Eigen::Matrix<float_t, dim_obs, 1>;
730 using osm = Eigen::Matrix<float_t, dim_obs, dim_obs>;
772 void update(
const osv& yt,
const psv &xt,
const bsm& B,
const osm& Sigma,
const float_t& delta);
813 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
815 : bases::cf_filter<1,dim_obs,float_t>()
816 , m_lastLogCondLike(0.0)
824 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
828 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
831 return m_lastLogCondLike;
835 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
843 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
849 throw std::invalid_argument(
"ME: delta has to be positive (you're not even checking Sigma).\n");
853 osm scaleMat = Sigma * m_filtVec(1)/m_filtVec(0);
855 m_lastLogCondLike = rveval::evalMultivT<dim_obs,float_t>(yt, modeVec, scaleMat, m_filtVec(0),
true);
857 m_filtVec(1) += (Sigma.ldlt().solve(yt - modeVec)).squaredNorm();
862 m_filtVec(0) *= delta;
863 m_filtVec(1) *= delta;
865 osm scaleMat = Sigma * m_filtVec(1)/m_filtVec(0);
867 m_lastLogCondLike = rveval::evalMultivT<dim_obs,float_t>(yt, modeVec, scaleMat, m_filtVec(0),
true);
870 m_filtVec(1) += (Sigma.ldlt().solve(yt - modeVec)).squaredNorm();
875 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
878 if(delta*m_filtVec(0) > 1.0)
883 template<
size_t dim_obs,
size_t dim_pred,
typename float_t>
886 if(delta * m_filtVec(0) > 2.0)
887 return Sigma * delta * m_filtVec(1) / (delta * m_filtVec(0) - 2.0);
894 #endif //CF_FILTERS_H
Eigen::Matrix< float_t, dim_obs, dim_obs > osm
"observation size matrix"
Definition: cf_filters.h:730
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
hmm()
Default constructor.
Definition: cf_filters.h:443
Eigen::Matrix< float_t, diminput, 1 > isv
Definition: cf_filters.h:43
gamFilter(const float_t &nOneTilde, const float_t &dOneTilde)
Default constructor.
Definition: cf_filters.h:647
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
Eigen::Matrix< float_t, dimstate, dimstate > ssMat
"state size matrix"
Definition: cf_filters.h:360
ssv m_filtVecLogProbs
filter vector
Definition: cf_filters.h:428
Eigen::Matrix< float_t, dim_obs, 1 > osv
"observation size vector"
Definition: cf_filters.h:727
ssv m_filtMean
filter mean
Definition: cf_filters.h:152
float_t m_lastLogCondLike
latest log conditional likelihood
Definition: cf_filters.h:161
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
tsv m_filtVec
filter vector (shape and rate)
Definition: cf_filters.h:625
bool m_fresh
has data been observed?
Definition: cf_filters.h:631
virtual ~multivGamFilter()
The (virtual) desuctor.
Definition: cf_filters.h:825
Eigen::Matrix< float_t, dimstate, dimstate > ssMat
Definition: cf_filters.h:46
A class template for HMM filtering.
Definition: cf_filters.h:348
virtual ~hmm()
The (virtual) desuctor.
Definition: cf_filters.h:476
All non Rao-Blackwellized particle filters without covariates inherit from this.
A class template for Gamma filtering.
Definition: cf_filters.h:561
float_t getLogCondLike() const
returns the log of the latest conditional likelihood.
Definition: cf_filters.h:273
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
Eigen::Matrix< float_t, dimobs, dimstate > obsStateSizeMat
Definition: cf_filters.h:58
Eigen::Matrix< float_t, dimstate, diminput > siMat
Definition: cf_filters.h:52
tsv getFilterVec() const
Get the current filter vector.
Definition: cf_filters.h:669
Eigen::Matrix< float_t, dimobs, 1 > osv
Definition: cf_filters.h:40
float_t m_lastLogCondLike
last log of the conditional likelihood
Definition: cf_filters.h:628
virtual ~gamFilter()
The (virtual) desuctor.
Definition: cf_filters.h:658
Eigen::Matrix< float_t, dimobs, 1 > osv
"observation size vector"
Definition: cf_filters.h:357
Eigen::Matrix< float_t, dimstate, 1 > ssv
Definition: cf_filters.h:37
Eigen::Matrix< float_t, dimobs, diminput > oiMat
Definition: cf_filters.h:55
Eigen::Matrix< float_t, dimstate, 1 > ssv
"state size vector"
Definition: cf_filters.h:354
Eigen::Matrix< float_t, 2, 1 > tsv
"two by 1 vector"
Definition: cf_filters.h:570
ssv m_predMean
predictive state mean
Definition: cf_filters.h:149
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
ssv getFiltMean() const
Get the current filter mean.
Definition: cf_filters.h:280
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
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
void updatePrior(const ssMat &stateTransMat, const ssMat &cholStateVar, const siMat &stateInptAffector, const isv &inputData)
Predicts the next state.
Definition: cf_filters.h:229
kalman()
Default constructor.
Definition: cf_filters.h:203
tsv getFilterVec() const
Get the current filter vector.
Definition: cf_filters.h:836
Eigen::Matrix< float_t, 2, 1 > tsv
"two by 1 vector" to store size and shapes of gamma distributions
Definition: cf_filters.h:724
ssv log_product(const ssMat &logTransMat, const ssv &logProbVec)
Definition: cf_filters.h:503
A class template for Kalman filtering.
Definition: cf_filters.h:32
float_t m_lastLogCondLike
last log of the conditional likelihood
Definition: cf_filters.h:805
virtual ~kalman()
The (virtual) destructor.
Definition: cf_filters.h:225
ssv getFilterVecLogProbs() const
Get the current filter vector.
Definition: cf_filters.h:487
const float_t m_pi
pi
Definition: cf_filters.h:167
Eigen::Matrix< float_t, dimobs, dimobs > osMat
Definition: cf_filters.h:49
Eigen::Matrix< float_t, dim_pred, 1 > psv
"predictor size vector"
Definition: cf_filters.h:567
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
bool m_fresh
has data been observed?
Definition: cf_filters.h:437
ssMat m_predVar
predictive var matrix
Definition: cf_filters.h:155
ssMat getFiltVar() const
Get the current filter variance-covariance matrix.
Definition: cf_filters.h:287
Eigen::Matrix< float_t, dimstate, dimobs > stateObsSizeMat
Definition: cf_filters.h:61
bool m_fresh
has data been observed?
Definition: cf_filters.h:808
multivGamFilter(const float_t &nOneTilde, const float_t &dOneTilde)
Constructor.
Definition: cf_filters.h:814
Eigen::Matrix< float_t, dim_pred, 1 > psv
"predictor size vector"
Definition: cf_filters.h:718
ssMat m_transMatLogProbsTranspose
transition matrix
Definition: cf_filters.h:431
ssMat m_filtVar
filter var matrix
Definition: cf_filters.h:158
tsv m_filtVec
filter vector (shape and rate)
Definition: cf_filters.h:802
float_t log_sum_exp(const ssv &logProbVec)
log sum exp trick
Definition: cf_filters.h:494
bool m_fresh
has data been observed?
Definition: cf_filters.h:164
void update(const ssv &logCondDensVec)
Perform a HMM filter update.
Definition: cf_filters.h:516
float_t getLogCondLike() const
Get the latest conditional likelihood.
Definition: cf_filters.h:829
float_t m_lastLogCondLike
last log conditional likelihood
Definition: cf_filters.h:434
Eigen::Matrix< float_t, dim_obs, dim_pred > bsm
"beta size matrix"
Definition: cf_filters.h:721
Abstract Base Class for all closed-form filters.
Definition: pf_base.h:681
Another class template for Gamma filtering, but this time.
Definition: cf_filters.h:712
float_t getLogCondLike() const
Get the latest conditional likelihood.
Definition: cf_filters.h:480
float_t getLogCondLike() const
Get the latest conditional likelihood.
Definition: cf_filters.h:662