Changeset 11

Show
Ignore:
Timestamp:
01/25/08 10:31:08 (17 years ago)
Author:
smidl
Message:

resampling in PF + initial port of functions

Files:
2 added
8 modified

Legend:

Unmodified
Added
Removed
  • Makefile

    r9 r11  
    1 LDFLAGS=-litpp 
     1LDFLAGS=-Ldebug/usr/lib/ -litpp  
    22CPPFLAGS=-g 
    33 
    4 all: testKF 
     4all: testPF 
    55 
    66test: test0 
     
    1313testKF: testKF.o libKF.o libBM.o libDC.o itpp_ext.o 
    1414testPF: testPF.o libPF.o libBM.o libDC.o itpp_ext.o 
     15 
     16itpp_ext.o: itpp_ext.cpp itpp_ext.h 
  • itpp_ext.cpp

    r6 r11  
    2323  } 
    2424 
     25 
    2526} 
  • libPF.cpp

    r8 r11  
    55using std::endl; 
    66 
     7PF::PF(vec w0){w=w0/sum(w0); n=w.length();} 
     8 
    79ivec PF::resample( RESAMPLING_METHOD method ) { 
    8         ivec ind( n ); 
     10        ivec ind=zeros_i( n ); 
     11        ivec N_babies = zeros_i( n ); 
     12        vec cumDist = cumsum( w ); 
     13        vec u( n ); 
     14        int i,j,parent; 
     15        double u0; 
     16 
     17        switch ( method ) { 
     18        case MULTINOMIAL: 
     19                u( n - 1 ) = pow( URNG.sample(), 1.0 / n ); 
     20                for ( i = n - 2;i >= 0;i-- ) { 
     21                        u( i ) = u( i + 1 ) * pow( URNG.sample(), 1.0 / ( i + 1 ) ); 
     22                } 
     23                break; 
     24        case STRATIFIED: 
     25                for ( i = 0;i < n;i++ ) { 
     26                        u( i ) = ( i + URNG.sample() ) / n; 
     27                } 
     28                break; 
     29        case SYSTEMATIC: 
     30                u0 = URNG.sample(); 
     31                for ( i = 0;i < n;i++ ) { 
     32                        u( i ) = ( i + u0 ) / n; 
     33                } 
     34                break; 
     35        default: 
     36                it_error( "PF::resample(): Unknown resampling method" ); 
     37        } 
     38         
     39//      // <<<<<<<<<<< 
     40//      using std::cout; 
     41//      cout << "resampling:" << endl; 
     42//      cout << w <<endl; 
     43//      cout << cumDist <<endl; 
     44//      cout << u <<endl; 
     45 
     46        // U is now full 
     47        j = 0; 
     48        for ( i = 0;i < n;i++ ) { 
     49                while ( u( i ) > cumDist( j ) ) j++; 
     50                N_babies( j )++; 
     51        } 
     52 
     53//      // <<<<<<<<<<< 
     54//      cout << N_babies <<endl; 
     55 
     56        // We have assigned new babies for each Particle 
     57        // Now, we fill the resulting index such that: 
     58        // * particles with at least one baby should not move * 
     59        // This assures that reassignment can be done inplace; 
     60 
     61        // find the first parent; 
     62        parent=0; while(N_babies(parent)==0) parent++; 
     63        // Build index 
     64        for ( i = 0;i < n;i++ ) { 
     65                if ( N_babies( i ) > 0 ){ 
     66                        ind( i ) = i; 
     67                        N_babies( i ) --; //this index was now replicated; 
     68                        } 
     69                else { 
     70                        // test if the parent has been fully replicated  
     71                        // if yes, find the next one 
     72                        while((N_babies(parent)==0) || (N_babies(parent)==1 && parent>i) ) parent++; 
     73                        // Replicate parent 
     74                        ind (i) = parent; 
     75                        N_babies( parent ) --; //this index was now replicated; 
     76                } 
     77/*                      // <<<<<<<<<<< 
     78                        cout <<ind << endl;*/ 
     79        } 
    980        return ind; 
    1081} 
    1182 
    12 TrivialPF::TrivialPF(mpdf &par0, mpdf &obs0, mpdf &prop0, int n0){ 
     83TrivialPF::TrivialPF( mpdf &par0, mpdf &obs0, mpdf &prop0, int n0 ) : PF(1/n*ones(n)) { 
    1384        is_proposal = true; 
    1485        prop = &prop0; 
     
    1687        obs = &obs0; 
    1788} 
    18 TrivialPF::TrivialPF(mpdf &par0, mpdf &obs0,  int n0){ 
     89TrivialPF::TrivialPF( mpdf &par0, mpdf &obs0,  int n0 ) : PF(1/n*ones(n)) { 
    1990        is_proposal = false; 
    2091        par = &par0; 
     
    2293} 
    2394 
    24 void TrivialPF::bayes( const vec &dt , bool evalll) { 
     95void TrivialPF::bayes( const vec &dt , bool evalll ) { 
    2596        int i; 
    2697        vec oldp; 
    27         double ll, gl, sum=0.0; 
     98        double ll, gl, sum = 0.0; 
    2899        Sort<double> S; 
    29100        ivec ind, iw; 
  • libPF.h

    r8 r11  
    2020using namespace itpp; 
    2121 
    22 enum RESAMPLING_METHOD { MULTINOMIAL = 0, DETERMINISTIC = 1, RESIDUAL = 2, SYSTEMATIC = 3 }; 
     22enum RESAMPLING_METHOD { MULTINOMIAL = 0, STRATIFIED = 1, SYSTEMATIC = 3 }; 
    2323 
    2424/*! 
     
    3131        int n; //number of particles 
    3232        vec w; //particle weights 
     33        Uniform_RNG URNG; //used for resampling 
    3334         
    3435public: 
    35         //! Returns indexes of particles that should be resampled 
     36        //! Returns indexes of particles that should be resampled. The ordering MUST guarantee inplace replacement. (Important for MPF.) 
    3637        ivec resample(RESAMPLING_METHOD method = SYSTEMATIC); 
    37         //TODO get them on the web 
     38        PF (vec w); 
     39        //TODO remove or implement bayes()! 
     40        void bayes(const vec &dt, bool evell){}; 
    3841}; 
    3942 
  • mixpp.kdevelop

    r7 r11  
    1818    <run> 
    1919      <directoryradio>executable</directoryradio> 
    20       <mainprogram>./testKF</mainprogram> 
     20      <mainprogram>/home/smidl/work/mixpp/testPF</mainprogram> 
    2121      <programargs></programargs> 
    2222      <globaldebugarguments></globaldebugarguments> 
     
    200200      <orientation>Vertical</orientation> 
    201201    </splitheadersource> 
     202    <references/> 
    202203  </kdevcppsupport> 
    203204  <cppsupportpart> 
     
    215216  </kdevdocumentation> 
    216217  <kdevfileview> 
    217     <groups/> 
     218    <groups> 
     219      <hidenonprojectfiles>false</hidenonprojectfiles> 
     220      <hidenonlocation>false</hidenonlocation> 
     221    </groups> 
     222    <tree> 
     223      <showvcsfields>false</showvcsfields> 
     224      <hidenonprojectfiles>true</hidenonprojectfiles> 
     225      <hidepatterns>*.o,*.lo,CVS</hidepatterns> 
     226    </tree> 
    218227  </kdevfileview> 
    219228  <ctagspart> 
    220     <customArguments></customArguments> 
     229    <customArguments/> 
    221230    <customTagfilePath>/home/smidl/work/mixpp/tags</customTagfilePath> 
    222231    <activeTagsFiles/> 
  • mixpp.kdevelop.filelist

    r8 r11  
    11# KDevelop Custom Project File List 
    22Makefile 
    3 arx.cpp 
    43doc 
    54doc/latex 
  • testKF.cpp

    r9 r11  
    1717        // input from Matlab 
    1818        it_file fin( "testKF.it" ); 
     19 
    1920        mat Dt, Xt,Xt2; 
    2021        int Ndat; 
  • testPF.cpp

    r8 r11  
    1919        ldmat R("1"); 
    2020         
     21         
     22        vec ptc = randn(10); 
     23        vec w = exp(-0.5*(pow(ptc,2))/0.2); 
     24         
     25        cout << "p:" << ptc << endl; 
     26        cout << "w:" << w << endl; 
     27         
     28        PF pf(w); 
     29        ivec ind = pf.resample(); 
     30         
     31        cout << ind << endl; 
     32        /* 
    2133        mlnorm<ldmat> obs(x,xm,A,R); 
    2234        mlnorm<ldmat> par(y,x,A,R); 
    2335         
    2436        TrivialPF TPF(obs,par,10); 
     37        */ 
    2538        //Exit program: 
    2639        return 0;