示例#1
0
文件: alg.py 项目: ruricolist/dig
 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]
示例#2
0
文件: eqt.py 项目: ruricolist/dig
    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