1 #ifndef STAN_LANG_AST_BLOCK_VAR_TYPE_DEF_HPP
2 #define STAN_LANG_AST_BLOCK_VAR_TYPE_DEF_HPP
3 
4 #include <stan/lang/ast.hpp>
5 #include <boost/variant/apply_visitor.hpp>
6 #include <boost/variant/get.hpp>
7 
8 #include <ostream>
9 #include <string>
10 #include <vector>
11 
12 namespace stan {
13 namespace lang {
14 
block_var_type()15 block_var_type::block_var_type() : var_type_(ill_formed_type()) {}
16 
block_var_type(const block_var_type & x)17 block_var_type::block_var_type(const block_var_type &x)
18     : var_type_(x.var_type_) {}
19 
block_var_type(const block_t & x)20 block_var_type::block_var_type(const block_t &x) : var_type_(x) {}
21 
block_var_type(const ill_formed_type & x)22 block_var_type::block_var_type(const ill_formed_type &x) : var_type_(x) {}
23 
block_var_type(const cholesky_factor_corr_block_type & x)24 block_var_type::block_var_type(const cholesky_factor_corr_block_type &x)
25     : var_type_(x) {}
26 
block_var_type(const cholesky_factor_cov_block_type & x)27 block_var_type::block_var_type(const cholesky_factor_cov_block_type &x)
28     : var_type_(x) {}
29 
block_var_type(const corr_matrix_block_type & x)30 block_var_type::block_var_type(const corr_matrix_block_type &x)
31     : var_type_(x) {}
32 
block_var_type(const cov_matrix_block_type & x)33 block_var_type::block_var_type(const cov_matrix_block_type &x) : var_type_(x) {}
34 
block_var_type(const double_block_type & x)35 block_var_type::block_var_type(const double_block_type &x) : var_type_(x) {}
36 
block_var_type(const int_block_type & x)37 block_var_type::block_var_type(const int_block_type &x) : var_type_(x) {}
38 
block_var_type(const matrix_block_type & x)39 block_var_type::block_var_type(const matrix_block_type &x) : var_type_(x) {}
40 
block_var_type(const ordered_block_type & x)41 block_var_type::block_var_type(const ordered_block_type &x) : var_type_(x) {}
42 
block_var_type(const positive_ordered_block_type & x)43 block_var_type::block_var_type(const positive_ordered_block_type &x)
44     : var_type_(x) {}
45 
block_var_type(const row_vector_block_type & x)46 block_var_type::block_var_type(const row_vector_block_type &x) : var_type_(x) {}
47 
block_var_type(const simplex_block_type & x)48 block_var_type::block_var_type(const simplex_block_type &x) : var_type_(x) {}
49 
block_var_type(const unit_vector_block_type & x)50 block_var_type::block_var_type(const unit_vector_block_type &x)
51     : var_type_(x) {}
52 
block_var_type(const vector_block_type & x)53 block_var_type::block_var_type(const vector_block_type &x) : var_type_(x) {}
54 
block_var_type(const block_array_type & x)55 block_var_type::block_var_type(const block_array_type &x) : var_type_(x) {}
56 
arg1() const57 expression block_var_type::arg1() const {
58   var_type_arg1_vis vis;
59   return boost::apply_visitor(vis, var_type_);
60 }
61 
arg2() const62 expression block_var_type::arg2() const {
63   var_type_arg2_vis vis;
64   return boost::apply_visitor(vis, var_type_);
65 }
66 
array_contains() const67 block_var_type block_var_type::array_contains() const {
68   if (boost::get<stan::lang::block_array_type>(&var_type_)) {
69     block_array_type vt = boost::get<stan::lang::block_array_type>(var_type_);
70     return vt.contains();
71   }
72   return ill_formed_type();
73 }
74 
array_dims() const75 int block_var_type::array_dims() const {
76   if (boost::get<stan::lang::block_array_type>(&var_type_)) {
77     block_array_type vt = boost::get<stan::lang::block_array_type>(var_type_);
78     return vt.dims();
79   }
80   return 0;
81 }
82 
array_element_type() const83 block_var_type block_var_type::array_element_type() const {
84   if (boost::get<stan::lang::block_array_type>(&var_type_)) {
85     block_array_type vt = boost::get<stan::lang::block_array_type>(var_type_);
86     return vt.element_type();
87   }
88   return ill_formed_type();
89 }
90 
array_len() const91 expression block_var_type::array_len() const {
92   if (boost::get<stan::lang::block_array_type>(&var_type_)) {
93     block_array_type vt = boost::get<stan::lang::block_array_type>(var_type_);
94     return vt.array_len();
95   }
96   return expression(nil());
97 }
98 
array_lens() const99 std::vector<expression> block_var_type::array_lens() const {
100   if (boost::get<stan::lang::block_array_type>(&var_type_)) {
101     block_array_type vt = boost::get<stan::lang::block_array_type>(var_type_);
102     return vt.array_lens();
103   }
104   return std::vector<expression>();
105 }
106 
bare_type() const107 bare_expr_type block_var_type::bare_type() const {
108   bare_type_vis vis;
109   return boost::apply_visitor(vis, var_type_);
110 }
111 
bounds() const112 range block_var_type::bounds() const {
113   block_type_bounds_vis vis;
114   return boost::apply_visitor(vis, var_type_);
115 }
116 
has_def_bounds() const117 bool block_var_type::has_def_bounds() const {
118   if (this->bounds().has_low() || this->bounds().has_high())
119     return true;
120   return false;
121 }
122 
ls() const123 offset_multiplier block_var_type::ls() const {
124   block_type_offset_multiplier_vis vis;
125   return boost::apply_visitor(vis, var_type_);
126 }
127 
has_def_offset_multiplier() const128 bool block_var_type::has_def_offset_multiplier() const {
129   if (this->ls().has_offset() || this->ls().has_multiplier())
130     return true;
131   return false;
132 }
133 
innermost_type() const134 block_var_type block_var_type::innermost_type() const {
135   if (boost::get<stan::lang::block_array_type>(&var_type_)) {
136     block_array_type vt = boost::get<stan::lang::block_array_type>(var_type_);
137     return vt.contains();
138   }
139   return var_type_;
140 }
141 
is_array_type() const142 bool block_var_type::is_array_type() const {
143   if (boost::get<stan::lang::block_array_type>(&var_type_))
144     return true;
145   return false;
146 }
147 
is_constrained() const148 bool block_var_type::is_constrained() const {
149   return has_def_bounds() || is_specialized();
150 }
151 
is_specialized() const152 bool block_var_type::is_specialized() const {
153   block_type_is_specialized_vis vis;
154   return boost::apply_visitor(vis, var_type_);
155 }
156 
name() const157 std::string block_var_type::name() const {
158   var_type_name_vis vis;
159   return boost::apply_visitor(vis, var_type_);
160 }
161 
num_dims() const162 int block_var_type::num_dims() const { return this->bare_type().num_dims(); }
163 
params_total() const164 expression block_var_type::params_total() const {
165   block_type_params_total_vis vis;
166   return boost::apply_visitor(vis, var_type_);
167 }
168 
operator <<(std::ostream & o,const block_var_type & var_type)169 std::ostream &operator<<(std::ostream &o, const block_var_type &var_type) {
170   write_block_var_type(o, var_type);
171   return o;
172 }
173 }  // namespace lang
174 }  // namespace stan
175 #endif
176