#!/usr/bin/env python3 """Generate ground truth files (ground_truth.json, .npy) for all tasks. Usage: python scripts/generate_ground_truth.py python scripts/generate_ground_truth.py --task task_001_flat_plate """ import argparse import json import sys import time from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) TASKS_ROOT = Path(__file__).parent.parent / "server" / "tasks" def generate_one(task_dir: Path) -> dict: task_id = task_dir.name t0 = time.time() result = { "task_id": task_id, "success": False, "error": None, } try: from server.preprocessor import preprocess_from_code ref_code = (task_dir / "reference_code.py").read_text() gt = preprocess_from_code(ref_code, str(task_dir), task_id=task_id) result["success"] = True result["volume"] = gt.get("volume_mm3") result["bbox"] = gt.get("bbox_mm") result["euler"] = gt.get("euler_characteristic") result["dominant_face_type"] = gt.get("dominant_face_type") result["face_count"] = gt.get("face_count") except Exception as e: import traceback result["error"] = f"{type(e).__name__}: {e}" result["traceback"] = traceback.format_exc() result["elapsed_s"] = round(time.time() - t0, 2) return result def main(): parser = argparse.ArgumentParser(description="Generate ground truth for CadForge tasks") parser.add_argument("--task", type=str, default=None, help="Specific task id") args = parser.parse_args() if args.task: task_dirs = [TASKS_ROOT / args.task] else: task_dirs = sorted(TASKS_ROOT.glob("task_*")) print(f"Generating ground truth for {len(task_dirs)} tasks...") print("-" * 80) results = [] for task_dir in task_dirs: r = generate_one(task_dir) status = "OK" if r["success"] else "FAIL" print( f" {r['task_id']:35s} {status:5s} " f"vol={r.get('volume', 'N/A')} " f"euler={r.get('euler', 'N/A')} " f"faces={r.get('face_count', 'N/A')} " f"({r['elapsed_s']:.1f}s)" ) if r["error"]: print(f" ERROR: {r['error']}") results.append(r) passed = sum(1 for r in results if r["success"]) print("-" * 80) print(f"Result: {passed}/{len(results)} generated successfully") out_path = TASKS_ROOT.parent / "verification_ground_truth.json" with open(out_path, "w") as f: json.dump(results, f, indent=2) print(f"Saved to {out_path}") return 0 if passed == len(results) else 1 if __name__ == "__main__": sys.exit(main())