1 #ifndef STAN_LANG_AST_HPP
2 #define STAN_LANG_AST_HPP
4 #include <boost/variant/recursive_variant.hpp>
101 expr_type(
const base_expr_type base_type);
102 expr_type(
const base_expr_type base_type,
115 base_expr_type
type()
const;
135 bool is_user_defined(
const std::pair<std::string, function_signature_t>&
137 void add(
const std::string& name,
139 const std::vector<expr_type>& arg_types);
140 void add(
const std::string& name,
142 void add(
const std::string& name,
145 void add(
const std::string& name,
149 void add(
const std::string& name,
154 void add(
const std::string& name,
160 void add(
const std::string& name,
167 void add(
const std::string& name,
175 void add(
const std::string& name,
185 void add_unary(const::std::string& name);
190 const std::vector<expr_type>& sig_args);
192 const std::vector<expr_type>& args,
193 std::ostream& error_msgs,
194 bool sampling_error_style =
false);
196 const std::vector<expr_type>& args,
197 function_signature_t& signature);
199 const function_signature_t& sig);
200 std::set<std::string>
key_set()
const;
201 bool has_key(
const std::string& key)
const;
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_;
215 statements(
const std::vector<var_decl>& local_decl,
216 const std::vector<statement>& stmts);
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> >
291 typedef boost::variant<boost::recursive_wrapper<std::string>,
292 boost::recursive_wrapper<expression> >
327 std::vector<expression>
const& dims);
362 void set_type(
const base_expr_type& base_type,
377 const std::string& system_function_name,
400 const std::string& system_function_name,
418 fun(std::string
const& name,
419 std::vector<expression>
const& args);
423 size_t total_dims(
const std::vector<std::vector<expression> >& dimss);
426 size_t num_expr_dims,
427 size_t num_index_dims);
430 size_t num_index_dims);
435 std::vector<std::vector<expression> >
dimss_;
440 const std::vector<std::vector<expression> >& dimss);
464 const std::string& op,
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> >
557 const std::vector<idx>& idxs);
569 const std::vector<expression>& dims,
570 const base_expr_type& base_type);
574 typedef std::pair<base_var_decl, var_origin>
range_t;
576 bool exists(
const std::string& name)
const;
580 var_origin
get_origin(
const std::string& name)
const;
581 void add(
const std::string& name,
583 const var_origin& vo);
584 void remove(
const std::string& name);
586 std::map<std::string, range_t>
map_;
593 std::string
const& name,
594 std::vector<expression>
const& dims);
602 std::string
const& name,
603 std::vector<expression>
const& dims);
610 std::string
const& name,
611 std::vector<expression>
const& dims);
618 std::string
const& name,
619 std::vector<expression>
const& dims);
626 std::string
const& name,
627 std::vector<expression>
const& dims);
634 std::string
const& name,
635 std::vector<expression>
const& dims);
644 std::string
const& name,
645 std::vector<expression>
const& dims);
654 std::string
const& name,
655 std::vector<expression>
const& dims);
666 std::string
const& name,
667 std::vector<expression>
const& dims);
676 std::string
const& name,
677 std::vector<expression>
const& dims);
684 std::string
const& name,
685 std::vector<expression>
const& dims);
692 std::string
const& name,
693 std::vector<expression>
const& dims);
701 std::string
const& name,
702 std::vector<expression>
const& dims);
705 struct name_vis :
public boost::static_visitor<std::string> {
724 :
public boost::static_visitor<base_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> >
781 std::string
name()
const;
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> >
848 std::ostream& error_msgs);
867 std::ostream& error_msgs);
929 const std::string& name);
936 const std::string& name,
937 const std::vector<arg_decl>& arg_decls,
949 const std::vector<function_decl_def>& decl_defs);
958 std::pair<std::vector<var_decl>, std::vector<statement> >
961 std::pair<std::vector<var_decl>, std::vector<statement> >
964 std::pair<std::vector<var_decl>, std::vector<statement> >
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,
976 const std::pair<std::vector<var_decl>,
977 std::vector<statement> >& generated_decl);
1023 assgn(
const variable& lhs_var,
const std::vector<idx>& idxs,
1038 const std::vector<idx>& idxs);
1049 const std::vector<expression>& args);
1052 const std::vector<expression>& params);
1100 const std::string& failure_message,
1101 std::ostream& error_msgs);
1104 bool ends_with(
const std::string& suffix,
1105 const std::string& s);
1108 std::string
get_cdf(
const std::string& dist_name);
1110 std::string
get_ccdf(
const std::string& dist_name);
1112 std::string
get_prob_fun(
const std::string& dist_name);
expr_type get_result_type(const std::string &name, const std::vector< expr_type > &args, std::ostream &error_msgs, bool sampling_error_style=false)
var_occurs_vis(const variable &e)
increment_log_prob_statement()
std::string strip_ccdf_suffix(const std::string &dist_fun)
base_var_decl base_decl() const
bool lhs_var_occurs_on_rhs() const
void add(const std::string &name, const expr_type &result_type, const std::vector< expr_type > &arg_types)
const int function_argument_origin
const variable_map & var_map_
std::string integration_function_name_
bool has_lp_suffix(const std::string &s)
std::vector< statement > statements_
contains_var(const variable_map &var_map)
std::vector< expression > dims_
std::string original_name_
expression & operator-=(const expression &rhs)
std::string strip_cdf_suffix(const std::string &dist_fun)
const int parameter_origin
bool has_cdf_suffix(const std::string &name)
const int function_argument_origin_rng
Probability, optimization and sampling library.
size_t total_dims(const std::vector< std::vector< expression > > &dimss)
bool operator()(const nil &e) const
bool operator<=(const expr_type &et) const
std::string get_prob_fun(const std::string &dist_name)
static function_signatures & instance()
std::vector< var_decl > data_decl_
bool is_multi_index(const idx &idx)
std::pair< base_var_decl, var_origin > range_t
std::vector< var_decl > local_decl_
std::vector< expression > args_
void add(const std::string &name, const base_var_decl &base_decl, const var_origin &vo)
bool has_prob_fun_suffix(const std::string &name)
std::string get_cdf(const std::string &dist_name)
bool exists(const std::string &name) const
bool operator!=(const expr_type &et) const
std::vector< statement > bodies_
bool is_ill_formed() const
bool is_assignable(const expr_type &l_type, const expr_type &r_type, const std::string &failure_message, std::ostream &error_msgs)
bool has_rng_suffix(const std::string &s)
int num_promotions(const std::vector< expr_type > &call_args, const std::vector< expr_type > &sig_args)
bool is_primitive_int() const
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
std::vector< printable > printables_
base_var_decl operator()(const nil &x) const
int get_signature_matches(const std::string &name, const std::vector< expr_type > &args, function_signature_t &signature)
const int transformed_parameter_origin
std::string system_function_name_
positive_ordered_var_decl()
bool is_no_op_statement() const
void add_binary(const ::std::string &name)
expression max_num_steps_
void set_type(const base_expr_type &base_type, size_t num_dims)
var_origin get_origin(const std::string &name) const
contains_nonparam_var(const variable_map &var_map)
std::string get_ccdf(const std::string &dist_name)
const int function_argument_origin_lp
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
std::vector< function_decl_def > function_decl_defs_
expr_type expression_type() const
const variable_map & var_map_
void print_var_origin(std::ostream &o, const var_origin &vo)
void add_unary(const ::std::string &name)
expression & operator*=(const expression &rhs)
bool is_nil(const expression &e)
array_literal & operator=(const array_literal &al)
bool operator()(const nil &e) const
const int void_function_argument_origin_rng
void add_nullary(const ::std::string &name)
bool fun_name_exists(const std::string &name)
const int model_name_origin
std::pair< std::vector< var_decl >, std::vector< statement > > derived_data_decl_
std::pair< std::vector< var_decl >, std::vector< statement > > generated_decl_
bool is_primitive() const
bool has_key(const std::string &key) const
bool ends_with(const std::string &suffix, const std::string &s)
bool returns_type(const expr_type &return_type, const statement &statement, std::ostream &error_msgs)
expression & operator+=(const expression &rhs)
bool is_user_defined_prob_function(const std::string &name, const expression &variate, const std::vector< expression > ¶ms)
bool is_defined(const std::string &name, const function_signature_t &sig)
void add_quaternary(const ::std::string &name)
bool operator<(const expr_type &et) const
bool is_ill_formed() const
bool operator()(const uni_idx &i) const
std::vector< expression > args_
base_expr_type type() const
expr_type indexed_type(const expression &e, const std::vector< idx > &idxs)
Return the type of the expression indexed by the generalized index sequence.
bool is_user_defined(const std::pair< std::string, function_signature_t > &name_sig)
bool operator()(const nil &e) const
expr_type promote_primitive(const expr_type &et)
const int void_function_argument_origin
void generate_expression(const expression &e, std::ostream &o)
base_expr_type base_type_
size_t get_num_dims(const std::string &name) const
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
std::ostream & operator<<(std::ostream &o, const expr_type &et)
std::pair< expr_type, std::vector< expr_type > > function_signature_t
std::pair< std::vector< var_decl >, std::vector< statement > > derived_decl_
std::string operator()(const nil &x) const
boost::variant< boost::recursive_wrapper< std::string >, boost::recursive_wrapper< expression > > printable_t
bool has_non_param_var(const expression &e, const variable_map &var_map)
const int void_function_argument_origin_lp
base_expr_type base_type_
bool is_data_origin(const var_origin &vo)
expr_type infer_type_indexing(const base_expr_type &expr_base_type, size_t num_expr_dims, size_t num_index_dims)
bool operator()(const nil &st) const
std::string integration_function_name_
std::vector< expression > conditions_
std::string system_function_name_
std::vector< arg_decl > arg_decls_
std::set< std::string > key_set() const
bool has_var(const expression &e, const variable_map &var_map)
int_literal & operator=(const int_literal &il)
const std::string var_name_
bool operator==(const expr_type &et) const
bool operator>=(const expr_type &et) const
std::vector< expression > dims_
bool has_ccdf_suffix(const std::string &name)
base_var_decl base_variable_declaration()
expr_type operator()(const nil &e) const
std::vector< function_decl_def > decl_defs_
bool operator>(const expr_type &et) const
void add_ternary(const ::std::string &name)
double_literal & operator=(const double_literal &dl)
std::string strip_prob_fun_suffix(const std::string &dist_fun)
std::vector< expression > args_
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
std::ostream & write_base_expr_type(std::ostream &o, base_expr_type type)
bool operator()(const nil &st) const
void set_user_defined(const std::pair< std::string, function_signature_t > &name_sig)
cholesky_factor_var_decl()
bool is_user_defined(const std::string &name, const std::vector< expression > &args)
returns_type_vis(const expr_type &return_type, std::ostream &error_msgs)
bool is_primitive_double() const
std::vector< std::vector< expression > > dimss_
base_expr_type get_base_type(const std::string &name) const
Placeholder struct for boost::variant default ctors.
std::map< std::string, range_t > map_
expression & operator/=(const expression &rhs)
unary_op(char op, expression const &subject)
const int transformed_data_origin
bool operator()(const nil &x) const
std::vector< printable > printables_
std::ostream & error_msgs_
std::vector< var_decl > parameter_decl_