コード例 #1
0
ファイル: verification.py プロジェクト: odinn13/Tilings
    def pack(self, tiling: Tiling) -> StrategyPack:
        if any(
                isinstance(ass, ComponentAssumption)
                for ass in tiling.assumptions):
            raise InvalidOperationError(
                "Can't find generating function with component assumption.")
        # pylint: disable=import-outside-toplevel
        from tilings.strategy_pack import TileScopePack

        if self.has_rightmost_insertion_encoding(tiling):
            return TileScopePack.regular_insertion_encoding(2)
        if self.has_topmost_insertion_encoding(tiling):
            return TileScopePack.regular_insertion_encoding(3)
        raise StrategyDoesNotApply(
            "tiling does not has a regular insertion encoding")
コード例 #2
0
 def extra_parameters(
     self,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling,
                              ...]] = None) -> Tuple[Dict[str, str]]:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     child = children[0]
     return ({
         comb_class.get_assumption_parameter(ass):
         child.get_assumption_parameter(ass)
         for ass in comb_class.assumptions
     }, )
コード例 #3
0
 def constructor(
     self,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling, ...]] = None,
 ) -> AddAssumptionsConstructor:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply(
                 "Can't split the tracking assumption")
     new_parameters = [
         children[0].get_parameter(ass) for ass in self.assumptions
     ]
     return AddAssumptionsConstructor(
         new_parameters,
         self.extra_parameters(comb_class, children)[0])
コード例 #4
0
 def extra_parameters(
     self, comb_class: Tiling, children: Optional[Tuple[Tiling, ...]] = None
 ) -> Tuple[Dict[str, str]]:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     res: Dict[str, str] = {}
     child = children[0]
     for parent_ass, parent_param in zip(
         comb_class.assumptions, comb_class.extra_parameters
     ):
         if parent_ass == self.assumption:
             continue
         child_param = child.extra_parameters[child.assumptions.index(parent_ass)]
         res[parent_param] = child_param
     return (res,)
コード例 #5
0
 def reverse_constructor(
     self,
     idx: int,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling, ...]] = None,
 ) -> ReverseRearrangeConstructor:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Can't split the tracking assumption")
     return ReverseRearrangeConstructor(
         comb_class,
         children[0],
         self.assumption,
         self.sub_assumption,
         self.extra_parameters(comb_class, children)[0],
     )
コード例 #6
0
 def get_genf(
     self,
     comb_class: CombinatorialClass,
     funcs: Optional[Dict[CombinatorialClass, Function]] = None,
 ) -> Expr:
     if not self.verified(comb_class):
         raise StrategyDoesNotApply("Can't find generating functon for non-atom.")
     if not isinstance(comb_class, Tiling):
         raise NotImplementedError
     cast(Tiling, comb_class)
     gp = next(comb_class.minimal_gridded_perms())
     expected = {"x": len(gp)}
     for assumption in comb_class.assumptions:
         expected[
             comb_class.get_assumption_parameter(assumption)
         ] = assumption.get_value(gp)
     return reduce(mul, [var(k) ** n for k, n in expected.items()], 1)
コード例 #7
0
 def extra_parameters(
     self,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling,
                              ...]] = None) -> Tuple[Dict[str, str]]:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     extra_parameters: Dict[str, str] = {}
     child = children[0]
     for assumption in comb_class.assumptions:
         mapped_assumption = assumption.remove_components(comb_class)
         if mapped_assumption.gps:
             extra_parameters[comb_class.get_assumption_parameter(
                 assumption)] = child.get_assumption_parameter(
                     mapped_assumption)
     return (extra_parameters, )
コード例 #8
0
 def extra_parameters(
     self, comb_class: Tiling, children: Optional[Tuple[Tiling, ...]] = None,
 ) -> Tuple[Dict[str, str], ...]:
     if not comb_class.extra_parameters:
         return super().extra_parameters(comb_class, children)
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     child = children[0]
     params: Dict[str, str] = {}
     for assumption in comb_class.assumptions:
         mapped_assumption = child.forward_map_assumption(assumption)
         if mapped_assumption.gps:
             parent_var = comb_class.get_parameter(assumption)
             child_var = child.get_parameter(mapped_assumption)
             params[parent_var] = child_var
     return (params,)
コード例 #9
0
 def extra_parameters(
     self,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling, ...]] = None
 ) -> Tuple[Dict[str, str], ...]:
     if not comb_class.extra_parameters:
         return super().extra_parameters(comb_class, children)
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     algo = self.placement_class(comb_class)
     extra_parameters: Tuple[Dict[str, str],
                             ...] = tuple({} for _ in children)
     if self.include_empty:
         child = children[0]
         for assumption in comb_class.assumptions:
             mapped_assumption = child.forward_map.map_assumption(
                 assumption).avoiding(child.obstructions)
             if mapped_assumption.gps:
                 parent_var = comb_class.get_assumption_parameter(
                     assumption)
                 child_var = child.get_assumption_parameter(
                     mapped_assumption)
                 extra_parameters[0][parent_var] = child_var
     for idx, (cell, child) in enumerate(
             zip(self._placed_cells,
                 children[1:] if self.include_empty else children)):
         mapped_assumptions = [
             child.forward_map.map_assumption(ass).avoiding(
                 child.obstructions)
             for ass in algo.stretched_assumptions(cell)
         ]
         for assumption, mapped_assumption in zip(comb_class.assumptions,
                                                  mapped_assumptions):
             if mapped_assumption.gps:
                 parent_var = comb_class.get_assumption_parameter(
                     assumption)
                 child_var = child.get_assumption_parameter(
                     mapped_assumption)
                 extra_parameters[idx + 1 if self.include_empty else idx][
                     parent_var] = child_var
     return extra_parameters
