37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from dataclasses import dataclass
|
|
from typing import Sequence
|
|
|
|
from app.ml.feature_store import FeatureVector, FeatureStore
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@dataclass
|
|
class TrainedArtifact:
|
|
artifact_id: str
|
|
supported_sensors: tuple[str, ...]
|
|
|
|
|
|
class TrainingPipeline:
|
|
def __init__(self, store: FeatureStore) -> None:
|
|
self._store = store
|
|
self._artifacts: dict[str, TrainedArtifact] = {}
|
|
|
|
def run(self, artifact_id: str) -> TrainedArtifact:
|
|
vectors = self._store.all()
|
|
if not vectors:
|
|
raise ValueError("FeatureStore enthält keine Trainingsdaten.")
|
|
|
|
sensors = tuple(sorted({vector.sensor_id for vector in vectors}))
|
|
artifact = TrainedArtifact(artifact_id=artifact_id, supported_sensors=sensors)
|
|
self._artifacts[artifact_id] = artifact
|
|
logger.info("Training abgeschlossen für %s mit %d Sensoren", artifact_id, len(sensors))
|
|
return artifact
|
|
|
|
def export(self, artifact_id: str) -> TrainedArtifact:
|
|
if artifact_id not in self._artifacts:
|
|
raise KeyError(f"Artifact '{artifact_id}' nicht gefunden.")
|
|
return self._artifacts[artifact_id] |