Implemented the next 4h-plan phase: dual-run support + explicit cutover gate.
This commit is contained in:
@@ -16,6 +16,8 @@ def parse_args() -> argparse.Namespace:
|
||||
|
||||
def load_json(path: str) -> dict[str, Any]:
|
||||
p = Path(path)
|
||||
if not p.exists():
|
||||
raise FileNotFoundError(path)
|
||||
with p.open("r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
|
||||
@@ -42,8 +44,25 @@ def delta_str(base: float | None, cand: float | None) -> str:
|
||||
|
||||
def main() -> int:
|
||||
args = parse_args()
|
||||
baseline = load_json(args.baseline)
|
||||
candidate = load_json(args.candidate)
|
||||
try:
|
||||
baseline = load_json(args.baseline)
|
||||
except FileNotFoundError:
|
||||
print(f"error: baseline report not found: {args.baseline}")
|
||||
model_dir = Path("models")
|
||||
if model_dir.exists():
|
||||
candidates = sorted(model_dir.glob("rain_model_report*.json"))
|
||||
if candidates:
|
||||
print("available report files:")
|
||||
for c in candidates:
|
||||
print(f" - {c}")
|
||||
print("hint: provide an existing 1h report path, or train a new 1h report first.")
|
||||
return 2
|
||||
|
||||
try:
|
||||
candidate = load_json(args.candidate)
|
||||
except FileNotFoundError:
|
||||
print(f"error: candidate report not found: {args.candidate}")
|
||||
return 2
|
||||
|
||||
pairs = [
|
||||
("precision", metric(baseline, "test_metrics", "precision"), metric(candidate, "test_metrics", "precision")),
|
||||
|
||||
Reference in New Issue
Block a user