Source code for prodigy.analysis.evtinvariants.heuristics.templates.polynomial_function

import itertools
from typing import Collection, Iterator

import sympy

from prodigy.analysis.evtinvariants.heuristics.templates.templates import \
    TemplateHeuristic
from prodigy.distribution.distribution import (CommonDistributionsFactory,
                                               Distribution)
from prodigy.util import make_poly_clause


[docs] class PolynomialEnumeration(TemplateHeuristic): """ This heuristic enumerates polynomials up to a maximum total degree to find a suitable invaraint. If this maximum degree is set to -1, it enumerates forever. This might be working best for finite state models. """ def __init__(self, variables: Collection[str], dist_factory: CommonDistributionsFactory, max_deg: int = -1): self.max_deg = max_deg self.variables = variables self.dist_fact = dist_factory
[docs] def generate(self) -> Iterator[Distribution]: iterators = sympy.S.Naturals0 if self.max_deg == -1 else range( self.max_deg + 1) for max_powers in sympy.utilities.iterables.iproduct( *[iterators for _ in self.variables]): degrees = [ range(max_powers[i] + 1) for i, _ in enumerate(self.variables) ] numerator = " + ".join( (make_poly_clause(f"n_{c}", self.variables, pows) for c, pows in enumerate(itertools.product(*degrees)))) yield self.dist_fact.from_expr(numerator, *self.variables)