1 #ifndef STAN_MODEL_INDEXING_RVALUE_HPP 2 #define STAN_MODEL_INDEXING_RVALUE_HPP 4 #include <boost/utility/enable_if.hpp> 5 #include <boost/type_traits/is_same.hpp> 6 #include <stan/math/prim/mat.hpp> 32 const char* =
"",
int = 0) {
50 inline T
rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& v,
52 const char* name =
"ANON",
int depth = 0) {
54 math::check_range(
"vector[single] indexing", name, v.size(), ones_idx);
55 return v(ones_idx - 1);
73 inline T
rvalue(
const Eigen::Matrix<T, 1, Eigen::Dynamic>& rv,
75 const char* name =
"ANON",
int depth = 0) {
77 math::check_range(
"row_vector[single] indexing", name,
96 template <
typename T,
typename I>
98 typename boost::disable_if<boost::is_same<I, index_uni>,
99 Eigen::Matrix<T, Eigen::Dynamic, 1> >::type
100 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& v,
102 const char* name =
"ANON",
int depth = 0) {
104 Eigen::Matrix<T, Eigen::Dynamic, 1> a(size);
105 for (
int i = 0; i < size; ++i) {
107 math::check_range(
"vector[multi] indexing", name, v.size(), n);
128 template <
typename T,
typename I>
130 typename boost::disable_if<boost::is_same<I, index_uni>,
131 Eigen::Matrix<T, 1, Eigen::Dynamic> >::type
132 rvalue(
const Eigen::Matrix<T, 1, Eigen::Dynamic>& rv,
134 const char* name =
"ANON",
int depth = 0) {
136 Eigen::Matrix<T, 1, Eigen::Dynamic> a(size);
137 for (
int i = 0; i < size; ++i) {
139 math::check_range(
"row_vector[multi] indexing", name, rv.size(), n);
158 template <
typename T>
159 inline Eigen::Matrix<T, 1, Eigen::Dynamic>
160 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a,
162 const char* name =
"ANON",
int depth = 0) {
164 math::check_range(
"matrix[uni] indexing", name, a.rows(), n);
182 template <
typename T,
typename I>
183 inline typename boost::disable_if<boost::is_same<I, index_uni>,
184 Eigen::Matrix<T, Eigen::Dynamic,
185 Eigen::Dynamic> >::type
186 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a,
188 const char* name =
"ANON",
int depth = 0) {
190 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> b(n_rows, a.cols());
191 for (
int i = 0; i < n_rows; ++i) {
193 math::check_range(
"matrix[multi] indexing", name, a.rows(), n);
194 b.row(i) = a.row(n - 1);
212 template <
typename T>
214 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a,
218 const char* name =
"ANON",
int depth = 0) {
219 int m = idx.head_.n_;
220 int n = idx.tail_.head_.n_;
221 math::check_range(
"matrix[uni,uni] indexing, row", name, a.rows(), m);
222 math::check_range(
"matrix[uni,uni] indexing, col", name, a.cols(), n);
223 return a(m - 1, n - 1);
241 template <
typename T,
typename I>
242 inline typename boost::disable_if<boost::is_same<I, index_uni>,
244 1, Eigen::Dynamic> >::type
245 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a,
248 const char* name =
"ANON",
int depth = 0) {
249 int m = idx.head_.n_;
250 math::check_range(
"matrix[uni,multi] indexing, row", name, a.rows(), m);
251 Eigen::Matrix<T, 1, Eigen::Dynamic> r = a.row(m - 1);
252 return rvalue(r, idx.tail_);
270 template <
typename T,
typename I>
272 typename boost::disable_if<boost::is_same<I, index_uni>,
273 Eigen::Matrix<T, Eigen::Dynamic, 1> >::type
274 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a,
277 const char* name =
"ANON",
int depth = 0) {
279 Eigen::Matrix<T, Eigen::Dynamic, 1> c(rows);
280 for (
int i = 0; i < rows; ++i) {
282 int n = idx.tail_.head_.n_;
283 math::check_range(
"matrix[multi,uni] index row", name, a.rows(), m);
284 math::check_range(
"matrix[multi,uni] index col", name, a.cols(), n);
285 c(i) = a(m - 1, n - 1);
305 template <
typename T,
typename I1,
typename I2>
307 typename boost::disable_if_c<boost::is_same<I1, index_uni>::value
308 || boost::is_same<I2, index_uni>::value,
309 Eigen::Matrix<T, Eigen::Dynamic,
310 Eigen::Dynamic> >::type
311 rvalue(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& a,
314 const char* name =
"ANON",
int depth = 0) {
317 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> c(rows, cols);
318 for (
int j = 0; j < cols; ++j) {
319 for (
int i = 0; i < rows; ++i) {
322 math::check_range(
"matrix[multi,multi] row index", name,
324 math::check_range(
"matrix[multi,multi] col index", name,
326 c(i, j) = a(m - 1, n - 1);
348 template <
typename T,
typename L>
352 const char* name =
"ANON",
int depth = 0) {
354 math::check_range(
"array[uni,...] index", name, c.size(), n);
355 return rvalue(c[n - 1], idx.
tail_, name, depth + 1);
374 template <
typename T,
typename I,
typename L>
377 const char* name =
"ANON",
int depth = 0) {
382 math::check_range(
"array[multi,...] index", name, c.size(), n);
383 result.push_back(
rvalue(c[n - 1], idx.
tail_, name, depth + 1));
Primary template class for metaprogram to calculate return value for model::rvalue() for the containe...
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...
T rvalue(const T &c, const nil_index_list &, const char *="", int=0)
Return the result of indexing a specified value with a nil index list, which just returns the 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.