1use super::argument_expression::ArgumentExpression;
2use super::condition::{Condition, IfThenElse};
3use super::element_expression::ElementExpression;
4use super::reference_expression::ReferenceExpression;
5use super::set_reduce_expression::{SetReduceExpression, SetReduceOperator};
6use super::table_expression::TableExpression;
7use super::vector_expression::VectorExpression;
8use crate::state::{ElementResourceVariable, ElementVariable, SetVariable, StateInterface};
9use crate::state_functions::{StateFunctionCache, StateFunctions};
10use crate::table_data::{Table1DHandle, Table2DHandle, Table3DHandle, TableHandle};
11use crate::table_registry::TableRegistry;
12use crate::variable_type::{Element, Set};
13use std::ops;
14
15#[derive(Debug, PartialEq, Clone)]
17pub enum SetExpression {
18 Reference(ReferenceExpression<Set>),
20 StateFunction(usize),
22 Complement(Box<SetExpression>),
24 SetOperation(SetOperator, Box<SetExpression>, Box<SetExpression>),
26 SetElementOperation(SetElementOperator, ElementExpression, Box<SetExpression>),
28 Reduce(SetReduceExpression),
30 FromVector(usize, Box<VectorExpression>),
32 If(Box<Condition>, Box<SetExpression>, Box<SetExpression>),
34}
35
36#[derive(Debug, PartialEq, Eq, Clone)]
38pub enum SetOperator {
39 Union,
41 Difference,
43 Intersection,
45}
46
47#[derive(Debug, PartialEq, Eq, Clone)]
49pub enum SetElementOperator {
50 Add,
52 Remove,
54}
55
56impl Default for SetExpression {
57 #[inline]
58 fn default() -> Self {
59 SetExpression::Reference(ReferenceExpression::Constant(Set::default()))
60 }
61}
62
63impl From<Set> for SetExpression {
64 #[inline]
65 fn from(s: Set) -> Self {
66 SetExpression::Reference(ReferenceExpression::Constant(s))
67 }
68}
69
70impl From<SetVariable> for SetExpression {
71 #[inline]
72 fn from(v: SetVariable) -> Self {
73 SetExpression::Reference(ReferenceExpression::Variable(v.id()))
74 }
75}
76
77impl ops::Not for SetExpression {
78 type Output = SetExpression;
79
80 #[inline]
104 fn not(self) -> Self::Output {
105 SetExpression::Complement(Box::new(self))
106 }
107}
108
109impl ops::Not for SetVariable {
110 type Output = SetExpression;
111
112 #[inline]
136 fn not(self) -> Self::Output {
137 SetExpression::Complement(Box::new(SetExpression::from(self)))
138 }
139}
140
141impl ops::BitOr for SetExpression {
142 type Output = SetExpression;
143
144 #[inline]
170 fn bitor(self, rhs: Self) -> Self::Output {
171 SetExpression::SetOperation(SetOperator::Union, Box::new(self), Box::new(rhs))
172 }
173}
174
175impl ops::Sub for SetExpression {
176 type Output = SetExpression;
177
178 #[inline]
204 fn sub(self, rhs: Self) -> Self::Output {
205 SetExpression::SetOperation(SetOperator::Difference, Box::new(self), Box::new(rhs))
206 }
207}
208
209impl ops::BitAnd for SetExpression {
210 type Output = SetExpression;
211
212 #[inline]
238 fn bitand(self, rhs: Self) -> Self::Output {
239 SetExpression::SetOperation(SetOperator::Intersection, Box::new(self), Box::new(rhs))
240 }
241}
242
243pub trait SetElementOperation<Rhs> {
271 fn add(self, rhs: Rhs) -> SetExpression;
273 fn remove(self, rhs: Rhs) -> SetExpression;
275}
276
277impl Table1DHandle<Set> {
278 #[inline]
303 pub fn element<T>(&self, x: T) -> SetExpression
304 where
305 ElementExpression: std::convert::From<T>,
306 {
307 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table1D(
308 self.id(),
309 ElementExpression::from(x),
310 )))
311 }
312
313 #[inline]
341 pub fn union<T>(&self, capacity: usize, x: T) -> SetExpression
342 where
343 ArgumentExpression: From<T>,
344 {
345 SetExpression::Reduce(SetReduceExpression::Table1D(
346 SetReduceOperator::Union,
347 capacity,
348 self.id(),
349 Box::new(ArgumentExpression::from(x)),
350 ))
351 }
352
353 #[inline]
381 pub fn intersection<T>(&self, capacity: usize, x: T) -> SetExpression
382 where
383 ArgumentExpression: From<T>,
384 {
385 SetExpression::Reduce(SetReduceExpression::Table1D(
386 SetReduceOperator::Intersection,
387 capacity,
388 self.id(),
389 Box::new(ArgumentExpression::from(x)),
390 ))
391 }
392
393 #[inline]
420 pub fn symmetric_difference<T>(&self, capacity: usize, x: T) -> SetExpression
421 where
422 ArgumentExpression: From<T>,
423 {
424 SetExpression::Reduce(SetReduceExpression::Table1D(
425 SetReduceOperator::SymmetricDifference,
426 capacity,
427 self.id(),
428 Box::new(ArgumentExpression::from(x)),
429 ))
430 }
431}
432
433impl Table2DHandle<Set> {
434 #[inline]
459 pub fn element<T, U>(&self, x: T, y: U) -> SetExpression
460 where
461 ElementExpression: std::convert::From<T>,
462 ElementExpression: std::convert::From<U>,
463 {
464 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table2D(
465 self.id(),
466 ElementExpression::from(x),
467 ElementExpression::from(y),
468 )))
469 }
470
471 #[inline]
506 pub fn union<T, U>(&self, capacity: usize, x: T, y: U) -> SetExpression
507 where
508 ArgumentExpression: From<T>,
509 ArgumentExpression: From<U>,
510 {
511 SetExpression::Reduce(SetReduceExpression::Table2D(
512 SetReduceOperator::Union,
513 capacity,
514 self.id(),
515 Box::new(ArgumentExpression::from(x)),
516 Box::new(ArgumentExpression::from(y)),
517 ))
518 }
519
520 #[inline]
555 pub fn intersection<T, U>(&self, capacity: usize, x: T, y: U) -> SetExpression
556 where
557 ArgumentExpression: From<T>,
558 ArgumentExpression: From<U>,
559 {
560 SetExpression::Reduce(SetReduceExpression::Table2D(
561 SetReduceOperator::Intersection,
562 capacity,
563 self.id(),
564 Box::new(ArgumentExpression::from(x)),
565 Box::new(ArgumentExpression::from(y)),
566 ))
567 }
568
569 #[inline]
604 pub fn symmetric_difference<T, U>(&self, capacity: usize, x: T, y: U) -> SetExpression
605 where
606 ArgumentExpression: From<T>,
607 ArgumentExpression: From<U>,
608 {
609 SetExpression::Reduce(SetReduceExpression::Table2D(
610 SetReduceOperator::SymmetricDifference,
611 capacity,
612 self.id(),
613 Box::new(ArgumentExpression::from(x)),
614 Box::new(ArgumentExpression::from(y)),
615 ))
616 }
617}
618
619impl Table3DHandle<Set> {
620 #[inline]
651 pub fn element<T, U, V>(&self, x: T, y: U, z: V) -> SetExpression
652 where
653 ElementExpression: std::convert::From<T>,
654 ElementExpression: std::convert::From<U>,
655 ElementExpression: std::convert::From<V>,
656 {
657 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table3D(
658 self.id(),
659 ElementExpression::from(x),
660 ElementExpression::from(y),
661 ElementExpression::from(z),
662 )))
663 }
664
665 #[inline]
708 pub fn union<T, U, V>(&self, capacity: usize, x: T, y: U, z: V) -> SetExpression
709 where
710 ArgumentExpression: From<T>,
711 ArgumentExpression: From<U>,
712 ArgumentExpression: From<V>,
713 {
714 SetExpression::Reduce(SetReduceExpression::Table3D(
715 SetReduceOperator::Union,
716 capacity,
717 self.id(),
718 Box::new(ArgumentExpression::from(x)),
719 Box::new(ArgumentExpression::from(y)),
720 Box::new(ArgumentExpression::from(z)),
721 ))
722 }
723
724 #[inline]
767 pub fn intersection<T, U, V>(&self, capacity: usize, x: T, y: U, z: V) -> SetExpression
768 where
769 ArgumentExpression: From<T>,
770 ArgumentExpression: From<U>,
771 ArgumentExpression: From<V>,
772 {
773 SetExpression::Reduce(SetReduceExpression::Table3D(
774 SetReduceOperator::Intersection,
775 capacity,
776 self.id(),
777 Box::new(ArgumentExpression::from(x)),
778 Box::new(ArgumentExpression::from(y)),
779 Box::new(ArgumentExpression::from(z)),
780 ))
781 }
782
783 #[inline]
826 pub fn symmetric_difference<T, U, V>(&self, capacity: usize, x: T, y: U, z: V) -> SetExpression
827 where
828 ArgumentExpression: From<T>,
829 ArgumentExpression: From<U>,
830 ArgumentExpression: From<V>,
831 {
832 SetExpression::Reduce(SetReduceExpression::Table3D(
833 SetReduceOperator::SymmetricDifference,
834 capacity,
835 self.id(),
836 Box::new(ArgumentExpression::from(x)),
837 Box::new(ArgumentExpression::from(y)),
838 Box::new(ArgumentExpression::from(z)),
839 ))
840 }
841}
842
843impl TableHandle<Set> {
844 #[inline]
879 pub fn element<T>(&self, indices: Vec<T>) -> SetExpression
880 where
881 ElementExpression: std::convert::From<T>,
882 {
883 let indices = indices.into_iter().map(ElementExpression::from).collect();
884 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table(
885 self.id(),
886 indices,
887 )))
888 }
889
890 #[inline]
944 pub fn union<T>(&self, capacity: usize, indices: Vec<T>) -> SetExpression
945 where
946 ArgumentExpression: From<T>,
947 {
948 let indices = indices.into_iter().map(ArgumentExpression::from).collect();
949 SetExpression::Reduce(SetReduceExpression::Table(
950 SetReduceOperator::Union,
951 capacity,
952 self.id(),
953 indices,
954 ))
955 }
956
957 #[inline]
1011 pub fn intersection<T>(&self, capacity: usize, indices: Vec<T>) -> SetExpression
1012 where
1013 ArgumentExpression: From<T>,
1014 {
1015 let indices = indices.into_iter().map(ArgumentExpression::from).collect();
1016 SetExpression::Reduce(SetReduceExpression::Table(
1017 SetReduceOperator::Intersection,
1018 capacity,
1019 self.id(),
1020 indices,
1021 ))
1022 }
1023
1024 #[inline]
1078 pub fn symmetric_difference<T>(&self, capacity: usize, indices: Vec<T>) -> SetExpression
1079 where
1080 ArgumentExpression: From<T>,
1081 {
1082 let indices = indices.into_iter().map(ArgumentExpression::from).collect();
1083 SetExpression::Reduce(SetReduceExpression::Table(
1084 SetReduceOperator::SymmetricDifference,
1085 capacity,
1086 self.id(),
1087 indices,
1088 ))
1089 }
1090}
1091
1092impl IfThenElse<SetExpression> for Condition {
1093 #[inline]
1094 fn if_then_else<U, V>(self, lhs: U, rhs: V) -> SetExpression
1095 where
1096 SetExpression: From<U> + From<V>,
1097 {
1098 SetExpression::If(
1099 Box::new(self),
1100 Box::new(SetExpression::from(lhs)),
1101 Box::new(SetExpression::from(rhs)),
1102 )
1103 }
1104}
1105
1106macro_rules! impl_set_ops {
1107 ($T:ty,$U:ty) => {
1108 impl ops::BitOr<$U> for $T {
1109 type Output = SetExpression;
1110
1111 #[inline]
1113 fn bitor(self, rhs: $U) -> SetExpression {
1114 SetExpression::from(self) | SetExpression::from(rhs)
1115 }
1116 }
1117
1118 impl ops::Sub<$U> for $T {
1119 type Output = SetExpression;
1120
1121 #[inline]
1123 fn sub(self, rhs: $U) -> SetExpression {
1124 SetExpression::from(self) - SetExpression::from(rhs)
1125 }
1126 }
1127
1128 impl ops::BitAnd<$U> for $T {
1129 type Output = SetExpression;
1130
1131 #[inline]
1133 fn bitand(self, rhs: $U) -> SetExpression {
1134 SetExpression::from(self) & SetExpression::from(rhs)
1135 }
1136 }
1137 };
1138}
1139
1140macro_rules! impl_set_element_ops {
1141 ($T:ty,$U:ty) => {
1142 impl SetElementOperation<$U> for $T {
1143 #[inline]
1144 fn add(self, rhs: $U) -> SetExpression {
1145 SetExpression::SetElementOperation(
1146 SetElementOperator::Add,
1147 ElementExpression::from(rhs),
1148 Box::new(SetExpression::from(self)),
1149 )
1150 }
1151
1152 #[inline]
1153 fn remove(self, rhs: $U) -> SetExpression {
1154 SetExpression::SetElementOperation(
1155 SetElementOperator::Remove,
1156 ElementExpression::from(rhs),
1157 Box::new(SetExpression::from(self)),
1158 )
1159 }
1160 }
1161 };
1162}
1163
1164impl_set_ops!(SetExpression, Set);
1165impl_set_ops!(SetExpression, SetVariable);
1166impl_set_element_ops!(SetExpression, ElementExpression);
1167impl_set_element_ops!(SetExpression, Element);
1168impl_set_element_ops!(SetExpression, ElementVariable);
1169impl_set_element_ops!(SetExpression, ElementResourceVariable);
1170impl_set_ops!(Set, SetExpression);
1171impl_set_ops!(Set, SetVariable);
1172impl_set_element_ops!(Set, ElementExpression);
1173impl_set_element_ops!(Set, ElementVariable);
1174impl_set_element_ops!(Set, ElementResourceVariable);
1175impl_set_ops!(SetVariable, SetExpression);
1176impl_set_ops!(SetVariable, Set);
1177impl_set_ops!(SetVariable, SetVariable);
1178impl_set_element_ops!(SetVariable, ElementExpression);
1179impl_set_element_ops!(SetVariable, Element);
1180impl_set_element_ops!(SetVariable, ElementVariable);
1181impl_set_element_ops!(SetVariable, ElementResourceVariable);
1182
1183impl SetExpression {
1184 pub fn eval<T: StateInterface>(
1211 &self,
1212 state: &T,
1213 function_cache: &mut StateFunctionCache,
1214 state_functions: &StateFunctions,
1215 registry: &TableRegistry,
1216 ) -> Set {
1217 match self {
1218 Self::Reference(expression) => expression
1219 .eval(state, function_cache, state_functions, registry)
1220 .clone(),
1221 Self::StateFunction(i) => function_cache
1222 .get_set_value(*i, state, state_functions, registry)
1223 .clone(),
1224 Self::Complement(set) => {
1225 let mut set = set.eval(state, function_cache, state_functions, registry);
1226 set.toggle_range(..);
1227 set
1228 }
1229 Self::SetOperation(op, x, y) => match (op, x.as_ref(), y.as_ref()) {
1230 (op, x, SetExpression::Reference(y)) => {
1231 let x = x.eval(state, function_cache, state_functions, registry);
1232 let y = y.eval(state, function_cache, state_functions, registry);
1233 Self::eval_set_operation(op, x, y)
1234 }
1235 (SetOperator::Intersection, SetExpression::Reference(x), y)
1236 | (SetOperator::Union, SetExpression::Reference(x), y) => {
1237 let y = y.eval(state, function_cache, state_functions, registry);
1238 let x = x.eval(state, function_cache, state_functions, registry);
1239 Self::eval_set_operation(op, y, x)
1240 }
1241 (op, x, SetExpression::StateFunction(i)) => {
1242 let x = x.eval(state, function_cache, state_functions, registry);
1243 let y = function_cache.get_set_value(*i, state, state_functions, registry);
1244 Self::eval_set_operation(op, x, y)
1245 }
1246 (SetOperator::Intersection, SetExpression::StateFunction(i), y)
1247 | (SetOperator::Union, SetExpression::StateFunction(i), y) => {
1248 let y = y.eval(state, function_cache, state_functions, registry);
1249 let x = function_cache.get_set_value(*i, state, state_functions, registry);
1250 Self::eval_set_operation(op, y, x)
1251 }
1252 (op, x, y) => {
1253 let x = x.eval(state, function_cache, state_functions, registry);
1254 let y = y.eval(state, function_cache, state_functions, registry);
1255 Self::eval_set_operation(op, x, &y)
1256 }
1257 },
1258 Self::SetElementOperation(op, element, set) => {
1259 let set = set.eval(state, function_cache, state_functions, registry);
1260 let element = element.eval(state, function_cache, state_functions, registry);
1261 Self::eval_set_element_operation(op, element, set)
1262 }
1263 Self::Reduce(expression) => {
1264 expression.eval(state, function_cache, state_functions, registry)
1265 }
1266 Self::FromVector(capacity, vector) => match vector.as_ref() {
1267 VectorExpression::Reference(ReferenceExpression::Constant(vector)) => {
1268 let mut set = Set::with_capacity(*capacity);
1269 vector.iter().for_each(|v| set.insert(*v));
1270 set
1271 }
1272 vector => {
1273 let mut set = Set::with_capacity(*capacity);
1274 vector
1275 .eval(state, function_cache, state_functions, registry)
1276 .into_iter()
1277 .for_each(|v| set.insert(v));
1278 set
1279 }
1280 },
1281 Self::If(condition, x, y) => {
1282 if condition.eval(state, function_cache, state_functions, registry) {
1283 x.eval(state, function_cache, state_functions, registry)
1284 } else {
1285 y.eval(state, function_cache, state_functions, registry)
1286 }
1287 }
1288 }
1289 }
1290
1291 pub fn simplify(&self, registry: &TableRegistry) -> SetExpression {
1297 match self {
1298 Self::Reference(expression) => {
1299 Self::Reference(expression.simplify(registry, ®istry.set_tables))
1300 }
1301 Self::Complement(expression) => match expression.simplify(registry) {
1302 Self::Reference(ReferenceExpression::Constant(mut set)) => {
1303 set.toggle_range(..);
1304 Self::Reference(ReferenceExpression::Constant(set))
1305 }
1306 Self::Complement(expression) => *expression,
1307 expression => Self::Complement(Box::new(expression)),
1308 },
1309 Self::SetOperation(op, x, y) => {
1310 match (op, x.simplify(registry), y.simplify(registry)) {
1311 (
1312 op,
1313 Self::Reference(ReferenceExpression::Constant(x)),
1314 Self::Reference(ReferenceExpression::Constant(y)),
1315 ) => Self::Reference(ReferenceExpression::Constant(Self::eval_set_operation(
1316 op, x, &y,
1317 ))),
1318 (
1319 SetOperator::Union,
1320 Self::Reference(ReferenceExpression::Variable(x)),
1321 Self::Reference(ReferenceExpression::Variable(y)),
1322 )
1323 | (
1324 SetOperator::Intersection,
1325 Self::Reference(ReferenceExpression::Variable(x)),
1326 Self::Reference(ReferenceExpression::Variable(y)),
1327 ) if x == y => Self::Reference(ReferenceExpression::Variable(x)),
1328 (SetOperator::Union, Self::StateFunction(x), Self::StateFunction(y))
1329 | (SetOperator::Intersection, Self::StateFunction(x), Self::StateFunction(y))
1330 if x == y =>
1331 {
1332 Self::StateFunction(x)
1333 }
1334 (op, x, y) => Self::SetOperation(op.clone(), Box::new(x), Box::new(y)),
1335 }
1336 }
1337 Self::SetElementOperation(op, element, set) => {
1338 match (set.simplify(registry), element.simplify(registry)) {
1339 (
1340 Self::Reference(ReferenceExpression::Constant(set)),
1341 ElementExpression::Constant(element),
1342 ) => Self::Reference(ReferenceExpression::Constant(
1343 Self::eval_set_element_operation(op, element, set),
1344 )),
1345 (set, element) => Self::SetElementOperation(op.clone(), element, Box::new(set)),
1346 }
1347 }
1348 Self::Reduce(expression) => match expression.simplify(registry) {
1349 SetReduceExpression::Constant(set) => {
1350 Self::Reference(ReferenceExpression::Constant(set))
1351 }
1352 expression => Self::Reduce(expression),
1353 },
1354 Self::FromVector(capacity, vector) => match vector.simplify(registry) {
1355 VectorExpression::Reference(ReferenceExpression::Constant(vector)) => {
1356 let mut set = Set::with_capacity(*capacity);
1357 vector.into_iter().for_each(|v| set.insert(v));
1358 Self::Reference(ReferenceExpression::Constant(set))
1359 }
1360 vector => Self::FromVector(*capacity, Box::new(vector)),
1361 },
1362 Self::If(condition, x, y) => match condition.simplify(registry) {
1363 Condition::Constant(true) => x.simplify(registry),
1364 Condition::Constant(false) => y.simplify(registry),
1365 condition => Self::If(
1366 Box::new(condition),
1367 Box::new(x.simplify(registry)),
1368 Box::new(y.simplify(registry)),
1369 ),
1370 },
1371 _ => self.clone(),
1372 }
1373 }
1374
1375 fn eval_set_operation(op: &SetOperator, mut x: Set, y: &Set) -> Set {
1376 match op {
1377 SetOperator::Union => {
1378 x.union_with(y);
1379 x
1380 }
1381 SetOperator::Difference => {
1382 x.difference_with(y);
1383 x
1384 }
1385 SetOperator::Intersection => {
1386 x.intersect_with(y);
1387 x
1388 }
1389 }
1390 }
1391
1392 fn eval_set_element_operation(op: &SetElementOperator, element: Element, mut set: Set) -> Set {
1393 match op {
1394 SetElementOperator::Add => {
1395 set.insert(element);
1396 set
1397 }
1398 SetElementOperator::Remove => {
1399 set.set(element, false);
1400 set
1401 }
1402 }
1403 }
1404}
1405
1406#[cfg(test)]
1407mod tests {
1408 use super::super::condition::ComparisonOperator;
1409 use super::super::integer_expression::IntegerExpression;
1410 use super::*;
1411 use crate::state::*;
1412 use crate::table::*;
1413 use crate::table_data::{TableData, TableInterface};
1414 use rustc_hash::FxHashMap;
1415
1416 fn generate_registry() -> TableRegistry {
1417 let mut name_to_constant = FxHashMap::default();
1418 name_to_constant.insert(String::from("f0"), 1);
1419
1420 let tables_1d = vec![Table1D::new(vec![1, 0])];
1421 let mut name_to_table_1d = FxHashMap::default();
1422 name_to_table_1d.insert(String::from("f1"), 0);
1423
1424 let tables_2d = vec![Table2D::new(vec![vec![1, 0]])];
1425 let mut name_to_table_2d = FxHashMap::default();
1426 name_to_table_2d.insert(String::from("f2"), 0);
1427
1428 let tables_3d = vec![Table3D::new(vec![vec![vec![1, 0]]])];
1429 let mut name_to_table_3d = FxHashMap::default();
1430 name_to_table_3d.insert(String::from("f3"), 0);
1431
1432 let mut map = FxHashMap::default();
1433 let key = vec![0, 0, 0, 0];
1434 map.insert(key, 1);
1435 let key = vec![0, 0, 0, 1];
1436 map.insert(key, 0);
1437 let tables = vec![Table::new(map, 0)];
1438 let mut name_to_table = FxHashMap::default();
1439 name_to_table.insert(String::from("f4"), 0);
1440
1441 let element_tables = TableData {
1442 name_to_constant,
1443 tables_1d,
1444 name_to_table_1d,
1445 tables_2d,
1446 name_to_table_2d,
1447 tables_3d,
1448 name_to_table_3d,
1449 tables,
1450 name_to_table,
1451 };
1452
1453 let mut name_to_table_1d = FxHashMap::default();
1454 name_to_table_1d.insert(String::from("t1"), 0);
1455 let vector_tables = TableData {
1456 tables_1d: vec![Table1D::new(vec![vec![0, 1]])],
1457 name_to_table_1d,
1458 ..Default::default()
1459 };
1460
1461 let mut set = Set::with_capacity(3);
1462 set.insert(0);
1463 set.insert(2);
1464 let default = Set::with_capacity(3);
1465 let tables_1d = vec![Table1D::new(vec![set, default.clone(), default])];
1466 let mut name_to_table_1d = FxHashMap::default();
1467 name_to_table_1d.insert(String::from("s1"), 0);
1468 let set_tables = TableData {
1469 tables_1d,
1470 name_to_table_1d,
1471 ..Default::default()
1472 };
1473
1474 TableRegistry {
1475 element_tables,
1476 set_tables,
1477 vector_tables,
1478 ..Default::default()
1479 }
1480 }
1481
1482 fn generate_state() -> State {
1483 let mut set1 = Set::with_capacity(3);
1484 set1.insert(0);
1485 set1.insert(2);
1486 let mut set2 = Set::with_capacity(3);
1487 set2.insert(0);
1488 set2.insert(1);
1489 State {
1490 signature_variables: SignatureVariables {
1491 set_variables: vec![set1, set2],
1492 vector_variables: vec![vec![0, 2]],
1493 element_variables: vec![1],
1494 ..Default::default()
1495 },
1496 resource_variables: ResourceVariables {
1497 element_variables: vec![2],
1498 ..Default::default()
1499 },
1500 }
1501 }
1502
1503 #[test]
1504 fn set_default() {
1505 assert_eq!(
1506 SetExpression::default(),
1507 SetExpression::Reference(ReferenceExpression::Constant(Set::default()))
1508 );
1509 }
1510
1511 #[test]
1512 fn set_from() {
1513 let mut metadata = StateMetadata::default();
1514 let ob = metadata.add_object_type(String::from("something"), 10);
1515 assert!(ob.is_ok());
1516 let ob = ob.unwrap();
1517
1518 let s = metadata.create_set(ob, &[1, 2, 3]);
1519 assert!(s.is_ok());
1520 let s = s.unwrap();
1521 assert_eq!(
1522 SetExpression::from(s.clone()),
1523 SetExpression::Reference(ReferenceExpression::Constant(s))
1524 );
1525
1526 let v = metadata.add_set_variable(String::from("sv"), ob);
1527 assert!(v.is_ok());
1528 let v = v.unwrap();
1529 assert_eq!(
1530 SetExpression::from(v),
1531 SetExpression::Reference(ReferenceExpression::Variable(v.id()))
1532 );
1533 }
1534
1535 #[test]
1536 fn set_not() {
1537 let expression = SetExpression::Reference(ReferenceExpression::Variable(0));
1538 assert_eq!(
1539 !expression,
1540 SetExpression::Complement(Box::new(SetExpression::Reference(
1541 ReferenceExpression::Variable(0)
1542 )))
1543 );
1544
1545 let mut metadata = StateMetadata::default();
1546 let ob = metadata.add_object_type(String::from("something"), 10);
1547 assert!(ob.is_ok());
1548 let ob = ob.unwrap();
1549 let v = metadata.add_set_variable(String::from("sv"), ob);
1550 assert!(v.is_ok());
1551 let v = v.unwrap();
1552 assert_eq!(
1553 !v,
1554 SetExpression::Complement(Box::new(SetExpression::Reference(
1555 ReferenceExpression::Variable(v.id())
1556 )))
1557 );
1558 }
1559
1560 #[test]
1561 fn set_bitor() {
1562 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1563 let expression2 = SetExpression::Reference(ReferenceExpression::Variable(1));
1564 assert_eq!(
1565 expression1.clone() | expression2.clone(),
1566 SetExpression::SetOperation(
1567 SetOperator::Union,
1568 Box::new(expression1),
1569 Box::new(expression2),
1570 )
1571 );
1572
1573 let mut metadata = StateMetadata::default();
1574 let ob = metadata.add_object_type(String::from("something"), 10);
1575 assert!(ob.is_ok());
1576 let ob = ob.unwrap();
1577
1578 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1579 let s = metadata.create_set(ob, &[0, 1, 2]);
1580 assert!(s.is_ok());
1581 let s = s.unwrap();
1582 assert_eq!(
1583 expression1.clone() | s.clone(),
1584 SetExpression::SetOperation(
1585 SetOperator::Union,
1586 Box::new(expression1.clone()),
1587 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1588 s.clone()
1589 ))),
1590 )
1591 );
1592 assert_eq!(
1593 s.clone() | expression1.clone(),
1594 SetExpression::SetOperation(
1595 SetOperator::Union,
1596 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1597 s.clone()
1598 ))),
1599 Box::new(expression1),
1600 )
1601 );
1602
1603 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1604 let v = metadata.add_set_variable(String::from("sv"), ob);
1605 assert!(v.is_ok());
1606 let v = v.unwrap();
1607 assert_eq!(
1608 expression1.clone() | v,
1609 SetExpression::SetOperation(
1610 SetOperator::Union,
1611 Box::new(expression1.clone()),
1612 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1613 v.id()
1614 ))),
1615 )
1616 );
1617 assert_eq!(
1618 v | expression1.clone(),
1619 SetExpression::SetOperation(
1620 SetOperator::Union,
1621 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1622 v.id()
1623 ))),
1624 Box::new(expression1),
1625 )
1626 );
1627
1628 assert_eq!(
1629 s.clone() | v,
1630 SetExpression::SetOperation(
1631 SetOperator::Union,
1632 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1633 s.clone()
1634 ))),
1635 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1636 v.id()
1637 ))),
1638 )
1639 );
1640 assert_eq!(
1641 v | s.clone(),
1642 SetExpression::SetOperation(
1643 SetOperator::Union,
1644 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1645 v.id()
1646 ))),
1647 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s))),
1648 )
1649 );
1650 }
1651
1652 #[test]
1653 fn set_sub() {
1654 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1655 let expression2 = SetExpression::Reference(ReferenceExpression::Variable(1));
1656 assert_eq!(
1657 expression1.clone() - expression2.clone(),
1658 SetExpression::SetOperation(
1659 SetOperator::Difference,
1660 Box::new(expression1),
1661 Box::new(expression2),
1662 )
1663 );
1664
1665 let mut metadata = StateMetadata::default();
1666 let ob = metadata.add_object_type(String::from("something"), 10);
1667 assert!(ob.is_ok());
1668 let ob = ob.unwrap();
1669
1670 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1671 let s = metadata.create_set(ob, &[0, 1, 2]);
1672 assert!(s.is_ok());
1673 let s = s.unwrap();
1674 assert_eq!(
1675 expression1.clone() - s.clone(),
1676 SetExpression::SetOperation(
1677 SetOperator::Difference,
1678 Box::new(expression1.clone()),
1679 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1680 s.clone()
1681 ))),
1682 )
1683 );
1684 assert_eq!(
1685 s.clone() - expression1.clone(),
1686 SetExpression::SetOperation(
1687 SetOperator::Difference,
1688 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1689 s.clone()
1690 ))),
1691 Box::new(expression1),
1692 )
1693 );
1694
1695 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1696 let v = metadata.add_set_variable(String::from("sv"), ob);
1697 assert!(v.is_ok());
1698 let v = v.unwrap();
1699 assert_eq!(
1700 expression1.clone() - v,
1701 SetExpression::SetOperation(
1702 SetOperator::Difference,
1703 Box::new(expression1.clone()),
1704 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1705 v.id()
1706 ))),
1707 )
1708 );
1709 assert_eq!(
1710 v - expression1.clone(),
1711 SetExpression::SetOperation(
1712 SetOperator::Difference,
1713 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1714 v.id()
1715 ))),
1716 Box::new(expression1),
1717 )
1718 );
1719
1720 assert_eq!(
1721 s.clone() - v,
1722 SetExpression::SetOperation(
1723 SetOperator::Difference,
1724 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1725 s.clone()
1726 ))),
1727 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1728 v.id()
1729 ))),
1730 )
1731 );
1732 assert_eq!(
1733 v - s.clone(),
1734 SetExpression::SetOperation(
1735 SetOperator::Difference,
1736 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1737 v.id()
1738 ))),
1739 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s))),
1740 )
1741 );
1742 }
1743
1744 #[test]
1745 fn set_bitand() {
1746 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1747 let expression2 = SetExpression::Reference(ReferenceExpression::Variable(1));
1748 assert_eq!(
1749 expression1.clone() & expression2.clone(),
1750 SetExpression::SetOperation(
1751 SetOperator::Intersection,
1752 Box::new(expression1),
1753 Box::new(expression2),
1754 )
1755 );
1756
1757 let mut metadata = StateMetadata::default();
1758 let ob = metadata.add_object_type(String::from("something"), 10);
1759 assert!(ob.is_ok());
1760 let ob = ob.unwrap();
1761
1762 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1763 let s = metadata.create_set(ob, &[0, 1, 2]);
1764 assert!(s.is_ok());
1765 let s = s.unwrap();
1766 assert_eq!(
1767 expression1.clone() & s.clone(),
1768 SetExpression::SetOperation(
1769 SetOperator::Intersection,
1770 Box::new(expression1.clone()),
1771 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1772 s.clone()
1773 ))),
1774 )
1775 );
1776 assert_eq!(
1777 s.clone() & expression1.clone(),
1778 SetExpression::SetOperation(
1779 SetOperator::Intersection,
1780 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1781 s.clone()
1782 ))),
1783 Box::new(expression1),
1784 )
1785 );
1786
1787 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1788 let v = metadata.add_set_variable(String::from("sv"), ob);
1789 assert!(v.is_ok());
1790 let v = v.unwrap();
1791 assert_eq!(
1792 expression1.clone() & v,
1793 SetExpression::SetOperation(
1794 SetOperator::Intersection,
1795 Box::new(expression1.clone()),
1796 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1797 v.id()
1798 ))),
1799 )
1800 );
1801 assert_eq!(
1802 v & expression1.clone(),
1803 SetExpression::SetOperation(
1804 SetOperator::Intersection,
1805 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1806 v.id()
1807 ))),
1808 Box::new(expression1),
1809 )
1810 );
1811
1812 assert_eq!(
1813 s.clone() & v,
1814 SetExpression::SetOperation(
1815 SetOperator::Intersection,
1816 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
1817 s.clone()
1818 ))),
1819 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1820 v.id()
1821 ))),
1822 )
1823 );
1824 assert_eq!(
1825 v & s.clone(),
1826 SetExpression::SetOperation(
1827 SetOperator::Intersection,
1828 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1829 v.id()
1830 ))),
1831 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s))),
1832 )
1833 );
1834 }
1835
1836 #[test]
1837 fn set_add() {
1838 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1839 let expression2 = ElementExpression::Constant(0);
1840 assert_eq!(
1841 expression1.clone().add(expression2.clone()),
1842 SetExpression::SetElementOperation(
1843 SetElementOperator::Add,
1844 expression2.clone(),
1845 Box::new(expression1.clone()),
1846 )
1847 );
1848 assert_eq!(
1849 expression1.clone().add(1),
1850 SetExpression::SetElementOperation(
1851 SetElementOperator::Add,
1852 ElementExpression::Constant(1),
1853 Box::new(expression1.clone()),
1854 )
1855 );
1856
1857 let mut metadata = StateMetadata::default();
1858 let ob = metadata.add_object_type(String::from("something"), 10);
1859 assert!(ob.is_ok());
1860 let ob = ob.unwrap();
1861
1862 let ev = metadata.add_element_variable(String::from("ev"), ob);
1863 assert!(ev.is_ok());
1864 let ev = ev.unwrap();
1865 assert_eq!(
1866 expression1.clone().add(ev),
1867 SetExpression::SetElementOperation(
1868 SetElementOperator::Add,
1869 ElementExpression::Variable(ev.id()),
1870 Box::new(expression1.clone()),
1871 )
1872 );
1873
1874 let erv = metadata.add_element_resource_variable(String::from("ev"), ob, true);
1875 assert!(erv.is_ok());
1876 let erv = erv.unwrap();
1877 assert_eq!(
1878 expression1.clone().add(erv),
1879 SetExpression::SetElementOperation(
1880 SetElementOperator::Add,
1881 ElementExpression::ResourceVariable(erv.id()),
1882 Box::new(expression1),
1883 )
1884 );
1885
1886 let sv = metadata.add_set_variable(String::from("sv"), ob);
1887 assert!(sv.is_ok());
1888 let sv = sv.unwrap();
1889 assert_eq!(
1890 sv.add(expression2.clone()),
1891 SetExpression::SetElementOperation(
1892 SetElementOperator::Add,
1893 expression2,
1894 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1895 sv.id()
1896 ))),
1897 )
1898 );
1899 assert_eq!(
1900 sv.add(1),
1901 SetExpression::SetElementOperation(
1902 SetElementOperator::Add,
1903 ElementExpression::Constant(1),
1904 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1905 sv.id()
1906 ))),
1907 )
1908 );
1909 assert_eq!(
1910 sv.add(ev),
1911 SetExpression::SetElementOperation(
1912 SetElementOperator::Add,
1913 ElementExpression::Variable(ev.id()),
1914 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1915 sv.id()
1916 ))),
1917 )
1918 );
1919 assert_eq!(
1920 sv.add(erv),
1921 SetExpression::SetElementOperation(
1922 SetElementOperator::Add,
1923 ElementExpression::ResourceVariable(erv.id()),
1924 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1925 sv.id()
1926 ))),
1927 )
1928 );
1929 }
1930
1931 #[test]
1932 fn set_remove() {
1933 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
1934 let expression2 = ElementExpression::Constant(0);
1935 assert_eq!(
1936 expression1.clone().remove(expression2.clone()),
1937 SetExpression::SetElementOperation(
1938 SetElementOperator::Remove,
1939 expression2.clone(),
1940 Box::new(expression1.clone()),
1941 )
1942 );
1943 assert_eq!(
1944 expression1.clone().remove(1),
1945 SetExpression::SetElementOperation(
1946 SetElementOperator::Remove,
1947 ElementExpression::Constant(1),
1948 Box::new(expression1.clone()),
1949 )
1950 );
1951
1952 let mut metadata = StateMetadata::default();
1953 let ob = metadata.add_object_type(String::from("something"), 10);
1954 assert!(ob.is_ok());
1955 let ob = ob.unwrap();
1956
1957 let ev = metadata.add_element_variable(String::from("ev"), ob);
1958 assert!(ev.is_ok());
1959 let ev = ev.unwrap();
1960 assert_eq!(
1961 expression1.clone().remove(ev),
1962 SetExpression::SetElementOperation(
1963 SetElementOperator::Remove,
1964 ElementExpression::Variable(ev.id()),
1965 Box::new(expression1.clone()),
1966 )
1967 );
1968
1969 let erv = metadata.add_element_resource_variable(String::from("ev"), ob, true);
1970 assert!(erv.is_ok());
1971 let erv = erv.unwrap();
1972 assert_eq!(
1973 expression1.clone().remove(erv),
1974 SetExpression::SetElementOperation(
1975 SetElementOperator::Remove,
1976 ElementExpression::ResourceVariable(erv.id()),
1977 Box::new(expression1),
1978 )
1979 );
1980
1981 let sv = metadata.add_set_variable(String::from("sv"), ob);
1982 assert!(sv.is_ok());
1983 let sv = sv.unwrap();
1984 assert_eq!(
1985 sv.remove(expression2.clone()),
1986 SetExpression::SetElementOperation(
1987 SetElementOperator::Remove,
1988 expression2,
1989 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
1990 sv.id()
1991 ))),
1992 )
1993 );
1994 assert_eq!(
1995 sv.remove(1),
1996 SetExpression::SetElementOperation(
1997 SetElementOperator::Remove,
1998 ElementExpression::Constant(1),
1999 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2000 sv.id()
2001 ))),
2002 )
2003 );
2004 assert_eq!(
2005 sv.remove(ev),
2006 SetExpression::SetElementOperation(
2007 SetElementOperator::Remove,
2008 ElementExpression::Variable(ev.id()),
2009 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2010 sv.id()
2011 ))),
2012 )
2013 );
2014 assert_eq!(
2015 sv.remove(erv),
2016 SetExpression::SetElementOperation(
2017 SetElementOperator::Remove,
2018 ElementExpression::ResourceVariable(erv.id()),
2019 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2020 sv.id()
2021 ))),
2022 )
2023 );
2024 }
2025
2026 #[test]
2027 fn set_table_1d_element() {
2028 let mut registry = TableRegistry::default();
2029
2030 let t = registry.add_table_1d(String::from("t"), vec![Set::default()]);
2031 assert!(t.is_ok());
2032 let t = t.unwrap();
2033 assert_eq!(
2034 t.element(0),
2035 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table1D(
2036 t.id(),
2037 ElementExpression::Constant(0)
2038 )))
2039 );
2040 }
2041
2042 #[test]
2043 fn set_table_1d_union() {
2044 let mut registry = TableRegistry::default();
2045
2046 let t = registry.add_table_1d(
2047 String::from("t"),
2048 vec![
2049 {
2050 let mut set = Set::with_capacity(3);
2051 set.insert(0);
2052 set.insert(1);
2053 set
2054 },
2055 {
2056 let mut set = Set::with_capacity(3);
2057 set.insert(1);
2058 set.insert(2);
2059 set
2060 },
2061 ],
2062 );
2063 assert!(t.is_ok());
2064 let t = t.unwrap();
2065 let x = SetExpression::Reference(ReferenceExpression::Constant({
2066 let mut set = Set::with_capacity(2);
2067 set.insert(0);
2068 set.insert(1);
2069 set
2070 }));
2071 assert_eq!(
2072 t.union(3, x.clone()),
2073 SetExpression::Reduce(SetReduceExpression::Table1D(
2074 SetReduceOperator::Union,
2075 3,
2076 t.id(),
2077 Box::new(ArgumentExpression::Set(x))
2078 ))
2079 );
2080 }
2081
2082 #[test]
2083 fn set_table_1d_intersection() {
2084 let mut registry = TableRegistry::default();
2085
2086 let t = registry.add_table_1d(
2087 String::from("t"),
2088 vec![
2089 {
2090 let mut set = Set::with_capacity(3);
2091 set.insert(0);
2092 set.insert(1);
2093 set
2094 },
2095 {
2096 let mut set = Set::with_capacity(3);
2097 set.insert(1);
2098 set.insert(2);
2099 set
2100 },
2101 ],
2102 );
2103 assert!(t.is_ok());
2104 let t = t.unwrap();
2105 let x = SetExpression::Reference(ReferenceExpression::Constant({
2106 let mut set = Set::with_capacity(2);
2107 set.insert(0);
2108 set.insert(1);
2109 set
2110 }));
2111 assert_eq!(
2112 t.intersection(3, x.clone()),
2113 SetExpression::Reduce(SetReduceExpression::Table1D(
2114 SetReduceOperator::Intersection,
2115 3,
2116 t.id(),
2117 Box::new(ArgumentExpression::Set(x))
2118 ))
2119 );
2120 }
2121
2122 #[test]
2123 fn set_table_1d_symmetric_difference() {
2124 let mut registry = TableRegistry::default();
2125
2126 let t = registry.add_table_1d(
2127 String::from("t"),
2128 vec![
2129 {
2130 let mut set = Set::with_capacity(3);
2131 set.insert(0);
2132 set.insert(1);
2133 set
2134 },
2135 {
2136 let mut set = Set::with_capacity(3);
2137 set.insert(1);
2138 set.insert(2);
2139 set
2140 },
2141 ],
2142 );
2143 assert!(t.is_ok());
2144 let t = t.unwrap();
2145 let x = SetExpression::Reference(ReferenceExpression::Constant({
2146 let mut set = Set::with_capacity(2);
2147 set.insert(0);
2148 set.insert(1);
2149 set
2150 }));
2151 assert_eq!(
2152 t.symmetric_difference(3, x.clone()),
2153 SetExpression::Reduce(SetReduceExpression::Table1D(
2154 SetReduceOperator::SymmetricDifference,
2155 3,
2156 t.id(),
2157 Box::new(ArgumentExpression::Set(x))
2158 ))
2159 );
2160 }
2161
2162 #[test]
2163 fn set_table_2d_element() {
2164 let mut registry = TableRegistry::default();
2165
2166 let t = registry.add_table_2d(String::from("t"), vec![vec![Set::default()]]);
2167 assert!(t.is_ok());
2168 let t = t.unwrap();
2169 assert_eq!(
2170 t.element(0, 0),
2171 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table2D(
2172 t.id(),
2173 ElementExpression::Constant(0),
2174 ElementExpression::Constant(0),
2175 )))
2176 );
2177 }
2178
2179 #[test]
2180 fn set_table_2d_union() {
2181 let mut registry = TableRegistry::default();
2182
2183 let t = registry.add_table_2d(
2184 String::from("t"),
2185 vec![vec![
2186 {
2187 let mut set = Set::with_capacity(3);
2188 set.insert(0);
2189 set.insert(1);
2190 set
2191 },
2192 {
2193 let mut set = Set::with_capacity(3);
2194 set.insert(1);
2195 set.insert(2);
2196 set
2197 },
2198 ]],
2199 );
2200 assert!(t.is_ok());
2201 let t = t.unwrap();
2202 let y = SetExpression::Reference(ReferenceExpression::Constant({
2203 let mut set = Set::with_capacity(2);
2204 set.insert(0);
2205 set.insert(1);
2206 set
2207 }));
2208 assert_eq!(
2209 t.union(3, 0, y.clone()),
2210 SetExpression::Reduce(SetReduceExpression::Table2D(
2211 SetReduceOperator::Union,
2212 3,
2213 t.id(),
2214 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2215 Box::new(ArgumentExpression::Set(y))
2216 ))
2217 );
2218 }
2219
2220 #[test]
2221 fn set_table_2d_intersection() {
2222 let mut registry = TableRegistry::default();
2223
2224 let t = registry.add_table_2d(
2225 String::from("t"),
2226 vec![vec![
2227 {
2228 let mut set = Set::with_capacity(3);
2229 set.insert(0);
2230 set.insert(1);
2231 set
2232 },
2233 {
2234 let mut set = Set::with_capacity(3);
2235 set.insert(1);
2236 set.insert(2);
2237 set
2238 },
2239 ]],
2240 );
2241 assert!(t.is_ok());
2242 let t = t.unwrap();
2243 let y = SetExpression::Reference(ReferenceExpression::Constant({
2244 let mut set = Set::with_capacity(2);
2245 set.insert(0);
2246 set.insert(1);
2247 set
2248 }));
2249 assert_eq!(
2250 t.intersection(3, 0, y.clone()),
2251 SetExpression::Reduce(SetReduceExpression::Table2D(
2252 SetReduceOperator::Intersection,
2253 3,
2254 t.id(),
2255 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2256 Box::new(ArgumentExpression::Set(y))
2257 ))
2258 );
2259 }
2260
2261 #[test]
2262 fn set_table_2d_symmetric_difference() {
2263 let mut registry = TableRegistry::default();
2264
2265 let t = registry.add_table_2d(
2266 String::from("t"),
2267 vec![vec![
2268 {
2269 let mut set = Set::with_capacity(3);
2270 set.insert(0);
2271 set.insert(1);
2272 set
2273 },
2274 {
2275 let mut set = Set::with_capacity(3);
2276 set.insert(1);
2277 set.insert(2);
2278 set
2279 },
2280 ]],
2281 );
2282 assert!(t.is_ok());
2283 let t = t.unwrap();
2284 let y = SetExpression::Reference(ReferenceExpression::Constant({
2285 let mut set = Set::with_capacity(2);
2286 set.insert(0);
2287 set.insert(1);
2288 set
2289 }));
2290 assert_eq!(
2291 t.symmetric_difference(3, 0, y.clone()),
2292 SetExpression::Reduce(SetReduceExpression::Table2D(
2293 SetReduceOperator::SymmetricDifference,
2294 3,
2295 t.id(),
2296 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2297 Box::new(ArgumentExpression::Set(y))
2298 ))
2299 );
2300 }
2301
2302 #[test]
2303 fn set_table_3d_element() {
2304 let mut registry = TableRegistry::default();
2305
2306 let t = registry.add_table_3d(String::from("t"), vec![vec![vec![Set::default()]]]);
2307 assert!(t.is_ok());
2308 let t = t.unwrap();
2309 assert_eq!(
2310 t.element(0, 0, 0),
2311 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table3D(
2312 t.id(),
2313 ElementExpression::Constant(0),
2314 ElementExpression::Constant(0),
2315 ElementExpression::Constant(0),
2316 )))
2317 );
2318 }
2319
2320 #[test]
2321 fn set_table_3d_union() {
2322 let mut registry = TableRegistry::default();
2323
2324 let t = registry.add_table_3d(
2325 String::from("t"),
2326 vec![vec![vec![
2327 {
2328 let mut set = Set::with_capacity(3);
2329 set.insert(0);
2330 set.insert(1);
2331 set
2332 },
2333 {
2334 let mut set = Set::with_capacity(3);
2335 set.insert(1);
2336 set.insert(2);
2337 set
2338 },
2339 ]]],
2340 );
2341 assert!(t.is_ok());
2342 let t = t.unwrap();
2343 let z = SetExpression::Reference(ReferenceExpression::Constant({
2344 let mut set = Set::with_capacity(2);
2345 set.insert(0);
2346 set.insert(1);
2347 set
2348 }));
2349 assert_eq!(
2350 t.union(3, 0, 0, z.clone()),
2351 SetExpression::Reduce(SetReduceExpression::Table3D(
2352 SetReduceOperator::Union,
2353 3,
2354 t.id(),
2355 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2356 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2357 Box::new(ArgumentExpression::Set(z))
2358 ))
2359 );
2360 }
2361
2362 #[test]
2363 fn set_table_3d_intersection() {
2364 let mut registry = TableRegistry::default();
2365
2366 let t = registry.add_table_3d(
2367 String::from("t"),
2368 vec![vec![vec![
2369 {
2370 let mut set = Set::with_capacity(3);
2371 set.insert(0);
2372 set.insert(1);
2373 set
2374 },
2375 {
2376 let mut set = Set::with_capacity(3);
2377 set.insert(1);
2378 set.insert(2);
2379 set
2380 },
2381 ]]],
2382 );
2383 assert!(t.is_ok());
2384 let t = t.unwrap();
2385 let z = SetExpression::Reference(ReferenceExpression::Constant({
2386 let mut set = Set::with_capacity(2);
2387 set.insert(0);
2388 set.insert(1);
2389 set
2390 }));
2391 assert_eq!(
2392 t.intersection(3, 0, 0, z.clone()),
2393 SetExpression::Reduce(SetReduceExpression::Table3D(
2394 SetReduceOperator::Intersection,
2395 3,
2396 t.id(),
2397 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2398 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2399 Box::new(ArgumentExpression::Set(z))
2400 ))
2401 );
2402 }
2403
2404 #[test]
2405 fn set_table_3d_symmetric_difference() {
2406 let mut registry = TableRegistry::default();
2407
2408 let t = registry.add_table_3d(
2409 String::from("t"),
2410 vec![vec![vec![
2411 {
2412 let mut set = Set::with_capacity(3);
2413 set.insert(0);
2414 set.insert(1);
2415 set
2416 },
2417 {
2418 let mut set = Set::with_capacity(3);
2419 set.insert(1);
2420 set.insert(2);
2421 set
2422 },
2423 ]]],
2424 );
2425 assert!(t.is_ok());
2426 let t = t.unwrap();
2427 let z = SetExpression::Reference(ReferenceExpression::Constant({
2428 let mut set = Set::with_capacity(2);
2429 set.insert(0);
2430 set.insert(1);
2431 set
2432 }));
2433 assert_eq!(
2434 t.symmetric_difference(3, 0, 0, z.clone()),
2435 SetExpression::Reduce(SetReduceExpression::Table3D(
2436 SetReduceOperator::SymmetricDifference,
2437 3,
2438 t.id(),
2439 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2440 Box::new(ArgumentExpression::Element(ElementExpression::Constant(0))),
2441 Box::new(ArgumentExpression::Set(z))
2442 ))
2443 );
2444 }
2445
2446 #[test]
2447 fn set_table_element() {
2448 let mut registry = TableRegistry::default();
2449
2450 let t = registry.add_table(String::from("t"), FxHashMap::default(), Set::default());
2451 assert!(t.is_ok());
2452 let t = t.unwrap();
2453 assert_eq!(
2454 t.element(vec![0, 0, 0, 0]),
2455 SetExpression::Reference(ReferenceExpression::Table(TableExpression::Table(
2456 t.id(),
2457 vec![
2458 ElementExpression::Constant(0),
2459 ElementExpression::Constant(0),
2460 ElementExpression::Constant(0),
2461 ElementExpression::Constant(0)
2462 ],
2463 )))
2464 );
2465 }
2466
2467 #[test]
2468 fn set_table_union() {
2469 let mut registry = TableRegistry::default();
2470
2471 let t = registry.add_table(
2472 String::from("t"),
2473 {
2474 let mut map = FxHashMap::default();
2475 let mut set = Set::with_capacity(3);
2476 set.insert(0);
2477 set.insert(1);
2478 map.insert(vec![0, 0, 0, 0], set);
2479 map
2480 },
2481 {
2482 let mut set = Set::with_capacity(3);
2483 set.insert(1);
2484 set.insert(2);
2485 set
2486 },
2487 );
2488 assert!(t.is_ok());
2489 let t = t.unwrap();
2490 let args = vec![
2491 ArgumentExpression::Element(ElementExpression::Constant(0)),
2492 ArgumentExpression::Element(ElementExpression::Constant(0)),
2493 ArgumentExpression::Element(ElementExpression::Constant(0)),
2494 ArgumentExpression::Set(SetExpression::Reference(ReferenceExpression::Constant({
2495 let mut set = Set::with_capacity(2);
2496 set.insert(0);
2497 set.insert(1);
2498 set
2499 }))),
2500 ];
2501 assert_eq!(
2502 t.union(3, args.clone()),
2503 SetExpression::Reduce(SetReduceExpression::Table(
2504 SetReduceOperator::Union,
2505 3,
2506 t.id(),
2507 args
2508 ))
2509 );
2510 }
2511
2512 #[test]
2513 fn set_table_intersection() {
2514 let mut registry = TableRegistry::default();
2515
2516 let t = registry.add_table(
2517 String::from("t"),
2518 {
2519 let mut map = FxHashMap::default();
2520 let mut set = Set::with_capacity(3);
2521 set.insert(0);
2522 set.insert(1);
2523 map.insert(vec![0, 0, 0, 0], set);
2524 map
2525 },
2526 {
2527 let mut set = Set::with_capacity(3);
2528 set.insert(1);
2529 set.insert(2);
2530 set
2531 },
2532 );
2533 assert!(t.is_ok());
2534 let t = t.unwrap();
2535 let args = vec![
2536 ArgumentExpression::Element(ElementExpression::Constant(0)),
2537 ArgumentExpression::Element(ElementExpression::Constant(0)),
2538 ArgumentExpression::Element(ElementExpression::Constant(0)),
2539 ArgumentExpression::Set(SetExpression::Reference(ReferenceExpression::Constant({
2540 let mut set = Set::with_capacity(2);
2541 set.insert(0);
2542 set.insert(1);
2543 set
2544 }))),
2545 ];
2546 assert_eq!(
2547 t.intersection(3, args.clone()),
2548 SetExpression::Reduce(SetReduceExpression::Table(
2549 SetReduceOperator::Intersection,
2550 3,
2551 t.id(),
2552 args
2553 ))
2554 );
2555 }
2556
2557 #[test]
2558 fn set_table_symmetric_difference() {
2559 let mut registry = TableRegistry::default();
2560
2561 let t = registry.add_table(
2562 String::from("t"),
2563 {
2564 let mut map = FxHashMap::default();
2565 let mut set = Set::with_capacity(3);
2566 set.insert(0);
2567 set.insert(1);
2568 map.insert(vec![0, 0, 0, 0], set);
2569 map
2570 },
2571 {
2572 let mut set = Set::with_capacity(3);
2573 set.insert(1);
2574 set.insert(2);
2575 set
2576 },
2577 );
2578 assert!(t.is_ok());
2579 let t = t.unwrap();
2580 let args = vec![
2581 ArgumentExpression::Element(ElementExpression::Constant(0)),
2582 ArgumentExpression::Element(ElementExpression::Constant(0)),
2583 ArgumentExpression::Element(ElementExpression::Constant(0)),
2584 ArgumentExpression::Set(SetExpression::Reference(ReferenceExpression::Constant({
2585 let mut set = Set::with_capacity(2);
2586 set.insert(0);
2587 set.insert(1);
2588 set
2589 }))),
2590 ];
2591 assert_eq!(
2592 t.symmetric_difference(3, args.clone()),
2593 SetExpression::Reduce(SetReduceExpression::Table(
2594 SetReduceOperator::SymmetricDifference,
2595 3,
2596 t.id(),
2597 args
2598 ))
2599 );
2600 }
2601
2602 #[test]
2603 fn set_if_then_else() {
2604 let condition = Condition::Constant(true);
2605
2606 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
2607 let expression2 = SetExpression::Reference(ReferenceExpression::Variable(1));
2608 assert_eq!(
2609 IfThenElse::<SetExpression>::if_then_else(
2610 condition.clone(),
2611 expression1.clone(),
2612 expression2.clone()
2613 ),
2614 SetExpression::If(
2615 Box::new(condition.clone()),
2616 Box::new(expression1),
2617 Box::new(expression2),
2618 )
2619 );
2620
2621 let mut metadata = StateMetadata::default();
2622 let ob = metadata.add_object_type(String::from("something"), 10);
2623 assert!(ob.is_ok());
2624 let ob = ob.unwrap();
2625
2626 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
2627 let s = metadata.create_set(ob, &[0, 1, 2]);
2628 assert!(s.is_ok());
2629 let s = s.unwrap();
2630 assert_eq!(
2631 IfThenElse::<SetExpression>::if_then_else(
2632 condition.clone(),
2633 expression1.clone(),
2634 s.clone()
2635 ),
2636 SetExpression::If(
2637 Box::new(condition.clone()),
2638 Box::new(expression1.clone()),
2639 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
2640 s.clone()
2641 ))),
2642 )
2643 );
2644 assert_eq!(
2645 IfThenElse::<SetExpression>::if_then_else(
2646 condition.clone(),
2647 s.clone(),
2648 expression1.clone(),
2649 ),
2650 SetExpression::If(
2651 Box::new(condition.clone()),
2652 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
2653 s.clone()
2654 ))),
2655 Box::new(expression1),
2656 )
2657 );
2658
2659 let expression1 = SetExpression::Reference(ReferenceExpression::Variable(0));
2660 let v = metadata.add_set_variable(String::from("sv"), ob);
2661 assert!(v.is_ok());
2662 let v = v.unwrap();
2663 assert_eq!(
2664 IfThenElse::<SetExpression>::if_then_else(condition.clone(), expression1.clone(), v,),
2665 SetExpression::If(
2666 Box::new(condition.clone()),
2667 Box::new(expression1.clone()),
2668 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2669 v.id()
2670 ))),
2671 )
2672 );
2673 assert_eq!(
2674 IfThenElse::<SetExpression>::if_then_else(condition.clone(), v, expression1.clone()),
2675 SetExpression::If(
2676 Box::new(condition.clone()),
2677 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2678 v.id()
2679 ))),
2680 Box::new(expression1),
2681 )
2682 );
2683
2684 assert_eq!(
2685 IfThenElse::<SetExpression>::if_then_else(condition.clone(), s.clone(), v),
2686 SetExpression::If(
2687 Box::new(condition.clone()),
2688 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
2689 s.clone()
2690 ))),
2691 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2692 v.id()
2693 ))),
2694 )
2695 );
2696 assert_eq!(
2697 IfThenElse::<SetExpression>::if_then_else(condition.clone(), v, s.clone()),
2698 SetExpression::If(
2699 Box::new(condition),
2700 Box::new(SetExpression::Reference(ReferenceExpression::Variable(
2701 v.id()
2702 ))),
2703 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s))),
2704 )
2705 );
2706 }
2707
2708 #[test]
2709 fn set_if_eval() {
2710 let state = generate_state();
2711 let state_functions = StateFunctions::default();
2712 let mut function_cache = StateFunctionCache::new(&state_functions);
2713 let registry = generate_registry();
2714 let mut s1 = Set::with_capacity(3);
2715 s1.insert(1);
2716 let mut s0 = Set::with_capacity(3);
2717 s0.insert(0);
2718 let expression = SetExpression::If(
2719 Box::new(Condition::Constant(true)),
2720 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
2721 s1.clone(),
2722 ))),
2723 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
2724 s0.clone(),
2725 ))),
2726 );
2727 assert_eq!(
2728 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2729 s1
2730 );
2731 let expression = SetExpression::If(
2732 Box::new(Condition::Constant(false)),
2733 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s1))),
2734 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
2735 s0.clone(),
2736 ))),
2737 );
2738 assert_eq!(
2739 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2740 s0
2741 );
2742 }
2743
2744 #[test]
2745 fn set_reference_eval() {
2746 let registry = generate_registry();
2747 let state = generate_state();
2748 let state_functions = StateFunctions::default();
2749 let mut function_cache = StateFunctionCache::new(&state_functions);
2750 let mut set = Set::with_capacity(3);
2751 set.insert(0);
2752 set.insert(2);
2753 let expression = SetExpression::Reference(ReferenceExpression::Constant(set.clone()));
2754 assert_eq!(
2755 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2756 set
2757 );
2758 let expression = SetExpression::Reference(ReferenceExpression::Variable(0));
2759 assert_eq!(
2760 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2761 state.signature_variables.set_variables[0]
2762 );
2763 let expression = SetExpression::Reference(ReferenceExpression::Table(
2764 TableExpression::Table1D(0, ElementExpression::Constant(0)),
2765 ));
2766 assert_eq!(
2767 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2768 set
2769 );
2770 }
2771
2772 #[test]
2773 fn set_state_function_eval() {
2774 let mut state_metadata = StateMetadata::default();
2775 let ob = state_metadata.add_object_type("ob", 3);
2776 assert!(ob.is_ok());
2777 let ob = ob.unwrap();
2778 let v = state_metadata.add_set_variable("v", ob);
2779 assert!(v.is_ok());
2780 let v = v.unwrap();
2781
2782 let mut state_functions = StateFunctions::default();
2783 let f = state_functions.add_set_function("f", v.add(1));
2784 assert!(f.is_ok());
2785 let f = f.unwrap();
2786 let g = state_functions.add_set_function("g", v.add(2));
2787 assert!(g.is_ok());
2788 let g = g.unwrap();
2789
2790 let state = State {
2791 signature_variables: SignatureVariables {
2792 set_variables: vec![Set::with_capacity(3)],
2793 ..Default::default()
2794 },
2795 ..Default::default()
2796 };
2797
2798 let mut function_cache = StateFunctionCache::new(&state_functions);
2799 let registry = TableRegistry::default();
2800
2801 let mut expected1 = Set::with_capacity(3);
2802 expected1.insert(1);
2803 assert_eq!(
2804 f.eval(&state, &mut function_cache, &state_functions, ®istry),
2805 expected1,
2806 );
2807
2808 let mut expected2 = Set::with_capacity(3);
2809 expected2.insert(2);
2810 assert_eq!(
2811 g.eval(&state, &mut function_cache, &state_functions, ®istry),
2812 expected2,
2813 );
2814
2815 assert_eq!(
2816 f.eval(&state, &mut function_cache, &state_functions, ®istry),
2817 expected1,
2818 );
2819 assert_eq!(
2820 g.eval(&state, &mut function_cache, &state_functions, ®istry),
2821 expected2,
2822 );
2823 }
2824
2825 #[test]
2826 fn set_complement_eval() {
2827 let registry = generate_registry();
2828 let state = generate_state();
2829 let state_functions = StateFunctions::default();
2830 let mut function_cache = StateFunctionCache::new(&state_functions);
2831 let expression = SetExpression::Complement(Box::new(SetExpression::Reference(
2832 ReferenceExpression::Variable(0),
2833 )));
2834 let mut set = Set::with_capacity(3);
2835 set.insert(1);
2836 assert_eq!(
2837 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2838 set
2839 );
2840 }
2841
2842 #[test]
2843 fn set_union_eval() {
2844 let registry = generate_registry();
2845 let state = generate_state();
2846 let state_functions = StateFunctions::default();
2847 let mut function_cache = StateFunctionCache::new(&state_functions);
2848 let expression = SetExpression::SetOperation(
2849 SetOperator::Union,
2850 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
2851 Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
2852 );
2853 let mut set = Set::with_capacity(3);
2854 set.insert(0);
2855 set.insert(1);
2856 set.insert(2);
2857 assert_eq!(
2858 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2859 set
2860 );
2861 let expression = SetExpression::SetOperation(
2862 SetOperator::Union,
2863 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
2864 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
2865 );
2866 assert_eq!(
2867 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2868 state.signature_variables.set_variables[0]
2869 );
2870 }
2871
2872 #[test]
2873 fn set_union_state_variable_x_eval() {
2874 let mut state_metadata = StateMetadata::default();
2875 let ob = state_metadata.add_object_type("ob", 3);
2876 assert!(ob.is_ok());
2877 let ob = ob.unwrap();
2878 let v = state_metadata.add_set_variable("v", ob);
2879 assert!(v.is_ok());
2880 let v = v.unwrap();
2881
2882 let mut state_functions = StateFunctions::default();
2883 let f = state_functions.add_set_function("f", v.add(1));
2884 assert!(f.is_ok());
2885 let f = f.unwrap();
2886
2887 let state = State {
2888 signature_variables: SignatureVariables {
2889 set_variables: vec![Set::with_capacity(3)],
2890 ..Default::default()
2891 },
2892 ..Default::default()
2893 };
2894
2895 let mut function_cache = StateFunctionCache::new(&state_functions);
2896 let registry = TableRegistry::default();
2897
2898 let expression = f.clone() | !f;
2899
2900 let mut expected = Set::with_capacity(3);
2901 expected.insert(0);
2902 expected.insert(1);
2903 expected.insert(2);
2904 assert_eq!(
2905 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2906 expected,
2907 );
2908 }
2909
2910 #[test]
2911 fn set_union_state_variable_y_eval() {
2912 let mut state_metadata = StateMetadata::default();
2913 let ob = state_metadata.add_object_type("ob", 3);
2914 assert!(ob.is_ok());
2915 let ob = ob.unwrap();
2916 let v = state_metadata.add_set_variable("v", ob);
2917 assert!(v.is_ok());
2918 let v = v.unwrap();
2919
2920 let mut state_functions = StateFunctions::default();
2921 let f = state_functions.add_set_function("f", v.add(1));
2922 assert!(f.is_ok());
2923 let f = f.unwrap();
2924
2925 let state = State {
2926 signature_variables: SignatureVariables {
2927 set_variables: vec![Set::with_capacity(3)],
2928 ..Default::default()
2929 },
2930 ..Default::default()
2931 };
2932
2933 let mut function_cache = StateFunctionCache::new(&state_functions);
2934 let registry = TableRegistry::default();
2935
2936 let expression = !f.clone() | f;
2937
2938 let mut expected = Set::with_capacity(3);
2939 expected.insert(0);
2940 expected.insert(1);
2941 expected.insert(2);
2942 assert_eq!(
2943 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2944 expected,
2945 );
2946 }
2947
2948 #[test]
2949 fn set_difference_eval() {
2950 let registry = generate_registry();
2951 let state = generate_state();
2952 let state_functions = StateFunctions::default();
2953 let mut function_cache = StateFunctionCache::new(&state_functions);
2954 let expression = SetExpression::SetOperation(
2955 SetOperator::Difference,
2956 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
2957 Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
2958 );
2959 let mut set = Set::with_capacity(3);
2960 set.insert(2);
2961 assert_eq!(
2962 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2963 set
2964 );
2965 let expression = SetExpression::SetOperation(
2966 SetOperator::Difference,
2967 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
2968 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
2969 );
2970 assert_eq!(
2971 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
2972 Set::with_capacity(3)
2973 );
2974 }
2975
2976 #[test]
2977 fn set_difference_state_variable_y_eval() {
2978 let mut state_metadata = StateMetadata::default();
2979 let ob = state_metadata.add_object_type("ob", 3);
2980 assert!(ob.is_ok());
2981 let ob = ob.unwrap();
2982 let v = state_metadata.add_set_variable("v", ob);
2983 assert!(v.is_ok());
2984 let v = v.unwrap();
2985
2986 let mut state_functions = StateFunctions::default();
2987 let f = state_functions.add_set_function("f", v.add(1));
2988 assert!(f.is_ok());
2989 let f = f.unwrap();
2990
2991 let state = State {
2992 signature_variables: SignatureVariables {
2993 set_variables: vec![Set::with_capacity(3)],
2994 ..Default::default()
2995 },
2996 ..Default::default()
2997 };
2998
2999 let mut function_cache = StateFunctionCache::new(&state_functions);
3000 let registry = TableRegistry::default();
3001
3002 let expression = f.add(0).add(1) - v.add(0);
3003
3004 let mut expected = Set::with_capacity(3);
3005 expected.insert(1);
3006 assert_eq!(
3007 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3008 expected,
3009 );
3010 }
3011
3012 #[test]
3013 fn set_intersect_eval() {
3014 let registry = generate_registry();
3015 let state = generate_state();
3016 let state_functions = StateFunctions::default();
3017 let mut function_cache = StateFunctionCache::new(&state_functions);
3018 let expression = SetExpression::SetOperation(
3019 SetOperator::Intersection,
3020 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3021 Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
3022 );
3023 let mut set = Set::with_capacity(3);
3024 set.insert(0);
3025 assert_eq!(
3026 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3027 set
3028 );
3029 let expression = SetExpression::SetOperation(
3030 SetOperator::Intersection,
3031 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3032 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3033 );
3034 assert_eq!(
3035 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3036 state.signature_variables.set_variables[0]
3037 );
3038 }
3039
3040 #[test]
3041 fn set_intersect_state_variable_x_eval() {
3042 let mut state_metadata = StateMetadata::default();
3043 let ob = state_metadata.add_object_type("ob", 3);
3044 assert!(ob.is_ok());
3045 let ob = ob.unwrap();
3046 let v = state_metadata.add_set_variable("v", ob);
3047 assert!(v.is_ok());
3048 let v = v.unwrap();
3049
3050 let mut state_functions = StateFunctions::default();
3051 let f = state_functions.add_set_function("f", v.add(1).add(2));
3052 assert!(f.is_ok());
3053 let f = f.unwrap();
3054
3055 let state = State {
3056 signature_variables: SignatureVariables {
3057 set_variables: vec![Set::with_capacity(3)],
3058 ..Default::default()
3059 },
3060 ..Default::default()
3061 };
3062
3063 let mut function_cache = StateFunctionCache::new(&state_functions);
3064 let registry = TableRegistry::default();
3065
3066 let expression = f.clone() & v.add(0).add(1);
3067
3068 let mut expected = Set::with_capacity(3);
3069 expected.insert(1);
3070 assert_eq!(
3071 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3072 expected,
3073 );
3074 }
3075
3076 #[test]
3077 fn set_intersect_state_variable_y_eval() {
3078 let mut state_metadata = StateMetadata::default();
3079 let ob = state_metadata.add_object_type("ob", 3);
3080 assert!(ob.is_ok());
3081 let ob = ob.unwrap();
3082 let v = state_metadata.add_set_variable("v", ob);
3083 assert!(v.is_ok());
3084 let v = v.unwrap();
3085
3086 let mut state_functions = StateFunctions::default();
3087 let f = state_functions.add_set_function("f", v.add(1).add(2));
3088 assert!(f.is_ok());
3089 let f = f.unwrap();
3090
3091 let state = State {
3092 signature_variables: SignatureVariables {
3093 set_variables: vec![Set::with_capacity(3)],
3094 ..Default::default()
3095 },
3096 ..Default::default()
3097 };
3098
3099 let mut function_cache = StateFunctionCache::new(&state_functions);
3100 let registry = TableRegistry::default();
3101
3102 let expression = f & v.add(0).add(1);
3103
3104 let mut expected = Set::with_capacity(3);
3105 expected.insert(1);
3106 assert_eq!(
3107 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3108 expected
3109 )
3110 }
3111
3112 #[test]
3113 fn set_add_eval() {
3114 let registry = generate_registry();
3115 let state = generate_state();
3116 let state_functions = StateFunctions::default();
3117 let mut function_cache = StateFunctionCache::new(&state_functions);
3118 let expression = SetExpression::SetElementOperation(
3119 SetElementOperator::Add,
3120 ElementExpression::Constant(1),
3121 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3122 );
3123 let mut set = Set::with_capacity(3);
3124 set.insert(0);
3125 set.insert(1);
3126 set.insert(2);
3127 assert_eq!(
3128 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3129 set
3130 );
3131 let expression = SetExpression::SetElementOperation(
3132 SetElementOperator::Add,
3133 ElementExpression::Constant(0),
3134 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3135 );
3136 assert_eq!(
3137 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3138 state.signature_variables.set_variables[0]
3139 );
3140 }
3141
3142 #[test]
3143 fn set_remove_eval() {
3144 let registry = generate_registry();
3145 let state = generate_state();
3146 let state_functions = StateFunctions::default();
3147 let mut function_cache = StateFunctionCache::new(&state_functions);
3148 let expression = SetExpression::SetElementOperation(
3149 SetElementOperator::Remove,
3150 ElementExpression::Constant(2),
3151 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3152 );
3153 let mut set = Set::with_capacity(3);
3154 set.insert(0);
3155 assert_eq!(
3156 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3157 set
3158 );
3159 let expression = SetExpression::SetElementOperation(
3160 SetElementOperator::Remove,
3161 ElementExpression::Constant(1),
3162 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3163 );
3164 assert_eq!(
3165 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3166 state.signature_variables.set_variables[0]
3167 );
3168 }
3169
3170 #[test]
3171 fn set_reduce_eval() {
3172 let state = State::default();
3173 let state_functions = StateFunctions::default();
3174 let mut function_cache = StateFunctionCache::new(&state_functions);
3175 let registry = TableRegistry {
3176 set_tables: TableData {
3177 tables: vec![Table::new(
3178 {
3179 let mut map = FxHashMap::default();
3180 map.insert(vec![0, 0, 0, 0], {
3181 let mut set = Set::with_capacity(5);
3182 set.insert(0);
3183 set.insert(1);
3184 set
3185 });
3186 map.insert(vec![0, 0, 0, 1], {
3187 let mut set = Set::with_capacity(5);
3188 set.insert(0);
3189 set.insert(2);
3190 set
3191 });
3192 map.insert(vec![0, 0, 1, 0], {
3193 let mut set = Set::with_capacity(5);
3194 set.insert(0);
3195 set.insert(3);
3196 set
3197 });
3198 map
3199 },
3200 {
3201 let mut set = Set::with_capacity(5);
3202 set.insert(0);
3203 set.insert(4);
3204 set
3205 },
3206 )],
3207 ..Default::default()
3208 },
3209 ..Default::default()
3210 };
3211 let expression = SetExpression::Reduce(SetReduceExpression::Table(
3212 SetReduceOperator::Union,
3213 5,
3214 0,
3215 vec![
3216 ArgumentExpression::Element(ElementExpression::Constant(0)),
3217 ArgumentExpression::Element(ElementExpression::Constant(0)),
3218 ArgumentExpression::Set(SetExpression::Reference(ReferenceExpression::Constant({
3219 let mut set = Set::with_capacity(2);
3220 set.insert(0);
3221 set.insert(1);
3222 set
3223 }))),
3224 ArgumentExpression::Vector(VectorExpression::Reference(
3225 ReferenceExpression::Constant(vec![0, 1]),
3226 )),
3227 ],
3228 ));
3229 assert_eq!(
3230 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3231 {
3232 let mut set = Set::with_capacity(5);
3233 set.insert(0);
3234 set.insert(1);
3235 set.insert(2);
3236 set.insert(3);
3237 set.insert(4);
3238 set
3239 }
3240 );
3241 }
3242
3243 #[test]
3244 fn set_from_vector_eval() {
3245 let registry = generate_registry();
3246 let state = generate_state();
3247 let state_functions = StateFunctions::default();
3248 let mut function_cache = StateFunctionCache::new(&state_functions);
3249 let expression = SetExpression::FromVector(
3250 3,
3251 Box::new(VectorExpression::Reference(ReferenceExpression::Constant(
3252 vec![0, 1],
3253 ))),
3254 );
3255 let mut set = Set::with_capacity(3);
3256 set.insert(0);
3257 set.insert(1);
3258 assert_eq!(
3259 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3260 set
3261 );
3262 let expression = SetExpression::FromVector(
3263 3,
3264 Box::new(VectorExpression::Reference(ReferenceExpression::Variable(
3265 0,
3266 ))),
3267 );
3268 let mut set = Set::with_capacity(3);
3269 set.insert(0);
3270 set.insert(2);
3271 assert_eq!(
3272 expression.eval(&state, &mut function_cache, &state_functions, ®istry),
3273 set
3274 );
3275 }
3276
3277 #[test]
3278 fn set_reference_simplify() {
3279 let registry = generate_registry();
3280 let mut set = Set::with_capacity(3);
3281 set.insert(0);
3282 set.insert(2);
3283 let expression = SetExpression::Reference(ReferenceExpression::Constant(set.clone()));
3284 assert_eq!(expression.simplify(®istry), expression);
3285 let expression = SetExpression::Reference(ReferenceExpression::Variable(0));
3286 assert_eq!(expression.simplify(®istry), expression);
3287 let expression = SetExpression::Reference(ReferenceExpression::Table(
3288 TableExpression::Table1D(0, ElementExpression::Constant(0)),
3289 ));
3290 assert_eq!(
3291 expression.simplify(®istry),
3292 SetExpression::Reference(ReferenceExpression::Constant(set))
3293 );
3294 }
3295
3296 #[test]
3297 fn set_complement_simplify() {
3298 let registry = generate_registry();
3299 let expression = SetExpression::Complement(Box::new(SetExpression::Reference(
3300 ReferenceExpression::Variable(0),
3301 )));
3302 assert_eq!(expression.simplify(®istry), expression);
3303 let mut set = Set::with_capacity(3);
3304 set.insert(1);
3305 let expression = SetExpression::Complement(Box::new(SetExpression::Reference(
3306 ReferenceExpression::Constant(set),
3307 )));
3308 let mut set = Set::with_capacity(3);
3309 set.insert(0);
3310 set.insert(2);
3311 assert_eq!(
3312 expression.simplify(®istry),
3313 SetExpression::Reference(ReferenceExpression::Constant(set))
3314 );
3315 let expression = SetExpression::Complement(Box::new(SetExpression::Complement(Box::new(
3316 SetExpression::Reference(ReferenceExpression::Variable(0)),
3317 ))));
3318 assert_eq!(
3319 expression.simplify(®istry),
3320 SetExpression::Reference(ReferenceExpression::Variable(0))
3321 );
3322 }
3323
3324 #[test]
3325 fn set_union_simplify() {
3326 let registry = generate_registry();
3327 let expression = SetExpression::SetOperation(
3328 SetOperator::Union,
3329 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3330 Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
3331 );
3332 assert_eq!(expression.simplify(®istry), expression);
3333 let mut x = Set::with_capacity(3);
3334 x.insert(0);
3335 x.insert(2);
3336 let mut y = Set::with_capacity(3);
3337 y.insert(0);
3338 y.insert(1);
3339 let expression = SetExpression::SetOperation(
3340 SetOperator::Union,
3341 Box::new(SetExpression::Reference(ReferenceExpression::Constant(x))),
3342 Box::new(SetExpression::Reference(ReferenceExpression::Constant(y))),
3343 );
3344 let mut set = Set::with_capacity(3);
3345 set.insert(0);
3346 set.insert(1);
3347 set.insert(2);
3348 assert_eq!(
3349 expression.simplify(®istry),
3350 SetExpression::Reference(ReferenceExpression::Constant(set))
3351 );
3352 let expression = SetExpression::SetOperation(
3353 SetOperator::Union,
3354 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3355 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3356 );
3357 assert_eq!(
3358 expression.simplify(®istry),
3359 SetExpression::Reference(ReferenceExpression::Variable(0))
3360 );
3361 }
3362
3363 #[test]
3364 fn set_difference_simplify() {
3365 let registry = generate_registry();
3366 let expression = SetExpression::SetOperation(
3367 SetOperator::Difference,
3368 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3369 Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
3370 );
3371 assert_eq!(expression.simplify(®istry), expression);
3372 let mut x = Set::with_capacity(3);
3373 x.insert(0);
3374 x.insert(2);
3375 let mut y = Set::with_capacity(3);
3376 y.insert(0);
3377 y.insert(1);
3378 let expression = SetExpression::SetOperation(
3379 SetOperator::Difference,
3380 Box::new(SetExpression::Reference(ReferenceExpression::Constant(x))),
3381 Box::new(SetExpression::Reference(ReferenceExpression::Constant(y))),
3382 );
3383 let mut set = Set::with_capacity(3);
3384 set.insert(2);
3385 assert_eq!(
3386 expression.simplify(®istry),
3387 SetExpression::Reference(ReferenceExpression::Constant(set))
3388 );
3389 }
3390
3391 #[test]
3392 fn set_intersect_simplify() {
3393 let registry = generate_registry();
3394 let expression = SetExpression::SetOperation(
3395 SetOperator::Intersection,
3396 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3397 Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
3398 );
3399 assert_eq!(expression.simplify(®istry), expression);
3400 let mut x = Set::with_capacity(3);
3401 x.insert(0);
3402 x.insert(2);
3403 let mut y = Set::with_capacity(3);
3404 y.insert(0);
3405 y.insert(1);
3406 let expression = SetExpression::SetOperation(
3407 SetOperator::Intersection,
3408 Box::new(SetExpression::Reference(ReferenceExpression::Constant(x))),
3409 Box::new(SetExpression::Reference(ReferenceExpression::Constant(y))),
3410 );
3411 let mut set = Set::with_capacity(3);
3412 set.insert(0);
3413 assert_eq!(
3414 expression.simplify(®istry),
3415 SetExpression::Reference(ReferenceExpression::Constant(set))
3416 );
3417 let expression = SetExpression::SetOperation(
3418 SetOperator::Union,
3419 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3420 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3421 );
3422 assert_eq!(
3423 expression.simplify(®istry),
3424 SetExpression::Reference(ReferenceExpression::Variable(0))
3425 );
3426 }
3427
3428 #[test]
3429 fn set_add_simplify() {
3430 let registry = generate_registry();
3431 let expression = SetExpression::SetElementOperation(
3432 SetElementOperator::Add,
3433 ElementExpression::Constant(1),
3434 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3435 );
3436 assert_eq!(expression.simplify(®istry), expression);
3437 let mut set = Set::with_capacity(3);
3438 set.insert(0);
3439 set.insert(2);
3440 let expression = SetExpression::SetElementOperation(
3441 SetElementOperator::Add,
3442 ElementExpression::Constant(1),
3443 Box::new(SetExpression::Reference(ReferenceExpression::Constant(set))),
3444 );
3445 let mut set = Set::with_capacity(3);
3446 set.insert(0);
3447 set.insert(1);
3448 set.insert(2);
3449 assert_eq!(
3450 expression.simplify(®istry),
3451 SetExpression::Reference(ReferenceExpression::Constant(set))
3452 );
3453 }
3454
3455 #[test]
3456 fn set_remove_simplify() {
3457 let registry = generate_registry();
3458 let expression = SetExpression::SetElementOperation(
3459 SetElementOperator::Remove,
3460 ElementExpression::Constant(2),
3461 Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
3462 );
3463 assert_eq!(expression.simplify(®istry), expression);
3464 let mut set = Set::with_capacity(3);
3465 set.insert(0);
3466 set.insert(2);
3467 let expression = SetExpression::SetElementOperation(
3468 SetElementOperator::Remove,
3469 ElementExpression::Constant(2),
3470 Box::new(SetExpression::Reference(ReferenceExpression::Constant(set))),
3471 );
3472 let mut set = Set::with_capacity(3);
3473 set.insert(0);
3474 assert_eq!(
3475 expression.simplify(®istry),
3476 SetExpression::Reference(ReferenceExpression::Constant(set))
3477 );
3478 }
3479
3480 #[test]
3481 fn set_reduce_constant_simplify() {
3482 let registry = TableRegistry {
3483 set_tables: TableData {
3484 tables: vec![Table::new(
3485 {
3486 let mut map = FxHashMap::default();
3487 map.insert(vec![0, 0, 0, 0], {
3488 let mut set = Set::with_capacity(5);
3489 set.insert(0);
3490 set.insert(1);
3491 set
3492 });
3493 map.insert(vec![0, 0, 0, 1], {
3494 let mut set = Set::with_capacity(5);
3495 set.insert(0);
3496 set.insert(2);
3497 set
3498 });
3499 map.insert(vec![0, 0, 1, 0], {
3500 let mut set = Set::with_capacity(5);
3501 set.insert(0);
3502 set.insert(3);
3503 set
3504 });
3505 map
3506 },
3507 {
3508 let mut set = Set::with_capacity(5);
3509 set.insert(0);
3510 set.insert(4);
3511 set
3512 },
3513 )],
3514 ..Default::default()
3515 },
3516 ..Default::default()
3517 };
3518 let expression = SetExpression::Reduce(SetReduceExpression::Table(
3519 SetReduceOperator::Union,
3520 5,
3521 0,
3522 vec![
3523 ArgumentExpression::Element(ElementExpression::Constant(0)),
3524 ArgumentExpression::Element(ElementExpression::Constant(0)),
3525 ArgumentExpression::Set(SetExpression::Reference(ReferenceExpression::Constant({
3526 let mut set = Set::with_capacity(2);
3527 set.insert(0);
3528 set.insert(1);
3529 set
3530 }))),
3531 ArgumentExpression::Vector(VectorExpression::Reference(
3532 ReferenceExpression::Constant(vec![0, 1]),
3533 )),
3534 ],
3535 ));
3536 assert_eq!(
3537 expression.simplify(®istry),
3538 SetExpression::Reference(ReferenceExpression::Constant({
3539 let mut set = Set::with_capacity(5);
3540 set.insert(0);
3541 set.insert(1);
3542 set.insert(2);
3543 set.insert(3);
3544 set.insert(4);
3545 set
3546 }))
3547 );
3548 }
3549
3550 #[test]
3551 fn set_reduce_simplify() {
3552 let registry = TableRegistry {
3553 set_tables: TableData {
3554 tables: vec![Table::new(
3555 {
3556 let mut map = FxHashMap::default();
3557 map.insert(vec![0, 0, 0, 0], {
3558 let mut set = Set::with_capacity(5);
3559 set.insert(0);
3560 set.insert(1);
3561 set
3562 });
3563 map.insert(vec![0, 0, 0, 1], {
3564 let mut set = Set::with_capacity(5);
3565 set.insert(0);
3566 set.insert(2);
3567 set
3568 });
3569 map.insert(vec![0, 0, 1, 0], {
3570 let mut set = Set::with_capacity(5);
3571 set.insert(0);
3572 set.insert(3);
3573 set
3574 });
3575 map
3576 },
3577 {
3578 let mut set = Set::with_capacity(5);
3579 set.insert(0);
3580 set.insert(4);
3581 set
3582 },
3583 )],
3584 ..Default::default()
3585 },
3586 ..Default::default()
3587 };
3588 let expression = SetExpression::Reduce(SetReduceExpression::Table(
3589 SetReduceOperator::Union,
3590 5,
3591 0,
3592 vec![
3593 ArgumentExpression::Element(ElementExpression::If(
3594 Box::new(Condition::Constant(true)),
3595 Box::new(ElementExpression::Variable(0)),
3596 Box::new(ElementExpression::Constant(0)),
3597 )),
3598 ArgumentExpression::Element(ElementExpression::If(
3599 Box::new(Condition::Constant(true)),
3600 Box::new(ElementExpression::Variable(0)),
3601 Box::new(ElementExpression::Constant(0)),
3602 )),
3603 ArgumentExpression::Set(SetExpression::Reference(ReferenceExpression::Constant({
3604 let mut set = Set::with_capacity(2);
3605 set.insert(0);
3606 set.insert(1);
3607 set
3608 }))),
3609 ArgumentExpression::Vector(VectorExpression::Reference(
3610 ReferenceExpression::Constant(vec![0, 1]),
3611 )),
3612 ],
3613 ));
3614 assert_eq!(
3615 expression.simplify(®istry),
3616 SetExpression::Reduce(SetReduceExpression::Table(
3617 SetReduceOperator::Union,
3618 5,
3619 0,
3620 vec![
3621 ArgumentExpression::Element(ElementExpression::Variable(0),),
3622 ArgumentExpression::Element(ElementExpression::Variable(0),),
3623 ArgumentExpression::Set(SetExpression::Reference(
3624 ReferenceExpression::Constant({
3625 let mut set = Set::with_capacity(2);
3626 set.insert(0);
3627 set.insert(1);
3628 set
3629 })
3630 )),
3631 ArgumentExpression::Vector(VectorExpression::Reference(
3632 ReferenceExpression::Constant(vec![0, 1]),
3633 )),
3634 ],
3635 ))
3636 );
3637 }
3638
3639 #[test]
3640 fn set_from_vector_simplify() {
3641 let registry = generate_registry();
3642 let expression = SetExpression::FromVector(
3643 3,
3644 Box::new(VectorExpression::Reference(ReferenceExpression::Constant(
3645 vec![0, 1],
3646 ))),
3647 );
3648 let mut set = Set::with_capacity(3);
3649 set.insert(0);
3650 set.insert(1);
3651 assert_eq!(
3652 expression.simplify(®istry),
3653 SetExpression::Reference(ReferenceExpression::Constant(set))
3654 );
3655 let expression = SetExpression::FromVector(
3656 3,
3657 Box::new(VectorExpression::Reference(ReferenceExpression::Variable(
3658 0,
3659 ))),
3660 );
3661 let mut set = Set::with_capacity(3);
3662 set.insert(0);
3663 set.insert(2);
3664 assert_eq!(expression.simplify(®istry), expression);
3665 }
3666
3667 #[test]
3668 fn set_if_simplify() {
3669 let registry = generate_registry();
3670 let mut s1 = Set::with_capacity(3);
3671 s1.insert(1);
3672 let mut s0 = Set::with_capacity(3);
3673 s0.insert(0);
3674 let expression = SetExpression::If(
3675 Box::new(Condition::Constant(true)),
3676 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
3677 s1.clone(),
3678 ))),
3679 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
3680 s0.clone(),
3681 ))),
3682 );
3683 assert_eq!(
3684 expression.simplify(®istry),
3685 SetExpression::Reference(ReferenceExpression::Constant(s1.clone()))
3686 );
3687 let expression = SetExpression::If(
3688 Box::new(Condition::Constant(false)),
3689 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
3690 s1.clone(),
3691 ))),
3692 Box::new(SetExpression::Reference(ReferenceExpression::Constant(
3693 s0.clone(),
3694 ))),
3695 );
3696 assert_eq!(
3697 expression.simplify(®istry),
3698 SetExpression::Reference(ReferenceExpression::Constant(s0.clone()))
3699 );
3700 let expression = SetExpression::If(
3701 Box::new(Condition::ComparisonI(
3702 ComparisonOperator::Gt,
3703 Box::new(IntegerExpression::Variable(0)),
3704 Box::new(IntegerExpression::Constant(1)),
3705 )),
3706 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s1))),
3707 Box::new(SetExpression::Reference(ReferenceExpression::Constant(s0))),
3708 );
3709 assert_eq!(expression.simplify(®istry), expression);
3710 }
3711}