Пример #1
0
 def visit_EStateVar(self, e):
     with save_property(self, "pool"):
         with save_property(self, "ctx"):
             self.pool = STATE_POOL
             self.ctx = self.root_ctx
             ee = self.visit(e.e)
     return self.join(e, (ee,))
Пример #2
0
 def visit_EStateVar(self, e):
     yield (e, self.ctx, self.pool)
     with save_property(self, "pool"):
         with save_property(self, "ctx"):
             self.pool = STATE_POOL
             self.ctx = self.root_ctx
             yield from self.visit(e.e)
Пример #3
0
 def visit_EStateVar(self, e):
     with save_property(self, "pool"):
         with save_property(self, "ctx"):
             self.pool = STATE_POOL
             self.ctx = self.root_ctx
             ee = self.visit(e.e)
     return self.join(e, (ee,))
Пример #4
0
 def visit_EStateVar(self, e):
     yield (e, self.ctx, self.pool)
     with save_property(self, "pool"):
         with save_property(self, "ctx"):
             self.pool = STATE_POOL
             self.ctx = self.root_ctx
             yield from self.visit(e.e)
Пример #5
0
    def test_heap_enumeration(self):
        xs = EVar("xs").with_type(INT_BAG)
        context = RootCtx(state_vars=[xs])
        cost_model = CostModel()

        def not_min_or_max(e, *args, **kwargs):
            # forbid min/max to ensure that heap operations get cached
            if isinstance(e, EArgMin) or isinstance(e, EArgMax):
                return False
            return True

        enumerator = Enumerator(examples=[{
            "xs": Bag(())
        }, {
            "xs": Bag((1, 2))
        }, {
            "xs": Bag((1, 1))
        }],
                                cost_model=cost_model,
                                check_wf=not_min_or_max)

        with save_property(accelerate, "value"):
            accelerate.value = False

            print("-" * 20 + " Looking for xs...")
            found_xs = False
            for e in enumerator.enumerate(context, 0, STATE_POOL):
                print(pprint(e))
                if e == xs:
                    assert retypecheck(deep_copy(e))
                    found_xs = True
                    print("^^^ FOUND")
            assert found_xs

            print("-" * 20 + " Looking for heap construction...")
            found_make_heap = False
            for e in enumerator.enumerate(context, 1, STATE_POOL):
                print(pprint(e))
                if isinstance(e, EMakeMinHeap) or isinstance(e, EMakeMaxHeap):
                    assert retypecheck(deep_copy(e))
                    found_make_heap = True
                    print("^^^ FOUND")
            assert found_make_heap

            print("-" * 20 + " Looking for heap usage...")
            found_heap_peek = False
            for e in enumerator.enumerate(context, 2, RUNTIME_POOL):
                print(pprint(e))
                if isinstance(e, EHeapPeek) or isinstance(e, EHeapPeek2):
                    assert retypecheck(deep_copy(e))
                    found_heap_peek = True
                    print("^^^ FOUND")
            assert found_heap_peek
Пример #6
0
 def test_easy_synth(self):
     # FIXME: resolve ETreeMultisetElems problem (#107) and support allow_random_assignment_heuristic in this case
     with save_property(allow_random_assignment_heuristic, "value"):
         allow_random_assignment_heuristic.value = False
         x = EVar("x").with_type(BOOL)
         xs = EVar("xs").with_type(TBag(BOOL))
         target = EFilter(EStateVar(xs), ELambda(x, x))
         assumptions = EUnaryOp(UOp.All, xs)
         assert retypecheck(target)
         assert retypecheck(assumptions)
         assert check_discovery(target,
                                EStateVar(EVar("xs")),
                                args=[x],
                                state_vars=[xs],
                                assumptions=assumptions)
Пример #7
0
    def test_heap_enumeration(self):
        xs = EVar("xs").with_type(INT_BAG)
        context = RootCtx(state_vars=[xs])
        cost_model = CostModel()

        def not_min_or_max(e, *args, **kwargs):
            # forbid min/max to ensure that heap operations get cached
            if isinstance(e, EArgMin) or isinstance(e, EArgMax):
                return False
            return True

        enumerator = Enumerator(
            examples=[{"xs": Bag(())}, {"xs": Bag((1,2))}, {"xs": Bag((1,1))}],
            cost_model=cost_model,
            check_wf=not_min_or_max)

        with save_property(accelerate, "value"):
            accelerate.value = False

            print("-" * 20 + " Looking for xs...")
            found_xs = False
            for e in enumerator.enumerate(context, 0, STATE_POOL):
                print(pprint(e))
                if e == xs:
                    assert retypecheck(deep_copy(e))
                    found_xs = True
                    print("^^^ FOUND")
            assert found_xs

            print("-" * 20 + " Looking for heap construction...")
            found_make_heap = False
            for e in enumerator.enumerate(context, 1, STATE_POOL):
                print(pprint(e))
                if isinstance(e, EMakeMinHeap) or isinstance(e, EMakeMaxHeap):
                    assert retypecheck(deep_copy(e))
                    found_make_heap = True
                    print("^^^ FOUND")
            assert found_make_heap

            print("-" * 20 + " Looking for heap usage...")
            found_heap_peek = False
            for e in enumerator.enumerate(context, 2, RUNTIME_POOL):
                print(pprint(e))
                if isinstance(e, EHeapPeek) or isinstance(e, EHeapPeek2):
                    assert retypecheck(deep_copy(e))
                    found_heap_peek = True
                    print("^^^ FOUND")
            assert found_heap_peek
Пример #8
0
 def visit_ELambda(self, e, bag):
     with save_property(self, "ctx"):
         self.ctx = UnderBinder(self.ctx, e.arg, bag, self.pool)
         new_body = self.visit(e.body)
     return self.join(e, (e.arg, new_body))
Пример #9
0
 def visit_ELambda(self, e, bag):
     with save_property(self, "ctx"):
         self.ctx = UnderBinder(self.ctx, e.arg, bag, self.pool)
         yield from self.visit(e.body)
Пример #10
0
 def visit_ELambda(self, e, bag):
     with save_property(self, "ctx"):
         self.ctx = UnderBinder(self.ctx, e.arg, bag, self.pool)
         new_body = self.visit(e.body)
     return self.join(e, (e.arg, new_body))
Пример #11
0
 def visit_ELambda(self, e, bag):
     with save_property(self, "ctx"):
         self.ctx = UnderBinder(self.ctx, e.arg, bag, self.pool)
         yield from self.visit(e.body)