Show
Ignore:
Timestamp:
10/23/09 00:05:25 (15 years ago)
Author:
smidl
Message:

Major changes in BM -- OK is only test suite and tests/tutorial -- the rest is broken!!!

Files:
1 modified

Legend:

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

    r653 r679  
    88 
    99 
    10 void KalmanFull::bayes ( const vec &dt ) { 
    11         bdm_assert_debug ( dt.length() == ( dimy + dimu ), "KalmanFull::bayes wrong size of dt" ); 
    12  
    13         vec u = dt.get ( dimy, dimy + dimu - 1 ); 
    14         vec y = dt.get ( 0, dimy - 1 ); 
    15         vec& mu = est->_mu(); 
    16         mat &P = est->_R(); 
     10void KalmanFull::bayes ( const vec &yt, const vec &cond ) { 
     11        bdm_assert_debug ( yt.length() == ( dimy ), "KalmanFull::bayes wrong size of dt" ); 
     12 
     13        const vec &u = cond; // in this case cond=ut 
     14        const vec &y = yt; 
     15         
     16        vec& mu = est._mu(); 
     17        mat &P = est._R(); 
    1718        mat& _Ry = fy._R(); 
    1819        vec& yp = fy._mu(); 
     
    4243        phxu = phxu0; 
    4344 
    44         dimx = pfxu0->_dimx(); 
     45        set_dim( pfxu0->_dimx()); 
    4546        dimy = phxu0->dimension(); 
    46         dimu = pfxu0->_dimu(); 
    47         est->set_parameters( zeros(dimx), eye(dimx) ); 
    48  
    49         A.set_size ( dimx, dimx ); 
    50         C.set_size ( dimy, dimx ); 
     47        dimc = pfxu0->_dimu(); 
     48        est.set_parameters( zeros(dimension()), eye(dimension()) ); 
     49 
     50        A.set_size ( dimension(), dimension() ); 
     51        C.set_size ( dimy, dimension() ); 
    5152        //initialize matrices A C, later, these will be only updated! 
    52         pfxu->dfdx_cond ( est->_mu(), zeros ( dimu ), A, true ); 
     53        pfxu->dfdx_cond ( est._mu(), zeros ( dimc ), A, true ); 
    5354        B.clear(); 
    54         phxu->dfdx_cond ( est->_mu(), zeros ( dimu ), C, true ); 
     55        phxu->dfdx_cond ( est._mu(), zeros ( dimc ), C, true ); 
    5556        D.clear(); 
    5657 
     
    5960} 
    6061 
    61 void EKFfull::bayes ( const vec &dt ) { 
    62         bdm_assert_debug ( dt.length() == ( dimy + dimu ), "EKFull::bayes wrong size of dt" ); 
    63  
    64         vec u = dt.get ( dimy, dimy + dimu - 1 ); 
    65         vec y = dt.get ( 0, dimy - 1 ); 
    66         vec &mu = est->_mu(); 
    67         mat &P = est->_R(); 
     62void EKFfull::bayes ( const vec &yt, const vec &cond) { 
     63        bdm_assert_debug ( yt.length() == ( dimy ), "EKFull::bayes wrong size of dt" ); 
     64        bdm_assert_debug ( cond.length() == ( dimc ), "EKFull::bayes wrong size of dt" ); 
     65         
     66        const vec &u = cond; 
     67        const vec &y = yt; //lazy to change it 
     68        vec &mu = est._mu(); 
     69        mat &P = est._R(); 
    6870        mat& _Ry = fy._R(); 
    6971        vec& yp = fy._mu(); 
    7072         
    71         pfxu->dfdx_cond ( mu, zeros ( dimu ), A, true ); 
    72         phxu->dfdx_cond ( mu, zeros ( dimu ), C, true ); 
     73        pfxu->dfdx_cond ( mu, zeros ( dimc ), A, true ); 
     74        phxu->dfdx_cond ( mu, zeros ( dimc ), C, true ); 
    7375 
    7476        //Time update 
     
    9496        ( ( StateSpace<chmat>* ) this )->set_parameters ( A0, B0, C0, D0, Q0, R0 ); 
    9597         
    96         _K=zeros(dimx,dimy); 
    97         // Cholesky special! 
    98         initialize(); 
     98        _K=zeros(dimension(),dimy); 
    9999} 
    100100 
    101101void KalmanCh::initialize(){ 
    102         preA = zeros ( dimy + dimx + dimx, dimy + dimx ); 
     102        preA = zeros ( dimy + dimension() + dimension(), dimy + dimension() ); 
    103103//      preA.clear(); 
    104104        preA.set_submatrix ( 0, 0, R._Ch() ); 
    105         preA.set_submatrix ( dimy + dimx, dimy, Q._Ch() ); 
    106 } 
    107  
    108 void KalmanCh::bayes ( const vec &dt ) { 
    109  
    110         vec u = dt.get ( dimy, dimy + dimu - 1 ); 
    111         vec y = dt.get ( 0, dimy - 1 ); 
     105        preA.set_submatrix ( dimy + dimension(), dimy, Q._Ch() ); 
     106} 
     107 
     108void KalmanCh::bayes ( const vec &yt, const vec &cond ) { 
     109        bdm_assert_debug(yt.length()==dimy, "yt mismatch"); 
     110        bdm_assert_debug(cond.length()==dimc, "yt mismatch"); 
     111         
     112        const vec &u = cond; 
     113        const vec &y = yt; 
    112114        vec pom ( dimy ); 
    113115 
    114         chmat &_P=est->_R(); 
    115         vec &_mu = est->_mu(); 
    116         mat _K(dimx,dimy); 
     116        chmat &_P=est._R(); 
     117        vec &_mu = est._mu(); 
     118        mat _K(dimension(),dimy); 
    117119        chmat &_Ry=fy._R(); 
    118120        vec &_yp = fy._mu(); 
     
    130132 
    131133        ( _Ry._Ch() ) = postA ( 0, dimy - 1, 0, dimy - 1 ); 
    132         _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dimx - 1 ) ).T(); 
    133         ( _P._Ch() ) = postA ( dimy, dimy + dimx - 1, dimy, dimy + dimx - 1 ); 
     134        _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dimension() - 1 ) ).T(); 
     135        ( _P._Ch() ) = postA ( dimy, dimy + dimension() - 1, dimy, dimy + dimension() - 1 ); 
    134136 
    135137        _mu = A * ( _mu ) + B * u; 
     
    154156        phxu = phxu0; 
    155157 
    156         dimx = pfxu0->dimension(); 
     158        set_dim( pfxu0->_dimx()); 
    157159        dimy = phxu0->dimension(); 
    158         dimu = pfxu0->_dimu(); 
    159          
    160         vec &_mu = est->_mu(); 
     160        dimc = pfxu0->_dimu(); 
     161         
     162        vec &_mu = est._mu(); 
    161163        // if mu is not set, set it to zeros, just for constant terms of A and C 
    162         if ( _mu.length() != dimx ) _mu = zeros ( dimx );  
    163         A = zeros ( dimx, dimx ); 
    164         C = zeros ( dimy, dimx ); 
    165         preA = zeros ( dimy + dimx + dimx, dimy + dimx ); 
     164        if ( _mu.length() != dimension() ) _mu = zeros ( dimension() );  
     165        A = zeros ( dimension(), dimension() ); 
     166        C = zeros ( dimy, dimension() ); 
     167        preA = zeros ( dimy + dimension() + dimension(), dimy + dimension() ); 
    166168 
    167169        //initialize matrices A C, later, these will be only updated! 
    168         pfxu->dfdx_cond ( _mu, zeros ( dimu ), A, true ); 
     170        pfxu->dfdx_cond ( _mu, zeros ( dimc ), A, true ); 
    169171//      pfxu->dfdu_cond ( *_mu,zeros ( dimu ),B,true ); 
    170172        B.clear(); 
    171         phxu->dfdx_cond ( _mu, zeros ( dimu ), C, true ); 
     173        phxu->dfdx_cond ( _mu, zeros ( dimc ), C, true ); 
    172174//      phxu->dfdu_cond ( *_mu,zeros ( dimu ),D,true ); 
    173175        D.clear(); 
     
    179181        preA.clear(); 
    180182        preA.set_submatrix ( 0, 0, R._Ch() ); 
    181         preA.set_submatrix ( dimy + dimx, dimy, Q._Ch() ); 
    182 } 
    183  
    184  
    185 void EKFCh::bayes ( const vec &dt ) { 
     183        preA.set_submatrix ( dimy + dimension(), dimy, Q._Ch() ); 
     184} 
     185 
     186 
     187void EKFCh::bayes ( const vec &yt, const vec &cond ) { 
    186188 
    187189        vec pom ( dimy ); 
    188         vec u = dt.get ( dimy, dimy + dimu - 1 ); 
    189         vec y = dt.get ( 0, dimy - 1 ); 
    190         vec &_mu = est->_mu(); 
    191         chmat &_P = est->_R(); 
     190        const vec &u = cond; 
     191        const vec &y = yt; 
     192        vec &_mu = est._mu(); 
     193        chmat &_P = est._R(); 
    192194        chmat &_Ry = fy._R(); 
    193195        vec &_yp = fy._mu(); 
     
    211213 
    212214        ( _Ry._Ch() ) = postA ( 0, dimy - 1, 0, dimy - 1 ); 
    213         _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dimx - 1 ) ).T(); 
    214         ( _P._Ch() ) = postA ( dimy, dimy + dimx - 1, dimy, dimy + dimx - 1 ); 
     215        _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dimension() - 1 ) ).T(); 
     216        ( _P._Ch() ) = postA ( dimy, dimy + dimension() - 1, dimy, dimy + dimension() - 1 ); 
    215217 
    216218//      mat iRY = inv(_Ry->to_mat()); 
     
    268270        //connect 
    269271        shared_ptr<RV> drv = UI::build<RV> ( set, "drv", UI::compulsory ); 
    270         set_drv ( *drv ); 
     272        set_yrv ( *drv ); 
    271273        shared_ptr<RV> rv = UI::build<RV> ( set, "rv", UI::compulsory ); 
    272274        set_rv ( *rv ); 
     
    282284 
    283285        set_parameters ( A ); 
    284         set_drv ( A ( 0 )->_drv() ); 
     286        set_yrv ( A ( 0 )->_yrv() ); 
    285287        //set_rv(A(0)->_rv()); 
    286288