Stan  2.13.1
probability, sampling & optimization
lvalue.hpp
Go to the documentation of this file.
1 #ifndef STAN_MODEL_INDEXING_LVALUE_HPP
2 #define STAN_MODEL_INDEXING_LVALUE_HPP
3 
4 #include <boost/utility/enable_if.hpp>
5 #include <boost/type_traits/is_same.hpp>
6 #include <Eigen/Dense>
7 #include <stan/math/prim/mat.hpp>
12 #include <vector>
13 
14 namespace stan {
15 
16  namespace model {
17 
31  template <typename T, typename U>
32  inline void assign(T& x, const nil_index_list& /* idxs */, const U& y,
33  const char* name = "ANON", int depth = 0) {
34  x = y;
35  }
36 
37  template <typename T, typename U, int R, int C>
38  inline void assign(Eigen::Matrix<T, R, C>& x,
39  const nil_index_list& /* idxs */,
40  const Eigen::Matrix<U, R, C>& y,
41  const char* name = "ANON",
42  int depth = 0) {
43  x.resize(y.rows(), y.cols());
44  for (size_t i = 0; i < y.size(); ++i)
45  assign(x(i), nil_index_list(), y(i), name, depth + 1);
46  }
47 
48 
49  template <typename T, typename U>
50  inline void assign(std::vector<T>& x, const nil_index_list& /* idxs */,
51  const std::vector<U>& y, const char* name = "ANON",
52  int depth = 0) {
53  x.resize(y.size());
54  for (size_t i = 0; i < y.size(); ++i)
55  assign(x[i], nil_index_list(), y[i], name, depth + 1);
56  }
57 
58 
74  template <typename T, typename U>
75  inline void assign(Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
77  const U& y,
78  const char* name = "ANON", int depth = 0) {
79  int i = idxs.head_.n_;
80  math::check_range("vector[uni] assign range", name, x.size(), i);
81  x(i - 1) = y;
82  }
83 
99  template <typename T, typename U>
100  inline void assign(Eigen::Matrix<T, 1, Eigen::Dynamic>& x,
102  const U& y,
103  const char* name = "ANON", int depth = 0) {
104  int i = idxs.head_.n_;
105  math::check_range("row_vector[uni] assign range", name, x.size(), i);
106  x(i - 1) = y;
107  }
108 
127  template <typename T, typename I, typename U>
128  inline typename boost::disable_if<boost::is_same<I, index_uni>, void>::type
129  assign(Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
131  const Eigen::Matrix<U, Eigen::Dynamic, 1>& y,
132  const char* name = "ANON", int depth = 0) {
133  math::check_equal("vector[multi] assign sizes", name, y.size(),
134  rvalue_index_size(idxs.head_, x.size()));
135  for (int n = 0; n < y.size(); ++n) {
136  int i = rvalue_at(n, idxs.head_);
137  math::check_range("vector[multi] assign range", name, x.size(), i);
138  x(i - 1) = y(n);
139  }
140  }
141 
161  template <typename T, typename I, typename U>
162  inline typename boost::disable_if<boost::is_same<I, index_uni>, void>::type
163  assign(Eigen::Matrix<T, 1, Eigen::Dynamic>& x,
165  const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
166  const char* name = "ANON", int depth = 0) {
167  using stan::math::check_equal;
168  check_equal("row_vector[multi] assign sizes",
169  name, y.size(), rvalue_index_size(idxs.head_, x.size()));
170  for (int n = 0; n < y.size(); ++n) {
171  int i = rvalue_at(n, idxs.head_);
172  math::check_range("row_vector[multi] assign range", name, x.size(), i);
173  x(i - 1) = y(n);
174  }
175  }
176 
195  template <typename T, typename U>
196  void assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
198  const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
199  const char* name = "ANON", int depth = 0) {
200  math::check_equal("matrix[uni] assign sizes", name, y.cols(), x.cols());
201  int i = idxs.head_.n_;
202  math::check_range("matrix[uni] assign range", name, x.rows(), i);
203  for (int j = 0; j < x.cols(); ++j) // loop allows double to var assgn
204  x(i - 1, j) = y(j);
205  }
206 
225  template <typename T, typename I, typename U>
226  inline typename boost::disable_if<boost::is_same<I, index_uni>, void>::type
227  assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
229  const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
230  const char* name = "ANON", int depth = 0) {
231  int x_idx_rows = rvalue_index_size(idxs.head_, x.rows());
232  math::check_equal("matrix[multi] assign row sizes", name, y.rows(),
233  x_idx_rows);
234  math::check_equal("matrix[multi] assign col sizes", name, y.cols(),
235  x.cols());
236  for (int i = 0; i < y.rows(); ++i) {
237  int m = rvalue_at(i, idxs.head_);
238  math::check_range("matrix[multi] assign range", name, x.rows(), m);
239  // recurse to allow double to var assign
240  for (int j = 0; j < x.cols(); ++j)
241  x(m - 1, j) = y(i, j);
242  }
243  }
244 
260  template <typename T, typename U>
261  void assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
264  nil_index_list> >& idxs,
265  const U& y,
266  const char* name = "ANON", int depth = 0) {
267  int m = idxs.head_.n_;
268  int n = idxs.tail_.head_.n_;
269  math::check_range("matrix[uni,uni] assign range", name, x.rows(), m);
270  math::check_range("matrix[uni,uni] assign range", name, x.cols(), n);
271  x(m - 1, n - 1) = y;
272  }
273 
293  template <typename T, typename I, typename U>
294  inline typename boost::disable_if<boost::is_same<I, index_uni>, void>::type
295  assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
298  const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
299  const char* name = "ANON", int depth = 0) {
300  int x_idxs_cols = rvalue_index_size(idxs.tail_.head_, x.cols());
301  math::check_equal("matrix[uni,multi] assign sizes", name, y.cols(),
302  x_idxs_cols);
303  int m = idxs.head_.n_;
304  math::check_range("matrix[uni,multi] assign range", name, x.rows(), m);
305  for (int i = 0; i < y.size(); ++i) {
306  int n = rvalue_at(i, idxs.tail_.head_);
307  math::check_range("matrix[uni,multi] assign range", name, x.cols(), n);
308  x(m - 1, n - 1) = y(i);
309  }
310  }
311 
330  template <typename T, typename I, typename U>
331  inline typename boost::disable_if<boost::is_same<I, index_uni>, void>::type
332  assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
333  const cons_index_list<I,
335  nil_index_list> >& idxs,
336  const Eigen::Matrix<U, Eigen::Dynamic, 1>& y,
337  const char* name = "ANON", int depth = 0) {
338  int x_idxs_rows = rvalue_index_size(idxs.head_, x.rows());
339  math::check_equal("matrix[multi,uni] assign sizes", name, y.rows(),
340  x_idxs_rows);
341  int n = idxs.tail_.head_.n_;
342  math::check_range("matrix[multi,uni] assign range", name, x.cols(), n);
343  for (int i = 0; i < y.size(); ++i) {
344  int m = rvalue_at(i, idxs.head_);
345  math::check_range("matrix[multi,uni] assign range", name, x.rows(), m);
346  x(m - 1, n - 1) = y(i);
347  }
348  }
349 
369  template <typename T, typename I1, typename I2, typename U>
370  inline typename
371  boost::disable_if_c<boost::is_same<I1, index_uni>::value
372  || boost::is_same<I2, index_uni>::value, void>::type
373  assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
374  const cons_index_list<I1,
376  const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
377  const char* name = "ANON", int depth = 0) {
378  int x_idxs_rows = rvalue_index_size(idxs.head_, x.rows());
379  int x_idxs_cols = rvalue_index_size(idxs.tail_.head_, x.cols());
380  math::check_equal("matrix[multi,multi] assign sizes", name, y.rows(),
381  x_idxs_rows);
382  math::check_equal("matrix[multi,multi] assign sizes", name, y.cols(),
383  x_idxs_cols);
384  for (int j = 0; j < y.cols(); ++j) {
385  int n = rvalue_at(j, idxs.tail_.head_);
386  math::check_range("matrix[multi,multi] assign range", name,
387  x.cols(), n);
388  for (int i = 0; i < y.rows(); ++i) {
389  int m = rvalue_at(i, idxs.head_);
390  math::check_range("matrix[multi,multi] assign range", name,
391  x.rows(), m);
392  x(m - 1, n - 1) = y(i, j);
393  }
394  }
395  }
396 
420  template <typename T, typename L, typename U>
421  inline void assign(std::vector<T>& x,
422  const cons_index_list<index_uni, L>& idxs, const U& y,
423  const char* name = "ANON", int depth = 0) {
424  int i = idxs.head_.n_;
425  math::check_range("vector[uni,...] assign range", name, x.size(), i);
426  assign(x[i - 1], idxs.tail_, y, name, depth + 1);
427  }
428 
454  template <typename T, typename I, typename L, typename U>
455  typename boost::disable_if<boost::is_same<I, index_uni>, void>::type
456  inline assign(std::vector<T>& x, const cons_index_list<I, L>& idxs,
457  const std::vector<U>& y,
458  const char* name = "ANON", int depth = 0) {
459  int x_idx_size = rvalue_index_size(idxs.head_, x.size());
460  math::check_equal("vector[multi,...] assign sizes", name, y.size(),
461  x_idx_size);
462  for (size_t n = 0; n < y.size(); ++n) {
463  int i = rvalue_at(n, idxs.head_);
464  math::check_range("vector[multi,...] assign range", name, x.size(), i);
465  assign(x[i - 1], idxs.tail_, y[n], name, depth + 1);
466  }
467  }
468 
469  }
470 }
471 #endif
int rvalue_index_size(const index_multi &idx, int size)
Return size of specified multi-index.
Probability, optimization and sampling library.
int rvalue_at(int n, const index_multi &idx)
Return the index in the underlying array corresponding to the specified position in the specified mul...
Definition: rvalue_at.hpp:21
void assign(T &x, const nil_index_list &, const U &y, const char *name="ANON", int depth=0)
Assign the specified scalar reference under the specified indexing to the specified scalar value...
Definition: lvalue.hpp:32
Template structure for an index list consisting of a head and tail index.
Definition: index_list.hpp:23
Structure for an indexing consisting of a single index.
Definition: index.hpp:17
Structure for an empty (size zero) index list.
Definition: index_list.hpp:11

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