root/bdm/stat/libEF.cpp @ 96

Revision 96, 4.6 kB (checked in by smidl, 16 years ago)

changes in EF - introduction of the lognc() function

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
14vec egiw::sample() const {
15        it_warning("Function not implemented");
16        return vec_1(0.0);
17}
18
19double egiw::evalpdflog( const vec &val ) const {
20        int nPsi = rv.count()-1; // assuming 1dim y
21        double k = nu + nPsi + 2;
22       
23        double r = val(nPsi); //last entry!
24        vec Psi(nPsi+1);
25        Psi(0) = -1.0;
26        Psi.set_subvector(1,val); // fill the rest
27       
28        return -0.5*( k*log(r) + V.qform(Psi)) - lognc();
29}
30
31double egiw::lognc() const{
32        const vec& D = V._D();
33        int nPsi = D.length()-1; // assuming 1dim y
34
35// log(2) = 0.693147180559945286226763983
36// log(pi) = 1.144729885849400163877476189
37return lgamma(0.5*nu) + 0.5*((1.0-nu)*log(D(0)) - V.logdet() + (nu+nPsi)*0.693147180559945286226763983 + nPsi*1.144729885849400163877476189);
38}
39
40vec egiw::mean() const {
41        const mat &L= V._L();
42        const vec &D= V._D();
43       
44        int end = L.rows()-1;
45        vec L0 = L.get_col(0);
46       
47        vec m(D.length());
48        mat iLsub = ltuinv(L(1,end,1,end));
49        m.set_subvector(0,iLsub*L0(1,end));
50        m(end)= D(0)/(nu-2.0);
51       
52        return m;
53}
54
55vec egamma::sample() const {
56        vec smp ( rv.count() );
57        int i;
58
59        for ( i=0; i<rv.count(); i++ ) {
60                GamRNG.setup ( alpha ( i ),beta ( i ) );
61                smp ( i ) = GamRNG();
62        }
63
64        return smp;
65}
66
67mat egamma::sample ( int N ) const {
68        mat Smp ( rv.count(),N );
69        int i,j;
70
71        for ( i=0; i<rv.count(); i++ ) {
72                GamRNG.setup ( alpha ( i ),beta ( i ) );
73
74                for ( j=0; j<N; j++ ) {
75                        Smp ( i,j ) = GamRNG();
76                }
77        }
78
79        return Smp;
80}
81
82double egamma::evalpdflog ( const vec &val ) const {
83        double res = 0.0; //the rest will be added
84        int i;
85
86        for ( i=0; i<rv.count(); i++ ) {
87                res += ( alpha ( i ) - 1 ) *std::log ( val ( i ) ) - beta ( i ) *val ( i );
88        }
89
90        return res-lognc();
91}
92
93double egamma::lognc() const {
94        double res = 0.0; //will be added
95        int i;
96
97        for ( i=0; i<rv.count(); i++ ) {
98                res += lgamma ( alpha ( i ) ) - alpha ( i ) *std::log ( beta ( i ) ) ;
99        }
100
101        return res;
102}
103
104//MGamma
105mgamma::mgamma ( const RV &rv,const RV &rvc ) : mEF ( rv,rvc ), epdf ( rv ) {vec* tmp; epdf._param ( tmp,_beta );};
106
107void mgamma::set_parameters ( double k0 ) {
108        k=k0;
109        ep = &epdf;
110        epdf.set_parameters ( k*ones ( rv.count() ),*_beta );
111};
112
113vec mgamma::samplecond ( vec &cond, double &ll ) {
114        this->condition(cond );
115        vec smp = epdf.sample();
116        ll = epdf.evalpdflog ( smp );
117        return smp;
118};
119
120//Fixme repetition of mlnorm.samplecond.
121mat mgamma::samplecond ( vec &cond, vec &lik, int n ) {
122        int i;
123        int dim = rv.count();
124        mat Smp ( dim,n );
125        vec smp ( dim );
126        this->condition ( cond );
127
128        for ( i=0; i<n; i++ ) {
129                smp = epdf.sample();
130                lik ( i ) = epdf.eval ( smp );
131                Smp.set_col ( i ,smp );
132        }
133
134        return Smp;
135};
136
137ivec eEmp::resample ( RESAMPLING_METHOD method ) {
138        ivec ind=zeros_i ( n );
139        ivec N_babies = zeros_i ( n );
140        vec cumDist = cumsum ( w );
141        vec u ( n );
142        int i,j,parent;
143        double u0;
144
145        switch ( method ) {
146        case MULTINOMIAL:
147                u ( n - 1 ) = pow ( UniRNG.sample(), 1.0 / n );
148
149                for ( i = n - 2;i >= 0;i-- ) {
150                        u ( i ) = u ( i + 1 ) * pow ( UniRNG.sample(), 1.0 / ( i + 1 ) );
151                }
152
153                break;
154
155        case STRATIFIED:
156
157                for ( i = 0;i < n;i++ ) {
158                        u ( i ) = ( i + UniRNG.sample() ) / n;
159                }
160
161                break;
162
163        case SYSTEMATIC:
164                u0 = UniRNG.sample();
165
166                for ( i = 0;i < n;i++ ) {
167                        u ( i ) = ( i + u0 ) / n;
168                }
169
170                break;
171
172        default:
173                it_error ( "PF::resample(): Unknown resampling method" );
174        }
175
176        // U is now full
177        j = 0;
178
179        for ( i = 0;i < n;i++ ) {
180                while ( u ( i ) > cumDist ( j ) ) j++;
181
182                N_babies ( j ) ++;
183        }
184
185        // We have assigned new babies for each Particle
186        // Now, we fill the resulting index such that:
187        // * particles with at least one baby should not move *
188        // This assures that reassignment can be done inplace;
189
190        // find the first parent;
191        parent=0; while ( N_babies ( parent ) ==0 ) parent++;
192
193        // Build index
194        for ( i = 0;i < n;i++ ) {
195                if ( N_babies ( i ) > 0 ) {
196                        ind ( i ) = i;
197                        N_babies ( i ) --; //this index was now replicated;
198                } else {
199                        // test if the parent has been fully replicated
200                        // if yes, find the next one
201                        while ( ( N_babies ( parent ) ==0 ) || ( N_babies ( parent ) ==1 && parent>i ) ) parent++;
202
203                        // Replicate parent
204                        ind ( i ) = parent;
205
206                        N_babies ( parent ) --; //this index was now replicated;
207                }
208
209        }
210
211        // copy the internals according to ind
212        for ( i=0;i<n;i++ ) {
213                if ( ind ( i ) !=i ) {
214                        samples ( i ) =samples ( ind ( i ) );
215                }
216                w ( i ) = 1.0/n;
217        }
218
219        return ind;
220}
221
222void eEmp::set_parameters ( const vec &w0, epdf* epdf0 ) {
223//it_assert_debug(rv==epdf0->rv(),"Wrong epdf0");
224        w=w0;
225        w/=sum ( w0 );//renormalize
226        n=w.length();
227        samples.set_size ( n );
228
229        for ( int i=0;i<n;i++ ) {samples ( i ) =epdf0->sample();}
230}
Note: See TracBrowser for help on using the browser.