Skip to content

Commit 224ba6c

Browse files
authored
Changed 'CombCov.get_subrules()' into a generator, made MeshTiling.get_subrules() a little bit smarted by not returning subrules with empty columns or rows (as they're duplicate of smaller MeshTilings) (#13)
1 parent 4a13d0d commit 224ba6c

File tree

5 files changed

+29
-19
lines changed

5 files changed

+29
-19
lines changed

demo/mesh_tiling.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -282,41 +282,50 @@ def get_subrules(self):
282282
"[ERROR] obstruction '{}' is neither a MeshPatt "
283283
"or Perm!".format(obstruction))
284284

285-
subrules = set()
285+
subrules = 1
286+
yield MeshTiling({}, {}) # always include the empty rule
287+
286288
for (dim_col, dim_row) in itertools.product(
287289
range(1, self.columns + self.MAX_COLUMN_DIMENSION),
288290
range(1, self.rows + self.MAX_ROW_DIMENSION)
289291
):
290292

291293
nr_of_cells = dim_col * dim_row
292-
293-
for how_many_active_cells in range(self.MAX_ACTIVE_CELLS + 1):
294+
for how_many_active_cells in range(min(dim_col, dim_row),
295+
self.MAX_ACTIVE_CELLS + 1):
294296
for active_cells in itertools.product(
295297
cell_choices, repeat=how_many_active_cells):
296298
for combination in itertools.combinations(
297299
range(nr_of_cells), how_many_active_cells):
298300
requirements = {}
299301
obstructions = {}
302+
active_cols = set()
303+
active_rows = set()
300304
for i, cell_index in enumerate(combination):
301305
choice = active_cells[i]
306+
302307
c = cell_index % dim_col
308+
active_cols.add(c)
309+
303310
r = cell_index // dim_col
311+
active_rows.add(r)
304312

305313
if choice.obstructions is not frozenset():
306314
obstructions[(c, r)] = choice.obstructions
307315

308316
if choice.requirements is not frozenset():
309317
requirements[(c, r)] = choice.requirements
310318

311-
mt = MeshTiling(obstructions, requirements)
312-
subrules.add(mt)
319+
if active_cols == set(range(dim_col)) and \
320+
active_rows == set(range(dim_row)):
321+
subrules += 1
322+
yield MeshTiling(obstructions, requirements)
313323

314324
logger.info(
315325
"Generated {} subrules with up to {} active cells with dimensions "
316326
"up to {}x{}".format(
317-
len(subrules), self.MAX_ACTIVE_CELLS,
327+
subrules, self.MAX_ACTIVE_CELLS,
318328
self.MAX_COLUMN_DIMENSION, self.MAX_ROW_DIMENSION))
319-
return list(subrules)
320329

321330
def get_dimension(self):
322331
return (self.columns, self.rows)

demo/string_set.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import itertools
22
import logging
3-
from typing import List
43

54
from combcov import CombCov, Rule
65

@@ -66,8 +65,8 @@ def get_elmnts(self, of_size):
6665

6766
return strings_of_length
6867

69-
def get_subrules(self) -> List[Rule]:
70-
rules = []
68+
def get_subrules(self):
69+
rules = 0
7170
prefixes = []
7271
for n in range(self.max_prefix_size):
7372
prefixes.extend(self.get_elmnts(n + 1))
@@ -77,17 +76,18 @@ def get_subrules(self) -> List[Rule]:
7776
empty_string_set = StringSet(alphabet=self.alphabet,
7877
avoid=frozenset(self.alphabet),
7978
prefix=prefix)
80-
rules.append(empty_string_set)
79+
rules += 1
80+
yield empty_string_set
8181

8282
# Regular rules of the from prefix + non-empty StringSet
8383
for prefix in prefixes:
8484
for avoiding_subset in self.get_all_avoiding_subsets():
8585
substring_set = StringSet(self.alphabet, avoiding_subset,
8686
prefix)
87-
rules.append(substring_set)
87+
rules += 1
88+
yield substring_set
8889

89-
logger.info("Generated {} subrules".format(len(rules)))
90-
return rules
90+
logger.info("Generated {} subrules".format(rules))
9191

9292
def _key(self):
9393
return (self.alphabet, self.avoid, self.prefix)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def read(fname):
1111

1212
setup(
1313
name="CombCov",
14-
version="0.3.0",
14+
version="0.3.1",
1515
author="Permuta Triangle",
1616
author_email="permutatriangle@gmail.com",
1717
description="Searching for combinatorial covers.",

tests/test_comb_cov.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def test_print_solution_rainy(self) -> None:
5454
assert len(mocked_print.mock_calls) == 1
5555

5656
def test_too_many_subrules(self) -> None:
57-
subrules = self.string_set.get_subrules()
57+
subrules = list(self.string_set.get_subrules())
5858
too_many = subrules + [self.string_set] + subrules
5959

6060
correct_rules = self.comb_cov.rules

tests/test_mesh_tiling.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import unittest
22

3+
from permuta import Av, MeshPatt, Perm, PermSet
4+
35
import pytest
46
from combcov import Rule
57
from demo.mesh_tiling import Cell, MeshTiling, MockAvMeshPatt
6-
from permuta import Av, MeshPatt, Perm, PermSet
78

89

910
class MockAvMeshPattTests(unittest.TestCase):
@@ -177,7 +178,7 @@ def test_subrules(self):
177178
self.root_mt.MAX_COLUMN_DIMENSION = 3
178179
self.root_mt.MAX_ROW_DIMENSION = 2
179180
self.root_mt.MAX_ACTIVE_CELLS = 3
180-
subrules = self.root_mt.get_subrules()
181+
subrules = list(self.root_mt.get_subrules())
181182
assert all(isinstance(rule, Rule) for rule in subrules)
182183
assert (self.empty_mt in subrules)
183184
assert (self.sub_mt in subrules)
@@ -186,7 +187,7 @@ def test_subrules_too_small_dimensions(self):
186187
self.root_mt.MAX_COLUMN_DIMENSION = 2
187188
self.root_mt.MAX_ROW_DIMENSION = 2
188189
self.root_mt.MAX_ACTIVE_CELLS = 3
189-
subrules = self.root_mt.get_subrules()
190+
subrules = list(self.root_mt.get_subrules())
190191
assert all(isinstance(rule, Rule) for rule in subrules)
191192
assert (self.empty_mt in subrules)
192193
assert (self.sub_mt not in subrules)

0 commit comments

Comments
 (0)