Skip to content

Commit 57b3c67

Browse files
committed
migrate verification to new algo
1 parent 9044cba commit 57b3c67

File tree

12 files changed

+74
-142
lines changed

12 files changed

+74
-142
lines changed

gen_rec_prog.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
from comb_spec_searcher import *
66
from permuta import *
77
from tilescopethree import *
8-
from tilescopethree.strategies import one_by_one_verification
8+
from tilescopethree.strategies import one_by_one_verified
99
from tilescopethree.strategy_packs import point_placements_db
1010
from tilings import *
1111

1212
pack = point_placements_db
13-
pack.ver_strats = [one_by_one_verification]
13+
pack.ver_strats = [one_by_one_verified]
1414

1515
if len(sys.argv) > 1:
1616
inp = sys.argv[1]

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ def read(fname):
3434
'pytest-cov==2.7.1',
3535
'pytest-pep8==1.0.6',
3636
'pytest-isort==0.3.1',
37+
'pytest-timeout==1.3.4',
3738
],
3839
)

tests/test_tilescope.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from comb_spec_searcher import ProofTree
55
from tilescopethree import TileScopeTHREE
66
from tilescopethree.strategy_packs_v2 import (
7-
point_placements, point_placements_fusion,
8-
point_placements_fusion_with_interleaving,
7+
all_the_strategies_database_verified, point_placements,
8+
point_placements_fusion, point_placements_fusion_with_interleaving,
99
row_and_col_placements_fusion_with_interleaving_fusion)
1010

1111

