def wrapped_func(inputs, out_paths, cnt_out_literals): if inputs is None: inputs = [] if out_paths is None: out_paths = [] out_values = foo(*inputs, *out_paths) if ((util.isIterable(out_values) and cnt_out_literals == 1) or (not util.isIterable(out_values) and out_values is not None)): out_values = [ out_values, ] elif out_values is None: out_values = [] return out_values
def __forEach__(self): """ Makes self.v iterable, for multi-trial experiments :return: """ if not util.isIterable(self.v): raise TypeError("Cannot iterate over literal {}".format(self.v)) self.__oneByOne__ = True # Check if they did not set their own default. if self.default is None: self.default = self.v[0] self.n = len(self.v) return self
def action(self, func, in_artifacts=None): if in_artifacts: temp_artifacts = [] for in_art in in_artifacts: if not util.isFlorClass(in_art): if util.isIterable(in_art): in_art = self.literal(in_art) in_art.forEach() else: in_art = self.literal(in_art) temp_artifacts.append(in_art) in_artifacts = temp_artifacts act = Action(func, in_artifacts, self.xp_state) self.xp_state.eg.node(act) if in_artifacts: for in_art in in_artifacts: self.xp_state.eg.edge(in_art, act) return act
def callable_function(*pos, **kws): # INPUTS pos_var_names = [ i for i in f.__code__.co_varnames if i != 'kwargs' ] for kee in kws: assert kee in f.__code__.co_varnames d = {} d.update(kws) for i, positional_arg in enumerate(pos): kee = pos_var_names[i] assert kee not in d d[kee] = positional_arg # OUTPUTS _fun = ast.parse(inspect.getsource(f)).body[0] _kees = [ i.s for i in [i for i in _fun.body if type(i) == ast.Return][0].value.keys ] assert len(_kees) > 0 with Experiment(xp_name) as ex: input_lits = [] output_lits = [] for kee in d: if util.isIterable(d[kee]): input_lits.append(ex.literalForEach(d[kee], kee)) else: input_lits.append(ex.literal(d[kee], kee)) do_action = ex.action(tru_f, input_lits) for kee in _kees: output_lits.append(ex.literal(name=kee, parent=do_action)) pullable_lit = output_lits[0] plot = pullable_lit.plot() pullable_lit.pull() return plot
def action(self, func, in_artifacts=None): """ # TODO: What's the equivalent of re-using code from a previous experiment version? :param func: :param in_artifacts: :return: """ filenameWithFunc, funcName, _ = func if filenameWithFunc in self.xp_state.eg.loc_map: code_artifact = self.xp_state.eg.loc_map[filenameWithFunc] else: code_artifact = self.artifact( filenameWithFunc, '.'.join(filenameWithFunc.split('.')[0:-1])) if in_artifacts: temp_artifacts = [] for in_art in in_artifacts: if not util.isFlorClass(in_art): if util.isIterable(in_art): in_art = self.literal(in_art) in_art.__forEach__() else: in_art = self.literal(in_art) temp_artifacts.append(in_art) in_artifacts = temp_artifacts in_artifacts = in_artifacts or [] act = Action(func, [ code_artifact, ] + in_artifacts, self.xp_state) self.xp_state.eg.node(act) self.xp_state.eg.edge(code_artifact, act) if in_artifacts: for in_art in in_artifacts: self.xp_state.eg.edge(in_art, act) return act
def action(self, func, in_artifacts=None): """ :param func: :param in_artifacts: :return: """ filenameWithFunc, _, _ = func if filenameWithFunc in self.xp_state.eg.loc_map: code_artifact = self.xp_state.eg.loc_map[filenameWithFunc] else: code_artifact = self.artifact(filenameWithFunc, filenameWithFunc.split('.')[0]) if in_artifacts: temp_artifacts = [] for in_art in in_artifacts: if not util.isFlorClass(in_art): if util.isIterable(in_art): in_art = self.literal(in_art) in_art.__forEach__() else: in_art = self.literal(in_art) temp_artifacts.append(in_art) in_artifacts = temp_artifacts act = Action(func, [ code_artifact, ] + in_artifacts, self.xp_state) self.xp_state.eg.node(act) self.xp_state.eg.edge(code_artifact, act) if in_artifacts: for in_art in in_artifacts: self.xp_state.eg.edge(in_art, act) return act
def wrapped_func(in_artifacts, out_artifacts): if in_artifacts: in_args = [] for in_art in [ in_art.loc if util.isFlorClass(in_art) else in_art for in_art in in_artifacts ]: if util.isPickle(in_art): try: x = util.unpickle(in_art) except: x = joblib.load(in_art) elif util.isCsv(in_art): x = in_art elif util.isLoc(in_art): with open(in_art, 'r') as f: x = [i.strip() for i in f.readlines() if i.strip()] if len(x) == 1: x = x[0] else: x = in_art in_args.append(x) outs = lambdah(*in_args) else: outs = lambdah() if util.isIterable(outs): try: assert len(outs) == len(out_artifacts) for out, out_loc in zip( outs, [out_art.loc for out_art in out_artifacts]): if util.isPickle(out_loc): try: util.pickleTo(out, out_loc) except: joblib.dump(out, out_loc) else: with open(out_loc, 'w') as f: if util.isIterable(out): for o in out: f.write(str(o) + '\n') else: f.write(str(out) + '\n') except: assert len(out_artifacts) == 1 outs = [ outs, ] for out, out_loc in zip( outs, [out_art.loc for out_art in out_artifacts]): if util.isPickle(out_loc): util.pickleTo(out, out_loc) else: with open(out_loc, 'w') as f: if util.isIterable(out): for o in out: f.write(str(o) + '\n') else: f.write(str(out) + '\n') elif out_artifacts and outs is not None: out_loc = out_artifacts[0].loc if util.isPickle(out_loc): util.pickleTo(outs, out_loc) else: with open(out_loc, 'w') as f: if util.isIterable(outs): for o in outs: f.write(str(o) + '\n') else: f.write(str(outs) + '\n') else: raise AssertionError( "Missing location to write or Missing return value.") return lambdah.__name__