00001
00002
00003
00004
00005
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
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
00163
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 }