refactor: add DesignIR distillation pipeline

This commit is contained in:
Jerry
2026-07-27 17:24:04 +08:00
parent 0adaac2b2a
commit 550b339bcc
1128 changed files with 10248 additions and 426666 deletions
@@ -1,27 +0,0 @@
{
"name": "cad-experience-plugin",
"version": "0.1.0+codex.20260723115752",
"description": "Parse STEP inboxes and use the active model plus deterministic evidence checks to distill backend-neutral CAD reconstruction grammar and experience.",
"author": {
"name": "Local developer"
},
"skills": "./skills/",
"interface": {
"displayName": "CAD Experience",
"shortDescription": "Distill reusable CAD reconstruction grammar.",
"longDescription": "CAD Experience maintains a visible STEP input/output staging area, gives the active large model sanitized symbolic parameters, datums, canonical stages, constraints, and validation evidence, verifies every proposal against the accumulated corpus, and promotes only repeatedly supported backend-neutral reconstruction grammar and experience.",
"developerName": "Local developer",
"category": "Productivity",
"capabilities": [
"STEP inbox batch extraction",
"Visible private case JSON",
"Batch CAD experience induction",
"Large-model semantic review",
"Deterministic proposal evidence verification",
"Family-level symbolic reconstruction grammar",
"Generalized experience queries",
"Instance-data leakage audits"
],
"defaultPrompt": "Parse the STEP input folder, distill symbolic family-level reconstruction grammar from the output JSON, and report promoted generalized CAD experience without exposing source-part geometry."
}
}
@@ -1,100 +0,0 @@
[
{
"id": "136930",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/136930/136930.step\"}",
"error": ""
},
{
"id": "138022",
"variant": "baseline",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "138022",
"variant": "experience",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "136930",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/136930/136930.step\"}",
"error": ""
},
{
"id": "134828",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/134828/134828.step\"}",
"error": ""
},
{
"id": "116166",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/116166/116166.step\"}",
"error": ""
},
{
"id": "134828",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/134828/134828.step\"}",
"error": ""
},
{
"id": "145574",
"variant": "baseline",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "145574",
"variant": "experience",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "150196",
"variant": "baseline",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "150196",
"variant": "experience",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "150587",
"variant": "experience",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "150587",
"variant": "baseline",
"returncode": -9,
"output": "",
"error": ""
},
{
"id": "116166",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/116166/116166.step\"}",
"error": ""
}
]
@@ -1,212 +0,0 @@
[
{
"id": "000166",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"skipped\", \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/000166/000166.step\"}",
"error": ""
},
{
"id": "011680",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"skipped\", \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/011680/011680.step\"}",
"error": ""
},
{
"id": "000166",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/000166/000166.step\"}",
"error": ""
},
{
"id": "011680",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/011680/011680.step\"}",
"error": ""
},
{
"id": "016033",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/016033/016033.step\"}",
"error": ""
},
{
"id": "016033",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/016033/016033.step\"}",
"error": ""
},
{
"id": "004764",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/004764/004764.step\"}",
"error": ""
},
{
"id": "020543",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/020543/020543.step\"}",
"error": ""
},
{
"id": "024675",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/024675/024675.step\"}",
"error": ""
},
{
"id": "004764",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/004764/004764.step\"}",
"error": ""
},
{
"id": "029190",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/029190/029190.step\"}",
"error": ""
},
{
"id": "024675",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/024675/024675.step\"}",
"error": ""
},
{
"id": "020543",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/020543/020543.step\"}",
"error": ""
},
{
"id": "029190",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/029190/029190.step\"}",
"error": ""
},
{
"id": "030352",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/030352/030352.step\"}",
"error": ""
},
{
"id": "046014",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/046014/046014.step\"}",
"error": ""
},
{
"id": "046014",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/046014/046014.step\"}",
"error": ""
},
{
"id": "030352",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/030352/030352.step\"}",
"error": ""
},
{
"id": "047048",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/047048/047048.step\"}",
"error": ""
},
{
"id": "048346",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/048346/048346.step\"}",
"error": ""
},
{
"id": "048346",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/048346/048346.step\"}",
"error": ""
},
{
"id": "047048",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/047048/047048.step\"}",
"error": ""
},
{
"id": "053664",
"variant": "experience",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/053664/053664.step\"}",
"error": ""
},
{
"id": "065487",
"variant": "experience",
"returncode": 1,
"output": "{\"status\": \"failed\", \"returncode\": 1, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/065487/065487.step\"}",
"error": ""
},
{
"id": "067186",
"variant": "baseline",
"returncode": 1,
"output": "{\"status\": \"failed\", \"returncode\": 1, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/067186/067186.step\"}",
"error": ""
},
{
"id": "053664",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/053664/053664.step\"}",
"error": ""
},
{
"id": "067186",
"variant": "experience",
"returncode": 1,
"output": "{\"status\": \"failed\", \"returncode\": 1, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/067186/067186.step\"}",
"error": ""
},
{
"id": "073706",
"variant": "baseline",
"returncode": 1,
"output": "{\"status\": \"failed\", \"returncode\": 1, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/073706/073706.step\"}",
"error": ""
},
{
"id": "073706",
"variant": "experience",
"returncode": 1,
"output": "{\"status\": \"failed\", \"returncode\": 1, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/073706/073706.step\"}",
"error": ""
},
{
"id": "065487",
"variant": "baseline",
"returncode": 0,
"output": "{\"status\": \"ok\", \"returncode\": 0, \"output\": \"/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/065487/065487.step\"}",
"error": ""
}
]
@@ -1,28 +0,0 @@
{
"schema_version": "2.0",
"library_kind": "generalized_cad_experience",
"generated_at": "2026-07-23T09:46:25+00:00",
"status": "empty",
"policy": {
"instance_parameters_allowed": false,
"absolute_coordinates_allowed": false,
"single_case_promotion_allowed": false,
"minimum_support": 20,
"minimum_confidence": 0.8
},
"corpus_summary": {
"accepted_case_count": 0,
"duplicate_case_count": 0,
"rejected_case_count": 0,
"family_count": 0
},
"experience_summary": {
"promoted_experience_count": 0,
"candidate_experience_count": 0,
"by_kind": [],
"by_scope": [],
"candidate_by_kind": []
},
"experiences": [],
"candidate_experiences": []
}
@@ -1,308 +0,0 @@
#!/usr/bin/env python3
"""Evaluate blind baseline/experience STEP reconstructions against held-out STEP."""
from __future__ import annotations
import argparse
import csv
import importlib.util
import itertools
import json
import math
from pathlib import Path
from typing import Any
import numpy as np
from build123d import import_step
from scipy.spatial import cKDTree
HERE = Path(__file__).resolve().parent
EXTRACTOR = (
HERE.parents[1]
/ "skills/cad-experience-builder/scripts/step_to_case.py"
)
def load_extractor():
spec = importlib.util.spec_from_file_location("ab50_step_to_case", EXTRACTOR)
module = importlib.util.module_from_spec(spec)
assert spec and spec.loader
spec.loader.exec_module(module)
return module
EXTRACT = load_extractor()
def rel_error(actual: float, expected: float) -> float:
return abs(actual - expected) / max(abs(expected), 1e-9)
def feature_names(payload: dict[str, Any]) -> set[str]:
result: set[str] = set()
for item in payload.get("design_ir", {}).get("features", []):
if isinstance(item, str):
result.add(item)
elif isinstance(item, dict):
name = item.get("kind") or item.get("type") or item.get("name")
if name:
result.add(str(name))
return result
def f1_score(left: set[str], right: set[str]) -> float:
if not left and not right:
return 1.0
if not left or not right:
return 0.0
overlap = len(left & right)
precision = overlap / len(right)
recall = overlap / len(left)
return 2 * precision * recall / max(precision + recall, 1e-9)
def mesh(shape, tolerance: float = 0.35) -> tuple[np.ndarray, np.ndarray]:
vertices, triangles = shape.tessellate(tolerance)
points = np.asarray([[v.X, v.Y, v.Z] for v in vertices], dtype=float)
faces = np.asarray(triangles, dtype=int)
return points, faces
def sample_surface(
vertices: np.ndarray, faces: np.ndarray, count: int, seed: int
) -> np.ndarray:
tri = vertices[faces]
cross = np.cross(tri[:, 1] - tri[:, 0], tri[:, 2] - tri[:, 0])
areas = np.linalg.norm(cross, axis=1) / 2.0
total = float(areas.sum())
if total <= 1e-12:
return vertices.copy()
rng = np.random.default_rng(seed)
chosen = rng.choice(len(faces), size=count, p=areas / total)
selected = tri[chosen]
u = rng.random(count)
v = rng.random(count)
reflected = u + v > 1.0
u[reflected] = 1.0 - u[reflected]
v[reflected] = 1.0 - v[reflected]
return (
selected[:, 0]
+ u[:, None] * (selected[:, 1] - selected[:, 0])
+ v[:, None] * (selected[:, 2] - selected[:, 0])
)
def cube_transforms() -> list[np.ndarray]:
transforms = []
for permutation in itertools.permutations(range(3)):
base = np.eye(3)[:, permutation]
for signs in itertools.product((-1.0, 1.0), repeat=3):
transforms.append(base @ np.diag(signs))
return transforms
TRANSFORMS = cube_transforms()
def surface_distance(
reference, generated, seed: int, samples: int
) -> tuple[float, float]:
ref_v, ref_f = mesh(reference)
gen_v, gen_f = mesh(generated)
ref = sample_surface(ref_v, ref_f, samples, seed)
gen = sample_surface(gen_v, gen_f, samples, seed + 1)
ref -= (ref.min(axis=0) + ref.max(axis=0)) / 2.0
gen -= (gen.min(axis=0) + gen.max(axis=0)) / 2.0
ref_tree = cKDTree(ref)
best_chamfer = math.inf
best_hausdorff = math.inf
for transform in TRANSFORMS:
candidate = gen @ transform
gen_tree = cKDTree(candidate)
d_gr = ref_tree.query(candidate, workers=-1)[0]
d_rg = gen_tree.query(ref, workers=-1)[0]
chamfer = float((d_gr.mean() + d_rg.mean()) / 2.0)
hausdorff = float(max(np.quantile(d_gr, 0.95), np.quantile(d_rg, 0.95)))
if chamfer < best_chamfer:
best_chamfer = chamfer
best_hausdorff = hausdorff
diagonal = max(float(np.linalg.norm(np.ptp(ref, axis=0))), 1e-9)
return best_chamfer / diagonal, best_hausdorff / diagonal
def task_experience(step_path: Path) -> tuple[int, int]:
task = step_path.parent / "cad-task.json"
if not task.is_file():
return 0, 0
payload = json.loads(task.read_text())
exp = payload.get("experience", {})
returned = exp.get("methods_returned")
if returned is None:
returned = len(exp.get("methods", exp.get("methods_applied", [])))
if isinstance(returned, list):
returned = len(returned)
return int(returned or 0), len(exp.get("methods_applied", []))
def evaluate_one(
case: dict[str, Any], variant: str, samples: int
) -> dict[str, Any]:
generated_path = Path(case[f"{variant}_step"])
row: dict[str, Any] = {
"id": case["id"],
"family": case["family"],
"variant": variant,
"generated": generated_path.is_file(),
}
if not generated_path.is_file():
row["error"] = "missing STEP"
return row
try:
reference = import_step(case["reference_step"])
generated = import_step(str(generated_path))
ref_case = json.loads(Path(case["case_json"]).read_text())
gen_case = EXTRACT.extract_step_case(generated_path)
ref_bbox = sorted(float(v) for v in reference.bounding_box().size)
gen_bbox = sorted(float(v) for v in generated.bounding_box().size)
bbox_error = float(
np.mean([rel_error(a, b) for a, b in zip(gen_bbox, ref_bbox)])
)
volume_error = rel_error(float(generated.volume), float(reference.volume))
area_error = rel_error(float(generated.area), float(reference.area))
face_error = rel_error(len(generated.faces()), len(reference.faces()))
edge_error = rel_error(len(generated.edges()), len(reference.edges()))
chamfer, hausdorff95 = surface_distance(
reference, generated, int(case["id"]), samples
)
feature_f1 = f1_score(feature_names(ref_case), feature_names(gen_case))
family_match = float(
ref_case["design_ir"]["part_family"]
== gen_case["design_ir"]["part_family"]
)
returned, applied = task_experience(generated_path)
# Transparent 0–100 similarity index. It is a benchmark summary, not a
# claim of manufacturing interchangeability or exact B-rep identity.
score = 100.0 * (
0.18 * math.exp(-volume_error)
+ 0.12 * math.exp(-area_error)
+ 0.16 * math.exp(-bbox_error)
+ 0.24 * math.exp(-8.0 * chamfer)
+ 0.10 * math.exp(-(face_error + edge_error) / 2.0)
+ 0.15 * feature_f1
+ 0.05 * family_match
)
row.update(
{
"valid": bool(generated.is_valid),
"solid_count": len(generated.solids()),
"reference_volume": float(reference.volume),
"generated_volume": float(generated.volume),
"volume_rel_error": volume_error,
"surface_area_rel_error": area_error,
"bbox_mape": bbox_error,
"face_rel_error": face_error,
"edge_rel_error": edge_error,
"surface_chamfer_norm": chamfer,
"surface_hausdorff95_norm": hausdorff95,
"feature_f1": feature_f1,
"family_match": family_match,
"experience_methods_returned": returned,
"experience_methods_applied": applied,
"similarity_score": score,
}
)
except Exception as exc:
row["error"] = f"{type(exc).__name__}: {exc}"
return row
def mean(rows: list[dict[str, Any]], key: str) -> float:
values = [float(row[key]) for row in rows if key in row]
return sum(values) / len(values) if values else math.nan
def write_report(rows: list[dict[str, Any]]) -> None:
complete = [row for row in rows if "similarity_score" in row]
baseline = [row for row in complete if row["variant"] == "baseline"]
experience = [row for row in complete if row["variant"] == "experience"]
by_id = {}
for row in complete:
by_id.setdefault(row["id"], {})[row["variant"]] = row
pairs = [
item for item in by_id.values() if {"baseline", "experience"} <= item.keys()
]
paired_baseline = [item["baseline"] for item in pairs]
paired_experience = [item["experience"] for item in pairs]
deltas = [
item["experience"]["similarity_score"]
- item["baseline"]["similarity_score"]
for item in pairs
]
wins = sum(delta > 0.25 for delta in deltas)
ties = sum(abs(delta) <= 0.25 for delta in deltas)
losses = sum(delta < -0.25 for delta in deltas)
methods_returned = sum(
row.get("experience_methods_returned", 0) for row in experience
)
methods_applied = sum(
row.get("experience_methods_applied", 0) for row in experience
)
report = f"""# CAD 经验库 50 件 A/B 盲重建报告
## 口径
- 测试集:固定分层抽取 50 件;这 50 件不进入经验库。
- 训练经验:其余 950 件生成的通用经验库。
- 两组输入完全相同:仅多视图图片和文字描述;生成过程禁止读取参考 STEP 和解析 JSON。
- Baseline:空经验库;Experience:950 件经验库。
- 参考 STEP 只在生成完成后用于评分。
- “相似度”是体积、面积、包围盒、表面距离、拓扑和语义特征的综合诊断分,不代表制造级 1:1 或可互换性。
## 当前完成度
- 有效 Baseline:{len(baseline)}/50
- 有效 Experience:{len(experience)}/50
- 完整配对:{len(pairs)}/50
- 经验方法返回/实际采用:{methods_returned}/{methods_applied}
## 汇总
| 指标 | 无经验 | 有经验 | 差值 |
|---|---:|---:|---:|
| 综合相似度(0–100,越高越好) | {mean(paired_baseline, "similarity_score"):.2f} | {mean(paired_experience, "similarity_score"):.2f} | {mean(paired_experience, "similarity_score") - mean(paired_baseline, "similarity_score"):+.2f} |
| 体积相对误差(越低越好) | {mean(paired_baseline, "volume_rel_error"):.3f} | {mean(paired_experience, "volume_rel_error"):.3f} | {mean(paired_experience, "volume_rel_error") - mean(paired_baseline, "volume_rel_error"):+.3f} |
| 表面积相对误差 | {mean(paired_baseline, "surface_area_rel_error"):.3f} | {mean(paired_experience, "surface_area_rel_error"):.3f} | {mean(paired_experience, "surface_area_rel_error") - mean(paired_baseline, "surface_area_rel_error"):+.3f} |
| 包围盒尺寸 MAPE | {mean(paired_baseline, "bbox_mape"):.3f} | {mean(paired_experience, "bbox_mape"):.3f} | {mean(paired_experience, "bbox_mape") - mean(paired_baseline, "bbox_mape"):+.3f} |
| 归一化表面 Chamfer | {mean(paired_baseline, "surface_chamfer_norm"):.4f} | {mean(paired_experience, "surface_chamfer_norm"):.4f} | {mean(paired_experience, "surface_chamfer_norm") - mean(paired_baseline, "surface_chamfer_norm"):+.4f} |
| 特征 F1 | {mean(paired_baseline, "feature_f1"):.3f} | {mean(paired_experience, "feature_f1"):.3f} | {mean(paired_experience, "feature_f1") - mean(paired_baseline, "feature_f1"):+.3f} |
经验组胜/平/负(±0.25 分视为平):**{wins}/{ties}/{losses}**。
"""
(HERE / "report.md").write_text(report)
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--samples", type=int, default=1600)
args = parser.parse_args()
manifest = json.loads((HERE / "manifest.json").read_text())
rows = [
evaluate_one(case, variant, args.samples)
for case in manifest["cases"]
for variant in ("baseline", "experience")
]
(HERE / "metrics.json").write_text(
json.dumps(rows, indent=2, ensure_ascii=False) + "\n"
)
keys = sorted({key for row in rows for key in row})
with (HERE / "metrics.csv").open("w", newline="") as stream:
writer = csv.DictWriter(stream, fieldnames=keys)
writer.writeheader()
writer.writerows(rows)
write_report(rows)
completed = sum("similarity_score" in row for row in rows)
print(json.dumps({"evaluated": completed, "expected": 100}))
if __name__ == "__main__":
main()
@@ -1,708 +0,0 @@
{
"schema_version": "1.0",
"selection_seed": 20260723,
"holdout_count": 50,
"train_count": 950,
"cases": [
{
"id": "000166",
"family": "general_mechanical_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/000166.3fe709d953c5.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/000166.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/000166.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/000166.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/000166/000166.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/000166/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/000166/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/000166/000166.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/000166/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/000166/final.txt"
},
{
"id": "004764",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/004764.6e3a06d88adc.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/004764.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/004764.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/004764.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/004764/004764.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/004764/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/004764/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/004764/004764.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/004764/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/004764/final.txt"
},
{
"id": "011680",
"family": "plate_or_bracket",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/011680.77a85afd0f4b.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/011680.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/011680.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/011680.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/011680/011680.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/011680/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/011680/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/011680/011680.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/011680/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/011680/final.txt"
},
{
"id": "016033",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/016033.500e53f944a6.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/016033.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/016033.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/016033.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/016033/016033.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/016033/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/016033/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/016033/016033.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/016033/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/016033/final.txt"
},
{
"id": "020543",
"family": "flanged_rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/020543.0ad8f7e7459d.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/020543.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/020543.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/020543.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/020543/020543.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/020543/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/020543/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/020543/020543.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/020543/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/020543/final.txt"
},
{
"id": "024675",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/024675.2d1f84f175f5.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/024675.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/024675.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/024675.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/024675/024675.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/024675/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/024675/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/024675/024675.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/024675/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/024675/final.txt"
},
{
"id": "029190",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/029190.825d4001dea3.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/029190.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/029190.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/029190.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/029190/029190.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/029190/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/029190/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/029190/029190.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/029190/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/029190/final.txt"
},
{
"id": "030352",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/030352.45db9222299d.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/030352.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/030352.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/030352.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/030352/030352.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/030352/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/030352/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/030352/030352.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/030352/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/030352/final.txt"
},
{
"id": "046014",
"family": "flanged_rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/046014.4abae0d1a5a1.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/046014.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/046014.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/046014.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/046014/046014.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/046014/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/046014/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/046014/046014.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/046014/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/046014/final.txt"
},
{
"id": "047048",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/047048.b5119254bc4b.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/047048.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/047048.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/047048.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/047048/047048.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/047048/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/047048/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/047048/047048.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/047048/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/047048/final.txt"
},
{
"id": "048346",
"family": "hollow_or_stepped_shaft",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/048346.ba3e1b245d0e.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/048346.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/048346.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/048346.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/048346/048346.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/048346/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/048346/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/048346/048346.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/048346/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/048346/final.txt"
},
{
"id": "053664",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/053664.90a0635aadaf.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/053664.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/053664.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/053664.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/053664/053664.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/053664/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/053664/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/053664/053664.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/053664/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/053664/final.txt"
},
{
"id": "063487",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/063487.b524dcfc1124.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/063487.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/063487.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/063487.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/063487/063487.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/063487/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/063487/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/063487/063487.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/063487/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/063487/final.txt"
},
{
"id": "065487",
"family": "flanged_rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/065487.444ad775ec5c.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/065487.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/065487.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/065487.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/065487/065487.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/065487/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/065487/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/065487/065487.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/065487/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/065487/final.txt"
},
{
"id": "067186",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/067186.0fe747589ef9.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/067186.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/067186.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/067186.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/067186/067186.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/067186/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/067186/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/067186/067186.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/067186/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/067186/final.txt"
},
{
"id": "073706",
"family": "rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/073706.9727acff0f04.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/073706.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/073706.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/073706.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/073706/073706.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/073706/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/073706/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/073706/073706.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/073706/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/073706/final.txt"
},
{
"id": "077955",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/077955.499f373b1c19.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/077955.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/077955.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/077955.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/077955/077955.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/077955/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/077955/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/077955/077955.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/077955/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/077955/final.txt"
},
{
"id": "082187",
"family": "prismatic_block",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/082187.2cb2db4976cc.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/082187.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/082187.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/082187.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/082187/082187.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/082187/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/082187/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/082187/082187.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/082187/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/082187/final.txt"
},
{
"id": "089970",
"family": "rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/089970.fcac7c13cac8.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/089970.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/089970.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/089970.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/089970/089970.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/089970/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/089970/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/089970/089970.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/089970/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/089970/final.txt"
},
{
"id": "092092",
"family": "shaft",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/092092.878532374151.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/092092.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/092092.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/092092.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/092092/092092.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/092092/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/092092/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/092092/092092.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/092092/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/092092/final.txt"
},
{
"id": "095520",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/095520.f77225b8bb80.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/095520.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/095520.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/095520.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/095520/095520.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/095520/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/095520/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/095520/095520.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/095520/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/095520/final.txt"
},
{
"id": "102128",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/102128.5226541130cc.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/102128.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/102128.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/102128.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/102128/102128.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/102128/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/102128/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/102128/102128.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/102128/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/102128/final.txt"
},
{
"id": "104465",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/104465.367ecc4c0d1f.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/104465.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/104465.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/104465.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/104465/104465.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/104465/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/104465/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/104465/104465.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/104465/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/104465/final.txt"
},
{
"id": "110143",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/110143.d0705ec5cf9b.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/110143.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/110143.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/110143.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/110143/110143.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/110143/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/110143/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/110143/110143.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/110143/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/110143/final.txt"
},
{
"id": "112069",
"family": "prismatic_block",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/112069.527e20a67202.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/112069.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/112069.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/112069.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/112069/112069.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/112069/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/112069/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/112069/112069.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/112069/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/112069/final.txt"
},
{
"id": "116166",
"family": "rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/116166.daa7c0fb7095.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/116166.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/116166.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/116166.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/116166/116166.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/116166/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/116166/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/116166/116166.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/116166/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/116166/final.txt"
},
{
"id": "134828",
"family": "multi_axis_manifold",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/134828.4b43ff12062c.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/134828.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/134828.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/134828.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/134828/134828.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/134828/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/134828/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/134828/134828.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/134828/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/134828/final.txt"
},
{
"id": "136930",
"family": "rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/136930.84481239875b.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/136930.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/136930.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/136930.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/136930/136930.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/136930/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/136930/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/136930/136930.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/136930/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/136930/final.txt"
},
{
"id": "138022",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/138022.144778123756.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/138022.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/138022.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/138022.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/138022/138022.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/138022/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/138022/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/138022/138022.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/138022/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/138022/final.txt"
},
{
"id": "141680",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/141680.6f110692a1c2.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/141680.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/141680.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/141680.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/141680/141680.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/141680/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/141680/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/141680/141680.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/141680/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/141680/final.txt"
},
{
"id": "145574",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/145574.861af237e8e8.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/145574.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/145574.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/145574.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/145574/145574.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/145574/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/145574/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/145574/145574.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/145574/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/145574/final.txt"
},
{
"id": "150196",
"family": "prismatic_block",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/150196.d357a5b35875.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/150196.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/150196.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/150196.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/150196/150196.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/150196/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/150196/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/150196/150196.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/150196/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/150196/final.txt"
},
{
"id": "150587",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/150587.ff4fa06ecb48.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/150587.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/150587.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/150587.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/150587/150587.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/150587/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/150587/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/150587/150587.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/150587/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/150587/final.txt"
},
{
"id": "152568",
"family": "multi_axis_manifold",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/152568.92e33e9a9248.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/152568.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/152568.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/152568.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/152568/152568.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/152568/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/152568/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/152568/152568.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/152568/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/152568/final.txt"
},
{
"id": "153245",
"family": "plate_or_bracket",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/153245.0603ada945fa.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/153245.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/153245.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/153245.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/153245/153245.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/153245/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/153245/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/153245/153245.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/153245/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/153245/final.txt"
},
{
"id": "158256",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/158256.a27578bb9a47.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/158256.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/158256.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/158256.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/158256/158256.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/158256/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/158256/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/158256/158256.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/158256/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/158256/final.txt"
},
{
"id": "162558",
"family": "hollow_or_stepped_shaft",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/162558.27dadf557afe.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/162558.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/162558.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/162558.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/162558/162558.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/162558/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/162558/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/162558/162558.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/162558/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/162558/final.txt"
},
{
"id": "167962",
"family": "multi_axis_manifold",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/167962.1306cad65795.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/167962.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/167962.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/167962.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/167962/167962.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/167962/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/167962/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/167962/167962.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/167962/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/167962/final.txt"
},
{
"id": "168239",
"family": "rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/168239.b54b54a2287f.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/168239.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/168239.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/168239.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/168239/168239.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/168239/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/168239/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/168239/168239.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/168239/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/168239/final.txt"
},
{
"id": "174675",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/174675.25863f859f2b.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/174675.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/174675.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/174675.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/174675/174675.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/174675/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/174675/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/174675/174675.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/174675/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/174675/final.txt"
},
{
"id": "183151",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/183151.ceee2bf361bc.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/183151.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/183151.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/183151.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/183151/183151.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/183151/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/183151/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/183151/183151.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/183151/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/183151/final.txt"
},
{
"id": "189669",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/189669.66b0db2ea3d6.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/189669.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/189669.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/189669.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/189669/189669.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/189669/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/189669/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/189669/189669.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/189669/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/189669/final.txt"
},
{
"id": "194029",
"family": "rotational_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/194029.316b264a1a88.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/194029.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/194029.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/194029.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/194029/194029.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/194029/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/194029/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/194029/194029.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/194029/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/194029/final.txt"
},
{
"id": "201547",
"family": "prismatic_block",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/201547.c7cc9318deda.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/201547.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/201547.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/201547.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/201547/201547.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/201547/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/201547/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/201547/201547.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/201547/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/201547/final.txt"
},
{
"id": "204730",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/204730.1fade6b3bb74.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/204730.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/204730.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/204730.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/204730/204730.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/204730/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/204730/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/204730/204730.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/204730/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/204730/final.txt"
},
{
"id": "211326",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/211326.a4e6d3a4590a.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/211326.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/211326.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/211326.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/211326/211326.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/211326/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/211326/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/211326/211326.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/211326/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/211326/final.txt"
},
{
"id": "214404",
"family": "patterned_plate",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/214404.da6a44a7013c.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/214404.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/214404.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/214404.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/214404/214404.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/214404/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/214404/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/214404/214404.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/214404/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/214404/final.txt"
},
{
"id": "229115",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/229115.c4c1680e53b5.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/229115.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/229115.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/229115.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/229115/229115.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/229115/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/229115/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/229115/229115.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/229115/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/229115/final.txt"
},
{
"id": "234097",
"family": "hybrid_freeform_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/234097.cea424081999.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/234097.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/234097.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/234097.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/234097/234097.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/234097/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/234097/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/234097/234097.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/234097/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/234097/final.txt"
},
{
"id": "242307",
"family": "patterned_prismatic_part",
"case_json": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/parser/output/242307.cd1b3d043967.case.json",
"image": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/image/242307.png",
"description": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/Des_Text/242307.txt",
"reference_step": "/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset/model_step/242307.step",
"baseline_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/242307/242307.step",
"baseline_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/242307/codex.jsonl",
"baseline_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/baseline/242307/final.txt",
"experience_step": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/242307/242307.step",
"experience_log": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/242307/codex.jsonl",
"experience_message": "/Users/jerry/linkhand/CadSet/cad-experience-plugin/benchmarks/ab50/generated/experience/242307/final.txt"
}
]
}
@@ -1,101 +0,0 @@
bbox_mape,edge_rel_error,error,experience_methods_applied,experience_methods_returned,face_rel_error,family,family_match,feature_f1,generated,generated_volume,id,reference_volume,similarity_score,solid_count,surface_area_rel_error,surface_chamfer_norm,surface_hausdorff95_norm,valid,variant,volume_rel_error
0.0,0.5,,0,0,0.25,general_mechanical_part,1.0,0.8571428571428571,True,125663.70614359173,000166,125663.70614359173,93.81711632834559,1,6.425513440379324e-14,0.004847580881730266,0.00977766538694562,True,baseline,0.0
0.0,0.5,,0,0,0.25,general_mechanical_part,1.0,0.8571428571428571,True,125663.70614359173,000166,125663.70614359173,93.81711632834559,1,6.425513440379324e-14,0.004847580881730266,0.00977766538694562,True,experience,0.0
0.45066264681866697,0.125,,0,0,0.1111111111111111,patterned_plate,0.0,0.8571428571428571,True,106129.48703937844,004764,36749.40939347248,54.33835930595081,1,1.0309687869495758,0.05550481239248205,0.1775660613682025,True,baseline,1.8879236099568286
0.3413730293323282,0.125,,3,18,0.1111111111111111,patterned_plate,0.0,0.8571428571428571,True,88774.08881569223,004764,36749.40939347248,59.488074232257325,1,0.7876989178243013,0.0465090322155671,0.15562347480527094,True,experience,1.4156602862700836
0.5696649029982362,0.0,,0,0,0.0,plate_or_bracket,1.0,1.0,True,19016.0,011680,898496.0,60.445468751589296,1,0.9780420050604243,0.10796723414266624,0.36481967349123434,True,baseline,0.9788357432865589
0.583774250440917,0.0,,4,10,0.0,plate_or_bracket,1.0,1.0,True,13547.999999999998,011680,898496.0,59.90070139134242,1,0.9842171382062035,0.11235674854244815,0.374964117147598,True,experience,0.9849214687655816
0.18571427761876255,0.2631578947368421,,0,0,0.26666666666666666,patterned_plate,1.0,1.0,True,23882.59512641282,016033,44618.37587532573,81.50778192907364,1,0.34116223818430896,0.018452946285241585,0.08713798240651745,True,baseline,0.4647363410728704
0.3238095238095235,0.02631578947368421,,3,10,0.06666666666666667,patterned_plate,1.0,0.9411764705882353,True,13866.369040708962,016033,44618.37587532573,75.91174289423121,1,0.5000404499582691,0.026851094204940862,0.12169100582216402,True,experience,0.6892229094251465
0.5959595959595959,0.2857142857142857,,0,0,0.28125,flanged_rotational_part,1.0,1.0,True,118756.98485692723,020543,24145.808587596228,51.56160371886595,1,1.5105685440071281,0.08451218347517844,0.22747541674825858,True,baseline,3.9183271053483395
0.23232323232323235,0.05194805194805195,,0,0,0.1875,flanged_rotational_part,1.0,0.888888888888889,True,55638.90609255368,020543,24145.808587596228,69.33575293745653,1,0.4640684949891876,0.042969081471212464,0.11104259063963073,True,experience,1.3042883774509648
0.06666666666666685,0.2,,0,0,0.19480519480519481,patterned_prismatic_part,1.0,1.0,True,569438.4483554161,024675,580617.6091315141,91.92371160771847,1,0.2739018704584683,0.011073315847120254,0.07352156562273186,True,baseline,0.019253912730652068
0.5777777777777777,0.8933333333333333,,0,0,1.4025974025974026,patterned_prismatic_part,1.0,0.9333333333333333,True,38876.03946418978,024675,580617.6091315141,56.84188202691976,1,0.8746474563374864,0.07094038930770122,0.33837892456299423,True,experience,0.9330436437807312
0.0980952380952385,0.16666666666666666,,0,0,0.14285714285714285,patterned_plate,1.0,0.9333333333333333,True,73807.58425433026,029190,131254.75510206894,83.74861954252185,1,0.1560183040026604,0.024101504873521428,0.04232654923555514,True,baseline,0.4376768735202429
0.14047619047618823,1.5277777777777777,,0,0,1.6428571428571428,patterned_plate,1.0,0.7999999999999999,True,71846.37021205797,029190,131254.75510206894,73.91053356207678,1,0.20263501345527155,0.02460078307658505,0.04143094591291666,True,experience,0.45261891535901033
0.31241830065359194,0.9285714285714286,,0,0,0.5625,patterned_plate,1.0,0.923076923076923,True,34352.594678913054,030352,60881.15044407846,73.94372815488485,1,0.48742381144539443,0.02510282770499014,0.10902462973941958,True,baseline,0.4357433388111292
0.4306604575163398,2.642857142857143,,3,10,2.0625,patterned_plate,1.0,0.7692307692307692,True,11173.345159683424,030352,60881.15044407846,59.45331217188532,1,0.6732862799472543,0.03957952772551367,0.16850566658178062,True,experience,0.8164728314398964
0.21212121212121218,0.5,,0,0,0.43243243243243246,flanged_rotational_part,1.0,0.9600000000000001,True,73578.89519968569,046014,162271.3445381513,75.92217396437314,1,0.333964798541362,0.033942930350360764,0.05126001418573268,True,baseline,0.5465687709120651
0.13636363636363644,0.5,,4,10,0.43243243243243246,flanged_rotational_part,1.0,0.9600000000000001,True,111532.3028776836,046014,162271.3445381513,81.61765078194381,1,0.24200901291799348,0.02662187229047825,0.043202965297600246,True,experience,0.31268023202050027
0.6851851851851847,0.3709677419354839,,0,0,0.34782608695652173,patterned_prismatic_part,1.0,0.823529411764706,True,167251.53322574112,047048,33461.296317388085,44.79000279500974,1,1.6260155362793598,0.11322328439048983,0.2789388077989153,True,baseline,3.9983578531842254
0.7175925925925921,0.1693548387096774,,3,18,0.2391304347826087,patterned_prismatic_part,1.0,0.823529411764706,True,169277.67589913897,047048,33461.296317388085,44.38628038601891,1,1.587008333438104,0.13259494837120114,0.321530970786483,True,experience,4.058909681606514
1.4575235605335388e-16,0.5,,0,0,0.3125,hollow_or_stepped_shaft,1.0,0.9166666666666666,True,8278002.394429736,048346,8341713.8934443,93.45850460439323,1,0.01545893719801078,0.008802226092164953,0.016975575422477428,True,baseline,0.007637698898380382
1.4575235605335388e-16,0.5,,0,0,0.3125,hollow_or_stepped_shaft,1.0,0.9166666666666666,True,8292610.800268921,048346,8341713.8934443,93.51807327218812,1,0.012238325281746575,0.008857323306102671,0.017730676062993916,True,experience,0.005886451369899948
0.02857142857142833,0.2222222222222222,,0,0,0.21212121212121213,patterned_plate,0.0,0.8571428571428571,True,315117.2806010815,053664,349435.5647059466,85.57701767939263,1,0.07576465816363272,0.012696566244914555,0.02434484580541925,True,baseline,0.0982106218459597
0.07936507936507906,0.0,,0,0,0.030303030303030304,patterned_plate,0.0,0.8571428571428571,True,282776.14120936824,053664,349435.5647059466,83.57268406993335,1,0.167398697885095,0.016320456106002173,0.05162627100789126,True,experience,0.19076313412080106
,,missing STEP,,,,patterned_prismatic_part,,,False,,063487,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,063487,,,,,,,,experience,
0.05572210294349599,0.420863309352518,,0,0,0.4396551724137931,flanged_rotational_part,1.0,0.923076923076923,True,68680.44493144708,065487,81354.16556588435,87.21779338748289,1,0.060356551334099576,0.022572421105818447,0.053770414665160235,True,baseline,0.15578453231351141
,,missing STEP,,,,flanged_rotational_part,,,False,,065487,,,,,,,,experience,
,,missing STEP,,,,patterned_plate,,,False,,067186,,,,,,,,baseline,
,,missing STEP,,,,patterned_plate,,,False,,067186,,,,,,,,experience,
,,missing STEP,,,,rotational_part,,,False,,073706,,,,,,,,baseline,
,,missing STEP,,,,rotational_part,,,False,,073706,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,077955,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,077955,,,,,,,,experience,
,,missing STEP,,,,prismatic_block,,,False,,082187,,,,,,,,baseline,
,,missing STEP,,,,prismatic_block,,,False,,082187,,,,,,,,experience,
,,missing STEP,,,,rotational_part,,,False,,089970,,,,,,,,baseline,
,,missing STEP,,,,rotational_part,,,False,,089970,,,,,,,,experience,
,,missing STEP,,,,shaft,,,False,,092092,,,,,,,,baseline,
,,missing STEP,,,,shaft,,,False,,092092,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,095520,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,095520,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,102128,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,102128,,,,,,,,experience,
,,missing STEP,,,,patterned_plate,,,False,,104465,,,,,,,,baseline,
,,missing STEP,,,,patterned_plate,,,False,,104465,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,110143,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,110143,,,,,,,,experience,
,,missing STEP,,,,prismatic_block,,,False,,112069,,,,,,,,baseline,
,,missing STEP,,,,prismatic_block,,,False,,112069,,,,,,,,experience,
0.22361111004444456,0.6538461538461539,,0,0,0.6153846153846154,rotational_part,1.0,0.761904761904762,True,67519.74039233122,116166,147536.10631008807,71.3680012563105,1,0.38925591734814796,0.03424668647245051,0.07518718288900171,True,baseline,0.5423510754010293
0.18888888915554566,0.7307692307692307,,3,16,0.6923076923076923,rotational_part,1.0,0.8571428571428572,True,69565.58402815007,116166,147536.10631008807,73.4520592182128,1,0.365981954180488,0.032489227662340435,0.07289222461786297,True,experience,0.528484343473599
0.6746686351889055,0.45217391304347826,,0,0,0.45,multi_axis_manifold,0.0,0.7692307692307692,True,34234.94531047202,134828,349556.2389887021,48.526262227273214,1,0.9239731944207157,0.10449739414590258,0.3144594900968871,True,baseline,0.9020616956815967
0.7062506154470962,0.5043478260869565,,5,14,0.5,multi_axis_manifold,0.0,0.7692307692307692,True,38190.323227729335,134828,349556.2389887021,48.60371993717729,1,0.9152269986233839,0.09836507300701838,0.29918959165673675,True,experience,0.8907462692177447
7.3809523809523805,0.5,,0,0,0.3333333333333333,rotational_part,1.0,0.9411764705882353,True,25446.900494077883,136930,38.877209088173686,25.720060532485707,1,72.6363636363658,1.666072751413829,2.6857505921882785,True,baseline,653.545454545469
6.936507936507937,0.5,,0,0,0.3333333333333333,rotational_part,1.0,0.9411764705882353,True,21205.750411731566,136930,38.877209088173686,25.725642575854934,1,67.18181818181998,1.6549008981976585,2.6698915132197145,True,experience,544.4545454545574
,,missing STEP,,,,patterned_prismatic_part,,,False,,138022,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,138022,,,,,,,,experience,
,,missing STEP,,,,patterned_plate,,,False,,141680,,,,,,,,baseline,
,,missing STEP,,,,patterned_plate,,,False,,141680,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,145574,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,145574,,,,,,,,experience,
,,missing STEP,,,,prismatic_block,,,False,,150196,,,,,,,,baseline,
,,missing STEP,,,,prismatic_block,,,False,,150196,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,150587,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,150587,,,,,,,,experience,
,,missing STEP,,,,multi_axis_manifold,,,False,,152568,,,,,,,,baseline,
,,missing STEP,,,,multi_axis_manifold,,,False,,152568,,,,,,,,experience,
,,missing STEP,,,,plate_or_bracket,,,False,,153245,,,,,,,,baseline,
,,missing STEP,,,,plate_or_bracket,,,False,,153245,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,158256,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,158256,,,,,,,,experience,
,,missing STEP,,,,hollow_or_stepped_shaft,,,False,,162558,,,,,,,,baseline,
,,missing STEP,,,,hollow_or_stepped_shaft,,,False,,162558,,,,,,,,experience,
,,missing STEP,,,,multi_axis_manifold,,,False,,167962,,,,,,,,baseline,
,,missing STEP,,,,multi_axis_manifold,,,False,,167962,,,,,,,,experience,
,,missing STEP,,,,rotational_part,,,False,,168239,,,,,,,,baseline,
,,missing STEP,,,,rotational_part,,,False,,168239,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,174675,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,174675,,,,,,,,experience,
,,missing STEP,,,,patterned_plate,,,False,,183151,,,,,,,,baseline,
,,missing STEP,,,,patterned_plate,,,False,,183151,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,189669,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,189669,,,,,,,,experience,
,,missing STEP,,,,rotational_part,,,False,,194029,,,,,,,,baseline,
,,missing STEP,,,,rotational_part,,,False,,194029,,,,,,,,experience,
,,missing STEP,,,,prismatic_block,,,False,,201547,,,,,,,,baseline,
,,missing STEP,,,,prismatic_block,,,False,,201547,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,204730,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,204730,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,211326,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,211326,,,,,,,,experience,
,,missing STEP,,,,patterned_plate,,,False,,214404,,,,,,,,baseline,
,,missing STEP,,,,patterned_plate,,,False,,214404,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,229115,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,229115,,,,,,,,experience,
,,missing STEP,,,,hybrid_freeform_part,,,False,,234097,,,,,,,,baseline,
,,missing STEP,,,,hybrid_freeform_part,,,False,,234097,,,,,,,,experience,
,,missing STEP,,,,patterned_prismatic_part,,,False,,242307,,,,,,,,baseline,
,,missing STEP,,,,patterned_prismatic_part,,,False,,242307,,,,,,,,experience,
1 bbox_mape edge_rel_error error experience_methods_applied experience_methods_returned face_rel_error family family_match feature_f1 generated generated_volume id reference_volume similarity_score solid_count surface_area_rel_error surface_chamfer_norm surface_hausdorff95_norm valid variant volume_rel_error
2 0.0 0.5 0 0 0.25 general_mechanical_part 1.0 0.8571428571428571 True 125663.70614359173 000166 125663.70614359173 93.81711632834559 1 6.425513440379324e-14 0.004847580881730266 0.00977766538694562 True baseline 0.0
3 0.0 0.5 0 0 0.25 general_mechanical_part 1.0 0.8571428571428571 True 125663.70614359173 000166 125663.70614359173 93.81711632834559 1 6.425513440379324e-14 0.004847580881730266 0.00977766538694562 True experience 0.0
4 0.45066264681866697 0.125 0 0 0.1111111111111111 patterned_plate 0.0 0.8571428571428571 True 106129.48703937844 004764 36749.40939347248 54.33835930595081 1 1.0309687869495758 0.05550481239248205 0.1775660613682025 True baseline 1.8879236099568286
5 0.3413730293323282 0.125 3 18 0.1111111111111111 patterned_plate 0.0 0.8571428571428571 True 88774.08881569223 004764 36749.40939347248 59.488074232257325 1 0.7876989178243013 0.0465090322155671 0.15562347480527094 True experience 1.4156602862700836
6 0.5696649029982362 0.0 0 0 0.0 plate_or_bracket 1.0 1.0 True 19016.0 011680 898496.0 60.445468751589296 1 0.9780420050604243 0.10796723414266624 0.36481967349123434 True baseline 0.9788357432865589
7 0.583774250440917 0.0 4 10 0.0 plate_or_bracket 1.0 1.0 True 13547.999999999998 011680 898496.0 59.90070139134242 1 0.9842171382062035 0.11235674854244815 0.374964117147598 True experience 0.9849214687655816
8 0.18571427761876255 0.2631578947368421 0 0 0.26666666666666666 patterned_plate 1.0 1.0 True 23882.59512641282 016033 44618.37587532573 81.50778192907364 1 0.34116223818430896 0.018452946285241585 0.08713798240651745 True baseline 0.4647363410728704
9 0.3238095238095235 0.02631578947368421 3 10 0.06666666666666667 patterned_plate 1.0 0.9411764705882353 True 13866.369040708962 016033 44618.37587532573 75.91174289423121 1 0.5000404499582691 0.026851094204940862 0.12169100582216402 True experience 0.6892229094251465
10 0.5959595959595959 0.2857142857142857 0 0 0.28125 flanged_rotational_part 1.0 1.0 True 118756.98485692723 020543 24145.808587596228 51.56160371886595 1 1.5105685440071281 0.08451218347517844 0.22747541674825858 True baseline 3.9183271053483395
11 0.23232323232323235 0.05194805194805195 0 0 0.1875 flanged_rotational_part 1.0 0.888888888888889 True 55638.90609255368 020543 24145.808587596228 69.33575293745653 1 0.4640684949891876 0.042969081471212464 0.11104259063963073 True experience 1.3042883774509648
12 0.06666666666666685 0.2 0 0 0.19480519480519481 patterned_prismatic_part 1.0 1.0 True 569438.4483554161 024675 580617.6091315141 91.92371160771847 1 0.2739018704584683 0.011073315847120254 0.07352156562273186 True baseline 0.019253912730652068
13 0.5777777777777777 0.8933333333333333 0 0 1.4025974025974026 patterned_prismatic_part 1.0 0.9333333333333333 True 38876.03946418978 024675 580617.6091315141 56.84188202691976 1 0.8746474563374864 0.07094038930770122 0.33837892456299423 True experience 0.9330436437807312
14 0.0980952380952385 0.16666666666666666 0 0 0.14285714285714285 patterned_plate 1.0 0.9333333333333333 True 73807.58425433026 029190 131254.75510206894 83.74861954252185 1 0.1560183040026604 0.024101504873521428 0.04232654923555514 True baseline 0.4376768735202429
15 0.14047619047618823 1.5277777777777777 0 0 1.6428571428571428 patterned_plate 1.0 0.7999999999999999 True 71846.37021205797 029190 131254.75510206894 73.91053356207678 1 0.20263501345527155 0.02460078307658505 0.04143094591291666 True experience 0.45261891535901033
16 0.31241830065359194 0.9285714285714286 0 0 0.5625 patterned_plate 1.0 0.923076923076923 True 34352.594678913054 030352 60881.15044407846 73.94372815488485 1 0.48742381144539443 0.02510282770499014 0.10902462973941958 True baseline 0.4357433388111292
17 0.4306604575163398 2.642857142857143 3 10 2.0625 patterned_plate 1.0 0.7692307692307692 True 11173.345159683424 030352 60881.15044407846 59.45331217188532 1 0.6732862799472543 0.03957952772551367 0.16850566658178062 True experience 0.8164728314398964
18 0.21212121212121218 0.5 0 0 0.43243243243243246 flanged_rotational_part 1.0 0.9600000000000001 True 73578.89519968569 046014 162271.3445381513 75.92217396437314 1 0.333964798541362 0.033942930350360764 0.05126001418573268 True baseline 0.5465687709120651
19 0.13636363636363644 0.5 4 10 0.43243243243243246 flanged_rotational_part 1.0 0.9600000000000001 True 111532.3028776836 046014 162271.3445381513 81.61765078194381 1 0.24200901291799348 0.02662187229047825 0.043202965297600246 True experience 0.31268023202050027
20 0.6851851851851847 0.3709677419354839 0 0 0.34782608695652173 patterned_prismatic_part 1.0 0.823529411764706 True 167251.53322574112 047048 33461.296317388085 44.79000279500974 1 1.6260155362793598 0.11322328439048983 0.2789388077989153 True baseline 3.9983578531842254
21 0.7175925925925921 0.1693548387096774 3 18 0.2391304347826087 patterned_prismatic_part 1.0 0.823529411764706 True 169277.67589913897 047048 33461.296317388085 44.38628038601891 1 1.587008333438104 0.13259494837120114 0.321530970786483 True experience 4.058909681606514
22 1.4575235605335388e-16 0.5 0 0 0.3125 hollow_or_stepped_shaft 1.0 0.9166666666666666 True 8278002.394429736 048346 8341713.8934443 93.45850460439323 1 0.01545893719801078 0.008802226092164953 0.016975575422477428 True baseline 0.007637698898380382
23 1.4575235605335388e-16 0.5 0 0 0.3125 hollow_or_stepped_shaft 1.0 0.9166666666666666 True 8292610.800268921 048346 8341713.8934443 93.51807327218812 1 0.012238325281746575 0.008857323306102671 0.017730676062993916 True experience 0.005886451369899948
24 0.02857142857142833 0.2222222222222222 0 0 0.21212121212121213 patterned_plate 0.0 0.8571428571428571 True 315117.2806010815 053664 349435.5647059466 85.57701767939263 1 0.07576465816363272 0.012696566244914555 0.02434484580541925 True baseline 0.0982106218459597
25 0.07936507936507906 0.0 0 0 0.030303030303030304 patterned_plate 0.0 0.8571428571428571 True 282776.14120936824 053664 349435.5647059466 83.57268406993335 1 0.167398697885095 0.016320456106002173 0.05162627100789126 True experience 0.19076313412080106
26 missing STEP patterned_prismatic_part False 063487 baseline
27 missing STEP patterned_prismatic_part False 063487 experience
28 0.05572210294349599 0.420863309352518 0 0 0.4396551724137931 flanged_rotational_part 1.0 0.923076923076923 True 68680.44493144708 065487 81354.16556588435 87.21779338748289 1 0.060356551334099576 0.022572421105818447 0.053770414665160235 True baseline 0.15578453231351141
29 missing STEP flanged_rotational_part False 065487 experience
30 missing STEP patterned_plate False 067186 baseline
31 missing STEP patterned_plate False 067186 experience
32 missing STEP rotational_part False 073706 baseline
33 missing STEP rotational_part False 073706 experience
34 missing STEP patterned_prismatic_part False 077955 baseline
35 missing STEP patterned_prismatic_part False 077955 experience
36 missing STEP prismatic_block False 082187 baseline
37 missing STEP prismatic_block False 082187 experience
38 missing STEP rotational_part False 089970 baseline
39 missing STEP rotational_part False 089970 experience
40 missing STEP shaft False 092092 baseline
41 missing STEP shaft False 092092 experience
42 missing STEP patterned_prismatic_part False 095520 baseline
43 missing STEP patterned_prismatic_part False 095520 experience
44 missing STEP patterned_prismatic_part False 102128 baseline
45 missing STEP patterned_prismatic_part False 102128 experience
46 missing STEP patterned_plate False 104465 baseline
47 missing STEP patterned_plate False 104465 experience
48 missing STEP patterned_prismatic_part False 110143 baseline
49 missing STEP patterned_prismatic_part False 110143 experience
50 missing STEP prismatic_block False 112069 baseline
51 missing STEP prismatic_block False 112069 experience
52 0.22361111004444456 0.6538461538461539 0 0 0.6153846153846154 rotational_part 1.0 0.761904761904762 True 67519.74039233122 116166 147536.10631008807 71.3680012563105 1 0.38925591734814796 0.03424668647245051 0.07518718288900171 True baseline 0.5423510754010293
53 0.18888888915554566 0.7307692307692307 3 16 0.6923076923076923 rotational_part 1.0 0.8571428571428572 True 69565.58402815007 116166 147536.10631008807 73.4520592182128 1 0.365981954180488 0.032489227662340435 0.07289222461786297 True experience 0.528484343473599
54 0.6746686351889055 0.45217391304347826 0 0 0.45 multi_axis_manifold 0.0 0.7692307692307692 True 34234.94531047202 134828 349556.2389887021 48.526262227273214 1 0.9239731944207157 0.10449739414590258 0.3144594900968871 True baseline 0.9020616956815967
55 0.7062506154470962 0.5043478260869565 5 14 0.5 multi_axis_manifold 0.0 0.7692307692307692 True 38190.323227729335 134828 349556.2389887021 48.60371993717729 1 0.9152269986233839 0.09836507300701838 0.29918959165673675 True experience 0.8907462692177447
56 7.3809523809523805 0.5 0 0 0.3333333333333333 rotational_part 1.0 0.9411764705882353 True 25446.900494077883 136930 38.877209088173686 25.720060532485707 1 72.6363636363658 1.666072751413829 2.6857505921882785 True baseline 653.545454545469
57 6.936507936507937 0.5 0 0 0.3333333333333333 rotational_part 1.0 0.9411764705882353 True 21205.750411731566 136930 38.877209088173686 25.725642575854934 1 67.18181818181998 1.6549008981976585 2.6698915132197145 True experience 544.4545454545574
58 missing STEP patterned_prismatic_part False 138022 baseline
59 missing STEP patterned_prismatic_part False 138022 experience
60 missing STEP patterned_plate False 141680 baseline
61 missing STEP patterned_plate False 141680 experience
62 missing STEP patterned_prismatic_part False 145574 baseline
63 missing STEP patterned_prismatic_part False 145574 experience
64 missing STEP prismatic_block False 150196 baseline
65 missing STEP prismatic_block False 150196 experience
66 missing STEP patterned_prismatic_part False 150587 baseline
67 missing STEP patterned_prismatic_part False 150587 experience
68 missing STEP multi_axis_manifold False 152568 baseline
69 missing STEP multi_axis_manifold False 152568 experience
70 missing STEP plate_or_bracket False 153245 baseline
71 missing STEP plate_or_bracket False 153245 experience
72 missing STEP patterned_prismatic_part False 158256 baseline
73 missing STEP patterned_prismatic_part False 158256 experience
74 missing STEP hollow_or_stepped_shaft False 162558 baseline
75 missing STEP hollow_or_stepped_shaft False 162558 experience
76 missing STEP multi_axis_manifold False 167962 baseline
77 missing STEP multi_axis_manifold False 167962 experience
78 missing STEP rotational_part False 168239 baseline
79 missing STEP rotational_part False 168239 experience
80 missing STEP patterned_prismatic_part False 174675 baseline
81 missing STEP patterned_prismatic_part False 174675 experience
82 missing STEP patterned_plate False 183151 baseline
83 missing STEP patterned_plate False 183151 experience
84 missing STEP patterned_prismatic_part False 189669 baseline
85 missing STEP patterned_prismatic_part False 189669 experience
86 missing STEP rotational_part False 194029 baseline
87 missing STEP rotational_part False 194029 experience
88 missing STEP prismatic_block False 201547 baseline
89 missing STEP prismatic_block False 201547 experience
90 missing STEP patterned_prismatic_part False 204730 baseline
91 missing STEP patterned_prismatic_part False 204730 experience
92 missing STEP patterned_prismatic_part False 211326 baseline
93 missing STEP patterned_prismatic_part False 211326 experience
94 missing STEP patterned_plate False 214404 baseline
95 missing STEP patterned_plate False 214404 experience
96 missing STEP patterned_prismatic_part False 229115 baseline
97 missing STEP patterned_prismatic_part False 229115 experience
98 missing STEP hybrid_freeform_part False 234097 baseline
99 missing STEP hybrid_freeform_part False 234097 experience
100 missing STEP patterned_prismatic_part False 242307 baseline
101 missing STEP patterned_prismatic_part False 242307 experience
File diff suppressed because it is too large Load Diff
@@ -1,39 +0,0 @@
# CAD 经验库 50 件 A/B 盲重建报告
> 运行状态:2026-07-23 因 Codex 账户用量上限中断;当前为 15/50
> 完整配对的阶段结果。系统提示可在 2026-07-29 10:24 后继续。
## 口径
- 测试集:固定分层抽取 50 件;这 50 件不进入经验库。
- 训练经验:其余 950 件生成的通用经验库。
- 两组输入完全相同:仅多视图图片和文字描述;生成过程禁止读取参考 STEP 和解析 JSON。
- Baseline:空经验库;Experience:950 件经验库。
- 参考 STEP 只在生成完成后用于评分。
- “相似度”是体积、面积、包围盒、表面距离、拓扑和语义特征的综合诊断分,不代表制造级 1:1 或可互换性。
## 当前完成度
- 有效 Baseline:16/50
- 有效 Experience:15/50
- 完整配对:15/50
- 经验方法返回/实际采用:106/28
## 汇总
| 指标 | 无经验 | 有经验 | 差值 |
|---|---:|---:|---:|
| 综合相似度(0–100,越高越好) | 69.11 | 66.64 | -2.47 |
| 体积相对误差(越低越好) | 44.519 | 37.136 | -7.383 |
| 表面积相对误差 | 5.385 | 4.997 | -0.388 |
| 包围盒尺寸 MAPE | 0.766 | 0.760 | -0.006 |
| 归一化表面 Chamfer | 0.1537 | 0.1559 | +0.0023 |
| 特征 F1 | 0.907 | 0.878 | -0.029 |
经验组胜/平/负(±0.25 分视为平):**4/4/7**。
## 阶段解释
- 经验组的体积、表面积和包围盒平均误差较低,说明通用构造经验对尺度/主体关系有一定帮助。
- 经验组的表面距离、特征 F1 和综合分暂时较差,说明部分经验会诱导多余或错误特征,当前不能宣称整体提升。
- 每组由独立的大模型运行生成;即使经验命中为 0,两次结果也可能因模型随机性不同。因此最终应完成 50 对,并对若干样本做重复运行,才能把经验效果与随机波动分开。
@@ -1,64 +0,0 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import json
import subprocess
import sys
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
HERE = Path(__file__).resolve().parent
def run(case_id: str, variant: str) -> dict:
completed = subprocess.run(
[sys.executable, str(HERE / "run_case.py"), case_id, variant],
capture_output=True,
text=True,
)
return {
"id": case_id,
"variant": variant,
"returncode": completed.returncode,
"output": completed.stdout.strip(),
"error": completed.stderr.strip(),
}
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--workers", type=int, default=4)
parser.add_argument("--start-index", type=int, default=0)
parser.add_argument("--end-index", type=int)
args = parser.parse_args()
manifest = json.loads((HERE / "manifest.json").read_text())
cases = manifest["cases"][args.start_index : args.end_index]
jobs = [
(case["id"], variant)
for case in cases
for variant in ("baseline", "experience")
]
results_name = (
"batch-results.json"
if args.start_index == 0 and args.end_index is None
else f"batch-results-{args.start_index}-{args.end_index or 'end'}.json"
)
results_path = HERE / results_name
results = []
with ThreadPoolExecutor(max_workers=args.workers) as pool:
futures = {pool.submit(run, *job): job for job in jobs}
for future in as_completed(futures):
result = future.result()
results.append(result)
print(json.dumps(result, ensure_ascii=False), flush=True)
results_path.write_text(
json.dumps(results, indent=2, ensure_ascii=False) + "\n"
)
failed = [item for item in results if item["returncode"] != 0]
print(json.dumps({"completed": len(results), "failed": len(failed)}))
raise SystemExit(1 if failed else 0)
if __name__ == "__main__":
main()
@@ -1,88 +0,0 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import json
import subprocess
from pathlib import Path
HERE = Path(__file__).resolve().parent
WORKSPACE = HERE.parents[2]
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("case_id")
parser.add_argument("variant", choices=("baseline", "experience"))
args = parser.parse_args()
manifest = json.loads((HERE / "manifest.json").read_text())
case = next(item for item in manifest["cases"] if item["id"] == args.case_id)
output = Path(case[f"{args.variant}_step"])
output.parent.mkdir(parents=True, exist_ok=True)
if output.is_file():
print(json.dumps({"status": "skipped", "output": str(output)}))
return
description = Path(case["description"]).read_text()
library = (
HERE / "empty-library.json"
if args.variant == "baseline"
else HERE / "train-library.json"
)
prompt = f"""
This is a controlled CAD reconstruction benchmark.
Use $cad-router and $cad to reconstruct the single mechanical part shown in
the attached multi-view image and described below. Generate a new parametric
STEP from the image and description only.
Hard isolation rules:
- Do not search for, inspect, import, copy, or reference any teacher STEP,
SLDPRT, parser/input, parser/output, case JSON, or SLDPRT-NET dataset file.
- The attached image and the description in this prompt are the only
part-specific evidence.
- Run cad-router with the explicit generalized experience library
{library.resolve()}; do not use any other experience library.
- Use the router-selected backend and actually apply returned generalized
methods when present.
- Do not preserve an exact STEP base: this must be a blind reconstruction.
Write the primary output exactly to:
{output.resolve()}
Keep the editable generator and model-spec.json in the same directory.
Also write the router result to route.json and record in cad-task.json the
experience methods returned and the subset actually applied. Record an empty
list when nothing matches; never claim an experience method was used unless
the router returned it.
Validate that the STEP opens and contains positive-volume geometry. For this
batch benchmark, do not open CAD Viewer or create browser tabs.
Description:
{description}
"""
command = [
"codex",
"exec",
"--ephemeral",
"--json",
"--image",
case["image"],
"--cd",
str(WORKSPACE),
"--sandbox",
"danger-full-access",
"--output-last-message",
case[f"{args.variant}_message"],
prompt,
]
with Path(case[f"{args.variant}_log"]).open("w") as stream:
completed = subprocess.run(command, stdout=stream, stderr=subprocess.STDOUT)
print(json.dumps({
"status": "ok" if completed.returncode == 0 and output.is_file() else "failed",
"returncode": completed.returncode,
"output": str(output),
}))
raise SystemExit(0 if completed.returncode == 0 and output.is_file() else 1)
if __name__ == "__main__":
main()
@@ -1,95 +0,0 @@
#!/usr/bin/env python3
from __future__ import annotations
import json
import random
from collections import defaultdict
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
OUTPUT = ROOT / "parser" / "output"
HERE = Path(__file__).resolve().parent
DATASET = Path("/Users/jerry/linkhand/cad/SLDPRT-NET/sub_datset/sub_datset")
TARGET_COUNT = 50
def main() -> None:
rows: list[dict] = []
for path in sorted(OUTPUT.glob("*.json")):
payload = json.loads(path.read_text())
stem = Path(payload["provenance"]["source_path"]).stem
image = DATASET / "image" / f"{stem}.png"
description = DATASET / "Des_Text" / f"{stem}.txt"
reference = DATASET / "model_step" / f"{stem}.step"
if image.is_file() and description.is_file() and reference.is_file():
rows.append(
{
"id": stem,
"family": payload["design_ir"]["part_family"],
"case_json": str(path.resolve()),
"image": str(image),
"description": str(description),
"reference_step": str(reference),
}
)
by_family: dict[str, list[dict]] = defaultdict(list)
for row in rows:
by_family[row["family"]].append(row)
rng = random.Random(20260723)
selected: list[dict] = []
total = len(rows)
for family, family_rows in sorted(by_family.items()):
rng.shuffle(family_rows)
quota = max(1, round(TARGET_COUNT * len(family_rows) / total))
selected.extend(family_rows[: min(quota, len(family_rows))])
selected_ids = {row["id"] for row in selected}
if len(selected) > TARGET_COUNT:
selected = selected[:TARGET_COUNT]
elif len(selected) < TARGET_COUNT:
remainder = [row for row in rows if row["id"] not in selected_ids]
rng.shuffle(remainder)
selected.extend(remainder[: TARGET_COUNT - len(selected)])
selected = sorted(selected, key=lambda row: row["id"])
selected_ids = {row["id"] for row in selected}
train_dir = HERE / "train_cases"
train_dir.mkdir(parents=True, exist_ok=True)
for path in train_dir.glob("*.json"):
path.unlink()
for row in rows:
if row["id"] in selected_ids:
continue
source = Path(row["case_json"])
(train_dir / source.name).symlink_to(source)
for row in selected:
for variant in ("baseline", "experience"):
output_dir = HERE / "generated" / variant / row["id"]
output_dir.mkdir(parents=True, exist_ok=True)
row[f"{variant}_step"] = str(output_dir / f"{row['id']}.step")
row[f"{variant}_log"] = str(output_dir / "codex.jsonl")
row[f"{variant}_message"] = str(output_dir / "final.txt")
manifest = {
"schema_version": "1.0",
"selection_seed": 20260723,
"holdout_count": len(selected),
"train_count": len(rows) - len(selected),
"cases": selected,
}
(HERE / "manifest.json").write_text(
json.dumps(manifest, indent=2, ensure_ascii=False) + "\n"
)
print(json.dumps({
"holdout_count": len(selected),
"train_count": len(rows) - len(selected),
"family_counts": {
family: sum(row["family"] == family for row in selected)
for family in sorted({row["family"] for row in selected})
},
}, indent=2))
if __name__ == "__main__":
main()
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,71 +0,0 @@
{
"schema_version": "1.0",
"draft_kind": "llm_generalized_experience_proposals",
"proposals": [
{
"id": "constraint.patterned_prismatic_part.repeated_radius_group",
"kind": "constraint",
"scope": ["patterned_prismatic_part"],
"evidence_query": {
"required_features": ["repeated_axial_hole_pattern"],
"required_relations": ["repeated_radius_group"],
"context_features": ["repeated_axial_hole_pattern"]
},
"guidance": "Preserve one shared semantic radius role across members of a repeated axial feature group.",
"semantic_rationale": "The equality relationship transfers across different overall sizes and placements.",
"check": "Confirm that repeated members intended to be equal retain the same radius role."
},
{
"id": "constraint.patterned_prismatic_part.multiple_axis_system",
"kind": "constraint",
"scope": ["patterned_prismatic_part"],
"evidence_query": {
"required_features": ["cylindrical_feature_network", "multi_axis_passage"],
"required_relations": ["multiple_axis_system"],
"context_features": ["cylindrical_feature_network", "multi_axis_passage"]
},
"guidance": "Represent passage directions as explicit semantic axes instead of unrelated local cuts.",
"semantic_rationale": "An explicit axis network preserves relationships when the body dimensions change.",
"check": "Confirm that every passage remains assigned to its intended axis system."
},
{
"id": "motif.patterned_prismatic_part.multi_level_planar_profile_and_planar_dominant_body",
"kind": "feature_motif",
"scope": ["patterned_prismatic_part"],
"evidence_query": {
"required_features": ["multi_level_planar_profile", "planar_dominant_body"],
"required_relations": [],
"context_features": ["multi_level_planar_profile", "planar_dominant_body"]
},
"guidance": "Treat the planar-dominant body and its multiple profile levels as one reusable structural composition.",
"semantic_rationale": "The composition describes topology without depending on an instance dimension.",
"check": "Confirm that the expected planar levels remain distinct and connected to the primary body."
},
{
"id": "motif.patterned_prismatic_part.cylindrical_feature_network_and_multi_axis_passage",
"kind": "feature_motif",
"scope": ["patterned_prismatic_part"],
"evidence_query": {
"required_features": ["cylindrical_feature_network", "multi_axis_passage"],
"required_relations": ["multiple_axis_system"],
"context_features": ["cylindrical_feature_network", "multi_axis_passage"]
},
"guidance": "Model the cylindrical feature network and multi-axis passages as a coordinated feature system.",
"semantic_rationale": "The coordinated system transfers across variants while preserving semantic axes.",
"check": "Confirm that the cylindrical features and passages preserve their intended axis memberships."
},
{
"id": "validation.patterned_prismatic_part.repeated_feature_consistency",
"kind": "validation_rule",
"scope": ["patterned_prismatic_part"],
"evidence_query": {
"required_features": ["repeated_axial_hole_pattern"],
"required_relations": ["repeated_radius_group"],
"context_features": ["repeated_axial_hole_pattern"]
},
"guidance": "Validate repeated feature membership, equality roles, and attachment to the intended host region.",
"semantic_rationale": "These checks remain meaningful across dimensions and pattern placements.",
"check": "Verify repeated-member count consistency, shared radius roles, and host connectivity."
}
]
}
@@ -1,33 +0,0 @@
# 015133 单件高纯度蒸馏实验
## 对照结果
| 路线 | 可用于生成的信息 | 严格相似度 | 结论 |
|---|---|---:|---|
| 纯图片生成 | 多视图图片与文字描述 | 54.71 | 主体类别可辨认,但尺寸、孔系和端部结构损失明显 |
| 正式单件通用蒸馏 | 净化后的通用特征、关系和比例角色 | 无可执行提升 | 产生 5 条候选、0 条推广经验;单件证据不能证明通用性 |
| 专属 `exact_step_base` 模板 | 原始 B-Rep、哈希、几何签名与 JSON 修改层 | 100.00 | STEP 字节一致,199 面、488 边、体积与包围盒完全一致 |
## 源几何
- 包围盒:213.5 × 78.5 × 76.0 mm
- 实体数:1
- 面数:199
- 边数:488
- 体积:1174741.621833 mm³
- 解析曲面:79 个平面、80 个圆柱面、40 个圆锥面
## 单件通用蒸馏实际保留的信息
- 7 个粗粒度特征类别
- 2 个关系
- 6 个无量纲比例角色
- 不保留孔数量、孔中心、端板槽、各圆柱面的语义身份、具体尺寸或构造顺序
这些信息适合积累跨零件经验,但不足以重建一个具有 199 个面的指定实例。
## 结论
“单件高纯度”要达到 90 分以上,必须进入**实例模板/逆向参数化**
通道,而不是通用经验通道。通用经验负责教方法;实例模板负责保存指定
零件的尺寸、特征图和精确基体。两类数据必须分库、分权限、分评价口径。
@@ -1,231 +0,0 @@
{
"schema_version": "1.0",
"batch_kind": "sanitized_cad_semantic_review",
"guardrails": {
"contains_instance_dimensions": false,
"contains_absolute_coordinates": false,
"llm_must_propose_methods_not_copy_answers": true,
"proposals_require_deterministic_evidence_verification": true
},
"corpus_summary": {
"case_count": 1,
"family_count": 1
},
"cases": [
{
"anonymous_case": "case_000001",
"family": "patterned_prismatic_part",
"features": [
"cylindrical_feature_network",
"high_topological_complexity",
"moderate_aspect_body",
"multi_axis_passage",
"multi_level_planar_profile",
"planar_dominant_body",
"repeated_axial_hole_pattern"
],
"relations": [
"multiple_axis_system",
"repeated_radius_group"
],
"candidate_rules": [],
"validation_targets": [],
"dimensionless_observation_roles": [
{
"name": "bbox_short_to_long",
"numerator_role": "short_bounding_span",
"denominator_role": "long_bounding_span"
},
{
"name": "bbox_middle_to_long",
"numerator_role": "middle_bounding_span",
"denominator_role": "long_bounding_span"
},
{
"name": "planar_area_fraction",
"numerator_role": "planar_surface_area",
"denominator_role": "total_surface_area"
},
{
"name": "cylindrical_area_fraction",
"numerator_role": "cylindrical_surface_area",
"denominator_role": "total_surface_area"
},
{
"name": "pattern_radius_to_transverse_span",
"numerator_role": "pattern_radius",
"denominator_role": "transverse_bounding_span"
},
{
"name": "repeated_feature_radius_to_transverse_span",
"numerator_role": "repeated_feature_radius",
"denominator_role": "transverse_bounding_span"
}
]
}
],
"existing_vocabulary": {
"promoted_ids": [
"constraint.flanged_rotational_part.coaxial_stack",
"constraint.flanged_rotational_part.common_pattern_radius",
"constraint.flanged_rotational_part.dominant_axis_alignment",
"constraint.flanged_rotational_part.repeated_radius_group",
"constraint.flanged_rotational_part.shared_passage_axis",
"constraint.flanged_rotational_part.transition_axis_continuity",
"constraint.hollow_or_stepped_shaft.coaxial_stack",
"constraint.hollow_or_stepped_shaft.dominant_axis_alignment",
"constraint.hollow_or_stepped_shaft.shared_passage_axis",
"constraint.hollow_or_stepped_shaft.transition_axis_continuity",
"constraint.multi_axis_manifold.multiple_axis_system",
"constraint.multi_axis_manifold.shared_passage_axis",
"constraint.patterned_plate.common_pattern_radius",
"constraint.patterned_plate.multiple_axis_system",
"constraint.patterned_plate.repeated_radius_group",
"constraint.patterned_plate.shared_passage_axis",
"constraint.patterned_plate.transition_axis_continuity",
"constraint.patterned_prismatic_part.common_pattern_radius",
"constraint.patterned_prismatic_part.multiple_axis_system",
"constraint.patterned_prismatic_part.repeated_radius_group",
"constraint.patterned_prismatic_part.shared_passage_axis",
"constraint.patterned_prismatic_part.transition_axis_continuity",
"constraint.rotational_part.coaxial_stack",
"constraint.rotational_part.dominant_axis_alignment",
"constraint.rotational_part.shared_passage_axis",
"constraint.rotational_part.transition_axis_continuity",
"constraint.shaft.coaxial_stack",
"constraint.shaft.dominant_axis_alignment",
"constraint.shaft.shared_passage_axis",
"constraint.shaft.transition_axis_continuity",
"distribution.flanged_rotational_part.bbox_middle_to_long",
"distribution.flanged_rotational_part.bbox_short_to_long",
"distribution.flanged_rotational_part.cylindrical_area_fraction",
"distribution.flanged_rotational_part.largest_coaxial_radius_to_transverse_span",
"distribution.flanged_rotational_part.pattern_radius_to_transverse_span",
"distribution.flanged_rotational_part.planar_area_fraction",
"distribution.flanged_rotational_part.repeated_feature_radius_to_transverse_span",
"distribution.flanged_rotational_part.smallest_to_largest_coaxial_radius",
"distribution.general_mechanical_part.bbox_middle_to_long",
"distribution.general_mechanical_part.bbox_short_to_long",
"distribution.general_mechanical_part.cylindrical_area_fraction",
"distribution.general_mechanical_part.planar_area_fraction",
"distribution.hollow_or_stepped_shaft.bbox_middle_to_long",
"distribution.hollow_or_stepped_shaft.bbox_short_to_long",
"distribution.hollow_or_stepped_shaft.cylindrical_area_fraction",
"distribution.hollow_or_stepped_shaft.largest_coaxial_radius_to_transverse_span",
"distribution.hollow_or_stepped_shaft.planar_area_fraction",
"distribution.hollow_or_stepped_shaft.smallest_to_largest_coaxial_radius",
"distribution.multi_axis_manifold.bbox_middle_to_long",
"distribution.multi_axis_manifold.bbox_short_to_long",
"distribution.multi_axis_manifold.cylindrical_area_fraction",
"distribution.multi_axis_manifold.pattern_radius_to_transverse_span",
"distribution.multi_axis_manifold.planar_area_fraction",
"distribution.multi_axis_manifold.repeated_feature_radius_to_transverse_span",
"distribution.patterned_plate.bbox_middle_to_long",
"distribution.patterned_plate.bbox_short_to_long",
"distribution.patterned_plate.cylindrical_area_fraction",
"distribution.patterned_plate.pattern_radius_to_transverse_span",
"distribution.patterned_plate.planar_area_fraction",
"distribution.patterned_plate.repeated_feature_radius_to_transverse_span",
"distribution.patterned_prismatic_part.bbox_middle_to_long",
"distribution.patterned_prismatic_part.bbox_short_to_long",
"distribution.patterned_prismatic_part.cylindrical_area_fraction",
"distribution.patterned_prismatic_part.largest_coaxial_radius_to_transverse_span",
"distribution.patterned_prismatic_part.pattern_radius_to_transverse_span",
"distribution.patterned_prismatic_part.planar_area_fraction",
"distribution.patterned_prismatic_part.repeated_feature_radius_to_transverse_span",
"distribution.patterned_prismatic_part.smallest_to_largest_coaxial_radius",
"distribution.plate_or_bracket.bbox_middle_to_long",
"distribution.plate_or_bracket.bbox_short_to_long",
"distribution.plate_or_bracket.cylindrical_area_fraction",
"distribution.plate_or_bracket.planar_area_fraction",
"distribution.prismatic_block.bbox_middle_to_long",
"distribution.prismatic_block.bbox_short_to_long",
"distribution.prismatic_block.cylindrical_area_fraction",
"distribution.prismatic_block.pattern_radius_to_transverse_span",
"distribution.prismatic_block.planar_area_fraction",
"distribution.prismatic_block.repeated_feature_radius_to_transverse_span",
"distribution.rotational_part.bbox_middle_to_long",
"distribution.rotational_part.bbox_short_to_long",
"distribution.rotational_part.cylindrical_area_fraction",
"distribution.rotational_part.largest_coaxial_radius_to_transverse_span",
"distribution.rotational_part.planar_area_fraction",
"distribution.rotational_part.smallest_to_largest_coaxial_radius",
"distribution.shaft.bbox_middle_to_long",
"distribution.shaft.bbox_short_to_long",
"distribution.shaft.cylindrical_area_fraction",
"distribution.shaft.largest_coaxial_radius_to_transverse_span",
"distribution.shaft.planar_area_fraction",
"distribution.shaft.smallest_to_largest_coaxial_radius",
"motif.flanged_rotational_part.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.flanged_rotational_part.multi_level_planar_profile_and_planar_dominant_body",
"motif.flanged_rotational_part.repeated_axial_hole_pattern_and_circular_equal_radius_pattern",
"motif.flanged_rotational_part.rotational_body_and_flange_like_rotational_body",
"motif.flanged_rotational_part.rotational_body_and_stepped_rotational_profile",
"motif.hollow_or_stepped_shaft.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.hollow_or_stepped_shaft.rotational_body_and_stepped_rotational_profile",
"motif.hollow_or_stepped_shaft.shaft_like_body_and_stepped_rotational_profile",
"motif.multi_axis_manifold.cylindrical_feature_network_and_multi_axis_passage",
"motif.multi_axis_manifold.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.multi_axis_manifold.multi_level_planar_profile_and_planar_dominant_body",
"motif.patterned_plate.cylindrical_feature_network_and_multi_axis_passage",
"motif.patterned_plate.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.patterned_plate.multi_level_planar_profile_and_planar_dominant_body",
"motif.patterned_plate.repeated_axial_hole_pattern_and_circular_equal_radius_pattern",
"motif.patterned_prismatic_part.cylindrical_feature_network_and_multi_axis_passage",
"motif.patterned_prismatic_part.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.patterned_prismatic_part.multi_level_planar_profile_and_planar_dominant_body",
"motif.patterned_prismatic_part.repeated_axial_hole_pattern_and_circular_equal_radius_pattern",
"motif.plate_or_bracket.multi_level_planar_profile_and_planar_dominant_body",
"motif.prismatic_block.multi_level_planar_profile_and_planar_dominant_body",
"motif.rotational_part.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.rotational_part.rotational_body_and_flange_like_rotational_body",
"motif.rotational_part.rotational_body_and_stepped_rotational_profile",
"motif.rotational_part.rotational_body_and_toroidal_blend_or_groove",
"motif.shaft.cylindrical_feature_network_and_stepped_cylindrical_passage",
"motif.shaft.rotational_body_and_stepped_rotational_profile",
"motif.shaft.shaft_like_body_and_stepped_rotational_profile"
],
"candidate_ids": [
"constraint.flanged_rotational_part.multiple_axis_system",
"constraint.general_mechanical_part.transition_axis_continuity",
"constraint.hollow_or_stepped_shaft.multiple_axis_system",
"constraint.multi_axis_manifold.transition_axis_continuity",
"constraint.prismatic_block.transition_axis_continuity",
"constraint.rotational_part.multiple_axis_system",
"distribution.general_mechanical_part.largest_coaxial_radius_to_transverse_span",
"distribution.general_mechanical_part.smallest_to_largest_coaxial_radius",
"distribution.patterned_plate.largest_coaxial_radius_to_transverse_span",
"distribution.patterned_plate.smallest_to_largest_coaxial_radius",
"distribution.plate_or_bracket.pattern_radius_to_transverse_span",
"distribution.plate_or_bracket.repeated_feature_radius_to_transverse_span",
"distribution.prismatic_block.largest_coaxial_radius_to_transverse_span",
"distribution.prismatic_block.smallest_to_largest_coaxial_radius",
"motif.flanged_rotational_part.cylindrical_feature_network_and_multi_axis_passage",
"motif.flanged_rotational_part.rotational_body_and_toroidal_blend_or_groove",
"motif.flanged_rotational_part.shaft_like_body_and_stepped_rotational_profile",
"motif.hollow_or_stepped_shaft.cylindrical_feature_network_and_multi_axis_passage",
"motif.hollow_or_stepped_shaft.rotational_body_and_toroidal_blend_or_groove",
"motif.rotational_part.cylindrical_feature_network_and_multi_axis_passage",
"motif.rotational_part.multi_level_planar_profile_and_planar_dominant_body"
]
},
"draft_contract": {
"draft_kind": "llm_generalized_experience_proposals",
"proposal_required_fields": [
"id",
"kind",
"scope",
"evidence_query",
"guidance",
"semantic_rationale"
],
"allowed_kinds": [
"feature_motif",
"constraint",
"design_rule",
"validation_rule",
"failure_repair",
"dimensionless_distribution"
]
}
}
@@ -1,173 +0,0 @@
{
"schema_version": "2.0",
"library_kind": "generalized_cad_experience",
"generated_at": "2026-07-23T11:21:55+00:00",
"induction_mode": "llm_proposals_with_deterministic_evidence_verification",
"status": "collecting_evidence",
"policy": {
"instance_parameters_allowed": false,
"absolute_coordinates_allowed": false,
"single_case_promotion_allowed": false,
"llm_semantic_review_required": true,
"draft_evidence_verified": true,
"router_consumable": true,
"minimum_support": 20,
"minimum_confidence": 0.8
},
"corpus_summary": {
"accepted_case_count": 1,
"duplicate_case_count": 0,
"rejected_case_count": 0,
"family_count": 1
},
"experience_summary": {
"llm_proposal_count": 5,
"promoted_experience_count": 0,
"candidate_experience_count": 5,
"by_kind": [],
"by_scope": [],
"candidate_by_kind": [
{
"kind": "constraint",
"count": 2
},
{
"kind": "feature_motif",
"count": 2
},
{
"kind": "validation_rule",
"count": 1
}
]
},
"experiences": [],
"candidate_experiences": [
{
"id": "constraint.patterned_prismatic_part.multiple_axis_system",
"kind": "constraint",
"scope": [
"patterned_prismatic_part"
],
"when": {
"features": [
"cylindrical_feature_network",
"multi_axis_passage"
],
"relations": [
"multiple_axis_system"
]
},
"guidance": "Represent passage directions as explicit semantic axes instead of unrelated local cuts.",
"semantic_rationale": "An explicit axis network preserves relationships when the body dimensions change.",
"support": 1,
"confidence": 1.0,
"check": "Confirm that every passage remains assigned to its intended axis system.",
"promotion_state": "candidate",
"required_support": 20,
"remaining_support": 19,
"required_confidence": 0.8,
"consumer_policy": "visible_for_review_but_not_available_to_cad_router"
},
{
"id": "constraint.patterned_prismatic_part.repeated_radius_group",
"kind": "constraint",
"scope": [
"patterned_prismatic_part"
],
"when": {
"features": [
"repeated_axial_hole_pattern"
],
"relations": [
"repeated_radius_group"
]
},
"guidance": "Preserve one shared semantic radius role across members of a repeated axial feature group.",
"semantic_rationale": "The equality relationship transfers across different overall sizes and placements.",
"support": 1,
"confidence": 1.0,
"check": "Confirm that repeated members intended to be equal retain the same radius role.",
"promotion_state": "candidate",
"required_support": 20,
"remaining_support": 19,
"required_confidence": 0.8,
"consumer_policy": "visible_for_review_but_not_available_to_cad_router"
},
{
"id": "motif.patterned_prismatic_part.cylindrical_feature_network_and_multi_axis_passage",
"kind": "feature_motif",
"scope": [
"patterned_prismatic_part"
],
"when": {
"features": [
"cylindrical_feature_network",
"multi_axis_passage"
],
"relations": [
"multiple_axis_system"
]
},
"guidance": "Model the cylindrical feature network and multi-axis passages as a coordinated feature system.",
"semantic_rationale": "The coordinated system transfers across variants while preserving semantic axes.",
"support": 1,
"confidence": 1.0,
"check": "Confirm that the cylindrical features and passages preserve their intended axis memberships.",
"promotion_state": "candidate",
"required_support": 20,
"remaining_support": 19,
"required_confidence": 0.8,
"consumer_policy": "visible_for_review_but_not_available_to_cad_router"
},
{
"id": "motif.patterned_prismatic_part.multi_level_planar_profile_and_planar_dominant_body",
"kind": "feature_motif",
"scope": [
"patterned_prismatic_part"
],
"when": {
"features": [
"multi_level_planar_profile",
"planar_dominant_body"
],
"relations": []
},
"guidance": "Treat the planar-dominant body and its multiple profile levels as one reusable structural composition.",
"semantic_rationale": "The composition describes topology without depending on an instance dimension.",
"support": 1,
"confidence": 1.0,
"check": "Confirm that the expected planar levels remain distinct and connected to the primary body.",
"promotion_state": "candidate",
"required_support": 20,
"remaining_support": 19,
"required_confidence": 0.8,
"consumer_policy": "visible_for_review_but_not_available_to_cad_router"
},
{
"id": "validation.patterned_prismatic_part.repeated_feature_consistency",
"kind": "validation_rule",
"scope": [
"patterned_prismatic_part"
],
"when": {
"features": [
"repeated_axial_hole_pattern"
],
"relations": [
"repeated_radius_group"
]
},
"guidance": "Validate repeated feature membership, equality roles, and attachment to the intended host region.",
"semantic_rationale": "These checks remain meaningful across dimensions and pattern placements.",
"support": 1,
"confidence": 1.0,
"check": "Verify repeated-member count consistency, shared radius roles, and host connectivity.",
"promotion_state": "candidate",
"required_support": 20,
"remaining_support": 19,
"required_confidence": 0.8,
"consumer_policy": "visible_for_review_but_not_available_to_cad_router"
}
]
}
@@ -1,15 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
WORKSPACE_ROOT="$(cd "$PLUGIN_ROOT/.." && pwd)"
PYTHON_BIN="${CAD_EXPERIENCE_PYTHON:-}"
if [[ -z "$PYTHON_BIN" && -x "$WORKSPACE_ROOT/text-to-cad/.venv/bin/python" ]]; then
PYTHON_BIN="$WORKSPACE_ROOT/text-to-cad/.venv/bin/python"
fi
if [[ -z "$PYTHON_BIN" ]]; then
PYTHON_BIN="python3"
fi
exec "$PYTHON_BIN" "$PLUGIN_ROOT/skills/cad-experience-builder/scripts/cad_experience.py" "$@"
@@ -1,131 +0,0 @@
---
name: cad-experience-builder
description: Batch-extract STEP files into private JSON, use the active large model to semantically distill transferable CAD methods from a sanitized batch, and deterministically verify and publish a backend-neutral experience library. Use when distilling STEP/STP corpora, reviewing candidate methods, inducing feature motifs and constraints, auditing instance-data leakage, or preparing promoted experience for cad-router and CAD backends.
---
# CAD Experience Builder
Induce methods, not copied answers. Keep source-part evidence outside the
published library and require repeated support before promoting any experience.
## Required workflow
1. Put source `.step` or `.stp` files in `parser/input/`.
2. Parse every new, content-unique STEP into visible private JSON under
`parser/output/`:
```bash
../../scripts/cad-experience extract-folder
```
3. Prepare a sanitized semantic batch:
```bash
../../scripts/cad-experience prepare
```
4. Read `work/review/semantic-batch.json` completely. Act as the semantic
distiller: compare families, parameter roles, datum roles, canonical
reconstruction stages, feature cardinality classes, relations, prior
vocabulary, failure rules, and validation targets; then author
`work/review/experience-draft.json` using
`references/llm-review-contract.md`.
Propose methods, invariants, and family-level `reconstruction_grammar`
records, not raw co-occurrence pairs. A reconstruction grammar is a
canonical backend-neutral strategy inferred from repeated geometry; it is
not the source model's recovered feature history. Do not infer
manufacturing intent or failure causes that final B-Rep evidence cannot
support.
5. Publish only after the model draft exists:
```bash
../../scripts/cad-experience publish \
--draft ../../work/review/experience-draft.json
```
The publisher recomputes support from the private corpus, rejects numeric
instance answers, keeps weak proposals as candidates, and marks the library
router-consumable only after this verification.
6. Audit the public library. Treat any failure as a hard publishing failure:
```bash
python scripts/cad_experience.py audit \
/path/to/cad-experience-library/library.json
```
7. Query only the published library for creation, modification, or rebuilding:
```bash
python scripts/cad_experience.py query \
/path/to/cad-experience-library/library.json \
--family flanged_hub_adapter \
--features base_flange,hollow_sleeve,counterbore
```
8. Pass the query result, never `parser/input`, `parser/output`, or a case JSON,
to `$cad-router` or a backend.
Direct `distill` without an LLM-authored draft is intentionally blocked. The
active Codex model supplies semantic judgment; no separate web API key is
required.
## STEP extraction boundary
- The V2 extractor reads analytic B-Rep surfaces, bounding boxes, topology
counts, axes, radii, and locations into a private evidence record.
- It derives scale-independent body classes, part families, rotational and
prismatic motifs, passage and pattern relationships, complexity roles, and
normalized ratio observations before sanitization.
- It also derives private exact cardinality evidence plus sanitized symbolic
parameter roles, datum roles, feature-count classes, and canonical
reconstruction stages. These are the evidence used to learn how to rebuild a
family without publishing any teacher dimensions.
- Exact source paths, hashes, dimensions, coordinates, and face references are
permitted in private case JSON and forbidden in the published library.
- Keep input/output as a human-visible staging area and induction corpus. Never
use it directly during creation, modification, or reconstruction.
- A semantic candidate is not a trusted design method until repeated,
independently sourced cases satisfy the promotion policy.
## Promotion rules
- One case is evidence, not experience.
- Publish generalized, dimension-free observations below threshold as visible
`candidate_experiences`, but never expose them to generation consumers.
- Require `min_support` independent cases and conditional `min_confidence`
within the proposal's semantic context before promotion.
- Promote feature compositions, semantic constraints, dimensionless
distributions, validation checks, and failure-repair methods.
- Reject absolute dimensions, coordinates, face references, source paths,
source hashes, and full parameter dictionaries from published experience.
- Keep generated examples out of the trusted corpus until independently
validated.
- Evaluate generalization on held-out cases that were not used for induction.
## Backend contract
The library is backend-neutral. A consumer receives:
- `feature_motif`: reusable compositions of feature types;
- `constraint`: invariant semantic relationships;
- `design_rule`: conditional modeling guidance;
- `dimensionless_distribution`: multi-case ratio ranges;
- `validation_rule`: checks independent of one part's coordinates;
- `failure_repair`: reusable detection and repair methods.
- `reconstruction_grammar`: symbolic parameters, datums, canonical feature
stages, optional/required feature roles, and validation roles for a family.
build123d, SimpleCADAPI, or another backend translates the same queried
experience into its own operations. Experience must never contain executable
teacher geometry.
## References
- Read `references/case-input-contract.md` before producing batch input.
- Read `references/experience-library-schema.md` before extending the output
schema or adding a consumer.
- Read `references/llm-review-contract.md` before authoring or revising a
semantic proposal draft.
@@ -1,4 +0,0 @@
interface:
display_name: "CAD Experience Builder"
short_description: "蒸馏可迁移的 CAD 重建语法、约束与验证经验"
default_prompt: "Use $cad-experience-builder to prepare sanitized STEP evidence, induce family-level symbolic reconstruction grammars and reusable methods, publish only deterministically verified experience, and report candidate versus promoted results."
@@ -1,81 +0,0 @@
# Case JSON input contract
Case JSON is private evidence used only during induction. It may contain exact
parameters, but the inducer never copies those fields into published experience.
Store source STEP files in `cad-experience-plugin/parser/input` and generated
case JSON in `cad-experience-plugin/parser/output`.
Do not pass either folder or a case JSON to cad-router or a CAD backend.
Creation, modification, and reconstruction may consume only the promoted public
experience library.
Supported fields:
```json
{
"provenance": {"source_sha256": "..."},
"design_ir": {
"part_family": "flanged_hub_adapter",
"features": [{"type": "base_flange"}, {"type": "hollow_sleeve"}],
"constraints": [{"id": "coaxial_stack", "type": "coaxial"}],
"reconstruction_evidence": {
"parameter_roles": ["overall_long_span", "coaxial_diameter_roles"],
"datum_roles": ["part_center", "primary_axis"],
"feature_roles": ["rotational_body", "coaxial_cylindrical_stack"],
"relation_roles": ["coaxial_stack"],
"canonical_stages": [
{
"id": "establish_reference_frame",
"operation": "define_datums",
"feature_roles": [],
"reference_roles": ["part_center", "primary_axis"]
}
],
"private_cardinality_evidence": {
"feature_role_count": 5,
"feature_role_count_class": "repeated"
},
"validation_roles": ["closed_solid", "coaxial_stack"]
},
"normalized_observations": [
{
"name": "sleeve_od_to_base_od",
"value": 0.35,
"numerator_role": "sleeve_outer_diameter",
"denominator_role": "base_outer_diameter"
}
]
},
"experience": {
"rules": [
{
"id": "bound_counterbore_to_host",
"scope": ["counterbore"],
"statement": "Terminate a counterbore at its host boundary.",
"repair": "Bind the cutter extent to the host feature."
}
],
"validation_targets": [
{
"id": "counterbore_host_boundary",
"check": "A counterbore does not cross an unrelated adjacent feature."
}
]
}
}
```
Rules and checks containing numeric literals are rejected because they are
likely instance answers. Ratios are accepted only through
`normalized_observations`, with an explicit numerator and denominator role.
Legacy distilled JSON can be used when it contains the fields above. Exact
`parameters`, `evidence`, centers, axes, and surface references are ignored.
V3 extractor output should also provide several independent semantic signals
per case: body-aspect class, topology-complexity role, analytic feature
networks, part family, relationship candidates, and role-named dimensionless
observations. It additionally provides symbolic reconstruction roles, canonical
reconstruction stages, and private exact cardinality evidence. Sanitization
converts exact counts into qualitative classes before LLM review. Do not encode
an absolute source dimension as a feature token.
@@ -1,84 +0,0 @@
# Published experience library
The published library uses schema version `2.0` and contains only promoted,
generalized experience:
```json
{
"schema_version": "2.0",
"library_kind": "generalized_cad_experience",
"induction_mode": "llm_proposals_with_deterministic_evidence_verification",
"policy": {
"instance_parameters_allowed": false,
"absolute_coordinates_allowed": false,
"llm_semantic_review_required": true,
"draft_evidence_verified": true,
"router_consumable": true,
"minimum_support": 20
},
"corpus_summary": {
"accepted_case_count": 1000,
"duplicate_case_count": 12
},
"experience_summary": {
"llm_proposal_count": 24,
"promoted_experience_count": 18,
"candidate_experience_count": 6,
"by_kind": [{"kind": "feature_motif", "count": 7}],
"by_scope": [{"scope": "flanged_hub_adapter", "count": 5}]
},
"experiences": [
{
"id": "motif.base_flange+hollow_sleeve",
"kind": "feature_motif",
"scope": ["flanged_hub_adapter"],
"when": {"features": ["base_flange", "hollow_sleeve"]},
"guidance": "Treat these feature roles as a reusable composition.",
"support": 243,
"confidence": 0.91
}
],
"candidate_experiences": [
{
"id": "motif.flanged_hub_adapter.base_flange+hollow_sleeve",
"kind": "feature_motif",
"scope": ["flanged_hub_adapter"],
"when": {"features": ["base_flange", "hollow_sleeve"]},
"support": 7,
"required_support": 20,
"remaining_support": 13,
"promotion_state": "candidate",
"consumer_policy": "visible_for_review_but_not_available_to_cad_router"
}
]
}
```
Allowed numeric values describe evidence strength or dimensionless
distributions: support counts, confidence, frequency, percentiles, and sample
counts. Absolute lengths, diameters, heights, radii, angles tied to a single
case, positions, and coordinates are forbidden.
Consumers query this library by requested family and feature vocabulary. They
must not receive the induction corpus, private case JSON, or
`candidate_experiences`. Only `experiences` is executable guidance.
## Reconstruction grammar
`reconstruction_grammar` is the executable bridge between generalized
experience and a backend-neutral design plan. It may contain only:
- symbolic `parameter_roles`;
- symbolic `datum_roles`;
- required or optional semantic feature and relation roles;
- canonical stages with tokenized operation, feature, and reference roles;
- qualitative cardinality classes such as `single`, `paired`, `repeated`, or
`dense`;
- validation roles.
It must not contain parameter values, exact member counts, absolute
coordinates, source identifiers, face references, or executable teacher
geometry. The publisher verifies that every promoted role and stage is present
in enough independent private cases. A consumer instantiates the grammar using
the user's dimensions, inferred dimensionless distributions, and backend
operations.
@@ -1,97 +0,0 @@
# LLM semantic review contract
Read the sanitized `work/review/semantic-batch.json`, not raw STEP geometry.
Maintain stable proposal identifiers when an existing candidate expresses the
same method.
Write `work/review/experience-draft.json` with this shape:
```json
{
"schema_version": "1.0",
"draft_kind": "llm_generalized_experience_proposals",
"proposals": [
{
"id": "constraint.part_family.shared_axis",
"kind": "constraint",
"scope": ["part_family"],
"evidence_query": {
"required_features": ["rotational_body", "central_passage"],
"required_relations": ["dominant_axis_alignment"],
"context_features": ["rotational_body", "central_passage"]
},
"guidance": "Preserve a shared axis across the participating feature roles.",
"semantic_rationale": "The relationship remains meaningful when individual dimensions change.",
"check": "Confirm that participating features retain their intended common axis."
}
]
}
```
Allowed kinds are `feature_motif`, `constraint`, `design_rule`,
`validation_rule`, `failure_repair`, `dimensionless_distribution`, and
`reconstruction_grammar`.
Distribution proposals also provide `observation_name`; the publisher computes
the distribution from private evidence and never accepts values from the draft.
A `reconstruction_grammar` proposal must additionally contain symbolic,
number-free reconstruction content:
```json
{
"id": "reconstruction.patterned_prismatic_part.primary",
"kind": "reconstruction_grammar",
"scope": ["patterned_prismatic_part"],
"evidence_query": {
"required_features": ["planar_dominant_body", "cylindrical_feature_network"],
"required_relations": [],
"context_features": ["planar_dominant_body"]
},
"guidance": "Build a datum-driven envelope before adding the passage network and repeated features.",
"semantic_rationale": "The staged method transfers across dimensional variants while preserving feature relationships.",
"reconstruction_grammar": {
"parameter_roles": ["overall_long_span", "overall_middle_span", "overall_short_span"],
"datum_roles": ["part_center", "primary_axis", "primary_transverse_plane"],
"feature_roles": ["planar_dominant_body", "cylindrical_feature_network"],
"relation_roles": [],
"canonical_stages": [
{
"id": "establish_reference_frame",
"operation": "define_datums",
"feature_roles": [],
"reference_roles": ["part_center", "primary_axis"]
},
{
"id": "construct_primary_envelope",
"operation": "extrude_profile",
"feature_roles": ["planar_dominant_body"],
"reference_roles": ["part_center", "primary_axis"]
}
],
"cardinality_classes": ["plane_dense", "cylinder_dense"],
"validation_roles": ["closed_solid", "surface_mix_consistency"]
}
}
```
Follow these rules:
- Require an evidence query composed only of semantic feature and relation
tokens present in the sanitized batch.
- Use scopes to prevent unrelated part families from supporting a proposal.
- Use `context_features` to define the conditional population used for
confidence, so a valid subtype method is not diluted by unrelated variants
in the same broad family.
- Explain why a proposal transfers across dimensions and variants.
- Avoid dimensions, coordinates, source identifiers, face references, and
numeric literals in prose.
- Do not infer build order or causal failure mechanisms from final geometry.
- Treat `canonical_stages` as a recommended reconstruction order, never as a
claim about the source CAD history.
- For reconstruction grammars, retain only roles and stages repeated by the
scoped evidence. Do not insert family knowledge that the sanitized batch
does not support.
- Prefer a small set of meaningful methods over every possible feature pair.
- Preserve earlier proposal IDs when evidence still supports the same meaning.
- Let the publisher calculate support and confidence; never claim them in the
draft.
File diff suppressed because it is too large Load Diff
@@ -1,767 +0,0 @@
#!/usr/bin/env python3
"""Extract a private, backend-neutral case record from an analytic STEP model."""
from __future__ import annotations
import argparse
import hashlib
import json
import math
from collections import Counter, defaultdict
from pathlib import Path
from typing import Any
EXTRACTOR_VERSION = "3.0"
def _rounded(value: float) -> float:
return round(float(value), 6)
def _component(value: Any, name: str) -> float:
component = getattr(value, name)
return float(component() if callable(component) else component)
def _point(value: Any) -> list[float]:
return [_rounded(_component(value, name)) for name in ("X", "Y", "Z")]
def _direction(value: Any) -> list[float]:
return _point(value)
def _canonical_axis(direction: list[float]) -> str:
index = max(range(3), key=lambda item: abs(direction[item]))
return ("x", "y", "z")[index]
def _radial_offset(location: list[float], center: list[float], axis: str) -> float:
axes = {"x": (1, 2), "y": (0, 2), "z": (0, 1)}
first, second = axes[axis]
return math.hypot(
location[first] - center[first],
location[second] - center[second],
)
def _ratio(numerator: float, denominator: float) -> float:
return _rounded(numerator / denominator) if denominator > 1e-9 else 0.0
def _observation(
name: str, value: float, numerator_role: str, denominator_role: str
) -> dict[str, Any]:
return {
"name": name,
"value": _rounded(value),
"numerator_role": numerator_role,
"denominator_role": denominator_role,
}
def _cardinality_class(count: int) -> str:
if count <= 0:
return "absent"
if count == 1:
return "single"
if count == 2:
return "paired"
if count <= 6:
return "repeated"
return "dense"
def _surface_record(face: Any, index: int) -> dict[str, Any]:
from OCP.BRepAdaptor import BRepAdaptor_Surface
from OCP.GeomAbs import (
GeomAbs_Cone,
GeomAbs_Cylinder,
GeomAbs_Plane,
GeomAbs_Sphere,
GeomAbs_Torus,
)
adaptor = BRepAdaptor_Surface(face.wrapped)
kind = adaptor.GetType()
record: dict[str, Any] = {
"surface_id": f"face_{index}",
"area": _rounded(face.area),
"center": _point(face.center()),
}
if kind == GeomAbs_Plane:
plane = adaptor.Plane()
record.update(
{
"type": "plane",
"location": _point(plane.Location()),
"axis": _direction(plane.Axis().Direction()),
}
)
elif kind == GeomAbs_Cylinder:
cylinder = adaptor.Cylinder()
record.update(
{
"type": "cylinder",
"location": _point(cylinder.Location()),
"axis": _direction(cylinder.Axis().Direction()),
"radius": _rounded(cylinder.Radius()),
}
)
elif kind == GeomAbs_Cone:
cone = adaptor.Cone()
record.update(
{
"type": "cone",
"location": _point(cone.Location()),
"axis": _direction(cone.Axis().Direction()),
"reference_radius": _rounded(cone.RefRadius()),
"semi_angle_radians": _rounded(cone.SemiAngle()),
}
)
elif kind == GeomAbs_Sphere:
sphere = adaptor.Sphere()
record.update(
{
"type": "sphere",
"location": _point(sphere.Location()),
"radius": _rounded(sphere.Radius()),
}
)
elif kind == GeomAbs_Torus:
torus = adaptor.Torus()
record.update(
{
"type": "torus",
"location": _point(torus.Location()),
"axis": _direction(torus.Axis().Direction()),
"major_radius": _rounded(torus.MajorRadius()),
"minor_radius": _rounded(torus.MinorRadius()),
}
)
else:
record["type"] = "other"
return record
def _semantic_summary(
surfaces: list[dict[str, Any]], bbox_center: list[float], bbox_size: list[float]
) -> tuple[str, list[dict[str, Any]], list[dict[str, Any]], dict[str, Any]]:
cylinders = [item for item in surfaces if item["type"] == "cylinder"]
cones = [item for item in surfaces if item["type"] == "cone"]
axis_votes: Counter[str] = Counter()
for surface in cylinders + cones:
axis_votes[_canonical_axis(surface["axis"])] += max(surface["area"], 1.0)
dominant_axis = axis_votes.most_common(1)[0][0] if axis_votes else "z"
scale = max(bbox_size) if bbox_size else 1.0
sorted_spans = sorted((max(float(value), 1e-9) for value in bbox_size))
short_span, middle_span, long_span = sorted_spans
long_to_middle = _ratio(long_span, middle_span)
middle_to_short = _ratio(middle_span, short_span)
short_to_long = _ratio(short_span, long_span)
coaxial_tolerance = max(scale * 0.005, 1e-4)
parallel_cylinders: list[dict[str, Any]] = []
coaxial_cylinders: list[dict[str, Any]] = []
off_axis_cylinders: list[dict[str, Any]] = []
for surface in cylinders:
if _canonical_axis(surface["axis"]) != dominant_axis:
continue
enriched = dict(surface)
enriched["radial_offset"] = _rounded(
_radial_offset(surface["location"], bbox_center, dominant_axis)
)
parallel_cylinders.append(enriched)
if enriched["radial_offset"] <= coaxial_tolerance:
coaxial_cylinders.append(enriched)
else:
off_axis_cylinders.append(enriched)
distinct_coaxial_radii = {
round(surface["radius"], 4) for surface in coaxial_cylinders
}
repeated_groups: dict[float, list[dict[str, Any]]] = defaultdict(list)
for surface in off_axis_cylinders:
repeated_groups[round(surface["radius"], 4)].append(surface)
repeated_group_sizes = sorted(
(len(rows) for rows in repeated_groups.values()), reverse=True
)
largest_repeated_group = (
max(repeated_groups.values(), key=len) if repeated_groups else []
)
parallel_cones = [
item for item in cones if _canonical_axis(item["axis"]) == dominant_axis
]
has_rotational_stack = len(distinct_coaxial_radii) >= 2
has_repeated_axial_holes = bool(repeated_group_sizes and repeated_group_sizes[0] >= 3)
has_multi_axis_passages = any(
_canonical_axis(item["axis"]) != dominant_axis for item in cylinders
)
planes = [item for item in surfaces if item["type"] == "plane"]
toruses = [item for item in surfaces if item["type"] == "torus"]
spheres = [item for item in surfaces if item["type"] == "sphere"]
other_surfaces = [item for item in surfaces if item["type"] == "other"]
total_area = sum(max(float(item.get("area", 0.0)), 0.0) for item in surfaces)
planar_area = sum(max(float(item.get("area", 0.0)), 0.0) for item in planes)
cylindrical_area = sum(
max(float(item.get("area", 0.0)), 0.0) for item in cylinders
)
planar_fraction = _ratio(planar_area, total_area)
cylindrical_fraction = _ratio(cylindrical_area, total_area)
elongated = long_to_middle >= 3.0
plate_like = middle_to_short >= 4.0 and long_to_middle < 3.0
compact = long_to_middle < 2.0 and middle_to_short < 2.5
transverse_axes = {
"x": (1, 2),
"y": (0, 2),
"z": (0, 1),
}[dominant_axis]
transverse_span = max(bbox_size[index] for index in transverse_axes)
dominant_span = bbox_size[{"x": 0, "y": 1, "z": 2}[dominant_axis]]
largest_coaxial_radius = max(
(surface["radius"] for surface in coaxial_cylinders), default=0.0
)
smallest_coaxial_radius = min(
(surface["radius"] for surface in coaxial_cylinders), default=0.0
)
pattern_offsets = [
_radial_offset(surface["location"], bbox_center, dominant_axis)
for surface in largest_repeated_group
]
pattern_mean_offset = (
sum(pattern_offsets) / len(pattern_offsets) if pattern_offsets else 0.0
)
pattern_spread = (
max(pattern_offsets) - min(pattern_offsets) if pattern_offsets else 0.0
)
has_circular_pattern = bool(
len(pattern_offsets) >= 3
and pattern_mean_offset > coaxial_tolerance
and pattern_spread / pattern_mean_offset <= 0.08
)
# Multiple radii sharing a transverse center are a robust final-B-Rep
# signal for stepped bores/counterbores, without claiming operation order.
transverse_groups: dict[tuple[int, int, int], set[float]] = defaultdict(set)
axis_index = {"x": 0, "y": 1, "z": 2}[dominant_axis]
for surface in parallel_cylinders:
location = surface["location"]
key = (
int(round(location[transverse_axes[0]] / max(coaxial_tolerance, 1e-6))),
int(round(location[transverse_axes[1]] / max(coaxial_tolerance, 1e-6))),
axis_index,
)
transverse_groups[key].add(round(surface["radius"], 4))
has_stepped_cylindrical_passage = any(
len(radii) >= 2 for radii in transverse_groups.values()
)
features: list[dict[str, Any]] = []
if has_rotational_stack:
features.extend(
[
{"type": "rotational_body"},
{"type": "coaxial_cylindrical_stack"},
]
)
if len(distinct_coaxial_radii) >= 3:
features.append({"type": "central_passage_candidate"})
if parallel_cones:
features.append({"type": "conical_transition"})
if has_repeated_axial_holes:
features.append({"type": "repeated_axial_hole_pattern"})
if has_multi_axis_passages:
features.append({"type": "multi_axis_passage"})
features.append(
{
"type": (
"elongated_body"
if elongated
else "plate_like_body"
if plate_like
else "compact_body"
if compact
else "moderate_aspect_body"
)
}
)
if planar_fraction >= 0.55:
features.append({"type": "planar_dominant_body"})
if cylindrical_fraction >= 0.55:
features.append({"type": "cylindrical_dominant_body"})
if len(planes) >= 6:
features.append({"type": "multi_level_planar_profile"})
if len(cylinders) >= 2:
features.append({"type": "cylindrical_feature_network"})
if toruses:
features.append({"type": "toroidal_blend_or_groove"})
if spheres:
features.append({"type": "spherical_surface_feature"})
if other_surfaces:
features.append({"type": "freeform_surface_region"})
if has_circular_pattern:
features.append({"type": "circular_equal_radius_pattern"})
if has_stepped_cylindrical_passage:
features.append({"type": "stepped_cylindrical_passage"})
if has_rotational_stack:
features.append({"type": "stepped_rotational_profile"})
if elongated:
features.append({"type": "shaft_like_body"})
if len(distinct_coaxial_radii) >= 3 and elongated:
features.append({"type": "sleeve_or_hollow_shaft_candidate"})
if transverse_span > 0 and dominant_span / transverse_span < 0.8:
features.append({"type": "flange_like_rotational_body"})
if len(surfaces) >= 40:
features.append({"type": "high_topological_complexity"})
elif len(surfaces) >= 16:
features.append({"type": "medium_topological_complexity"})
else:
features.append({"type": "low_topological_complexity"})
constraints: list[dict[str, Any]] = []
if has_rotational_stack:
constraints.extend(
[
{"id": "dominant_axis_alignment", "type": "axis_alignment"},
{"id": "coaxial_stack", "type": "coaxial"},
]
)
if has_repeated_axial_holes:
constraints.append(
{"id": "repeated_radius_group", "type": "repeated_feature"}
)
if parallel_cones:
constraints.append(
{"id": "transition_axis_continuity", "type": "axis_alignment"}
)
if has_circular_pattern:
constraints.append(
{"id": "common_pattern_radius", "type": "radial_pattern"}
)
if has_multi_axis_passages:
constraints.append(
{"id": "multiple_axis_system", "type": "axis_network"}
)
if has_stepped_cylindrical_passage:
constraints.append(
{"id": "shared_passage_axis", "type": "coaxial"}
)
if has_rotational_stack and has_repeated_axial_holes:
family = "flanged_rotational_part"
elif has_rotational_stack and elongated and len(distinct_coaxial_radii) >= 3:
family = "hollow_or_stepped_shaft"
elif has_rotational_stack and elongated:
family = "shaft"
elif has_rotational_stack:
family = "rotational_part"
elif has_repeated_axial_holes and plate_like:
family = "patterned_plate"
elif has_repeated_axial_holes:
family = "patterned_prismatic_part"
elif has_multi_axis_passages and len(cylinders) >= 3:
family = "multi_axis_manifold"
elif plate_like and planes:
family = "plate_or_bracket"
elif planar_fraction >= 0.55:
family = "prismatic_block"
elif other_surfaces or toruses or spheres:
family = "hybrid_freeform_part"
else:
family = "general_mechanical_part"
observations = [
_observation(
"bbox_short_to_long",
short_to_long,
"short_bounding_span",
"long_bounding_span",
),
_observation(
"bbox_middle_to_long",
_ratio(middle_span, long_span),
"middle_bounding_span",
"long_bounding_span",
),
_observation(
"planar_area_fraction",
planar_fraction,
"planar_surface_area",
"total_surface_area",
),
_observation(
"cylindrical_area_fraction",
cylindrical_fraction,
"cylindrical_surface_area",
"total_surface_area",
),
]
if largest_coaxial_radius > 0:
observations.append(
_observation(
"largest_coaxial_radius_to_transverse_span",
_ratio(largest_coaxial_radius, transverse_span),
"largest_coaxial_radius",
"transverse_bounding_span",
)
)
if smallest_coaxial_radius > 0 and largest_coaxial_radius > 0:
observations.append(
_observation(
"smallest_to_largest_coaxial_radius",
_ratio(smallest_coaxial_radius, largest_coaxial_radius),
"smallest_coaxial_radius",
"largest_coaxial_radius",
)
)
if pattern_mean_offset > 0:
observations.append(
_observation(
"pattern_radius_to_transverse_span",
_ratio(pattern_mean_offset, transverse_span),
"pattern_radius",
"transverse_bounding_span",
)
)
if largest_repeated_group:
observations.append(
_observation(
"repeated_feature_radius_to_transverse_span",
_ratio(largest_repeated_group[0]["radius"], transverse_span),
"repeated_feature_radius",
"transverse_bounding_span",
)
)
summary = {
"dominant_axis": dominant_axis,
"coaxial_cylinder_surface_count": len(coaxial_cylinders),
"distinct_coaxial_radius_count": len(distinct_coaxial_radii),
"off_axis_parallel_cylinder_surface_count": len(off_axis_cylinders),
"largest_repeated_radius_group": repeated_group_sizes[0]
if repeated_group_sizes
else 0,
"parallel_cone_surface_count": len(parallel_cones),
"has_multi_axis_passages": has_multi_axis_passages,
"shape_class": (
"elongated" if elongated else "plate_like" if plate_like else "compact"
if compact
else "moderate_aspect"
),
"normalized_observations": observations,
}
return family, features, constraints, summary
def _reconstruction_evidence(
surfaces: list[dict[str, Any]],
features: list[dict[str, Any]],
constraints: list[dict[str, Any]],
semantic_summary: dict[str, Any],
) -> dict[str, Any]:
"""Describe a canonical reconstruction grammar without claiming CAD history."""
feature_roles = sorted(
{
str(item.get("type"))
for item in features
if isinstance(item, dict) and item.get("type")
}
)
relation_roles = sorted(
{
str(item.get("id") or item.get("type"))
for item in constraints
if isinstance(item, dict) and (item.get("id") or item.get("type"))
}
)
surface_counts = Counter(item.get("type", "other") for item in surfaces)
parameter_roles = [
"overall_long_span",
"overall_middle_span",
"overall_short_span",
"primary_axis_span",
"primary_transverse_span",
"secondary_transverse_span",
]
if "cylindrical_feature_network" in feature_roles:
parameter_roles.extend(
[
"passage_diameter_roles",
"passage_axis_offset_roles",
"passage_extent_roles",
]
)
if "coaxial_cylindrical_stack" in feature_roles:
parameter_roles.extend(
[
"coaxial_diameter_roles",
"axial_segment_length_roles",
"shoulder_position_roles",
]
)
if "repeated_axial_hole_pattern" in feature_roles:
parameter_roles.extend(
[
"pattern_member_diameter_role",
"pattern_radius_or_spacing_role",
"pattern_angular_or_linear_phase_role",
]
)
if "multi_level_planar_profile" in feature_roles:
parameter_roles.extend(
[
"planar_level_offset_roles",
"profile_width_roles",
"profile_length_roles",
]
)
if "conical_transition" in feature_roles:
parameter_roles.append("transition_slope_role")
stages: list[dict[str, Any]] = [
{
"id": "establish_reference_frame",
"operation": "define_datums",
"feature_roles": [],
"reference_roles": [
"part_center",
"primary_axis",
"primary_transverse_plane",
"secondary_transverse_plane",
],
},
{
"id": "construct_primary_envelope",
"operation": (
"revolve_profile"
if "rotational_body" in feature_roles
else "extrude_profile"
),
"feature_roles": [
role
for role in (
"rotational_body",
"planar_dominant_body",
"elongated_body",
"plate_like_body",
"compact_body",
"moderate_aspect_body",
)
if role in feature_roles
],
"reference_roles": ["part_center", "primary_axis"],
},
]
if "multi_level_planar_profile" in feature_roles:
stages.append(
{
"id": "establish_planar_levels",
"operation": "add_or_remove_profile_levels",
"feature_roles": ["multi_level_planar_profile"],
"reference_roles": ["primary_transverse_plane"],
}
)
if "coaxial_cylindrical_stack" in feature_roles:
stages.append(
{
"id": "construct_coaxial_stack",
"operation": "add_or_cut_coaxial_profiles",
"feature_roles": ["coaxial_cylindrical_stack"],
"reference_roles": ["primary_axis"],
}
)
if "cylindrical_feature_network" in feature_roles:
stages.append(
{
"id": "construct_passage_network",
"operation": "cut_semantic_passages",
"feature_roles": [
role
for role in (
"cylindrical_feature_network",
"central_passage_candidate",
"stepped_cylindrical_passage",
"multi_axis_passage",
)
if role in feature_roles
],
"reference_roles": ["primary_axis", "part_center"],
}
)
if "repeated_axial_hole_pattern" in feature_roles:
stages.append(
{
"id": "construct_repeated_feature_pattern",
"operation": "pattern_semantic_feature",
"feature_roles": [
role
for role in (
"repeated_axial_hole_pattern",
"circular_equal_radius_pattern",
)
if role in feature_roles
],
"reference_roles": ["primary_axis", "part_center"],
}
)
transition_roles = [
role
for role in (
"conical_transition",
"toroidal_blend_or_groove",
"spherical_surface_feature",
"freeform_surface_region",
)
if role in feature_roles
]
if transition_roles:
stages.append(
{
"id": "resolve_transitions_and_finishing",
"operation": "apply_transitions_or_blends",
"feature_roles": transition_roles,
"reference_roles": ["primary_axis"],
}
)
stages.append(
{
"id": "validate_reconstructed_shape",
"operation": "validate_geometry_and_relations",
"feature_roles": feature_roles,
"reference_roles": ["part_center", "primary_axis"],
}
)
return {
"interpretation": "canonical_reconstruction_plan_not_recovered_history",
"parameter_roles": sorted(set(parameter_roles)),
"datum_roles": [
"part_center",
"primary_axis",
"primary_transverse_plane",
"secondary_transverse_plane",
],
"feature_roles": feature_roles,
"relation_roles": relation_roles,
"canonical_stages": stages,
"private_cardinality_evidence": {
"surface_type_counts": dict(sorted(surface_counts.items())),
"surface_type_classes": {
kind: _cardinality_class(count)
for kind, count in sorted(surface_counts.items())
},
"feature_role_count": len(feature_roles),
"feature_role_count_class": _cardinality_class(len(feature_roles)),
"coaxial_radius_role_count": int(
semantic_summary.get("distinct_coaxial_radius_count", 0)
),
"coaxial_radius_role_count_class": _cardinality_class(
int(semantic_summary.get("distinct_coaxial_radius_count", 0))
),
"repeated_member_count": int(
semantic_summary.get("largest_repeated_radius_group", 0)
),
"repeated_member_count_class": _cardinality_class(
int(semantic_summary.get("largest_repeated_radius_group", 0))
),
},
"validation_roles": sorted(
{
"closed_solid",
"bounding_proportion_consistency",
"surface_mix_consistency",
*relation_roles,
}
),
}
def extract_step_case(source: Path) -> dict[str, Any]:
from build123d import import_step
resolved = source.expanduser().resolve()
source_bytes = resolved.read_bytes()
shape = import_step(str(resolved))
bbox = shape.bounding_box()
bbox_min = _point(bbox.min)
bbox_max = _point(bbox.max)
bbox_size = _point(bbox.size)
bbox_center = [
_rounded((lower + upper) / 2.0)
for lower, upper in zip(bbox_min, bbox_max)
]
surfaces = [
_surface_record(face, index) for index, face in enumerate(shape.faces())
]
surface_counts = Counter(surface["type"] for surface in surfaces)
family, features, constraints, semantic_summary = _semantic_summary(
surfaces, bbox_center, bbox_size
)
reconstruction_evidence = _reconstruction_evidence(
surfaces, features, constraints, semantic_summary
)
digest = hashlib.sha256(source_bytes).hexdigest()
normalized_observations = semantic_summary.pop("normalized_observations", [])
return {
"schema_version": "2.0",
"extractor_version": EXTRACTOR_VERSION,
"case_kind": "private_step_evidence",
"case_id": digest,
"provenance": {
"source_path": str(resolved),
"source_sha256": digest,
"source_format": "step",
},
"geometry_evidence": {
"valid": bool(shape.is_valid),
"solid_count": len(shape.solids()),
"face_count": len(shape.faces()),
"volume": _rounded(shape.volume),
"bounding_box": {
"min": bbox_min,
"max": bbox_max,
"size": bbox_size,
"center": bbox_center,
},
"analytic_surface_counts": dict(sorted(surface_counts.items())),
"analytic_surfaces": surfaces,
},
"design_ir": {
"part_family": family,
"features": features,
"constraints": constraints,
"normalized_observations": normalized_observations,
"semantic_summary": semantic_summary,
"reconstruction_evidence": reconstruction_evidence,
},
"experience": {
"rules": [],
"validation_targets": [],
"promotion_state": "evidence_only",
},
}
def write_json(path: Path, payload: dict[str, Any]) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(
json.dumps(payload, indent=2, ensure_ascii=False) + "\n", encoding="utf-8"
)
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(
description="Extract a private case JSON from a STEP file."
)
parser.add_argument("source", type=Path)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args(argv)
write_json(args.output, extract_step_case(args.source))
print(args.output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
@@ -1,382 +0,0 @@
from __future__ import annotations
import importlib.util
import json
import unittest
from pathlib import Path
SCRIPT = (
Path(__file__).parents[1]
/ "skills"
/ "cad-experience-builder"
/ "scripts"
/ "cad_experience.py"
)
SPEC = importlib.util.spec_from_file_location("cad_experience", SCRIPT)
MODULE = importlib.util.module_from_spec(SPEC)
assert SPEC.loader
SPEC.loader.exec_module(MODULE)
STEP_SCRIPT = (
Path(__file__).parents[1]
/ "skills"
/ "cad-experience-builder"
/ "scripts"
/ "step_to_case.py"
)
STEP_SPEC = importlib.util.spec_from_file_location("step_to_case", STEP_SCRIPT)
STEP_MODULE = importlib.util.module_from_spec(STEP_SPEC)
assert STEP_SPEC.loader
STEP_SPEC.loader.exec_module(STEP_MODULE)
def make_case(index: int) -> dict:
return {
"provenance": {"source_sha256": f"case_{index}"},
"design_ir": {
"part_family": "flanged_hub_adapter",
"features": [
{"type": "base_flange", "center": [91.0, 52.0]},
{"type": "hollow_sleeve", "surface_ids": ["face_1"]},
{"type": "counterbore"},
],
"constraints": [{"id": "coaxial_stack", "type": "coaxial"}],
"parameters": {
"base_outer_diameter": 91.0,
"counterbore_spacing": 52.0,
},
"normalized_observations": [
{
"name": "sleeve_od_to_base_od",
"value": 0.3 + index * 0.001,
"numerator_role": "sleeve_outer_diameter",
"denominator_role": "base_outer_diameter",
}
],
"reconstruction_evidence": {
"parameter_roles": [
"overall_long_span",
"overall_middle_span",
"overall_short_span",
],
"datum_roles": ["part_center", "primary_axis"],
"feature_roles": ["base_flange", "hollow_sleeve", "counterbore"],
"relation_roles": ["coaxial_stack"],
"canonical_stages": [
{
"id": "establish_reference_frame",
"operation": "define_datums",
"feature_roles": [],
"reference_roles": ["part_center", "primary_axis"],
},
{
"id": "construct_primary_envelope",
"operation": "revolve_profile",
"feature_roles": ["base_flange", "hollow_sleeve"],
"reference_roles": ["primary_axis"],
},
],
"private_cardinality_evidence": {
"surface_type_classes": {
"plane": "repeated",
"cylinder": "dense",
},
"feature_role_count_class": "repeated",
},
"validation_roles": ["closed_solid", "coaxial_stack"],
},
},
"experience": {
"rules": [
{
"id": "bound_counterbore_to_host",
"scope": ["flanged_hub_adapter"],
"statement": "Terminate a counterbore at its host boundary.",
"repair": "Bind the cutter extent to the host feature.",
}
],
"validation_targets": [
{
"id": "host_boundary",
"check": "A counterbore does not cross an unrelated adjacent feature.",
}
],
},
}
class CadExperienceTest(unittest.TestCase):
def reviewed_proposal(self) -> dict:
return {
"id": "constraint.flanged_hub_adapter.shared_axis",
"kind": "constraint",
"scope": ["flanged_hub_adapter"],
"evidence_query": {
"required_features": ["base_flange", "hollow_sleeve"],
"required_relations": ["coaxial_stack"],
},
"guidance": "Preserve a shared axis across participating feature roles.",
"semantic_rationale": "The relationship transfers across dimensional variants.",
}
def test_semantic_summary_derives_roles_without_copying_dimensions(self):
surfaces = [
{
"type": "cylinder",
"axis": [0.0, 1.0, 0.0],
"location": [0.0, 0.0, 0.0],
"radius": radius,
"area": 100.0,
}
for radius in (5.0, 10.0, 20.0)
]
surfaces.extend(
{
"type": "cylinder",
"axis": [0.0, 1.0, 0.0],
"location": [offset, 0.0, 0.0],
"radius": 2.0,
"area": 20.0,
}
for offset in (-15.0, 15.0, 16.0)
)
surfaces.append(
{
"type": "cone",
"axis": [0.0, 1.0, 0.0],
"location": [0.0, 0.0, 0.0],
"reference_radius": 10.0,
"semi_angle_radians": 0.5,
"area": 50.0,
}
)
family, features, constraints, summary = STEP_MODULE._semantic_summary(
surfaces, [0.0, 0.0, 0.0], [40.0, 20.0, 40.0]
)
self.assertEqual("flanged_rotational_part", family)
self.assertIn(
"coaxial_cylindrical_stack", {item["type"] for item in features}
)
self.assertIn("coaxial_stack", {item["id"] for item in constraints})
self.assertEqual("y", summary["dominant_axis"])
self.assertTrue(summary["normalized_observations"])
reconstruction = STEP_MODULE._reconstruction_evidence(
surfaces, features, constraints, summary
)
self.assertIn("overall_long_span", reconstruction["parameter_roles"])
self.assertTrue(reconstruction["canonical_stages"])
self.assertEqual(
"canonical_reconstruction_plan_not_recovered_history",
reconstruction["interpretation"],
)
def test_conditional_feature_context_does_not_dilute_valid_method(self):
proposal = self.reviewed_proposal()
proposal["evidence_query"]["context_features"] = [
"base_flange",
"hollow_sleeve",
]
target = [MODULE.normalize_case(make_case(index)) for index in range(20)]
unrelated = []
for index in range(80):
payload = make_case(index + 100)
payload["design_ir"]["features"] = [{"type": "base_flange"}]
payload["design_ir"]["constraints"] = []
unrelated.append(MODULE.normalize_case(payload))
library = MODULE.build_reviewed_library(
target + unrelated,
[MODULE.normalize_proposals({
"draft_kind": "llm_generalized_experience_proposals",
"proposals": [proposal],
})[0]],
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
self.assertEqual(1, len(library["experiences"]))
def test_single_case_never_promotes(self):
case = MODULE.normalize_case(make_case(1))
library = MODULE.induce(
[case],
2,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
self.assertEqual(library["status"], "collecting_evidence")
self.assertEqual(library["experiences"], [])
self.assertTrue(library["candidate_experiences"])
self.assertTrue(
all(
item["promotion_state"] == "candidate"
for item in library["candidate_experiences"]
)
)
self.assertTrue(
all(
item["consumer_policy"]
== "visible_for_review_but_not_available_to_cad_router"
for item in library["candidate_experiences"]
)
)
def test_batch_promotes_methods_without_instance_values(self):
cases = [MODULE.normalize_case(make_case(index)) for index in range(20)]
library = MODULE.induce(
cases,
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
self.assertEqual(MODULE.audit_library(library), [])
rendered = json.dumps(library)
self.assertNotIn('"parameters"', rendered)
self.assertNotIn("91.0", rendered)
self.assertNotIn("52.0", rendered)
self.assertNotIn('"center"', rendered)
ids = {item["id"] for item in library["experiences"]}
self.assertIn("rule.bound_counterbore_to_host", ids)
self.assertIn("constraint.flanged_hub_adapter.coaxial_stack", ids)
self.assertIn("distribution.sleeve_od_to_base_od", ids)
def test_family_support_is_not_diluted_by_unrelated_families(self):
target = [MODULE.normalize_case(make_case(index)) for index in range(20)]
unrelated = []
for index in range(100):
payload = make_case(index + 1000)
payload["design_ir"]["part_family"] = "gear"
payload["design_ir"]["features"] = [
{"type": "gear_blank"},
{"type": "gear_teeth"},
]
unrelated.append(MODULE.normalize_case(payload))
library = MODULE.induce(
target + unrelated,
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
ids = {item["id"] for item in library["experiences"]}
self.assertIn(
"motif.flanged_hub_adapter.base_flange+hollow_sleeve", ids
)
def test_query_returns_backend_neutral_context(self):
cases = [MODULE.normalize_case(make_case(index)) for index in range(20)]
library = MODULE.induce(
cases,
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
result = MODULE.query_library(
library,
"flanged_hub_adapter",
{"base_flange", "hollow_sleeve", "counterbore"},
)
self.assertTrue(result["experiences"])
self.assertFalse(result["policy"]["contains_instance_parameters"])
def test_llm_proposal_is_candidate_until_evidence_threshold(self):
proposal = self.reviewed_proposal()
one_case = MODULE.normalize_case(make_case(1))
candidate_library = MODULE.build_reviewed_library(
[one_case],
[proposal],
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
self.assertEqual([], candidate_library["experiences"])
self.assertEqual(1, len(candidate_library["candidate_experiences"]))
self.assertTrue(candidate_library["policy"]["router_consumable"])
cases = [MODULE.normalize_case(make_case(index)) for index in range(20)]
promoted_library = MODULE.build_reviewed_library(
cases,
[proposal],
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
self.assertEqual(1, len(promoted_library["experiences"]))
self.assertEqual([], promoted_library["candidate_experiences"])
def test_numeric_instance_answer_is_rejected_from_llm_draft(self):
proposal = self.reviewed_proposal()
proposal["guidance"] = "Always use a diameter of 91 millimeters."
with self.assertRaisesRegex(ValueError, "instance numbers"):
MODULE.normalize_proposals(
{
"draft_kind": "llm_generalized_experience_proposals",
"proposals": [proposal],
}
)
def test_reconstruction_grammar_promotes_without_instance_values(self):
proposal = {
"id": "reconstruction.flanged_hub_adapter.primary",
"kind": "reconstruction_grammar",
"scope": ["flanged_hub_adapter"],
"evidence_query": {
"required_features": ["base_flange", "hollow_sleeve"],
"required_relations": ["coaxial_stack"],
"context_features": ["base_flange", "hollow_sleeve"],
},
"guidance": "Establish shared datums before composing the primary envelope.",
"semantic_rationale": "The symbolic stages transfer across dimensional variants.",
"reconstruction_grammar": {
"parameter_roles": [
"overall_long_span",
"overall_middle_span",
"overall_short_span",
],
"datum_roles": ["part_center", "primary_axis"],
"feature_roles": ["base_flange", "hollow_sleeve"],
"relation_roles": ["coaxial_stack"],
"canonical_stages": [
{
"id": "establish_reference_frame",
"operation": "define_datums",
"feature_roles": [],
"reference_roles": ["part_center", "primary_axis"],
},
{
"id": "construct_primary_envelope",
"operation": "revolve_profile",
"feature_roles": ["base_flange", "hollow_sleeve"],
"reference_roles": ["primary_axis"],
},
],
"cardinality_classes": ["plane_repeated", "cylinder_dense"],
"validation_roles": ["closed_solid", "coaxial_stack"],
},
}
normalized = MODULE.normalize_proposals(
{
"draft_kind": "llm_generalized_experience_proposals",
"proposals": [proposal],
}
)
cases = [MODULE.normalize_case(make_case(index)) for index in range(20)]
library = MODULE.build_reviewed_library(
cases,
normalized,
20,
0.8,
{"duplicate_case_count": 0, "rejected_case_count": 0},
)
self.assertEqual([], MODULE.audit_library(library))
self.assertEqual("reconstruction_grammar", library["experiences"][0]["kind"])
rendered = json.dumps(library)
self.assertNotIn("91.0", rendered)
self.assertNotIn('"parameters"', rendered)
def test_direct_distill_without_model_draft_is_blocked(self):
with self.assertRaisesRegex(SystemExit, "statistical distillation is disabled"):
MODULE.main(["distill"])
if __name__ == "__main__":
unittest.main()