Esempio n. 1
0
    def _simplify(cls, invs, is_conj, use_reals):
        assert invs, invs

        st = time()
        eqts, eqts_largecoefs, octs, mps, preposts, falseinvs = \
            cls.classify(invs)

        def mysorted(ps):
            return sorted(ps, key=lambda p: len(Miscs.get_vars(p.inv)))

        eqts = mysorted(eqts + eqts_largecoefs)
        octs = mysorted(octs)
        mps = mysorted(mps)

        myinvs = eqts + falseinvs + preposts + octs + mps
        myinvs_exprs = [inv.expr(use_reals) for inv in myinvs]

        def _imply(js, i):
            iexpr = myinvs_exprs[i]
            # don't consider/remove equality
            if iexpr.decl().kind() == z3.Z3_OP_EQ:
                ret = False
            else:
                jexprs = [myinvs_exprs[j] for j in js]
                ret = Z3._imply(jexprs, iexpr, is_conj)
            # if ret:
            #     print '{} => {}'.format(jexprs, iexpr)
            return ret

        results = Miscs.simplify_idxs(list(range(len(myinvs))), _imply)
        results = [myinvs[i] for i in results]

        Miscs.show_removed('_simplify', len(invs), len(results), time() - st)
        return results
Esempio n. 2
0
    def simplify(self, use_reals):
        assert isinstance(use_reals, bool), use_reals
        assert (self.siz), self

        st = time()

        def f(tasks):
            return [(loc, self[loc].simplify(use_reals)) for loc in tasks]

        wrs = Miscs.run_mp('simplify', list(self), f)

        dinvs = self.__class__((loc, invs) for loc, invs in wrs if invs)
        Miscs.show_removed('simplify', self.siz, dinvs.siz, time() - st)
        return dinvs
Esempio n. 3
0
    def test(self, dtraces):
        # assert isinstance(dtraces, DTraces)
        assert self.siz, self

        st = time()
        tasks = [loc for loc in self if self[loc]]

        def f(tasks):
            return [(loc, self[loc].test(dtraces[loc])) for loc in tasks]

        wrs = Miscs.run_mp("test_dinvs", tasks, f)
        dinvs = DInvs([(loc, invs) for loc, invs in wrs if invs])
        Miscs.show_removed("test_dinvs", self.siz, dinvs.siz, time() - st)
        return dinvs
Esempio n. 4
0
    def get_terms(self, symbols):

        terms = []
        if settings.DO_IEQS:
            oct_siz = 2
            terms_ieqs = Miscs.get_terms_fixed_coefs(symbols, oct_siz)
            terms_ieqs = [data.poly.base.GeneralPoly(t) for t in terms_ieqs]
            mlog.debug("{} terms for Ieqs".format(len(terms_ieqs)))
            terms.extend(terms_ieqs)

        if settings.DO_MINMAXPLUS:
            terms_u = data.poly.mp.MP.get_terms(symbols)
            terms_u_no_octs = [(a, b) for a, b in terms_u if len(b) >= 2]

            if settings.DO_IEQS:  # ignore oct invs
                terms_u = terms_u_no_octs

            def _get_terms(terms_u, is_max):
                terms_l = [(b, a) for a, b in terms_u]
                terms = terms_u + terms_l
                terms = [data.poly.mp.MP(a, b, is_max) for a, b in terms]
                return terms

            terms_max = _get_terms(terms_u, is_max=True)

            terms_min = _get_terms(terms_u_no_octs, is_max=False)
            terms_mp = terms_min + terms_max
            terms.extend(terms_mp)
            mlog.debug("{} terms for MP".format(len(terms_mp)))
            print(terms_mp)

        if settings.DO_TERM_FILTER:
            st = time()
            new_terms = self.filter_terms(terms,
                                          set(self.prog.inp_decls.names))
            Miscs.show_removed('term filter', len(terms), len(new_terms),
                               time() - st)
            return new_terms
        else:
            return terms