libEF.cpp itpp/itbase.h itpp/base/bessel.h libEF.h math.h 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. #include<itpp/itbase.h> #include<itpp/base/bessel.h> #include"libEF.h" #include<math.h> usingnamespaceitpp; Uniform_RNGUniRNG; Normal_RNGNorRNG; Gamma_RNGGamRNG; usingstd::cout; vecegiw::sample()const{ it_warning("Functionnotimplemented"); returnvec_1(0.0); } doubleegiw::evalpdflog(constvec&val)const{ intnPsi=rv.count()-1;//assuming1dimy doublek=nu+nPsi+2; doubler=val(nPsi);//lastentry! vecPsi(nPsi+1); Psi(0)=-1.0; Psi.set_subvector(1,val);//filltherest return-0.5*(k*log(r)+V.qform(Psi))-lognc(); } doubleegiw::lognc()const{ constvec&D=V._D(); intnPsi=D.length()-1;//assuming1dimy //log(2)=0.693147180559945286226763983 //log(pi)=1.144729885849400163877476189 returnlgamma(0.5*nu)+0.5*((1.0-nu)*log(D(0))-V.logdet()+(nu+nPsi)*0.693147180559945286226763983+nPsi*1.144729885849400163877476189); } vecegiw::mean()const{ constmat&L=V._L(); constvec&D=V._D(); intend=L.rows()-1; vecL0=L.get_col(0); vecm(D.length()); matiLsub=ltuinv(L(1,end,1,end)); m.set_subvector(0,iLsub*L0(1,end)); m(end)=D(0)/(nu-2.0); returnm; } vecegamma::sample()const{ vecsmp(rv.count()); inti; for(i=0;i<rv.count();i++){ GamRNG.setup(alpha(i),beta(i)); #pragmaompcritical smp(i)=GamRNG(); } returnsmp; } //mategamma::sample(intN)const{ //matSmp(rv.count(),N); //inti,j; // //for(i=0;i<rv.count();i++){ //GamRNG.setup(alpha(i),beta(i)); // //for(j=0;j<N;j++){ //Smp(i,j)=GamRNG(); //} //} // //returnSmp; //} doubleegamma::evalpdflog(constvec&val)const{ doubleres=0.0;//therestwillbeadded inti; for(i=0;i<rv.count();i++){ res+=(alpha(i)-1)*std::log(val(i))-beta(i)*val(i); } returnres-lognc(); } doubleegamma::lognc()const{ doubleres=0.0;//willbeadded inti; for(i=0;i<rv.count();i++){ res+=lgamma(alpha(i))-alpha(i)*std::log(beta(i)); } returnres; } //MGamma mgamma::mgamma(constRV&rv,constRV&rvc):mEF(rv,rvc),epdf(rv){vec*tmp;epdf._param(tmp,_beta);}; voidmgamma::set_parameters(doublek0){ k=k0; ep=&epdf; epdf.set_parameters(k*ones(rv.count()),*_beta); }; iveceEmp::resample(RESAMPLING_METHODmethod){ ivecind=zeros_i(n); ivecN_babies=zeros_i(n); veccumDist=cumsum(w); vecu(n); inti,j,parent; doubleu0; switch(method){ caseMULTINOMIAL: u(n-1)=pow(UniRNG.sample(),1.0/n); for(i=n-2;i>=0;i--){ u(i)=u(i+1)*pow(UniRNG.sample(),1.0/(i+1)); } break; caseSTRATIFIED: for(i=0;i<n;i++){ u(i)=(i+UniRNG.sample())/n; } break; caseSYSTEMATIC: u0=UniRNG.sample(); for(i=0;i<n;i++){ u(i)=(i+u0)/n; } break; default: it_error("PF::resample():Unknownresamplingmethod"); } //Uisnowfull j=0; for(i=0;i<n;i++){ while(u(i)>cumDist(j))j++; N_babies(j)++; } //WehaveassignednewbabiesforeachParticle //Now,wefilltheresultingindexsuchthat: //*particleswithatleastonebabyshouldnotmove* //Thisassuresthatreassignmentcanbedoneinplace; //findthefirstparent; parent=0;while(N_babies(parent)==0)parent++; //Buildindex for(i=0;i<n;i++){ if(N_babies(i)>0){ ind(i)=i; N_babies(i)--;//thisindexwasnowreplicated; }else{ //testiftheparenthasbeenfullyreplicated //ifyes,findthenextone while((N_babies(parent)==0)||(N_babies(parent)==1&&parent>i))parent++; //Replicateparent ind(i)=parent; N_babies(parent)--;//thisindexwasnowreplicated; } } //copytheinternalsaccordingtoind for(i=0;i<n;i++){ if(ind(i)!=i){ samples(i)=samples(ind(i)); } w(i)=1.0/n; } returnind; } voideEmp::set_parameters(constvec&w0,epdf*epdf0){ //it_assert_debug(rv==epdf0->rv(),"Wrongepdf0"); w=w0; w/=sum(w0);//renormalize n=w.length(); samples.set_size(n); for(inti=0;i<n;i++){samples(i)=epdf0->sample();} }