def test_tiling_from_dict(client):
    tiling = Tiling(
        obstructions=(
            GriddedPerm((0, 1), ((0, 0), (0, 0))),
            GriddedPerm((0, 1), ((1, 1), (1, 1))),
            GriddedPerm((0, 1, 2), ((0, 0), (1, 0), (1, 0))),
            GriddedPerm((0, 1, 2), ((0, 0), (1, 0), (1, 1))),
            GriddedPerm((0, 1, 2), ((1, 0), (1, 0), (1, 0))),
            GriddedPerm((0, 1, 2), ((1, 0), (1, 0), (1, 1))),
        ),
        requirements=((GriddedPerm((0, ), ((1, 0), )), ), ),
        assumptions=(
            TrackingAssumption([
                GriddedPerm.single_cell((0, ), (0, 0)),
                GriddedPerm.single_cell((0, ), (1, 0)),
            ]),
            TrackingAssumption([GriddedPerm.single_cell((0, ), (1, 1))]),
        ),
    )
    res = post(client, _INIT_PATH, verify_wrap(tiling.to_jsonable()))
    assert_code_and_mimetype(res)
    assert_tiling(
        res.json,
        tiling,
        assumptions=[["0: (0, 0)", "0: (1, 0)"], ["0: (1, 1)"]],
        crossing=[
            "012: (0, 0), (1, 0), (1, 0)",
            "012: (0, 0), (1, 0), (1, 1)",
            "012: (1, 0), (1, 0), (1, 1)",
        ],
        label_map={"1": "Av+(123)"},
        matrix=[[" ", "\\"], ["\\", "1"]],
        requirements=[["0: (1, 0)"]],
    )
def test_splitting_gf():
    parent = Tiling(
        obstructions=(
            GriddedPerm.single_cell((0, 1), (0, 1)),
            GriddedPerm.single_cell((0, 1), (1, 0)),
        ),
        assumptions=(
            TrackingAssumption([
                GriddedPerm.point_perm((0, 1)),
                GriddedPerm.point_perm((1, 0))
            ]),
            TrackingAssumption([GriddedPerm.point_perm((1, 0))]),
        ),
    )
    child = Tiling(
        obstructions=(
            GriddedPerm.single_cell((0, 1), (0, 1)),
            GriddedPerm.single_cell((0, 1), (1, 0)),
        ),
        assumptions=(
            TrackingAssumption([GriddedPerm.point_perm((0, 1))]),
            TrackingAssumption([GriddedPerm.point_perm((1, 0))]),
        ),
    )
    strat = SplittingStrategy()
    rule = strat(parent)
    x, k0, k1 = var("x k_0 k_1")
    parent_func = Function("F_0")(x, k0, k1)
    child_func = Function("F_1")(x, k0, k1)
    expected_eq = Eq(parent_func, child_func.subs({k1: k0 * k1}))

    assert len(rule.children) == 1
    assert rule.children[0] == child
    assert rule.constructor.get_equation(parent_func,
                                         (child_func, )) == expected_eq
Example #3
0
def test_single_cell():
    gp = GriddedPerm.single_cell((0, 1, 2), (2, 3))
    assert gp.patt == Perm((0, 1, 2))
    assert gp.pos == ((2, 3), (2, 3), (2, 3))

    gp = GriddedPerm.single_cell((0, ), (45, 64))
    assert gp.patt == Perm((0, ))
    assert gp.pos == ((45, 64), )
def tplaced_tracked(tplaced):
    return Tiling(
        tplaced.obstructions,
        tplaced.requirements,
        [
            TrackingAssumption([GriddedPerm.single_cell((0, ), (0, 0))]),
            TrackingAssumption([GriddedPerm.single_cell((0, ), (0, 0))]),
            TrackingAssumption([GriddedPerm.single_cell((0, ), (2, 0))]),
        ],
    )
