def _simplify(cls, invs, is_conj, use_reals): assert invs, invs st = time() eqts, eqts_largecoefs, octs, mps, preposts, falseinvs = \ cls.classify(invs) def mysorted(ps): return sorted(ps, key=lambda p: len(Miscs.get_vars(p.inv))) eqts = mysorted(eqts + eqts_largecoefs) octs = mysorted(octs) mps = mysorted(mps) myinvs = eqts + falseinvs + preposts + octs + mps myinvs_exprs = [inv.expr(use_reals) for inv in myinvs] def _imply(js, i): iexpr = myinvs_exprs[i] # don't consider/remove equality if iexpr.decl().kind() == z3.Z3_OP_EQ: ret = False else: jexprs = [myinvs_exprs[j] for j in js] ret = Z3._imply(jexprs, iexpr, is_conj) # if ret: # print '{} => {}'.format(jexprs, iexpr) return ret results = Miscs.simplify_idxs(list(range(len(myinvs))), _imply) results = [myinvs[i] for i in results] Miscs.show_removed('_simplify', len(invs), len(results), time() - st) return results
def simplify(self, use_reals): assert isinstance(use_reals, bool), use_reals assert (self.siz), self st = time() def f(tasks): return [(loc, self[loc].simplify(use_reals)) for loc in tasks] wrs = Miscs.run_mp('simplify', list(self), f) dinvs = self.__class__((loc, invs) for loc, invs in wrs if invs) Miscs.show_removed('simplify', self.siz, dinvs.siz, time() - st) return dinvs
def test(self, dtraces): # assert isinstance(dtraces, DTraces) assert self.siz, self st = time() tasks = [loc for loc in self if self[loc]] def f(tasks): return [(loc, self[loc].test(dtraces[loc])) for loc in tasks] wrs = Miscs.run_mp("test_dinvs", tasks, f) dinvs = DInvs([(loc, invs) for loc, invs in wrs if invs]) Miscs.show_removed("test_dinvs", self.siz, dinvs.siz, time() - st) return dinvs
def get_terms(self, symbols): terms = [] if settings.DO_IEQS: oct_siz = 2 terms_ieqs = Miscs.get_terms_fixed_coefs(symbols, oct_siz) terms_ieqs = [data.poly.base.GeneralPoly(t) for t in terms_ieqs] mlog.debug("{} terms for Ieqs".format(len(terms_ieqs))) terms.extend(terms_ieqs) if settings.DO_MINMAXPLUS: terms_u = data.poly.mp.MP.get_terms(symbols) terms_u_no_octs = [(a, b) for a, b in terms_u if len(b) >= 2] if settings.DO_IEQS: # ignore oct invs terms_u = terms_u_no_octs def _get_terms(terms_u, is_max): terms_l = [(b, a) for a, b in terms_u] terms = terms_u + terms_l terms = [data.poly.mp.MP(a, b, is_max) for a, b in terms] return terms terms_max = _get_terms(terms_u, is_max=True) terms_min = _get_terms(terms_u_no_octs, is_max=False) terms_mp = terms_min + terms_max terms.extend(terms_mp) mlog.debug("{} terms for MP".format(len(terms_mp))) print(terms_mp) if settings.DO_TERM_FILTER: st = time() new_terms = self.filter_terms(terms, set(self.prog.inp_decls.names)) Miscs.show_removed('term filter', len(terms), len(new_terms), time() - st) return new_terms else: return terms