Skip to content

Commit 482d24f

Browse files
committed
-
1 parent ce47fad commit 482d24f

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

source_py3/python_toolbox/combi/perm_space.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,10 @@ def __init__(self, iterable_or_length, domain=None, n_elements=None,
193193
self.n_elements = self.sequence_length if (n_elements is None) \
194194
else n_elements
195195
if not 0 <= self.n_elements <= self.sequence_length:
196-
raise Exception('`n_elements` must be between 0 and %s' %
197-
self.sequence_length)
196+
raise Exception(
197+
'`n_elements` must be between 0 and %s, you gave %s' %
198+
(self.sequence_length, self.n_elements)
199+
)
198200
self.is_partial = (self.n_elements < self.sequence_length)
199201

200202
self.indices = sequence_tools.CuteRange(self.n_elements)
@@ -571,6 +573,7 @@ def __getitem__(self, i):
571573
reserved_values = list(self.fixed_map.values())
572574
wip_perm_sequence_dict = dict(self.fixed_map)
573575
wip_i = i
576+
shit_set = set()
574577
for j in range(self.n_elements):
575578
if j in self.fixed_map:
576579
available_values.remove(self.fixed_map[j])
@@ -608,16 +611,23 @@ def __getitem__(self, i):
608611
]
609612
else:
610613
sequence_to_use.remove(item)
614+
615+
sequence_to_use = [x for x in sequence_to_use if x not in
616+
shit_set]
611617

612618
fixed_map_to_use = {key - len(head): value for key, value
613619
in fixed_map_to_use.items()}
614620

615-
candidate_sub_perm_space = PermSpace(
616-
sequence_to_use,
617-
n_elements=n_elements_to_use,
618-
fixed_map=fixed_map_to_use,
619-
is_combination=self.is_combination
620-
)
621+
if len(sequence_to_use) < n_elements_to_use:
622+
class O: length = 0
623+
candidate_sub_perm_space = O()
624+
else:
625+
candidate_sub_perm_space = PermSpace(
626+
sequence_to_use,
627+
n_elements=n_elements_to_use,
628+
fixed_map=fixed_map_to_use,
629+
is_combination=self.is_combination
630+
)
621631
# #
622632
###########################################################
623633

@@ -626,6 +636,7 @@ def __getitem__(self, i):
626636
break
627637
else:
628638
wip_i -= candidate_sub_perm_space.length
639+
shit_set.add(wip_perm_sequence_dict[j])
629640
del wip_perm_sequence_dict[j]
630641
else:
631642
raise RuntimeError

source_py3/test_python_toolbox/test_combi/test_exhaustive.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(self, iterable_or_length, domain=None, n_elements=None,
2929
self.sequence_length = len(self.sequence)
3030
self._sequence_frozen_counter = \
3131
nifty_collections.FrozenCounter(self.sequence)
32+
self.is_recurrent = len(set(self.sequence)) < len(self.sequence)
3233
self.domain = domain or sequence_tools.CuteRange(self.sequence_length)
3334
self.n_elements = n_elements if n_elements is not None else \
3435
len(self.sequence)
@@ -42,10 +43,23 @@ def __init__(self, iterable_or_length, domain=None, n_elements=None,
4243
sequence_tools.CuteRange(self.sequence_length))
4344

4445
def __iter__(self):
46+
if (self.is_recurrent and self.is_combination):
47+
def make_iterator():
48+
crap = set()
49+
for item in self._iter():
50+
fc = nifty_collections.FrozenCounter(item)
51+
if fc in crap:
52+
continue
53+
else:
54+
yield item
55+
crap.add(fc)
56+
iterator = make_iterator()
57+
else:
58+
iterator = self._iter()
4559
if self.slice_:
46-
return itertools.islice(self._iter(), *self.slice_)
60+
return itertools.islice(iterator, *self.slice_)
4761
else:
48-
return self._iter()
62+
return iterator
4963

5064
def _iter(self):
5165
yielded_candidates = set()
@@ -104,6 +118,12 @@ def _check_variation_selection(variation_selection):
104118
# Can't even test this illogical clash.
105119
return
106120

121+
#blocktodo remove
122+
if not (variation_selection.is_recurrent and variation_selection.is_combination):
123+
return
124+
#blocktodo remove
125+
if variation_selection.number != 240:
126+
return
107127

108128
iterable_or_length = (
109129
'abracab' if variation_selection.is_recurrent else
@@ -175,6 +195,9 @@ def _check_variation_selection(variation_selection):
175195

176196
assert perm_space.length == len(brute_perm_space_tuple)
177197

198+
#blocktodo remove
199+
tuple(perm_space)
200+
178201
if perm_space.length >= 2:
179202
assert perm_space.index(perm_space[-1]) > \
180203
perm_space.index(perm_space[0])

0 commit comments

Comments
 (0)