Source code for prodigy.analysis.evtinvariants.heuristics.strategies
from dataclasses import dataclass, field
from enum import Enum
from typing import Collection
from prodigy.analysis.evtinvariants.heuristics.positivity.heuristics_factory import PositivityHeuristics
from prodigy.analysis.evtinvariants.heuristics.positivity.positivity import PositivityHeuristic
from prodigy.analysis.evtinvariants.heuristics.templates.templates import TemplateHeuristic
from prodigy.analysis.evtinvariants.heuristics.templates.templates_factory import TemplateHeuristics
from prodigy.distribution import CommonDistributionsFactory
[docs]
@dataclass
class SynthesisStrategy:
template_heuristics: TemplateHeuristic = field(init=False)
positivity_heuristics: PositivityHeuristic = field(init=False)
def __str__(self) -> str:
return f"Strategy {self.__class__.__name__} ({self.template_heuristics=}, {self.positivity_heuristics=})"
[docs]
@dataclass
class DefaultStrategy(SynthesisStrategy):
variables: Collection[str]
dist_factory: CommonDistributionsFactory
max_degree: int = 10
def __post_init__(self):
self.template_heuristics = TemplateHeuristics.create(
TemplateHeuristics.DEFAULT,
self.max_degree,
self.variables,
self.dist_factory
)
self.positivity_heuristics = PositivityHeuristics.create(
PositivityHeuristics.MIXED_RAT_FUNC, self.dist_factory
)
[docs]
@dataclass
class PartialRational(SynthesisStrategy):
variables: Collection[str]
dist_factory: CommonDistributionsFactory
max_degree: int = 10
def __post_init__(self):
self.template_heuristics = TemplateHeuristics.create(
TemplateHeuristics.DEFAULT,
self.max_degree,
self.variables,
self.dist_factory
)
self.positivity_heuristics = PositivityHeuristics.create(
PositivityHeuristics.INDIVIDUAL_SUM,
PositivityHeuristics.create(PositivityHeuristics.TRUE_RAT_FUNC)
)
[docs]
@dataclass
class InfinitePolynomial(SynthesisStrategy):
variables: Collection[str]
dist_factory: CommonDistributionsFactory
def __post_init__(self):
self.template_heuristics = (
TemplateHeuristics.create(TemplateHeuristics.POLY, self.variables, self.dist_factory))
self.positivity_heuristics = PositivityHeuristics.create(PositivityHeuristics.POLYNOMIAL)
[docs]
@dataclass
class FinitePolynomial(SynthesisStrategy):
variables: Collection[str]
dist_factory: CommonDistributionsFactory
max_deg: int = 10
def __post_init__(self):
self.template_heuristics = (
TemplateHeuristics.create(TemplateHeuristics.POLY, self.variables, self.dist_factory, self.max_deg))
self.positivity_heuristics = PositivityHeuristics.create(PositivityHeuristics.POLYNOMIAL)
[docs]
@dataclass
class AllOrPartialRational(SynthesisStrategy):
variables: Collection[str]
dist_factory: CommonDistributionsFactory
max_degree: int = 10
def __post_init__(self):
self.template_heuristics = TemplateHeuristics.create(
TemplateHeuristics.DEFAULT,
self.max_degree,
self.variables,
self.dist_factory
)
iterate_heur = PositivityHeuristics.create(PositivityHeuristics.ITERATE_TERMS, self.dist_factory)
rat_func_heur = PositivityHeuristics.create(PositivityHeuristics.TRUE_RAT_FUNC)
mixed_rat_func = PositivityHeuristics.create(PositivityHeuristics.MIXED_RAT_FUNC, self.dist_factory,
iterate_heur)
sum_heur = PositivityHeuristics.create(PositivityHeuristics.INDIVIDUAL_SUM, rat_func_heur)
self.positivity_heuristics = (
PositivityHeuristics.create(PositivityHeuristics.OR, sum_heur, mixed_rat_func))
[docs]
class SynthesisStrategies(Enum):
DEFAULT = DefaultStrategy
SUM_THEN_RATIONAL = PartialRational
APART_OR_TOGETHER = AllOrPartialRational
INF_POLY = InfinitePolynomial
FIN_POLY = FinitePolynomial
FROM_HEURISTICS = SynthesisStrategy
[docs]
@classmethod
def make(cls, st: 'SynthesisStrategies', *args, **kwargs) -> SynthesisStrategy:
return st.value(*args, **kwargs)