def prune_not_eq(self, ao_execs, executions, model, program, threads): self.c4vexecsmanager.preload = False beparser = BeParser() eq_progs = [] equivalent_AOs = [] events_dic = dict([(x.name, x) for x in program.get_events()]) if threads > 1: valid_aos = self.__check_all_mt(model, ao_execs, executions, threads) else: valid_aos = self.__check_all(model, ao_execs, executions) for exe in valid_aos: rel = Relation(AO) rel.tuples = [(events_dic[str(x[0])], events_dic[str(x[1])]) for x in exe.get_AO().tuples] exe.set_AO(rel) exe.program = program equivalent_AOs.append(exe) program = beparser.program_from_execution(exe) eq_progs.append(program) Logger.log(" DONE", 1) if Logger.level(1): for el in equivalent_AOs: Logger.log("EQUIVALENT: %s" % el.get_AO(), 1) return eq_progs
def find_all_intersect(self, model, program, threads): run_condition = self.alloy_encoder.print_run_condition(program) self.allvexecsmanager.program = program executions = Executions() executions.executions = self.allvexecsmanager.load_models() self.allvexecsmanager.preload = False vmodel = "\n".join( [model, self.alloy_encoder.print_general_AO(program)]) self.allvexecsmanager.blocking_relations = [AO] ao_execs = [] for models_blocking in [[RBF]]: assertions = self.alloy_encoder.print_assert_exl_execs( executions, models_blocking) vmodel += "\n%s\n" % assertions execs = self.alloy_solver.solve_allsmt( vmodel + run_condition, self.allvexecsmanager, -1, threads if ao_execs == [] else 1) ao_execs += [x for x in execs if x not in ao_execs] self.allvexecsmanager.prevmodels = ao_execs Logger.msg(" ", 0) self.allvexecsmanager.prevmodels = None Logger.log(" -> Found %s possible candidates" % (len(ao_execs)), 1) Logger.msg("Checking correctness... ", 1) if Logger.level(1): Logger.msg("\n", -1) for el in ao_execs: Logger.log("INTERSECTING: %s" % el.get_AO(), 1) return (ao_execs, executions)
def find_all_intersect(self, model, program, threads): self.c4vexecsmanager.program = program executions = Executions() executions.executions = self.c4vexecsmanager.load_models() self.c4vexecsmanager.preload = False vmodel = model + "\n" + self.c4_encoder.print_general_AO(program) qupre = QuantPreprocessor() qupre.set_expand_sets(True) vmodel = qupre.preprocess_from_string(vmodel) self.c4vexecsmanager.blocking_relations = [AO] ao_execs = [] for models_blocking in [[RBF]]: assertions = self.c4_encoder.print_assert_exl_execs( executions, models_blocking) vmodel += "\n%s\n" % assertions execs = self.c4_solver.solve_allsmt( vmodel, self.c4vexecsmanager, -1, threads if ao_execs == [] else 1) ao_execs += [x for x in execs if x not in ao_execs] self.c4vexecsmanager.prevmodels = ao_execs Logger.msg(" ", 0) self.c4vexecsmanager.prevmodels = None Logger.log(" -> Found %s possible candidates" % (len(ao_execs)), 1) Logger.msg("Checking correctness... ", 1) if Logger.level(1): Logger.msg("\n", -1) for el in ao_execs: Logger.log("INTERSECTING: %s" % el.get_AO(), 1) return (ao_execs, executions)
def solve_one(self, model, solver): if Logger.level(3): linenum = 0 for line in model.split("\n"): linenum += 1 Logger.log("%s: %s" % (linenum, line), 3) solver.stdin.write(('%s\nreset\n' % (model)).encode()) solver.stdin.flush() out = "" while True: line = solver.stdout.readline().decode() out += line if line in ["sat\n", "unsat\n"]: break out = out.split("\n") Logger.log("Solver: %s" % out[0], 2) if out[-2] == "sat": return out else: return None