@@ -29,12 +29,12 @@ def convert_factors_to_serials(factors):
2929 return serials , parents
3030
3131
32- def make_incompleted (serials , length ):
33- incompleted = set ()
32+ def make_incomplete (serials , length ):
33+ incomplete = set ()
3434 for keys in combinations ([k for k , _ in get_items (serials )], length ):
3535 for pair in product (* [serials [keys [i ]] for i in range (length )]):
36- incompleted .add (pair )
37- return incompleted
36+ incomplete .add (pair )
37+ return incomplete
3838
3939
4040class Row (dict ):
@@ -65,7 +65,7 @@ def storable(self, candidate=[]):
6565 if self .pre_filter is None :
6666 return num
6767 nxt = self .new ({** self , ** dict (candidate )})
68- if not self .pre_filter (nxt .restore ()):
68+ if not self .pre_filter (nxt .resolve ()):
6969 return None
7070 return num
7171
@@ -79,14 +79,21 @@ def complement(self):
7979 raise InvalidCondition (InvalidCondition .message )
8080 return self
8181
82- def restore (self ):
82+ def resolve (self ):
8383 return self .new (
8484 [key , self .factors [key ][serial - self .serials [key ][0 ]]]
8585 for key , serial in self .items ()
8686 )
8787
88+ def restore (self ):
89+ resolved = self .resolve ()
90+ if issubclass (self .type , list ):
91+ return [r for _ , r in sorted (resolved .items ())]
92+ if issubclass (self .type , dict ):
93+ return dict (resolved )
94+
8895
89- def make (
96+ def make_async (
9097 factors ,
9198 length = 2 ,
9299 progress = False ,
@@ -97,55 +104,70 @@ def make(
97104 ** params ,
98105):
99106 serials , parents = convert_factors_to_serials (factors )
100- incompleted = make_incompleted (serials , length )
101- len_incompleted = float (len (incompleted ))
107+ incomplete = make_incomplete (serials , length )
108+ len_incomplete = float (len (incomplete ))
102109 md5_cache = {}
103110
104- rows , row = [], Row (None , factors , serials , pre_filter )
111+ row = Row (None , factors , serials , pre_filter )
105112 # When pre_filter is specified,
106- # it will be applied to incompleted through `row.storable` beforehand.
107- for pair in list (filter (lambda _ : pre_filter , incompleted )):
113+ # it will be applied to incomplete through `row.storable` beforehand.
114+ for pair in list (filter (lambda _ : pre_filter , incomplete )): #########
108115 if not row .storable ([(parents [p ], p ) for p in pair ]):
109- incompleted .discard (pair )
116+ incomplete .discard (pair )
110117
111- while incompleted :
118+ while incomplete :
112119 if row .filled ():
113- rows .append (row )
120+ if post_filter is None or post_filter (row .resolve ()):
121+ yield row .restore ()
114122 row = row .new ()
115123
116124 common_kwargs = {
117125 ** params ,
118126 "row" : row ,
119127 "parents" : parents ,
120128 "length" : length ,
121- "incompleted " : incompleted ,
129+ "incomplete " : incomplete ,
122130 "md5_cache" : md5_cache ,
123131 }
124- sorted_incompleted = sorter .sort (** common_kwargs )
125- for pair in criterion .extract (sorted_incompleted , ** common_kwargs ):
132+ sorted_incomplete = sorter .sort (** common_kwargs )
133+ for pair in criterion .extract (sorted_incomplete , ** common_kwargs ):
126134 if row .filled ():
127135 break
128136 row .update ((parents [p ], p ) for p in pair )
129137 for vs in combinations (sorted (row .values ()), length ):
130- incompleted .discard (vs )
138+ incomplete .discard (vs )
131139 else :
132140 if not row .filled ():
133141 row .complement ()
134142
135143 if progress :
136- rate = (len_incompleted - len (incompleted )) / len_incompleted
144+ rate = (len_incomplete - len (incomplete )) / len_incomplete
137145 print ("{0:.2%}\r " .format (rate ), end = "" )
138146
139147 if row :
140- rows .append (row .complement ())
141-
142- result = []
143- for row in rows :
144- restored = row .restore ()
145- if post_filter and not post_filter (restored ):
146- continue
147- if issubclass (row .type , list ):
148- result .append ([r for _ , r in sorted (restored .items ())])
149- elif issubclass (row .type , dict ):
150- result .append (dict (restored ))
151- return result
148+ row .complement ()
149+ if post_filter is None or post_filter (row .resolve ()):
150+ yield row .restore ()
151+
152+
153+ def make (
154+ factors ,
155+ length = 2 ,
156+ progress = False ,
157+ sorter = sorters .hash ,
158+ criterion = criteria .greedy ,
159+ pre_filter = None ,
160+ post_filter = None ,
161+ ** params ,
162+ ):
163+ gen = make_async (
164+ factors ,
165+ length = length ,
166+ progress = progress ,
167+ sorter = sorter ,
168+ criterion = criterion ,
169+ pre_filter = pre_filter ,
170+ post_filter = post_filter ,
171+ ** params ,
172+ )
173+ return list (gen )
0 commit comments