Skip to main content

dypdl_heuristic_search/search_algorithm/data_structure/
hashable_state.rs

1use super::state_registry::StateInRegistry;
2use dypdl::variable_type::{Continuous, Element, Integer, OrderedContinuous, Set, Vector};
3use dypdl::ResourceVariables;
4use ordered_float::OrderedFloat;
5use std::fmt::Debug;
6use std::hash::Hash;
7use std::ops::Deref;
8
9/// Signature variables that can be hashed.
10///
11/// However, using continuous variables is not recommended as it may cause a numerical issue.
12#[derive(Debug, PartialEq, Eq, Hash, Clone, Default)]
13pub struct HashableSignatureVariables {
14    /// Set variables.
15    pub set_variables: Vec<Set>,
16    /// Vector variables.
17    pub vector_variables: Vec<Vector>,
18    /// Element variables.
19    pub element_variables: Vec<Element>,
20    /// Integer numeric variables.
21    pub integer_variables: Vec<Integer>,
22    /// Continuous numeric variables.
23    pub continuous_variables: Vec<OrderedContinuous>,
24}
25
26impl From<dypdl::SignatureVariables> for HashableSignatureVariables {
27    fn from(variables: dypdl::SignatureVariables) -> HashableSignatureVariables {
28        HashableSignatureVariables {
29            set_variables: variables.set_variables,
30            vector_variables: variables.vector_variables,
31            element_variables: variables.element_variables,
32            integer_variables: variables.integer_variables,
33            continuous_variables: variables
34                .continuous_variables
35                .into_iter()
36                .map(OrderedFloat)
37                .collect(),
38        }
39    }
40}
41
42/// Signature variables that can be hashed.
43///
44/// However, using continuous variables is not recommended as it may cause a numerical issue.
45#[derive(Debug, PartialEq, Eq, Hash, Clone, Default)]
46pub struct HashableResourceVariables {
47    /// Element variables.
48    pub element_variables: Vec<Element>,
49    /// Integer numeric variables.
50    pub integer_variables: Vec<Integer>,
51    /// Continuous variables.
52    pub continuous_variables: Vec<OrderedContinuous>,
53}
54
55impl From<dypdl::ResourceVariables> for HashableResourceVariables {
56    fn from(variables: dypdl::ResourceVariables) -> HashableResourceVariables {
57        HashableResourceVariables {
58            element_variables: variables.element_variables,
59            integer_variables: variables.integer_variables,
60            continuous_variables: variables
61                .continuous_variables
62                .into_iter()
63                .map(OrderedFloat)
64                .collect(),
65        }
66    }
67}
68
69/// State that can be hashed.
70///
71/// However, using continuous variables is not recommended as it may cause a numerical issue.
72#[derive(Debug, PartialEq, Eq, Hash, Clone, Default)]
73pub struct HashableState {
74    signature_variables: HashableSignatureVariables,
75    resource_variables: HashableResourceVariables,
76}
77
78impl From<dypdl::State> for HashableState {
79    fn from(state: dypdl::State) -> HashableState {
80        HashableState {
81            signature_variables: HashableSignatureVariables::from(state.signature_variables),
82            resource_variables: HashableResourceVariables::from(state.resource_variables),
83        }
84    }
85}
86
87impl dypdl::StateInterface for HashableState {
88    #[inline]
89    fn get_number_of_set_variables(&self) -> usize {
90        self.signature_variables.set_variables.len()
91    }
92
93    #[inline]
94    fn get_set_variable(&self, i: usize) -> &Set {
95        &self.signature_variables.set_variables[i]
96    }
97
98    #[inline]
99    fn get_number_of_vector_variables(&self) -> usize {
100        self.signature_variables.vector_variables.len()
101    }
102
103    #[inline]
104    fn get_vector_variable(&self, i: usize) -> &Vector {
105        &self.signature_variables.vector_variables[i]
106    }
107
108    #[inline]
109    fn get_number_of_element_variables(&self) -> usize {
110        self.signature_variables.element_variables.len()
111    }
112
113    #[inline]
114    fn get_element_variable(&self, i: usize) -> Element {
115        self.signature_variables.element_variables[i]
116    }
117
118    #[inline]
119    fn get_number_of_integer_variables(&self) -> usize {
120        self.signature_variables.integer_variables.len()
121    }
122
123    #[inline]
124    fn get_integer_variable(&self, i: usize) -> Integer {
125        self.signature_variables.integer_variables[i]
126    }
127
128    #[inline]
129    fn get_number_of_continuous_variables(&self) -> usize {
130        self.signature_variables.continuous_variables.len()
131    }
132
133    #[inline]
134    fn get_continuous_variable(&self, i: usize) -> Continuous {
135        self.signature_variables.continuous_variables[i].into_inner()
136    }
137
138    #[inline]
139    fn get_number_of_element_resource_variables(&self) -> usize {
140        self.resource_variables.element_variables.len()
141    }
142
143    #[inline]
144    fn get_element_resource_variable(&self, i: usize) -> Element {
145        self.resource_variables.element_variables[i]
146    }
147
148    #[inline]
149    fn get_number_of_integer_resource_variables(&self) -> usize {
150        self.resource_variables.integer_variables.len()
151    }
152
153    #[inline]
154    fn get_integer_resource_variable(&self, i: usize) -> Integer {
155        self.resource_variables.integer_variables[i]
156    }
157
158    #[inline]
159    fn get_number_of_continuous_resource_variables(&self) -> usize {
160        self.resource_variables.continuous_variables.len()
161    }
162
163    #[inline]
164    fn get_continuous_resource_variable(&self, i: usize) -> Continuous {
165        self.resource_variables.continuous_variables[i].into_inner()
166    }
167}
168
169/// State that can be hashed by signature variables.
170///
171/// However, using continuous variables in signature variables is not recommended
172/// because it may cause a numerical issue.
173#[derive(Debug, PartialEq, Clone, Default)]
174pub struct StateWithHashableSignatureVariables {
175    /// Signature variables.
176    pub signature_variables: HashableSignatureVariables,
177    /// Resource variables.
178    pub resource_variables: ResourceVariables,
179}
180
181impl From<dypdl::State> for StateWithHashableSignatureVariables {
182    fn from(state: dypdl::State) -> StateWithHashableSignatureVariables {
183        StateWithHashableSignatureVariables {
184            signature_variables: HashableSignatureVariables::from(state.signature_variables),
185            resource_variables: state.resource_variables,
186        }
187    }
188}
189
190impl<K> From<StateInRegistry<K>> for StateWithHashableSignatureVariables
191where
192    K: Hash + Eq + Clone + Debug + Deref<Target = HashableSignatureVariables>,
193{
194    fn from(state: StateInRegistry<K>) -> StateWithHashableSignatureVariables {
195        StateWithHashableSignatureVariables {
196            signature_variables: state.signature_variables.deref().clone(),
197            resource_variables: state.resource_variables,
198        }
199    }
200}
201
202impl dypdl::StateInterface for StateWithHashableSignatureVariables {
203    #[inline]
204    fn get_number_of_set_variables(&self) -> usize {
205        self.signature_variables.set_variables.len()
206    }
207
208    #[inline]
209    fn get_set_variable(&self, i: usize) -> &Set {
210        &self.signature_variables.set_variables[i]
211    }
212
213    #[inline]
214    fn get_number_of_vector_variables(&self) -> usize {
215        self.signature_variables.vector_variables.len()
216    }
217
218    #[inline]
219    fn get_vector_variable(&self, i: usize) -> &Vector {
220        &self.signature_variables.vector_variables[i]
221    }
222
223    #[inline]
224    fn get_number_of_element_variables(&self) -> usize {
225        self.signature_variables.element_variables.len()
226    }
227
228    #[inline]
229    fn get_element_variable(&self, i: usize) -> Element {
230        self.signature_variables.element_variables[i]
231    }
232
233    #[inline]
234    fn get_number_of_integer_variables(&self) -> usize {
235        self.signature_variables.integer_variables.len()
236    }
237
238    #[inline]
239    fn get_integer_variable(&self, i: usize) -> Integer {
240        self.signature_variables.integer_variables[i]
241    }
242
243    #[inline]
244    fn get_number_of_continuous_variables(&self) -> usize {
245        self.signature_variables.continuous_variables.len()
246    }
247
248    #[inline]
249    fn get_continuous_variable(&self, i: usize) -> Continuous {
250        self.signature_variables.continuous_variables[i].into_inner()
251    }
252
253    #[inline]
254    fn get_number_of_element_resource_variables(&self) -> usize {
255        self.resource_variables.element_variables.len()
256    }
257
258    #[inline]
259    fn get_element_resource_variable(&self, i: usize) -> Element {
260        self.resource_variables.element_variables[i]
261    }
262
263    #[inline]
264    fn get_number_of_integer_resource_variables(&self) -> usize {
265        self.resource_variables.integer_variables.len()
266    }
267
268    #[inline]
269    fn get_integer_resource_variable(&self, i: usize) -> Integer {
270        self.resource_variables.integer_variables[i]
271    }
272
273    #[inline]
274    fn get_number_of_continuous_resource_variables(&self) -> usize {
275        self.resource_variables.continuous_variables.len()
276    }
277
278    #[inline]
279    fn get_continuous_resource_variable(&self, i: usize) -> Continuous {
280        self.resource_variables.continuous_variables[i]
281    }
282}
283
284#[cfg(test)]
285mod tests {
286    use super::*;
287    use dypdl::variable_type::Set;
288    use dypdl::{expression::*, StateFunctions, TableRegistry};
289    use dypdl::{StateFunctionCache, StateInterface};
290    use std::rc::Rc;
291
292    #[test]
293    fn hashable_signature_variables() {
294        let mut set1 = Set::with_capacity(3);
295        set1.insert(0);
296        set1.insert(2);
297        let mut set2 = Set::with_capacity(3);
298        set2.insert(0);
299        set2.insert(1);
300        let signature_variables = dypdl::SignatureVariables {
301            set_variables: vec![set1, set2],
302            vector_variables: vec![vec![0, 2], vec![1, 2]],
303            element_variables: vec![1, 2],
304            integer_variables: vec![1, 2, 3],
305            continuous_variables: vec![1.0, 2.0, 3.0],
306        };
307        let hashable_signature_variables =
308            HashableSignatureVariables::from(signature_variables.clone());
309        assert_eq!(
310            hashable_signature_variables.set_variables,
311            signature_variables.set_variables
312        );
313        assert_eq!(
314            hashable_signature_variables.vector_variables,
315            signature_variables.vector_variables
316        );
317        assert_eq!(
318            hashable_signature_variables.element_variables,
319            signature_variables.element_variables
320        );
321        assert_eq!(
322            hashable_signature_variables.integer_variables,
323            signature_variables.integer_variables
324        );
325        assert_eq!(
326            hashable_signature_variables.continuous_variables,
327            vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)]
328        );
329    }
330
331    #[test]
332    fn hashable_resource_variables() {
333        let resource_variables = dypdl::ResourceVariables {
334            element_variables: vec![],
335            integer_variables: vec![4, 5, 6],
336            continuous_variables: vec![4.0, 5.0, 6.0],
337        };
338        let hashable_resource_variables =
339            HashableResourceVariables::from(resource_variables.clone());
340        assert_eq!(
341            hashable_resource_variables.element_variables,
342            resource_variables.element_variables
343        );
344        assert_eq!(
345            hashable_resource_variables.integer_variables,
346            resource_variables.integer_variables
347        );
348        assert_eq!(
349            hashable_resource_variables.continuous_variables,
350            vec![OrderedFloat(4.0), OrderedFloat(5.0), OrderedFloat(6.0)]
351        );
352    }
353
354    #[test]
355    fn hashable_state_from() {
356        let mut set1 = Set::with_capacity(3);
357        set1.insert(0);
358        set1.insert(2);
359        let mut set2 = Set::with_capacity(3);
360        set2.insert(0);
361        set2.insert(1);
362        let signature_variables = dypdl::SignatureVariables {
363            set_variables: vec![set1, set2],
364            vector_variables: vec![vec![0, 2], vec![1, 2]],
365            element_variables: vec![1, 2],
366            integer_variables: vec![1, 2, 3],
367            continuous_variables: vec![1.0, 2.0, 3.0],
368        };
369        let resource_variables = dypdl::ResourceVariables {
370            element_variables: vec![],
371            integer_variables: vec![4, 5, 6],
372            continuous_variables: vec![4.0, 5.0, 6.0],
373        };
374        let state = HashableState::from(dypdl::State {
375            signature_variables: signature_variables.clone(),
376            resource_variables: resource_variables.clone(),
377        });
378        assert_eq!(
379            state.signature_variables.set_variables,
380            signature_variables.set_variables
381        );
382        assert_eq!(
383            state.signature_variables.vector_variables,
384            signature_variables.vector_variables
385        );
386        assert_eq!(
387            state.signature_variables.element_variables,
388            signature_variables.element_variables
389        );
390        assert_eq!(
391            state.signature_variables.integer_variables,
392            signature_variables.integer_variables
393        );
394        assert_eq!(
395            state.signature_variables.continuous_variables,
396            vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)]
397        );
398        assert_eq!(
399            state.resource_variables.element_variables,
400            resource_variables.element_variables
401        );
402        assert_eq!(
403            state.resource_variables.integer_variables,
404            resource_variables.integer_variables
405        );
406        assert_eq!(
407            state.resource_variables.continuous_variables,
408            vec![OrderedFloat(4.0), OrderedFloat(5.0), OrderedFloat(6.0)]
409        );
410    }
411
412    #[test]
413    fn state_get_number_of_set_variables() {
414        let state = HashableState {
415            signature_variables: HashableSignatureVariables {
416                set_variables: vec![Set::default()],
417                ..Default::default()
418            },
419            ..Default::default()
420        };
421        assert_eq!(state.get_number_of_set_variables(), 1);
422    }
423
424    #[test]
425    fn state_get_set_variable() {
426        let mut set = Set::with_capacity(2);
427        set.insert(1);
428        let state = HashableState {
429            signature_variables: HashableSignatureVariables {
430                set_variables: vec![Set::with_capacity(2), set.clone()],
431                ..Default::default()
432            },
433            ..Default::default()
434        };
435        assert_eq!(state.get_set_variable(0), &Set::with_capacity(2));
436        assert_eq!(state.get_set_variable(1), &set);
437    }
438
439    #[test]
440    #[should_panic]
441    fn state_get_set_variable_panic() {
442        let state = HashableState {
443            signature_variables: HashableSignatureVariables {
444                set_variables: vec![Set::default()],
445                ..Default::default()
446            },
447            ..Default::default()
448        };
449        state.get_set_variable(1);
450    }
451
452    #[test]
453    fn state_get_number_of_vector_variables() {
454        let state = HashableState {
455            signature_variables: HashableSignatureVariables {
456                vector_variables: vec![Vector::default()],
457                ..Default::default()
458            },
459            ..Default::default()
460        };
461        assert_eq!(state.get_number_of_vector_variables(), 1);
462    }
463
464    #[test]
465    fn state_get_vector_variable() {
466        let state = HashableState {
467            signature_variables: HashableSignatureVariables {
468                vector_variables: vec![Vector::default(), vec![1]],
469                ..Default::default()
470            },
471            ..Default::default()
472        };
473        assert_eq!(state.get_vector_variable(0), &Vector::default());
474        assert_eq!(state.get_vector_variable(1), &vec![1]);
475    }
476
477    #[test]
478    #[should_panic]
479    fn state_get_vector_variable_panic() {
480        let state = HashableState {
481            signature_variables: HashableSignatureVariables {
482                vector_variables: vec![Vector::default()],
483                ..Default::default()
484            },
485            ..Default::default()
486        };
487        state.get_vector_variable(1);
488    }
489
490    #[test]
491    fn state_get_number_of_element_variables() {
492        let state = HashableState {
493            signature_variables: HashableSignatureVariables {
494                element_variables: vec![0],
495                ..Default::default()
496            },
497            ..Default::default()
498        };
499        assert_eq!(state.get_number_of_element_variables(), 1);
500    }
501
502    #[test]
503    fn state_get_element_variable() {
504        let state = HashableState {
505            signature_variables: HashableSignatureVariables {
506                element_variables: vec![0, 1],
507                ..Default::default()
508            },
509            ..Default::default()
510        };
511        assert_eq!(state.get_element_variable(0), 0);
512        assert_eq!(state.get_element_variable(1), 1);
513    }
514
515    #[test]
516    #[should_panic]
517    fn state_get_element_variable_panic() {
518        let state = HashableState {
519            signature_variables: HashableSignatureVariables {
520                element_variables: vec![0],
521                ..Default::default()
522            },
523            ..Default::default()
524        };
525        state.get_element_variable(1);
526    }
527
528    #[test]
529    fn state_get_number_of_integer_variables() {
530        let state = HashableState {
531            signature_variables: HashableSignatureVariables {
532                integer_variables: vec![0],
533                ..Default::default()
534            },
535            ..Default::default()
536        };
537        assert_eq!(state.get_number_of_integer_variables(), 1);
538    }
539
540    #[test]
541    fn state_get_integer_variable() {
542        let state = HashableState {
543            signature_variables: HashableSignatureVariables {
544                integer_variables: vec![0, 1],
545                ..Default::default()
546            },
547            ..Default::default()
548        };
549        assert_eq!(state.get_integer_variable(0), 0);
550        assert_eq!(state.get_integer_variable(1), 1);
551    }
552
553    #[test]
554    #[should_panic]
555    fn state_get_integer_variable_panic() {
556        let state = HashableState {
557            signature_variables: HashableSignatureVariables {
558                integer_variables: vec![0],
559                ..Default::default()
560            },
561            ..Default::default()
562        };
563        state.get_integer_variable(1);
564    }
565
566    #[test]
567    fn state_get_number_of_continuous_variables() {
568        let state = HashableState {
569            signature_variables: HashableSignatureVariables {
570                continuous_variables: vec![OrderedContinuous::from(0.0)],
571                ..Default::default()
572            },
573            ..Default::default()
574        };
575        assert_eq!(state.get_number_of_continuous_variables(), 1);
576    }
577
578    #[test]
579    fn state_get_continuous_variable() {
580        let state = HashableState {
581            signature_variables: HashableSignatureVariables {
582                continuous_variables: vec![
583                    OrderedContinuous::from(0.0),
584                    OrderedContinuous::from(1.0),
585                ],
586                ..Default::default()
587            },
588            ..Default::default()
589        };
590        assert_eq!(state.get_continuous_variable(0), 0.0);
591        assert_eq!(state.get_continuous_variable(1), 1.0);
592    }
593
594    #[test]
595    #[should_panic]
596    fn state_get_continuous_variable_panic() {
597        let state = HashableState {
598            signature_variables: HashableSignatureVariables {
599                continuous_variables: vec![OrderedContinuous::from(0.0)],
600                ..Default::default()
601            },
602            ..Default::default()
603        };
604        state.get_continuous_variable(1);
605    }
606
607    #[test]
608    fn state_get_number_of_element_resource_variables() {
609        let state = HashableState {
610            resource_variables: HashableResourceVariables {
611                element_variables: vec![0],
612                ..Default::default()
613            },
614            ..Default::default()
615        };
616        assert_eq!(state.get_number_of_element_resource_variables(), 1);
617    }
618
619    #[test]
620    fn state_get_element_resource_variable() {
621        let state = HashableState {
622            resource_variables: HashableResourceVariables {
623                element_variables: vec![0, 1],
624                ..Default::default()
625            },
626            ..Default::default()
627        };
628        assert_eq!(state.get_element_resource_variable(0), 0);
629        assert_eq!(state.get_element_resource_variable(1), 1);
630    }
631
632    #[test]
633    #[should_panic]
634    fn state_get_element_resource_variable_panic() {
635        let state = HashableState {
636            resource_variables: HashableResourceVariables {
637                element_variables: vec![0],
638                ..Default::default()
639            },
640            ..Default::default()
641        };
642        state.get_element_resource_variable(1);
643    }
644
645    #[test]
646    fn state_get_number_of_integer_resource_variables() {
647        let state = HashableState {
648            resource_variables: HashableResourceVariables {
649                integer_variables: vec![0],
650                ..Default::default()
651            },
652            ..Default::default()
653        };
654        assert_eq!(state.get_number_of_integer_resource_variables(), 1);
655    }
656
657    #[test]
658    fn state_get_integer_resource_variable() {
659        let state = HashableState {
660            resource_variables: HashableResourceVariables {
661                integer_variables: vec![0, 1],
662                ..Default::default()
663            },
664            ..Default::default()
665        };
666        assert_eq!(state.get_integer_resource_variable(0), 0);
667        assert_eq!(state.get_integer_resource_variable(1), 1);
668    }
669
670    #[test]
671    #[should_panic]
672    fn state_get_integer_resource_variable_panic() {
673        let state = HashableState {
674            resource_variables: HashableResourceVariables {
675                integer_variables: vec![0],
676                ..Default::default()
677            },
678            ..Default::default()
679        };
680        state.get_integer_resource_variable(1);
681    }
682
683    #[test]
684    fn state_get_number_of_continuous_resource_variables() {
685        let state = HashableState {
686            resource_variables: HashableResourceVariables {
687                continuous_variables: vec![OrderedContinuous::from(0.0)],
688                ..Default::default()
689            },
690            ..Default::default()
691        };
692        assert_eq!(state.get_number_of_continuous_resource_variables(), 1);
693    }
694
695    #[test]
696    fn state_get_continuous_resource_variable() {
697        let state = HashableState {
698            resource_variables: HashableResourceVariables {
699                continuous_variables: vec![
700                    OrderedContinuous::from(0.0),
701                    OrderedContinuous::from(1.0),
702                ],
703                ..Default::default()
704            },
705            ..Default::default()
706        };
707        assert_eq!(state.get_continuous_resource_variable(0), 0.0);
708        assert_eq!(state.get_continuous_resource_variable(1), 1.0);
709    }
710
711    #[test]
712    #[should_panic]
713    fn state_get_continuous_resource_variable_panic() {
714        let state = HashableState {
715            resource_variables: HashableResourceVariables {
716                continuous_variables: vec![OrderedContinuous::from(0.0)],
717                ..Default::default()
718            },
719            ..Default::default()
720        };
721        state.get_continuous_resource_variable(1);
722    }
723
724    #[test]
725    fn apply_effect() {
726        let state_functions = StateFunctions::default();
727        let mut function_cache = StateFunctionCache::new(&state_functions);
728
729        let mut set1 = Set::with_capacity(3);
730        set1.insert(0);
731        set1.insert(2);
732        let mut set2 = Set::with_capacity(3);
733        set2.insert(0);
734        set2.insert(1);
735        let state = HashableState {
736            signature_variables: HashableSignatureVariables {
737                set_variables: vec![set1, set2],
738                vector_variables: vec![vec![0, 2], vec![1, 2]],
739                element_variables: vec![1, 2],
740                integer_variables: vec![1, 2, 3],
741                continuous_variables: vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)],
742            },
743            resource_variables: HashableResourceVariables {
744                element_variables: vec![],
745                integer_variables: vec![4, 5, 6],
746                continuous_variables: vec![OrderedFloat(4.0), OrderedFloat(5.0), OrderedFloat(6.0)],
747            },
748        };
749        let registry = TableRegistry::default();
750        let set_effect1 = SetExpression::SetElementOperation(
751            SetElementOperator::Add,
752            ElementExpression::Constant(1),
753            Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
754        );
755        let set_effect2 = SetExpression::SetElementOperation(
756            SetElementOperator::Remove,
757            ElementExpression::Constant(0),
758            Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
759        );
760        let vector_effect1 = VectorExpression::Push(
761            ElementExpression::Constant(1),
762            Box::new(VectorExpression::Reference(ReferenceExpression::Variable(
763                0,
764            ))),
765        );
766        let vector_effect2 = VectorExpression::Push(
767            ElementExpression::Constant(0),
768            Box::new(VectorExpression::Reference(ReferenceExpression::Variable(
769                1,
770            ))),
771        );
772        let element_effect1 = ElementExpression::Constant(2);
773        let element_effect2 = ElementExpression::Constant(1);
774        let integer_effect1 = IntegerExpression::BinaryOperation(
775            BinaryOperator::Sub,
776            Box::new(IntegerExpression::Variable(0)),
777            Box::new(IntegerExpression::Constant(1)),
778        );
779        let integer_effect2 = IntegerExpression::BinaryOperation(
780            BinaryOperator::Mul,
781            Box::new(IntegerExpression::Variable(1)),
782            Box::new(IntegerExpression::Constant(2)),
783        );
784        let continuous_effect1 = ContinuousExpression::BinaryOperation(
785            BinaryOperator::Sub,
786            Box::new(ContinuousExpression::Variable(0)),
787            Box::new(ContinuousExpression::Constant(1.0)),
788        );
789        let continuous_effect2 = ContinuousExpression::BinaryOperation(
790            BinaryOperator::Mul,
791            Box::new(ContinuousExpression::Variable(1)),
792            Box::new(ContinuousExpression::Constant(2.0)),
793        );
794        let integer_resource_effect1 = IntegerExpression::BinaryOperation(
795            BinaryOperator::Add,
796            Box::new(IntegerExpression::ResourceVariable(0)),
797            Box::new(IntegerExpression::Constant(1)),
798        );
799        let integer_resource_effect2 = IntegerExpression::BinaryOperation(
800            BinaryOperator::Div,
801            Box::new(IntegerExpression::ResourceVariable(1)),
802            Box::new(IntegerExpression::Constant(2)),
803        );
804        let continuous_resource_effect1 = ContinuousExpression::BinaryOperation(
805            BinaryOperator::Add,
806            Box::new(ContinuousExpression::ResourceVariable(0)),
807            Box::new(ContinuousExpression::Constant(1.0)),
808        );
809        let continuous_resource_effect2 = ContinuousExpression::BinaryOperation(
810            BinaryOperator::Div,
811            Box::new(ContinuousExpression::ResourceVariable(1)),
812            Box::new(ContinuousExpression::Constant(2.0)),
813        );
814        let effect = dypdl::Effect {
815            set_effects: vec![(0, set_effect1), (1, set_effect2)],
816            vector_effects: vec![(0, vector_effect1), (1, vector_effect2)],
817            element_effects: vec![(0, element_effect1), (1, element_effect2)],
818            integer_effects: vec![(0, integer_effect1), (1, integer_effect2)],
819            continuous_effects: vec![(0, continuous_effect1), (1, continuous_effect2)],
820            element_resource_effects: vec![],
821            integer_resource_effects: vec![
822                (0, integer_resource_effect1),
823                (1, integer_resource_effect2),
824            ],
825            continuous_resource_effects: vec![
826                (0, continuous_resource_effect1),
827                (1, continuous_resource_effect2),
828            ],
829        };
830
831        let mut set1 = Set::with_capacity(3);
832        set1.insert(0);
833        set1.insert(1);
834        set1.insert(2);
835        let mut set2 = Set::with_capacity(3);
836        set2.insert(1);
837        let expected = HashableState {
838            signature_variables: HashableSignatureVariables {
839                set_variables: vec![set1, set2],
840                vector_variables: vec![vec![0, 2, 1], vec![1, 2, 0]],
841                element_variables: vec![2, 1],
842                integer_variables: vec![0, 4, 3],
843                continuous_variables: vec![OrderedFloat(0.0), OrderedFloat(4.0), OrderedFloat(3.0)],
844            },
845            resource_variables: HashableResourceVariables {
846                element_variables: vec![],
847                integer_variables: vec![5, 2, 6],
848                continuous_variables: vec![OrderedFloat(5.0), OrderedFloat(2.5), OrderedFloat(6.0)],
849            },
850        };
851        let successor: HashableState = state.apply_effect(
852            &effect,
853            &mut function_cache,
854            &state_functions,
855            &registry,
856        );
857        assert_eq!(successor, expected);
858    }
859
860    #[test]
861    fn state_with_hashable_signature_variable_from() {
862        let mut set1 = Set::with_capacity(3);
863        set1.insert(0);
864        set1.insert(2);
865        let mut set2 = Set::with_capacity(3);
866        set2.insert(0);
867        set2.insert(1);
868        let signature_variables = dypdl::SignatureVariables {
869            set_variables: vec![set1, set2],
870            vector_variables: vec![vec![0, 2], vec![1, 2]],
871            element_variables: vec![1, 2],
872            integer_variables: vec![1, 2, 3],
873            continuous_variables: vec![1.0, 2.0, 3.0],
874        };
875        let resource_variables = dypdl::ResourceVariables {
876            element_variables: vec![],
877            integer_variables: vec![4, 5, 6],
878            continuous_variables: vec![4.0, 5.0, 6.0],
879        };
880        let state = StateWithHashableSignatureVariables::from(dypdl::State {
881            signature_variables: signature_variables.clone(),
882            resource_variables: resource_variables.clone(),
883        });
884        assert_eq!(
885            state.signature_variables.set_variables,
886            signature_variables.set_variables
887        );
888        assert_eq!(
889            state.signature_variables.vector_variables,
890            signature_variables.vector_variables
891        );
892        assert_eq!(
893            state.signature_variables.element_variables,
894            signature_variables.element_variables
895        );
896        assert_eq!(
897            state.signature_variables.integer_variables,
898            signature_variables.integer_variables
899        );
900        assert_eq!(
901            state.signature_variables.continuous_variables,
902            vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)]
903        );
904        assert_eq!(
905            state.resource_variables.element_variables,
906            resource_variables.element_variables
907        );
908        assert_eq!(
909            state.resource_variables.integer_variables,
910            resource_variables.integer_variables
911        );
912        assert_eq!(
913            state.resource_variables.continuous_variables,
914            resource_variables.continuous_variables
915        );
916    }
917
918    #[test]
919    fn state_with_hashable_signature_variable_from_state_in_registry() {
920        let mut set1 = Set::with_capacity(3);
921        set1.insert(0);
922        set1.insert(2);
923        let mut set2 = Set::with_capacity(3);
924        set2.insert(0);
925        set2.insert(1);
926        let signature_variables = HashableSignatureVariables {
927            set_variables: vec![set1, set2],
928            vector_variables: vec![vec![0, 2], vec![1, 2]],
929            element_variables: vec![1, 2],
930            integer_variables: vec![1, 2, 3],
931            continuous_variables: vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)],
932        };
933        let resource_variables = dypdl::ResourceVariables {
934            element_variables: vec![],
935            integer_variables: vec![4, 5, 6],
936            continuous_variables: vec![4.0, 5.0, 6.0],
937        };
938        let state = StateWithHashableSignatureVariables::from(StateInRegistry {
939            signature_variables: Rc::new(signature_variables.clone()),
940            resource_variables: resource_variables.clone(),
941        });
942        assert_eq!(
943            state.signature_variables.set_variables,
944            signature_variables.set_variables
945        );
946        assert_eq!(
947            state.signature_variables.vector_variables,
948            signature_variables.vector_variables
949        );
950        assert_eq!(
951            state.signature_variables.element_variables,
952            signature_variables.element_variables
953        );
954        assert_eq!(
955            state.signature_variables.integer_variables,
956            signature_variables.integer_variables
957        );
958        assert_eq!(
959            state.signature_variables.continuous_variables,
960            vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)]
961        );
962        assert_eq!(
963            state.resource_variables.element_variables,
964            resource_variables.element_variables
965        );
966        assert_eq!(
967            state.resource_variables.integer_variables,
968            resource_variables.integer_variables
969        );
970        assert_eq!(
971            state.resource_variables.continuous_variables,
972            resource_variables.continuous_variables
973        );
974    }
975
976    #[test]
977    fn state_with_hashable_signature_variables_get_number_of_set_variables() {
978        let state = StateWithHashableSignatureVariables {
979            signature_variables: HashableSignatureVariables {
980                set_variables: vec![Set::default()],
981                ..Default::default()
982            },
983            ..Default::default()
984        };
985        assert_eq!(state.get_number_of_set_variables(), 1);
986    }
987
988    #[test]
989    fn state_with_hashable_signature_variables_get_set_variable() {
990        let mut set = Set::with_capacity(2);
991        set.insert(1);
992        let state = StateWithHashableSignatureVariables {
993            signature_variables: HashableSignatureVariables {
994                set_variables: vec![Set::with_capacity(2), set.clone()],
995                ..Default::default()
996            },
997            ..Default::default()
998        };
999        assert_eq!(state.get_set_variable(0), &Set::with_capacity(2));
1000        assert_eq!(state.get_set_variable(1), &set);
1001    }
1002
1003    #[test]
1004    #[should_panic]
1005    fn state_with_hashable_signature_variables_get_set_variable_panic() {
1006        let state = StateWithHashableSignatureVariables {
1007            signature_variables: HashableSignatureVariables {
1008                set_variables: vec![Set::default()],
1009                ..Default::default()
1010            },
1011            ..Default::default()
1012        };
1013        state.get_set_variable(1);
1014    }
1015
1016    #[test]
1017    fn state_with_hashable_signature_variables_get_number_of_vector_variables() {
1018        let state = StateWithHashableSignatureVariables {
1019            signature_variables: HashableSignatureVariables {
1020                vector_variables: vec![Vector::default()],
1021                ..Default::default()
1022            },
1023            ..Default::default()
1024        };
1025        assert_eq!(state.get_number_of_vector_variables(), 1);
1026    }
1027
1028    #[test]
1029    fn state_with_hashable_signature_variables_get_vector_variable() {
1030        let state = StateWithHashableSignatureVariables {
1031            signature_variables: HashableSignatureVariables {
1032                vector_variables: vec![Vector::default(), vec![1]],
1033                ..Default::default()
1034            },
1035            ..Default::default()
1036        };
1037        assert_eq!(state.get_vector_variable(0), &Vector::default());
1038        assert_eq!(state.get_vector_variable(1), &vec![1]);
1039    }
1040
1041    #[test]
1042    #[should_panic]
1043    fn state_with_hashable_signature_variables_get_vector_variable_panic() {
1044        let state = StateWithHashableSignatureVariables {
1045            signature_variables: HashableSignatureVariables {
1046                vector_variables: vec![Vector::default()],
1047                ..Default::default()
1048            },
1049            ..Default::default()
1050        };
1051        state.get_vector_variable(1);
1052    }
1053
1054    #[test]
1055    fn state_with_hashable_signature_variables_get_number_of_element_variables() {
1056        let state = StateWithHashableSignatureVariables {
1057            signature_variables: HashableSignatureVariables {
1058                element_variables: vec![0],
1059                ..Default::default()
1060            },
1061            ..Default::default()
1062        };
1063        assert_eq!(state.get_number_of_element_variables(), 1);
1064    }
1065
1066    #[test]
1067    fn state_with_hashable_signature_variables_get_element_variable() {
1068        let state = StateWithHashableSignatureVariables {
1069            signature_variables: HashableSignatureVariables {
1070                element_variables: vec![0, 1],
1071                ..Default::default()
1072            },
1073            ..Default::default()
1074        };
1075        assert_eq!(state.get_element_variable(0), 0);
1076        assert_eq!(state.get_element_variable(1), 1);
1077    }
1078
1079    #[test]
1080    #[should_panic]
1081    fn state_with_hashable_signature_variables_get_element_variable_panic() {
1082        let state = StateWithHashableSignatureVariables {
1083            signature_variables: HashableSignatureVariables {
1084                element_variables: vec![0],
1085                ..Default::default()
1086            },
1087            ..Default::default()
1088        };
1089        state.get_element_variable(1);
1090    }
1091
1092    #[test]
1093    fn state_with_hashable_signature_variables_get_number_of_integer_variables() {
1094        let state = StateWithHashableSignatureVariables {
1095            signature_variables: HashableSignatureVariables {
1096                integer_variables: vec![0],
1097                ..Default::default()
1098            },
1099            ..Default::default()
1100        };
1101        assert_eq!(state.get_number_of_integer_variables(), 1);
1102    }
1103
1104    #[test]
1105    fn state_with_hashable_signature_variables_get_integer_variable() {
1106        let state = StateWithHashableSignatureVariables {
1107            signature_variables: HashableSignatureVariables {
1108                integer_variables: vec![0, 1],
1109                ..Default::default()
1110            },
1111            ..Default::default()
1112        };
1113        assert_eq!(state.get_integer_variable(0), 0);
1114        assert_eq!(state.get_integer_variable(1), 1);
1115    }
1116
1117    #[test]
1118    #[should_panic]
1119    fn state_with_hashable_signature_variables_get_integer_variable_panic() {
1120        let state = StateWithHashableSignatureVariables {
1121            signature_variables: HashableSignatureVariables {
1122                integer_variables: vec![0],
1123                ..Default::default()
1124            },
1125            ..Default::default()
1126        };
1127        state.get_integer_variable(1);
1128    }
1129
1130    #[test]
1131    fn state_with_hashable_signature_variables_get_number_of_continuous_variables() {
1132        let state = StateWithHashableSignatureVariables {
1133            signature_variables: HashableSignatureVariables {
1134                continuous_variables: vec![OrderedContinuous::from(0.0)],
1135                ..Default::default()
1136            },
1137            ..Default::default()
1138        };
1139        assert_eq!(state.get_number_of_continuous_variables(), 1);
1140    }
1141
1142    #[test]
1143    fn state_with_hashable_signature_variables_get_continuous_variable() {
1144        let state = StateWithHashableSignatureVariables {
1145            signature_variables: HashableSignatureVariables {
1146                continuous_variables: vec![
1147                    OrderedContinuous::from(0.0),
1148                    OrderedContinuous::from(1.0),
1149                ],
1150                ..Default::default()
1151            },
1152            ..Default::default()
1153        };
1154        assert_eq!(state.get_continuous_variable(0), 0.0);
1155        assert_eq!(state.get_continuous_variable(1), 1.0);
1156    }
1157
1158    #[test]
1159    #[should_panic]
1160    fn state_with_hashable_signature_variables_get_continuous_variable_panic() {
1161        let state = StateWithHashableSignatureVariables {
1162            signature_variables: HashableSignatureVariables {
1163                continuous_variables: vec![OrderedContinuous::from(0.0)],
1164                ..Default::default()
1165            },
1166            ..Default::default()
1167        };
1168        state.get_continuous_variable(1);
1169    }
1170
1171    #[test]
1172    fn state_with_hashable_signature_variables_get_number_of_element_resource_variables() {
1173        let state = StateWithHashableSignatureVariables {
1174            resource_variables: ResourceVariables {
1175                element_variables: vec![0],
1176                ..Default::default()
1177            },
1178            ..Default::default()
1179        };
1180        assert_eq!(state.get_number_of_element_resource_variables(), 1);
1181    }
1182
1183    #[test]
1184    fn state_with_hashable_signature_variables_get_element_resource_variable() {
1185        let state = StateWithHashableSignatureVariables {
1186            resource_variables: ResourceVariables {
1187                element_variables: vec![0, 1],
1188                ..Default::default()
1189            },
1190            ..Default::default()
1191        };
1192        assert_eq!(state.get_element_resource_variable(0), 0);
1193        assert_eq!(state.get_element_resource_variable(1), 1);
1194    }
1195
1196    #[test]
1197    #[should_panic]
1198    fn state_with_hashable_signature_variables_get_element_resource_variable_panic() {
1199        let state = StateWithHashableSignatureVariables {
1200            resource_variables: ResourceVariables {
1201                element_variables: vec![0],
1202                ..Default::default()
1203            },
1204            ..Default::default()
1205        };
1206        state.get_element_resource_variable(1);
1207    }
1208
1209    #[test]
1210    fn state_with_hashable_signature_variables_get_number_of_integer_resource_variables() {
1211        let state = StateWithHashableSignatureVariables {
1212            resource_variables: ResourceVariables {
1213                integer_variables: vec![0],
1214                ..Default::default()
1215            },
1216            ..Default::default()
1217        };
1218        assert_eq!(state.get_number_of_integer_resource_variables(), 1);
1219    }
1220
1221    #[test]
1222    fn state_with_hashable_signature_variables_get_integer_resource_variable() {
1223        let state = StateWithHashableSignatureVariables {
1224            resource_variables: ResourceVariables {
1225                integer_variables: vec![0, 1],
1226                ..Default::default()
1227            },
1228            ..Default::default()
1229        };
1230        assert_eq!(state.get_integer_resource_variable(0), 0);
1231        assert_eq!(state.get_integer_resource_variable(1), 1);
1232    }
1233
1234    #[test]
1235    #[should_panic]
1236    fn state_with_hashable_signature_variables_get_integer_resource_variable_panic() {
1237        let state = StateWithHashableSignatureVariables {
1238            resource_variables: ResourceVariables {
1239                integer_variables: vec![0],
1240                ..Default::default()
1241            },
1242            ..Default::default()
1243        };
1244        state.get_integer_resource_variable(1);
1245    }
1246
1247    #[test]
1248    fn state_with_hashable_signature_variables_get_number_of_continuous_resource_variables() {
1249        let state = StateWithHashableSignatureVariables {
1250            resource_variables: ResourceVariables {
1251                continuous_variables: vec![0.0],
1252                ..Default::default()
1253            },
1254            ..Default::default()
1255        };
1256        assert_eq!(state.get_number_of_continuous_resource_variables(), 1);
1257    }
1258
1259    #[test]
1260    fn state_with_hashable_signature_variables_get_continuous_resource_variable() {
1261        let state = StateWithHashableSignatureVariables {
1262            resource_variables: ResourceVariables {
1263                continuous_variables: vec![0.0, 1.0],
1264                ..Default::default()
1265            },
1266            ..Default::default()
1267        };
1268        assert_eq!(state.get_continuous_resource_variable(0), 0.0);
1269        assert_eq!(state.get_continuous_resource_variable(1), 1.0);
1270    }
1271
1272    #[test]
1273    #[should_panic]
1274    fn state_with_hashable_signature_variables_get_continuous_resource_variable_panic() {
1275        let state = StateWithHashableSignatureVariables {
1276            resource_variables: ResourceVariables {
1277                continuous_variables: vec![0.0],
1278                ..Default::default()
1279            },
1280            ..Default::default()
1281        };
1282        state.get_continuous_resource_variable(1);
1283    }
1284
1285    #[test]
1286    fn state_with_hashable_signature_variables_apply_effect() {
1287        let state_functions = StateFunctions::default();
1288        let mut function_cache = StateFunctionCache::new(&state_functions);
1289
1290        let mut set1 = Set::with_capacity(3);
1291        set1.insert(0);
1292        set1.insert(2);
1293        let mut set2 = Set::with_capacity(3);
1294        set2.insert(0);
1295        set2.insert(1);
1296        let state = StateWithHashableSignatureVariables {
1297            signature_variables: HashableSignatureVariables {
1298                set_variables: vec![set1, set2],
1299                vector_variables: vec![vec![0, 2], vec![1, 2]],
1300                element_variables: vec![1, 2],
1301                integer_variables: vec![1, 2, 3],
1302                continuous_variables: vec![OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(3.0)],
1303            },
1304            resource_variables: ResourceVariables {
1305                element_variables: vec![],
1306                integer_variables: vec![4, 5, 6],
1307                continuous_variables: vec![4.0, 5.0, 6.0],
1308            },
1309        };
1310        let registry = TableRegistry::default();
1311        let set_effect1 = SetExpression::SetElementOperation(
1312            SetElementOperator::Add,
1313            ElementExpression::Constant(1),
1314            Box::new(SetExpression::Reference(ReferenceExpression::Variable(0))),
1315        );
1316        let set_effect2 = SetExpression::SetElementOperation(
1317            SetElementOperator::Remove,
1318            ElementExpression::Constant(0),
1319            Box::new(SetExpression::Reference(ReferenceExpression::Variable(1))),
1320        );
1321        let vector_effect1 = VectorExpression::Push(
1322            ElementExpression::Constant(1),
1323            Box::new(VectorExpression::Reference(ReferenceExpression::Variable(
1324                0,
1325            ))),
1326        );
1327        let vector_effect2 = VectorExpression::Push(
1328            ElementExpression::Constant(0),
1329            Box::new(VectorExpression::Reference(ReferenceExpression::Variable(
1330                1,
1331            ))),
1332        );
1333        let element_effect1 = ElementExpression::Constant(2);
1334        let element_effect2 = ElementExpression::Constant(1);
1335        let integer_effect1 = IntegerExpression::BinaryOperation(
1336            BinaryOperator::Sub,
1337            Box::new(IntegerExpression::Variable(0)),
1338            Box::new(IntegerExpression::Constant(1)),
1339        );
1340        let integer_effect2 = IntegerExpression::BinaryOperation(
1341            BinaryOperator::Mul,
1342            Box::new(IntegerExpression::Variable(1)),
1343            Box::new(IntegerExpression::Constant(2)),
1344        );
1345        let continuous_effect1 = ContinuousExpression::BinaryOperation(
1346            BinaryOperator::Sub,
1347            Box::new(ContinuousExpression::Variable(0)),
1348            Box::new(ContinuousExpression::Constant(1.0)),
1349        );
1350        let continuous_effect2 = ContinuousExpression::BinaryOperation(
1351            BinaryOperator::Mul,
1352            Box::new(ContinuousExpression::Variable(1)),
1353            Box::new(ContinuousExpression::Constant(2.0)),
1354        );
1355        let integer_resource_effect1 = IntegerExpression::BinaryOperation(
1356            BinaryOperator::Add,
1357            Box::new(IntegerExpression::ResourceVariable(0)),
1358            Box::new(IntegerExpression::Constant(1)),
1359        );
1360        let integer_resource_effect2 = IntegerExpression::BinaryOperation(
1361            BinaryOperator::Div,
1362            Box::new(IntegerExpression::ResourceVariable(1)),
1363            Box::new(IntegerExpression::Constant(2)),
1364        );
1365        let continuous_resource_effect1 = ContinuousExpression::BinaryOperation(
1366            BinaryOperator::Add,
1367            Box::new(ContinuousExpression::ResourceVariable(0)),
1368            Box::new(ContinuousExpression::Constant(1.0)),
1369        );
1370        let continuous_resource_effect2 = ContinuousExpression::BinaryOperation(
1371            BinaryOperator::Div,
1372            Box::new(ContinuousExpression::ResourceVariable(1)),
1373            Box::new(ContinuousExpression::Constant(2.0)),
1374        );
1375        let effect = dypdl::Effect {
1376            set_effects: vec![(0, set_effect1), (1, set_effect2)],
1377            vector_effects: vec![(0, vector_effect1), (1, vector_effect2)],
1378            element_effects: vec![(0, element_effect1), (1, element_effect2)],
1379            integer_effects: vec![(0, integer_effect1), (1, integer_effect2)],
1380            continuous_effects: vec![(0, continuous_effect1), (1, continuous_effect2)],
1381            element_resource_effects: vec![],
1382            integer_resource_effects: vec![
1383                (0, integer_resource_effect1),
1384                (1, integer_resource_effect2),
1385            ],
1386            continuous_resource_effects: vec![
1387                (0, continuous_resource_effect1),
1388                (1, continuous_resource_effect2),
1389            ],
1390        };
1391
1392        let mut set1 = Set::with_capacity(3);
1393        set1.insert(0);
1394        set1.insert(1);
1395        set1.insert(2);
1396        let mut set2 = Set::with_capacity(3);
1397        set2.insert(1);
1398        let expected = StateWithHashableSignatureVariables {
1399            signature_variables: HashableSignatureVariables {
1400                set_variables: vec![set1, set2],
1401                vector_variables: vec![vec![0, 2, 1], vec![1, 2, 0]],
1402                element_variables: vec![2, 1],
1403                integer_variables: vec![0, 4, 3],
1404                continuous_variables: vec![OrderedFloat(0.0), OrderedFloat(4.0), OrderedFloat(3.0)],
1405            },
1406            resource_variables: ResourceVariables {
1407                element_variables: vec![],
1408                integer_variables: vec![5, 2, 6],
1409                continuous_variables: vec![5.0, 2.5, 6.0],
1410            },
1411        };
1412        let successor: StateWithHashableSignatureVariables = state.apply_effect(
1413            &effect,
1414            &mut function_cache,
1415            &state_functions,
1416            &registry,
1417        );
1418        assert_eq!(successor, expected);
1419    }
1420}