1 #ifndef __STAN__IO__DUMP_HPP__
2 #define __STAN__IO__DUMP_HPP__
11 #include <boost/throw_exception.hpp>
20 size_t product(std::vector<size_t>
dims) {
22 for (
size_t i = 0; i < dims.size(); ++i)
41 void write_name_equals(
const std::string& name) {
42 for (
size_t i = 0; i < name.size(); ++i)
43 if (name.at(i) ==
'"')
44 BOOST_THROW_EXCEPTION(
45 std::invalid_argument (
"name can not contain quote char"));
46 out_ <<
'"' << name <<
'"' <<
" <- " <<
'\n';
51 void write_val(
const double& x) {
56 for (std::string::iterator it = s.begin();
59 if (*it ==
'.' || *it ==
'e' || *it ==
'E') {
67 void write_val(
const unsigned long long int& n) {
71 void write_val(
const unsigned long int& n) {
75 void write_val(
const unsigned int& n) {
79 void write_val(
const unsigned short& n) {
83 void write_val(
const long long& n) {
87 void write_val(
const long& n) {
91 void write_val(
const int& n) {
95 void write_val(
const short& n) {
99 void write_val(
const char& n) {
104 template <
typename T>
105 void write_list(T xs) {
108 if (i > 0) out_ <<
", ";
114 template <
typename T>
115 void write_structure(std::vector<T> xs,
116 std::vector<size_t> dims) {
117 out_ <<
"structure(";
126 void dims(
double , std::vector<size_t> ) {
130 void dims(
int , std::vector<size_t> ) {
134 template <
typename T>
135 void dims(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> m,
136 std::vector<size_t> ds) {
137 ds.push_back(m.rows());
138 ds.push_back(m.cols());
141 template <
typename T>
142 void dims(Eigen::Matrix<T,Eigen::Dynamic,1> v,
143 std::vector<size_t> ds) {
144 ds.push_back(v.size());
147 template <
typename T>
148 void dims(Eigen::Matrix<T,1,Eigen::Dynamic> rv,
149 std::vector<size_t> ds) {
150 ds.push_back(rv.size());
153 template <
typename T>
154 void dims(std::vector<T> x, std::vector<size_t> ds) {
155 ds.push_back(x.size());
160 template <
typename T>
161 std::vector<size_t> dims(T x) {
162 std::vector<size_t> ds;
167 bool increment(
const std::vector<size_t>& dims,
168 std::vector<size_t>& idx) {
169 for (
size_t i = 0; i < dims.size(); ++i) {
171 if (idx[i] < dims[i])
return true;
177 template <
typename T>
178 void write_stan_val(
const std::vector<T>& x,
179 const std::vector<size_t>& idx,
181 size_t next_pos = pos + 1;
182 write_stan_val(x[idx[pos]],idx,next_pos);
184 void write_stan_val(
const std::vector<double>& x,
185 const std::vector<size_t>& idx,
187 write_val(x[idx[pos]]);
189 void write_stan_val(
const std::vector<int>& x,
190 const std::vector<size_t>& idx,
192 write_val(x[idx[pos]]);
194 void write_stan_val(
const Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>& x,
195 const std::vector<size_t>& idx,
197 size_t next_pos = pos + 1;
198 write_val(x(idx[pos],idx[next_pos]));
200 void write_stan_val(
const Eigen::Matrix<double,1,Eigen::Dynamic>& x,
201 const std::vector<size_t>& idx,
203 write_val(x[idx[pos]]);
205 void write_stan_val(
const Eigen::Matrix<double,Eigen::Dynamic,1>& x,
206 const std::vector<size_t>& idx,
208 write_val(x[idx[pos]]);
212 template <
typename T>
213 void write_stan(
const std::vector<T>& x) {
214 std::vector<size_t> dims = dims(x);
215 out_ <<
"structure(c(";
216 std::vector<size_t> idx(dims.size(),0U);
217 for (
size_t count = 0;
true; ++count) {
218 if (count > 0) out_ <<
", ";
219 write_stan_val(x,idx);
220 if (!increment(dims,idx))
break;
222 out_ <<
"), .Dim = ";
226 void write_stan(
const std::vector<double>& x) {
229 void write_stan(
const std::vector<int>& x) {
232 void write_stan(
double x) {
235 void write_stan(
int x) {
238 void write_stan(
const Eigen::Matrix<double,1,Eigen::Dynamic>& x) {
241 void write_stan(
const Eigen::Matrix<double,Eigen::Dynamic,1>& x) {
244 void write_stan(
const Eigen::Matrix<
double,
245 Eigen::Dynamic,Eigen::Dynamic>& x) {
246 typedef Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>::Index Index;
247 out_ <<
"structure(c(";
248 std::vector<double> vals;
249 for (Index m = 0; m < x.cols(); ++m) {
250 for (Index n = 0; n < x.rows(); ++n) {
251 if (m > 0 || n > 0) out_ <<
", ";
255 out_ <<
"), .Dim = c(";
256 out_ << x.rows() <<
", " << x.cols();
298 template <
typename T>
301 write_name_equals(name);
314 template <
typename T>
316 std::vector<size_t> dims,
318 if (xs.size() != product(dims))
319 BOOST_THROW_EXCEPTION(
320 std::invalid_argument(
"xs.size() != product(dims)"));
321 write_structure(xs,dims);
332 template <
typename T>
335 write_name_equals(name);
347 template <
typename T>
350 write_name_equals(name);
430 std::vector<int> stack_i_;
431 std::vector<double> stack_r_;
432 std::vector<size_t> dims_;
436 bool scan_single_char(
char c_expected) {
445 bool scan_optional_long() {
446 if (scan_single_char(
'l'))
448 else if (scan_single_char(
'L'))
454 bool scan_char(
char c_expected) {
457 if (c != c_expected) {
464 bool scan_name_unquoted() {
467 if (!std::isalpha(c))
return false;
470 if (std::isalpha(c) || std::isdigit(c) || c ==
'_' || c ==
'.') {
481 if (scan_char(
'"')) {
482 if (!scan_name_unquoted())
return false;
483 if (!scan_char(
'"'))
return false;
484 }
else if (scan_char(
'\'')) {
485 if (!scan_name_unquoted())
return false;
486 if (!scan_char(
'\''))
return false;
488 if (!scan_name_unquoted())
return false;
494 bool scan_chars(std::string s,
bool case_sensitive =
true) {
495 for (
size_t i = 0; i < s.size(); ++i) {
498 for (
size_t j = 1; j < i; ++j)
503 if ((case_sensitive && c != s[i])
504 || (!case_sensitive && ::toupper(c) != ::toupper(s[i]))) {
506 for (
size_t j = 1; j < i; ++j)
514 bool scan_number(
bool negate_val) {
517 if (scan_chars(
"Inf")) {
519 stack_r_.push_back(negate_val
520 ? -std::numeric_limits<double>::infinity()
521 : std::numeric_limits<double>::infinity());
524 if (scan_chars(
"NaN",
false)) {
525 stack_r_.push_back(std::numeric_limits<double>::quiet_NaN());
530 bool is_double =
false;
533 if (std::isdigit(c)) {
547 if (!is_double && stack_r_.size() == 0) {
549 if (!(std::stringstream(buf) >> n))
551 stack_i_.push_back(negate_val ? -n : n);
552 scan_optional_long();
554 for (
size_t j = 0; j < stack_i_.size(); ++j)
555 stack_r_.push_back(negate_val
556 ? -static_cast<double>(stack_i_[j])
557 : static_cast<double>(stack_i_[j]));
560 if (!(std::stringstream(buf) >> x))
562 stack_r_.push_back(negate_val ? -x : x);
570 if (std::isspace(c))
continue;
574 bool negate_val = scan_char(
'-');
575 if (!negate_val) scan_char(
'+');
576 return scan_number(negate_val);
580 bool scan_seq_value() {
581 if (!scan_char(
'('))
return false;
582 if (scan_char(
')')) {
586 if (!scan_number())
return false;;
587 while (scan_char(
',')) {
588 if (!scan_number())
return false;
590 dims_.push_back(stack_r_.size() + stack_i_.size());
591 return scan_char(
')');
594 bool scan_struct_value() {
595 if (!scan_char(
'('))
return false;
596 if (scan_char(
'c')) {
606 for (
size_t i = start; i <= end; ++i)
607 stack_i_.push_back(i);
609 for (
size_t i = start; i >= end; --i)
610 stack_i_.push_back(i);
614 if (!scan_char(
','))
return false;
615 if (!scan_char(
'.'))
return false;
616 if (!scan_chars(
"Dim"))
return false;
617 if (!scan_char(
'='))
return false;
618 if (scan_char(
'c')) {
619 if (!scan_char(
'('))
return false;
622 scan_optional_long();
623 dims_.push_back(dim);
624 while (scan_char(
',')) {
626 scan_optional_long();
627 dims_.push_back(dim);
629 if (!scan_char(
')'))
return false;
638 for (
size_t i = start; i <= end; ++i)
641 for (
size_t i = start; i >= end; --i)
645 if (!scan_char(
')'))
return false;
653 return scan_seq_value();
654 if (scan_chars(
"structure"))
655 return scan_struct_value();
660 if (stack_i_.size() != 1)
664 if (stack_i_.size() != 2)
666 int start = stack_i_[0];
667 int end = stack_i_[1];
670 for (
int i = start; i <= end; ++i)
671 stack_i_.push_back(i);
673 for (
int i = start; i >= end; --i)
674 stack_i_.push_back(i);
676 dims_.push_back(stack_i_.size());
684 std::cout <<
"var name=|" << name_ <<
"|" << std::endl;
685 std:: cout <<
"dims=(";
686 for (
size_t i = 0; i < dims_.size(); ++i) {
689 std::cout << dims_[i];
691 std::cout <<
")" << std::endl;
692 std::cout <<
"float stack:" << std::endl;
693 for (
size_t i = 0; i < stack_r_.size(); ++i)
694 std::cout <<
" [" << i <<
"] " << stack_r_[i] << std::endl;
695 std::cout <<
"int stack" << std::endl;
696 for (
size_t i = 0; i < stack_i_.size(); ++i)
697 std::cout <<
" [" << i <<
"] " << stack_i_[i] << std::endl;
747 return stack_i_.size() > 0;
815 std::map<std::string,
816 std::pair<std::vector<double>,
817 std::vector<size_t> > > vars_r_;
818 std::map<std::string,
819 std::pair<std::vector<int>,
820 std::vector<size_t> > > vars_i_;
821 std::vector<double>
const empty_vec_r_;
822 std::vector<int>
const empty_vec_i_;
823 std::vector<size_t>
const empty_vec_ui_;
833 bool contains_r_only(
const std::string& name)
const {
834 return vars_r_.find(name) != vars_r_.end();
847 while (reader.
next()) {
849 vars_i_[reader.
name()]
850 = std::pair<std::vector<int>,
855 vars_r_[reader.
name()]
856 = std::pair<std::vector<double>,
872 return contains_r_only(name) ||
contains_i(name);
884 return vars_i_.find(name) != vars_i_.end();
894 std::vector<double>
vals_r(
const std::string& name)
const {
895 if (contains_r_only(name)) {
896 return (vars_r_.find(name)->second).first;
898 std::vector<int> vec_int = (vars_i_.find(name)->second).first;
899 std::vector<double> vec_r(vec_int.size());
900 for (
size_t ii = 0; ii < vec_int.size(); ii++) {
901 vec_r[ii] = vec_int[ii];
915 std::vector<size_t>
dims_r(
const std::string& name)
const {
916 if (contains_r_only(name)) {
917 return (vars_r_.find(name)->second).second;
919 return (vars_i_.find(name)->second).second;
921 return empty_vec_ui_;
931 std::vector<int>
vals_i(
const std::string& name)
const {
933 return (vars_i_.find(name)->second).first;
945 std::vector<size_t>
dims_i(
const std::string& name)
const {
947 return (vars_i_.find(name)->second).second;
949 return empty_vec_ui_;
958 virtual void names_r(std::vector<std::string>& names)
const {
960 for (std::map<std::string,
961 std::pair<std::vector<double>,
962 std::vector<size_t> > >
963 ::const_iterator it = vars_r_.begin();
964 it != vars_r_.end(); ++it)
965 names.push_back((*it).first);
974 virtual void names_i(std::vector<std::string>& names)
const {
976 for (std::map<std::string,
977 std::pair<std::vector<int>,
978 std::vector<size_t> > >
979 ::const_iterator it = vars_i_.begin();
980 it != vars_i_.end(); ++it)
981 names.push_back((*it).first);
991 bool remove(
const std::string& name) {
992 return (vars_i_.erase(name) > 0)
993 || (vars_r_.erase(name) > 0);