1#![deny(missing_docs)]
2
3use arrayvec::ArrayVec;
35use std::fmt;
36use std::fmt::Debug;
37use std::cmp::{PartialOrd, Ord, PartialEq, Eq, Ordering};
38use std::hash::{Hash, Hasher};
39use std::collections::hash_set::HashSet;
40use std::collections::btree_set::BTreeSet;
41use std::ops;
42use std::ops::{Deref, Index};
43use std::slice;
44use std::borrow::Borrow;
45use std::collections::{btree_map, hash_map};
46
47pub mod traits
49{
50 use num_traits::One;
51 use std::ops::{Add, AddAssign};
52
53 pub trait Incrementable
55 {
56 fn increment(&mut self);
58
59 fn incremented(mut self) -> Self
61 where Self: Sized
62 {
63 self.increment();
64 self
65 }
66 }
67
68 impl<T> Incrementable for T
69 where T: One + Add<T, Output = T> + AddAssign<T>
70 {
71 fn increment(&mut self) {
72 *self += One::one();
73 }
74
75 fn incremented(self) -> T {
76 self + <T as One>::one()
77 }
78 }
79
80 }
91use crate::traits::Incrementable;
92
93pub trait Subsets<T> : Default
101{
102 fn set_limit(&mut self, m: &T);
104
105 fn inc_limit(&mut self);
107
108 fn clear(&mut self);
110
111 fn done(&mut self, n: usize);
113
114 fn reset(&mut self, n: usize);
116
117 fn add(&mut self, idx: usize, v: &T);
121
122 fn remove(&mut self, idx: usize, v: &T);
126}
127
128impl<T> Subsets<T> for ()
129{
130 fn set_limit(&mut self, _: &T) {}
131 fn inc_limit(&mut self) {}
132 fn clear(&mut self) {}
133 fn done(&mut self, _: usize) {}
134 fn reset(&mut self, _: usize) {}
135 fn add(&mut self, _: usize, _: &T) {}
136 fn remove(&mut self, _: usize, _: &T) {}
137}
138
139macro_rules! impl_subsets_for_subsets {
140 ($T:ty) => {
141 fn set_limit(&mut self, m: &$T)
142 {
143 self.n = TryInto::try_into((*m).clone()).unwrap();
144 }
145
146 fn inc_limit(&mut self)
147 {
148 self.n += 1;
149 }
150
151 fn clear(&mut self)
152 {
153 for s in self.subsets.iter_mut() {
154 s.clear();
155 }
156 self.n = 0;
157 }
158
159 fn done(&mut self, n: usize)
160 {
161 self.truncate(n);
162 }
163 }
164}
165
166macro_rules! impl_traits_for_subsets {
167 ($S:ty, {$($impl:tt)*}, {$($where:tt)*}) => {
168 $($impl)* Default for $S
169 $($where)*
170 {
171 fn default() -> Self {
172 Self {
173 subsets: Default::default(),
174 n: 0
175 }
176 }
177 }
178 }
179}
180
181macro_rules! impl_set_subsets {
182 ($S:ty, $T:ty, {$($impl:tt)*}, {$($where:tt)*}) => {
183 $($impl)* Subsets<T> for $S
184 $($where)*
185 {
186 impl_subsets_for_subsets!($T);
187
188 fn reset(&mut self, n: usize)
189 {
190 self.done(n);
191
192 for s in self.subsets.iter_mut() {
193 s.clear();
194 }
195
196 if self.subsets.is_empty() {
197 self.subsets.push(Default::default());
198 }
199
200 if let Some(s0) = self.subsets.first_mut() {
201 for i in 0..n {
202 s0.insert(TryInto::try_into(i).unwrap());
203 }
204 }
205 self.n = if n > 0 {1} else {0}
206 }
207
208 fn add(&mut self, idx: usize, v: &$T)
209 {
210 let vi: usize = TryInto::try_into((*v).clone()).unwrap();
211 self.enlarge(vi + 1);
212 let it: $T = TryInto::try_into(idx).unwrap();
213 self.subsets[vi].insert(it);
214 }
215
216 fn remove(&mut self, idx: usize, v: &$T)
217 {
218 let vi: usize = TryInto::try_into((*v).clone()).unwrap();
219 let it: $T = TryInto::try_into(idx).unwrap();
220 self.subsets[vi].remove(&it);
221 }
222 }
223
224 impl_traits_for_subsets!($S, {$($impl)*}, {$($where)*});
225 }
226}
227
228macro_rules! impl_vec_subsets {
229 ($S:ty, $T:ty, {$($impl:tt)*}, {$($where:tt)*}) => {
230 $($impl)* Subsets<$T> for $S
231 $($where)*
232 {
233 impl_subsets_for_subsets!($T);
234
235 fn reset(&mut self, n: usize)
236 {
237 self.done(n);
238
239 for s in self.subsets.iter_mut() {
240 s.clear();
241 }
242
243 if self.subsets.is_empty() {
244 self.subsets.push(Default::default());
245 }
246
247 if let Some(s0) = self.subsets.first_mut() {
248 for i in 0..n {
249 s0.push(TryInto::try_into(i).unwrap());
250 }
251 }
252 self.n = if n > 0 {1} else {0}
253 }
254
255 fn add(&mut self, idx: usize, v: &$T)
256 {
257 let vi: usize = TryInto::try_into((*v).clone()).unwrap();
258 self.enlarge(vi + 1);
259 let it: $T = TryInto::try_into(idx).unwrap();
260 self.subsets[vi].push(it);
261 }
262
263 fn remove(&mut self, _: usize, v: &$T)
264 {
265 let vi: usize = TryInto::try_into((*v).clone()).unwrap();
266 self.subsets[vi].pop();
267 }
269 }
270
271 impl_traits_for_subsets!($S, {$($impl)*}, {$($where)*});
272 }
273}
274
275macro_rules! impl_subsets_helpers {
276 () => {
277 fn truncate(&mut self, n: usize)
278 {
279 self.subsets.truncate(n);
280 }
281
282 fn enlarge(&mut self, new_n: usize)
283 {
284 let n = self.subsets.len();
285 if n < new_n {
286 self.subsets.reserve(new_n - n);
287 loop {
288 self.subsets.push(Default::default());
289 if self.subsets.len() == new_n {break;}
290 }
291 }
292 }
293 }
294}
295
296#[derive(Clone, Debug)]
300pub struct HashSubsets<T>
301 where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize> + Hash + Eq
302{
303 subsets: Vec<HashSet<T>>,
304 n: usize
305}
306
307impl<T> HashSubsets<T>
308 where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize> + Hash + Eq
309{
310 pub fn subsets(&self) -> &[HashSet<T>] {
312 &self.subsets[..self.n]
313 }
314
315 impl_subsets_helpers!();
316}
317
318impl_set_subsets!(HashSubsets<T>, T, {impl<T>}, {where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize> + Hash + Eq});
319
320#[derive(Clone, Debug)]
324pub struct BTreeSubsets<T>
325 where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize> + Ord
326{
327 subsets: Vec<BTreeSet<T>>,
328 n: usize
329}
330
331impl<T> BTreeSubsets<T>
332 where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize> + Ord
333{
334 pub fn subsets(&self) -> &[BTreeSet<T>] {
336 &self.subsets[..self.n]
337 }
338
339 impl_subsets_helpers!();
340}
341
342impl_set_subsets!(BTreeSubsets<T>, T, {impl<T>}, {where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize> + Ord});
343
344#[derive(Clone, Debug)]
348pub struct VecSubsets<T>
349 where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize>
350{
351 subsets: Vec<Vec<T>>,
352 n: usize
353}
354
355impl<T> VecSubsets<T>
356 where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize>
357{
358 pub fn subsets(&self) -> &[Vec<T>] {
360 &self.subsets[..self.n]
361 }
362
363 impl_subsets_helpers!();
364}
365
366impl_vec_subsets!(VecSubsets<T>, T, {impl<T>}, {where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize>});
367
368
369#[derive(Debug, Clone)]
373pub struct ArrayVecSubsets<T, const N: usize>
374{
375 subsets: ArrayVec<ArrayVec<T, N>, N>,
376 n: usize
377}
378
379impl<T, const N: usize> ArrayVecSubsets<T, N>
380{
381 pub fn subsets(&self) -> &[ArrayVec<T, N>] {
383 &self.subsets[..self.n]
384 }
385
386 fn truncate(&mut self, n: usize)
387 {
388 while self.subsets.len() > n {
389 self.subsets.pop();
390 }
391 }
392
393 fn enlarge(&mut self, new_n: usize)
394 {
395 let n = self.subsets.len();
396 if n < new_n {
397 loop {
398 self.subsets.push(Default::default());
399 if self.subsets.len() == new_n {break;}
400 }
401 }
402 }
403}
404
405impl_vec_subsets!(ArrayVecSubsets<T, N>, T, {impl<T, const N: usize>}, {where <T as TryInto<usize>>::Error : Debug, <T as TryFrom<usize>>::Error : Debug, T: Clone + TryInto<usize> + TryFrom<usize>});
406
407pub type GenSmallSubsets<T> = ArrayVecSubsets<T, 16>;
411
412pub type SmallSubsets = GenSmallSubsets<u8>;
416
417trait Push
418{
419 type Item;
420
421 fn try_push(&mut self, x: Self::Item) -> Result<(), ()>;
422 fn done(&mut self) -> Result<(), ()>;
423}
424
425struct SlicePusher<'a, T: 'a>
426{
427 iter: std::slice::IterMut<'a, T>
428}
429
430impl<'a, T: 'a> SlicePusher<'a, T>
431{
432 pub fn new(s: &'a mut [T]) -> Self
433 {
434 SlicePusher {iter: s.iter_mut()}
435 }
436}
437
438impl<'a, T> Push for SlicePusher<'a, T>
439{
440 type Item = T;
441
442 fn try_push(&mut self, x: Self::Item) -> Result<(), ()>
443 {
444 if let Some(a) = self.iter.next() {
445 *a = x;
446 Ok(())
447 } else {
448 Err(())
449 }
450 }
451
452 fn done(&mut self) -> Result<(), ()>
453 {
454 if self.iter.next().is_none() {
455 Ok(())
456 } else {
457 Err(())
458 }
459 }
460}
461
462impl<T> Push for Vec<T>
463{
464 type Item = T;
465
466 fn try_push(&mut self, x: Self::Item) -> Result<(), ()>
467 {
468 self.push(x);
469 Ok(())
470 }
471
472 fn done(&mut self) -> Result<(), ()>
473 {
474 Ok(())
475 }
476}
477
478impl<T, const N: usize> Push for ArrayVec<T, N>
479{
480 type Item = T;
481
482 fn try_push(&mut self, x: Self::Item) -> Result<(), ()>
483 {
484 self.try_push(x).map_err(|_| ())
485 }
486
487 fn done(&mut self) -> Result<(), ()>
488 {
489 Ok(())
490 }
491}
492
493macro_rules! do_try_set {
494 ($T:ty, $self:expr, $s:expr, $map:expr, $map_mod:tt) => {
495 {
496 let this = $self;
497 let mut s = $s;
498 let mut map = $map;
499 let mut old_m = <$T>::default();
500 let mut m = <$T>::default().incremented();
501
502 {
503 let mut i = 0;
504 #[allow(unused_mut)]
505 let (mut a, mut b, h) = this.pushers();
506 {
507 if let Some(ai) = s.next() {
508 map.insert(ai, <$T>::default());
509 let v = <$T>::default();
510 h.add(i, &v);
511 i += 1;
512 a.try_push(v).map_err(|_| ())?;
513 }
514 }
515
516 for si in s {
517 if old_m == <$T>::default() {
518 old_m.increment();
519 }
520 b.try_push(old_m).map_err(|_| ())?;
521 old_m = m.clone();
522
523 let ai = match map.entry(si) {
524 $map_mod::Entry::Occupied(e) => e.get().clone(),
525 $map_mod::Entry::Vacant(e) => {
526 let ai = m.clone();
527 e.insert(ai.clone());
528 m.increment();
529 ai
530 }
531 };
532 h.add(i, &ai);
533 i += 1;
534 a.try_push(ai).map_err(|_| ())?;
535 }
536
537 a.done()?;
538 b.done()?;
539 h.done(i);
540 if i != 0 {
541 h.set_limit(&m);
542 }
543 }
544 this.m = old_m;
545
546 Ok(map)
547 }
548 }
549}
550
551macro_rules! impl_set_partition {
552 ($SP:ty, $T:ty, {$($impl:tt)*}, {$($impl_a:tt)*}, {$($where:tt)*}) => {
553 $($impl)* $SP
554 $($where)* {
555 pub fn get(&self) -> &[$T] {
557 &self.a
558 }
559
560 pub fn len(&self) -> usize {
562 self.a.len()
563 }
564
565 pub fn reset(&mut self) {
567 self.do_reset();
568 self.h.reset(self.a.len());
569 }
570
571 fn do_reset(&mut self) {
572 let n = self.len() as usize;
573 for i in self.a.iter_mut() {
574 *i = <$T>::default();
575 }
576 for i in self.b.iter_mut() {
577 *i = <$T>::default().incremented();
578 }
579 if n > 1 {
580 self.m = <$T>::default().incremented();
581 } else {
582 self.m = <$T>::default();
583 }
584 }
585
586 #[inline]
589 pub fn increment(&mut self) -> bool {
590 let n = self.a.len();
592 if let Some(al) = self.a.last_mut() {
593 if *al != self.m {
594 self.h.remove(n - 1, al);
595 al.increment();
596 self.h.add(n - 1, al);
597 if *al == self.m {
598 self.h.inc_limit();
599 }
600 return true;
601 }
602 } else {
603 return false;
604 }
605
606 self.increment_slowpath()
607 }
608
609 fn increment_slowpath(&mut self) -> bool {
610 let n = self.len();
611 if n <= 1 {
612 return false;
613 }
614
615 let mut j = n - 2;
616 while self.a[j] == self.b[j] {
617 j = j - 1;
618 }
619 if j == 0 {
620 self.reset();
621 return false;
622 }
623
624 for k in ((j + 1)..n).rev() {
625 let ak = &mut self.a[k];
626 self.h.remove(k, ak);
627 }
628
629 let m = {
630 let aj = &mut self.a[j];
631 self.h.remove(j, aj);
632 aj.increment();
633 self.h.add(j, aj);
634 let bj = self.b[j].clone();
635 if *aj == bj {bj.incremented()} else {bj}
636 };
637 j += 1;
638
639 for k in j..n {
640 let ak = &mut self.a[k];
641 *ak = <$T>::default();
642 self.h.add(k, ak);
643 }
644 for bi in &mut self.b[j..] {
645 *bi = m.clone();
646 }
647 self.m = m;
648 self.h.set_limit(&self.m);
649 true
650 }
651
652 pub fn try_from<S>(s: S) -> Result<($SP, hash_map::HashMap<<S as Iterator>::Item, $T>), ()>
658 where S: Iterator, <S as Iterator>::Item : Hash + Eq
659 {
660 let mut sp = <$SP>::new();
661 sp.try_set(s).map(|map| (sp, map))
662 }
663
664 pub fn try_set<S>(&mut self, s: S) -> Result<hash_map::HashMap<<S as Iterator>::Item, $T>, ()>
670 where S: Iterator, <S as Iterator>::Item : Hash + Eq
671 {
672 self.do_try_set(s).map_err(|e| {
673 self.reset_default();
674 e
675 })
676 }
677
678 fn do_try_set<S>(&mut self, s: S) -> Result<hash_map::HashMap<<S as Iterator>::Item, $T>, ()>
679 where S: Iterator, <S as Iterator>::Item : Hash + Eq
680 {
681 do_try_set!($T, self, s, hash_map::HashMap::new(), hash_map)
682 }
683
684 pub fn try_from_ord<S>(s: S) -> Result<($SP, btree_map::BTreeMap<<S as Iterator>::Item, $T>), ()>
690 where S: Iterator, <S as Iterator>::Item : Ord
691 {
692 let mut sp = <$SP>::new();
693 sp.try_set_ord(s).map(|map| (sp, map))
694 }
695
696 fn do_try_set_ord<S>(&mut self, s: S) -> Result<btree_map::BTreeMap<<S as Iterator>::Item, $T>, ()>
697 where S: Iterator, <S as Iterator>::Item : Ord
698 {
699 do_try_set!($T, self, s, btree_map::BTreeMap::new(), btree_map)
700 }
701
702 pub fn try_set_ord<S>(&mut self, s: S) -> Result<btree_map::BTreeMap<<S as Iterator>::Item, $T>, ()>
708 where S: Iterator, <S as Iterator>::Item : Ord
709 {
710 self.do_try_set_ord(s).map_err(|e| {
711 self.reset_default();
712 e
713 })
714 }
715
716 pub fn num_subsets(&self) -> $T {
718 if let Some(al) = self.a.last() {
719 if *al == self.m {
720 return al.clone().incremented()
721 }
722 }
723
724 self.m.clone()
725 }
726
727 pub fn subsets(&self) -> &H {
729 &self.h
730 }
731 }
732
733 $($impl)* $SP
734 $($where)* + PartialOrd<$T> {
735 pub fn try_from_repr<I>(iter: I) -> Result<$SP, ()>
739 where I: Iterator<Item = $T>
740 {
741 let mut sp = <$SP>::new();
742 sp.do_try_set_repr(iter).map(|_| sp)
743 }
744
745 pub fn is_repr<I>(iter: I) -> bool
747 where I: Iterator<Item = $T>
748 {
749 let mut m: $T = <$T>::default();
750 let mut n = 0;
751 let max_len = Self::max_len();
752 for ai in iter {
753 n += 1;
754 if n > max_len {
755 return false;
756 }
757 if !(ai <= m) {
758 return false;
759 }
760 let ai1 = ai.incremented();
761 if ai1 > m {
762 m = ai1;
763 }
764 }
765 n >= Self::min_len()
766 }
767
768 pub fn try_set_repr<I>(&mut self, iter: I) -> Result<(), ()>
773 where I: Iterator<Item = $T>
774 {
775 self.do_try_set_repr(iter).map_err(|e| {
776 self.reset_default();
777 e
778 })
779 }
780
781 fn do_try_set_repr<I>(&mut self, mut iter: I) -> Result<(), ()>
786 where I: Iterator<Item = $T>
787 {
788 let mut old_m = <$T>::default();
789 let mut m = <$T>::default().incremented();
790
791 {
792 let mut i = 0;
793 #[allow(unused_mut)]
794 let (mut a, mut b, h) = self.pushers();
795 {
796 if let Some(ai) = iter.next() {
797 if ai != <$T>::default() {
798 return Err(());
799 }
800 h.add(i, &ai);
801 i += 1;
802 a.try_push(ai).map_err(|_| ())?;
803 }
804 }
805 for ai in iter {
806 if old_m == <$T>::default() {
807 old_m.increment();
808 }
809 b.try_push(old_m).map_err(|_| ())?;
810
811 if !(ai <= m) {
812 return Err(());
813 }
814 h.add(i, &ai);
815 i += 1;
816 a.try_push(ai.clone()).map_err(|_| ())?;
817
818 old_m = m.clone();
819 let ai1 = ai.incremented();
820 if ai1 > m {
821 m = ai1;
822 }
823 }
824 a.done()?;
825 b.done()?;
826 h.done(i);
827 if i != 0 {
828 h.set_limit(&m);
829 }
830 }
831 self.m = old_m;
832
833 Ok(())
834 }
835 }
836
837 $($impl)* Incrementable for $SP
838 $($where)* {
839 fn increment(&mut self) {
840 Self::increment(self);
841 }
842 }
843
844 $($impl)* Default for $SP
845 $($where)* {
846 fn default() -> Self {
847 Self::new()
848 }
849 }
850
851 $($impl)* PartialOrd<$SP> for $SP
852 $($where)* + PartialOrd {
853 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
854 self.a.partial_cmp(&other.a)
855 }
856
857 fn lt(&self, other: &Self) -> bool {
858 self.a.lt(&other.a)
859 }
860
861 fn gt(&self, other: &Self) -> bool {
862 self.a.gt(&other.a)
863 }
864
865 fn le(&self, other: &Self) -> bool {
866 self.a.le(&other.a)
867 }
868
869 fn ge(&self, other: &Self) -> bool {
870 self.a.ge(&other.a)
871 }
872 }
873
874 $($impl)* Ord for $SP
875 $($where)* + Ord {
876 fn cmp(&self, other: &Self) -> Ordering {
877 self.a.cmp(&other.a)
878 }
879 }
880
881 $($impl)* PartialEq<$SP> for $SP
882 $($where)* {
883 fn eq(&self, other: &Self) -> bool {
884 self.a.eq(&other.a)
885 }
886
887 fn ne(&self, other: &Self) -> bool {
888 self.a.ne(&other.a)
889 }
890 }
891
892 $($impl)* Eq for $SP
893 $($where)* + Eq {
894 }
895
896 $($impl)* Hash for $SP
897 $($where)* + Hash {
898 fn hash<HH: Hasher>(&self, state: &mut HH) {
899 self.a.hash(state);
900 }
901 }
902
903 $($impl)* Deref for $SP
904 $($where)* {
905 type Target = [$T];
906
907 fn deref(&self) -> &Self::Target {
908 self.get()
909 }
910 }
911
912 $($impl)* AsRef<[$T]> for $SP
913 $($where)* {
914 fn as_ref(&self) -> &[$T] {
915 self.get()
916 }
917 }
918
919 $($impl)* Borrow<[$T]> for $SP
920 $($where)* {
921 fn borrow(&self) -> &[$T] {
922 self.get()
923 }
924 }
925
926 $($impl)* Index<usize> for $SP
927 $($where)* {
928 type Output = $T;
929
930 fn index(&self, index: usize) -> &$T {
931 &self.get()[index]
932 }
933 }
934
935 $($impl)* Index<ops::Range<usize>> for $SP
936 $($where)* {
937 type Output = [$T];
938
939 fn index(&self, index: ops::Range<usize>) -> &[$T] {
940 Index::index(&**self, index)
941 }
942 }
943
944 $($impl)* Index<ops::RangeTo<usize>> for $SP
945 $($where)* {
946 type Output = [$T];
947
948 fn index(&self, index: ops::RangeTo<usize>) -> &[$T] {
949 Index::index(&**self, index)
950 }
951 }
952
953 $($impl)* Index<ops::RangeFrom<usize>> for $SP
954 $($where)* {
955 type Output = [$T];
956
957 fn index(&self, index: ops::RangeFrom<usize>) -> &[$T] {
958 Index::index(&**self, index)
959 }
960 }
961
962 $($impl)* Index<ops::RangeFull> for $SP
963 $($where)* {
964 type Output = [$T];
965
966 fn index(&self, index: ops::RangeFull) -> &[$T] {
967 Index::index(&**self, index)
968 }
969 }
970
971 $($impl_a)* IntoIterator for &'a $SP
972 $($where)* {
973 type Item = &'a $T;
974 type IntoIter = slice::Iter<'a, $T>;
975
976 fn into_iter(self) -> slice::Iter<'a, $T> {
977 (&self.a).into_iter()
978 }
979 }
980
981 $($impl_a)* IntoIterator for &'a mut $SP
982 $($where)* {
983 type Item = &'a mut $T;
984 type IntoIter = slice::IterMut<'a, $T>;
985
986 fn into_iter(self) -> slice::IterMut<'a, $T> {
987 (&mut self.a).into_iter()
988 }
989 }
990 }
991}
992
993#[derive(Debug, Clone)]
999pub struct VecSetPartition<T = usize, H: Subsets<T> = ()>
1000 where T: Default + Incrementable + PartialEq<T> + Clone
1001{
1002 a: Vec<T>,
1003 b: Vec<T>,
1004 m: T,
1005 h: H
1006}
1007
1008impl<T, H: Subsets<T>> VecSetPartition<T, H>
1009 where T: Default + Incrementable + PartialEq<T> + Clone
1010{
1011 pub fn new() -> Self {
1013 VecSetPartition {a: Vec::new(), b: Vec::new(), m: T::default(), h: Default::default()}
1014 }
1015
1016 pub fn min_len() -> usize {0}
1018
1019 pub fn max_len() -> usize {usize::max_value()}
1021
1022 pub fn reset_default(&mut self) {
1024 self.a.clear();
1025 self.b.clear();
1026 self.m = T::default();
1027 }
1028
1029 pub fn with_size(n: usize) -> Self {
1031 let mut r: Self = VecSetPartition {a: vec![T::default(); n], b: vec![T::default().incremented(); if n > 0 {n - 1} else {0}], m: if n > 1 {T::default().incremented()} else {T::default()}, h: Default::default()};
1032 r.h.reset(n);
1033 r
1034 }
1035
1036 pub fn try_with_size(n: usize) -> Result<VecSetPartition<T, H>, ()> {
1038 Ok(Self::with_size(n))
1039 }
1040
1041 pub fn resize(&mut self, n: usize) {
1043 self.do_reset();
1044 self.a.resize(n, T::default());
1045 self.b.resize(if n > 0 {n - 1} else {0}, T::default().incremented());
1046 self.m = if n > 1 {T::default().incremented()} else {T::default()};
1047 self.h.reset(n);
1048 }
1049
1050 pub fn try_resize(&mut self, n: usize) -> Result<(), ()> {
1052 self.resize(n);
1053 Ok(())
1054 }
1055
1056 pub fn to_vec(self) -> Vec<T> {
1058 self.a
1059 }
1060
1061 fn pushers(&mut self) -> (&mut Vec<T>, &mut Vec<T>, &mut H) {
1062 self.a.clear();
1063 self.b.clear();
1064 self.h.clear();
1065 (&mut self.a, &mut self.b, &mut self.h)
1066 }
1067}
1068
1069impl<T, H: Subsets<T>> IntoIterator for VecSetPartition<T, H>
1070 where T: Default + Incrementable + PartialEq<T> + Clone {
1071 type Item = T;
1072 type IntoIter = std::vec::IntoIter<T>;
1073
1074 fn into_iter(self) -> std::vec::IntoIter<T> {
1075 self.to_vec().into_iter()
1076 }
1077}
1078
1079impl_set_partition!(VecSetPartition<T, H>, T, {impl<T, H: Subsets<T>>}, {impl<'a, T, H: Subsets<T>>}, {where T: Default + Incrementable + PartialEq<T> + Clone});
1080
1081#[derive(Clone)]
1087pub struct ArrayVecSetPartition<T, H: Subsets<T>, const N: usize>
1088 where T: Default + Incrementable + PartialEq<T> + Clone
1089{
1090 a: ArrayVec<T, N>,
1091 b: ArrayVec<T, N>,
1092 m: T,
1093 h: H
1094}
1095
1096impl<T, H: Subsets<T>, const N: usize> Debug for ArrayVecSetPartition<T, H, N>
1098 where H: Debug, T: Default + Incrementable + PartialEq<T> + Clone + Debug
1099{
1100 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1101 f.debug_struct("ArrayVecSetPartition")
1102 .field("a", &self.a)
1103 .field("b", &self.b)
1104 .field("m", &self.m)
1105 .field("h", &self.h)
1106 .finish()
1107 }
1108}
1109
1110impl<T, H: Subsets<T>, const N: usize> ArrayVecSetPartition<T, H, N>
1111 where T: Default + Incrementable + PartialEq<T> + Clone
1112{
1113 pub fn new() -> Self {
1115 ArrayVecSetPartition {
1116 a: ArrayVec::new(),
1117 b: ArrayVec::new(),
1118 m: T::default(),
1119 h: Default::default()
1120 }
1121 }
1122
1123 pub fn min_len() -> usize {0}
1125
1126 pub fn max_len() -> usize {N}
1128
1129 pub fn reset_default(&mut self) {
1131 self.a.clear();
1132 self.b.clear();
1133 self.m = T::default();
1134 }
1135
1136 pub fn try_with_size(n: usize) -> Result<Self, ()> {
1138 let mut r = Self::new();
1139 r.try_resize(n).map(|_| r)
1140 }
1141
1142 pub fn try_resize(&mut self, n: usize) -> Result<(), ()> {
1144 if n > self.a.capacity() {
1145 return Err(());
1146 }
1147
1148 self.do_reset();
1149 if self.len() == 0 && n != 0 {
1150 self.a.push(T::default());
1151 }
1152 while self.len() > n {
1153 self.a.pop();
1154 self.b.pop();
1155 }
1156 while self.len() < n{
1157 self.a.push(T::default());
1158 self.b.push(T::default().incremented());
1159 }
1160 if n > 1 {
1161 self.m = T::default().incremented();
1162 } else {
1163 self.m = T::default();
1164 }
1165 self.h.reset(self.a.len());
1166 Ok(())
1167 }
1168
1169 pub fn to_vec(self) -> ArrayVec<T, N> {
1171 self.a
1172 }
1173
1174 fn pushers(&mut self) -> (&mut ArrayVec<T, N>, &mut ArrayVec<T, N>, &mut H) {
1175 self.a.clear();
1176 self.b.clear();
1177 self.h.clear();
1178 (&mut self.a, &mut self.b, &mut self.h)
1179 }
1180}
1181
1182impl<T, H: Subsets<T>, const N: usize> IntoIterator for ArrayVecSetPartition<T, H, N>
1183 where T: Default + Incrementable + PartialEq<T> + Clone {
1184 type Item = T;
1185 type IntoIter = arrayvec::IntoIter<T, N>;
1186
1187 fn into_iter(self) -> arrayvec::IntoIter<T, N> {
1188 self.to_vec().into_iter()
1189 }
1190}
1191
1192impl_set_partition!(ArrayVecSetPartition<T, H, N>, T, {impl<T, H: Subsets<T>, const N: usize>}, {impl<'a, T, H: Subsets<T>, const N: usize>}, {where T: Default + Incrementable + PartialEq<T> + Clone});
1193
1194pub type GenSmallSetPartition<T>
1200 = ArrayVecSetPartition<T, (), 16>;
1202
1203pub type SmallSetPartition = GenSmallSetPartition<u8>;
1209
1210macro_rules! fixed_set_partition {
1211 ($t:tt, $tu8:tt, $an:expr, $bn:expr, $a:tt, $b:tt, $ac:expr, $bc:expr) => {
1212 #[derive(Debug)]
1214 pub struct $t<T, H: Subsets<T> = ()>
1215 where T: Default + Incrementable + PartialEq<T> + Clone
1216 {
1217 a: [T; $an],
1218 b: [T; $bn],
1219 m: T,
1220 h: H
1221 }
1222
1223 impl<T, H: Subsets<T>> $t<T, H>
1224 where T: Default + Incrementable + PartialEq<T> + Clone
1225 {
1226 pub fn new() -> Self {
1228 let mut r = $t {
1229 a: $a,
1230 b: $b,
1231 m: if $an > 1 {T::default().incremented()} else {T::default()},
1232 h: H::default()
1233 };
1234 r.h.reset($an);
1235 r
1236 }
1237
1238 pub fn min_len() -> usize {$an}
1240
1241 pub fn max_len() -> usize {$an}
1243
1244 pub fn reset_default(&mut self) {
1246 *self = Self::new();
1247 }
1248
1249 pub fn to_array(self) -> [T; $an] {
1251 self.a
1252 }
1253
1254 fn pushers(&mut self) -> (SlicePusher<T>, SlicePusher<T>, &mut H) {
1255 self.h.clear();
1256 (SlicePusher::new(&mut self.a), SlicePusher::new(&mut self.b), &mut self.h)
1257 }
1258 }
1259
1260 impl<T, H: Subsets<T>> Clone for $t<T, H>
1261 where T: Default + Incrementable + PartialEq<T> + Clone
1262 {
1263 fn clone(&self) -> Self
1264 {
1265 let fa = $ac;
1266 let fb = $bc;
1267 $t {
1268 a: fa(self),
1269 b: fb(self),
1270 m: self.m.clone(),
1271 h: Default::default()
1272 }
1273 }
1274 }
1275
1276 impl<T, H: Subsets<T>> IntoIterator for $t<T, H>
1277 where T: Default + Incrementable + PartialEq<T> + Clone {
1278 type Item = T;
1279 type IntoIter = arrayvec::IntoIter<T, $an>;
1280
1281 fn into_iter(self) -> arrayvec::IntoIter<T, $an> {
1282 ArrayVec::from(self.to_array()).into_iter()
1283 }
1284 }
1285
1286 impl_set_partition!($t<T, H>, T, {impl<T, H: Subsets<T>>}, {impl<'a, T, H: Subsets<T>>}, {where T: Default + Incrementable + PartialEq<T> + Clone});
1287
1288 #[derive(Debug, Clone)]
1290 pub struct $tu8<H: Subsets<u8> = ()>
1291 {
1292 a: [u8; $an],
1293 b: [u8; $bn],
1294 m: u8,
1295 h: H
1296 }
1297
1298 impl<H: Subsets<u8>> $tu8<H>
1299 {
1300 pub fn new() -> Self {
1302 let mut r = $tu8 {
1303 a: [0u8; $an],
1304 b: [1u8; $bn],
1305 m: if $an > 1 {1u8} else {0u8},
1306 h: H::default()
1307 };
1308 r.h.reset($an);
1309 r
1310 }
1311
1312 pub fn min_len() -> usize {$an}
1314
1315 pub fn max_len() -> usize {$an}
1317
1318 pub fn reset_default(&mut self) {
1320 *self = Self::new();
1321 }
1322
1323 pub fn to_array(self) -> [u8; $an] {
1325 self.a
1326 }
1327
1328 fn pushers(&mut self) -> (SlicePusher<u8>, SlicePusher<u8>, &mut H) {
1329 self.h.clear();
1330 (SlicePusher::new(&mut self.a), SlicePusher::new(&mut self.b), &mut self.h)
1331 }
1332 }
1333
1334 impl<H: Subsets<u8>> IntoIterator for $tu8<H>
1335 {
1336 type Item = u8;
1337 type IntoIter = arrayvec::IntoIter<u8, $an>;
1338
1339 fn into_iter(self) -> arrayvec::IntoIter<u8, $an> {
1340 ArrayVec::from(self.to_array()).into_iter()
1341 }
1342 }
1343
1344 impl_set_partition!($tu8<H>, u8, {impl<H: Subsets<u8>>}, {impl<'a, H: Subsets<u8>>}, {where u8: Default + Incrementable + PartialEq<u8> + Clone});
1345 }
1346}
1347
1348fixed_set_partition!(GenSetPartition0, SetPartition0, 0, 0, [], [], |_: &GenSetPartition0<T, H>| [], |_: &GenSetPartition0<T, H>| []);
1350fixed_set_partition!(GenSetPartition1, SetPartition1, 1, 0, [T::default()], [], |s: &GenSetPartition1<T, H>| [s.a[0].clone()], |_: &GenSetPartition1<T, H>| []);
1351fixed_set_partition!(GenSetPartition2, SetPartition2, 2, 1, [T::default(), T::default()], [T::default().incremented()], |s: &GenSetPartition2<T, H>| [s.a[0].clone(), s.a[1].clone()], |s: &GenSetPartition2<T, H>| [s.b[0].clone()]);
1353fixed_set_partition!(GenSetPartition3, SetPartition3, 3, 2, [T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented()], |s: &GenSetPartition3<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone()], |s: &GenSetPartition3<T, H>| [s.b[0].clone(), s.b[1].clone()]);
1354fixed_set_partition!(GenSetPartition4, SetPartition4, 4, 3, [T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition4<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone()], |s: &GenSetPartition4<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone()]);
1355fixed_set_partition!(GenSetPartition5, SetPartition5, 5, 4, [T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition5<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone()], |s: &GenSetPartition5<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone()]);
1356fixed_set_partition!(GenSetPartition6, SetPartition6, 6, 5, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition6<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone()], |s: &GenSetPartition6<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone()]);
1357fixed_set_partition!(GenSetPartition7, SetPartition7, 7, 6, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition7<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone()], |s: &GenSetPartition7<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone()]);
1358fixed_set_partition!(GenSetPartition8, SetPartition8, 8, 7, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition8<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone()], |s: &GenSetPartition8<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone()]);
1359fixed_set_partition!(GenSetPartition9, SetPartition9, 9, 8, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition9<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone()], |s: &GenSetPartition9<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone()]);
1360fixed_set_partition!(GenSetPartition10, SetPartition10, 10, 9, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition10<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone()], |s: &GenSetPartition10<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone()]);
1361fixed_set_partition!(GenSetPartition11, SetPartition11, 11, 10, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition11<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone()], |s: &GenSetPartition11<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone()]);
1362fixed_set_partition!(GenSetPartition12, SetPartition12, 12, 11, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition12<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone()], |s: &GenSetPartition12<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone()]);
1363fixed_set_partition!(GenSetPartition13, SetPartition13, 13, 12, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition13<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone()], |s: &GenSetPartition13<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone()]);
1364fixed_set_partition!(GenSetPartition14, SetPartition14, 14, 13, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition14<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone()], |s: &GenSetPartition14<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone()]);
1365fixed_set_partition!(GenSetPartition15, SetPartition15, 15, 14, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition15<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone()], |s: &GenSetPartition15<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone()]);
1366fixed_set_partition!(GenSetPartition16, SetPartition16, 16, 15, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition16<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone()], |s: &GenSetPartition16<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone()]);
1367fixed_set_partition!(GenSetPartition17, SetPartition17, 17, 16, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition17<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone()], |s: &GenSetPartition17<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone()]);
1368fixed_set_partition!(GenSetPartition18, SetPartition18, 18, 17, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition18<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone()], |s: &GenSetPartition18<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone()]);
1369fixed_set_partition!(GenSetPartition19, SetPartition19, 19, 18, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition19<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone()], |s: &GenSetPartition19<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone()]);
1370fixed_set_partition!(GenSetPartition20, SetPartition20, 20, 19, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition20<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone()], |s: &GenSetPartition20<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone()]);
1371fixed_set_partition!(GenSetPartition21, SetPartition21, 21, 20, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition21<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone()], |s: &GenSetPartition21<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone()]);
1372fixed_set_partition!(GenSetPartition22, SetPartition22, 22, 21, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition22<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone()], |s: &GenSetPartition22<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone()]);
1373fixed_set_partition!(GenSetPartition23, SetPartition23, 23, 22, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition23<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone()], |s: &GenSetPartition23<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone()]);
1374fixed_set_partition!(GenSetPartition24, SetPartition24, 24, 23, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition24<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone()], |s: &GenSetPartition24<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone()]);
1375fixed_set_partition!(GenSetPartition25, SetPartition25, 25, 24, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition25<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone()], |s: &GenSetPartition25<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone()]);
1376fixed_set_partition!(GenSetPartition26, SetPartition26, 26, 25, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition26<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone()], |s: &GenSetPartition26<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone()]);
1377fixed_set_partition!(GenSetPartition27, SetPartition27, 27, 26, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition27<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone(), s.a[26].clone()], |s: &GenSetPartition27<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone(), s.b[25].clone()]);
1378fixed_set_partition!(GenSetPartition28, SetPartition28, 28, 27, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition28<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone(), s.a[26].clone(), s.a[27].clone()], |s: &GenSetPartition28<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone(), s.b[25].clone(), s.b[26].clone()]);
1379fixed_set_partition!(GenSetPartition29, SetPartition29, 29, 28, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition29<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone(), s.a[26].clone(), s.a[27].clone(), s.a[28].clone()], |s: &GenSetPartition29<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone(), s.b[25].clone(), s.b[26].clone(), s.b[27].clone()]);
1380fixed_set_partition!(GenSetPartition30, SetPartition30, 30, 29, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition30<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone(), s.a[26].clone(), s.a[27].clone(), s.a[28].clone(), s.a[29].clone()], |s: &GenSetPartition30<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone(), s.b[25].clone(), s.b[26].clone(), s.b[27].clone(), s.b[28].clone()]);
1381fixed_set_partition!(GenSetPartition31, SetPartition31, 31, 30, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition31<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone(), s.a[26].clone(), s.a[27].clone(), s.a[28].clone(), s.a[29].clone(), s.a[30].clone()], |s: &GenSetPartition31<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone(), s.b[25].clone(), s.b[26].clone(), s.b[27].clone(), s.b[28].clone(), s.b[29].clone()]);
1382fixed_set_partition!(GenSetPartition32, SetPartition32, 32, 31, [T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default(), T::default()], [T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented(), T::default().incremented()], |s: &GenSetPartition32<T, H>| [s.a[0].clone(), s.a[1].clone(), s.a[2].clone(), s.a[3].clone(), s.a[4].clone(), s.a[5].clone(), s.a[6].clone(), s.a[7].clone(), s.a[8].clone(), s.a[9].clone(), s.a[10].clone(), s.a[11].clone(), s.a[12].clone(), s.a[13].clone(), s.a[14].clone(), s.a[15].clone(), s.a[16].clone(), s.a[17].clone(), s.a[18].clone(), s.a[19].clone(), s.a[20].clone(), s.a[21].clone(), s.a[22].clone(), s.a[23].clone(), s.a[24].clone(), s.a[25].clone(), s.a[26].clone(), s.a[27].clone(), s.a[28].clone(), s.a[29].clone(), s.a[30].clone(), s.a[31].clone()], |s: &GenSetPartition32<T, H>| [s.b[0].clone(), s.b[1].clone(), s.b[2].clone(), s.b[3].clone(), s.b[4].clone(), s.b[5].clone(), s.b[6].clone(), s.b[7].clone(), s.b[8].clone(), s.b[9].clone(), s.b[10].clone(), s.b[11].clone(), s.b[12].clone(), s.b[13].clone(), s.b[14].clone(), s.b[15].clone(), s.b[16].clone(), s.b[17].clone(), s.b[18].clone(), s.b[19].clone(), s.b[20].clone(), s.b[21].clone(), s.b[22].clone(), s.b[23].clone(), s.b[24].clone(), s.b[25].clone(), s.b[26].clone(), s.b[27].clone(), s.b[28].clone(), s.b[29].clone(), s.b[30].clone()]);
1383
1384static BELL_NUMBERS: [u64; 26] = [
1386 1,
1387 1,
1388 2,
1389 5,
1390 15,
1391 52,
1392 203,
1393 877,
1394 4140,
1395 21147,
1396 115975,
1397 678570,
1398 4213597,
1399 27644437,
1400 190899322,
1401 1382958545,
1402 10480142147,
1403 82864869804,
1404 682076806159,
1405 5832742205057,
1406 51724158235372,
1407 474869816156751,
1408 4506715738447323,
1409 44152005855084346,
1410 445958869294805289,
1411 4638590332229999353
1412];
1413
1414pub fn set_partitions(n: usize) -> Option<u64>
1418{
1419 BELL_NUMBERS.get(n).map(|x| *x)
1420}
1421
1422#[cfg(test)]
1425mod tests {
1426 macro_rules! test {
1427 ($T:ty, $new:expr) => {
1428 fn check_subsets(s: &$T) {
1429 super::check_subsets(s.get(), s.subsets());
1430 }
1431
1432 fn range(n: usize) -> ::std::ops::Range<usize> {
1433 let a = <$T>::min_len();
1434 let mut b = <$T>::max_len();
1435 if n <= b {
1436 b = n - 1;
1437 }
1438 a..(b+1)
1439 }
1440
1441 #[test]
1442 fn subsets() {
1443 for n in range(9) {
1444 let mut s = $new(n);
1445
1446 loop {
1447 check_subsets(&s);
1448 if !s.increment() {break;}
1449 }
1450 check_subsets(&s);
1451 }
1452 }
1453
1454 #[test]
1455 fn zeroes() {
1456 for n in range(12) {
1457 let mut s = $new(n);
1458
1459 assert_eq!(s.get().len(), n);
1460 assert!(s.get().iter().all(|x| *x == Default::default()));
1461
1462 loop {
1463 if !s.increment() {break;}
1464 }
1465
1466 assert_eq!(s.get().len(), n);
1467 assert!(s.get().iter().all(|x| *x == Default::default()));
1468 }
1469 }
1470
1471 #[test]
1472 fn lexicographic() {
1473 for n in range(10) {
1474 let mut s = $new(n);
1475 let mut last = Vec::new();
1476 loop {
1477 if s.len() > 0 {
1478 assert!(&*last < s.get());
1479 }
1480 last.clear();
1481 last.extend_from_slice(s.get());
1482
1483 if !s.increment() {break;}
1484 }
1485 }
1486 }
1487
1488 #[test]
1489 fn restricted_growth_of_len_n() {
1490 use std::cmp::max;
1491 for n in range(11) {
1492 let mut s = $new(n);
1493
1494 loop {
1495 let mut m = 0;
1496 assert_eq!(s.get().len(), n);
1497
1498 for ai in s.get() {
1499 assert!(*ai <= m);
1500 m = max(m, (*ai).clone() + 1);
1501 }
1502
1503 if !s.increment() {break;}
1504 }
1505 }
1506 }
1507
1508 #[test]
1509 fn all() {
1510 for n in range(12) {
1511 let mut s = $new(n);
1512 let mut i = 0;
1513 loop {
1514 i += 1;
1515 if !s.increment() {break;}
1516 }
1517
1518 assert_eq!(Some(i), crate::set_partitions(s.len()));
1519 }
1520 }
1521
1522 #[test]
1523 fn try_set_repr() {
1524 for n in range(9) {
1525 let mut s = $new(n);
1526 let mut sets = $new(n);
1527 loop {
1528 let seq = s.get().iter().map(|x| *x).collect::<Vec<_>>();
1529 assert!(sets.try_set_repr(seq.into_iter()).is_ok());
1530 assert_eq!((&s.a, &s.b, &s.m), (&sets.a, &sets.b, &sets.m));
1531 check_subsets(&sets);
1532 if !s.increment() {break;}
1533 }
1534 }
1535 }
1536
1537 #[test]
1538 fn try_set() {
1539 for n in range(9) {
1540 let mut s = $new(n);
1541 let mut sets = $new(n);
1542 loop {
1543 assert!(sets.try_set(s.get().iter()).is_ok());
1544 assert_eq!((&s.a, &s.b, &s.m), (&sets.a, &sets.b, &sets.m));
1545 println!("{} {:?}", n, &sets);
1546 check_subsets(&sets);
1547 if !s.increment() {break;}
1548 }
1549 }
1550 }
1551
1552 #[test]
1553 fn try_set_ord() {
1554 for n in range(9) {
1555 let mut s = $new(n);
1556 let mut sets = $new(n);
1557 loop {
1558 assert!(sets.try_set_ord(s.get().iter()).is_ok());
1559 assert_eq!((&s.a, &s.b, &s.m), (&sets.a, &sets.b, &sets.m));
1560 check_subsets(&sets);
1561 if !s.increment() {break;}
1562 }
1563 }
1564 }
1565
1566 #[test]
1567 fn reset() {
1568 for n in range(9) {
1569 let mut s = $new(n);
1570 let new = $new(n);
1571 loop {
1572 let mut r = s.clone();
1573 r.reset();
1574 assert_eq!((&new.a, &new.b, &new.m), (&r.a, &r.b, &r.m));
1575 check_subsets(&r);
1576 if !s.increment() {break;}
1577 }
1578 }
1579 }
1580 }
1581 }
1582
1583 macro_rules! test_var_size {
1584 ($T:ty, $new:expr) => {
1585 test!($T, $new);
1586
1587 #[test]
1588 fn len() {
1589 for n in range(12) {
1590 let s = $new(n);
1591 assert_eq!(s.len(), n);
1592 }
1593 }
1594
1595 #[test]
1596 fn resize() {
1597 for n in range(8) {
1598 let mut s = $new(n);
1599 loop {
1600 for m in 0..16 {
1601 let mut r = s.clone();
1602 assert!(r.try_resize(m).is_ok());
1603 check_subsets(&r);
1604 let sm = $new(m);
1605 assert_eq!((&sm.a, &sm.b, &sm.m), (&r.a, &r.b, &r.m));
1606 }
1607 if !s.increment() {break;}
1608 }
1609 }
1610 }
1611 }
1612 }
1613
1614 macro_rules! test_subsets {
1615 ($S:ty, $E:ty) => {
1616 fn new_small(n: usize) -> crate::ArrayVecSetPartition<[$E; 16], $S> {
1617 crate::ArrayVecSetPartition::try_with_size(n).unwrap()
1618 }
1619
1620 fn new<T: Default>(_: usize) -> T {
1621 T::default()
1622 }
1623
1624 mod avecsp {test_var_size!(crate::ArrayVecSetPartition<[$E; 16], $S>, super::new_small);}
1625 mod vecsp {test_var_size!(crate::VecSetPartition<$E, $S>, crate::VecSetPartition::<$E, $S>::with_size);}
1626
1627 mod sp0 {test!(crate::SetPartition0<$S>, super::new::<crate::SetPartition0<$S>>);} mod gsp0 {test!(crate::GenSetPartition0<$E, $S>, super::new::<crate::GenSetPartition0<$E, $S>>);}
1629 mod sp1 {test!(crate::SetPartition1<$S>, super::new::<crate::SetPartition1<$S>>);} mod gsp1 {test!(crate::GenSetPartition1<$E, $S>, super::new::<crate::GenSetPartition1<$E, $S>>);}
1630 mod sp2 {test!(crate::SetPartition2<$S>, super::new::<crate::SetPartition2<$S>>);} mod gsp2 {test!(crate::GenSetPartition2<$E, $S>, super::new::<crate::GenSetPartition2<$E, $S>>);}
1631 mod sp3 {test!(crate::SetPartition3<$S>, super::new::<crate::SetPartition3<$S>>);} mod gsp3 {test!(crate::GenSetPartition3<$E, $S>, super::new::<crate::GenSetPartition3<$E, $S>>);}
1632 mod sp4 {test!(crate::SetPartition4<$S>, super::new::<crate::SetPartition4<$S>>);} mod gsp4 {test!(crate::GenSetPartition4<$E, $S>, super::new::<crate::GenSetPartition4<$E, $S>>);}
1633 mod sp5 {test!(crate::SetPartition5<$S>, super::new::<crate::SetPartition5<$S>>);} mod gsp5 {test!(crate::GenSetPartition5<$E, $S>, super::new::<crate::GenSetPartition5<$E, $S>>);}
1634 mod sp6 {test!(crate::SetPartition6<$S>, super::new::<crate::SetPartition6<$S>>);} mod gsp6 {test!(crate::GenSetPartition6<$E, $S>, super::new::<crate::GenSetPartition6<$E, $S>>);}
1635 mod sp7 {test!(crate::SetPartition7<$S>, super::new::<crate::SetPartition7<$S>>);} mod gsp7 {test!(crate::GenSetPartition7<$E, $S>, super::new::<crate::GenSetPartition7<$E, $S>>);}
1636 mod sp8 {test!(crate::SetPartition8<$S>, super::new::<crate::SetPartition8<$S>>);} mod gsp8 {test!(crate::GenSetPartition8<$E, $S>, super::new::<crate::GenSetPartition8<$E, $S>>);}
1637 mod sp9 {test!(crate::SetPartition9<$S>, super::new::<crate::SetPartition9<$S>>);} mod gsp9 {test!(crate::GenSetPartition9<$E, $S>, super::new::<crate::GenSetPartition9<$E, $S>>);}
1638 }
1639 }
1640
1641 mod noss {
1642 fn check_subsets<T>(_: &[T], _: &()) {}
1643
1644 test_subsets!((), u16);
1645 }
1646
1647 fn compute_subsets(s: &[u8]) -> Vec<Vec<u8>> {
1648 let mut r = Vec::new();
1649 r.resize(s.len(), Vec::new());
1650 let mut idx = 0;
1651 for i in s {
1652 r[*i as usize].push(idx);
1653 idx += 1;
1654 }
1655
1656 loop {
1657 if let Some(last) = r.last_mut() {
1658 if !last.is_empty() {break;}
1659 } else {
1660 break;
1661 }
1662 r.pop();
1663 }
1664 r
1665 }
1666
1667 mod vecss {
1668 fn check_subsets(s: &[u8], ss: &crate::VecSubsets<u8>) {
1669 let r = super::compute_subsets(s);
1670
1671 assert_eq!(ss.subsets(), &*r);
1672 }
1673
1674 test_subsets!(crate::VecSubsets<u8>, u8);
1675 }
1676
1677 mod avecss {
1678 use ::arrayvec::ArrayVec;
1679 fn check_subsets(s: &[u8], ss: &crate::ArrayVecSubsets<[ArrayVec<[u8; 16]>; 16], [u8; 16]>) {
1680 let r: ArrayVec<[ArrayVec<[u8; 16]>; 16]> = super::compute_subsets(s).into_iter().map(|ss| ss.into_iter().collect()).collect();
1681
1682 assert_eq!(ss.subsets(), &*r);
1683 }
1684
1685 test_subsets!(crate::ArrayVecSubsets<[::arrayvec::ArrayVec<[u8; 16]>; 16], [u8; 16]>, u8);
1686 }
1687
1688 mod hashss {
1689 use ::std::collections::HashSet;
1690 fn check_subsets(s: &[u8], ss: &crate::HashSubsets<u8>) {
1691 let r: Vec<HashSet<u8>> = super::compute_subsets(s).into_iter().map(|ss| ss.into_iter().collect()).collect();
1692
1693 assert_eq!(ss.subsets(), &*r);
1694 }
1695
1696 test_subsets!(crate::HashSubsets<u8>, u8);
1697 }
1698
1699 mod btreess {
1700 use ::std::collections::BTreeSet;
1701 fn check_subsets(s: &[u8], ss: &crate::BTreeSubsets<u8>) {
1702 let r: Vec<BTreeSet<u8>> = super::compute_subsets(s).into_iter().map(|ss| ss.into_iter().collect()).collect();
1703
1704 assert_eq!(ss.subsets(), &*r);
1705 }
1706
1707 test_subsets!(crate::BTreeSubsets<u8>, u8);
1708 }
1709
1710 #[test]
1711 fn set_partitions()
1712 {
1713 let mut bell_numbers = vec![1u64];
1714 let mut n = 0;
1715
1716 assert_eq!(crate::set_partitions(0), Some(1));
1717 loop {
1718 if let Some(sp) = crate::set_partitions(n + 1) {
1719 let mut b = 0u64;
1720 for k in 0..(n+1) {
1721 let mut c = 1u64;
1722 for i in 1..k+1 {
1723 c *= (n - k + i) as u64;
1724 c /= i as u64;
1725 }
1726 b += bell_numbers[k] * c;
1727 }
1728 assert_eq!(b, sp);
1729 bell_numbers.push(b);
1730 } else {
1731 break;
1732 }
1733 n += 1;
1734 }
1735 }
1736}