Stan  1.3
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 <boost/throw_exception.hpp>
6 
7 namespace stan {
8 
9  namespace io {
10 
11 
33  template <typename T>
34  class reader {
35 
36  private:
37 
38  std::vector<T>& data_r_;
39  std::vector<int>& data_i_;
40  size_t pos_;
41  size_t int_pos_;
42 
43  inline T& scalar_ptr() {
44  return data_r_.at(pos_);
45  }
46 
47  inline T& scalar_ptr_increment(size_t m) {
48  pos_ += m;
49  return data_r_.at(pos_ - m);
50  }
51 
52  inline int& int_ptr() {
53  return data_i_.at(int_pos_);
54  }
55 
56  inline int& int_ptr_increment(size_t m) {
57  int_pos_ += m;
58  return data_i_.at(int_pos_ - m);
59  }
60 
61  public:
62 
63  typedef Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> matrix_t;
64  typedef Eigen::Matrix<T,Eigen::Dynamic,1> vector_t;
65  typedef Eigen::Matrix<T,1,Eigen::Dynamic> row_vector_t;
66 
67  typedef Eigen::Map<matrix_t> map_matrix_t;
68  typedef Eigen::Map<vector_t> map_vector_t;
69  typedef Eigen::Map<row_vector_t> map_row_vector_t;
70 
71 
83  reader(std::vector<T>& data_r,
84  std::vector<int>& data_i)
85  : data_r_(data_r),
86  data_i_(data_i),
87  pos_(0),
88  int_pos_(0) {
89  }
90 
94  ~reader() { }
95 
101  inline size_t available() {
102  return data_r_.size() - pos_;
103  }
104 
110  inline size_t available_i() {
111  return data_i_.size() - int_pos_;
112  }
113 
119  inline int integer() {
120  if (int_pos_ >= data_i_.size())
121  BOOST_THROW_EXCEPTION(
122  std::runtime_error("no more integers to read."));
123  return data_i_[int_pos_++];
124  }
125 
133  inline int integer_constrain() {
134  return integer();
135  }
136 
144  inline int integer_constrain(T& /*log_prob*/) {
145  return integer();
146  }
147 
148 
149 
155  inline T scalar() {
156  if (pos_ >= data_r_.size())
157  BOOST_THROW_EXCEPTION(std::runtime_error("no more scalars to read"));
158  return data_r_[pos_++];
159  }
160 
167  inline T scalar_constrain() {
168  return scalar();
169  }
170 
182  T scalar_constrain(T& /*log_prob*/) {
183  return scalar();
184  }
185 
186 
194  inline std::vector<T> std_vector(size_t m) {
195  std::vector<T> vec;
196  T& start = scalar_ptr_increment(m);
197  vec.insert(vec.begin(), &start, &scalar_ptr());
198  return vec;
199  }
200 
208  inline vector_t vector(size_t m) {
209  return map_vector_t(&scalar_ptr_increment(m),m);
210  }
218  inline vector_t vector_constrain(size_t m) {
219  return map_vector_t(&scalar_ptr_increment(m),m);
220  }
229  inline vector_t vector_constrain(size_t m, T& /*lp*/) {
230  return map_vector_t(&scalar_ptr_increment(m),m);
231  }
232 
233 
234 
242  inline row_vector_t row_vector(size_t m) {
243  return map_row_vector_t(&scalar_ptr_increment(m),m);
244  }
245 
254  return map_row_vector_t(&scalar_ptr_increment(m),m);
255  }
256 
266  inline row_vector_t row_vector_constrain(size_t m, T& /*lp*/) {
267  return map_row_vector_t(&scalar_ptr_increment(m),m);
268  }
269 
287  inline matrix_t matrix(size_t m, size_t n) {
288  return map_matrix_t(&scalar_ptr_increment(m*n),m,n);
289  }
290 
301  inline matrix_t matrix_constrain(size_t m, size_t n) {
302  return map_matrix_t(&scalar_ptr_increment(m*n),m,n);
303  }
304 
317  inline matrix_t matrix_constrain(size_t m, size_t n, T& /*lp*/) {
318  return map_matrix_t(&scalar_ptr_increment(m*n),m,n);
319  }
320 
321 
331  inline int integer_lb(int lb) {
332  int i = integer();
333  if (!(i >= lb))
334  BOOST_THROW_EXCEPTION(
335  std::runtime_error("required value greater than or equal to lb"));
336  return i;
337  }
347  inline int integer_lb_constrain(int lb) {
348  return integer_lb(lb);
349  }
360  inline int integer_lb_constrain(int lb, T& /*lp*/) {
361  return integer_lb(lb);
362  }
363 
364 
374  inline int integer_ub(int ub) {
375  int i = integer();
376  if (!(i <= ub))
377  BOOST_THROW_EXCEPTION(
378  std::runtime_error("required value less than or equal to ub"));
379  return i;
380  }
390  inline int integer_ub_constrain(int ub) {
391  return integer_ub(ub);
392  }
403  int integer_ub_constrain(int ub, T& /*lp*/) {
404  return integer_ub(ub);
405  }
406 
419  inline int integer_lub(int lb, int ub) {
420  // read first to make position deterministic [arbitrary choice]
421  int i = integer();
422  if (lb > ub)
423  BOOST_THROW_EXCEPTION(
424  std::runtime_error("lower bound must be less than or equal to ub"));
425  if (!(i >= lb))
426  BOOST_THROW_EXCEPTION(
427  std::runtime_error("required value greater than or equal to lb"));
428  if (!(i <= ub))
429  BOOST_THROW_EXCEPTION(
430  std::runtime_error("required value less than or equal to ub"));
431  return i;
432  }
443  inline int integer_lub_constrain(int lb, int ub) {
444  return integer_lub(lb,ub);
445  }
457  inline int integer_lub_constrain(int lb, int ub, T& /*lp*/) {
458  return integer_lub(lb,ub);
459  }
460 
461 
462 
472  inline T scalar_pos() {
473  T x(scalar());
474  stan::math::check_positive("stan::io::scalar_pos(%1%)", x,
475  "Constrained scalar");
476  return x;
477  }
478 
486  inline T scalar_pos_constrain() {
488  }
489 
500  inline T scalar_pos_constrain(T& lp) {
502  }
503 
516  template <typename TL>
517  inline T scalar_lb(const TL lb) {
518  T x(scalar());
519  stan::math::check_greater_or_equal("stan::io::scalar_lb(%1%)",
520  x, lb, "Constrained scalar");
521  return x;
522  }
523 
535  template <typename TL>
536  inline T scalar_lb_constrain(const TL lb) {
537  return stan::prob::lb_constrain(scalar(),lb);
538  }
539 
551  template <typename TL>
552  inline T scalar_lb_constrain(const TL lb, T& lp) {
553  return stan::prob::lb_constrain(scalar(),lb,lp);
554  }
555 
556 
557 
570  template <typename TU>
571  inline T scalar_ub(TU ub) {
572  T x(scalar());
573  stan::math::check_less_or_equal("stan::io::scalar_ub(%1%)", x, ub, "Constrained scalar");
574  return x;
575  }
576 
588  template <typename TU>
589  inline T scalar_ub_constrain(const TU ub) {
590  return stan::prob::ub_constrain(scalar(),ub);
591  }
592 
604  template <typename TU>
605  inline T scalar_ub_constrain(const TU ub, T& lp) {
606  return stan::prob::ub_constrain(scalar(),ub,lp);
607  }
608 
623  template <typename TL, typename TU>
624  inline T scalar_lub(const TL lb, const TU ub) {
625  T x(scalar());
626  stan::math::check_bounded("stan::io::scalar_lub(%1%)", x, lb, ub, "Constrained scalar");
627  return x;
628  }
629 
643  template <typename TL, typename TU>
644  inline T scalar_lub_constrain(const TL lb, const TU ub) {
645  return stan::prob::lub_constrain(scalar(),lb,ub);
646  }
647 
661  template <typename TL, typename TU>
662  inline T scalar_lub_constrain(TL lb, TU ub, T& lp) {
663  return stan::prob::lub_constrain(scalar(),lb,ub,lp);
664  }
665 
674  inline T prob() {
675  T x(scalar());
676  stan::math::check_bounded("stan::io::prob(%1%)", x, 0, 1, "Constrained probability");
677  return x;
678  }
679 
688  inline T prob_constrain() {
690  }
691 
702  inline T prob_constrain(T& lp) {
703  return stan::prob::prob_constrain(scalar(),lp);
704  }
705 
706 
707 
708 
720  inline T corr() {
721  T x(scalar());
722  stan::math::check_bounded("stan::io::corr(%1%)", x, -1, 1, "Correlation value");
723  return x;
724  }
725 
734  inline T corr_constrain() {
736  }
737 
749  inline T corr_constrain(T& lp) {
750  return stan::prob::corr_constrain(scalar(),lp);
751  }
752 
763  inline vector_t unit_vector(size_t k) {
764  vector_t theta(vector(k));
765  stan::math::check_unit_vector("stan::io::unit_vector(%1%)", theta, "Constrained vector");
766  return theta;
767  }
768 
779  inline
780  Eigen::Matrix<T,Eigen::Dynamic,1> unit_vector_constrain(size_t k) {
782  }
783 
796  inline vector_t unit_vector_constrain(size_t k, T& lp) {
798  }
799 
810  inline vector_t simplex(size_t k) {
811  vector_t theta(vector(k));
812  stan::math::check_simplex("stan::io::simplex(%1%)", theta, "Constrained vector");
813  return theta;
814  }
815 
826  inline
827  Eigen::Matrix<T,Eigen::Dynamic,1> simplex_constrain(size_t k) {
829  }
830 
843  inline vector_t simplex_constrain(size_t k, T& lp) {
844  return stan::prob::simplex_constrain(vector(k-1),lp);
845  }
846 
857  inline vector_t ordered(size_t k) {
858  vector_t x(vector(k));
859  stan::math::check_ordered("stan::io::ordered(%1%)", x, "Constrained vector");
860  return x;
861  }
862 
872  inline vector_t ordered_constrain(size_t k) {
874  }
875 
887  inline vector_t ordered_constrain(size_t k, T& lp) {
889  }
890 
901  inline vector_t positive_ordered(size_t k) {
902  vector_t x(vector(k));
903  stan::math::check_positive_ordered("stan::io::positive_ordered(%1%)", x, "Constrained vector");
904  return x;
905  }
906 
918  }
919 
931  inline vector_t positive_ordered_constrain(size_t k, T& lp) {
933  }
934 
944  inline matrix_t corr_matrix(size_t k) {
945  matrix_t x(matrix(k,k));
946  stan::math::check_corr_matrix("stan::math::corr_matrix(%1%)", x, "Constrained matrix");
947  return x;
948  }
949 
958  inline matrix_t corr_matrix_constrain(size_t k) {
959  return stan::prob::corr_matrix_constrain(vector((k * (k - 1)) / 2),k);
960  }
961 
973  inline matrix_t corr_matrix_constrain(size_t k, T& lp) {
974  return stan::prob::corr_matrix_constrain(vector((k * (k - 1)) / 2),
975  k,lp);
976  }
977 
978 
990  inline matrix_t cov_matrix(size_t k) {
991  matrix_t y(matrix(k,k));
992  stan::math::check_cov_matrix("stan::io::cov_matrix(%1%)", y, "Constrained matrix");
993  return y;
994  }
995 
1004  inline matrix_t cov_matrix_constrain(size_t k) {
1005  return stan::prob::cov_matrix_constrain(vector(k + (k * (k - 1)) / 2),
1006  k);
1007  }
1008 
1020  inline matrix_t cov_matrix_constrain(size_t k, T& lp) {
1021  return stan::prob::cov_matrix_constrain(vector(k + (k * (k - 1)) / 2),
1022  k,lp);
1023  }
1024 
1025 
1026  template <typename TL>
1027  inline vector_t vector_lb(const TL lb, size_t m) {
1028  vector_t v(m);
1029  for (size_t i = 0; i < m; ++i)
1030  v(i) = scalar_lb(lb);
1031  return v;
1032  }
1033  template <typename TL>
1034  inline vector_t vector_lb_constrain(const TL lb, size_t m) {
1035  vector_t v(m);
1036  for (size_t i = 0; i < m; ++i)
1037  v(i) = scalar_lb_constrain(lb);
1038  return v;
1039  }
1040  template <typename TL>
1041  inline vector_t vector_lb_constrain(const TL lb, size_t m, T& lp) {
1042  vector_t v(m);
1043  for (size_t i = 0; i < m; ++i)
1044  v(i) = scalar_lb_constrain(lb,lp);
1045  return v;
1046  }
1047 
1048  template <typename TL>
1049  inline row_vector_t row_vector_lb(const TL lb, size_t m) {
1050  row_vector_t v(m);
1051  for (size_t i = 0; i < m; ++i)
1052  v(i) = scalar_lb(lb);
1053  return v;
1054  }
1055  template <typename TL>
1056  inline row_vector_t row_vector_lb_constrain(const TL lb, size_t m) {
1057  row_vector_t v(m);
1058  for (size_t i = 0; i < m; ++i)
1059  v(i) = scalar_lb_constrain(lb);
1060  return v;
1061  }
1062  template <typename TL>
1063  inline row_vector_t row_vector_lb_constrain(const TL lb, size_t m, T& lp) {
1064  row_vector_t v(m);
1065  for (size_t i = 0; i < m; ++i)
1066  v(i) = scalar_lb_constrain(lb,lp);
1067  return v;
1068  }
1069 
1070  template <typename TL>
1071  inline matrix_t matrix_lb(const TL lb, size_t m, size_t n) {
1072  matrix_t v(m,n);
1073  for (size_t j = 0; j < n; ++j)
1074  for (size_t i = 0; i < m; ++i)
1075  v(i,j) = scalar_lb(lb);
1076  return v;
1077  }
1078  template <typename TL>
1079  inline matrix_t matrix_lb_constrain(const TL lb, size_t m, size_t n) {
1080  matrix_t v(m,n);
1081  for (size_t j = 0; j < n; ++j)
1082  for (size_t i = 0; i < m; ++i)
1083  v(i,j) = scalar_lb_constrain(lb);
1084  return v;
1085  }
1086  template <typename TL>
1087  inline matrix_t matrix_lb_constrain(const TL lb, size_t m, size_t n, T& lp) {
1088  matrix_t v(m,n);
1089  for (size_t j = 0; j < n; ++j)
1090  for (size_t i = 0; i < m; ++i)
1091  v(i,j) = scalar_lb_constrain(lb,lp);
1092  return v;
1093  }
1094 
1095  template <typename TU>
1096  inline vector_t vector_ub(const TU ub, size_t m) {
1097  vector_t v(m);
1098  for (size_t i = 0; i < m; ++i)
1099  v(i) = scalar_ub(ub);
1100  return v;
1101  }
1102  template <typename TU>
1103  inline vector_t vector_ub_constrain(const TU ub, size_t m) {
1104  vector_t v(m);
1105  for (size_t i = 0; i < m; ++i)
1106  v(i) = scalar_ub_constrain(ub);
1107  return v;
1108  }
1109  template <typename TU>
1110  inline vector_t vector_ub_constrain(const TU ub, size_t m, T& lp) {
1111  vector_t v(m);
1112  for (size_t i = 0; i < m; ++i)
1113  v(i) = scalar_ub_constrain(ub,lp);
1114  return v;
1115  }
1116 
1117  template <typename TU>
1118  inline row_vector_t row_vector_ub(const TU ub, size_t m) {
1119  row_vector_t v(m);
1120  for (size_t i = 0; i < m; ++i)
1121  v(i) = scalar_ub(ub);
1122  return v;
1123  }
1124  template <typename TU>
1125  inline row_vector_t row_vector_ub_constrain(const TU ub, size_t m) {
1126  row_vector_t v(m);
1127  for (size_t i = 0; i < m; ++i)
1128  v(i) = scalar_ub_constrain(ub);
1129  return v;
1130  }
1131  template <typename TU>
1132  inline row_vector_t row_vector_ub_constrain(const TU ub, size_t m, T& lp) {
1133  row_vector_t v(m);
1134  for (size_t i = 0; i < m; ++i)
1135  v(i) = scalar_ub_constrain(ub,lp);
1136  return v;
1137  }
1138 
1139  template <typename TU>
1140  inline matrix_t matrix_ub(const TU ub, size_t m, size_t n) {
1141  matrix_t v(m,n);
1142  for (size_t j = 0; j < n; ++j)
1143  for (size_t i = 0; i < m; ++i)
1144  v(i,j) = scalar_ub(ub);
1145  return v;
1146  }
1147  template <typename TU>
1148  inline matrix_t matrix_ub_constrain(const TU ub, size_t m, size_t n) {
1149  matrix_t v(m,n);
1150  for (size_t j = 0; j < n; ++j)
1151  for (size_t i = 0; i < m; ++i)
1152  v(i,j) = scalar_ub_constrain(ub);
1153  return v;
1154  }
1155  template <typename TU>
1156  inline matrix_t matrix_ub_constrain(const TU ub, size_t m, size_t n, T& lp) {
1157  matrix_t v(m,n);
1158  for (size_t j = 0; j < n; ++j)
1159  for (size_t i = 0; i < m; ++i)
1160  v(i,j) = scalar_ub_constrain(ub,lp);
1161  return v;
1162  }
1163 
1164 
1165  template <typename TL, typename TU>
1166  inline vector_t vector_lub(const TL lb, const TU ub, size_t m) {
1167  vector_t v(m);
1168  for (size_t i = 0; i < m; ++i)
1169  v(i) = scalar_lub(lb,ub);
1170  return v;
1171  }
1172  template <typename TL, typename TU>
1173  inline vector_t vector_lub_constrain(const TL lb, const TU ub, size_t m) {
1174  vector_t v(m);
1175  for (size_t i = 0; i < m; ++i)
1176  v(i) = scalar_lub_constrain(lb,ub);
1177  return v;
1178  }
1179  template <typename TL, typename TU>
1180  inline vector_t vector_lub_constrain(const TL lb, const TU ub, size_t m, T& lp) {
1181  vector_t v(m);
1182  for (size_t i = 0; i < m; ++i)
1183  v(i) = scalar_lub_constrain(lb,ub,lp);
1184  return v;
1185  }
1186 
1187  template <typename TL, typename TU>
1188  inline row_vector_t row_vector_lub(const TL lb, const TU ub, size_t m) {
1189  row_vector_t v(m);
1190  for (size_t i = 0; i < m; ++i)
1191  v(i) = scalar_lub(lb,ub);
1192  return v;
1193  }
1194  template <typename TL, typename TU>
1195  inline row_vector_t row_vector_lub_constrain(const TL lb, const TU ub, size_t m) {
1196  row_vector_t v(m);
1197  for (size_t i = 0; i < m; ++i)
1198  v(i) = scalar_lub_constrain(lb,ub);
1199  return v;
1200  }
1201  template <typename TL, typename TU>
1202  inline row_vector_t row_vector_lub_constrain(const TL lb, const TU ub, size_t m, T& lp) {
1203  row_vector_t v(m);
1204  for (size_t i = 0; i < m; ++i)
1205  v(i) = scalar_lub_constrain(lb,ub,lp);
1206  return v;
1207  }
1208 
1209  template <typename TL, typename TU>
1210  inline matrix_t matrix_lub(const TL lb, const TU ub, size_t m, size_t n) {
1211  matrix_t v(m,n);
1212  for (size_t j = 0; j < n; ++j)
1213  for (size_t i = 0; i < m; ++i)
1214  v(i,j) = scalar_lub(lb,ub);
1215  return v;
1216  }
1217  template <typename TL, typename TU>
1218  inline matrix_t matrix_lub_constrain(const TL lb, const TU ub, size_t m, size_t n) {
1219  matrix_t v(m,n);
1220  for (size_t j = 0; j < n; ++j)
1221  for (size_t i = 0; i < m; ++i)
1222  v(i,j) = scalar_lub_constrain(lb,ub);
1223  return v;
1224  }
1225  template <typename TL, typename TU>
1226  inline matrix_t matrix_lub_constrain(const TL lb, const TU ub, size_t m, size_t n, T& lp) {
1227  matrix_t v(m,n);
1228  for (size_t j = 0; j < n; ++j)
1229  for (size_t i = 0; i < m; ++i)
1230  v(i,j) = scalar_lub_constrain(lb,ub,lp);
1231  return v;
1232  }
1233 
1234 
1235 
1236  };
1237 
1238  }
1239 
1240 }
1241 
1242 #endif

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