Ejemplo n.º 1
0
def _branch_experiment(experiment, conflicts, version, branching_arguments):
    """Create a new branch experiment with adapters for the given conflicts"""
    experiment_brancher = ExperimentBranchBuilder(conflicts,
                                                  **branching_arguments)

    needs_manual_resolution = (not experiment_brancher.is_resolved
                               or experiment_brancher.manual_resolution)

    if not experiment_brancher.is_resolved:
        name_conflict = conflicts.get([ExperimentNameConflict])[0]
        if not name_conflict.is_resolved and not version:
            raise RaceCondition(
                'There was likely a race condition during version increment.')

    if needs_manual_resolution:
        # TODO: This should only be possible when using cmdline API
        branching_prompt = BranchingPrompt(experiment_brancher)

        if not sys.__stdin__.isatty():
            raise BranchingEvent(branching_prompt.get_status())

        branching_prompt.cmdloop()

        if branching_prompt.abort or not experiment_brancher.is_resolved:
            sys.exit()

    config = experiment_brancher.conflicting_config
    config['refers']['adapter'] = experiment_brancher.create_adapters(
    ).configuration
    config['refers']['parent_id'] = experiment.id

    config.pop('_id')

    return create_experiment(**config)
Ejemplo n.º 2
0
    def _branch_config(self, conflicts, branching_configuration):
        """Ask for a different identifier for this experiment. Set :attr:`refers`
        key to previous experiment's name, the one that we branched from.

        :param config: Conflicting configuration that will change based on prompt.
        """
        experiment_brancher = ExperimentBranchBuilder(conflicts,
                                                      branching_configuration)

        needs_manual_resolution = (not experiment_brancher.is_resolved
                                   or experiment_brancher.auto_resolution)

        if needs_manual_resolution:
            branching_prompt = BranchingPrompt(experiment_brancher)

            if not sys.__stdin__.isatty():
                raise ValueError(
                    "Configuration is different and generates a branching event:\n{}"
                    .format(branching_prompt.get_status()))

            branching_prompt.cmdloop()

            if branching_prompt.abort or not experiment_brancher.is_resolved:
                sys.exit()

        adapter = experiment_brancher.create_adapters()
        self._instantiate_config(experiment_brancher.conflicting_config)
        self.refers['adapter'] = adapter
        self.refers['parent_id'] = self._id
Ejemplo n.º 3
0
    def test_adapter_rename_missing(self, parent_config, cl_config):
        """Test if a DimensionRenaming is created when solving a new conflict"""
        cl_config['metadata']['user_args'] = ['-x~>w_d', '-w_d~+uniform(0,1)']

        conflicts = detect_conflicts(parent_config, cl_config)
        branch_builder = ExperimentBranchBuilder(conflicts, {})

        adapters = branch_builder.create_adapters().adapters

        assert len(conflicts.get_resolved()) == 3
        assert len(adapters) == 1
        assert isinstance(adapters[0], evc.adapters.DimensionRenaming)
Ejemplo n.º 4
0
    def test_adapter_remove_missing(self, parent_config, cl_config):
        """Test if a DimensionDeletion is created when solving a new conflict"""
        cl_config['metadata']['user_args'] = ['-z~-']

        conflicts = detect_conflicts(parent_config, cl_config)
        branch_builder = ExperimentBranchBuilder(conflicts, {})

        adapters = branch_builder.create_adapters().adapters

        assert len(conflicts.get_resolved()) == 2
        assert len(adapters) == 1
        assert isinstance(adapters[0], evc.adapters.DimensionDeletion)
Ejemplo n.º 5
0
    def test_adapter_add_changed(self, parent_config, cl_config):
        """Test if a DimensionPriorChange is created when solving a new conflict"""
        cl_config['metadata']['user_args'] = ['-y~+uniform(0,1)']

        conflicts = detect_conflicts(parent_config, cl_config)
        branch_builder = ExperimentBranchBuilder(conflicts, {})

        adapters = branch_builder.create_adapters().adapters

        assert len(conflicts.get_resolved()) == 2
        assert len(adapters) == 1
        assert isinstance(adapters[0], evc.adapters.DimensionPriorChange)
