itrainer.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # -*- coding: utf-8 -*-
  2. """
  3. Abstrakte Basisklasse fuer alle Trixy-Trainer.
  4. Trainer laufen als isolierter Subprocess und sind
  5. unabhaengig vom Event-Loop der Hauptanwendung.
  6. """
  7. from abc import ABC, abstractmethod
  8. from multiprocessing import Queue, Event as MPEvent
  9. from trixy_core.trainer.dataclasses import (
  10. TrainerInfo,
  11. TrainingProgress,
  12. ValidationResult,
  13. FormSchema,
  14. )
  15. class ITrainer(ABC):
  16. """
  17. Abstrakte Basisklasse fuer ML-Trainer.
  18. Jeder Trainer implementiert Schema-Methoden fuer die TUI
  19. und die eigentliche Trainingslogik.
  20. """
  21. @abstractmethod
  22. def get_info(self) -> TrainerInfo:
  23. """Liefert Metadaten des Trainers."""
  24. @abstractmethod
  25. def get_settings_schema(self) -> FormSchema:
  26. """Liefert das Formular-Schema fuer Trainings-Einstellungen."""
  27. @abstractmethod
  28. def get_dataset_schema(self) -> FormSchema:
  29. """Liefert das Formular-Schema fuer Dataset-Konfiguration."""
  30. def get_optional_schema(self) -> FormSchema | None:
  31. """Liefert optionales Schema (None = Tab ausblenden)."""
  32. return None
  33. @abstractmethod
  34. def get_settings(self) -> dict:
  35. """Liefert die aktuellen Einstellungswerte."""
  36. @abstractmethod
  37. def set_settings(self, settings: dict) -> None:
  38. """Setzt Einstellungswerte aus dem Formular."""
  39. @abstractmethod
  40. def get_dataset_info(self) -> dict:
  41. """Liefert aktuelle Dataset-Informationen."""
  42. def set_dataset_config(self, config: dict) -> None:
  43. """Setzt Dataset-Konfiguration aus dem Formular."""
  44. pass
  45. @abstractmethod
  46. def validate(self) -> ValidationResult:
  47. """Validiert Einstellungen und Dataset vor dem Training."""
  48. @abstractmethod
  49. def train(
  50. self,
  51. progress_queue: Queue,
  52. pause_flag: MPEvent,
  53. stop_flag: MPEvent,
  54. ) -> None:
  55. """
  56. Fuehrt das Training durch (laeuft im Subprocess).
  57. Args:
  58. progress_queue: Queue fuer TrainingProgress-Updates
  59. pause_flag: Gesetzt wenn Training pausiert werden soll
  60. stop_flag: Gesetzt wenn Training gestoppt werden soll
  61. """
  62. def pause(self) -> None:
  63. """Zusaetzliche Pause-Logik (optional)."""
  64. pass
  65. def resume(self) -> None:
  66. """Zusaetzliche Resume-Logik (optional)."""
  67. pass
  68. def stop(self) -> None:
  69. """Zusaetzliche Stop-Logik (optional)."""
  70. pass
  71. def execute_action(self, action: str, params: dict) -> dict:
  72. """
  73. Fuehrt eine benannte Aktion aus (z.B. TTS-Datengenerierung).
  74. Args:
  75. action: Name der Aktion
  76. params: Parameter fuer die Aktion
  77. Returns:
  78. dict mit "success" (bool), "message" (str), optionalen Daten
  79. """
  80. return {"success": False, "message": f"Aktion '{action}' nicht unterstuetzt"}