conjure_core/ast/
mod.rs

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