root/bdm/estim/merger.h @ 311

Revision 311, 5.3 kB (checked in by smidl, 15 years ago)

merger

  • Property svn:eol-style set to native
Line 
1/*!
2  \file
3  \brief Mergers for combination of pdfs
4  \author Vaclav Smidl.
5
6  -----------------------------------
7  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
8
9  Using IT++ for numerical operations
10  -----------------------------------
11*/
12
13#ifndef MER_H
14#define MER_H
15
16
17#include "mixef.h"
18
19namespace bdm
20{
21        using std::string;
22
23        /*!
24        @brief Function for general combination of pdfs
25
26        Mixtures of Gaussian densities are used internally. Switching to other densities should be trivial.
27        */
28
29        class merger : public compositepdf, public epdf
30        {
31                protected:
32                        //!Internal mixture of EF models
33                        MixEF Mix;
34                        //! Data link for each mpdf in mpdfs
35                        Array<datalink_m2e*> dls;
36                        //! Array of rvs that are not modelled by mpdfs at all (aux)
37                        Array<RV> rvzs;
38                        //! Data Links of rv0 mpdfs - these will be conditioned the (rv,rvc) of mpdfs
39                        Array<datalink_m2e*> zdls;
40
41                        //!Number of samples used in approximation
42                        int Ns;
43                        //!Number of components in a mixture
44                        int Nc;
45                        //!Prior on the log-normal merging model
46                        double beta;
47                        //! Projection to empirical density
48                        eEmp eSmp;
49                        //! coefficient of resampling
50                        double effss_coef;
51
52                        //! debug or not debug
53                        bool DBG;
54                        //! debugging file
55                        it_file* dbg;
56                        //! Flag if the samples are fixed or not
57                        bool fix_smp;
58                public:
59//!Default constructor
60                        merger ( const Array<mpdf*> &S ) :
61                                        compositepdf ( S ), epdf ( ),
62                                        Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp()
63                        {
64                                RV ztmp;
65                                rv = getrv ( false );
66                                RV rvc; setrvc ( rv,rvc ); // Extend rv by rvc!
67                                rv.add ( rvc );
68                                // get dimension
69                                dim = rv._dsize();
70
71                                for ( int i=0;i<n;i++ )
72                                {
73                                        //Establich connection between mpdfs and merger
74                                        dls ( i ) = new datalink_m2e;dls ( i )->set_connection ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv );
75                                        // find out what is missing in each mpdf
76                                        ztmp= mpdfs ( i )->_rv();
77                                        ztmp.add ( mpdfs ( i )->_rvc() );
78                                        rvzs ( i ) =rv.subt ( ztmp );
79                                        zdls ( i ) = new datalink_m2e; zdls ( i )->set_connection ( rvzs ( i ), ztmp, rv ) ;
80                                };
81                                //Set Default values of parameters
82                                beta=2.0;
83                                Ns=100;
84                                Nc=10;
85                                Mix.set_method ( EM );
86                                DBG = false;
87                                fix_smp = false;
88                        }
89                        //! set debug file
90                        void debug_file ( const string fname ) { if ( DBG ) delete dbg; dbg = new it_file ( fname ); if ( dbg ) DBG=true;}
91//! Set internal parameters used in approximation
92                        void set_parameters ( double beta0, int Ns0, int Nc0, double effss_coef0=0.5 ) {beta=beta0;
93                                Ns=Ns0;
94                                Nc=Nc0;
95                                effss_coef=effss_coef0;
96                                eSmp.set_parameters ( Ns0,false );
97                        }
98                        void set_grid ( Array<vec> &XYZ )
99                        {
100                                int dim=XYZ.length(); ivec szs ( dim );
101                                for(int i=0; i<dim;i++){szs=XYZ(i).length();}
102                                Ns=prod(szs);
103                                eSmp.set_parameters(Ns,false);
104                                Array<vec> &samples=eSmp._samples();
105                                eSmp._w()=ones(Ns)/Ns;
106                                               
107                                //set samples
108                                ivec is=zeros_i(dim);//indeces of dimensions in for cycle;
109                                vec smpi(dim);
110                                for(int i=0; i<Ns; i++){
111                                        for(int j=0; j<dim; j++){smpi(j)=XYZ(j)(is(j)); /* jty vector*/ }
112                                        samples(i)=smpi;
113                                        // shift indeces
114                                        for (int j=0;j<dim;j++){
115                                                if (is(j)==szs(j)-1) { //j-th index is full
116                                                        is(j)=0; //shift back
117                                                        is(j+1)++; //increase th next dimension;
118                                                        if (is(j+1)<szs(j+1)-1) break;
119                                                } else {
120                                                        is(j)++; break;
121                                                }
122                                        }
123                                }
124                               
125                                fix_smp = true;
126                        }
127//!Initialize the proposal density. This function must be called before merge()!
128                        void init()   ////////////// NOT FINISHED
129                        {
130                                Array<vec> Smps ( n );
131                                //Gibbs sampling
132                                for ( int i=0;i<n;i++ ) {Smps ( i ) =zeros ( 0 );}
133                        }
134//!Create a mixture density using known proposal
135                        void merge ( const epdf* g0 );
136//!Create a mixture density, make sure to call init() before the first call
137                        void merge () {merge ( & ( Mix.posterior() ) );};
138
139//! Merge log-likelihood values
140                        vec lognorm_merge ( mat &lW );
141//! sample from merged density
142//! weight w is a
143                        vec sample ( ) const { return Mix.posterior().sample();}
144                        double evallog ( const vec &dt ) const
145                        {
146                                vec dtf=ones ( dt.length() +1 );
147                                dtf.set_subvector ( 0,dt );
148                                return Mix.logpred ( dtf );
149                        }
150                        vec mean() const
151                        {
152                                const Vec<double> &w = eSmp._w();
153                                const Array<vec> &S = eSmp._samples();
154                                vec tmp=zeros ( dim );
155                                for ( int i=0; i<Ns; i++ )
156                                {
157                                        tmp+=w ( i ) *S ( i );
158                                }
159                                return tmp;
160                        }
161                        mat covariance() const
162                        {
163                                const vec &w = eSmp._w();
164                                const Array<vec> &S = eSmp._samples();
165
166                                vec mea = mean();
167
168                                cout << sum ( w ) << "," << w*w <<endl;
169
170                                mat Tmp=zeros ( dim, dim );
171                                for ( int i=0; i<Ns; i++ )
172                                {
173                                        Tmp+=w ( i ) *outer_product ( S ( i ), S ( i ) );
174                                }
175                                return Tmp-outer_product ( mea,mea );
176                        }
177                        vec variance() const
178                        {
179                                const vec &w = eSmp._w();
180                                const Array<vec> &S = eSmp._samples();
181
182                                vec tmp=zeros ( dim );
183                                for ( int i=0; i<Ns; i++ )
184                                {
185                                        tmp+=w ( i ) *pow ( S ( i ),2 );
186                                }
187                                return tmp-pow ( mean(),2 );
188                        }
189//! for future use
190                        virtual ~merger()
191                        {
192                                for ( int i=0; i<n; i++ )
193                                {
194                                        delete dls ( i );
195                                        delete zdls ( i );
196                                }
197                                if ( DBG ) delete dbg;
198                        };
199
200//! Access function
201                        MixEF& _Mix() {return Mix;}
202//! Access function
203                        emix* proposal() {emix* tmp=Mix.epredictor(); tmp->set_rv(rv); return tmp;}
204//! Access function
205                        eEmp& _Smp() {return eSmp;}
206        };
207
208}
209
210#endif // MER_H
Note: See TracBrowser for help on using the browser.