ADMB Documentation  11.5.3197
 All Classes Files Functions Variables Typedefs Friends Defines
mc_scale.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 
00013 double set_value_mc(double z,double min,double max);
00014 //double ndfboundp( double x, double fmin, double fmax,const double& fpen);
00015 //double ndfboundp_mc( double x, double fmin, double fmax,const double& fpen);
00016 
00021 int initial_params::montecarlo_scale(const dvector& d, const dvector& x)
00022 {
00023   int ii = 1;
00024   for (int i = 0; i < num_initial_params; i++)
00025   {
00026     //if ((varsptr[i])->phase_start <= current_phase)
00027     if (withinbound(0, (varsptr[i])->phase_start, current_phase))
00028       (varsptr[i])->mc_scale(d,x,ii);
00029   }
00030   return ii - 1;
00031 }
00032 
00037 void param_init_number::mc_scale(const dvector& _d, const dvector& x,
00038   const int& _ii)
00039 {
00040   dvector& d=(dvector&) _d;
00041   int& ii=(int&) _ii;
00042   d(ii)=1;
00043   ii++;
00044 }
00045 
00050 void param_init_bounded_number::mc_scale(const dvector& _d, const dvector& x,
00051   const int& _ii)
00052 {
00053   dvector& d=(dvector&) _d;
00054   int& ii=(int&) _ii;
00055   double pen=0;
00056   //double var;
00057   double xx=set_value_inv_mc(*this,minb,maxb);
00058   double yy=boundpin(*this,minb,maxb);
00059   double a=ndfboundp(yy,minb,maxb,pen);
00060   double b=ndfboundp_mc(xx,minb,maxb,pen);
00061   d(ii)=b/a;
00062   ii++;
00063 }
00064 
00069 double ndfboundp_mc(double x, double fmin, double fmax,const double& fpen)
00070 {
00071   if (x<-0.99999)
00072   {
00073     double df1=(set_value_mc(x+1.e-6,fmin,fmax)-
00074       set_value_mc(x,fmin,fmax))/1.e-6;
00075     double df2=(set_value_mc(x+2.e-6,fmin,fmax)
00076       -set_value_mc(x,fmin,fmax))/2.e-6;
00077     return 2.*df1-df2;
00078   }
00079   else if (x>0.99999)
00080   {
00081     double df1=(set_value_mc(x,fmin,fmax)
00082       -set_value_mc(x-1.e-6,fmin,fmax))/1.e-6;
00083     double df2=(set_value_mc(x,fmin,fmax)-
00084       set_value_mc(x-2.e-6,fmin,fmax))/2.e-6;
00085     return 2.*df1-df2;
00086   }
00087   else
00088   {
00089     return (set_value_mc(x+1.e-6,fmin,fmax)-
00090       set_value_mc(x-1.e-6,fmin,fmax))/2.e-6;
00091   }
00092 }
00093 
00098 void param_init_vector::mc_scale(const dvector& _v, const dvector& x,
00099   const int& _ii)
00100 {
00101   int& ii=(int&) _ii;
00102   dvector& v=(dvector&) _v;
00103   int mmin=indexmin();
00104   int mmax=indexmax();
00105   for (int i=mmin;i<=mmax;i++)
00106   {
00107     v(ii++)=1.;
00108   }
00109 }
00110 
00115 void param_init_matrix::mc_scale(const dvector& _v, const dvector& x,
00116   const int& _ii)
00117 {
00118   int& ii=(int&) _ii;
00119   dvector& v=(dvector&) _v;
00120   int mmin=rowmin();
00121   int mmax=rowmax();
00122   for (int i=mmin;i<=mmax;i++)
00123   {
00124     int cmin=((*this)(i)).indexmin();
00125     int cmax=((*this)(i)).indexmax();
00126     for (int j=cmin;j<=cmax;j++)
00127     {
00128       v(ii++)=1.;
00129     }
00130   }
00131 }
00132 
00137 void param_init_d3array::mc_scale(const dvector& _v, const dvector& x,
00138   const int& _ii)
00139 {
00140   int& ii=(int&) _ii;
00141   dvector& v=(dvector&) _v;
00142   int mmin=slicemin();
00143   int mmax=slicemax();
00144   for (int i=mmin;i<=mmax;i++)
00145   {
00146     int rmin=((*this)(i)).rowmin();
00147     int rmax=((*this)(i)).rowmax();
00148     for (int j=rmin;j<=rmax;j++)
00149     {
00150       int cmin=((*this)(i))(j).indexmin();
00151       int cmax=((*this)(i))(j).indexmax();
00152       for (int k=cmin;k<=cmax;k++)
00153       {
00154         v(ii++)=1.;
00155       }
00156     }
00157   }
00158 }
00159 
00164 void param_init_bounded_vector::mc_scale(const dvector& _v, const dvector& x,
00165   const int& _ii)
00166 {
00167   int& ii=(int&) _ii;
00168   dvector& v=(dvector&) _v;
00169   int mmin=indexmin();
00170   int mmax=indexmax();
00171   double pen=0;
00172   for (int i=mmin;i<=mmax;i++)
00173   {
00174     double var=set_value_mc(x(ii),minb,maxb);
00175     double xx=boundpin(var,minb,maxb);
00176     double a=ndfboundp(xx,minb,maxb,pen);
00177     double b=ndfboundp_mc(x(ii),minb,maxb,pen);
00178     v(ii)=b/a;
00179     ii++;
00180   }
00181 }
00182 
00187 void param_init_bounded_matrix::mc_scale(const dvector& _v, const dvector& x,
00188   const int& _ii)
00189 {
00190   int& ii=(int&) _ii;
00191   dvector& v=(dvector&) _v;
00192   int rmin=rowmin();
00193   int rmax=rowmax();
00194   double pen=0;
00195   for (int i=rmin;i<=rmax;i++)
00196   {
00197     int cmin=(*this)(i).indexmin();
00198     int cmax=(*this)(i).indexmax();
00199     for (int j=cmin;j<=cmax;j++)
00200     {
00201       v(ii)=ndfboundp(x(ii),minb,maxb,pen);
00202       double var=set_value_mc(x(ii),minb,maxb);
00203       double xx=set_value_inv_mc(var,minb,maxb);
00204       double a=ndfboundp(xx,minb,maxb,pen);
00205       double b=ndfboundp_mc(xx,minb,maxb,pen);
00206       v(ii)=b/a;
00207       ii++;
00208     }
00209   }
00210 }