Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #if defined(USE_LAPLACE)
00012 # include <admodel.h>
00013 # include <df1b2fun.h>
00014 # include <adrndeff.h>
00015
00020 double calculate_importance_sample_block_diagonal_funnel(const dvector& x,
00021 const dvector& u0,const dmatrix& Hess,const dvector& _xadjoint,
00022 const dvector& _uadjoint,const dmatrix& _Hessadjoint,
00023 function_minimizer * pmin)
00024 {
00025 ADUNCONST(dvector,xadjoint)
00026 ADUNCONST(dvector,uadjoint)
00027
00028 const int xs=x.size();
00029 const int us=u0.size();
00030 gradient_structure::set_NO_DERIVATIVES();
00031 int nsc=pmin->lapprox->num_separable_calls;
00032 const ivector lrea = (*pmin->lapprox->num_local_re_array)(1,nsc);
00033 int hroom = sum(square(lrea));
00034 int nvar=x.size()+u0.size()+hroom;
00035 independent_variables y(1,nvar);
00036
00037
00038
00039 initial_params::set_inactive_only_random_effects();
00040 initial_params::set_active_random_effects();
00041 initial_params::nvarcalc();
00042 initial_params::xinit(y);
00043
00044 y(1,xs)=x;
00045
00046 int i,j;
00047
00048
00049 if (quadratic_prior::get_num_quadratic_prior()>0)
00050 {
00051
00052 int & vxs = (int&)(xs);
00053 quadratic_prior::get_cHessian_contribution(Hess,vxs);
00054 }
00055
00056
00057 dvar3_array & block_diagonal_vhessian=
00058 *pmin->lapprox->block_diagonal_vhessian;
00059 block_diagonal_vhessian.initialize();
00060 dvar3_array& block_diagonal_ch=
00061 *pmin->lapprox->block_diagonal_vch;
00062
00063 int ii=xs+us+1;
00064 d3_array& bdH=(*pmin->lapprox->block_diagonal_hessian);
00065 int ic;
00066 for (ic=1;ic<=nsc;ic++)
00067 {
00068 int lus=lrea(ic);
00069 for (i=1;i<=lus;i++)
00070 for (j=1;j<=lus;j++)
00071 y(ii++)=bdH(ic)(i,j);
00072 }
00073
00074 dvector g(1,nvar);
00075 gradcalc(0,g);
00076 gradient_structure::set_YES_DERIVATIVES();
00077 dvar_vector vy=dvar_vector(y);
00078
00079 ii=xs+us+1;
00080 if (initial_df1b2params::have_bounded_random_effects)
00081 {
00082 cerr << "can't do importance sampling with bounded random effects"
00083 " at present" << endl;
00084 ad_exit(1);
00085 }
00086 else
00087 {
00088 for (int ic=1;ic<=nsc;ic++)
00089 {
00090 int lus=lrea(ic);
00091 for (i=1;i<=lus;i++)
00092 {
00093 for (j=1;j<=lus;j++)
00094 {
00095 block_diagonal_vhessian(ic,i,j)=vy(ii++);
00096 }
00097 }
00098 block_diagonal_ch(ic)=
00099 choleski_decomp(inv(block_diagonal_vhessian(ic)));
00100 }
00101 }
00102
00103 dvariable vf=0.0;
00104
00105 int nsamp=pmin->lapprox->num_importance_samples;
00106 dvar_vector sample_value(1,nsamp);
00107 sample_value.initialize();
00108
00109
00110
00111
00112 int& nfunnelblocks=pmin->lapprox->nfunnelblocks;
00113 int lbound=1;
00114 int samplesize=nsamp/nfunnelblocks;
00115 int ubound=samplesize;
00116 int mean_count=0;
00117 dvar_vector fvalues(1,nfunnelblocks);
00118 ivector blocksizes(1,nfunnelblocks);
00119 for (int iblock=1;iblock<=nfunnelblocks;iblock++)
00120 {
00121
00122 funnel_dvariable fdv;
00123 if (lbound>nsamp) break;
00124 ad_begin_funnel();
00125 int icount=0;
00126 dvar_vector tau(1,us);;
00127 int ic;
00128 for (int is=lbound;is<=ubound;is++)
00129 {
00130 if (is>nsamp) break;
00131 icount++;
00132 int offset=0;
00133 for (ic=1;ic<=nsc;ic++)
00134 {
00135 int lus=lrea(ic);
00136 tau(offset+1,offset+lus).shift(1)=block_diagonal_ch(ic)*
00137 pmin->lapprox->epsilon(is)(offset+1,offset+lus).shift(1);
00138 offset+=lus;
00139 }
00140
00141
00142 imatrix & ls=*(pmin->lapprox->block_diagonal_re_list);
00143 int mmin=ls.indexmin();
00144 int mmax=ls.indexmax();
00145
00146 int ii=1;
00147 int i;
00148 for (i=mmin;i<=mmax;i++)
00149 {
00150 int cmin=ls(i).indexmin();
00151 int cmax=ls(i).indexmax();
00152 for (int j=cmin;j<=cmax;j++)
00153 {
00154 vy(ls(i,j))+=tau(ii++);
00155 }
00156 }
00157 if (ii-1 != us)
00158 {
00159 cerr << "error in interface" << endl;
00160 ad_exit(1);
00161 }
00162 initial_params::reset(vy);
00163 ii=1;
00164 for (i=mmin;i<=mmax;i++)
00165 {
00166 int cmin=ls(i).indexmin();
00167 int cmax=ls(i).indexmax();
00168 for (int j=cmin;j<=cmax;j++)
00169 {
00170 vy(ls(i,j))-=tau(ii++);
00171 }
00172 }
00173
00174 *objective_function_value::pobjfun=0.0;
00175 pmin->AD_uf_outer();
00176
00177 if (pmin->lapprox->use_outliers==0)
00178 {
00179 sample_value(icount)=*objective_function_value::pobjfun
00180 -0.5*norm2(pmin->lapprox->epsilon(is))-.91893853320467274177;
00181 }
00182 else
00183 {
00184 dvector& e=pmin->lapprox->epsilon(is);
00185
00186 sample_value(icount)=*objective_function_value::pobjfun
00187 +sum(log(.95*exp(-0.5*square(e))+.0166666667*exp(-square(e)/18.0)))
00188 -.91893853320467274177;
00189 }
00190 }
00191
00192 if (icount>0)
00193 {
00194 mean_count+=1;
00195 dvar_vector tsp=sample_value(1,icount);
00196 double min_vf=min(value(tsp));
00197 fdv=log(mean(exp(min_vf-tsp)))-min_vf;
00198 dvariable tmp;
00199 tmp=fdv;
00200 fvalues(mean_count)=tmp;
00201 blocksizes(mean_count)=icount;
00202 }
00203 lbound+=samplesize;
00204 ubound+=samplesize;
00205 }
00206 double fm=mean(value(fvalues(1,mean_count)));
00207 dvar_vector nfval=exp(fvalues(1,mean_count)-fm);
00208 vf=-fm-log(nfval*blocksizes(1,mean_count)/sum(blocksizes(1,mean_count)));
00209
00210
00211
00212
00213
00214
00215
00216 int sgn=0;
00217 dvariable ld=0.0;
00218
00219 if (ad_comm::no_ln_det_choleski_flag)
00220 {
00221 for (int ic=1;ic<=nsc;ic++)
00222 {
00223 ld+=ln_det(block_diagonal_vhessian(ic),sgn);
00224 }
00225 ld*=0.5;
00226 }
00227 else
00228 {
00229 for (int ic=1;ic<=nsc;ic++)
00230 {
00231 ld+=ln_det_choleski(block_diagonal_vhessian(ic));
00232 }
00233 ld*=0.5;
00234 }
00235
00236
00237 vf+=ld;
00238 vf-=us*0.91893853320467274177;
00239 double f=value(vf);
00240 gradcalc(nvar,g);
00241
00242
00243 gradient_structure::set_NO_DERIVATIVES();
00244 vy(xs+1,xs+us).shift(1)=u0;
00245 initial_params::reset(vy);
00246 gradient_structure::set_YES_DERIVATIVES();
00247
00248
00249 ii=1;
00250 for (i=1;i<=xs;i++)
00251 xadjoint(i)=g(ii++);
00252 for (i=1;i<=us;i++)
00253 uadjoint(i)=g(ii++);
00254 for (ic=1;ic<=nsc;ic++)
00255 {
00256 int lus=lrea(ic);
00257 for (i=1;i<=lus;i++)
00258 {
00259 for (j=1;j<=lus;j++)
00260 {
00261 (*pmin->lapprox->block_diagonal_vhessianadjoint)(ic)(i,j)=g(ii++);
00262 }
00263 }
00264 }
00265 return f;
00266 }
00267
00268 #endif