def test_factors(tplaced_tracked, tplaced_tracked_factored1,
                 tplaced_tracked_factored2):
    assert len(tplaced_tracked_factored1.assumptions) == 2

    assert all(
        isinstance(ass, TrackingAssumption)
        for ass in tplaced_tracked_factored1.assumptions)
    assert tplaced_tracked_factored1.assumptions[0].gps == (
        GriddedPerm.single_cell((0, ), (0, 0)), )
    assert tplaced_tracked_factored1.assumptions[1].gps == (
        GriddedPerm.single_cell((0, ), (1, 0)), )

    assert set(Factor(tplaced_tracked).factors()) == set(
        [tplaced_tracked_factored1, tplaced_tracked_factored2])
def test_order():
    sum_ass = SumComponentAssumption((GriddedPerm(
        (0, ), ((1, 1), )), GriddedPerm((0, ), ((2, 0), ))))
    skew_ass = SkewComponentAssumption((
        GriddedPerm((0, ), ((1, 1), )),
        GriddedPerm((0, ), ((2, 0), )),
        GriddedPerm((0, ), ((2, 2), )),
    ))
    point_ass = TrackingAssumption([GriddedPerm.single_cell((0, ), (0, 0))])
    point_ass2 = TrackingAssumption([GriddedPerm.single_cell((0, ), (2, 0))])
    assert point_ass < point_ass2 and not point_ass2 < point_ass
    assert xor(sum_ass < skew_ass, skew_ass < sum_ass)
    assert xor(sum_ass < point_ass, point_ass < sum_ass)
    assert xor(point_ass < skew_ass, skew_ass < point_ass)
Example #7
0
 def get_genf(
     self, comb_class: Tiling, funcs: Optional[Dict[Tiling, Function]] = None
 ) -> Expr:
     if not self.verified(comb_class):
         raise StrategyDoesNotApply("tiling not locally verified")
     if len(comb_class.obstructions) == 1 and comb_class.obstructions[0] in (
         GriddedPerm.single_cell((0, 1, 2), (0, 0)),
         GriddedPerm.single_cell((2, 1, 0), (0, 0)),
     ):
         return LocalEnumeration(comb_class).get_genf(funcs=funcs)
     try:
         return super().get_genf(comb_class, funcs)
     except InvalidOperationError:
         return LocalEnumeration(comb_class).get_genf(funcs=funcs)
Example #8
0
def gps_indices_direction_owncol_ownrow_ignoreparent_includeempty(strategy):
    return [
        strategy(
            gps=gps,
            indices=indices,
            direction=direction,
            own_col=own_col,
            own_row=own_row,
            ignore_parent=ignore_parent,
            include_empty=include_empty,
        ) for (
            gps,
            indices,
        ), direction, own_col, own_row, ignore_parent, include_empty in
        product(
            (
                ((GriddedPerm(Perm((0, )), ((0, 0), )), ), (0, )),
                ((GriddedPerm.single_cell(Perm((0, 1, 2)), (2, 1)), ), (1, )),
                (
                    (
                        GriddedPerm(Perm((0, 1)), ((0, 1), (1, 1))),
                        GriddedPerm(Perm((1, 0)), ((2, 2), (3, 1))),
                    ),
                    (1, 0),
                ),
            ),
            (DIR_EAST, DIR_WEST, DIR_NORTH, DIR_SOUTH),
            (True, False),
            (True, False),
            (True, False),
            (True, False),
        )
    ]
Example #9
0
 def req_lists_to_insert(self, tiling: Tiling) -> Iterator[ListRequirement]:
     active = tiling.active_cells
     bdict = tiling.cell_basis()
     for cell, length in product(active, range(1, self.maxreqlen + 1)):
         basis = bdict[cell][0] + self.extra_basis
         yield from ((GriddedPerm.single_cell(patt, cell), )
                     for patt in Av(basis).of_length(length)
                     if not any(patt in perm for perm in bdict[cell][1]))
 def test_shifts(self):
     t1 = Tiling(
         obstructions=[
             GriddedPerm.single_cell((0, 1, 3, 2), ((0, 0))),
             GriddedPerm.single_cell((0, 2, 1), ((1, 1))),
         ]
     )
     t2 = Tiling(
         obstructions=[
             GriddedPerm.single_cell((0, 1, 3, 2), ((0, 0))),
             GriddedPerm.single_cell((0, 2, 1), ((1, 1))),
             GriddedPerm((0, 2, 1), ((0, 0), (1, 1), (1, 1))),
         ],
         requirements=[
             [
                 GriddedPerm.single_cell((0, 1), ((1, 1))),
             ]
         ],
     )
     t3 = Tiling(
         obstructions=[
             GriddedPerm.single_cell((0, 2, 1), ((0, 0))),
             GriddedPerm.single_cell((0, 2, 1), ((1, 1))),
         ]
     )
     strat = LocallyFactorableVerificationStrategy(basis=[Perm((0, 1, 3, 2))])
     assert strat(t1).shifts() == (0,)
     assert strat(t2).shifts() == (2,)
     assert strat(t3).shifts() == ()
