File tree Expand file tree Collapse file tree 3 files changed +21
-11
lines changed
test_python_toolbox/test_combi Expand file tree Collapse file tree 3 files changed +21
-11
lines changed Original file line number Diff line number Diff 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 ,
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 ))
You can’t perform that action at this time.
0 commit comments