ADMB Documentation  11.1.1020
 All Classes Files Functions Variables Typedefs Friends Defines
prmonte.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: prmonte.cpp 542 2012-07-10 21:04:06Z johnoel $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California 
00006  */
00007 #include <admodel.h>
00008 
00009 double inv_cumd_norm(const double& x);
00010 double cumd_norm(const double& x);
00011 double myran1(long int&);
00012 //double better_rand(long int&);
00013 
00014 dvector new_probing_bounded_multivariate_normal(int nvar, const dvector& a1, const dvector& b1,
00015   dmatrix& ch, const double& _wght,double pprobe, random_number_generator& rng)
00016 {
00017   double& wght=(double&) _wght;
00018   const double rob1=0.95;
00019   const double sqrt_tpi =sqrt(2*PI);
00020   dvector w(1,nvar);
00021   dvector a(1,nvar);
00022   dvector b(1,nvar);
00023   dvector alpha(1,nvar);
00024   dvector beta(1,nvar);
00025   a=a1;
00026   b=b1;
00027   wght=0;
00028   double rwght=0;
00029   double nwght=0;
00030   w.initialize();
00031   double ah; 
00032   double bl; 
00033   double upper;
00034   double lower; 
00035   double upper1;
00036   double lower1; 
00037   double diff;
00038   double diff1;
00039   int expflag;
00040   double y;
00041   //int in=0;
00042   //int ie=0;
00043   double u = rng.better_rand();
00044   int rflag;
00045   if (u>rob1)
00046   {
00047     rflag=1;
00048   }
00049   else
00050   {
00051     rflag=0;
00052   }
00053   if (!rflag)
00054   {
00055     for (int i=1;i<=nvar;i++)
00056     {
00057       ah=a(i)/ch(i,i); 
00058       bl=b(i)/ch(i,i); 
00059       double u = rng.better_rand();
00060       upper=cumd_norm(bl);
00061       lower=cumd_norm(ah); 
00062       diff=upper-lower;
00063       if (diff>1.e-5)
00064       {
00065         expflag=0;
00066       }
00067       else
00068       {
00069         expflag=1;
00070       }
00071       upper1=cumd_cauchy(bl);
00072       lower1=cumd_cauchy(ah);
00073       diff1=upper1-lower1;
00074   
00075       u=u*.9998+.0001;
00076       if (!expflag)
00077       {
00078         y = inv_cumd_norm(u*(upper-lower)+lower);
00079       }
00080       else
00081       {
00082         y = inv_cumd_cauchy(u*(upper1-lower1)+lower1);
00083       }
00084       if (diff>1.e-5)
00085       {
00086         nwght+=-.5*y*y -log(sqrt_tpi*diff);
00087       }
00088       else
00089       {
00090         nwght += log_density_cauchy(y)-log(diff1);
00091       }
00092       for (int j=i;j<=nvar;j++)
00093       {
00094         double tmp=y*ch(j,i);
00095         w(j)+=tmp;
00096         a(j)-=tmp;
00097         b(j)-=tmp;
00098       }
00099     }
00100     wght = nwght;
00101   }
00102   else
00103   {
00104     a=a1;
00105     b=b1;
00106     for (int i=1;i<=nvar;i++)
00107     {
00108       ah=a(i)/ch(i,i); 
00109       bl=b(i)/ch(i,i); 
00110       double u = rng.better_rand();
00111       double pp = rng.better_rand();
00112       upper=cumd_norm(bl);
00113       lower=cumd_norm(ah); 
00114       diff=upper-lower;
00115       if (diff>1.e-5)
00116       {
00117         expflag=0;
00118       }
00119       else
00120       {
00121         expflag=1;
00122       }
00123       upper1=cumd_cauchy(bl);
00124       lower1=cumd_cauchy(ah);
00125       diff1=upper1-lower1;
00126   
00127       u=u*.9998+.0001;
00128       if (!expflag)
00129       {
00130         if (pp>pprobe)
00131           y = inv_cumd_norm(u*(upper-lower)+lower);
00132         else
00133           y = inv_cumd_cauchy(u*(upper1-lower1)+lower1);
00134       }
00135       else
00136       {
00137         y = inv_cumd_cauchy(u*(upper1-lower1)+lower1);
00138       }
00139       if (diff>1.e-5)
00140       {
00141         rwght+=log((1.0-pprobe)*exp(-.5*y*y)/(sqrt_tpi*diff)
00142          +pprobe*density_cauchy(y)/diff1);
00143       }
00144       else
00145       {
00146         rwght += log_density_cauchy(y)-log(diff1);
00147       }
00148       for (int j=i;j<=nvar;j++)
00149       {
00150         double tmp=y*ch(j,i);
00151         w(j)+=tmp;
00152         a(j)-=tmp;
00153         b(j)-=tmp;
00154       }
00155     }
00156     double dd=rob1*(exp(nwght-rwght))+1.0-rob1;
00157     if (dd<=0)
00158     {
00159       cerr << "dd <=0" << endl;
00160     }
00161     wght = log(dd)+rwght;
00162   }
00163   return w; 
00164 }
00165 
00166 
00167 void new_probing_bounded_multivariate_normal_mcmc(int nvar, const dvector& a1, const dvector& b1,
00168   dmatrix& ch, const double& _wght, const dvector& _y,double pprobe, random_number_generator& rng)
00169 {
00170   double& wght=(double&) _wght;
00171   const double rob1=0.95;
00172   const double sqrt_tpi =sqrt(2*PI);
00173   dvector w(1,nvar);
00174   dvector a(1,nvar);
00175   dvector b(1,nvar);
00176   dvector alpha(1,nvar);
00177   dvector beta(1,nvar);
00178   wght=0;
00179   double rwght=0;
00180   double nwght=0;
00181   w.initialize();
00182   double ah; 
00183   double bl; 
00184   double upper;
00185   double lower; 
00186   double upper1;
00187   double lower1; 
00188   double diff;
00189   double diff1;
00190   int expflag;
00191   double y;
00192   //int in=0;
00193   //int ie=0;
00194 
00195   a=a1;
00196   b=b1;
00197   int i;
00198   for (i=1;i<=nvar;i++)
00199   {
00200     y=_y(i);
00201     ah=a(i)/ch(i,i); 
00202     bl=b(i)/ch(i,i); 
00203     /*double u = */rng.better_rand();
00204     upper=cumd_norm(bl);
00205     lower=cumd_norm(ah); 
00206     diff=upper-lower;
00207     if (diff>1.e-5)
00208     {
00209       expflag=0;
00210     }
00211     else
00212     {
00213       expflag=1;
00214     }
00215     upper1=cumd_cauchy(bl);
00216     lower1=cumd_cauchy(ah);
00217     diff1=upper1-lower1;
00218   
00219     if (diff>1.e-5)
00220     {
00221       nwght+=-.5*y*y -log(sqrt_tpi*diff);
00222     }
00223     else
00224     {
00225       nwght+= log_density_cauchy(y)-log(diff1);
00226     }
00227     for (int j=i;j<=nvar;j++)
00228     {
00229       double tmp=y*ch(j,i);
00230       w(j)+=tmp;
00231       a(j)-=tmp;
00232       b(j)-=tmp;
00233     }
00234   }
00235   a=a1;
00236   b=b1;
00237   w.initialize();
00238   for (i=1;i<=nvar;i++)
00239   {
00240     y=_y(i);
00241     ah=a(i)/ch(i,i); 
00242     bl=b(i)/ch(i,i); 
00243     double u = rng.better_rand();
00244     double pp = rng.better_rand();
00245     upper=cumd_norm(bl);
00246     lower=cumd_norm(ah); 
00247     diff=upper-lower;
00248     if (diff>1.e-5)
00249     {
00250       expflag=0;
00251     }
00252     else
00253     {
00254       expflag=1;
00255     }
00256     upper1=cumd_cauchy(bl);
00257     lower1=cumd_cauchy(ah);
00258     diff1=upper1-lower1;
00259 
00260     u=u*.9998+.0001;
00261     if (!expflag)
00262     {
00263       if (pp>pprobe)
00264         y = inv_cumd_norm(u*(upper-lower)+lower);
00265       else
00266         y = inv_cumd_cauchy(u*(upper1-lower1)+lower1);
00267     }
00268     else
00269     {
00270       y = inv_cumd_cauchy(u*(upper1-lower1)+lower1);
00271     }
00272     if (diff>1.e-5)
00273     {
00274       rwght+=log((1.0-pprobe)*exp(-.5*y*y)/(sqrt_tpi*diff)
00275        +pprobe*density_cauchy(y)/diff1);
00276     }
00277     else
00278     {
00279       rwght += log_density_cauchy(y)-log(diff1);
00280     }
00281   }
00282   wght = log(rob1*(exp(nwght-rwght))+(1.0-rob1))+rwght;
00283   for (int j=i;j<=nvar;j++)
00284   {
00285     double tmp=y*ch(j,i);
00286     w(j)+=tmp;
00287     a(j)-=tmp;
00288     b(j)-=tmp;
00289   }
00290 }
00291 
00292 void sobseq(int*, const dvector&);