Stan  2.10.0
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;
25  struct conditional_op;
26  struct conditional_statement;
27  struct distribution;
28  struct double_var_decl;
29  struct double_literal;
30  struct expression;
31  struct for_statement;
32  struct fun;
33  struct function_decl_def;
34  struct function_decl_defs;
35  struct identifier;
37  struct index_op;
38  struct index_op_sliced;
39  struct int_literal;
40  struct inv_var_decl;
41  struct matrix_var_decl;
42  struct no_op_statement;
43  struct ordered_var_decl;
45  struct print_statement;
46  struct program;
47  struct range;
48  struct reject_statement;
49  struct return_statement;
50  struct row_vector_var_decl;
51  struct sample;
52  struct simplex_var_decl;
53  struct integrate_ode;
54  struct integrate_ode_control;
55  struct unit_vector_var_decl;
56  struct statement;
57  struct statements;
58  struct unary_op;
59  struct variable;
60  struct variable_dims;
61  struct var_decl;
62  struct var_type;
63  struct vector_var_decl;
65 
66  // forward declarable enum hack (can't fwd-decl enum)
67  typedef int base_expr_type;
68  const int VOID_T = 0;
69  const int INT_T = 1;
70  const int DOUBLE_T = 2;
71  const int VECTOR_T = 3;
72  const int ROW_VECTOR_T = 4;
73  const int MATRIX_T = 5;
74  const int ILL_FORMED_T = 6;
75 
76  typedef int var_origin;
77  const int model_name_origin = 0;
78  const int data_origin = 1;
79  const int transformed_data_origin = 2;
80  const int parameter_origin = 3;
82  const int derived_origin = 5;
83  const int local_origin = 6;
84  const int function_argument_origin = 7;
90 
91  bool is_data_origin(const var_origin& vo);
92  void print_var_origin(std::ostream& o, const var_origin& vo);
93 
94 
95  std::ostream& write_base_expr_type(std::ostream& o, base_expr_type type);
96 
97  struct expr_type {
98  base_expr_type base_type_;
99  size_t num_dims_;
100  expr_type();
101  expr_type(const base_expr_type base_type); // NOLINT(runtime/explicit)
102  expr_type(const base_expr_type base_type,
103  size_t num_dims);
104  bool operator==(const expr_type& et) const;
105  bool operator!=(const expr_type& et) const;
106  bool operator<(const expr_type& et) const;
107  bool operator<=(const expr_type& et) const;
108  bool operator>(const expr_type& et) const;
109  bool operator>=(const expr_type& et) const;
110  bool is_primitive() const;
111  bool is_primitive_int() const;
112  bool is_primitive_double() const;
113  bool is_ill_formed() const;
114  bool is_void() const;
115  base_expr_type type() const;
116  size_t num_dims() const;
117  };
118 
119 
120  std::ostream& operator<<(std::ostream& o, const expr_type& et);
121 
123 
125  const expr_type& et2);
126 
127  typedef std::pair<expr_type, std::vector<expr_type> > function_signature_t;
128 
130  public:
131  static function_signatures& instance();
132  static void reset_sigs();
133  void set_user_defined(const std::pair<std::string, function_signature_t>&
134  name_sig);
135  bool is_user_defined(const std::pair<std::string, function_signature_t>&
136  name_sig);
137  void add(const std::string& name,
138  const expr_type& result_type,
139  const std::vector<expr_type>& arg_types);
140  void add(const std::string& name,
141  const expr_type& result_type);
142  void add(const std::string& name,
143  const expr_type& result_type,
144  const expr_type& arg_type);
145  void add(const std::string& name,
146  const expr_type& result_type,
147  const expr_type& arg_type1,
148  const expr_type& arg_type2);
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  const expr_type& arg_type3);
154  void add(const std::string& name,
155  const expr_type& result_type,
156  const expr_type& arg_type1,
157  const expr_type& arg_type2,
158  const expr_type& arg_type3,
159  const expr_type& arg_type4);
160  void add(const std::string& name,
161  const expr_type& result_type,
162  const expr_type& arg_type1,
163  const expr_type& arg_type2,
164  const expr_type& arg_type3,
165  const expr_type& arg_type4,
166  const expr_type& arg_type5);
167  void add(const std::string& name,
168  const expr_type& result_type,
169  const expr_type& arg_type1,
170  const expr_type& arg_type2,
171  const expr_type& arg_type3,
172  const expr_type& arg_type4,
173  const expr_type& arg_type5,
174  const expr_type& arg_type6);
175  void add(const std::string& name,
176  const expr_type& result_type,
177  const expr_type& arg_type1,
178  const expr_type& arg_type2,
179  const expr_type& arg_type3,
180  const expr_type& arg_type4,
181  const expr_type& arg_type5,
182  const expr_type& arg_type6,
183  const expr_type& arg_type7);
184  void add_nullary(const::std::string& name);
185  void add_unary(const::std::string& name);
186  void add_binary(const::std::string& name);
187  void add_ternary(const::std::string& name);
188  void add_quaternary(const::std::string& name);
189  int num_promotions(const std::vector<expr_type>& call_args,
190  const std::vector<expr_type>& sig_args);
191  expr_type get_result_type(const std::string& name,
192  const std::vector<expr_type>& args,
193  std::ostream& error_msgs,
194  bool sampling_error_style = false);
195  int get_signature_matches(const std::string& name,
196  const std::vector<expr_type>& args,
197  function_signature_t& signature);
198  bool is_defined(const std::string& name,
199  const function_signature_t& sig);
200  std::set<std::string> key_set() const;
201  bool has_key(const std::string& key) const;
202 
203  private:
206  std::map<std::string, std::vector<function_signature_t> > sigs_map_;
207  std::set<std::pair<std::string, function_signature_t> > user_defined_set_;
208  static function_signatures* sigs_; // init below outside of class
209  };
210 
211  struct statements {
212  std::vector<var_decl> local_decl_;
213  std::vector<statement> statements_;
214  statements();
215  statements(const std::vector<var_decl>& local_decl,
216  const std::vector<statement>& stmts);
217  };
218 
219  struct distribution {
220  std::string family_;
221  std::vector<expression> args_;
222  };
223 
224  struct expression_type_vis : public boost::static_visitor<expr_type> {
225  expr_type operator()(const nil& e) const;
226  expr_type operator()(const int_literal& e) const;
227  expr_type operator()(const double_literal& e) const;
228  expr_type operator()(const array_literal& e) const;
229  expr_type operator()(const variable& e) const;
230  expr_type operator()(const fun& e) const;
231  expr_type operator()(const integrate_ode& e) const;
233  expr_type operator()(const index_op& e) const;
234  expr_type operator()(const index_op_sliced& e) const;
235  expr_type operator()(const conditional_op& e) const;
236  expr_type operator()(const binary_op& e) const;
237  expr_type operator()(const unary_op& e) const;
238  };
239 
240 
241  struct expression;
242 
243  struct expression {
244  typedef boost::variant<boost::recursive_wrapper<nil>,
245  boost::recursive_wrapper<int_literal>,
246  boost::recursive_wrapper<double_literal>,
247  boost::recursive_wrapper<array_literal>,
248  boost::recursive_wrapper<variable>,
249  boost::recursive_wrapper<integrate_ode>,
250  boost::recursive_wrapper<integrate_ode_control>,
251  boost::recursive_wrapper<fun>,
252  boost::recursive_wrapper<index_op>,
253  boost::recursive_wrapper<index_op_sliced>,
254  boost::recursive_wrapper<conditional_op>,
255  boost::recursive_wrapper<binary_op>,
256  boost::recursive_wrapper<unary_op> >
258 
259  expression();
260  expression(const expression& e);
261 
262  // template <typename Expr> expression(const Expr& expr);
263  expression(const nil& expr); // NOLINT(runtime/explicit)
264  expression(const int_literal& expr); // NOLINT(runtime/explicit)
265  expression(const double_literal& expr); // NOLINT(runtime/explicit)
266  expression(const array_literal& expr); // NOLINT(runtime/explicit)
267  expression(const variable& expr); // NOLINT(runtime/explicit)
268  expression(const fun& expr); // NOLINT(runtime/explicit)
269  expression(const integrate_ode& expr); // NOLINT(runtime/explicit)
270  expression(const integrate_ode_control& expr); // NOLINT
271  expression(const index_op& expr); // NOLINT(runtime/explicit)
272  expression(const index_op_sliced& expr); // NOLINT(runtime/explicit)
273  expression(const conditional_op& expr); // NOLINT(runtime/explicit)
274  expression(const binary_op& expr); // NOLINT(runtime/explicit)
275  expression(const unary_op& expr); // NOLINT(runtime/explicit)
276  expression(const expression_t& expr_); // NOLINT(runtime/explicit)
277 
278  expr_type expression_type() const;
279  int total_dims() const;
280 
281  expression& operator+=(const expression& rhs);
282  expression& operator-=(const expression& rhs);
283  expression& operator*=(const expression& rhs);
284  expression& operator/=(const expression& rhs);
285 
287  };
288 
289 
290  struct printable {
291  typedef boost::variant<boost::recursive_wrapper<std::string>,
292  boost::recursive_wrapper<expression> >
294 
295  printable();
296  printable(const expression& expression); // NOLINT(runtime/explicit)
297  printable(const std::string& msg); // NOLINT(runtime/explicit)
298  printable(const printable_t& printable); // NOLINT(runtime/explicit)
299  printable(const printable& printable); // NOLINT(runtime/explicit)
300 
302  };
303 
304  struct is_nil_op : public boost::static_visitor<bool> {
305  bool operator()(const nil& x) const; // NOLINT(runtime/explicit)
306  bool operator()(const int_literal& x) const; // NOLINT(runtime/explicit)
307  bool operator()(const double_literal& x) const; // NOLINT
308  bool operator()(const array_literal& x) const; // NOLINT
309  bool operator()(const variable& x) const; // NOLINT(runtime/explicit)
310  bool operator()(const integrate_ode& x) const; // NOLINT
311  bool operator()(const integrate_ode_control& x) const; // NOLINT
312  bool operator()(const fun& x) const; // NOLINT(runtime/explicit)
313  bool operator()(const index_op& x) const; // NOLINT(runtime/explicit)
314  bool operator()(const index_op_sliced& x) const; // NOLINT
315  bool operator()(const conditional_op& x) const; // NOLINT
316  bool operator()(const binary_op& x) const; // NOLINT(runtime/explicit)
317  bool operator()(const unary_op& x) const; // NOLINT(runtime/explicit)
318  };
319 
320  bool is_nil(const expression& e);
321 
322  struct variable_dims {
323  std::string name_;
324  std::vector<expression> dims_;
325  variable_dims();
326  variable_dims(std::string const& name,
327  std::vector<expression> const& dims);
328  };
329 
330 
331  struct int_literal {
332  int val_;
334  int_literal();
335  int_literal(int val); // NOLINT(runtime/explicit)
336  int_literal(const int_literal& il); // NOLINT(runtime/explicit)
337  int_literal& operator=(const int_literal& il);
338  };
339 
340 
341  struct double_literal {
342  double val_;
344  double_literal();
345  double_literal(double val); // NOLINT(runtime/explicit)
347  };
348 
349  struct array_literal {
350  std::vector<expression> args_;
352  array_literal();
353  array_literal(const std::vector<expression>& args); // NOLINT
355  };
356 
357  struct variable {
358  std::string name_;
360  variable();
361  variable(std::string name); // NOLINT(runtime/explicit)
362  void set_type(const base_expr_type& base_type,
363  size_t num_dims);
364  };
365 
366  struct integrate_ode {
369  expression y0_; // initial state
370  expression t0_; // initial time
371  expression ts_; // solution times
372  expression theta_; // params
373  expression x_; // data
374  expression x_int_; // integer data
375  integrate_ode();
376  integrate_ode(const std::string& integration_function_name,
377  const std::string& system_function_name,
378  const expression& y0,
379  const expression& t0,
380  const expression& ts,
381  const expression& theta,
382  const expression& x,
383  const expression& x_int);
384  };
385 
389  expression y0_; // initial state
390  expression t0_; // initial time
391  expression ts_; // solution times
392  expression theta_; // params
393  expression x_; // data
394  expression x_int_; // integer data
395  expression rel_tol_; // relative tolerance
396  expression abs_tol_; // absolute tolerance
397  expression max_num_steps_; // max number of steps
399  integrate_ode_control(const std::string& integration_function_name,
400  const std::string& system_function_name,
401  const expression& y0,
402  const expression& t0,
403  const expression& ts,
404  const expression& theta,
405  const expression& x,
406  const expression& x_int,
407  const expression& rel_tol,
408  const expression& abs_tol,
409  const expression& max_num_steps);
410  };
411 
412  struct fun {
413  std::string name_;
414  std::string original_name_;
415  std::vector<expression> args_;
417  fun();
418  fun(std::string const& name,
419  std::vector<expression> const& args);
420  // void infer_type(); // FIXME: is this used anywhere?
421  };
422 
423  size_t total_dims(const std::vector<std::vector<expression> >& dimss);
424 
425  expr_type infer_type_indexing(const base_expr_type& expr_base_type,
426  size_t num_expr_dims,
427  size_t num_index_dims);
428 
430  size_t num_index_dims);
431 
432 
433  struct index_op {
435  std::vector<std::vector<expression> > dimss_;
437  index_op();
438  // vec of vec for e.g., e[1,2][3][4,5,6]
439  index_op(const expression& expr,
440  const std::vector<std::vector<expression> >& dimss);
441  void infer_type();
442  };
443 
444  struct conditional_op {
445  expression cond_; // conditional - must be int val
449  var_origin origin_;
450  conditional_op();
451  conditional_op(const expression& cond,
452  const expression& true_val,
453  const expression& false_val);
454  bool is_data() const;
455  };
456 
457  struct binary_op {
458  std::string op;
462  binary_op();
463  binary_op(const expression& left,
464  const std::string& op,
465  const expression& right);
466  };
467 
468  struct unary_op {
469  char op;
472  unary_op(char op,
473  expression const& subject);
474  };
475 
476  struct range {
479  range();
480  range(expression const& low,
481  expression const& high);
482  bool has_low() const;
483  bool has_high() const;
484  };
485 
486  struct uni_idx {
488  uni_idx();
489  uni_idx(const expression& idx); // NOLINT(runtime/explicit)
490  };
491  struct multi_idx {
493  multi_idx();
494  multi_idx(const expression& idxs); // NOLINT(runtime/explicit)
495  };
496  struct omni_idx {
497  omni_idx();
498  };
499  struct lb_idx {
501  lb_idx();
502  lb_idx(const expression& lb); // NOLINT(runtime/explicit)
503  };
504  struct ub_idx {
506  ub_idx();
507  ub_idx(const expression& ub); // NOLINT(runtime/explicit)
508  };
509  struct lub_idx {
512  lub_idx();
513  lub_idx(const expression& lb,
514  const expression& ub);
515  };
516 
517  struct idx {
518  typedef boost::variant<boost::recursive_wrapper<uni_idx>,
519  boost::recursive_wrapper<multi_idx>,
520  boost::recursive_wrapper<omni_idx>,
521  boost::recursive_wrapper<lb_idx>,
522  boost::recursive_wrapper<ub_idx>,
523  boost::recursive_wrapper<lub_idx> >
525 
526  idx();
527 
528  idx(const uni_idx& i); // NOLINT(runtime/explicit)
529  idx(const multi_idx& i); // NOLINT(runtime/explicit)
530  idx(const omni_idx& i); // NOLINT(runtime/explicit)
531  idx(const lb_idx& i); // NOLINT(runtime/explicit)
532  idx(const ub_idx& i); // NOLINT(runtime/explicit)
533  idx(const lub_idx& i); // NOLINT(runtime/explicit)
534 
536  };
537 
538  struct is_multi_index_vis : public boost::static_visitor<bool> {
540  bool operator()(const uni_idx& i) const;
541  bool operator()(const multi_idx& i) const;
542  bool operator()(const omni_idx& i) const;
543  bool operator()(const lb_idx& i) const;
544  bool operator()(const ub_idx& i) const;
545  bool operator()(const lub_idx& i) const;
546  };
547 
548  bool is_multi_index(const idx& idx);
549 
552  std::vector<idx> idxs_;
554  index_op_sliced();
555  // vec of vec for e.g., e[1,2][3][4,5,6]
556  index_op_sliced(const expression& expr,
557  const std::vector<idx>& idxs);
558  void infer_type();
559  };
560 
561 
562  struct base_var_decl {
563  std::string name_;
564  std::vector<expression> dims_;
565  base_expr_type base_type_;
566  base_var_decl();
567  base_var_decl(const base_expr_type& base_type); // NOLINT
568  base_var_decl(const std::string& name,
569  const std::vector<expression>& dims,
570  const base_expr_type& base_type);
571  };
572 
573  struct variable_map {
574  typedef std::pair<base_var_decl, var_origin> range_t;
575 
576  bool exists(const std::string& name) const;
577  base_var_decl get(const std::string& name) const;
578  base_expr_type get_base_type(const std::string& name) const;
579  size_t get_num_dims(const std::string& name) const;
580  var_origin get_origin(const std::string& name) const;
581  void add(const std::string& name,
582  const base_var_decl& base_decl,
583  const var_origin& vo);
584  void remove(const std::string& name);
585 
586  std::map<std::string, range_t> map_;
587  };
588 
589  struct int_var_decl : public base_var_decl {
591  int_var_decl();
592  int_var_decl(range const& range,
593  std::string const& name,
594  std::vector<expression> const& dims);
595  };
596 
597 
598  struct double_var_decl : public base_var_decl {
600  double_var_decl();
601  double_var_decl(range const& range,
602  std::string const& name,
603  std::vector<expression> const& dims);
604  };
605 
610  std::string const& name,
611  std::vector<expression> const& dims);
612  };
613 
614  struct simplex_var_decl : public base_var_decl {
617  simplex_var_decl(expression const& K,
618  std::string const& name,
619  std::vector<expression> const& dims);
620  };
621 
622  struct ordered_var_decl : public base_var_decl {
625  ordered_var_decl(expression const& K,
626  std::string const& name,
627  std::vector<expression> const& dims);
628  };
629 
634  std::string const& name,
635  std::vector<expression> const& dims);
636  };
637 
638  struct vector_var_decl : public base_var_decl {
641  vector_var_decl();
642  vector_var_decl(range const& range,
643  expression const& M,
644  std::string const& name,
645  std::vector<expression> const& dims);
646  };
647 
653  expression const& N,
654  std::string const& name,
655  std::vector<expression> const& dims);
656  };
657 
658  struct matrix_var_decl : public base_var_decl {
662  matrix_var_decl();
663  matrix_var_decl(range const& range,
664  expression const& M,
665  expression const& N,
666  std::string const& name,
667  std::vector<expression> const& dims);
668  };
669 
675  expression const& N,
676  std::string const& name,
677  std::vector<expression> const& dims);
678  };
679 
684  std::string const& name,
685  std::vector<expression> const& dims);
686  };
687 
692  std::string const& name,
693  std::vector<expression> const& dims);
694  };
695 
696 
701  std::string const& name,
702  std::vector<expression> const& dims);
703  };
704 
705  struct name_vis : public boost::static_visitor<std::string> {
706  name_vis();
707  std::string operator()(const nil& x) const;
708  std::string operator()(const int_var_decl& x) const;
709  std::string operator()(const double_var_decl& x) const;
710  std::string operator()(const vector_var_decl& x) const;
711  std::string operator()(const row_vector_var_decl& x) const;
712  std::string operator()(const matrix_var_decl& x) const;
713  std::string operator()(const simplex_var_decl& x) const;
714  std::string operator()(const unit_vector_var_decl& x) const;
715  std::string operator()(const ordered_var_decl& x) const;
716  std::string operator()(const positive_ordered_var_decl& x) const;
717  std::string operator()(const cholesky_factor_var_decl& x) const;
718  std::string operator()(const cholesky_corr_var_decl& x) const;
719  std::string operator()(const cov_matrix_var_decl& x) const;
720  std::string operator()(const corr_matrix_var_decl& x) const;
721  };
722 
724  : public boost::static_visitor<base_var_decl> {
726  base_var_decl operator()(const nil& x) const;
727  base_var_decl operator()(const int_var_decl& x) const;
728  base_var_decl operator()(const double_var_decl& x) const;
729  base_var_decl operator()(const vector_var_decl& x) const;
731  base_var_decl operator()(const matrix_var_decl& x) const;
732  base_var_decl operator()(const simplex_var_decl& x) const;
734  base_var_decl operator()(const ordered_var_decl& x) const;
740  };
741 
742  struct var_decl {
743  typedef boost::variant<boost::recursive_wrapper<nil>,
744  boost::recursive_wrapper<int_var_decl>,
745  boost::recursive_wrapper<double_var_decl>,
746  boost::recursive_wrapper<vector_var_decl>,
747  boost::recursive_wrapper<row_vector_var_decl>,
748  boost::recursive_wrapper<matrix_var_decl>,
749  boost::recursive_wrapper<simplex_var_decl>,
750  boost::recursive_wrapper<unit_vector_var_decl>,
751  boost::recursive_wrapper<ordered_var_decl>,
752  boost::recursive_wrapper<positive_ordered_var_decl>,
753  boost::recursive_wrapper<cholesky_factor_var_decl>,
754  boost::recursive_wrapper<cholesky_corr_var_decl>,
755  boost::recursive_wrapper<cov_matrix_var_decl>,
756  boost::recursive_wrapper<corr_matrix_var_decl> >
758 
760 
761  var_decl();
762 
763  // template <typename Decl>
764  // var_decl(Decl const& decl);
765  var_decl(const var_decl_t& decl); // NOLINT(runtime/explicit)
766  var_decl(const nil& decl); // NOLINT(runtime/explicit)
767  var_decl(const int_var_decl& decl); // NOLINT(runtime/explicit)
768  var_decl(const double_var_decl& decl); // NOLINT(runtime/explicit)
769  var_decl(const vector_var_decl& decl); // NOLINT(runtime/explicit)
770  var_decl(const row_vector_var_decl& decl); // NOLINT(runtime/explicit)
771  var_decl(const matrix_var_decl& decl); // NOLINT(runtime/explicit)
772  var_decl(const simplex_var_decl& decl); // NOLINT(runtime/explicit)
773  var_decl(const unit_vector_var_decl& decl); // NOLINT(runtime/explicit)
774  var_decl(const ordered_var_decl& decl); // NOLINT(runtime/explicit)
775  var_decl(const positive_ordered_var_decl& decl); // NOLINT
776  var_decl(const cholesky_factor_var_decl& decl); // NOLINT
777  var_decl(const cholesky_corr_var_decl& decl); // NOLINT(runtime/explicit)
778  var_decl(const cov_matrix_var_decl& decl); // NOLINT(runtime/explicit)
779  var_decl(const corr_matrix_var_decl& decl); // NOLINT(runtime/explicit)
780 
781  std::string name() const;
782  base_var_decl base_decl() const;
783  };
784 
785  struct statement {
786  typedef boost::variant<boost::recursive_wrapper<nil>,
787  boost::recursive_wrapper<assignment>,
788  boost::recursive_wrapper<assgn>,
789  boost::recursive_wrapper<sample>,
790  boost::recursive_wrapper<increment_log_prob_statement>,
791  boost::recursive_wrapper<expression>,
792  boost::recursive_wrapper<statements>,
793  boost::recursive_wrapper<for_statement>,
794  boost::recursive_wrapper<conditional_statement>,
795  boost::recursive_wrapper<while_statement>,
796  boost::recursive_wrapper<print_statement>,
797  boost::recursive_wrapper<reject_statement>,
798  boost::recursive_wrapper<return_statement>,
799  boost::recursive_wrapper<no_op_statement> >
801 
803  size_t begin_line_;
804  size_t end_line_;
805 
806  statement();
807  statement(const statement_t& st); // NOLINT(runtime/explicit)
808  statement(const nil& st); // NOLINT(runtime/explicit)
809  statement(const assignment& st); // NOLINT(runtime/explicit)
810  statement(const assgn& st); // NOLINT(runtime/explicit)
811  statement(const sample& st); // NOLINT(runtime/explicit)
812  statement(const increment_log_prob_statement& st); // NOLINT
813  statement(const expression& st); // NOLINT(runtime/explicit)
814  statement(const statements& st); // NOLINT(runtime/explicit)
815  statement(const for_statement& st); // NOLINT(runtime/explicit)
816  statement(const conditional_statement& st); // NOLINT(runtime/explicit)
817  statement(const while_statement& st); // NOLINT(runtime/explicit)
818  statement(const print_statement& st); // NOLINT(runtime/explicit)
819  statement(const reject_statement& st); // NOLINT(runtime/explicit)
820  statement(const no_op_statement& st); // NOLINT(runtime/explicit)
821  statement(const return_statement& st); // NOLINT(runtime/explicit)
822 
823  bool is_no_op_statement() const;
824  };
825 
826  struct is_no_op_statement_vis : public boost::static_visitor<bool> {
827  bool operator()(const nil& st) const; // NOLINT(runtime/explicit)
828  bool operator()(const assignment& st) const; // NOLINT(runtime/explicit)
829  bool operator()(const assgn& st) const; // NOLINT(runtime/explicit)
830  bool operator()(const sample& st) const; // NOLINT(runtime/explicit)
831  bool operator()(const increment_log_prob_statement& t) const; // NOLINT
832  bool operator()(const expression& st) const; // NOLINT(runtime/explicit)
833  bool operator()(const statements& st) const; // NOLINT(runtime/explicit)
834  bool operator()(const for_statement& st) const; // NOLINT
835  bool operator()(const conditional_statement& st) const; // NOLINT
836  bool operator()(const while_statement& st) const; // NOLINT
837  bool operator()(const print_statement& st) const; // NOLINT
838  bool operator()(const reject_statement& st) const; // NOLINT
839  bool operator()(const no_op_statement& st) const; // NOLINT
840  bool operator()(const return_statement& st) const; // NOLINT
841  };
842 
843 
844  struct returns_type_vis : public boost::static_visitor<bool> {
846  std::ostream& error_msgs_;
847  returns_type_vis(const expr_type& return_type,
848  std::ostream& error_msgs);
849  bool operator()(const nil& st) const; // NOLINT(runtime/explicit)
850  bool operator()(const assignment& st) const; // NOLINT(runtime/explicit)
851  bool operator()(const assgn& st) const; // NOLINT(runtime/explicit)
852  bool operator()(const sample& st) const; // NOLINT(runtime/explicit)
853  bool operator()(const increment_log_prob_statement& t) const; // NOLINT
854  bool operator()(const expression& st) const; // NOLINT(runtime/explicit)
855  bool operator()(const statements& st) const; // NOLINT(runtime/explicit)
856  bool operator()(const for_statement& st) const; // NOLINT
857  bool operator()(const conditional_statement& st) const; // NOLINT
858  bool operator()(const while_statement& st) const; // NOLINT
859  bool operator()(const print_statement& st) const; // NOLINT
860  bool operator()(const reject_statement& st) const; // NOLINT
861  bool operator()(const no_op_statement& st) const; // NOLINT
862  bool operator()(const return_statement& st) const; // NOLINT
863  };
864 
865  bool returns_type(const expr_type& return_type,
866  const statement& statement,
867  std::ostream& error_msgs);
868 
872  increment_log_prob_statement(const expression& log_prob); // NOLINT
873  };
874 
875  struct for_statement {
876  std::string variable_;
879  for_statement();
880  for_statement(std::string& variable,
881  range& range,
882  statement& stmt);
883  };
884 
885  // bodies may be 1 longer than conditions due to else
887  std::vector<expression> conditions_;
888  std::vector<statement> bodies_;
890  conditional_statement(const std::vector<expression>& conditions,
891  const std::vector<statement>& statements);
892  };
893 
897  while_statement();
898  while_statement(const expression& condition,
899  const statement& body);
900  };
901 
903  std::vector<printable> printables_;
904  print_statement();
905  print_statement(const std::vector<printable>& printables); // NOLINT
906  };
907 
909  std::vector<printable> printables_;
911  reject_statement(const std::vector<printable>& printables); // NOLINT
912  };
913 
917  return_statement(const expression& expr); // NOLINT(runtime/explicit)
918  };
919 
921  // no op, no data
922  };
923 
924  struct arg_decl {
926  std::string name_;
927  arg_decl();
928  arg_decl(const expr_type& arg_type,
929  const std::string& name);
931  };
932 
935  function_decl_def(const expr_type& return_type,
936  const std::string& name,
937  const std::vector<arg_decl>& arg_decls,
938  const statement& body);
940  std::string name_;
941  std::vector<arg_decl> arg_decls_;
943  };
944 
947 
949  const std::vector<function_decl_def>& decl_defs); // NOLINT
950 
951  std::vector<function_decl_def> decl_defs_;
952  };
953 
954 
955  struct program {
956  std::vector<function_decl_def> function_decl_defs_;
957  std::vector<var_decl> data_decl_;
958  std::pair<std::vector<var_decl>, std::vector<statement> >
960  std::vector<var_decl> parameter_decl_;
961  std::pair<std::vector<var_decl>, std::vector<statement> >
964  std::pair<std::vector<var_decl>, std::vector<statement> >
966 
967  program();
968  program(const std::vector<function_decl_def>& function_decl_defs,
969  const std::vector<var_decl>& data_decl,
970  const std::pair<std::vector<var_decl>,
971  std::vector<statement> >& derived_data_decl,
972  const std::vector<var_decl>& parameter_decl,
973  const std::pair<std::vector<var_decl>,
974  std::vector<statement> >& derived_decl,
975  const statement& st,
976  const std::pair<std::vector<var_decl>,
977  std::vector<statement> >& generated_decl);
978  };
979 
980  struct sample {
984  sample();
985  sample(expression& e,
986  distribution& dist);
987  bool is_ill_formed() const;
988  };
989 
990  struct assignment {
991  variable_dims var_dims_; // lhs_var[dim0,...,dimN-1]
992  expression expr_; // = rhs
993  base_var_decl var_type_; // type of lhs_var
994  assignment();
995  assignment(variable_dims& var_dims,
996  expression& expr);
997  };
998 
999 
1000  struct var_occurs_vis : public boost::static_visitor<bool> {
1001  const std::string var_name_;
1002  explicit var_occurs_vis(const variable& e);
1003  bool operator()(const nil& e) const;
1004  bool operator()(const int_literal& e) const;
1005  bool operator()(const double_literal& e) const;
1006  bool operator()(const array_literal& e) const;
1007  bool operator()(const variable& e) const;
1008  bool operator()(const fun& e) const;
1009  bool operator()(const integrate_ode& e) const;
1010  bool operator()(const integrate_ode_control& e) const;
1011  bool operator()(const index_op& e) const;
1012  bool operator()(const index_op_sliced& e) const;
1013  bool operator()(const conditional_op& e) const;
1014  bool operator()(const binary_op& e) const;
1015  bool operator()(const unary_op& e) const;
1016  };
1017 
1018  struct assgn {
1020  std::vector<idx> idxs_;
1022  assgn();
1023  assgn(const variable& lhs_var, const std::vector<idx>& idxs,
1024  const expression& rhs);
1025  bool lhs_var_occurs_on_rhs() const;
1026  };
1027 
1038  const std::vector<idx>& idxs);
1039 
1040  // FIXME: is this next dependency necessary?
1041  // from generator.hpp
1042  void generate_expression(const expression& e, std::ostream& o);
1043  void generate_expression(const expression& e, bool user_facing,
1044  std::ostream& o);
1045 
1046  bool has_rng_suffix(const std::string& s);
1047  bool has_lp_suffix(const std::string& s);
1048  bool is_user_defined(const std::string& name,
1049  const std::vector<expression>& args);
1050  bool is_user_defined_prob_function(const std::string& name,
1051  const expression& variate,
1052  const std::vector<expression>& params);
1053  bool is_user_defined(const fun& fx);
1054 
1055  struct contains_var : public boost::static_visitor<bool> {
1057  explicit contains_var(const variable_map& var_map);
1058  bool operator()(const nil& e) const;
1059  bool operator()(const int_literal& e) const;
1060  bool operator()(const double_literal& e) const;
1061  bool operator()(const array_literal& e) const;
1062  bool operator()(const variable& e) const;
1063  bool operator()(const integrate_ode& e) const;
1064  bool operator()(const integrate_ode_control& e) const;
1065  bool operator()(const fun& e) const;
1066  bool operator()(const index_op& e) const;
1067  bool operator()(const index_op_sliced& e) const;
1068  bool operator()(const conditional_op& e) const;
1069  bool operator()(const binary_op& e) const;
1070  bool operator()(const unary_op& e) const;
1071  };
1072 
1073  bool has_var(const expression& e,
1074  const variable_map& var_map);
1075 
1076 
1077  struct contains_nonparam_var : public boost::static_visitor<bool> {
1079  explicit contains_nonparam_var(const variable_map& var_map);
1080  bool operator()(const nil& e) const;
1081  bool operator()(const int_literal& e) const;
1082  bool operator()(const double_literal& e) const;
1083  bool operator()(const array_literal& e) const;
1084  bool operator()(const variable& e) const;
1085  bool operator()(const integrate_ode& e) const;
1086  bool operator()(const integrate_ode_control& e) const;
1087  bool operator()(const fun& e) const;
1088  bool operator()(const index_op& e) const;
1089  bool operator()(const index_op_sliced& e) const;
1090  bool operator()(const conditional_op& e) const;
1091  bool operator()(const binary_op& e) const;
1092  bool operator()(const unary_op& e) const;
1093  };
1094 
1095  bool has_non_param_var(const expression& e,
1096  const variable_map& var_map);
1097 
1098  bool is_assignable(const expr_type& l_type,
1099  const expr_type& r_type,
1100  const std::string& failure_message,
1101  std::ostream& error_msgs);
1102 
1103 
1104  bool ends_with(const std::string& suffix,
1105  const std::string& s);
1106 
1107 
1108  std::string get_cdf(const std::string& dist_name);
1109 
1110  std::string get_ccdf(const std::string& dist_name);
1111 
1112  std::string get_prob_fun(const std::string& dist_name);
1113 
1114  bool has_prob_fun_suffix(const std::string& name);
1115  std::string strip_prob_fun_suffix(const std::string& dist_fun);
1116 
1117  bool has_cdf_suffix(const std::string& name);
1118  std::string strip_cdf_suffix(const std::string& dist_fun);
1119 
1120  bool has_ccdf_suffix(const std::string& name);
1121  std::string strip_ccdf_suffix(const std::string& dist_fun);
1122 
1123  bool fun_name_exists(const std::string& name);
1124 
1125  }
1126 }
1127 #endif
expr_type get_result_type(const std::string &name, const std::vector< expr_type > &args, std::ostream &error_msgs, bool sampling_error_style=false)
Definition: ast_def.cpp:422
expression high_
Definition: ast.hpp:478
var_occurs_vis(const variable &e)
Definition: ast_def.cpp:1737
variable_dims var_dims_
Definition: ast.hpp:991
std::string strip_ccdf_suffix(const std::string &dist_fun)
Definition: ast_def.cpp:2020
base_var_decl base_decl() const
Definition: ast_def.cpp:1567
bool lhs_var_occurs_on_rhs() const
Definition: ast_def.cpp:1793
std::string family_
Definition: ast.hpp:220
void add(const std::string &name, const expr_type &result_type, const std::vector< expr_type > &arg_types)
Definition: ast_def.cpp:180
expr_type type_
Definition: ast.hpp:436
expression_t expr_
Definition: ast.hpp:286
const int function_argument_origin
Definition: ast.hpp:84
expression lb_
Definition: ast.hpp:510
const variable_map & var_map_
Definition: ast.hpp:1056
const int ROW_VECTOR_T
Definition: ast.hpp:72
expr_type type_
Definition: ast.hpp:416
std::string integration_function_name_
Definition: ast.hpp:367
bool has_lp_suffix(const std::string &s)
Definition: ast_def.cpp:1889
std::string name_
Definition: ast.hpp:358
const int derived_origin
Definition: ast.hpp:82
std::vector< statement > statements_
Definition: ast.hpp:213
contains_var(const variable_map &var_map)
Definition: ast_def.cpp:746
size_t num_dims_
Definition: ast.hpp:99
distribution dist_
Definition: ast.hpp:982
std::vector< expression > dims_
Definition: ast.hpp:564
std::string original_name_
Definition: ast.hpp:414
expression & operator-=(const expression &rhs)
Definition: ast_def.cpp:1865
std::string strip_cdf_suffix(const std::string &dist_fun)
Definition: ast_def.cpp:2007
expression ub_
Definition: ast.hpp:505
range truncation_
Definition: ast.hpp:983
const int parameter_origin
Definition: ast.hpp:80
statement statement_
Definition: ast.hpp:963
bool has_cdf_suffix(const std::string &name)
Definition: ast_def.cpp:2003
const int function_argument_origin_rng
Definition: ast.hpp:86
Probability, optimization and sampling library.
size_t total_dims(const std::vector< std::vector< expression > > &dimss)
Definition: ast_def.cpp:1073
size_t num_dims() const
Definition: ast_def.cpp:116
bool operator()(const nil &e) const
Definition: ast_def.cpp:1741
bool operator<=(const expr_type &et) const
Definition: ast_def.cpp:80
std::string get_prob_fun(const std::string &dist_name)
Definition: ast_def.cpp:1976
static function_signatures & instance()
Definition: ast_def.cpp:150
std::vector< var_decl > data_decl_
Definition: ast.hpp:957
bool is_multi_index(const idx &idx)
Definition: ast_def.cpp:1218
std::pair< base_var_decl, var_origin > range_t
Definition: ast.hpp:574
expression idxs_
Definition: ast.hpp:492
std::vector< var_decl > local_decl_
Definition: ast.hpp:212
std::vector< expression > args_
Definition: ast.hpp:415
expr_type type_
Definition: ast.hpp:471
void add(const std::string &name, const base_var_decl &base_decl, const var_origin &vo)
Definition: ast_def.cpp:1287
bool has_prob_fun_suffix(const std::string &name)
Definition: ast_def.cpp:1987
std::string get_cdf(const std::string &dist_name)
Definition: ast_def.cpp:1958
bool exists(const std::string &name) const
Definition: ast_def.cpp:1268
bool operator!=(const expr_type &et) const
Definition: ast_def.cpp:72
std::vector< statement > bodies_
Definition: ast.hpp:888
bool is_ill_formed() const
Definition: ast_def.cpp:1720
const int DOUBLE_T
Definition: ast.hpp:70
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:1927
bool has_rng_suffix(const std::string &s)
Definition: ast_def.cpp:1880
int num_promotions(const std::vector< expr_type > &call_args, const std::vector< expr_type > &sig_args)
Definition: ast_def.cpp:296
bool is_primitive_int() const
Definition: ast_def.cpp:99
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:524
std::vector< printable > printables_
Definition: ast.hpp:903
base_var_decl operator()(const nil &x) const
Definition: ast_def.cpp:1485
int base_expr_type
Definition: ast.hpp:64
int get_signature_matches(const std::string &name, const std::vector< expr_type > &args, function_signature_t &signature)
Definition: ast_def.cpp:315
const int transformed_parameter_origin
Definition: ast.hpp:81
expression expr_
Definition: ast.hpp:434
statement_t statement_
Definition: ast.hpp:802
std::string system_function_name_
Definition: ast.hpp:388
bool is_no_op_statement() const
Definition: ast_def.cpp:1637
void add_binary(const ::std::string &name)
Definition: ast_def.cpp:287
base_var_decl var_type_
Definition: ast.hpp:993
void set_type(const base_expr_type &base_type, size_t num_dims)
Definition: ast_def.cpp:1016
var_origin get_origin(const std::string &name) const
Definition: ast_def.cpp:1282
expr_type type_
Definition: ast.hpp:359
contains_nonparam_var(const variable_map &var_map)
Definition: ast_def.cpp:841
expression ub_
Definition: ast.hpp:511
expression true_val_
Definition: ast.hpp:446
std::string name_
Definition: ast.hpp:413
std::string variable_
Definition: ast.hpp:876
std::string get_ccdf(const std::string &dist_name)
Definition: ast_def.cpp:1967
bool is_void() const
Definition: ast_def.cpp:110
const int function_argument_origin_lp
Definition: ast.hpp:85
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:757
expr_type type_
Definition: ast.hpp:461
int total_dims() const
Definition: ast_def.cpp:727
std::vector< function_decl_def > function_decl_defs_
Definition: ast.hpp:956
expr_type expression_type() const
Definition: ast_def.cpp:707
const variable_map & var_map_
Definition: ast.hpp:1078
void print_var_origin(std::ostream &o, const var_origin &vo)
Definition: ast_def.cpp:1227
void add_unary(const ::std::string &name)
Definition: ast_def.cpp:284
expression & operator*=(const expression &rhs)
Definition: ast_def.cpp:1870
bool is_nil(const expression &e)
Definition: ast_def.cpp:955
var_decl_t decl_
Definition: ast.hpp:759
array_literal & operator=(const array_literal &al)
Definition: ast_def.cpp:1008
expression idx_
Definition: ast.hpp:487
expression left
Definition: ast.hpp:459
bool operator()(const nil &e) const
Definition: ast_def.cpp:844
const int void_function_argument_origin_rng
Definition: ast.hpp:89
void add_nullary(const ::std::string &name)
Definition: ast_def.cpp:281
bool fun_name_exists(const std::string &name)
Definition: ast_def.cpp:2029
const int model_name_origin
Definition: ast.hpp:77
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
Definition: ast.hpp:959
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
Definition: ast.hpp:965
bool is_primitive() const
Definition: ast_def.cpp:95
bool has_key(const std::string &key) const
Definition: ast_def.cpp:513
bool ends_with(const std::string &suffix, const std::string &s)
Definition: ast_def.cpp:1951
bool returns_type(const expr_type &return_type, const statement &statement, std::ostream &error_msgs)
Definition: ast_def.cpp:642
expression & operator+=(const expression &rhs)
Definition: ast_def.cpp:1860
bool is_user_defined_prob_function(const std::string &name, const expression &variate, const std::vector< expression > &params)
Definition: ast_def.cpp:1913
bool is_defined(const std::string &name, const function_signature_t &sig)
Definition: ast_def.cpp:170
void add_quaternary(const ::std::string &name)
Definition: ast_def.cpp:293
bool operator<(const expr_type &et) const
Definition: ast_def.cpp:75
std::vector< idx > idxs_
Definition: ast.hpp:1020
bool is_ill_formed() const
Definition: ast_def.cpp:107
bool operator()(const uni_idx &i) const
Definition: ast_def.cpp:1199
std::vector< expression > args_
Definition: ast.hpp:221
const int VOID_T
Definition: ast.hpp:68
base_expr_type type() const
Definition: ast_def.cpp:113
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:1808
bool has_low() const
Definition: ast_def.cpp:1162
bool is_user_defined(const std::pair< std::string, function_signature_t > &name_sig)
Definition: ast_def.cpp:164
std::string name_
Definition: ast.hpp:563
bool operator()(const nil &e) const
Definition: ast_def.cpp:749
int var_origin
Definition: ast.hpp:76
expr_type promote_primitive(const expr_type &et)
Definition: ast_def.cpp:132
const int void_function_argument_origin
Definition: ast.hpp:87
void generate_expression(const expression &e, std::ostream &o)
Definition: generator.hpp:433
base_expr_type base_type_
Definition: ast.hpp:565
expression return_value_
Definition: ast.hpp:915
size_t get_num_dims(const std::string &name) const
Definition: ast_def.cpp:1279
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< print_statement >, boost::recursive_wrapper< reject_statement >, boost::recursive_wrapper< return_statement >, boost::recursive_wrapper< no_op_statement > > statement_t
Definition: ast.hpp:800
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:127
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
Definition: ast.hpp:962
std::string operator()(const nil &x) const
Definition: ast_def.cpp:1441
boost::variant< boost::recursive_wrapper< std::string >, boost::recursive_wrapper< expression > > printable_t
Definition: ast.hpp:293
bool has_non_param_var(const expression &e, const variable_map &var_map)
Definition: ast_def.cpp:925
expression rhs_
Definition: ast.hpp:1021
const int data_origin
Definition: ast.hpp:78
size_t begin_line_
Definition: ast.hpp:803
const int void_function_argument_origin_lp
Definition: ast.hpp:88
expression lb_
Definition: ast.hpp:500
base_expr_type base_type_
Definition: ast.hpp:98
std::vector< idx > idxs_
Definition: ast.hpp:552
printable_t printable_
Definition: ast.hpp:301
bool is_data_origin(const var_origin &vo)
Definition: ast_def.cpp:1223
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:1080
const int INT_T
Definition: ast.hpp:69
bool operator()(const nil &st) const
Definition: ast_def.cpp:555
std::string integration_function_name_
Definition: ast.hpp:387
std::string name_
Definition: ast.hpp:926
std::vector< expression > conditions_
Definition: ast.hpp:887
std::string system_function_name_
Definition: ast.hpp:368
std::vector< arg_decl > arg_decls_
Definition: ast.hpp:941
statement statement_
Definition: ast.hpp:878
variable lhs_var_
Definition: ast.hpp:1019
std::set< std::string > key_set() const
Definition: ast_def.cpp:499
bool has_var(const expression &e, const variable_map &var_map)
Definition: ast_def.cpp:835
int_literal & operator=(const int_literal &il)
Definition: ast_def.cpp:979
expression expr_
Definition: ast.hpp:981
const std::string var_name_
Definition: ast.hpp:1001
bool operator==(const expr_type &et) const
Definition: ast_def.cpp:68
bool operator>=(const expr_type &et) const
Definition: ast_def.cpp:90
std::vector< expression > dims_
Definition: ast.hpp:324
bool has_ccdf_suffix(const std::string &name)
Definition: ast_def.cpp:2016
base_var_decl base_variable_declaration()
Definition: ast_def.cpp:525
expression low_
Definition: ast.hpp:477
expr_type operator()(const nil &e) const
Definition: ast_def.cpp:660
std::string name_
Definition: ast.hpp:323
std::vector< function_decl_def > decl_defs_
Definition: ast.hpp:951
expression expr_
Definition: ast.hpp:992
bool operator>(const expr_type &et) const
Definition: ast_def.cpp:85
void add_ternary(const ::std::string &name)
Definition: ast_def.cpp:290
const int VECTOR_T
Definition: ast.hpp:71
double_literal & operator=(const double_literal &dl)
Definition: ast_def.cpp:993
expression right
Definition: ast.hpp:460
std::string strip_prob_fun_suffix(const std::string &dist_fun)
Definition: ast_def.cpp:1992
idx_t idx_
Definition: ast.hpp:535
expression subject
Definition: ast.hpp:470
std::vector< expression > args_
Definition: ast.hpp:350
const int local_origin
Definition: ast.hpp:83
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:257
std::ostream & write_base_expr_type(std::ostream &o, base_expr_type type)
Definition: ast_def.cpp:25
bool operator()(const nil &st) const
Definition: ast_def.cpp:1592
void set_user_defined(const std::pair< std::string, function_signature_t > &name_sig)
Definition: ast_def.cpp:157
bool is_user_defined(const std::string &name, const std::vector< expression > &args)
Definition: ast_def.cpp:1897
expr_type arg_type_
Definition: ast.hpp:925
std::string op
Definition: ast.hpp:458
returns_type_vis(const expr_type &return_type, std::ostream &error_msgs)
Definition: ast_def.cpp:550
bool is_primitive_double() const
Definition: ast_def.cpp:103
std::vector< std::vector< expression > > dimss_
Definition: ast.hpp:435
std::string name() const
Definition: ast_def.cpp:1563
base_expr_type get_base_type(const std::string &name) const
Definition: ast_def.cpp:1276
Placeholder struct for boost::variant default ctors.
Definition: ast.hpp:18
std::map< std::string, range_t > map_
Definition: ast.hpp:586
const int ILL_FORMED_T
Definition: ast.hpp:74
const int MATRIX_T
Definition: ast.hpp:73
expression false_val_
Definition: ast.hpp:447
expression & operator/=(const expression &rhs)
Definition: ast_def.cpp:1875
unary_op(char op, expression const &subject)
Definition: ast_def.cpp:1148
const int transformed_data_origin
Definition: ast.hpp:79
bool operator()(const nil &x) const
Definition: ast_def.cpp:931
std::vector< printable > printables_
Definition: ast.hpp:909
std::ostream & error_msgs_
Definition: ast.hpp:846
std::vector< var_decl > parameter_decl_
Definition: ast.hpp:960
bool has_high() const
Definition: ast_def.cpp:1165

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