Source code for learning_machine.engine.engine
from __future__ import annotations
from typing import Generic, TypeVar
from abc import ABC, abstractmethod
from learning_machine.zoo import DATA_ENGINE_ZOO
[docs]
def create_engines_from_config(config: list[dict]) -> list[DataEngine]:
"""Create engines from engine config list.
Args:
config (list[dict]): engines config
Returns:
list[DataEngine]: engines
"""
engines = []
for e in config:
engine_name = next(iter(e))
args = e[engine_name]
engine = DATA_ENGINE_ZOO.get(engine_name)
engine_ins = engine.from_config(args)
engines.append(engine_ins)
return engines
T = TypeVar("T")
U = TypeVar("U")
[docs]
class DataEngine(ABC, Generic[T, U]):
"""Data engine interface."""
engine_type = []
@abstractmethod
def __call__(self, data: T) -> U:
"""Process data
Args:
data (T)
Returns:
U: processed data
"""
pass
@classmethod
def from_config(cls, config: dict) -> DataEngine:
"""Create engine from config.
Args:
config (dict): engine configuration information
Returns:
DataEngine: data engine
"""
return cls(**config)
[docs]
@DATA_ENGINE_ZOO.regist()
class SequentialEngine(DataEngine, Generic[T, U]):
"""Apply engines sequentially.
data -> engine1 -> data1 -> engine2 -> data2
"""
[docs]
def __init__(self, engines: list[DataEngine]):
"""
Args:
engines (list[DataEngine]): engines
"""
super().__init__()
self.engines = engines
def __call__(self, data: T) -> U:
for engine in self.engines:
data = engine(data)
return data # type: ignore