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;
76 const std::vector<expression> indexes,
82 size_t ai_size = indexes.size();
88 if (ai_size <= (e_num_dims + 1) || base_type !=
MATRIX_T) {
89 for (
size_t n = 0; n < ai_size; ++n)
92 for (
size_t n = 0; n < ai_size; ++n) {
95 o <<
',' <<
'"' << expr <<
'"' <<
',' << (n+1) <<
')';
98 for (
size_t n = 0; n < ai_size - 1; ++n)
101 for (
size_t n = 0; n < ai_size - 2; ++n) {
104 o <<
',' <<
'"' << expr <<
'"' <<
',' << (n+1) <<
')';
110 o <<
',' <<
'"' << expr <<
'"' <<
',' << (ai_size-1U) <<
')';
115 const std::vector<expression>& ,
118 for (
size_t i = 0; i < end; ++i) o <<
"std::vector<";
120 for (
size_t i = 0; i < end; ++i) {
126 std::string base_type_to_string(const base_expr_type& bt) {
133 struct expression_visgen : public visgen {
134 expression_visgen(std::ostream& o) : visgen(o) { }
135 void operator()(nil const& /*x*/) const {
138 void operator()(const int_literal& n) const { o_ << n.val_; }
139 void operator()(const double_literal& x) const {
140 std::string num_str = boost::lexical_cast<std::string>(x.val_);
142 if (num_str.find_first_of("eE.") == std::string::npos)
143 o_ << ".0"; // trailing 0 to ensure C++ makes it a double
145 void operator()(const array_literal& x) const {
146 o_ << "stan::math::new_array<";
147 generate_type("foobar", // not enough to use: base_type_to_string(x.type_.base_type_),
152 for (size_t i = 0; i < x.args_.size(); ++i) {
154 generate_expression(x.args_[i],o_);
159 void operator()(const variable& v) const { o_ << v.name_; }
160 void operator()(int n) const { o_ << static_cast<long>(n); }
161 void operator()(double x) const { o_ << x; }
162 void operator()(const std::string& x) const { o_ << x; } // identifiers
163 void operator()(const index_op& x) const {
164 std::stringstream expr_o;
165 generate_expression(x.expr_,expr_o);
166 std::string expr_string = expr_o.str();
167 std::vector<expression> indexes;
168 size_t e_num_dims = x.expr_.expression_type().num_dims_;
169 base_expr_type base_type = x.expr_.expression_type().base_type_;
170 for (size_t i = 0; i < x.dimss_.size(); ++i)
171 for (size_t j = 0; j < x.dimss_[i].size(); ++j)
172 indexes.push_back(x.dimss_[i][j]); // wasteful copy, could use refs
173 generate_indexed_expr(expr_string,indexes,base_type,e_num_dims,o_);
175 void operator()(const fun& fx) const {
176 o_ << fx.name_ << '(
';
177 for (size_t i = 0; i < fx.args_.size(); ++i) {
178 if (i > 0) o_ << ',
';
179 boost::apply_visitor(*this, fx.args_[i].expr_);
183 void operator()(const binary_op& expr) const {
185 boost::apply_visitor(*this, expr.left.expr_);
186 o_ << ' ' << expr.op << ' ';
187 boost::apply_visitor(*this, expr.right.expr_);
190 void operator()(const unary_op& expr) const {
191 o_ << expr.op << '(
';
192 boost::apply_visitor(*this, expr.subject.expr_);
197 void generate_expression(const expression& e, std::ostream& o) {
198 expression_visgen vis(o);
199 boost::apply_visitor(vis, e.expr_);
202 struct printable_visgen : public visgen {
203 printable_visgen(std::ostream& o) : visgen(o) { }
204 void operator()(const std::string& s) const {
205 o_ << '"' << s << '"';
207 void operator()(const expression& e) const {
208 generate_expression(e,o_);
212 void generate_printable(const printable& p, std::ostream& o) {
213 printable_visgen vis(o);
214 boost::apply_visitor(vis, p.printable_);
217 void generate_using(const std::string& type, std::ostream& o) {
218 o << "using " << type << ";" << EOL;
221 void generate_using_namespace(const std::string& ns, std::ostream& o) {
222 o << "using namespace " << ns << ";" << EOL;
226 void generate_usings(std::ostream& o) {
227 generate_using("std::vector",o);
228 generate_using("std::string",o);
229 generate_using("std::stringstream",o);
230 generate_using("stan::agrad::var",o);
231 generate_using("stan::model::prob_grad_ad",o);
232 generate_using("stan::math::get_base1",o);
233 generate_using("stan::math::stan_print",o);
234 generate_using("stan::io::dump",o);
235 generate_using("std::istream",o);
236 generate_using_namespace("stan::math",o);
237 generate_using_namespace("stan::prob",o);
238 generate_using_namespace("stan::agrad",o);
242 void generate_typedef(const std::string& type,
243 const std::string& abbrev,
245 o << "typedef" << " " << type << " " << abbrev << ";" << EOL;
248 void generate_typedefs(std::ostream& o) {
249 generate_typedef("Eigen::Matrix<double,Eigen::Dynamic,1>","vector_d",o);
250 generate_typedef("Eigen::Matrix<double,1,Eigen::Dynamic>","row_vector_d",o);
251 generate_typedef("Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>","matrix_d",o);
253 generate_typedef("Eigen::Matrix<stan::agrad::var,Eigen::Dynamic,1>","vector_v",o);
254 generate_typedef("Eigen::Matrix<stan::agrad::var,1,Eigen::Dynamic>","row_vector_v",o);
255 generate_typedef("Eigen::Matrix<stan::agrad::var,Eigen::Dynamic,Eigen::Dynamic>","matrix_v",o);
260 void generate_include(const std::string& lib_name, std::ostream& o) {
261 o << "#include" << " " << "<" << lib_name << ">" << EOL;
264 void generate_includes(std::ostream& o) {
265 generate_include("stan/model/model_header.hpp",o);
269 void generate_version_comment(std::ostream& o) {
270 o << "// Code generated by Stan version "
271 << stan::MAJOR_VERSION << "." << stan::MINOR_VERSION << EOL2;
274 void generate_class_decl(const std::string& model_name,
276 o << "class " << model_name << " : public prob_grad_ad {" << EOL;
279 void generate_end_class_decl(std::ostream& o) {
280 o << "}; // model" << EOL2;
283 void generate_initializer(std::ostream& o,
284 const std::string& base_type,
285 const std::vector<expression>& dims,
286 const expression& type_arg1 = expression(),
287 const expression& type_arg2 = expression()) {
288 for (size_t i = 0; i < dims.size(); ++i) {
290 generate_expression(dims[i].expr_,o);
292 generate_type(base_type,dims,dims.size()- i - 1,o);
296 if (!is_nil(type_arg1)) {
297 generate_expression(type_arg1.expr_,o);
298 if (!is_nil(type_arg2)) {
300 generate_expression(type_arg2.expr_,o);
302 } else if (!is_nil(type_arg2.expr_)) {
303 generate_expression(type_arg2.expr_,o);
309 for (size_t i = 0; i < dims.size(); ++i)
314 // only generates the test
315 void generate_validate_context_size(std::ostream& o,
316 const std::string& stage,
317 const std::string& var_name,
318 const std::string& base_type,
319 const std::vector<expression>& dims,
320 const expression& type_arg1 = expression(),
321 const expression& type_arg2 = expression()) {
323 << "context__.validate_dims("
324 << '"' << stage << '"'
325 << ", " << '"' << var_name << '"'
326 << ", " << '"' << base_type << '"'
327 << ", context__.to_vec(";
328 for (size_t i = 0; i < dims.size(); ++i) {
330 generate_expression(dims[i].expr_,o);
332 if (!is_nil(type_arg1)) {
333 if (dims.size() > 0) o << ",";
334 generate_expression(type_arg1.expr_,o);
335 if (!is_nil(type_arg2)) {
337 generate_expression(type_arg2.expr_,o);
344 struct var_size_validating_visgen : public visgen {
345 const std::string stage_;
346 var_size_validating_visgen(std::ostream& o, const std::string& stage)
350 void operator()(nil const& /*x*/) const { } // dummy
351 void operator()(int_var_decl const& x) const {
352 generate_validate_context_size(o_,stage_,x.name_,"int",x.dims_);
354 void operator()(double_var_decl const& x) const {
355 generate_validate_context_size(o_,stage_,x.name_,"double",x.dims_);
357 void operator()(vector_var_decl const& x) const {
358 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.M_);
360 void operator()(row_vector_var_decl const& x) const {
361 generate_validate_context_size(o_,stage_,x.name_,"row_vector_d",x.dims_,x.N_);
363 void operator()(simplex_var_decl const& x) const {
364 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
366 void operator()(ordered_var_decl const& x) const {
367 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
369 void operator()(positive_ordered_var_decl const& x) const {
370 generate_validate_context_size(o_,stage_,x.name_,"vector_d",x.dims_,x.K_);
372 void operator()(matrix_var_decl const& x) const {
373 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.M_,x.N_);
375 void operator()(cov_matrix_var_decl const& x) const {
376 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
378 void operator()(corr_matrix_var_decl const& x) const {
379 generate_validate_context_size(o_,stage_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
384 void generate_validate_positive(const std::string& var_name,
385 const expression& expr,
388 o << "stan::math::validate_non_negative_index(\"" << var_name << "\", \"";
389 generate_expression(expr,o);
391 generate_expression(expr,o);
395 // generate_expression(expr,o);
396 // o << ") {" << EOL;
397 // o << INDENT3 << "std::stringstream s__;" << EOL;
398 // o << INDENT3 << "s__ << \"Found negative index for variable declaration.\";" << EOL;
399 // o << INDENT3 << "s__ << \"; declared variable=" << var_name << "\";" << EOL;
400 // o << INDENT3 << "s__ << \"; dimension expression=";
401 // generate_expression(expr,o);
402 // o << "\";" << EOL;
403 // o << INDENT3 << "s__ << \"; expression value=\" << ";
404 // generate_expression(expr,o);
406 // o << INDENT3 << "throw std::invalid_argument(s__.str());" << EOL;
407 // o << INDENT2 << "}" << EOL;
410 void generate_initialization(std::ostream& o,
411 const std::string& var_name,
412 const std::string& base_type,
413 const std::vector<expression>& dims,
414 const expression& type_arg1 = expression(),
415 const expression& type_arg2 = expression()) {
416 // validate all dims are positive
417 for (size_t i = 0; i < dims.size(); ++i)
418 generate_validate_positive(var_name,dims[i],o);
419 if (!is_nil(type_arg1))
420 generate_validate_positive(var_name,type_arg1,o);
421 if (!is_nil(type_arg2))
422 generate_validate_positive(var_name,type_arg2,o);
424 // define variable with initializer
426 << var_name << " = ";
427 generate_type(base_type,dims,dims.size(),o);
428 generate_initializer(o,base_type,dims,type_arg1,type_arg2);
432 struct var_resizing_visgen : public visgen {
433 var_resizing_visgen(std::ostream& o)
436 void operator()(nil const& /*x*/) const { } // dummy
437 void operator()(int_var_decl const& x) const {
438 generate_initialization(o_,x.name_,"int",x.dims_);
440 void operator()(double_var_decl const& x) const {
441 generate_initialization(o_,x.name_,"double",x.dims_);
443 void operator()(vector_var_decl const& x) const {
444 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.M_);
446 void operator()(row_vector_var_decl const& x) const {
447 generate_initialization(o_,x.name_,"row_vector_d",x.dims_,x.N_);
449 void operator()(simplex_var_decl const& x) const {
450 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
452 void operator()(ordered_var_decl const& x) const {
453 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
455 void operator()(positive_ordered_var_decl const& x) const {
456 generate_initialization(o_,x.name_,"vector_d",x.dims_,x.K_);
458 void operator()(matrix_var_decl const& x) const {
459 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.M_,x.N_);
461 void operator()(cov_matrix_var_decl const& x) const {
462 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
464 void operator()(corr_matrix_var_decl const& x) const {
465 generate_initialization(o_,x.name_,"matrix_d",x.dims_,x.K_,x.K_);
469 void generate_var_resizing(const std::vector<var_decl>& vs,
471 var_resizing_visgen vis(o);
472 for (size_t i = 0; i < vs.size(); ++i)
473 boost::apply_visitor(vis, vs[i].decl_);
476 const std::vector<expression> EMPTY_EXP_VECTOR(0);
478 struct init_local_var_visgen : public visgen {
479 const bool declare_vars_;
481 init_local_var_visgen(bool declare_vars,
485 declare_vars_(declare_vars),
488 template <typename D>
489 void generate_initialize_array_bounded(const D& x, const std::string& base_type,
490 const std::string& read_fun_prefix,
491 const std::vector<expression>& dim_args) const {
492 std::vector<expression> read_args;
493 std::string read_fun(read_fun_prefix);
496 read_args.push_back(x.range_.low_);
497 read_args.push_back(x.range_.high_);
498 } else if (has_lb(x)) {
500 read_args.push_back(x.range_.low_);
501 } else if (has_ub(x)) {
503 read_args.push_back(x.range_.high_);
505 for (size_t i = 0; i < dim_args.size(); ++i)
506 read_args.push_back(dim_args[i]);
507 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
509 void operator()(const nil& /*x*/) const { }
510 void operator()(const int_var_decl& x) const {
511 generate_initialize_array("int","integer",EMPTY_EXP_VECTOR,x.name_,x.dims_);
513 void operator()(const double_var_decl& x) const {
514 std::vector<expression> read_args;
515 generate_initialize_array_bounded(x,is_var_?"var":"double","scalar",read_args);
517 void operator()(const vector_var_decl& x) const {
518 std::vector<expression> read_args;
519 read_args.push_back(x.M_);
520 generate_initialize_array_bounded(x,is_var_?"vector_v":"vector_d","vector",read_args);
522 void operator()(const row_vector_var_decl& x) const {
523 std::vector<expression> read_args;
524 read_args.push_back(x.N_);
525 generate_initialize_array_bounded(x,is_var_?"row_vector_v":"row_vector_d","row_vector",read_args);
527 void operator()(const matrix_var_decl& x) const {
528 std::vector<expression> read_args;
529 read_args.push_back(x.M_);
530 read_args.push_back(x.N_);
531 generate_initialize_array_bounded(x,is_var_?"matrix_v":"matrix_d","matrix",read_args);
533 void operator()(const simplex_var_decl& x) const {
534 std::vector<expression> read_args;
535 read_args.push_back(x.K_);
536 generate_initialize_array(is_var_?"vector_v":"vector_d","simplex",read_args,x.name_,x.dims_);
538 void operator()(const ordered_var_decl& x) const {
539 std::vector<expression> read_args;
540 read_args.push_back(x.K_);
541 generate_initialize_array(is_var_?"vector_v":"vector_d","ordered",read_args,x.name_,x.dims_);
543 void operator()(const positive_ordered_var_decl& x) const {
544 std::vector<expression> read_args;
545 read_args.push_back(x.K_);
546 generate_initialize_array(is_var_?"vector_v":"vector_d","positive_ordered",read_args,x.name_,x.dims_);
548 void operator()(const cov_matrix_var_decl& x) const {
549 std::vector<expression> read_args;
550 read_args.push_back(x.K_);
551 generate_initialize_array(is_var_?"matrix_v":"matrix_d","cov_matrix",read_args,x.name_,x.dims_);
553 void operator()(const corr_matrix_var_decl& x) const {
554 std::vector<expression> read_args;
555 read_args.push_back(x.K_);
556 generate_initialize_array(is_var_?"matrix_v":"matrix_d","corr_matrix",read_args,x.name_,x.dims_);
558 void generate_initialize_array(const std::string& var_type,
559 const std::string& read_type,
560 const std::vector<expression>& read_args,
561 const std::string& name,
562 const std::vector<expression>& dims)
565 if (dims.size() == 0) {
566 generate_indent(2,o_);
567 if (declare_vars_) o_ << var_type << " ";
568 o_ << name << " = 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)
581 for (size_t i = 0; i < dims.size(); ++i) o_ << "vector<";
583 for (size_t i = 0; i < dims.size(); ++i) o_ << "> ";
584 o_ << name << ";" << EOL;
586 std::string name_dims(name);
587 for (size_t i = 0; i < dims.size(); ++i) {
588 generate_indent(i + 2, o_);
589 o_ << "size_t dim_" << name << "_" << i << "__ = ";
590 generate_expression(dims[i],o_);
592 if (i < dims.size() - 1) {
593 generate_indent(i + 2, o_);
594 o_ << name_dims << ".resize(dim" << "_" << name << "_" << i << "__);"
596 name_dims.append("[k_").append(to_string(i)).append("__]");
598 generate_indent(i + 2, o_);
599 if (i == dims.size() - 1) {
600 o_ << name_dims << ".reserve(dim_" << name << "_" << i << "__);" << EOL;
601 generate_indent(i + 2, o_);
603 o_ << "for (size_t k_" << i << "__ = 0;"
604 << " k_" << i << "__ < dim_" << name << "_" << i << "__;"
605 << " ++k_" << i << "__) {" << EOL;
606 if (i == dims.size() - 1) {
607 generate_indent(i + 3, o_);
608 o_ << name_dims << ".push_back(in__." << read_type << "_constrain(";
609 for (size_t j = 0; j < read_args.size(); ++j) {
610 if (j > 0) o_ << ",";
611 generate_expression(read_args[j],o_);
613 if (read_args.size() > 0)
619 for (size_t i = dims.size(); i > 0; --i) {
620 generate_indent(i + 1, o_);
626 void generate_local_var_inits(std::vector<var_decl> vs,
631 << "stan::io::reader<"
632 << (is_var ? "var" : "double")
633 << "> in__(params_r__,params_i__);" << EOL2;
634 init_local_var_visgen vis(declare_vars,is_var,o);
635 for (size_t i = 0; i < vs.size(); ++i)
636 boost::apply_visitor(vis, vs[i].decl_);
642 void generate_public_decl(std::ostream& o) {
643 o << "public:" << EOL;
646 void generate_private_decl(std::ostream& o) {
647 o << "private:" << EOL;
651 struct validate_var_decl_visgen : public visgen {
653 validate_var_decl_visgen(int indents,
658 void generate_begin_for_dims(const std::vector<expression>& dims)
661 for (size_t i = 0; i < dims.size(); ++i) {
662 generate_indent(indents_+i,o_);
663 o_ << "for (int k" << i << "__ = 0;"
664 << " k" << i << "__ < ";
665 generate_expression(dims[i].expr_,o_);
667 o_ << " ++k" << i << "__) {" << EOL;
670 void generate_end_for_dims(size_t dims_size) const {
671 for (size_t i = 0; i < dims_size; ++i) {
672 generate_indent(indents_ + dims_size - i - 1, o_);
677 void generate_loop_var(const std::string& name,
678 size_t dims_size) const {
680 for (size_t i = 0; i < dims_size; ++i)
681 o_ << "[k" << i << "__]";
683 void operator()(nil const& /*x*/) const { }
684 template <typename T>
685 void basic_validate(T const& x) const {
686 if (!(x.range_.has_low() || x.range_.has_high()))
687 return; // unconstrained
688 generate_begin_for_dims(x.dims_);
689 generate_indent(indents_ + x.dims_.size(),o_);
690 o_ << "try { " << EOL;
691 if (x.range_.has_low()) {
692 generate_indent(indents_ + 1 + x.dims_.size(),o_);
693 o_ << "check_greater_or_equal(function__,";
694 generate_loop_var(x.name_,x.dims_.size());
696 generate_expression(x.range_.low_.expr_,o_);
698 generate_loop_var(x.name_,x.dims_.size());
701 if (x.range_.has_high()) {
702 generate_indent(indents_ + 1 + x.dims_.size(),o_);
703 o_ << "check_less_or_equal(function__,";
704 generate_loop_var(x.name_,x.dims_.size());
706 generate_expression(x.range_.high_.expr_,o_);
708 generate_loop_var(x.name_,x.dims_.size());
711 generate_indent(indents_ + x.dims_.size(),o_);
712 o_ << "} catch (std::domain_error& e) { throw std::domain_error(std::string(\"Invalid value of " << x.name_ << ": \") + std::string(e.what())); };" << EOL;
713 generate_end_for_dims(x.dims_.size());
715 void operator()(int_var_decl const& x) const {
718 void operator()(double_var_decl const& x) const {
721 void operator()(vector_var_decl const& x) const {
724 void operator()(row_vector_var_decl const& x) const {
727 void operator()(matrix_var_decl const& x) const {
730 template <typename T>
731 void nonbasic_validate(const T& x,
732 const std::string& type_name) const {
733 generate_begin_for_dims(x.dims_);
734 generate_indent(indents_ + x.dims_.size(),o_);
735 o_ << "try { stan::math::check_" << type_name << "(function__,";
736 generate_loop_var(x.name_,x.dims_.size());
738 generate_loop_var(x.name_,x.dims_.size());
739 o_ << "\"); } catch (std::domain_error& e) { throw std::domain_error(std::string(\"Invalid value of " << x.name_ << ": \") + std::string(e.what())); };" << EOL;
740 generate_end_for_dims(x.dims_.size());
742 void operator()(simplex_var_decl const& x) const {
743 nonbasic_validate(x,"simplex");
745 void operator()(ordered_var_decl const& x) const {
746 nonbasic_validate(x,"ordered");
748 void operator()(positive_ordered_var_decl const& x) const {
749 nonbasic_validate(x,"positive_ordered");
751 void operator()(corr_matrix_var_decl const& x) const {
752 nonbasic_validate(x,"corr_matrix");
754 void operator()(cov_matrix_var_decl const& x) const {
755 nonbasic_validate(x,"cov_matrix");
760 void generate_validate_var_decl(const var_decl& decl,
763 validate_var_decl_visgen vis(indent,o);
764 boost::apply_visitor(vis,decl.decl_);
767 void generate_validate_var_decls(const std::vector<var_decl> decls,
770 for (size_t i = 0; i < decls.size(); ++i)
771 generate_validate_var_decl(decls[i],indent,o);
774 // see _var_decl_visgen cut & paste
775 struct member_var_decl_visgen : public visgen {
777 member_var_decl_visgen(int indents,
782 void operator()(nil const& /*x*/) const { }
783 void operator()(int_var_decl const& x) const {
784 declare_array("int",x.name_,x.dims_.size());
786 void operator()(double_var_decl const& x) const {
787 declare_array("double",x.name_,x.dims_.size());
789 void operator()(simplex_var_decl const& x) const {
790 declare_array(("vector_d"), x.name_, x.dims_.size());
792 void operator()(ordered_var_decl const& x) const {
793 declare_array(("vector_d"), x.name_, x.dims_.size());
795 void operator()(positive_ordered_var_decl const& x) const {
796 declare_array(("vector_d"), x.name_, x.dims_.size());
798 void operator()(cov_matrix_var_decl const& x) const {
799 declare_array(("matrix_d"), x.name_, x.dims_.size());
801 void operator()(corr_matrix_var_decl const& x) const {
802 declare_array(("matrix_d"), x.name_, x.dims_.size());
804 void operator()(vector_var_decl const& x) const {
805 declare_array(("vector_d"), x.name_, x.dims_.size());
807 void operator()(row_vector_var_decl const& x) const {
808 declare_array(("row_vector_d"), x.name_, x.dims_.size());
810 void operator()(matrix_var_decl const& x) const {
811 declare_array(("matrix_d"), x.name_, x.dims_.size());
813 void declare_array(std::string const& type, std::string const& name,
815 for (int i = 0; i < indents_; ++i)
817 for (size_t i = 0; i < size; ++i) {
824 for (size_t i = 1; i < size; ++i) {
827 o_ << " " << name << ";" << EOL;
831 void generate_member_var_decls(const std::vector<var_decl>& vs,
834 member_var_decl_visgen vis(indent,o);
835 for (size_t i = 0; i < vs.size(); ++i)
836 boost::apply_visitor(vis,vs[i].decl_);
839 // see member_var_decl_visgen cut & paste
840 struct local_var_decl_visgen : public visgen {
843 local_var_decl_visgen(int indents,
850 void operator()(nil const& /*x*/) const { }
851 void operator()(int_var_decl const& x) const {
852 std::vector<expression> ctor_args;
853 declare_array("int",ctor_args,x.name_,x.dims_);
855 void operator()(double_var_decl const& x) const {
856 std::vector<expression> ctor_args;
857 declare_array(is_var_ ? "var" : "double",
858 ctor_args,x.name_,x.dims_);
860 void operator()(vector_var_decl const& x) const {
861 std::vector<expression> ctor_args;
862 ctor_args.push_back(x.M_);
863 declare_array(is_var_ ? "vector_v" : "vector_d",
864 ctor_args, x.name_, x.dims_);
866 void operator()(row_vector_var_decl const& x) const {
867 std::vector<expression> ctor_args;
868 ctor_args.push_back(x.N_);
869 declare_array(is_var_ ? "row_vector_v" : "row_vector_d",
870 ctor_args, x.name_, x.dims_);
872 void operator()(matrix_var_decl const& x) const {
873 std::vector<expression> ctor_args;
874 ctor_args.push_back(x.M_);
875 ctor_args.push_back(x.N_);
876 declare_array(is_var_ ? "matrix_v" : "matrix_d",
877 ctor_args, x.name_, x.dims_);
879 void operator()(simplex_var_decl const& x) const {
880 std::vector<expression> ctor_args;
881 ctor_args.push_back(x.K_);
882 declare_array(is_var_ ? "vector_v" : "vector_d",
883 ctor_args, x.name_, x.dims_);
885 void operator()(ordered_var_decl const& x) const {
886 std::vector<expression> ctor_args;
887 ctor_args.push_back(x.K_);
888 declare_array(is_var_ ? "vector_v" : "vector_d",
889 ctor_args, x.name_, x.dims_);
891 void operator()(positive_ordered_var_decl const& x) const {
892 std::vector<expression> ctor_args;
893 ctor_args.push_back(x.K_);
894 declare_array(is_var_ ? "vector_v" : "vector_d",
895 ctor_args, x.name_, x.dims_);
897 void operator()(cov_matrix_var_decl const& x) const {
898 std::vector<expression> ctor_args;
899 ctor_args.push_back(x.K_);
900 ctor_args.push_back(x.K_);
901 declare_array(is_var_ ? "matrix_v" : "matrix_d",
902 ctor_args, x.name_, x.dims_);
904 void operator()(corr_matrix_var_decl const& x) const {
905 std::vector<expression> ctor_args;
906 ctor_args.push_back(x.K_);
907 ctor_args.push_back(x.K_);
908 declare_array(is_var_ ? "matrix_v" : "matrix_d",
909 ctor_args, x.name_, x.dims_);
911 void generate_type(const std::string& type,
912 size_t num_dims) const {
913 for (size_t i = 0; i < num_dims; ++i)
916 for (size_t i = 0; i < num_dims; ++i) {
917 if (i > 0) o_ << " ";
921 // var_decl -> type[0] name init_args[0] ;
922 // init_args[k] -> ctor_args if no dims left
923 // init_args[k] -> ( dim[k] , ( type[k+1] init_args[k+1] ) )
924 void generate_init_args(const std::string& type,
925 const std::vector<expression>& ctor_args,
926 const std::vector<expression>& dims,
928 if (dim < dims.size()) { // more dims left
929 o_ << '(
'; // open(1)
930 generate_expression(dims[dim],o_);
931 if ((dim + 1 < dims.size()) || ctor_args.size() > 0) {
932 o_ << ", ("; // open(2)
933 generate_type(type,dims.size() - dim - 1);
934 generate_init_args(type,ctor_args,dims,dim + 1);
935 o_ << ')
'; // close(2)
936 } else if (type == "var") {
937 o_ << ", DUMMY_VAR__";
938 } else if (type == "int") {
940 } else if (type == "double") {
943 // shouldn't hit
this
947 if (ctor_args.size() == 0) {
950 }
else if (type ==
"double") {
952 }
else if (type ==
"var") {
953 o_ <<
"(DUMMY_VAR__)";
958 else if (ctor_args.size() == 1) {
962 }
else if (ctor_args.size() > 1) {
971 void declare_array(
const std::string& type,
972 const std::vector<expression>& ctor_args,
973 const std::string& name,
974 const std::vector<expression>& dims)
const {
981 generate_init_args(type,ctor_args,dims,0);
983 if (type ==
"matrix_v" || type ==
"row_vector_v" || type ==
"vector_v") {
985 o_ <<
"stan::agrad::fill(" << name <<
",DUMMY_VAR__);" <<
EOL;
995 for (
size_t i = 0; i < vs.size(); ++i)
996 boost::apply_visitor(vis,vs[i].decl_);
1010 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1014 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1018 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1022 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1026 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1030 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1034 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1038 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1042 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1046 o_ <<
"stan::agrad::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
1055 generate_comment(
"initialized transformed params to avoid seg fault on val access",
1058 for (
size_t i = 0; i < vs.size(); ++i)
1059 boost::apply_visitor(vis,vs[i].decl_);
1072 std::vector<expression> dims(x.
dims_);
1073 validate_array(x.
name_,dims,0);
1076 std::vector<expression> dims(x.
dims_);
1077 validate_array(x.
name_,dims,0);
1080 std::vector<expression> dims(x.
dims_);
1081 dims.push_back(x.
M_);
1082 validate_array(x.
name_,dims,1);
1085 std::vector<expression> dims(x.
dims_);
1086 dims.push_back(x.
K_);
1087 validate_array(x.
name_,dims,1);
1090 std::vector<expression> dims(x.
dims_);
1091 dims.push_back(x.
K_);
1092 validate_array(x.
name_,dims,1);
1095 std::vector<expression> dims(x.
dims_);
1096 dims.push_back(x.
K_);
1097 validate_array(x.
name_,dims,1);
1100 std::vector<expression> dims(x.
dims_);
1101 dims.push_back(x.
N_);
1102 validate_array(x.
name_,dims,1);
1105 std::vector<expression> dims(x.
dims_);
1106 dims.push_back(x.
M_);
1107 dims.push_back(x.
N_);
1108 validate_array(x.
name_,dims,2);
1111 std::vector<expression> dims(x.
dims_);
1112 dims.push_back(x.
K_);
1113 dims.push_back(x.
K_);
1114 validate_array(x.
name_,dims,2);
1117 std::vector<expression> dims(x.
dims_);
1118 dims.push_back(x.
K_);
1119 dims.push_back(x.
K_);
1120 validate_array(x.
name_,dims,2);
1122 void validate_array(
const std::string& name,
1123 const std::vector<expression>& dims,
1124 size_t matrix_dims)
const {
1126 size_t non_matrix_dims = dims.size() - matrix_dims;
1128 for (
size_t k = 0; k < dims.size(); ++k) {
1130 o_ <<
"for (int i" << k <<
"__ = 0; i" << k <<
"__ < ";
1132 o_ <<
"; ++i" << k <<
"__) {" <<
EOL;
1136 o_ <<
"if (" << name;
1137 for (
size_t k = 0; k < non_matrix_dims; ++k)
1138 o_ <<
"[i" << k <<
"__]";
1139 if (matrix_dims > 0) {
1140 o_ <<
"(i" << non_matrix_dims <<
"__";
1141 if (matrix_dims > 1)
1142 o_ <<
",i" << (non_matrix_dims + 1) <<
"__";
1145 o_ <<
".is_uninitialized()) {" <<
EOL;
1147 o_ <<
"std::stringstream msg__;" <<
EOL;
1149 o_ <<
"msg__ << \"Undefined transformed parameter: "
1151 for (
size_t k = 0; k < dims.size(); ++k) {
1153 o_ <<
" << i" << k <<
"__";
1158 o_ <<
"throw std::runtime_error(msg__.str());" <<
EOL;
1162 for (
size_t k = 0; k < dims.size(); ++k) {
1174 for (
size_t i = 0; i < vs.size(); ++i)
1175 boost::apply_visitor(vis,vs[i].decl_);
1180 bool include_sampling,
bool is_var);
1187 bool include_sampling,
1192 include_sampling_(include_sampling),
1210 if (!include_sampling_)
return;
1213 o_ <<
"lp__ += stan::prob::" << x.
dist_.
family_ <<
"_log<true>(";
1215 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1228 o_ <<
") lp__ -= std::numeric_limits<double>::infinity();" <<
EOL;
1238 o_ <<
") lp__ -= std::numeric_limits<double>::infinity();" <<
EOL;
1246 o_ <<
"lp__ -= log(";
1249 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1255 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1261 o_ <<
"lp__ -= log(";
1264 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1270 o_ <<
"lp__ -= log1m(";
1273 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
1282 size_t indent = has_local_vars ? (indent_ + 1) : indent_;
1283 if (has_local_vars) {
1292 if (has_local_vars) {
1299 o_ <<
"if (pstream__) {" <<
EOL;
1300 for (
size_t i = 0; i < ps.
printables_.size(); ++i) {
1302 o_ <<
"stan_print(pstream__,";
1307 o_ <<
"*pstream__ << std::endl;" <<
EOL;
1313 o_ <<
"for (int " << x.
variable_ <<
" = ";
1324 o_ <<
"while (as_bool(";
1326 o_ <<
")) {" <<
EOL;
1332 for (
size_t i = 0; i < x.
conditions_.size(); ++i) {
1337 o_ <<
"if (as_bool(";
1339 o_ <<
")) {" <<
EOL;
1341 o_, include_sampling_,is_var_);
1346 o_ <<
" else {" <<
EOL;
1348 o_, include_sampling_, is_var_);
1361 bool include_sampling,
1370 bool include_sampling,
1373 for (
size_t i = 0; i < ss.size(); ++i)
1374 boost::apply_visitor(vis,ss[i].statement_);
1381 o <<
INDENT <<
"var log_prob(vector<var>& params_r__," <<
EOL;
1382 o <<
INDENT <<
" vector<int>& params_i__," <<
EOL;
1383 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL2;
1386 o <<
INDENT2 <<
"// Note: this is not a memory leak. Memory will be cleaned up with the arena allocator" <<
EOL;
1387 o <<
INDENT2 <<
"stan::agrad::vari* DUMMY_VARI_PTR__ = new vari(std::numeric_limits<double>::quiet_NaN(),false);" <<
EOL;
1388 o <<
INDENT2 <<
"stan::agrad::var DUMMY_VAR__ = var(DUMMY_VARI_PTR__);" <<
EOL2;
1403 bool include_sampling =
true;
1409 <<
"const char* function__ = \"validate transformed params %1%\";"
1412 <<
"(void) function__; // dummy to suppress unused var warning"
1421 o <<
INDENT <<
"} // log_prob(...var...)" <<
EOL2;
1476 std::vector<expression> dims = x.
dims_;
1477 var_size_validator_(x);
1479 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << x.
name_ <<
"\");" <<
EOL;
1481 size_t indentation = 1;
1482 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1483 size_t dim = dims.size() - dim_up - 1U;
1486 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1490 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_"
1491 << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim
1492 <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1496 for (
size_t dim = 0; dim < dims.size(); ++dim)
1497 o_ <<
"[i_" << dim <<
"__]";
1498 o_ <<
" = vals_i__[pos__++];" <<
EOL;
1499 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1506 std::vector<expression> dims = x.
dims_;
1507 var_size_validator_(x);
1509 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1511 size_t indentation = 1;
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 <<
"__]";
1526 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1527 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1534 std::vector<expression> dims = x.
dims_;
1536 var_size_validator_(x);
1537 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1539 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1542 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1543 size_t indentation = 2;
1544 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1545 size_t dim = dims.size() - dim_up - 1U;
1548 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1552 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1556 for (
size_t dim = 0; dim < dims.size(); ++dim)
1557 o_ <<
"[i_" << dim <<
"__]";
1559 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1560 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1568 std::vector<expression> dims = x.
dims_;
1569 var_size_validator_(x);
1571 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1573 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1576 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1577 size_t indentation = 2;
1578 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1579 size_t dim = dims.size() - dim_up - 1U;
1582 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1586 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1590 for (
size_t dim = 0; dim < dims.size(); ++dim)
1591 o_ <<
"[i_" << dim <<
"__]";
1593 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1594 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1602 std::vector<expression> dims = x.
dims_;
1603 var_size_validator_(x);
1605 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1607 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1610 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1611 size_t indentation = 2;
1612 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1613 size_t dim = dims.size() - dim_up - 1U;
1616 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1620 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1624 for (
size_t dim = 0; dim < dims.size(); ++dim)
1625 o_ <<
"[i_" << dim <<
"__]";
1627 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1628 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1636 std::vector<expression> dims = x.
dims_;
1637 var_size_validator_(x);
1639 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1641 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1644 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1645 size_t indentation = 2;
1646 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1647 size_t dim = dims.size() - dim_up - 1U;
1650 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1654 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1658 for (
size_t dim = 0; dim < dims.size(); ++dim)
1659 o_ <<
"[i_" << dim <<
"__]";
1661 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1662 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1670 std::vector<expression> dims = x.
dims_;
1671 var_size_validator_(x);
1673 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1675 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_i_vec_lim__ = ";
1678 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
1679 size_t indentation = 2;
1680 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1681 size_t dim = dims.size() - dim_up - 1U;
1684 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1688 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1692 for (
size_t dim = 0; dim < dims.size(); ++dim)
1693 o_ <<
"[i_" << dim <<
"__]";
1695 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1696 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1704 std::vector<expression> dims = x.
dims_;
1705 var_size_validator_(x);
1707 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1709 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_m_mat_lim__ = ";
1712 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_n_mat_lim__ = ";
1715 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_n_mat_lim__; ++n_mat__) {" <<
EOL;
1716 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_m_mat_lim__; ++m_mat__) {" <<
EOL;
1717 size_t indentation = 3;
1718 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1719 size_t dim = dims.size() - dim_up - 1U;
1722 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1726 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1730 for (
size_t dim = 0; dim < dims.size(); ++dim)
1731 o_ <<
"[i_" << dim <<
"__]";
1732 o_ <<
"(m_mat__,n_mat__)";
1733 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1734 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1742 std::vector<expression> dims = x.
dims_;
1743 var_size_validator_(x);
1745 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1747 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_k_mat_lim__ = ";
1750 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
1751 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
1752 size_t indentation = 3;
1753 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1754 size_t dim = dims.size() - dim_up - 1U;
1757 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1761 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1765 for (
size_t dim = 0; dim < dims.size(); ++dim)
1766 o_ <<
"[i_" << dim <<
"__]";
1767 o_ <<
"(m_mat__,n_mat__)";
1768 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1769 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1777 std::vector<expression> dims = x.
dims_;
1778 var_size_validator_(x);
1780 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
1782 o_ <<
INDENT2 <<
"size_t " << x.
name_ <<
"_k_mat_lim__ = ";
1785 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
1786 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
1787 size_t indentation = 3;
1788 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
1789 size_t dim = dims.size() - dim_up - 1U;
1792 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
1796 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
1800 for (
size_t dim = 0; dim < dims.size(); ++dim)
1801 o_ <<
"[i_" << dim <<
"__]";
1802 o_ <<
"(m_mat__,n_mat__)";
1803 o_ <<
" = vals_r__[pos__++];" <<
EOL;
1804 for (
size_t dim = 0; dim < dims.size(); ++dim) {
1814 const std::string& var_name,
1816 o << indent <<
"(void) "
1818 <<
" // dummy call to supress warning"
1825 for (
size_t i = 0; i < vs.size(); ++i)
1826 boost::apply_visitor(vis, vs[i].decl_);
1830 const std::string& model_name,
1832 o <<
INDENT << model_name <<
"(stan::io::var_context& context__," <<
EOL;
1833 o <<
INDENT <<
" std::ostream* pstream__ = 0)"
1835 o <<
INDENT2 <<
": prob_grad_ad::prob_grad_ad(0) {"
1837 o <<
INDENT2 <<
"static const char* function__ = \""
1838 << model_name <<
"_namespace::" << model_name <<
"(%1%)\";" <<
EOL;
1842 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
1843 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
1852 bool include_sampling =
false;
1853 bool is_var =
false;
1856 2,o,include_sampling,is_var);
1861 o << EOL <<
INDENT2 <<
"set_param_ranges();" <<
EOL;
1869 var_size_validator_(o,
"initialization") {
1874 var_size_validator_(x);
1877 generate_write_loop(
"integer(",x.
name_,x.
dims_);
1879 template <
typename D>
1880 std::string function_args(
const std::string& fun_prefix,
1882 std::stringstream ss;
1885 ss <<
"_lub_unconstrain(";
1891 ss <<
"_lb_unconstrain(";
1895 ss <<
"_ub_unconstrain(";
1899 ss <<
"_unconstrain(";
1905 generate_check_double(x.
name_,x.
dims_.size());
1906 var_size_validator_(x);
1907 generate_declaration(x.
name_,
"double",x.
dims_);
1909 generate_write_loop(function_args(
"scalar",x),
1913 generate_check_double(x.
name_,x.
dims_.size() + 1);
1914 var_size_validator_(x);
1917 generate_write_loop(function_args(
"vector",x),
1921 generate_check_double(x.
name_,x.
dims_.size() + 1);
1922 var_size_validator_(x);
1923 generate_declaration(x.
name_,
"row_vector_d",x.
dims_,x.
N_);
1925 generate_write_loop(function_args(
"row_vector",x),
1929 generate_check_double(x.
name_,x.
dims_.size() + 2);
1930 var_size_validator_(x);
1933 generate_write_loop(function_args(
"matrix",x),
1937 generate_check_double(x.
name_,x.
dims_.size() + 1);
1938 var_size_validator_(x);
1941 generate_write_loop(
"simplex_unconstrain(",x.
name_,x.
dims_);
1944 generate_check_double(x.
name_,x.
dims_.size() + 1);
1945 var_size_validator_(x);
1948 generate_write_loop(
"ordered_unconstrain(",x.
name_,x.
dims_);
1951 generate_check_double(x.
name_,x.
dims_.size() + 1);
1952 var_size_validator_(x);
1955 generate_write_loop(
"positive_ordered_unconstrain(",x.
name_,x.
dims_);
1958 generate_check_double(x.
name_,x.
dims_.size() + 2);
1959 var_size_validator_(x);
1962 generate_write_loop(
"cov_matrix_unconstrain(",x.
name_,x.
dims_);
1965 generate_check_double(x.
name_,x.
dims_.size() + 2);
1966 var_size_validator_(x);
1969 generate_write_loop(
"corr_matrix_unconstrain(",x.
name_,x.
dims_);
1971 void generate_write_loop(
const std::string& write_method_name,
1972 const std::string& var_name,
1973 const std::vector<expression>& dims)
const {
1974 generate_dims_loop_fwd(dims);
1975 o_ <<
"writer__." << write_method_name;
1976 generate_name_dims(var_name,dims.size());
1979 void generate_name_dims(
const std::string name,
1980 size_t num_dims)
const {
1982 for (
size_t i = 0; i < num_dims; ++i)
1983 o_ <<
"[i" << i <<
"__]";
1985 void generate_declaration(
const std::string& name,
1986 const std::string& base_type,
1987 const std::vector<expression>& dims,
1996 void generate_indent_num_dims(
size_t base_indent,
1997 const std::vector<expression>& dims,
2004 void generate_buffer_loop(
const std::string& base_type,
2005 const std::string& name,
2006 const std::vector<expression>& dims,
2009 int indent = 2U)
const {
2010 size_t size = dims.size();
2013 int extra_indent = is_matrix ? 2U : is_vector ? 1U : 0U;
2016 o_ <<
"for (int j2__ = 0U; j2__ < ";
2018 o_ <<
"; ++j2__)" <<
EOL;
2021 o_ <<
"for (int j1__ = 0U; j1__ < ";
2023 o_ <<
"; ++j1__)" <<
EOL;
2024 }
else if (is_vector) {
2026 o_ <<
"for (int j1__ = 0U; j1__ < ";
2028 o_ <<
"; ++j1__)" <<
EOL;
2030 for (
size_t i = 0; i < size; ++i) {
2031 size_t idx = size - i - 1;
2033 o_ <<
"for (int i" << idx <<
"__ = 0U; i" << idx <<
"__ < ";
2035 o_ <<
"; ++i" << idx <<
"__)" <<
EOL;
2037 generate_indent_num_dims(2U,dims,dim1,dim2);
2039 for (
size_t i = 0; i < dims.size(); ++i)
2040 o_ <<
"[i" << i <<
"__]";
2042 o_ <<
"(j1__,j2__)";
2045 o_ <<
" = vals_" << base_type <<
"__[pos__++];" <<
EOL;
2047 void generate_dims_loop_fwd(
const std::vector<expression>& dims,
2048 int indent = 2U)
const {
2049 size_t size = dims.size();
2050 for (
size_t i = 0; i < size; ++i) {
2052 o_ <<
"for (int i" << i <<
"__ = 0U; i" << i <<
"__ < ";
2054 o_ <<
"; ++i" << i <<
"__)" <<
EOL;
2060 <<
"if (!(context__.contains_i(\"" << name <<
"\")))"
2062 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" <<
EOL;
2063 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << name <<
"\");" <<
EOL;
2068 <<
"if (!(context__.contains_r(\"" << name <<
"\")))"
2070 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" <<
EOL;
2071 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << name <<
"\");" <<
EOL;
2080 o <<
INDENT <<
"void transform_inits(const stan::io::var_context& context__," <<
EOL;
2081 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2082 o <<
INDENT <<
" std::vector<double>& params_r__) {" <<
EOL;
2083 o <<
INDENT2 <<
"params_r__.clear();" <<
EOL;
2084 o <<
INDENT2 <<
"params_i__.clear();" <<
EOL;
2085 o <<
INDENT2 <<
"stan::io::writer<double> writer__(params_r__,params_i__);" <<
EOL;
2087 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
2088 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
2091 for (
size_t i = 0; i < vs.size(); ++i)
2092 boost::apply_visitor(vis, vs[i].decl_);
2094 o <<
INDENT2 <<
"params_r__ = writer__.data_r();" <<
EOL;
2095 o <<
INDENT2 <<
"params_i__ = writer__.data_i();" <<
EOL;
2112 std::vector<expression> matrix_args;
2113 matrix_args.push_back(x.
M_);
2114 generate_dims_array(matrix_args,x.
dims_);
2117 std::vector<expression> matrix_args;
2118 matrix_args.push_back(x.
N_);
2119 generate_dims_array(matrix_args,x.
dims_);
2122 std::vector<expression> matrix_args;
2123 matrix_args.push_back(x.
M_);
2124 matrix_args.push_back(x.
N_);
2125 generate_dims_array(matrix_args,x.
dims_);
2128 std::vector<expression> matrix_args;
2129 matrix_args.push_back(x.
K_);
2130 generate_dims_array(matrix_args,x.
dims_);
2133 std::vector<expression> matrix_args;
2134 matrix_args.push_back(x.
K_);
2135 generate_dims_array(matrix_args,x.
dims_);
2138 std::vector<expression> matrix_args;
2139 matrix_args.push_back(x.
K_);
2140 generate_dims_array(matrix_args,x.
dims_);
2143 std::vector<expression> matrix_args;
2144 matrix_args.push_back(x.
K_);
2145 matrix_args.push_back(x.
K_);
2146 generate_dims_array(matrix_args,x.
dims_);
2149 std::vector<expression> matrix_args;
2150 matrix_args.push_back(x.
K_);
2151 matrix_args.push_back(x.
K_);
2152 generate_dims_array(matrix_args,x.
dims_);
2155 generate_dims_array(
const std::vector<expression>& matrix_dims_exprs,
2156 const std::vector<expression>& array_dims_exprs)
2160 for (
size_t i = 0; i < array_dims_exprs.size(); ++i) {
2161 o_ <<
INDENT2 <<
"dims__.push_back(";
2166 for (
size_t i = 0; i < matrix_dims_exprs.size(); ++i) {
2167 o_ <<
INDENT2 <<
"dims__.push_back(";
2171 o_ <<
INDENT2 <<
"dimss__.push_back(dims__);" <<
EOL;
2180 <<
"void get_dims(std::vector<std::vector<size_t> >& dimss__) {"
2184 o <<
INDENT2 <<
"std::vector<size_t> dims__;" <<
EOL;
2191 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2192 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2210 generate_param_names(x.
name_);
2213 generate_param_names(x.
name_);
2216 generate_param_names(x.
name_);
2219 generate_param_names(x.
name_);
2222 generate_param_names(x.
name_);
2225 generate_param_names(x.
name_);
2228 generate_param_names(x.
name_);
2231 generate_param_names(x.
name_);
2234 generate_param_names(x.
name_);
2237 generate_param_names(x.
name_);
2242 <<
"names__.push_back(\"" << name <<
"\");"
2252 <<
"void get_param_names(std::vector<std::string>& names__) {"
2256 <<
"names__.resize(0);"
2264 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2265 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2290 std::vector<expression> matrix_args;
2291 matrix_args.push_back(x.
M_);
2292 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2295 std::vector<expression> matrix_args;
2296 matrix_args.push_back(x.
N_);
2297 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2300 std::vector<expression> matrix_args;
2301 matrix_args.push_back(x.
M_);
2302 matrix_args.push_back(x.
N_);
2303 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2306 std::vector<expression> matrix_args;
2307 matrix_args.push_back(x.
K_);
2308 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2311 std::vector<expression> matrix_args;
2312 matrix_args.push_back(x.
K_);
2313 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2316 std::vector<expression> matrix_args;
2317 matrix_args.push_back(x.
K_);
2318 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2321 std::vector<expression> matrix_args;
2322 matrix_args.push_back(x.
K_);
2323 matrix_args.push_back(x.
K_);
2324 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2327 std::vector<expression> matrix_args;
2328 matrix_args.push_back(x.
K_);
2329 matrix_args.push_back(x.
K_);
2330 generate_csv_header_array(matrix_args,x.
name_,x.
dims_);
2333 generate_csv_header_array(
const std::vector<expression>& matrix_dims,
2334 const std::string& name,
2335 const std::vector<expression>& dims)
const {
2338 std::vector<expression> combo_dims(dims);
2339 for (
size_t i = 0; i < matrix_dims.size(); ++i)
2340 combo_dims.push_back(matrix_dims[i]);
2342 for (
size_t i = 0; i < combo_dims.size(); ++i) {
2344 o_ <<
"for (int k_" << i <<
"__ = 1;"
2345 <<
" k_" << i <<
"__ <= ";
2347 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2352 o_ <<
"writer__.comma();" <<
EOL;
2355 o_ <<
"o__ << \"" << name <<
'"';
2356 for (
size_t i = 0; i < combo_dims.size(); ++i)
2357 o_ <<
" << '.' << k_" << i <<
"__";
2361 for (
size_t i = 0; i < combo_dims.size(); ++i) {
2372 o <<
EOL <<
INDENT <<
"void write_csv_header(std::ostream& o__) {" <<
EOL;
2373 o <<
INDENT2 <<
"stan::io::csv_writer writer__(o__);" <<
EOL;
2380 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
2381 boost::apply_visitor(vis,prog.
derived_decl_.first[i].decl_);
2387 o <<
INDENT2 <<
"writer__.newline();" <<
EOL;
2396 template <
typename D>
2397 void generate_initialize_array_bounded(
const D& x,
const std::string& base_type,
2398 const std::string& read_fun_prefix,
2399 const std::vector<expression>& dim_args)
const {
2400 std::vector<expression> read_args;
2401 std::string read_fun(read_fun_prefix);
2404 read_args.push_back(x.range_.low_);
2405 read_args.push_back(x.range_.high_);
2408 read_args.push_back(x.range_.low_);
2411 read_args.push_back(x.range_.high_);
2413 for (
size_t i = 0; i < dim_args.size(); ++i)
2414 read_args.push_back(dim_args[i]);
2415 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
2423 std::vector<expression> read_args;
2424 generate_initialize_array_bounded(x,
"double",
"scalar",read_args);
2427 std::vector<expression> read_args;
2428 read_args.push_back(x.
M_);
2429 generate_initialize_array_bounded(x,
"vector_d",
"vector",read_args);
2432 std::vector<expression> read_args;
2433 read_args.push_back(x.
N_);
2434 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",read_args);
2437 std::vector<expression> read_args;
2438 read_args.push_back(x.
M_);
2439 read_args.push_back(x.
N_);
2440 generate_initialize_array_bounded(x,
"matrix_d",
"matrix",read_args);
2443 std::vector<expression> read_args;
2444 read_args.push_back(x.
K_);
2445 generate_initialize_array(
"vector_d",
"simplex",read_args,x.
name_,x.
dims_);
2448 std::vector<expression> read_args;
2449 read_args.push_back(x.
K_);
2450 generate_initialize_array(
"vector_d",
"ordered",read_args,x.
name_,x.
dims_);
2453 std::vector<expression> read_args;
2454 read_args.push_back(x.
K_);
2455 generate_initialize_array(
"vector_d",
"positive_ordered",read_args,x.
name_,x.
dims_);
2458 std::vector<expression> read_args;
2459 read_args.push_back(x.
K_);
2460 generate_initialize_array(
"matrix_d",
"cov_matrix",read_args,x.
name_,x.
dims_);
2463 std::vector<expression> read_args;
2464 read_args.push_back(x.
K_);
2465 generate_initialize_array(
"matrix_d",
"corr_matrix",read_args,x.
name_,x.
dims_);
2467 void generate_initialize_array(
const std::string& var_type,
2468 const std::string& read_type,
2469 const std::vector<expression>& read_args,
2470 const std::string& name,
2471 const std::vector<expression>& dims)
const {
2472 if (dims.size() == 0) {
2474 o_ << var_type <<
" ";
2475 o_ << name <<
" = in__." << read_type <<
"_constrain(";
2476 for (
size_t j = 0; j < read_args.size(); ++j) {
2477 if (j > 0) o_ <<
",";
2481 o_ <<
INDENT2 <<
"writer__.write(" << name <<
");" <<
EOL;
2485 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"vector<";
2487 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"> ";
2488 o_ << name <<
";" <<
EOL;
2489 std::string name_dims(name);
2490 for (
size_t i = 0; i < dims.size(); ++i) {
2492 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
2495 if (i < dims.size() - 1) {
2497 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);"
2499 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
2502 o_ <<
"for (size_t k_" << i <<
"__ = 0;"
2503 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;"
2504 <<
" ++k_" << i <<
"__) {" <<
EOL;
2505 if (i == dims.size() - 1) {
2507 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
2508 for (
size_t j = 0; j < read_args.size(); ++j) {
2509 if (j > 0) o_ <<
",";
2516 o_ <<
"writer__.write(" << name;
2517 if (dims.size() > 0) {
2519 for (
size_t i = 0; i < dims.size(); ++i) {
2520 if (i > 0) o_ <<
"][";
2521 o_ <<
"k_" << i <<
"__";
2527 for (
size_t i = dims.size(); i > 0; --i) {
2573 void write_array(
const std::string& name,
2574 const std::vector<expression>& dims)
const {
2575 if (dims.size() == 0) {
2576 o_ <<
INDENT2 <<
"writer__.write(" << name <<
");" <<
EOL;
2579 for (
size_t i = 0; i < dims.size(); ++i) {
2581 o_ <<
"for (int k_" << i <<
"__ = 0;"
2582 <<
" k_" << i <<
"__ < ";
2584 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2588 o_ <<
"writer__.write(" << name;
2589 if (dims.size() > 0) {
2591 for (
size_t i = 0; i < dims.size(); ++i) {
2592 if (i > 0) o_ <<
"][";
2593 o_ <<
"k_" << i <<
"__";
2599 for (
size_t i = dims.size(); i > 0; --i) {
2608 const std::string& model_name,
2610 o <<
INDENT <<
"void write_csv(std::vector<double>& params_r__," <<
EOL;
2611 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2612 o <<
INDENT <<
" std::ostream& o__," <<
EOL;
2613 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
2614 o <<
INDENT2 <<
"stan::io::reader<double> in__(params_r__,params_i__);"
2616 o <<
INDENT2 <<
"stan::io::csv_writer writer__(o__);" <<
EOL;
2617 o <<
INDENT2 <<
"static const char* function__ = \""
2618 << model_name <<
"_namespace::write_csv(%1%)\";" <<
EOL;
2637 bool is_var =
false;
2640 bool include_sampling =
false;
2648 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
2649 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
2664 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
2668 o <<
INDENT2 <<
"writer__.newline();" <<
EOL;
2684 template <
typename D>
2685 void generate_initialize_array_bounded(
const D& x,
const std::string& base_type,
2686 const std::string& read_fun_prefix,
2687 const std::vector<expression>& dim_args)
const {
2688 std::vector<expression> read_args;
2689 std::string read_fun(read_fun_prefix);
2692 read_args.push_back(x.range_.low_);
2693 read_args.push_back(x.range_.high_);
2696 read_args.push_back(x.range_.low_);
2699 read_args.push_back(x.range_.high_);
2701 for (
size_t i = 0; i < dim_args.size(); ++i)
2702 read_args.push_back(dim_args[i]);
2703 generate_initialize_array(base_type,read_fun,read_args,x.name_,x.dims_);
2707 std::vector<expression> read_args;
2708 generate_initialize_array_bounded(x,
"double",
"scalar",read_args);
2711 std::vector<expression> read_args;
2712 read_args.push_back(x.
M_);
2713 generate_initialize_array_bounded(x,
"vector_d",
"vector",read_args);
2716 std::vector<expression> read_args;
2717 read_args.push_back(x.
N_);
2718 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",read_args);
2721 std::vector<expression> read_args;
2722 read_args.push_back(x.
M_);
2723 read_args.push_back(x.
N_);
2724 generate_initialize_array_bounded(x,
"matrix_d",
"matrix",read_args);
2727 std::vector<expression> read_args;
2728 read_args.push_back(x.
K_);
2729 generate_initialize_array(
"vector_d",
"simplex",read_args,x.
name_,x.
dims_);
2732 std::vector<expression> read_args;
2733 read_args.push_back(x.
K_);
2734 generate_initialize_array(
"vector_d",
"ordered",read_args,x.
name_,x.
dims_);
2737 std::vector<expression> read_args;
2738 read_args.push_back(x.
K_);
2739 generate_initialize_array(
"vector_d",
"positive_ordered",read_args,x.
name_,x.
dims_);
2742 std::vector<expression> read_args;
2743 read_args.push_back(x.
K_);
2744 generate_initialize_array(
"matrix_d",
"cov_matrix",read_args,x.
name_,x.
dims_);
2747 std::vector<expression> read_args;
2748 read_args.push_back(x.
K_);
2749 generate_initialize_array(
"matrix_d",
"corr_matrix",read_args,x.
name_,x.
dims_);
2751 void generate_initialize_array(
const std::string& var_type,
2752 const std::string& read_type,
2753 const std::vector<expression>& read_args,
2754 const std::string& name,
2755 const std::vector<expression>& dims)
const {
2756 if (dims.size() == 0) {
2758 o_ << var_type <<
" ";
2759 o_ << name <<
" = in__." << read_type <<
"_constrain(";
2760 for (
size_t j = 0; j < read_args.size(); ++j) {
2761 if (j > 0) o_ <<
",";
2768 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"vector<";
2770 for (
size_t i = 0; i < dims.size(); ++i) o_ <<
"> ";
2771 o_ << name <<
";" <<
EOL;
2772 std::string name_dims(name);
2773 for (
size_t i = 0; i < dims.size(); ++i) {
2775 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
2778 if (i < dims.size() - 1) {
2780 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);"
2782 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
2785 o_ <<
"for (size_t k_" << i <<
"__ = 0;"
2786 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;"
2787 <<
" ++k_" << i <<
"__) {" <<
EOL;
2788 if (i == dims.size() - 1) {
2790 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
2791 for (
size_t j = 0; j < read_args.size(); ++j) {
2792 if (j > 0) o_ <<
",";
2812 for (
size_t i = dims.size(); i > 0; --i) {
2837 std::vector<expression> dims(x.
dims_);
2838 dims.push_back(x.
M_);
2842 std::vector<expression> dims(x.
dims_);
2843 dims.push_back(x.
N_);
2847 std::vector<expression> matdims;
2848 matdims.push_back(x.
M_);
2849 matdims.push_back(x.
N_);
2853 std::vector<expression> dims(x.
dims_);
2854 dims.push_back(x.
K_);
2858 std::vector<expression> dims(x.
dims_);
2859 dims.push_back(x.
K_);
2863 std::vector<expression> dims(x.
dims_);
2864 dims.push_back(x.
K_);
2868 std::vector<expression> matdims;
2869 matdims.push_back(x.
K_);
2870 matdims.push_back(x.
K_);
2874 std::vector<expression> matdims;
2875 matdims.push_back(x.
K_);
2876 matdims.push_back(x.
K_);
2879 void write_array(
const std::string& name,
2880 const std::vector<expression>& arraydims,
2881 const std::vector<expression>& matdims)
const {
2883 std::vector<expression> dims(arraydims);
2884 for (
size_t i = 0; i < matdims.size(); ++i)
2885 dims.push_back(matdims[i]);
2887 if (dims.size() == 0) {
2888 o_ <<
INDENT2 <<
"vars__.push_back(" << name <<
");" <<
EOL;
2893 for (
size_t i = dims.size(); i > 0; ) {
2896 o_ <<
"for (int k_" << i <<
"__ = 0;"
2897 <<
" k_" << i <<
"__ < ";
2899 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
2903 o_ <<
"vars__.push_back(" << name;
2904 if (arraydims.size() > 0) {
2906 for (
size_t i = 0; i < arraydims.size(); ++i) {
2907 if (i > 0) o_ <<
"][";
2908 o_ <<
"k_" << i <<
"__";
2912 if (matdims.size() > 0) {
2913 o_ <<
"(k_" << arraydims.size() <<
"__";
2914 if (matdims.size() > 1)
2915 o_ <<
", k_" << (arraydims.size() + 1) <<
"__";
2920 for (
size_t i = dims.size(); i > 0; --i) {
2929 const std::string& model_name,
2931 o <<
INDENT <<
"void write_array(std::vector<double>& params_r__," <<
EOL;
2932 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
2933 o <<
INDENT <<
" std::vector<double>& vars__," <<
EOL;
2934 o <<
INDENT <<
" std::ostream* pstream__ = 0) {" <<
EOL;
2936 o <<
INDENT2 <<
"stan::io::reader<double> in__(params_r__,params_i__);" <<
EOL;
2937 o <<
INDENT2 <<
"static const char* function__ = \""
2938 << model_name <<
"_namespace::write_array(%1%)\";" <<
EOL;
2959 bool is_var =
false;
2962 bool include_sampling =
false;
2971 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
2972 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
2987 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
3002 generate_increment_i(x.
dims_);
3004 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3006 o_ <<
"for (size_t i_" << i <<
"__ = 0; ";
3007 o_ <<
"i_" << i <<
"__ < ";
3009 o_ <<
"; ++i_" << i <<
"__) {" <<
EOL;
3013 o_ <<
"param_ranges_i__.push_back(std::pair<int,int>(";
3019 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3025 generate_increment(x.
dims_);
3028 generate_increment(x.
M_,x.
dims_);
3031 generate_increment(x.
N_,x.
dims_);
3038 o_ <<
INDENT2 <<
"num_params_r__ += (";
3041 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3048 generate_increment(x.
K_,x.
dims_);
3051 generate_increment(x.
K_,x.
dims_);
3055 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3059 o_ <<
" - 1)) / 2 + ";
3062 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3069 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3073 o_ <<
" - 1)) / 2)";
3074 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3082 if (dims.size() == 0) {
3086 o_ <<
INDENT2 <<
"num_params_r__ += ";
3087 for (
size_t i = 0; i < dims.size(); ++i) {
3088 if (i > 0) o_ <<
" * ";
3094 if (dims.size() == 0) {
3098 o_ <<
INDENT2 <<
"num_params_r__ += ";
3099 for (
size_t i = 0; i < dims.size(); ++i) {
3100 if (i > 0) o_ <<
" * ";
3106 std::vector<expression> dims)
const {
3107 o_ <<
INDENT2 <<
"num_params_r__ += ";
3109 for (
size_t i = 0; i < dims.size(); ++i) {
3117 std::vector<expression> dims)
const {
3118 o_ <<
INDENT2 <<
"num_params_r__ += ";
3122 for (
size_t i = 0; i < dims.size(); ++i) {
3133 o <<
INDENT <<
"void set_param_ranges() {" <<
EOL;
3134 o <<
INDENT2 <<
"num_params_r__ = 0U;" <<
EOL;
3135 o <<
INDENT2 <<
"param_ranges_i__.clear();" <<
EOL;
3137 for (
size_t i = 0; i < var_decls.size(); ++i)
3138 boost::apply_visitor(vis,var_decls[i].decl_);
3143 std::ostream& out) {
3144 out <<
"int main(int argc, const char* argv[]) {" <<
EOL;
3146 out <<
INDENT2 <<
"stan::gm::nuts_command<" << model_name
3147 <<
"_namespace::" << model_name <<
">(argc,argv);" <<
EOL;
3148 out <<
INDENT <<
"} catch (std::exception& e) {" <<
EOL;
3150 <<
"std::cerr << std::endl << \"Exception: \" << e.what() << std::endl;"
3153 <<
"std::cerr << \"Diagnostic information: \" << std::endl << boost::diagnostic_information(e) << std::endl;"
3162 const std::string& model_name,
3164 bool include_main =
true) {