跳到主内容

Eips 编码器

smac.runhistory.encoder.eips_encoder #

RunHistoryEIPSEncoder #

RunHistoryEIPSEncoder(
    scenario: Scenario,
    considered_states: list[StatusType] = None,
    lower_budget_states: list[StatusType] = None,
    scale_percentage: int = 5,
    seed: int | None = None,
)

基类: AbstractRunHistoryEncoder

专门用于 EIPS(每秒期望提升)采集函数的编码器。

源代码位于 smac/runhistory/encoder/abstract_encoder.py
def __init__(
    self,
    scenario: Scenario,
    considered_states: list[StatusType] = None,
    lower_budget_states: list[StatusType] = None,
    scale_percentage: int = 5,
    seed: int | None = None,
) -> None:
    if considered_states is None:
        considered_states = [
            StatusType.SUCCESS,
            StatusType.CRASHED,
            StatusType.MEMORYOUT,
        ]

    if seed is None:
        seed = scenario.seed

    self._seed = seed
    self._rng = np.random.RandomState(seed)
    self._scale_percentage = scale_percentage
    self._n_objectives = scenario.count_objectives()
    self._algorithm_walltime_limit = scenario.trial_walltime_limit
    self._lower_budget_states = lower_budget_states if lower_budget_states is not None else []
    self._considered_states = considered_states

    self._instances = scenario.instances
    self._instance_features = scenario.instance_features
    self._n_features = scenario.count_instance_features()
    self._n_params = len(list(scenario.configspace.values()))

    if self._instances is not None and self._n_features == 0:
        logger.warning(
            "We strongly encourage to use instance features when using instances.",
            "If no instance features are passed, the runhistory encoder can not distinguish between different "
            "instances and therefore returns the same data points with different values, all of which are "
            "used to train the surrogate model.\n"
            "Consider using instance indices as features.",
        )

    # Learned statistics
    self._min_y = np.array([np.nan] * self._n_objectives)
    self._max_y = np.array([np.nan] * self._n_objectives)
    self._percentile = np.array([np.nan] * self._n_objectives)
    self._multi_objective_algorithm: AbstractMultiObjectiveAlgorithm | None = None
    self._runhistory: RunHistory | None = None

meta 属性 #

meta: dict[str, Any]

返回创建对象的元数据。

返回值#

dict[str, Any]: 创建对象的元数据:名称、考虑的状态、较低预算的状态、scale_percentage、seed。

multi_objective_algorithm 属性 可写 #

multi_objective_algorithm: AbstractMultiObjectiveAlgorithm | None

用于转换数据的多目标算法。

runhistory 属性 可写 #

runhistory: RunHistory

用于转换数据的 RunHistory。

get_configurations #

get_configurations(
    budget_subset: list | None = None,
) -> ndarray

返回配置的向量表示。

警告#

未附加实例特征且未考虑成本值。

参数#

budget_subset : list[int|float] | None, defaults to none 要考虑的预算列表。

返回值#

configs_array : np.ndarray

源代码位于 smac/runhistory/encoder/abstract_encoder.py
def get_configurations(
    self,
    budget_subset: list | None = None,
) -> np.ndarray:
    """Returns vector representation of the configurations.

    Warning
    -------
    Instance features are not
    appended and cost values are not taken into account.

    Parameters
    ----------
    budget_subset : list[int|float] | None, defaults to none
        List of budgets to consider.

    Returns
    -------
    configs_array : np.ndarray
    """
    s_trials = self._get_considered_trials(budget_subset)
    s_config_ids = set(s_trial.config_id for s_trial in s_trials)
    t_trials = self._get_timeout_trials(budget_subset)
    t_config_ids = set(t_trial.config_id for t_trial in t_trials)
    config_ids = s_config_ids | t_config_ids
    configurations = [self.runhistory._ids_config[config_id] for config_id in config_ids]
    configs_array = convert_configurations_to_array(configurations)

    return configs_array

transform #

transform(
    budget_subset: list | None = None,
) -> tuple[ndarray, ndarray]

返回 RunHistory 的向量表示。

参数#

budget_subset : list | None, defaults to none 要考虑的预算列表。

返回值#

X : np.ndarray 配置向量和实例特征。 Y : np.ndarray 成本值。

源代码位于 smac/runhistory/encoder/abstract_encoder.py
def transform(
    self,
    budget_subset: list | None = None,
) -> tuple[np.ndarray, np.ndarray]:
    """Returns a vector representation of the RunHistory.

    Parameters
    ----------
    budget_subset : list | None, defaults to none
        List of budgets to consider.

    Returns
    -------
    X : np.ndarray
        Configuration vector and instance features.
    Y : np.ndarray
        Cost values.
    """
    logger.debug("Transforming RunHistory into X, y format...")

    considered_trials = self._get_considered_trials(budget_subset)
    X, Y = self._build_matrix(trials=considered_trials, store_statistics=True)

    # Get real TIMEOUT runs
    timeout_trials = self._get_timeout_trials(budget_subset)

    # Use penalization (e.g. PAR10) for EPM training
    store_statistics = True if np.any(np.isnan(self._min_y)) else False
    tX, tY = self._build_matrix(trials=timeout_trials, store_statistics=store_statistics)

    # If we don't have successful runs, we have to return all timeout runs
    if not considered_trials:
        return tX, tY

    # If we do not impute, we also return TIMEOUT data
    X = np.vstack((X, tX))
    Y = np.concatenate((Y, tY))

    logger.debug("Converted %d observations." % (X.shape[0]))
    return X, Y

transform_response_values #

transform_response_values(values: ndarray) -> ndarray

转换函数响应值。通过对数变换 log(1. + runtime) 转换运行时长。

参数#

values : np.ndarray 要转换的响应值。

返回值#

np.ndarray

源代码位于 smac/runhistory/encoder/eips_encoder.py
def transform_response_values(self, values: np.ndarray) -> np.ndarray:
    """Transform function response values. Transform the runtimes by a log transformation
    log(1. + runtime).

    Parameters
    ----------
    values : np.ndarray
        Response values to be transformed.

    Returns
    -------
    np.ndarray
    """
    # We need to ensure that time remains positive after the log transform.
    values[:, 1] = np.log(1 + values[:, 1])
    return values