1 #ifndef STAN_LANG_AST_HPP 2 #define STAN_LANG_AST_HPP 4 #include <boost/variant/recursive_variant.hpp> 105 expr_type(
const base_expr_type base_type);
106 expr_type(
const base_expr_type base_type,
108 bool operator==(
const expr_type& et)
const;
109 bool operator!=(
const expr_type& et)
const;
110 bool operator<(
const expr_type& et)
const;
111 bool operator<=(
const expr_type& et)
const;
112 bool operator>(
const expr_type& et)
const;
113 bool operator>=(
const expr_type& et)
const;
114 bool is_primitive()
const;
115 bool is_primitive_int()
const;
116 bool is_primitive_double()
const;
117 bool is_ill_formed()
const;
118 bool is_void()
const;
119 base_expr_type type()
const;
120 size_t num_dims()
const;
136 static void reset_sigs();
137 void set_user_defined(
const std::pair<std::string, function_signature_t>&
139 bool is_user_defined(
const std::pair<std::string, function_signature_t>&
141 void add(
const std::string& name,
143 const std::vector<expr_type>& arg_types);
144 void add(
const std::string& name,
146 void add(
const std::string& name,
149 void add(
const std::string& name,
153 void add(
const std::string& name,
158 void add(
const std::string& name,
164 void add(
const std::string& name,
171 void add(
const std::string& name,
179 void add(
const std::string& name,
188 void add_nullary(const::std::string& name);
189 void add_unary(const::std::string& name);
190 void add_unary_vectorized(const::std::string& name);
191 void add_binary(const::std::string& name);
192 void add_ternary(const::std::string& name);
193 void add_quaternary(const::std::string& name);
194 int num_promotions(
const std::vector<expr_type>& call_args,
195 const std::vector<expr_type>& sig_args);
196 expr_type get_result_type(
const std::string& name,
197 const std::vector<expr_type>& args,
198 std::ostream& error_msgs,
199 bool sampling_error_style =
false);
200 int get_signature_matches(
const std::string& name,
201 const std::vector<expr_type>& args,
202 function_signature_t& signature);
204 const function_signature_t& sig);
205 bool has_user_defined_key(
const std::string& name)
const;
206 std::set<std::string> key_set()
const;
207 bool has_key(
const std::string& key)
const;
208 bool discrete_first_arg(
const std::string& name)
const;
213 std::map<std::string, std::vector<function_signature_t> > sigs_map_;
214 std::set<std::pair<std::string, function_signature_t> > user_defined_set_;
222 statements(
const std::vector<var_decl>& local_decl,
223 const std::vector<statement>& stmts);
251 typedef boost::variant<boost::recursive_wrapper<nil>,
252 boost::recursive_wrapper<int_literal>,
253 boost::recursive_wrapper<double_literal>,
254 boost::recursive_wrapper<array_literal>,
255 boost::recursive_wrapper<variable>,
256 boost::recursive_wrapper<integrate_ode>,
257 boost::recursive_wrapper<integrate_ode_control>,
258 boost::recursive_wrapper<fun>,
259 boost::recursive_wrapper<index_op>,
260 boost::recursive_wrapper<index_op_sliced>,
261 boost::recursive_wrapper<conditional_op>,
262 boost::recursive_wrapper<binary_op>,
263 boost::recursive_wrapper<unary_op> >
298 typedef boost::variant<boost::recursive_wrapper<std::string>,
299 boost::recursive_wrapper<expression> >
312 bool operator()(
const nil& x)
const;
316 bool operator()(
const variable& x)
const;
319 bool operator()(
const fun& x)
const;
320 bool operator()(
const index_op& x)
const;
323 bool operator()(
const binary_op& x)
const;
324 bool operator()(
const unary_op& x)
const;
334 std::vector<expression>
const& dims);
369 void set_type(
const base_expr_type& base_type,
384 const std::string& system_function_name,
407 const std::string& system_function_name,
425 fun(std::string
const& name,
426 std::vector<expression>
const& args);
430 size_t total_dims(
const std::vector<std::vector<expression> >& dimss);
433 size_t num_expr_dims,
434 size_t num_index_dims);
437 size_t num_index_dims);
442 std::vector<std::vector<expression> >
dimss_;
447 const std::vector<std::vector<expression> >& dimss);
471 const std::string& op,
489 bool has_low()
const;
490 bool has_high()
const;
525 typedef boost::variant<boost::recursive_wrapper<uni_idx>,
526 boost::recursive_wrapper<multi_idx>,
527 boost::recursive_wrapper<omni_idx>,
528 boost::recursive_wrapper<lb_idx>,
529 boost::recursive_wrapper<ub_idx>,
530 boost::recursive_wrapper<lub_idx> >
547 bool operator()(
const uni_idx& i)
const;
548 bool operator()(
const multi_idx& i)
const;
549 bool operator()(
const omni_idx& i)
const;
550 bool operator()(
const lb_idx& i)
const;
551 bool operator()(
const ub_idx& i)
const;
552 bool operator()(
const lub_idx& i)
const;
564 const std::vector<idx>& idxs);
576 const std::vector<expression>& dims,
577 const base_expr_type& base_type);
579 const std::vector<expression>& dims,
580 const base_expr_type& base_type,
585 typedef std::pair<base_var_decl, var_origin>
range_t;
587 bool exists(
const std::string& name)
const;
589 base_expr_type get_base_type(
const std::string& name)
const;
590 size_t get_num_dims(
const std::string& name)
const;
591 var_origin get_origin(
const std::string& name)
const;
592 void add(
const std::string& name,
594 const var_origin& vo);
595 void remove(
const std::string& name);
597 std::map<std::string, range_t>
map_;
604 std::string
const& name,
605 std::vector<expression>
const& dims,
614 std::string
const& name,
615 std::vector<expression>
const& dims,
623 std::string
const& name,
624 std::vector<expression>
const& dims);
631 std::string
const& name,
632 std::vector<expression>
const& dims);
639 std::string
const& name,
640 std::vector<expression>
const& dims);
647 std::string
const& name,
648 std::vector<expression>
const& dims);
657 std::string
const& name,
658 std::vector<expression>
const& dims,
668 std::string
const& name,
669 std::vector<expression>
const& dims,
681 std::string
const& name,
682 std::vector<expression>
const& dims,
692 std::string
const& name,
693 std::vector<expression>
const& dims);
700 std::string
const& name,
701 std::vector<expression>
const& dims);
708 std::string
const& name,
709 std::vector<expression>
const& dims);
717 std::string
const& name,
718 std::vector<expression>
const& dims);
721 struct name_vis :
public boost::static_visitor<std::string> {
723 std::string operator()(
const nil& x)
const;
740 :
public boost::static_visitor<base_var_decl> {
759 :
public boost::static_visitor<std::vector<expression> > {
761 std::vector<expression> operator()(
const nil& x)
const;
762 std::vector<expression> operator()(
const int_var_decl& x)
const;
770 std::vector<expression> operator()(
772 std::vector<expression> operator()(
780 :
public boost::static_visitor<bool> {
782 bool operator()(
const nil& x)
const;
799 :
public boost::static_visitor<expression> {
818 typedef boost::variant<boost::recursive_wrapper<nil>,
819 boost::recursive_wrapper<int_var_decl>,
820 boost::recursive_wrapper<double_var_decl>,
821 boost::recursive_wrapper<vector_var_decl>,
822 boost::recursive_wrapper<row_vector_var_decl>,
823 boost::recursive_wrapper<matrix_var_decl>,
824 boost::recursive_wrapper<simplex_var_decl>,
825 boost::recursive_wrapper<unit_vector_var_decl>,
826 boost::recursive_wrapper<ordered_var_decl>,
827 boost::recursive_wrapper<positive_ordered_var_decl>,
828 boost::recursive_wrapper<cholesky_factor_var_decl>,
829 boost::recursive_wrapper<cholesky_corr_var_decl>,
830 boost::recursive_wrapper<cov_matrix_var_decl>,
831 boost::recursive_wrapper<corr_matrix_var_decl> >
854 std::string name()
const;
856 std::vector<expression> dims()
const;
857 bool has_def()
const;
862 typedef boost::variant<boost::recursive_wrapper<nil>,
863 boost::recursive_wrapper<assignment>,
864 boost::recursive_wrapper<assgn>,
865 boost::recursive_wrapper<sample>,
866 boost::recursive_wrapper<increment_log_prob_statement>,
867 boost::recursive_wrapper<expression>,
868 boost::recursive_wrapper<statements>,
869 boost::recursive_wrapper<for_statement>,
870 boost::recursive_wrapper<conditional_statement>,
871 boost::recursive_wrapper<while_statement>,
872 boost::recursive_wrapper<break_continue_statement>,
873 boost::recursive_wrapper<print_statement>,
874 boost::recursive_wrapper<reject_statement>,
875 boost::recursive_wrapper<return_statement>,
876 boost::recursive_wrapper<no_op_statement> >
900 bool is_no_op_statement()
const;
904 bool operator()(
const nil& st)
const;
906 bool operator()(
const assgn& st)
const;
907 bool operator()(
const sample& st)
const;
926 std::ostream& error_msgs);
927 bool operator()(
const nil& st)
const;
929 bool operator()(
const assgn& st)
const;
930 bool operator()(
const sample& st)
const;
946 std::ostream& error_msgs);
1014 const std::string& name);
1021 const std::string& name,
1022 const std::vector<arg_decl>& arg_decls,
1034 const std::vector<function_decl_def>& decl_defs);
1043 std::pair<std::vector<var_decl>, std::vector<statement> >
1046 std::pair<std::vector<var_decl>, std::vector<statement> >
1049 std::pair<std::vector<var_decl>, std::vector<statement> >
1054 const std::vector<var_decl>& data_decl,
1055 const std::pair<std::vector<var_decl>,
1056 std::vector<statement> >& derived_data_decl,
1057 const std::vector<var_decl>& parameter_decl,
1058 const std::pair<std::vector<var_decl>,
1059 std::vector<statement> >& derived_decl,
1061 const std::pair<std::vector<var_decl>,
1062 std::vector<statement> >& generated_decl);
1073 bool is_ill_formed()
const;
1074 bool is_discrete()
const;
1090 bool operator()(
const nil& e)
const;
1094 bool operator()(
const variable& e)
const;
1095 bool operator()(
const fun& e)
const;
1098 bool operator()(
const index_op& e)
const;
1101 bool operator()(
const binary_op& e)
const;
1102 bool operator()(
const unary_op& e)
const;
1110 assgn(
const variable& lhs_var,
const std::vector<idx>& idxs,
1112 bool lhs_var_occurs_on_rhs()
const;
1125 const std::vector<idx>& idxs);
1136 const std::vector<expression>& args);
1139 const std::vector<expression>& params);
1145 bool operator()(
const nil& e)
const;
1149 bool operator()(
const variable& e)
const;
1152 bool operator()(
const fun& e)
const;
1153 bool operator()(
const index_op& e)
const;
1156 bool operator()(
const binary_op& e)
const;
1157 bool operator()(
const unary_op& e)
const;
1182 bool operator()(
const nil& e)
const;
1186 bool operator()(
const variable& e)
const;
1189 bool operator()(
const fun& e)
const;
1190 bool operator()(
const index_op& e)
const;
1193 bool operator()(
const binary_op& e)
const;
1194 bool operator()(
const unary_op& e)
const;
1217 const std::string& failure_message,
1218 std::ostream& error_msgs);
1221 bool ends_with(
const std::string& suffix,
1222 const std::string& s);
1225 std::string
get_cdf(
const std::string& dist_name);
1227 std::string
get_ccdf(
const std::string& dist_name);
1229 std::string
get_prob_fun(
const std::string& dist_name);
std::string strip_ccdf_suffix(const std::string &dist_fun)
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_
bool is_fun_origin(const var_origin &vo)
std::vector< expression > dims_
std::string original_name_
std::string strip_cdf_suffix(const std::string &dist_fun)
const int parameter_origin
void sample(stan::mcmc::base_mcmc *sampler, int num_warmup, int num_samples, int num_thin, int refresh, bool save, stan::services::sample::mcmc_writer< Model, SampleRecorder, DiagnosticRecorder, MessageRecorder > &mcmc_writer, stan::mcmc::sample &init_s, Model &model, RNG &base_rng, const std::string &prefix, const std::string &suffix, std::ostream &o, StartTransitionCallback &callback, interface_callbacks::writer::base_writer &info_writer, interface_callbacks::writer::base_writer &error_writer)
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)
std::string get_prob_fun(const std::string &dist_name)
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_
bool has_prob_fun_suffix(const std::string &name)
std::string get_cdf(const std::string &dist_name)
std::vector< statement > bodies_
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)
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_
const int transformed_parameter_origin
std::string system_function_name_
expression max_num_steps_
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_
const variable_map & var_map_
void print_var_origin(std::ostream &o, const var_origin &vo)
bool is_nil(const expression &e)
const int void_function_argument_origin_rng
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 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)
boost::variant< boost::recursive_wrapper< nil >, boost::recursive_wrapper< assignment >, boost::recursive_wrapper< assgn >, boost::recursive_wrapper< sample >, boost::recursive_wrapper< increment_log_prob_statement >, boost::recursive_wrapper< expression >, boost::recursive_wrapper< statements >, boost::recursive_wrapper< for_statement >, boost::recursive_wrapper< conditional_statement >, boost::recursive_wrapper< while_statement >, boost::recursive_wrapper< break_continue_statement >, boost::recursive_wrapper< print_statement >, boost::recursive_wrapper< reject_statement >, boost::recursive_wrapper< return_statement >, boost::recursive_wrapper< no_op_statement > > statement_t
bool is_user_defined_prob_function(const std::string &name, const expression &variate, const std::vector< expression > ¶ms)
std::vector< expression > args_
expr_type indexed_type(const expression &e, const std::vector< idx > &idxs)
Return the type of the expression indexed by the generalized index sequence.
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_
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_
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)
Returns true if the specified expression contains a variable that is defined as a transformed paramet...
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)
std::string integration_function_name_
std::vector< expression > conditions_
std::string system_function_name_
std::vector< arg_decl > arg_decls_
bool has_var(const expression &e, const variable_map &var_map)
Returns true if the specified expression contains a variable that is defined as a parameter...
const std::string var_name_
std::vector< expression > dims_
bool has_ccdf_suffix(const std::string &name)
std::vector< function_decl_def > decl_defs_
bool is_defined(const std::string &function_name, const std::vector< expr_type > &arg_types)
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 is_user_defined(const std::string &name, const std::vector< expression > &args)
std::vector< std::vector< expression > > dimss_
Placeholder struct for boost::variant default ctors.
std::map< std::string, range_t > map_
const int transformed_data_origin
std::vector< printable > printables_
std::ostream & error_msgs_
std::vector< var_decl > parameter_decl_