Beispiel #1
0
    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',
        )
Beispiel #2
0
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)
Beispiel #3
0
    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'),
        )
Beispiel #4
0
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:])
Beispiel #5
0
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()
Beispiel #6
0
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()