Stan  1.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
partials_vari.hpp
Go to the documentation of this file.
1 #ifndef __STAN__AGRAD__PARTIALS_VARI_HPP__
2 #define __STAN__AGRAD__PARTIALS_VARI_HPP__
3 
4 #include <stan/agrad/agrad.hpp>
6 #include <stan/meta/traits.hpp>
7 
8 namespace stan {
9 
10  namespace agrad {
11 
12  class partials_vari : public vari {
13  private:
14  const size_t N_;
15  vari** operands_;
16  double* partials_;
17  public:
18  partials_vari(double value,
19  size_t N,
20  vari** operands, double* partials)
21  : vari(value),
22  N_(N),
23  operands_(operands),
24  partials_(partials) { }
25  void chain() {
26  for (size_t n = 0; n < N_; ++n)
27  operands_[n]->adj_ += adj_ * partials_[n];
28  }
29  };
30 
31  namespace {
32  template<typename T>
33  T partials_to_var(double logp, size_t nvaris,
34  agrad::vari** all_varis,
35  double* all_partials) {
36  return logp;
37  }
38  template<>
39  var partials_to_var<var>(double logp, size_t nvaris,
40  agrad::vari** all_varis,
41  double* all_partials) {
42  return var(new agrad::partials_vari(logp, nvaris, all_varis, all_partials));
43  }
44 
45  template<typename T,
46  bool is_vec = is_vector<T>::value,
47  bool is_const = is_constant_struct<T>::value>
48  struct set_varis {
49  inline size_t set(agrad::vari** varis, const T& x) {
50  return 0U;
51  }
52  };
53  template<typename T>
54  struct set_varis <T,true,false>{
55  inline size_t set(agrad::vari** varis, const T& x) {
56  for (size_t n = 0; n < length(x); n++)
57  varis[n] = x[n].vi_;
58  return length(x);
59  }
60  };
61  template<>
62  struct set_varis<agrad::var, false, false> {
63  inline size_t set(agrad::vari** varis, const agrad::var& x) {
64  varis[0] = x.vi_;
65  return (1);
66  }
67  };
68  }
69 
74  template<typename T1=double, typename T2=double, typename T3=double,
75  typename T4=double, typename T5=double, typename T6=double,
76  typename T_return_type=typename return_type<T1,T2,T3,T4,T5,T6>::type>
79  size_t nvaris;
81  double* all_partials;
82 
89 
90  OperandsAndPartials(const T1& x1=0, const T2& x2=0, const T3& x3=0,
91  const T4& x4=0, const T5& x5=0, const T6& x6=0)
92  : nvaris(!is_constant_struct<T1>::value * length(x1) +
93  !is_constant_struct<T2>::value * length(x2) +
94  !is_constant_struct<T3>::value * length(x3) +
95  !is_constant_struct<T4>::value * length(x4) +
96  !is_constant_struct<T5>::value * length(x5) +
97  !is_constant_struct<T6>::value * length(x6)),
98  all_varis((agrad::vari**)agrad::chainable::operator new(sizeof(agrad::vari*[nvaris]))),
99  all_partials((double*)agrad::chainable::operator new(sizeof(double[nvaris]))),
102  + (!is_constant_struct<T1>::value) * length(x1)),
104  + (!is_constant_struct<T1>::value) * length(x1)
105  + (!is_constant_struct<T2>::value) * length(x2)),
107  + (!is_constant_struct<T1>::value) * length(x1)
108  + (!is_constant_struct<T2>::value) * length(x2)
109  + (!is_constant_struct<T3>::value) * length(x3)),
111  + (!is_constant_struct<T1>::value) * length(x1)
112  + (!is_constant_struct<T2>::value) * length(x2)
113  + (!is_constant_struct<T3>::value) * length(x3)
114  + (!is_constant_struct<T4>::value) * length(x4)),
116  + (!is_constant_struct<T1>::value) * length(x1)
117  + (!is_constant_struct<T2>::value) * length(x2)
118  + (!is_constant_struct<T3>::value) * length(x3)
119  + (!is_constant_struct<T4>::value) * length(x4)
120  + (!is_constant_struct<T5>::value) * length(x5))
121  {
122  size_t base = 0;
124  base += set_varis<T1>().set(&all_varis[base], x1);
126  base += set_varis<T2>().set(&all_varis[base], x2);
128  base += set_varis<T3>().set(&all_varis[base], x3);
130  base += set_varis<T4>().set(&all_varis[base], x4);
132  base += set_varis<T5>().set(&all_varis[base], x5);
134  set_varis<T6>().set(&all_varis[base], x6);
135  std::fill(all_partials, all_partials+nvaris, 0);
136  }
137 
138  T_return_type
139  to_var(double logp) {
140  return partials_to_var<T_return_type>(logp, nvaris, all_varis, all_partials);
141  }
142  };
143 
144  }
145 }
146 
147 
148 #endif

     [ Stan Home Page ] © 2011–2012, Stan Development Team.