ADMB Documentation  -a65f1c97
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
montebds.cpp
Go to the documentation of this file.
1 /*
2  * $Id$
3  *
4  * Author: David Fournier
5  * Copyright (c) 2008-2012 Regents of the University of California
6  */
7 #include <admodel.h>
8 
9 /*
10 ofstream ofss("variance");
11 double ssmin(double x, double y)
12 {
13  if (x<y) return x;
14  return y;
15 }
16 double ssmax(double y, double x)
17 {
18  if (x>y) return x;
19  return y;
20 }
21 */
22 
23 const double simbdsmax=1.e+90;
24 
26  {
27  int ii=1;
28  for (int i=0;i<num_initial_params;i++)
29  {
30  //if ((varsptr[i])->phase_start <= current_phase)
32  (varsptr[i])->set_simulation_bounds(symbds,ii);
33  }
34  }
35 
37  const int& _ii)
38  {
39  int& ii=(int&) _ii;
40  dmatrix& symbds=(dmatrix&) _symbds;
41  symbds(1,ii)= -simbdsmax;
42  symbds(2,ii)= simbdsmax;
43  ii++;
44  }
45 
47  const int& _ii)
48  {
49  dmatrix& symbds=(dmatrix&) _symbds;
50  int& ii=(int&) _ii;
51  symbds(1,ii)= minb-value(*this);
52  symbds(2,ii)= maxb-value(*this);
53  ii++;
54  }
55 
57  const int& _ii)
58  {
59  dmatrix& symbds=(dmatrix&) _symbds;
60  int& ii=(int&) _ii;
61  int mmin=indexmin();
62  int mmax=indexmax();
63  for (int i=mmin;i<=mmax;i++)
64  {
65  symbds(1,ii)= -simbdsmax;
66  symbds(2,ii)= simbdsmax;
67  ii++;
68  }
69  }
70 
72  const int& _ii)
73 {
74  dmatrix& symbds=(dmatrix&) _symbds;
75  int& ii=(int&) _ii;
76  int mmin = indexmin();
77  int mmax = indexmax();
78  double* psymbds1ii = symbds(1).get_v() + ii;
79  double* psymbds2ii = symbds(2).get_v() + ii;
80  double_and_int* pvai = va + mmin;
81  for (int i=mmin;i<=mmax;i++)
82  {
83  *psymbds1ii = minb - pvai->x;
84  *psymbds2ii = maxb - pvai->x;
85 
86  ++psymbds1ii;
87  ++psymbds2ii;
88  ++pvai;
89  ++ii;
90  }
91 }
92 
94  const int& _ii)
95  {
96  dmatrix& symbds=(dmatrix&) _symbds;
97  int& ii=(int&) _ii;
98  int rmin=rowmin();
99  int rmax=rowmax();
100  for (int i=rmin;i<=rmax;i++)
101  {
102  int cmin=(*this)(i).indexmin();
103  int cmax=(*this)(i).indexmax();
104  for (int j=cmin;j<=cmax;j++)
105  {
106  symbds(1,ii)= -simbdsmax;
107  symbds(2,ii)= simbdsmax;
108  ii++;
109  }
110  }
111  }
112 
114  const int& _ii)
115  {
116  dmatrix& symbds=(dmatrix&) _symbds;
117  int& ii=(int&) _ii;
118  int rmin=rowmin();
119  int rmax=rowmax();
120  for (int i=rmin;i<=rmax;i++)
121  {
122  int cmin=(*this)(i).indexmin();
123  int cmax=(*this)(i).indexmax();
124  for (int j=cmin;j<=cmax;j++)
125  {
126  symbds(1,ii)= minb-value((*this)(i,j));
127  symbds(2,ii)= maxb-value((*this)(i,j));
128  ii++;
129  }
130  }
131  }
132 
133 void param_init_number::add_value(const dvector& y, const dvector& ndev,
134  const int& _ii, const double& s, const dvector& diag)
135  {
136  int& ii=(int&) _ii;
137  (*this)+=diag(ii)*ndev(ii);
138  ii++;
139  }
140 
141 double new_value_mc(const double& _jac,double x,double min,double max,
142  double eps, double sig)
143 {
144  double& jac=(double&) _jac;
145  double y;
146  double y1;
147  double mult;
148  double z;
149  double z1;
150  if (eps>0)
151  {
152  double d=max-x;
153  double d2=.5*d;
154  if (sig>d2)
155  {
156  mult=d2;
157  }
158  else
159  {
160  mult=sig;
161  }
162  y=mult*eps;
163  y1=mult*(eps+1.e-6);
164  if (y>0.9*d)
165  {
166  z=y-0.9*d;
167  z1=y1-0.9*d;
168  y=0.9*d+0.1*d*z/(1.+z);
169  y1=0.9*d+0.1*d*z1/(1.+z1);
170  }
171  y+=x;
172  y1+=x;
173  }
174  else
175  {
176  double d=x-min;
177  double d2=.5*d;
178  if (sig>d2)
179  {
180  mult=d2;
181  }
182  else
183  {
184  mult=sig;
185  }
186  y=-mult*eps;
187  y1=-mult*(eps+1.e-6);
188  if (y>0.9*d)
189  {
190  z=y-0.9*d;
191  z1=y1-0.9*d;
192  y=0.9*d+0.1*d*z/(1.+z);
193  y1=0.9*d+0.1*d*z1/(1.+z1);
194  }
195  y=x-y;
196  y1=x-y1;
197  }
198  jac=(y1-y)*1.e+6;
199  return y;
200 }
201 
203  const dvector& ndev, const int& _ii, const double& s, const dvector& diag)
204  {
205  int& ii=(int&) _ii;
206  *this = new_value_mc(_y(ii),value(*this),minb,maxb,ndev(ii),diag(ii));
207  ii++;
208  }
209 
210 void param_init_vector::add_value(const dvector& y, const dvector& ndev,
211  const int& _ii, const double& s, const dvector& diag)
212  {
213  int& ii=(int&) _ii;
214  int mmin=indexmin();
215  int mmax=indexmax();
216  for (int i=mmin;i<=mmax;i++)
217  {
218  (*this)(i)+=diag(ii)*ndev(ii);
219  ii++;
220  }
221  }
222 
224  const dvector& ndev, const int& _ii, const double& s, const dvector& diag)
225  {
226  int& ii=(int&) _ii;
227  int mmin=indexmin();
228  int mmax=indexmax();
229  for (int i=mmin;i<=mmax;i++)
230  {
231  (*this)(i)= new_value_mc(y(ii),value((*this)(i)),minb,maxb,ndev(ii),
232  diag(ii));
233  ii++;
234  }
235  }
236 
237 /*
238 void param_init_bounded_vector::add_value(const dvector& y,
239  const dvector& ndev, const int& ii, const double& s)
240  {
241  int mmin=indexmin();
242  int mmax=indexmax();
243  dvector tmp(mmin,mmax);
244  int jj=1;
245  set_value_inv(tmp,jj);
246  double hpi=.5*PI;
247  for (int i=mmin;i<=mmax;i++)
248  {
249  tmp(i)=atan(y(ii)+ndev(ii))/hpi;
250  s-= log(1./(hpi*(1.0+square(y(ii)+ndev(ii)))));
251  ii++;
252  }
253  jj=1;
254  dvariable pen=0.0;
255  set_value(tmp,jj,pen);
256  }
257 */
258 
259 void param_init_matrix::add_value(const dvector& y, const dvector& ndev,
260  const int& _ii, const double& s, const dvector& diag)
261  {
262  int& ii=(int&) _ii;
263  int rmin=rowmin();
264  int rmax=rowmax();
265  for (int i=rmin;i<=rmax;i++)
266  {
267  int cmin=(*this)(i).indexmin();
268  int cmax=(*this)(i).indexmax();
269  for (int j=cmin;j<=cmax;j++)
270  {
271  (*this)(i,j)+=diag(ii)*ndev(ii);
272  ii++;
273  }
274  }
275  }
276 
278  const int& _ii, const double& s, const dvector& diag)
279  {
280  int& ii=(int&) _ii;
281  int rmin=rowmin();
282  int rmax=rowmax();
283  for (int i=rmin;i<=rmax;i++)
284  {
285  int cmin=(*this)(i).indexmin();
286  int cmax=(*this)(i).indexmax();
287  for (int j=cmin;j<=cmax;j++)
288  {
289  (*this)(i,j)= new_value_mc(y(ii),value((*this)(i,j)),minb,maxb,
290  ndev(ii),diag(ii));
291  ii++;
292  }
293  }
294  }
295 
296 void param_init_d3array::add_value(const dvector& y, const dvector& ndev,
297  const int& _ii, const double& s, const dvector& diag)
298 {
299  int& ii=(int&) _ii;
300  int smin=indexmin();
301  int smax=indexmax();
302  for (int k=smin;k<=smax;k++)
303  {
304  int rmin=(*this)(k).indexmin();
305  int rmax=(*this)(k).indexmax();
306  for (int i=rmin;i<=rmax;i++)
307  {
308  int cmin=(*this)(k,i).indexmin();
309  int cmax=(*this)(k,i).indexmax();
310  for (int j=cmin;j<=cmax;j++)
311  {
312  (*this)(k,i,j)+=diag(ii)*ndev(ii);
313  ii++;
314  }
315  }
316  }
317 }
318 
319 void param_init_d3array::add_value(const dvector& ndev, const int& _ii)
320 {
321  int& ii=(int&) _ii;
322  int smin=indexmin();
323  int smax=indexmax();
324  for (int k=smin;k<=smax;k++)
325  {
326  int rmin=(*this)(k).indexmin();
327  int rmax=(*this)(k).indexmax();
328  for (int i=rmin;i<=rmax;i++)
329  {
330  int cmin=(*this)(k,i).indexmin();
331  int cmax=(*this)(k,i).indexmax();
332  for (int j=cmin;j<=cmax;j++)
333  {
334  (*this)(k,i,j)+=ndev(ii);
335  ii++;
336  }
337  }
338  }
339 }
340 
342  const int& _ii)
343  {
344  int& ii=(int&) _ii;
345  (*this)+=ndev(ii);
346  ii++;
347  }
348 
350  const dvector& ndev, const int& _ii)
351  {
352  int& ii=(int&) _ii;
353  (*this)+=ndev(ii);
354  ii++;
355  }
356 
358  const int& _ii)
359  {
360  int& ii=(int&) _ii;
361  int mmin=indexmin();
362  int mmax=indexmax();
363  for (int i=mmin;i<=mmax;i++)
364  {
365  (*this)(i)+=ndev(ii);
366  ii++;
367  }
368  }
369 
371  const int& _ii)
372  {
373  int& ii=(int&) _ii;
374  int rmin=rowmin();
375  int rmax=rowmax();
376  for (int i=rmin;i<=rmax;i++)
377  {
378  int cmin=(*this)(i).indexmin();
379  int cmax=(*this)(i).indexmax();
380  for (int j=cmin;j<=cmax;j++)
381  {
382  (*this)(i,j)+=ndev(ii);
383  ii++;
384  }
385  }
386  }
387 
389  const dvector& ndev, const int& _ii)
390  {
391  int& ii=(int&) _ii;
392  int rmin=rowmin();
393  int rmax=rowmax();
394  for (int i=rmin;i<=rmax;i++)
395  {
396  int cmin=(*this)(i).indexmin();
397  int cmax=(*this)(i).indexmax();
398  for (int j=cmin;j<=cmax;j++)
399  {
400  (*this)(i,j)+=ndev(ii);
401  ii++;
402  }
403  }
404  }
405 
407  const dvector& _jac, const int& _ii)
408  {
409  dvector& y=(dvector&) _y;
410  dvector& jac=(dvector&) _jac;
411  int& ii=(int&) _ii;
412  int mmin=indexmin();
413  int mmax=indexmax();
414  dvector tmp(mmin,mmax);
415  int jj=1;
416  set_value_inv(tmp,jj);
417  double hpi=.5*PI;
418  for (int i=mmin;i<=mmax;i++)
419  {
420  y(ii)=tan(hpi*tmp(i));
421  jac(ii) = 1./(hpi*(1.0+square(y(ii))));
422  ii++;
423  }
424  }
425 
427  const int& _ii)
428 {
429  dmatrix& symbds=(dmatrix&) _symbds;
430  int& ii=(int&) _ii;
431  int smin=indexmin();
432  int smax=indexmax();
433  for (int k=smin;k<=smax;k++)
434  {
435  int rmin=(*this)(k).indexmin();
436  int rmax=(*this)(k).indexmax();
437  for (int i=rmin;i<=rmax;i++)
438  {
439  int cmin=(*this)(k,i).indexmin();
440  int cmax=(*this)(k,i).indexmax();
441  for (int j=cmin;j<=cmax;j++)
442  {
443  symbds(1,ii)= -simbdsmax;
444  symbds(2,ii)= simbdsmax;
445  ii++;
446  }
447  }
448  }
449 }
d3_array tan(const d3_array &arr3)
Returns d3_array results with computed tan from elements in arr3.
Definition: d3arr2a.cpp:73
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:93
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:133
int rowmax(void) const
Definition: fvar.hpp:2564
const double simbdsmax
Definition: montebds.cpp:23
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:36
int withinbound(int lb, int n, int ub)
Definition: model.cpp:45
#define x
Vector of double precision numbers.
Definition: dvector.h:50
virtual void get_jacobian(const dvector &, const dvector &, const int &)
Definition: montebds.cpp:357
virtual void get_jacobian(const dvector &, const dvector &, const int &)
Definition: montebds.cpp:388
friend dvector value(const dvar_vector &v1)
Description not yet available.
Definition: fvar_ar3.cpp:43
virtual void get_jacobian(const dvector &, const dvector &, const int &)
Definition: montebds.cpp:349
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:210
static void set_all_simulation_bounds(const dmatrix &symbds)
Definition: montebds.cpp:25
int indexmax() const
Definition: fvar.hpp:4273
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:277
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:113
Holds the data for the prevariable class.
Definition: fvar.hpp:191
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)=0
static int current_phase
Definition: admodel.h:842
#define min(a, b)
Definition: cbivnorm.cpp:188
virtual void set_value_inv(const dvector &x, const int &ii)
Definition: model.cpp:883
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:259
Description not yet available.
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:426
int rowmin(void) const
Definition: fvar.hpp:2560
Description not yet available.
Definition: fvar.hpp:2819
friend double & value(const prevariable &v1)
Definition: fvar.hpp:1495
static int num_initial_params
Definition: admodel.h:836
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:71
int indexmin() const
Definition: fvar.hpp:2287
int indexmax(void) const
Definition: fvar.hpp:2572
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:202
double eps
Definition: ftweak.cpp:13
int phase_start
Definition: admodel.h:848
double mult
Definition: ftweak.cpp:12
double new_value_mc(const double &_jac, double x, double min, double max, double eps, double sig)
Definition: montebds.cpp:141
virtual void get_jacobian(const dvector &, const dvector &, const int &)
Definition: montebds.cpp:370
double_and_int * va
Definition: fvar.hpp:2175
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:46
dvector value(const df1_one_vector &v)
Definition: df11fun.cpp:69
#define PI
Definition: fvar.hpp:95
#define max(a, b)
Definition: cbivnorm.cpp:189
virtual void set_simulation_bounds(const dmatrix &symbds, const int &ii)
Definition: montebds.cpp:56
int indexmin(void) const
Definition: fvar.hpp:2568
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:296
int indexmax() const
Definition: fvar.hpp:2292
int indexmin() const
Definition: fvar.hpp:4272
double square(const double value)
Return square of value; constant object.
Definition: d3arr4.cpp:16
virtual void add_value(const dvector &, const dvector &, const int &, const double &, const dvector &)
Definition: montebds.cpp:223
double x
&lt; value of the variable
Definition: fvar.hpp:195
static adlist_ptr varsptr
Definition: admodel.h:838
virtual void get_jacobian(const dvector &, const dvector &, const int &)
Definition: montebds.cpp:406
virtual void get_jacobian(const dvector &, const dvector &, const int &)
Definition: montebds.cpp:341