Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs 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  void chain() {
43  const double adj_alpha = adj_ * alpha_->val_;
44  for (size_t i = 0; i < length_; i++) {
45  v1_[i]->adj_ += adj_alpha * v2_[i]->val_;
46  v2_[i]->adj_ += adj_alpha * v1_[i]->val_;
47  }
48  alpha_->adj_ += adj_ * dotval_;
49  }
50  };
51  }
52 
53  }
54 }
55 
56 
57 namespace Eigen {
58 
63  template <> struct NumTraits<stan::agrad::var>
64  {
71 
78 
85 
92  inline static Real epsilon() {
94  }
95 
99  inline static Real dummy_precision() {
100  return 1e-12; // copied from NumTraits.h values for double
101  }
102 
109  inline static Real highest() {
111  }
112 
119  inline static Real lowest() {
121  }
122 
127  enum {
128  IsInteger = 0,
129  IsSigned = 1,
130  IsComplex = 0,
131  RequireInitialization = 0,
132  ReadCost = 1,
133  AddCost = 1,
134  MulCost = 1,
135  HasFloatingPoint = 1
136  };
137  };
138 
139  namespace internal {
143  template<>
144  struct significant_decimals_default_impl<stan::agrad::var,false>
145  {
146  static inline int run()
147  {
148  using std::ceil;
149  return cast<double,int>(ceil(-log(NumTraits<stan::agrad::var>::epsilon().val())
150  /log(10.0)));
151  }
152  };
153 
158  template <>
159  struct scalar_product_traits<stan::agrad::var,double> {
161  };
162 
167  template <>
168  struct scalar_product_traits<double,stan::agrad::var> {
170  };
171 
175  template<typename Index, bool ConjugateLhs, bool ConjugateRhs>
176  struct general_matrix_vector_product<Index,stan::agrad::var,ColMajor,ConjugateLhs,stan::agrad::var,ConjugateRhs>
177  {
180  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
181  enum { LhsStorageOrder = ColMajor };
182 
183  EIGEN_DONT_INLINE static void run(
184  Index rows, Index cols,
185  const LhsScalar* lhs, Index lhsStride,
186  const RhsScalar* rhs, Index rhsIncr,
187  ResScalar* res, Index resIncr, const ResScalar &alpha)
188  {
189  for (Index i = 0; i < rows; i++) {
190  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));
191  }
192  }
193  };
194  template<typename Index, bool ConjugateLhs, bool ConjugateRhs>
195  struct general_matrix_vector_product<Index,stan::agrad::var,RowMajor,ConjugateLhs,stan::agrad::var,ConjugateRhs>
196  {
199  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
200  enum { LhsStorageOrder = RowMajor };
201 
202  EIGEN_DONT_INLINE static void run(
203  Index rows, Index cols,
204  const LhsScalar* lhs, Index lhsStride,
205  const RhsScalar* rhs, Index rhsIncr,
206  ResScalar* res, Index resIncr, const RhsScalar &alpha)
207  {
208  for (Index i = 0; i < rows; i++) {
209  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));
210  }
211  }
212  };
213  template<typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>
214  struct general_matrix_matrix_product<Index,stan::agrad::var,LhsStorageOrder,ConjugateLhs,stan::agrad::var,RhsStorageOrder,ConjugateRhs,ColMajor>
215  {
218  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
219  static void run(Index rows, Index cols, Index depth,
220  const LhsScalar* _lhs, Index lhsStride,
221  const RhsScalar* _rhs, Index rhsStride,
222  ResScalar* res, Index resStride,
223  const ResScalar &alpha,
224  level3_blocking<LhsScalar,RhsScalar>& /* blocking */,
225  GemmParallelInfo<Index>* /* info = 0 */)
226  {
227  for (Index i = 0; i < cols; i++) {
228  general_matrix_vector_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,ConjugateRhs>::run(
229  rows,depth,_lhs,lhsStride,
230  &_rhs[((int)RhsStorageOrder == (int)ColMajor)?(i*rhsStride):(i)],((int)RhsStorageOrder == (int)ColMajor)?(1):(rhsStride),
231  &res[i*resStride],1,alpha);
232  }
233  }
234  };
235  }
236 }
237 
238 #endif

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