conjure_core/ast/
mod.rs

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