Ejemplo n.º 6
0
    def test_adapter_add_new(self, parent_config, cl_config):
        """Test if a DimensionAddition is created when solving a new conflict"""
        cl_config["metadata"]["user_args"] = ["-w_d~+normal(0,1)"]

        conflicts = detect_conflicts(parent_config, cl_config)
        branch_builder = ExperimentBranchBuilder(conflicts, manual_resolution=True)

        adapters = branch_builder.create_adapters().adapters

        assert len(conflicts.get_resolved()) == 2
        assert len(adapters) == 1
        assert isinstance(adapters[0], evc.adapters.DimensionAddition)
Ejemplo n.º 7
0
    def test_adapter_rename_different_prior(self, parent_config, cl_config):
        """Test if a DimensionRenaming is created when solving a new conflict"""
        cl_config["metadata"]["user_args"] = ["-x~>w_d", "-w_d~+normal(0,1)"]

        conflicts = detect_conflicts(parent_config, cl_config)
        branch_builder = ExperimentBranchBuilder(conflicts, manual_resolution=True)

        adapters = branch_builder.create_adapters().adapters

        assert len(conflicts.get_resolved()) == 4
        assert len(adapters) == 2
        assert isinstance(adapters[0], evc.adapters.DimensionRenaming)
        assert isinstance(adapters[1], evc.adapters.DimensionPriorChange)
Ejemplo n.º 8
0
    def test_adapter_rename_missing(self, parent_config, cl_config):
        """Test if a DimensionRenaming is created when solving a new conflict"""
        cl_config["metadata"]["user_args"] = ["-x~>w_d", "-w_d~+uniform(0,1)"]
        backward.populate_space(cl_config)

        conflicts = detect_conflicts(parent_config, cl_config)
        branch_builder = ExperimentBranchBuilder(conflicts, manual_resolution=True)

        adapters = branch_builder.create_adapters().adapters

        assert len(conflicts.get_resolved()) == 3
        assert len(adapters) == 1
        assert isinstance(adapters[0], evc.adapters.DimensionRenaming)
Ejemplo n.º 9
0
def _branch_experiment(experiment, conflicts, version, branching_arguments):
    """Create a new branch experiment with adapters for the given conflicts"""
    experiment_brancher = ExperimentBranchBuilder(conflicts,
                                                  **branching_arguments)

    needs_manual_resolution = (not experiment_brancher.is_resolved
                               or experiment_brancher.manual_resolution)

    if not experiment_brancher.is_resolved:
        name_conflict = conflicts.get([ExperimentNameConflict])[0]
        if not name_conflict.is_resolved and not version:
            log.debug(
                "A race condition likely occured during conflicts resolutions. "
                "Now rolling back and attempting re-building the branched experiment."
            )
            raise RaceCondition(
                "There was likely a race condition during version increment.")

    if needs_manual_resolution:
        log.debug("Some conflicts cannot be solved automatically.")

        # TODO: This should only be possible when using cmdline API
        branching_prompt = BranchingPrompt(experiment_brancher)

        if not sys.__stdin__.isatty():
            log.debug(
                "No interactive prompt available to manually resolve conflicts."
            )
            raise BranchingEvent(branching_prompt.get_status())

        branching_prompt.cmdloop()

        if branching_prompt.abort or not experiment_brancher.is_resolved:
            sys.exit()

    log.debug("Creating new branched configuration")
    config = experiment_brancher.conflicting_config
    config["refers"]["adapter"] = experiment_brancher.create_adapters(
    ).configuration
    config["refers"]["parent_id"] = experiment.id

    config.pop("_id")

    return create_experiment(mode="x", **config)
Ejemplo n.º 10
0
    def _branch_config(self, conflicts, branching_configuration):
        """Ask for a different identifier for this experiment. Set :attr:`refers`
        key to previous experiment's name, the one that we branched from.

        :param config: Conflicting configuration that will change based on prompt.
        """
        experiment_brancher = ExperimentBranchBuilder(conflicts,
                                                      branching_configuration)

        if not experiment_brancher.is_resolved or experiment_brancher.auto_resolution:
            branching_prompt = BranchingPrompt(experiment_brancher)
            branching_prompt.cmdloop()

            if branching_prompt.abort or not experiment_brancher.is_resolved:
                sys.exit()

        adapter = experiment_brancher.create_adapters()
        self._instantiate_config(experiment_brancher.conflicting_config)
        self.refers['adapter'] = adapter
        self.refers['parent_id'] = self._id