cadforge / scripts /generate_ground_truth.py
eventhorizon28's picture
Upload folder using huggingface_hub
7c72eb2 verified
#!/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())