Example #11
0
 def _split_sum_assumption(
         self,
         assumption: SumComponentAssumption) -> List[TrackingAssumption]:
     decomposition = self.sum_decomposition(assumption.cells)
     return [
         SumComponentAssumption(
             GriddedPerm.single_cell((0, ), cell) for cell in cells)
         for cells in decomposition
     ]
 def test_children(self):
     t1 = Tiling(
         obstructions=[
             GriddedPerm.single_cell((0, 1, 3, 2), ((0, 0))),
             GriddedPerm.single_cell((0, 2, 1), ((0, 1))),
             GriddedPerm((0, 1, 2), ((0, 0), (0, 0), (0, 1))),
         ]
     )
     t2 = Tiling(
         obstructions=[
             GriddedPerm.single_cell((0, 2, 1), ((0, 0))),
             GriddedPerm.single_cell((0, 2, 1), ((0, 1))),
             GriddedPerm((0, 1, 2), ((0, 0), (0, 0), (0, 1))),
         ]
     )
     strategy = ShortObstructionVerificationStrategy(basis=[Perm((0, 1, 3, 2))])
     assert strategy(t1).children == (Tiling.from_string("0132"),)
     assert strategy(t2).children == ()
Example #13
0
 def _split_skew_assumption(
     self,
     assumption: SkewComponentAssumption,
 ) -> List[TrackingAssumption]:
     decomposition = self.skew_decomposition(assumption.cells)
     return [
         SkewComponentAssumption(
             GriddedPerm.single_cell(Perm((0, )), cell) for cell in cells)
         for cells in decomposition
     ]
Example #14
0
 def enum_verified(self):
     return [
         # any 231 subclass
         Tiling.from_string("132_4321"),
         # any with regular insertion encoding, regardless of reqs
         Tiling.from_string("012_1032"),
         Tiling.from_string("012_1302").add_list_requirement([
             GriddedPerm.single_cell(Perm((1, 0)), (0, 0)),
             GriddedPerm.single_cell(Perm((0, 1)), (0, 0)),
         ]),
         Tiling.from_string("0231_2103"),
         # subclass of Av(123) avoiding patterns of length <= 4, positive or not
         Tiling.from_string("012_2301").add_requirement(
             Perm((0, )), [(0, 0)]),
         # uses fusion
         Tiling.from_string("123").insert_cell((0, 0)),
         # no pack yet
         Tiling.from_string("1324"),
     ]
Example #15
0
 def req_lists_to_insert(self, tiling: Tiling) -> Iterator[ListRequirement]:
     bdict = tiling.cell_basis()
     cell_with_req = ((cell, obs, reqlist[0])
                      for cell, (obs, reqlist) in bdict.items()
                      if len(reqlist) == 1)
     for cell, obs, curr_req in cell_with_req:
         for length in range(len(curr_req) + 1, self.maxreqlen + 1):
             for patt in Av(obs + self.extra_basis).of_length(length):
                 if curr_req in patt:
                     yield (GriddedPerm.single_cell(patt, cell), )
    def req_lists_to_insert(self, tiling: Tiling) -> Iterator[ListRequirement]:
        if self.one_cell_only:
            assert self.maxreqlen == 1 and self.ignore_parent
            cells = sorted(
                frozenset(tiling.active_cells) - frozenset(tiling.positive_cells)
            )
            if cells:
                yield (GriddedPerm.single_cell((0,), cells[0]),)
            return

        active = tiling.active_cells
        bdict = tiling.cell_basis()
        for cell, length in product(active, range(1, self.maxreqlen + 1)):
            basis = bdict[cell][0] + self.extra_basis
            patterns = Av(basis).of_length(length) if basis else Perm.of_length(length)
            yield from (
                (GriddedPerm.single_cell(patt, cell),)
                for patt in patterns
                if not any(patt in perm for perm in bdict[cell][1])
            )
