1 #ifndef STAN_MODEL_INDEXING_LVALUE_HPP
2 #define STAN_MODEL_INDEXING_LVALUE_HPP
4 #include <boost/utility/enable_if.hpp>
5 #include <boost/type_traits/is_same.hpp>
7 #include <stan/math/prim/scal/err/check_equal.hpp>
8 #include <stan/math/prim/mat/err/check_range.hpp>
32 template <
typename T,
typename U>
34 const char* name =
"ANON",
int depth = 0) {
38 template <
typename T,
typename U,
int R,
int C>
39 inline void assign(Eigen::Matrix<T, R, C>& x,
41 const Eigen::Matrix<U, R, C>& y,
42 const char* name =
"ANON",
44 x.resize(y.rows(), y.cols());
45 for (
size_t i = 0; i < y.size(); ++i)
50 template <
typename T,
typename U>
52 const std::vector<U>& y,
const char* name =
"ANON",
55 for (
size_t i = 0; i < y.size(); ++i)
75 template <
typename T,
typename U>
76 inline void assign(Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
79 const char* name =
"ANON",
int depth = 0) {
81 math::check_range(
"vector[uni] assign range", name, x.size(), i);
100 template <
typename T,
typename U>
101 inline void assign(Eigen::Matrix<T, 1, Eigen::Dynamic>& x,
104 const char* name =
"ANON",
int depth = 0) {
106 math::check_range(
"row_vector[uni] assign range", name, x.size(), i);
128 template <
typename T,
typename I,
typename U>
129 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
130 assign(Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
132 const Eigen::Matrix<U, Eigen::Dynamic, 1>& y,
133 const char* name =
"ANON",
int depth = 0) {
134 math::check_equal(
"vector[multi] assign sizes", name, y.size(),
136 for (
int n = 0; n < y.size(); ++n) {
138 math::check_range(
"vector[multi] assign range", name, x.size(), i);
162 template <
typename T,
typename I,
typename U>
163 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
164 assign(Eigen::Matrix<T, 1, Eigen::Dynamic>& x,
166 const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
167 const char* name =
"ANON",
int depth = 0) {
168 using stan::math::check_equal;
169 check_equal(
"row_vector[multi] assign sizes",
171 for (
int n = 0; n < y.size(); ++n) {
173 math::check_range(
"row_vector[multi] assign range", name, x.size(), i);
196 template <
typename T,
typename U>
197 void assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
199 const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
200 const char* name =
"ANON",
int depth = 0) {
201 math::check_equal(
"matrix[uni] assign sizes", name, y.cols(), x.cols());
203 math::check_range(
"matrix[uni] assign range", name, x.rows(), i);
204 for (
int j = 0; j < x.cols(); ++j)
226 template <
typename T,
typename I,
typename U>
227 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
228 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
230 const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
231 const char* name =
"ANON",
int depth = 0) {
233 math::check_equal(
"matrix[multi] assign row sizes", name, y.rows(),
235 math::check_equal(
"matrix[multi] assign col sizes", name, y.cols(),
237 for (
int i = 0; i < y.rows(); ++i) {
239 math::check_range(
"matrix[multi] assign range", name, x.rows(), m);
241 for (
int j = 0; j < x.cols(); ++j)
242 x(m - 1, j) = y(i, j);
261 template <
typename T,
typename U>
262 void assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
267 const char* name =
"ANON",
int depth = 0) {
268 int m = idxs.head_.n_;
269 int n = idxs.tail_.head_.n_;
270 math::check_range(
"matrix[uni,uni] assign range", name, x.rows(), m);
271 math::check_range(
"matrix[uni,uni] assign range", name, x.cols(), n);
294 template <
typename T,
typename I,
typename U>
295 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
296 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
299 const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
300 const char* name =
"ANON",
int depth = 0) {
302 math::check_equal(
"matrix[uni,multi] assign sizes", name, y.cols(),
304 int m = idxs.head_.n_;
305 math::check_range(
"matrix[uni,multi] assign range", name, x.rows(), m);
306 for (
int i = 0; i < y.size(); ++i) {
308 math::check_range(
"matrix[uni,multi] assign range", name, x.cols(), n);
309 x(m - 1, n - 1) = y(i);
331 template <
typename T,
typename I,
typename U>
332 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
333 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
337 const Eigen::Matrix<U, Eigen::Dynamic, 1>& y,
338 const char* name =
"ANON",
int depth = 0) {
340 math::check_equal(
"matrix[multi,uni] assign sizes", name, y.rows(),
342 int n = idxs.tail_.head_.n_;
343 math::check_range(
"matrix[multi,uni] assign range", name, x.cols(), n);
344 for (
int i = 0; i < y.size(); ++i) {
346 math::check_range(
"matrix[multi,uni] assign range", name, x.rows(), m);
347 x(m - 1, n - 1) = y(i);
370 template <
typename T,
typename I1,
typename I2,
typename U>
372 boost::disable_if_c<boost::is_same<I1, index_uni>::value
373 || boost::is_same<I2, index_uni>::value,
void>::type
374 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
377 const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
378 const char* name =
"ANON",
int depth = 0) {
381 math::check_equal(
"matrix[multi,multi] assign sizes", name, y.rows(),
383 math::check_equal(
"matrix[multi,multi] assign sizes", name, y.cols(),
385 for (
int j = 0; j < y.cols(); ++j) {
387 math::check_range(
"matrix[multi,multi] assign range", name,
389 for (
int i = 0; i < y.rows(); ++i) {
391 math::check_range(
"matrix[multi,multi] assign range", name,
393 x(m - 1, n - 1) = y(i, j);
421 template <
typename T,
typename L,
typename U>
424 const char* name =
"ANON",
int depth = 0) {
426 math::check_range(
"vector[uni,...] assign range", name, x.size(), i);
455 template <
typename T,
typename I,
typename L,
typename U>
456 typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
458 const std::vector<U>& y,
459 const char* name =
"ANON",
int depth = 0) {
461 math::check_equal(
"vector[multi,...] assign sizes", name, y.size(),
463 for (
size_t n = 0; n < y.size(); ++n) {
465 math::check_range(
"vector[multi,...] assign range", name, x.size(), i);
466 assign(x[i - 1], idxs.
tail_, y[n], name, depth + 1);
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...
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...
Template structure for an index list consisting of a head and tail index.
Structure for an indexing consisting of a single index.
Structure for an empty (size zero) index list.