def infer_eqts(self, maxdeg, symbols, traces): auto_deg = self.get_auto_deg(maxdeg) terms, template, uks, n_eqts_needed = Miscs.init_terms( symbols.names, auto_deg, settings.EQT_RATE) exprs = list(traces.instantiate(template, n_eqts_needed)) eqts = Miscs.solve_eqts(exprs, uks, template) import data.inv.eqt return [data.inv.eqt.Eqt(eqt) for eqt in eqts]
def _infer(self, loc, template, uks, exprs, dtraces, inps): assert isinstance(loc, str) and loc, loc assert Miscs.is_expr(template), template assert isinstance(uks, list), uks assert isinstance(exprs, set) and exprs, exprs assert isinstance(dtraces, DTraces) and dtraces, dtraces assert isinstance(inps, Inps) and inps, inps cache = set() eqts = set() # results exprs = list(exprs) new_cexs = [] curIter = 0 while True: curIter += 1 mlog.debug("{}, iter {} infer using {} exprs".format( loc, curIter, len(exprs))) new_eqts = Miscs.solve_eqts(exprs, uks, template) unchecks = [eqt for eqt in new_eqts if eqt not in cache] if not unchecks: mlog.debug("{}: no new results -- break".format(loc)) break mlog.debug('{}: {} candidates:\n{}'.format( loc, len(new_eqts), '\n'.join(map(str, new_eqts)))) mlog.debug("{}: check {} unchecked ({} candidates)".format( loc, len(unchecks), len(new_eqts))) dinvs = DInvs.mk(loc, Invs(list(map(data.inv.eqt.Eqt, unchecks)))) cexs, dinvs = self.check(dinvs, None) if cexs: new_cexs.append(cexs) [eqts.add(inv) for inv in dinvs[loc] if not inv.is_disproved] [cache.add(inv.inv) for inv in dinvs[loc] if inv.stat is not None] if loc not in cexs: mlog.debug("{}: no disproved candidates -- break".format(loc)) break cexs = Traces.extract(cexs[loc]) cexs = cexs.padzeros(set(self.inv_decls[loc].names)) exprs_ = cexs.instantiate(template, None) mlog.debug("{}: {} new cex exprs".format(loc, len(exprs_))) exprs.extend(exprs_) return eqts, new_cexs