1 #ifndef __STAN__IO__DUMP_HPP__
2 #define __STAN__IO__DUMP_HPP__
14 #include <boost/throw_exception.hpp>
24 size_t product(std::vector<size_t> dims) {
26 for (
size_t i = 0; i < dims.size(); ++i)
45 void write_name_equals(
const std::string& name) {
46 for (
size_t i = 0; i < name.size(); ++i)
47 if (name.at(i) ==
'"')
48 BOOST_THROW_EXCEPTION(
49 std::invalid_argument (
"name can not contain quote char"));
50 out_ <<
'"' << name <<
'"' <<
" <- " <<
'\n';
55 void write_val(
const double& x) {
60 for (std::string::iterator it = s.begin();
63 if (*it ==
'.' || *it ==
'e' || *it ==
'E') {
71 void write_val(
const unsigned long long int& n) {
75 void write_val(
const unsigned long int& n) {
79 void write_val(
const unsigned int& n) {
83 void write_val(
const unsigned short& n) {
87 void write_val(
const long long& n) {
91 void write_val(
const long& n) {
95 void write_val(
const int& n) {
99 void write_val(
const short& n) {
103 void write_val(
const char& n) {
108 template <
typename T>
109 void write_list(T xs) {
112 if (i > 0) out_ <<
", ";
118 template <
typename T>
119 void write_structure(std::vector<T> xs,
120 std::vector<size_t> dims) {
121 out_ <<
"structure(";
130 void dims(
double x, std::vector<size_t> ds) {
134 void dims(
int x, std::vector<size_t> ds) {
138 template <
typename T>
139 void dims(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> m,
140 std::vector<size_t> ds) {
141 ds.push_back(m.rows());
142 ds.push_back(m.cols());
145 template <
typename T>
146 void dims(Eigen::Matrix<T,Eigen::Dynamic,1> v,
147 std::vector<size_t> ds) {
148 ds.push_back(v.size());
151 template <
typename T>
152 void dims(Eigen::Matrix<T,1,Eigen::Dynamic> rv,
153 std::vector<size_t> ds) {
154 ds.push_back(rv.size());
157 template <
typename T>
158 void dims(std::vector<T> x, std::vector<size_t> ds) {
159 ds.push_back(x.size());
164 template <
typename T>
165 std::vector<size_t> dims(T x) {
166 std::vector<size_t> ds;
171 bool increment(
const std::vector<size_t>& dims,
172 std::vector<size_t>& idx) {
173 for (
size_t i = 0; i < dims.size(); ++i) {
175 if (idx[i] < dims[i])
return true;
181 template <
typename T>
182 void write_stan_val(
const std::vector<T>& x,
183 const std::vector<size_t>& idx,
185 size_t next_pos = pos + 1;
186 write_stan_val(x[idx[pos]],idx,next_pos);
188 void write_stan_val(
const std::vector<double>& x,
189 const std::vector<size_t>& idx,
191 write_val(x[idx[pos]]);
193 void write_stan_val(
const std::vector<int>& x,
194 const std::vector<size_t>& idx,
196 write_val(x[idx[pos]]);
198 void write_stan_val(
const Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>& x,
199 const std::vector<size_t>& idx,
201 size_t next_pos = pos + 1;
202 write_val(x(idx[pos],idx[next_pos]));
204 void write_stan_val(
const Eigen::Matrix<double,1,Eigen::Dynamic>& x,
205 const std::vector<size_t>& idx,
207 write_val(x[idx[pos]]);
209 void write_stan_val(
const Eigen::Matrix<double,Eigen::Dynamic,1>& x,
210 const std::vector<size_t>& idx,
212 write_val(x[idx[pos]]);
216 template <
typename T>
217 void write_stan(
const std::vector<T>& x) {
218 std::vector<size_t> dims = dims(x);
219 out_ <<
"structure(c(";
220 std::vector<size_t> idx(dims.size(),0U);
221 for (
size_t count = 0;
true; ++count) {
222 if (count > 0) out_ <<
", ";
223 write_stan_val(x,idx);
224 if (!increment(dims,idx))
break;
226 out_ <<
"), .Dim = ";
230 void write_stan(
const std::vector<double>& x) {
233 void write_stan(
const std::vector<int>& x) {
236 void write_stan(
double x) {
239 void write_stan(
int x) {
242 void write_stan(
const Eigen::Matrix<double,1,Eigen::Dynamic>& x) {
245 void write_stan(
const Eigen::Matrix<double,Eigen::Dynamic,1>& x) {
248 void write_stan(
const Eigen::Matrix<
double,
249 Eigen::Dynamic,Eigen::Dynamic>& x) {
250 typedef Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>::Index Index;
251 out_ <<
"structure(c(";
252 std::vector<double> vals;
253 for (Index m = 0; m < x.cols(); ++m) {
254 for (Index n = 0; n < x.rows(); ++n) {
255 if (m > 0 || n > 0) out_ <<
", ";
259 out_ <<
"), .Dim = c(";
260 out_ << x.rows() <<
", " << x.cols();
302 template <
typename T>
305 write_name_equals(name);
318 template <
typename T>
320 std::vector<size_t> dims,
322 if (xs.size() != product(dims))
323 BOOST_THROW_EXCEPTION(
324 std::invalid_argument(
"xs.size() != product(dims)"));
325 write_structure(xs,dims);
336 template <
typename T>
339 write_name_equals(name);
351 template <
typename T>
354 write_name_equals(name);
434 std::vector<int> stack_i_;
435 std::vector<double> stack_r_;
436 std::vector<size_t> dims_;
439 bool scan_single_char(
char c_expected) {
448 bool scan_optional_long() {
449 if (scan_single_char(
'l'))
451 else if (scan_single_char(
'L'))
457 bool scan_char(
char c_expected) {
460 if (c != c_expected) {
467 bool scan_name_unquoted() {
470 if (!std::isalpha(c))
return false;
473 if (std::isalpha(c) || std::isdigit(c) || c ==
'_' || c ==
'.') {
484 if (scan_char(
'"')) {
485 if (!scan_name_unquoted())
return false;
486 if (!scan_char(
'"'))
return false;
487 }
else if (scan_char(
'\'')) {
488 if (!scan_name_unquoted())
return false;
489 if (!scan_char(
'\''))
return false;
491 if (!scan_name_unquoted())
return false;
496 bool scan_chars(std::string s) {
497 for (
size_t i = 0; i < s.size(); ++i) {
500 for (
size_t j = 1; j < i; ++j)
506 for (
size_t j = 1; j < i; ++j)
516 bool is_double =
false;
519 if (std::isspace(c))
continue;
524 if (std::isdigit(c) || c ==
'-') {
537 if (!is_double && stack_r_.size() == 0) {
539 if (!(std::stringstream(buf) >> n))
541 stack_i_.push_back(n);
542 scan_optional_long();
544 for (
size_t j = 0; j < stack_i_.size(); ++j)
545 stack_r_.push_back(static_cast<double>(stack_i_[j]));
548 if (!(std::stringstream(buf) >> x))
550 stack_r_.push_back(x);
555 void print_next_char() {
557 bool ok = in_.get(c);
559 std::cout <<
"next char=" << c << std::endl;
562 std::cout <<
"next char=<EOS>" << std::endl;
566 bool scan_seq_value() {
567 if (!scan_char(
'('))
return false;
568 if (scan_char(
')')) {
572 if (!scan_number())
return false;;
573 while (scan_char(
',')) {
574 if (!scan_number())
return false;
576 dims_.push_back(stack_r_.size() + stack_i_.size());
577 return scan_char(
')');
580 bool scan_struct_value() {
581 if (!scan_char(
'('))
return false;
582 if (scan_char(
'c')) {
592 for (
size_t i = start; i <= end; ++i)
593 stack_i_.push_back(i);
595 for (
size_t i = start; i >= end; --i)
596 stack_i_.push_back(i);
600 if (!scan_char(
','))
return false;
601 if (!scan_char(
'.'))
return false;
602 if (!scan_chars(
"Dim"))
return false;
603 if (!scan_char(
'='))
return false;
604 if (scan_char(
'c')) {
605 if (!scan_char(
'('))
return false;
608 scan_optional_long();
609 dims_.push_back(dim);
610 while (scan_char(
',')) {
612 scan_optional_long();
613 dims_.push_back(dim);
615 if (!scan_char(
')'))
return false;
624 for (
size_t i = start; i <= end; ++i)
627 for (
size_t i = start; i >= end; --i)
631 if (!scan_char(
')'))
return false;
639 return scan_seq_value();
640 if (scan_chars(
"structure"))
641 return scan_struct_value();
646 if (stack_i_.size() != 1)
650 if (stack_i_.size() != 2)
652 int start = stack_i_[0];
653 int end = stack_i_[1];
656 for (
int i = start; i <= end; ++i)
657 stack_i_.push_back(i);
659 for (
int i = start; i >= end; --i)
660 stack_i_.push_back(i);
662 dims_.push_back(stack_i_.size());
670 std::cout <<
"var name=|" << name_ <<
"|" << std::endl;
671 std:: cout <<
"dims=(";
672 for (
size_t i = 0; i < dims_.size(); ++i) {
675 std::cout << dims_[i];
677 std::cout <<
")" << std::endl;
678 std::cout <<
"float stack:" << std::endl;
679 for (
size_t i = 0; i < stack_r_.size(); ++i)
680 std::cout <<
" [" << i <<
"] " << stack_r_[i] << std::endl;
681 std::cout <<
"int stack" << std::endl;
682 for (
size_t i = 0; i < stack_i_.size(); ++i)
683 std::cout <<
" [" << i <<
"] " << stack_i_[i] << std::endl;
733 return stack_i_.size() > 0;
801 std::map<std::string,
802 std::pair<std::vector<double>,
803 std::vector<size_t> > > vars_r_;
804 std::map<std::string,
805 std::pair<std::vector<int>,
806 std::vector<size_t> > > vars_i_;
807 std::vector<double>
const empty_vec_r_;
808 std::vector<int>
const empty_vec_i_;
809 std::vector<size_t>
const empty_vec_ui_;
819 bool contains_r_only(
const std::string& name)
const {
820 return vars_r_.find(name) != vars_r_.end();
833 while (reader.
next()) {
835 vars_i_[reader.
name()]
836 = std::pair<std::vector<int>,
841 vars_r_[reader.
name()]
842 = std::pair<std::vector<double>,
858 return contains_r_only(name) ||
contains_i(name);
870 return vars_i_.find(name) != vars_i_.end();
880 std::vector<double>
vals_r(
const std::string& name)
const {
881 if (contains_r_only(name)) {
882 return (vars_r_.find(name)->second).first;
884 std::vector<int> vec_int = (vars_i_.find(name)->second).first;
885 std::vector<double> vec_r(vec_int.size());
886 for (
size_t ii = 0; ii < vec_int.size(); ii++) {
887 vec_r[ii] = vec_int[ii];
901 std::vector<size_t>
dims_r(
const std::string& name)
const {
902 if (contains_r_only(name)) {
903 return (vars_r_.find(name)->second).second;
905 return (vars_i_.find(name)->second).second;
907 return empty_vec_ui_;
917 std::vector<int>
vals_i(
const std::string& name)
const {
919 return (vars_i_.find(name)->second).first;
931 std::vector<size_t>
dims_i(
const std::string& name)
const {
933 return (vars_i_.find(name)->second).second;
935 return empty_vec_ui_;
944 virtual void names_r(std::vector<std::string>& names)
const {
946 for (std::map<std::string,
947 std::pair<std::vector<double>,
948 std::vector<size_t> > >
949 ::const_iterator it = vars_r_.begin();
950 it != vars_r_.end(); ++it)
951 names.push_back((*it).first);
960 virtual void names_i(std::vector<std::string>& names)
const {
962 for (std::map<std::string,
963 std::pair<std::vector<int>,
964 std::vector<size_t> > >
965 ::const_iterator it = vars_i_.begin();
966 it != vars_i_.end(); ++it)
967 names.push_back((*it).first);
977 bool remove(
const std::string& name) {
978 return (vars_i_.erase(name) > 0)
979 || (vars_r_.erase(name) > 0);