You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
2.4 KiB
33 lines
2.4 KiB
"""Background Phase 10 operation controller."""
|
|
from __future__ import annotations
|
|
import threading
|
|
from pathlib import Path
|
|
from typing import Callable
|
|
from ..config_loader import load_config
|
|
from ..phase10_cli import generate_protocol,run_pilot_report,run_presentation,run_quality
|
|
from ..phase11_cli import run_diagnostics
|
|
from ..phase12_cli import assets,final_report,progress,snapshot,workflow
|
|
class OperationsController:
|
|
def __init__(self)->None:self._thread:threading.Thread|None=None;self._finished:Callable[[list[Path]],None]|None=None;self._error:Callable[[str],None]|None=None
|
|
def run(self,operation:str,config_path:Path,logs:Path,analysis:Path,output:Path)->None:
|
|
if self._thread and self._thread.is_alive():raise RuntimeError("An operation is already running")
|
|
self._thread=threading.Thread(target=self._worker,args=(operation,config_path,logs,analysis,output),daemon=True,name="phase10-worker");self._thread.start()
|
|
def _worker(self,operation:str,config_path:Path,logs:Path,analysis:Path,output:Path)->None:
|
|
try:
|
|
c=load_config("config/default.yaml",config_path)
|
|
if operation=="main-progress":paths=progress(c,logs,analysis,output)
|
|
elif operation=="snapshot":paths=snapshot(c,config_path,output)
|
|
elif operation=="final-report":paths=final_report(c,analysis,output)
|
|
elif operation=="presentation-assets":paths=assets(c,analysis,output)
|
|
elif operation=="final-analysis":
|
|
result=workflow(c,logs,analysis,output);paths=[Path(x) for x in result.output_files]+[output/"final_workflow_result.json"]
|
|
elif operation=="diagnostics":paths=run_diagnostics(c,analysis,logs,output)
|
|
elif operation=="quality":paths=run_quality(c,logs,analysis,output)
|
|
elif operation=="pilot":paths=[run_pilot_report(c,analysis,output/"pilot_report.md",logs)]
|
|
elif operation=="presentation":paths=[run_presentation(c,analysis,output/"midterm_summary.md",logs)]
|
|
else:paths=generate_protocol(c,output/"experiment_protocol.md",output/"experiment_protocol.yaml")
|
|
if self._finished:self._finished(paths)
|
|
except Exception as exc:
|
|
if self._error:self._error(str(exc))
|
|
def set_finished_callback(self,callback:Callable[[list[Path]],None])->None:self._finished=callback
|
|
def set_error_callback(self,callback:Callable[[str],None])->None:self._error=callback
|
|
|