/*!
  \file
  \brief Bayesian Filtering for linear Gaussian models (Kalman Filter) and extensions
  \author Vaclav Smidl.

  -----------------------------------
  BDM++ - C++ library for Bayesian Decision Making under Uncertainty

  Using IT++ for numerical operations
  -----------------------------------
*/

#ifndef EKF_TEMPLATE_H
#define EKF_TEMPLATE_H

#include "kalman.h"

namespace bdm {

//!Extended Kalman filter with unknown \c Q and \c R
class EKFful_unQR : public EKFfull  {
public:
	void condition ( const vec &QR0 ) {
		Q = diag ( QR0 ( 0, dimension() - 1 ) );
		R = diag ( QR0 ( dimension(), dimension() + dimy - 1 ) );
	};
};

//!Extended Kalman filter in Choleski form with unknown diagonal \c Q
class EKFCh_dQ : public EKFCh {
public:
	root* _copy_() const {
		return new EKFCh_dQ(*this);
	}

	//! new bayes, expects cond = [ut, Qt]
	void bayes( const vec &yt , const vec &cond) {
		vec ut=cond.left(dimc-dimension());
		vec dQt=cond.right(dimension());
		Q.setD ( dQt, 0 );
		//from EKF
		preA.set_submatrix ( dimy + dimension(), dimy, Q._Ch() );
		
		EKFCh::bayes(yt,ut);
	};
	void validate() {
		EKFCh::validate();
		dimc += dimension();
	}
};

//!Extended Kalman filter in Choleski form with unknown \c Q
class EKFCh_chQ : public EKFCh {
public:
	void condition ( const vec &chQ0 ) {
		Q.setCh ( chQ0 );
		//from EKF
		preA.set_submatrix ( dimy + dimension(), dimension(), Q._Ch() );
	};
};

////!Extended Kalman filter with unknown parameters in \c IM
// class EKFCh_cond : public EKFCh  {
// public:
// 	void condition ( const vec &val ) {
// 		pfxu->condition ( val );
// 	};
// };

}
#endif //EKF_TEMP_H
