Skip to main content

dypdl/expression/
set_expression.rs

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/// Set expression.
16#[derive(Debug, PartialEq, Clone)]
17pub enum SetExpression {
18    /// Reference to a constant or a variable.
19    Reference(ReferenceExpression<Set>),
20    /// State function index.
21    StateFunction(usize),
22    /// Complement set.
23    Complement(Box<SetExpression>),
24    /// Operation on two sets.
25    SetOperation(SetOperator, Box<SetExpression>, Box<SetExpression>),
26    /// Operation on an element and a set.
27    SetElementOperation(SetElementOperator, ElementExpression, Box<SetExpression>),
28    /// Reduce operation on a table of sets.
29    Reduce(SetReduceExpression),
30    /// Conversion from a vector.
31    FromVector(usize, Box<VectorExpression>),
32    /// If-then-else expression, which returns the first one if the condition holds and the second one otherwise.
33    If(Box<Condition>, Box<SetExpression>, Box<SetExpression>),
34}
35
36/// Operator on an two sets.
37#[derive(Debug, PartialEq, Eq, Clone)]
38pub enum SetOperator {
39    /// Union.
40    Union,
41    /// Difference.
42    Difference,
43    /// Intersection.
44    Intersection,
45}
46
47/// Operator on an elment and a set.
48#[derive(Debug, PartialEq, Eq, Clone)]
49pub enum SetElementOperator {
50    /// Add an element.
51    Add,
52    /// Remove an element.
53    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    /// Returns an expression representing the complement.
81    ///
82    /// # Examples
83    ///
84    /// ```
85    /// use dypdl::prelude::*;
86    ///
87    /// let mut model = Model::default();
88    /// let object_type = model.add_object_type("object", 4).unwrap();
89    /// let state = model.target.clone();
90    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
91    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
92    ///
93    /// let expression = SetExpression::from(set);
94    /// let expression = !expression;
95    /// let expected = model.create_set(object_type, &[2, 3]).unwrap();
96    /// assert_eq!(
97    ///     expression.eval(
98    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
99    ///     ),
100    ///     expected,
101    /// );
102    /// ```
103    #[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    /// Returns an expression representing the complement.
113    ///
114    /// # Examples
115    ///
116    /// ```
117    /// use dypdl::prelude::*;
118    ///
119    /// let mut model = Model::default();
120    /// let object_type = model.add_object_type("object", 4).unwrap();
121    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
122    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
123    /// let state = model.target.clone();
124    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
125    ///
126    /// let expression = !variable;
127    /// let expected = model.create_set(object_type, &[2, 3]).unwrap();
128    /// assert_eq!(
129    ///     expression.eval(
130    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
131    ///     ),
132    ///     expected,
133    /// );
134    /// ```
135    #[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    /// Returns an expression representing the union.
145    ///
146    /// # Examples
147    ///
148    /// ```
149    /// use dypdl::prelude::*;
150    ///
151    /// let mut model = Model::default();
152    /// let object_type = model.add_object_type("object", 4).unwrap();
153    /// let state = model.target.clone();
154    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
155    ///
156    /// let a = model.create_set(object_type, &[0, 1]).unwrap();
157    /// let a = SetExpression::from(a);
158    /// let b = model.create_set(object_type, &[1, 2]).unwrap();
159    /// let b = SetExpression::from(b);
160    /// let expression = a | b;
161    /// let expected = model.create_set(object_type, &[0, 1, 2]).unwrap();
162    /// assert_eq!(
163    ///     expression.eval(
164    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
165    ///     ),
166    ///     expected,
167    /// );
168    /// ```
169    #[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    /// Returns an expression representing the difference.
179    ///
180    /// # Examples
181    ///
182    /// ```
183    /// use dypdl::prelude::*;
184    ///
185    /// let mut model = Model::default();
186    /// let object_type = model.add_object_type("object", 4).unwrap();
187    /// let state = model.target.clone();
188    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
189    ///
190    /// let a = model.create_set(object_type, &[0, 1]).unwrap();
191    /// let a = SetExpression::from(a);
192    /// let b = model.create_set(object_type, &[1, 2]).unwrap();
193    /// let b = SetExpression::from(b);
194    /// let expression = a - b;
195    /// let expected = model.create_set(object_type, &[0]).unwrap();
196    /// assert_eq!(
197    ///     expression.eval(
198    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
199    ///     ),
200    ///     expected,
201    /// );
202    /// ```
203    #[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    /// Returns an expression representing the intersection.
213    ///
214    /// # Examples
215    ///
216    /// ```
217    /// use dypdl::prelude::*;
218    ///
219    /// let mut model = Model::default();
220    /// let object_type = model.add_object_type("object", 4).unwrap();
221    /// let state = model.target.clone();
222    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
223    ///
224    /// let a = model.create_set(object_type, &[0, 1]).unwrap();
225    /// let a = SetExpression::from(a);
226    /// let b = model.create_set(object_type, &[1, 2]).unwrap();
227    /// let b = SetExpression::from(b);
228    /// let expression = a & b;
229    /// let expected = model.create_set(object_type, &[1]).unwrap();
230    /// assert_eq!(
231    ///     expression.eval(
232    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
233    ///     ),
234    ///     expected,
235    /// );
236    /// ```
237    #[inline]
238    fn bitand(self, rhs: Self) -> Self::Output {
239        SetExpression::SetOperation(SetOperator::Intersection, Box::new(self), Box::new(rhs))
240    }
241}
242
243/// A trait for operations on an element and a set.
244///
245/// # Examples
246///
247/// ```
248/// use dypdl::prelude::*;
249///
250/// let mut model = Model::default();
251/// let object_type = model.add_object_type("object", 4).unwrap();
252/// let set = model.create_set(object_type, &[0, 1]).unwrap();
253/// let variable = model.add_set_variable("variable", object_type, set).unwrap();
254/// let state = model.target.clone();
255/// let mut function_cache = StateFunctionCache::new(&model.state_functions);
256///
257/// let expression = variable.add(2);
258/// let expected = model.create_set(object_type, &[0, 1, 2]).unwrap();
259/// assert_eq!(expression.eval(&state, &mut function_cache, &model.state_functions, &model.table_registry), expected);
260///
261/// let expression = variable.remove(1);
262/// let expected = model.create_set(object_type, &[0]).unwrap();
263/// assert_eq!(
264///     expression.eval(
265///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
266///     ),
267///     expected,
268/// );
269/// ```
270pub trait SetElementOperation<Rhs> {
271    /// Returns a set expression, where an element is added.
272    fn add(self, rhs: Rhs) -> SetExpression;
273    /// Returns a set expression, where an element is removed.
274    fn remove(self, rhs: Rhs) -> SetExpression;
275}
276
277impl Table1DHandle<Set> {
278    /// Returns a constant in a 1D set table.
279    ///
280    /// # Examples
281    ///
282    /// ```
283    /// use dypdl::prelude::*;
284    ///
285    /// let mut model = Model::default();
286    /// let object_type = model.add_object_type("object", 2).unwrap();
287    /// let a = model.create_set(object_type, &[1]).unwrap();
288    /// let b = model.create_set(object_type, &[0]).unwrap();
289    /// let table = model.add_table_1d("table", vec![a.clone(), b]).unwrap();
290    /// let variable = model.add_element_variable("variable", object_type, 0).unwrap();
291    /// let state = model.target.clone();
292    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
293    ///
294    /// let expression = table.element(variable);
295    /// assert_eq!(
296    ///     expression.eval(
297    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
298    ///     ),
299    ///     a,
300    /// );
301    /// ```
302    #[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    /// Returns the union of sets in a 1D table.
314    ///
315    /// # Examples
316    ///
317    /// ```
318    /// use dypdl::prelude::*;
319    ///
320    /// let mut model = Model::default();
321    /// let capacity = 2;
322    /// let object_type = model.add_object_type("object", capacity).unwrap();
323    /// let a = model.create_set(object_type, &[0, 1]).unwrap();
324    /// let b = model.create_set(object_type, &[0]).unwrap();
325    /// let table = model.add_table_1d("table", vec![a, b]).unwrap();
326    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
327    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
328    /// let state = model.target.clone();
329    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
330    ///
331    /// let expression = table.union(capacity, variable);
332    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
333    /// assert_eq!(
334    ///     expression.eval(
335    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
336    ///     ),
337    ///     expected,
338    /// );
339    /// ```
340    #[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    /// Returns the intersection of sets in a 1D table.
354    ///
355    /// # Examples
356    ///
357    /// ```
358    /// use dypdl::prelude::*;
359    ///
360    /// let mut model = Model::default();
361    /// let capacity = 2;
362    /// let object_type = model.add_object_type("object", capacity).unwrap();
363    /// let a = model.create_set(object_type, &[0, 1]).unwrap();
364    /// let b = model.create_set(object_type, &[0]).unwrap();
365    /// let table = model.add_table_1d("table", vec![a, b]).unwrap();
366    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
367    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
368    /// let state = model.target.clone();
369    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
370    ///
371    /// let expression = table.intersection(capacity, variable);
372    /// let expected = model.create_set(object_type, &[0]).unwrap();
373    /// assert_eq!(
374    ///     expression.eval(
375    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
376    ///     ),
377    ///     expected,
378    /// );
379    /// ```
380    #[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    /// Returns the symmetric difference (disjunctive union) of sets in a 1D table.
394    ///
395    /// # Examples
396    ///
397    /// ```
398    /// use dypdl::prelude::*;
399    ///
400    /// let mut model = Model::default();
401    /// let capacity = 2;
402    /// let object_type = model.add_object_type("object", capacity).unwrap();
403    /// let a = model.create_set(object_type, &[1]).unwrap();
404    /// let b = model.create_set(object_type, &[0]).unwrap();
405    /// let table = model.add_table_1d("table", vec![a, b]).unwrap();
406    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
407    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
408    /// let state = model.target.clone();
409    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
410    ///
411    /// let expression = table.symmetric_difference(capacity, variable);
412    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
413    /// assert_eq!(
414    ///     expression.eval(
415    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
416    ///     ),
417    ///     expected,
418    /// );
419    #[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    /// Returns a constant in a 2D set table.
435    ///
436    /// # Examples
437    ///
438    /// ```
439    /// use dypdl::prelude::*;
440    ///
441    /// let mut model = Model::default();
442    /// let object_type = model.add_object_type("object", 2).unwrap();
443    /// let a = model.create_set(object_type, &[1]).unwrap();
444    /// let b = model.create_set(object_type, &[0]).unwrap();
445    /// let table = model.add_table_2d("table", vec![vec![a.clone(), b.clone()], vec![b, a.clone()]]).unwrap();
446    /// let variable = model.add_element_variable("variable", object_type, 0).unwrap();
447    /// let state = model.target.clone();
448    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
449    ///
450    /// let expression = table.element(variable, 0);
451    /// assert_eq!(
452    ///     expression.eval(
453    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
454    ///     ),
455    ///     a,
456    /// );
457    /// ```
458    #[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    /// Returns the union of sets in a 2D table.
472    ///
473    /// ```
474    /// use dypdl::prelude::*;
475    ///
476    /// let mut model = Model::default();
477    /// let capacity = 2;
478    /// let object_type = model.add_object_type("object", capacity).unwrap();
479    /// let a = model.create_set(object_type, &[1]).unwrap();
480    /// let b = model.create_set(object_type, &[0]).unwrap();
481    /// let table = model.add_table_2d("table", vec![vec![a.clone(), b.clone()], vec![a, b]]).unwrap();
482    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
483    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
484    /// let state = model.target.clone();
485    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
486    ///
487    /// let expression = table.union(capacity, variable, 0);
488    /// let expected = model.create_set(object_type, &[1]).unwrap();
489    /// assert_eq!(
490    ///     expression.eval(
491    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
492    ///     ),
493    ///     expected,
494    /// );
495    ///
496    /// let expression = table.union(capacity, variable, variable);
497    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
498    /// assert_eq!(
499    ///     expression.eval(
500    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
501    ///     ),
502    ///     expected,
503    /// );
504    /// ```
505    #[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    /// Returns the intersection of sets in a 2D table.
521    ///
522    /// ```
523    /// use dypdl::prelude::*;
524    ///
525    /// let mut model = Model::default();
526    /// let capacity = 2;
527    /// let object_type = model.add_object_type("object", capacity).unwrap();
528    /// let a = model.create_set(object_type, &[1]).unwrap();
529    /// let b = model.create_set(object_type, &[0]).unwrap();
530    /// let table = model.add_table_2d("table", vec![vec![a.clone(), b.clone()], vec![a, b]]).unwrap();
531    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
532    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
533    /// let state = model.target.clone();
534    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
535    ///
536    /// let expression = table.intersection(capacity, variable, 0);
537    /// let expected = model.create_set(object_type, &[1]).unwrap();
538    /// assert_eq!(
539    ///     expression.eval(
540    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
541    ///     ),
542    ///     expected,
543    /// );
544    ///
545    /// let expression = table.intersection(capacity, variable, variable);
546    /// let expected = model.create_set(object_type, &[]).unwrap();
547    /// assert_eq!(
548    ///     expression.eval(
549    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
550    ///     ),
551    ///     expected,
552    /// );
553    /// ```
554    #[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    /// Returns the symmetric difference (disjunctive union) of sets in a 2D table.
570    ///
571    /// ```
572    /// use dypdl::prelude::*;
573    ///
574    /// let mut model = Model::default();
575    /// let capacity = 2;
576    /// let object_type = model.add_object_type("object", capacity).unwrap();
577    /// let a = model.create_set(object_type, &[1]).unwrap();
578    /// let b = model.create_set(object_type, &[0]).unwrap();
579    /// let table = model.add_table_2d("table", vec![vec![a.clone(), b.clone()], vec![a, b]]).unwrap();
580    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
581    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
582    /// let state = model.target.clone();
583    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
584    ///
585    /// let expression = table.symmetric_difference(capacity, variable, 0);
586    /// let expected = model.create_set(object_type, &[]).unwrap();
587    /// assert_eq!(
588    ///     expression.eval(
589    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
590    ///     ),
591    ///     expected,
592    /// );
593    ///
594    /// let expression = table.symmetric_difference(capacity, variable, variable);
595    /// let expected = model.create_set(object_type, &[]).unwrap();
596    /// assert_eq!(
597    ///     expression.eval(
598    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
599    ///     ),
600    ///     expected,
601    /// );
602    /// ```
603    #[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    /// Returns a constant in a 3D set table.
621    ///
622    /// # Examples
623    ///
624    /// ```
625    /// use dypdl::prelude::*;
626    ///
627    /// let mut model = Model::default();
628    /// let object_type = model.add_object_type("object", 2).unwrap();
629    /// let a = model.create_set(object_type, &[1]).unwrap();
630    /// let b = model.create_set(object_type, &[0]).unwrap();
631    /// let table = model.add_table_3d(
632    ///     "table",
633    ///     vec![
634    ///         vec![vec![a.clone(), b.clone()], vec![b.clone(), a.clone()]],
635    ///         vec![vec![a.clone(), b.clone()], vec![b, a.clone()]],
636    ///     ]
637    /// ).unwrap();
638    /// let variable = model.add_element_variable("variable", object_type, 0).unwrap();
639    /// let state = model.target.clone();
640    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
641    ///
642    /// let expression = table.element(variable, variable + 1, 1);
643    /// assert_eq!(
644    ///     expression.eval(
645    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
646    ///     ),
647    ///     a,
648    /// );
649    /// ```
650    #[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    /// Returns the union of sets in a 3D table.
666    ///
667    /// # Examples
668    ///
669    /// ```
670    /// use dypdl::prelude::*;
671    ///
672    /// let mut model = Model::default();
673    /// let capacity = 2;
674    /// let object_type = model.add_object_type("object", capacity).unwrap();
675    /// let a = model.create_set(object_type, &[1]).unwrap();
676    /// let b = model.create_set(object_type, &[0]).unwrap();
677    /// let table = model.add_table_3d(
678    ///     "table",
679    ///     vec![
680    ///         vec![vec![a.clone(), b.clone()], vec![b.clone(), a.clone()]],
681    ///         vec![vec![a.clone(), b.clone()], vec![b, a.clone()]],
682    ///     ]
683    /// ).unwrap();
684    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
685    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
686    /// let state = model.target.clone();
687    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
688    ///
689    /// let expression = table.union(capacity, variable, 0, 0);
690    /// let expected = model.create_set(object_type, &[1]).unwrap();
691    /// assert_eq!(
692    ///     expression.eval(    
693    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
694    ///     ),
695    ///     expected,
696    /// );
697    ///
698    /// let expression = table.union(capacity, variable, variable, variable);
699    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
700    /// assert_eq!(
701    ///     expression.eval(
702    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
703    ///     ),
704    ///     expected,
705    /// );
706    /// ```
707    #[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    /// Returns the intersection of sets in a 3D table.
725    ///
726    /// # Examples
727    ///
728    /// ```
729    /// use dypdl::prelude::*;
730    ///
731    /// let mut model = Model::default();
732    /// let capacity = 2;
733    /// let object_type = model.add_object_type("object", capacity).unwrap();
734    /// let a = model.create_set(object_type, &[1]).unwrap();
735    /// let b = model.create_set(object_type, &[0]).unwrap();
736    /// let table = model.add_table_3d(
737    ///     "table",
738    ///     vec![
739    ///         vec![vec![a.clone(), b.clone()], vec![b.clone(), a.clone()]],
740    ///         vec![vec![a.clone(), b.clone()], vec![b, a.clone()]],
741    ///     ]
742    /// ).unwrap();
743    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
744    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
745    /// let state = model.target.clone();
746    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
747    ///
748    /// let expression = table.intersection(capacity, variable, 0, 0);
749    /// let expected = model.create_set(object_type, &[1]).unwrap();
750    /// assert_eq!(
751    ///     expression.eval(
752    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
753    ///     ),
754    ///     expected,
755    /// );
756    ///
757    /// let expression = table.intersection(capacity, variable, variable, variable);
758    /// let expected = model.create_set(object_type, &[]).unwrap();
759    /// assert_eq!(
760    ///     expression.eval(
761    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
762    ///     ),  
763    ///     expected,
764    /// );
765    /// ```
766    #[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    /// Returns the symmetric difference (disjunctive union) of sets in a 3D table.
784    ///
785    /// # Examples
786    ///
787    /// ```
788    /// use dypdl::prelude::*;
789    ///
790    /// let mut model = Model::default();
791    /// let capacity = 2;
792    /// let object_type = model.add_object_type("object", capacity).unwrap();
793    /// let a = model.create_set(object_type, &[1]).unwrap();
794    /// let b = model.create_set(object_type, &[0]).unwrap();
795    /// let table = model.add_table_3d(
796    ///     "table",
797    ///     vec![
798    ///         vec![vec![a.clone(), b.clone()], vec![b.clone(), a.clone()]],
799    ///         vec![vec![a.clone(), b.clone()], vec![b, a.clone()]],
800    ///     ]
801    /// ).unwrap();
802    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
803    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
804    /// let state = model.target.clone();
805    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
806    ///
807    /// let expression = table.symmetric_difference(capacity, variable, 0, 0);
808    /// let expected = model.create_set(object_type, &[]).unwrap();
809    /// assert_eq!(
810    ///     expression.eval(
811    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
812    ///     ),
813    ///     expected,
814    /// );
815    ///
816    /// let expression = table.symmetric_difference(capacity, variable, variable, variable);
817    /// let expected = model.create_set(object_type, &[]).unwrap();
818    /// assert_eq!(
819    ///     expression.eval(
820    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
821    ///     ),
822    ///     expected,
823    /// );
824    /// ```
825    #[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    /// Returns a constant in a set table.
845    ///
846    /// # Examples
847    ///
848    /// ```
849    /// use dypdl::prelude::*;
850    /// use rustc_hash::FxHashMap;
851    ///
852    /// let mut model = Model::default();
853    /// let object_type = model.add_object_type("object", 2).unwrap();
854    /// let a = model.create_set(object_type, &[1]).unwrap();
855    /// let b = model.create_set(object_type, &[0]).unwrap();
856    /// let map = FxHashMap::from_iter(
857    ///     vec![(vec![0, 0, 0, 0], a.clone()), (vec![1, 1, 1, 1], a.clone())]
858    /// );
859    /// let table = model.add_table("table", map, b).unwrap();
860    /// let variable = model.add_element_variable("variable", object_type, 0).unwrap();
861    /// let state = model.target.clone();
862    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
863    ///
864    /// let indices = vec![
865    ///     ElementExpression::from(variable),
866    ///     ElementExpression::from(0),
867    ///     ElementExpression::from(0),
868    ///     ElementExpression::from(0),
869    /// ];
870    /// let expression = table.element(indices);
871    /// assert_eq!(
872    ///     expression.eval(
873    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
874    ///     ),
875    ///     a,
876    /// );
877    /// ```
878    #[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    /// Returns the union of sets in a table.
891    ///
892    /// # Examples
893    ///
894    /// ```
895    /// use dypdl::prelude::*;
896    /// use dypdl::expression::*;
897    /// use rustc_hash::FxHashMap;
898    ///
899    /// let capacity = 2;
900    /// let mut model = Model::default();
901    /// let object_type = model.add_object_type("object", capacity).unwrap();
902    /// let a = model.create_set(object_type, &[1]).unwrap();
903    /// let b = model.create_set(object_type, &[0]).unwrap();
904    /// let map = FxHashMap::from_iter(
905    ///     vec![(vec![0, 0, 0, 0], a.clone()), (vec![1, 1, 1, 1], a)]
906    /// );
907    /// let table = model.add_table("table", map, b).unwrap();
908    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
909    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
910    /// let state = model.target.clone();
911    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
912    ///
913    /// let indices = vec![
914    ///     ArgumentExpression::from(variable),
915    ///     ArgumentExpression::from(0),
916    ///     ArgumentExpression::from(0),
917    ///     ArgumentExpression::from(0),
918    /// ];
919    /// let expression = table.union(capacity, indices);
920    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
921    /// assert_eq!(
922    ///     expression.eval(
923    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
924    ///     ),
925    ///     expected,
926    /// );
927    ///
928    /// let indices = vec![
929    ///     ArgumentExpression::from(variable),
930    ///     ArgumentExpression::from(variable),
931    ///     ArgumentExpression::from(variable),
932    ///     ArgumentExpression::from(variable),
933    /// ];
934    /// let expression = table.union(capacity, indices);
935    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
936    /// assert_eq!(
937    ///     expression.eval(
938    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
939    ///     ),
940    ///     expected,
941    /// );
942    /// ```
943    #[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    /// Returns the intersection of sets in a table.
958    ///
959    /// # Examples
960    ///
961    /// ```
962    /// use dypdl::prelude::*;
963    /// use dypdl::expression::*;
964    /// use rustc_hash::FxHashMap;
965    ///
966    /// let capacity = 2;
967    /// let mut model = Model::default();
968    /// let object_type = model.add_object_type("object", capacity).unwrap();
969    /// let a = model.create_set(object_type, &[1]).unwrap();
970    /// let b = model.create_set(object_type, &[0]).unwrap();
971    /// let map = FxHashMap::from_iter(
972    ///     vec![(vec![0, 0, 0, 0], a.clone()), (vec![1, 1, 1, 1], a)]
973    /// );
974    /// let table = model.add_table("table", map, b).unwrap();
975    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
976    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
977    /// let state = model.target.clone();
978    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
979    ///
980    /// let indices = vec![
981    ///     ArgumentExpression::from(variable),
982    ///     ArgumentExpression::from(0),
983    ///     ArgumentExpression::from(0),
984    ///     ArgumentExpression::from(0),
985    /// ];
986    /// let expression = table.intersection(capacity, indices);
987    /// let expected = model.create_set(object_type, &[]).unwrap();
988    /// assert_eq!(
989    ///     expression.eval(
990    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
991    ///     ),
992    ///     expected,
993    /// );
994    ///
995    /// let indices = vec![
996    ///     ArgumentExpression::from(variable),
997    ///     ArgumentExpression::from(variable),
998    ///     ArgumentExpression::from(variable),
999    ///     ArgumentExpression::from(variable),
1000    /// ];
1001    /// let expression = table.intersection(capacity, indices);
1002    /// let expected = model.create_set(object_type, &[]).unwrap();
1003    /// assert_eq!(
1004    ///     expression.eval(
1005    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
1006    ///     ),
1007    ///     expected,
1008    /// );
1009    /// ```
1010    #[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    /// Returns the symmetric difference (disjunctive union) of sets in a table.
1025    ///
1026    /// # Examples
1027    ///
1028    /// ```
1029    /// use dypdl::prelude::*;
1030    /// use dypdl::expression::*;
1031    /// use rustc_hash::FxHashMap;
1032    ///
1033    /// let capacity = 2;
1034    /// let mut model = Model::default();
1035    /// let object_type = model.add_object_type("object", capacity).unwrap();
1036    /// let a = model.create_set(object_type, &[1]).unwrap();
1037    /// let b = model.create_set(object_type, &[0]).unwrap();
1038    /// let map = FxHashMap::from_iter(
1039    ///     vec![(vec![0, 0, 0, 0], a.clone()), (vec![1, 1, 1, 1], a)]
1040    /// );
1041    /// let table = model.add_table("table", map, b).unwrap();
1042    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
1043    /// let variable = model.add_set_variable("variable", object_type, set).unwrap();
1044    /// let state = model.target.clone();
1045    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
1046    ///
1047    /// let indices = vec![
1048    ///     ArgumentExpression::from(variable),
1049    ///     ArgumentExpression::from(0),
1050    ///     ArgumentExpression::from(0),
1051    ///     ArgumentExpression::from(0),
1052    /// ];
1053    /// let expression = table.symmetric_difference(capacity, indices);
1054    /// let expected = model.create_set(object_type, &[0, 1]).unwrap();
1055    /// assert_eq!(
1056    ///     expression.eval(
1057    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
1058    ///     ),
1059    ///     expected,
1060    /// );
1061    ///
1062    /// let indices = vec![
1063    ///     ArgumentExpression::from(variable),
1064    ///     ArgumentExpression::from(variable),
1065    ///     ArgumentExpression::from(variable),
1066    ///     ArgumentExpression::from(variable),
1067    /// ];
1068    /// let expression = table.symmetric_difference(capacity, indices);
1069    /// let expected = model.create_set(object_type, &[]).unwrap();
1070    /// assert_eq!(
1071    ///     expression.eval(
1072    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
1073    ///     ),
1074    ///     expected,
1075    /// );
1076    /// ```
1077    #[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            /// Returns an expression representing the union.
1112            #[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            /// Returns an expression representing the difference.
1122            #[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            /// Returns an expression representing the intersection.
1132            #[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    /// Returns the evaluation result.
1185    ///
1186    /// # Panics
1187    ///
1188    /// Panics if the cost of the transition state is used or a min/max reduce operation is performed on an empty set or vector.
1189    ///
1190    /// # Examples
1191    ///
1192    /// ```
1193    /// use dypdl::prelude::*;
1194    ///
1195    /// let mut model = Model::default();
1196    /// let object_type = model.add_object_type("object_type", 2).unwrap();
1197    /// let set = model.create_set(object_type, &[0, 1]).unwrap();
1198    /// let variable = model.add_set_variable("variable", object_type, set.clone()).unwrap();
1199    /// let state = model.target.clone();
1200    /// let mut function_cache = StateFunctionCache::new(&model.state_functions);
1201    ///
1202    /// let expression = SetExpression::from(variable);
1203    /// assert_eq!(
1204    ///     expression.eval(
1205    ///         &state, &mut function_cache, &model.state_functions, &model.table_registry,
1206    ///     ),
1207    ///     set,
1208    /// );
1209    /// ```
1210    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    /// Returns a simplified version by precomputation.
1292    ///
1293    /// # Panics
1294    ///
1295    /// Panics if a min/max reduce operation is performed on an empty set or vector.
1296    pub fn simplify(&self, registry: &TableRegistry) -> SetExpression {
1297        match self {
1298            Self::Reference(expression) => {
1299                Self::Reference(expression.simplify(registry, &registry.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, &registry),
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, &registry),
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, &registry),
2756            set
2757        );
2758        let expression = SetExpression::Reference(ReferenceExpression::Variable(0));
2759        assert_eq!(
2760            expression.eval(&state, &mut function_cache, &state_functions, &registry),
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, &registry),
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, &registry),
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, &registry),
2812            expected2,
2813        );
2814
2815        assert_eq!(
2816            f.eval(&state, &mut function_cache, &state_functions, &registry),
2817            expected1,
2818        );
2819        assert_eq!(
2820            g.eval(&state, &mut function_cache, &state_functions, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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, &registry),
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(&registry), expression);
3285        let expression = SetExpression::Reference(ReferenceExpression::Variable(0));
3286        assert_eq!(expression.simplify(&registry), expression);
3287        let expression = SetExpression::Reference(ReferenceExpression::Table(
3288            TableExpression::Table1D(0, ElementExpression::Constant(0)),
3289        ));
3290        assert_eq!(
3291            expression.simplify(&registry),
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(&registry), 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(&registry),
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(&registry),
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(&registry), 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(&registry),
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(&registry),
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(&registry), 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(&registry),
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(&registry), 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(&registry),
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(&registry),
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(&registry), 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(&registry),
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(&registry), 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(&registry),
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(&registry),
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(&registry),
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(&registry),
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(&registry), 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(&registry),
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(&registry),
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(&registry), expression);
3710    }
3711}