Stan  1.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
reader.hpp
Go to the documentation of this file.
1 #ifndef __STAN__IO__READER_HPP__
2 #define __STAN__IO__READER_HPP__
3 
4 #include <cstddef>
5 #include <exception>
6 #include <stdexcept>
7 #include <vector>
8 
9 #include <boost/throw_exception.hpp>
10 
12 #include <stan/math/matrix.hpp>
15 
16 #include <stan/prob/transform.hpp>
17 
18 namespace stan {
19 
20  namespace io {
21 
22 
44  template <typename T>
45  class reader {
46 
47  private:
48 
49  std::vector<T>& data_r_;
50  std::vector<int>& data_i_;
51  size_t pos_;
52  size_t int_pos_;
53 
54  inline T& scalar_ptr() {
55  return data_r_.at(pos_);
56  }
57 
58  inline T& scalar_ptr_increment(size_t m) {
59  pos_ += m;
60  return data_r_.at(pos_ - m);
61  }
62 
63  inline int& int_ptr() {
64  return data_i_.at(int_pos_);
65  }
66 
67  inline int& int_ptr_increment(size_t m) {
68  int_pos_ += m;
69  return data_i_.at(int_pos_ - m);
70  }
71 
72  public:
73 
77 
78  typedef Eigen::Map<matrix_t> map_matrix_t;
79  typedef Eigen::Map<vector_t> map_vector_t;
80  typedef Eigen::Map<row_vector_t> map_row_vector_t;
81 
82 
94  reader(std::vector<T>& data_r,
95  std::vector<int>& data_i)
96  : data_r_(data_r),
97  data_i_(data_i),
98  pos_(0),
99  int_pos_(0) {
100  }
101 
105  ~reader() { }
106 
112  inline size_t available() {
113  return data_r_.size() - pos_;
114  }
115 
121  inline size_t available_i() {
122  return data_i_.size() - int_pos_;
123  }
124 
130  inline int integer() {
131  if (int_pos_ >= data_i_.size())
132  BOOST_THROW_EXCEPTION(
133  std::runtime_error("no more integers to read."));
134  return data_i_[int_pos_++];
135  }
136 
144  inline int integer_constrain() {
145  return integer();
146  }
147 
155  inline int integer_constrain(T& log_prob) {
156  return integer();
157  }
158 
159 
160 
166  inline T scalar() {
167  if (pos_ >= data_r_.size())
168  BOOST_THROW_EXCEPTION(std::runtime_error("no more scalars to read"));
169  return data_r_[pos_++];
170  }
171 
178  inline T scalar_constrain() {
179  return scalar();
180  }
181 
193  T scalar_constrain(T& log_prob) {
194  return scalar();
195  }
196 
197 
205  inline std::vector<T> std_vector(size_t m) {
206  std::vector<T> vec;
207  T& start = scalar_ptr_increment(m);
208  vec.insert(vec.begin(), &start, &scalar_ptr());
209  return vec;
210  }
211 
219  inline vector_t vector(size_t m) {
220  return map_vector_t(&scalar_ptr_increment(m),m);
221  }
229  inline vector_t vector_constrain(size_t m) {
230  return map_vector_t(&scalar_ptr_increment(m),m);
231  }
240  inline vector_t vector_constrain(size_t m, T& lp) {
241  return map_vector_t(&scalar_ptr_increment(m),m);
242  }
243 
244 
245 
253  inline row_vector_t row_vector(size_t m) {
254  return map_row_vector_t(&scalar_ptr_increment(m),m);
255  }
256 
265  return map_row_vector_t(&scalar_ptr_increment(m),m);
266  }
267 
277  inline row_vector_t row_vector_constrain(size_t m, T& lp) {
278  return map_row_vector_t(&scalar_ptr_increment(m),m);
279  }
280 
298  inline matrix_t matrix(size_t m, size_t n) {
299  return map_matrix_t(&scalar_ptr_increment(m*n),m,n);
300  }
301 
312  inline matrix_t matrix_constrain(size_t m, size_t n) {
313  return map_matrix_t(&scalar_ptr_increment(m*n),m,n);
314  }
315 
328  inline matrix_t matrix_constrain(size_t m, size_t n, T& lp) {
329  return map_matrix_t(&scalar_ptr_increment(m*n),m,n);
330  }
331 
332 
342  inline int integer_lb(int lb) {
343  int i = integer();
344  if (!(i >= lb))
345  BOOST_THROW_EXCEPTION(
346  std::runtime_error("required value greater than or equal to lb"));
347  return i;
348  }
358  inline int integer_lb_constrain(int lb) {
359  return integer_lb(lb);
360  }
371  inline int integer_lb_constrain(int lb, T& lp) {
372  return integer_lb(lb);
373  }
374 
375 
385  inline int integer_ub(int ub) {
386  int i = integer();
387  if (!(i <= ub))
388  BOOST_THROW_EXCEPTION(
389  std::runtime_error("required value less than or equal to ub"));
390  return i;
391  }
401  inline int integer_ub_constrain(int ub) {
402  return integer_ub(ub);
403  }
414  int integer_ub_constrain(int ub, T& lp) {
415  return integer_ub(ub);
416  }
417 
430  inline int integer_lub(int lb, int ub) {
431  // read first to make position deterministic [arbitrary choice]
432  int i = integer();
433  if (lb > ub)
434  BOOST_THROW_EXCEPTION(
435  std::runtime_error("lower bound must be less than or equal to ub"));
436  if (!(i >= lb))
437  BOOST_THROW_EXCEPTION(
438  std::runtime_error("required value greater than or equal to lb"));
439  if (!(i <= ub))
440  BOOST_THROW_EXCEPTION(
441  std::runtime_error("required value less than or equal to ub"));
442  return i;
443  }
454  inline int integer_lub_constrain(int lb, int ub) {
455  return integer_lub(lb,ub);
456  }
468  inline int integer_lub_constrain(int lb, int ub, T& lp) {
469  return integer_lub(lb,ub);
470  }
471 
472 
473 
483  inline T scalar_pos() {
484  T x(scalar());
485  stan::math::check_positive("stan::io::scalar_pos(%1%)", x,
486  "Constrained scalar");
487  return x;
488  }
489 
497  inline T scalar_pos_constrain() {
499  }
500 
511  inline T scalar_pos_constrain(T& lp) {
513  }
514 
527  template <typename TL>
528  inline T scalar_lb(const TL lb) {
529  T x(scalar());
530  stan::math::check_greater_or_equal("stan::io::scalar_lb(%1%)",
531  x, lb, "Constrained scalar");
532  return x;
533  }
534 
546  template <typename TL>
547  inline T scalar_lb_constrain(const TL lb) {
548  return stan::prob::lb_constrain(scalar(),lb);
549  }
550 
562  template <typename TL>
563  inline T scalar_lb_constrain(const TL lb, T& lp) {
564  return stan::prob::lb_constrain(scalar(),lb,lp);
565  }
566 
567 
568 
581  template <typename TU>
582  inline T scalar_ub(TU ub) {
583  T x(scalar());
584  stan::math::check_less_or_equal("stan::io::scalar_ub(%1%)", x, ub, "Constrained scalar");
585  return x;
586  }
587 
599  template <typename TU>
600  inline T scalar_ub_constrain(const TU ub) {
601  return stan::prob::ub_constrain(scalar(),ub);
602  }
603 
615  template <typename TU>
616  inline T scalar_ub_constrain(const TU ub, T& lp) {
617  return stan::prob::ub_constrain(scalar(),ub,lp);
618  }
619 
634  template <typename TL, typename TU>
635  inline T scalar_lub(const TL lb, const TU ub) {
636  T x(scalar());
637  stan::math::check_bounded("stan::io::scalar_lub(%1%)", x, lb, ub, "Constrained scalar");
638  return x;
639  }
640 
654  template <typename TL, typename TU>
655  inline T scalar_lub_constrain(const TL lb, const TU ub) {
656  return stan::prob::lub_constrain(scalar(),lb,ub);
657  }
658 
672  template <typename TL, typename TU>
673  inline T scalar_lub_constrain(TL lb, TU ub, T& lp) {
674  return stan::prob::lub_constrain(scalar(),lb,ub,lp);
675  }
676 
685  inline T prob() {
686  T x(scalar());
687  stan::math::check_bounded("stan::io::prob(%1%)", x, 0, 1, "Constrained probability");
688  return x;
689  }
690 
699  inline T prob_constrain() {
701  }
702 
713  inline T prob_constrain(T& lp) {
714  return stan::prob::prob_constrain(scalar(),lp);
715  }
716 
717 
718 
719 
731  inline T corr() {
732  T x(scalar());
733  stan::math::check_bounded("stan::io::corr(%1%)", x, -1, 1, "Correlation value");
734  return x;
735  }
736 
745  inline T corr_constrain() {
747  }
748 
760  inline T corr_constrain(T& lp) {
761  return stan::prob::corr_constrain(scalar(),lp);
762  }
763 
774  inline vector_t simplex(size_t k) {
775  vector_t theta(vector(k));
776  stan::math::check_simplex("stan::io::simplex(%1%)", theta, "Constrained vector");
777  return theta;
778  }
779 
790  inline
791  Eigen::Matrix<T,Eigen::Dynamic,1> simplex_constrain(size_t k) {
793  }
794 
807  inline vector_t simplex_constrain(size_t k, T& lp) {
808  return stan::prob::simplex_constrain(vector(k-1),lp);
809  }
810 
821  inline vector_t ordered(size_t k) {
822  vector_t x(vector(k));
823  stan::math::check_ordered("stan::io::ordered(%1%)", x, "Constrained vector");
824  return x;
825  }
826 
836  inline vector_t ordered_constrain(size_t k) {
838  }
839 
851  inline vector_t ordered_constrain(size_t k, T& lp) {
853  }
854 
865  inline vector_t positive_ordered(size_t k) {
866  vector_t x(vector(k));
867  stan::math::check_positive_ordered("stan::io::positive_ordered(%1%)", x, "Constrained vector");
868  return x;
869  }
870 
882  }
883 
895  inline vector_t positive_ordered_constrain(size_t k, T& lp) {
897  }
898 
908  inline matrix_t corr_matrix(size_t k) {
909  matrix_t x(matrix(k,k));
910  stan::math::check_corr_matrix("stan::math::corr_matrix(%1%)", x, "Constrained matrix");
911  return x;
912  }
913 
922  inline matrix_t corr_matrix_constrain(size_t k) {
923  return stan::prob::corr_matrix_constrain(vector((k * (k - 1)) / 2),k);
924  }
925 
937  inline matrix_t corr_matrix_constrain(size_t k, T& lp) {
938  return stan::prob::corr_matrix_constrain(vector((k * (k - 1)) / 2),
939  k,lp);
940  }
941 
942 
954  inline matrix_t cov_matrix(size_t k) {
955  matrix_t y(matrix(k,k));
956  stan::math::check_cov_matrix("stan::io::cov_matrix(%1%)", y, "Constrained matrix");
957  return y;
958  }
959 
968  inline matrix_t cov_matrix_constrain(size_t k) {
969  return stan::prob::cov_matrix_constrain(vector(k + (k * (k - 1)) / 2),
970  k);
971  }
972 
984  inline matrix_t cov_matrix_constrain(size_t k, T& lp) {
985  return stan::prob::cov_matrix_constrain(vector(k + (k * (k - 1)) / 2),
986  k,lp);
987  }
988 
989 
990  template <typename TL>
991  inline vector_t vector_lb(const TL lb, size_t m) {
992  vector_t v(m);
993  for (int i = 0; i < m; ++i)
994  v(i) = scalar_lb(lb);
995  return v;
996  }
997  template <typename TL>
998  inline vector_t vector_lb_constrain(const TL lb, size_t m) {
999  vector_t v(m);
1000  for (int i = 0; i < m; ++i)
1001  v(i) = scalar_lb_constrain(lb);
1002  return v;
1003  }
1004  template <typename TL>
1005  inline vector_t vector_lb_constrain(const TL lb, size_t m, T& lp) {
1006  vector_t v(m);
1007  for (int i = 0; i < m; ++i)
1008  v(i) = scalar_lb_constrain(lb,lp);
1009  return v;
1010  }
1011 
1012  template <typename TL>
1013  inline row_vector_t row_vector_lb(const TL lb, size_t m) {
1014  row_vector_t v(m);
1015  for (int i = 0; i < m; ++i)
1016  v(i) = scalar_lb(lb);
1017  return v;
1018  }
1019  template <typename TL>
1020  inline row_vector_t row_vector_lb_constrain(const TL lb, size_t m) {
1021  row_vector_t v(m);
1022  for (int i = 0; i < m; ++i)
1023  v(i) = scalar_lb_constrain(lb);
1024  return v;
1025  }
1026  template <typename TL>
1027  inline row_vector_t row_vector_lb_constrain(const TL lb, size_t m, T& lp) {
1028  row_vector_t v(m);
1029  for (int i = 0; i < m; ++i)
1030  v(i) = scalar_lb_constrain(lb,lp);
1031  return v;
1032  }
1033 
1034  template <typename TL>
1035  inline matrix_t matrix_lb(const TL lb, size_t m, size_t n) {
1036  matrix_t v(m,n);
1037  for (int i = 0; i < m; ++i)
1038  for (int j = 0; j < n; ++j)
1039  v(i,j) = scalar_lb(lb);
1040  return v;
1041  }
1042  template <typename TL>
1043  inline matrix_t matrix_lb_constrain(const TL lb, size_t m, size_t n) {
1044  matrix_t v(m,n);
1045  for (int i = 0; i < m; ++i)
1046  for (int j = 0; j < n; ++j)
1047  v(i,j) = scalar_lb_constrain(lb);
1048  return v;
1049  }
1050  template <typename TL>
1051  inline matrix_t matrix_lb_constrain(const TL lb, size_t m, size_t n, T& lp) {
1052  matrix_t v(m,n);
1053  for (int i = 0; i < m; ++i)
1054  for (int j = 0; j < n; ++j)
1055  v(i,j) = scalar_lb_constrain(lb,lp);
1056  return v;
1057  }
1058 
1059 
1060 
1061  template <typename TU>
1062  inline vector_t vector_ub(const TU ub, size_t m) {
1063  vector_t v(m);
1064  for (int i = 0; i < m; ++i)
1065  v(i) = scalar_ub(ub);
1066  return v;
1067  }
1068  template <typename TU>
1069  inline vector_t vector_ub_constrain(const TU ub, size_t m) {
1070  vector_t v(m);
1071  for (int i = 0; i < m; ++i)
1072  v(i) = scalar_ub_constrain(ub);
1073  return v;
1074  }
1075  template <typename TU>
1076  inline vector_t vector_ub_constrain(const TU ub, size_t m, T& lp) {
1077  vector_t v(m);
1078  for (int i = 0; i < m; ++i)
1079  v(i) = scalar_ub_constrain(ub,lp);
1080  return v;
1081  }
1082 
1083  template <typename TU>
1084  inline row_vector_t row_vector_ub(const TU ub, size_t m) {
1085  row_vector_t v(m);
1086  for (int i = 0; i < m; ++i)
1087  v(i) = scalar_ub(ub);
1088  return v;
1089  }
1090  template <typename TU>
1091  inline row_vector_t row_vector_ub_constrain(const TU ub, size_t m) {
1092  row_vector_t v(m);
1093  for (int i = 0; i < m; ++i)
1094  v(i) = scalar_ub_constrain(ub);
1095  return v;
1096  }
1097  template <typename TU>
1098  inline row_vector_t row_vector_ub_constrain(const TU ub, size_t m, T& lp) {
1099  row_vector_t v(m);
1100  for (int i = 0; i < m; ++i)
1101  v(i) = scalar_ub_constrain(ub,lp);
1102  return v;
1103  }
1104 
1105  template <typename TU>
1106  inline matrix_t matrix_ub(const TU ub, size_t m, size_t n) {
1107  matrix_t v(m,n);
1108  for (int i = 0; i < m; ++i)
1109  for (int j = 0; j < n; ++j)
1110  v(i,j) = scalar_ub(ub);
1111  return v;
1112  }
1113  template <typename TU>
1114  inline matrix_t matrix_ub_constrain(const TU ub, size_t m, size_t n) {
1115  matrix_t v(m,n);
1116  for (int i = 0; i < m; ++i)
1117  for (int j = 0; j < n; ++j)
1118  v(i,j) = scalar_ub_constrain(ub);
1119  return v;
1120  }
1121  template <typename TU>
1122  inline matrix_t matrix_ub_constrain(const TU ub, size_t m, size_t n, T& lp) {
1123  matrix_t v(m,n);
1124  for (int i = 0; i < m; ++i)
1125  for (int j = 0; j < n; ++j)
1126  v(i,j) = scalar_ub_constrain(ub,lp);
1127  return v;
1128  }
1129 
1130 
1131  template <typename TL, typename TU>
1132  inline vector_t vector_lub(const TL lb, const TU ub, size_t m) {
1133  vector_t v(m);
1134  for (int i = 0; i < m; ++i)
1135  v(i) = scalar_lub(lb,ub);
1136  return v;
1137  }
1138  template <typename TL, typename TU>
1139  inline vector_t vector_lub_constrain(const TL lb, const TU ub, size_t m) {
1140  vector_t v(m);
1141  for (int i = 0; i < m; ++i)
1142  v(i) = scalar_lub_constrain(lb,ub);
1143  return v;
1144  }
1145  template <typename TL, typename TU>
1146  inline vector_t vector_lub_constrain(const TL lb, const TU ub, size_t m, T& lp) {
1147  vector_t v(m);
1148  for (int i = 0; i < m; ++i)
1149  v(i) = scalar_lub_constrain(lb,ub,lp);
1150  return v;
1151  }
1152 
1153  template <typename TL, typename TU>
1154  inline row_vector_t row_vector_lub(const TL lb, const TU ub, size_t m) {
1155  row_vector_t v(m);
1156  for (int i = 0; i < m; ++i)
1157  v(i) = scalar_lub(lb,ub);
1158  return v;
1159  }
1160  template <typename TL, typename TU>
1161  inline row_vector_t row_vector_lub_constrain(const TL lb, const TU ub, size_t m) {
1162  row_vector_t v(m);
1163  for (int i = 0; i < m; ++i)
1164  v(i) = scalar_lub_constrain(lb,ub);
1165  return v;
1166  }
1167  template <typename TL, typename TU>
1168  inline row_vector_t row_vector_lub_constrain(const TL lb, const TU ub, size_t m, T& lp) {
1169  row_vector_t v(m);
1170  for (int i = 0; i < m; ++i)
1171  v(i) = scalar_lub_constrain(lb,ub,lp);
1172  return v;
1173  }
1174 
1175  template <typename TL, typename TU>
1176  inline matrix_t matrix_lub(const TL lb, const TU ub, size_t m, size_t n) {
1177  matrix_t v(m,n);
1178  for (int i = 0; i < m; ++i)
1179  for (int j = 0; j < n; ++j)
1180  v(i,j) = scalar_lub(lb,ub);
1181  return v;
1182  }
1183  template <typename TL, typename TU>
1184  inline matrix_t matrix_lub_constrain(const TL lb, const TU ub, size_t m, size_t n) {
1185  matrix_t v(m,n);
1186  for (int i = 0; i < m; ++i)
1187  for (int j = 0; j < n; ++j)
1188  v(i,j) = scalar_lub_constrain(lb,ub);
1189  return v;
1190  }
1191  template <typename TL, typename TU>
1192  inline matrix_t matrix_lub_constrain(const TL lb, const TU ub, size_t m, size_t n, T& lp) {
1193  matrix_t v(m,n);
1194  for (int i = 0; i < m; ++i)
1195  for (int j = 0; j < n; ++j)
1196  v(i,j) = scalar_lub_constrain(lb,ub,lp);
1197  return v;
1198  }
1199 
1200 
1201 
1202  };
1203 
1204  }
1205 
1206 }
1207 
1208 #endif

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