1 #ifndef __STAN__GM__GENERATOR_HPP__
2 #define __STAN__GM__GENERATOR_HPP__
4 #include <boost/variant/apply_visitor.hpp>
5 #include <boost/lexical_cast.hpp>
21 const std::string
EOL(
"\n");
22 const std::string
EOL2(
"\n\n");
23 const std::string
INDENT(
" ");
29 return !
is_nil(x.range_.low_.expr_) && !
is_nil(x.range_.high_.expr_);
33 return is_nil(x.range_.low_.expr_) && !
is_nil(x.range_.high_.expr_);
37 return !
is_nil(x.range_.low_.expr_) &&
is_nil(x.range_.high_.expr_);
48 for (
size_t k = 0; k < indent; ++k)
61 o <<
"namespace " << name <<
"_namespace {" <<
EOL2;
65 o <<
"} // namespace" <<
EOL2;
71 o <<
"// " << msg <<
EOL;
77 const std::vector<expression> indexes,
83 size_t ai_size = indexes.size();
89 if (ai_size <= (e_num_dims + 1) || base_type !=
MATRIX_T) {
90 for (
size_t n = 0; n < ai_size; ++n)
91 o << (isLHS ?
"get_base1_lhs(" :
"get_base1(");
93 for (
size_t n = 0; n < ai_size; ++n) {
96 o <<
',' <<
'"' << expr <<
'"' <<
',' << (n+1) <<
')';
99 for (
size_t n = 0; n < ai_size - 1; ++n)
100 o << (isLHS ?
"get_base1_lhs(" :
"get_base1(");
102 for (
size_t n = 0; n < ai_size - 2; ++n) {
105 o <<
',' <<
'"' << expr <<
'"' <<
',' << (n+1) <<
')';
111 o <<
',' <<
'"' << expr <<
'"' <<
',' << (ai_size-1U) <<
')';
116 const std::vector<expression>& ,
119 for (
size_t i = 0; i < end; ++i) o <<
"std::vector<";
121 for (
size_t i = 0; i < end; ++i) {
127 std::string base_type_to_string(const base_expr_type& bt) {
134 struct expression_visgen : public visgen {
135 expression_visgen(std::ostream& o) : visgen(o) { }
136 void operator()(nil const& /*x*/) const {
139 void operator()(const int_literal& n) const { o_ << n.val_; }
140 void operator()(const double_literal& x) const {
141 std::string num_str = boost::lexical_cast<std::string>(x.val_);
143 if (num_str.find_first_of("eE.") == std::string::npos)
144 o_ << ".0"; // trailing 0 to ensure C++ makes it a double
146 void operator()(const array_literal& x) const {
147 o_ << "stan::math::new_array<";
148 generate_type("foobar", // not enough to use: base_type_to_string(x.type_.base_type_),
153 for (size_t i = 0; i < x.args_.size(); ++i) {
155 generate_expression(x.args_[i],o_);
160 void operator()(const variable& v) const { o_ << v.name_; }
161 void operator()(int n) const { o_ << static_cast<long>(n); }
162 void operator()(double x) const { o_ << x; }
163 void operator()(const std::string& x) const { o_ << x; } // identifiers
164 void operator()(const index_op& x) const {
165 std::stringstream expr_o;
166 generate_expression(x.expr_,expr_o);
167 std::string expr_string = expr_o.str();
168 std::vector<expression> indexes;
169 size_t e_num_dims = x.expr_.expression_type().num_dims_;
170 base_expr_type base_type = x.expr_.expression_type().base_type_;
171 for (size_t i = 0; i < x.dimss_.size(); ++i)
172 for (size_t j = 0; j < x.dimss_[i].size(); ++j)
173 indexes.push_back(x.dimss_[i][j]); // wasteful copy, could use refs
174 generate_indexed_expr<false>(expr_string,indexes,base_type,e_num_dims,o_);
176 void operator()(const fun& fx) const {
177 o_ << fx.name_ << '(
';
178 for (size_t i = 0; i < fx.args_.size(); ++i) {
179 if (i > 0) o_ << ',
';
180 boost::apply_visitor(*this, fx.args_[i].expr_);
182 if (has_rng_suffix(fx.name_))
183 o_ << ", base_rng__";
186 void operator()(const binary_op& expr) const {
188 boost::apply_visitor(*this, expr.left.expr_);
189 o_ << ' ' << expr.op << ' ';
190 boost::apply_visitor(*this, expr.right.expr_);
193 void operator()(const unary_op& expr) const {
194 o_ << expr.op << '(
';
195 boost::apply_visitor(*this, expr.subject.expr_);
200 void generate_expression(const expression& e, std::ostream& o) {
201 expression_visgen vis(o);
202 boost::apply_visitor(vis, e.expr_);
205 struct printable_visgen : public visgen {
206 printable_visgen(std::ostream& o) : visgen(o) { }
207 void operator()(const std::string& s) const {
208 o_ << '"' << s << '"';
210 void operator()(const expression& e) const {
211 generate_expression(e,o_);
215 void generate_printable(const printable& p, std::ostream& o) {
216 printable_visgen vis(o);
217 boost::apply_visitor(vis, p.printable_);
220 void generate_using(const std::string& type, std::ostream& o) {
221 o << "using " << type << ";" << EOL;
224 void generate_using_namespace(const std::string& ns, std::ostream& o) {
225 o << "using namespace " << ns << ";" << EOL;
229 void generate_usings(std::ostream& o) {
230 generate_using("std::vector",o);
231 generate_using("std::string",o);
232 generate_using("std::stringstream",o);
233 generate_using("stan::agrad::var",o);
234 generate_using("stan::model::prob_grad_ad",o);
235 generate_using("stan::math::get_base1",o);
236 generate_using("stan::math::stan_print",o);
237 generate_using("stan::io::dump",o);
238 generate_using("std::istream",o);
239 generate_using_namespace("stan::math",o);
240 generate_using_namespace("stan::prob",o);
241 generate_using_namespace("stan::agrad",o);
245 void generate_typedef(const std::string& type,
246 const std::string& abbrev,
248 o << "typedef" << " " << type << " " << abbrev << ";" << EOL;
251 void generate_typedefs(std::ostream& o) {
252 generate_typedef("Eigen::Matrix<double,Eigen::Dynamic,1>","vector_d",o);
253 generate_typedef("Eigen::Matrix<double,1,Eigen::Dynamic>","row_vector_d",o);
254 generate_typedef("Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>","matrix_d",o);
258 void generate_include(const std::string& lib_name, std::ostream& o) {
259 o << "#include" << " " << "<" << lib_name << ">" << EOL;
262 void generate_includes(std::ostream& o) {
263 generate_include("stan/model/model_header.hpp",o);
267 void generate_version_comment(std::ostream& o) {
268 o << "// Code generated by Stan version "
269 << stan::MAJOR_VERSION << "." << stan::MINOR_VERSION << EOL2;
272 void generate_class_decl(const std::string& model_name,
274 o << "class " << model_name << " : public prob_grad_ad {" << EOL;
277 void generate_end_class_decl(std::ostream& o) {
278 o << "}; // model" << EOL2;
281 void generate_initializer(std::ostream& o,
282 const std::string& base_type,
283 const std::vector<expression>& dims,
284 const expression& type_arg1 = expression(),
285 const expression& type_arg2 = expression()) {
286 for (size_t i = 0; i < dims.size(); ++i) {
288 generate_expression(dims[i].expr_,o);
290 generate_type(base_type,dims,dims.size()- i - 1,o);
294 if (!is_nil(type_arg1)) {
295 generate_expression(type_arg1.expr_,o);
296 if (!is_nil(type_arg2)) {
298 generate_expression(type_arg2.expr_,o);
300 } else if (!is_nil(type_arg2.expr_)) {
301 generate_expression(type_arg2.expr_,o);
307 for (size_t i = 0; i < dims.size(); ++i)
312 // only generates the test
313 void generate_validate_context_size(std::ostream& o,
314 const std::string& stage,
315 const std::string& var_name,
316 const std::string& base_type,
317 const std::vector<expression>& dims,
318 const expression& type_arg1 = expression(),
319 const expression& type_arg2 = expression()) {
321 << "context__.validate_dims("
322 << '"' << stage << '"'
323 << ", " << '"' << var_name << '"'
324 << ", " << '"' << base_type << '"'
325 << ", context__.to_vec(";
326 for (size_t i = 0; i < dims.size(); ++i) {
328 generate_expression(dims[i].expr_,o);
330 if (!is_nil(type_arg1)) {
331 if (dims.size() > 0) o << ",";
332 generate_expression(type_arg1.expr_,o);
333 if (!is_nil(type_arg2)) {
335 generate_expression(type_arg2.expr_,o);
342 struct var_size_validating_visgen : public visgen {
343 const std::string stage_;
344 var_size_validating_visgen(std::ostream& o, const std::string& stage)
348 void operator()(nil const& /*x*/) const { } // dummy
349 void operator()(int_var_decl const& x) const {
350 generate_validate_context_size(o_,stage_,x.name_,"int",x.dims_);
352 void operator()(double_var_decl const& x) const {
353 generate_validate_context_size(o_,stage_,x.name_,"double",x.dims_);
355 void operator()(vector_var_decl const& x) const {
356 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.M_);
358 void operator()(row_vector_var_decl const& x) const {
359 generate_validate_context_size(o_,stage_,x.name_,"row_vector_d",x.dims_,x.N_);
361 void operator()(unit_vector_var_decl const& x) const {
362 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
364 void operator()(simplex_var_decl const& x) const {
365 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
367 void operator()(ordered_var_decl const& x) const {
368 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
370 void operator()(positive_ordered_var_decl const& x) const {
371 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
373 void operator()(matrix_var_decl const& x) const {
374 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.M_,x.N_);
376 void operator()(cov_matrix_var_decl const& x) const {
377 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
379 void operator()(corr_matrix_var_decl const& x) const {
380 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
385 void generate_validate_positive(const std::string& var_name,
386 const expression& expr,
389 o << "stan::math::validate_non_negative_index(\"" << var_name << "\", \"";
390 generate_expression(expr,o);
392 generate_expression(expr,o);
396 // generate_expression(expr,o);
397 // o << ") {" << EOL;
398 // o << INDENT3 << "std::stringstream s__;" << EOL;
399 // o << INDENT3 << "s__ << \"Found negative index for variable declaration.\";" << EOL;
400 // o << INDENT3 << "s__ << \"; declared variable=" << var_name << "\";" << EOL;
401 // o << INDENT3 << "s__ << \"; dimension expression=";
402 // generate_expression(expr,o);
403 // o << "\";" << EOL;
404 // o << INDENT3 << "s__ << \"; expression value=\" << ";
405 // generate_expression(expr,o);
407 // o << INDENT3 << "throw std::invalid_argument(s__.str());" << EOL;
408 // o << INDENT2 << "}" << EOL;
411 void generate_initialization(std::ostream& o,
412 const std::string& var_name,
413 const std::string& base_type,
414 const std::vector<expression>& dims,
415 const expression& type_arg1 = expression(),
416 const expression& type_arg2 = expression()) {
417 // validate all dims are positive
418 for (size_t i = 0; i < dims.size(); ++i)
419 generate_validate_positive(var_name,dims[i],o);
420 if (!is_nil(type_arg1))
421 generate_validate_positive(var_name,type_arg1,o);
422 if (!is_nil(type_arg2))
423 generate_validate_positive(var_name,type_arg2,o);
425 // define variable with initializer
427 << var_name << " = ";
428 generate_type(base_type,dims,dims.size(),o);
429 generate_initializer(o,base_type,dims,type_arg1,type_arg2);
433 struct var_resizing_visgen : public visgen {
434 var_resizing_visgen(std::ostream& o)
437 void operator()(nil const& /*x*/) const { } // dummy
438 void operator()(int_var_decl const& x) const {
439 generate_initialization(o_,x.name_,"int",x.dims_);
441 void operator()(double_var_decl const& x) const {
442 generate_initialization(o_,x.name_,"double",x.dims_);
444 void operator()(vector_var_decl const& x) const {
445 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.M_);
447 void operator()(row_vector_var_decl const& x) const {
448 generate_initialization(o_,x.name_,"row_vector_d",x.dims_,x.N_);
450 void operator()(unit_vector_var_decl const& x) const {
451 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
453 void operator()(simplex_var_decl const& x) const {
454 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
456 void operator()(ordered_var_decl const& x) const {
457 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
459 void operator()(positive_ordered_var_decl const& x) const {
460 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
462 void operator()(matrix_var_decl const& x) const {
463 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.M_,x.N_);
465 void operator()(cov_matrix_var_decl const& x) const {
466 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
468 void operator()(corr_matrix_var_decl const& x) const {
469 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
473 void generate_var_resizing(const std::vector<var_decl>& vs,
475 var_resizing_visgen vis(o);
476 for (size_t i = 0; i < vs.size(); ++i)
477 boost::apply_visitor(vis, vs[i].decl_);
480 const std::vector<expression> EMPTY_EXP_VECTOR(0);
482 struct init_local_var_visgen : public visgen {
483 const bool declare_vars_;
485 init_local_var_visgen(bool declare_vars,
489 declare_vars_(declare_vars),
492 template <typename D>
493 void generate_initialize_array_bounded(const D& x, const std::string& base_type,
494 const std::string& read_fun_prefix,
495 const std::vector<expression>& dim_args) const {
496 std::vector<expression> read_args;
497 std::string read_fun(read_fun_prefix);
500 read_args.push_back(x.range_.low_);
501 read_args.push_back(x.range_.high_);
502 } else if (has_lb(x)) {
504 read_args.push_back(x.range_.low_);
505 } else if (has_ub(x)) {
507 read_args.push_back(x.range_.high_);
509 for (size_t i = 0; i < dim_args.size(); ++i)
510 read_args.push_back(dim_args[i]);
511 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
513 void operator()(const nil& /*x*/) const { }
514 void operator()(const int_var_decl& x) const {
515 generate_initialize_array("int","integer",EMPTY_EXP_VECTOR,x.name_,x.dims_);
517 void operator()(const double_var_decl& x) const {
518 std::vector<expression> read_args;
519 generate_initialize_array_bounded(x,is_var_?"T__":"double","scalar",read_args);
521 void operator()(const vector_var_decl& x) const {
522 std::vector<expression> read_args;
523 read_args.push_back(x.M_);
524 generate_initialize_array_bounded(x,is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,1> ":"vector_d","vector",read_args);
526 void operator()(const row_vector_var_decl& x) const {
527 std::vector<expression> read_args;
528 read_args.push_back(x.N_);
529 generate_initialize_array_bounded(x,is_var_?"Eigen::Matrix<T__,1,Eigen::Dynamic> ":"row_vector_d","row_vector",read_args);
531 void operator()(const matrix_var_decl& x) const {
532 std::vector<expression> read_args;
533 read_args.push_back(x.M_);
534 read_args.push_back(x.N_);
535 generate_initialize_array_bounded(x,is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> ":"matrix_d","matrix",read_args);
537 void operator()(const unit_vector_var_decl& x) const {
538 std::vector<expression> read_args;
539 read_args.push_back(x.K_);
540 generate_initialize_array(is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,1> ":"vector_d","unit_vector",read_args,x.name_,x.dims_);
542 void operator()(const simplex_var_decl& x) const {
543 std::vector<expression> read_args;
544 read_args.push_back(x.K_);
545 generate_initialize_array(is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,1> ":"vector_d","simplex",read_args,x.name_,x.dims_);
547 void operator()(const ordered_var_decl& x) const {
548 std::vector<expression> read_args;
549 read_args.push_back(x.K_);
550 generate_initialize_array(is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,1> ":"vector_d","ordered",read_args,x.name_,x.dims_);
552 void operator()(const positive_ordered_var_decl& x) const {
553 std::vector<expression> read_args;
554 read_args.push_back(x.K_);
555 generate_initialize_array(is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,1> ":"vector_d","positive_ordered",read_args,x.name_,x.dims_);
557 void operator()(const cov_matrix_var_decl& x) const {
558 std::vector<expression> read_args;
559 read_args.push_back(x.K_);
560 generate_initialize_array(is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> ":"matrix_d","cov_matrix",read_args,x.name_,x.dims_);
562 void operator()(const corr_matrix_var_decl& x) const {
563 std::vector<expression> read_args;
564 read_args.push_back(x.K_);
565 generate_initialize_array(is_var_?"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> ":"matrix_d","corr_matrix",read_args,x.name_,x.dims_);
567 void generate_initialize_array(const std::string& var_type,
568 const std::string& read_type,
569 const std::vector<expression>& read_args,
570 const std::string& name,
571 const std::vector<expression>& dims)
574 if (dims.size() == 0) {
575 generate_indent(2,o_);
576 if (declare_vars_) o_ << var_type << " ";
577 o_ << name << " = in__." << read_type << "_constrain(";
578 for (size_t j = 0; j < read_args.size(); ++j) {
579 if (j > 0) o_ << ",";
580 generate_expression(read_args[j],o_);
582 if (read_args.size() > 0)
586 generate_indent(2,o_);
587 o_ << "(void) " << name << "; // supress unused variable warning" << EOL;
592 for (size_t i = 0; i < dims.size(); ++i) o_ << "vector<";
594 for (size_t i = 0; i < dims.size(); ++i) o_ << "> ";
595 o_ << name << ";" << EOL;
597 std::string name_dims(name);
598 for (size_t i = 0; i < dims.size(); ++i) {
599 generate_indent(i + 2, o_);
600 o_ << "size_t dim_" << name << "_" << i << "__ = ";
601 generate_expression(dims[i],o_);
603 if (i < dims.size() - 1) {
604 generate_indent(i + 2, o_);
605 o_ << name_dims << ".resize(dim" << "_" << name << "_" << i << "__);"
607 name_dims.append("[k_").append(to_string(i)).append("__]");
609 generate_indent(i + 2, o_);
610 if (i == dims.size() - 1) {
611 o_ << name_dims << ".reserve(dim_" << name << "_" << i << "__);" << EOL;
612 generate_indent(i + 2, o_);
614 o_ << "for (size_t k_" << i << "__ = 0;"
615 << " k_" << i << "__ < dim_" << name << "_" << i << "__;"
616 << " ++k_" << i << "__) {" << EOL;
617 if (i == dims.size() - 1) {
618 generate_indent(i + 3, o_);
619 o_ << name_dims << ".push_back(in__." << read_type << "_constrain(";
620 for (size_t j = 0; j < read_args.size(); ++j) {
621 if (j > 0) o_ << ",";
622 generate_expression(read_args[j],o_);
624 if (read_args.size() > 0)
630 for (size_t i = dims.size(); i > 0; --i) {
631 generate_indent(i + 1, o_);
637 void generate_local_var_inits(std::vector<var_decl> vs,
642 << "stan::io::reader<"
643 << (is_var ? "T__" : "double")
644 << "> in__(params_r__,params_i__);" << EOL2;
645 init_local_var_visgen vis(declare_vars,is_var,o);
646 for (size_t i = 0; i < vs.size(); ++i)
647 boost::apply_visitor(vis, vs[i].decl_);
653 void generate_public_decl(std::ostream& o) {
654 o << "public:" << EOL;
657 void generate_private_decl(std::ostream& o) {
658 o << "private:" << EOL;
662 struct validate_var_decl_visgen : public visgen {
664 validate_var_decl_visgen(int indents,
669 void generate_begin_for_dims(const std::vector<expression>& dims)
672 for (size_t i = 0; i < dims.size(); ++i) {
673 generate_indent(indents_+i,o_);
674 o_ << "for (int k" << i << "__ = 0;"
675 << " k" << i << "__ < ";
676 generate_expression(dims[i].expr_,o_);
678 o_ << " ++k" << i << "__) {" << EOL;
681 void generate_end_for_dims(size_t dims_size) const {
682 for (size_t i = 0; i < dims_size; ++i) {
683 generate_indent(indents_ + dims_size - i - 1, o_);
688 void generate_loop_var(const std::string& name,
689 size_t dims_size) const {
691 for (size_t i = 0; i < dims_size; ++i)
692 o_ << "[k" << i << "__]";
694 void operator()(nil const& /*x*/) const { }
695 template <typename T>
696 void basic_validate(T const& x) const {
697 if (!(x.range_.has_low() || x.range_.has_high()))
698 return; // unconstrained
699 generate_begin_for_dims(x.dims_);
700 generate_indent(indents_ + x.dims_.size(),o_);
701 o_ << "try { " << EOL;
702 if (x.range_.has_low()) {
703 generate_indent(indents_ + 1 + x.dims_.size(),o_);
704 o_ << "check_greater_or_equal(function__,";
705 generate_loop_var(x.name_,x.dims_.size());
707 generate_expression(x.range_.low_.expr_,o_);
709 generate_loop_var(x.name_,x.dims_.size());
712 if (x.range_.has_high()) {
713 generate_indent(indents_ + 1 + x.dims_.size(),o_);
714 o_ << "check_less_or_equal(function__,";
715 generate_loop_var(x.name_,x.dims_.size());
717 generate_expression(x.range_.high_.expr_,o_);
719 generate_loop_var(x.name_,x.dims_.size());
722 generate_indent(indents_ + x.dims_.size(),o_);
723 o_ << "} catch (std::domain_error& e) { throw std::domain_error(std::string(\"Invalid value of " << x.name_ << ": \") + std::string(e.what())); };" << EOL;
724 generate_end_for_dims(x.dims_.size());
726 void operator()(int_var_decl const& x) const {
729 void operator()(double_var_decl const& x) const {
732 void operator()(vector_var_decl const& x) const {
735 void operator()(row_vector_var_decl const& x) const {
738 void operator()(matrix_var_decl const& x) const {
741 template <typename T>
742 void nonbasic_validate(const T& x,
743 const std::string& type_name) const {
744 generate_begin_for_dims(x.dims_);
745 generate_indent(indents_ + x.dims_.size(),o_);
746 o_ << "try { stan::math::check_" << type_name << "(function__,";
747 generate_loop_var(x.name_,x.dims_.size());
749 generate_loop_var(x.name_,x.dims_.size());
750 o_ << "\"); } catch (std::domain_error& e) { throw std::domain_error(std::string(\"Invalid value of " << x.name_ << ": \") + std::string(e.what())); };" << EOL;
751 generate_end_for_dims(x.dims_.size());
753 void operator()(unit_vector_var_decl const& x) const {
754 nonbasic_validate(x,"unit_vector");
756 void operator()(simplex_var_decl const& x) const {
757 nonbasic_validate(x,"simplex");
759 void operator()(ordered_var_decl const& x) const {
760 nonbasic_validate(x,"ordered");
762 void operator()(positive_ordered_var_decl const& x) const {
763 nonbasic_validate(x,"positive_ordered");
765 void operator()(corr_matrix_var_decl const& x) const {
766 nonbasic_validate(x,"corr_matrix");
768 void operator()(cov_matrix_var_decl const& x) const {
769 nonbasic_validate(x,"cov_matrix");
774 void generate_validate_var_decl(const var_decl& decl,
777 validate_var_decl_visgen vis(indent,o);
778 boost::apply_visitor(vis,decl.decl_);
781 void generate_validate_var_decls(const std::vector<var_decl> decls,
784 for (size_t i = 0; i < decls.size(); ++i)
785 generate_validate_var_decl(decls[i],indent,o);
788 // see _var_decl_visgen cut & paste
789 struct member_var_decl_visgen : public visgen {
791 member_var_decl_visgen(int indents,
796 void operator()(nil const& /*x*/) const { }
797 void operator()(int_var_decl const& x) const {
798 declare_array("int",x.name_,x.dims_.size());
800 void operator()(double_var_decl const& x) const {
801 declare_array("double",x.name_,x.dims_.size());
803 void operator()(unit_vector_var_decl const& x) const {
804 declare_array(("vector_d"), x.name_, x.dims_.size());
806 void operator()(simplex_var_decl const& x) const {
807 declare_array(("vector_d"), x.name_, x.dims_.size());
809 void operator()(ordered_var_decl const& x) const {
810 declare_array(("vector_d"), x.name_, x.dims_.size());
812 void operator()(positive_ordered_var_decl const& x) const {
813 declare_array(("vector_d"), x.name_, x.dims_.size());
815 void operator()(cov_matrix_var_decl const& x) const {
816 declare_array(("matrix_d"), x.name_, x.dims_.size());
818 void operator()(corr_matrix_var_decl const& x) const {
819 declare_array(("matrix_d"), x.name_, x.dims_.size());
821 void operator()(vector_var_decl const& x) const {
822 declare_array(("vector_d"), x.name_, x.dims_.size());
824 void operator()(row_vector_var_decl const& x) const {
825 declare_array(("row_vector_d"), x.name_, x.dims_.size());
827 void operator()(matrix_var_decl const& x) const {
828 declare_array(("matrix_d"), x.name_, x.dims_.size());
830 void declare_array(std::string const& type, std::string const& name,
832 for (int i = 0; i < indents_; ++i)
834 for (size_t i = 0; i < size; ++i) {
841 for (size_t i = 1; i < size; ++i) {
844 o_ << " " << name << ";" << EOL;
848 void generate_member_var_decls(const std::vector<var_decl>& vs,
851 member_var_decl_visgen vis(indent,o);
852 for (size_t i = 0; i < vs.size(); ++i)
853 boost::apply_visitor(vis,vs[i].decl_);
856 // see member_var_decl_visgen cut & paste
857 struct local_var_decl_visgen : public visgen {
860 local_var_decl_visgen(int indents,
867 void operator()(nil const& /*x*/) const { }
868 void operator()(int_var_decl const& x) const {
869 std::vector<expression> ctor_args;
870 declare_array("int",ctor_args,x.name_,x.dims_);
872 void operator()(double_var_decl const& x) const {
873 std::vector<expression> ctor_args;
874 declare_array(is_var_ ? "T__" : "double",
875 ctor_args,x.name_,x.dims_);
877 void operator()(vector_var_decl const& x) const {
878 std::vector<expression> ctor_args;
879 ctor_args.push_back(x.M_);
880 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,1> " : "vector_d",
881 ctor_args, x.name_, x.dims_);
883 void operator()(row_vector_var_decl const& x) const {
884 std::vector<expression> ctor_args;
885 ctor_args.push_back(x.N_);
886 declare_array(is_var_ ? "Eigen::Matrix<T__,1,Eigen::Dynamic> " : "row_vector_d",
887 ctor_args, x.name_, x.dims_);
889 void operator()(matrix_var_decl const& x) const {
890 std::vector<expression> ctor_args;
891 ctor_args.push_back(x.M_);
892 ctor_args.push_back(x.N_);
893 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " : "matrix_d",
894 ctor_args, x.name_, x.dims_);
896 void operator()(unit_vector_var_decl const& x) const {
897 std::vector<expression> ctor_args;
898 ctor_args.push_back(x.K_);
899 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,1> " : "vector_d",
900 ctor_args, x.name_, x.dims_);
902 void operator()(simplex_var_decl const& x) const {
903 std::vector<expression> ctor_args;
904 ctor_args.push_back(x.K_);
905 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,1> " : "vector_d",
906 ctor_args, x.name_, x.dims_);
908 void operator()(ordered_var_decl const& x) const {
909 std::vector<expression> ctor_args;
910 ctor_args.push_back(x.K_);
911 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,1> " : "vector_d",
912 ctor_args, x.name_, x.dims_);
914 void operator()(positive_ordered_var_decl const& x) const {
915 std::vector<expression> ctor_args;
916 ctor_args.push_back(x.K_);
917 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,1> " : "vector_d",
918 ctor_args, x.name_, x.dims_);
920 void operator()(cov_matrix_var_decl const& x) const {
921 std::vector<expression> ctor_args;
922 ctor_args.push_back(x.K_);
923 ctor_args.push_back(x.K_);
924 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " : "matrix_d",
925 ctor_args, x.name_, x.dims_);
927 void operator()(corr_matrix_var_decl const& x) const {
928 std::vector<expression> ctor_args;
929 ctor_args.push_back(x.K_);
930 ctor_args.push_back(x.K_);
931 declare_array(is_var_ ? "Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " : "matrix_d",
932 ctor_args, x.name_, x.dims_);
934 void generate_type(const std::string& type,
935 size_t num_dims) const {
936 for (size_t i = 0; i < num_dims; ++i)
939 for (size_t i = 0; i < num_dims; ++i) {
940 if (i > 0) o_ << " ";
944 // var_decl -> type[0] name init_args[0] ;
945 // init_args[k] -> ctor_args if no dims left
946 // init_args[k] -> ( dim[k] , ( type[k+1] init_args[k+1] ) )
947 void generate_init_args(const std::string& type,
948 const std::vector<expression>& ctor_args,
949 const std::vector<expression>& dims,
951 if (dim < dims.size()) { // more dims left
952 o_ << '(
'; // open(1)
953 generate_expression(dims[dim],o_);
954 if ((dim + 1 < dims.size()) || ctor_args.size() > 0) {
955 o_ << ", ("; // open(2)
956 generate_type(type,dims.size() - dim - 1);
957 generate_init_args(type,ctor_args,dims,dim + 1);
958 o_ << ')
'; // close(2)
959 } else if (type == "var") {
960 o_ << ", DUMMY_VAR__";
961 } else if (type == "int") {
963 } else if (type == "double") {
966 // shouldn't hit
this
970 if (ctor_args.size() == 0) {
973 }
else if (type ==
"double") {
975 }
else if (type ==
"var") {
976 o_ <<
"(DUMMY_VAR__)";
981 else if (ctor_args.size() == 1) {
985 }
else if (ctor_args.size() > 1) {
994 void declare_array(
const std::string& type,
995 const std::vector<expression>& ctor_args,
996 const std::string& name,
997 const std::vector<expression>&
dims)
const {
1004 generate_init_args(type,ctor_args,dims,0);
1006 if (type ==
"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> "
1007 || type ==
"Eigen::Matrix<T__,1,Eigen::Dynamic> "
1008 || type ==
"Eigen::Matrix<T__,Eigen::Dynamic,1> ") {
1010 o_ <<
"stan::agrad::fill(" << name <<
",DUMMY_VAR__);" <<
EOL;
1020 for (
size_t i = 0; i < vs.size(); ++i)
1021 boost::apply_visitor(vis,vs[i].decl_);
1035 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1039 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1043 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1047 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1051 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1055 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1059 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1063 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1067 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1071 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1075 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1084 generate_comment(
"initialized transformed params to avoid seg fault on val access",
1087 for (
size_t i = 0; i < vs.size(); ++i)
1088 boost::apply_visitor(vis,vs[i].decl_);
1102 validate_array(x.
name_,dims,0);
1106 validate_array(x.
name_,dims,0);
1110 dims.push_back(x.
M_);
1111 validate_array(x.
name_,dims,1);
1115 dims.push_back(x.
K_);
1116 validate_array(x.
name_,dims,1);
1120 dims.push_back(x.
K_);
1121 validate_array(x.
name_,dims,1);
1125 dims.push_back(x.
K_);
1126 validate_array(x.
name_,dims,1);
1130 dims.push_back(x.
K_);
1131 validate_array(x.
name_,dims,1);
1135 dims.push_back(x.
N_);
1136 validate_array(x.
name_,dims,1);
1140 dims.push_back(x.
M_);
1141 dims.push_back(x.
N_);
1142 validate_array(x.
name_,dims,2);
1146 dims.push_back(x.
K_);
1147 dims.push_back(x.
K_);
1148 validate_array(x.
name_,dims,2);
1152 dims.push_back(x.
K_);
1153 dims.push_back(x.
K_);
1154 validate_array(x.
name_,dims,2);
1156 void validate_array(
const std::string& name,
1157 const std::vector<expression>&
dims,
1158 size_t matrix_dims)
const {
1160 size_t non_matrix_dims = dims.size() - matrix_dims;
1162 for (
size_t k = 0; k < dims.size(); ++k) {
1164 o_ <<
"for (int i" << k <<
"__ = 0; i" << k <<
"__ < ";
1166 o_ <<
"; ++i" << k <<
"__) {" <<
EOL;
1170 o_ <<
"if (stan::agrad::is_uninitialized(" << name;
1171 for (
size_t k = 0; k < non_matrix_dims; ++k)
1172 o_ <<
"[i" << k <<
"__]";
1173 if (matrix_dims > 0) {
1174 o_ <<
"(i" << non_matrix_dims <<
"__";
1175 if (matrix_dims > 1)
1176 o_ <<
",i" << (non_matrix_dims + 1) <<
"__";
1179 o_ <<
")) {" <<
EOL;
1181 o_ <<
"std::stringstream msg__;" <<
EOL;
1183 o_ <<
"msg__ << \"Undefined transformed parameter: "
1185 for (
size_t k = 0; k < dims.size(); ++k) {
1187 o_ <<
" << i" << k <<
"__";
1192 o_ <<
"throw std::runtime_error(msg__.str());" <<
EOL;
1196 for (
size_t k = 0; k < dims.size(); ++k) {
1208 for (
size_t i = 0; i < vs.size(); ++i)
1209 boost::apply_visitor(vis,vs[i].decl_);
1214 bool include_sampling,
bool is_var);
1221 bool include_sampling,
1226 include_sampling_(include_sampling),
1244 if (!include_sampling_)
return;
1246 o_ <<
"lp__ += stan::prob::" << x.
dist_.
family_ <<
"_log<true>(";
1248 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1261 o_ <<
") lp__ -= std::numeric_limits<double>::infinity();" <<
EOL;
1271 o_ <<
") lp__ -= std::numeric_limits<double>::infinity();" <<
EOL;
1279 o_ <<
"lp__ -= log(";
1282 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1288 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1294 o_ <<
"lp__ -= log(";
1297 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1303 o_ <<
"lp__ -= log1m(";
1306 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1315 size_t indent = has_local_vars ? (indent_ + 1) : indent_;
1316 if (has_local_vars) {
1325 if (has_local_vars) {
1332 o_ <<
"if (pstream__) {" <<
EOL;
1333 for (
size_t i = 0; i < ps.
printables_.size(); ++i) {
1335 o_ <<
"stan_print(pstream__,";
1340 o_ <<
"*pstream__ << std::endl;" <<
EOL;
1346 o_ <<
"for (int " << x.
variable_ <<
" = ";
1357 o_ <<
"while (as_bool(";
1359 o_ <<
")) {" <<
EOL;
1365 for (
size_t i = 0; i < x.
conditions_.size(); ++i) {
1370 o_ <<
"if (as_bool(";
1372 o_ <<
")) {" <<
EOL;
1374 o_, include_sampling_,is_var_);
1379 o_ <<
" else {" <<
EOL;
1381 o_, include_sampling_, is_var_);
1394 bool include_sampling,
1403 bool include_sampling,
1406 for (
size_t i = 0; i < ss.size(); ++i)
1407 boost::apply_visitor(vis,ss[i].statement_);
1414 o <<
INDENT <<
"var log_prob(vector<var>& params_r__," <<
EOL;
1415 o <<
INDENT <<
" vector<int>& params_i__," <<
EOL;
1416 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
1417 o <<
INDENT <<
" return log_prob_poly<true,var>(params_r__,params_i__,pstream__);" <<
EOL;
1420 o <<
INDENT <<
"template <bool propto__, typename T__>" <<
EOL;
1421 o <<
INDENT <<
"T__ log_prob_poly(vector<T__>& params_r__," <<
EOL;
1422 o <<
INDENT <<
" vector<int>& params_i__," <<
EOL;
1423 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL2;
1426 o <<
INDENT2 <<
"T__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" <<
EOL;
1427 o <<
INDENT2 <<
"(void) DUMMY_VAR__; // suppress unused var warning" <<
EOL2;
1442 bool include_sampling =
true;
1448 <<
"const char* function__ = \"validate transformed params %1%\";"
1451 <<
"(void) function__; // dummy to suppress unused var warning"
1460 o <<
INDENT <<
"} // log_prob(...var...)" <<
EOL2;
1474 var_size_validator_(x);
1476 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << x.
name_ <<
"\");" <<
EOL;
1478 size_t indentation = 1;
1479 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1480 size_t dim = dims.size() - dim_up - 1U;
1483 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1487 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_"
1488 << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim
1489 <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1493 for (
size_t dim = 0; dim < dims.size(); ++dim)
1494 o_ <<
"[i_" << dim <<
"__]";
1495 o_ <<
" = vals_i__[pos__++];" <<
EOL;
1496 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1504 var_size_validator_(x);
1506 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1508 size_t indentation = 1;
1509 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1510 size_t dim = dims.size() - dim_up - 1U;
1513 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1517 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1521 for (
size_t dim = 0; dim < dims.size(); ++dim)
1522 o_ <<
"[i_" << dim <<
"__]";
1523 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1524 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1533 var_size_validator_(x);
1534 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1536 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1539 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1540 size_t indentation = 2;
1541 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1542 size_t dim = dims.size() - dim_up - 1U;
1545 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1549 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1553 for (
size_t dim = 0; dim < dims.size(); ++dim)
1554 o_ <<
"[i_" << dim <<
"__]";
1556 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1557 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1566 var_size_validator_(x);
1568 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1570 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1573 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1574 size_t indentation = 2;
1575 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1576 size_t dim = dims.size() - dim_up - 1U;
1579 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1583 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1587 for (
size_t dim = 0; dim < dims.size(); ++dim)
1588 o_ <<
"[i_" << dim <<
"__]";
1590 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1591 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1600 var_size_validator_(x);
1602 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1604 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1607 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1608 size_t indentation = 2;
1609 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1610 size_t dim = dims.size() - dim_up - 1U;
1613 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1617 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1621 for (
size_t dim = 0; dim < dims.size(); ++dim)
1622 o_ <<
"[i_" << dim <<
"__]";
1624 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1625 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1634 var_size_validator_(x);
1636 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1638 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1641 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1642 size_t indentation = 2;
1643 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1644 size_t dim = dims.size() - dim_up - 1U;
1647 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1651 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1655 for (
size_t dim = 0; dim < dims.size(); ++dim)
1656 o_ <<
"[i_" << dim <<
"__]";
1658 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1659 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1668 var_size_validator_(x);
1670 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1672 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1675 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1676 size_t indentation = 2;
1677 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1678 size_t dim = dims.size() - dim_up - 1U;
1681 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1685 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1689 for (
size_t dim = 0; dim < dims.size(); ++dim)
1690 o_ <<
"[i_" << dim <<
"__]";
1692 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1693 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1702 var_size_validator_(x);
1704 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1706 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1709 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1710 size_t indentation = 2;
1711 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1712 size_t dim = dims.size() - dim_up - 1U;
1715 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1719 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1723 for (
size_t dim = 0; dim < dims.size(); ++dim)
1724 o_ <<
"[i_" << dim <<
"__]";
1726 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1727 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1736 var_size_validator_(x);
1738 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1740 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_m_mat_lim__ = ";
1743 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_n_mat_lim__ = ";
1746 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_n_mat_lim__; ++n_mat__) {" <<
EOL;
1747 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_m_mat_lim__; ++m_mat__) {" <<
EOL;
1748 size_t indentation = 3;
1749 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1750 size_t dim = dims.size() - dim_up - 1U;
1753 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1757 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1761 for (
size_t dim = 0; dim < dims.size(); ++dim)
1762 o_ <<
"[i_" << dim <<
"__]";
1763 o_ <<
"(m_mat__,n_mat__)";
1764 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1765 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1774 var_size_validator_(x);
1776 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1778 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_k_mat_lim__ = ";
1781 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
1782 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
1783 size_t indentation = 3;
1784 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1785 size_t dim = dims.size() - dim_up - 1U;
1788 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1792 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1796 for (
size_t dim = 0; dim < dims.size(); ++dim)
1797 o_ <<
"[i_" << dim <<
"__]";
1798 o_ <<
"(m_mat__,n_mat__)";
1799 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1800 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1809 var_size_validator_(x);
1811 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1813 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_k_mat_lim__ = ";
1816 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
1817 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
1818 size_t indentation = 3;
1819 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1820 size_t dim = dims.size() - dim_up - 1U;
1823 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1827 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1831 for (
size_t dim = 0; dim < dims.size(); ++dim)
1832 o_ <<
"[i_" << dim <<
"__]";
1833 o_ <<
"(m_mat__,n_mat__)";
1834 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1835 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1845 const std::string& var_name,
1847 o << indent <<
"(void) "
1849 <<
" // dummy call to supress warning"
1856 for (
size_t i = 0; i < vs.size(); ++i)
1857 boost::apply_visitor(vis, vs[i].decl_);
1861 const std::string& model_name,
1863 o <<
INDENT << model_name <<
"(stan::io::var_context& context__," <<
EOL;
1864 o <<
INDENT <<
" std::ostream* pstream__ = 0)"
1866 o <<
INDENT2 <<
": prob_grad_ad::prob_grad_ad(0) {"
1868 o <<
INDENT2 <<
"static const char* function__ = \""
1869 << model_name <<
"_namespace::" << model_name <<
"(%1%)\";" <<
EOL;
1873 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
1874 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
1883 bool include_sampling =
false;
1884 bool is_var =
false;
1887 2,o,include_sampling,is_var);
1892 o << EOL <<
INDENT2 <<
"set_param_ranges();" <<
EOL;
1900 var_size_validator_(o,
"initialization") {
1905 var_size_validator_(x);
1908 generate_write_loop(
"integer(",x.
name_,x.
dims_);
1910 template <
typename D>
1911 std::string function_args(
const std::string& fun_prefix,
1913 std::stringstream ss;
1916 ss <<
"_lub_unconstrain(";
1922 ss <<
"_lb_unconstrain(";
1926 ss <<
"_ub_unconstrain(";
1930 ss <<
"_unconstrain(";
1936 generate_check_double(x.
name_,x.
dims_.size());
1937 var_size_validator_(x);
1938 generate_declaration(x.
name_,
"double",x.
dims_);
1940 generate_write_loop(function_args(
"scalar",x),
1944 generate_check_double(x.
name_,x.
dims_.size() + 1);
1945 var_size_validator_(x);
1948 generate_write_loop(function_args(
"vector",x),
1952 generate_check_double(x.
name_,x.
dims_.size() + 1);
1953 var_size_validator_(x);
1954 generate_declaration(x.
name_,
"row_vector_d",x.
dims_,x.
N_);
1956 generate_write_loop(function_args(
"row_vector",x),
1960 generate_check_double(x.
name_,x.
dims_.size() + 2);
1961 var_size_validator_(x);
1964 generate_write_loop(function_args(
"matrix",x),
1968 generate_check_double(x.
name_,x.
dims_.size() + 1);
1969 var_size_validator_(x);
1972 generate_write_loop(
"unit_vector_unconstrain(",x.
name_,x.
dims_);
1975 generate_check_double(x.
name_,x.
dims_.size() + 1);
1976 var_size_validator_(x);
1979 generate_write_loop(
"simplex_unconstrain(",x.
name_,x.
dims_);
1982 generate_check_double(x.
name_,x.
dims_.size() + 1);
1983 var_size_validator_(x);
1986 generate_write_loop(
"ordered_unconstrain(",x.
name_,x.
dims_);
1989 generate_check_double(x.
name_,x.
dims_.size() + 1);
1990 var_size_validator_(x);
1993 generate_write_loop(
"positive_ordered_unconstrain(",x.
name_,x.
dims_);
1996 generate_check_double(x.
name_,x.
dims_.size() + 2);
1997 var_size_validator_(x);
2000 generate_write_loop(
"cov_matrix_unconstrain(",x.
name_,x.
dims_);
2003 generate_check_double(x.
name_,x.
dims_.size() + 2);
2004 var_size_validator_(x);
2007 generate_write_loop(
"corr_matrix_unconstrain(",x.
name_,x.
dims_);
2009 void generate_write_loop(
const std::string& write_method_name,
2010 const std::string& var_name,
2011 const std::vector<expression>&
dims)
const {
2012 generate_dims_loop_fwd(dims);
2013 o_ <<
"writer__." << write_method_name;
2014 generate_name_dims(var_name,dims.size());
2017 void generate_name_dims(
const std::string name,
2018 size_t num_dims)
const {
2020 for (
size_t i = 0; i < num_dims; ++i)
2021 o_ <<
"[i" << i <<
"__]";
2023 void generate_declaration(
const std::string& name,
2024 const std::string& base_type,
2025 const std::vector<expression>&
dims,
2034 void generate_indent_num_dims(
size_t base_indent,
2035 const std::vector<expression>& dims,
2042 void generate_buffer_loop(
const std::string& base_type,
2043 const std::string& name,
2044 const std::vector<expression>& dims,
2047 int indent = 2U)
const {
2048 size_t size = dims.size();
2051 int extra_indent = is_matrix ? 2U : is_vector ? 1U : 0U;
2054 o_ <<
"for (int j2__ = 0U; j2__ < ";
2056 o_ <<
"; ++j2__)" <<
EOL;
2059 o_ <<
"for (int j1__ = 0U; j1__ < ";
2061 o_ <<
"; ++j1__)" <<
EOL;
2062 }
else if (is_vector) {
2064 o_ <<
"for (int j1__ = 0U; j1__ < ";
2066 o_ <<
"; ++j1__)" <<
EOL;
2068 for (
size_t i = 0; i <
size; ++i) {
2069 size_t idx = size - i - 1;
2071 o_ <<
"for (int i" << idx <<
"__ = 0U; i" << idx <<
"__ < ";
2073 o_ <<
"; ++i" << idx <<
"__)" <<
EOL;
2075 generate_indent_num_dims(2U,dims,dim1,dim2);
2077 for (
size_t i = 0; i < dims.size(); ++i)
2078 o_ <<
"[i" << i <<
"__]";
2080 o_ <<
"(j1__,j2__)";
2083 o_ <<
" = vals_" << base_type <<
"__[pos__++];" <<
EOL;
2085 void generate_dims_loop_fwd(
const std::vector<expression>& dims,
2086 int indent = 2U)
const {
2087 size_t size = dims.size();
2088 for (
size_t i = 0; i <
size; ++i) {
2090 o_ <<
"for (int i" << i <<
"__ = 0U; i" << i <<
"__ < ";
2092 o_ <<
"; ++i" << i <<
"__)" <<
EOL;
2098 <<
"if (!(context__.contains_i(\"" << name <<
"\")))"
2100 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" <<
EOL;
2101 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << name <<
"\");" <<
EOL;
2106 <<
"if (!(context__.contains_r(\"" << name <<
"\")))"
2108 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" <<
EOL;
2109 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << name <<
"\");" <<
EOL;
2118 o <<
INDENT <<
"void transform_inits(const stan::io::var_context& context__," <<
EOL;
2119 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2120 o <<
INDENT <<
" std::vector<double>& params_r__) {" <<
EOL;
2121 o <<
INDENT2 <<
"stan::io::writer<double> writer__(params_r__,params_i__);" <<
EOL;
2123 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
2124 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
2127 for (
size_t i = 0; i < vs.size(); ++i)
2128 boost::apply_visitor(vis, vs[i].decl_);
2130 o <<
INDENT2 <<
"params_r__ = writer__.data_r();" <<
EOL;
2131 o <<
INDENT2 <<
"params_i__ = writer__.data_i();" <<
EOL;
2148 std::vector<expression> matrix_args;
2149 matrix_args.push_back(x.
M_);
2150 generate_dims_array(matrix_args,x.
dims_);
2153 std::vector<expression> matrix_args;
2154 matrix_args.push_back(x.
N_);
2155 generate_dims_array(matrix_args,x.
dims_);
2158 std::vector<expression> matrix_args;
2159 matrix_args.push_back(x.
M_);
2160 matrix_args.push_back(x.
N_);
2161 generate_dims_array(matrix_args,x.
dims_);
2164 std::vector<expression> matrix_args;
2165 matrix_args.push_back(x.
K_);
2166 generate_dims_array(matrix_args,x.
dims_);
2169 std::vector<expression> matrix_args;
2170 matrix_args.push_back(x.
K_);
2171 generate_dims_array(matrix_args,x.
dims_);
2174 std::vector<expression> matrix_args;
2175 matrix_args.push_back(x.
K_);
2176 generate_dims_array(matrix_args,x.
dims_);
2179 std::vector<expression> matrix_args;
2180 matrix_args.push_back(x.
K_);
2181 generate_dims_array(matrix_args,x.
dims_);
2184 std::vector<expression> matrix_args;
2185 matrix_args.push_back(x.
K_);
2186 matrix_args.push_back(x.
K_);
2187 generate_dims_array(matrix_args,x.
dims_);
2190 std::vector<expression> matrix_args;
2191 matrix_args.push_back(x.
K_);
2192 matrix_args.push_back(x.
K_);
2193 generate_dims_array(matrix_args,x.
dims_);
2196 generate_dims_array(
const std::vector<expression>& matrix_dims_exprs,
2197 const std::vector<expression>& array_dims_exprs)
2201 for (
size_t i = 0; i < array_dims_exprs.size(); ++i) {
2202 o_ <<
INDENT2 <<
"dims__.push_back(";
2207 for (
size_t i = 0; i < matrix_dims_exprs.size(); ++i) {
2208 o_ <<
INDENT2 <<
"dims__.push_back(";
2212 o_ <<
INDENT2 <<
"dimss__.push_back(dims__);" <<
EOL;
2221 <<
"void get_dims(std::vector<std::vector<size_t> >& dimss__) {"
2225 o <<
INDENT2 <<
"std::vector<size_t> dims__;" <<
EOL;
2232 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2233 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2251 generate_param_names(x.
name_);
2254 generate_param_names(x.
name_);
2257 generate_param_names(x.
name_);
2260 generate_param_names(x.
name_);
2263 generate_param_names(x.
name_);
2266 generate_param_names(x.
name_);
2269 generate_param_names(x.
name_);
2272 generate_param_names(x.
name_);
2275 generate_param_names(x.
name_);
2278 generate_param_names(x.
name_);
2281 generate_param_names(x.
name_);
2286 <<
"names__.push_back(\"" << name <<
"\");"
2296 <<
"void get_param_names(std::vector<std::string>& names__) {"
2300 <<
"names__.resize(0);"
2308 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2309 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2334 std::vector<expression> matrix_args;
2335 matrix_args.push_back(x.
M_);
2336 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2339 std::vector<expression> matrix_args;
2340 matrix_args.push_back(x.
N_);
2341 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2344 std::vector<expression> matrix_args;
2345 matrix_args.push_back(x.
M_);
2346 matrix_args.push_back(x.
N_);
2347 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2350 std::vector<expression> matrix_args;
2351 matrix_args.push_back(x.
K_);
2352 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2355 std::vector<expression> matrix_args;
2356 matrix_args.push_back(x.
K_);
2357 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2360 std::vector<expression> matrix_args;
2361 matrix_args.push_back(x.
K_);
2362 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2365 std::vector<expression> matrix_args;
2366 matrix_args.push_back(x.
K_);
2367 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2370 std::vector<expression> matrix_args;
2371 matrix_args.push_back(x.
K_);
2372 matrix_args.push_back(x.
K_);
2373 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2376 std::vector<expression> matrix_args;
2377 matrix_args.push_back(x.
K_);
2378 matrix_args.push_back(x.
K_);
2379 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2382 generate_csv_header_array(
const std::vector<expression>& matrix_dims,
2383 const std::string& name,
2384 const std::vector<expression>& dims)
const {
2387 std::vector<expression> combo_dims(dims);
2388 for (
size_t i = 0; i < matrix_dims.size(); ++i)
2389 combo_dims.push_back(matrix_dims[i]);
2391 for (
size_t i = 0; i < combo_dims.size(); ++i) {
2393 o_ <<
"for (int k_" << i <<
"__ = 1;"
2394 <<
" k_" << i <<
"__ <= ";
2396 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2401 o_ <<
"writer__.comma();" <<
EOL;
2404 o_ <<
"o__ << \"" << name <<
'"';
2405 for (
size_t i = 0; i < combo_dims.size(); ++i)
2406 o_ <<
" << '.' << k_" << i <<
"__";
2410 for (
size_t i = 0; i < combo_dims.size(); ++i) {
2421 o <<
EOL <<
INDENT <<
"void write_csv_header(std::ostream& o__) {" <<
EOL;
2422 o <<
INDENT2 <<
"stan::io::csv_writer writer__(o__);" <<
EOL;
2429 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2430 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2436 o <<
INDENT2 <<
"writer__.newline();" <<
EOL;
2445 template <
typename D>
2446 void generate_initialize_array_bounded(
const D& x,
const std::string& base_type,
2447 const std::string& read_fun_prefix,
2448 const std::vector<expression>& dim_args)
const {
2449 std::vector<expression> read_args;
2450 std::string read_fun(read_fun_prefix);
2453 read_args.push_back(x.range_.low_);
2454 read_args.push_back(x.range_.high_);
2457 read_args.push_back(x.range_.low_);
2460 read_args.push_back(x.range_.high_);
2462 for (
size_t i = 0; i < dim_args.size(); ++i)
2463 read_args.push_back(dim_args[i]);
2464 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
2472 std::vector<expression> read_args;
2473 generate_initialize_array_bounded(x,
"double",
"scalar",read_args);
2476 std::vector<expression> read_args;
2477 read_args.push_back(x.
M_);
2478 generate_initialize_array_bounded(x,
"vector_d",
"vector",read_args);
2481 std::vector<expression> read_args;
2482 read_args.push_back(x.
N_);
2483 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",read_args);
2486 std::vector<expression> read_args;
2487 read_args.push_back(x.
M_);
2488 read_args.push_back(x.
N_);
2489 generate_initialize_array_bounded(x,
"matrix_d",
"matrix",read_args);
2492 std::vector<expression> read_args;
2493 read_args.push_back(x.
K_);
2494 generate_initialize_array(
"vector_d",
"unit_vector",read_args,x.
name_,x.
dims_);
2497 std::vector<expression> read_args;
2498 read_args.push_back(x.
K_);
2499 generate_initialize_array(
"vector_d",
"simplex",read_args,x.
name_,x.
dims_);
2502 std::vector<expression> read_args;
2503 read_args.push_back(x.
K_);
2504 generate_initialize_array(
"vector_d",
"ordered",read_args,x.
name_,x.
dims_);
2507 std::vector<expression> read_args;
2508 read_args.push_back(x.
K_);
2509 generate_initialize_array(
"vector_d",
"positive_ordered",read_args,x.
name_,x.
dims_);
2512 std::vector<expression> read_args;
2513 read_args.push_back(x.
K_);
2514 generate_initialize_array(
"matrix_d",
"cov_matrix",read_args,x.
name_,x.
dims_);
2517 std::vector<expression> read_args;
2518 read_args.push_back(x.
K_);
2519 generate_initialize_array(
"matrix_d",
"corr_matrix",read_args,x.
name_,x.
dims_);
2521 void generate_initialize_array(
const std::string& var_type,
2522 const std::string& read_type,
2523 const std::vector<expression>& read_args,
2524 const std::string& name,
2525 const std::vector<expression>& dims)
const {
2526 if (dims.size() == 0) {
2528 o_ << var_type <<
" ";
2529 o_ << name <<
" = in__." << read_type <<
"_constrain(";
2530 for (
size_t j = 0; j < read_args.size(); ++j) {
2531 if (j > 0) o_ <<
",";
2535 o_ <<
INDENT2 <<
"writer__.write(" << name <<
");" <<
EOL;
2539 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"vector<";
2541 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"> ";
2542 o_ << name <<
";" <<
EOL;
2543 std::string name_dims(name);
2544 for (
size_t i = 0; i < dims.size(); ++i) {
2546 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
2549 if (i < dims.size() - 1) {
2551 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);"
2553 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
2556 o_ <<
"for (size_t k_" << i <<
"__ = 0;"
2557 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;"
2558 <<
" ++k_" << i <<
"__) {" <<
EOL;
2559 if (i == dims.size() - 1) {
2561 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
2562 for (
size_t j = 0; j < read_args.size(); ++j) {
2563 if (j > 0) o_ <<
",";
2570 o_ <<
"writer__.write(" << name;
2571 if (dims.size() > 0) {
2573 for (
size_t i = 0; i < dims.size(); ++i) {
2574 if (i > 0) o_ <<
"][";
2575 o_ <<
"k_" << i <<
"__";
2581 for (
size_t i = dims.size(); i > 0; --i) {
2630 void write_array(
const std::string& name,
2631 const std::vector<expression>& dims)
const {
2632 if (dims.size() == 0) {
2633 o_ <<
INDENT2 <<
"writer__.write(" << name <<
");" <<
EOL;
2636 for (
size_t i = 0; i < dims.size(); ++i) {
2638 o_ <<
"for (int k_" << i <<
"__ = 0;"
2639 <<
" k_" << i <<
"__ < ";
2641 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2645 o_ <<
"writer__.write(" << name;
2646 if (dims.size() > 0) {
2648 for (
size_t i = 0; i < dims.size(); ++i) {
2649 if (i > 0) o_ <<
"][";
2650 o_ <<
"k_" << i <<
"__";
2656 for (
size_t i = dims.size(); i > 0; --i) {
2665 const std::string& model_name,
2667 o <<
INDENT <<
"template <typename RNG>" <<
EOL;
2668 o <<
INDENT <<
"void write_csv(RNG& base_rng__," <<
EOL;
2669 o <<
INDENT <<
" std::vector<double>& params_r__," <<
EOL;
2670 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2671 o <<
INDENT <<
" std::ostream& o__," <<
EOL;
2672 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
2673 o <<
INDENT2 <<
"stan::io::reader<double> in__(params_r__,params_i__);"
2675 o <<
INDENT2 <<
"stan::io::csv_writer writer__(o__);" <<
EOL;
2676 o <<
INDENT2 <<
"static const char* function__ = \""
2677 << model_name <<
"_namespace::write_csv(%1%)\";" <<
EOL;
2696 bool is_var =
false;
2699 bool include_sampling =
false;
2707 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
2708 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
2723 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
2727 o <<
INDENT2 <<
"writer__.newline();" <<
EOL;
2743 template <
typename D>
2744 void generate_initialize_array_bounded(
const D& x,
const std::string& base_type,
2745 const std::string& read_fun_prefix,
2746 const std::vector<expression>& dim_args)
const {
2747 std::vector<expression> read_args;
2748 std::string read_fun(read_fun_prefix);
2751 read_args.push_back(x.range_.low_);
2752 read_args.push_back(x.range_.high_);
2755 read_args.push_back(x.range_.low_);
2758 read_args.push_back(x.range_.high_);
2760 for (
size_t i = 0; i < dim_args.size(); ++i)
2761 read_args.push_back(dim_args[i]);
2762 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
2766 std::vector<expression> read_args;
2767 generate_initialize_array_bounded(x,
"double",
"scalar",read_args);
2770 std::vector<expression> read_args;
2771 read_args.push_back(x.
M_);
2772 generate_initialize_array_bounded(x,
"vector_d",
"vector",read_args);
2775 std::vector<expression> read_args;
2776 read_args.push_back(x.
N_);
2777 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",read_args);
2780 std::vector<expression> read_args;
2781 read_args.push_back(x.
M_);
2782 read_args.push_back(x.
N_);
2783 generate_initialize_array_bounded(x,
"matrix_d",
"matrix",read_args);
2786 std::vector<expression> read_args;
2787 read_args.push_back(x.
K_);
2788 generate_initialize_array(
"vector_d",
"unit_vector",read_args,x.
name_,x.
dims_);
2791 std::vector<expression> read_args;
2792 read_args.push_back(x.
K_);
2793 generate_initialize_array(
"vector_d",
"simplex",read_args,x.
name_,x.
dims_);
2796 std::vector<expression> read_args;
2797 read_args.push_back(x.
K_);
2798 generate_initialize_array(
"vector_d",
"ordered",read_args,x.
name_,x.
dims_);
2801 std::vector<expression> read_args;
2802 read_args.push_back(x.
K_);
2803 generate_initialize_array(
"vector_d",
"positive_ordered",read_args,x.
name_,x.
dims_);
2806 std::vector<expression> read_args;
2807 read_args.push_back(x.
K_);
2808 generate_initialize_array(
"matrix_d",
"cov_matrix",read_args,x.
name_,x.
dims_);
2811 std::vector<expression> read_args;
2812 read_args.push_back(x.
K_);
2813 generate_initialize_array(
"matrix_d",
"corr_matrix",read_args,x.
name_,x.
dims_);
2815 void generate_initialize_array(
const std::string& var_type,
2816 const std::string& read_type,
2817 const std::vector<expression>& read_args,
2818 const std::string& name,
2819 const std::vector<expression>& dims)
const {
2820 if (dims.size() == 0) {
2822 o_ << var_type <<
" ";
2823 o_ << name <<
" = in__." << read_type <<
"_constrain(";
2824 for (
size_t j = 0; j < read_args.size(); ++j) {
2825 if (j > 0) o_ <<
",";
2832 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"vector<";
2834 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"> ";
2835 o_ << name <<
";" <<
EOL;
2836 std::string name_dims(name);
2837 for (
size_t i = 0; i < dims.size(); ++i) {
2839 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
2842 if (i < dims.size() - 1) {
2844 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);"
2846 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
2849 o_ <<
"for (size_t k_" << i <<
"__ = 0;"
2850 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;"
2851 <<
" ++k_" << i <<
"__) {" <<
EOL;
2852 if (i == dims.size() - 1) {
2854 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
2855 for (
size_t j = 0; j < read_args.size(); ++j) {
2856 if (j > 0) o_ <<
",";
2863 for (
size_t i = dims.size(); i > 0; --i) {
2889 dims.push_back(x.
M_);
2894 dims.push_back(x.
N_);
2898 std::vector<expression> matdims;
2899 matdims.push_back(x.
M_);
2900 matdims.push_back(x.
N_);
2905 dims.push_back(x.
K_);
2910 dims.push_back(x.
K_);
2915 dims.push_back(x.
K_);
2920 dims.push_back(x.
K_);
2924 std::vector<expression> matdims;
2925 matdims.push_back(x.
K_);
2926 matdims.push_back(x.
K_);
2930 std::vector<expression> matdims;
2931 matdims.push_back(x.
K_);
2932 matdims.push_back(x.
K_);
2935 void write_array(
const std::string& name,
2936 const std::vector<expression>& arraydims,
2937 const std::vector<expression>& matdims)
const {
2939 std::vector<expression>
dims(arraydims);
2940 for (
size_t i = 0; i < matdims.size(); ++i)
2941 dims.push_back(matdims[i]);
2943 if (dims.size() == 0) {
2944 o_ <<
INDENT2 <<
"vars__.push_back(" << name <<
");" <<
EOL;
2949 for (
size_t i = dims.size(); i > 0; ) {
2952 o_ <<
"for (int k_" << i <<
"__ = 0;"
2953 <<
" k_" << i <<
"__ < ";
2955 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2959 o_ <<
"vars__.push_back(" << name;
2960 if (arraydims.size() > 0) {
2962 for (
size_t i = 0; i < arraydims.size(); ++i) {
2963 if (i > 0) o_ <<
"][";
2964 o_ <<
"k_" << i <<
"__";
2968 if (matdims.size() > 0) {
2969 o_ <<
"(k_" << arraydims.size() <<
"__";
2970 if (matdims.size() > 1)
2971 o_ <<
", k_" << (arraydims.size() + 1) <<
"__";
2976 for (
size_t i = dims.size(); i > 0; --i) {
2985 const std::string& model_name,
2987 o <<
INDENT <<
"template <typename RNG>" <<
EOL;
2988 o <<
INDENT <<
"void write_array(RNG& base_rng__," <<
EOL;
2989 o <<
INDENT <<
" std::vector<double>& params_r__," <<
EOL;
2990 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2991 o <<
INDENT <<
" std::vector<double>& vars__," <<
EOL;
2992 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
2994 o <<
INDENT2 <<
"stan::io::reader<double> in__(params_r__,params_i__);" <<
EOL;
2995 o <<
INDENT2 <<
"static const char* function__ = \""
2996 << model_name <<
"_namespace::write_array(%1%)\";" <<
EOL;
3017 bool is_var =
false;
3020 bool include_sampling =
false;
3029 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
3030 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
3045 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
3060 generate_increment_i(x.
dims_);
3062 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3064 o_ <<
"for (size_t i_" << i <<
"__ = 0; ";
3065 o_ <<
"i_" << i <<
"__ < ";
3067 o_ <<
"; ++i_" << i <<
"__) {" <<
EOL;
3071 o_ <<
"param_ranges_i__.push_back(std::pair<int,int>(";
3077 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3083 generate_increment(x.
dims_);
3086 generate_increment(x.
M_,x.
dims_);
3089 generate_increment(x.
N_,x.
dims_);
3096 o_ <<
INDENT2 <<
"num_params_r__ += (";
3099 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3107 o_ <<
INDENT2 <<
"num_params_r__ += (";
3110 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3117 generate_increment(x.
K_,x.
dims_);
3120 generate_increment(x.
K_,x.
dims_);
3124 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3128 o_ <<
" - 1)) / 2 + ";
3131 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3138 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3142 o_ <<
" - 1)) / 2)";
3143 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3151 if (dims.size() == 0) {
3155 o_ <<
INDENT2 <<
"num_params_r__ += ";
3156 for (
size_t i = 0; i < dims.size(); ++i) {
3157 if (i > 0) o_ <<
" * ";
3163 if (dims.size() == 0) {
3167 o_ <<
INDENT2 <<
"num_params_r__ += ";
3168 for (
size_t i = 0; i < dims.size(); ++i) {
3169 if (i > 0) o_ <<
" * ";
3175 std::vector<expression> dims)
const {
3176 o_ <<
INDENT2 <<
"num_params_r__ += ";
3178 for (
size_t i = 0; i < dims.size(); ++i) {
3186 std::vector<expression> dims)
const {
3187 o_ <<
INDENT2 <<
"num_params_r__ += ";
3191 for (
size_t i = 0; i < dims.size(); ++i) {
3202 o <<
INDENT <<
"void set_param_ranges() {" <<
EOL;
3203 o <<
INDENT2 <<
"num_params_r__ = 0U;" <<
EOL;
3204 o <<
INDENT2 <<
"param_ranges_i__.clear();" <<
EOL;
3206 for (
size_t i = 0; i < var_decls.size(); ++i)
3207 boost::apply_visitor(vis,var_decls[i].decl_);
3212 std::ostream& out) {
3213 out <<
"int main(int argc, const char* argv[]) {" <<
EOL;
3215 out <<
INDENT2 <<
"stan::gm::nuts_command<" << model_name
3216 <<
"_namespace::" << model_name <<
">(argc,argv);" <<
EOL;
3217 out <<
INDENT <<
"} catch (std::exception& e) {" <<
EOL;
3219 <<
"std::cerr << std::endl << \"Exception: \" << e.what() << std::endl;"
3222 <<
"std::cerr << \"Diagnostic information: \" << std::endl << boost::diagnostic_information(e) << std::endl;"
3231 const std::string& model_name,
3233 bool include_main =
true) {