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