refactor(gpt6astra): use host geometry, tolerances and layout checks

Gpt6Astra reverse-engineered the validator: hand-tuned paddings and a
copied check sequence (ValidationOverlap) to match its rounding. It now
reads parts with JobPartGeometry, takes clearance from NestTolerances,
checks candidates with NestLayoutCheck.Clears, and assembles results with
NestJobResultBuilder and NestJobCost; its tests use the shared kit. Its
contact search, beam search and extra Automatic angles are unchanged.

Synthetic benchmark (5 jobs, salvage 0.5): all valid, 2 sheets each,
cost 5574.07 -> 5470.07; time 1871 -> 2400 ms from the stricter shared
check on arc-heavy jobs.

Co-Authored-By: Codex <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
aj
2026-09-25 09:29:27 -04:00
co-authored by Codex Claude Opus 5.5
parent c691381f30
commit d0c6af783b
10 changed files with 120 additions and 217 deletions
+21 -9
View File
@@ -11,15 +11,14 @@ sheet's usable translation rectangle exposes contact positions where another par
This permits overlapping bounding rectangles, complementary triangle pairs, staggered circles,
concave interlocking, and insertion into straight-edged and curved holes.
1. Validate immutable job input. Reconstruct owned analytic entities with `DrawingJobMapper`
and `ConvertProgram`. Closed contours define material; internal open marks do not become
1. Validate immutable job input. Read owned analytic material with `JobPartGeometry.Read`. Closed contours define material; internal open marks do not become
holes. Preserve the snapshot's origin when converting normalized placements back to poses.
2. Prepare rotated outlines and material regions with holes, using conservative curve flattening.
Automatic angles combine 15-degree samples over a full turn with orientations aligned to the
Automatic angles extend `RotationCandidates.ForShape` with 15-degree samples over a full turn with orientations aligned to the
longest straight edges. Symmetric duplicates are removed. Prefer up to 16 orientations whose
envelope area is within 8% of the minimum; retain additional orientations when needed to fit
a candidate stock. Fixed and bounded rotation policies remain enforced. Bounded sweeps use
up to 721 integer step indices, including permitted half-turn equivalents.
up to 720 base samples through `RotationPolicy.EnumerateAngles`, including permitted half-turn equivalents.
3. Process high-priority parts first (a lower `Priority` number ranks higher, as in the host),
then parts fitting fewer available stock types, then larger envelopes. Larger frames precede inserts. Search every retained orientation for each instance.
4. Build cached Minkowski/no-fit regions. Convex pairs use Core's linear convex NFP primitive;
@@ -40,7 +39,7 @@ concave interlocking, and insertion into straight-edged and curved holes.
area lower bound prunes plans only once a complete cheaper plan exists. After 24 evaluated
trials only one directional objective is used; after 64, beam width reduces to two.
Work counts, not elapsed time or randomness, control search breadth.
7. Select a complete plan with lowest purchased area, breaking equal-cost ties by sheet count.
7. Select a complete plan with lowest `NestJobCost.NetSheetArea` including salvage, breaking equal-cost ties by sheet count.
If no complete plan is found, maximize fulfilled counts by priority, then minimize cost.
Emit committed-sheet progress, contiguous per-part instance indices, inventory, fulfillment
and the contract's job-level stop reason. Cancellation throws without returning a partial job.
@@ -53,10 +52,11 @@ corrects curved-hole validation; the placement algorithm remains entirely in Gpt
## Precision and safety
Analytic rotated bounds govern sheet containment. Material curves are conservatively flattened
at 0.001 job units. Positive configuration-space spacing includes 0.0003 extra units for non-rectangular
straight outlines; curved outlines reserve 0.003 extra units even at zero spacing, accounting for offset/chord error and the
benchmark validator's four-decimal grid. Axis-aligned rectangle contacts preserve exact requested
spacing. Actual material intersection checks backstop candidate construction. Both straight-edged
at `NestTolerances.ValidationOutline`. Contact generation and material halos both use
`SafeClearanceMargin` so proposed contacts pass the same clearance gate. Axis-aligned
rectangle contacts preserve exact requested spacing. `NestLayoutCheck.Clears` replaces
the copied validator construction and collision sequence, with world-pose caching.
Actual material intersection checks backstop candidate construction. Both straight-edged
and curved holes are available for insertion. The shared collision routine now subtracts hole
triangles into disjoint fragments with consistent half-space clipping, resolving the reproduced
curved-hole false positive. See the benchmark report for regression results.
@@ -123,3 +123,15 @@ non-cardinal rotations, hole insertion, automatic diagonal-only stock fits, all
curves, incremental geometry, determinism, inventory, cancellation and stock-plan regressions.
All 34 synthetic/generated benchmark cases and all four repository-DXF cases were valid and complete.
Existing nullable warnings originate from the benchmark validator linked into the test project.
## Shared services migration
Stock bounds and fit checks use the host stock primitives; committed results and progress
use `NestJobResultBuilder`. The test project shares `Engine.Testing` and no longer links
benchmark source. The synthetic console also validates through `NestLayoutCheck` and
reports `NestJobCost.Evaluate`. Automatic 15-degree/edge sampling, beam search, contact
placement, exact rectangle handling, and full-material symmetry signatures for holed
parts remain engine-owned. The host symmetry helper compares only perimeters.
The five salvage benchmarks stayed valid and complete. Cost fell from 5574.07 to
5470.07 overall (no job worsened at report precision); see [PR 5 results](../MIGRATION-PR5.md).