Source code for surround.runners
import logging
from abc import ABC, abstractmethod
from .run_modes import RunMode
from .state import State
from .assembler import Assembler
LOGGER = logging.getLogger(__name__)
[docs]class Runner(ABC):
"""
Base class for runners which are responsible for:
- Initializing an :class:`surround.assembler.Assembler`.
- Loading/preparing input data.
- Running the :class:`surround.assembler.Assembler`.
Example batch runner::
class BatchRunner(Runner):
def load_data(self, mode, config):
state = AssemblyState()
if mode == RunMode.TRAIN:
state.input_data = load_files('training_set')
else:
state.input_data = load_files('predict_set')
return state
.. note:: You get a Batch Runner and Web Runner (if web requested) when
you generate a project using the CLI tool.
"""
def __init__(self, assembler=None):
"""
:param assembler: The assembler the runner will execute
:type assembler: :class:`surround.assembler.Assembler`
"""
self.name = self.__class__.__name__
self.assembler = assembler
[docs] @abstractmethod
def load_data(self, mode, config):
"""
Load the data and prepare it to be fed into the :class:`surround.assembler.Assembler`.
:param mode: the mode the assembly was run in (batch, train, predict, web)
:type mode: :class:`surround.runners.RunMode`
:param config: the configuration of the assembly
:type config: :class:`surround.config.Config`
"""
[docs] def set_assembler(self, assembler):
"""
Set the Assembler instance the runner will execute.
:param assembler: the Assembler instance
:type assembler: :class:`surround.assembler.Assembler`
"""
if isinstance(assembler, Assembler):
self.assembler = assembler
else:
LOGGER.error("'assembler' must be an instance of Assembler")
return None
return self
[docs] def run(self, mode=RunMode.PREDICT):
"""
Prepare data and execute the :class:`surround.assembler.Assembler`.
:param is_training: Run the pipeline in training mode or not
:type is_training: bool
"""
if self.assembler:
# Initialise the assembler
self.assembler.init_assembler()
# Load the data to be fed into the assembler
data = self.load_data(mode, self.assembler.config)
if not isinstance(data, State):
raise ValueError("load_data must return an instance of State!")
# Run assembler
self.assembler.run(data, mode)
else:
LOGGER.error("No assembler has been set to this runner!")