root/bdm/stat/libEF.cpp @ 197

Revision 197, 5.7 kB (checked in by smidl, 16 years ago)

opravy v bdm

Line 
1#include <itpp/itbase.h>
2#include <itpp/base/bessel.h>
3#include "libEF.h"
4#include <math.h>
5
6using namespace itpp;
7
8Uniform_RNG UniRNG;
9Normal_RNG NorRNG;
10Gamma_RNG GamRNG;
11
12using std::cout;
13
14void BMEF::bayes ( const vec &dt ) {this->bayes ( dt,1.0 );};
15
16vec egiw::sample() const {
17        it_warning ( "Function not implemented" );
18        return vec_1 ( 0.0 );
19}
20
21double egiw::evalpdflog_nn ( const vec &val ) const {
22        int vend = val.length()-1;
23
24        if ( xdim==1 ) { //same as the following, just quicker.
25                double r = val ( vend ); //last entry!
26                vec Psi ( nPsi+xdim );
27                Psi ( 0 ) = -1.0;
28                Psi.set_subvector ( 1,val ( 0,vend-1 ) ); // fill the rest
29
30                double Vq=V.qform ( Psi );
31                return -0.5* ( nu*log ( r ) + Vq /r );
32        }
33        else {
34                mat Th= reshape ( val ( 0,nPsi*xdim-1 ),nPsi,xdim );
35                fsqmat R ( reshape ( val ( nPsi*xdim,vend ),xdim,xdim ) );
36                mat Tmp=concat_vertical ( -eye ( xdim ),Th );
37                fsqmat iR ( xdim );
38                R.inv ( iR );
39
40                return -0.5* ( nu*R.logdet() + trace ( iR.to_mat() *Tmp.T() *V.to_mat() *Tmp ) );
41        }
42}
43
44double egiw::lognc() const {
45        const vec& D = V._D();
46
47        double m = nu - nPsi -xdim-1;
48#define log2  0.693147180559945286226763983
49#define logpi 1.144729885849400163877476189
50#define log2pi 1.83787706640935
51#define Inf std::numeric_limits<double>::infinity()
52
53        double nkG = 0.5* xdim* ( -nPsi *log2pi + sum ( log ( D ( xdim,D.length()-1 ) ) ) );
54        // temporary for lgamma in Wishart
55        double lg=0;
56        for ( int i =0; i<xdim;i++ ) {lg+=lgamma ( 0.5* ( m-i ) );}
57
58        double nkW = 0.5* ( m*sum ( log ( D ( 0,xdim-1 ) ) ) ) \
59                     - 0.5*xdim* ( m*log2 + 0.5* ( xdim-1 ) *log2pi )  - lg;
60
61        it_assert_debug(((-nkG-nkW)>-Inf) && ((-nkG-nkW)<Inf), "ARX improper");
62        return -nkG-nkW;
63}
64
65vec egiw::mean() const {
66
67        if ( xdim==1 ) {
68                const mat &L= V._L();
69                const vec &D= V._D();
70                int end = L.rows()-1;
71
72                vec m ( rv.count() );
73                mat iLsub = ltuinv ( L ( xdim,end,xdim,end ) );
74
75                vec L0 = L.get_col ( 0 );
76
77                m.set_subvector ( 0,iLsub*L0 ( 1,end ) );
78                m ( end ) = D ( 0 ) / ( nu -nPsi -2*xdim -2 );
79                return m;
80        } else {
81                mat M;
82                mat R;
83                mean_mat(M,R);
84                return cvectorize (concat_vertical(M.T(),R));
85        }
86
87}
88void egiw::mean_mat(mat &M, mat&R) const {
89        const mat &L= V._L();
90        const vec &D= V._D();
91        int end = L.rows()-1;
92               
93        ldmat ldR ( L ( 0,xdim-1,0,xdim-1 ), D ( 0,xdim-1 ) / ( nu -nPsi -2*xdim -2 ) ); //exp val of R
94        mat iLsub=ltuinv ( L ( xdim,end,xdim,end ) );
95       
96        // set mean value
97        M= L ( xdim,end,0,xdim-1 ).T()*iLsub;
98        R= ldR.to_mat()  ;
99}
100
101vec egamma::sample() const {
102        vec smp ( rv.count() );
103        int i;
104
105        for ( i=0; i<rv.count(); i++ ) {
106                GamRNG.setup ( alpha ( i ),beta ( i ) );
107#pragma omp critical
108                smp ( i ) = GamRNG();
109        }
110
111        return smp;
112}
113
114// mat egamma::sample ( int N ) const {
115//      mat Smp ( rv.count(),N );
116//      int i,j;
117//
118//      for ( i=0; i<rv.count(); i++ ) {
119//              GamRNG.setup ( alpha ( i ),beta ( i ) );
120//
121//              for ( j=0; j<N; j++ ) {
122//                      Smp ( i,j ) = GamRNG();
123//              }
124//      }
125//
126//      return Smp;
127// }
128
129double egamma::evalpdflog ( const vec &val ) const {
130        double res = 0.0; //the rest will be added
131        int i;
132
133        for ( i=0; i<rv.count(); i++ ) {
134                res += ( alpha ( i ) - 1 ) *std::log ( val ( i ) ) - beta ( i ) *val ( i );
135        }
136
137        return res-lognc();
138}
139
140double egamma::lognc() const {
141        double res = 0.0; //will be added
142        int i;
143
144        for ( i=0; i<rv.count(); i++ ) {
145                res += lgamma ( alpha ( i ) ) - alpha ( i ) *std::log ( beta ( i ) ) ;
146        }
147
148        return res;
149}
150
151//MGamma
152mgamma::mgamma ( const RV &rv,const RV &rvc ) : mEF ( rv,rvc ), epdf ( rv ) {vec* tmp; epdf._param ( tmp,_beta );};
153
154void mgamma::set_parameters ( double k0 ) {
155        k=k0;
156        ep = &epdf;
157        epdf.set_parameters ( k*ones ( rv.count() ),*_beta );
158};
159
160ivec eEmp::resample ( RESAMPLING_METHOD method ) {
161        ivec ind=zeros_i ( n );
162        ivec N_babies = zeros_i ( n );
163        vec cumDist = cumsum ( w );
164        vec u ( n );
165        int i,j,parent;
166        double u0;
167
168        switch ( method ) {
169                case MULTINOMIAL:
170                        u ( n - 1 ) = pow ( UniRNG.sample(), 1.0 / n );
171
172                        for ( i = n - 2;i >= 0;i-- ) {
173                                u ( i ) = u ( i + 1 ) * pow ( UniRNG.sample(), 1.0 / ( i + 1 ) );
174                        }
175
176                        break;
177
178                case STRATIFIED:
179
180                        for ( i = 0;i < n;i++ ) {
181                                u ( i ) = ( i + UniRNG.sample() ) / n;
182                        }
183
184                        break;
185
186                case SYSTEMATIC:
187                        u0 = UniRNG.sample();
188
189                        for ( i = 0;i < n;i++ ) {
190                                u ( i ) = ( i + u0 ) / n;
191                        }
192
193                        break;
194
195                default:
196                        it_error ( "PF::resample(): Unknown resampling method" );
197        }
198
199        // U is now full
200        j = 0;
201
202        for ( i = 0;i < n;i++ ) {
203                while ( u ( i ) > cumDist ( j ) ) j++;
204
205                N_babies ( j ) ++;
206        }
207        // We have assigned new babies for each Particle
208        // Now, we fill the resulting index such that:
209        // * particles with at least one baby should not move *
210        // This assures that reassignment can be done inplace;
211
212        // find the first parent;
213        parent=0; while ( N_babies ( parent ) ==0 ) parent++;
214
215        // Build index
216        for ( i = 0;i < n;i++ ) {
217                if ( N_babies ( i ) > 0 ) {
218                        ind ( i ) = i;
219                        N_babies ( i ) --; //this index was now replicated;
220                }
221                else {
222                        // test if the parent has been fully replicated
223                        // if yes, find the next one
224                        while ( ( N_babies ( parent ) ==0 ) || ( N_babies ( parent ) ==1 && parent>i ) ) parent++;
225
226                        // Replicate parent
227                        ind ( i ) = parent;
228
229                        N_babies ( parent ) --; //this index was now replicated;
230                }
231
232        }
233
234        // copy the internals according to ind
235        for ( i=0;i<n;i++ ) {
236                if ( ind ( i ) !=i ) {
237                        samples ( i ) =samples ( ind ( i ) );
238                }
239                w ( i ) = 1.0/n;
240        }
241
242        return ind;
243}
244
245void eEmp::set_parameters ( const vec &w0, const epdf* epdf0 ) {
246        //it_assert_debug(rv==epdf0->rv(),"Wrong epdf0");
247        w=w0;
248        w/=sum ( w0 );//renormalize
249        n=w.length();
250        samples.set_size ( n );
251
252        for ( int i=0;i<n;i++ ) {samples ( i ) =epdf0->sample();}
253}
254
255void eEmp::set_samples (  const epdf* epdf0 ) {
256        //it_assert_debug(rv==epdf0->rv(),"Wrong epdf0");
257        w=1;
258        w/=sum ( w );//renormalize
259
260        for ( int i=0;i<n;i++ ) {samples ( i ) =epdf0->sample();}
261}
Note: See TracBrowser for help on using the browser.