from __future__ import annotations from dataclasses import dataclass from pathlib import Path from .evaluation import EvaluationMetrics, evaluate_federated_setup from .federated import FederatedTrainer from .ledger import GovernanceLedger from .synthetic import SyntheticMarket @dataclass(frozen=True) class PipelineReport: metrics: EvaluationMetrics aggregate_checksum: str ledger_rows: int class OpenImpactPlatform: def __init__(self, ledger_path: str | Path = "openimpact-ledger.sqlite3", seed: int = 7): self.ledger = GovernanceLedger(ledger_path) self.trainer = FederatedTrainer(seed=seed) def run(self, market: SyntheticMarket) -> PipelineReport: metrics, _, _ = evaluate_federated_setup(market, self.trainer) result = self.trainer.fit(market.batches) for round_id, update in enumerate(result.updates, start=1): self.ledger.record_update(round_id=round_id, model_version="v1", update=update) return PipelineReport(metrics=metrics, aggregate_checksum=result.aggregate_checksum, ledger_rows=len(self.ledger.list_entries()))