Example #17
0
def gps_ignoreparent(strategy):
    return [
        strategy(gps=gps, ignore_parent=ignore_parent)
        for gps, ignore_parent in product(
            (
                (GriddedPerm(Perm((0, )), ((0, 0), )), ),
                (GriddedPerm.single_cell(Perm((0, 1, 2)), (2, 1)), ),
                (
                    GriddedPerm(Perm((0, 1)), ((0, 1), (1, 1))),
                    GriddedPerm(Perm((1, 0)), ((2, 2), (3, 1))),
                ),
            ),
            (True, False),
        )
    ]
Example #18
0
def test_from_iterable():
    pos = ((0, 0), (1, 1), (2, 1))
    gp = GriddedPerm(Perm((0, 1, 2)), pos)
    assert GriddedPerm((0, 1, 2), pos) == gp
    assert GriddedPerm([0, 1, 2], pos) == gp
    assert GriddedPerm(range(3), pos) == gp
    assert GriddedPerm((i for i in range(3)), pos) == gp
    assert GriddedPerm.single_cell(
        (0, 1), (0, 0)) == GriddedPerm(Perm((0, 1)), ((0, 0), (0, 0)))
    assert GriddedPerm((0, 2, 1, 3, 4),
                       ((0, 0), (0, 1), (1, 0), (1, 1), (1, 1)))._cells == {
                           (0, 0),
                           (0, 1),
                           (1, 0),
                           (1, 1),
                       }
    def test_children(self):
        t1 = Tiling(
            obstructions=[
                GriddedPerm.single_cell((0, 1, 3, 2), ((0, 0))),
                GriddedPerm.single_cell((0, 2, 1), ((1, 1))),
            ]
        )
        t2 = Tiling(
            obstructions=[
                GriddedPerm.single_cell((0, 1, 3, 2), ((0, 0))),
                GriddedPerm.single_cell((0, 2, 1), ((1, 1))),
                GriddedPerm((0, 2, 1), ((0, 0), (1, 1), (1, 1))),
            ]
        )
        t3 = Tiling(
            obstructions=[
                GriddedPerm.single_cell((0, 2, 1), ((0, 0))),
                GriddedPerm.single_cell((0, 2, 1), ((1, 1))),
            ]
        )
        t4 = Tiling(
            obstructions=[
                GriddedPerm.single_cell((0, 1, 3, 2), ((0, 0))),
                GriddedPerm.single_cell((0, 2, 1), ((0, 1))),
                GriddedPerm((0, 2, 1), ((0, 0), (0, 1), (0, 1))),
            ]
        )
        strat = LocallyFactorableVerificationStrategy(basis=[Perm((0, 1, 3, 2))])
        assert strat(t1).children == (Tiling.from_string("0132"),)
        assert strat(t2).children == (Tiling.from_string("0132"),)
        assert strat(t3).children == tuple()
        with pytest.raises(StrategyDoesNotApply):
            strat(t4).children
        assert strat.decomposition_function(t4) is None
        assert strat(t1.add_single_cell_requirement(Perm((0,)), (0, 0))).children == (
            Tiling.from_string("0132"),
        )

        strat_with_sym = LocallyFactorableVerificationStrategy(
            basis=[Perm((0, 1, 3, 2))], symmetry=True
        )
        assert strat_with_sym(t1).children == (Tiling.from_string("0132"),)
        assert strat_with_sym(t1.rotate90()).children == (Tiling.from_string("0132"),)
