30 lines
1.1 KiB
Python
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()))
|