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/mat.hpp> 31 template <
typename T,
typename U>
33 const char* name =
"ANON",
int depth = 0) {
37 template <
typename T,
typename U,
int R,
int C>
38 inline void assign(Eigen::Matrix<T, R, C>& x,
40 const Eigen::Matrix<U, R, C>& y,
41 const char* name =
"ANON",
43 x.resize(y.rows(), y.cols());
44 for (
size_t i = 0; i < y.size(); ++i)
49 template <
typename T,
typename U>
51 const std::vector<U>& y,
const char* name =
"ANON",
54 for (
size_t i = 0; i < y.size(); ++i)
74 template <
typename T,
typename U>
75 inline void assign(Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
78 const char* name =
"ANON",
int depth = 0) {
80 math::check_range(
"vector[uni] assign range", name, x.size(), i);
99 template <
typename T,
typename U>
100 inline void assign(Eigen::Matrix<T, 1, Eigen::Dynamic>& x,
103 const char* name =
"ANON",
int depth = 0) {
105 math::check_range(
"row_vector[uni] assign range", name, x.size(), i);
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_size_match(
"vector[multi] assign sizes",
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 math::check_size_match(
"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_size_match(
"matrix[uni] assign sizes",
205 math::check_range(
"matrix[uni] assign range", name, x.rows(), i);
206 for (
int j = 0; j < x.cols(); ++j)
228 template <
typename T,
typename I,
typename U>
229 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
230 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
232 const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
233 const char* name =
"ANON",
int depth = 0) {
235 math::check_size_match(
"matrix[multi] assign row sizes",
238 math::check_size_match(
"matrix[multi] assign col sizes",
241 for (
int i = 0; i < y.rows(); ++i) {
243 math::check_range(
"matrix[multi] assign range", name, x.rows(), m);
245 for (
int j = 0; j < x.cols(); ++j)
246 x(m - 1, j) = y(i, j);
265 template <
typename T,
typename U>
266 void assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
271 const char* name =
"ANON",
int depth = 0) {
272 int m = idxs.head_.n_;
273 int n = idxs.tail_.head_.n_;
274 math::check_range(
"matrix[uni,uni] assign range", name, x.rows(), m);
275 math::check_range(
"matrix[uni,uni] assign range", name, x.cols(), n);
298 template <
typename T,
typename I,
typename U>
299 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
300 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
303 const Eigen::Matrix<U, 1, Eigen::Dynamic>& y,
304 const char* name =
"ANON",
int depth = 0) {
306 math::check_size_match(
"matrix[uni,multi] assign sizes",
309 int m = idxs.head_.n_;
310 math::check_range(
"matrix[uni,multi] assign range", name, x.rows(), m);
311 for (
int i = 0; i < y.size(); ++i) {
313 math::check_range(
"matrix[uni,multi] assign range", name, x.cols(), n);
314 x(m - 1, n - 1) = y(i);
336 template <
typename T,
typename I,
typename U>
337 inline typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
338 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
342 const Eigen::Matrix<U, Eigen::Dynamic, 1>& y,
343 const char* name =
"ANON",
int depth = 0) {
345 math::check_size_match(
"matrix[multi,uni] assign sizes",
348 int n = idxs.tail_.head_.n_;
349 math::check_range(
"matrix[multi,uni] assign range", name, x.cols(), n);
350 for (
int i = 0; i < y.size(); ++i) {
352 math::check_range(
"matrix[multi,uni] assign range", name, x.rows(), m);
353 x(m - 1, n - 1) = y(i);
376 template <
typename T,
typename I1,
typename I2,
typename U>
378 boost::disable_if_c<boost::is_same<I1, index_uni>::value
379 || boost::is_same<I2, index_uni>::value,
void>::type
380 assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
383 const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
384 const char* name =
"ANON",
int depth = 0) {
387 math::check_size_match(
"matrix[multi,multi] assign sizes",
390 math::check_size_match(
"matrix[multi,multi] assign sizes",
393 for (
int j = 0; j < y.cols(); ++j) {
395 math::check_range(
"matrix[multi,multi] assign range", name,
397 for (
int i = 0; i < y.rows(); ++i) {
399 math::check_range(
"matrix[multi,multi] assign range", name,
401 x(m - 1, n - 1) = y(i, j);
429 template <
typename T,
typename L,
typename U>
432 const char* name =
"ANON",
int depth = 0) {
434 math::check_range(
"vector[uni,...] assign range", name, x.size(), i);
463 template <
typename T,
typename I,
typename L,
typename U>
464 typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
466 const std::vector<U>& y,
467 const char* name =
"ANON",
int depth = 0) {
469 math::check_size_match(
"vector[multi,...] assign sizes",
472 for (
size_t n = 0; n < y.size(); ++n) {
474 math::check_range(
"vector[multi,...] assign range", name, x.size(), i);
475 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.