Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
 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