1 #ifndef __STAN__GM__GENERATOR_HPP__ 2 #define __STAN__GM__GENERATOR_HPP__ 4 #include <boost/variant/apply_visitor.hpp> 20 const std::string
EOL(
"\n");
21 const std::string
EOL2(
"\n\n");
22 const std::string
INDENT(
" ");
28 return !
is_nil(x.range_.low_.expr_) && !
is_nil(x.range_.high_.expr_);
32 return is_nil(x.range_.low_.expr_) && !
is_nil(x.range_.high_.expr_);
36 return !
is_nil(x.range_.low_.expr_) &&
is_nil(x.range_.high_.expr_);
47 for (
size_t k = 0; k < indent; ++k)
60 o <<
"namespace " << name <<
"_namespace {" <<
EOL2;
64 o <<
"} // namespace" <<
EOL2;
70 o <<
"// " << msg <<
EOL;
75 const std::vector<expression> indexes,
81 size_t ai_size = indexes.size();
87 if (ai_size <= (e_num_dims + 1) || base_type !=
MATRIX_T) {
88 for (
size_t n = 0; n < ai_size; ++n)
91 for (
size_t n = 0; n < ai_size; ++n) {
94 o <<
',' <<
'"' << expr <<
'"' <<
',' << (n+1) <<
')';
97 for (
size_t n = 0; n < ai_size - 1; ++n)
100 for (
size_t n = 0; n < ai_size - 2; ++n) {
103 o <<
',' <<
'"' << expr <<
'"' <<
',' << (n+1) <<
')';
109 o <<
',' <<
'"' << expr <<
'"' <<
',' << (ai_size-1U) <<
')';
114 const std::vector<expression>& dims,
117 for (
size_t i = 0; i < end; ++i) o <<
"std::vector<";
119 for (
size_t i = 0; i < end; ++i) {
125 std::string base_type_to_string(const base_expr_type& bt) { 132 struct expression_visgen : public visgen { 133 expression_visgen(std::ostream& o) : visgen(o) { } 134 void operator()(nil const& x) const { 137 void operator()(const int_literal& n) const { o_ << n.val_; } 138 void operator()(const double_literal& x) const { o_ << x.val_; } 139 void operator()(const array_literal& x) const { 140 o_ << "stan::math::new_array<"; 141 generate_type("foobar", // not enough to use: base_type_to_string(x.type_.base_type_), 146 for (size_t i = 0; i < x.args_.size(); ++i) { 148 generate_expression(x.args_[i],o_); 153 void operator()(const variable& v) const { o_ << v.name_; } 154 void operator()(int n) const { o_ << static_cast<long>(n); } 155 void operator()(double x) const { o_ << x; } 156 void operator()(const std::string& x) const { o_ << x; } // identifiers 157 void operator()(const index_op& x) const { 158 std::stringstream expr_o; 159 generate_expression(x.expr_,expr_o); 160 std::string expr_string = expr_o.str(); 161 std::vector<expression> indexes; 162 size_t e_num_dims = x.expr_.expression_type().num_dims_; 163 base_expr_type base_type = x.expr_.expression_type().base_type_; 164 for (size_t i = 0; i < x.dimss_.size(); ++i) 165 for (size_t j = 0; j < x.dimss_[i].size(); ++j) 166 indexes.push_back(x.dimss_[i][j]); // wasteful copy, could use refs 167 generate_indexed_expr(expr_string,indexes,base_type,e_num_dims,o_); 169 void operator()(const fun& fx) const { 170 o_ << fx.name_ << '(
'; 171 for (size_t i = 0; i < fx.args_.size(); ++i) { 172 if (i > 0) o_ << ',
'; 173 boost::apply_visitor(*this, fx.args_[i].expr_); 177 void operator()(const binary_op& expr) const { 179 boost::apply_visitor(*this, expr.left.expr_); 180 o_ << ' ' << expr.op << ' '; 181 boost::apply_visitor(*this, expr.right.expr_); 184 void operator()(const unary_op& expr) const { 185 o_ << expr.op << '(
'; 186 boost::apply_visitor(*this, expr.subject.expr_); 191 void generate_expression(const expression& e, std::ostream& o) { 192 expression_visgen vis(o); 193 boost::apply_visitor(vis, e.expr_); 196 struct printable_visgen : public visgen { 197 printable_visgen(std::ostream& o) : visgen(o) { } 198 void operator()(const std::string& s) const { 199 o_ << '"' << s << '"'; 201 void operator()(const expression& e) const { 202 generate_expression(e,o_); 206 void generate_printable(const printable& p, std::ostream& o) { 207 printable_visgen vis(o); 208 boost::apply_visitor(vis, p.printable_); 211 void generate_using(const std::string& type, std::ostream& o) { 212 o << "using " << type << ";" << EOL; 215 void generate_using_namespace(const std::string& ns, std::ostream& o) { 216 o << "using namespace " << ns << ";" << EOL; 220 void generate_usings(std::ostream& o) { 221 generate_using("std::vector",o); 222 generate_using("std::string",o); 223 generate_using("std::stringstream",o); 224 generate_using("stan::agrad::var",o); 225 generate_using("stan::model::prob_grad_ad",o); 226 generate_using("stan::math::get_base1",o); 227 generate_using("stan::math::stan_print",o); 228 generate_using("stan::io::dump",o); 229 generate_using("std::istream",o); 230 generate_using_namespace("stan::math",o); 231 generate_using_namespace("stan::prob",o); 232 generate_using_namespace("stan::agrad",o); 236 void generate_typedef(const std::string& type, 237 const std::string& abbrev, 239 o << "typedef" << " " << type << " " << abbrev << ";" << EOL; 242 void generate_typedefs(std::ostream& o) { 243 generate_typedef("Eigen::Matrix<double,Eigen::Dynamic,1>","vector_d",o); 244 generate_typedef("Eigen::Matrix<double,1,Eigen::Dynamic>","row_vector_d",o); 245 generate_typedef("Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>","matrix_d",o); 247 generate_typedef("Eigen::Matrix<stan::agrad::var,Eigen::Dynamic,1>","vector_v",o); 248 generate_typedef("Eigen::Matrix<stan::agrad::var,1,Eigen::Dynamic>","row_vector_v",o); 249 generate_typedef("Eigen::Matrix<stan::agrad::var,Eigen::Dynamic,Eigen::Dynamic>","matrix_v",o); 254 void generate_include(const std::string& lib_name, std::ostream& o) { 255 o << "#include" << " " << "<" << lib_name << ">" << EOL; 258 void generate_includes(std::ostream& o) { 259 generate_include("stan/model/model_header.hpp",o); 263 void generate_version_comment(std::ostream& o) { 264 o << "// Code generated by Stan version " 265 << stan::MAJOR_VERSION << "." << stan::MINOR_VERSION << EOL2; 268 void generate_class_decl(const std::string& model_name, 270 o << "class " << model_name << " : public prob_grad_ad {" << EOL; 273 void generate_end_class_decl(std::ostream& o) { 274 o << "}; // model" << EOL2; 277 void generate_initializer(std::ostream& o, 278 const std::string& base_type, 279 const std::vector<expression>& dims, 280 const expression& type_arg1 = expression(), 281 const expression& type_arg2 = expression()) { 282 for (size_t i = 0; i < dims.size(); ++i) { 284 generate_expression(dims[i].expr_,o); 286 generate_type(base_type,dims,dims.size()- i - 1,o); 290 if (!is_nil(type_arg1)) { 291 generate_expression(type_arg1.expr_,o); 292 if (!is_nil(type_arg2)) { 294 generate_expression(type_arg2.expr_,o); 296 } else if (!is_nil(type_arg2.expr_)) { 297 generate_expression(type_arg2.expr_,o); 303 for (size_t i = 0; i < dims.size(); ++i) 308 // only generates the test 309 void generate_validate_context_size(std::ostream& o, 310 const std::string& stage, 311 const std::string& var_name, 312 const std::string& base_type, 313 const std::vector<expression>& dims, 314 const expression& type_arg1 = expression(), 315 const expression& type_arg2 = expression()) { 317 << "context__.validate_dims(" 318 << '"' << stage << '"' 319 << ", " << '"' << var_name << '"' 320 << ", " << '"' << base_type << '"' 321 << ", context__.to_vec("; 322 for (size_t i = 0; i < dims.size(); ++i) { 324 generate_expression(dims[i].expr_,o); 326 if (!is_nil(type_arg1)) { 327 if (dims.size() > 0) o << ","; 328 generate_expression(type_arg1.expr_,o); 329 if (!is_nil(type_arg2)) { 331 generate_expression(type_arg2.expr_,o); 338 struct var_size_validating_visgen : public visgen { 339 const std::string stage_; 340 var_size_validating_visgen(std::ostream& o, const std::string& stage) 344 void operator()(nil const& x) const { } // dummy 345 void operator()(int_var_decl const& x) const { 346 generate_validate_context_size(o_,stage_,x.name_,"int",x.dims_); 348 void operator()(double_var_decl const& x) const { 349 generate_validate_context_size(o_,stage_,x.name_,"double",x.dims_); 351 void operator()(vector_var_decl const& x) const { 352 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.M_); 354 void operator()(row_vector_var_decl const& x) const { 355 generate_validate_context_size(o_,stage_,x.name_,"row_vector_d",x.dims_,x.N_); 357 void operator()(simplex_var_decl const& x) const { 358 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_); 360 void operator()(ordered_var_decl const& x) const { 361 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_); 363 void operator()(positive_ordered_var_decl const& x) const { 364 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_); 366 void operator()(matrix_var_decl const& x) const { 367 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.M_,x.N_); 369 void operator()(cov_matrix_var_decl const& x) const { 370 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.K_,x.K_); 372 void operator()(corr_matrix_var_decl const& x) const { 373 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.K_,x.K_); 379 void generate_initialization(std::ostream& o, 380 const std::string& var_name, 381 const std::string& base_type, 382 const std::vector<expression>& dims, 383 const expression& type_arg1 = expression(), 384 const expression& type_arg2 = expression()) { 386 << var_name << " = "; 387 generate_type(base_type,dims,dims.size(),o); 388 generate_initializer(o,base_type,dims,type_arg1,type_arg2); 392 struct var_resizing_visgen : public visgen { 393 var_resizing_visgen(std::ostream& o) 396 void operator()(nil const& x) const { } // dummy 397 void operator()(int_var_decl const& x) const { 398 generate_initialization(o_,x.name_,"int",x.dims_); 400 void operator()(double_var_decl const& x) const { 401 generate_initialization(o_,x.name_,"double",x.dims_); 403 void operator()(vector_var_decl const& x) const { 404 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.M_); 406 void operator()(row_vector_var_decl const& x) const { 407 generate_initialization(o_,x.name_,"row_vector_d",x.dims_,x.N_); 409 void operator()(simplex_var_decl const& x) const { 410 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_); 412 void operator()(ordered_var_decl const& x) const { 413 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_); 415 void operator()(positive_ordered_var_decl const& x) const { 416 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_); 418 void operator()(matrix_var_decl const& x) const { 419 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.M_,x.N_); 421 void operator()(cov_matrix_var_decl const& x) const { 422 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.K_,x.K_); 424 void operator()(corr_matrix_var_decl const& x) const { 425 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.K_,x.K_); 429 void generate_var_resizing(const std::vector<var_decl>& vs, 431 var_resizing_visgen vis(o); 432 for (size_t i = 0; i < vs.size(); ++i) 433 boost::apply_visitor(vis, vs[i].decl_); 436 const std::vector<expression> EMPTY_EXP_VECTOR(0); 438 struct init_local_var_visgen : public visgen { 439 const bool declare_vars_; 441 init_local_var_visgen(bool declare_vars, 445 declare_vars_(declare_vars), 448 template <typename D> 449 void generate_initialize_array_bounded(const D& x, const std::string& base_type, 450 const std::string& read_fun_prefix, 451 const std::vector<expression>& dim_args) const { 452 std::vector<expression> read_args; 453 std::string read_fun(read_fun_prefix); 456 read_args.push_back(x.range_.low_); 457 read_args.push_back(x.range_.high_); 458 } else if (has_lb(x)) { 460 read_args.push_back(x.range_.low_); 461 } else if (has_ub(x)) { 463 read_args.push_back(x.range_.high_); 465 for (size_t i = 0; i < dim_args.size(); ++i) 466 read_args.push_back(dim_args[i]); 467 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_); 469 void operator()(const nil& x) const { } 470 void operator()(const int_var_decl& x) const { 471 generate_initialize_array("int","integer",EMPTY_EXP_VECTOR,x.name_,x.dims_); 473 void operator()(const double_var_decl& x) const { 474 std::vector<expression> read_args; 475 generate_initialize_array_bounded(x,is_var_?"var":"double","scalar",read_args); 477 void operator()(const vector_var_decl& x) const { 478 std::vector<expression> read_args; 479 read_args.push_back(x.M_); 480 generate_initialize_array_bounded(x,is_var_?"vector_v":"vector_d","vector",read_args); 482 void operator()(const row_vector_var_decl& x) const { 483 std::vector<expression> read_args; 484 read_args.push_back(x.N_); 485 generate_initialize_array_bounded(x,is_var_?"row_vector_v":"row_vector_d","row_vector",read_args); 487 void operator()(const matrix_var_decl& x) const { 488 std::vector<expression> read_args; 489 read_args.push_back(x.M_); 490 read_args.push_back(x.N_); 491 generate_initialize_array_bounded(x,is_var_?"matrix_v":"matrix_d","matrix",read_args); 493 void operator()(const simplex_var_decl& x) const { 494 std::vector<expression> read_args; 495 read_args.push_back(x.K_); 496 generate_initialize_array(is_var_?"vector_v":"vector_d","simplex",read_args,x.name_,x.dims_); 498 void operator()(const ordered_var_decl& x) const { 499 std::vector<expression> read_args; 500 read_args.push_back(x.K_); 501 generate_initialize_array(is_var_?"vector_v":"vector_d","ordered",read_args,x.name_,x.dims_); 503 void operator()(const positive_ordered_var_decl& x) const { 504 std::vector<expression> read_args; 505 read_args.push_back(x.K_); 506 generate_initialize_array(is_var_?"vector_v":"vector_d","positive_ordered",read_args,x.name_,x.dims_); 508 void operator()(const cov_matrix_var_decl& x) const { 509 std::vector<expression> read_args; 510 read_args.push_back(x.K_); 511 generate_initialize_array(is_var_?"matrix_v":"matrix_d","cov_matrix",read_args,x.name_,x.dims_); 513 void operator()(const corr_matrix_var_decl& x) const { 514 std::vector<expression> read_args; 515 read_args.push_back(x.K_); 516 generate_initialize_array(is_var_?"matrix_v":"matrix_d","corr_matrix",read_args,x.name_,x.dims_); 518 void generate_initialize_array(const std::string& var_type, 519 const std::string& read_type, 520 const std::vector<expression>& read_args, 521 const std::string& name, 522 const std::vector<expression>& dims) 525 if (dims.size() == 0) { 526 generate_indent(2,o_); 527 if (declare_vars_) o_ << var_type << " "; 528 o_ << name << " = in__." << read_type << "_constrain("; 529 for (size_t j = 0; j < read_args.size(); ++j) { 530 if (j > 0) o_ << ","; 531 generate_expression(read_args[j],o_); 533 if (read_args.size() > 0) 541 for (size_t i = 0; i < dims.size(); ++i) o_ << "vector<"; 543 for (size_t i = 0; i < dims.size(); ++i) o_ << "> "; 544 o_ << name << ";" << EOL; 546 std::string name_dims(name); 547 for (size_t i = 0; i < dims.size(); ++i) { 548 generate_indent(i + 2, o_); 549 o_ << "size_t dim_" << name << "_" << i << "__ = "; 550 generate_expression(dims[i],o_); 552 if (i < dims.size() - 1) { 553 generate_indent(i + 2, o_); 554 o_ << name_dims << ".resize(dim" << "_" << name << "_" << i << "__);" 556 name_dims.append("[k_").append(to_string(i)).append("__]"); 558 generate_indent(i + 2, o_); 559 if (i == dims.size() - 1) { 560 o_ << name_dims << ".reserve(dim_" << name << "_" << i << "__);" << EOL; 561 generate_indent(i + 2, o_); 563 o_ << "for (size_t k_" << i << "__ = 0;" 564 << " k_" << i << "__ < dim_" << name << "_" << i << "__;" 565 << " ++k_" << i << "__) {" << EOL; 566 if (i == dims.size() - 1) { 567 generate_indent(i + 3, o_); 568 o_ << name_dims << ".push_back(in__." << read_type << "_constrain("; 569 for (size_t j = 0; j < read_args.size(); ++j) { 570 if (j > 0) o_ << ","; 571 generate_expression(read_args[j],o_); 573 if (read_args.size() > 0) 579 for (size_t i = dims.size(); i > 0; --i) { 580 generate_indent(i + 1, o_); 586 void generate_local_var_inits(std::vector<var_decl> vs, 591 << "stan::io::reader<" 592 << (is_var ? "var" : "double") 593 << "> in__(params_r__,params_i__);" << EOL2; 594 init_local_var_visgen vis(declare_vars,is_var,o); 595 for (size_t i = 0; i < vs.size(); ++i) 596 boost::apply_visitor(vis, vs[i].decl_); 602 void generate_public_decl(std::ostream& o) { 603 o << "public:" << EOL; 606 void generate_private_decl(std::ostream& o) { 607 o << "private:" << EOL; 611 struct validate_var_decl_visgen : public visgen { 613 validate_var_decl_visgen(int indents, 618 void generate_begin_for_dims(const std::vector<expression>& dims) 621 for (size_t i = 0; i < dims.size(); ++i) { 622 generate_indent(indents_+i,o_); 623 o_ << "for (int k" << i << "__ = 0;" 624 << " k" << i << "__ < "; 625 generate_expression(dims[i].expr_,o_); 627 o_ << " ++k" << i << "__) {" << EOL; 630 void generate_end_for_dims(size_t dims_size) const { 631 for (size_t i = 0; i < dims_size; ++i) { 632 generate_indent(indents_ + dims_size - i - 1, o_); 637 void generate_loop_var(const std::string& name, 638 size_t dims_size) const { 640 for (size_t i = 0; i < dims_size; ++i) 641 o_ << "[k" << i << "__]"; 643 void operator()(nil const& x) const { } 644 template <typename T> 645 void basic_validate(T const& x) const { 646 if (!(x.range_.has_low() || x.range_.has_high())) 647 return; // unconstrained 648 generate_begin_for_dims(x.dims_); 649 generate_indent(indents_ + x.dims_.size(),o_); 650 o_ << "try { " << EOL; 651 if (x.range_.has_low()) { 652 generate_indent(indents_ + 1 + x.dims_.size(),o_); 653 o_ << "check_greater_or_equal(function__,"; 654 generate_loop_var(x.name_,x.dims_.size()); 656 generate_expression(x.range_.low_.expr_,o_); 658 generate_loop_var(x.name_,x.dims_.size()); 661 if (x.range_.has_high()) { 662 generate_indent(indents_ + 1 + x.dims_.size(),o_); 663 o_ << "check_less_or_equal(function__,"; 664 generate_loop_var(x.name_,x.dims_.size()); 666 generate_expression(x.range_.high_.expr_,o_); 668 generate_loop_var(x.name_,x.dims_.size()); 671 generate_indent(indents_ + x.dims_.size(),o_); 672 o_ << "} catch (std::domain_error& e) { throw std::domain_error(std::string(\"Invalid value of " << x.name_ << ": \") + std::string(e.what())); };" << EOL; 673 generate_end_for_dims(x.dims_.size()); 675 void operator()(int_var_decl const& x) const { 678 void operator()(double_var_decl const& x) const { 681 void operator()(vector_var_decl const& x) const { 684 void operator()(row_vector_var_decl const& x) const { 687 void operator()(matrix_var_decl const& x) const { 690 template <typename T> 691 void nonbasic_validate(const T& x, 692 const std::string& type_name) const { 693 generate_begin_for_dims(x.dims_); 694 generate_indent(indents_ + x.dims_.size(),o_); 695 o_ << "try { stan::math::check_" << type_name << "(function__,"; 696 generate_loop_var(x.name_,x.dims_.size()); 698 generate_loop_var(x.name_,x.dims_.size()); 699 o_ << "\"); } catch (std::domain_error& e) { throw std::domain_error(std::string(\"Invalid value of " << x.name_ << ": \") + std::string(e.what())); };" << EOL; 700 generate_end_for_dims(x.dims_.size()); 702 void operator()(simplex_var_decl const& x) const { 703 nonbasic_validate(x,"simplex"); 705 void operator()(ordered_var_decl const& x) const { 706 nonbasic_validate(x,"ordered"); 708 void operator()(positive_ordered_var_decl const& x) const { 709 nonbasic_validate(x,"positive_ordered"); 711 void operator()(corr_matrix_var_decl const& x) const { 712 nonbasic_validate(x,"corr_matrix"); 714 void operator()(cov_matrix_var_decl const& x) const { 715 nonbasic_validate(x,"cov_matrix"); 720 void generate_validate_var_decl(const var_decl& decl, 723 validate_var_decl_visgen vis(indent,o); 724 boost::apply_visitor(vis,decl.decl_); 727 void generate_validate_var_decls(const std::vector<var_decl> decls, 730 for (size_t i = 0; i < decls.size(); ++i) 731 generate_validate_var_decl(decls[i],indent,o); 734 // see _var_decl_visgen cut & paste 735 struct member_var_decl_visgen : public visgen { 737 member_var_decl_visgen(int indents, 742 void operator()(nil const& x) const { } 743 void operator()(int_var_decl const& x) const { 744 declare_array("int",x.name_,x.dims_.size()); 746 void operator()(double_var_decl const& x) const { 747 declare_array("double",x.name_,x.dims_.size()); 749 void operator()(simplex_var_decl const& x) const { 750 declare_array(("vector_d"), x.name_, x.dims_.size()); 752 void operator()(ordered_var_decl const& x) const { 753 declare_array(("vector_d"), x.name_, x.dims_.size()); 755 void operator()(positive_ordered_var_decl const& x) const { 756 declare_array(("vector_d"), x.name_, x.dims_.size()); 758 void operator()(cov_matrix_var_decl const& x) const { 759 declare_array(("matrix_d"), x.name_, x.dims_.size()); 761 void operator()(corr_matrix_var_decl const& x) const { 762 declare_array(("matrix_d"), x.name_, x.dims_.size()); 764 void operator()(vector_var_decl const& x) const { 765 declare_array(("vector_d"), x.name_, x.dims_.size()); 767 void operator()(row_vector_var_decl const& x) const { 768 declare_array(("row_vector_d"), x.name_, x.dims_.size()); 770 void operator()(matrix_var_decl const& x) const { 771 declare_array(("matrix_d"), x.name_, x.dims_.size()); 773 void declare_array(std::string const& type, std::string const& name, 775 for (int i = 0; i < indents_; ++i) 777 for (size_t i = 0; i < size; ++i) { 784 for (size_t i = 1; i < size; ++i) { 787 o_ << " " << name << ";" << EOL; 791 void generate_member_var_decls(const std::vector<var_decl>& vs, 794 member_var_decl_visgen vis(indent,o); 795 for (size_t i = 0; i < vs.size(); ++i) 796 boost::apply_visitor(vis,vs[i].decl_); 799 // see member_var_decl_visgen cut & paste 800 struct local_var_decl_visgen : public visgen { 803 local_var_decl_visgen(int indents, 810 void operator()(nil const& x) const { } 811 void operator()(int_var_decl const& x) const { 812 std::vector<expression> ctor_args; 813 declare_array("int",ctor_args,x.name_,x.dims_); 815 void operator()(double_var_decl const& x) const { 816 std::vector<expression> ctor_args; 817 declare_array(is_var_ ? "var" : "double", 818 ctor_args,x.name_,x.dims_); 820 void operator()(vector_var_decl const& x) const { 821 std::vector<expression> ctor_args; 822 ctor_args.push_back(x.M_); 823 declare_array(is_var_ ? "vector_v" : "vector_d", 824 ctor_args, x.name_, x.dims_); 826 void operator()(row_vector_var_decl const& x) const { 827 std::vector<expression> ctor_args; 828 ctor_args.push_back(x.N_); 829 declare_array(is_var_ ? "row_vector_v" : "row_vector_d", 830 ctor_args, x.name_, x.dims_); 832 void operator()(matrix_var_decl const& x) const { 833 std::vector<expression> ctor_args; 834 ctor_args.push_back(x.M_); 835 ctor_args.push_back(x.N_); 836 declare_array(is_var_ ? "matrix_v" : "matrix_d", 837 ctor_args, x.name_, x.dims_); 839 void operator()(simplex_var_decl const& x) const { 840 std::vector<expression> ctor_args; 841 ctor_args.push_back(x.K_); 842 declare_array(is_var_ ? "vector_v" : "vector_d", 843 ctor_args, x.name_, x.dims_); 845 void operator()(ordered_var_decl const& x) const { 846 std::vector<expression> ctor_args; 847 ctor_args.push_back(x.K_); 848 declare_array(is_var_ ? "vector_v" : "vector_d", 849 ctor_args, x.name_, x.dims_); 851 void operator()(positive_ordered_var_decl const& x) const { 852 std::vector<expression> ctor_args; 853 ctor_args.push_back(x.K_); 854 declare_array(is_var_ ? "vector_v" : "vector_d", 855 ctor_args, x.name_, x.dims_); 857 void operator()(cov_matrix_var_decl const& x) const { 858 std::vector<expression> ctor_args; 859 ctor_args.push_back(x.K_); 860 ctor_args.push_back(x.K_); 861 declare_array(is_var_ ? "matrix_v" : "matrix_d", 862 ctor_args, x.name_, x.dims_); 864 void operator()(corr_matrix_var_decl const& x) const { 865 std::vector<expression> ctor_args; 866 ctor_args.push_back(x.K_); 867 ctor_args.push_back(x.K_); 868 declare_array(is_var_ ? "matrix_v" : "matrix_d", 869 ctor_args, x.name_, x.dims_); 871 void generate_type(const std::string& type, 872 size_t num_dims) const { 873 for (size_t i = 0; i < num_dims; ++i) 876 for (size_t i = 0; i < num_dims; ++i) { 877 if (i > 0) o_ << " "; 881 // var_decl -> type[0] name init_args[0] ; 882 // init_args[k] -> ctor_args if no dims left 883 // init_args[k] -> ( dim[k] , ( type[k+1] init_args[k+1] ) ) 884 void generate_init_args(const std::string& type, 885 const std::vector<expression>& ctor_args, 886 const std::vector<expression>& dims, 888 if (dim < dims.size()) { // more dims left 889 o_ << '(
'; // open(1) 890 generate_expression(dims[dim],o_); 891 if ((dim + 1 < dims.size()) || ctor_args.size() > 0) { 892 o_ << ", ("; // open(2) 893 generate_type(type,dims.size() - dim - 1); 894 generate_init_args(type,ctor_args,dims,dim + 1); 895 o_ << ')
'; // close(2) 897 o_ << ')
'; // close(1) 899 if (ctor_args.size() == 1) {// vector 901 generate_expression(ctor_args[0],o_); 904 if (ctor_args.size() > 1) { // matrix 906 generate_expression(ctor_args[0],o_); 908 generate_expression(ctor_args[1],o_); 913 void declare_array(const std::string& type, 914 const std::vector<expression>& ctor_args, 915 const std::string& name, 916 const std::vector<expression>& dims) const { 918 // require double parens to counter "most vexing parse" problem 920 generate_indent(indents_,o_); 921 generate_type(type,dims.size()); 923 generate_init_args(type,ctor_args,dims,0); 928 void generate_local_var_decls(const std::vector<var_decl>& vs, 932 local_var_decl_visgen vis(indent,is_var,o); 933 for (size_t i = 0; i < vs.size(); ++i) 934 boost::apply_visitor(vis,vs[i].decl_); 937 // see member_var_decl_visgen cut & paste 938 struct generate_init_vars_visgen : public visgen { 940 generate_init_vars_visgen(int indent, 945 void operator()(nil const& x) const { } 946 void operator()(int_var_decl const& x) const { 947 generate_indent(indent_,o_); 948 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 950 void operator()(double_var_decl const& x) const { 951 generate_indent(indent_,o_); 952 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 954 void operator()(vector_var_decl const& x) const { 955 generate_indent(indent_,o_); 956 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 958 void operator()(row_vector_var_decl const& x) const { 959 generate_indent(indent_,o_); 960 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 962 void operator()(matrix_var_decl const& x) const { 963 generate_indent(indent_,o_); 964 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 966 void operator()(simplex_var_decl const& x) const { 967 generate_indent(indent_,o_); 968 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 970 void operator()(ordered_var_decl const& x) const { 971 generate_indent(indent_,o_); 972 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 974 void operator()(positive_ordered_var_decl const& x) const { 975 generate_indent(indent_,o_); 976 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 978 void operator()(cov_matrix_var_decl const& x) const { 979 generate_indent(indent_,o_); 980 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 982 void operator()(corr_matrix_var_decl const& x) const { 983 generate_indent(indent_,o_); 984 o_ << "initialize_variable(" << x.name_ << ",INIT_DUMMY__);" << EOL; 988 void generate_init_vars(const std::vector<var_decl>& vs, 991 generate_init_vars_visgen vis(indent,o); 993 generate_comment("initialized transformed params to avoid seg fault on val access", 995 generate_indent(indent,o); 996 o << "var INIT_DUMMY__(std::numeric_limits<double>::quiet_NaN());" << EOL; 997 for (size_t i = 0; i < vs.size(); ++i) 998 boost::apply_visitor(vis,vs[i].decl_); 1002 struct validate_transformed_params_visgen : public visgen { 1004 validate_transformed_params_visgen(int indents, 1009 void operator()(nil const& x) const { } 1010 void operator()(int_var_decl const& x) const { 1011 std::vector<expression> dims(x.dims_); 1012 validate_array(x.name_,dims,0); 1014 void operator()(double_var_decl const& x) const { 1015 std::vector<expression> dims(x.dims_); 1016 validate_array(x.name_,dims,0); 1018 void operator()(vector_var_decl const& x) const { 1019 std::vector<expression> dims(x.dims_); 1020 dims.push_back(x.M_); 1021 validate_array(x.name_,dims,1); 1023 void operator()(simplex_var_decl const& x) const { 1024 std::vector<expression> dims(x.dims_); 1025 dims.push_back(x.K_); 1026 validate_array(x.name_,dims,1); 1028 void operator()(ordered_var_decl const& x) const { 1029 std::vector<expression> dims(x.dims_); 1030 dims.push_back(x.K_); 1031 validate_array(x.name_,dims,1); 1033 void operator()(positive_ordered_var_decl const& x) const { 1034 std::vector<expression> dims(x.dims_); 1035 dims.push_back(x.K_); 1036 validate_array(x.name_,dims,1); 1038 void operator()(row_vector_var_decl const& x) const { 1039 std::vector<expression> dims(x.dims_); 1040 dims.push_back(x.N_); 1041 validate_array(x.name_,dims,1); 1043 void operator()(matrix_var_decl const& x) const { 1044 std::vector<expression> dims(x.dims_); 1045 dims.push_back(x.M_); 1046 dims.push_back(x.N_); 1047 validate_array(x.name_,dims,2); 1049 void operator()(cov_matrix_var_decl const& x) const { 1050 std::vector<expression> dims(x.dims_); 1051 dims.push_back(x.K_); 1052 dims.push_back(x.K_); 1053 validate_array(x.name_,dims,2); 1055 void operator()(corr_matrix_var_decl const& x) const { 1056 std::vector<expression> dims(x.dims_); 1057 dims.push_back(x.K_); 1058 dims.push_back(x.K_); 1059 validate_array(x.name_,dims,2); 1061 void validate_array(const std::string& name, 1062 const std::vector<expression>& dims, 1063 size_t matrix_dims) const { 1065 size_t non_matrix_dims = dims.size() - matrix_dims; 1067 for (size_t k = 0; k < dims.size(); ++k) { 1068 generate_indent(indents_ + k,o_); 1069 o_ << "for (int i" << k << "__ = 0; i" << k << "__ < "; 1070 generate_expression(dims[k],o_); 1071 o_ << "; ++i" << k << "__) {" << EOL; 1074 generate_indent(indents_ + dims.size(), o_); 1075 o_ << "if (" << name; 1076 for (size_t k = 0; k < non_matrix_dims; ++k) 1077 o_ << "[i" << k << "__]"; 1078 if (matrix_dims > 0) { 1079 o_ << "(i" << non_matrix_dims << "__"; 1080 if (matrix_dims > 1) 1081 o_ << ",i" << (non_matrix_dims + 1) << "__"; 1084 o_ << ".is_uninitialized()) {" << EOL; 1085 generate_indent(indents_ + dims.size() + 1, o_); 1086 o_ << "std::stringstream msg__;" << EOL; 1087 generate_indent(indents_ + dims.size() + 1, o_); 1088 o_ << "msg__ << \"Undefined transformed parameter: " 1090 for (size_t k = 0; k < dims.size(); ++k) { 1092 o_ << " << i" << k << "__"; 1096 generate_indent(indents_ + dims.size() + 1, o_); 1097 o_ << "throw std::runtime_error(msg__.str());" << EOL; 1099 generate_indent(indents_ + dims.size(), o_); 1101 for (size_t k = 0; k < dims.size(); ++k) { 1102 generate_indent(indents_ + dims.size() - k - 1, o_); 1108 void generate_validate_transformed_params(const std::vector<var_decl>& vs, 1111 generate_comment("validate transformed parameters",indent,o); 1112 validate_transformed_params_visgen vis(indent,o); 1113 for (size_t i = 0; i < vs.size(); ++i) 1114 boost::apply_visitor(vis,vs[i].decl_); 1118 void generate_statement(statement const& s, int indent, std::ostream& o, 1119 bool include_sampling, bool is_var); 1121 struct statement_visgen : public visgen { 1123 bool include_sampling_; 1125 statement_visgen(size_t indent, 1126 bool include_sampling, 1131 include_sampling_(include_sampling), 1134 void operator()(nil const& x) const { 1136 void operator()(assignment const& x) const { 1137 generate_indent(indent_,o_); 1139 generate_indexed_expr(x.var_dims_.name_, 1141 x.var_type_.base_type_, 1142 x.var_type_.dims_.size(), 1145 generate_expression(x.expr_,o_); 1148 void operator()(sample const& x) const { 1149 if (!include_sampling_) return; 1150 generate_indent(indent_,o_); 1151 // FOO_log<true> is the log FOO distribution up to a proportion 1152 o_ << "lp__ += stan::prob::" << x.dist_.family_ << "_log<true>("; 1153 generate_expression(x.expr_,o_); 1154 for (size_t i = 0; i < x.dist_.args_.size(); ++i) { 1156 generate_expression(x.dist_.args_[i],o_); 1159 // generate bounds test 1160 if (x.truncation_.has_low()) { 1161 generate_indent(indent_,o_); 1163 generate_expression(x.expr_,o_); 1165 generate_expression(x.truncation_.low_.expr_,o_); // low 1167 o_ << ") lp__ -= std::numeric_limits<double>::infinity();" << EOL; 1169 if (x.truncation_.has_high()) { 1170 generate_indent(indent_,o_); 1171 if (x.truncation_.has_low()) o_ << "else "; 1173 generate_expression(x.expr_,o_); 1175 generate_expression(x.truncation_.high_.expr_,o_); // low 1177 o_ << ") lp__ -= std::numeric_limits<double>::infinity();" << EOL; 1179 if (x.truncation_.has_low() || x.truncation_.has_high()) { 1180 generate_indent(indent_,o_); 1183 // generate log denominator 1184 if (x.truncation_.has_low() && x.truncation_.has_high()) { 1185 o_ << "lp__ -= log("; 1186 o_ << x.dist_.family_ << "_cdf("; 1187 generate_expression(x.truncation_.high_.expr_,o_); 1188 for (size_t i = 0; i < x.dist_.args_.size(); ++i) { 1190 generate_expression(x.dist_.args_[i],o_); 1192 o_ << ") - " << x.dist_.family_ << "_cdf("; 1193 generate_expression(x.truncation_.low_.expr_,o_); 1194 for (size_t i = 0; i < x.dist_.args_.size(); ++i) { 1196 generate_expression(x.dist_.args_[i],o_); 1199 } else if (!x.truncation_.has_low() && x.truncation_.has_high()) { 1200 o_ << "lp__ -= log("; 1201 o_ << x.dist_.family_ << "_cdf("; 1202 generate_expression(x.truncation_.high_.expr_,o_); 1203 for (size_t i = 0; i < x.dist_.args_.size(); ++i) { 1205 generate_expression(x.dist_.args_[i],o_); 1208 } else if (x.truncation_.has_low() && !x.truncation_.has_high()) { 1209 o_ << "lp__ -= log1m("; 1210 o_ << x.dist_.family_ << "_cdf("; 1211 generate_expression(x.truncation_.low_.expr_,o_); 1212 for (size_t i = 0; i < x.dist_.args_.size(); ++i) { 1214 generate_expression(x.dist_.args_[i],o_); 1219 void operator()(const statements& x) const { 1220 bool has_local_vars = x.local_decl_.size() > 0; 1221 size_t indent = has_local_vars ? (indent_ + 1) : indent_; 1222 if (has_local_vars) { 1223 generate_indent(indent_,o_); 1224 o_ << "{" << EOL; // need brackets for scope 1225 generate_local_var_decls(x.local_decl_,indent,o_,is_var_); 1228 for (size_t i = 0; i < x.statements_.size(); ++i) 1229 generate_statement(x.statements_[i],indent,o_,include_sampling_,is_var_); 1231 if (has_local_vars) { 1232 generate_indent(indent_,o_); 1236 void operator()(const print_statement& ps) const { 1237 generate_indent(indent_,o_); 1238 o_ << "if (pstream__) {" << EOL; 1239 for (size_t i = 0; i < ps.printables_.size(); ++i) { 1240 generate_indent(indent_ + 1,o_); 1241 o_ << "stan_print(pstream__,"; 1242 generate_printable(ps.printables_[i],o_); 1245 generate_indent(indent_ + 1,o_); 1246 o_ << "*pstream__ << std::endl;" << EOL; 1247 generate_indent(indent_,o_); 1250 void operator()(const for_statement& x) const { 1251 generate_indent(indent_,o_); 1252 o_ << "for (int " << x.variable_ << " = "; 1253 generate_expression(x.range_.low_,o_); 1254 o_ << "; " << x.variable_ << " <= "; 1255 generate_expression(x.range_.high_,o_); 1256 o_ << "; ++" << x.variable_ << ") {" << EOL; 1257 generate_statement(x.statement_, indent_ + 1, o_, include_sampling_,is_var_); 1258 generate_indent(indent_,o_); 1261 void operator()(const while_statement& x) const { 1262 generate_indent(indent_,o_); 1263 o_ << "while (as_bool("; 1264 generate_expression(x.condition_,o_); 1265 o_ << ")) {" << EOL; 1266 generate_statement(x.body_, indent_+1, o_, include_sampling_,is_var_); 1267 generate_indent(indent_,o_); 1270 void operator()(const conditional_statement& x) const { 1271 for (size_t i = 0; i < x.conditions_.size(); ++i) { 1273 generate_indent(indent_,o_); 1276 o_ << "if (as_bool("; 1277 generate_expression(x.conditions_[i],o_); 1278 o_ << ")) {" << EOL; 1279 generate_statement(x.bodies_[i], indent_ + 1, 1280 o_, include_sampling_,is_var_); 1281 generate_indent(indent_,o_); 1284 if (x.bodies_.size() > x.conditions_.size()) { 1285 o_ << " else {" << EOL; 1286 generate_statement(x.bodies_[x.bodies_.size()-1], indent_ + 1, 1287 o_, include_sampling_, is_var_); 1288 generate_indent(indent_,o_); 1293 void operator()(const no_op_statement& x) const { 1294 // called no_op for a reason 1298 void generate_statement(const statement& s, 1301 bool include_sampling, 1303 statement_visgen vis(indent,include_sampling,is_var,o); 1304 boost::apply_visitor(vis,s.statement_); 1307 void generate_statements(const std::vector<statement>& ss, 1310 bool include_sampling, 1312 statement_visgen vis(indent,include_sampling,is_var,o); 1313 for (size_t i = 0; i < ss.size(); ++i) 1314 boost::apply_visitor(vis,ss[i].statement_); 1318 void generate_log_prob(program const& p, 1321 o << INDENT << "var log_prob(vector<var>& params_r__," << EOL; 1322 o << INDENT << " vector<int>& params_i__," << EOL; 1323 o << INDENT << " std::ostream* pstream__ = 0) {" << EOL2; 1324 o << INDENT2 << "var lp__(0.0);" << EOL2; 1328 generate_comment("model parameters",2,o); 1329 generate_local_var_inits(p.parameter_decl_,is_var,true,o); 1332 generate_comment("transformed parameters",2,o); 1333 generate_local_var_decls(p.derived_decl_.first,2,o,is_var); 1334 generate_init_vars(p.derived_decl_.first,2,o); 1337 bool include_sampling = true; 1338 generate_statements(p.derived_decl_.second,2,o,include_sampling,is_var); 1341 generate_validate_transformed_params(p.derived_decl_.first,2,o); 1343 << "const char* function__ = \"validate transformed params\";" 1346 << "(void) function__; // dummy to suppress unused var warning" 1349 generate_validate_var_decls(p.derived_decl_.first,2,o); 1351 generate_comment("model body",2,o); 1352 generate_statement(p.statement_,2,o,include_sampling,is_var); 1354 o << INDENT2 << "return lp__;" << EOL2; 1355 o << INDENT << "} // log_prob(...var...)" << EOL2; 1358 // **************** double-based ************************** 1359 // **************** cut-and-paste ************************* 1360 // doesn't yet work because of <true> in probability generation
1410 std::vector<expression> dims = x.
dims_;
1411 var_size_validator_(x);
1413 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << x.
name_ <<
"\");" <<
EOL;
1415 size_t indentation = 1;
1416 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1417 size_t dim = dims.size() - dim_up - 1U;
1420 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1424 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" 1425 << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim
1426 <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1430 for (
size_t dim = 0; dim < dims.size(); ++dim)
1431 o_ <<
"[i_" << dim <<
"__]";
1432 o_ <<
" = vals_i__[pos__++];" <<
EOL;
1433 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1440 std::vector<expression> dims = x.
dims_;
1441 var_size_validator_(x);
1443 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1445 size_t indentation = 1;
1446 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1447 size_t dim = dims.size() - dim_up - 1U;
1450 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1454 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1458 for (
size_t dim = 0; dim < dims.size(); ++dim)
1459 o_ <<
"[i_" << dim <<
"__]";
1460 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1461 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1468 std::vector<expression> dims = x.
dims_;
1470 var_size_validator_(x);
1471 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1473 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1476 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1477 size_t indentation = 2;
1478 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1479 size_t dim = dims.size() - dim_up - 1U;
1482 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1486 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1490 for (
size_t dim = 0; dim < dims.size(); ++dim)
1491 o_ <<
"[i_" << dim <<
"__]";
1493 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1494 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1502 std::vector<expression> dims = x.
dims_;
1503 var_size_validator_(x);
1505 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1507 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1510 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1511 size_t indentation = 2;
1512 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1513 size_t dim = dims.size() - dim_up - 1U;
1516 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1520 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1524 for (
size_t dim = 0; dim < dims.size(); ++dim)
1525 o_ <<
"[i_" << dim <<
"__]";
1527 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1528 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1536 std::vector<expression> dims = x.
dims_;
1537 var_size_validator_(x);
1539 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1541 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1544 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1545 size_t indentation = 2;
1546 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1547 size_t dim = dims.size() - dim_up - 1U;
1550 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1554 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1558 for (
size_t dim = 0; dim < dims.size(); ++dim)
1559 o_ <<
"[i_" << dim <<
"__]";
1561 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1562 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1570 std::vector<expression> dims = x.
dims_;
1571 var_size_validator_(x);
1573 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1575 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1578 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1579 size_t indentation = 2;
1580 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1581 size_t dim = dims.size() - dim_up - 1U;
1584 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1588 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1592 for (
size_t dim = 0; dim < dims.size(); ++dim)
1593 o_ <<
"[i_" << dim <<
"__]";
1595 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1596 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1604 std::vector<expression> dims = x.
dims_;
1605 var_size_validator_(x);
1607 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1609 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1612 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1613 size_t indentation = 2;
1614 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1615 size_t dim = dims.size() - dim_up - 1U;
1618 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1622 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1626 for (
size_t dim = 0; dim < dims.size(); ++dim)
1627 o_ <<
"[i_" << dim <<
"__]";
1629 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1630 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1638 std::vector<expression> dims = x.
dims_;
1639 var_size_validator_(x);
1641 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1643 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_m_mat_lim__ = ";
1646 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_n_mat_lim__ = ";
1649 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_n_mat_lim__; ++n_mat__) {" <<
EOL;
1650 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_m_mat_lim__; ++m_mat__) {" <<
EOL;
1651 size_t indentation = 3;
1652 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1653 size_t dim = dims.size() - dim_up - 1U;
1656 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1660 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1664 for (
size_t dim = 0; dim < dims.size(); ++dim)
1665 o_ <<
"[i_" << dim <<
"__]";
1666 o_ <<
"(m_mat__,n_mat__)";
1667 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1668 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1676 std::vector<expression> dims = x.
dims_;
1677 var_size_validator_(x);
1679 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1681 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_k_mat_lim__ = ";
1684 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
1685 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
1686 size_t indentation = 3;
1687 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1688 size_t dim = dims.size() - dim_up - 1U;
1691 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1695 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1699 for (
size_t dim = 0; dim < dims.size(); ++dim)
1700 o_ <<
"[i_" << dim <<
"__]";
1701 o_ <<
"(m_mat__,n_mat__)";
1702 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1703 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1711 std::vector<expression> dims = x.
dims_;
1712 var_size_validator_(x);
1714 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1716 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_k_mat_lim__ = ";
1719 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
1720 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
1721 size_t indentation = 3;
1722 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1723 size_t dim = dims.size() - dim_up - 1U;
1726 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1730 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1734 for (
size_t dim = 0; dim < dims.size(); ++dim)
1735 o_ <<
"[i_" << dim <<
"__]";
1736 o_ <<
"(m_mat__,n_mat__)";
1737 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1738 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1748 const std::string& var_name,
1750 o << indent <<
"(void) " 1752 <<
" // dummy call to supress warning" 1759 for (
size_t i = 0; i < vs.size(); ++i)
1760 boost::apply_visitor(vis, vs[i].decl_);
1764 const std::string& model_name,
1766 o <<
INDENT << model_name <<
"(stan::io::var_context& context__," <<
EOL;
1767 o <<
INDENT <<
" std::ostream* pstream__ = 0)" 1769 o <<
INDENT2 <<
": prob_grad_ad::prob_grad_ad(0) {" 1771 o <<
INDENT2 <<
"static const char* function__ = \"" 1772 << model_name <<
"_namespace::" << model_name <<
"(%1%)\";" <<
EOL;
1776 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
1777 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
1786 bool include_sampling =
false;
1787 bool is_var =
false;
1790 2,o,include_sampling,is_var);
1803 var_size_validator_(o,
"initialization") {
1808 var_size_validator_(x);
1811 generate_write_loop(
"integer(",x.
name_,x.
dims_);
1813 template <
typename D>
1816 std::stringstream ss;
1819 ss <<
"_lub_unconstrain(";
1825 ss <<
"_lb_unconstrain(";
1829 ss <<
"_ub_unconstrain(";
1833 ss <<
"_unconstrain(";
1839 generate_check_double(x.
name_,x.
dims_.size());
1840 var_size_validator_(x);
1841 generate_declaration(x.
name_,
"double",x.
dims_);
1843 generate_write_loop(function_args(
"scalar",x),
1847 generate_check_double(x.
name_,x.
dims_.size() + 1);
1848 var_size_validator_(x);
1851 generate_write_loop(function_args(
"vector",x),
1855 generate_check_double(x.
name_,x.
dims_.size() + 1);
1856 var_size_validator_(x);
1857 generate_declaration(x.
name_,
"row_vector_d",x.
dims_,x.
N_);
1859 generate_write_loop(function_args(
"row_vector",x),
1863 generate_check_double(x.
name_,x.
dims_.size() + 2);
1864 var_size_validator_(x);
1867 generate_write_loop(function_args(
"matrix",x),
1871 generate_check_double(x.
name_,x.
dims_.size() + 1);
1872 var_size_validator_(x);
1875 generate_write_loop(
"simplex_unconstrain(",x.
name_,x.
dims_);
1878 generate_check_double(x.
name_,x.
dims_.size() + 1);
1879 var_size_validator_(x);
1882 generate_write_loop(
"ordered_unconstrain(",x.
name_,x.
dims_);
1885 generate_check_double(x.
name_,x.
dims_.size() + 1);
1886 var_size_validator_(x);
1889 generate_write_loop(
"positive_ordered_unconstrain(",x.
name_,x.
dims_);
1892 generate_check_double(x.
name_,x.
dims_.size() + 2);
1893 var_size_validator_(x);
1896 generate_write_loop(
"cov_matrix_unconstrain(",x.
name_,x.
dims_);
1899 generate_check_double(x.
name_,x.
dims_.size() + 2);
1900 var_size_validator_(x);
1903 generate_write_loop(
"corr_matrix_unconstrain(",x.
name_,x.
dims_);
1906 const std::string& var_name,
1907 const std::vector<expression>& dims)
const {
1908 generate_dims_loop_fwd(dims);
1909 o_ <<
"writer__." << write_method_name;
1910 generate_name_dims(var_name,dims.size());
1914 size_t num_dims)
const {
1916 for (
size_t i = 0; i < num_dims; ++i)
1917 o_ <<
"[i" << i <<
"__]";
1920 const std::string& base_type,
1921 const std::vector<expression>& dims,
1931 const std::vector<expression>& dims,
1939 const std::string& name,
1940 const std::vector<expression>& dims,
1943 int indent = 2U)
const {
1944 size_t size = dims.size();
1947 int extra_indent = is_matrix ? 2U :
is_vector ? 1U : 0U;
1950 o_ <<
"for (int j2__ = 0U; j2__ < ";
1952 o_ <<
"; ++j2__)" <<
EOL;
1955 o_ <<
"for (int j1__ = 0U; j1__ < ";
1957 o_ <<
"; ++j1__)" <<
EOL;
1960 o_ <<
"for (int j1__ = 0U; j1__ < ";
1962 o_ <<
"; ++j1__)" <<
EOL;
1964 for (
size_t i = 0; i < size; ++i) {
1965 size_t idx = size - i - 1;
1967 o_ <<
"for (int i" << idx <<
"__ = 0U; i" << idx <<
"__ < ";
1969 o_ <<
"; ++i" << idx <<
"__)" <<
EOL;
1971 generate_indent_num_dims(2U,dims,dim1,dim2);
1973 for (
size_t i = 0; i < dims.size(); ++i)
1974 o_ <<
"[i" << i <<
"__]";
1976 o_ <<
"(j1__,j2__)";
1979 o_ <<
" = vals_" << base_type <<
"__[pos__++];" <<
EOL;
1982 int indent = 2U)
const {
1983 size_t size = dims.size();
1984 for (
size_t i = 0; i < size; ++i) {
1986 o_ <<
"for (int i" << i <<
"__ = 0U; i" << i <<
"__ < ";
1988 o_ <<
"; ++i" << i <<
"__)" <<
EOL;
1994 <<
"if (!(context__.contains_i(\"" << name <<
"\")))" 1996 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" <<
EOL;
1997 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << name <<
"\");" <<
EOL;
2002 <<
"if (!(context__.contains_r(\"" << name <<
"\")))" 2004 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" <<
EOL;
2005 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << name <<
"\");" <<
EOL;
2014 o <<
INDENT <<
"void transform_inits(const stan::io::var_context& context__," <<
EOL;
2015 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2016 o <<
INDENT <<
" std::vector<double>& params_r__) {" <<
EOL;
2017 o <<
INDENT2 <<
"params_r__.clear();" <<
EOL;
2018 o <<
INDENT2 <<
"params_i__.clear();" <<
EOL;
2019 o <<
INDENT2 <<
"stan::io::writer<double> writer__(params_r__,params_i__);" <<
EOL;
2021 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
2022 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
2025 for (
size_t i = 0; i < vs.size(); ++i)
2026 boost::apply_visitor(vis, vs[i].decl_);
2028 o <<
INDENT2 <<
"params_r__ = writer__.data_r();" <<
EOL;
2029 o <<
INDENT2 <<
"params_i__ = writer__.data_i();" <<
EOL;
2046 std::vector<expression> matrix_args;
2047 matrix_args.push_back(x.
M_);
2048 generate_dims_array(matrix_args,x.
dims_);
2051 std::vector<expression> matrix_args;
2052 matrix_args.push_back(x.
N_);
2053 generate_dims_array(matrix_args,x.
dims_);
2056 std::vector<expression> matrix_args;
2057 matrix_args.push_back(x.
M_);
2058 matrix_args.push_back(x.
N_);
2059 generate_dims_array(matrix_args,x.
dims_);
2062 std::vector<expression> matrix_args;
2063 matrix_args.push_back(x.
K_);
2064 generate_dims_array(matrix_args,x.
dims_);
2067 std::vector<expression> matrix_args;
2068 matrix_args.push_back(x.
K_);
2069 generate_dims_array(matrix_args,x.
dims_);
2072 std::vector<expression> matrix_args;
2073 matrix_args.push_back(x.
K_);
2074 generate_dims_array(matrix_args,x.
dims_);
2077 std::vector<expression> matrix_args;
2078 matrix_args.push_back(x.
K_);
2079 matrix_args.push_back(x.
K_);
2080 generate_dims_array(matrix_args,x.
dims_);
2083 std::vector<expression> matrix_args;
2084 matrix_args.push_back(x.
K_);
2085 matrix_args.push_back(x.
K_);
2086 generate_dims_array(matrix_args,x.
dims_);
2090 const std::vector<expression>& array_dims_exprs)
2094 for (
size_t i = 0; i < array_dims_exprs.size(); ++i) {
2095 o_ <<
INDENT2 <<
"dims__.push_back(";
2100 for (
size_t i = 0; i < matrix_dims_exprs.size(); ++i) {
2101 o_ <<
INDENT2 <<
"dims__.push_back(";
2105 o_ <<
INDENT2 <<
"dimss__.push_back(dims__);" <<
EOL;
2114 <<
"void get_dims(std::vector<std::vector<size_t> >& dimss__) {" 2118 o <<
INDENT2 <<
"std::vector<size_t> dims__;" <<
EOL;
2125 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2126 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2144 generate_param_names(x.
name_);
2147 generate_param_names(x.
name_);
2150 generate_param_names(x.
name_);
2153 generate_param_names(x.
name_);
2156 generate_param_names(x.
name_);
2159 generate_param_names(x.
name_);
2162 generate_param_names(x.
name_);
2165 generate_param_names(x.
name_);
2168 generate_param_names(x.
name_);
2171 generate_param_names(x.
name_);
2176 <<
"names__.push_back(\"" << name <<
"\");" 2186 <<
"void get_param_names(std::vector<std::string>& names__) {" 2190 <<
"names__.resize(0);" 2198 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2199 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2224 std::vector<expression> matrix_args;
2225 matrix_args.push_back(x.
M_);
2226 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2229 std::vector<expression> matrix_args;
2230 matrix_args.push_back(x.
N_);
2231 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2234 std::vector<expression> matrix_args;
2235 matrix_args.push_back(x.
M_);
2236 matrix_args.push_back(x.
N_);
2237 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2240 std::vector<expression> matrix_args;
2241 matrix_args.push_back(x.
K_);
2242 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2245 std::vector<expression> matrix_args;
2246 matrix_args.push_back(x.
K_);
2247 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2250 std::vector<expression> matrix_args;
2251 matrix_args.push_back(x.
K_);
2252 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2255 std::vector<expression> matrix_args;
2256 matrix_args.push_back(x.
K_);
2257 matrix_args.push_back(x.
K_);
2258 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2261 std::vector<expression> matrix_args;
2262 matrix_args.push_back(x.
K_);
2263 matrix_args.push_back(x.
K_);
2264 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2268 const std::string& name,
2269 const std::vector<expression>& dims)
const {
2272 std::vector<expression> combo_dims(dims);
2273 for (
size_t i = 0; i < matrix_dims.size(); ++i)
2274 combo_dims.push_back(matrix_dims[i]);
2276 for (
size_t i = 0; i < combo_dims.size(); ++i) {
2278 o_ <<
"for (int k_" << i <<
"__ = 1;" 2279 <<
" k_" << i <<
"__ <= ";
2281 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2286 o_ <<
"writer__.comma();" <<
EOL;
2289 o_ <<
"o__ << \"" << name <<
'"';
2290 for (
size_t i = 0; i < combo_dims.size(); ++i)
2291 o_ <<
" << '.' << k_" << i <<
"__";
2295 for (
size_t i = 0; i < combo_dims.size(); ++i) {
2306 o <<
EOL <<
INDENT <<
"void write_csv_header(std::ostream& o__) {" <<
EOL;
2307 o <<
INDENT2 <<
"stan::io::csv_writer writer__(o__);" <<
EOL;
2314 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2315 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2321 o <<
INDENT2 <<
"writer__.newline();" <<
EOL;
2330 template <
typename D>
2332 const std::string& read_fun_prefix,
2333 const std::vector<expression>& dim_args)
const {
2334 std::vector<expression> read_args;
2335 std::string read_fun(read_fun_prefix);
2338 read_args.push_back(x.range_.low_);
2339 read_args.push_back(x.range_.high_);
2342 read_args.push_back(x.range_.low_);
2345 read_args.push_back(x.range_.high_);
2347 for (
size_t i = 0; i < dim_args.size(); ++i)
2348 read_args.push_back(dim_args[i]);
2349 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
2357 std::vector<expression> read_args;
2358 generate_initialize_array_bounded(x,
"double",
"scalar",read_args);
2361 std::vector<expression> read_args;
2362 read_args.push_back(x.
M_);
2363 generate_initialize_array_bounded(x,
"vector_d",
"vector",read_args);
2366 std::vector<expression> read_args;
2367 read_args.push_back(x.
N_);
2368 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",read_args);
2371 std::vector<expression> read_args;
2372 read_args.push_back(x.
M_);
2373 read_args.push_back(x.
N_);
2374 generate_initialize_array_bounded(x,
"matrix_d",
"matrix",read_args);
2377 std::vector<expression> read_args;
2378 read_args.push_back(x.
K_);
2379 generate_initialize_array(
"vector_d",
"simplex",read_args,x.
name_,x.
dims_);
2382 std::vector<expression> read_args;
2383 read_args.push_back(x.
K_);
2384 generate_initialize_array(
"vector_d",
"ordered",read_args,x.
name_,x.
dims_);
2387 std::vector<expression> read_args;
2388 read_args.push_back(x.
K_);
2389 generate_initialize_array(
"vector_d",
"positive_ordered",read_args,x.
name_,x.
dims_);
2392 std::vector<expression> read_args;
2393 read_args.push_back(x.
K_);
2394 generate_initialize_array(
"matrix_d",
"cov_matrix",read_args,x.
name_,x.
dims_);
2397 std::vector<expression> read_args;
2398 read_args.push_back(x.
K_);
2399 generate_initialize_array(
"matrix_d",
"corr_matrix",read_args,x.
name_,x.
dims_);
2402 const std::string& read_type,
2403 const std::vector<expression>& read_args,
2404 const std::string& name,
2405 const std::vector<expression>& dims)
const {
2406 if (dims.size() == 0) {
2408 o_ << var_type <<
" ";
2409 o_ << name <<
" = in__." << read_type <<
"_constrain(";
2410 for (
size_t j = 0; j < read_args.size(); ++j) {
2411 if (j > 0) o_ <<
",";
2415 o_ <<
INDENT2 <<
"writer__.write(" << name <<
");" <<
EOL;
2419 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"vector<";
2421 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"> ";
2422 o_ << name <<
";" <<
EOL;
2423 std::string name_dims(name);
2424 for (
size_t i = 0; i < dims.size(); ++i) {
2426 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
2429 if (i < dims.size() - 1) {
2431 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);" 2433 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
2436 o_ <<
"for (size_t k_" << i <<
"__ = 0;" 2437 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;" 2438 <<
" ++k_" << i <<
"__) {" <<
EOL;
2439 if (i == dims.size() - 1) {
2441 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
2442 for (
size_t j = 0; j < read_args.size(); ++j) {
2443 if (j > 0) o_ <<
",";
2450 o_ <<
"writer__.write(" << name;
2451 if (dims.size() > 0) {
2453 for (
size_t i = 0; i < dims.size(); ++i) {
2454 if (i > 0) o_ <<
"][";
2455 o_ <<
"k_" << i <<
"__";
2461 for (
size_t i = dims.size(); i > 0; --i) {
2508 const std::vector<expression>& dims)
const {
2509 if (dims.size() == 0) {
2510 o_ <<
INDENT2 <<
"writer__.write(" << name <<
");" <<
EOL;
2513 for (
size_t i = 0; i < dims.size(); ++i) {
2515 o_ <<
"for (int k_" << i <<
"__ = 0;" 2516 <<
" k_" << i <<
"__ < ";
2518 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2522 o_ <<
"writer__.write(" << name;
2523 if (dims.size() > 0) {
2525 for (
size_t i = 0; i < dims.size(); ++i) {
2526 if (i > 0) o_ <<
"][";
2527 o_ <<
"k_" << i <<
"__";
2533 for (
size_t i = dims.size(); i > 0; --i) {
2542 const std::string& model_name,
2544 o <<
INDENT <<
"void write_csv(std::vector<double>& params_r__," <<
EOL;
2545 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2546 o <<
INDENT <<
" std::ostream& o__," <<
EOL;
2547 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
2548 o <<
INDENT2 <<
"stan::io::reader<double> in__(params_r__,params_i__);" 2550 o <<
INDENT2 <<
"stan::io::csv_writer writer__(o__);" <<
EOL;
2551 o <<
INDENT2 <<
"static const char* function__ = \"" 2552 << model_name <<
"_namespace::write_csv(%1%)\";" <<
EOL;
2571 bool is_var =
false;
2574 bool include_sampling =
false;
2582 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
2583 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
2598 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
2602 o <<
INDENT2 <<
"writer__.newline();" <<
EOL;
2618 template <
typename D>
2620 const std::string& read_fun_prefix,
2621 const std::vector<expression>& dim_args)
const {
2622 std::vector<expression> read_args;
2623 std::string read_fun(read_fun_prefix);
2626 read_args.push_back(x.range_.low_);
2627 read_args.push_back(x.range_.high_);
2630 read_args.push_back(x.range_.low_);
2633 read_args.push_back(x.range_.high_);
2635 for (
size_t i = 0; i < dim_args.size(); ++i)
2636 read_args.push_back(dim_args[i]);
2637 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
2641 std::vector<expression> read_args;
2642 generate_initialize_array_bounded(x,
"double",
"scalar",read_args);
2645 std::vector<expression> read_args;
2646 read_args.push_back(x.
M_);
2647 generate_initialize_array_bounded(x,
"vector_d",
"vector",read_args);
2650 std::vector<expression> read_args;
2651 read_args.push_back(x.
N_);
2652 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",read_args);
2655 std::vector<expression> read_args;
2656 read_args.push_back(x.
M_);
2657 read_args.push_back(x.
N_);
2658 generate_initialize_array_bounded(x,
"matrix_d",
"matrix",read_args);
2661 std::vector<expression> read_args;
2662 read_args.push_back(x.
K_);
2663 generate_initialize_array(
"vector_d",
"simplex",read_args,x.
name_,x.
dims_);
2666 std::vector<expression> read_args;
2667 read_args.push_back(x.
K_);
2668 generate_initialize_array(
"vector_d",
"ordered",read_args,x.
name_,x.
dims_);
2671 std::vector<expression> read_args;
2672 read_args.push_back(x.
K_);
2673 generate_initialize_array(
"vector_d",
"positive_ordered",read_args,x.
name_,x.
dims_);
2676 std::vector<expression> read_args;
2677 read_args.push_back(x.
K_);
2678 generate_initialize_array(
"matrix_d",
"cov_matrix",read_args,x.
name_,x.
dims_);
2681 std::vector<expression> read_args;
2682 read_args.push_back(x.
K_);
2683 generate_initialize_array(
"matrix_d",
"corr_matrix",read_args,x.
name_,x.
dims_);
2686 const std::string& read_type,
2687 const std::vector<expression>& read_args,
2688 const std::string& name,
2689 const std::vector<expression>& dims)
const {
2690 if (dims.size() == 0) {
2692 o_ << var_type <<
" ";
2693 o_ << name <<
" = in__." << read_type <<
"_constrain(";
2694 for (
size_t j = 0; j < read_args.size(); ++j) {
2695 if (j > 0) o_ <<
",";
2702 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"vector<";
2704 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"> ";
2705 o_ << name <<
";" <<
EOL;
2706 std::string name_dims(name);
2707 for (
size_t i = 0; i < dims.size(); ++i) {
2709 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
2712 if (i < dims.size() - 1) {
2714 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);" 2716 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
2719 o_ <<
"for (size_t k_" << i <<
"__ = 0;" 2720 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;" 2721 <<
" ++k_" << i <<
"__) {" <<
EOL;
2722 if (i == dims.size() - 1) {
2724 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
2725 for (
size_t j = 0; j < read_args.size(); ++j) {
2726 if (j > 0) o_ <<
",";
2746 for (
size_t i = dims.size(); i > 0; --i) {
2771 std::vector<expression> dims(x.
dims_);
2772 dims.push_back(x.
M_);
2776 std::vector<expression> dims(x.
dims_);
2777 dims.push_back(x.
N_);
2781 std::vector<expression> matdims;
2782 matdims.push_back(x.
M_);
2783 matdims.push_back(x.
N_);
2787 std::vector<expression> dims(x.
dims_);
2788 dims.push_back(x.
K_);
2792 std::vector<expression> dims(x.
dims_);
2793 dims.push_back(x.
K_);
2797 std::vector<expression> dims(x.
dims_);
2798 dims.push_back(x.
K_);
2802 std::vector<expression> matdims;
2803 matdims.push_back(x.
K_);
2804 matdims.push_back(x.
K_);
2808 std::vector<expression> matdims;
2809 matdims.push_back(x.
K_);
2810 matdims.push_back(x.
K_);
2814 const std::vector<expression>& arraydims,
2815 const std::vector<expression>& matdims)
const {
2817 std::vector<expression> dims(arraydims);
2818 for (
size_t i = 0; i < matdims.size(); ++i)
2819 dims.push_back(matdims[i]);
2821 if (dims.size() == 0) {
2822 o_ <<
INDENT2 <<
"vars__.push_back(" << name <<
");" <<
EOL;
2827 for (
size_t i = dims.size(); i > 0; ) {
2830 o_ <<
"for (int k_" << i <<
"__ = 0;" 2831 <<
" k_" << i <<
"__ < ";
2833 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2837 o_ <<
"vars__.push_back(" << name;
2838 if (arraydims.size() > 0) {
2840 for (
size_t i = 0; i < arraydims.size(); ++i) {
2841 if (i > 0) o_ <<
"][";
2842 o_ <<
"k_" << i <<
"__";
2846 if (matdims.size() > 0) {
2847 o_ <<
"(k_" << arraydims.size() <<
"__";
2848 if (matdims.size() > 1)
2849 o_ <<
", k_" << (arraydims.size() + 1) <<
"__";
2854 for (
size_t i = dims.size(); i > 0; --i) {
2863 const std::string& model_name,
2865 o <<
INDENT <<
"void write_array(std::vector<double>& params_r__," <<
EOL;
2866 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2867 o <<
INDENT <<
" std::vector<double>& vars__," <<
EOL;
2868 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
2870 o <<
INDENT2 <<
"stan::io::reader<double> in__(params_r__,params_i__);" <<
EOL;
2871 o <<
INDENT2 <<
"static const char* function__ = \"" 2872 << model_name <<
"_namespace::write_array(%1%)\";" <<
EOL;
2893 bool is_var =
false;
2896 bool include_sampling =
false;
2905 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
2906 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
2921 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
2936 generate_increment_i(x.
dims_);
2938 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
2940 o_ <<
"for (size_t i_" << i <<
"__ = 0; ";
2941 o_ <<
"i_" << i <<
"__ < ";
2943 o_ <<
"; ++i_" << i <<
"__) {" <<
EOL;
2947 o_ <<
"param_ranges_i__.push_back(std::pair<int,int>(";
2953 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
2959 generate_increment(x.
dims_);
2962 generate_increment(x.
M_,x.
dims_);
2965 generate_increment(x.
N_,x.
dims_);
2972 o_ <<
INDENT2 <<
"num_params_r__ += (";
2975 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
2982 generate_increment(x.
K_,x.
dims_);
2985 generate_increment(x.
K_,x.
dims_);
2989 o_ <<
INDENT2 <<
"num_params_r__ += ((";
2993 o_ <<
" - 1)) / 2 + ";
2996 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3003 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3007 o_ <<
" - 1)) / 2)";
3008 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3016 if (dims.size() == 0) {
3020 o_ <<
INDENT2 <<
"num_params_r__ += ";
3021 for (
size_t i = 0; i < dims.size(); ++i) {
3022 if (i > 0) o_ <<
" * ";
3028 if (dims.size() == 0) {
3032 o_ <<
INDENT2 <<
"num_params_r__ += ";
3033 for (
size_t i = 0; i < dims.size(); ++i) {
3034 if (i > 0) o_ <<
" * ";
3040 std::vector<expression> dims)
const {
3041 o_ <<
INDENT2 <<
"num_params_r__ += ";
3043 for (
size_t i = 0; i < dims.size(); ++i) {
3051 std::vector<expression> dims)
const {
3052 o_ <<
INDENT2 <<
"num_params_r__ += ";
3056 for (
size_t i = 0; i < dims.size(); ++i) {
3067 o <<
INDENT <<
"void set_param_ranges() {" <<
EOL;
3068 o <<
INDENT2 <<
"num_params_r__ = 0U;" <<
EOL;
3069 o <<
INDENT2 <<
"param_ranges_i__.clear();" <<
EOL;
3071 for (
size_t i = 0; i < var_decls.size(); ++i)
3072 boost::apply_visitor(vis,var_decls[i].decl_);
3077 std::ostream& out) {
3078 out <<
"int main(int argc, const char* argv[]) {" <<
EOL;
3080 out <<
INDENT2 <<
"stan::gm::nuts_command<" << model_name
3081 <<
"_namespace::" << model_name <<
">(argc,argv);" <<
EOL;
3082 out <<
INDENT <<
"} catch (std::exception& e) {" <<
EOL;
3084 <<
"std::cerr << std::endl << \"Exception: \" << e.what() << std::endl;" 3087 <<
"std::cerr << \"Diagnostic information: \" << std::endl << boost::diagnostic_information(e) << std::endl;" 3096 const std::string& model_name,
3098 bool include_main =
true) {
generic visitor with output for extension
void generate_indexed_expr(const std::string &expr, const std::vector< expression > indexes, base_expr_type base_type, size_t e_num_dims, std::ostream &o)
Placeholder struct for boost::variant default ctors.
void operator()(row_vector_var_decl const &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const nil &x) const
void generate_expression(const expression &e, std::ostream &o)
void operator()(const row_vector_var_decl &x) const
void operator()(const matrix_var_decl &x) const
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
void suppress_warning(const std::string &indent, const std::string &var_name, std::ostream &o)
const std::vector< expression > EMPTY_EXP_VECTOR(0)
void operator()(const matrix_var_decl &x) const
std::vector< expression > dims_
void operator()(const simplex_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void generate_write_loop(const std::string &write_method_name, const std::string &var_name, const std::vector< expression > &dims) const
void generate_dims_loop_fwd(const std::vector< expression > &dims, int indent=2U) const
void operator()(const ordered_var_decl &x) const
const std::string INDENT3(" ")
void operator()(const row_vector_var_decl &x) const
void generate_var_resizing(const std::vector< var_decl > &vs, std::ostream &o)
void generate_set_param_ranges(const std::vector< var_decl > &var_decls, std::ostream &o)
var_size_validating_visgen var_size_validator_
void operator()(const simplex_var_decl &x) const
void generate_initialize_array_bounded(const D &x, const std::string &base_type, const std::string &read_fun_prefix, const std::vector< expression > &dim_args) const
void operator()(const ordered_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
Probability, optimization and sampling library.
void operator()(positive_ordered_var_decl const &x) const
void operator()(const vector_var_decl &x) const
void generate_member_var_decls(const std::vector< var_decl > &vs, int indent, std::ostream &o)
void operator()(const row_vector_var_decl &x) const
void operator()(const double_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
write_dims_visgen(std::ostream &o)
void operator()(positive_ordered_var_decl const &x) const
const std::string INDENT(" ")
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
void operator()(const matrix_var_decl &x) const
std::vector< var_decl > data_decl_
void generate_dims_method(const program &prog, std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
void operator()(const double_var_decl &x) const
void operator()(const int_var_decl &x) const
void operator()(int_var_decl const &x) const
void generate_buffer_loop(const std::string &base_type, const std::string &name, const std::vector< expression > &dims, const expression &dim1=expression(), const expression &dim2=expression(), int indent=2U) const
write_csv_visgen(std::ostream &o)
void operator()(nil const &x) const
void operator()(simplex_var_decl const &x) const
void generate_constructor(const program &prog, const std::string &model_name, std::ostream &o)
void operator()(const ordered_var_decl &x) const
void generate_statements(const std::vector< statement > &ss, int indent, std::ostream &o, bool include_sampling, bool is_var)
void operator()(const positive_ordered_var_decl &x) const
void operator()(const vector_var_decl &x) const
void operator()(simplex_var_decl const &x) const
void generate_validate_var_decls(const std::vector< var_decl > decls, int indent, std::ostream &o)
void generate_indent(size_t indent, std::ostream &o)
void operator()(const int_var_decl &x) const
void operator()(cov_matrix_var_decl const &x) const
const std::string EOL("\)
void operator()(double_var_decl const &x) const
dump_member_var_visgen(std::ostream &o)
void operator()(const ordered_var_decl &x) const
std::string to_string(T i)
void operator()(const nil &x) const
void operator()(const int_var_decl &x) const
var_resizing_visgen var_resizer_
void operator()(const double_var_decl &x) const
void operator()(ordered_var_decl const &x) const
void operator()(const simplex_var_decl &x) const
void operator()(row_vector_var_decl const &x) const
void operator()(const cov_matrix_var_decl &x) const
void generate_initialize_array(const std::string &var_type, const std::string &read_type, const std::vector< expression > &read_args, const std::string &name, const std::vector< expression > &dims) const
void operator()(const double_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
std::vector< var_decl > parameter_decl_
void operator()(const nil &x) const
void operator()(matrix_var_decl const &x) const
write_array_vars_visgen(std::ostream &o)
void operator()(const simplex_var_decl &x) const
void generate_param_names(const std::string &name) const
void generate_initialize_array(const std::string &var_type, const std::string &read_type, const std::vector< expression > &read_args, const std::string &name, const std::vector< expression > &dims) const
void operator()(const vector_var_decl &x) const
write_array_visgen(std::ostream &o)
std::string function_args(const std::string &fun_prefix, const D &x) const
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
void operator()(const int_var_decl &x) const
void generate_end_namespace(std::ostream &o)
void operator()(const cov_matrix_var_decl &x) const
void generate_class_decl(const std::string &model_name, std::ostream &o)
void operator()(const int_var_decl &x) const
void generate_check_int(const std::string &name, size_t n) const
void generate_increment_i(std::vector< expression > dims) const
void operator()(const positive_ordered_var_decl &x) const
void generate_includes(std::ostream &o)
void operator()(const ordered_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void operator()(ordered_var_decl const &x) const
void operator()(const nil &x) const
void operator()(const matrix_var_decl &x) const
void operator()(vector_var_decl const &x) const
void generate_typedefs(std::ostream &o)
void operator()(const vector_var_decl &x) const
void operator()(const vector_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void generate_version_comment(std::ostream &o)
void write_array(const std::string &name, const std::vector< expression > &arraydims, const std::vector< expression > &matdims) const
void generate_statement(statement const &s, int indent, std::ostream &o, bool include_sampling, bool is_var)
void operator()(const matrix_var_decl &x) const
void generate_increment(expression M, expression N, std::vector< expression > dims) const
write_param_names_visgen(std::ostream &o)
void operator()(const double_var_decl &x) const
void generate_declaration(const std::string &name, const std::string &base_type, const std::vector< expression > &dims, const expression &type_arg1=expression(), const expression &type_arg2=expression()) const
void operator()(corr_matrix_var_decl const &x) const
set_param_ranges_visgen(std::ostream &o)
write_csv_vars_visgen(std::ostream &o)
void operator()(nil const &x) const
void operator()(const nil &x) const
void generate_param_names_method(const program &prog, std::ostream &o)
void operator()(const nil &x) const
void operator()(const nil &x) const
void generate_local_var_decls(const std::vector< var_decl > &vs, int indent, std::ostream &o, bool is_var)
var_size_validating_visgen var_size_validator_
void operator()(const double_var_decl &x) const
void generate_log_prob(program const &p, std::ostream &o)
void generate_member_var_inits(const std::vector< var_decl > &vs, std::ostream &o)
void operator()(const vector_var_decl &x) const
void operator()(const positive_ordered_var_decl &x) const
void generate_start_namespace(std::string name, std::ostream &o)
void operator()(const int_var_decl &x) const
void generate_comment(std::string const &msg, int indent, std::ostream &o)
bool is_nil(const expression &e)
void operator()(const corr_matrix_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const positive_ordered_var_decl &x) const
void generate_write_csv_method(const program &prog, const std::string &model_name, std::ostream &o)
void generate_cpp(const program &prog, const std::string &model_name, std::ostream &out, bool include_main=true)
void generate_name_dims(const std::string name, size_t num_dims) const
void generate_end_class_decl(std::ostream &o)
void operator()(const corr_matrix_var_decl &x) const
void generate_initialize_array_bounded(const D &x, const std::string &base_type, const std::string &read_fun_prefix, const std::vector< expression > &dim_args) const
void generate_increment(std::vector< expression > dims) const
void operator()(const matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void generate_increment(expression K, std::vector< expression > dims) const
void generate_initializer(std::ostream &o, const std::string &base_type, const std::vector< expression > &dims, const expression &type_arg1=expression(), const expression &type_arg2=expression())
void operator()(const cov_matrix_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(vector_var_decl const &x) const
void generate_check_double(const std::string &name, size_t n) const
const std::string EOL2("\")
void operator()(const cov_matrix_var_decl &x) const
void generate_type(const std::string &base_type, const std::vector< expression > &dims, size_t end, std::ostream &o)
void generate_usings(std::ostream &o)
void operator()(const corr_matrix_var_decl &x) const
void operator()(const int_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const vector_var_decl &x) const
generate_init_visgen(std::ostream &o)
void operator()(const row_vector_var_decl &x) const
void generate_public_decl(std::ostream &o)
void operator()(const simplex_var_decl &x) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(cov_matrix_var_decl const &x) const
void operator()(int_var_decl const &x) const
void operator()(corr_matrix_var_decl const &x) const
void operator()(double_var_decl const &x) const
void generate_dims_array(const std::vector< expression > &matrix_dims_exprs, const std::vector< expression > &array_dims_exprs) const
void generate_main(const std::string &model_name, std::ostream &out)
void operator()(const double_var_decl &x) const
const std::string INDENT2(" ")
void generate_init_method(const std::vector< var_decl > &vs, std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
void generate_private_decl(std::ostream &o)
void generate_write_csv_header_method(const program &prog, std::ostream &o)
void operator()(const cov_matrix_var_decl &x) const
void generate_write_array_method(const program &prog, const std::string &model_name, std::ostream &o)
void operator()(matrix_var_decl const &x) const
void write_array(const std::string &name, const std::vector< expression > &dims) const
void generate_indent_num_dims(size_t base_indent, const std::vector< expression > &dims, const expression &dim1, const expression &dim2) const