ADMB Documentation  11.5.3197
 All Classes Files Functions Variables Typedefs Friends Defines
set.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id$
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California
00006  */
00011 #include <admodel.h>
00012 #include "fvar.hpp"
00013 #define USE_BARD_PEN
00014 
00019 void set_value(const prevariable& _x, const dvar_vector& v, const int& _ii)
00020 {
00021   int& ii = (int&) _ii;
00022   prevariable& x= (prevariable&)( _x);
00023   x=v(ii++);
00024 }
00025 
00030 void set_value(const prevariable& _x,const dvar_vector& v, const int& _ii,
00031   double s)
00032 {
00033   prevariable& x= (prevariable&)( _x);
00034   int& ii=(int&)(_ii);
00035   x=v(ii++)/s;
00036 }
00037 
00042 void set_value_inv(const prevariable& x,const dvector& _v,const int& _ii,
00043   double s)
00044 {
00045   dvector& v=(dvector&)(_v);
00046   int& ii=(int&)(_ii);
00047   v(ii++)=s*value(x);
00048 }
00049 
00054 void set_value(const prevariable& _x,const dvar_vector& v,const int& _ii,
00055   double fmin, double fmax,const dvariable& _fpen,double s)
00056 {
00057   int& ii=(int&)_ii;
00058   prevariable& x=(prevariable&) _x;
00059   dvariable& fpen=(dvariable&) _fpen;
00060   x=boundp(v(ii++),fmin,fmax,fpen,s);
00061 }
00062 
00067 void set_value_inv(const prevariable& x,const dvector& _v,const int& _ii,
00068   double fmin, double fmax,double s)
00069 {
00070   dvector& v=(dvector&)(_v);
00071   int& ii=(int&)(_ii);
00072   v(ii++)=boundpin(x,fmin,fmax,s);
00073 }
00074 
00079 void set_value(const prevariable& _u, const dvar_vector& x, const int& _ii,
00080   const double fmin, const double fmax,const dvariable& _fpen)
00081 {
00082   int& ii = (int&) _ii;
00083   prevariable& u= (prevariable&) _u;
00084   dvariable& fpen= (dvariable&) _fpen;
00085   if (!initial_params::straight_through_flag)
00086   {
00087     u=boundp(x(ii++),fmin,fmax,fpen);
00088   }
00089   else
00090   {
00091     u=x(ii);
00092     value(u)=boundp(value(x(ii++)),fmin,fmax);
00093     double diff=fmax-fmin;
00094     //t=fmin + diff*ss;
00095     dvariable ss=(u-fmin)/diff;
00096 #   ifdef USE_BARD_PEN
00097       const double l4=log(4.0);
00098       double pen=.000001/diff;
00099       fpen-=pen*(log(ss+1.e-40)+log((1.0-ss)+1.e-40)+l4);
00100 #   else
00101           XXXX
00102 #   endif
00103   }
00104 }
00105 
00110 void set_value(const dvar_vector& x, const dvar_vector& v, const int& _ii)
00111 {
00112   int& ii = (int&) _ii;
00113   if (!(!(x)))
00114   {
00115     int min=x.indexmin();
00116     int max=x.indexmax();
00117     for (int i=min;i<=max;i++)
00118     {
00119       ((dvar_vector&)x)(i)=v(ii++);
00120     }
00121   }
00122 }
00123 
00128 void set_value(const dvar_vector& _x,const dvar_vector& v, const int& _ii,
00129   double s)
00130 {
00131   dvar_vector& x=(dvar_vector&) _x;
00132   int& ii = (int&) _ii;
00133   if (!(!(x)))
00134   {
00135     int min=x.indexmin();
00136     int max=x.indexmax();
00137     for (int i=min;i<=max;i++)
00138     {
00139       x(i)=v(ii++)/s;
00140     }
00141   }
00142 }
00143 
00148 void set_value(const dvar_vector& x, const dvar_vector& v, const int& _ii,
00149   double fmin,double fmax,const dvariable& fpen)
00150 {
00151   int& ii = (int&) _ii;
00152   if (!(!(x)))
00153   {
00154     int min=x.indexmin();
00155     int max=x.indexmax();
00156     for (int i=min;i<=max;i++)
00157     {
00158       ((dvar_vector&)(x))(i)=boundp(v(ii++),fmin,fmax,fpen);
00159     }
00160   }
00161 }
00162 //dvariable boundp(const prevariable &,double fmin,double fmax,
00163 //  const dvariable& fpen);
00164 
00169 void set_value(const dvar_vector& _x,const dvar_vector& v,const int& _ii,
00170   double fmin,double fmax,const dvariable& fpen,double s)
00171 {
00172   dvar_vector& x=(dvar_vector&)(_x);
00173   int& ii = (int&) _ii;
00174   if (!(!(x)))
00175   {
00176     int min=x.indexmin();
00177     int max=x.indexmax();
00178     for (int i=min;i<=max;i++)
00179     {
00180       ((dvar_vector&)(x))(i)=boundp(v(ii++)/s,fmin,fmax,fpen);
00181     }
00182   }
00183 }
00184 
00189 void set_value(const dvar_vector& _x,const dvar_vector& v,const int& _ii,
00190   double fmin,double fmax,const dvariable& fpen,double s,const ivector& flags,
00191   double off_value)
00192 {
00193   dvar_vector& x=(dvar_vector&)(_x);
00194   int& ii = (int&) _ii;
00195   if (!(!(x)))
00196   {
00197     int min=x.indexmin();
00198     int max=x.indexmax();
00199     for (int i=min;i<=max;i++)
00200     {
00201       if (flags(i))
00202       {
00203         x(i)=boundp(v(ii++)/s,fmin,fmax,fpen);
00204       }
00205       else
00206       {
00207         x(i)=off_value;
00208       }
00209     }
00210   }
00211 }
00212 
00217 void set_value(const dvar_matrix& x, const dvar_vector& v, const int& _ii)
00218 {
00219   int& ii = (int&) _ii;
00220   if (!(!(x)))
00221   {
00222     int min=x.rowmin();
00223     int max=x.rowmax();
00224     for (int i=min;i<=max;i++)
00225     {
00226       set_value(x(i),v,ii);
00227     }
00228   }
00229 }
00230 
00235 void set_value(const dvar_matrix& x,const dvar_vector& v,const int& _ii,
00236   double s)
00237 {
00238   int& ii = (int&) _ii;
00239   if (!(!(x)))
00240   {
00241     int min=x.rowmin();
00242     int max=x.rowmax();
00243     for (int i=min;i<=max;i++)
00244     {
00245       set_value(x(i),v,ii,s);
00246     }
00247   }
00248 }
00249 
00254 void set_value(const dvar_matrix& x, const dvar_vector& v, const int& ii,
00255   const double fmin, const double fmax,const dvariable& fpen)
00256 {
00257   if (!(!(x)))
00258   {
00259     int min=x.rowmin();
00260     int max=x.rowmax();
00261     for (int i=min;i<=max;i++)
00262     {
00263       set_value(x(i),v,ii,fmin,fmax,fpen);
00264     }
00265   }
00266 }
00267 
00272 void set_value(const dvar_matrix& x,const dvar_vector& v, const int& ii,
00273   double fmin,double fmax,const dvariable& fpen,double s)
00274 {
00275   if (!(!(x)))
00276   {
00277     int min=x.rowmin();
00278     int max=x.rowmax();
00279     for (int i=min;i<=max;i++)
00280     {
00281       set_value(x(i),v,ii,fmin,fmax,fpen,s);
00282     }
00283   }
00284 }
00285 
00290 void set_value(dvar3_array& x, const dvar_vector& v, const int& ii,
00291   const double fmin, const double fmax,const dvariable& fpen)
00292 {
00293   if (!(!(x)))
00294   {
00295     int min=x.slicemin();
00296     int max=x.slicemax();
00297     for (int i=min;i<=max;i++)
00298     {
00299       set_value(x(i),v,ii,fmin,fmax,fpen);
00300     }
00301   }
00302 }
00303 
00308 void set_value_partial(const dvar_matrix& x, const dvar_vector& v,
00309   const int& _ii, int n)
00310 {
00311   int mmin=x.indexmin();
00312   int mmax=x.indexmax();
00313   for (int i=mmin;i<=mmax;i++)
00314   {
00315     set_value_partial(x(i),v,_ii,n);
00316   }
00317 }
00318 
00323 void set_value_partial(const dvar_vector& x, const dvar_vector& v,
00324   const int& _ii, int n)
00325 {
00326   int& ii = (int&) _ii;
00327   if (!(!(x)))
00328   {
00329     int min=x.indexmin();
00330     int max=min+n-1;
00331       if (max >x.indexmax())
00332       {
00333         cerr <<
00334           "index out of range in set_value_patial(const dvar_vector&, ... "
00335           << endl;
00336       }
00337     for (int i=min;i<=max;i++)
00338     {
00339       ((dvar_vector&)(x))(i)=v(ii++);
00340     }
00341   }
00342 }
00343 
00348 void set_value_partial(const dvar_vector& x, const dvar_vector& v,
00349   const int& _ii, int n, const double fmin, const double fmax,
00350   const dvariable& fpen)
00351 {
00352   int& ii = (int&) _ii;
00353   if (!(!(x)))
00354   {
00355     int min=x.indexmin();
00356     int max=min+n-1;
00357       if (max >x.indexmax())
00358       {
00359         cerr <<
00360           "index out of range in set_value_patial(const dvar_vector&, ... "
00361              << endl;
00362       }
00363     for (int i=min;i<=max;i++)
00364     {
00365       ((dvar_vector&)(x))(i)=boundp(v(ii++),fmin,fmax,fpen);
00366     }
00367   }
00368 }
00369 
00374 void set_value(dvar3_array& x, const dvar_vector& v, const int& ii)
00375 {
00376   if (!(!(x)))
00377   {
00378     int min=x.slicemin();
00379     int max=x.slicemax();
00380     for (int i=min;i<=max;i++)
00381     {
00382       set_value(x(i),v,ii);
00383     }
00384   }
00385 }