Source code for prodigy.analysis.evtinvariants.heuristics.positivity.iterate_terms
from typing import Optional
import sympy
from prodigy.analysis.evtinvariants.heuristics.positivity.positivity import PositivityHeuristic
from prodigy.distribution import CommonDistributionsFactory
[docs]
class IterateTermsHeuristic(PositivityHeuristic):
"""
This heuristic generates the first _iterations_ terms (default: 10) and checks whether there is
a negative coefficient, hence witnessing negativity of the formal power series. For the term generation,
the heuristics it relies on the distribution functionality to generate terms.
..returns:
- False: The given distribution is not non-negative (i.e., there is at least one negative coefficient)
- None: The first _iterations_ may coefficients were >= 0.
"""
# pylint: disable-msg=keyword-arg-before-vararg
def __init__(self,
dist_fact: CommonDistributionsFactory,
iterations: int = 10,
sub_heuristic: Optional[PositivityHeuristic] = None,
*variables: str):
super().__init__(sub_heuristic)
self._factory = dist_fact
self._max_iters = iterations
self._vars = variables
# pylint: enable-msg=keyword-arg-before-vararg
def _is_positive(self, f: str) -> Optional[bool]:
dist = self._factory.from_expr(f, *self._vars)
for i, (prob, _) in enumerate(dist):
if i >= self._max_iters:
return None
if sympy.S(prob) < 0:
return False
return True