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)
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
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)
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)
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)
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)
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)
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)
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)
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