1 #ifndef STAN_LANG_GENERATOR_HPP 2 #define STAN_LANG_GENERATOR_HPP 4 #include <boost/variant/apply_visitor.hpp> 5 #include <boost/lexical_cast.hpp> 32 const std::string& scalar_t_name,
37 bool include_sampling,
43 bool include_sampling,
47 const std::string
EOL(
"\n");
48 const std::string
EOL2(
"\n\n");
49 const std::string
INDENT(
" ");
55 return !
is_nil(x.range_.low_.expr_) && !
is_nil(x.range_.high_.expr_);
59 return is_nil(x.range_.low_.expr_) && !
is_nil(x.range_.high_.expr_);
63 return !
is_nil(x.range_.low_.expr_) &&
is_nil(x.range_.high_.expr_);
74 for (
size_t k = 0; k < indent; ++k)
82 o <<
"(void) " << name <<
"; // dummy to suppress unused var warning";
90 explicit visgen(std::ostream& o) : o_(o) { }
95 o <<
"namespace " << name <<
"_namespace {" <<
EOL2;
99 o <<
"} // namespace" <<
EOL2;
105 o <<
"// " << msg <<
EOL;
121 for (
size_t i = 0; i < s.size(); ++i) {
122 o << ((s[i] ==
'"') ?
'\'' : s[i]);
128 const std::vector<expression> indexes,
131 static const bool user_facing =
true;
133 if (indexes.size() == 0)
return;
135 for (
size_t i = 0; i < indexes.size(); ++i) {
136 if (i > 0) o <<
", ";
142 template <
bool isLHS>
144 const std::vector<expression> indexes,
153 size_t ai_size = indexes.size();
159 if (ai_size <= (e_num_dims + 1) || base_type !=
MATRIX_T) {
160 for (
size_t n = 0; n < ai_size; ++n)
161 o << (isLHS ?
"get_base1_lhs(" :
"get_base1(");
163 for (
size_t n = 0; n < ai_size; ++n) {
168 o <<
',' << (n+1) <<
')';
171 for (
size_t n = 0; n < ai_size - 1; ++n)
172 o << (isLHS ?
"get_base1_lhs(" :
"get_base1(");
174 for (
size_t n = 0; n < ai_size - 2; ++n) {
179 o <<
',' << (n+1) <<
')';
187 o <<
',' << (ai_size-1U) <<
')';
192 const std::vector<expression>& ,
195 for (
size_t i = 0; i < end; ++i) o <<
"std::vector<";
197 for (
size_t i = 0; i < end; ++i) {
203 void generate_idxs(const std::vector<idx>& idxs, 205 void generate_idxs_user(const std::vector<idx>& idxs, 208 struct expression_visgen : public visgen { 209 const bool user_facing_; 210 const bool is_var_context_; 211 explicit expression_visgen(std::ostream& o, bool user_facing, 214 user_facing_(user_facing), 215 is_var_context_(is_var_context) { 217 void operator()(nil const& /*x*/) const { 220 void operator()(const int_literal& n) const { o_ << n.val_; } 221 void operator()(const double_literal& x) const { 222 std::string num_str = boost::lexical_cast<std::string>(x.val_); 224 if (num_str.find_first_of("eE.") == std::string::npos) 225 o_ << ".0"; // trailing 0 to ensure C++ makes it a double 227 void operator()(const array_literal& x) const { 228 o_ << "stan::math::new_array<"; 229 generate_type("foobar", 234 for (size_t i = 0; i < x.args_.size(); ++i) { 236 generate_expression(x.args_[i], o_); 241 void operator()(const variable& v) const { o_ << v.name_; } 242 void operator()(int n) const { // NOLINT 243 o_ << static_cast<long>(n); // NOLINT 245 void operator()(double x) const { o_ << x; } 246 void operator()(const std::string& x) const { o_ << x; } // identifiers 247 void operator()(const index_op& x) const { 248 std::stringstream expr_o; 249 generate_expression(x.expr_, expr_o); 250 std::string expr_string = expr_o.str(); 251 std::vector<expression> indexes; 252 size_t e_num_dims = x.expr_.expression_type().num_dims_; 253 base_expr_type base_type = x.expr_.expression_type().base_type_; 254 for (size_t i = 0; i < x.dimss_.size(); ++i) 255 for (size_t j = 0; j < x.dimss_[i].size(); ++j) 256 indexes.push_back(x.dimss_[i][j]); // wasteful copy, could use refs 257 generate_indexed_expr<false>(expr_string, indexes, base_type, 258 e_num_dims, user_facing_, o_); 260 void operator()(const index_op_sliced& x) const { 261 if (x.idxs_.size() == 0) { 262 generate_expression(x.expr_, user_facing_, o_); 266 generate_expression(x.expr_, user_facing_, o_); 267 generate_idxs_user(x.idxs_, o_); 270 o_ << "stan::model::rvalue("; 271 generate_expression(x.expr_, o_); 273 generate_idxs(x.idxs_, o_); 276 bool user_facing = true; 277 generate_expression(x.expr_, user_facing, o_); 281 void operator()(const integrate_ode& fx) const { 282 o_ << (fx.integration_function_name_ == "integrate_ode" 283 ? "integrate_ode_rk45" 284 : fx.integration_function_name_) 286 << fx.system_function_name_ 289 generate_expression(fx.y0_, o_); 292 generate_expression(fx.t0_, o_); 295 generate_expression(fx.ts_, o_); 298 generate_expression(fx.theta_, o_); 301 generate_expression(fx.x_, o_); 304 generate_expression(fx.x_int_, o_); 305 o_ << ", pstream__)"; 307 void operator()(const integrate_ode_control& fx) const { 308 o_ << fx.integration_function_name_ 310 << fx.system_function_name_ 313 generate_expression(fx.y0_, o_); 316 generate_expression(fx.t0_, o_); 319 generate_expression(fx.ts_, o_); 322 generate_expression(fx.theta_, o_); 325 generate_expression(fx.x_, o_); 328 generate_expression(fx.x_int_, o_); 329 o_ << ", pstream__, "; 331 generate_expression(fx.rel_tol_, o_); 334 generate_expression(fx.abs_tol_, o_); 337 generate_expression(fx.max_num_steps_, o_); 340 void operator()(const fun& fx) const { 341 // first test if short-circuit op (binary && and || applied to 342 // primitives; overloads are eager, not short-circuiting) 343 if (fx.name_ == "logical_or" || fx.name_ == "logical_and") { 344 o_ << "(primitive_value("; 345 boost::apply_visitor(*this, fx.args_[0].expr_); 346 o_ << ") " << ((fx.name_ == "logical_or") ? "||" : "&&") 347 << " primitive_value("; 348 boost::apply_visitor(*this, fx.args_[1].expr_); 352 o_ << fx.name_ << '(
'; 353 for (size_t i = 0; i < fx.args_.size(); ++i) { 354 if (i > 0) o_ << ',
'; 355 boost::apply_visitor(*this, fx.args_[i].expr_); 357 if (fx.args_.size() > 0 358 && (has_rng_suffix(fx.name_) || has_lp_suffix(fx.name_))) 360 if (has_rng_suffix(fx.name_)) 362 if (has_lp_suffix(fx.name_)) 363 o_ << "lp__, lp_accum__"; 364 if (is_user_defined(fx)) { 365 if (fx.args_.size() > 0 366 || has_rng_suffix(fx.name_) 367 || has_lp_suffix(fx.name_)) 374 void operator()(const conditional_op& expr) const { 375 bool types_prim_match 376 = (expr.type_.is_primitive() && expr.type_.base_type_ == INT_T) 377 || (!expr.has_var_ && expr.type_.is_primitive() 378 && (expr.true_val_.expression_type() 379 == expr.false_val_.expression_type())); 381 std::stringstream ss; 382 if (is_fun_origin(expr.var_origin_)) { 383 ss << "fun_scalar_t__"; 384 } else if (is_var_context_) { 391 boost::apply_visitor(*this, expr.cond_.expr_); 393 if (types_prim_match) { 394 boost::apply_visitor(*this, expr.true_val_.expr_); 396 o_ << "stan::math::promote_scalar<" 399 boost::apply_visitor(*this, expr.true_val_.expr_); 403 if (types_prim_match) { 404 boost::apply_visitor(*this, expr.false_val_.expr_); 406 o_ << "stan::math::promote_scalar<" 409 boost::apply_visitor(*this, expr.false_val_.expr_); 415 void operator()(const binary_op& expr) const { 417 boost::apply_visitor(*this, expr.left.expr_); 418 o_ << ' ' << expr.op << ' '; 419 boost::apply_visitor(*this, expr.right.expr_); 422 void operator()(const unary_op& expr) const { 423 o_ << expr.op << '(
'; 424 boost::apply_visitor(*this, expr.subject.expr_); 427 }; // close struct expression_visgen 429 void generate_expression(const expression& e, 433 expression_visgen vis(o, user_facing, is_var_context); 434 boost::apply_visitor(vis, e.expr_); 438 void generate_expression(const expression& e, 441 static const bool is_var_context = false; // default value 442 expression_visgen vis(o, user_facing, is_var_context); 443 boost::apply_visitor(vis, e.expr_); 446 void generate_expression(const expression& e, std::ostream& o) { 447 static const bool user_facing = false; // default value 448 static const bool is_var_context = false; // default value 449 generate_expression(e, user_facing, is_var_context, o); 452 static void print_string_literal(std::ostream& o, 453 const std::string& s) { 455 for (size_t i = 0; i < s.size(); ++i) { 456 if (s[i] == '"' || s[i] == '\\
' || s[i] == '\
'' )
465 std::stringstream ss;
486 o <<
"using " << type <<
";" <<
EOL;
490 o <<
"using namespace " << ns <<
";" <<
EOL;
507 const std::string& abbrev,
509 o <<
"typedef" <<
" " << type <<
" " << abbrev <<
";" <<
EOL;
523 o <<
"#include" <<
" " <<
"<" << lib_name <<
">" <<
EOL;
532 o <<
"// Code generated by Stan version " 538 o <<
"class " << model_name <<
" : public prob_grad {" <<
EOL;
542 o <<
"}; // model" <<
EOL2;
548 o <<
"static_cast<Eigen::VectorXd::Index>(";
554 const std::string& base_type,
555 const std::vector<expression>& dims,
558 for (
size_t i = 0; i < dims.size(); ++i) {
572 }
else if (!
is_nil(type_arg2.expr_)) {
579 for (
size_t i = 0; i < dims.size(); ++i)
586 const std::string& stage,
587 const std::string& var_name,
588 const std::string& base_type,
589 const std::vector<expression>& dims,
595 <<
"context__.validate_dims(" 596 <<
'"' << stage <<
'"' 597 <<
", " <<
'"' << var_name <<
'"' 598 <<
", " <<
'"' << base_type <<
'"' 599 <<
", context__.to_vec(";
600 for (
size_t i = 0; i < dims.size(); ++i) {
605 if (dims.size() > 0) o <<
",";
627 o_ <<
"stan::math::fill(" << x.
name_ 628 <<
", std::numeric_limits<int>::min());" 633 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
637 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
641 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
645 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
649 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
653 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
657 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
661 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
665 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
669 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
673 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
677 o_ <<
"stan::math::fill(" << x.
name_ <<
",DUMMY_VAR__);" <<
EOL;
687 " avoid seg fault on val access",
689 for (
size_t i = 0; i < vs.size(); ++i) {
690 if (!vs[i].has_def()) {
691 boost::apply_visitor(vis, vs[i].decl_);
703 is_var_context_(is_var_context),
748 template <
typename T>
751 o_ <<
"stan::math::initialize(" << x.name_ <<
", " 754 :
"std::numeric_limits<double>::quiet_NaN()")
824 o <<
"validate_non_negative_index(\"" << var_name <<
"\", ";
832 const std::string& var_name,
833 const std::string& base_type,
834 const std::vector<expression>& dims,
838 for (
size_t i = 0; i < dims.size(); ++i)
847 << var_name <<
" = ";
905 for (
size_t i = 0; i < vs.size(); ++i) {
906 boost::apply_visitor(vis_resizer, vs[i].decl_);
907 boost::apply_visitor(vis_filler, vs[i].decl_);
908 if (vs[i].has_def()) {
909 o <<
INDENT2 <<
"stan::math::assign(" 927 declare_vars_(declare_vars),
928 is_var_context_(is_var_context) {
930 template <
typename D>
932 const std::string& base_type,
933 const std::string& read_fun_prefix,
934 const std::vector<expression>& dim_args)
const {
935 std::vector<expression> read_args;
936 std::string read_fun(read_fun_prefix);
939 read_args.push_back(x.range_.low_);
940 read_args.push_back(x.range_.high_);
943 read_args.push_back(x.range_.low_);
946 read_args.push_back(x.range_.high_);
948 for (
size_t i = 0; i < dim_args.size(); ++i)
949 read_args.push_back(dim_args[i]);
950 generate_initialize_array(base_type, read_fun, read_args,
955 generate_initialize_array(
"int",
"integer", EMPTY_EXP_VECTOR,
959 std::vector<expression> read_args;
960 generate_initialize_array_bounded(x,
961 is_var_context_ ?
"T__" :
"double",
962 "scalar", read_args);
965 std::vector<expression> read_args;
966 read_args.push_back(x.
M_);
967 generate_initialize_array_bounded(x,
970 "<T__,Eigen::Dynamic,1> " 972 "vector", read_args);
975 std::vector<expression> read_args;
976 read_args.push_back(x.
N_);
977 generate_initialize_array_bounded(x,
980 "<T__,1,Eigen::Dynamic> " 982 "row_vector", read_args);
985 std::vector<expression> read_args;
986 read_args.push_back(x.
M_);
987 read_args.push_back(x.
N_);
988 generate_initialize_array_bounded(x,
991 "<T__,Eigen::Dynamic,Eigen::Dynamic> " 993 "matrix", read_args);
996 std::vector<expression> read_args;
997 read_args.push_back(x.
K_);
998 generate_initialize_array(is_var_context_
1000 "<T__,Eigen::Dynamic,1> " 1005 std::vector<expression> read_args;
1006 read_args.push_back(x.
K_);
1007 generate_initialize_array(is_var_context_
1009 "<T__,Eigen::Dynamic,1> " 1014 std::vector<expression> read_args;
1015 read_args.push_back(x.
K_);
1016 generate_initialize_array(is_var_context_
1018 "<T__,Eigen::Dynamic,1> " 1023 std::vector<expression> read_args;
1024 read_args.push_back(x.
K_);
1025 generate_initialize_array(is_var_context_
1027 "<T__,Eigen::Dynamic,1> " 1029 "positive_ordered", read_args,
1033 std::vector<expression> read_args;
1034 read_args.push_back(x.
M_);
1035 read_args.push_back(x.
N_);
1036 generate_initialize_array(is_var_context_
1038 "<T__,Eigen::Dynamic,Eigen::Dynamic> " 1040 "cholesky_factor", read_args,
1044 std::vector<expression> read_args;
1045 read_args.push_back(x.
K_);
1046 generate_initialize_array(is_var_context_
1048 "<T__,Eigen::Dynamic,Eigen::Dynamic> " 1050 "cholesky_corr", read_args, x.
name_, x.
dims_);
1054 std::vector<expression> read_args;
1055 read_args.push_back(x.
K_);
1056 generate_initialize_array(is_var_context_
1058 "<T__,Eigen::Dynamic,Eigen::Dynamic> " 1063 std::vector<expression> read_args;
1064 read_args.push_back(x.
K_);
1065 generate_initialize_array(is_var_context_
1067 "<T__,Eigen::Dynamic,Eigen::Dynamic> " 1072 const std::string& read_type,
1073 const std::vector<expression>& read_args,
1074 const std::string& name,
1075 const std::vector<expression>& dims)
1077 if (declare_vars_) {
1079 for (
size_t i = 0; i < dims.size(); ++i)
o_ <<
"vector<";
1081 for (
size_t i = 0; i < dims.size(); ++i)
o_ <<
"> ";
1082 if (dims.size() == 0)
o_ <<
" ";
1083 o_ << name <<
";" <<
EOL;
1086 if (dims.size() == 0) {
1092 o_ << name <<
" = in__." << read_type <<
"_constrain(";
1093 for (
size_t j = 0; j < read_args.size(); ++j) {
1094 if (j > 0)
o_ <<
",";
1097 if (read_args.size() > 0)
1106 o_ << name <<
" = in__." << read_type <<
"_constrain(";
1107 for (
size_t j = 0; j < read_args.size(); ++j) {
1108 if (j > 0)
o_ <<
",";
1115 std::string name_dims(name);
1116 for (
size_t i = 0; i < dims.size(); ++i) {
1118 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
1122 if (i < dims.size() - 1) {
1124 o_ << name_dims <<
".resize(dim" <<
"_" 1125 << name <<
"_" << i <<
"__);" 1127 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
1131 if (i == dims.size() - 1) {
1132 o_ << name_dims <<
".reserve(dim_" << name
1133 <<
"_" << i <<
"__);" <<
EOL;
1137 o_ <<
"for (size_t k_" << i <<
"__ = 0;" 1138 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;" 1139 <<
" ++k_" << i <<
"__) {" <<
EOL;
1142 if (i == dims.size() - 1) {
1144 o_ <<
"if (jacobian__)" <<
EOL;
1148 o_ << name_dims <<
".push_back(in__." 1149 << read_type <<
"_constrain(";
1150 for (
size_t j = 0; j < read_args.size(); ++j) {
1151 if (j > 0)
o_ <<
",";
1154 if (read_args.size() > 0)
1160 o_ <<
"else" <<
EOL;
1164 o_ << name_dims <<
".push_back(in__." 1165 << read_type <<
"_constrain(";
1166 for (
size_t j = 0; j < read_args.size(); ++j) {
1167 if (j > 0)
o_ <<
",";
1174 for (
size_t i = dims.size(); i > 0; --i) {
1185 bool is_var_context,
1189 <<
"stan::io::reader<" 1190 << (is_var_context ?
"T__" :
"double")
1191 <<
"> in__(params_r__,params_i__);" <<
EOL2;
1193 for (
size_t i = 0; i < vs.size(); ++i) {
1194 boost::apply_visitor(vis_init, vs[i].decl_);
1200 o <<
"public:" <<
EOL;
1204 o <<
"private:" <<
EOL;
1216 for (
size_t i = 0; i < dims.size(); ++i) {
1218 o_ <<
"for (int k" << i <<
"__ = 0;" 1219 <<
" k" << i <<
"__ < ";
1222 o_ <<
" ++k" << i <<
"__) {" <<
EOL;
1226 for (
size_t i = 0; i < dims_size; ++i) {
1232 size_t dims_size)
const {
1234 for (
size_t i = 0; i < dims_size; ++i)
1235 o_ <<
"[k" << i <<
"__]";
1238 template <
typename T>
1240 if (!(x.range_.has_low() || x.range_.has_high())) {
1243 generate_begin_for_dims(x.dims_);
1244 if (x.range_.has_low()) {
1246 o_ <<
"check_greater_or_equal(function__,";
1248 generate_loop_var(x.name_, x.dims_.size());
1250 generate_loop_var(x.name_, x.dims_.size());
1255 if (x.range_.has_high()) {
1257 o_ <<
"check_less_or_equal(function__,";
1259 generate_loop_var(x.name_, x.dims_.size());
1261 generate_loop_var(x.name_, x.dims_.size());
1266 generate_end_for_dims(x.dims_.size());
1283 template <
typename T>
1285 const std::string& type_name)
const {
1286 generate_begin_for_dims(x.dims_);
1288 o_ <<
"stan::math::check_" << type_name <<
"(function__,";
1290 generate_loop_var(x.name_, x.dims_.size());
1292 generate_loop_var(x.name_, x.dims_.size());
1295 generate_end_for_dims(x.dims_.size());
1298 nonbasic_validate(x,
"unit_vector");
1301 nonbasic_validate(x,
"simplex");
1304 nonbasic_validate(x,
"ordered");
1307 nonbasic_validate(x,
"positive_ordered");
1310 nonbasic_validate(x,
"cholesky_factor");
1313 nonbasic_validate(x,
"cholesky_factor_corr");
1316 nonbasic_validate(x,
"cov_matrix");
1319 nonbasic_validate(x,
"corr_matrix");
1328 boost::apply_visitor(vis, decl.
decl_);
1334 for (
size_t i = 0; i < decls.size(); ++i)
1348 declare_array(
"int", x.
name_, x.
dims_.size());
1351 declare_array(
"double", x.
name_, x.
dims_.size());
1354 declare_array((
"vector_d"), x.
name_, x.
dims_.size());
1357 declare_array((
"vector_d"), x.
name_, x.
dims_.size());
1360 declare_array((
"vector_d"), x.
name_, x.
dims_.size());
1363 declare_array((
"vector_d"), x.
name_, x.
dims_.size());
1366 declare_array((
"matrix_d"), x.
name_, x.
dims_.size());
1369 declare_array((
"matrix_d"), x.
name_, x.
dims_.size());
1372 declare_array((
"matrix_d"), x.
name_, x.
dims_.size());
1375 declare_array((
"matrix_d"), x.
name_, x.
dims_.size());
1378 declare_array((
"vector_d"), x.
name_, x.
dims_.size());
1381 declare_array((
"row_vector_d"), x.
name_, x.
dims_.size());
1384 declare_array((
"matrix_d"), x.
name_, x.
dims_.size());
1387 std::string
const& name,
1388 size_t size)
const {
1389 for (
int i = 0; i < indents_; ++i)
1391 for (
size_t i = 0; i < size; ++i) {
1398 for (
size_t i = 1; i < size; ++i) {
1401 o_ <<
" " << name <<
";" <<
EOL;
1409 for (
size_t i = 0; i < vs.size(); ++i)
1410 boost::apply_visitor(vis, vs[i].decl_);
1419 bool is_var_context,
1424 is_var_context_(is_var_context),
1425 is_fun_return_(is_fun_return) {
1429 std::vector<expression> ctor_args;
1430 declare_array(
"int", ctor_args, x.
name_, x.
dims_);
1433 std::vector<expression> ctor_args;
1434 declare_array(is_fun_return_
1436 : (is_var_context_ ?
"T__" :
"double"),
1440 std::vector<expression> ctor_args;
1441 ctor_args.push_back(x.
M_);
1442 declare_array(is_fun_return_
1443 ?
"Eigen::Matrix<fun_scalar_t__,Eigen::Dynamic,1> " 1445 ?
"Eigen::Matrix<T__,Eigen::Dynamic,1> " :
"vector_d"),
1449 std::vector<expression> ctor_args;
1450 ctor_args.push_back(x.
N_);
1451 declare_array(is_fun_return_
1452 ?
"Eigen::Matrix<fun_scalar_t__,1,Eigen::Dynamic> " 1454 ?
"Eigen::Matrix<T__,1,Eigen::Dynamic> " 1459 std::vector<expression> ctor_args;
1460 ctor_args.push_back(x.
M_);
1461 ctor_args.push_back(x.
N_);
1462 declare_array(is_fun_return_
1463 ?
"Eigen::Matrix<fun_scalar_t__," 1464 "Eigen::Dynamic,Eigen::Dynamic> " 1466 ?
"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " 1471 std::vector<expression> ctor_args;
1472 ctor_args.push_back(x.
K_);
1473 declare_array(is_fun_return_
1474 ?
"Eigen::Matrix<fun_scalar_t__,Eigen::Dynamic,1> " 1476 ?
"Eigen::Matrix<T__,Eigen::Dynamic,1> " :
"vector_d"),
1480 std::vector<expression> ctor_args;
1481 ctor_args.push_back(x.
K_);
1482 declare_array(is_fun_return_
1483 ?
"Eigen::Matrix<fun_scalar_t__,Eigen::Dynamic,1> " 1485 ?
"Eigen::Matrix<T__,Eigen::Dynamic,1> " :
"vector_d"),
1489 std::vector<expression> ctor_args;
1490 ctor_args.push_back(x.
K_);
1491 declare_array(is_fun_return_
1492 ?
"Eigen::Matrix<fun_scalar_t__,Eigen::Dynamic,1> " 1494 ?
"Eigen::Matrix<T__,Eigen::Dynamic,1> " :
"vector_d"),
1498 std::vector<expression> ctor_args;
1499 ctor_args.push_back(x.
K_);
1500 declare_array(is_fun_return_
1501 ?
"Eigen::Matrix<fun_scalar_t__,Eigen::Dynamic,1> " 1503 ?
"Eigen::Matrix<T__,Eigen::Dynamic,1> " :
"vector_d"),
1507 std::vector<expression> ctor_args;
1508 ctor_args.push_back(x.
M_);
1509 ctor_args.push_back(x.
N_);
1510 declare_array(is_fun_return_
1511 ?
"Eigen::Matrix<fun_scalar_t__," 1512 "Eigen::Dynamic,Eigen::Dynamic> " 1514 ?
"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " 1519 std::vector<expression> ctor_args;
1520 ctor_args.push_back(x.
K_);
1521 ctor_args.push_back(x.
K_);
1522 declare_array(is_var_context_
1523 ?
"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " 1528 std::vector<expression> ctor_args;
1529 ctor_args.push_back(x.
K_);
1530 ctor_args.push_back(x.
K_);
1531 declare_array(is_fun_return_
1532 ?
"Eigen::Matrix<fun_scalar_t__," 1533 "Eigen::Dynamic,Eigen::Dynamic> " 1535 ?
"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " 1540 std::vector<expression> ctor_args;
1541 ctor_args.push_back(x.
K_);
1542 ctor_args.push_back(x.
K_);
1543 declare_array(is_fun_return_
1544 ?
"Eigen::Matrix<fun_scalar_t__," 1545 "Eigen::Dynamic,Eigen::Dynamic> " 1547 ?
"Eigen::Matrix<T__,Eigen::Dynamic,Eigen::Dynamic> " 1552 size_t num_dims)
const {
1553 for (
size_t i = 0; i < num_dims; ++i)
1556 for (
size_t i = 0; i < num_dims; ++i) {
1557 if (i > 0)
o_ <<
" ";
1563 o_ <<
"(void) " << name <<
"; // dummy to suppress unused var warning";
1570 const std::vector<expression>& ctor_args,
1571 const std::vector<expression>& dims,
1573 if (dim < dims.size()) {
1576 if ((dim + 1 < dims.size()) || ctor_args.size() > 0) {
1579 generate_init_args(type, ctor_args, dims, dim + 1);
1581 }
else if (type ==
"var") {
1582 o_ <<
", DUMMY_VAR__";
1583 }
else if (type ==
"int") {
1585 }
else if (type ==
"double") {
1592 if (ctor_args.size() == 0) {
1593 if (type ==
"int") {
1595 }
else if (type ==
"double") {
1597 }
else if (type ==
"var") {
1598 o_ <<
"(DUMMY_VAR__)";
1602 }
else if (ctor_args.size() == 1) {
1606 }
else if (ctor_args.size() > 1) {
1616 const std::vector<expression>& ctor_args,
1617 const std::string& name,
1618 const std::vector<expression>& dims,
1624 generate_init_args(type, ctor_args, dims, 0);
1626 if (dims.size() == 0) {
1631 if (type ==
"Eigen::Matrix<T__, Eigen::Dynamic, Eigen::Dynamic> " 1632 || type ==
"Eigen::Matrix<T__, 1, Eigen::Dynamic> " 1633 || type ==
"Eigen::Matrix<T__, Eigen::Dynamic, 1> ") {
1635 o_ <<
"stan::math::fill(" << name <<
", DUMMY_VAR__);" <<
EOL;
1643 bool is_var_context,
1644 bool is_fun_return) {
1648 for (
size_t i = 0; i < vs.size(); ++i) {
1649 boost::apply_visitor(vis_decl, vs[i].decl_);
1650 boost::apply_visitor(vis_init, vs[i].decl_);
1651 boost::apply_visitor(vis_filler, vs[i].decl_);
1652 if (vs[i].has_def()) {
1654 o <<
"stan::math::assign(" 1668 bool is_var_context,
1669 bool is_fun_return) {
1671 for (
size_t i = 0; i < vs.size(); ++i) {
1672 boost::apply_visitor(vis, vs[i].decl_);
1679 bool is_var_context,
1683 for (
size_t i = 0; i < vs.size(); ++i) {
1684 if (vs[i].has_def()) {
1686 o <<
"stan::math::assign(" 1704 std::vector<expression> dims(x.
dims_);
1705 validate_array(x.
name_, dims, 0);
1708 std::vector<expression> dims(x.
dims_);
1709 validate_array(x.
name_, dims, 0);
1712 std::vector<expression> dims(x.
dims_);
1713 dims.push_back(x.
M_);
1714 validate_array(x.
name_, dims, 1);
1717 std::vector<expression> dims(x.
dims_);
1718 dims.push_back(x.
K_);
1719 validate_array(x.
name_, dims, 1);
1722 std::vector<expression> dims(x.
dims_);
1723 dims.push_back(x.
K_);
1724 validate_array(x.
name_, dims, 1);
1727 std::vector<expression> dims(x.
dims_);
1728 dims.push_back(x.
K_);
1729 validate_array(x.
name_, dims, 1);
1732 std::vector<expression> dims(x.
dims_);
1733 dims.push_back(x.
K_);
1734 validate_array(x.
name_, dims, 1);
1737 std::vector<expression> dims(x.
dims_);
1738 dims.push_back(x.
N_);
1739 validate_array(x.
name_, dims, 1);
1742 std::vector<expression> dims(x.
dims_);
1743 dims.push_back(x.
M_);
1744 dims.push_back(x.
N_);
1745 validate_array(x.
name_, dims, 2);
1748 std::vector<expression> dims(x.
dims_);
1749 dims.push_back(x.
M_);
1750 dims.push_back(x.
N_);
1751 validate_array(x.
name_, dims, 2);
1754 std::vector<expression> dims(x.
dims_);
1755 dims.push_back(x.
K_);
1756 dims.push_back(x.
K_);
1757 validate_array(x.
name_, dims, 2);
1760 std::vector<expression> dims(x.
dims_);
1761 dims.push_back(x.
K_);
1762 dims.push_back(x.
K_);
1763 validate_array(x.
name_, dims, 2);
1766 std::vector<expression> dims(x.
dims_);
1767 dims.push_back(x.
K_);
1768 dims.push_back(x.
K_);
1769 validate_array(x.
name_, dims, 2);
1772 const std::vector<expression>& dims,
1773 size_t matrix_dims)
const {
1774 size_t non_matrix_dims = dims.size() - matrix_dims;
1776 for (
size_t k = 0; k < dims.size(); ++k) {
1778 o_ <<
"for (int i" << k <<
"__ = 0; i" << k <<
"__ < ";
1780 o_ <<
"; ++i" << k <<
"__) {" <<
EOL;
1784 o_ <<
"if (stan::math::is_uninitialized(" << name;
1785 for (
size_t k = 0; k < non_matrix_dims; ++k)
1786 o_ <<
"[i" << k <<
"__]";
1787 if (matrix_dims > 0) {
1788 o_ <<
"(i" << non_matrix_dims <<
"__";
1789 if (matrix_dims > 1)
1790 o_ <<
",i" << (non_matrix_dims + 1) <<
"__";
1793 o_ <<
")) {" <<
EOL;
1795 o_ <<
"std::stringstream msg__;" <<
EOL;
1797 o_ <<
"msg__ << \"Undefined transformed parameter: " 1799 for (
size_t k = 0; k < dims.size(); ++k) {
1801 o_ <<
" << i" << k <<
"__";
1806 o_ <<
"throw std::runtime_error(msg__.str());" <<
EOL;
1810 for (
size_t k = 0; k < dims.size(); ++k) {
1822 for (
size_t i = 0; i < vs.size(); ++i)
1823 boost::apply_visitor(vis, vs[i].decl_);
1830 o_ <<
"stan::model::index_uni(";
1835 o_ <<
"stan::model::index_multi(";
1840 o_ <<
"stan::model::index_omni()";
1843 o_ <<
"stan::model::index_min(";
1848 o_ <<
"stan::model::index_max(";
1853 o_ <<
"stan::model::index_min_max(";
1863 boost::apply_visitor(vis, i.
idx_);
1868 if (pos == idxs.size()) {
1869 o <<
"stan::model::nil_index_list()";
1871 o <<
"stan::model::cons_list(";
1912 boost::apply_visitor(vis, i.
idx_);
1916 if (idxs.size() == 0)
1919 for (
size_t i = 0; i < idxs.size(); ++i) {
1933 bool include_sampling,
1934 bool is_var_context,
1939 include_sampling_(include_sampling),
1940 is_var_context_(is_var_context),
1941 is_fun_return_(is_fun_return) {
1947 o_ <<
"stan::math::assign(";
1960 o_ <<
"stan::model::assign(";
1974 o_ <<
"stan::model::deep_copy(";
1985 <<
"assigning variable " 1997 if (!include_sampling_)
return;
2000 o_ <<
"lp_accum__.add(" << prob_fun <<
"<propto__>(";
2002 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
2008 if (is_user_defined)
2009 o_ <<
", pstream__";
2019 o_ <<
") lp_accum__.add(-std::numeric_limits<double>::infinity());" 2029 o_ <<
") lp_accum__.add(-std::numeric_limits<double>::infinity());" 2034 generate_truncation(x, is_user_defined, prob_fun);
2038 const std::string& prob_fun)
const {
2039 std::stringstream sso_lp;
2044 sso_lp <<
"log_diff_exp(";
2047 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
2051 if (is_user_defined)
2052 sso_lp <<
", pstream__";
2055 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
2059 if (is_user_defined)
2060 sso_lp <<
", pstream__";
2067 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
2071 if (is_user_defined)
2072 sso_lp <<
", pstream__";
2079 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
2083 if (is_user_defined)
2084 sso_lp <<
", pstream__";
2088 o_ <<
"else lp_accum__.add(-";
2091 o_ <<
"log_sum_exp(" << sso_lp.str() <<
", ";
2093 o_ << prob_fun <<
"(";
2095 for (
size_t i = 0; i < x.
dist_.
args_.size(); ++i) {
2099 if (is_user_defined)
o_ <<
", pstream__";
2105 o_ <<
");" << std::endl;
2110 o_ <<
"lp_accum__.add(";
2117 size_t indent = has_local_vars ? (indent_ + 1) : indent_;
2118 if (has_local_vars) {
2122 is_var_context_, is_fun_return_);
2127 is_var_context_, is_fun_return_);
2128 if (has_local_vars) {
2136 o_ <<
"if (pstream__) {" <<
EOL;
2137 for (
size_t i = 0; i < ps.
printables_.size(); ++i) {
2139 o_ <<
"stan_print(pstream__,";
2144 o_ <<
"*pstream__ << std::endl;" <<
EOL;
2150 o_ <<
"std::stringstream errmsg_stream__;" <<
EOL;
2151 for (
size_t i = 0; i < ps.
printables_.size(); ++i) {
2153 o_ <<
"errmsg_stream__ << ";
2158 o_ <<
"throw std::domain_error(errmsg_stream__.str());" <<
EOL;
2165 o_ <<
"stan::math::promote_scalar<fun_return_scalar_t__>(";
2179 is_var_context_, is_fun_return_);
2185 o_ <<
"while (as_bool(";
2187 o_ <<
")) {" <<
EOL;
2189 is_var_context_, is_fun_return_);
2198 for (
size_t i = 0; i < x.
conditions_.size(); ++i) {
2203 o_ <<
"if (as_bool(";
2205 o_ <<
")) {" <<
EOL;
2207 is_var_context_, is_fun_return_);
2212 o_ <<
" else {" <<
EOL;
2214 o_, include_sampling_,
2215 is_var_context_, is_fun_return_);
2251 bool include_sampling,
2252 bool is_var_context,
2253 bool is_fun_return) {
2255 if (boost::apply_visitor(vis_is_numbered, s.
statement_)) {
2257 o <<
"current_statement_begin__ = " << s.
begin_line_ <<
";" 2269 bool include_sampling,
2270 bool is_var_context,
2271 bool is_fun_return) {
2274 for (
size_t i = 0; i < ss.size(); ++i)
2275 boost::apply_visitor(vis, ss[i].statement_);
2288 o <<
"} catch (const std::exception& e) {" 2291 o <<
"stan::lang::rethrow_located(e,current_statement_begin__);" 2296 o <<
"throw std::runtime_error" 2297 <<
"(\"*** IF YOU SEE THIS, PLEASE REPORT A BUG ***\");" 2307 bool include_sampling,
2308 bool is_var_context,
2309 bool is_fun_return) {
2312 is_var_context, is_fun_return);
2319 bool include_sampling,
2320 bool is_var_context,
2321 bool is_fun_return) {
2323 for (
size_t i = 0; i < ss.size(); ++i)
2325 is_var_context, is_fun_return);
2334 o <<
INDENT <<
"template <bool propto__, bool jacobian__, typename T__>" 2336 o <<
INDENT <<
"T__ log_prob(vector<T__>& params_r__," 2338 o <<
INDENT <<
" vector<int>& params_i__," 2340 o <<
INDENT <<
" std::ostream* pstream__ = 0) const {" 2345 <<
"T__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" 2347 o <<
INDENT2 <<
"(void) DUMMY_VAR__; // suppress unused var warning" 2350 o <<
INDENT2 <<
"T__ lp__(0.0);" 2352 o <<
INDENT2 <<
"stan::math::accumulator<T__> lp_accum__;" 2355 bool is_var_context =
true;
2356 bool is_fun_return =
false;
2367 bool include_sampling =
true;
2369 include_sampling, is_var_context,
2375 <<
"const char* function__ = \"validate transformed params\";" 2378 <<
"(void) function__; // dummy to suppress unused var warning" 2388 is_var_context, is_fun_return);
2392 o <<
INDENT2 <<
"lp_accum__.add(lp__);" <<
EOL;
2393 o <<
INDENT2 <<
"return lp_accum__.sum();" <<
EOL2;
2397 <<
"template <bool propto, bool jacobian, typename T_>" <<
EOL;
2399 <<
"T_ log_prob(Eigen::Matrix<T_,Eigen::Dynamic,1>& params_r," <<
EOL;
2400 o <<
INDENT <<
" std::ostream* pstream = 0) const {" <<
EOL;
2401 o <<
INDENT <<
" std::vector<T_> vec_params_r;" <<
EOL;
2402 o <<
INDENT <<
" vec_params_r.reserve(params_r.size());" <<
EOL;
2403 o <<
INDENT <<
" for (int i = 0; i < params_r.size(); ++i)" <<
EOL;
2404 o <<
INDENT <<
" vec_params_r.push_back(params_r(i));" <<
EOL;
2405 o <<
INDENT <<
" std::vector<int> vec_params_i;" <<
EOL;
2407 <<
" return log_prob<propto,jacobian,T_>(vec_params_r, " 2408 <<
"vec_params_i, pstream);" <<
EOL;
2419 "data initialization")) {
2423 std::vector<expression> dims = x.
dims_;
2424 var_size_validator_(x);
2427 <<
"vals_i__ = context__.vals_i(\"" << x.
name_ <<
"\");" <<
EOL;
2429 size_t indentation = 1;
2430 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2431 size_t dim = dims.size() - dim_up - 1U;
2434 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2438 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" 2439 << dim <<
"__ < " << x.
name_ <<
"_limit_" << dim
2440 <<
"__; ++i_" << dim <<
"__) {" <<
EOL;
2444 for (
size_t dim = 0; dim < dims.size(); ++dim)
2445 o_ <<
"[i_" << dim <<
"__]";
2446 o_ <<
" = vals_i__[pos__++];" <<
EOL;
2447 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2454 std::vector<expression> dims = x.
dims_;
2455 var_size_validator_(x);
2458 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2460 size_t indentation = 1;
2461 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2462 size_t dim = dims.size() - dim_up - 1U;
2465 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2469 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2470 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2475 for (
size_t dim = 0; dim < dims.size(); ++dim)
2476 o_ <<
"[i_" << dim <<
"__]";
2477 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2478 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2485 std::vector<expression> dims = x.
dims_;
2487 var_size_validator_(x);
2489 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2494 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " 2495 << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
2496 size_t indentation = 2;
2497 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2498 size_t dim = dims.size() - dim_up - 1U;
2501 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2505 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2506 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2511 for (
size_t dim = 0; dim < dims.size(); ++dim)
2512 o_ <<
"[i_" << dim <<
"__]";
2514 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2515 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2523 std::vector<expression> dims = x.
dims_;
2524 var_size_validator_(x);
2527 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2532 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " 2533 << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
2534 size_t indentation = 2;
2535 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2536 size_t dim = dims.size() - dim_up - 1U;
2539 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2543 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2544 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2549 for (
size_t dim = 0; dim < dims.size(); ++dim)
2550 o_ <<
"[i_" << dim <<
"__]";
2552 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2553 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2561 std::vector<expression> dims = x.
dims_;
2562 var_size_validator_(x);
2565 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2570 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " 2571 << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
2572 size_t indentation = 2;
2573 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2574 size_t dim = dims.size() - dim_up - 1U;
2577 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2581 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2582 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2587 for (
size_t dim = 0; dim < dims.size(); ++dim)
2588 o_ <<
"[i_" << dim <<
"__]";
2590 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2591 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2599 std::vector<expression> dims = x.
dims_;
2600 var_size_validator_(x);
2603 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2608 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " 2609 << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
2610 size_t indentation = 2;
2611 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2612 size_t dim = dims.size() - dim_up - 1U;
2615 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2619 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2620 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2625 for (
size_t dim = 0; dim < dims.size(); ++dim)
2626 o_ <<
"[i_" << dim <<
"__]";
2628 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2629 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2637 std::vector<expression> dims = x.
dims_;
2638 var_size_validator_(x);
2641 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2646 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " 2647 << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
2648 size_t indentation = 2;
2649 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2650 size_t dim = dims.size() - dim_up - 1U;
2653 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2657 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2658 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2663 for (
size_t dim = 0; dim < dims.size(); ++dim)
2664 o_ <<
"[i_" << dim <<
"__]";
2666 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2667 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2675 std::vector<expression> dims = x.
dims_;
2676 var_size_validator_(x);
2679 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2684 o_ <<
INDENT2 <<
"for (size_t " <<
"i_vec__ = 0; " <<
"i_vec__ < " 2685 << x.
name_ <<
"_i_vec_lim__; ++i_vec__) {" <<
EOL;
2686 size_t indentation = 2;
2687 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2688 size_t dim = dims.size() - dim_up - 1U;
2691 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2695 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2696 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2701 for (
size_t dim = 0; dim < dims.size(); ++dim)
2702 o_ <<
"[i_" << dim <<
"__]";
2704 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2705 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2713 std::vector<expression> dims = x.
dims_;
2714 var_size_validator_(x);
2716 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" 2725 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " 2726 << x.
name_ <<
"_n_mat_lim__; ++n_mat__) {" <<
EOL;
2727 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " 2728 << x.
name_ <<
"_m_mat_lim__; ++m_mat__) {" <<
EOL;
2729 size_t indentation = 3;
2730 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2731 size_t dim = dims.size() - dim_up - 1U;
2734 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2738 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2739 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2744 for (
size_t dim = 0; dim < dims.size(); ++dim)
2745 o_ <<
"[i_" << dim <<
"__]";
2746 o_ <<
"(m_mat__,n_mat__)";
2747 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2748 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2758 std::vector<expression> dims = x.
dims_;
2759 var_size_validator_(x);
2762 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" <<
EOL;
2768 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " << x.
name_ 2769 <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
2771 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " << x.
name_ 2772 <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
2773 size_t indentation = 3;
2774 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2775 size_t dim = dims.size() - dim_up - 1U;
2778 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2782 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2783 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2788 for (
size_t dim = 0; dim < dims.size(); ++dim)
2789 o_ <<
"[i_" << dim <<
"__]";
2790 o_ <<
"(m_mat__,n_mat__)";
2791 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2792 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2801 std::vector<expression> dims = x.
dims_;
2802 var_size_validator_(x);
2804 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" 2816 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " 2817 << x.
name_ <<
"_n_mat_lim__; ++n_mat__) {" <<
EOL;
2818 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " 2819 << x.
name_ <<
"_m_mat_lim__; ++m_mat__) {" <<
EOL;
2821 size_t indentation = 3;
2822 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2823 size_t dim = dims.size() - dim_up - 1U;
2826 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2830 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2831 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2836 for (
size_t dim = 0; dim < dims.size(); ++dim)
2837 o_ <<
"[i_" << dim <<
"__]";
2838 o_ <<
"(m_mat__,n_mat__)";
2839 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2840 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2850 std::vector<expression> dims = x.
dims_;
2851 var_size_validator_(x);
2853 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" 2865 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " 2866 << x.
name_ <<
"_n_mat_lim__; ++n_mat__) {" <<
EOL;
2867 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " 2868 << x.
name_ <<
"_m_mat_lim__; ++m_mat__) {" <<
EOL;
2870 size_t indentation = 3;
2871 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2872 size_t dim = dims.size() - dim_up - 1U;
2875 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2879 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2880 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2885 for (
size_t dim = 0; dim < dims.size(); ++dim)
2886 o_ <<
"[i_" << dim <<
"__]";
2887 o_ <<
"(m_mat__,n_mat__)";
2888 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2889 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2898 std::vector<expression> dims = x.
dims_;
2899 var_size_validator_(x);
2901 o_ <<
INDENT2 <<
"vals_r__ = context__.vals_r(\"" << x.
name_ <<
"\");" 2907 o_ <<
INDENT2 <<
"for (size_t " <<
"n_mat__ = 0; " <<
"n_mat__ < " 2908 << x.
name_ <<
"_k_mat_lim__; ++n_mat__) {" <<
EOL;
2909 o_ <<
INDENT3 <<
"for (size_t " <<
"m_mat__ = 0; " <<
"m_mat__ < " 2910 << x.
name_ <<
"_k_mat_lim__; ++m_mat__) {" <<
EOL;
2911 size_t indentation = 3;
2912 for (
size_t dim_up = 0U; dim_up < dims.size(); ++dim_up) {
2913 size_t dim = dims.size() - dim_up - 1U;
2916 o_ <<
"size_t " << x.
name_ <<
"_limit_" << dim <<
"__ = ";
2920 o_ <<
"for (size_t i_" << dim <<
"__ = 0; i_" << dim <<
"__ < " 2921 << x.
name_ <<
"_limit_" << dim <<
"__; ++i_" << dim <<
"__) {" 2926 for (
size_t dim = 0; dim < dims.size(); ++dim)
2927 o_ <<
"[i_" << dim <<
"__]";
2928 o_ <<
"(m_mat__,n_mat__)";
2929 o_ <<
" = vals_r__[pos__++];" <<
EOL;
2930 for (
size_t dim = 0; dim < dims.size(); ++dim) {
2940 const std::string& var_name,
2942 o << indent <<
"(void) " 2944 <<
" // dummy call to supress warning" 2951 for (
size_t i = 0; i < vs.size(); ++i)
2952 boost::apply_visitor(vis, vs[i].decl_);
2958 <<
INDENT <<
"~" << model_name <<
"() { }" 2969 generate_increment_i(x.
dims_);
2971 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
2973 o_ <<
"for (size_t i_" << i <<
"__ = 0; ";
2974 o_ <<
"i_" << i <<
"__ < ";
2976 o_ <<
"; ++i_" << i <<
"__) {" <<
EOL;
2980 o_ <<
"param_ranges_i__.push_back(std::pair<int, int>(";
2986 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
2992 generate_increment(x.
dims_);
2995 generate_increment(x.
M_, x.
dims_);
2998 generate_increment(x.
N_, x.
dims_);
3001 generate_increment(x.
M_, x.
N_, x.
dims_);
3007 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3018 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3025 generate_increment(x.
K_, x.
dims_);
3028 generate_increment(x.
K_, x.
dims_);
3031 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3036 o_ <<
" + 1)) / 2 + (";
3043 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3051 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3055 o_ <<
" - 1)) / 2)";
3056 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3064 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3068 o_ <<
" - 1)) / 2 + ";
3071 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3078 o_ <<
INDENT2 <<
"num_params_r__ += ((";
3082 o_ <<
" - 1)) / 2)";
3083 for (
size_t i = 0; i < x.
dims_.size(); ++i) {
3091 if (dims.size() == 0) {
3096 for (
size_t i = 0; i < dims.size(); ++i) {
3097 if (i > 0)
o_ <<
" * ";
3103 if (dims.size() == 0) {
3108 for (
size_t i = 0; i < dims.size(); ++i) {
3109 if (i > 0)
o_ <<
" * ";
3115 std::vector<expression> dims)
const {
3118 for (
size_t i = 0; i < dims.size(); ++i) {
3125 std::vector<expression> dims)
const {
3130 for (
size_t i = 0; i < dims.size(); ++i) {
3140 o <<
INDENT2 <<
"num_params_r__ = 0U;" <<
EOL;
3141 o <<
INDENT2 <<
"param_ranges_i__.clear();" <<
EOL;
3143 for (
size_t i = 0; i < var_decls.size(); ++i)
3144 boost::apply_visitor(vis, var_decls[i].decl_);
3148 const std::string& model_name,
3152 o <<
INDENT << model_name <<
"(stan::io::var_context& context__," <<
EOL;
3153 o <<
INDENT <<
" std::ostream* pstream__ = 0)" <<
EOL;
3155 o <<
INDENT2 <<
"typedef boost::ecuyer1988 rng_t;" <<
EOL;
3156 o <<
INDENT2 <<
"rng_t base_rng(0); // 0 seed default" <<
EOL;
3157 o <<
INDENT2 <<
"ctor_body(context__, base_rng, pstream__);" <<
EOL;
3161 o <<
INDENT <<
"template <class RNG>" <<
EOL;
3162 o <<
INDENT << model_name <<
"(stan::io::var_context& context__," <<
EOL;
3163 o <<
INDENT <<
" RNG& base_rng__," <<
EOL;
3164 o <<
INDENT <<
" std::ostream* pstream__ = 0)" <<
EOL;
3166 o <<
INDENT2 <<
"ctor_body(context__, base_rng__, pstream__);" <<
EOL;
3170 o <<
INDENT <<
"template <class RNG>" <<
EOL;
3171 o <<
INDENT <<
"void ctor_body(stan::io::var_context& context__," <<
EOL;
3172 o <<
INDENT <<
" RNG& base_rng__," <<
EOL;
3173 o <<
INDENT <<
" std::ostream* pstream__) {" <<
EOL;
3174 o <<
INDENT2 <<
"current_statement_begin__ = -1;" <<
EOL2;
3175 o <<
INDENT2 <<
"static const char* function__ = \"" 3176 << model_name <<
"_namespace::" << model_name <<
"\";" <<
EOL;
3180 o <<
INDENT2 <<
"std::vector<int> vals_i__;" <<
EOL;
3181 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
3184 <<
"double DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" 3186 o <<
INDENT2 <<
"(void) DUMMY_VAR__; // suppress unused var warning" 3189 o <<
INDENT2 <<
"// initialize member variables" <<
EOL;
3199 bool include_sampling =
false;
3200 bool is_var_context =
false;
3201 bool is_fun_return =
false;
3205 2, o, include_sampling, is_var_context,
3224 var_size_validator_(o,
"initialization") {
3229 var_size_validator_(x);
3232 generate_write_loop(
"integer(", x.
name_, x.
dims_);
3234 template <
typename D>
3237 std::stringstream ss;
3240 ss <<
"_lub_unconstrain(";
3246 ss <<
"_lb_unconstrain(";
3250 ss <<
"_ub_unconstrain(";
3254 ss <<
"_unconstrain(";
3260 generate_check_double(x.
name_, x.
dims_.size());
3261 var_size_validator_(x);
3266 generate_write_loop(function_args(
"scalar", x),
3270 generate_check_double(x.
name_, x.
dims_.size() + 1);
3271 var_size_validator_(x);
3274 generate_write_loop(function_args(
"vector", x),
3278 generate_check_double(x.
name_, x.
dims_.size() + 1);
3279 var_size_validator_(x);
3283 generate_write_loop(function_args(
"row_vector", x),
3287 generate_check_double(x.
name_, x.
dims_.size() + 2);
3288 var_size_validator_(x);
3291 generate_write_loop(function_args(
"matrix", x),
3295 generate_check_double(x.
name_, x.
dims_.size() + 1);
3296 var_size_validator_(x);
3299 generate_write_loop(
"unit_vector_unconstrain(", x.
name_, x.
dims_);
3302 generate_check_double(x.
name_, x.
dims_.size() + 1);
3303 var_size_validator_(x);
3306 generate_write_loop(
"simplex_unconstrain(", x.
name_, x.
dims_);
3309 generate_check_double(x.
name_, x.
dims_.size() + 1);
3310 var_size_validator_(x);
3313 generate_write_loop(
"ordered_unconstrain(", x.
name_, x.
dims_);
3316 generate_check_double(x.
name_, x.
dims_.size() + 1);
3317 var_size_validator_(x);
3320 generate_write_loop(
"positive_ordered_unconstrain(", x.
name_, x.
dims_);
3323 generate_check_double(x.
name_, x.
dims_.size() + 2);
3324 var_size_validator_(x);
3327 generate_write_loop(
"cholesky_factor_unconstrain(", x.
name_, x.
dims_);
3330 generate_check_double(x.
name_, x.
dims_.size() + 2);
3331 var_size_validator_(x);
3334 generate_write_loop(
"cholesky_corr_unconstrain(", x.
name_, x.
dims_);
3337 generate_check_double(x.
name_, x.
dims_.size() + 2);
3338 var_size_validator_(x);
3341 generate_write_loop(
"cov_matrix_unconstrain(", x.
name_, x.
dims_);
3344 generate_check_double(x.
name_, x.
dims_.size() + 2);
3345 var_size_validator_(x);
3348 generate_write_loop(
"corr_matrix_unconstrain(", x.
name_, x.
dims_);
3351 const std::string& var_name,
3352 const std::vector<expression>& dims)
const {
3353 generate_dims_loop_fwd(dims);
3357 <<
"writer__." << write_method_name;
3358 generate_name_dims(var_name, dims.size());
3362 <<
"} catch (const std::exception& e) { " 3365 <<
"throw std::runtime_error(" 3366 <<
"std::string(\"Error transforming variable " 3367 << var_name <<
": \") + e.what());" 3374 size_t num_dims)
const {
3376 for (
size_t i = 0; i < num_dims; ++i)
3377 o_ <<
"[i" << i <<
"__]";
3380 const std::string& base_type,
3381 const std::vector<expression>& dims,
3386 o_ <<
INDENT2 <<
"// generate_declaration " << name << std::endl;
3393 const std::vector<expression>& dims,
3401 const std::string& name,
3402 const std::vector<expression>& dims,
3405 int indent = 2U)
const {
3406 size_t size = dims.size();
3409 int extra_indent = is_matrix ? 2U : is_vector ? 1U : 0U;
3412 o_ <<
"for (int j2__ = 0U; j2__ < ";
3414 o_ <<
"; ++j2__)" <<
EOL;
3417 o_ <<
"for (int j1__ = 0U; j1__ < ";
3419 o_ <<
"; ++j1__)" <<
EOL;
3420 }
else if (is_vector) {
3422 o_ <<
"for (int j1__ = 0U; j1__ < ";
3424 o_ <<
"; ++j1__)" <<
EOL;
3426 for (
size_t i = 0; i < size; ++i) {
3427 size_t idx = size - i - 1;
3429 o_ <<
"for (int i" << idx <<
"__ = 0U; i" << idx <<
"__ < ";
3431 o_ <<
"; ++i" << idx <<
"__)" <<
EOL;
3433 generate_indent_num_dims(2U, dims, dim1, dim2);
3435 for (
size_t i = 0; i < dims.size(); ++i)
3436 o_ <<
"[i" << i <<
"__]";
3438 o_ <<
"(j1__,j2__)";
3441 o_ <<
" = vals_" << base_type <<
"__[pos__++];" <<
EOL;
3444 int indent = 2U)
const {
3445 size_t size = dims.size();
3446 for (
size_t i = 0; i < size; ++i) {
3448 o_ <<
"for (int i" << i <<
"__ = 0U; i" << i <<
"__ < ";
3450 o_ <<
"; ++i" << i <<
"__)" <<
EOL;
3456 <<
"if (!(context__.contains_i(\"" << name <<
"\")))" 3458 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" 3460 o_ <<
INDENT2 <<
"vals_i__ = context__.vals_i(\"" << name <<
"\");" 3466 <<
"if (!(context__.contains_r(\"" << name <<
"\")))" 3468 <<
"throw std::runtime_error(\"variable " << name <<
" missing\");" 3471 <<
"vals_r__ = context__.vals_r(\"" << name <<
"\");" <<
EOL;
3481 <<
"void transform_inits(const stan::io::var_context& context__," 3483 o <<
INDENT <<
" std::vector<int>& params_i__," 3485 o <<
INDENT <<
" std::vector<double>& params_r__," 3487 o <<
INDENT <<
" std::ostream* pstream__) const {" 3489 o <<
INDENT2 <<
"stan::io::writer<double> " 3490 <<
"writer__(params_r__,params_i__);" 3493 o <<
INDENT2 <<
"(void) pos__; // dummy call to supress warning" <<
EOL;
3494 o <<
INDENT2 <<
"std::vector<double> vals_r__;" <<
EOL;
3495 o <<
INDENT2 <<
"std::vector<int> vals_i__;" 3498 for (
size_t i = 0; i < vs.size(); ++i)
3499 boost::apply_visitor(vis, vs[i].decl_);
3502 <<
INDENT2 <<
"params_r__ = writer__.data_r();" <<
EOL;
3503 o <<
INDENT2 <<
"params_i__ = writer__.data_i();" <<
EOL;
3507 <<
"void transform_inits(const stan::io::var_context& context," <<
EOL;
3510 <<
"Eigen::Matrix<double,Eigen::Dynamic,1>& params_r," <<
EOL;
3512 <<
" std::ostream* pstream__) const {" <<
EOL;
3513 o <<
INDENT <<
" std::vector<double> params_r_vec;" <<
EOL;
3514 o <<
INDENT <<
" std::vector<int> params_i_vec;" <<
EOL;
3516 <<
" transform_inits(context, params_i_vec, params_r_vec, pstream__);" 3518 o <<
INDENT <<
" params_r.resize(params_r_vec.size());" <<
EOL;
3519 o <<
INDENT <<
" for (int i = 0; i < params_r.size(); ++i)" <<
EOL;
3520 o <<
INDENT <<
" params_r(i) = params_r_vec[i];" <<
EOL;
3530 generate_dims_array(EMPTY_EXP_VECTOR, x.
dims_);
3533 generate_dims_array(EMPTY_EXP_VECTOR, x.
dims_);
3536 std::vector<expression> matrix_args;
3537 matrix_args.push_back(x.
M_);
3538 generate_dims_array(matrix_args, x.
dims_);
3541 std::vector<expression> matrix_args;
3542 matrix_args.push_back(x.
N_);
3543 generate_dims_array(matrix_args, x.
dims_);
3546 std::vector<expression> matrix_args;
3547 matrix_args.push_back(x.
M_);
3548 matrix_args.push_back(x.
N_);
3549 generate_dims_array(matrix_args, x.
dims_);
3552 std::vector<expression> matrix_args;
3553 matrix_args.push_back(x.
K_);
3554 generate_dims_array(matrix_args, x.
dims_);
3557 std::vector<expression> matrix_args;
3558 matrix_args.push_back(x.
K_);
3559 generate_dims_array(matrix_args, x.
dims_);
3562 std::vector<expression> matrix_args;
3563 matrix_args.push_back(x.
K_);
3564 generate_dims_array(matrix_args, x.
dims_);
3567 std::vector<expression> matrix_args;
3568 matrix_args.push_back(x.
K_);
3569 generate_dims_array(matrix_args, x.
dims_);
3572 std::vector<expression> matrix_args;
3573 matrix_args.push_back(x.
M_);
3574 matrix_args.push_back(x.
N_);
3575 generate_dims_array(matrix_args, x.
dims_);
3578 std::vector<expression> matrix_args;
3579 matrix_args.push_back(x.
K_);
3580 matrix_args.push_back(x.
K_);
3581 generate_dims_array(matrix_args, x.
dims_);
3584 std::vector<expression> matrix_args;
3585 matrix_args.push_back(x.
K_);
3586 matrix_args.push_back(x.
K_);
3587 generate_dims_array(matrix_args, x.
dims_);
3590 std::vector<expression> matrix_args;
3591 matrix_args.push_back(x.
K_);
3592 matrix_args.push_back(x.
K_);
3593 generate_dims_array(matrix_args, x.
dims_);
3597 const std::vector<expression>& array_dims_exprs)
3600 for (
size_t i = 0; i < array_dims_exprs.size(); ++i) {
3606 for (
size_t i = 0; i < matrix_dims_exprs.size(); ++i) {
3619 <<
"void get_dims(std::vector<std::vector<size_t> >& dimss__) const {" 3623 o <<
INDENT2 <<
"std::vector<size_t> dims__;" <<
EOL;
3630 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
3631 boost::apply_visitor(vis, prog.
derived_decl_.first[i].decl_);
3648 generate_param_names(x.
name_);
3651 generate_param_names(x.
name_);
3654 generate_param_names(x.
name_);
3657 generate_param_names(x.
name_);
3660 generate_param_names(x.
name_);
3663 generate_param_names(x.
name_);
3666 generate_param_names(x.
name_);
3669 generate_param_names(x.
name_);
3672 generate_param_names(x.
name_);
3675 generate_param_names(x.
name_);
3678 generate_param_names(x.
name_);
3681 generate_param_names(x.
name_);
3684 generate_param_names(x.
name_);
3689 <<
"names__.push_back(\"" << name <<
"\");" 3699 <<
"void get_param_names(std::vector<std::string>& names__) const {" 3703 <<
"names__.resize(0);" 3711 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
3712 boost::apply_visitor(vis, prog.
derived_decl_.first[i].decl_);
3730 generate_param_names_array(EMPTY_EXP_VECTOR, x.
name_, x.
dims_);
3733 generate_param_names_array(EMPTY_EXP_VECTOR, x.
name_, x.
dims_);
3736 std::vector<expression> matrix_args;
3737 matrix_args.push_back(x.
M_);
3738 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3741 std::vector<expression> matrix_args;
3742 matrix_args.push_back(x.
N_);
3743 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3746 std::vector<expression> matrix_args;
3747 matrix_args.push_back(x.
M_);
3748 matrix_args.push_back(x.
N_);
3749 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3752 std::vector<expression> matrix_args;
3753 matrix_args.push_back(x.
K_);
3754 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3757 std::vector<expression> matrix_args;
3758 matrix_args.push_back(x.
K_);
3759 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3762 std::vector<expression> matrix_args;
3763 matrix_args.push_back(x.
K_);
3764 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3767 std::vector<expression> matrix_args;
3768 matrix_args.push_back(x.
K_);
3769 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3772 std::vector<expression> matrix_args;
3773 matrix_args.push_back(x.
M_);
3774 matrix_args.push_back(x.
N_);
3775 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3778 std::vector<expression> matrix_args;
3779 matrix_args.push_back(x.
K_);
3780 matrix_args.push_back(x.
K_);
3781 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3784 std::vector<expression> matrix_args;
3785 matrix_args.push_back(x.
K_);
3786 matrix_args.push_back(x.
K_);
3787 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3790 std::vector<expression> matrix_args;
3791 matrix_args.push_back(x.
K_);
3792 matrix_args.push_back(x.
K_);
3793 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3797 const std::string& name,
3798 const std::vector<expression>& dims)
const {
3800 std::vector<expression> combo_dims(dims);
3801 for (
size_t i = 0; i < matrix_dims.size(); ++i)
3802 combo_dims.push_back(matrix_dims[i]);
3804 for (
size_t i = combo_dims.size(); i-- > 0; ) {
3806 o_ <<
"for (int k_" << i <<
"__ = 1;" 3807 <<
" k_" << i <<
"__ <= ";
3809 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
3813 o_ <<
"param_name_stream__.str(std::string());" <<
EOL;
3816 o_ <<
"param_name_stream__ << \"" << name <<
'"';
3818 for (
size_t i = 0; i < combo_dims.size(); ++i)
3819 o_ <<
" << '.' << k_" << i <<
"__";
3823 o_ <<
"param_names__.push_back(param_name_stream__.str());" <<
EOL;
3826 for (
size_t i = 0; i < combo_dims.size(); ++i) {
3837 <<
"void constrained_param_names(" 3838 <<
"std::vector<std::string>& param_names__," 3840 <<
" bool include_tparams__ = true," 3842 <<
" bool include_gqs__ = true) const {" 3844 <<
"std::stringstream param_name_stream__;" <<
EOL;
3853 <<
"if (!include_gqs__ && !include_tparams__) return;" 3857 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
3858 boost::apply_visitor(vis, prog.
derived_decl_.first[i].decl_);
3862 <<
"if (!include_gqs__) return;" 3879 generate_param_names_array(EMPTY_EXP_VECTOR, x.
name_, x.
dims_);
3882 generate_param_names_array(EMPTY_EXP_VECTOR, x.
name_, x.
dims_);
3885 std::vector<expression> matrix_args;
3886 matrix_args.push_back(x.
M_);
3887 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3890 std::vector<expression> matrix_args;
3891 matrix_args.push_back(x.
N_);
3892 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3895 std::vector<expression> matrix_args;
3896 matrix_args.push_back(x.
M_);
3897 matrix_args.push_back(x.
N_);
3898 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3901 std::vector<expression> matrix_args;
3902 matrix_args.push_back(x.
K_);
3903 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3906 std::vector<expression> matrix_args;
3908 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3911 std::vector<expression> matrix_args;
3912 matrix_args.push_back(x.
K_);
3913 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3916 std::vector<expression> matrix_args;
3917 matrix_args.push_back(x.
K_);
3918 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3922 std::vector<expression> matrix_args;
3937 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3941 std::vector<expression> matrix_args;
3950 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3953 std::vector<expression> matrix_args;
3963 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3966 std::vector<expression> matrix_args;
3974 generate_param_names_array(matrix_args, x.
name_, x.
dims_);
3979 const std::string& name,
3980 const std::vector<expression>& dims)
const {
3982 std::vector<expression> combo_dims(dims);
3983 for (
size_t i = 0; i < matrix_dims.size(); ++i)
3984 combo_dims.push_back(matrix_dims[i]);
3986 for (
size_t i = combo_dims.size(); i-- > 0; ) {
3988 o_ <<
"for (int k_" << i <<
"__ = 1;" 3989 <<
" k_" << i <<
"__ <= ";
3991 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
3995 o_ <<
"param_name_stream__.str(std::string());" <<
EOL;
3998 o_ <<
"param_name_stream__ << \"" << name <<
'"';
4000 for (
size_t i = 0; i < combo_dims.size(); ++i)
4001 o_ <<
" << '.' << k_" << i <<
"__";
4005 o_ <<
"param_names__.push_back(param_name_stream__.str());" <<
EOL;
4008 for (
size_t i = 0; i < combo_dims.size(); ++i) {
4019 <<
"void unconstrained_param_names(" 4020 <<
"std::vector<std::string>& param_names__," 4022 <<
" bool include_tparams__ = true," 4024 <<
" bool include_gqs__ = true) const {" 4026 <<
"std::stringstream param_name_stream__;" <<
EOL;
4035 <<
"if (!include_gqs__ && !include_tparams__) return;" 4039 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i) {
4040 boost::apply_visitor(vis, prog.
derived_decl_.first[i].decl_);
4044 <<
"if (!include_gqs__) return;" 4063 generate_initialize_array(
"int",
"integer", EMPTY_EXP_VECTOR,
4067 template <
typename D>
4069 const std::string& base_type,
4070 const std::string& read_fun_prefix,
4071 const std::vector<expression>& dim_args)
const {
4072 std::vector<expression> read_args;
4073 std::string read_fun(read_fun_prefix);
4076 read_args.push_back(x.range_.low_);
4077 read_args.push_back(x.range_.high_);
4080 read_args.push_back(x.range_.low_);
4083 read_args.push_back(x.range_.high_);
4085 for (
size_t i = 0; i < dim_args.size(); ++i)
4086 read_args.push_back(dim_args[i]);
4087 generate_initialize_array(base_type, read_fun, read_args,
4092 std::vector<expression> read_args;
4093 generate_initialize_array_bounded(x,
"double",
"scalar", read_args);
4096 std::vector<expression> read_args;
4097 read_args.push_back(x.
M_);
4098 generate_initialize_array_bounded(x,
"vector_d",
"vector", read_args);
4101 std::vector<expression> read_args;
4102 read_args.push_back(x.
N_);
4103 generate_initialize_array_bounded(x,
"row_vector_d",
"row_vector",
4107 std::vector<expression> read_args;
4108 read_args.push_back(x.
M_);
4109 read_args.push_back(x.
N_);
4110 generate_initialize_array_bounded(x,
"matrix_d",
"matrix", read_args);
4113 std::vector<expression> read_args;
4114 read_args.push_back(x.
K_);
4115 generate_initialize_array(
"vector_d",
"unit_vector", read_args,
4119 std::vector<expression> read_args;
4120 read_args.push_back(x.
K_);
4121 generate_initialize_array(
"vector_d",
"simplex", read_args,
4125 std::vector<expression> read_args;
4126 read_args.push_back(x.
K_);
4127 generate_initialize_array(
"vector_d",
"ordered", read_args,
4131 std::vector<expression> read_args;
4132 read_args.push_back(x.
K_);
4133 generate_initialize_array(
"vector_d",
"positive_ordered", read_args,
4137 std::vector<expression> read_args;
4138 read_args.push_back(x.
M_);
4139 read_args.push_back(x.
N_);
4140 generate_initialize_array(
"matrix_d",
"cholesky_factor", read_args,
4144 std::vector<expression> read_args;
4145 read_args.push_back(x.
K_);
4146 generate_initialize_array(
"matrix_d",
"cholesky_corr", read_args,
4150 std::vector<expression> read_args;
4151 read_args.push_back(x.
K_);
4152 generate_initialize_array(
"matrix_d",
"cov_matrix", read_args,
4156 std::vector<expression> read_args;
4157 read_args.push_back(x.
K_);
4158 generate_initialize_array(
"matrix_d",
"corr_matrix", read_args,
4162 const std::string& read_type,
4163 const std::vector<expression>& read_args,
4164 const std::string& name,
4165 const std::vector<expression>& dims)
const{
4166 if (dims.size() == 0) {
4168 o_ << var_type <<
" ";
4169 o_ << name <<
" = in__." << read_type <<
"_constrain(";
4170 for (
size_t j = 0; j < read_args.size(); ++j) {
4171 if (j > 0)
o_ <<
",";
4178 for (
size_t i = 0; i < dims.size(); ++i)
o_ <<
"vector<";
4180 for (
size_t i = 0; i < dims.size(); ++i)
o_ <<
"> ";
4181 o_ << name <<
";" <<
EOL;
4182 std::string name_dims(name);
4183 for (
size_t i = 0; i < dims.size(); ++i) {
4185 o_ <<
"size_t dim_" << name <<
"_" << i <<
"__ = ";
4188 if (i < dims.size() - 1) {
4190 o_ << name_dims <<
".resize(dim_" << name <<
"_" << i <<
"__);" 4192 name_dims.append(
"[k_").append(
to_string(i)).append(
"__]");
4195 o_ <<
"for (size_t k_" << i <<
"__ = 0;" 4196 <<
" k_" << i <<
"__ < dim_" << name <<
"_" << i <<
"__;" 4197 <<
" ++k_" << i <<
"__) {" <<
EOL;
4198 if (i == dims.size() - 1) {
4200 o_ << name_dims <<
".push_back(in__." << read_type <<
"_constrain(";
4201 for (
size_t j = 0; j < read_args.size(); ++j) {
4202 if (j > 0)
o_ <<
",";
4209 for (
size_t i = dims.size(); i > 0; --i) {
4226 write_array(x.
name_, x.
dims_, EMPTY_EXP_VECTOR);
4229 write_array(x.
name_, x.
dims_, EMPTY_EXP_VECTOR);
4232 std::vector<expression> dims(x.
dims_);
4233 dims.push_back(x.
M_);
4234 write_array(x.
name_, dims, EMPTY_EXP_VECTOR);
4237 std::vector<expression> dims(x.
dims_);
4238 dims.push_back(x.
N_);
4239 write_array(x.
name_, dims, EMPTY_EXP_VECTOR);
4242 std::vector<expression> matdims;
4243 matdims.push_back(x.
M_);
4244 matdims.push_back(x.
N_);
4248 std::vector<expression> dims(x.
dims_);
4249 dims.push_back(x.
K_);
4250 write_array(x.
name_, dims, EMPTY_EXP_VECTOR);
4253 std::vector<expression> dims(x.
dims_);
4254 dims.push_back(x.
K_);
4255 write_array(x.
name_, dims, EMPTY_EXP_VECTOR);
4258 std::vector<expression> dims(x.
dims_);
4259 dims.push_back(x.
K_);
4260 write_array(x.
name_, dims, EMPTY_EXP_VECTOR);
4263 std::vector<expression> dims(x.
dims_);
4264 dims.push_back(x.
K_);
4265 write_array(x.
name_, dims, EMPTY_EXP_VECTOR);
4268 std::vector<expression> matdims;
4269 matdims.push_back(x.
M_);
4270 matdims.push_back(x.
N_);
4274 std::vector<expression> matdims;
4275 matdims.push_back(x.
K_);
4276 matdims.push_back(x.
K_);
4280 std::vector<expression> matdims;
4281 matdims.push_back(x.
K_);
4282 matdims.push_back(x.
K_);
4286 std::vector<expression> matdims;
4287 matdims.push_back(x.
K_);
4288 matdims.push_back(x.
K_);
4292 const std::vector<expression>& arraydims,
4293 const std::vector<expression>& matdims)
const {
4294 std::vector<expression> dims(arraydims);
4295 for (
size_t i = 0; i < matdims.size(); ++i)
4296 dims.push_back(matdims[i]);
4298 if (dims.size() == 0) {
4299 o_ <<
INDENT2 <<
"vars__.push_back(" << name <<
");" <<
EOL;
4304 for (
size_t i = dims.size(); i > 0; ) {
4307 o_ <<
"for (int k_" << i <<
"__ = 0;" 4308 <<
" k_" << i <<
"__ < ";
4310 o_ <<
"; ++k_" << i <<
"__) {" <<
EOL;
4314 o_ <<
"vars__.push_back(" << name;
4315 if (arraydims.size() > 0) {
4317 for (
size_t i = 0; i < arraydims.size(); ++i) {
4318 if (i > 0)
o_ <<
"][";
4319 o_ <<
"k_" << i <<
"__";
4323 if (matdims.size() > 0) {
4324 o_ <<
"(k_" << arraydims.size() <<
"__";
4325 if (matdims.size() > 1)
4326 o_ <<
", k_" << (arraydims.size() + 1) <<
"__";
4331 for (
size_t i = dims.size(); i > 0; --i) {
4340 const std::string& model_name,
4342 o <<
INDENT <<
"template <typename RNG>" <<
EOL;
4343 o <<
INDENT <<
"void write_array(RNG& base_rng__," <<
EOL;
4344 o <<
INDENT <<
" std::vector<double>& params_r__," <<
EOL;
4345 o <<
INDENT <<
" std::vector<int>& params_i__," <<
EOL;
4346 o <<
INDENT <<
" std::vector<double>& vars__," <<
EOL;
4347 o <<
INDENT <<
" bool include_tparams__ = true," <<
EOL;
4348 o <<
INDENT <<
" bool include_gqs__ = true," <<
EOL;
4350 <<
" std::ostream* pstream__ = 0) const {" <<
EOL;
4353 <<
"stan::io::reader<double> in__(params_r__,params_i__);"<<
EOL;
4354 o <<
INDENT2 <<
"static const char* function__ = \"" 4355 << model_name <<
"_namespace::write_array\";" <<
EOL;
4372 o <<
INDENT2 <<
"if (!include_tparams__) return;" 4377 o <<
INDENT2 <<
"stan::math::accumulator<double> lp_accum__;" <<
EOL2;
4380 <<
"double DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" 4382 o <<
INDENT2 <<
"(void) DUMMY_VAR__; // suppress unused var warning" 4385 bool is_var_context =
false;
4386 bool is_fun_return =
false;
4390 bool include_sampling =
false;
4392 include_sampling, is_var_context,
4401 for (
size_t i = 0; i < prog.
derived_decl_.first.size(); ++i)
4402 boost::apply_visitor(vis_writer, prog.
derived_decl_.first[i].decl_);
4405 o <<
INDENT2 <<
"if (!include_gqs__) return;" 4409 is_var_context, is_fun_return);
4413 include_sampling, is_var_context,
4423 boost::apply_visitor(vis_writer, prog.
generated_decl_.first[i].decl_);
4429 o <<
INDENT <<
"template <typename RNG>" <<
EOL;
4430 o <<
INDENT <<
"void write_array(RNG& base_rng," <<
EOL;
4432 <<
" Eigen::Matrix<double,Eigen::Dynamic,1>& params_r," 4435 <<
" Eigen::Matrix<double,Eigen::Dynamic,1>& vars," 4437 o <<
INDENT <<
" bool include_tparams = true," <<
EOL;
4438 o <<
INDENT <<
" bool include_gqs = true," <<
EOL;
4440 <<
" std::ostream* pstream = 0) const {" <<
EOL;
4442 <<
" std::vector<double> params_r_vec(params_r.size());" <<
EOL;
4443 o <<
INDENT <<
" for (int i = 0; i < params_r.size(); ++i)" <<
EOL;
4444 o <<
INDENT <<
" params_r_vec[i] = params_r(i);" <<
EOL;
4445 o <<
INDENT <<
" std::vector<double> vars_vec;" <<
EOL;
4446 o <<
INDENT <<
" std::vector<int> params_i_vec;" <<
EOL;
4448 <<
" write_array(base_rng,params_r_vec,params_i_vec," 4449 <<
"vars_vec,include_tparams,include_gqs,pstream);" <<
EOL;
4450 o <<
INDENT <<
" vars.resize(vars_vec.size());" <<
EOL;
4451 o <<
INDENT <<
" for (int i = 0; i < vars.size(); ++i)" <<
EOL;
4452 o <<
INDENT <<
" vars(i) = vars_vec[i];" <<
EOL;
4457 std::ostream& out) {
4458 out <<
INDENT <<
"static std::string model_name() {" <<
EOL 4459 <<
INDENT2 <<
"return \"" << model_name <<
"\";" <<
EOL 4464 std::ostream& out) {
4465 out <<
"typedef " << model_name <<
"_namespace::" << model_name
4466 <<
" stan_model;" <<
EOL2;
4470 const std::string& scalar_t_name,
4471 std::ostream& out) {
4472 for (
size_t d = 0; d < t.
num_dims_; ++d)
4473 out <<
"std::vector<";
4475 bool is_template_type =
false;
4479 is_template_type =
false;
4482 out << scalar_t_name;
4483 is_template_type =
false;
4486 out <<
"Eigen::Matrix<" 4488 <<
", Eigen::Dynamic,1>";
4489 is_template_type =
true;
4492 out <<
"Eigen::Matrix<" 4494 <<
", 1,Eigen::Dynamic>";
4495 is_template_type =
true;
4498 out <<
"Eigen::Matrix<" 4500 <<
", Eigen::Dynamic,Eigen::Dynamic>";
4501 is_template_type =
true;
4507 out <<
"UNKNOWN TYPE";
4510 for (
size_t d = 0; d < t.
num_dims_; ++d) {
4511 if (d > 0 || is_template_type)
4520 const std::string& scalar_t_name,
4521 std::ostream& out) {
4527 out <<
" " << decl.
name_;
4531 for (
size_t i = 0; i < fun.
arg_decls_.size(); ++i)
4545 std::stringstream ss;
4546 ss <<
"typename boost::math::tools::promote_args<";
4547 int num_open_brackets = 1;
4548 int num_generated_params = 0;
4549 for (
size_t i = 0; i < num_args; ++i) {
4552 if (num_generated_params > 0)
4554 if (num_generated_params == 4) {
4555 ss <<
"typename boost::math::tools::promote_args<";
4556 num_generated_params = 0;
4557 ++num_open_brackets;
4559 ss <<
"T" << i <<
"__";
4560 ++num_generated_params;
4564 if (num_generated_params > 0)
4569 for (
int i = 0; i < num_open_brackets; ++i)
4577 for (
size_t i = 0; i < fun.
arg_decls_.size(); ++i) {
4590 std::ostream& out) {
4592 out <<
"template <";
4593 bool continuing_tps =
false;
4595 out <<
"bool propto";
4596 continuing_tps =
true;
4598 for (
size_t i = 0; i < fun.
arg_decls_.size(); ++i) {
4603 out <<
"typename T" << i <<
"__";
4604 continuing_tps =
true;
4611 continuing_tps =
true;
4615 out <<
"typename T_lp__, typename T_lp_accum__";
4616 continuing_tps =
true;
4622 out <<
"template <class RNG>" <<
EOL;
4624 out <<
"template <typename T_lp__, typename T_lp_accum__>" 4626 }
else if (is_log) {
4627 out <<
"template <bool propto>" 4634 const std::string& scalar_t_name,
4636 std::ostream& out) {
4643 std::ostream& out) {
4652 std::ostream& out) {
4655 for (
size_t i = 0; i < fun.
arg_decls_.size(); ++i) {
4656 std::string template_type_i
4657 =
"T" + boost::lexical_cast<std::string>(i) +
"__";
4661 for (
size_t i = 0; i <= fun.
name_.size(); ++i)
4665 if ((is_rng || is_lp) && fun.
arg_decls_.size() > 0)
4668 out <<
"RNG& base_rng__";
4670 out <<
"T_lp__& lp__, T_lp_accum__& lp_accum__";
4671 if (is_rng || is_lp || fun.
arg_decls_.size() > 0)
4673 out <<
"std::ostream* pstream__";
4681 std::ostream& out) {
4684 for (
size_t i = 0; i < fun.
arg_decls_.size(); ++i) {
4689 if ((is_rng || is_lp) && fun.
arg_decls_.size() > 0)
4692 out <<
"base_rng__";
4694 out <<
"lp__, lp_accum__";
4695 if (is_rng || is_lp || fun.
arg_decls_.size() > 0)
4704 const std::string& scalar_t_name,
4705 std::ostream& out) {
4713 <<
"typedef " << scalar_t_name <<
" fun_scalar_t__;" 4718 ?
"int" :
"fun_scalar_t__")
4719 <<
" fun_return_scalar_t__;" 4722 <<
"const static bool propto__ = true;" 4725 <<
"(void) propto__;" 4729 <<
"fun_scalar_t__ " 4730 <<
"DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" 4732 out <<
INDENT2 <<
"(void) DUMMY_VAR__; // suppress unused var warning" 4734 bool is_var_context =
false;
4735 bool is_fun_return =
true;
4736 bool include_sampling =
true;
4738 <<
"int current_statement_begin__ = -1;" 4742 include_sampling, is_var_context,
4749 std::ostream& out) {
4751 out <<
INDENT <<
"return ";
4752 out << fun.
name_ <<
"<false>(";
4753 for (
size_t i = 0; i < fun.
arg_decls_.size(); ++i) {
4766 const std::string& scalar_t_name,
4767 std::ostream& out) {
4787 std::ostream& out) {
4809 std::ostream& out) {
4819 out <<
EOL <<
"struct ";
4821 out <<
"_functor__ {" <<
EOL;
4829 out << INDENT <<
"operator()";
4831 out <<
" const {" <<
EOL;
4837 out << INDENT <<
"}" <<
EOL;
4838 out <<
"};" <<
EOL2;
4843 std::ostream& out) {
4844 for (
size_t i = 0; i < funs.size(); ++i) {
4851 std::ostream& out) {
4857 out <<
"static int current_statement_begin__;" 4863 const std::string& model_name,
4864 std::ostream& out) {
void operator()(const return_statement &rs) const
void operator()(cholesky_corr_var_decl const &x) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const cholesky_corr_var_decl &x) const
void operator()(simplex_var_decl const &x) const
void operator()(int_var_decl const &x) const
void operator()(const unit_vector_var_decl &x) const
write_dims_visgen(std::ostream &o)
void operator()(const simplex_var_decl &x) const
void operator()(const uni_idx &i) const
void operator()(const cholesky_corr_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(cholesky_factor_var_decl const &x) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(const cholesky_corr_var_decl &x) const
void nonbasic_validate(const T &x, const std::string &type_name) const
bool is_ill_formed() const
void operator()(const ordered_var_decl &x) const
void operator()(positive_ordered_var_decl const &x) const
void operator()(const cholesky_factor_var_decl &x) const
void operator()(const cholesky_factor_var_decl &x) const
void operator()(corr_matrix_var_decl const &x) const
var_resizing_visgen var_resizer_
void generate_function(const function_decl_def &fun, std::ostream &out)
Generate the specified function and optionally its default for propto=false for functions ending in _...
void operator()(const cholesky_factor_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const nil &) const
void declare_array(const std::string &type, const std::vector< expression > &ctor_args, const std::string &name, const std::vector< expression > &dims, const expression &definition=expression()) const
void operator()(nil const &) const
bool is_no_op_statement() const
void generate_idx_user(const idx &i, std::ostream &o)
void operator()(const no_op_statement &) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(cov_matrix_var_decl const &x) const
std::string to_string(T i)
bool operator()(const sample &st) const
void operator()(unit_vector_var_decl const &x) const
void operator()(const print_statement &ps) const
bool operator()(const return_statement &st) const
void operator()(const simplex_var_decl &x) const
void operator()(positive_ordered_var_decl const &x) const
void operator()(const int_var_decl &x) const
void generate_private_decl(std::ostream &o)
void operator()(const ordered_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(row_vector_var_decl const &x) const
void operator()(unit_vector_var_decl const &x) const
std::vector< statement > statements_
void operator()(vector_var_decl const &x) const
std::vector< expression > dims_
void operator()(const vector_var_decl &x) const
void operator()(const assgn &y) const
void generate_increment(expression K, std::vector< expression > dims) const
void generate_local_var_inits(std::vector< var_decl > vs, bool is_var_context, bool declare_vars, std::ostream &o)
void operator()(matrix_var_decl const &x) const
void generate_declaration(const std::string &name, const std::string &base_type, const std::vector< expression > &dims, const expression &type_arg1=expression(), const expression &type_arg2=expression(), const expression &definition=expression()) const
void operator()(const nil &) const
void operator()(cholesky_factor_var_decl const &x) const
void generate_log_prob(program const &p, std::ostream &o)
void operator()(int_var_decl const &x) const
void operator()(cholesky_factor_var_decl const &x) const
void operator()(const unit_vector_var_decl &x) const
bool operator()(const statements &st) const
void operator()(const lb_idx &i) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(expression const &x) const
void operator()(cholesky_factor_var_decl const &x) const
Probability, optimization and sampling library.
void operator()(const double_var_decl &x) const
void generate_write_loop(const std::string &write_method_name, const std::string &var_name, const std::vector< expression > &dims) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(const nil &) const
void generate_check_int(const std::string &name, size_t) const
validate_var_decl_visgen(int indents, std::ostream &o)
void operator()(double_var_decl const &x) const
void generate_loop_var(const std::string &name, size_t dims_size) const
idx_visgen(std::ostream &o)
std::string get_prob_fun(const std::string &dist_name)
std::vector< var_decl > data_decl_
void operator()(const cholesky_factor_var_decl &x) const
void operator()(nil const &) const
void operator()(const int_var_decl &x) const
void operator()(const cholesky_corr_var_decl &x) const
void generate_unconstrained_param_names_method(const program &prog, std::ostream &o)
void operator()(const cholesky_corr_var_decl &x) const
void operator()(cholesky_corr_var_decl const &x) const
void generate_void_statement(const std::string &name, const size_t indent, std::ostream &o)
void operator()(const double_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void generate_truncation(sample const &x, bool is_user_defined, const std::string &prob_fun) const
void operator()(simplex_var_decl const &x) const
var_resizing_visgen(std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
void operator()(row_vector_var_decl const &x) const
void operator()(const positive_ordered_var_decl &x) const
void operator()(unit_vector_var_decl const &x) const
std::vector< var_decl > local_decl_
void operator()(const unit_vector_var_decl &x) const
void operator()(const vector_var_decl &x) const
void operator()(row_vector_var_decl const &x) const
bool operator()(const no_op_statement &st) const
void operator()(int_var_decl const &x) const
statement_visgen(size_t indent, bool include_sampling, bool is_var_context, bool is_fun_return, std::ostream &o)
static void print_string_literal(std::ostream &o, const std::string &s)
std::string get_cdf(const std::string &dist_name)
void generate_propto_default_function(const function_decl_def &fun, const std::string &scalar_t_name, std::ostream &out)
void generate_initialization(std::ostream &o, const std::string &var_name, const std::string &base_type, const std::vector< expression > &dims, const expression &type_arg1=expression(), const expression &type_arg2=expression())
void operator()(corr_matrix_var_decl const &x) const
void generate_model_typedef(const std::string &model_name, std::ostream &out)
void generate_end_for_dims(size_t dims_size) const
void operator()(ordered_var_decl const &x) const
void operator()(const cov_matrix_var_decl &x) const
std::vector< statement > bodies_
void operator()(const vector_var_decl &x) const
void operator()(row_vector_var_decl const &x) const
std::vector< printable > printables_
void operator()(const uni_idx &i) const
void operator()(double_var_decl const &x) const
void operator()(const vector_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const int_var_decl &x) const
member_var_decl_visgen(int indents, std::ostream &o)
void operator()(positive_ordered_var_decl const &x) const
bool operator()(const nil &st) const
void generate_idx(const idx &i, std::ostream &o)
void operator()(const ordered_var_decl &x) const
void operator()(vector_var_decl const &x) const
bool operator()(const assignment &st) const
var_size_validating_visgen var_size_validator_
void generate_indent(size_t indent, std::ostream &o)
void operator()(const ordered_var_decl &x) const
void operator()(const cholesky_corr_var_decl &x) const
void operator()(unit_vector_var_decl const &x) const
void operator()(const nil &) const
void generate_member_var_inits(const std::vector< var_decl > &vs, std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
void declare_array(std::string const &type, std::string const &name, size_t size) const
void operator()(const matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(positive_ordered_var_decl const &x) const
void generate_member_var_decls(const std::vector< var_decl > &vs, int indent, std::ostream &o)
void generate_globals(std::ostream &out)
void generate_idxs_user(const std::vector< idx > &idxs, std::ostream &o)
void generate_param_names(const std::string &name) const
expr_type expression_type() const
std::string fun_scalar_type(const function_decl_def &fun, bool is_lp)
void operator()(simplex_var_decl const &x) const
void operator()(nil const &) const
void generate_dims_method(const program &prog, std::ostream &o)
generate_init_visgen(std::ostream &o)
void generate_param_names_method(const program &prog, std::ostream &o)
void operator()(corr_matrix_var_decl const &x) const
void generate_indent_num_dims(size_t base_indent, const std::vector< expression > &dims, const expression &dim1, const expression &dim2) const
printable_visgen(std::ostream &o)
void generate_increment_i(std::vector< expression > dims) const
void operator()(nil const &) const
void operator()(const std::string &s) const
void generate_usings(std::ostream &o)
void generate_statements(const std::vector< statement > &ss, int indent, std::ostream &o, bool include_sampling, bool is_var_context, bool is_fun_return)
void operator()(matrix_var_decl const &x) const
void generate_cpp(const program &prog, const std::string &model_name, std::ostream &out)
std::string get_ccdf(const std::string &dist_name)
void operator()(double_var_decl const &x) const
void operator()(matrix_var_decl const &x) const
void generate_define_vars(const std::vector< var_decl > &vs, int indent, bool is_var_context, std::ostream &o)
void operator()(const simplex_var_decl &x) const
bool has_only_int_args(const function_decl_def &fun)
void generate_write_array_method(const program &prog, const std::string &model_name, std::ostream &o)
const std::string INDENT3(" ")
std::string function_args(const std::string &fun_prefix, const D &x) const
std::vector< function_decl_def > function_decl_defs_
void operator()(unit_vector_var_decl const &x) const
void operator()(const double_var_decl &x) const
void generate_init_vars(const std::vector< var_decl > &vs, int indent, std::ostream &o)
bool needs_template_params(const function_decl_def &fun)
void generate_typedef(const std::string &type, const std::string &abbrev, std::ostream &o)
void operator()(simplex_var_decl const &x) const
void generate_validate_context_size(std::ostream &o, const std::string &stage, const std::string &var_name, const std::string &base_type, const std::vector< expression > &dims, const expression &type_arg1=expression(), const expression &type_arg2=expression())
void operator()(const statements &x) const
void operator()(double_var_decl const &x) const
void operator()(assignment const &x) const
void operator()(const conditional_statement &x) const
void operator()(const int_var_decl &x) const
void operator()(const int_var_decl &x) const
void generate_set_param_ranges(const std::vector< var_decl > &var_decls, std::ostream &o)
void operator()(cov_matrix_var_decl const &x) const
void operator()(const matrix_var_decl &x) const
void generate_model_name_method(const std::string &model_name, std::ostream &out)
void operator()(const row_vector_var_decl &x) const
void operator()(vector_var_decl const &x) const
const std::string INDENT(" ")
const bool is_var_context_
bool operator()(const print_statement &st) const
bool operator()(const while_statement &st) const
void operator()(const nil &) const
void operator()(vector_var_decl const &x) const
void generate_using_namespace(const std::string &ns, std::ostream &o)
void generate_function_body(const function_decl_def &fun, const std::string &scalar_t_name, std::ostream &out)
void operator()(const break_continue_statement &st) const
void generate_validate_var_decls(const std::vector< var_decl > decls, int indent, std::ostream &o)
void operator()(const int_var_decl &x) const
var_size_validating_visgen var_size_validator_
void operator()(const positive_ordered_var_decl &x) const
bool is_nil(const expression &e)
void generate_validate_transformed_params(const std::vector< var_decl > &vs, int indent, std::ostream &o)
void operator()(const nil &) const
bool operator()(const assgn &st) const
void operator()(ordered_var_decl const &x) const
void operator()(cov_matrix_var_decl const &x) const
void generate_constrained_param_names_method(const program &prog, std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
const std::string MINOR_VERSION
Minor version number for Stan package.
void generate_init(const T &x) const
void operator()(const unit_vector_var_decl &x) const
void generate_validate_var_decl(const var_decl &decl, int indent, std::ostream &o)
void operator()(simplex_var_decl const &x) const
void operator()(const int_var_decl &x) const
void operator()(nil const &) const
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
void operator()(const vector_var_decl &x) const
void operator()(int_var_decl const &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void operator()(cov_matrix_var_decl const &x) const
void operator()(ordered_var_decl const &x) const
void operator()(int_var_decl const &x) const
void generate_printable(const printable &p, std::ostream &o)
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
void generate_typedefs(std::ostream &o)
void operator()(double_var_decl const &x) const
void operator()(double_var_decl const &x) const
void operator()(nil const &) const
void generate_indexed_expr_user(const std::string &expr, const std::vector< expression > indexes, base_expr_type base_type, std::ostream &o)
write_array_visgen(std::ostream &o)
bool ends_with(const std::string &suffix, const std::string &s)
void operator()(const multi_idx &i) const
void operator()(const unit_vector_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(cholesky_corr_var_decl const &x) const
bool operator()(const increment_log_prob_statement &t) const
void generate_functions(const std::vector< function_decl_def > &funs, std::ostream &out)
void operator()(const int_var_decl &x) const
const std::string EOL2("\")
void operator()(positive_ordered_var_decl const &x) const
bool is_user_defined_prob_function(const std::string &name, const expression &variate, const std::vector< expression > ¶ms)
bool lhs_var_occurs_on_rhs() const
void operator()(const row_vector_var_decl &x) const
void operator()(cholesky_corr_var_decl const &x) const
void operator()(const omni_idx &i) const
void operator()(corr_matrix_var_decl const &x) const
void generate_quoted_string(const std::string &s, std::ostream &o)
Print a the specified string to the specified output stream, wrapping in double quotes (") and replac...
void operator()(const lb_idx &i) const
void generate_version_comment(std::ostream &o)
void operator()(const unit_vector_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const vector_var_decl &x) const
void basic_validate(T const &x) const
std::vector< expression > args_
void operator()(const expression &e) const
void operator()(positive_ordered_var_decl const &x) const
void operator()(simplex_var_decl const &x) const
void operator()(int_var_decl const &x) const
void operator()(corr_matrix_var_decl const &x) const
void operator()(const cov_matrix_var_decl &x) const
void generate_param_names_array(const std::vector< expression > &matrix_dims, const std::string &name, const std::vector< expression > &dims) const
void operator()(const double_var_decl &x) const
void operator()(cholesky_factor_var_decl const &x) const
void operator()(const simplex_var_decl &x) const
void operator()(vector_var_decl const &x) const
static void print_quoted_expression(std::ostream &o, const expression &e)
void suppress_warning(const std::string &indent, const std::string &var_name, std::ostream &o)
void generate_constructor(const program &prog, const std::string &model_name, std::ostream &o)
void operator()(row_vector_var_decl const &x) const
unconstrained_param_names_visgen(std::ostream &o)
const std::string EOL("\)
void operator()(corr_matrix_var_decl const &x) const
void operator()(unit_vector_var_decl const &x) const
void operator()(const for_statement &x) const
void generate_using(const std::string &type, std::ostream &o)
void generate_begin_for_dims(const std::vector< expression > &dims) const
void generate_expression(const expression &e, std::ostream &o)
void generate_statement(const statement &s, int indent, std::ostream &o, bool include_sampling, bool is_var_context, bool is_fun_return)
base_expr_type base_type_
void operator()(const cholesky_factor_var_decl &x) const
void generate_type(const std::string &type, size_t num_dims) const
void operator()(int_var_decl const &x) const
void operator()(cholesky_corr_var_decl const &x) const
void generate_init_method(const std::vector< var_decl > &vs, std::ostream &o)
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
void operator()(const lub_idx &i) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(const ub_idx &i) const
void operator()(row_vector_var_decl const &x) const
void generate_located_statements(const std::vector< statement > &ss, int indent, std::ostream &o, bool include_sampling, bool is_var_context, bool is_fun_return)
void operator()(const vector_var_decl &x) const
void operator()(const double_var_decl &x) const
bool operator()(const expression &st) const
void generate_end_class_decl(std::ostream &o)
void operator()(const corr_matrix_var_decl &x) const
idx_user_visgen(std::ostream &o)
void operator()(const double_var_decl &x) const
void generate_initialize_array_bounded(const D &x, const std::string &base_type, const std::string &read_fun_prefix, const std::vector< expression > &dim_args) const
void operator()(positive_ordered_var_decl const &x) const
void operator()(matrix_var_decl const &x) const
base_expr_type base_type_
void operator()(cholesky_factor_var_decl const &x) const
void operator()(ordered_var_decl const &x) const
void operator()(int_var_decl const &x) const
void generate_includes(std::ostream &o)
bool operator()(const for_statement &st) const
void operator()(const cholesky_corr_var_decl &x) const
std::vector< expression > conditions_
void generate_comment(std::string const &msg, int indent, std::ostream &o)
void operator()(const double_var_decl &x) const
void operator()(corr_matrix_var_decl const &x) const
void generate_function_arguments(const function_decl_def &fun, bool is_rng, bool is_lp, bool is_log, std::ostream &out)
std::vector< arg_decl > arg_decls_
void generate_functor_arguments(const function_decl_def &fun, bool is_rng, bool is_lp, bool is_log, std::ostream &out)
void operator()(const simplex_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void generate_increment(expression M, expression N, std::vector< expression > dims) const
void operator()(const cholesky_factor_var_decl &x) const
void generate_try(int indent, std::ostream &o)
bool operator()(const reject_statement &st) const
void operator()(const matrix_var_decl &x) const
void operator()(const simplex_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void operator()(nil const &) const
void operator()(simplex_var_decl const &x) const
generate_init_vars_visgen(int indent, std::ostream &o)
void operator()(vector_var_decl const &x) const
void operator()(cov_matrix_var_decl const &x) const
void operator()(cov_matrix_var_decl const &x) const
void operator()(cholesky_factor_var_decl const &x) const
void generate_function_functor(const function_decl_def &fun, std::ostream &out)
void operator()(const row_vector_var_decl &x) const
void generate_name_dims(const std::string name, size_t num_dims) const
void operator()(const nil &) const
void generate_initialize_array(const std::string &var_type, const std::string &read_type, const std::vector< expression > &read_args, const std::string &name, const std::vector< expression > &dims) const
std::vector< expression > dims_
void operator()(positive_ordered_var_decl const &x) const
void operator()(const multi_idx &i) const
void generate_indexed_expr(const std::string &expr, const std::vector< expression > indexes, base_expr_type base_type, size_t e_num_dims, bool user_facing, std::ostream &o)
void generate_eigen_index_expression(const expression &e, std::ostream &o)
void operator()(const row_vector_var_decl &x) const
void generate_buffer_loop(const std::string &base_type, const std::string &name, const std::vector< expression > &dims, const expression &dim1=expression(), const expression &dim2=expression(), int indent=2U) const
void generate_function_name(const function_decl_def &fun, std::ostream &out)
void generate_initialize_array_bounded(const D &x, const std::string &base_type, const std::string &read_fun_prefix, const std::vector< expression > &dim_args) const
void generate_dims_array(const std::vector< expression > &matrix_dims_exprs, const std::vector< expression > &array_dims_exprs) const
void operator()(double_var_decl const &x) const
void generate_check_double(const std::string &name, size_t) const
void operator()(matrix_var_decl const &x) const
void operator()(const cholesky_corr_var_decl &x) const
void generate_end_namespace(std::ostream &o)
void operator()(ordered_var_decl const &x) const
bool operator()(const break_continue_statement &st) const
void operator()(const double_var_decl &x) const
constrained_param_names_visgen(std::ostream &o)
void generate_function_inline_return_type(const function_decl_def &fun, const std::string &scalar_t_name, int indent, std::ostream &out)
void operator()(const cholesky_corr_var_decl &x) const
void operator()(const vector_var_decl &x) const
void operator()(const increment_log_prob_statement &x) const
void generate_idxs(const std::vector< idx > &idxs, std::ostream &o)
void generate_initializer(std::ostream &o, const std::string &base_type, const std::vector< expression > &dims, const expression &type_arg1=expression(), const expression &type_arg2=expression())
void operator()(cholesky_corr_var_decl const &x) const
void generate_type(const std::string &base_type, const std::vector< expression > &, size_t end, std::ostream &o)
void operator()(const ordered_var_decl &x) const
void write_array(const std::string &name, const std::vector< expression > &arraydims, const std::vector< expression > &matdims) const
void operator()(const cov_matrix_var_decl &x) const
void generate_local_var_decls(const std::vector< var_decl > &vs, int indent, std::ostream &o, bool is_var_context, bool is_fun_return)
dump_member_var_visgen(std::ostream &o)
void operator()(const cholesky_corr_var_decl &x) const
void operator()(const double_var_decl &x) const
void generate_destructor(const std::string &model_name, std::ostream &o)
void operator()(simplex_var_decl const &x) const
void operator()(ordered_var_decl const &x) const
void operator()(const nil &) const
void generate_member_var_decls_all(const program &prog, std::ostream &out)
void generate_catch_throw_located(int indent, std::ostream &o)
void operator()(const unit_vector_var_decl &x) const
void operator()(ordered_var_decl const &x) const
void operator()(const int_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
write_param_names_visgen(std::ostream &o)
bool operator()(const conditional_statement &st) const
void operator()(const cholesky_factor_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void generate_init_args(const std::string &type, const std::vector< expression > &ctor_args, const std::vector< expression > &dims, size_t dim) const
void generate_local_var_init_nan(const std::vector< var_decl > &vs, int indent, std::ostream &o, bool is_var_context, bool is_fun_return)
void operator()(const row_vector_var_decl &x) const
void operator()(const omni_idx &i) const
void operator()(const row_vector_var_decl &x) const
generic visitor with output for extension
void operator()(const corr_matrix_var_decl &x) const
void operator()(const matrix_var_decl &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const unit_vector_var_decl &x) const
void operator()(const lub_idx &i) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const corr_matrix_var_decl &x) const
void generate_propto_default_function_body(const function_decl_def &fun, std::ostream &out)
void operator()(cov_matrix_var_decl const &x) const
void operator()(const vector_var_decl &x) const
void operator()(vector_var_decl const &x) const
void operator()(ordered_var_decl const &x) const
bool is_user_defined(const std::string &name, const std::vector< expression > &args)
void generate_initialize_array(const std::string &var_type, const std::string &read_type, const std::vector< expression > &read_args, const std::string &name, const std::vector< expression > &dims) const
generate_local_var_init_nan_visgen(bool is_var_context, int indent, std::ostream &o)
void operator()(const positive_ordered_var_decl &x) const
var_size_validating_visgen(std::ostream &o, const std::string &stage)
const std::string MAJOR_VERSION
Major version number for Stan package.
void operator()(double_var_decl const &x) const
void operator()(const cholesky_factor_var_decl &x) const
void generate_var_resizing(const std::vector< var_decl > &vs, std::ostream &o)
void operator()(nil const &) const
void operator()(const ordered_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
const bool is_var_context_
void operator()(row_vector_var_decl const &x) const
void generate_public_decl(std::ostream &o)
void operator()(corr_matrix_var_decl const &x) const
void operator()(const corr_matrix_var_decl &x) const
Placeholder struct for boost::variant default ctors.
const std::string INDENT2(" ")
void operator()(const nil &) const
set_param_ranges_visgen(std::ostream &o)
void operator()(matrix_var_decl const &x) const
void generate_include(const std::string &lib_name, std::ostream &o)
const std::vector< expression > EMPTY_EXP_VECTOR(0)
void operator()(sample const &x) const
void generate_arg_decl(bool gen_const, bool gen_ref, const arg_decl &decl, const std::string &scalar_t_name, std::ostream &out)
void generate_dims_loop_fwd(const std::vector< expression > &dims, int indent=2U) const
void generate_located_statement(const statement &s, int indent, std::ostream &o, bool include_sampling, bool is_var_context, bool is_fun_return)
void operator()(cov_matrix_var_decl const &x) const
void operator()(const reject_statement &ps) const
void operator()(vector_var_decl const &x) const
void generate_start_namespace(std::string name, std::ostream &o)
void operator()(const unit_vector_var_decl &x) const
void generate_bare_type(const expr_type &t, const std::string &scalar_t_name, std::ostream &out)
void operator()(row_vector_var_decl const &x) const
void generate_increment(std::vector< expression > dims) const
void operator()(matrix_var_decl const &x) const
init_local_var_visgen(bool declare_vars, bool is_var_context, std::ostream &o)
void generate_void_statement(const std::string &name) const
void operator()(unit_vector_var_decl const &x) const
void operator()(unit_vector_var_decl const &x) const
void operator()(const cov_matrix_var_decl &x) const
void operator()(const ordered_var_decl &x) const
void operator()(const cholesky_corr_var_decl &x) const
void operator()(const row_vector_var_decl &x) const
void generate_param_names_array(const std::vector< expression > &matrix_dims, const std::string &name, const std::vector< expression > &dims) const
std::vector< printable > printables_
write_array_vars_visgen(std::ostream &o)
void operator()(const ub_idx &i) const
local_var_decl_visgen(int indents, bool is_var_context, bool is_fun_return, std::ostream &o)
std::vector< var_decl > parameter_decl_
void generate_class_decl(const std::string &model_name, std::ostream &o)
void operator()(const while_statement &x) const
void operator()(nil const &) const
void operator()(const cholesky_factor_var_decl &x) const
void generate_function_template_parameters(const function_decl_def &fun, bool is_rng, bool is_lp, bool is_log, std::ostream &out)
void generate_validate_positive(const std::string &var_name, const expression &expr, std::ostream &o)
void operator()(matrix_var_decl const &x) const
void operator()(cholesky_factor_var_decl const &x) const