conjure_core/ast/
mod.rs

1pub mod pretty;
2pub mod serde;
3
4pub mod ac_operators;
5mod atom;
6pub mod comprehension;
7mod declaration;
8mod domains;
9mod expressions;
10mod literals;
11pub mod matrix;
12mod model;
13mod name;
14pub mod records;
15mod submodel;
16mod symbol_table;
17mod types;
18mod variables;
19
20pub use atom::Atom;
21pub use declaration::*;
22pub use domains::Domain;
23pub use domains::DomainOpError;
24pub use domains::Range;
25pub use domains::SetAttr;
26pub use expressions::Expression;
27pub use literals::AbstractLiteral;
28pub use literals::Literal;
29pub use model::*;
30pub use name::Name;
31pub use records::RecordEntry;
32pub use submodel::SubModel;
33pub use symbol_table::SymbolTable;
34pub use types::*;
35pub use variables::DecisionVariable;
36
37/// Creates a new matrix [`AbstractLiteral`] optionally with some index domain.
38///
39///  - `matrix![a,b,c]`
40///  - `matrix![a,b,c;my_domain]`
41///
42/// To create one from a (Rust) vector, use [`into_matrix!`].
43#[macro_export]
44macro_rules! matrix {
45    // cases copied from the std vec! macro
46    () => (
47        $crate::into_matrix![]
48    );
49
50    (;$domain:expr) => (
51        $crate::into_matrix![;$domain]
52    );
53
54    ($x:expr) => (
55        $crate::into_matrix![std::vec![$x]]
56    );
57
58    ($x:expr;$domain:expr) => (
59        $crate::into_matrix![std::vec![$x];$domain]
60    );
61
62    ($($x:expr),*) => (
63        $crate::into_matrix![std::vec![$($x),*]]
64    );
65
66    ($($x:expr),*;$domain:expr) => (
67        $crate::into_matrix![std::vec![$($x),*];$domain]
68    );
69
70    ($($x:expr,)*) => (
71        $crate::into_matrix![std::vec![$($x),*]]
72    );
73
74    ($($x:expr,)*;$domain:expr) => (
75        $crate::into_matrix![std::vec![$($x),*];domain]
76    )
77}
78
79/// Creates a new matrix [`AbstractLiteral`] from some [`Vec`], optionally with some index domain.
80///
81///  - `matrix![my_vec]`
82///  - `matrix![my_vec;my_domain]`
83///
84/// To create one from a list of elements, use [`matrix!`].
85#[macro_export]
86macro_rules! into_matrix {
87    () => (
88        $crate::into_matrix![std::vec::Vec::new()]
89    );
90
91    (;$domain:expr) => (
92        $crate::into_matrix![std::vec::Vec::new();$domain]
93    );
94    ($x:expr) => (
95        $crate::ast::AbstractLiteral::matrix_implied_indices($x)
96    );
97    ($x:expr;$domain:expr) => (
98        $crate::ast::AbstractLiteral::Matrix($x,::std::boxed::Box::new($domain))
99    );
100}
101
102/// Creates a new matrix as an [`Expression`], optionally with some index domain.
103///
104/// For usage details, see [`matrix!`].
105///
106/// To create a matrix expression from a [`Vec`], use [`into_matrix_expr!`].
107#[macro_export]
108macro_rules! matrix_expr {
109    () => (
110        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![])
111    );
112
113    (;$domain:expr) => (
114        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![;$domain])
115    );
116
117
118    ($x:expr) => (
119        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![$x])
120    );
121    ($x:expr;$domain:expr) => (
122        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![;$domain])
123    );
124
125    ($($x:expr),+) => (
126        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![$($x),+])
127    );
128
129    ($($x:expr),+;$domain:expr) => (
130        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![$($x),+;$domain])
131    );
132
133    ($($x:expr,)+) => (
134        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![$($x),+])
135    );
136
137    ($($x:expr,)+;$domain:expr) => (
138        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::matrix![$($x),+;$domain])
139    )
140}
141
142/// Creates a new matrix as an [`Expression`] from a (Rust) vector, optionally with some index
143/// domain.
144///
145/// For usage details, see [`into_matrix!`].
146///
147/// To create a matrix expression from a list of elements, use [`matrix_expr!`].
148#[macro_export]
149macro_rules! into_matrix_expr {
150    () => (
151        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::into_matrix![])
152    );
153
154    (;$domain:expr) => (
155        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::into_matrix![;$domain])
156    );
157    ($x:expr) => (
158        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::into_matrix![$x])
159    );
160    ($x:expr;$domain:expr) => (
161        $crate::ast::Expression::AbstractLiteral($crate::metadata::Metadata::new(),$crate::into_matrix![$x;$domain])
162    );
163}