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_equal(
"vector[multi] assign sizes", name, y.size(),
135 for (
int n = 0; n < y.size(); ++n) {
137 math::check_range(
"vector[multi] assign range", name, x.size(), i);
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",
170 for (
int n = 0; n < y.size(); ++n) {
172 math::check_range(
"row_vector[multi] assign range", name, x.size(), i);
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());
202 math::check_range(
"matrix[uni] assign range", name, x.rows(), i);
203 for (
int j = 0; j < x.cols(); ++j)
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) {
232 math::check_equal(
"matrix[multi] assign row sizes", name, y.rows(),
234 math::check_equal(
"matrix[multi] assign col sizes", name, y.cols(),
236 for (
int i = 0; i < y.rows(); ++i) {
238 math::check_range(
"matrix[multi] assign range", name, x.rows(), m);
240 for (
int j = 0; j < x.cols(); ++j)
241 x(m - 1, j) = y(i, j);
260 template <
typename T,
typename U>
261 void assign(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& x,
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);
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) {
301 math::check_equal(
"matrix[uni,multi] assign sizes", name, y.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) {
307 math::check_range(
"matrix[uni,multi] assign range", name, x.cols(), n);
308 x(m - 1, n - 1) = y(i);
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,
336 const Eigen::Matrix<U, Eigen::Dynamic, 1>& y,
337 const char* name =
"ANON",
int depth = 0) {
339 math::check_equal(
"matrix[multi,uni] assign sizes", name, y.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) {
345 math::check_range(
"matrix[multi,uni] assign range", name, x.rows(), m);
346 x(m - 1, n - 1) = y(i);
369 template <
typename T,
typename I1,
typename I2,
typename U>
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,
376 const Eigen::Matrix<U, Eigen::Dynamic, Eigen::Dynamic>& y,
377 const char* name =
"ANON",
int depth = 0) {
380 math::check_equal(
"matrix[multi,multi] assign sizes", name, y.rows(),
382 math::check_equal(
"matrix[multi,multi] assign sizes", name, y.cols(),
384 for (
int j = 0; j < y.cols(); ++j) {
386 math::check_range(
"matrix[multi,multi] assign range", name,
388 for (
int i = 0; i < y.rows(); ++i) {
390 math::check_range(
"matrix[multi,multi] assign range", name,
392 x(m - 1, n - 1) = y(i, j);
420 template <
typename T,
typename L,
typename U>
423 const char* name =
"ANON",
int depth = 0) {
425 math::check_range(
"vector[uni,...] assign range", name, x.size(), i);
454 template <
typename T,
typename I,
typename L,
typename U>
455 typename boost::disable_if<boost::is_same<I, index_uni>,
void>::type
457 const std::vector<U>& y,
458 const char* name =
"ANON",
int depth = 0) {
460 math::check_equal(
"vector[multi,...] assign sizes", name, y.size(),
462 for (
size_t n = 0; n < y.size(); ++n) {
464 math::check_range(
"vector[multi,...] assign range", name, x.size(), i);
465 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.