ADMB Documentation  11.1.1015
 All Classes Files Functions Variables Typedefs Friends Defines
df1b2lp9.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: df1b2lp9.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  */
00011 #if defined(USE_LAPLACE)
00012 #  include <admodel.h>
00013 #  include <df1b2fun.h>
00014 #  include <adrndeff.h>
00015         //int fcount =0;
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                 //cout << setprecision(10) << setw(19) << ff << " " 
00023                  //    << setw(19) << uuu   << "  "  << setw(19) << gg << endl;
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);    // get the initial values into the
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     // get the initial u into the uu's
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) //check to see if there are any active randoem effects
00134         {               // in this function call
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       // put the 
00168       //if (fmc1.ireturn>0)
00169       {
00170         dvariable vf=0.0;
00171         pen=initial_params::reset(dvar_vector(u));
00172         *objective_function_value::pobjfun=0.0;
00173   
00174         //num_separable_calls=0;
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             //ff[i]=-(*separable_function_difference)(i)
00213              // +(*separable_function_difference)(i-1);
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             //ff[i]=(*separable_function_difference)(i)
00230              // -(*separable_function_difference)(i-1);
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   //num_separable_calls=0;
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)