Source code for prodigy.analysis.config

"""
-----------------------
Forward Analysis Config
-----------------------
"""
from enum import Enum, auto
from typing import Type

import attr

from prodigy.analysis.optimization import Optimizer
from prodigy.analysis.optimization.gf_optimizer import GFOptimizer
from prodigy.distribution.generating_function import (GeneratingFunction,
                                                      SympyPGF)
from prodigy.distribution.symengine_distribution import SymenginePGF
from .evtinvariants.heuristics.positivity.heuristics_factory import PositivityHeuristics
from .evtinvariants.heuristics.strategies import SynthesisStrategies
from .evtinvariants.heuristics.templates.templates_factory import TemplateHeuristics
from .exceptions import ConfigurationError
from .solver.solver_type import SolverType
from ..distribution.distribution import CommonDistributionsFactory


[docs] @attr.s class ForwardAnalysisConfig: """Global configurable options for forward analysis."""
[docs] class Engine(Enum): """ This enumeration specifies the type of backend used for distribution encodings and mathematical operations. """ SYMPY = auto() GINAC = auto() SYMENGINE = auto()
show_intermediate_steps: bool = attr.ib(default=False) """Enables the printing of results after each instruction.""" step_wise: bool = attr.ib(default=False) """Enables step-by-step computation""" use_simplification: bool = attr.ib(default=False) """Enables simplification heuristics for expressions.""" use_latex: bool = attr.ib(default=False) """Toggle to print LaTeX-Code instead of ASCII expressions.""" engine: Engine = attr.ib(default=Engine.SYMPY) """Selects the distribution backend.""" normalize: bool = attr.ib(default=True) """Switch to compute the normalized distribution""" strategy: SynthesisStrategies = attr.ib(default=SynthesisStrategies.DEFAULT) """The Strategy for dealing with synthesis.""" templ_heuristic: TemplateHeuristics = attr.ib(default=TemplateHeuristics.DEFAULT) """ The heuristics to use for template genesis""" positivity_heuristic: PositivityHeuristics = attr.ib(default=PositivityHeuristics.DEFAULT) """ The heuristics to validate positivity""" solver_type: SolverType = attr.ib(default=SolverType.SYMPY) """The solver to use for equation systems.""" show_all_invs: bool = attr.ib(default=False) """Toggels printing of spurious invariants""" @property def optimizer(self) -> Type[Optimizer]: if self.engine == ForwardAnalysisConfig.Engine.SYMPY: return GFOptimizer else: raise ConfigurationError( "The configured engine does not implement an optimizer.") @property def factory(self) -> Type[CommonDistributionsFactory]: if self.engine == self.Engine.SYMPY: return SympyPGF elif self.engine == self.Engine.GINAC: # prodigy-ppl-ginac is only installed where it has wheels; only the GiNaC engine imports it try: # pylint: disable=import-outside-toplevel from prodigy.distribution.fast_generating_function import ProdigyPGF except ImportError as error: raise ConfigurationError( "The GiNaC engine needs prodigy-ppl-ginac: pip install prodigy-ppl-ginac") from error return ProdigyPGF elif self.engine == self.Engine.SYMENGINE: return SymenginePGF else: return CommonDistributionsFactory def __attrs_post_init__(self): GeneratingFunction.use_latex_output = self.use_latex GeneratingFunction.use_simplification = self.use_simplification