from __future__ import annotations
from typing import Any
from dataclasses import dataclass, field
from ConfigSpace import Configuration
from smac.runhistory.enumerations import StatusType
__copyright__ = "Copyright 2022, automl.org"
__license__ = "3-clause BSD"
[docs]
@dataclass(frozen=True)
class InstanceSeedKey:
"""Key for instance and seed.
Parameters
----------
instance : str | None, defaults to None
seed : int | None, defaults to None
"""
instance: str | None = None
seed: int | None = None
def __eq__(self, other: Any) -> bool:
if isinstance(other, InstanceSeedKey):
if self.instance == other.instance and self.seed == other.seed:
return True
return False
[docs]
@dataclass(frozen=True)
class InstanceSeedBudgetKey:
"""Key for instance, seed and budget.
Parameters
----------
instance : str | None, defaults to None
seed : int | None, defaults to None
budget : float | None, defaults to None
"""
instance: str | None = None
seed: int | None = None
budget: float | None = None
def __lt__(self, other: InstanceSeedBudgetKey) -> bool:
if self.budget is not None and other.budget is not None:
return self.budget < other.budget
if self.instance is not None and other.instance is not None:
return self.instance < other.instance
if self.seed is not None and other.seed is not None:
return self.seed < other.seed
raise RuntimeError("Could not compare InstanceSeedBudgetKey.")
def __eq__(self, other: Any) -> bool:
if isinstance(other, InstanceSeedBudgetKey):
if self.instance == other.instance and self.seed == other.seed and self.budget == other.budget:
return True
return False
[docs]
def get_instance_seed_key(self) -> InstanceSeedKey:
"""Returns the instance-seed key. The budget is omitted."""
return InstanceSeedKey(instance=self.instance, seed=self.seed)
[docs]
@dataclass(frozen=True)
class TrialKey:
"""Key of a trial.
Parameters
----------
config_id : int
instance : str | None, defaults to None
seed : int | None, defaults to None
budget : float | None, defaults to None
"""
config_id: int
instance: str | None = None
seed: int | None = None
budget: float | None = None
[docs]
@dataclass(frozen=True)
class TrialValue:
"""Values of a trial.
Parameters
----------
cost : float | list[float]
time : float, defaults to 0.0
status : StatusType, defaults to StatusType.SUCCESS
starttime : float, defaults to 0.0
endtime : float, defaults to 0.0
additional_info : dict[str, Any], defaults to {}
"""
cost: float | list[float]
time: float = 0.0
status: StatusType = StatusType.SUCCESS
starttime: float = 0.0
endtime: float = 0.0
additional_info: dict[str, Any] = field(default_factory=dict)
[docs]
@dataclass(frozen=True)
class TrialInfo:
"""Information about a trial.
Parameters
----------
config : Configuration
instance : str | None, defaults to None
seed : int | None, defaults to None
budget : float | None, defaults to None
"""
config: Configuration
instance: str | None = None
seed: int | None = None
budget: float | None = None
[docs]
def get_instance_seed_key(self) -> InstanceSeedKey:
"""Instantiates and returns an InstanceSeedKey object"""
return InstanceSeedKey(instance=self.instance, seed=self.seed)
[docs]
def get_instance_seed_budget_key(self) -> InstanceSeedBudgetKey:
"""Instantiates and returns an InstanceSeedBudgetKey object."""
return InstanceSeedBudgetKey(instance=self.instance, seed=self.seed, budget=self.budget)
[docs]
@dataclass
class TrajectoryItem:
"""Item of a trajectory.
Parameters
----------
config_ids : list[int]
Configuration ids of the current incumbents.
costs : list[float | list[float]]
Costs of the current incumbents. In case of multi-objective, this is a list of lists.
trial : int
How many trials have been evaluated so far.
walltime : float
How much walltime has been used so far.
"""
config_ids: list[int]
costs: list[float | list[float]]
trial: int
walltime: float