ADMB Documentation  -a65f1c97
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
df1b2impf.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  */
11 #include <admodel.h>
12 #include <df1b2fun.h>
13 #include <adrndeff.h>
14 #ifndef OPT_LIB
15  #include <cassert>
16  #include <climits>
17 #endif
18 
24  const dmatrix& Hess,const dvector& _xadjoint,const dvector& _uadjoint,
25  const dmatrix& _Hessadjoint,function_minimizer * pmin)
26 {
27  ADUNCONST(dvector,xadjoint)
28  ADUNCONST(dvector,uadjoint)
29  ADUNCONST(dmatrix,Hessadjoint)
30 #if !defined(OPT_LIB) && (__cplusplus >= 201103L)
31  const int xs = [](unsigned int size)->int
32  {
33  assert(size <= INT_MAX);
34  return static_cast<int>(size);
35  }(x.size());
36  const int us = [](unsigned int size)->int
37  {
38  assert(size <= INT_MAX);
39  return static_cast<int>(size);
40  }(u0.size());
41 #else
42  const int xs = static_cast<int>(x.size());
43  const int us = static_cast<int>(u0.size());
44 #endif
46  int nvar = xs + us + us * us;
47  independent_variables y(1,nvar);
48 
49  // need to set random effects active together with whatever
50  // init parameters should be active in this phase
53  /*int onvar=*/initial_params::nvarcalc();
54  initial_params::xinit(y); // get the initial values into the
55  // do we need this next line?
56  y(1,xs)=x;
57 
58  int i,j;
59  dvar_vector d(1,xs+us);
60 
61  // contribution for quadratic prior
63  {
64  //Hess+=quadratic_prior::get_cHessian_contribution();
65  int & vxs = (int&)(xs);
67  }
68  // Here need hooks for sparse matrix structures
69  int ii=xs+us+1;
70  for (i=1;i<=us;i++)
71  for (j=1;j<=us;j++)
72  y(ii++)=Hess(i,j);
73 
76  dvar_matrix vHess(1,us,1,us);
77  ii=xs+us+1;
79  {
80  cerr << "can't do importance sampling with bounded random effects"
81  " at present" << endl;
82  ad_exit(1);
83  }
84  else
85  {
86  for (i=1;i<=us;i++)
87  {
88  for (j=1;j<=us;j++)
89  {
90  vHess(i,j)=vy(ii++);
91  }
92  }
93  }
94 
95  int nsamp=pmin->lapprox->num_importance_samples;
96  dvar_vector sample_value(1,nsamp);
97  sample_value.initialize();
98  dvar_matrix ch=choleski_decomp(inv(vHess));
99 
100  dvariable vf=0.0;
101 
102  // **************************************************************
103  // **************************************************************
104  // **************************************************************
105  int& nfunnelblocks=pmin->lapprox->nfunnelblocks;
106  int lbound=1;
107  int samplesize=nsamp/nfunnelblocks;
108  int ubound=samplesize;
109  int mean_count=0;
110  dvar_vector fvalues(1,nfunnelblocks);
111  ivector blocksizes(1,nfunnelblocks);
112  for (int iblock=1;iblock<=nfunnelblocks;iblock++)
113  {
114  funnel_dvariable fdv;
115  if (lbound>nsamp) break;
116  ad_begin_funnel();
117  int icount=0;
118 
119  for (int is=lbound;is<=ubound;is++)
120  {
121  if (is>nsamp) break;
122  icount++;
123  dvar_vector tau=ch*pmin->lapprox->epsilon(is);
124 
125  vy(xs+1,xs+us).shift(1)+=tau;
126  initial_params::reset(vy); // get the values into the model
127  vy(xs+1,xs+us).shift(1)-=tau;
128 
130  pmin->AD_uf_outer();
131 
132  if (pmin->lapprox->use_outliers==0)
133  {
134  sample_value(icount)=*objective_function_value::pobjfun
135  -0.5*norm2(pmin->lapprox->epsilon(is));
136  }
137  else
138  {
139  dvector& e=pmin->lapprox->epsilon(is);
140 
141  sample_value(icount)=*objective_function_value::pobjfun
142  +sum(log(.95*exp(-0.5*square(e))+.05/3.0*exp(-square(e)/18.0)));
143  }
144  }
145 
146  if (icount>0)
147  {
148  mean_count+=1;
149  dvar_vector tsp=sample_value(1,icount);
150  double min_vf=min(value(tsp));
151  fdv=log(mean(exp(min_vf-tsp)))-min_vf;
152  dvariable tmp;
153  tmp=fdv;
154  fvalues(mean_count)=tmp;
155  blocksizes(mean_count)=icount;
156  }
157  lbound+=samplesize;
158  ubound+=samplesize;
159  }
160 
161  double fm=mean(value(fvalues(1,mean_count)));
162  dvar_vector nfval=exp(fvalues(1,mean_count)-fm);
163  vf=-fm-log(nfval*blocksizes(1,mean_count)/sum(blocksizes(1,mean_count)));
164  //vf-=us*.91893853320467241;
165 
166  int sgn=0;
167  dvariable ld;
169  ld=0.5*ln_det(vHess,sgn);
170  else
171  ld=0.5*ln_det_choleski(vHess);
172 
173  vf+=ld;
174  double f=value(vf);
175  dvector g(1,nvar);
176  gradcalc(nvar,g);
177 
178  // put uhat back into the model
180  vy(xs+1,xs+us).shift(1)=u0;
181  initial_params::reset(vy); // get the values into the model
183 
184  ii=1;
185  for (i=1;i<=xs;i++)
186  xadjoint(i)=g(ii++);
187  for (i=1;i<=us;i++)
188  uadjoint(i)=g(ii++);
189  for (i=1;i<=us;i++)
190  for (j=1;j<=us;j++)
191  Hessadjoint(i,j)=g(ii++);
192  return f;
193 }
Description not yet available.
Definition: fvar.hpp:1641
laplace_approximation_calculator * lapprox
Definition: admodel.h:1862
static void set_NO_DERIVATIVES(void)
Disable accumulation of derivative information.
Definition: gradstrc.cpp:641
Description not yet available.
dvar_vector & shift(int min)
Description not yet available.
Definition: fvar_arr.cpp:28
static void set_active_random_effects(void)
Definition: model.cpp:267
#define x
#define ADUNCONST(type, obj)
Creates a shallow copy of obj that is not CONST.
Definition: fvar.hpp:140
Vector of double precision numbers.
Definition: dvector.h:50
double sum(const d3_array &darray)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: d3arr.cpp:21
exitptr ad_exit
Definition: gradstrc.cpp:53
static dvariable reset(const dvar_vector &x)
Definition: model.cpp:345
ADMB variable vector.
Definition: fvar.hpp:2172
double mean(const dvector &vec)
Returns computed mean of vec.
Definition: cranfill.cpp:43
void gradcalc(int nvar, const dvector &g)
Definition: sgradclc.cpp:77
df1_one_matrix choleski_decomp(const df1_one_matrix &MM)
Definition: df11fun.cpp:606
static int nvarcalc()
Definition: model.cpp:152
ivector sgn(const dvector &v)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: dvect24.cpp:11
static int no_ln_det_choleski_flag
Definition: fvar.hpp:8841
static int stddev_vscale(const dvar_vector &d, const dvar_vector &x)
Definition: model.cpp:191
prnstream & endl(prnstream &)
Description not yet available.
Definition: fvar.hpp:1937
Array of integers(int) with indexes from index_min to indexmax.
Definition: ivector.h:50
#define min(a, b)
Definition: cbivnorm.cpp:188
double calculate_importance_sample_funnel(const dvector &x, const dvector &u0, const dmatrix &Hess, const dvector &_xadjoint, const dvector &_uadjoint, const dmatrix &_Hessadjoint, function_minimizer *pmin)
Description not yet available.
Definition: df1b2impf.cpp:23
static objective_function_value * pobjfun
Definition: admodel.h:2394
Description not yet available.
static void xinit(const dvector &x)
Definition: model.cpp:226
d3_array exp(const d3_array &arr3)
Returns d3_array results with computed exp from elements in arr3.
Definition: d3arr2a.cpp:28
Description not yet available.
Definition: fvar.hpp:2819
double norm2(const d3_array &a)
Return sum of squared elements in a.
Definition: d3arr2a.cpp:167
double ln_det(const dmatrix &m1, int &sgn)
Compute log determinant of a constant matrix.
Definition: dmat3.cpp:536
unsigned int size() const
Get number of elements in array.
Definition: dvector.h:209
void ad_begin_funnel(void)
Description not yet available.
Definition: xgradclc.cpp:386
static int have_bounded_random_effects
Definition: df1b2fun.h:1353
Class definition of matrix with derivitive information .
Definition: fvar.hpp:2480
virtual void AD_uf_outer()
Definition: xmodelm4.cpp:39
double ln_det_choleski(const banded_symmetric_dmatrix &MM, int &ierr)
Definition: dmat38.cpp:218
Description not yet available.
Description not yet available.
Definition: admodel.h:1850
static void set_YES_DERIVATIVES(void)
Enable accumulation of derivative information.
Definition: gradstrc.cpp:650
static void get_cHessian_contribution(dmatrix, int)
Description not yet available.
Definition: quadpri.cpp:591
void initialize(const dvector &ww)
Description not yet available.
Definition: fvar_a24.cpp:63
dvector value(const df1_one_vector &v)
Definition: df11fun.cpp:69
static int get_num_quadratic_prior(void)
Definition: df1b2fun.h:1916
double square(const double value)
Return square of value; constant object.
Definition: d3arr4.cpp:16
Fundamental data type for reverse mode automatic differentiation.
Definition: fvar.hpp:1518
df1_one_variable inv(const df1_one_variable &x)
Definition: df11fun.cpp:384
d3_array log(const d3_array &arr3)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: d3arr2a.cpp:13
static void set_inactive_only_random_effects(void)
Definition: model.cpp:259