def __init__(self, exp_num, in_progress_dir, finished_dir, executables, ftcat_bin=None, release_ts_bin=None): """Run an experiment, optionally wrapped in FeatherTrace tracing. If ftcat_bin and release_ts_bin are given, then use FeatherTrace and/or release_ts. Arguments: exp_num -- Unique ID for this experiment (integer). in_progress_dir -- "Scratch space" for in progress files. finished_dir -- Where finished files are moved to. executables -- Executable object list that represents a task-set. ftcat_bin -- Location of ftcat binary (usually from config. file). release_ts_bin -- Location of release_ts binary (again, config. file). """ self.exp_num = exp_num self.in_progress_dir = in_progress_dir self.finished_dir = finished_dir self.executables = executables self.release_ts_bin = release_ts_bin self.__make_dirs() self.__assign_executable_cwds() # must be after we make the directories self.use_ft = False if ftcat_bin is None else True if self.use_ft: self.feather_trace = FeatherTrace(ftcat_bin, self.ft_dir) self.use_release_ts = False if self.release_ts_bin is None else True
class Experiment(object): """Execute one task-set and save the results. Experiments have unique IDs. Experiment class takes care of creating directories, moving results to the right place, and dececting partial and finished experiments if the experiment is re-run. """ def __init__(self, exp_num, in_progress_dir, finished_dir, executables, ftcat_bin=None, release_ts_bin=None): """Run an experiment, optionally wrapped in FeatherTrace tracing. If ftcat_bin and release_ts_bin are given, then use FeatherTrace and/or release_ts. Arguments: exp_num -- Unique ID for this experiment (integer). in_progress_dir -- "Scratch space" for in progress files. finished_dir -- Where finished files are moved to. executables -- Executable object list that represents a task-set. ftcat_bin -- Location of ftcat binary (usually from config. file). release_ts_bin -- Location of release_ts binary (again, config. file). """ self.exp_num = exp_num self.in_progress_dir = in_progress_dir self.finished_dir = finished_dir self.executables = executables self.release_ts_bin = release_ts_bin self.__make_dirs() self.__assign_executable_cwds() # must be after we make the directories self.use_ft = False if ftcat_bin is None else True if self.use_ft: self.feather_trace = FeatherTrace(ftcat_bin, self.ft_dir) self.use_release_ts = False if self.release_ts_bin is None else True def __make_dirs(self): self.exp_dir = "%s/%d" % (self.in_progress_dir, self.exp_num) self.finished_dir = "%s/%d" % (self.finished_dir, self.exp_num) self.ft_dir = "%s/ftrace" % self.exp_dir self.cmd_cwd = "%s/cmd" % self.exp_dir if os.path.exists(self.finished_dir): raise ExperimentDone(self.exp_num) if os.path.exists(self.exp_dir): raise ExperimentInterrupted(self.exp_num) map(os.mkdir, [self.exp_dir, self.ft_dir, self.cmd_cwd]) def __assign_executable_cwds(self): def assign_cwd(executable): executable.cwd = self.cmd_cwd map(assign_cwd, self.executables) def __save_results(self): os.rename(self.exp_dir, self.finished_dir) def log(self, msg): print "[Exp %3d]: %s" % (self.exp_num, msg) def run_exp(self): """Run the experiment, wrapping it in FeatherTrace.""" if self.use_ft: self.feather_trace.start_trace() self.log("Starting program to trace...") map(methodcaller('execute'), self.executables) if self.use_release_ts: time.sleep(2) sp = subprocess.Popen([self.release_ts_bin]) sp.wait() if sp.returncode != 0: raise Exception('Something went wrong in release_ts') self.log("Waiting for program to finish...") map(methodcaller('wait'), self.executables) if self.use_ft: self.feather_trace.stop_trace() self.__save_results() self.log("Experiment done!")