Stan Math Library  2.14.0
reverse mode automatic differentiation
fvar.hpp
Go to the documentation of this file.
1 #ifndef STAN_MATH_FWD_CORE_FVAR_HPP
2 #define STAN_MATH_FWD_CORE_FVAR_HPP
3 
7 #include <boost/utility/enable_if.hpp>
8 #include <ostream>
9 
10 namespace stan {
11  namespace math {
12 
13  template <typename T>
14  struct fvar {
15  T val_; // value
16  T d_; // tangent (aka derivative)
17 
18  T val() const { return val_; }
19  T tangent() const { return d_; }
20 
21  typedef fvar value_type;
22 
23  fvar() : val_(0.0), d_(0.0) { }
24 
25  fvar(const fvar<T>& x) : val_(x.val_), d_(x.d_) { }
26 
27  fvar(const T& v) : val_(v), d_(0.0) { // NOLINT(runtime/explicit)
28  if (is_nan(v))
29  d_ = v;
30  }
31 
32  template <typename V>
33  fvar(const V& v,
34  typename boost::enable_if_c<ad_promotable<V, T>::value>::type*
35  dummy = 0)
36  : val_(v), d_(0.0) {
37  if (is_nan(v))
38  d_ = v;
39  }
40 
41  // TV and TD must be assignable to T
42  template <typename TV, typename TD>
43  fvar(const TV& val, const TD& deriv) : val_(val), d_(deriv) {
44  if (unlikely(is_nan(val)))
45  d_ = val;
46  }
47 
48  inline fvar<T>& operator+=(const fvar<T>& x2) {
49  val_ += x2.val_;
50  d_ += x2.d_;
51  return *this;
52  }
53 
54  inline fvar<T>& operator+=(double x2) {
55  val_ += x2;
56  return *this;
57  }
58 
59  inline fvar<T>& operator-=(const fvar<T>& x2) {
60  val_ -= x2.val_;
61  d_ -= x2.d_;
62  return *this;
63  }
64 
65  inline fvar<T>& operator-=(double x2) {
66  val_ -= x2;
67  return *this;
68  }
69 
70  inline fvar<T>& operator*=(const fvar<T>& x2) {
71  d_ = d_ * x2.val_ + val_ * x2.d_;
72  val_ *= x2.val_;
73  return *this;
74  }
75 
76  inline fvar<T>& operator*=(double x2) {
77  val_ *= x2;
78  d_ *= x2;
79  return *this;
80  }
81 
82  inline fvar<T>& operator/=(const fvar<T>& x2) {
83  d_ = (d_ * x2.val_ - val_ * x2.d_) / (x2.val_ * x2.val_);
84  val_ /= x2.val_;
85  return *this;
86  }
87 
88  inline fvar<T>& operator/=(double x2) {
89  val_ /= x2;
90  d_ /= x2;
91  return *this;
92  }
93 
94  inline fvar<T>& operator++() {
95  ++val_;
96  return *this;
97  }
98 
99  inline fvar<T> operator++(int /*dummy*/) {
100  fvar<T> result(val_, d_);
101  ++val_;
102  return result;
103  }
104 
105  inline fvar<T>& operator--() {
106  --val_;
107  return *this;
108  }
109 
110  inline fvar<T> operator--(int /*dummy*/) {
111  fvar<T> result(val_, d_);
112  --val_;
113  return result;
114  }
115 
116  friend std::ostream& operator<<(std::ostream& os, const fvar<T>& v) {
117  return os << v.val_;
118  }
119  };
120  }
121 }
122 #endif
T tangent() const
Definition: fvar.hpp:19
fvar< T > & operator-=(const fvar< T > &x2)
Definition: fvar.hpp:59
fvar< T > & operator/=(double x2)
Definition: fvar.hpp:88
fvar< T > operator--(int)
Definition: fvar.hpp:110
fvar(const fvar< T > &x)
Definition: fvar.hpp:25
fvar< T > & operator+=(const fvar< T > &x2)
Definition: fvar.hpp:48
Empty struct for use in boost::condtional<is_constant_struct<T1>::value, T1, dummy>::type as false co...
fvar< T > & operator++()
Definition: fvar.hpp:94
#define unlikely(x)
Definition: likely.hpp:9
fvar value_type
Definition: fvar.hpp:21
fvar< T > & operator--()
Definition: fvar.hpp:105
fvar< T > operator++(int)
Definition: fvar.hpp:99
fvar< T > & operator-=(double x2)
Definition: fvar.hpp:65
T val() const
Definition: fvar.hpp:18
fvar< T > & operator+=(double x2)
Definition: fvar.hpp:54
Template traits metaprogram to determine if a variable of one template type can be promoted to a seco...
fvar(const T &v)
Definition: fvar.hpp:27
fvar(const V &v, typename boost::enable_if_c< ad_promotable< V, T >::value >::type *dummy=0)
Definition: fvar.hpp:33
fvar< T > & operator*=(const fvar< T > &x2)
Definition: fvar.hpp:70
int is_nan(const fvar< T > &x)
Returns 1 if the input&#39;s value is NaN and 0 otherwise.
Definition: is_nan.hpp:21
fvar< T > & operator*=(double x2)
Definition: fvar.hpp:76
fvar(const TV &val, const TD &deriv)
Definition: fvar.hpp:43
fvar< T > & operator/=(const fvar< T > &x2)
Definition: fvar.hpp:82

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