Go to the documentation of this file.00001
00002
00003
00004
00005
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
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
00042
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
00193
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 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&);