Source code for ax.utils.testing.metrics.branin_backend_map
#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from typing import Iterable, List, Optional
import numpy as np
from ax.core.map_data import MapKeyInfo
from ax.metrics.branin_map import BraninTimestampMapMetric
from ax.utils.testing.metrics.backend_simulator_map import (
BackendSimulatorTimestampMapMetric,
)
[docs]class BraninBackendMapMetric(
BackendSimulatorTimestampMapMetric, BraninTimestampMapMetric
):
"""A Branin ``BackendSimulatorTimestampMapMetric`` with a multiplicative
factor of ``1 - exp(-rate * t)`` where ``t`` is the runtime of the trial."""
def __init__(
self,
name: str,
param_names: List[str],
map_key_infos: Optional[Iterable[MapKeyInfo]] = None,
noise_sd: float = 0.0,
lower_is_better: Optional[bool] = True,
cache_evaluations: bool = True,
rate: float = 0.5,
delta_t: float = 1.0,
) -> None:
"""The ``BraninTimestampMapMetric`` integrated with the backend simulator.
Args:
name: Name of the metric.
param_names: An ordered list of names of parameters to be passed
to the deterministic function.
noise_sd: Scale of normal noise added to the function result.
lower_is_better: Flag for metrics which should be minimized.
rate: Parameter of the multiplicative factor.
delta_t: The time delta between intermediate results, used in
``convert_to_timestamps``.
"""
BackendSimulatorTimestampMapMetric.__init__(
self,
name=name,
param_names=param_names,
map_key_infos=map_key_infos
if map_key_infos is not None
else [MapKeyInfo(key="timestamp", default_value=0.0)],
noise_sd=noise_sd,
lower_is_better=lower_is_better,
cache_evaluations=cache_evaluations,
)
self.rate = rate
self.delta_t = delta_t
self._timestamp = -1
[docs] def convert_to_timestamps(
self, start_time: Optional[float], end_time: float
) -> List[float]:
"""Given a starting and current time, get the list of intermediate
timestamps at which we have observations."""
if start_time is None:
# NOTE: This can be the case for trials on backend simulator
# that are queued.
return []
num_periods_running = (end_time - start_time) // self.delta_t
return list(np.arange(num_periods_running) * self.delta_t)