def test_stretched_obstructions_and_assumptions(
    placement1, placement1owncol, placement1ownrow
):
    obs, reqs, _ = placement1._stretched_obstructions_requirements_and_assumptions(
        (1, 1)
    )
    assert set(obs) == set(
        placement1.stretched_obstructions((1, 1))
        + [
            GriddedPerm.single_cell(Perm((0, 1)), (2, 2)),
            GriddedPerm.single_cell(Perm((1, 0)), (2, 2)),
        ]
    )
    assert sorted(reqs) == sorted(
        placement1.stretched_requirements((1, 1))
        + [[GriddedPerm(Perm((0,)), ((2, 2),))]]
    )
    (
        obs,
        reqs,
        _,
    ) = placement1ownrow._stretched_obstructions_requirements_and_assumptions((1, 1))
    assert set(obs) == set(
        placement1ownrow.stretched_obstructions((1, 1))
        + [
            GriddedPerm.single_cell(Perm((0, 1)), (1, 2)),
            GriddedPerm.single_cell(Perm((1, 0)), (1, 2)),
        ]
    )
    assert sorted(reqs) == sorted(
        placement1ownrow.stretched_requirements((1, 1))
        + [[GriddedPerm(Perm((0,)), ((1, 2),))]]
    )
    (
        obs,
        reqs,
        _,
    ) = placement1owncol._stretched_obstructions_requirements_and_assumptions((1, 1))
    assert set(obs) == set(
        placement1owncol.stretched_obstructions((1, 1))
        + [
            GriddedPerm.single_cell(Perm((0, 1)), (2, 1)),
            GriddedPerm.single_cell(Perm((1, 0)), (2, 1)),
        ]
    )
    assert sorted(reqs) == sorted(
        placement1owncol.stretched_requirements((1, 1))
        + [[GriddedPerm(Perm((0,)), ((2, 1),))]]
    )
Example #21
0
    def __init__(
        self,
        start_class: Union[str, Iterable[Perm], Tiling],
        strategy_pack: TileScopePack,
        ruledb: Optional[RuleDBAbstract] = None,
        expand_verified: bool = False,
        debug: bool = False,
    ) -> None:
        """Initialise TileScope."""
        if isinstance(start_class, str):
            basis = Basis.from_string(start_class)
        elif isinstance(start_class, Tiling):
            if start_class.dimensions == (1, 1):
                basis = Basis(*[o.patt for o in start_class.obstructions])
            start_tiling = start_class
        else:
            try:
                basis = Basis(*start_class)
            except TypeError as e:
                raise ValueError(
                    "start class must be a string, an iterable of Perm or a tiling"
                ) from e

        if not isinstance(start_class, Tiling):
            start_tiling = Tiling(obstructions=[
                GriddedPerm.single_cell(patt, (0, 0)) for patt in basis
            ])

        if start_tiling.dimensions == (1, 1):
            logger.debug(
                "Fixing basis in basis aware verification strategies.")
            strategy_pack = strategy_pack.add_basis(basis)
        strategy_pack = strategy_pack.setup_subclass_verification(start_tiling)

        super().__init__(
            start_class=start_tiling,
            strategy_pack=strategy_pack,
            ruledb=ruledb,
            expand_verified=expand_verified,
            debug=debug,
        )
Example #22
0
    def __init__(self,
                 start_class: Union[str, Iterable[Perm], Tiling],
                 strategy_pack: TileScopePack,
                 logger_kwargs: Optional[dict] = None,
                 **kwargs) -> None:
        """Initialise TileScope."""
        if isinstance(start_class, str):
            basis = Basis([
                Perm.to_standard([int(c) for c in p])
                for p in start_class.split("_")
            ])
        elif isinstance(start_class, Tiling):
            start_tiling = start_class
            if start_class.dimensions == (1, 1):
                basis = Basis([o.patt for o in start_class.obstructions])
        elif isinstance(start_class, collections.abc.Iterable):
            basis = Basis(start_class)
            assert all(isinstance(p, Perm)
                       for p in basis), "Basis must contains Perm only"
        else:
            raise ValueError(
                "start class must be a string, an iterable of Perm or a tiling"
            )

        if not isinstance(start_class, Tiling):
            start_tiling = Tiling(obstructions=[
                GriddedPerm.single_cell(patt, (0, 0)) for patt in basis
            ])

        if start_tiling.dimensions == (1, 1):
            procname = kwargs.get("logger_kwargs", {"processname": "runner"})
            logger.debug("Fixing basis in OneByOneVerificationStrategy",
                         extra=procname)
            strategy_pack = strategy_pack.fix_one_by_one(basis)

        super().__init__(
            start_tiling,
            strategy_pack,
            logger_kwargs=logger_kwargs,
            **kwargs,
        )
