Skip to main content

conjure_cp_core/ast/
mod.rs

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