Skip to content

Commit 93c9595

Browse files
committed
-
1 parent 216699c commit 93c9595

File tree

3 files changed

+21
-11
lines changed

3 files changed

+21
-11
lines changed

source_py3/python_toolbox/combi/perm_space.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,8 @@ def __getitem__(self, i):
565565
return self.perm_type((wip_perm_sequence_dict[k] for k in
566566
self.domain), self)
567567
elif self.is_recurrent:
568-
assert not self.is_degreed
569-
assert not self.is_sliced
568+
assert not self.is_dapplied and not self.is_degreed and \
569+
not self.is_sliced
570570
available_values = list(self.sequence)
571571
reserved_values = list(self.fixed_map.values())
572572
wip_perm_sequence_dict = dict(self.fixed_map)
@@ -592,17 +592,20 @@ def __getitem__(self, i):
592592
head = []
593593
fixed_map_to_use = dict(wip_perm_sequence_dict)
594594
n_elements_to_use = self.n_elements
595-
for i in sequence_tools.CuteRange(infinity):
595+
for k in sequence_tools.CuteRange(infinity):
596596
try:
597-
head.append(wip_perm_sequence_dict[i])
597+
head.append(wip_perm_sequence_dict[k])
598598
except KeyError:
599599
break
600600
else:
601-
del wip_perm_sequence_dict[i]
601+
del fixed_map_to_use[k]
602602
n_elements_to_use -= 1
603603
sequence_to_use = list(self.sequence)
604604
for item in head:
605605
sequence_to_use.remove(item)
606+
607+
fixed_map_to_use = {key - len(head): value for key, value
608+
in fixed_map_to_use.items()}
606609

607610
candidate_sub_perm_space = PermSpace(
608611
sequence_to_use,

source_py3/python_toolbox/sequence_tools/cute_range.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,20 +192,23 @@ def __len__(self):
192192
# Sadly Python doesn't allow infinity or floats here.
193193
return self.length if isinstance(self.length, numbers.Integral) else 0
194194

195-
def index(self, i):
195+
def index(self, i, start=-infinity, stop=infinity):
196196
from python_toolbox import math_tools
197197
if not isinstance(i, numbers.Number):
198198
raise ValueError
199199
else:
200200
distance = i - self.start
201201
if distance == 0 and self:
202-
return 0
202+
if start <= 0 < stop: return 0
203+
else: raise ValueError("Found but not within range.")
203204
if math_tools.get_sign(distance) != math_tools.get_sign(self.step):
204205
raise ValueError
205206
index, remainder = math_tools.cute_divmod(distance, self.step)
206207
if remainder == 0 and (0 <= index < self.length or
207208
index == self.length == infinity):
208-
return index
209+
if start <= index < stop: return index
210+
else: raise ValueError("Found but not within range.")
211+
209212
else:
210213
raise ValueError
211214

source_py3/test_python_toolbox/test_combi/test_exhaustive.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,13 @@ def _iter(self):
5858
if any(candidate[self.domain.index(key)] != value for
5959
key, value in self.fixed_map.items()):
6060
continue
61-
if self.is_combination and not cute_iter_tools.is_sorted(
62-
candidate, key=self.sequence.index):
63-
continue
61+
if self.is_combination:
62+
i = -1
63+
for item in candidate:
64+
try:
65+
i = self.sequence.index(item, start=i+1)
66+
except ValueError:
67+
continue
6468
if self.is_degreed:
6569
unvisited_items = \
6670
set(sequence_tools.CuteRange(self.sequence_length))

0 commit comments

Comments
 (0)