idea141-openimpact-privacy-.../src/openimpact/pipeline.py

30 lines
1.1 KiB
Python

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()))