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
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]