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");
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) {
void generate_statements(const std::vector< statement > &ss, int indent, std::ostream &o, bool include_sampling, bool is_var)
const std::string INDENT(" ")
void generate_typedefs(std::ostream &o)
void generate_write_csv_header_method(const program &prog, std::ostream &o)
void generate_init_method(const std::vector< var_decl > &vs, std::ostream &o)
const std::string EOL("\n")
void generate_local_var_decls(const std::vector< var_decl > &vs, int indent, std::ostream &o, bool is_var)
void generate_start_namespace(std::string name, std::ostream &o)
void generate_public_decl(std::ostream &o)
void suppress_warning(const std::string &indent, const std::string &var_name, std::ostream &o)
void generate_var_resizing(const std::vector< var_decl > &vs, std::ostream &o)
void generate_main(const std::string &model_name, std::ostream &out)
void generate_validate_var_decls(const std::vector< var_decl > decls, int indent, std::ostream &o)
void generate_param_names_method(const program &prog, std::ostream &o)
void generate_log_prob(program const &p, std::ostream &o)
void generate_write_array_method(const program &prog, const std::string &model_name, std::ostream &o)
void generate_type(const std::string &base_type, const std::vector< expression > &dims, size_t end, std::ostream &o)
void generate_indent(size_t indent, std::ostream &o)
void generate_member_var_decls(const std::vector< var_decl > &vs, int indent, std::ostream &o)
void generate_cpp(const program &prog, const std::string &model_name, std::ostream &out, bool include_main=true)
void generate_includes(std::ostream &o)
void generate_expression(const expression &e, std::ostream &o)
const std::string INDENT3(" ")
const std::vector< expression > EMPTY_EXP_VECTOR(0)
void generate_set_param_ranges(const std::vector< var_decl > &var_decls, std::ostream &o)
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)
void generate_write_csv_method(const program &prog, const std::string &model_name, std::ostream &o)
void generate_private_decl(std::ostream &o)
bool is_nil(const expression &e)
void generate_end_namespace(std::ostream &o)
void generate_constructor(const program &prog, const std::string &model_name, std::ostream &o)
void generate_usings(std::ostream &o)
void generate_comment(std::string const &msg, int indent, std::ostream &o)
std::string to_string(T i)
const std::string INDENT2(" ")
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 generate_statement(statement const &s, int indent, std::ostream &o, bool include_sampling, bool is_var)
void generate_dims_method(const program &prog, std::ostream &o)
void generate_version_comment(std::ostream &o)
void generate_member_var_inits(const std::vector< var_decl > &vs, std::ostream &o)
void generate_end_class_decl(std::ostream &o)
void generate_class_decl(const std::string &model_name, std::ostream &o)
const std::string EOL2("\n\n")
Probability, optimization and sampling library.
std::vector< expression > dims_
void operator()(int_var_decl const &x) const
dump_member_var_visgen(std::ostream &o)
void operator()(ordered_var_decl const &x) const
void operator()(nil const &x) const
void operator()(vector_var_decl const &x) const
void operator()(double_var_decl const &x) const
var_size_validating_visgen var_size_validator_
void operator()(row_vector_var_decl const &x) const
void operator()(positive_ordered_var_decl const &x) const
void operator()(cov_matrix_var_decl const &x) const
void operator()(corr_matrix_var_decl const &x) const
var_resizing_visgen var_resizer_
void operator()(matrix_var_decl const &x) const
void operator()(simplex_var_decl const &x) const
void generate_indent_num_dims(size_t base_indent, const std::vector< expression > &dims, const expression &dim1, const expression &dim2) const
void generate_check_double(const std::string &name, size_t n) const
void operator()(corr_matrix_var_decl const &x) const
generate_init_visgen(std::ostream &o)
void generate_dims_loop_fwd(const std::vector< expression > &dims, int indent=2U) const
void operator()(int_var_decl const &x) const
void generate_check_int(const std::string &name, size_t n) const
void operator()(double_var_decl const &x) const
std::string function_args(const std::string &fun_prefix, const D &x) const
void operator()(nil const &x) const
var_size_validating_visgen var_size_validator_
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()(positive_ordered_var_decl const &x) const
void operator()(simplex_var_decl const &x) const
void operator()(cov_matrix_var_decl const &x) const
void operator()(vector_var_decl const &x) const
void operator()(ordered_var_decl const &x) const
void generate_name_dims(const std::string name, size_t num_dims) 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
void operator()(row_vector_var_decl const &x) const
void operator()(matrix_var_decl const &x) const
void generate_write_loop(const std::string &write_method_name, const std::string &var_name, const std::vector< expression > &dims) const
Placeholder struct for boost::variant default ctors.
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
std::vector< var_decl > data_decl_
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
std::vector< var_decl > parameter_decl_
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
void operator()(const ordered_var_decl &x) const
set_param_ranges_visgen(std::ostream &o)
void operator()(const row_vector_var_decl &x) const
void operator()(const double_var_decl &x) const
void generate_increment_i(std::vector< expression > dims) const
void operator()(const positive_ordered_var_decl &x) const
void generate_increment(expression K, std::vector< expression > dims) const
void operator()(const matrix_var_decl &x) const
void operator()(const nil &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const vector_var_decl &x) const
void generate_increment(std::vector< expression > dims) const
void generate_increment(expression M, expression N, std::vector< expression > dims) const
void operator()(const int_var_decl &x) const
generic visitor with output for extension
void operator()(const matrix_var_decl &x) const
void operator()(const double_var_decl &x) const
write_array_vars_visgen(std::ostream &o)
void operator()(const int_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const vector_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(const nil &x) const
void operator()(const corr_matrix_var_decl &x) const
void write_array(const std::string &name, const std::vector< expression > &arraydims, const std::vector< expression > &matdims) const
void operator()(const vector_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 int_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const nil &x) const
void operator()(const row_vector_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 matrix_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const positive_ordered_var_decl &x) const
write_array_visgen(std::ostream &o)
void operator()(const row_vector_var_decl &x) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(const double_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const vector_var_decl &x) const
write_csv_vars_visgen(std::ostream &o)
void operator()(const matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(const nil &x) const
void write_array(const std::string &name, const std::vector< expression > &dims) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const int_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const nil &x) const
void operator()(const int_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 vector_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void operator()(const ordered_var_decl &x) const
write_csv_visgen(std::ostream &o)
void operator()(const double_var_decl &x) const
void operator()(const positive_ordered_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 matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const nil &x) const
write_dims_visgen(std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
void operator()(const vector_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void generate_dims_array(const std::vector< expression > &matrix_dims_exprs, const std::vector< expression > &array_dims_exprs) const
void operator()(const simplex_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const double_var_decl &x) const
void operator()(const int_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const vector_var_decl &x) const
void generate_param_names(const std::string &name) const
void operator()(const ordered_var_decl &x) const
void operator()(const double_var_decl &x) const
void operator()(const nil &x) const
write_param_names_visgen(std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void operator()(const int_var_decl &x) const