Esempio n. 1
0
    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
Esempio n. 2
0
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!")