コード例 #10
0
 def constructor(self,
                 comb_class: Tiling,
                 children: Optional[Tuple[Tiling, ...]] = None) -> Split:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply(
                 "Can't split the tracking assumption")
     child = children[0]
     split_parameters: Dict[str, Tuple[str, ...]] = {"n": ("n", )}
     components = self.factor_class(
         comb_class.remove_assumptions()).get_components()
     for idx, assumption in enumerate(comb_class.assumptions):
         split_assumptions = self._split_assumption(assumption, components)
         child_vars = tuple(
             sorted(f"k_{child.assumptions.index(ass)}"
                    for ass in split_assumptions))
         split_parameters[f"k_{idx}"] = child_vars
     return Split(split_parameters)
コード例 #11
0
 def extra_parameters(
     self, comb_class: Tiling, children: Optional[Tuple[Tiling, ...]] = None,
 ) -> Tuple[Dict[str, str]]:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     algo = self.fusion_algorithm(comb_class)
     child = children[0]
     mapped_assumptions = [
         child.forward_map_assumption(ass.__class__(gps))
         for ass, gps in zip(comb_class.assumptions, algo.assumptions_fuse_counters)
     ]
     return (
         {
             k: child.get_parameter(ass)
             for k, ass in zip(comb_class.extra_parameters, mapped_assumptions)
             if ass.gps
         },
     )
コード例 #12
0
 def constructor(
     self, comb_class: Tiling, children: Optional[Tuple[Tiling, ...]] = None,
 ) -> FusionConstructor:
     if not self.tracked:
         # constructor only enumerates when tracked.
         return FusionConstructor("n", {}, tuple(), tuple(), tuple(), 0, 0)
     # Need to recompute some info to count, so ignoring passed in children
     algo = self.fusion_algorithm(comb_class)
     if not algo.fusable():
         raise StrategyDoesNotApply("Strategy does not apply")
     child = algo.fused_tiling()
     assert children is None or children == (child,)
     min_left, min_right = algo.min_left_right_points()
     return FusionConstructor(
         self._fuse_parameter(comb_class),
         self.extra_parameters(comb_class, children)[0],
         *self.left_right_both_sided_parameters(comb_class),
         min_left,
         min_right,
     )
コード例 #13
0
 def extra_parameters(
     self,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling, ...]] = None
 ) -> Tuple[Dict[str, str], ...]:
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     extra_parameters: Tuple[Dict[str, str],
                             ...] = tuple({} for _ in children)
     for parent_var, assumption in zip(comb_class.extra_parameters,
                                       comb_class.assumptions):
         for idx, child in enumerate(children):
             # TODO: consider skew/sum
             new_assumption = child.forward_map.map_assumption(assumption)
             if new_assumption.gps:
                 child_var = child.get_assumption_parameter(new_assumption)
                 extra_parameters[idx][parent_var] = child_var
     return extra_parameters
コード例 #14
0
    def constructor(
            self,
            comb_class: Tiling,
            children: Optional[Tuple[Tiling, ...]] = None) -> CountComponent:
        if children is None:
            children = self.decomposition_function(comb_class)
            if children is None:
                raise StrategyDoesNotApply("Can't detect components")

        removed_components: Dict[str, int] = {}
        for ass in comb_class.assumptions:
            value = len(ass.get_components(comb_class))
            if value:
                k = comb_class.get_assumption_parameter(ass)
                removed_components[k] = value
        return CountComponent(
            comb_class,
            children[0],
            removed_components,
            self.extra_parameters(comb_class, children)[0],
        )
コード例 #15
0
ファイル: symmetry.py プロジェクト: odinn13/Tilings
 def extra_parameters(
     self,
     comb_class: Tiling,
     children: Optional[Tuple[Tiling, ...]] = None,
 ) -> Tuple[Dict[str, str], ...]:
     if not comb_class.extra_parameters:
         return super().extra_parameters(comb_class, children)
     if children is None:
         children = self.decomposition_function(comb_class)
         if children is None:
             raise StrategyDoesNotApply("Strategy does not apply")
     child = children[0]
     mapped_assumptions = tuple(
         ass.__class__(
             tuple(self.gp_transform(comb_class, gp) for gp in ass.gps))
         for ass in comb_class.assumptions)
     return ({
         comb_class.get_parameter(assumption):
         child.get_parameter(mapped_assumption)
         for assumption, mapped_assumption in zip(comb_class.assumptions,
                                                  mapped_assumptions)
     }, )
コード例 #16
0
 def decomposition_function(self, tiling: Tiling) -> Tuple[Tiling]:
     if any(assumption in tiling.assumptions
            for assumption in self.assumptions):
         raise StrategyDoesNotApply(
             "The assumption is already on the tiling.")
     return (tiling.add_assumptions(self.assumptions), )
コード例 #17
0
 def get_genf(
     self, comb_class: Tiling, funcs: Optional[Dict[Tiling, Function]] = None
 ) -> Expr:
     if not self.verified(comb_class):
         raise StrategyDoesNotApply("tiling is not in the database")
     return DatabaseEnumeration(comb_class).get_genf()