def add_query(self, q : Query): """ Given a query in terms of abstract state, add an initial concrete implementation. """ print("Adding query {}...".format(q.name)) self.query_specs.append(q) fvs = free_vars(q) # initial rep qargs = set(EVar(a).with_type(t) for (a, t) in q.args) rep, ret = tease_apart(wrap_naked_statevars(q.ret, self.abstract_state)) self.set_impl(q, rep, ret)
def run(self): print("STARTING IMPROVEMENT JOB {}".format(self.q.name)) os.makedirs(log_dir.value, exist_ok=True) with open(os.path.join(log_dir.value, "{}.log".format(self.q.name)), "w", buffering=LINE_BUFFER_MODE) as f: sys.stdout = f print("STARTING IMPROVEMENT JOB {}".format(self.q.name)) print(pprint(self.q)) if nice_children.value: os.nice(20) ctx = RootCtx( state_vars=self.state, args=[EVar(v).with_type(t) for (v, t) in self.q.args], funcs=self.funcs) cost_model = CostModel( funcs=ctx.funcs(), assumptions=EAll(self.assumptions), freebies=[h.e for h in self.hints if isinstance(h, EStateVar)]) try: for expr in itertools.chain( (self.q.ret, ), core.improve(target=self.q.ret, assumptions=EAll(self.assumptions), context=ctx, hints=self.hints, stop_callback=lambda: self.stop_requested, cost_model=cost_model)): new_rep, new_ret = tease_apart(expr) self.k(new_rep, new_ret) print("PROVED OPTIMALITY FOR {}".format(self.q.name)) except core.StopException: print("stopping synthesis of {}".format(self.q.name)) return
def run(self): print("STARTING IMPROVEMENT JOB {} (|examples|={})".format( self.q.name, len(self.examples or ()))) os.makedirs(log_dir.value, exist_ok=True) with open(os.path.join(log_dir.value, "{}.log".format(self.q.name)), "w", buffering=LINE_BUFFER_MODE) as f: sys.stdout = f print("STARTING IMPROVEMENT JOB {} (|examples|={})".format( self.q.name, len(self.examples or ()))) print(pprint(self.q)) if nice_children.value: os.nice(20) all_types = self.ctx.all_types n_binders = 1 done = False expr = ETuple( (EAll(self.assumptions), self.q.ret)).with_type(TTuple((BOOL, self.q.ret.type))) while not done: binders = [] for t in all_types: # if isinstance(t, TBag): # binders += [fresh_var(t.t) for i in range(n_binders)] for i in range(n_binders): b = fresh_var(t) binders.append(b) try: core.fixup_binders(expr, binders, throw=True) done = True except: pass n_binders += 1 binders = [ fresh_var(t) for t in all_types if is_scalar(t) for i in range(n_binders) ] print("Using {} binders".format(n_binders)) relevant_state_vars = [ v for v in self.state if v in free_vars(EAll(self.assumptions)) | free_vars(self.q.ret) ] used_vars = free_vars(self.q.ret) for a in self.q.assumptions: used_vars |= free_vars(a) args = [EVar(v).with_type(t) for (v, t) in self.q.args] args = [a for a in args if a in used_vars] b = BinderBuilder(binders, relevant_state_vars, args) if accelerate.value: b = AcceleratedBuilder(b, binders, relevant_state_vars, args) try: for expr in itertools.chain( (self.q.ret, ), core.improve( target=self.q.ret, assumptions=EAll(self.assumptions), hints=self.hints, examples=self.examples, binders=binders, state_vars=relevant_state_vars, args=args, cost_model=CompositeCostModel(), builder=b, stop_callback=lambda: self.stop_requested)): new_rep, new_ret = tease_apart(expr) self.k(new_rep, new_ret) print("PROVED OPTIMALITY FOR {}".format(self.q.name)) except core.StopException: print("stopping synthesis of {}".format(self.q.name)) return