Show
Ignore:
Timestamp:
10/12/09 19:38:54 (15 years ago)
Author:
smidl
Message:

corrections in Kalman and particles

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/estim/kalman.h

    r625 r653  
    5454        public: 
    5555                StateSpace() : dimx (0), dimy (0), dimu (0), A(), B(), C(), D(), Q(), R() {} 
     56                StateSpace(const StateSpace<sq_T> &S0) : dimx (S0.dimx), dimy (S0.dimy), dimu (S0.dimu), A(S0.A), B(S0.B), C(S0.C), D(S0.D), Q(S0.Q), R(S0.R) {} 
    5657                void set_parameters (const mat &A0, const  mat &B0, const  mat &C0, const  mat &D0, const  sq_T &Q0, const sq_T &R0); 
    5758                void validate(); 
     
    114115                enorm<sq_T>  fy; 
    115116        public: 
    116                 Kalman() : BM(), StateSpace<sq_T>(), yrv(),urv(), _K(),  est(new enorm<sq_T>){} 
     117                Kalman<sq_T>() : BM(), StateSpace<sq_T>(), yrv(),urv(), _K(),  est(new enorm<sq_T>){} 
     118                Kalman<sq_T>(const Kalman<sq_T> &K0) : BM(K0), StateSpace<sq_T>(K0), yrv(K0.yrv),urv(K0.urv), _K(K0._K),  est(new enorm<sq_T>(*K0.est)), fy(K0.fy){} 
    117119                void set_statistics (const vec &mu0, const mat &P0) {est->set_parameters (mu0, P0); }; 
    118120                void set_statistics (const vec &mu0, const sq_T &P0) {est->set_parameters (mu0, P0); }; 
     
    152154                //! Here dt = [yt;ut] of appropriate dimensions 
    153155                void bayes (const vec &dt); 
     156                BM* _copy_() const { 
     157                        KalmanFull* K = new KalmanFull; 
     158                        K->set_parameters (A, B, C, D, Q, R); 
     159                        K->set_statistics (est->_mu(), est->_R()); 
     160                        return K; 
     161                } 
    154162}; 
    155163UIREGISTER(KalmanFull); 
     
    236244                const mat _R() { 
    237245                        return est->_R().to_mat(); 
     246                } 
     247                void from_setting (const Setting &set) { 
     248                        shared_ptr<diffbifn> IM = UI::build<diffbifn> ( set, "IM", UI::compulsory ); 
     249                        shared_ptr<diffbifn> OM = UI::build<diffbifn> ( set, "OM", UI::compulsory ); 
     250                         
     251                        //statistics 
     252                        int dim = IM->dimension(); 
     253                        vec mu0; 
     254                        if ( !UI::get ( mu0, set, "mu0" ) ) 
     255                                mu0 = zeros ( dim ); 
     256                         
     257                        mat P0; 
     258                        vec dP0; 
     259                        if ( UI::get ( dP0, set, "dP0" ) ) 
     260                                P0 = diag ( dP0 ); 
     261                        else if ( !UI::get ( P0, set, "P0" ) ) 
     262                                P0 = eye ( dim ); 
     263                         
     264                        set_statistics ( mu0, P0 ); 
     265                         
     266                        //parameters 
     267                        vec dQ, dR; 
     268                        UI::get ( dQ, set, "dQ", UI::compulsory ); 
     269                        UI::get ( dR, set, "dR", UI::compulsory ); 
     270                        set_parameters ( IM, OM, diag ( dQ ), diag ( dR ) ); 
     271                         
     272                        //connect 
     273                        shared_ptr<RV> drv = UI::build<RV> ( set, "drv", UI::compulsory ); 
     274                        set_drv ( *drv ); 
     275                        shared_ptr<RV> rv = UI::build<RV> ( set, "rv", UI::compulsory ); 
     276                        set_rv ( *rv ); 
     277                         
     278                        string options; 
     279                        if ( UI::get ( options, set, "options" ) ) 
     280                                set_options ( options ); 
     281//                      pfxu = UI::build<diffbifn>(set, "IM", UI::compulsory); 
     282//                      phxu = UI::build<diffbifn>(set, "OM", UI::compulsory); 
     283//                       
     284//                      mat R0; 
     285//                      UI::get(R0, set, "R",UI::compulsory); 
     286//                      mat Q0; 
     287//                      UI::get(Q0, set, "Q",UI::compulsory); 
     288//                       
     289//                       
     290//                      mat P0; vec mu0; 
     291//                      UI::get(mu0, set, "mu0", UI::optional); 
     292//                      UI::get(P0, set,  "P0", UI::optional); 
     293//                      set_statistics(mu0,P0); 
     294//                      // Initial values 
     295//                      UI::get (yrv, set, "yrv", UI::optional); 
     296//                      UI::get (urv, set, "urv", UI::optional); 
     297//                      set_drv(concat(yrv,urv)); 
     298//  
     299//                      // setup StateSpace 
     300//                      pfxu->dfdu_cond(mu0, zeros(pfxu->_dimu()), A,true); 
     301//                      phxu->dfdu_cond(mu0, zeros(pfxu->_dimu()), C,true); 
     302//                       
     303                        validate(); 
     304                } 
     305                void validate() { 
     306                        // check stats and IM and OM 
    238307                } 
    239308}; 
     
    448517void StateSpace<sq_T>::set_parameters (const mat &A0, const  mat &B0, const  mat &C0, const  mat &D0, const  sq_T &Q0, const sq_T &R0) 
    449518{ 
    450         dimx = A0.rows(); 
    451         dimu = B0.cols(); 
    452         dimy = C0.rows(); 
    453519 
    454520        A = A0; 
     
    463529template<class sq_T> 
    464530void StateSpace<sq_T>::validate(){ 
     531        dimx = A.rows(); 
     532        dimu = B.cols(); 
     533        dimy = C.rows(); 
    465534        bdm_assert (A.cols() == dimx, "KalmanFull: A is not square"); 
    466535        bdm_assert (B.rows() == dimx, "KalmanFull: B is not compatible"); 
    467536        bdm_assert (C.cols() == dimx, "KalmanFull: C is not square"); 
    468         bdm_assert ( (D.rows() == dimy) || (D.cols() == dimu), "KalmanFull: D is not compatible"); 
    469         bdm_assert ( (Q.cols() == dimx) || (Q.rows() == dimx), "KalmanFull: Q is not compatible"); 
    470         bdm_assert ( (R.cols() == dimy) || (R.rows() == dimy), "KalmanFull: R is not compatible"); 
     537        bdm_assert ( (D.rows() == dimy) && (D.cols() == dimu), "KalmanFull: D is not compatible"); 
     538        bdm_assert ( (Q.cols() == dimx) && (Q.rows() == dimx), "KalmanFull: Q is not compatible"); 
     539        bdm_assert ( (R.cols() == dimy) && (R.rows() == dimy), "KalmanFull: R is not compatible"); 
    471540} 
    472541