Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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