def generate_transitive_assumptions(self): trans_assumpts = list() for symbol in self.symbol_assumptions: assumpt_dict = self.symbol_assumptions[symbol] if '>' in assumpt_dict: for assump1 in assumpt_dict['>']: if '<' in assumpt_dict: for assump2 in assumpt_dict['<']: trans_assumpts.append(assumption(assump1, '<', assump2)) if '<=' in assumpt_dict: for assump2 in assumpt_dict['<=']: trans_assumpts.append(assumption(assump1, '<=', assump2)) if '>=' in assumpt_dict: for assump1 in assumpt_dict['>=']: if '<' in assumpt_dict: for assump2 in assumpt_dict['<']: trans_assumpts.append(assumption(assump1, '<=', assump2)) if '<=' in assumpt_dict: for assump2 in assumpt_dict['<=']: trans_assumpts.append(assumption(assump1, '<=', assump2)) if '==' in assumpt_dict: for assump1 in assumpt_dict['==']: for assump2 in assumpt_dict['==']: if assump1 != assump2: trans_assumpts.append(assumption(assump1, '==', assump2)) dedup(trans_assumpts) return trans_assumpts
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)