Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fvar.hpp
Go to the documentation of this file.
1 #ifndef STAN__AGRAD__FWD__FVAR__HPP
2 #define STAN__AGRAD__FWD__FVAR__HPP
3 
4 #include <ostream>
5 #include <boost/math/special_functions/fpclassify.hpp>
6 #include <stan/meta/likely.hpp>
7 
8 namespace stan {
9 
10  namespace agrad {
11 
12  template <typename T>
13  struct fvar {
14 
15  T val_; // value
16  T d_; // tangent (aka derivative)
17 
18  T val() { return val_; }
19  T tangent() { return d_; }
20 
21  typedef fvar value_type;
22 
23  // TV and TD must be assignable to T
24  template <typename TV, typename TD>
25  fvar(const TV& val, const TD& deriv) : val_(val), d_(deriv) {
26  if (unlikely(boost::math::isnan(val)))
27  d_ = val;
28  }
29 
30  // TV must be assignable to T
31  template <typename TV>
32  fvar(const TV& val) : val_(val), d_(0.0) {
33  if (unlikely(boost::math::isnan(val)))
34  d_ = val;
35  }
36 
37  fvar() : val_(0.0), d_(0.0) { }
38 
39  template <typename T2>
40  inline
41  fvar<T>&
42  operator+=(const fvar<T2>& x2) {
43  val_ += x2.val_;
44  d_ += x2.d_;
45  return *this;
46  }
47 
48  template <typename T2>
49  inline
50  fvar<T>&
51  operator+=(const T2& x2) {
52  val_ += x2;
53  return *this;
54  }
55 
56  template <typename T2>
57  inline
58  fvar<T>&
59  operator-=(const fvar<T2>& x2) {
60  val_ -= x2.val_;
61  d_ -= x2.d_;
62  return *this;
63  }
64 
65  template <typename T2>
66  inline
67  fvar<T>&
68  operator-=(const T2& x2) {
69  val_ -= x2;
70  return *this;
71  }
72 
73  template <typename T2>
74  inline
75  fvar<T>&
76  operator*=(const fvar<T2>& x2) {
77  d_ = d_ * x2.val_ + val_ * x2.d_;
78  val_ *= x2.val_;
79  return *this;
80  }
81 
82  template <typename T2>
83  inline
84  fvar<T>&
85  operator*=(const T2& x2) {
86  val_ *= x2;
87  return *this;
88  }
89 
90  // SPEEDUP: specialize for T2 == var with d_ function
91 
92  template <typename T2>
93  inline
94  fvar<T>&
95  operator/=(const fvar<T2>& x2) {
96  d_ = (d_ * x2.val_ - val_ * x2.d_) / ( x2.val_ * x2.val_);
97  val_ /= x2.val_;
98  return *this;
99  }
100 
101  template <typename T2>
102  inline
103  fvar<T>&
104  operator/=(const T2& x2) {
105  val_ /= x2;
106  return *this;
107  }
108 
109  inline
110  fvar<T>&
112  ++val_;
113  return *this;
114  }
115 
116  inline
117  fvar<T>
118  operator++(int /*dummy*/) {
119  fvar<T> result(val_,d_);
120  ++val_;
121  return result;
122  }
123 
124  inline
125  fvar<T>&
127  --val_;
128  return *this;
129  }
130  inline
131  fvar<T>
132  operator--(int /*dummy*/) {
133  fvar<T> result(val_,d_);
134  --val_;
135  return result;
136  }
137 
138  friend
139  std::ostream&
140  operator<<(std::ostream& os, const fvar<T>& v) {
141  return os << v.val_ << ':' << v.d_;
142  }
143  };
144  }
145 }
146 #endif
bool isnan(const stan::agrad::var &v)
Checks if the given number is NaN.
fvar< T > & operator/=(const fvar< T2 > &x2)
Definition: fvar.hpp:95
fvar< T > & operator--()
Definition: fvar.hpp:126
fvar< T > operator++(int)
Definition: fvar.hpp:118
fvar< T > & operator++()
Definition: fvar.hpp:111
fvar< T > & operator-=(const fvar< T2 > &x2)
Definition: fvar.hpp:59
#define unlikely(x)
Definition: likely.hpp:9
fvar< T > & operator+=(const T2 &x2)
Definition: fvar.hpp:51
fvar< T > & operator/=(const T2 &x2)
Definition: fvar.hpp:104
fvar< T > operator--(int)
Definition: fvar.hpp:132
fvar value_type
Definition: fvar.hpp:21
fvar(const TV &val, const TD &deriv)
Definition: fvar.hpp:25
fvar< T > & operator-=(const T2 &x2)
Definition: fvar.hpp:68
fvar< T > & operator*=(const fvar< T2 > &x2)
Definition: fvar.hpp:76
fvar< T > & operator*=(const T2 &x2)
Definition: fvar.hpp:85
fvar< T > & operator+=(const fvar< T2 > &x2)
Definition: fvar.hpp:42
fvar(const TV &val)
Definition: fvar.hpp:32

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