conjure_cp_core/ast/
mod.rs

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