libEF.h itpp/itbase.h ../math/libDC.h libBM.h ../itpp_ext.h work/git/mixpp/bdm/estim/arx.h work/git/mixpp/bdm/estim/libKF.h work/git/mixpp/bdm/estim/libPF.h work/git/mixpp/bdm/stat/emix.h work/git/mixpp/bdm/stat/libEF.cpp work/git/mixpp/bdm/stat/merger.h work/git/mixpp/mpdm/merg_pred.cpp work/git/mixpp/tests/arx_test.cpp work/git/mixpp/tests/merger_test.cpp work/git/mixpp/tests/testEpdf.cpp work/git/mixpp/tests/testPF.cpp work/git/mixpp/tests/testResample.cpp work/git/mixpp/tests/testSmp.cpp eEF mEF enorm egiw egamma euni mlnorm mgamma mgamma_fix eEmp RESAMPLING_METHOD MULTINOMIAL 0 STRATIFIED 1 SYSTEMATIC 3 Switch between various resampling methods. Uniform_RNG Uniform_RNG UniRNG UniRNG Global Uniform_RNG. Normal_RNG Normal_RNG NorRNG NorRNG Global Normal_RNG. Gamma_RNG Gamma_RNG GamRNG GamRNG Global Gamma_RNG. Probability distributions for Exponential Family models. Vaclav Smidl. ----------------------------------- BDM++ - C++ library for Bayesian Decision Making under UncertaintyUsing IT++ for numerical operations ----------------------------------- #ifndefEF_H #defineEF_H #include<itpp/itbase.h> #include"../math/libDC.h" #include"libBM.h" #include"../itpp_ext.h" //#include<std> usingnamespaceitpp; externUniform_RNGUniRNG; externNormal_RNGNorRNG; externGamma_RNGGamRNG; classeEF:publicepdf{ public: //eEF():epdf(){}; eEF(constRV&rv):epdf(rv){}; virtualdoublelognc()const=0; virtualvoidtupdate(doublephi,mat&vbar,doublenubar){}; virtualvoiddupdate(mat&v,doublenu=1.0){}; }; classmEF:publicmpdf{ public: mEF(constRV&rv0,constRV&rvc0):mpdf(rv0,rvc0){}; }; template<classsq_T> classenorm:publiceEF{ protected: vecmu; sq_TR; intdim; public: //enorm():eEF(){}; enorm(RV&rv); voidset_parameters(constvec&mu,constsq_T&R); voidtupdate(doublephi,mat&vbar,doublenubar); voiddupdate(mat&v,doublenu=1.0); vecsample()const; matsample(intN)const; doubleeval(constvec&val)const; doubleevalpdflog(constvec&val)const; doublelognc()const; vecmean()const{returnmu;} //Accessmethods vec&_mu(){returnmu;} voidset_mu(constvecmu0){mu=mu0;} sq_T&_R(){returnR;} matgetR(){returnR.to_mat();} }; classegiw:publiceEF{ protected: ldmatV; doublenu; public: egiw(RVrv,matV0,doublenu0):eEF(rv),V(V0),nu(nu0){ it_assert_debug(rv.count()==V.rows(),"IncompatibleV0."); } vecsample()const; vecmean()const; doubleevalpdflog(constvec&val)const; doublelognc()const; //Access ldmat&_V(){returnV;} double&_nu(){returnnu;} }; classegamma:publiceEF{ protected: vecalpha; vecbeta; public: egamma(constRV&rv):eEF(rv){}; voidset_parameters(constvec&a,constvec&b){alpha=a,beta=b;}; vecsample()const; //matsample(intN)const; doubleevalpdflog(constvec&val)const; doublelognc()const; void_param(vec*&a,vec*&b){a=&alpha;b=&beta;}; vecmean()const{vecpom(alpha);pom/=beta;returnpom;} }; /* classemix:publicepdf{ protected: intn; vec&w; Array<epdf*>Coms; public: emix(constRV&rv,vec&w0):epdf(rv),n(w0.length()),w(w0),Coms(n){}; voidset_parameters(int&i,doublewi,epdf*ep){w(i)=wi;Coms(i)=ep;} vecmean(){vecpom;for(inti=0;i<n;i++){pom+=Coms(i)->mean()*w(i);}returnpom;}; vecsample(){it_error("Notimplemented");return0;} }; */ classeuni:publicepdf{ protected: veclow; vechigh; vecdistance; doublenk; doublelnk; public: euni(constRVrv):epdf(rv){} doubleeval(constvec&val)const{returnnk;} doubleevalpdflog(constvec&val)const{returnlnk;} vecsample()const{ vecsmp(rv.count()); #pragmaompcritical UniRNG.sample_vector(rv.count(),smp); returnlow+elem_mult(distance,smp); } voidset_parameters(constvec&low0,constvec&high0){ distance=high0-low0; it_assert_debug(min(distance)>0.0,"badsupport"); low=low0; high=high0; nk=prod(1.0/distance); lnk=log(nk); } vecmean()const{vecpom=high;pom-=low;pom/=2.0;returnpom;} }; template<classsq_T> classmlnorm:publicmEF{ enorm<sq_T>epdf; matA; vec&_mu;//cachedepdf.mu; public: mlnorm(RV&rv,RV&rvc); voidset_parameters(constmat&A,constsq_T&R); vecsamplecond(vec&cond,double&lik); matsamplecond(vec&cond,vec&lik,intn); voidcondition(vec&cond); }; classmgamma:publicmEF{ protected: egammaepdf; doublek; vec*_beta; public: mgamma(constRV&rv,constRV&rvc); voidset_parameters(doublek); voidcondition(constvec&val){*_beta=k/val;}; }; classmgamma_fix:publicmgamma{ protected: doublel; vecrefl; public: mgamma_fix(constRV&rv,constRV&rvc):mgamma(rv,rvc),refl(rv.count()){}; voidset_parameters(doublek0,vecref0,doublel0){ mgamma::set_parameters(k0); refl=pow(ref0,1.0-l0);l=l0; }; voidcondition(constvec&val){vecmean=elem_mult(refl,pow(val,l));*_beta=k/mean;}; }; enumRESAMPLING_METHOD{MULTINOMIAL=0,STRATIFIED=1,SYSTEMATIC=3}; classeEmp:publicepdf{ protected: intn; vecw; Array<vec>samples; public: eEmp(constRV&rv0,intn0):epdf(rv0),n(n0),w(n),samples(n){}; voidset_parameters(constvec&w0,epdf*pdf0); vec&_w(){returnw;}; Array<vec>&_samples(){returnsamples;}; ivecresample(RESAMPLING_METHODmethod=SYSTEMATIC); vecsample()const{it_error("Notimplemented");return0;} doubleevalpdflog(constvec&val)const{it_error("Notimplemented");return0.0;} vecmean()const{ vecpom=zeros(rv.count()); for(inti=0;i<n;i++){pom+=samples(i)*w(i);} returnpom; } }; template<classsq_T> enorm<sq_T>::enorm(RV&rv):eEF(rv),mu(rv.count()),R(rv.count()),dim(rv.count()){}; template<classsq_T> voidenorm<sq_T>::set_parameters(constvec&mu0,constsq_T&R0){ //Fixmetestdimensionsofmu0andR0; mu=mu0; R=R0; }; template<classsq_T> voidenorm<sq_T>::dupdate(mat&v,doublenu){ // }; template<classsq_T> voidenorm<sq_T>::tupdate(doublephi,mat&vbar,doublenubar){ // }; template<classsq_T> vecenorm<sq_T>::sample()const{ vecx(dim); NorRNG.sample_vector(dim,x); vecsmp=R.sqrt_mult(x); smp+=mu; returnsmp; }; template<classsq_T> matenorm<sq_T>::sample(intN)const{ matX(dim,N); vecx(dim); vecpom; inti; for(i=0;i<N;i++){ NorRNG.sample_vector(dim,x); pom=R.sqrt_mult(x); pom+=mu; X.set_col(i,pom); } returnX; }; template<classsq_T> doubleenorm<sq_T>::eval(constvec&val)const{ doublepdfl,e; pdfl=evalpdflog(val); e=exp(pdfl); returne; }; template<classsq_T> doubleenorm<sq_T>::evalpdflog(constvec&val)const{ //1.83787706640935=log(2pi) return-0.5*(+R.invqform(mu-val))-lognc(); }; template<classsq_T> inlinedoubleenorm<sq_T>::lognc()const{ //1.83787706640935=log(2pi) return-0.5*(R.cols()*1.83787706640935+R.logdet()); }; template<classsq_T> mlnorm<sq_T>::mlnorm(RV&rv0,RV&rvc0):mEF(rv0,rvc0),epdf(rv0),A(rv0.count(),rv0.count()),_mu(epdf._mu()){ep=&epdf; } template<classsq_T> voidmlnorm<sq_T>::set_parameters(constmat&A0,constsq_T&R0){ epdf.set_parameters(zeros(rv.count()),R0); A=A0; } template<classsq_T> vecmlnorm<sq_T>::samplecond(vec&cond,double&lik){ this->condition(cond); vecsmp=epdf.sample(); lik=epdf.eval(smp); returnsmp; } template<classsq_T> matmlnorm<sq_T>::samplecond(vec&cond,vec&lik,intn){ inti; intdim=rv.count(); matSmp(dim,n); vecsmp(dim); this->condition(cond); for(i=0;i<n;i++){ smp=epdf.sample(); lik(i)=epdf.eval(smp); Smp.set_col(i,smp); } returnSmp; } template<classsq_T> voidmlnorm<sq_T>::condition(vec&cond){ _mu=A*cond; //Risalreadyassigned; } #endif//EF_H