feat: strengthen CAD experience distillation and routing
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"name": "cad-experience-plugin",
|
||||
"version": "0.1.0",
|
||||
"description": "Parse STEP inboxes and use the active model plus deterministic evidence checks to distill backend-neutral CAD experience.",
|
||||
"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": "Use model review to distill reusable CAD methods.",
|
||||
"longDescription": "CAD Experience maintains a visible STEP input/output staging area, gives the active large model a sanitized semantic review packet, verifies every proposed method against the accumulated corpus, and promotes only repeatedly supported backend-neutral 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": [
|
||||
@@ -18,9 +18,10 @@
|
||||
"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 the output JSON, and report promoted generalized CAD experience without exposing source-part geometry."
|
||||
"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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
[
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,212 @@
|
||||
[
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"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": []
|
||||
}
|
||||
@@ -0,0 +1,308 @@
|
||||
#!/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()
|
||||
@@ -0,0 +1,708 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
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,
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,39 @@
|
||||
# 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 对,并对若干样本做重复运行,才能把经验效果与随机波动分开。
|
||||
@@ -0,0 +1,64 @@
|
||||
#!/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()
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/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()
|
||||
@@ -0,0 +1,95 @@
|
||||
#!/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
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
# 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 分以上,必须进入**实例模板/逆向参数化**
|
||||
通道,而不是通用经验通道。通用经验负责教方法;实例模板负责保存指定
|
||||
零件的尺寸、特征图和精确基体。两类数据必须分库、分权限、分评价口径。
|
||||
@@ -0,0 +1,231 @@
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25,14 +25,18 @@ published library and require repeated support before promoting any experience.
|
||||
```
|
||||
|
||||
4. Read `work/review/semantic-batch.json` completely. Act as the semantic
|
||||
distiller: compare families, features, relations, prior vocabulary, failure
|
||||
rules, and validation targets; then author
|
||||
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 and invariants, not raw co-occurrence pairs. Do not infer
|
||||
operation order, manufacturing intent, or failure causes that final B-Rep
|
||||
evidence cannot support.
|
||||
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:
|
||||
|
||||
@@ -70,10 +74,15 @@ required.
|
||||
|
||||
## STEP extraction boundary
|
||||
|
||||
- The extractor reads analytic B-Rep surfaces, bounding boxes, topology counts,
|
||||
axes, radii, and locations into a private evidence record.
|
||||
- It derives only semantic candidates such as rotational stacks, axis
|
||||
relationships, transitions, and repeated-hole motifs.
|
||||
- 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
|
||||
@@ -86,7 +95,8 @@ required.
|
||||
- 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 `min_confidence` before promotion.
|
||||
- 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,
|
||||
@@ -105,6 +115,8 @@ The library is backend-neutral. A consumer receives:
|
||||
- `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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
interface:
|
||||
display_name: "CAD Experience Builder"
|
||||
short_description: "用大模型语义复核与证据门禁蒸馏可迁移的 CAD 通用经验"
|
||||
default_prompt: "Use $cad-experience-builder to prepare sanitized STEP evidence, perform model-led semantic induction, publish only evidence-verified generalized CAD experience, and report candidate versus promoted results."
|
||||
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."
|
||||
|
||||
@@ -18,6 +18,25 @@ Supported fields:
|
||||
"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",
|
||||
@@ -52,3 +71,11 @@ likely instance answers. Ratios are accepted only through
|
||||
|
||||
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.
|
||||
|
||||
+20
@@ -62,3 +62,23 @@ 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.
|
||||
|
||||
+54
-2
@@ -17,7 +17,8 @@ Write `work/review/experience-draft.json` with this shape:
|
||||
"scope": ["part_family"],
|
||||
"evidence_query": {
|
||||
"required_features": ["rotational_body", "central_passage"],
|
||||
"required_relations": ["dominant_axis_alignment"]
|
||||
"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.",
|
||||
@@ -28,17 +29,68 @@ Write `work/review/experience-draft.json` with this shape:
|
||||
```
|
||||
|
||||
Allowed kinds are `feature_motif`, `constraint`, `design_rule`,
|
||||
`validation_rule`, and `failure_repair`.
|
||||
`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
|
||||
|
||||
@@ -102,6 +102,71 @@ def list_tokens(value: Any) -> list[str]:
|
||||
return sorted({item for raw in value if (item := token(raw)) != "unknown"})
|
||||
|
||||
|
||||
def normalize_stage(raw: Any) -> dict[str, Any] | None:
|
||||
if not isinstance(raw, dict):
|
||||
return None
|
||||
stage_id = token(raw.get("id"))
|
||||
operation = token(raw.get("operation"))
|
||||
if stage_id == "unknown" or operation == "unknown":
|
||||
return None
|
||||
return {
|
||||
"id": stage_id,
|
||||
"operation": operation,
|
||||
"feature_roles": list_tokens(raw.get("feature_roles")),
|
||||
"reference_roles": list_tokens(raw.get("reference_roles")),
|
||||
}
|
||||
|
||||
|
||||
def normalize_reconstruction(raw: Any) -> dict[str, Any]:
|
||||
if not isinstance(raw, dict):
|
||||
return {
|
||||
"parameter_roles": [],
|
||||
"datum_roles": [],
|
||||
"feature_roles": [],
|
||||
"relation_roles": [],
|
||||
"canonical_stages": [],
|
||||
"cardinality_classes": [],
|
||||
"validation_roles": [],
|
||||
}
|
||||
private_cardinality = (
|
||||
raw.get("private_cardinality_evidence")
|
||||
if isinstance(raw.get("private_cardinality_evidence"), dict)
|
||||
else {}
|
||||
)
|
||||
class_values = private_cardinality.get("surface_type_classes", {})
|
||||
cardinality_classes = list_tokens(raw.get("cardinality_classes"))
|
||||
if isinstance(class_values, dict):
|
||||
cardinality_classes.extend(
|
||||
token(f"{kind}_{value}")
|
||||
for kind, value in class_values.items()
|
||||
)
|
||||
for role in (
|
||||
"feature_role_count_class",
|
||||
"coaxial_radius_role_count_class",
|
||||
"repeated_member_count_class",
|
||||
):
|
||||
value = private_cardinality.get(role)
|
||||
if value:
|
||||
cardinality_classes.append(token(f"{role}.{value}"))
|
||||
return {
|
||||
"parameter_roles": list_tokens(raw.get("parameter_roles")),
|
||||
"datum_roles": list_tokens(raw.get("datum_roles")),
|
||||
"feature_roles": list_tokens(raw.get("feature_roles")),
|
||||
"relation_roles": list_tokens(raw.get("relation_roles")),
|
||||
"canonical_stages": [
|
||||
stage
|
||||
for item in raw.get("canonical_stages", [])
|
||||
if (stage := normalize_stage(item)) is not None
|
||||
]
|
||||
if isinstance(raw.get("canonical_stages"), list)
|
||||
else [],
|
||||
"cardinality_classes": sorted(
|
||||
{item for item in cardinality_classes if item != "unknown"}
|
||||
),
|
||||
"validation_roles": list_tokens(raw.get("validation_roles")),
|
||||
}
|
||||
|
||||
|
||||
def percentile(values: list[float], fraction: float) -> float:
|
||||
ordered = sorted(values)
|
||||
if len(ordered) == 1:
|
||||
@@ -232,6 +297,9 @@ def normalize_case(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
"rules": rules,
|
||||
"validations": validations,
|
||||
"normalized_observations": observations,
|
||||
"reconstruction": normalize_reconstruction(
|
||||
design_ir.get("reconstruction_evidence")
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
@@ -574,7 +642,10 @@ def extract_folder(input_dir: Path, output_dir: Path) -> dict[str, Any]:
|
||||
try:
|
||||
payload = json.loads(path.read_text(encoding="utf-8"))
|
||||
digest = payload.get("provenance", {}).get("source_sha256")
|
||||
if isinstance(digest, str):
|
||||
if (
|
||||
isinstance(digest, str)
|
||||
and payload.get("extractor_version") == "3.0"
|
||||
):
|
||||
known_hashes[digest] = path
|
||||
except (OSError, json.JSONDecodeError, AttributeError):
|
||||
continue
|
||||
@@ -637,6 +708,7 @@ def prepare_semantic_batch(
|
||||
"relations": case["relations"],
|
||||
"candidate_rules": case["rules"],
|
||||
"validation_targets": case["validations"],
|
||||
"reconstruction_evidence": case["reconstruction"],
|
||||
"dimensionless_observation_roles": [
|
||||
{
|
||||
"name": item["name"],
|
||||
@@ -678,6 +750,8 @@ def prepare_semantic_batch(
|
||||
"design_rule",
|
||||
"validation_rule",
|
||||
"failure_repair",
|
||||
"dimensionless_distribution",
|
||||
"reconstruction_grammar",
|
||||
],
|
||||
},
|
||||
}
|
||||
@@ -693,6 +767,8 @@ def normalize_proposals(payload: dict[str, Any]) -> list[dict[str, Any]]:
|
||||
"design_rule",
|
||||
"validation_rule",
|
||||
"failure_repair",
|
||||
"dimensionless_distribution",
|
||||
"reconstruction_grammar",
|
||||
}
|
||||
for index, raw in enumerate(payload.get("proposals", [])):
|
||||
if not isinstance(raw, dict):
|
||||
@@ -707,6 +783,10 @@ def normalize_proposals(payload: dict[str, Any]) -> list[dict[str, Any]]:
|
||||
)
|
||||
required_features = list_tokens(evidence.get("required_features"))
|
||||
required_relations = list_tokens(evidence.get("required_relations"))
|
||||
context_features = list_tokens(
|
||||
evidence.get("context_features") or required_features
|
||||
)
|
||||
observation_name = token(raw.get("observation_name"))
|
||||
guidance = string_without_instance_numbers(raw.get("guidance"))
|
||||
rationale = string_without_instance_numbers(raw.get("semantic_rationale"))
|
||||
if proposal_id == "unknown":
|
||||
@@ -715,7 +795,11 @@ def normalize_proposals(payload: dict[str, Any]) -> list[dict[str, Any]]:
|
||||
raise ValueError(f"proposal {proposal_id} has an unsupported kind")
|
||||
if not scopes:
|
||||
raise ValueError(f"proposal {proposal_id} has no scope")
|
||||
if not required_features and not required_relations:
|
||||
if (
|
||||
not required_features
|
||||
and not required_relations
|
||||
and observation_name == "unknown"
|
||||
):
|
||||
raise ValueError(f"proposal {proposal_id} has no evidence query")
|
||||
if guidance is None or rationale is None:
|
||||
raise ValueError(
|
||||
@@ -728,10 +812,25 @@ def normalize_proposals(payload: dict[str, Any]) -> list[dict[str, Any]]:
|
||||
"evidence_query": {
|
||||
"required_features": required_features,
|
||||
"required_relations": required_relations,
|
||||
"context_features": context_features,
|
||||
},
|
||||
"guidance": guidance,
|
||||
"semantic_rationale": rationale,
|
||||
}
|
||||
if observation_name != "unknown":
|
||||
proposal["observation_name"] = observation_name
|
||||
if kind == "reconstruction_grammar":
|
||||
grammar = normalize_reconstruction(raw.get("reconstruction_grammar"))
|
||||
if (
|
||||
not grammar["parameter_roles"]
|
||||
or not grammar["datum_roles"]
|
||||
or not grammar["canonical_stages"]
|
||||
or not grammar["validation_roles"]
|
||||
):
|
||||
raise ValueError(
|
||||
f"proposal {proposal_id} has an incomplete reconstruction grammar"
|
||||
)
|
||||
proposal["reconstruction_grammar"] = grammar
|
||||
for key in ("check", "repair", "failure_signature"):
|
||||
value = string_without_instance_numbers(raw.get(key))
|
||||
if value is not None:
|
||||
@@ -752,6 +851,41 @@ def build_reviewed_library(
|
||||
promoted: list[dict[str, Any]] = []
|
||||
candidates: list[dict[str, Any]] = []
|
||||
family_counts = Counter(case["family"] for case in cases)
|
||||
|
||||
def supports_reconstruction_grammar(
|
||||
case: dict[str, Any], grammar: dict[str, Any]
|
||||
) -> bool:
|
||||
evidence = case.get("reconstruction", {})
|
||||
for key in (
|
||||
"parameter_roles",
|
||||
"datum_roles",
|
||||
"feature_roles",
|
||||
"relation_roles",
|
||||
"validation_roles",
|
||||
):
|
||||
required = set(grammar.get(key, []))
|
||||
available = set(evidence.get(key, []))
|
||||
if required and not required.issubset(available):
|
||||
return False
|
||||
available_stages = {
|
||||
(item["id"], item["operation"]): item
|
||||
for item in evidence.get("canonical_stages", [])
|
||||
}
|
||||
for required_stage in grammar.get("canonical_stages", []):
|
||||
key = (required_stage["id"], required_stage["operation"])
|
||||
available = available_stages.get(key)
|
||||
if available is None:
|
||||
return False
|
||||
if not set(required_stage.get("feature_roles", [])).issubset(
|
||||
available.get("feature_roles", [])
|
||||
):
|
||||
return False
|
||||
if not set(required_stage.get("reference_roles", [])).issubset(
|
||||
available.get("reference_roles", [])
|
||||
):
|
||||
return False
|
||||
return True
|
||||
|
||||
for proposal in proposals:
|
||||
scope = set(proposal["scope"])
|
||||
relevant = [
|
||||
@@ -765,14 +899,80 @@ def build_reviewed_library(
|
||||
required_relations = set(
|
||||
proposal["evidence_query"]["required_relations"]
|
||||
)
|
||||
supporting = [
|
||||
context_features = set(
|
||||
proposal["evidence_query"].get("context_features", required_features)
|
||||
)
|
||||
if proposal["kind"] == "dimensionless_distribution":
|
||||
matched = [
|
||||
observation
|
||||
for case in relevant
|
||||
for observation in case["normalized_observations"]
|
||||
if observation["name"] == proposal.get("observation_name")
|
||||
]
|
||||
support = len(matched)
|
||||
item: dict[str, Any] = {
|
||||
"id": proposal["id"],
|
||||
"kind": proposal["kind"],
|
||||
"scope": proposal["scope"],
|
||||
"when": {
|
||||
"ratio": {
|
||||
"numerator_role": (
|
||||
matched[0]["numerator_role"] if matched else "unknown"
|
||||
),
|
||||
"denominator_role": (
|
||||
matched[0]["denominator_role"] if matched else "unknown"
|
||||
),
|
||||
}
|
||||
},
|
||||
"guidance": proposal["guidance"],
|
||||
"semantic_rationale": proposal["semantic_rationale"],
|
||||
"support": support,
|
||||
"confidence": 1.0 if support else 0.0,
|
||||
}
|
||||
if matched:
|
||||
values = [observation["value"] for observation in matched]
|
||||
item["distribution"] = {
|
||||
"sample_count": support,
|
||||
"min": round(min(values), 6),
|
||||
"p10": round(percentile(values, 0.10), 6),
|
||||
"median": round(median(values), 6),
|
||||
"p90": round(percentile(values, 0.90), 6),
|
||||
"max": round(max(values), 6),
|
||||
}
|
||||
if eligible(support, item["confidence"], min_support, min_confidence):
|
||||
promoted.append(item)
|
||||
else:
|
||||
item.pop("distribution", None)
|
||||
item.update(
|
||||
{
|
||||
"promotion_state": "candidate",
|
||||
"required_support": min_support,
|
||||
"remaining_support": max(0, min_support - support),
|
||||
"required_confidence": min_confidence,
|
||||
"consumer_policy": "visible_for_review_but_not_available_to_cad_router",
|
||||
}
|
||||
)
|
||||
candidates.append(item)
|
||||
continue
|
||||
contextual = [
|
||||
case
|
||||
for case in relevant
|
||||
if context_features.issubset(case["features"])
|
||||
]
|
||||
supporting = [
|
||||
case
|
||||
for case in contextual
|
||||
if required_features.issubset(case["features"])
|
||||
and required_relations.issubset(case["relations"])
|
||||
and (
|
||||
proposal["kind"] != "reconstruction_grammar"
|
||||
or supports_reconstruction_grammar(
|
||||
case, proposal["reconstruction_grammar"]
|
||||
)
|
||||
)
|
||||
]
|
||||
support = len(supporting)
|
||||
confidence = support / len(relevant) if relevant else 0.0
|
||||
confidence = support / len(contextual) if contextual else 0.0
|
||||
item: dict[str, Any] = {
|
||||
"id": proposal["id"],
|
||||
"kind": proposal["kind"],
|
||||
@@ -789,6 +989,8 @@ def build_reviewed_library(
|
||||
for key in ("check", "repair", "failure_signature"):
|
||||
if key in proposal:
|
||||
item[key] = proposal[key]
|
||||
if proposal["kind"] == "reconstruction_grammar":
|
||||
item["reconstruction_grammar"] = proposal["reconstruction_grammar"]
|
||||
if eligible(support, confidence, min_support, min_confidence):
|
||||
promoted.append(item)
|
||||
else:
|
||||
|
||||
@@ -11,6 +11,8 @@ 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)
|
||||
@@ -42,6 +44,32 @@ def _radial_offset(location: list[float], center: list[float], axis: str) -> flo
|
||||
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
|
||||
@@ -125,6 +153,11 @@ def _semantic_summary(
|
||||
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]] = []
|
||||
@@ -152,6 +185,9 @@ def _semantic_summary(
|
||||
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
|
||||
]
|
||||
@@ -160,6 +196,66 @@ def _semantic_summary(
|
||||
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:
|
||||
@@ -177,6 +273,51 @@ def _semantic_summary(
|
||||
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:
|
||||
@@ -194,15 +335,104 @@ def _semantic_summary(
|
||||
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 parallel_cones and has_repeated_axial_holes:
|
||||
family = "flanged_hub_adapter_candidate"
|
||||
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_candidate"
|
||||
family = "rotational_part"
|
||||
elif has_repeated_axial_holes and plate_like:
|
||||
family = "patterned_plate"
|
||||
elif has_repeated_axial_holes:
|
||||
family = "patterned_prismatic_part_candidate"
|
||||
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 = "unclassified_part"
|
||||
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,
|
||||
@@ -214,10 +444,240 @@ def _semantic_summary(
|
||||
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
|
||||
|
||||
@@ -239,9 +699,14 @@ def extract_step_case(source: Path) -> dict[str, Any]:
|
||||
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": "1.0",
|
||||
"schema_version": "2.0",
|
||||
"extractor_version": EXTRACTOR_VERSION,
|
||||
"case_kind": "private_step_evidence",
|
||||
"case_id": digest,
|
||||
"provenance": {
|
||||
@@ -267,8 +732,9 @@ def extract_step_case(source: Path) -> dict[str, Any]:
|
||||
"part_family": family,
|
||||
"features": features,
|
||||
"constraints": constraints,
|
||||
"normalized_observations": [],
|
||||
"normalized_observations": normalized_observations,
|
||||
"semantic_summary": semantic_summary,
|
||||
"reconstruction_evidence": reconstruction_evidence,
|
||||
},
|
||||
"experience": {
|
||||
"rules": [],
|
||||
|
||||
@@ -54,6 +54,38 @@ def make_case(index: int) -> dict:
|
||||
"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": [
|
||||
@@ -122,12 +154,47 @@ class CadExperienceTest(unittest.TestCase):
|
||||
family, features, constraints, summary = STEP_MODULE._semantic_summary(
|
||||
surfaces, [0.0, 0.0, 0.0], [40.0, 20.0, 40.0]
|
||||
)
|
||||
self.assertEqual("flanged_hub_adapter_candidate", family)
|
||||
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))
|
||||
@@ -247,6 +314,65 @@ class CadExperienceTest(unittest.TestCase):
|
||||
}
|
||||
)
|
||||
|
||||
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"])
|
||||
|
||||
Reference in New Issue
Block a user