ADMB Documentation  11.1.1020
 All Classes Files Functions Variables Typedefs Friends Defines
f1b2locl.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: f1b2locl.cpp 818 2013-03-12 23:07:07Z johnoel $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California 
00006  */
00011 #include <df1b2fun.h>
00012 #include "f1b2locl.h"
00013 class newadkludge;
00014 extern newadkludge * newadkl;
00015 
00020 void local_init_df1b2variable::dot_calcs(local_dep_df1b2variable& v,int j)
00021 { 
00022   if (adpool_stack_pointer<1)
00023   {
00024     cerr << "this can't happen" << endl;
00025     ad_exit(1);
00026   }
00027   int global_nvar=adpool_nvar_stack[adpool_stack_pointer-1];
00028   double * xd=p->get_u_dot();
00029   double * ud=v.get_u_dot();
00030   double * zd=(v.p)->get_u_dot();
00031   for (int i=0;i<global_nvar;i++)
00032   {
00033     //for (int j=0;j<nvar;j++)
00034     {
00035       *zd+=ud[j] * *xd;
00036     }
00037     zd++;
00038     xd++;
00039   }
00040 }
00041 
00046 local_init_df1b2variable::local_init_df1b2variable
00047   (void) : df1b2variable(newadkl)
00048 {
00049   p=0;
00050 }
00051 
00056 local_init_df1b2variable::local_init_df1b2variable
00057   (double _xu, double * _xdot) : df1b2variable()
00058 {
00059   *get_u()=_xu;
00060   p=0;
00061   xdot=_xdot;
00062   set_dot(num_vars-1);
00063 }
00064 
00069 local_init_df1b2variable::local_init_df1b2variable
00070   (const df1b2variable & _x) : df1b2variable(newadkl)
00071 {
00072   ADUNCONST(df1b2variable,x)
00073   p=&_x;
00074   xu=*(x.get_u()); 
00075 }
00076 
00081 local_init_df1b2vector::local_init_df1b2vector(const df1b2vector & _x)
00082 {
00083   ADUNCONST(df1b2vector,x)
00084   p=&_x;
00085   int mmin=x.indexmin();
00086   int mmax=x.indexmax();
00087   //int ind_index = x(mmin).get_ind_index();
00088   df1b2variable::noallocate=1;
00089   df1b2vector::allocate(mmin,mmax);
00090   df1b2variable::noallocate=0;
00091 }
00092 
00093  
00094  // #define USE_BARD_PEN
00095  // class newadkludge;
00096  // extern newadkludge * newadkl=0;
00097  // 
00098  // 
00099   typedef local_init_var  * PLOCAL_INIT_VAR;
00100  // 
00101  // class laplace_approximation_calculator;
00102  // laplace_approximation_calculator * funnel_init_var::lapprox=0;
00103  // df1b2variable * funnel_init_var::funnel_constraints_penalty=0;
00104   int local_init_var::num_vars=0;
00105  // //int funnel_init_var::num_all_vars=0;
00106   int local_init_var::num_inactive_vars=0;
00107   int local_init_var::num_active_parameters=0;
00108  // //funnel_init_var ** funnel_init_var::all_list=new PFUNNEL_INIT_VAR[200];
00109   local_init_var ** local_init_var::list=new PLOCAL_INIT_VAR[200];
00110   local_init_var ** local_init_var::inactive_list=new PLOCAL_INIT_VAR[200];
00111   init_df1b2vector * local_init_var::py=0;
00112   imatrix * local_init_var::plist=0;
00113  // 
00114  // void  xxx(init_df1b2vector & tmp,int x){;}
00115  // 
00116 
00121   void local_init_var::add_to_list(void)
00122   {
00123     index=num_vars;
00124     list[num_vars++]=this;
00125     //all_list[num_all_vars++]=this;
00126   }
00127  // 
00128  // void funnel_init_var::delete_from_list(void)
00129  // {
00130  //   if (index!=num_vars-1)
00131  //   {
00132  //     cerr << "can only delete last member" << endl;
00133  //     ad_exit(1);
00134  //   }
00135  //   num_vars--;
00136  //   index=-1;
00137  // }
00138  // 
00139 
00144   void local_init_var::add_to_inactive_list(void)
00145   {
00146     index=-1;
00147     inactive_list[num_inactive_vars++]=this;
00148   }
00149 
00154   void local_init_var::allocate(void)
00155   {
00156     //cout << "In allocate" << endl;
00157   }
00158   
00163   void local_init_var::allocate_all(void)
00164   {
00165     num_active_parameters=local_init_var::nvarcalc_all();
00166     if (py) 
00167     {
00168       if (py->indexmax() != num_active_parameters)
00169       {
00170         delete py;
00171         py=0;
00172       }
00173     }
00174   
00175     df1b2variable::save_adpool_pointer(); 
00176     adpool * tmppool=df1b2variable::pool;
00177     if (!localf1b2gradlist)
00178     {
00179       localf1b2gradlist = new df1b2_gradlist(400000U,20000U,800000U,40000U,
00180         200000U,10000U,adstring("lf1b2list1"));
00181       if (!localf1b2gradlist)
00182       {
00183         cerr << "Error allocating memory for local df1b2gradlist" << endl;
00184         ad_exit(1);
00185       }
00186     }
00187     globalf1b2gradlist=f1b2gradlist;
00188     f1b2gradlist=localf1b2gradlist;
00189  
00190     if (tmppool)
00191     {
00192       //cout << tmppool << endl;
00193       // check if current pool is the right size
00194       if (tmppool->nvar != num_active_parameters)
00195       {
00196         // check sizes of other pools
00197         int found_pool_flag=0;
00198         for (int i=0;i<df1b2variable::adpool_counter;i++)
00199         {
00200           if (df1b2variable::adpool_vector[i]->nvar == num_active_parameters)
00201           {
00202             adpool * tmp = df1b2variable::pool;
00203             df1b2variable::pool=df1b2variable::adpool_vector[i];
00204             if (!tmp->on_adpool_vector())
00205             {
00206               df1b2variable::adpool_vector[df1b2variable::adpool_counter]=tmp;
00207               df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00208                 tmp->nvar;
00209               //df1b2variable::adpool_counter++;
00210               df1b2variable::increment_adpool_counter();
00211               tmp->on_adpool_vector()=1;
00212             }
00213             found_pool_flag=1;
00214             break;
00215           }
00216         }
00217         if (!found_pool_flag)
00218         {
00219           if (df1b2variable::adpool_counter>=df1b2variable::adpool_vectorsize)
00220           {
00221              cerr << "Need to increase adpool_vectorsize" << endl;
00222              ad_exit(1);
00223           }
00224           if (!df1b2variable::pool->on_adpool_vector())
00225           {
00226             df1b2variable::adpool_vector[df1b2variable::adpool_counter]=
00227               df1b2variable::pool;
00228             df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00229               df1b2variable::pool->nvar;
00230             //df1b2variable::adpool_counter++;
00231             df1b2variable::increment_adpool_counter();
00232             df1b2variable::pool->on_adpool_vector()=1;
00233           }
00234           df1b2variable::pool=new adpool();
00235           if (!df1b2variable::pool)
00236           {
00237             cerr << "Memory allocation error" << endl;
00238             ad_exit(1);
00239           } 
00240 
00241           df1b2variable::nvar=num_active_parameters;
00242           df1b2variable::set_blocksize();
00243 
00244           if (!df1b2variable::pool->on_adpool_vector())
00245           {
00246             df1b2variable::adpool_vector[df1b2variable::adpool_counter]=
00247               df1b2variable::pool;
00248             df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00249               df1b2variable::pool->nvar;
00250             //df1b2variable::adpool_counter++;
00251             df1b2variable::increment_adpool_counter();
00252             df1b2variable::pool->on_adpool_vector()=1;
00253           }
00254 
00255         }    
00256       }
00257     }
00258     else
00259     {
00260       df1b2variable::pool=new adpool();
00261       if (!df1b2variable::pool)
00262       {
00263         cerr << "Memory allocation error" << endl;
00264         ad_exit(1);
00265       } 
00266       df1b2variable::nvar=num_active_parameters;
00267       df1b2variable::set_blocksize();
00268       df1b2variable::adpool_vector[df1b2variable::adpool_counter]=
00269         df1b2variable::pool;
00270       df1b2variable::nvar_vector[df1b2variable::adpool_counter]=
00271         df1b2variable::pool->nvar;
00272       //df1b2variable::adpool_counter++;
00273       df1b2variable::increment_adpool_counter();
00274     }
00275   
00276       df1b2variable::nvar=num_active_parameters;
00277       df1b2variable::set_blocksize();
00278 
00279       if (!py)
00280       {
00281         py = new init_df1b2vector(1,num_active_parameters);
00282       }
00283       if (!py)
00284       {
00285         cerr << "memory allocation error" << endl;
00286         ad_exit(1);
00287       }
00288       //init_df1b2vector& tmp = *py;
00289     
00290   
00291     if (plist) 
00292     {
00293       if (plist->indexmax() != num_active_parameters)
00294       {
00295         delete plist;
00296         plist=0;
00297       }
00298     }
00299     if (!plist) 
00300     {
00301       plist = new imatrix(1,num_active_parameters,1,2);
00302     }
00303     if (!plist)
00304     {
00305       cerr << "memory allocation error" << endl;
00306       ad_exit(1);
00307     }
00308   
00309     int ii=1;
00310     int i;
00311       for(i=0;i<num_vars;i++)
00312       {
00313         list[i]->xinit(*py,ii);
00314       }
00315   
00316     ii=1;
00317     for(i=0;i<num_vars;i++)
00318     {
00319       list[i]->set_index(*plist,ii);
00320     }
00321   
00322     for(i=0;i<num_inactive_vars;i++)
00323     {
00324       inactive_list[i]->allocate();
00325     }
00326   
00327     local_init_var::reset(*py);
00328   }
00329   
00330  // funnel_init_df1b2variable::funnel_init_df1b2variable
00331  //   (const df1b2_init_number & _x) : df1b2variable(newadkl)
00332  //   //(df1b2_init_number & x) : df1b2variable()
00333  // {
00334  //   ADUNCONST(df1b2_init_number,x)
00335  //   type=0;
00336  //   pointer=0;
00337  //   ind_index=x.get_ind_index();
00338  //   if (ind_index<0) 
00339  //   {
00340  //     add_to_inactive_list();
00341  //   }
00342  //   else
00343  //   {
00344  //     add_to_list();
00345  //     lapprox->used_flags(ind_index)+=1;
00346  //   }
00347  //   //cout << "ind_index = " << ind_index << endl;
00348  //   xu=*(x.get_u()); 
00349  // }
00350  // 
00351  // 
00352  // funnel_init_df1b2variable::funnel_init_df1b2variable
00353  //   (const random_effects_bounded_vector_info & _u)
00354  //   : df1b2variable(newadkl)
00355  // {
00356  //   ADUNCONST(random_effects_bounded_vector_info,u)
00357  //   df1b2variable& x = (*(u.pv)).df1b2vector::operator () (u.i);
00358  // 
00359  //   type=1;
00360  //   pointer=u.pv;
00361  //   ind_index = x.get_ind_index();
00362  //   if (ind_index<0) 
00363  //   {
00364  //     add_to_inactive_list();
00365  //   }
00366  //   else
00367  //   {
00368  //     add_to_list();
00369  //     lapprox->used_flags(ind_index)+=1;
00370  //   }
00371  //   xu=*(x.get_u()); 
00372  // 
00373  // }
00374  // 
00375 
00380   void local_init_df1b2variable::allocate(const df1b2variable& x)
00381   {
00382     cerr << "Haven't defined htis yet" << endl;
00383     ad_exit(1);
00384   }
00385  // 
00386  // funnel_init_df1b2variable::funnel_init_df1b2variable
00387  //   (void) : df1b2variable(newadkl)
00388  // {
00389  //   type=0;
00390  //   pointer=0;
00391  //   ind_index = -1;
00392  //   if (ind_index<0) 
00393  //   {
00394  //     add_to_inactive_list();
00395  //   }
00396  //   else
00397  //   {
00398  //     add_to_list();
00399  //   }
00400  // }
00401  // 
00402 
00407   void local_init_df1b2variable::
00408     preallocate(const df1b2variable & _x) 
00409   {
00410     ADUNCONST(df1b2variable,x)
00411     type=0;
00412     pointer=0;
00413     ind_index = x.get_ind_index();
00414     if (ind_index<0) 
00415     {
00416       add_to_inactive_list();
00417     }
00418     else
00419     {
00420       add_to_list();
00421     }
00422     xu=*(x.get_u()); 
00423   }
00424   
00425  // 
00426  // funnel_init_df1b2variable::funnel_init_df1b2variable
00427  //   (const df1b2variable & _x) : df1b2variable(newadkl)
00428  // {
00429  //   ADUNCONST(df1b2variable,x)
00430  //   type=0;
00431  //   pointer=0;
00432  //   ind_index = x.get_ind_index();
00433  //   if (ind_index<0) 
00434  //   {
00435  //     add_to_inactive_list();
00436  //   }
00437  //   else
00438  //   {
00439  //     add_to_list();
00440  //   }
00441  //   xu=*(x.get_u()); 
00442  // }
00443  // 
00444 
00449   void local_init_df1b2variable::allocate(void)
00450   {
00451     df1b2variable::allocate();
00452     *(get_u())=xu;
00453     if (index>=0)
00454       get_u_dot()[index]=1.0; 
00455   }
00456  // 
00457  // funnel_dependent_df1b2variable::funnel_dependent_df1b2variable
00458  //   (const df1b2variable& x)
00459  // {
00460  //   df1b2variable::operator = (x);
00461  //   if (!df1b2_gradlist::no_derivatives)
00462  //   {
00463  //     df1b2variable * tmp = (df1b2variable *) (this);
00464  //     //set_dependent_variable(*tmp);
00465  //   }
00466  //   df1b2_gradlist::set_no_derivatives();
00467  // }
00468  // 
00469 
00474   void local_init_df1b2variable::set_value(const init_df1b2vector& _x,
00475     const int& _ii)
00476   {
00477     //df1b2variable pen=0.0;
00478     ADUNCONST(init_df1b2vector,x)
00479     ADUNCONST(int,ii)
00480     df1b2variable::operator = (x(ii++));
00481   }
00482   
00487   void local_init_df1b2variable::set_value(const init_df1b2vector& _x,
00488     const int& _ii,const df1b2variable& _pen)
00489   {
00490     ADUNCONST(init_df1b2vector,x)
00491     ADUNCONST(int,ii)
00492     ADUNCONST(df1b2variable,pen)
00493     if (!pointer)
00494     {
00495       df1b2variable::operator = (x(ii++));
00496     }
00497     else
00498     {
00499       switch (type)
00500       {
00501         case 1:   // vector
00502         {
00503           df1b2_init_bounded_vector & b = *(df1b2_init_bounded_vector*)pointer; 
00504           //laplace_approximation_calculator * l =lapprox;
00505           //int uf=-1;
00506           if (ind_index>0)
00507           {
00508            // uf=l->used_flags(ind_index);
00509           }
00510           else
00511           {
00512             if (!initial_params::straight_through_flag)
00513             {
00514               df1b2variable::operator = (boundp(x(ii++),b.getminb(),b.getmaxb(),
00515                 pen));
00516             }
00517             else
00518             {
00519               df1b2variable::operator = (x(ii++));
00520               *get_u()=boundp(*get_u(),b.getminb(),b.getmaxb());
00521               double diff=b.getmaxb()-b.getminb();
00522               df1b2variable ss=((*this)-b.getminb())/diff;
00523   #           ifdef USE_BARD_PEN
00524                 const double l4=log(4.0);
00525                 double wght=.000001/diff;
00526                 pen-=wght*(log(ss+double(1.e-40))+log((double(1.0)-ss)
00527                    +double(1.e-40))+l4);
00528   #           else 
00529                XXXX
00530   #           endif
00531             }
00532           }
00533           break;
00534         }
00535         case 2:  // matrix
00536         default:
00537         {
00538           cerr << "the bounded matrix case in " 
00539             " void funnel_init_df1b2variable::xinit  has not bee implemented"
00540             << endl;
00541             ad_exit(1);
00542         }
00543       }  
00544     }
00545   }
00546   
00551   int local_init_var::nvarcalc_all(void)
00552   {
00553     int n=0;
00554     for (int i=0;i<num_vars;i++)
00555     {
00556       n+=list[i]->nvar_calc();
00557     }
00558     return n;
00559   }
00560 
00565   void local_init_var::set_dot_all(void)
00566   {
00567     int ii=0;
00568     for (int i=0;i<num_vars;i++)
00569     {
00570       list[i]->set_dot(ii);
00571     }
00572   }
00573 
00578   void local_init_var::dot_calcs_all(local_dep_df1b2variable& v)
00579   {
00580     for (int i=0;i<num_vars;i++)
00581     {
00582       list[i]->dot_calcs(v,i);
00583     }
00584   }
00585 
00590   void local_init_df1b2variable::xinit(init_df1b2vector& y,int& ii)
00591   {
00592     y(ii)= xu;
00593     ii++;
00594   }
00595 
00600   void local_init_df1b2variable::xinit(dvector& y,int& ii)
00601   {
00602     if (!pointer)
00603     {
00604       y(ii)= xu;
00605     }
00606     else
00607     {
00608       switch (type)
00609       {
00610         case 1:   // vector
00611         {
00612           df1b2_init_bounded_vector & b = *(df1b2_init_bounded_vector*)pointer; 
00613           y(ii)=boundpin(xu,b.getminb(),b.getmaxb());
00614           break;
00615         }
00616         case 2:  // matrix
00617         default:
00618         {
00619           cerr << "the bounded matrix case in " 
00620             " void local_init_df1b2variable::xinit  has not bee implemented"
00621             << endl;
00622             ad_exit(1);
00623         }
00624       }  
00625     }
00626     ii++;
00627   }
00628     
00629  // /*
00630  // void funnel_init_df1b2variable::xinit(dvector& y,int& ii)
00631  // {
00632  //   y(ii)= xu;
00633  //   ii++;
00634  // }
00635  // */
00636  //   
00637 
00642   void local_init_df1b2variable::set_index(imatrix& y,int& ii)
00643   {
00644     //cout << "FUCK " << ind_index << " " << ii << endl;
00645     y(ii,1)= ind_index;
00646     y(ii,2)= ii;
00647     ii++;
00648   }
00649 
00654   void local_init_var::reset(init_df1b2vector& x)
00655   {
00656     int ii=1;
00657     //df1b2variable pen=0.0;
00658     for (int i=0;i<num_vars;i++)
00659     {
00660       //list[i]->set_value(x,ii,pen);
00661       list[i]->set_value(x,ii);
00662     }
00663   }
00664  // 
00665  // 
00666  // funnel_init_df1b2vector::funnel_init_df1b2vector(const df1b2_init_vector & _x)
00667  // {
00668  //   ADUNCONST(df1b2_init_vector,x)
00669  //   //type=0;
00670  //   //pointer=0;
00671  //   p=&_x;
00672  //   int mmin=p->indexmin();
00673  //   int mmax=p->indexmax();
00674  //   int ind_index = (*p)(mmin).get_ind_index();
00675  //   if (ind_index<0) 
00676  //   {
00677  //     add_to_inactive_list();
00678  //   }
00679  //   else
00680  //   {
00681  //     add_to_list();
00682  //   }
00683  //   df1b2variable::noallocate=1;
00684  //   df1b2vector::allocate(mmin,mmax);
00685  //   df1b2variable::noallocate=0;
00686  // }
00687  // 
00688  // 
00689 
00694   int local_init_df1b2vector::nvar_calc(void)
00695   {
00696     return p->indexmax()-p->indexmin()+1;
00697   }
00698 
00699 
00704   void local_init_df1b2vector::xinit(init_df1b2vector& y,int& ii)
00705   { 
00706     df1b2vector * vp = (df1b2vector*)(p); 
00707     int mmin=vp->indexmin();
00708     int mmax=vp->indexmax();
00709     int i;
00710     for (i=mmin;i<=mmax;i++)
00711     {
00712       y(ii)= value((*vp)(i));
00713       ii++;
00714     }
00715   }
00716   
00721   void local_init_df1b2vector::set_index(imatrix& y,int& ii)
00722   {
00723     
00724     int mmin=p->indexmin();
00725     int mmax=p->indexmax();
00726     int i;
00727     for (i=mmin;i<=mmax;i++)
00728     {
00729       //y(ii,1)= ( *(df1b2_init_vector *)(p) )(i).get_ind_index();
00730       y(ii,2)= ii;
00731       ii++;
00732     }
00733   }
00734 
00739   void local_init_df1b2vector::set_value(const init_df1b2vector& _x,
00740     const int& _ii)
00741   {
00742     ADUNCONST(int,ii)
00743     ADUNCONST(init_df1b2vector,x)
00744     int mmin=p->indexmin();
00745     int mmax=p->indexmax();
00746     int i;
00747     for (i=mmin;i<=mmax;i++)
00748     {
00749       (*this)(i) = (x(ii++));
00750     }
00751   }
00752 
00757   void local_init_df1b2vector::set_value(const init_df1b2vector& _x,
00758     const int& _ii,const df1b2variable& pen)
00759   {
00760     ADUNCONST(int,ii)
00761     ADUNCONST(init_df1b2vector,x)
00762     int mmin=p->indexmin();
00763     int mmax=p->indexmax();
00764     int i;
00765     for (i=mmin;i<=mmax;i++)
00766     {
00767       (*this)(i) = (x(ii++));
00768     }
00769   }