def _make_pruner(self): if isinstance(self.pruner_method, str): if self.pruner_method == 'halving': pruner = SuccessiveHalvingPruner( min_resource=self.n_timesteps // 6, reduction_factor=4, min_early_stopping_rate=0) elif self.pruner_method == 'median': pruner = MedianPruner(n_startup_trials=5, n_warmup_steps=self.n_timesteps // 6) elif self.pruner_method == 'none': # Do not prune pruner = NopPruner() else: raise ValueError('Unknown pruner: {}'.format( self.pruner_method)) elif isinstance(self.pruner_method, dict): method_copy = deepcopy(self.pruner_method) method = method_copy.pop('method') if method == 'halving': pruner = SuccessiveHalvingPruner(**method_copy) elif method == 'median': pruner = MedianPruner(**method_copy) elif method == 'none': # Do not prune pruner = NopPruner() else: raise ValueError('Unknown pruner: {}'.format( self.pruner_method)) else: raise ValueError("Wrong type for pruner settings!") return pruner
def _create_pruner(self, pruner_method: str) -> BasePruner: if pruner_method == "halving": pruner = SuccessiveHalvingPruner(min_resource=1, reduction_factor=4, min_early_stopping_rate=0) elif pruner_method == "median": pruner = MedianPruner(n_startup_trials=self.n_startup_trials, n_warmup_steps=self.n_evaluations // 3) elif pruner_method == "none": # Do not prune pruner = NopPruner() else: raise ValueError(f"Unknown pruner: {pruner_method}") return pruner
def _create_study(mo_study: "multi_objective.study.MultiObjectiveStudy") -> "optuna.Study": study = create_study( storage=mo_study._storage, sampler=_MultiObjectiveSamplerAdapter(mo_study.sampler), pruner=NopPruner(), study_name="_motpe-" + mo_study._storage.get_study_name_from_id(mo_study._study_id), directions=mo_study.directions, load_if_exists=True, ) for mo_trial in mo_study.trials: with warnings.catch_warnings(): warnings.simplefilter("ignore", ExperimentalWarning) study.add_trial(_create_trial(mo_trial)) return study
def create_study( directions: List[str], study_name: Optional[str] = None, storage: Optional[Union[str, BaseStorage]] = None, sampler: Optional["multi_objective.samplers.BaseMultiObjectiveSampler"] = None, load_if_exists: bool = False, ) -> "multi_objective.study.MultiObjectiveStudy": """Create a new :class:`~optuna.multi_objective.study.MultiObjectiveStudy`. Example: .. testcode:: import optuna def objective(trial): # Binh and Korn function. x = trial.suggest_float("x", 0, 5) y = trial.suggest_float("y", 0, 3) v0 = 4 * x ** 2 + 4 * y ** 2 v1 = (x - 5) ** 2 + (y - 5) ** 2 return v0, v1 study = optuna.multi_objective.create_study(["minimize", "minimize"]) study.optimize(objective, n_trials=3) Args: directions: Optimization direction for each objective value. Set ``minimize`` for minimization and ``maximize`` for maximization. study_name: Study's name. If this argument is set to None, a unique name is generated automatically. storage: Database URL. If this argument is set to None, in-memory storage is used, and the :class:`~optuna.study.Study` will not be persistent. .. note:: When a database URL is passed, Optuna internally uses `SQLAlchemy`_ to handle the database. Please refer to `SQLAlchemy's document`_ for further details. If you want to specify non-default options to `SQLAlchemy Engine`_, you can instantiate :class:`~optuna.storages.RDBStorage` with your desired options and pass it to the ``storage`` argument instead of a URL. .. _SQLAlchemy: https://www.sqlalchemy.org/ .. _SQLAlchemy's document: https://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls .. _SQLAlchemy Engine: https://docs.sqlalchemy.org/en/latest/core/engines.html sampler: A sampler object that implements background algorithm for value suggestion. If :obj:`None` is specified, :class:`~optuna.multi_objective.samplers.NSGAIIMultiObjectiveSampler` is used as the default. See also :class:`~optuna.multi_objective.samplers`. load_if_exists: Flag to control the behavior to handle a conflict of study names. In the case where a study named ``study_name`` already exists in the ``storage``, a :class:`~optuna.exceptions.DuplicatedStudyError` is raised if ``load_if_exists`` is set to :obj:`False`. Otherwise, the creation of the study is skipped, and the existing one is returned. Returns: A :class:`~optuna.multi_objective.study.MultiObjectiveStudy` object. """ # TODO(ohta): Support pruner. mo_sampler = sampler or multi_objective.samplers.NSGAIIMultiObjectiveSampler() sampler_adapter = multi_objective.samplers._MultiObjectiveSamplerAdapter(mo_sampler) if not isinstance(directions, Iterable): raise TypeError("`directions` must be a list or other iterable types.") if not all(d in ["minimize", "maximize"] for d in directions): raise ValueError("`directions` includes unknown direction names.") study = _create_study( study_name=study_name, storage=storage, sampler=sampler_adapter, pruner=NopPruner(), load_if_exists=load_if_exists, ) study.set_system_attr("multi_objective:study:directions", list(directions)) return MultiObjectiveStudy(study)