root/bdm/estim/merger.h @ 286

Revision 286, 3.7 kB (checked in by smidl, 15 years ago)

make mpdm work again

  • 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{
20using std::string;
21
22/*!
23@brief Function for general combination of pdfs
24
25Mixtures of Gaussian densities are used internally. Switching to other densities should be trivial.
26*/
27
28class merger : public compositepdf, public epdf {
29protected:
30        //!Internal mixture of EF models
31        MixEF Mix;
32        //! Data link for each mpdf in mpdfs
33        Array<datalink_m2e*> dls;
34        //! Array of rvs that are not modelled by mpdfs at all (aux)
35        Array<RV> rvzs;
36        //! Data Links of rv0 mpdfs - these will be conditioned the (rv,rvc) of mpdfs
37        Array<datalink_m2e*> zdls;
38
39        //!Number of samples used in approximation
40        int Ns;
41        //!Number of components in a mixture
42        int Nc;
43        //!Prior on the log-normal merging model
44        double beta;
45        //! Projection to empirical density
46        eEmp eSmp;
47
48public:
49//!Default constructor
50        merger ( const Array<mpdf*> &S ) :
51                        compositepdf ( S ), epdf ( ),
52                        Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp() {
53                RV ztmp;
54                rv = getrv(false);
55                dim = rv._dsize();
56                // Extend rv by rvc!
57                RV rvc; setrvc ( rv,rvc );
58                rv.add ( rvc );
59                for ( int i=0;i<n;i++ ) {
60                        //Establich connection between mpdfs and merger
61                        dls ( i ) = new datalink_m2e;dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv );
62                        // find out what is missing in each mpdf
63                        ztmp= mpdfs ( i )->_rv();
64                        ztmp.add ( mpdfs ( i )->_rvc() );
65                        rvzs ( i ) =rv.subt ( ztmp );
66                        zdls ( i ) = new datalink_m2e; zdls(i)->set_connection ( rvzs ( i ), ztmp, rv ) ;
67                };
68                //Set Default values of parameters
69                beta=2.0;
70                Ns=100;
71                Nc=10;
72                Mix.set_method ( EM );
73        }
74//! Set internal parameters used in approximation
75        void set_parameters ( double beta0, int Ns0, int Nc0 ) {beta=beta0;Ns=Ns0;Nc=Nc0;eSmp.set_parameters(Ns0,false);}
76//!Initialize the proposal density. This function must be called before merge()!
77        void init() { ////////////// NOT FINISHED
78                Array<vec> Smps ( n );
79                //Gibbs sampling
80                for ( int i=0;i<n;i++ ) {Smps ( i ) =zeros ( 0 );}
81        }
82//!Create a mixture density using known proposal
83        void merge ( const epdf* g0 );
84//!Create a mixture density, make sure to call init() before the first call
85        void merge () {merge ( & ( Mix.posterior() ) );};
86
87//! Merge log-likelihood values
88        vec lognorm_merge ( mat &lW );
89//! sample from merged density
90//! weight w is a
91        vec sample ( ) const { return Mix.posterior().sample();}
92        double evallog ( const vec &dt ) const {
93                vec dtf=ones ( dt.length() +1 );
94                dtf.set_subvector ( 0,dt );
95                return Mix.logpred ( dtf );
96        }
97        vec mean() const {
98                const Vec<double> &w = eSmp._w();
99                const Array<vec> &S = eSmp._samples();
100                vec tmp=zeros ( dim); 
101                for ( int i=0; i<Ns; i++ ) {
102                        tmp+=w ( i ) *S ( i );
103                }
104                return tmp;
105        }
106        mat covariance() const {
107                const vec &w = eSmp._w();
108                const Array<vec> &S = eSmp._samples();
109               
110                vec mea = mean(); 
111               
112                cout << sum(w) << "," << w*w <<endl;
113               
114                mat Tmp=zeros(dim, dim);
115                for ( int i=0; i<Ns; i++ ) {
116                        Tmp+=w ( i ) *outer_product(S ( i ), S(i));
117                }
118                return Tmp-outer_product(mea,mea);
119        }
120        vec variance() const {
121                const vec &w = eSmp._w();
122                const Array<vec> &S = eSmp._samples();
123               
124                vec tmp=zeros(dim);
125                for ( int i=0; i<Ns; i++ ) {
126                        tmp+=w ( i ) *pow(S ( i ),2);
127                }
128                return tmp-pow(mean(),2);
129        }
130//! for future use
131        virtual ~merger() {
132                for ( int i=0; i<n; i++ ) {
133                        delete dls ( i );
134                        delete zdls ( i );
135                }
136        };
137
138//! Access function
139        MixEF& _Mix() {return Mix;}
140//! Access function
141        eEmp& _Smp() {return eSmp;}
142};
143
144}
145
146#endif // MER_H
Note: See TracBrowser for help on using the browser.