Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Eigen_NumTraits.hpp
Go to the documentation of this file.
1 #ifndef STAN__AGRAD__REV__MATRIX__EIGEN_NUMTRAITS_HPP
2 #define STAN__AGRAD__REV__MATRIX__EIGEN_NUMTRAITS_HPP
3 
4 #include <limits>
6 #include <stan/agrad/rev/var.hpp>
7 
8 namespace stan {
9  namespace agrad {
10 
11  namespace {
12  class gevv_vvv_vari : public stan::agrad::vari {
13  protected:
17  double dotval_;
18  size_t length_;
19  inline static double eval_gevv(const stan::agrad::var* alpha,
20  const stan::agrad::var* v1, int stride1,
21  const stan::agrad::var* v2, int stride2,
22  size_t length, double *dotprod) {
23  double result = 0;
24  for (size_t i = 0; i < length; i++)
25  result += v1[i*stride1].vi_->val_ * v2[i*stride2].vi_->val_;
26  *dotprod = result;
27  return alpha->vi_->val_ * result;
28  }
29  public:
30  gevv_vvv_vari(const stan::agrad::var* alpha,
31  const stan::agrad::var* v1, int stride1,
32  const stan::agrad::var* v2, int stride2, size_t length) :
33  vari(eval_gevv(alpha,v1,stride1,v2,stride2,length,&dotval_)), length_(length) {
34  alpha_ = alpha->vi_;
36  v2_ = v1_ + length_;
37  for (size_t i = 0; i < length_; i++)
38  v1_[i] = v1[i*stride1].vi_;
39  for (size_t i = 0; i < length_; i++)
40  v2_[i] = v2[i*stride2].vi_;
41  }
42  virtual ~gevv_vvv_vari() {}
43  void chain() {
44  const double adj_alpha = adj_ * alpha_->val_;
45  for (size_t i = 0; i < length_; i++) {
46  v1_[i]->adj_ += adj_alpha * v2_[i]->val_;
47  v2_[i]->adj_ += adj_alpha * v1_[i]->val_;
48  }
49  alpha_->adj_ += adj_ * dotval_;
50  }
51  };
52  }
53 
54  }
55 }
56 
57 
58 namespace Eigen {
59 
64  template <>
65  struct NumTraits<stan::agrad::var> {
72 
79 
86 
93  inline static Real epsilon() {
94  return std::numeric_limits<double>::epsilon();
95  }
96 
100  inline static Real dummy_precision() {
101  return 1e-12; // copied from NumTraits.h values for double
102  }
103 
110  inline static Real highest() {
112  }
113 
120  inline static Real lowest() {
122  }
123 
128  enum {
129  IsInteger = 0,
130  IsSigned = 1,
131  IsComplex = 0,
132  RequireInitialization = 0,
133  ReadCost = 1,
134  AddCost = 1,
135  MulCost = 1,
136  HasFloatingPoint = 1
137  };
138  };
139 
140  namespace internal {
144  template<>
145  struct significant_decimals_default_impl<stan::agrad::var,false>
146  {
147  static inline int run()
148  {
149  using std::ceil;
150  using std::log;
151  return cast<double,int>(ceil(-log(std::numeric_limits<double>::epsilon())
152  / log(10.0)));
153  }
154  };
155 
160  template <>
161  struct scalar_product_traits<stan::agrad::var,double> {
163  };
164 
169  template <>
170  struct scalar_product_traits<double,stan::agrad::var> {
172  };
173 
177  template<typename Index, bool ConjugateLhs, bool ConjugateRhs>
178  struct general_matrix_vector_product<Index,stan::agrad::var,ColMajor,ConjugateLhs,stan::agrad::var,ConjugateRhs>
179  {
182  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
183  enum { LhsStorageOrder = ColMajor };
184 
185  EIGEN_DONT_INLINE static void run(
186  Index rows, Index cols,
187  const LhsScalar* lhs, Index lhsStride,
188  const RhsScalar* rhs, Index rhsIncr,
189  ResScalar* res, Index resIncr, const ResScalar &alpha)
190  {
191  for (Index i = 0; i < rows; i++) {
192  res[i*resIncr] += stan::agrad::var(new stan::agrad::gevv_vvv_vari(&alpha,((int)LhsStorageOrder == (int)ColMajor)?(&lhs[i]):(&lhs[i*lhsStride]),((int)LhsStorageOrder == (int)ColMajor)?(lhsStride):(1),rhs,rhsIncr,cols));
193  }
194  }
195  };
196  template<typename Index, bool ConjugateLhs, bool ConjugateRhs>
197  struct general_matrix_vector_product<Index,stan::agrad::var,RowMajor,ConjugateLhs,stan::agrad::var,ConjugateRhs>
198  {
201  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
202  enum { LhsStorageOrder = RowMajor };
203 
204  EIGEN_DONT_INLINE static void run(
205  Index rows, Index cols,
206  const LhsScalar* lhs, Index lhsStride,
207  const RhsScalar* rhs, Index rhsIncr,
208  ResScalar* res, Index resIncr, const RhsScalar &alpha)
209  {
210  for (Index i = 0; i < rows; i++) {
211  res[i*resIncr] += stan::agrad::var(new stan::agrad::gevv_vvv_vari(&alpha,((int)LhsStorageOrder == (int)ColMajor)?(&lhs[i]):(&lhs[i*lhsStride]),((int)LhsStorageOrder == (int)ColMajor)?(lhsStride):(1),rhs,rhsIncr,cols));
212  }
213  }
214  };
215  template<typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>
216  struct general_matrix_matrix_product<Index,stan::agrad::var,LhsStorageOrder,ConjugateLhs,stan::agrad::var,RhsStorageOrder,ConjugateRhs,ColMajor>
217  {
220  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
221  static void run(Index rows, Index cols, Index depth,
222  const LhsScalar* _lhs, Index lhsStride,
223  const RhsScalar* _rhs, Index rhsStride,
224  ResScalar* res, Index resStride,
225  const ResScalar &alpha,
226  level3_blocking<LhsScalar,RhsScalar>& /* blocking */,
227  GemmParallelInfo<Index>* /* info = 0 */)
228  {
229  for (Index i = 0; i < cols; i++) {
230  general_matrix_vector_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,ConjugateRhs>::run(
231  rows,depth,_lhs,lhsStride,
232  &_rhs[((int)RhsStorageOrder == (int)ColMajor)?(i*rhsStride):(i)],((int)RhsStorageOrder == (int)ColMajor)?(1):(rhsStride),
233  &res[i*resStride],1,alpha);
234  }
235  }
236  };
237  }
238 }
239 
240 #endif
stan::agrad::vari ** v1_
static Real highest()
Return standard library's highest for double-precision floating point, std::numeric_limits<double>max...
stan::agrad::var Real
Real-valued variables.
static void run(Index rows, Index cols, Index depth, const LhsScalar *_lhs, Index lhsStride, const RhsScalar *_rhs, Index rhsStride, ResScalar *res, Index resStride, const ResScalar &alpha, level3_blocking< LhsScalar, RhsScalar > &, GemmParallelInfo< Index > *)
double max(const double a, const double b)
Definition: max.hpp:7
size_t length(const T &)
Definition: traits.hpp:159
const double val_
The value of this variable.
Definition: vari.hpp:37
memory::stack_alloc memalloc_
Definition: var_stack.cpp:16
static EIGEN_DONT_INLINE void run(Index rows, Index cols, const LhsScalar *lhs, Index lhsStride, const RhsScalar *rhs, Index rhsIncr, ResScalar *res, Index resIncr, const RhsScalar &alpha)
fvar< T > ceil(const fvar< T > &x)
Definition: ceil.hpp:15
static Real lowest()
Return standard library's lowest for double-precision floating point, &#45;std::numeric_limits<double...
vari * vi_
Pointer to the implementation of this variable.
Definition: var.hpp:40
stan::agrad::var Nested
Nested variables.
size_t rows(const Eigen::Matrix< T, R, C > &m)
Definition: rows.hpp:12
stan::agrad::vari ** v2_
The variable implementation base class.
Definition: vari.hpp:28
stan::agrad::var NonInteger
Non-integer valued variables.
size_t cols(const Eigen::Matrix< T, R, C > &m)
Definition: cols.hpp:12
Independent (input) and dependent (output) variables for gradients.
Definition: var.hpp:27
double e()
Return the base of the natural logarithm.
Definition: constants.hpp:86
static EIGEN_DONT_INLINE void run(Index rows, Index cols, const LhsScalar *lhs, Index lhsStride, const RhsScalar *rhs, Index rhsIncr, ResScalar *res, Index resIncr, const ResScalar &alpha)
static Real dummy_precision()
Return dummy precision.
static Real epsilon()
Return standard library's epsilon for double-precision floating point, std::numeric_limits<double>::e...
fvar< T > log(const fvar< T > &x)
Definition: log.hpp:15
double dotval_
size_t length_
double adj_
The adjoint of this variable, which is the partial derivative of this variable with respect to the ro...
Definition: vari.hpp:43
stan::agrad::vari * alpha_

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