Skip to main content

conjure_cp_core/ast/
mod.rs

1pub mod abstract_comprehension;
2pub mod ac_operators;
3pub mod assertions;
4mod atom;
5pub mod categories;
6mod cnf_clause;
7pub mod comprehension;
8pub mod declaration;
9mod domains;
10pub mod eval;
11mod expressions;
12mod literals;
13pub mod matrix;
14mod metadata;
15mod model;
16mod name;
17pub mod pretty;
18pub mod records;
19mod reference;
20mod sat_encoding;
21pub mod serde;
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 symbol_table::{SymbolTable, SymbolTablePtr};
48pub use types::*;
49pub use variables::DecisionVariable;
50
51/// Creates a new matrix [`AbstractLiteral`] optionally with some index domain.
52///
53///  - `matrix![a,b,c]`
54///  - `matrix![a,b,c;my_domain]`
55///
56/// To create one from a (Rust) vector, use [`into_matrix!`].
57#[macro_export]
58macro_rules! matrix {
59    // cases copied from the std vec! macro
60    () => (
61        $crate::into_matrix![]
62    );
63
64    (;$domain:expr) => (
65        $crate::into_matrix![;$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    ($($x:expr),*) => (
77        $crate::into_matrix![std::vec![$($x),*]]
78    );
79
80    ($($x:expr),*;$domain:expr) => (
81        $crate::into_matrix![std::vec![$($x),*];$domain]
82    );
83
84    ($($x:expr,)*) => (
85        $crate::into_matrix![std::vec![$($x),*]]
86    );
87
88    ($($x:expr,)*;$domain:expr) => (
89        $crate::into_matrix![std::vec![$($x),*];$domain]
90    )
91}
92
93/// Creates a new matrix [`AbstractLiteral`] from some [`Vec`], optionally with some index domain.
94///
95///  - `matrix![my_vec]`
96///  - `matrix![my_vec;my_domain]`
97///
98/// To create one from a list of elements, use [`matrix!`].
99#[macro_export]
100macro_rules! into_matrix {
101    () => (
102        $crate::into_matrix![std::vec::Vec::new()]
103    );
104
105    (;$domain:expr) => (
106        $crate::into_matrix![std::vec::Vec::new();$domain]
107    );
108    ($x:expr) => (
109        $crate::ast::AbstractLiteral::matrix_implied_indices($x)
110    );
111    ($x:expr;$domain:expr) => (
112        $crate::ast::AbstractLiteral::Matrix($x,$domain)
113    );
114}
115
116/// Creates a new matrix as an [`Expression`], optionally with some index domain.
117///
118/// For usage details, see [`matrix!`].
119///
120/// To create a matrix expression from a [`Vec`], use [`into_matrix_expr!`].
121#[macro_export]
122macro_rules! matrix_expr {
123    () => (
124        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![])
125    );
126
127    (;$domain:expr) => (
128        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![;$domain])
129    );
130
131
132    ($x:expr) => (
133        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![$x])
134    );
135    ($x:expr;$domain:expr) => (
136        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![;$domain])
137    );
138
139    ($($x:expr),+) => (
140        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![$($x),+])
141    );
142
143    ($($x:expr),+;$domain:expr) => (
144        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![$($x),+;$domain])
145    );
146
147    ($($x:expr,)+) => (
148        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![$($x),+])
149    );
150
151    ($($x:expr,)+;$domain:expr) => (
152        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::matrix![$($x),+;$domain])
153    )
154}
155
156/// Creates a new matrix as an [`Expression`] from a (Rust) vector, optionally with some index
157/// domain.
158///
159/// For usage details, see [`into_matrix!`].
160///
161/// To create a matrix expression from a list of elements, use [`matrix_expr!`].
162#[macro_export]
163macro_rules! into_matrix_expr {
164    () => (
165        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::into_matrix![])
166    );
167
168    (;$domain:expr) => (
169        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::into_matrix![;$domain])
170    );
171    ($x:expr) => (
172        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::into_matrix![$x])
173    );
174    ($x:expr;$domain:expr) => (
175        $crate::ast::Expression::AbstractLiteral($crate::ast::Metadata::new(),$crate::into_matrix![$x;$domain])
176    );
177}