Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ast.hpp
Go to the documentation of this file.
1 #ifndef STAN__GM__AST_HPP
2 #define STAN__GM__AST_HPP
3 
4 #include <map>
5 #include <string>
6 #include <vector>
7 #include <map>
8 #include <set>
9 
10 #include <boost/variant/recursive_variant.hpp>
11 
12 namespace stan {
13 
14  namespace gm {
15 
18  struct nil { };
19 
20  // components of abstract syntax tree
21  struct array_literal;
22  struct assignment;
23  struct binary_op;
24  struct conditional_statement;
25  struct distribution;
26  struct double_var_decl;
27  struct double_literal;
28  struct expression;
29  struct for_statement;
30  struct fun;
31  struct function_decl_def;
32  struct function_decl_defs;
33  struct identifier;
35  struct index_op;
36  struct int_literal;
37  struct inv_var_decl;
38  struct matrix_var_decl;
39  struct no_op_statement;
40  struct ordered_var_decl;
42  struct print_statement;
43  struct program;
44  struct range;
45  struct reject_statement;
46  struct return_statement;
47  struct row_vector_var_decl;
48  struct sample;
49  struct simplex_var_decl;
50  struct integrate_ode;
51  struct unit_vector_var_decl;
52  struct statement;
53  struct statements;
54  struct unary_op;
55  struct variable;
56  struct variable_dims;
57  struct var_decl;
58  struct var_type;
59  struct vector_var_decl;
61 
62  // forward declarable enum hack (can't fwd-decl enum)
63  typedef int base_expr_type;
64  const int VOID_T = 0;
65  const int INT_T = 1;
66  const int DOUBLE_T = 2;
67  const int VECTOR_T = 3;
68  const int ROW_VECTOR_T = 4;
69  const int MATRIX_T = 5;
70  const int ILL_FORMED_T = 6;
71 
72  std::ostream& write_base_expr_type(std::ostream& o, base_expr_type type);
73 
74  struct expr_type {
76  size_t num_dims_;
77  expr_type();
78  expr_type(const base_expr_type base_type);
79  expr_type(const base_expr_type base_type,
80  size_t num_dims);
81  bool operator==(const expr_type& et) const;
82  bool operator!=(const expr_type& et) const;
83  bool operator<(const expr_type& et) const;
84  bool operator<=(const expr_type& et) const;
85  bool operator>(const expr_type& et) const;
86  bool operator>=(const expr_type& et) const;
87  bool is_primitive() const;
88  bool is_primitive_int() const;
89  bool is_primitive_double() const;
90  bool is_ill_formed() const;
91  bool is_void() const;
92  base_expr_type type() const;
93  size_t num_dims() const;
94  };
95 
96 
97  std::ostream& operator<<(std::ostream& o, const expr_type& et);
98 
100 
102  const expr_type& et2);
103 
104  typedef std::pair<expr_type, std::vector<expr_type> > function_signature_t;
105 
107  public:
108  static function_signatures& instance();
109  static void reset_sigs();
110  void set_user_defined(const std::pair<std::string,function_signature_t>&
111  name_sig);
112  bool is_user_defined(const std::pair<std::string,function_signature_t>&
113  name_sig);
114  void add(const std::string& name,
115  const expr_type& result_type,
116  const std::vector<expr_type>& arg_types);
117  void add(const std::string& name,
118  const expr_type& result_type);
119  void add(const std::string& name,
120  const expr_type& result_type,
121  const expr_type& arg_type);
122  void add(const std::string& name,
123  const expr_type& result_type,
124  const expr_type& arg_type1,
125  const expr_type& arg_type2);
126  void add(const std::string& name,
127  const expr_type& result_type,
128  const expr_type& arg_type1,
129  const expr_type& arg_type2,
130  const expr_type& arg_type3);
131  void add(const std::string& name,
132  const expr_type& result_type,
133  const expr_type& arg_type1,
134  const expr_type& arg_type2,
135  const expr_type& arg_type3,
136  const expr_type& arg_type4);
137  void add(const std::string& name,
138  const expr_type& result_type,
139  const expr_type& arg_type1,
140  const expr_type& arg_type2,
141  const expr_type& arg_type3,
142  const expr_type& arg_type4,
143  const expr_type& arg_type5);
144  void add(const std::string& name,
145  const expr_type& result_type,
146  const expr_type& arg_type1,
147  const expr_type& arg_type2,
148  const expr_type& arg_type3,
149  const expr_type& arg_type4,
150  const expr_type& arg_type5,
151  const expr_type& arg_type6);
152  void add(const std::string& name,
153  const expr_type& result_type,
154  const expr_type& arg_type1,
155  const expr_type& arg_type2,
156  const expr_type& arg_type3,
157  const expr_type& arg_type4,
158  const expr_type& arg_type5,
159  const expr_type& arg_type6,
160  const expr_type& arg_type7);
161  void add_nullary(const::std::string& name);
162  void add_unary(const::std::string& name);
163  void add_binary(const::std::string& name);
164  void add_ternary(const::std::string& name);
165  void add_quaternary(const::std::string& name);
166  int num_promotions(const std::vector<expr_type>& call_args,
167  const std::vector<expr_type>& sig_args);
168  expr_type get_result_type(const std::string& name,
169  const std::vector<expr_type>& args,
170  std::ostream& error_msgs);
171  int get_signature_matches(const std::string& name,
172  const std::vector<expr_type>& args,
173  function_signature_t& signature);
174  bool is_defined(const std::string& name,
175  const function_signature_t& sig);
176  std::set<std::string> key_set() const;
177  private:
180  std::map<std::string, std::vector<function_signature_t> > sigs_map_;
181  std::set<std::pair<std::string,function_signature_t> > user_defined_set_;
182  static function_signatures* sigs_; // init below outside of class
183  };
184 
185  struct statements {
186  std::vector<var_decl> local_decl_;
187  std::vector<statement> statements_;
188  statements();
189  statements(const std::vector<var_decl>& local_decl,
190  const std::vector<statement>& stmts);
191  };
192 
193 
194  struct distribution {
195  std::string family_;
196  std::vector<expression> args_;
197  };
198 
199  struct expression_type_vis : public boost::static_visitor<expr_type> {
200  expr_type operator()(const nil& e) const;
201  expr_type operator()(const int_literal& e) const;
202  expr_type operator()(const double_literal& e) const;
203  expr_type operator()(const array_literal& e) const;
204  expr_type operator()(const variable& e) const;
205  expr_type operator()(const fun& e) const;
206  expr_type operator()(const integrate_ode& e) const;
207  expr_type operator()(const index_op& e) const;
208  expr_type operator()(const binary_op& e) const;
209  expr_type operator()(const unary_op& e) const;
210  // template <typename T> expr_type operator()(const T& e) const;
211  };
212 
213 
214  struct expression;
215 
216  struct expression {
217  typedef boost::variant<boost::recursive_wrapper<nil>,
218  boost::recursive_wrapper<int_literal>,
219  boost::recursive_wrapper<double_literal>,
220  boost::recursive_wrapper<array_literal>,
221  boost::recursive_wrapper<variable>,
222  boost::recursive_wrapper<integrate_ode>,
223  boost::recursive_wrapper<fun>,
224  boost::recursive_wrapper<index_op>,
225  boost::recursive_wrapper<binary_op>,
226  boost::recursive_wrapper<unary_op> >
228 
229  expression();
230  expression(const expression& e);
231 
232  // template <typename Expr> expression(const Expr& expr);
233  expression(const nil& expr);
234  expression(const int_literal& expr);
235  expression(const double_literal& expr);
236  expression(const array_literal& expr);
237  expression(const variable& expr);
238  expression(const fun& expr);
239  expression(const integrate_ode& expr);
240  expression(const index_op& expr);
241  expression(const binary_op& expr);
242  expression(const unary_op& expr);
243  expression(const expression_t& expr_);
244 
245  expr_type expression_type() const;
246 
247  expression& operator+=(const expression& rhs);
248  expression& operator-=(const expression& rhs);
249  expression& operator*=(const expression& rhs);
250  expression& operator/=(const expression& rhs);
251 
253  };
254 
255 
256  struct printable {
257  typedef boost::variant<boost::recursive_wrapper<std::string>,
258  boost::recursive_wrapper<expression> >
260 
261  printable();
263  printable(const std::string& msg);
265  printable(const printable& printable);
266 
268  };
269 
270  struct is_nil_op : public boost::static_visitor<bool> {
271  bool operator()(const nil& x) const;
272  bool operator()(const int_literal& x) const;
273  bool operator()(const double_literal& x) const;
274  bool operator()(const array_literal& x) const;
275  bool operator()(const variable& x) const;
276  bool operator()(const integrate_ode& x) const;
277  bool operator()(const fun& x) const;
278  bool operator()(const index_op& x) const;
279  bool operator()(const binary_op& x) const;
280  bool operator()(const unary_op& x) const;
281 
282  // template <typename T>
283  // bool operator()(const T& x) const;
284  };
285 
286  bool is_nil(const expression& e);
287 
288  struct variable_dims {
289  std::string name_;
290  std::vector<expression> dims_;
291  variable_dims();
292  variable_dims(std::string const& name,
293  std::vector<expression> const& dims);
294  };
295 
296 
297  struct int_literal {
298  int val_;
300  int_literal();
301  int_literal(int val);
302  int_literal(const int_literal& il);
303  int_literal& operator=(const int_literal& il);
304  };
305 
306 
307  struct double_literal {
308  double val_;
310  double_literal();
311  double_literal(double val);
313  };
314 
315  struct array_literal {
316  std::vector<expression> args_;
318  array_literal();
319  array_literal(const std::vector<expression>& args);
321  };
322 
323  struct variable {
324  std::string name_;
326  variable();
327  variable(std::string name);
328  void set_type(const base_expr_type& base_type,
329  size_t num_dims);
330  };
331 
332  struct integrate_ode {
334  expression y0_; // initial state
335  expression t0_; // initial time
336  expression ts_; // solution times
337  expression theta_; // params
338  expression x_; // data
339  expression x_int_; // integer data
340  integrate_ode();
341  integrate_ode(const std::string& system_function_name,
342  const expression& y0,
343  const expression& t0,
344  const expression& ts,
345  const expression& theta,
346  const expression& x,
347  const expression& x_int);
348  };
349 
350  struct fun {
351  std::string name_;
352  std::vector<expression> args_;
354  fun();
355  fun(std::string const& name,
356  std::vector<expression> const& args);
357  void infer_type(); // FIXME: is this used anywhere?
358  };
359 
360  size_t total_dims(const std::vector<std::vector<expression> >& dimss);
361 
362  expr_type infer_type_indexing(const base_expr_type& expr_base_type,
363  size_t num_expr_dims,
364  size_t num_index_dims);
365 
367  size_t num_index_dims);
368 
369 
370  struct index_op {
372  std::vector<std::vector<expression> > dimss_;
374  index_op();
375  // vec of vec for e.g., e[1,2][3][4,5,6]
376  index_op(const expression& expr,
377  const std::vector<std::vector<expression> >& dimss);
378  void infer_type();
379  };
380 
381 
382  struct binary_op {
383  std::string op;
387  binary_op();
388  binary_op(const expression& left,
389  const std::string& op,
390  const expression& right);
391  };
392 
393  struct unary_op {
394  char op;
397  unary_op(char op,
398  expression const& subject);
399  };
400 
401  struct range {
404  range();
405  range(expression const& low,
406  expression const& high);
407  bool has_low() const;
408  bool has_high() const;
409  };
410 
411  typedef int var_origin;
412  const int model_name_origin = 0;
413  const int data_origin = 1;
414  const int transformed_data_origin = 2;
415  const int parameter_origin = 3;
417  const int derived_origin = 5;
418  const int local_origin = 6;
425 
426  void print_var_origin(std::ostream& o, const var_origin& vo);
427 
428  struct base_var_decl {
429  std::string name_;
430  std::vector<expression> dims_;
432  base_var_decl();
433  base_var_decl(const base_expr_type& base_type);
434  base_var_decl(const std::string& name,
435  const std::vector<expression>& dims,
436  const base_expr_type& base_type);
437  };
438 
439  struct variable_map {
440  typedef std::pair<base_var_decl,var_origin> range_t;
441 
442  bool exists(const std::string& name) const;
443  base_var_decl get(const std::string& name) const;
444  base_expr_type get_base_type(const std::string& name) const;
445  size_t get_num_dims(const std::string& name) const;
446  var_origin get_origin(const std::string& name) const;
447  void add(const std::string& name,
448  const base_var_decl& base_decl,
449  const var_origin& vo);
450  void remove(const std::string& name);
451 
452  std::map<std::string, range_t> map_;
453  };
454 
455  struct int_var_decl : public base_var_decl {
457  int_var_decl();
458  int_var_decl(range const& range,
459  std::string const& name,
460  std::vector<expression> const& dims);
461  };
462 
463 
464  struct double_var_decl : public base_var_decl {
466  double_var_decl();
467  double_var_decl(range const& range,
468  std::string const& name,
469  std::vector<expression> const& dims);
470  };
471 
476  std::string const& name,
477  std::vector<expression> const& dims);
478  };
479 
480  struct simplex_var_decl : public base_var_decl {
483  simplex_var_decl(expression const& K,
484  std::string const& name,
485  std::vector<expression> const& dims);
486  };
487 
488  struct ordered_var_decl : public base_var_decl {
491  ordered_var_decl(expression const& K,
492  std::string const& name,
493  std::vector<expression> const& dims);
494  };
495 
500  std::string const& name,
501  std::vector<expression> const& dims);
502  };
503 
504  struct vector_var_decl : public base_var_decl {
507  vector_var_decl();
508  vector_var_decl(range const& range,
509  expression const& M,
510  std::string const& name,
511  std::vector<expression> const& dims);
512  };
513 
519  expression const& N,
520  std::string const& name,
521  std::vector<expression> const& dims);
522  };
523 
524  struct matrix_var_decl : public base_var_decl {
528  matrix_var_decl();
529  matrix_var_decl(range const& range,
530  expression const& M,
531  expression const& N,
532  std::string const& name,
533  std::vector<expression> const& dims);
534  };
535 
541  expression const& N,
542  std::string const& name,
543  std::vector<expression> const& dims);
544  };
545 
550  const std::string& name,
551  const std::vector<expression>& dims);
552  };
553 
558  std::string const& name,
559  std::vector<expression> const& dims);
560  };
561 
562 
567  std::string const& name,
568  std::vector<expression> const& dims);
569  };
570 
571  struct name_vis : public boost::static_visitor<std::string> {
572  name_vis();
573  std::string operator()(const nil& x) const;
574  std::string operator()(const int_var_decl& x) const;
575  std::string operator()(const double_var_decl& x) const;
576  std::string operator()(const vector_var_decl& x) const;
577  std::string operator()(const row_vector_var_decl& x) const;
578  std::string operator()(const matrix_var_decl& x) const;
579  std::string operator()(const simplex_var_decl& x) const;
580  std::string operator()(const unit_vector_var_decl& x) const;
581  std::string operator()(const ordered_var_decl& x) const;
582  std::string operator()(const positive_ordered_var_decl& x) const;
583  std::string operator()(const cholesky_factor_var_decl& x) const;
584  std::string operator()(const cholesky_corr_var_decl& x) const;
585  std::string operator()(const cov_matrix_var_decl& x) const;
586  std::string operator()(const corr_matrix_var_decl& x) const;
587  };
588 
589 
590 
591 
592  struct var_decl {
593  typedef boost::variant<boost::recursive_wrapper<nil>,
594  boost::recursive_wrapper<int_var_decl>,
595  boost::recursive_wrapper<double_var_decl>,
596  boost::recursive_wrapper<vector_var_decl>,
597  boost::recursive_wrapper<row_vector_var_decl>,
598  boost::recursive_wrapper<matrix_var_decl>,
599  boost::recursive_wrapper<simplex_var_decl>,
600  boost::recursive_wrapper<unit_vector_var_decl>,
601  boost::recursive_wrapper<ordered_var_decl>,
602  boost::recursive_wrapper<positive_ordered_var_decl>,
603  boost::recursive_wrapper<cholesky_factor_var_decl>,
604  boost::recursive_wrapper<cholesky_corr_var_decl>,
605  boost::recursive_wrapper<cov_matrix_var_decl>,
606  boost::recursive_wrapper<corr_matrix_var_decl> >
608 
610 
611  var_decl();
612 
613  // template <typename Decl>
614  // var_decl(Decl const& decl);
615  var_decl(const var_decl_t& decl);
616  var_decl(const nil& decl);
617  var_decl(const int_var_decl& decl);
618  var_decl(const double_var_decl& decl);
619  var_decl(const vector_var_decl& decl);
620  var_decl(const row_vector_var_decl& decl);
621  var_decl(const matrix_var_decl& decl);
622  var_decl(const simplex_var_decl& decl);
623  var_decl(const unit_vector_var_decl& decl);
624  var_decl(const ordered_var_decl& decl);
625  var_decl(const positive_ordered_var_decl& decl);
626  var_decl(const cholesky_factor_var_decl& decl);
627  var_decl(const cholesky_corr_var_decl& decl);
628  var_decl(const cov_matrix_var_decl& decl);
629  var_decl(const corr_matrix_var_decl& decl);
630 
631  std::string name() const;
632  };
633 
634  struct statement {
635  typedef boost::variant<boost::recursive_wrapper<nil>,
636  boost::recursive_wrapper<assignment>,
637  boost::recursive_wrapper<sample>,
638  boost::recursive_wrapper<increment_log_prob_statement>,
639  boost::recursive_wrapper<expression>, // dummy now
640  boost::recursive_wrapper<statements>,
641  boost::recursive_wrapper<for_statement>,
642  boost::recursive_wrapper<conditional_statement>,
643  boost::recursive_wrapper<while_statement>,
644  boost::recursive_wrapper<print_statement>,
645  boost::recursive_wrapper<reject_statement>,
646  boost::recursive_wrapper<return_statement>,
647  boost::recursive_wrapper<no_op_statement> >
649 
651 
652  statement();
653  statement(const statement_t& st);
654  statement(const nil& st);
655  statement(const assignment& st);
656  statement(const sample& st);
658  statement(const expression& st);
659  statement(const statements& st);
660  statement(const for_statement& st);
661  statement(const conditional_statement& st);
662  statement(const while_statement& st);
663  statement(const print_statement& st);
664  statement(const reject_statement& st);
665  statement(const no_op_statement& st);
666  statement(const return_statement& st);
667 
668  bool is_no_op_statement() const;
669  };
670 
671  struct is_no_op_statement_vis : public boost::static_visitor<bool> {
672  bool operator()(const nil& st) const;
673  bool operator()(const assignment& st) const;
674  bool operator()(const sample& st) const;
675  bool operator()(const increment_log_prob_statement& t) const;
676  bool operator()(const expression& st) const;
677  bool operator()(const statements& st) const;
678  bool operator()(const for_statement& st) const;
679  bool operator()(const conditional_statement& st) const;
680  bool operator()(const while_statement& st) const;
681  bool operator()(const print_statement& st) const;
682  bool operator()(const reject_statement& st) const;
683  bool operator()(const no_op_statement& st) const;
684  bool operator()(const return_statement& st) const;
685  };
686 
687 
688  struct returns_type_vis : public boost::static_visitor<bool> {
690  std::ostream& error_msgs_;
692  std::ostream& error_msgs);
693  bool operator()(const nil& st) const;
694  bool operator()(const assignment& st) const;
695  bool operator()(const sample& st) const;
696  bool operator()(const increment_log_prob_statement& t) const;
697  bool operator()(const expression& st) const;
698  bool operator()(const statements& st) const;
699  bool operator()(const for_statement& st) const;
700  bool operator()(const conditional_statement& st) const;
701  bool operator()(const while_statement& st) const;
702  bool operator()(const print_statement& st) const;
703  bool operator()(const reject_statement& st) const;
704  bool operator()(const no_op_statement& st) const;
705  bool operator()(const return_statement& st) const;
706  };
707 
708  bool returns_type(const expr_type& return_type,
709  const statement& statement,
710  std::ostream& error_msgs);
711 
715  increment_log_prob_statement(const expression& log_prob);
716  };
717 
718  struct for_statement {
719  std::string variable_;
722  for_statement();
723  for_statement(std::string& variable,
724  range& range,
725  statement& stmt);
726  };
727 
728  // bodies may be 1 longer than conditions due to else
730  std::vector<expression> conditions_;
731  std::vector<statement> bodies_;
733  conditional_statement(const std::vector<expression>& conditions,
734  const std::vector<statement>& statements);
735  };
736 
740  while_statement();
741  while_statement(const expression& condition,
742  const statement& body);
743  };
744 
746  std::vector<printable> printables_;
747  print_statement();
748  print_statement(const std::vector<printable>& printables);
749  };
750 
752  std::vector<printable> printables_;
754  reject_statement(const std::vector<printable>& printables);
755  };
756 
760  return_statement(const expression& expr);
761  };
762 
764  // no op, no data
765  };
766 
767  struct arg_decl {
769  std::string name_;
770  arg_decl();
771  arg_decl(const expr_type& arg_type,
772  const std::string& name);
774  };
775 
779  const std::string& name,
780  const std::vector<arg_decl>& arg_decls,
781  const statement& body);
783  std::string name_;
784  std::vector<arg_decl> arg_decls_;
786  };
787 
790  function_decl_defs(const std::vector<function_decl_def>& decl_defs);
791  std::vector<function_decl_def> decl_defs_;
792  };
793 
794 
795  struct program {
796  std::vector<function_decl_def> function_decl_defs_;
797  std::vector<var_decl> data_decl_;
798  std::pair<std::vector<var_decl>,std::vector<statement> >
800  std::vector<var_decl> parameter_decl_;
801  std::pair<std::vector<var_decl>,std::vector<statement> >
804  std::pair<std::vector<var_decl>,std::vector<statement> > generated_decl_;
805  program();
806  program(const std::vector<function_decl_def>& function_decl_defs,
807  const std::vector<var_decl>& data_decl,
808  const std::pair<std::vector<var_decl>,
809  std::vector<statement> >& derived_data_decl,
810  const std::vector<var_decl>& parameter_decl,
811  const std::pair<std::vector<var_decl>,
812  std::vector<statement> >& derived_decl,
813  const statement& st,
814  const std::pair<std::vector<var_decl>,
815  std::vector<statement> >& generated_decl);
816  };
817 
818  struct sample {
822  sample();
824  distribution& dist);
825  bool is_ill_formed() const;
826  };
827 
828  struct assignment {
829  variable_dims var_dims_; // lhs_var[dim0,...,dimN-1]
830  expression expr_; // = rhs
831  base_var_decl var_type_; // type of lhs_var
832  assignment();
833  assignment(variable_dims& var_dims,
834  expression& expr);
835  };
836 
837  // FIXME: is this next dependency necessary?
838  // from generator.hpp
839  void generate_expression(const expression& e, std::ostream& o);
840 
841  bool has_rng_suffix(const std::string& s);
842  bool has_lp_suffix(const std::string& s);
843  bool is_user_defined(const std::string& name,
844  const std::vector<expression>& args);
845  bool is_user_defined_prob_function(const std::string& name,
846  const expression& variate,
847  const std::vector<expression>& params);
848  bool is_user_defined(const fun& fx);
849 
850  struct contains_var : public boost::static_visitor<bool> {
852  contains_var(const variable_map& var_map);
853  bool operator()(const nil& e) const;
854  bool operator()(const int_literal& e) const;
855  bool operator()(const double_literal& e) const;
856  bool operator()(const array_literal& e) const;
857  bool operator()(const variable& e) const;
858  bool operator()(const integrate_ode& e) const;
859  bool operator()(const fun& e) const;
860  bool operator()(const index_op& e) const;
861  bool operator()(const binary_op& e) const;
862  bool operator()(const unary_op& e) const;
863  };
864 
865  bool has_var(const expression& e,
866  const variable_map& var_map);
867 
868 
869  struct contains_nonparam_var : public boost::static_visitor<bool> {
871  contains_nonparam_var(const variable_map& var_map);
872  bool operator()(const nil& e) const;
873  bool operator()(const int_literal& e) const;
874  bool operator()(const double_literal& e) const;
875  bool operator()(const array_literal& e) const;
876  bool operator()(const variable& e) const;
877  bool operator()(const integrate_ode& e) const;
878  bool operator()(const fun& e) const;
879  bool operator()(const index_op& e) const;
880  bool operator()(const binary_op& e) const;
881  bool operator()(const unary_op& e) const;
882  };
883 
884  bool has_non_param_var(const expression& e,
885  const variable_map& var_map);
886 
887  bool is_assignable(const expr_type& l_type,
888  const expr_type& r_type,
889  const std::string& failure_message,
890  std::ostream& error_msgs);
891 
892 
893  bool ends_with(const std::string& suffix,
894  const std::string& s);
895 
896  }
897 }
898 
899 #endif
bool operator==(const expr_type &et) const
Definition: ast_def.cpp:66
std::string family_
Definition: ast.hpp:195
expression ts_
Definition: ast.hpp:336
Placeholder struct for boost::variant default ctors.
Definition: ast.hpp:18
expression & operator/=(const expression &rhs)
Definition: ast_def.cpp:1401
void generate_expression(const expression &e, std::ostream &o)
Definition: generator.hpp:249
bool is_user_defined(const std::pair< std::string, function_signature_t > &name_sig)
Definition: ast_def.cpp:157
bool is_no_op_statement() const
Definition: ast_def.cpp:1286
void add_unary(const ::std::string &name)
Definition: ast_def.cpp:276
bool ends_with(const std::string &suffix, const std::string &s)
Definition: ast_def.cpp:1477
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
Definition: ast.hpp:799
std::vector< expression > conditions_
Definition: ast.hpp:730
std::string name_
Definition: ast.hpp:351
void add(const std::string &name, const expr_type &result_type, const std::vector< expr_type > &arg_types)
Definition: ast_def.cpp:171
std::vector< expression > dims_
Definition: ast.hpp:430
expression right
Definition: ast.hpp:385
base_expr_type base_type_
Definition: ast.hpp:75
const int data_origin
Definition: ast.hpp:413
void add_nullary(const ::std::string &name)
Definition: ast_def.cpp:273
variable_dims var_dims_
Definition: ast.hpp:829
const int parameter_origin
Definition: ast.hpp:415
void add(const std::string &name, const base_var_decl &base_decl, const var_origin &vo)
Definition: ast_def.cpp:1007
expr_type type_
Definition: ast.hpp:353
bool is_user_defined_prob_function(const std::string &name, const expression &variate, const std::vector< expression > &params)
Definition: ast_def.cpp:1439
statement statement_
Definition: ast.hpp:803
bool is_defined(const std::string &name, const function_signature_t &sig)
Definition: ast_def.cpp:163
const int DOUBLE_T
Definition: ast.hpp:66
std::string name_
Definition: ast.hpp:769
static function_signatures & instance()
Definition: ast_def.cpp:143
expression y0_
Definition: ast.hpp:334
void infer_type()
Definition: ast_def.cpp:860
const int local_origin
Definition: ast.hpp:418
expression expr_
Definition: ast.hpp:830
std::map< std::string, range_t > map_
Definition: ast.hpp:452
boost::variant< boost::recursive_wrapper< std::string >, boost::recursive_wrapper< expression > > printable_t
Definition: ast.hpp:259
expr_type type_
Definition: ast.hpp:396
expression x_int_
Definition: ast.hpp:339
std::vector< std::vector< expression > > dimss_
Definition: ast.hpp:372
bool operator>=(const expr_type &et) const
Definition: ast_def.cpp:88
bool is_primitive_int() const
Definition: ast_def.cpp:97
expr_type type_
Definition: ast.hpp:386
void set_user_defined(const std::pair< std::string, function_signature_t > &name_sig)
Definition: ast_def.cpp:150
bool has_low() const
Definition: ast_def.cpp:937
expression high_
Definition: ast.hpp:403
bool is_primitive_double() const
Definition: ast_def.cpp:101
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
Definition: ast.hpp:804
const int ROW_VECTOR_T
Definition: ast.hpp:68
std::vector< var_decl > data_decl_
Definition: ast.hpp:797
void print_var_origin(std::ostream &o, const var_origin &vo)
Definition: ast_def.cpp:944
expr_type return_type_
Definition: ast.hpp:689
const int function_argument_origin
Definition: ast.hpp:419
bool is_user_defined(const std::string &name, const std::vector< expression > &args)
Definition: ast_def.cpp:1423
expression & operator-=(const expression &rhs)
Definition: ast_def.cpp:1391
Metaprogram to calculate the base scalar return type resulting from promoting all the scalar types of...
Definition: traits.hpp:398
int get_signature_matches(const std::string &name, const std::vector< expr_type > &args, function_signature_t &signature)
Definition: ast_def.cpp:307
expression & operator*=(const expression &rhs)
Definition: ast_def.cpp:1396
size_t total_dims(const std::vector< std::vector< expression > > &dimss)
Definition: ast_def.cpp:865
const int void_function_argument_origin_rng
Definition: ast.hpp:424
expression return_value_
Definition: ast.hpp:758
const int function_argument_origin_rng
Definition: ast.hpp:421
bool has_rng_suffix(const std::string &s)
Definition: ast_def.cpp:1406
std::vector< expression > args_
Definition: ast.hpp:352
void add_binary(const ::std::string &name)
Definition: ast_def.cpp:279
bool operator()(const nil &e) const
Definition: ast_def.cpp:600
bool is_ill_formed() const
Definition: ast_def.cpp:1368
expression expr_
Definition: ast.hpp:819
size_t get_num_dims(const std::string &name) const
Definition: ast_def.cpp:999
std::vector< expression > args_
Definition: ast.hpp:316
base_expr_type base_type_
Definition: ast.hpp:431
expression_t expr_
Definition: ast.hpp:252
std::ostream & error_msgs_
Definition: ast.hpp:690
std::vector< var_decl > parameter_decl_
Definition: ast.hpp:800
size_t num_dims_
Definition: ast.hpp:76
base_expr_type type() const
Definition: ast_def.cpp:111
bool has_non_param_var(const expression &e, const variable_map &var_map)
Definition: ast_def.cpp:748
expression subject
Definition: ast.hpp:395
const int derived_origin
Definition: ast.hpp:417
std::ostream & operator<<(std::ostream &o, const expr_type &et)
Definition: ast_def.cpp:118
std::vector< statement > bodies_
Definition: ast.hpp:731
expression condition_
Definition: ast.hpp:738
expression t0_
Definition: ast.hpp:335
expr_type type_
Definition: ast.hpp:299
expression theta_
Definition: ast.hpp:337
int num_promotions(const std::vector< expr_type > &call_args, const std::vector< expr_type > &sig_args)
Definition: ast_def.cpp:288
const int VECTOR_T
Definition: ast.hpp:67
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
Definition: ast.hpp:802
const int MATRIX_T
Definition: ast.hpp:69
expr_type promote_primitive(const expr_type &et)
Definition: ast_def.cpp:125
expr_type type_
Definition: ast.hpp:373
void dims(const T &x, std::vector< int > &result)
Definition: dims.hpp:13
returns_type_vis(const expr_type &return_type, std::ostream &error_msgs)
Definition: ast_def.cpp:428
expression low_
Definition: ast.hpp:402
std::string name() const
Definition: ast_def.cpp:1224
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< fun >, boost::recursive_wrapper< index_op >, boost::recursive_wrapper< binary_op >, boost::recursive_wrapper< unary_op > > expression_t
Definition: ast.hpp:227
printable_t printable_
Definition: ast.hpp:267
std::vector< expression > dims_
Definition: ast.hpp:290
contains_nonparam_var(const variable_map &var_map)
Definition: ast_def.cpp:681
const int void_function_argument_origin_lp
Definition: ast.hpp:423
size_t num_dims() const
Definition: ast_def.cpp:114
statement statement_
Definition: ast.hpp:721
std::string name_
Definition: ast.hpp:289
bool has_var(const expression &e, const variable_map &var_map)
Definition: ast_def.cpp:675
expression left
Definition: ast.hpp:384
expression expr_
Definition: ast.hpp:371
std::vector< arg_decl > arg_decls_
Definition: ast.hpp:784
std::string op
Definition: ast.hpp:383
expr_type type_
Definition: ast.hpp:325
std::string name_
Definition: ast.hpp:429
const int void_function_argument_origin
Definition: ast.hpp:422
void add_quaternary(const ::std::string &name)
Definition: ast_def.cpp:285
const int model_name_origin
Definition: ast.hpp:412
bool has_lp_suffix(const std::string &s)
Definition: ast_def.cpp:1415
boost::variant< boost::recursive_wrapper< nil >, boost::recursive_wrapper< assignment >, 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:648
array_literal & operator=(const array_literal &al)
Definition: ast_def.cpp:821
std::set< std::string > key_set() const
Definition: ast_def.cpp:380
std::string system_function_name_
Definition: ast.hpp:333
contains_var(const variable_map &var_map)
Definition: ast_def.cpp:597
base_expr_type get_base_type(const std::string &name) const
Definition: ast_def.cpp:996
bool operator()(const nil &e) const
Definition: ast_def.cpp:684
const int transformed_data_origin
Definition: ast.hpp:414
int base_expr_type
Definition: ast.hpp:60
bool is_nil(const expression &e)
Definition: ast_def.cpp:768
statement_t statement_
Definition: ast.hpp:650
double e()
Return the base of the natural logarithm.
Definition: constants.hpp:86
var_decl_t decl_
Definition: ast.hpp:609
std::string variable_
Definition: ast.hpp:719
bool operator!=(const expr_type &et) const
Definition: ast_def.cpp:70
std::vector< function_decl_def > function_decl_defs_
Definition: ast.hpp:796
range truncation_
Definition: ast.hpp:821
std::vector< printable > printables_
Definition: ast.hpp:752
bool is_ill_formed() const
Definition: ast_def.cpp:105
base_var_decl base_variable_declaration()
Definition: ast_def.cpp:403
bool has_high() const
Definition: ast_def.cpp:940
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:1453
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:873
bool operator()(const nil &x) const
Definition: ast_def.cpp:754
const int function_argument_origin_lp
Definition: ast.hpp:420
const int INT_T
Definition: ast.hpp:65
base_var_decl var_type_
Definition: ast.hpp:831
bool operator>(const expr_type &et) const
Definition: ast_def.cpp:83
unary_op(char op, expression const &subject)
Definition: ast_def.cpp:923
expression & operator+=(const expression &rhs)
Definition: ast_def.cpp:1386
expr_type operator()(const nil &e) const
Definition: ast_def.cpp:533
std::vector< function_decl_def > decl_defs_
Definition: ast.hpp:791
const int transformed_parameter_origin
Definition: ast.hpp:416
bool operator<(const expr_type &et) const
Definition: ast_def.cpp:73
std::vector< expression > args_
Definition: ast.hpp:196
bool operator<=(const expr_type &et) const
Definition: ast_def.cpp:78
double_literal & operator=(const double_literal &dl)
Definition: ast_def.cpp:806
std::pair< base_var_decl, var_origin > range_t
Definition: ast.hpp:440
distribution dist_
Definition: ast.hpp:820
std::string operator()(const nil &x) const
Definition: ast_def.cpp:1161
expr_type get_result_type(const std::string &name, const std::vector< expr_type > &args, std::ostream &error_msgs)
Definition: ast_def.cpp:329
std::string name_
Definition: ast.hpp:324
double dist(const std::vector< double > &x, const std::vector< double > &y)
Definition: dist.hpp:11
bool exists(const std::string &name) const
Definition: ast_def.cpp:988
std::ostream & write_base_expr_type(std::ostream &o, base_expr_type type)
Definition: ast_def.cpp:23
std::vector< var_decl > local_decl_
Definition: ast.hpp:186
std::vector< printable > printables_
Definition: ast.hpp:746
expr_type expression_type() const
Definition: ast_def.cpp:570
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:607
bool returns_type(const expr_type &return_type, const statement &statement, std::ostream &error_msgs)
Definition: ast_def.cpp:515
void set_type(const base_expr_type &base_type, size_t num_dims)
Definition: ast_def.cpp:829
const variable_map & var_map_
Definition: ast.hpp:870
int_literal & operator=(const int_literal &il)
Definition: ast_def.cpp:792
expr_type arg_type_
Definition: ast.hpp:768
int var_origin
Definition: ast.hpp:411
bool operator()(const nil &st) const
Definition: ast_def.cpp:433
void add_ternary(const ::std::string &name)
Definition: ast_def.cpp:282
std::vector< statement > statements_
Definition: ast.hpp:187
bool is_primitive() const
Definition: ast_def.cpp:93
var_origin get_origin(const std::string &name) const
Definition: ast_def.cpp:1002
const variable_map & var_map_
Definition: ast.hpp:851
const int ILL_FORMED_T
Definition: ast.hpp:70
bool is_void() const
Definition: ast_def.cpp:108
const int VOID_T
Definition: ast.hpp:64
bool operator()(const nil &st) const
Definition: ast_def.cpp:1246
std::pair< expr_type, std::vector< expr_type > > function_signature_t
Definition: ast.hpp:104

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