Stan Math Library  2.20.0
reverse mode automatic differentiation
seq_view.hpp
Go to the documentation of this file.
1 #ifndef STAN_MATH_PRIM_MAT_META_SEQ_VIEW_HPP
2 #define STAN_MATH_PRIM_MAT_META_SEQ_VIEW_HPP
3 
5 #include <vector>
6 
7 namespace stan {
8 namespace math {
9 
10 template <typename T>
11 struct store_type {
12  typedef const T& type;
13 };
14 template <>
15 struct store_type<double> {
16  typedef const double type;
17 };
18 template <>
19 struct store_type<int> {
20  typedef const int type;
21 };
22 
23 template <typename T>
24 struct pass_type {
25  typedef const T& type;
26 };
27 template <>
28 struct pass_type<double> {
29  typedef double type;
30 };
31 template <>
32 struct pass_type<int> {
33  typedef int type;
34 };
35 
36 // S assignable to T
37 template <typename T, typename S>
38 class seq_view {
39  private:
40  typename store_type<S>::type x_;
41 
42  public:
43  explicit seq_view(typename pass_type<S>::type x) : x_(x) {}
44  inline typename pass_type<T>::type operator[](int n) const { return x_; }
45  int size() const { return 1; }
46 };
47 
48 template <typename T, typename S>
49 class seq_view<T, Eigen::Matrix<S, Eigen::Dynamic, 1> > {
50  private:
52 
53  public:
54  explicit seq_view(
55  typename pass_type<Eigen::Matrix<S, Eigen::Dynamic, 1> >::type x)
56  : x_(x) {}
57  inline typename pass_type<T>::type operator[](int n) const { return x_(n); }
58  int size() const { return x_.size(); }
59 };
60 
61 template <typename T, typename S>
62 class seq_view<T, Eigen::Matrix<S, 1, Eigen::Dynamic> > {
63  private:
65 
66  public:
67  explicit seq_view(
68  typename pass_type<Eigen::Matrix<S, 1, Eigen::Dynamic> >::type x)
69  : x_(x) {}
70  inline typename pass_type<T>::type operator[](int n) const { return x_(n); }
71  int size() const { return x_.size(); }
72 };
73 
74 // row-major order of returns to match std::vector
75 template <typename T, typename S>
76 class seq_view<T, Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> > {
77  private:
79  x_;
80 
81  public:
82  explicit seq_view(typename pass_type<
83  Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> >::type x)
84  : x_(x) {}
85  inline typename pass_type<T>::type operator[](int n) const {
86  return x_(n / x_.cols(), n % x_.cols());
87  }
88  int size() const { return x_.size(); }
89 };
90 
91 // question is how expensive the ctor is
92 template <typename T, typename S>
93 class seq_view<T, std::vector<S> > {
94  private:
95  typename store_type<std::vector<S> >::type x_;
96  const size_t elt_size_;
97 
98  public:
99  explicit seq_view(typename pass_type<std::vector<S> >::type x)
100  : x_(x), elt_size_(x_.size() == 0 ? 0 : seq_view<T, S>(x_[0]).size()) {}
101  inline typename pass_type<T>::type operator[](int n) const {
102  return seq_view<T, S>(x_[n / elt_size_])[n % elt_size_];
103  }
104  int size() const { return x_.size() * elt_size_; }
105 };
106 
107 // BELOW HERE JUST FOR EFFICIENCY
108 
109 template <typename T>
110 class seq_view<T, std::vector<T> > {
111  private:
112  typename store_type<std::vector<T> >::type x_;
113 
114  public:
115  explicit seq_view(typename pass_type<std::vector<T> >::type x) : x_(x) {}
116  inline typename pass_type<T>::type operator[](int n) const { return x_[n]; }
117  int size() const { return x_.size(); }
118 };
119 
120 // if vector of S with S assignable to T, also works
121 // use enable_if? (and disable_if for the general case)
122 template <typename T>
123 class seq_view<T, std::vector<std::vector<T> > > {
124  private:
126  const size_t cols_;
127 
128  public:
129  explicit seq_view(typename pass_type<std::vector<std::vector<T> > >::type x)
130  : x_(x), cols_(x_.size() == 0 ? 0 : x_[0].size()) {}
131  inline typename pass_type<T>::type operator[](int n) const {
132  return x_[n / cols_][n % cols_];
133  }
134  int size() const { return x_.size() * cols_; }
135 };
136 
137 template <>
138 class seq_view<double, std::vector<int> > {
139  private:
141 
142  public:
143  explicit seq_view(pass_type<std::vector<int> >::type x) : x_(x) {}
144  inline pass_type<double>::type operator[](int n) const { return x_[n]; }
145  int size() const { return x_.size(); }
146 };
147 
148 } // namespace math
149 } // namespace stan
150 #endif
int size() const
Definition: seq_view.hpp:45
pass_type< T >::type operator[](int n) const
Definition: seq_view.hpp:44
pass_type< double >::type operator[](int n) const
Definition: seq_view.hpp:144
seq_view(typename pass_type< Eigen::Matrix< S, 1, Eigen::Dynamic > >::type x)
Definition: seq_view.hpp:67
seq_view(typename pass_type< S >::type x)
Definition: seq_view.hpp:43
(Expert) Numerical traits for algorithmic differentiation variables.
seq_view(typename pass_type< Eigen::Matrix< S, Eigen::Dynamic, 1 > >::type x)
Definition: seq_view.hpp:54
seq_view(typename pass_type< std::vector< S > >::type x)
Definition: seq_view.hpp:99
seq_view(pass_type< std::vector< int > >::type x)
Definition: seq_view.hpp:143
seq_view(typename pass_type< std::vector< std::vector< T > > >::type x)
Definition: seq_view.hpp:129
pass_type< T >::type operator[](int n) const
Definition: seq_view.hpp:116
int size(const std::vector< T > &x)
Return the size of the specified standard vector.
Definition: size.hpp:17
seq_view(typename pass_type< Eigen::Matrix< S, Eigen::Dynamic, Eigen::Dynamic > >::type x)
Definition: seq_view.hpp:82
pass_type< T >::type operator[](int n) const
Definition: seq_view.hpp:101
seq_view(typename pass_type< std::vector< T > >::type x)
Definition: seq_view.hpp:115

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