#!/usr/bin/env python """Generate a labeled sample batch covering all 12 verification test-case types. For each ``case_type`` in ``src.verification.case_types.CASE_TABLE`` (1a through 5b), generates a couple of samples via ``GeneratorContext`` directly (bypassing ``DatasetGenerator`` since each case needs its own config override), writes the rendered PNGs + metadata JSONs to ``output/verification_suite/``, and prints a verdict/reject_code summary table. Usage: python scripts/generate_verification_suite.py [--per-case N] """ from __future__ import annotations import argparse import json import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from src.config.loader import load_config from src.generator import GeneratorContext from src.metadata.metadata_exporter import MetadataExporter from src.utils.image_io import save_image_rgb from src.verification.case_types import CASE_TABLE ROOT = Path(__file__).resolve().parents[1] OUT_DIR = ROOT / "output" / "verification_suite" def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--per-case", type=int, default=2, help="Samples to generate per case type.") parser.add_argument("--seed", type=int, default=4242, help="Master seed.") args = parser.parse_args() OUT_DIR.mkdir(parents=True, exist_ok=True) exporter = MetadataExporter() summary_rows = [] sample_index = 1 for code in CASE_TABLE: config = load_config( config_path=str(ROOT / "configs" / "examples" / "verification_cases.yaml"), overrides=[f"quality.case_type={code}", f"seed={args.seed}"], ) ctx = GeneratorContext(config) for _ in range(args.per_case): sample_id = f"case_{sample_index:03d}" metadata, final_image, _ = ctx.run_sample(sample_index) metadata["document_id"] = sample_id save_image_rgb(OUT_DIR / f"{sample_id}.png", final_image) exporter.export(metadata, OUT_DIR / f"{sample_id}.json") v = metadata["verification"] summary_rows.append({ "sample_id": sample_id, "case_type": code, "template": metadata["template"], "box_id": v["target_box_id"], "verdict": v["verdict"], "reject_code": v["reject_code"], }) print(f"[{sample_id}] case_type={code:<3} template={metadata['template']:<12} " f"box={v['target_box_id']:<5} -> {v['verdict']:<7} {v['reject_code'] or '-'}") sample_index += 1 (OUT_DIR / "summary.json").write_text(json.dumps(summary_rows, indent=2), encoding="utf-8") print(f"\nWrote {len(summary_rows)} samples to {OUT_DIR}") if __name__ == "__main__": main()