Stan  2.13.1
probability, sampling & optimization
ast.hpp
Go to the documentation of this file.
1 #ifndef STAN_LANG_AST_HPP
2 #define STAN_LANG_AST_HPP
3 
4 #include <boost/variant/recursive_variant.hpp>
5 
6 #include <map>
7 #include <set>
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 namespace stan {
13 
14  namespace lang {
15 
18  struct nil { };
19 
20  // components of abstract syntax tree
21  struct array_literal;
22  struct assignment;
23  struct assgn;
24  struct binary_op;
26  struct conditional_op;
27  struct conditional_statement;
28  struct distribution;
29  struct double_var_decl;
30  struct double_literal;
31  struct expression;
32  struct for_statement;
33  struct fun;
34  struct function_decl_def;
35  struct function_decl_defs;
36  struct identifier;
38  struct index_op;
39  struct index_op_sliced;
40  struct int_literal;
41  struct inv_var_decl;
42  struct matrix_var_decl;
43  struct no_op_statement;
44  struct ordered_var_decl;
46  struct print_statement;
47  struct program;
48  struct range;
49  struct reject_statement;
50  struct return_statement;
51  struct row_vector_var_decl;
52  struct sample;
53  struct simplex_var_decl;
54  struct integrate_ode;
55  struct integrate_ode_control;
56  struct unit_vector_var_decl;
57  struct statement;
58  struct statements;
59  struct unary_op;
60  struct variable;
61  struct variable_dims;
62  struct var_decl;
63  struct var_type;
64  struct vector_var_decl;
66 
67  // forward declarable enum hack (can't fwd-decl enum)
68  typedef int base_expr_type;
69  const int VOID_T = 0;
70  const int INT_T = 1;
71  const int DOUBLE_T = 2;
72  const int VECTOR_T = 3;
73  const int ROW_VECTOR_T = 4;
74  const int MATRIX_T = 5;
75  const int ILL_FORMED_T = 6;
76 
77  typedef int var_origin;
78  const int model_name_origin = 0;
79  const int data_origin = 1;
80  const int transformed_data_origin = 2;
81  const int parameter_origin = 3;
83  const int derived_origin = 5;
84  const int local_origin = 6;
85  const int function_argument_origin = 7;
91 
92  bool is_data_origin(const var_origin& vo);
93 
94  bool is_fun_origin(const var_origin& vo);
95 
96  void print_var_origin(std::ostream& o, const var_origin& vo);
97 
98 
99  std::ostream& write_base_expr_type(std::ostream& o, base_expr_type type);
100 
101  struct expr_type {
102  base_expr_type base_type_;
103  size_t num_dims_;
104  expr_type();
105  expr_type(const base_expr_type base_type); // NOLINT(runtime/explicit)
106  expr_type(const base_expr_type base_type,
107  size_t num_dims);
108  bool operator==(const expr_type& et) const;
109  bool operator!=(const expr_type& et) const;
110  bool operator<(const expr_type& et) const;
111  bool operator<=(const expr_type& et) const;
112  bool operator>(const expr_type& et) const;
113  bool operator>=(const expr_type& et) const;
114  bool is_primitive() const;
115  bool is_primitive_int() const;
116  bool is_primitive_double() const;
117  bool is_ill_formed() const;
118  bool is_void() const;
119  base_expr_type type() const;
120  size_t num_dims() const;
121  };
122 
123 
124  std::ostream& operator<<(std::ostream& o, const expr_type& et);
125 
127 
129  const expr_type& et2);
130 
131  typedef std::pair<expr_type, std::vector<expr_type> > function_signature_t;
132 
134  public:
135  static function_signatures& instance();
136  static void reset_sigs();
137  void set_user_defined(const std::pair<std::string, function_signature_t>&
138  name_sig);
139  bool is_user_defined(const std::pair<std::string, function_signature_t>&
140  name_sig);
141  void add(const std::string& name,
142  const expr_type& result_type,
143  const std::vector<expr_type>& arg_types);
144  void add(const std::string& name,
145  const expr_type& result_type);
146  void add(const std::string& name,
147  const expr_type& result_type,
148  const expr_type& arg_type);
149  void add(const std::string& name,
150  const expr_type& result_type,
151  const expr_type& arg_type1,
152  const expr_type& arg_type2);
153  void add(const std::string& name,
154  const expr_type& result_type,
155  const expr_type& arg_type1,
156  const expr_type& arg_type2,
157  const expr_type& arg_type3);
158  void add(const std::string& name,
159  const expr_type& result_type,
160  const expr_type& arg_type1,
161  const expr_type& arg_type2,
162  const expr_type& arg_type3,
163  const expr_type& arg_type4);
164  void add(const std::string& name,
165  const expr_type& result_type,
166  const expr_type& arg_type1,
167  const expr_type& arg_type2,
168  const expr_type& arg_type3,
169  const expr_type& arg_type4,
170  const expr_type& arg_type5);
171  void add(const std::string& name,
172  const expr_type& result_type,
173  const expr_type& arg_type1,
174  const expr_type& arg_type2,
175  const expr_type& arg_type3,
176  const expr_type& arg_type4,
177  const expr_type& arg_type5,
178  const expr_type& arg_type6);
179  void add(const std::string& name,
180  const expr_type& result_type,
181  const expr_type& arg_type1,
182  const expr_type& arg_type2,
183  const expr_type& arg_type3,
184  const expr_type& arg_type4,
185  const expr_type& arg_type5,
186  const expr_type& arg_type6,
187  const expr_type& arg_type7);
188  void add_nullary(const::std::string& name);
189  void add_unary(const::std::string& name);
190  void add_unary_vectorized(const::std::string& name);
191  void add_binary(const::std::string& name);
192  void add_ternary(const::std::string& name);
193  void add_quaternary(const::std::string& name);
194  int num_promotions(const std::vector<expr_type>& call_args,
195  const std::vector<expr_type>& sig_args);
196  expr_type get_result_type(const std::string& name,
197  const std::vector<expr_type>& args,
198  std::ostream& error_msgs,
199  bool sampling_error_style = false);
200  int get_signature_matches(const std::string& name,
201  const std::vector<expr_type>& args,
202  function_signature_t& signature);
203  bool is_defined(const std::string& name,
204  const function_signature_t& sig);
205  bool has_user_defined_key(const std::string& name) const;
206  std::set<std::string> key_set() const;
207  bool has_key(const std::string& key) const;
208  bool discrete_first_arg(const std::string& name) const;
209 
210  private:
213  std::map<std::string, std::vector<function_signature_t> > sigs_map_;
214  std::set<std::pair<std::string, function_signature_t> > user_defined_set_;
215  static function_signatures* sigs_; // init below outside of class
216  };
217 
218  struct statements {
219  std::vector<var_decl> local_decl_;
220  std::vector<statement> statements_;
221  statements();
222  statements(const std::vector<var_decl>& local_decl,
223  const std::vector<statement>& stmts);
224  };
225 
226  struct distribution {
227  std::string family_;
228  std::vector<expression> args_;
229  };
230 
231  struct expression_type_vis : public boost::static_visitor<expr_type> {
232  expr_type operator()(const nil& e) const;
233  expr_type operator()(const int_literal& e) const;
234  expr_type operator()(const double_literal& e) const;
235  expr_type operator()(const array_literal& e) const;
236  expr_type operator()(const variable& e) const;
237  expr_type operator()(const fun& e) const;
238  expr_type operator()(const integrate_ode& e) const;
239  expr_type operator()(const integrate_ode_control& e) const;
240  expr_type operator()(const index_op& e) const;
241  expr_type operator()(const index_op_sliced& e) const;
242  expr_type operator()(const conditional_op& e) const;
243  expr_type operator()(const binary_op& e) const;
244  expr_type operator()(const unary_op& e) const;
245  };
246 
247 
248  struct expression;
249 
250  struct expression {
251  typedef boost::variant<boost::recursive_wrapper<nil>,
252  boost::recursive_wrapper<int_literal>,
253  boost::recursive_wrapper<double_literal>,
254  boost::recursive_wrapper<array_literal>,
255  boost::recursive_wrapper<variable>,
256  boost::recursive_wrapper<integrate_ode>,
257  boost::recursive_wrapper<integrate_ode_control>,
258  boost::recursive_wrapper<fun>,
259  boost::recursive_wrapper<index_op>,
260  boost::recursive_wrapper<index_op_sliced>,
261  boost::recursive_wrapper<conditional_op>,
262  boost::recursive_wrapper<binary_op>,
263  boost::recursive_wrapper<unary_op> >
265 
266  expression();
267  expression(const expression& e);
268 
269  // template <typename Expr> expression(const Expr& expr);
270  expression(const nil& expr); // NOLINT(runtime/explicit)
271  expression(const int_literal& expr); // NOLINT(runtime/explicit)
272  expression(const double_literal& expr); // NOLINT(runtime/explicit)
273  expression(const array_literal& expr); // NOLINT(runtime/explicit)
274  expression(const variable& expr); // NOLINT(runtime/explicit)
275  expression(const fun& expr); // NOLINT(runtime/explicit)
276  expression(const integrate_ode& expr); // NOLINT(runtime/explicit)
277  expression(const integrate_ode_control& expr); // NOLINT
278  expression(const index_op& expr); // NOLINT(runtime/explicit)
279  expression(const index_op_sliced& expr); // NOLINT(runtime/explicit)
280  expression(const conditional_op& expr); // NOLINT(runtime/explicit)
281  expression(const binary_op& expr); // NOLINT(runtime/explicit)
282  expression(const unary_op& expr); // NOLINT(runtime/explicit)
283  expression(const expression_t& expr_); // NOLINT(runtime/explicit)
284 
285  expr_type expression_type() const;
286  int total_dims() const;
287 
288  expression& operator+=(const expression& rhs);
289  expression& operator-=(const expression& rhs);
290  expression& operator*=(const expression& rhs);
291  expression& operator/=(const expression& rhs);
292 
294  };
295 
296 
297  struct printable {
298  typedef boost::variant<boost::recursive_wrapper<std::string>,
299  boost::recursive_wrapper<expression> >
301 
302  printable();
303  printable(const expression& expression); // NOLINT(runtime/explicit)
304  printable(const std::string& msg); // NOLINT(runtime/explicit)
305  printable(const printable_t& printable); // NOLINT(runtime/explicit)
306  printable(const printable& printable); // NOLINT(runtime/explicit)
307 
309  };
310 
311  struct is_nil_op : public boost::static_visitor<bool> {
312  bool operator()(const nil& x) const; // NOLINT(runtime/explicit)
313  bool operator()(const int_literal& x) const; // NOLINT(runtime/explicit)
314  bool operator()(const double_literal& x) const; // NOLINT
315  bool operator()(const array_literal& x) const; // NOLINT
316  bool operator()(const variable& x) const; // NOLINT(runtime/explicit)
317  bool operator()(const integrate_ode& x) const; // NOLINT
318  bool operator()(const integrate_ode_control& x) const; // NOLINT
319  bool operator()(const fun& x) const; // NOLINT(runtime/explicit)
320  bool operator()(const index_op& x) const; // NOLINT(runtime/explicit)
321  bool operator()(const index_op_sliced& x) const; // NOLINT
322  bool operator()(const conditional_op& x) const; // NOLINT
323  bool operator()(const binary_op& x) const; // NOLINT(runtime/explicit)
324  bool operator()(const unary_op& x) const; // NOLINT(runtime/explicit)
325  };
326 
327  bool is_nil(const expression& e);
328 
329  struct variable_dims {
330  std::string name_;
331  std::vector<expression> dims_;
332  variable_dims();
333  variable_dims(std::string const& name,
334  std::vector<expression> const& dims);
335  };
336 
337 
338  struct int_literal {
339  int val_;
341  int_literal();
342  int_literal(int val); // NOLINT(runtime/explicit)
343  int_literal(const int_literal& il); // NOLINT(runtime/explicit)
344  int_literal& operator=(const int_literal& il);
345  };
346 
347 
348  struct double_literal {
349  double val_;
351  double_literal();
352  double_literal(double val); // NOLINT(runtime/explicit)
353  double_literal& operator=(const double_literal& dl);
354  };
355 
356  struct array_literal {
357  std::vector<expression> args_;
359  array_literal();
360  array_literal(const std::vector<expression>& args); // NOLINT
361  array_literal& operator=(const array_literal& al);
362  };
363 
364  struct variable {
365  std::string name_;
367  variable();
368  variable(std::string name); // NOLINT(runtime/explicit)
369  void set_type(const base_expr_type& base_type,
370  size_t num_dims);
371  };
372 
373  struct integrate_ode {
376  expression y0_; // initial state
377  expression t0_; // initial time
378  expression ts_; // solution times
379  expression theta_; // params
380  expression x_; // data
381  expression x_int_; // integer data
382  integrate_ode();
383  integrate_ode(const std::string& integration_function_name,
384  const std::string& system_function_name,
385  const expression& y0,
386  const expression& t0,
387  const expression& ts,
388  const expression& theta,
389  const expression& x,
390  const expression& x_int);
391  };
392 
396  expression y0_; // initial state
397  expression t0_; // initial time
398  expression ts_; // solution times
399  expression theta_; // params
400  expression x_; // data
401  expression x_int_; // integer data
402  expression rel_tol_; // relative tolerance
403  expression abs_tol_; // absolute tolerance
404  expression max_num_steps_; // max number of steps
406  integrate_ode_control(const std::string& integration_function_name,
407  const std::string& system_function_name,
408  const expression& y0,
409  const expression& t0,
410  const expression& ts,
411  const expression& theta,
412  const expression& x,
413  const expression& x_int,
414  const expression& rel_tol,
415  const expression& abs_tol,
416  const expression& max_num_steps);
417  };
418 
419  struct fun {
420  std::string name_;
421  std::string original_name_;
422  std::vector<expression> args_;
424  fun();
425  fun(std::string const& name,
426  std::vector<expression> const& args);
427  // void infer_type(); // FIXME: is this used anywhere?
428  };
429 
430  size_t total_dims(const std::vector<std::vector<expression> >& dimss);
431 
432  expr_type infer_type_indexing(const base_expr_type& expr_base_type,
433  size_t num_expr_dims,
434  size_t num_index_dims);
435 
437  size_t num_index_dims);
438 
439 
440  struct index_op {
442  std::vector<std::vector<expression> > dimss_;
444  index_op();
445  // vec of vec for e.g., e[1,2][3][4,5,6]
446  index_op(const expression& expr,
447  const std::vector<std::vector<expression> >& dimss);
448  void infer_type();
449  };
450 
451  struct conditional_op {
452  expression cond_; // conditional - must be int val
456  bool has_var_;
457  var_origin var_origin_;
458  conditional_op();
459  conditional_op(const expression& cond,
460  const expression& true_val,
461  const expression& false_val);
462  };
463 
464  struct binary_op {
465  std::string op;
469  binary_op();
470  binary_op(const expression& left,
471  const std::string& op,
472  const expression& right);
473  };
474 
475  struct unary_op {
476  char op;
479  unary_op(char op,
480  expression const& subject);
481  };
482 
483  struct range {
486  range();
487  range(expression const& low,
488  expression const& high);
489  bool has_low() const;
490  bool has_high() const;
491  };
492 
493  struct uni_idx {
495  uni_idx();
496  uni_idx(const expression& idx); // NOLINT(runtime/explicit)
497  };
498  struct multi_idx {
500  multi_idx();
501  multi_idx(const expression& idxs); // NOLINT(runtime/explicit)
502  };
503  struct omni_idx {
504  omni_idx();
505  };
506  struct lb_idx {
508  lb_idx();
509  lb_idx(const expression& lb); // NOLINT(runtime/explicit)
510  };
511  struct ub_idx {
513  ub_idx();
514  ub_idx(const expression& ub); // NOLINT(runtime/explicit)
515  };
516  struct lub_idx {
519  lub_idx();
520  lub_idx(const expression& lb,
521  const expression& ub);
522  };
523 
524  struct idx {
525  typedef boost::variant<boost::recursive_wrapper<uni_idx>,
526  boost::recursive_wrapper<multi_idx>,
527  boost::recursive_wrapper<omni_idx>,
528  boost::recursive_wrapper<lb_idx>,
529  boost::recursive_wrapper<ub_idx>,
530  boost::recursive_wrapper<lub_idx> >
532 
533  idx();
534 
535  idx(const uni_idx& i); // NOLINT(runtime/explicit)
536  idx(const multi_idx& i); // NOLINT(runtime/explicit)
537  idx(const omni_idx& i); // NOLINT(runtime/explicit)
538  idx(const lb_idx& i); // NOLINT(runtime/explicit)
539  idx(const ub_idx& i); // NOLINT(runtime/explicit)
540  idx(const lub_idx& i); // NOLINT(runtime/explicit)
541 
543  };
544 
545  struct is_multi_index_vis : public boost::static_visitor<bool> {
547  bool operator()(const uni_idx& i) const;
548  bool operator()(const multi_idx& i) const;
549  bool operator()(const omni_idx& i) const;
550  bool operator()(const lb_idx& i) const;
551  bool operator()(const ub_idx& i) const;
552  bool operator()(const lub_idx& i) const;
553  };
554 
555  bool is_multi_index(const idx& idx);
556 
559  std::vector<idx> idxs_;
561  index_op_sliced();
562  // vec of vec for e.g., e[1,2][3][4,5,6]
563  index_op_sliced(const expression& expr,
564  const std::vector<idx>& idxs);
565  void infer_type();
566  };
567 
568  struct base_var_decl {
569  std::string name_;
570  std::vector<expression> dims_;
571  base_expr_type base_type_;
573  base_var_decl();
574  base_var_decl(const base_expr_type& base_type); // NOLINT
575  base_var_decl(const std::string& name,
576  const std::vector<expression>& dims,
577  const base_expr_type& base_type);
578  base_var_decl(const std::string& name,
579  const std::vector<expression>& dims,
580  const base_expr_type& base_type,
581  const expression& def);
582  };
583 
584  struct variable_map {
585  typedef std::pair<base_var_decl, var_origin> range_t;
586 
587  bool exists(const std::string& name) const;
588  base_var_decl get(const std::string& name) const;
589  base_expr_type get_base_type(const std::string& name) const;
590  size_t get_num_dims(const std::string& name) const;
591  var_origin get_origin(const std::string& name) const;
592  void add(const std::string& name,
593  const base_var_decl& base_decl,
594  const var_origin& vo);
595  void remove(const std::string& name);
596 
597  std::map<std::string, range_t> map_;
598  };
599 
600  struct int_var_decl : public base_var_decl {
602  int_var_decl();
603  int_var_decl(range const& range,
604  std::string const& name,
605  std::vector<expression> const& dims,
606  expression const& def);
607  };
608 
609 
610  struct double_var_decl : public base_var_decl {
612  double_var_decl();
613  double_var_decl(range const& range,
614  std::string const& name,
615  std::vector<expression> const& dims,
616  expression const& def);
617  };
618 
623  std::string const& name,
624  std::vector<expression> const& dims);
625  };
626 
627  struct simplex_var_decl : public base_var_decl {
630  simplex_var_decl(expression const& K,
631  std::string const& name,
632  std::vector<expression> const& dims);
633  };
634 
635  struct ordered_var_decl : public base_var_decl {
638  ordered_var_decl(expression const& K,
639  std::string const& name,
640  std::vector<expression> const& dims);
641  };
642 
647  std::string const& name,
648  std::vector<expression> const& dims);
649  };
650 
651  struct vector_var_decl : public base_var_decl {
654  vector_var_decl();
655  vector_var_decl(range const& range,
656  expression const& M,
657  std::string const& name,
658  std::vector<expression> const& dims,
659  expression const& def);
660  };
661 
667  expression const& N,
668  std::string const& name,
669  std::vector<expression> const& dims,
670  expression const& def);
671  };
672 
673  struct matrix_var_decl : public base_var_decl {
677  matrix_var_decl();
678  matrix_var_decl(range const& range,
679  expression const& M,
680  expression const& N,
681  std::string const& name,
682  std::vector<expression> const& dims,
683  expression const& def);
684  };
685 
691  expression const& N,
692  std::string const& name,
693  std::vector<expression> const& dims);
694  };
695 
700  std::string const& name,
701  std::vector<expression> const& dims);
702  };
703 
708  std::string const& name,
709  std::vector<expression> const& dims);
710  };
711 
712 
717  std::string const& name,
718  std::vector<expression> const& dims);
719  };
720 
721  struct name_vis : public boost::static_visitor<std::string> {
722  name_vis();
723  std::string operator()(const nil& x) const;
724  std::string operator()(const int_var_decl& x) const;
725  std::string operator()(const double_var_decl& x) const;
726  std::string operator()(const vector_var_decl& x) const;
727  std::string operator()(const row_vector_var_decl& x) const;
728  std::string operator()(const matrix_var_decl& x) const;
729  std::string operator()(const simplex_var_decl& x) const;
730  std::string operator()(const unit_vector_var_decl& x) const;
731  std::string operator()(const ordered_var_decl& x) const;
732  std::string operator()(const positive_ordered_var_decl& x) const;
733  std::string operator()(const cholesky_factor_var_decl& x) const;
734  std::string operator()(const cholesky_corr_var_decl& x) const;
735  std::string operator()(const cov_matrix_var_decl& x) const;
736  std::string operator()(const corr_matrix_var_decl& x) const;
737  };
738 
740  : public boost::static_visitor<base_var_decl> {
742  base_var_decl operator()(const nil& x) const;
743  base_var_decl operator()(const int_var_decl& x) const;
744  base_var_decl operator()(const double_var_decl& x) const;
745  base_var_decl operator()(const vector_var_decl& x) const;
746  base_var_decl operator()(const row_vector_var_decl& x) const;
747  base_var_decl operator()(const matrix_var_decl& x) const;
748  base_var_decl operator()(const simplex_var_decl& x) const;
749  base_var_decl operator()(const unit_vector_var_decl& x) const;
750  base_var_decl operator()(const ordered_var_decl& x) const;
751  base_var_decl operator()(const positive_ordered_var_decl& x) const;
752  base_var_decl operator()(const cholesky_factor_var_decl& x) const;
753  base_var_decl operator()(const cholesky_corr_var_decl& x) const;
754  base_var_decl operator()(const cov_matrix_var_decl& x) const;
755  base_var_decl operator()(const corr_matrix_var_decl& x) const;
756  };
757 
759  : public boost::static_visitor<std::vector<expression> > {
761  std::vector<expression> operator()(const nil& x) const;
762  std::vector<expression> operator()(const int_var_decl& x) const;
763  std::vector<expression> operator()(const double_var_decl& x) const;
764  std::vector<expression> operator()(const vector_var_decl& x) const;
765  std::vector<expression> operator()(const row_vector_var_decl& x) const;
766  std::vector<expression> operator()(const matrix_var_decl& x) const;
767  std::vector<expression> operator()(const simplex_var_decl& x) const;
768  std::vector<expression> operator()(const unit_vector_var_decl& x) const;
769  std::vector<expression> operator()(const ordered_var_decl& x) const;
770  std::vector<expression> operator()(
771  const positive_ordered_var_decl& x) const;
772  std::vector<expression> operator()(
773  const cholesky_factor_var_decl& x) const;
774  std::vector<expression> operator()(const cholesky_corr_var_decl& x) const;
775  std::vector<expression> operator()(const cov_matrix_var_decl& x) const;
776  std::vector<expression> operator()(const corr_matrix_var_decl& x) const;
777  };
778 
780  : public boost::static_visitor<bool> {
782  bool operator()(const nil& x) const;
783  bool operator()(const int_var_decl& x) const;
784  bool operator()(const double_var_decl& x) const;
785  bool operator()(const vector_var_decl& x) const;
786  bool operator()(const row_vector_var_decl& x) const;
787  bool operator()(const matrix_var_decl& x) const;
788  bool operator()(const simplex_var_decl& x) const;
789  bool operator()(const unit_vector_var_decl& x) const;
790  bool operator()(const ordered_var_decl& x) const;
791  bool operator()(const positive_ordered_var_decl& x) const;
792  bool operator()(const cholesky_factor_var_decl& x) const;
793  bool operator()(const cholesky_corr_var_decl& x) const;
794  bool operator()(const cov_matrix_var_decl& x) const;
795  bool operator()(const corr_matrix_var_decl& x) const;
796  };
797 
799  : public boost::static_visitor<expression> {
801  expression operator()(const nil& x) const;
802  expression operator()(const int_var_decl& x) const;
803  expression operator()(const double_var_decl& x) const;
804  expression operator()(const vector_var_decl& x) const;
805  expression operator()(const row_vector_var_decl& x) const;
806  expression operator()(const matrix_var_decl& x) const;
807  expression operator()(const simplex_var_decl& x) const;
808  expression operator()(const unit_vector_var_decl& x) const;
809  expression operator()(const ordered_var_decl& x) const;
810  expression operator()(const positive_ordered_var_decl& x) const;
811  expression operator()(const cholesky_factor_var_decl& x) const;
812  expression operator()(const cholesky_corr_var_decl& x) const;
813  expression operator()(const cov_matrix_var_decl& x) const;
814  expression operator()(const corr_matrix_var_decl& x) const;
815  };
816 
817  struct var_decl {
818  typedef boost::variant<boost::recursive_wrapper<nil>,
819  boost::recursive_wrapper<int_var_decl>,
820  boost::recursive_wrapper<double_var_decl>,
821  boost::recursive_wrapper<vector_var_decl>,
822  boost::recursive_wrapper<row_vector_var_decl>,
823  boost::recursive_wrapper<matrix_var_decl>,
824  boost::recursive_wrapper<simplex_var_decl>,
825  boost::recursive_wrapper<unit_vector_var_decl>,
826  boost::recursive_wrapper<ordered_var_decl>,
827  boost::recursive_wrapper<positive_ordered_var_decl>,
828  boost::recursive_wrapper<cholesky_factor_var_decl>,
829  boost::recursive_wrapper<cholesky_corr_var_decl>,
830  boost::recursive_wrapper<cov_matrix_var_decl>,
831  boost::recursive_wrapper<corr_matrix_var_decl> >
834  var_decl();
835 
836  // template <typename Decl>
837  // var_decl(Decl const& decl);
838  var_decl(const var_decl_t& decl); // NOLINT(runtime/explicit)
839  var_decl(const nil& decl); // NOLINT(runtime/explicit)
840  var_decl(const int_var_decl& decl); // NOLINT(runtime/explicit)
841  var_decl(const double_var_decl& decl); // NOLINT(runtime/explicit)
842  var_decl(const vector_var_decl& decl); // NOLINT(runtime/explicit)
843  var_decl(const row_vector_var_decl& decl); // NOLINT(runtime/explicit)
844  var_decl(const matrix_var_decl& decl); // NOLINT(runtime/explicit)
845  var_decl(const simplex_var_decl& decl); // NOLINT(runtime/explicit)
846  var_decl(const unit_vector_var_decl& decl); // NOLINT(runtime/explicit)
847  var_decl(const ordered_var_decl& decl); // NOLINT(runtime/explicit)
848  var_decl(const positive_ordered_var_decl& decl); // NOLINT
849  var_decl(const cholesky_factor_var_decl& decl); // NOLINT
850  var_decl(const cholesky_corr_var_decl& decl); // NOLINT(runtime/explicit)
851  var_decl(const cov_matrix_var_decl& decl); // NOLINT(runtime/explicit)
852  var_decl(const corr_matrix_var_decl& decl); // NOLINT(runtime/explicit)
853 
854  std::string name() const;
855  base_var_decl base_decl() const;
856  std::vector<expression> dims() const;
857  bool has_def() const;
858  expression def() const;
859  };
860 
861  struct statement {
862  typedef boost::variant<boost::recursive_wrapper<nil>,
863  boost::recursive_wrapper<assignment>,
864  boost::recursive_wrapper<assgn>,
865  boost::recursive_wrapper<sample>,
866  boost::recursive_wrapper<increment_log_prob_statement>,
867  boost::recursive_wrapper<expression>,
868  boost::recursive_wrapper<statements>,
869  boost::recursive_wrapper<for_statement>,
870  boost::recursive_wrapper<conditional_statement>,
871  boost::recursive_wrapper<while_statement>,
872  boost::recursive_wrapper<break_continue_statement>,
873  boost::recursive_wrapper<print_statement>,
874  boost::recursive_wrapper<reject_statement>,
875  boost::recursive_wrapper<return_statement>,
876  boost::recursive_wrapper<no_op_statement> >
879  size_t begin_line_;
880  size_t end_line_;
881 
882  statement();
883  statement(const statement_t& st); // NOLINT(runtime/explicit)
884  statement(const nil& st); // NOLINT(runtime/explicit)
885  statement(const assignment& st); // NOLINT(runtime/explicit)
886  statement(const assgn& st); // NOLINT(runtime/explicit)
887  statement(const sample& st); // NOLINT(runtime/explicit)
888  statement(const increment_log_prob_statement& st); // NOLINT
889  statement(const expression& st); // NOLINT(runtime/explicit)
890  statement(const statements& st); // NOLINT(runtime/explicit)
891  statement(const for_statement& st); // NOLINT(runtime/explicit)
892  statement(const conditional_statement& st); // NOLINT(runtime/explicit)
893  statement(const while_statement& st); // NOLINT(runtime/explicit)
894  statement(const break_continue_statement& st); // NOLINT
895  statement(const print_statement& st); // NOLINT(runtime/explicit)
896  statement(const reject_statement& st); // NOLINT(runtime/explicit)
897  statement(const no_op_statement& st); // NOLINT(runtime/explicit)
898  statement(const return_statement& st); // NOLINT(runtime/explicit)
899 
900  bool is_no_op_statement() const;
901  };
902 
903  struct is_no_op_statement_vis : public boost::static_visitor<bool> {
904  bool operator()(const nil& st) const; // NOLINT(runtime/explicit)
905  bool operator()(const assignment& st) const; // NOLINT(runtime/explicit)
906  bool operator()(const assgn& st) const; // NOLINT(runtime/explicit)
907  bool operator()(const sample& st) const; // NOLINT(runtime/explicit)
908  bool operator()(const increment_log_prob_statement& t) const; // NOLINT
909  bool operator()(const expression& st) const; // NOLINT(runtime/explicit)
910  bool operator()(const statements& st) const; // NOLINT(runtime/explicit)
911  bool operator()(const for_statement& st) const; // NOLINT
912  bool operator()(const conditional_statement& st) const; // NOLINT
913  bool operator()(const while_statement& st) const; // NOLINT
914  bool operator()(const break_continue_statement& st) const; // NOLINT
915  bool operator()(const print_statement& st) const; // NOLINT
916  bool operator()(const reject_statement& st) const; // NOLINT
917  bool operator()(const no_op_statement& st) const; // NOLINT
918  bool operator()(const return_statement& st) const; // NOLINT
919  };
920 
921 
922  struct returns_type_vis : public boost::static_visitor<bool> {
924  std::ostream& error_msgs_;
925  returns_type_vis(const expr_type& return_type,
926  std::ostream& error_msgs);
927  bool operator()(const nil& st) const; // NOLINT(runtime/explicit)
928  bool operator()(const assignment& st) const; // NOLINT(runtime/explicit)
929  bool operator()(const assgn& st) const; // NOLINT(runtime/explicit)
930  bool operator()(const sample& st) const; // NOLINT(runtime/explicit)
931  bool operator()(const increment_log_prob_statement& t) const; // NOLINT
932  bool operator()(const expression& st) const; // NOLINT(runtime/explicit)
933  bool operator()(const statements& st) const; // NOLINT(runtime/explicit)
934  bool operator()(const for_statement& st) const; // NOLINT
935  bool operator()(const conditional_statement& st) const; // NOLINT
936  bool operator()(const while_statement& st) const; // NOLINT
937  bool operator()(const break_continue_statement& st) const; // NOLINT
938  bool operator()(const print_statement& st) const; // NOLINT
939  bool operator()(const reject_statement& st) const; // NOLINT
940  bool operator()(const no_op_statement& st) const; // NOLINT
941  bool operator()(const return_statement& st) const; // NOLINT
942  };
943 
944  bool returns_type(const expr_type& return_type,
945  const statement& statement,
946  std::ostream& error_msgs);
947 
951  increment_log_prob_statement(const expression& log_prob); // NOLINT
952  };
953 
954  struct for_statement {
955  std::string variable_;
958  for_statement();
959  for_statement(std::string& variable,
960  range& range,
961  statement& stmt);
962  };
963 
964  // bodies may be 1 longer than conditions due to else
966  std::vector<expression> conditions_;
967  std::vector<statement> bodies_;
969  conditional_statement(const std::vector<expression>& conditions,
970  const std::vector<statement>& statements);
971  };
972 
976  while_statement();
977  while_statement(const expression& condition,
978  const statement& body);
979  };
980 
982  std::string generate_;
984  explicit break_continue_statement(const std::string& generate);
985  };
986 
988  std::vector<printable> printables_;
989  print_statement();
990  print_statement(const std::vector<printable>& printables); // NOLINT
991  };
992 
994  std::vector<printable> printables_;
996  reject_statement(const std::vector<printable>& printables); // NOLINT
997  };
998 
1001  return_statement();
1002  return_statement(const expression& expr); // NOLINT(runtime/explicit)
1003  };
1004 
1006  // no op, no data
1007  };
1008 
1009  struct arg_decl {
1011  std::string name_;
1012  arg_decl();
1013  arg_decl(const expr_type& arg_type,
1014  const std::string& name);
1015  base_var_decl base_variable_declaration();
1016  };
1017 
1020  function_decl_def(const expr_type& return_type,
1021  const std::string& name,
1022  const std::vector<arg_decl>& arg_decls,
1023  const statement& body);
1025  std::string name_;
1026  std::vector<arg_decl> arg_decls_;
1028  };
1029 
1032 
1034  const std::vector<function_decl_def>& decl_defs); // NOLINT
1035 
1036  std::vector<function_decl_def> decl_defs_;
1037  };
1038 
1039 
1040  struct program {
1041  std::vector<function_decl_def> function_decl_defs_;
1042  std::vector<var_decl> data_decl_;
1043  std::pair<std::vector<var_decl>, std::vector<statement> >
1045  std::vector<var_decl> parameter_decl_;
1046  std::pair<std::vector<var_decl>, std::vector<statement> >
1049  std::pair<std::vector<var_decl>, std::vector<statement> >
1051 
1052  program();
1053  program(const std::vector<function_decl_def>& function_decl_defs,
1054  const std::vector<var_decl>& data_decl,
1055  const std::pair<std::vector<var_decl>,
1056  std::vector<statement> >& derived_data_decl,
1057  const std::vector<var_decl>& parameter_decl,
1058  const std::pair<std::vector<var_decl>,
1059  std::vector<statement> >& derived_decl,
1060  const statement& st,
1061  const std::pair<std::vector<var_decl>,
1062  std::vector<statement> >& generated_decl);
1063  };
1064 
1065  struct sample {
1070  sample();
1071  sample(expression& e,
1072  distribution& dist);
1073  bool is_ill_formed() const;
1074  bool is_discrete() const;
1075  };
1076 
1077  struct assignment {
1078  variable_dims var_dims_; // lhs_var[dim0,...,dimN-1]
1079  expression expr_; // = rhs
1080  base_var_decl var_type_; // type of lhs_var
1081  assignment();
1082  assignment(variable_dims& var_dims,
1083  expression& expr);
1084  };
1085 
1086 
1087  struct var_occurs_vis : public boost::static_visitor<bool> {
1088  const std::string var_name_;
1089  explicit var_occurs_vis(const variable& e);
1090  bool operator()(const nil& e) const;
1091  bool operator()(const int_literal& e) const;
1092  bool operator()(const double_literal& e) const;
1093  bool operator()(const array_literal& e) const;
1094  bool operator()(const variable& e) const;
1095  bool operator()(const fun& e) const;
1096  bool operator()(const integrate_ode& e) const;
1097  bool operator()(const integrate_ode_control& e) const;
1098  bool operator()(const index_op& e) const;
1099  bool operator()(const index_op_sliced& e) const;
1100  bool operator()(const conditional_op& e) const;
1101  bool operator()(const binary_op& e) const;
1102  bool operator()(const unary_op& e) const;
1103  };
1104 
1105  struct assgn {
1107  std::vector<idx> idxs_;
1109  assgn();
1110  assgn(const variable& lhs_var, const std::vector<idx>& idxs,
1111  const expression& rhs);
1112  bool lhs_var_occurs_on_rhs() const;
1113  };
1114 
1125  const std::vector<idx>& idxs);
1126 
1127  // FIXME: is this next dependency necessary?
1128  // from generator.hpp
1129  void generate_expression(const expression& e, std::ostream& o);
1130  void generate_expression(const expression& e, bool user_facing,
1131  std::ostream& o);
1132 
1133  bool has_rng_suffix(const std::string& s);
1134  bool has_lp_suffix(const std::string& s);
1135  bool is_user_defined(const std::string& name,
1136  const std::vector<expression>& args);
1137  bool is_user_defined_prob_function(const std::string& name,
1138  const expression& variate,
1139  const std::vector<expression>& params);
1140  bool is_user_defined(const fun& fx);
1141 
1142  struct contains_var : public boost::static_visitor<bool> {
1144  explicit contains_var(const variable_map& var_map);
1145  bool operator()(const nil& e) const;
1146  bool operator()(const int_literal& e) const;
1147  bool operator()(const double_literal& e) const;
1148  bool operator()(const array_literal& e) const;
1149  bool operator()(const variable& e) const;
1150  bool operator()(const integrate_ode& e) const;
1151  bool operator()(const integrate_ode_control& e) const;
1152  bool operator()(const fun& e) const;
1153  bool operator()(const index_op& e) const;
1154  bool operator()(const index_op_sliced& e) const;
1155  bool operator()(const conditional_op& e) const;
1156  bool operator()(const binary_op& e) const;
1157  bool operator()(const unary_op& e) const;
1158  };
1159 
1175  bool has_var(const expression& e,
1176  const variable_map& var_map);
1177 
1178 
1179  struct contains_nonparam_var : public boost::static_visitor<bool> {
1181  explicit contains_nonparam_var(const variable_map& var_map);
1182  bool operator()(const nil& e) const;
1183  bool operator()(const int_literal& e) const;
1184  bool operator()(const double_literal& e) const;
1185  bool operator()(const array_literal& e) const;
1186  bool operator()(const variable& e) const;
1187  bool operator()(const integrate_ode& e) const;
1188  bool operator()(const integrate_ode_control& e) const;
1189  bool operator()(const fun& e) const;
1190  bool operator()(const index_op& e) const;
1191  bool operator()(const index_op_sliced& e) const;
1192  bool operator()(const conditional_op& e) const;
1193  bool operator()(const binary_op& e) const;
1194  bool operator()(const unary_op& e) const;
1195  };
1196 
1212  bool has_non_param_var(const expression& e,
1213  const variable_map& var_map);
1214 
1215  bool is_assignable(const expr_type& l_type,
1216  const expr_type& r_type,
1217  const std::string& failure_message,
1218  std::ostream& error_msgs);
1219 
1220 
1221  bool ends_with(const std::string& suffix,
1222  const std::string& s);
1223 
1224 
1225  std::string get_cdf(const std::string& dist_name);
1226 
1227  std::string get_ccdf(const std::string& dist_name);
1228 
1229  std::string get_prob_fun(const std::string& dist_name);
1230 
1231  bool has_prob_fun_suffix(const std::string& name);
1232  std::string strip_prob_fun_suffix(const std::string& dist_fun);
1233 
1234  bool has_cdf_suffix(const std::string& name);
1235  std::string strip_cdf_suffix(const std::string& dist_fun);
1236 
1237  bool has_ccdf_suffix(const std::string& name);
1238  std::string strip_ccdf_suffix(const std::string& dist_fun);
1239 
1240  bool fun_name_exists(const std::string& name);
1241 
1242 
1243  }
1244 }
1245 #endif
expression high_
Definition: ast.hpp:485
variable_dims var_dims_
Definition: ast.hpp:1078
std::string strip_ccdf_suffix(const std::string &dist_fun)
Definition: ast_def.cpp:2294
std::string family_
Definition: ast.hpp:227
expr_type type_
Definition: ast.hpp:443
expression_t expr_
Definition: ast.hpp:293
const int function_argument_origin
Definition: ast.hpp:85
expression lb_
Definition: ast.hpp:517
const variable_map & var_map_
Definition: ast.hpp:1143
const int ROW_VECTOR_T
Definition: ast.hpp:73
expr_type type_
Definition: ast.hpp:423
std::string integration_function_name_
Definition: ast.hpp:374
bool has_lp_suffix(const std::string &s)
Definition: ast_def.cpp:2163
std::string name_
Definition: ast.hpp:365
const int derived_origin
Definition: ast.hpp:83
std::vector< statement > statements_
Definition: ast.hpp:220
bool is_fun_origin(const var_origin &vo)
Definition: ast_def.cpp:1280
distribution dist_
Definition: ast.hpp:1067
std::vector< expression > dims_
Definition: ast.hpp:570
std::string original_name_
Definition: ast.hpp:421
std::string strip_cdf_suffix(const std::string &dist_fun)
Definition: ast_def.cpp:2281
expression ub_
Definition: ast.hpp:512
range truncation_
Definition: ast.hpp:1068
const int parameter_origin
Definition: ast.hpp:81
statement statement_
Definition: ast.hpp:1048
void sample(stan::mcmc::base_mcmc *sampler, int num_warmup, int num_samples, int num_thin, int refresh, bool save, stan::services::sample::mcmc_writer< Model, SampleRecorder, DiagnosticRecorder, MessageRecorder > &mcmc_writer, stan::mcmc::sample &init_s, Model &model, RNG &base_rng, const std::string &prefix, const std::string &suffix, std::ostream &o, StartTransitionCallback &callback, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)
Definition: sample.hpp:17
bool has_cdf_suffix(const std::string &name)
Definition: ast_def.cpp:2277
const int function_argument_origin_rng
Definition: ast.hpp:87
Probability, optimization and sampling library.
size_t total_dims(const std::vector< std::vector< expression > > &dimss)
Definition: ast_def.cpp:1126
std::string get_prob_fun(const std::string &dist_name)
Definition: ast_def.cpp:2250
std::vector< var_decl > data_decl_
Definition: ast.hpp:1042
bool is_multi_index(const idx &idx)
Definition: ast_def.cpp:1271
std::pair< base_var_decl, var_origin > range_t
Definition: ast.hpp:585
expression idxs_
Definition: ast.hpp:499
std::vector< var_decl > local_decl_
Definition: ast.hpp:219
std::vector< expression > args_
Definition: ast.hpp:422
expr_type type_
Definition: ast.hpp:478
bool has_prob_fun_suffix(const std::string &name)
Definition: ast_def.cpp:2261
std::string get_cdf(const std::string &dist_name)
Definition: ast_def.cpp:2232
std::vector< statement > bodies_
Definition: ast.hpp:967
const int DOUBLE_T
Definition: ast.hpp:71
bool is_assignable(const expr_type &l_type, const expr_type &r_type, const std::string &failure_message, std::ostream &error_msgs)
Definition: ast_def.cpp:2201
bool has_rng_suffix(const std::string &s)
Definition: ast_def.cpp:2154
boost::variant< boost::recursive_wrapper< uni_idx >, boost::recursive_wrapper< multi_idx >, boost::recursive_wrapper< omni_idx >, boost::recursive_wrapper< lb_idx >, boost::recursive_wrapper< ub_idx >, boost::recursive_wrapper< lub_idx > > idx_t
Definition: ast.hpp:531
std::vector< printable > printables_
Definition: ast.hpp:988
int base_expr_type
Definition: ast.hpp:65
const int transformed_parameter_origin
Definition: ast.hpp:82
expression expr_
Definition: ast.hpp:441
statement_t statement_
Definition: ast.hpp:878
std::string system_function_name_
Definition: ast.hpp:395
base_var_decl var_type_
Definition: ast.hpp:1080
expr_type type_
Definition: ast.hpp:366
expression ub_
Definition: ast.hpp:518
expression true_val_
Definition: ast.hpp:453
std::string name_
Definition: ast.hpp:420
std::string variable_
Definition: ast.hpp:955
std::string get_ccdf(const std::string &dist_name)
Definition: ast_def.cpp:2241
const int function_argument_origin_lp
Definition: ast.hpp:86
boost::variant< boost::recursive_wrapper< nil >, boost::recursive_wrapper< int_var_decl >, boost::recursive_wrapper< double_var_decl >, boost::recursive_wrapper< vector_var_decl >, boost::recursive_wrapper< row_vector_var_decl >, boost::recursive_wrapper< matrix_var_decl >, boost::recursive_wrapper< simplex_var_decl >, boost::recursive_wrapper< unit_vector_var_decl >, boost::recursive_wrapper< ordered_var_decl >, boost::recursive_wrapper< positive_ordered_var_decl >, boost::recursive_wrapper< cholesky_factor_var_decl >, boost::recursive_wrapper< cholesky_corr_var_decl >, boost::recursive_wrapper< cov_matrix_var_decl >, boost::recursive_wrapper< corr_matrix_var_decl > > var_decl_t
Definition: ast.hpp:832
expr_type type_
Definition: ast.hpp:468
std::vector< function_decl_def > function_decl_defs_
Definition: ast.hpp:1041
const variable_map & var_map_
Definition: ast.hpp:1180
void print_var_origin(std::ostream &o, const var_origin &vo)
Definition: ast_def.cpp:1289
bool is_nil(const expression &e)
Definition: ast_def.cpp:1008
var_decl_t decl_
Definition: ast.hpp:833
expression idx_
Definition: ast.hpp:494
expression left
Definition: ast.hpp:466
const int void_function_argument_origin_rng
Definition: ast.hpp:90
bool fun_name_exists(const std::string &name)
Definition: ast_def.cpp:2303
const int model_name_origin
Definition: ast.hpp:78
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
Definition: ast.hpp:1044
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
Definition: ast.hpp:1050
var_origin var_origin_
Definition: ast.hpp:457
bool ends_with(const std::string &suffix, const std::string &s)
Definition: ast_def.cpp:2225
bool returns_type(const expr_type &return_type, const statement &statement, std::ostream &error_msgs)
Definition: ast_def.cpp:695
boost::variant< boost::recursive_wrapper< nil >, boost::recursive_wrapper< assignment >, boost::recursive_wrapper< assgn >, boost::recursive_wrapper< sample >, boost::recursive_wrapper< increment_log_prob_statement >, boost::recursive_wrapper< expression >, boost::recursive_wrapper< statements >, boost::recursive_wrapper< for_statement >, boost::recursive_wrapper< conditional_statement >, boost::recursive_wrapper< while_statement >, boost::recursive_wrapper< break_continue_statement >, boost::recursive_wrapper< print_statement >, boost::recursive_wrapper< reject_statement >, boost::recursive_wrapper< return_statement >, boost::recursive_wrapper< no_op_statement > > statement_t
Definition: ast.hpp:877
bool is_user_defined_prob_function(const std::string &name, const expression &variate, const std::vector< expression > &params)
Definition: ast_def.cpp:2187
std::vector< idx > idxs_
Definition: ast.hpp:1107
std::vector< expression > args_
Definition: ast.hpp:228
const int VOID_T
Definition: ast.hpp:69
expr_type indexed_type(const expression &e, const std::vector< idx > &idxs)
Return the type of the expression indexed by the generalized index sequence.
Definition: ast_def.cpp:2082
std::string name_
Definition: ast.hpp:569
int var_origin
Definition: ast.hpp:77
expr_type promote_primitive(const expr_type &et)
Definition: ast_def.cpp:132
const int void_function_argument_origin
Definition: ast.hpp:88
void generate_expression(const expression &e, std::ostream &o)
Definition: generator.hpp:446
base_expr_type base_type_
Definition: ast.hpp:571
std::ostream & operator<<(std::ostream &o, const expr_type &et)
Definition: ast_def.cpp:121
std::pair< expr_type, std::vector< expr_type > > function_signature_t
Definition: ast.hpp:131
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
Definition: ast.hpp:1047
boost::variant< boost::recursive_wrapper< std::string >, boost::recursive_wrapper< expression > > printable_t
Definition: ast.hpp:300
bool has_non_param_var(const expression &e, const variable_map &var_map)
Returns true if the specified expression contains a variable that is defined as a transformed paramet...
Definition: ast_def.cpp:978
expression rhs_
Definition: ast.hpp:1108
const int data_origin
Definition: ast.hpp:79
size_t begin_line_
Definition: ast.hpp:879
const int void_function_argument_origin_lp
Definition: ast.hpp:89
expression lb_
Definition: ast.hpp:507
base_expr_type base_type_
Definition: ast.hpp:102
std::vector< idx > idxs_
Definition: ast.hpp:559
printable_t printable_
Definition: ast.hpp:308
bool is_data_origin(const var_origin &vo)
Definition: ast_def.cpp:1276
expr_type infer_type_indexing(const base_expr_type &expr_base_type, size_t num_expr_dims, size_t num_index_dims)
Definition: ast_def.cpp:1133
const int INT_T
Definition: ast.hpp:70
std::string integration_function_name_
Definition: ast.hpp:394
std::string name_
Definition: ast.hpp:1011
std::vector< expression > conditions_
Definition: ast.hpp:966
std::string system_function_name_
Definition: ast.hpp:375
std::vector< arg_decl > arg_decls_
Definition: ast.hpp:1026
statement statement_
Definition: ast.hpp:957
variable lhs_var_
Definition: ast.hpp:1106
bool has_var(const expression &e, const variable_map &var_map)
Returns true if the specified expression contains a variable that is defined as a parameter...
Definition: ast_def.cpp:888
expression expr_
Definition: ast.hpp:1066
const std::string var_name_
Definition: ast.hpp:1088
std::vector< expression > dims_
Definition: ast.hpp:331
bool has_ccdf_suffix(const std::string &name)
Definition: ast_def.cpp:2290
expression low_
Definition: ast.hpp:484
std::string name_
Definition: ast.hpp:330
std::vector< function_decl_def > decl_defs_
Definition: ast.hpp:1036
expression expr_
Definition: ast.hpp:1079
const int VECTOR_T
Definition: ast.hpp:72
bool is_defined(const std::string &function_name, const std::vector< expr_type > &arg_types)
expression right
Definition: ast.hpp:467
std::string strip_prob_fun_suffix(const std::string &dist_fun)
Definition: ast_def.cpp:2266
idx_t idx_
Definition: ast.hpp:542
expression subject
Definition: ast.hpp:477
std::vector< expression > args_
Definition: ast.hpp:357
const int local_origin
Definition: ast.hpp:84
boost::variant< boost::recursive_wrapper< nil >, boost::recursive_wrapper< int_literal >, boost::recursive_wrapper< double_literal >, boost::recursive_wrapper< array_literal >, boost::recursive_wrapper< variable >, boost::recursive_wrapper< integrate_ode >, boost::recursive_wrapper< integrate_ode_control >, boost::recursive_wrapper< fun >, boost::recursive_wrapper< index_op >, boost::recursive_wrapper< index_op_sliced >, boost::recursive_wrapper< conditional_op >, boost::recursive_wrapper< binary_op >, boost::recursive_wrapper< unary_op > > expression_t
Definition: ast.hpp:264
std::ostream & write_base_expr_type(std::ostream &o, base_expr_type type)
Definition: ast_def.cpp:25
bool is_user_defined(const std::string &name, const std::vector< expression > &args)
Definition: ast_def.cpp:2171
expr_type arg_type_
Definition: ast.hpp:1010
std::string op
Definition: ast.hpp:465
std::vector< std::vector< expression > > dimss_
Definition: ast.hpp:442
Placeholder struct for boost::variant default ctors.
Definition: ast.hpp:18
std::map< std::string, range_t > map_
Definition: ast.hpp:597
const int ILL_FORMED_T
Definition: ast.hpp:75
const int MATRIX_T
Definition: ast.hpp:74
expression false_val_
Definition: ast.hpp:454
const int transformed_data_origin
Definition: ast.hpp:80
std::vector< printable > printables_
Definition: ast.hpp:994
std::ostream & error_msgs_
Definition: ast.hpp:924
std::vector< var_decl > parameter_decl_
Definition: ast.hpp:1045

     [ Stan Home Page ] © 2011–2016, Stan Development Team.