00001
00002
00003
00004
00005
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
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
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
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
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
00415
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
00467
00468 double diff=fmax-fmin;
00469 const double l4=log(4.0);
00470
00471
00472 df1b2variable ss=0.49999999999999999*sin(x*1.57079632679489661)+0.50;
00473 t=fmin + diff*ss;
00474
00475
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
00516
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
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
00561
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
00735
00736
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 }