ADMB Documentation  11.1.1021
 All Classes Files Functions Variables Typedefs Friends Defines
df1b2f15.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: df1b2f15.cpp 747 2013-02-07 00:22:07Z skaug $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California 
00006  */
00011 #include <df1b2fun.h>
00012 
00017 void df1b2_init_vector::allocate(int mmin,int mmax,const adstring&s)
00018 {
00019   allocate(mmin,mmax,1,s);
00020 }
00021 
00026 void df1b2_init_vector::allocate(int mmin,int mmax,int ps,const adstring&s)
00027 {
00028   set_phase_start(ps);
00029   df1b2vector::allocate(mmin,mmax);
00030 }
00031 
00036 void initial_df1b2params::add_to_list(void)
00037 {
00038   if (num_initial_df1b2params>=1000)
00039   {
00040     cerr << " This version of ADMB only supports 1000 initial df1b2parameter"
00041       " objects" << endl;
00042     ad_exit(1);
00043   }
00044   varsptr[num_initial_df1b2params++]= this;
00045 }
00046 
00051 void initial_df1b2params::reset(const init_df1b2vector& x,
00052   const df1b2variable& _pen)
00053 {
00054   ADUNCONST(df1b2variable,pen)
00055   //df1b2variable::nvar=global_nvar;
00056   pen=0.0;
00057   df1b2variable pen1=0.0;
00058   int ii=1;
00059   for (int i=0;i<num_initial_df1b2params;i++)
00060   {
00061     if (withinbound(0,(varsptr[i])->phase_start,current_phase))
00062     {
00063       (varsptr[i])->set_value(x,ii,pen1);
00064     }
00065   }
00066   pen+=pen1;
00067 }
00068 
00073  double initial_df1b2params::get_scalefactor(void)
00074  {
00075    return scalefactor;
00076  }
00077 
00083  void initial_df1b2params::set_scalefactor(const double sf)
00084  {
00085    scalefactor=sf;
00086  }
00087 
00088 
00089 
00090 
00091 int initial_df1b2params::set_index(void)
00092 {
00093   int ii=1;
00094   for (int i=0;i<num_initial_df1b2params;i++)
00095   {
00096     if (withinbound(0,(varsptr[i])->phase_start,current_phase))
00097     {
00098       (varsptr[i])->set_index(1,ii);
00099     }
00100     else
00101     {
00102       (varsptr[i])->set_index(0,ii);
00103     }
00104   }
00105   return ii-1;
00106 }
00107 
00112 void df1b2_init_vector::set_value(const init_df1b2vector& _x,
00113   const int& _ii,const df1b2variable& pen)
00114 {
00115   ADUNCONST(init_df1b2vector,x)
00116   ADUNCONST(int,ii)
00117 
00118   int mmin=indexmin();
00119   int mmax=indexmax();
00120   for (int i=mmin;i<=mmax;i++)
00121   {
00122     (*this)(i) = (x(ii++));
00123   }
00124 }
00125 
00130 void df1b2_init_vector::set_index(int aflag,const int& _ii)
00131 {
00132   ADUNCONST(int,ii)
00133 
00134   int mmin=indexmin();
00135   int mmax=indexmax();
00136   if (aflag)
00137   {
00138     for (int i=mmin;i<=mmax;i++)
00139     {
00140       (*this)(i).get_ind_index() = ii++;
00141     }
00142   }
00143   else
00144   {
00145     for (int i=mmin;i<=mmax;i++)
00146     {
00147       (*this)(i).get_ind_index() = -1;
00148     }
00149   }
00150 }
00151 
00156 void df1b2_init_number::set_index(int aflag,const int& _ii)
00157 {
00158   ADUNCONST(int,ii)
00159   if (aflag)
00160   {
00161     get_ind_index()=ii++;
00162   }
00163   else
00164   {
00165     get_ind_index()=-1;
00166   }
00167 }
00168 
00173 void df1b2_init_matrix::set_index(int aflag,const int& _ii)
00174 {
00175   ADUNCONST(int,ii)
00176 
00177   int rmin=indexmin();
00178   int rmax=indexmax();
00179   if (aflag)
00180   {
00181     for (int i=rmin;i<=rmax;i++)
00182     {
00183       int cmin=(*this)(i).indexmin(); 
00184       int cmax=(*this)(i).indexmax(); 
00185       {
00186         for (int j=cmin;j<=cmax;j++)
00187         {
00188           (*this)(i,j).get_ind_index() = ii++;
00189         }
00190       }
00191     }
00192   }
00193   else
00194   {
00195     for (int i=rmin;i<=rmax;i++)
00196     {
00197       int cmin=(*this)(i).indexmin(); 
00198       int cmax=(*this)(i).indexmax(); 
00199       {
00200         for (int j=cmin;j<=cmax;j++)
00201         {
00202           (*this)(i,j).get_ind_index() = -1;
00203         }
00204       }
00205     }
00206   }
00207 }
00208 
00213 void df1b2_init_matrix::set_value(const init_df1b2vector& _x,
00214   const int& _ii,const df1b2variable& pen)
00215 {
00216   ADUNCONST(init_df1b2vector,x)
00217   ADUNCONST(int,ii)
00218 
00219   int rmin=indexmin();
00220   int rmax=indexmax();
00221   for (int i=rmin;i<=rmax;i++)
00222   {
00223     int cmin=(*this)(i).indexmin(); 
00224     int cmax=(*this)(i).indexmax(); 
00225     {
00226       for (int j=cmin;j<=cmax;j++)
00227       {
00228         (*this)(i,j) = (x(ii++));
00229       }
00230     }
00231   }
00232 }
00233 
00238 void df1b2_init_number::set_value(const init_df1b2vector& _x,const int& _ii,
00239     const df1b2variable& pen)
00240 {
00241   ADUNCONST(init_df1b2vector,x)
00242   ADUNCONST(int,ii)
00243   if (scalefactor==0.0)
00244     operator = (x(ii++));
00245   else
00246     operator = (x(ii++)/scalefactor);
00247 }
00248 
00253 void df1b2_init_number::allocate(const adstring& s)
00254 {
00255   if (!df1b2variable::noallocate)
00256   {
00257     df1b2variable::allocate();
00258   }
00259   set_phase_start(1);
00260 }
00261 
00266 void df1b2_init_number::allocate(int _n,const adstring& s)
00267 {
00268   df1b2variable::allocate();
00269   set_phase_start(_n);
00270 }
00271 
00276 void df1b2variable::allocate(const char *s)
00277 {
00278   df1b2variable::allocate();
00279 }
00280 
00285 df1b2_init_number::df1b2_init_number() :  df1b2variable(do_naught_kludge_a)
00286 { 
00287   //cout << "Here" << endl;
00288 }
00289 
00294 void df1b2_init_number::operator = (const df1b2variable& _x) 
00295 {
00296   df1b2variable::operator = (_x);
00297 }
00298 
00303 void df1b2_init_bounded_number::allocate(double _minb,double _maxb,
00304  int _n,const char * s) 
00305 {
00306   minb=_minb;
00307   maxb=_maxb;
00308   df1b2_init_number::allocate(s);
00309 
00310   set_phase_start(_n);
00311 }
00312 
00317 void df1b2_init_bounded_number::allocate(double _minb,
00318   double _maxb,const char * s) 
00319 {
00320   minb=_minb;
00321   maxb=_maxb;
00322   df1b2_init_number::allocate(s);
00323   set_phase_start(1);
00324 }
00325 
00330 void df1b2_init_bounded_number::set_value(const init_df1b2vector& _x,
00331   const int& _ii,const df1b2variable& pen)
00332 {
00333   ADUNCONST(init_df1b2vector,x)
00334   ADUNCONST(int,ii)
00335   if (scalefactor==0.0)
00336     ::set_value(*this,x,ii,minb,maxb,pen);
00337   else
00338     ::set_value(*this,x,ii,minb,maxb,pen,scalefactor);
00339 }
00340 
00345 void set_value(const df1b2variable& _u,const init_df1b2vector& _x,
00346   const int& _ii,double fmin,double fmax,const df1b2variable& _fpen)
00347 {
00348   ADUNCONST(init_df1b2vector,x)
00349   ADUNCONST(int,ii)
00350   ADUNCONST(df1b2variable,u)
00351   ADUNCONST(df1b2variable,fpen)
00352   if (!initial_params::straight_through_flag)
00353   {
00354     u=boundp(x(ii++),fmin,fmax,fpen);
00355   }
00356   else
00357   {
00358     u=x(ii);
00359     value(u)=boundp(value(x(ii++)),fmin,fmax);
00360     double diff=fmax-fmin;
00361     //t=fmin + diff*ss;
00362     df1b2variable ss=(u-fmin)/diff;
00363 #   ifdef USE_BARD_PEN
00364       const double l4=log(4.0);
00365       double pen=.000001/diff;
00366       fpen-=pen*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00367 #   else 
00368           XXXX
00369 #   endif
00370   }
00371 }
00372 
00373 void set_value(const df1b2variable& _u,const init_df1b2vector& _x,
00374   const int& _ii,double fmin,double fmax,const df1b2variable& _fpen,
00375   double s)
00376 {
00377   ADUNCONST(init_df1b2vector,x)
00378   ADUNCONST(int,ii)
00379   ADUNCONST(df1b2variable,u)
00380   ADUNCONST(df1b2variable,fpen)
00381   if (!initial_params::straight_through_flag)
00382   {
00383     u=boundp(x(ii++),fmin,fmax,fpen,s);
00384   }
00385   else
00386   {
00387     u=x(ii);
00388     value(u)=boundp(value(x(ii++)),fmin,fmax,s);
00389     double diff=fmax-fmin;
00390     //t=fmin + diff*ss;
00391     df1b2variable ss=(u-fmin)/diff;
00392 #   ifdef USE_BARD_PEN
00393       const double l4=log(4.0);
00394       double pen=.000001/diff;
00395       fpen-=pen*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00396 #   else 
00397           XXXX
00398 #   endif
00399   }
00400 }
00401 
00409 df1b2variable boundp(const df1b2variable& x, double fmin, double fmax,
00410   const df1b2variable& _fpen)
00411 {
00412   ADUNCONST(df1b2variable,fpen)
00413   df1b2variable t;
00414   //df1b2variable y;
00415   //y=x;
00416   double diff=fmax-fmin;
00417   const double l4=log(4.0);
00418   df1b2variable ss=0.49999999999999999*sin(x*1.57079632679489661)+0.50;
00419   t=fmin + diff*ss;
00420 
00421 #ifdef USE_BARD_PEN
00422   double pen=.000001/diff;
00423   fpen-=pen*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00424 #else 
00425   if (x < -.9999)
00426   {
00427     fpen+=cube(-0.9999-x);
00428     if (x < -1.)
00429     {
00430       fpen+=1.e+6*cube(-1.0-x);
00431       if (x < -1.02)
00432       {
00433         fpen+=1.e+10*cube(-1.02-x);
00434       }
00435     }
00436   }
00437   if (x > 0.9999)
00438   {
00439     fpen+=cube(x-0.9999);
00440     if (x > 1.)
00441     {
00442       fpen+=1.e+6*cube(x-1.);
00443       if (x > 1.02)
00444       {
00445         fpen+=1.e+10*cube(x-1.02);
00446       }
00447     }
00448   }
00449 #endif
00450   return(t);
00451 }
00452 
00460 df1b2variable boundp(const df1b2variable& _x, double fmin, double fmax,
00461   const df1b2variable& _fpen,double s)
00462 {
00463   ADUNCONST(df1b2variable,fpen)
00464   df1b2variable t;
00465   df1b2variable x=_x/s;
00466   //df1b2variable y;
00467   //y=x;
00468   double diff=fmax-fmin;
00469   const double l4=log(4.0);
00470 
00471   // ss is underlying varialbe on [0,1] and t lives in [fmin,fmax]
00472   df1b2variable ss=0.49999999999999999*sin(x*1.57079632679489661)+0.50;
00473   t=fmin + diff*ss;
00474 
00475   // Add penalty
00476 #ifdef USE_BARD_PEN
00477   double pen=.000001/diff;
00478   fpen-=pen*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00479 #else 
00480   if (x < -.9999)
00481   {
00482     fpen+=cube(-0.9999-x);
00483     if (x < -1.)
00484     {
00485       fpen+=1.e+6*cube(-1.0-x);
00486       if (x < -1.02)
00487       {
00488         fpen+=1.e+10*cube(-1.02-x);
00489       }
00490     }
00491   }
00492   if (x > 0.9999)
00493   {
00494     fpen+=cube(x-0.9999);
00495     if (x > 1.)
00496     {
00497       fpen+=1.e+6*cube(x-1.);
00498       if (x > 1.02)
00499       {
00500         fpen+=1.e+10*cube(x-1.02);
00501       }
00502     }
00503   }
00504 #endif
00505   return(t);
00506 }
00507 
00512 df1b2variable boundp(const df1b2variable& x, double fmin, double fmax)
00513 {
00514   df1b2variable t;
00515   //df1b2variable y;
00516   //y=x;
00517   double diff=fmax-fmin;
00518   df1b2variable ss=0.49999999999999999*sin(x*1.57079632679489661)+0.50;
00519   t=fmin + diff*ss;
00520 
00521   return(t);
00522 }
00523 
00528 void set_value_mc(const df1b2vector& _x,const init_df1b2vector& _v, const int& _ii,
00529   double fmin,double fmax)
00530 {
00531   ADUNCONST(int,ii)
00532   ADUNCONST(df1b2vector,x)
00533   ADUNCONST(init_df1b2vector,v)
00534   int min=x.indexmin();
00535   int max=x.indexmax();
00536   for (int i=min;i<=max;i++)
00537   {
00538     //x(i)=boundp(v(ii++),fmin,fmax,fpen);
00539     const double pinv=1./PI;
00540     df1b2variable y=atan(v(ii++))*pinv+0.5;
00541     x(i)=fmin+(fmax-fmin)*y;
00542   }
00543 }
00544 
00549 void set_value(const df1b2vector& _x,const init_df1b2vector& _v, const int& _ii,
00550   double fmin,double fmax,const df1b2variable& fpen)
00551 {
00552   ADUNCONST(int,ii)
00553   ADUNCONST(df1b2vector,x)
00554   ADUNCONST(init_df1b2vector,v)
00555   int min=x.indexmin();
00556   int max=x.indexmax();
00557   for (int i=min;i<=max;i++)
00558   {
00559     x(i)=boundp(v(ii++),fmin,fmax,fpen);
00560     //cout << setprecision(15) << fpen << " " << fmin << " " << fmax
00561      //  << " " << v(ii-1) << " " << x(i) << endl; 
00562   }
00563 }
00564 
00569 void df1b2_init_bounded_vector::set_value(const init_df1b2vector& _x,
00570   const int& ii,const df1b2variable& pen)
00571 {
00572   init_df1b2vector& x=(init_df1b2vector&) _x;
00573   if (initial_params::mc_phase)
00574   {
00575     ::set_value_mc(*this,x,ii,minb,maxb);
00576   }
00577   else
00578   {
00579     ::set_value(*this,x,ii,minb,maxb,pen);
00580   }
00581 
00582 }
00583 
00588 re_df1b2_init_bounded_vector::re_df1b2_init_bounded_vector(void)
00589 {
00590   initial_df1b2params::have_bounded_random_effects=1;
00591 }
00592 
00597 void re_df1b2_init_bounded_vector::set_value(const dvector& _x,
00598   const int& _ii)
00599 {
00600   df1b2_init_bounded_vector::set_value(_x,_ii);
00601 }
00602 
00607 void re_df1b2_init_bounded_vector::set_value(const init_df1b2vector& _x,
00608   const int& _ii,const df1b2variable& _pen)
00609 {
00610   ADUNCONST(int,ii)
00611   ADUNCONST(df1b2variable,pen)
00612   init_df1b2vector& x=(init_df1b2vector&) _x;
00613   int mmin=indexmin();
00614   int mmax=indexmax();
00615   for (int i=mmin;i<=mmax;i++)
00616   {
00617     df1b2variable& y=df1b2vector::operator()(i);
00618     if (!initial_params::straight_through_flag)
00619     {
00620       y = (boundp(x(ii++),getminb(),getmaxb(),pen));
00621     }
00622     else
00623     {
00624       y = (x(ii++));
00625       *y.get_u()=boundp(*y.get_u(),getminb(),getmaxb());
00626       double diff=getmaxb()-getminb();
00627       df1b2variable ss=(y-getminb())/diff;
00628 #     ifdef USE_BARD_PEN
00629         const double l4=log(4.0);
00630         double wght=.000001/diff;
00631         pen-=wght*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00632 #     else 
00633        XXXX
00634 #     endif
00635     }
00636   }
00637 }
00638 
00643 void df1b2_init_bounded_dev_vector::set_value(const init_df1b2vector& x,
00644   const int& ii,const df1b2variable& _pen)
00645 {
00646   ADUNCONST(df1b2variable,pen);
00647   df1b2_init_bounded_vector::set_value(x,ii,pen);
00648   df1b2variable m=mean(*this);
00649   pen+=1000.0*square(m);
00650 }
00651 
00656 void df1b2_init_bounded_vector::allocate(int mmin,int mmax,
00657   double _minb,double _maxb)
00658 {
00659   minb=_minb;
00660   maxb=_maxb;
00661   df1b2_init_vector::allocate(mmin,mmax);
00662 }
00663 
00668 void df1b2_init_bounded_vector::allocate(int mmin,int mmax,
00669   double _minb,double _maxb,const char * s)
00670 {
00671   allocate(mmin,mmax,_minb,_maxb);
00672 }
00673 
00678 void df1b2_init_bounded_vector::allocate(int mmin,int mmax,
00679   double _minb,double _maxb,int n,const char * s)
00680 {
00681   allocate(mmin,mmax,_minb,_maxb);
00682   set_phase_start(n);
00683 }
00684 
00689 int active(const df1b2_init_vector& x)
00690 {
00691    if (x.current_phase >= x.phase_start)
00692      return 1;
00693    else
00694      return 0;
00695 }
00696 
00701 int active(const df1b2_init_number& x)
00702 {
00703    if (x.current_phase >= x.phase_start)
00704      return 1;
00705    else
00706      return 0;
00707 }
00708 
00713 int active(const df1b2_init_matrix& x)
00714 {
00715    if (x.current_phase >= x.phase_start)
00716      return 1;
00717    else
00718      return 0;
00719 }
00720 
00725 void random_effects_bounded_vector_info::set_value
00726   (const init_df1b2vector& _x,const int& _ii,const df1b2variable& _pen)
00727 {
00728   ADUNCONST(int,ii)
00729   ADUNCONST(init_df1b2vector,x)
00730   ADUNCONST(df1b2variable,pen);
00731   df1b2variable& y=pv->df1b2vector::operator()(i);
00732   if (!initial_params::straight_through_flag)
00733   {
00734     // df1b2variable& tmp = boundp(x(ii++),b.getminb(),b.getmaxb(),pen);
00735     // df1b2variable::operator = (tmp);
00736     //df1b2variable::operator = 
00737     y = (boundp(x(ii++),pv->getminb(),pv->getmaxb(),pen));
00738   }
00739   else
00740   {
00741     y = (x(ii++));
00742     *y.get_u()=boundp(*y.get_u(),pv->getminb(),pv->getmaxb());
00743     double diff=pv->getmaxb()-pv->getminb();
00744     df1b2variable ss=(y-pv->getminb())/diff;
00745 #   ifdef USE_BARD_PEN
00746       const double l4=log(4.0);
00747       double wght=.000001/diff;
00748       pen-=wght*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00749 #   else 
00750      XXXX
00751 #   endif
00752   }
00753 }