from __future__ import annotations
from typing import Iterator
from smac.runhistory.dataclasses import TrialInfo, TrialValue
from smac.runner.abstract_runner import AbstractRunner
[docs]
class AbstractSerialRunner(AbstractRunner):
[docs]
def submit_trial(self, trial_info: TrialInfo) -> None:
"""This function submits a trial_info object in a serial fashion. As there is a single
worker for this task, this interface can be considered a wrapper over the `run` method.
Both result/exceptions can be completely determined in this step so both lists
are properly filled.
Parameters
----------
trial_info : TrialInfo
An object containing the configuration launched.
"""
self._results_queue.append(self.run_wrapper(trial_info))
[docs]
def iter_results(self) -> Iterator[tuple[TrialInfo, TrialValue]]: # noqa: D102
while self._results_queue:
yield self._results_queue.pop(0)
[docs]
def wait(self) -> None:
"""The SMBO/intensifier might need to wait for trials to finish before making a decision.
For serial runners, no wait is needed as the result is immediately available.
"""
# There is no need to wait in serial runners. When launching a trial via submit, as
# the serial trial uses the same process to run, the result is always available
# immediately after. This method implements is just an implementation of the
# abstract method via a simple return, again, because there is no need to wait
return
[docs]
def is_running(self) -> bool: # noqa: D102
return False
[docs]
def count_available_workers(self) -> int:
"""Returns the number of available workers. Serial workers only have one worker."""
return 1