root/bdm/estim/arx.cpp @ 357

Revision 357, 5.6 kB (checked in by mido, 15 years ago)

mnoho zmen:
1) presun FindXXX modulu do \system
2) zalozeni dokumentace \doc\local\library_structure.dox
3) presun obsahu \tests\UI primo do \tests
4) namisto \INSTALL zalozen \install.html, je to vhodnejsi pro uzivatele WINDOWS, a snad i obecne
5) snaha o predelani veskerych UI podle nove koncepce, soubory pmsm_ui.h, arx_ui.h, KF_ui.h, libDS_ui.h, libEF_ui.h a loggers_ui.h ponechavam
jen zdokumentacnich duvodu, nic by na nich jiz nemelo zaviset, a po zkontrolovani spravnosti provedenych uprav by mely byt smazany
6) predelani estimatoru tak, aby fungoval s novym UI konceptem
7) vytazeni tridy bdmroot do samostatneho souboru \bdm\bdmroot.h
8) pridana dokumentace pro zacleneni programu ASTYLE do Visual studia, ASTYLE pridan do instalacniho balicku pro Windows

  • Property svn:eol-style set to native
Line 
1#include "arx.h"
2#include "..\user_info.h"
3
4namespace bdm {
5
6void ARX::bayes ( const vec &dt, const double w ) {
7        double lnc;
8
9        if ( frg<1.0 ) {
10                est.pow ( frg );
11                if ( evalll ) {
12                        last_lognc = est.lognc();
13                }
14        }
15        V.opupdt ( dt,w );
16        nu+=w;
17
18        // log(sqrt(2*pi)) = 0.91893853320467
19        if ( evalll ) {
20                lnc = est.lognc();
21                ll = lnc - last_lognc - 0.91893853320467;
22                last_lognc = lnc;
23        }
24}
25
26double ARX::logpred ( const vec &dt ) const {
27        egiw pred ( est );
28        ldmat &V=pred._V();
29        double &nu=pred._nu();
30
31        double lll;
32
33        if ( frg<1.0 ) {
34                pred.pow ( frg );
35                lll = pred.lognc();
36        }
37        else//should be save: last_lognc is changed only by bayes;
38                if ( evalll ) {lll=last_lognc;}
39                else{lll=pred.lognc();}
40
41        V.opupdt ( dt,1.0 );
42        nu+=1.0;
43        // log(sqrt(2*pi)) = 0.91893853320467
44        return pred.lognc()-lll - 0.91893853320467;
45}
46
47ARX* ARX::_copy_ ( ) const {
48        ARX* Tmp=new ARX ( *this );
49        return Tmp;
50}
51
52void ARX::set_statistics ( const BMEF* B0 ) {
53        const ARX* A0=dynamic_cast<const ARX*> ( B0 );
54
55        it_assert_debug ( V.rows() ==A0->V.rows(),"ARX::set_statistics Statistics  differ" );
56        set_statistics ( A0->dimx, A0->V, A0->nu );
57}
58
59enorm<ldmat>* ARX::epredictor ( const vec &rgr ) const {
60        int dim=dimx;//est.dimension();
61        mat mu ( dim, V.rows()-dim );
62        mat R ( dim,dim );
63
64        enorm<ldmat>* tmp;
65        tmp=new enorm<ldmat> ( );
66        //TODO: too hackish
67        if ( drv._dsize() >0 ) {
68        }
69
70        est.mean_mat ( mu,R ); //mu =
71        //correction for student-t  -- TODO check if correct!!
72        //R*=nu/(nu-2);
73        mat p_mu=mu.T() *rgr;   //the result is one column
74        tmp->set_parameters ( p_mu.get_col ( 0 ),ldmat ( R ) );
75        return tmp;
76}
77
78mlnorm<ldmat>* ARX::predictor ( ) const {
79        int dim=est.dimension();
80        int dif=V.rows() - dim ;///<----------- TODO
81        it_assert_debug ( ( dif==0 ) || ( dif==1 ), "Give RVs do not match" );
82
83        mat mu ( dim, V.rows()-dim );
84        mat R ( dim,dim );
85        mlnorm<ldmat>* tmp;
86        tmp=new mlnorm<ldmat> ( );
87
88        est.mean_mat ( mu,R ); //mu =
89        mu = mu.T();
90        //correction for student-t  -- TODO check if correct!!
91
92        if ( dif==0 ) { // no constant term
93                tmp->set_parameters ( mu, zeros ( dim ), ldmat ( R ) );
94        }
95        else {
96                //Assume the constant term is the last one:
97                tmp->set_parameters ( mu.get_cols ( 0,mu.cols()-2 ), mu.get_col ( mu.cols()-1 ), ldmat ( R ) );
98        }
99        return tmp;
100}
101
102mlstudent* ARX::predictor_student ( ) const {
103        int dim = est.dimension();
104        int dif=V.rows() - est.dimension();//-------------TODO
105        it_assert_debug ( ( dif==0 ) || ( dif==1 ), "Give RVs do not match" );
106
107        mat mu ( dim, V.rows()-dim );
108        mat R ( dim,dim );
109        mlstudent* tmp;
110        tmp=new mlstudent ( );
111
112        est.mean_mat ( mu,R ); //
113        mu = mu.T();
114
115        int xdim = dimx;
116        int end = V._L().rows()-1;
117        ldmat Lam ( V._L() ( xdim,end,xdim,end ), V._D() ( xdim,end ) );  //exp val of R
118
119
120        if ( dif==0 ) { // no constant term
121                tmp->set_parameters ( mu, zeros ( xdim ), ldmat ( R ), Lam );
122        }
123        else {
124                //Assume the constant term is the last one:
125                if ( mu.cols() >1 ) {
126                        tmp->set_parameters ( mu.get_cols ( 0,mu.cols()-2 ), mu.get_col ( mu.cols()-1 ), ldmat ( R ), Lam );
127                }
128                else {
129                        tmp->set_parameters ( mat(dim,0), mu.get_col ( mu.cols()-1 ), ldmat ( R ), Lam );
130                }
131        }
132        return tmp;
133}
134
135/*! \brief Return the best structure
136@param Eg a copy of GiW density that is being examined
137@param Eg0 a copy of prior GiW density before estimation
138@param Egll likelihood of the current Eg
139@param indeces current indeces
140\return best likelihood in the structure below the given one
141*/
142double egiw_bestbelow ( egiw Eg, egiw Eg0, double Egll, ivec &indeces ) { //parameter Eg is a copy!
143        ldmat Vo = Eg._V(); //copy
144        ldmat Vo0 = Eg._V(); //copy
145        ldmat& Vp = Eg._V(); // pointer into Eg
146        ldmat& Vp0 = Eg._V(); // pointer into Eg
147        int end = Vp.rows()-1;
148        int i;
149        mat Li;
150        mat Li0;
151        double maxll=Egll;
152        double tmpll=Egll;
153        double belll=Egll;
154
155        ivec tmpindeces;
156        ivec maxindeces=indeces;
157
158
159        cout << "bb:(" << indeces <<") ll=" << Egll <<endl;
160
161        //try to remove only one rv
162        for ( i=0;i<end;i++ ) {
163                //copy original
164                Li = Vo._L();
165                Li0 = Vo0._L();
166                //remove stuff
167                Li.del_col ( i+1 );
168                Li0.del_col ( i+1 );
169                Vp.ldform ( Li,Vo._D() );
170                Vp0.ldform ( Li0,Vo0._D() );
171                tmpll = Eg.lognc()-Eg0.lognc(); // likelihood is difference of norm. coefs.
172
173                cout << "i=(" << i <<") ll=" << tmpll <<endl;
174
175                //
176                if ( tmpll > Egll ) { //increase of the likelihood
177                        tmpindeces = indeces;
178                        tmpindeces.del ( i );
179                        //search for a better match in this substructure
180                        belll=egiw_bestbelow ( Eg, Eg0, tmpll, tmpindeces );
181                        if ( belll>maxll ) { //better match found
182                                maxll = belll;
183                                maxindeces = tmpindeces;
184                        }
185                }
186        }
187        indeces = maxindeces;
188        return maxll;
189}
190
191ivec ARX::structure_est ( egiw est0 ) {
192        ivec ind=linspace ( 1,est.dimension()-1 );
193        egiw_bestbelow ( est, est0, est.lognc()- est0.lognc(), ind );
194        return ind;
195}
196
197void ARX::from_setting( const Setting &root ) 
198{       
199        RV *yrv = UI::build<RV>(root,"y");
200        RV *rrv = UI::build<RV>(root,"rgr");
201        int ylen = yrv->_dsize();
202        int rgrlen = rrv->_dsize();
203       
204        //init
205        mat V0;
206        if( root.exists("dV0") )
207        {
208                vec dV0;
209                UI::get( dV0, root, "dV0" );
210                V0=diag ( dV0 );
211        }
212        else
213                V0=concat ( 1e-3*ones ( ylen ), 1e-5*ones ( rgrlen ) );
214       
215        double nu0;
216        if ( !root.lookupValue( "nu0", nu0 ) ) 
217                nu0 = rgrlen+ylen+2;
218
219        double frg;
220        if ( !root.lookupValue( "frg", frg ) ) 
221                frg = 1.0;
222
223        set_parameters(frg);
224        set_statistics(ylen,V0, nu0);
225        set_drv(concat(*yrv,*rrv));
226       
227        //name results (for logging)
228        set_rv(RV("{theta r }", vec_2(ylen*rgrlen, ylen*ylen)));
229       
230        delete yrv; 
231        delete rrv;
232}
233
234/*void ARX::to_setting( Setting &root ) const
235{       
236        Transport::to_setting( root );
237
238        Setting &kilometers_setting = root.add("kilometers", Setting::TypeInt );
239        kilometers_setting = kilometers;
240
241        UI::save( passengers, root, "passengers" );
242}*/
243
244
245}
Note: See TracBrowser for help on using the browser.