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#[derive(Debug, PartialEq, Eq, Hash, Clone, Default)]
13pub struct HashableSignatureVariables {
14 pub set_variables: Vec<Set>,
16 pub vector_variables: Vec<Vector>,
18 pub element_variables: Vec<Element>,
20 pub integer_variables: Vec<Integer>,
22 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#[derive(Debug, PartialEq, Eq, Hash, Clone, Default)]
46pub struct HashableResourceVariables {
47 pub element_variables: Vec<Element>,
49 pub integer_variables: Vec<Integer>,
51 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#[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#[derive(Debug, PartialEq, Clone, Default)]
174pub struct StateWithHashableSignatureVariables {
175 pub signature_variables: HashableSignatureVariables,
177 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 ®istry,
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 ®istry,
1417 );
1418 assert_eq!(successor, expected);
1419 }
1420}