def __init__(self, cpu_limit=None): """ Initialize the study. """ self.results = None # Callback method def callback(experiment_id): self._callback(experiment_id) # Create experimenter self.experimenter = Experimenter( self.name(), update_callback=callback, update_callback_min_pause=self.EXPERIMENTER_CALLBACK_MIN_PAUSE, cpu_limit=cpu_limit, results_file=self.name() + '_results.csv', )
def main(args): """ Tries to find the study specified and runs it. """ parser = argparse.ArgumentParser( prog='merge', description="Merges several result files into a new one.", ) parser.add_argument("source", help="files to be merged", nargs="+", type=str) parser.add_argument("dest", help="file to write", nargs=1, type=str) args = parser.parse_args(args) try: Experimenter.merge_result_files(args.source, args.dest[0]) except FileNotFoundError as e: print(f'Could not find {e.filename.decode()}.') quit(1)
def __init__(self, cpu_limit=None, gpu_limit=None): """ Initialize the study. """ self.results = None self.full_run = True # Callback method def callback(experiment_id): self._callback(experiment_id) # Create experimenter self.experimenter = Experimenter( self.name(), update_callback=callback, update_callback_min_pause=self.EXPERIMENTER_CALLBACK_MIN_PAUSE, cpu_limit=cpu_limit, gpu_limit=gpu_limit, results_file=self.name() + ('.csv.gz' if self.COMPRESSION else '.csv'), )
Helper module to run studies as defined in pypuf.studies """ import sys import argparse from pypuf.experiments import Experimenter from pypuf.tools import find_study_class def main(args): """ Tries to find the study specified and runs it. """ parser = argparse.ArgumentParser( prog='study', description="Runs a pypuf study", ) parser.add_argument("study", help="name of the study to be run", type=str) args = parser.parse_args(args) study_class = find_study_class(args.study) print('Running {}.{}'.format(study_class.__module__, study_class.__name__)) study = study_class() study.run() if __name__ == '__main__': Experimenter.disable_auto_multiprocessing() main(sys.argv[1:])
class Study: """ Creates a number of experiments, runs them and produces a human-readable result. """ EXPERIMENTER_CALLBACK_MIN_PAUSE = 5 * 60 SHUFFLE = False COMPRESSION = False STUDY_MODULE_PREFIX = 'pypuf.studies.' def __init__(self, cpu_limit=None, gpu_limit=None): """ Initialize the study. """ self.results = None self.full_run = True # Callback method def callback(experiment_id): self._callback(experiment_id) # Create experimenter self.experimenter = Experimenter( self.name(), update_callback=callback, update_callback_min_pause=self.EXPERIMENTER_CALLBACK_MIN_PAUSE, cpu_limit=cpu_limit, gpu_limit=gpu_limit, results_file=self.name() + ('.csv.gz' if self.COMPRESSION else '.csv'), ) def name(self): """ returns the study's name """ name = self.__module__.__str__() if name.startswith(self.STUDY_MODULE_PREFIX): name = name[len(self.STUDY_MODULE_PREFIX):] return name def experiments(self): """ returns the study's experiments as a list """ return [] def plot(self): """ Generates this study's output. (Full or partial) results are available via `self.experimenter.results`. """ def run(self, part=0, total=1): """ runs the study, that is, create the experiments, run them through an experimenter, collect the results and plot the output """ # Queue experiments experiments = self.experiments() assert experiments, 'Study {} did not define any experiments.'.format( self.name()) partition_size = len(experiments) // total self.full_run = partition_size == len(experiments) start = part * partition_size end = (part + 1) * partition_size for e in experiments[start:end]: self.experimenter.queue(e) # Run experiments if experiments[start:end]: self.experimenter.run(shuffle=self.SHUFFLE) # Plot results self.plot() else: print( f'Part {part} of {total} parts did not have any experiments, study defines a total of ' f'{len(experiments)} experiments.') def _callback(self, _experiment_id=None): """ will be called by the experimenter after every finished experiment, but at most every EXPERIMENTER_CALLBACK_MIN_PAUSE seconds. """ if not self.experimenter.results.empty and self.full_run: self.plot()
class Study: """ Creates a number of experiments, runs them and produces a human-readable result. """ EXPERIMENTER_CALLBACK_MIN_PAUSE = 30 SHUFFLE = False def __init__(self, cpu_limit=None): """ Initialize the study. """ self.results = None # Callback method def callback(experiment_id): self._callback(experiment_id) # Create experimenter self.experimenter = Experimenter( self.name(), update_callback=callback, update_callback_min_pause=self.EXPERIMENTER_CALLBACK_MIN_PAUSE, cpu_limit=cpu_limit, results_file=self.name() + '_results.csv', ) def name(self): """ returns the study's name """ def experiments(self): """ returns the study's experiments as a list """ return [] def plot(self): """ Generates this study's output. (Full or partial) results are available via `self.experimenter.results`. """ def run(self): """ runs the study, that is, create the experiments, run them through an experimenter, collect the results and plot the output """ # Queue experiments experiments = self.experiments() assert experiments, 'Study {} did not define any experiments.'.format(self.name()) for e in experiments: self.experimenter.queue(e) # Run experiments self.experimenter.run(shuffle=self.SHUFFLE) # Plot results self.plot() def _callback(self, _experiment_id=None): """ will be called by the experimenter after every finished experiment, but at most every EXPERIMENTER_CALLBACK_MIN_PAUSE seconds. """ if not self.experimenter.results.empty: self.plot()