ADMB Documentation  11.1.1015
 All Classes Files Functions Variables Typedefs Friends Defines
df1b2fn3.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: df1b2fn3.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 #include <df1b2fun.h>
00012 void read_pass1_plus_eq_1(void);
00013 void read_pass1_plus_eq_2(void);
00014 void read_pass1_plus_eq_3(void);
00015 //#define ADDEBUG_PRINT
00016 #if defined(ADDEBUG_PRINT)
00017   extern int addebug_count;
00018 #endif
00019 //#define PRINT_DERS
00020 
00021 
00022 #if defined(PRINT_DERS)
00023 
00027 void print_derivatives(const adstring& s, double f, double df,
00028   double d2f,double d3f,int bflag)
00029 {
00030   ostream * derout;
00031   derout=&cout;
00032   if (bflag)
00033   {
00034     *derout << "           ---------------------------------------- " << endl;
00035   }
00036   *derout << "Function: " << s << " " << "f = " << f 
00037           << " df = " << df << " d2f = " << d2f << " d3f = " << d3f << endl; 
00038 }
00039 
00044 void print_derivatives(const adstring& s, double f, double df1,
00045   double df2,double df11,double df12, double df22,
00046   double df111, double df112, double df122, double df222,int bflag)
00047 {
00048   ostream * derout;
00049   derout=&cout;
00050   if (bflag)
00051   {
00052     *derout << endl << "           --------------------------------- " << endl;
00053   }
00054   *derout << "Function: " << s << " " << "f = " << f 
00055           << " df1 = " << df1 
00056           << " df2 = " << df2 
00057           << " df11 = " << df11 
00058           << " df12 = " << df12 
00059           << " df22 = " << df22 
00060           << " df111 = " << df111
00061           << " df112 = " << df112
00062           << " df122 = " << df122
00063           << " df222 = " << df222 << endl; 
00064 }
00065 
00070 void print_derivatives(df1b2_header * px,const char * s,
00071   int bflag) 
00072 {
00073   int i;
00074   ostream * derout;
00075   derout=&cout;
00076   //*derout << derprintcount << " " << endl;
00077   if (bflag)
00078   {
00079     *derout << endl << "           --------------------------------- " << endl;
00080   }
00081   *derout << "pass " << df1b2variable::passnumber;
00082   *derout << "  variable " << s << "  address " 
00083           << int(px->u) << endl;
00084   *derout << "u\t\t = " << *px->u << " ";
00085   *derout << endl;
00086 
00087   *derout << "udot\t\t = ";
00088   for (i=0;i<df1b2variable::nvar;i++) 
00089     *derout <<  px->u_dot[i] << " ";
00090   *derout << endl;
00091 
00092   *derout << "u_bar\t\t = ";
00093   for (i=0;i<df1b2variable::nvar;i++) 
00094     *derout <<  px->u_bar[i] << " ";
00095   *derout << endl;
00096 
00097   *derout << "u_dot_bar\t = ";
00098   for (i=0;i<df1b2variable::nvar;i++) 
00099     *derout <<  px->u_dot_bar[i] << " ";
00100   *derout << endl;
00101 
00102   if (df1b2variable::passnumber>1)
00103   {
00104     *derout << "u_tilde\t\t = " << *px->u_tilde << " ";
00105     *derout << endl;
00106   
00107     *derout << "u_dot_tilde\t = ";
00108     for (i=0;i<df1b2variable::nvar;i++) 
00109       *derout <<  px->u_dot_tilde[i] << " ";
00110     *derout << endl;
00111   
00112     *derout << "u_bar_tilde\t = ";
00113     for (i=0;i<df1b2variable::nvar;i++) 
00114       *derout <<  px->u_bar_tilde[i] << " ";
00115     *derout << endl;
00116   
00117     *derout << "u_dot_bar_tilde\t = ";
00118     for (i=0;i<df1b2variable::nvar;i++) 
00119       *derout <<  px->u_dot_bar_tilde[i] << " ";
00120     *derout << endl;
00121   }
00122   *derout << endl;
00123 
00124 }
00125 #endif
00126 
00131 df1b2variable& df1b2variable::operator += (const df1b2variable& _x)
00132 {
00133   ADUNCONST(df1b2variable,x) 
00134   double * xd=x.get_u_dot();
00135   double * zd=get_u_dot();
00136   *get_u()+=*x.get_u();
00137   for (int i=0;i<df1b2variable::nvar;i++)
00138   {
00139     *zd++ += *xd++;
00140   }
00141   
00142   // WRITE WHATEVER ON TAPE
00143   //df1b2tape->set_tapeinfo_header(&x,&z,this,xd);
00144   // save stuff for first reverse pass
00145   // need &x, &z, this,
00146   if (!df1b2_gradlist::no_derivatives)
00147     f1b2gradlist->write_pass1_pluseq(&x,this);
00148   return *this;
00149 }
00150 void ad_read_pass1_plus_eq(void);
00151 
00156 int df1b2_gradlist::write_pass1_pluseq(const df1b2variable * _px, 
00157   df1b2variable * pz)
00158 {
00159   ncount++;
00160 #if defined(CHECK_COUNT)
00161   if (ncount >= ncount_check)
00162     ncount_checker(ncount,ncount_check);
00163 #endif
00164   //int nvar=df1b2variable::nvar;
00165   ADUNCONST(df1b2variable*,px) 
00166   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00167   test_smartlist& list=f1b2gradlist->list; 
00168 
00169   int total_bytes=sizeof(df1b2_header)+sizeof(df1b2_header);
00170 #if defined(SAFE_ALL)
00171   char ids[]="JK";
00172   int slen=strlen(ids);
00173   total_bytes+=slen;
00174 #endif
00175   list.check_buffer_size(total_bytes);
00176   void * tmpptr=list.bptr;
00177 #if defined(SAFE_ALL)
00178   memcpy(list,ids,slen);
00179 #endif
00180   
00181   memcpy(list,(df1b2_header*)(px),sizeof(df1b2_header));
00182   memcpy(list,(df1b2_header*)(pz),sizeof(df1b2_header));
00183 
00184   // ***** write  record size
00185   nlist.bptr->numbytes=adptr_diff(list.bptr,tmpptr);
00186   nlist.bptr->pf=(ADrfptr)(&ad_read_pass1_plus_eq);
00187   ++nlist;
00188   return 0;
00189 }
00190 
00195 void ad_read_pass1_plus_eq(void)
00196 {
00197   switch(df1b2variable::passnumber)
00198   {
00199   case 1:
00200     read_pass1_plus_eq_1();
00201     break;
00202   case 2:
00203     read_pass1_plus_eq_2();
00204     break;
00205   case 3:
00206     read_pass1_plus_eq_3();
00207     break;
00208   default:
00209     cerr << "illegal value for df1b2variable::pass = " 
00210          << df1b2variable::passnumber << endl;
00211     exit(1);
00212   }
00213 }
00214 
00219 void read_pass1_plus_eq_1(void)
00220 {
00221   // We are going backword for bptr and forward for bptr2
00222   // the current entry+2 in bptr is the size of the record i.e
00223   // points to the next record
00224   int nvar=df1b2variable::nvar;
00225   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00226   test_smartlist& list=f1b2gradlist->list; 
00227    // nlist-=sizeof(int);
00228   // get record size
00229   int num_bytes=nlist.bptr->numbytes;
00230   // backup the size of the record
00231   list-=num_bytes;
00232   list.saveposition(); // save pointer to beginning of record;
00233   // save the pointer to the beginning of the record
00234 #if defined(SAFE_ARRAYS)
00235   checkidentiferstring("JK",list);
00236 #endif
00237 
00238   // get info from tape1
00239   df1b2_header * px=(df1b2_header *) list.bptr;
00240   list.bptr+=sizeof(df1b2_header);
00241   df1b2_header * pz=(df1b2_header *) list.bptr;
00242 
00243   list.restoreposition(); // save pointer to beginning of record;
00244   int i;
00245   
00246   // Do first reverse paSS calculations
00247   // ****************************************************************
00248   // turn this off if no third derivatives are calculated
00249   // if (!no_third_derivatives)
00250   // {
00251   // save for second reverse pass
00252   // save identifier 1
00253   //   fixed_smartlist2& nlist2=f1b2gradlist->nlist2; 
00254   //   test_smartlist& list2=f1b2gradlist->list2; 
00255   //int total_bytes=2*nvar*sizeof(double);
00256 // string identifier debug stuff
00257 #if defined(SAFE_ALL)
00258   //char ids[]="IL";
00259   //int slen=strlen(ids);
00260   //total_bytes+=slen;
00261 #endif
00262   //list2.check_buffer_size(total_bytes);
00263   //void * tmpptr2=list2.bptr;
00264 #if defined(SAFE_ALL)
00265   //memcpy(list2,ids,slen);
00266 #endif
00267      //memcpy(list2,pz->get_u_bar(),nvar*sizeof(double));
00268      //memcpy(list2,pz->get_u_dot_bar(),nvar*sizeof(double));
00269      //*nlist2.bptr=adptr_diff(list2.bptr,tmpptr2);
00270      //nlist2++;
00271   // }
00272   //
00273   // ****************************************************************
00274 #if defined(PRINT_DERS)
00275  print_derivatives(px,"x"); 
00276  print_derivatives(pz,"z"); 
00277 #endif
00278  
00279   for (i=0;i<nvar;i++)
00280   {
00281     px->u_bar[i]+=pz->u_bar[i];
00282   }
00283   for (i=0;i<nvar;i++)
00284   {
00285     px->u_dot_bar[i]+=pz->u_dot_bar[i];
00286   }
00287 #if defined(PRINT_DERS)
00288  print_derivatives(px,"x"); 
00289  print_derivatives(pz,"z"); 
00290 #endif
00291 }
00292 
00297 void read_pass1_plus_eq_2(void)
00298 {
00299   //const int nlist_record_size=sizeof(int)+sizeof(char*);
00300   // We are going forward for bptr and backword for bptr2
00301   //
00302   // list 1
00303   //
00304   int nvar=df1b2variable::nvar;
00305   test_smartlist & list=f1b2gradlist->list; 
00306 
00307   int total_bytes=sizeof(df1b2_header)+sizeof(df1b2_header);
00308 #if defined(SAFE_ALL)
00309   char ids[]="JK";
00310   int slen=strlen(ids);
00311   total_bytes+=slen;
00312 #endif
00313   list.check_buffer_size(total_bytes);
00314 
00315   list.saveposition(); // save pointer to beginning of record;
00316   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00317    // nlist-=sizeof(int);
00318   // get record size
00319   int num_bytes=nlist.bptr->numbytes;
00320     // nlist+=nlist_record_size;
00321   //
00322   // list 2
00323   //
00324   //test_smartlist & list2=f1b2gradlist->list2; 
00325   //fixed_smartlist2 & nlist2=f1b2gradlist->nlist2; 
00326   // get record size
00327   //int num_bytes2=*nlist2.bptr;
00328   //nlist2--;
00329   // backup the size of the record
00330   //list2-=num_bytes2;
00331   //list2.saveposition(); // save pointer to beginning of record;
00332   // save the pointer to the beginning of the record
00333   // bptr and bptr2 now both point to the beginning of their records
00334 #if defined(SAFE_ARRAYS)
00335   checkidentiferstring("JK",list);
00336   //checkidentiferstring("IL",list2);
00337 #endif
00338 
00339 
00340   // get info from tape1
00341   df1b2_header * px=(df1b2_header *) list.bptr;
00342   list.bptr+=sizeof(df1b2_header);
00343   df1b2_header * pz=(df1b2_header *) list.bptr;
00344 
00345   list.restoreposition(num_bytes); // save pointer to beginning of record;
00346 
00347 
00348   //double * zbar=(double*)list2.bptr;
00349   //double * zdotbar=(double*)(list2.bptr+nvar*sizeof(double));
00350 
00351   double * x_bar_tilde=px->get_u_bar_tilde();
00352   double * x_dot_bar_tilde=px->get_u_dot_bar_tilde();
00353   double * z_bar_tilde=pz->get_u_bar_tilde();
00354   double * z_dot_bar_tilde=pz->get_u_dot_bar_tilde();
00355   // Do second "reverse-reverse" pass calculations
00356   int i;
00357   for (i=0;i<nvar;i++)
00358   {
00359     z_bar_tilde[i]+=x_bar_tilde[i];
00360   }
00361 
00362   for (i=0;i<nvar;i++)
00363   {
00364     z_dot_bar_tilde[i]+=x_dot_bar_tilde[i];
00365   }
00366   //list2.restoreposition(); // save pointer to beginning of record;
00367 #if defined(PRINT_DERS)
00368  print_derivatives(px,"x"); 
00369  print_derivatives(pz,"z"); 
00370 #endif
00371 }
00372 
00377 void read_pass1_plus_eq_3(void)
00378 {
00379   // We are going backword for bptr and forward for bptr2
00380   // the current entry+2 in bptr is the size of the record i.e
00381   // points to the next record
00382   int nvar=df1b2variable::nvar;
00383   fixed_smartlist & nlist=f1b2gradlist->nlist; 
00384   test_smartlist& list=f1b2gradlist->list; 
00385    // nlist-=sizeof(int);
00386   // get record size
00387   int num_bytes=nlist.bptr->numbytes;
00388   // backup the size of the record
00389   list-=num_bytes;
00390   list.saveposition(); // save pointer to beginning of record;
00391   // save the pointer to the beginning of the record
00392 
00393 #if defined(SAFE_ARRAYS)
00394   checkidentiferstring("JK",list);
00395 #endif
00396   // get info from tape1
00397   df1b2_header * px=(df1b2_header *) list.bptr;
00398   list.bptr+=sizeof(df1b2_header);
00399   df1b2_header * pz=(df1b2_header *) list.bptr;
00400 
00401   list.restoreposition(); // save pointer to beginning of record;
00402 
00403   int i;
00404   *(px->u_tilde)+=*pz->u_tilde;
00405   for (i=0;i<nvar;i++)
00406   {
00407     px->u_dot_tilde[i]+=pz->u_dot_tilde[i];
00408   }
00409 #if defined(PRINT_DERS)
00410  print_derivatives(px,"x"); 
00411  print_derivatives(pz,"z"); 
00412 #endif
00413 }
00414 
00419 df1b2variable fabs(const df1b2variable& x)
00420 {
00421   if (value(x)>=0.0)
00422     return x;
00423   else
00424     return -x;
00425 }
00426 
00431 df1b2vector fabs(const df1b2vector& t1)
00432 {
00433    df1b2vector tmp(t1.indexmin(),t1.indexmax());
00434    for (int i=t1.indexmin(); i<=t1.indexmax(); i++)
00435    {
00436      tmp(i)=fabs(t1(i));
00437    }
00438 
00439    return(tmp);
00440 }
00441 
00446 df1b2variable max(const df1b2vector& t1)
00447 {
00448    df1b2variable tmp;
00449    int mmin=t1.indexmin();
00450    int mmax=t1.indexmax();
00451    tmp=t1(mmin);
00452    for (int i=mmin+1; i<=mmax; i++)
00453    {
00454      if (value(tmp)<value(t1(i))) tmp=t1(i);
00455    }
00456    return(tmp);
00457 }