def try_assumptions(self, pot, decompose_variant): self.assumptions += decompose_variant.assumptions self.assumptions = dedup(self.assumptions) symbol_intervals = deepcopy( pot.symbol_intervals ) for assumption in self.assumptions: assumption_deps = assumption.depends() deps_len = len(assumption_deps) if deps_len == 0: if assumption.test() == result.not_possible: return False continue if deps_len == 1: symbol = assumption_deps[0] if symbol not in symbol_intervals: symbol_intervals[symbol] = intervals() lim = decompose(assumption) if not lim: print("[warn] decompose failed:", assumption) return False res = symbol_intervals[symbol] res *= lim if res.is_zero(): return False symbol_intervals[symbol] = res continue for symbol_assumption in decompose_variant.symbol_assumptions: self._add_symbol_assumption(symbol_assumption) self._update_symbol_assumptions() if not self._test_symbol_assumptions(): return False return self.test_by_symbol_intervals(symbol_intervals)
def _check_assumptions_on_known_limits(self, symbol, symbols_intervals): for assumption in self.assumptions: assumption_deps = assumption.depends() deps_len = len(assumption_deps) if deps_len == 0: if assumption.test() == result.not_possible: return False continue if deps_len == 1: symbol = assumption_deps[0] if symbol not in symbols_intervals: continue lim = decompose(assumption) if not lim: print("[warn] decompose failed:", assumption) return False res = deepcopy(symbols_intervals[symbol]) res *= lim if res.is_zero(): return False continue return True