def easy_fusable(
    pos_left=False,
    pos_right=False,
    track_left=False,
    track_right=False,
    same_tracking=False,
):
    if same_tracking:
        assert track_left and track_right
    obs = [
        GriddedPerm.single_cell((0, 1), (0, 0)),
        GriddedPerm((0, 1), ((0, 0), (1, 0))),
        GriddedPerm.single_cell((0, 1), (1, 0)),
    ]

    reqs = []
    if pos_left:
        reqs.append([GriddedPerm.single_cell((0, ), (0, 0))])
    if pos_right:
        reqs.append([GriddedPerm.single_cell((0, ), (1, 0))])

    ass = []
    if same_tracking:
        ass.append(
            TrackingAssumption([
                GriddedPerm.single_cell((0, ), (0, 0)),
                GriddedPerm.single_cell((0, ), (1, 0)),
            ]))
    else:
        if track_left:
            ass.append(
                TrackingAssumption([GriddedPerm.single_cell((0, ), (0, 0))]))
        if track_right:
            ass.append(
                TrackingAssumption([GriddedPerm.single_cell((0, ), (1, 0))]))

    tiling = Tiling(obstructions=obs, requirements=reqs, assumptions=ass)
    return tiling
Example #24
0
def singlecellob():
    return GriddedPerm.single_cell((1, 0, 3, 2), (2, 2))
Example #25
0
def test_cell_insertion():
    t1 = Tiling.from_string("123")
    ci1 = CellInsertionFactory(maxreqlen=3)
    assert set(ci1.req_lists_to_insert(t1)) == set(
        [
            (GriddedPerm.single_cell(Perm((0,)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((0, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 0)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((0, 2, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 0, 2)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 2, 0)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((2, 0, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((2, 1, 0)), (0, 0)),),
        ]
    )
    assert len(list(ci1(t1))) == 8
    t2 = t1.add_single_cell_requirement(Perm((2, 1, 0)), (0, 0))
    ci2 = CellInsertionFactory(maxreqlen=3)
    assert set(ci2.req_lists_to_insert(t2)) == set(
        [
            (GriddedPerm.single_cell(Perm((0, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((0, 2, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 0, 2)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 2, 0)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((2, 0, 1)), (0, 0)),),
        ]
    )
    assert len(list(ci2(t2))) == 5
    ci3 = CellInsertionFactory(maxreqlen=3, extra_basis=[Perm((0, 2, 1))])
    assert set(ci3.req_lists_to_insert(t1)) == set(
        [
            (GriddedPerm.single_cell(Perm((0,)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((0, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 0)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 0, 2)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((1, 2, 0)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((2, 0, 1)), (0, 0)),),
            (GriddedPerm.single_cell(Perm((2, 1, 0)), (0, 0)),),
        ]
    )
    assert len(list(ci3(t1))) == 7
from sympy import Eq, Function, var

from tilings import GriddedPerm, Tiling
from tilings.assumptions import TrackingAssumption
from tilings.strategies import SplittingStrategy

t = Tiling(
    obstructions=[
        GriddedPerm.single_cell((0, 1, 2), (0, 0)),
        GriddedPerm.single_cell((0, 1), (1, 0)),
        GriddedPerm.single_cell((0, 1, 2), (2, 1)),
        GriddedPerm.single_cell((0, 1, 2), (3, 1)),
    ],
    assumptions=[
        TrackingAssumption([
            GriddedPerm.point_perm((0, 0)),
            GriddedPerm.point_perm((1, 0)),
            GriddedPerm.point_perm((2, 1)),
            GriddedPerm.point_perm((3, 1)),
        ])
    ],
)


def test_no_interleaving():
    strat = SplittingStrategy(interleaving="none")
    rule = strat(t)
    assert len(rule.children) == 1
    child = rule.children[0]
    assert len(child.assumptions) == 2
    assert (TrackingAssumption(