Example #1
0
    def _get_init_traces(self, loc, deg, traces, inps, rate):
        "Initial loop to obtain (random) traces to bootstrap eqt solving"

        assert deg >= 1, deg
        assert isinstance(rate, float) and rate >= 0.1, rate

        if self.use_rand_init:
            whileF, whileFName = self._while_rand, "random"
        else:
            whileF, whileFName = self._while_symstates, "symstates"
        mlog.debug(
            "{}: gen init inps using {} (curr inps {}, traces {})".format(
                loc, whileFName, len(inps), len(traces)))

        terms, template, uks, n_eqts_needed = Miscs.init_terms(
            self.inv_decls[loc].names, deg, rate)
        exprs = whileF(loc, template, n_eqts_needed, inps, traces)

        # if cannot generate sufficient traces, adjust degree
        while (not exprs):
            if deg < 2:
                return  # cannot generate enough traces

            deg = deg - 1
            mlog.info(
                "Reduce polynomial degree to {}, terms {}, uks {}".format(
                    deg, len(terms), len(uks)))
            terms, template, uks, n_eqts_needed = Miscs.init_terms(
                self.inv_decls[loc].names, deg, rate)
            exprs = whileF(loc, template, n_eqts_needed, inps, traces)

        return template, uks, exprs
Example #2
0
 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]