Source code for prodigy.analysis.evtinvariants.heuristics.positivity.polynomial_positivity

import logging
from typing import Optional

import sympy

from prodigy.analysis.evtinvariants.heuristics.positivity.positivity import PositivityHeuristic
from prodigy.analysis.exceptions import HeuristicsError
from prodigy.util.logger import log_setup


[docs] class FinitePolynomialPositivity(PositivityHeuristic): logger = log_setup("FinitePolynomialPositivity", logging.DEBUG) def __init__(self, sub_heuristic: Optional[PositivityHeuristic] = None): super().__init__(sub_heuristic) def _is_positive(self, f: str) -> Optional[bool]: s_f: sympy.Expr = sympy.S(f) if s_f.is_polynomial(): self.logger.debug("Determine positivity of polynomial %s", s_f) if s_f.is_constant(): return s_f.is_positive return all(coefficient >= 0 for coefficient in s_f.as_poly().coeffs()) raise HeuristicsError(f"Given function {f} is not a polynomial.")