PermutaTriangle/comb_spec_searcher

KeyError for "rule = equivalence_rules[(b, a)].to_reverse_rule()"

Closed this issue ยท 7 comments

Note that it may take MANY runs for the error to appear. It also sometimes hangs forever when making the specification.

To recreate in about 90 seconds:

from tilings.tilescope import TileScope, TileScopePack

basis = '0213_1230'
pack = TileScopePack.insertion_row_and_col_placements(row_only=True).make_fusion(apply_first=True)
css = TileScope(basis, pack)
spec = css.auto_search()

full traceback:

Traceback (most recent call last):
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 138, in _add_equivalence_path_rules
    rule = equivalence_rules[(a, b)]
KeyError: (Tiling(obstructions=(GriddedPerm(Perm((0,)), ((0, 0),)), GriddedPerm(Perm((0,)), ((1, 1),)), GriddedPerm(Perm((0,)), ((2, 0),)), GriddedPerm(Perm((0,)), ((3, 0),)), GriddedPerm(Perm((0,)), ((4, 0),)), GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((0, 1)), ((2, 1), (3, 1))), GriddedPerm(Perm((0, 1)), ((3, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (3, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (3, 1), (4, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((4, 1), (4, 1), (4, 1), (4, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),), (GriddedPerm(Perm((0,)), ((4, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((3, 1),)),)),)), Tiling(obstructions=(GriddedPerm(Perm((0,)), ((0, 0),)), GriddedPerm(Perm((0,)), ((1, 1),)), GriddedPerm(Perm((0,)), ((2, 0),)), GriddedPerm(Perm((0,)), ((3, 0),)), GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (3, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (3, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (3, 1), (3, 1), (3, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((2, 1),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((2, 1),)),)),)))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/users/personnel/jay/atrap/repos/handy-scripts/jay/surveyor/surveyor.py", line 104, in run_work_packet
    spec = css.auto_search(max_time=time_to_try)
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/comb_spec_searcher.py", line 613, in auto_search
    minimization_time_limit=0.01 * (time.time() - auto_search_start),
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/utils.py", line 30, in inner
    res = func(css, *args, **kwargs)
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/comb_spec_searcher.py", line 676, in get_specification
    expand_verified=expand_verified,
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 75, in __init__
    self._populate_rules_dict(strategies, equivalence_paths, expand_verified)
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 122, in _populate_rules_dict
    self._add_equivalence_path_rules(equivalence_paths, equivalence_rules)
  File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 140, in _add_equivalence_path_rules
    rule = equivalence_rules[(b, a)].to_reverse_rule()
KeyError: (Tiling(obstructions=(GriddedPerm(Perm((0,)), ((0, 0),)), GriddedPerm(Perm((0,)), ((1, 1),)), GriddedPerm(Perm((0,)), ((2, 0),)), GriddedPerm(Perm((0,)), ((3, 0),)), GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (3, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (3, 1), (3, 1), (3, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (3, 1), (3, 1), (3, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((2, 1),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((2, 1),)),)),)), Tiling(obstructions=(GriddedPerm(Perm((0,)), ((0, 0),)), GriddedPerm(Perm((0,)), ((1, 1),)), GriddedPerm(Perm((0,)), ((2, 0),)), GriddedPerm(Perm((0,)), ((3, 0),)), GriddedPerm(Perm((0,)), ((4, 0),)), GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((0, 1)), ((2, 1), (3, 1))), GriddedPerm(Perm((0, 1)), ((3, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (3, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (3, 1), (4, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((4, 1), (4, 1), (4, 1), (4, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),), (GriddedPerm(Perm((0,)), ((4, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((3, 1),)),)),)))

PermutaTriangle/Tilings#186 will fix the hanging issue

Cannot replicate. Closing for now.

This one is back, but once again I cannot replicate. This time the class/pack was:

from tilings.tilescope import TileScope, TileScopePack

basis = '0213_1230'
pack = TileScopePack.insertion_row_and_col_placements(row_only=True).make_fusion(apply_first=True)
css = TileScope(basis, pack)
spec = css.auto_search()

and the traceback is

[E 200626 10:13:28 surveyor:211] 0213_1230
    insertion_row_placements_fusion
    Looking for recursive combinatorial specification with the strategies:
    Inferral: row and column separation, obstruction transitivity
    Initial: tracked fusion, add assumptions, splitting the assumptions, factor, requirement corroboration, point insertion
    Verification: verify atoms, insertion encoding verified, one by one verification, locally factorable verification
    Set 1: row placement

    Traceback (most recent call last):
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 138, in _add_equivalence_path_rules
        rule = equivalence_rules[(a, b)]
    KeyError: (Tiling(obstructions=(GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((0, 1)), ((2, 1), (3, 1))), GriddedPerm(Perm((0, 1)), ((3, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (4, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (4, 1))), GriddedPerm(Perm((1, 0)), ((4, 1), (4, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 0, 2)), ((4, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 0, 2)), ((5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (3, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (4, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((2, 1), (4, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((3, 1), (4, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((4, 1), (4, 1), (5, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((4, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((5, 1), (5, 1), (5, 1), (5, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),), (GriddedPerm(Perm((0,)), ((4, 1),)),), (GriddedPerm(Perm((0,)), ((5, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((3, 1),)),)),)), Tiling(obstructions=(GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (3, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (3, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((2, 1), (3, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((3, 1), (3, 1), (4, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((4, 1), (4, 1), (4, 1), (4, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((2, 1),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),), (GriddedPerm(Perm((0,)), ((4, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((2, 1),)),)),)))

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "/users/personnel/jay/atrap/repos/handy-scripts/jay/surveyor/surveyor.py", line 104, in run_work_packet
        spec = css.auto_search(max_time=time_to_try)
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/comb_spec_searcher.py", line 613, in auto_search
        minimization_time_limit=0.01 * (time.time() - auto_search_start),
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/utils.py", line 30, in inner
        res = func(css, *args, **kwargs)
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/comb_spec_searcher.py", line 676, in get_specification
        expand_verified=expand_verified,
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 75, in __init__
        self._populate_rules_dict(strategies, equivalence_paths, expand_verified)
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 122, in _populate_rules_dict
        self._add_equivalence_path_rules(equivalence_paths, equivalence_rules)
      File "/users/personnel/jay/atrap/repos/comb_spec_searcher/comb_spec_searcher/specification.py", line 140, in _add_equivalence_path_rules
        rule = equivalence_rules[(b, a)].to_reverse_rule()
    KeyError: (Tiling(obstructions=(GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (3, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (3, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((2, 1), (3, 1), (4, 1))), GriddedPerm(Perm((1, 2, 0)), ((3, 1), (3, 1), (4, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (4, 1), (4, 1), (4, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((4, 1), (4, 1), (4, 1), (4, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((2, 1),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),), (GriddedPerm(Perm((0,)), ((4, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((2, 1),)),)),)), Tiling(obstructions=(GriddedPerm(Perm((0, 1)), ((1, 0), (1, 0))), GriddedPerm(Perm((0, 1)), ((2, 1), (2, 1))), GriddedPerm(Perm((0, 1)), ((2, 1), (3, 1))), GriddedPerm(Perm((0, 1)), ((3, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((1, 0), (1, 0))), GriddedPerm(Perm((1, 0)), ((2, 1), (2, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((2, 1), (4, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (3, 1))), GriddedPerm(Perm((1, 0)), ((3, 1), (4, 1))), GriddedPerm(Perm((1, 0)), ((4, 1), (4, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 1, 2)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (0, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (2, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (3, 1))), GriddedPerm(Perm((0, 2, 1)), ((0, 1), (0, 1), (4, 1))), GriddedPerm(Perm((1, 0, 2)), ((2, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 0, 2)), ((3, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 0, 2)), ((4, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 0, 2)), ((5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (0, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (2, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (3, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((0, 1), (4, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((2, 1), (4, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((3, 1), (4, 1), (5, 1))), GriddedPerm(Perm((1, 2, 0)), ((4, 1), (4, 1), (5, 1))), GriddedPerm(Perm((0, 2, 1, 3)), ((0, 1), (0, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((0, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((2, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((3, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((4, 1), (5, 1), (5, 1), (5, 1))), GriddedPerm(Perm((1, 2, 3, 0)), ((5, 1), (5, 1), (5, 1), (5, 1)))), requirements=((GriddedPerm(Perm((0,)), ((1, 0),)),), (GriddedPerm(Perm((0,)), ((3, 1),)),), (GriddedPerm(Perm((0,)), ((4, 1),)),), (GriddedPerm(Perm((0,)), ((5, 1),)),)), assumptions=(TrackingAssumption((GriddedPerm(Perm((0,)), ((3, 1),)),)),)))

Maybe we need to add some print statements and try to catch it happening again.

Could you rerun and save the input to the CombinatorialSpecification initialiser? This will make it easier to debug.

Also, are you sure this doesn't need ForgetDB to replicate the error?

You're right, I should have caught that. This script recreates the error in under two minutes.

from tilings.tilescope import TileScope, TileScopePack

basis = '0213_1230'
pack = TileScopePack.insertion_row_and_col_placements(row_only=True).make_fusion(apply_first=True)
css = TileScope(basis, pack, ruledb="forget")
spec = css.auto_search()

I don't know if you still want the input into the CombinatorialSpecification init, but just in case here it is
[Edit: removed because too long]

Ok, so I ran the second class suggested 0213_1230.

The a and b in question I got are as follows:

a
+-+-+-+-+-+-+
|1| |โ—‹|โ—|/|2|
+-+-+-+-+-+-+
| |โ—| | | | |
+-+-+-+-+-+-+
/: Av+(10)
1: Av(012, 021)
2: Av+(102, 1230)
โ—‹: Av(01, 10)
โ—: point
Crossing obstructions:
01: (2, 1), (3, 1)
10: (2, 1), (3, 1)
10: (2, 1), (4, 1)
10: (3, 1), (4, 1)
012: (0, 1), (0, 1), (2, 1)
012: (0, 1), (0, 1), (3, 1)
021: (0, 1), (0, 1), (2, 1)
021: (0, 1), (0, 1), (3, 1)
021: (0, 1), (0, 1), (4, 1)
102: (2, 1), (5, 1), (5, 1)
102: (3, 1), (5, 1), (5, 1)
102: (4, 1), (5, 1), (5, 1)
120: (0, 1), (0, 1), (5, 1)
120: (0, 1), (2, 1), (5, 1)
120: (0, 1), (3, 1), (5, 1)
120: (0, 1), (4, 1), (5, 1)
120: (2, 1), (4, 1), (5, 1)
120: (3, 1), (4, 1), (5, 1)
120: (4, 1), (4, 1), (5, 1)
0213: (0, 1), (0, 1), (5, 1), (5, 1)
1230: (0, 1), (5, 1), (5, 1), (5, 1)
1230: (2, 1), (5, 1), (5, 1), (5, 1)
1230: (3, 1), (5, 1), (5, 1), (5, 1)
1230: (4, 1), (5, 1), (5, 1), (5, 1)
Requirement 0:
0: (1, 0)
Requirement 1:
0: (3, 1)
Requirement 2:
0: (4, 1)
Requirement 3:
0: (5, 1)
Assumption 0:
can count points in cell (3, 1)

b
+-+-+-+-+-+
|1| |โ—|/|2|
+-+-+-+-+-+
| |โ—| | | |
+-+-+-+-+-+
/: Av+(10)
1: Av(012, 021)
2: Av+(102, 1230)
โ—: point
Crossing obstructions:
10: (2, 1), (3, 1)
012: (0, 1), (0, 1), (2, 1)
021: (0, 1), (0, 1), (2, 1)
021: (0, 1), (0, 1), (3, 1)
102: (2, 1), (4, 1), (4, 1)
102: (3, 1), (4, 1), (4, 1)
120: (0, 1), (0, 1), (4, 1)
120: (0, 1), (2, 1), (4, 1)
120: (0, 1), (3, 1), (4, 1)
120: (2, 1), (3, 1), (4, 1)
120: (3, 1), (3, 1), (4, 1)
0213: (0, 1), (0, 1), (4, 1), (4, 1)
1230: (0, 1), (4, 1), (4, 1), (4, 1)
1230: (2, 1), (4, 1), (4, 1), (4, 1)
1230: (3, 1), (4, 1), (4, 1), (4, 1)
Requirement 0:
0: (1, 0)
Requirement 1:
0: (2, 1)
Requirement 2:
0: (3, 1)
Requirement 3:
0: (4, 1)
Assumption 0:
can count points in cell (2, 1)

When I look in the ruledb for their corresponding rule, I am given

>>> css.ruledb.rule_to_strategy[css.classdb.get_label(x), (css.classdb.get_label(y),)]
FusionStrategy(row_idx=None, col_idx=2, tracked=True)
>>> strategy = _
>>> rule = strategy(a)
>>> print(rule)
fuse columns 2 and 3
+-+-+-+-+-+-+                            +-+-+-+-+-+                         
|1| |โ—‹|โ—|/|2|                         โ†ฃ  |1| |โ—|/|2|                         
+-+-+-+-+-+-+                            +-+-+-+-+-+                         
| |โ—| | | | |                            | |โ—| | | |                         
+-+-+-+-+-+-+                            +-+-+-+-+-+                         
/: Av+(10)                               /: Av+(10)                          
1: Av(012, 021)                          1: Av(012, 021)                     
2: Av+(102, 1230)                        2: Av+(102, 1230)                   
โ—‹: Av(01, 10)                            โ—: point                            
โ—: point                                 Crossing obstructions:              
Crossing obstructions:                   10: (2, 1), (3, 1)                  
01: (2, 1), (3, 1)                       012: (0, 1), (0, 1), (2, 1)         
10: (2, 1), (3, 1)                       021: (0, 1), (0, 1), (2, 1)         
10: (2, 1), (4, 1)                       021: (0, 1), (0, 1), (3, 1)         
10: (3, 1), (4, 1)                       102: (2, 1), (4, 1), (4, 1)         
012: (0, 1), (0, 1), (2, 1)              102: (3, 1), (4, 1), (4, 1)         
012: (0, 1), (0, 1), (3, 1)              120: (0, 1), (0, 1), (4, 1)         
021: (0, 1), (0, 1), (2, 1)              120: (0, 1), (2, 1), (4, 1)         
021: (0, 1), (0, 1), (3, 1)              120: (0, 1), (3, 1), (4, 1)         
021: (0, 1), (0, 1), (4, 1)              120: (2, 1), (3, 1), (4, 1)         
102: (2, 1), (5, 1), (5, 1)              120: (3, 1), (3, 1), (4, 1)         
102: (3, 1), (5, 1), (5, 1)              0213: (0, 1), (0, 1), (4, 1), (4, 1)
102: (4, 1), (5, 1), (5, 1)              1230: (0, 1), (4, 1), (4, 1), (4, 1)
120: (0, 1), (0, 1), (5, 1)              1230: (2, 1), (4, 1), (4, 1), (4, 1)
120: (0, 1), (2, 1), (5, 1)              1230: (3, 1), (4, 1), (4, 1), (4, 1)
120: (0, 1), (3, 1), (5, 1)              Requirement 0:                      
120: (0, 1), (4, 1), (5, 1)              0: (1, 0)                           
120: (2, 1), (4, 1), (5, 1)              Requirement 1:                      
120: (3, 1), (4, 1), (5, 1)              0: (2, 1)                           
120: (4, 1), (4, 1), (5, 1)              Requirement 2:                      
0213: (0, 1), (0, 1), (5, 1), (5, 1)     0: (3, 1)                           
1230: (0, 1), (5, 1), (5, 1), (5, 1)     Requirement 3:                      
1230: (2, 1), (5, 1), (5, 1), (5, 1)     0: (4, 1)                           
1230: (3, 1), (5, 1), (5, 1), (5, 1)     Assumption 0:                       
1230: (4, 1), (5, 1), (5, 1), (5, 1)     can count points in cell (2, 1)     
Requirement 0:                           
0: (1, 0)                                
Requirement 1:                           
0: (3, 1)                                
Requirement 2:                           
0: (4, 1)                                
Requirement 3:                           
0: (5, 1)                                
Assumption 0:                            
can count points in cell (3, 1) 

This is very specific case where. The two cells are fusable (as they are anything in Av(01, 10) with a line drawn, such that there is a point on the right). This implies that the cell on the left is empty - so by chance this fusion rule is in fact an equivalence rule. The problem is that this strategy is stopping us choosing the useful version (which would come from inserting a point in the cell, and discovering it was empty).