@@ -14,6 +14,12 @@ def test_132():
1414
searcher = TileScopeTHREE('132', point_placements)
1515
t = searcher.auto_search(smallest=True)
1616
assert isinstance(t, ProofTree)
17+
18+
19+
@pytest.mark.xfail(reason='Generating function finding not implemented')
20+
def test_132_genf():
21+
searcher = TileScopeTHREE('132', point_placements)
22+
t = searcher.auto_search(smallest=True)
1723
gf = sympy.series(t.get_genf(), n=15)
1824
x = sympy.Symbol('x')
1925
assert ([gf.coeff(x, n) for n in range(13)] ==
@@ -22,6 +28,13 @@ def test_132():
2228

2329
@pytest.mark.timeout(20)
2430
def test_123():
31+
searcher = TileScopeTHREE('123', all_the_strategies_database_verified)
32+
t = searcher.auto_search(smallest=True)
33+
assert isinstance(t, ProofTree)
34+
35+
36+
@pytest.mark.timeout(20)
37+
def test_123_with_db():
2538
searcher = TileScopeTHREE('123', point_placements_fusion)
2639
t = searcher.auto_search(smallest=True)
2740
assert isinstance(t, ProofTree)

tilescopethree/strategies/verification_strategies/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
from .globally_verified import elementary_verified, globally_verified
33
from .miner_verification import miner_verified
44
from .subclass_verified import subclass_verified
5-
from .subset_verified import one_by_one_verification, subset_verified
6-
from .verify_points import verify_points
5+
from .subset_verified import one_by_one_verified, subset_verified
6+
from .verify_atoms import verify_atoms
77
from .verify_short_obs import verify_short_obstructions
Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,5 @@
1-
"""A strategy for checking if a tiling is a subset of the class."""
2-
import os
3-
from base64 import b64decode, b64encode
4-
5-
from logzero import logger
6-
7-
from comb_spec_searcher import VerificationRule
8-
from tilings import Tiling
9-
10-
dir_path = os.path.dirname(os.path.realpath(__file__))
11-
filenames = ["012_depth_5_database_twisted.txt"]
12-
database = set()
1+
from tilings.algorithms.enumeration import DatabaseEnumeration
132

143

154
def database_verified(tiling, **kwargs):
16-
if not database and filenames:
17-
for filename in filenames:
18-
logger.info("Importing database from '{}'.".format(filename),
19-
extra=kwargs['logger'])
20-
f = open(dir_path + "/" + filename, 'r')
21-
for line in f.readlines():
22-
compression = b64decode(line.encode())
23-
dbtiling = Tiling.decompress(compression)
24-
database.add(dbtiling)
25-
f.close()
26-
if tiling in database:
27-
return VerificationRule("Already in database!")
5+
return DatabaseEnumeration(tiling).verification_rule()
Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,20 @@
1-
from comb_spec_searcher import VerificationRule
2-
3-
from .subset_verified import subset_verified
1+
from tilings.algorithms.enumeration import (ElementaryEnumeration,
2+
LocallyFactorableEnumeration)
43

54

65
def globally_verified(tiling, **kwargs):
7-
"""The globally verified strategy.
6+
"""
7+
The globally verified strategy.
88
99
A tiling is globally verified if every requirement and obstruction is
1010
non-interleaving.
1111
"""
12-
if not tiling.dimensions == (1, 1):
13-
if all(not ob.is_interleaving() for ob in tiling.obstructions):
14-
if (all(all(not r.is_interleaving() for r in req)
15-
for req in tiling.requirements) and
16-
not possible_tautology(tiling)):
17-
return VerificationRule(formal_step="Globally verified.")
18-
else:
19-
return subset_verified(tiling, **kwargs)
20-
21-
22-
def possible_tautology(tiling):
23-
"""Return True if possibly equivalent to a 1x1 tiling through empty cell
24-
inferral. (It just checks if two cells are non-empty - nothing exciting)"""
25-
if len(tiling.positive_cells) > 1:
26-
return False
27-
cells = set()
28-
maxlen = max(tiling.maximum_length_of_minimum_gridded_perm(), 1) + 1
29-
for gp in tiling.gridded_perms(maxlen=maxlen):
30-
cells.update(gp.pos)
31-
if len(cells) > 1:
32-
return False
33-
return True
12+
return LocallyFactorableEnumeration(tiling).verification_rule()
3413

3514

3615
def elementary_verified(tiling, **kwargs):
37-
"""A tiling is elementary verified if it is globally verified and has no
38-
interleaving cells."""
39-
if tiling.fully_isolated():
40-
if tiling.dimensions == (1, 1):
41-
return subset_verified(tiling, **kwargs)
42-
return globally_verified(tiling, **kwargs)
16+
"""
17+
A tiling is elementary verified if it is globally verified and has no
18+
interleaving cells.
19+
"""
20+
return ElementaryEnumeration(tiling).verification_rule()
Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,17 @@
1-
"""A strategy for checking if a tiling is a subset of the class."""
1+
from tilings.algorithms.enumeration import (LocalEnumeration,
2+
OneByOneEnumeration)
23

3-
from comb_spec_searcher import VerificationRule
4-
from permuta.descriptors import Basis
5-
from permuta.permutils import all_symmetry_sets
64

7-
8-
def subset_verified(tiling, basis, **kwargs):
9-
"""The subset verified strategy.
5+
def subset_verified(tiling, no_reqs=False, **kwargs):
6+
"""
7+
The subset verified strategy.
108
119
A tiling is subset verified if every obstruction and every requirement is
12-
localized.
10+
localized and the tiling is not 1x1.
1311
"""
14-
if kwargs.get("no_factors", False):
15-
if len(tiling.find_factors()) > 1:
16-
return
17-
if kwargs.get("no_reqs", False):
18-
if tiling.requirements:
19-
return
20-
if tiling.dimensions == (1, 1):
21-
if one_by_one_verified(tiling, basis, **kwargs):
22-
return VerificationRule(
23-
formal_step="The tiling is a subset of the class.")
24-
elif (all(ob.is_single_cell() for ob in tiling.obstructions) and
25-
all(all(r.is_single_cell() for r in req)
26-
for req in tiling.requirements)):
27-
return VerificationRule(
28-
formal_step="The tiling is a subset of the class.")
12+
return LocalEnumeration(tiling, no_reqs).verification_rule()
2913

3014

3115
def one_by_one_verified(tiling, basis, **kwargs):
32-
"""Return true if tiling is a subset of the Av(basis)."""
33-
if basis is None or tiling.dimensions != (1, 1):
34-
return False
35-
rootbasis = [ob.patt for ob in tiling.obstructions]
36-
if kwargs.get('symmetry'):
37-
all_patts = [Basis(sym_set)
38-
for sym_set in all_symmetry_sets(rootbasis)]
39-
else:
40-
all_patts = [Basis(rootbasis)]
41-
if any(basis == patts for patts in all_patts):
42-
return False
43-
return True
44-
45-
46-
def one_by_one_verification(tiling, basis, **kwargs):
4716
"""Return a verification if one-by-one verified."""
48-
if one_by_one_verified(tiling, basis, **kwargs):
49-
return VerificationRule(
50-
formal_step="The tiling is a subclass of the class.")
17+
return OneByOneEnumeration(tiling, basis).verification_rule()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""A strategy for checking if a tiling is a point."""
2+
from tilings.algorithms.enumeration import BasicEnumeration
3+
4+
5+
def verify_atoms(tiling, **kwargs):
6+
"""
7+
Verify the most basics tilings.
8+
"""
9+
return BasicEnumeration(tiling).verification_rule()

tilescopethree/strategies/verification_strategies/verify_points.py

Lines changed: 0 additions & 22 deletions
This file was deleted.

tilescopethree/strategy_packs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
fusion_with_interleaving,
1212
globally_verified,
1313
obstruction_transitivity,
14-
one_by_one_verification,
14+
one_by_one_verified,
1515
partial_requirement_placement,
1616
point_placement,
1717
requirement_corroboration,
@@ -584,7 +584,7 @@
584584

585585
point_placements_one_by_one = Pack(
586586
initial_strats=[requirement_placement],
587-
ver_strats=[one_by_one_verification],
587+
ver_strats=[one_by_one_verified],
588588
inferral_strats=[row_and_column_separation, obstruction_transitivity],
589589
expansion_strats=[[factor], [all_point_insertions],
590590
[requirement_corroboration]],

0 commit comments

Comments
 (0)