def checkReach(self): #check for reachability using inv False (0) dinvs = DInvs.mkFalses(self.invdecls) inps = Inps() #use some initial inps first rinps = Miscs.genInitInps(len(self.inpdecls), DTraces.inpMaxV) logger.debug("gen {} random inps".format(len(rinps))) for inp in rinps: inps.add(Inp(inp)) traces = self.getTraces(inps) unreachLocs = [loc for loc in dinvs if loc not in traces] if unreachLocs: logger.debug("use RT to generate traces for {}".format(','.join( map(str, unreachLocs)))) unreachInvs = DInvs.mkFalses(unreachLocs) cInps, _, _ = self.prover.checkRange(unreachInvs, inps=None) newInps = self.updateInps(cInps, inps) _ = self.getTracesAndUpdate(newInps, traces) #remove FALSE invs indicating unreached locs for loc in traces: assert traces[loc] dinvs[loc].clear() return dinvs, traces, inps
def getInitTraces(self, loc, deg, traces, inps, rate=1.7): vs = tuple(self.invdecls[loc]) terms = Miscs.getTerms([sage.all.var(k) for k in vs], deg) template, uks = Miscs.mkTemplate(terms, 0, retCoefVars=True) nEqtsNeeded = int(rate * len(uks)) exprs = traces[loc].instantiate(template, nEqtsNeeded) while nEqtsNeeded > len(exprs): logger.debug("{}: need more traces ({} eqts, need >= {})".format( loc, len(exprs), nEqtsNeeded)) dinvsFalse = DInvs.mkFalses([loc]) cInps, _, _ = self.prover.checkRange(dinvsFalse, inps) if loc not in cInps: logger.warn("{}: cannot generate enough traces".format(loc)) return newInps = Gen.updateInps(cInps, inps) newTraces = self.getTracesAndUpdate(newInps, traces) if loc not in newTraces: logger.warn("I got a bad start and am stuck. Just restart me") exit(0) logger.debug("obtain {} new traces".format(len(newTraces[loc]))) newExprs = newTraces[loc].instantiate(template, nEqtsNeeded - len(exprs)) for expr in newExprs: assert expr not in exprs exprs.add(expr) return template, uks, exprs