conjure_cp_core/ast/
mod.rs

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