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
00016 static int no_stuff=0;
00017 static void crap(void)
00018 {
00019 }
00020 static void crap(double ff,dvector& uuu,dvector& gg)
00021 {
00022
00023
00024 }
00025
00026 typedef fmm * pfmm;
00027
00032 dvector laplace_approximation_calculator::get_uhat_quasi_newton_block_diagonal
00033 (const dvector& x,function_minimizer * pfmin)
00034 {
00035
00036 if (separable_function_difference)
00037 {
00038 delete separable_function_difference;
00039 separable_function_difference=0;
00040 }
00041 separable_function_difference = new dvector(1,num_separable_calls);
00042
00043 fmm ** pfmc1 = new pfmm[num_separable_calls];
00044 pfmc1--;
00045 int i;
00046 ivector ishape(1,num_separable_calls);
00047 dvector gmax(1,num_separable_calls);
00048
00049 for (i=1;i<=num_separable_calls;i++)
00050 {
00051 int m=(*derindex)(i).indexmax();
00052 ishape(i)=m;
00053 if (m>0)
00054 {
00055 pfmc1[i] = new fmm(m);
00056 pfmc1[i]->iprint=0;
00057 pfmc1[i]->crit=inner_crit;
00058 pfmc1[i]->ireturn=0;
00059 pfmc1[i]->itn=0;
00060 pfmc1[i]->ifn=0;
00061 pfmc1[i]->ialph=0;
00062 pfmc1[i]->ihang=0;
00063 pfmc1[i]->ihflag=0;
00064 pfmc1[i]->maxfn=100;
00065 pfmc1[i]->gmax=1.e+100;
00066 pfmc1[i]->use_control_c=0;
00067 }
00068 else
00069 {
00070 pfmc1[i]= (fmm *)(0);
00071 }
00072 }
00073 dmatrix gg(1,num_separable_calls,1,ishape);
00074 dmatrix ggb(1,num_separable_calls,1,ishape);
00075 dmatrix uu(1,num_separable_calls,1,ishape);
00076 dmatrix uub(1,num_separable_calls,1,ishape);
00077 dvector ff(1,num_separable_calls);
00078 dvector ffb(1,num_separable_calls);
00079 ivector icon(1,num_separable_calls);
00080 icon.initialize();
00081 ffb=1.e+100;
00082
00083 double f=0.0;
00084 double fb=1.e+100;
00085 dvector g(1,usize);
00086 dvector ub(1,usize);
00087 independent_variables u(1,usize);
00088 gradcalc(0,g);
00089 fmc1.itn=0;
00090 fmc1.ifn=0;
00091 fmc1.ireturn=0;
00092 initial_params::xinit(u);
00093 fmc1.ialph=0;
00094 fmc1.ihang=0;
00095 fmc1.ihflag=0;
00096
00097 if (init_switch)
00098 {
00099 u.initialize();
00100 }
00101
00102 for (int ii=1;ii<=2;ii++)
00103 {
00104
00105 for (i=1;i<=num_separable_calls;i++)
00106 {
00107 int m=(*derindex)(i).indexmax();
00108 for (int j=1;j<=m;j++)
00109 {
00110 uu(i,j)=u((*derindex)(i)(j));
00111 }
00112 }
00113 fmc1.dfn=1.e-2;
00114 dvariable pen=0.0;
00115 int converged=0;
00116 int initrun_flag=1;
00117 int loop_counter=0;
00118 int loop_flag=0;
00119
00120 while (converged==0)
00121 {
00122 if (loop_flag) loop_counter++;
00123 if (loop_counter>18)
00124 {
00125 cout << loop_counter;
00126 }
00127 if (!initrun_flag)
00128 {
00129 converged=1;
00130 }
00131 for (int i=1;i<=num_separable_calls;i++)
00132 {
00133 if (ishape(i)>0)
00134 {
00135 if (!icon(i))
00136 {
00137 independent_variables& uuu=*(independent_variables*)(&(uu(i)));
00138 if (i==19)
00139 crap(ff[i],uuu,gg[i]);
00140 (pfmc1[i])->fmin(ff[i],uuu,gg(i));
00141 if (i==19)
00142 crap();
00143 gmax(i)=fabs(pfmc1[i]->gmax);
00144 if (!initrun_flag)
00145 {
00146 if (gmax(i)<1.e-4 || pfmc1[i]->ireturn<=0)
00147 {
00148 icon(i)=1;
00149 }
00150 else
00151 {
00152 converged=0;
00153 }
00154 }
00155 }
00156 }
00157 }
00158 initrun_flag=0;
00159 for (int i2=1;i2<=num_separable_calls;i2++)
00160 {
00161 int m=(*derindex)(i2).indexmax();
00162 for (int j=1;j<=m;j++)
00163 {
00164 u((*derindex)(i2)(j))=uu(i2,j);
00165 }
00166 }
00167
00168
00169 {
00170 dvariable vf=0.0;
00171 pen=initial_params::reset(dvar_vector(u));
00172 *objective_function_value::pobjfun=0.0;
00173
00174
00175
00176 pmin->inner_opt_flag=1;
00177 pfmin->AD_uf_inner();
00178 pmin->inner_opt_flag=0;
00179
00180 if (saddlepointflag)
00181 {
00182 *objective_function_value::pobjfun*=-1.0;
00183 }
00184 if ( no_stuff==0 && quadratic_prior::get_num_quadratic_prior()>0)
00185 {
00186 quadratic_prior::get_M_calculations();
00187 }
00188 vf+=*objective_function_value::pobjfun;
00189
00190 objective_function_value::fun_without_pen=value(vf);
00191 vf+=pen;
00192
00193 gradcalc(usize,g);
00194 for (int i=1;i<=num_separable_calls;i++)
00195 {
00196 int m=(*derindex)(i).indexmax();
00197 for (int j=1;j<=m;j++)
00198 {
00199 gg(i,j)=g((*derindex)(i)(j));
00200 }
00201 }
00202 {
00203 ofstream ofs("l:/temp1.dat");
00204 ofs << g.indexmax() << " " << setprecision(15) << g << endl;
00205 }
00206 if (saddlepointflag==2)
00207 {
00208 ff[1]=-(*separable_function_difference)(1);
00209 for (int i=2;i<=num_separable_calls;i++)
00210 {
00211 ff[i]=-(*separable_function_difference)(i);
00212
00213
00214
00215 if (ff[i] < ffb[i])
00216 {
00217 ffb[i]=ff[i];
00218 uub[i]=uu[i];
00219 ggb[i]=gg[i];
00220 }
00221 }
00222 }
00223 else
00224 {
00225 ff[1]=(*separable_function_difference)(1);
00226 for (int i=2;i<=num_separable_calls;i++)
00227 {
00228 ff[i]=(*separable_function_difference)(i);
00229
00230
00231
00232 if (ff[i] < ffb[i])
00233 {
00234 ffb[i]=ff[i];
00235 uub[i]=uu[i];
00236 ggb[i]=gg[i];
00237 }
00238 }
00239 }
00240 f=0.0;
00241 for (int i2=1;i2<=num_separable_calls;i2++)
00242 {
00243 f+=ff[i2];
00244 }
00245 if (f<fb)
00246 {
00247 fb=f;
00248 ub=u;
00249 }
00250 }
00251 u=ub;
00252 }
00253 double tmax=max(gmax);
00254 cout << " inner maxg = " << tmax << endl;
00255
00256 if (tmax< 1.e-4) break;
00257 }
00258 fmc1.ireturn=0;
00259 fmc1.fbest=fb;
00260 gradient_structure::set_NO_DERIVATIVES();
00261
00262 pmin->inner_opt_flag=1;
00263 pfmin->AD_uf_inner();
00264 pmin->inner_opt_flag=0;
00265 if ( no_stuff==0 && quadratic_prior::get_num_quadratic_prior()>0)
00266 {
00267 quadratic_prior::get_M_calculations();
00268 }
00269 gradient_structure::set_YES_DERIVATIVES();
00270 for (i=1;i<=num_separable_calls;i++)
00271 {
00272 if (pfmc1[i])
00273 {
00274 delete pfmc1[i];
00275 }
00276 }
00277 pfmc1++;
00278 delete [] pfmc1;
00279 pfmc1 = 0;
00280 return u;
00281 }
00282 #endif // #if defined(USE_LAPLACE)