emix.h libBM.h libEF.h work/git/mixpp/bdm/stat/emix.cpp work/git/mixpp/bdm/stat/merger.h work/git/mixpp/pmsm/pmsm_mix.cpp work/git/mixpp/tests/testSmp.cpp emix mprod mmix Probability distributions for Mixtures of pdfs. Vaclav Smidl. ----------------------------------- BDM++ - C++ library for Bayesian Decision Making under UncertaintyUsing IT++ for numerical operations ----------------------------------- #ifndefMX_H #defineMX_H #include"libBM.h" #include"libEF.h" //#include<std> usingnamespaceitpp; classemix:publicepdf{ protected: vecw; Array<epdf*>Coms; public: emix(RV&rv):epdf(rv){}; voidset_parameters(constvec&w,constArray<epdf*>&Coms); vecsample()const; vecmean()const{ inti;vecmu=zeros(rv.count()); for(i=0;i<w.length();i++){mu+=w(i)*Coms(i)->mean();} returnmu; } doubleevalpdflog(constvec&val)const{ inti; doublesum=0.0; for(i=0;i<w.length();i++){sum+=w(i)*Coms(i)->evalpdflog(val);} returnlog(sum); }; //Accessmethods vec&_w(){returnw;} }; classmprod:publicmpdf{ protected: // intn; //pointerstoepdfs Array<epdf*>epdfs; Array<mpdf*>mpdfs; // Array<ivec>rvinds; Array<ivec>rvcinrv; Array<ivec>rvcinds; boolindependent; ////!Indicateinternalcreationofmpdfswhichmustbedestroyed //boolintermpdfs; public: mprod(Array<mpdf*>mFacs):mpdf(RV(),RV()),n(mFacs.length()),epdfs(n),mpdfs(mFacs),rvinds(n),rvcinrv(n),rvcinds(n){ inti; //Createrv for(i=0;i<n;i++){ rv.add(mpdfs(i)->_rv());//addrvtocommonrvs. epdfs(i)=&(mpdfs(i)->_epdf());//addpointertoepdf }; //Creatervc for(i=0;i<n;i++){ rvc.add(mpdfs(i)->_rv().subt(rv));//addrvtocommonrvs. }; independent=true; //testrvcofmpdfsandfillrvinds for(i=0;i<n;i++){ //findithrvincommonrv rvinds(i)=mpdfs(i)->_rv().dataind(rv); //findithrvcincommonrv rvcinrv(i)=mpdfs(i)->_rvc().dataind(rv); //findithrvcincommonrv rvcinds(i)=mpdfs(i)->_rvc().dataind(rvc); // if(rvcinds(i).length()>0){independent=false;} if(rvcinds(i).length()>0){independent=false;} } }; doubleevalpdflog(constvec&val)const{ inti; doubleres=0.0; for(i=n-1;i>0;i++){ if(rvcinds(i).length()>0) {mpdfs(i)->condition(val(rvcinds(i)));} //addlogarithms res+=epdfs(i)->evalpdflog(val(rvinds(i))); } returnres; } vecsamplecond(constvec&cond,vec&ll)const{ vecsmp=zeros(rv.count()); veccondi; for(inti=(n-1);i>=0;i--){ if(rvcinds(i).length()>0){ condi=zeros(rvcinrv.length()+rvcinds.length()); //copydataincondition set_subvector(condi,rvcinds(i),cond); //copydatainalreadygeneratedsample set_subvector(condi,rvcinrv(i),smp); mpdfs(i)->condition(condi); } //copycontributionofthispdfintosmp set_subvector(smp,rvinds(i),epdfs(i)->sample()); } returnsmp; } //vecmean()const{ //vectmp(rv.count()); //if(independent){ //for(inti=0;i<n;i++){ //vecpom=epdfs(i)->mean(); //set_subvector(tmp,rvinds(i),pom); //} //} //else{ //intN=50*rv.count(); //it_warning("eprod.mean()computedbysampling"); //tmp=zeros(rv.count()); //for(inti=0;i<N;i++){tmp+=sample();} //tmp/=N; //} //returntmp; //} ~mprod(){}; }; classmmix:publicmpdf{ protected: Array<mpdf*>Coms; emixEpdf; public: mmix(RV&rv,RV&rvc):mpdf(rv,rvc),Epdf(rv){ep=&Epdf;}; voidset_parameters(constvec&w,constArray<mpdf*>&Coms){ Array<epdf*>Eps(Coms.length()); for(inti=0;i<Coms.length();i++){ Eps(i)=&(Coms(i)->_epdf()); } Epdf.set_parameters(w,Eps); }; voidcondition(constvec&cond){ for(inti=0;i<Coms.length();i++){Coms(i)->condition(cond);} }; }; #endif//MX_H