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    BinaryAttr, Domain, DomainOpError, DomainPtr, FieldEntry, FieldEntryGround, FuncAttr,
34    GroundDomain, HasDomain, IntVal, JectivityAttr, MSetAttr, PartialityAttr, PartitionAttr, Range,
35    RelAttr, SequenceAttr, SetAttr, UnresolvedDomain,
36};
37pub use eval::eval_constant;
38pub use expressions::{Expression, discriminant_from_value, print_hash_stats};
39pub use literals::AbstractLiteral;
40pub use literals::Literal;
41pub use metadata::Metadata;
42pub use model::*;
43pub use moo::Moo;
44pub use name::Name;
45pub use partial_eval::run_partial_evaluator;
46pub use reference::Reference;
47pub use sat_encoding::SATIntEncoding;
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}