Source code for quantum_mind.evaluation.manifest
"""Reproducibility metadata for experiments."""
from __future__ import annotations
import hashlib
import json
import platform
from datetime import datetime, timezone
from pathlib import Path
from .. import __version__
[docs]
def sha256_file(path):
"""Return the SHA-256 digest of a dataset or result file."""
digest = hashlib.sha256()
with Path(path).open("rb") as handle:
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
[docs]
def create_manifest(experiment, dataset, models, metrics, seed, split=None,
dataset_version=None, dataset_hash=None, data_source=None,
model_provenance=None, parameters=None, notes=None):
"""Create a JSON-serialisable reproducibility manifest."""
if not experiment or not dataset:
raise ValueError("experiment and dataset are required")
if not models or not metrics:
raise ValueError("models and metrics must not be empty")
return {
"schema_version": "1.0", "experiment": str(experiment),
"dataset": str(dataset), "dataset_version": dataset_version,
"dataset_hash": dataset_hash, "data_source": data_source,
"models": [str(x) for x in models], "model_provenance": model_provenance,
"metrics": [str(x) for x in metrics], "split": split, "seed": int(seed),
"parameters": parameters or {}, "quantum_mind_version": __version__,
"python": platform.python_version(), "platform": platform.platform(),
"created_utc": datetime.now(timezone.utc).isoformat(), "notes": notes,
}
[docs]
def write_manifest(manifest, path):
"""Write a manifest as formatted JSON and return its path."""
output = Path(path)
output.parent.mkdir(parents=True, exist_ok=True)
output.write_text(json.dumps(manifest, indent=2, sort_keys=True) + "\n")
return output