feat(astra): add independent nesting engine and fix hole validation

Replace the Terra scaffold with an independent configuration-space contact placer and bounded stock-plan search. Include plugin tests, synthetic and DXF benchmark drivers, results, and deployment documentation.

Correct shared collision clipping and hole subtraction so curved-hole inserts validate consistently. Cover translated layouts, spacing violations, operand order, winding, and independent boolean-area comparisons.

Validation: 1,293 tests passed with 12 fixture skips; all 34 synthetic/generated and four DXF cases are valid and complete.
This commit is contained in:
aj
2026-09-24 00:14:36 -04:00
parent 87f7ddad1a
commit 22d21924b8
34 changed files with 1984 additions and 265 deletions
@@ -0,0 +1,5 @@
Job,Engine,Valid,Crashed,FullyPlaced,PartsPlaced,PartsRequested,Utilization,NetUtilization,PlateArea,NetSheetArea,Cost,PlatesUsed,SizeBreakdown,ElapsedMs,Notes
locked.manifest,AstraNestingEngine,True,False,True,12,12,0.6481,0.6481,115200.00,115200.00,115200.00,1,240 x 480×1,83,
mixed.manifest,AstraNestingEngine,True,False,True,15,15,0.5983,0.5983,144000.00,144000.00,144000.00,5,120 x 240×5,298,
original.manifest,AstraNestingEngine,True,False,True,12,12,0.6481,0.6481,115200.00,115200.00,115200.00,4,120 x 240×4,21,
volume.manifest,AstraNestingEngine,True,False,True,48,48,0.7977,0.7977,374400.00,374400.00,374400.00,4,240 x 480×3; 120 x 240×1,51,
1 Job Engine Valid Crashed FullyPlaced PartsPlaced PartsRequested Utilization NetUtilization PlateArea NetSheetArea Cost PlatesUsed SizeBreakdown ElapsedMs Notes
2 locked.manifest AstraNestingEngine True False True 12 12 0.6481 0.6481 115200.00 115200.00 115200.00 1 240 x 480×1 83
3 mixed.manifest AstraNestingEngine True False True 15 15 0.5983 0.5983 144000.00 144000.00 144000.00 5 120 x 240×5 298
4 original.manifest AstraNestingEngine True False True 12 12 0.6481 0.6481 115200.00 115200.00 115200.00 4 120 x 240×4 21
5 volume.manifest AstraNestingEngine True False True 48 48 0.7977 0.7977 374400.00 374400.00 374400.00 4 240 x 480×3; 120 x 240×1 51
@@ -0,0 +1,24 @@
case,valid,placed,requested,sheets,area,milliseconds
generated-library-0-RoundedRectangle,True,24,24,2,1886,24
generated-library-1-T,True,24,24,3,5917,0
generated-library-2-Trapezoid,True,24,24,2,2150,0
generated-library-3-Ngon,True,24,24,2,2024,0
generated-library-4-Ngon,True,24,24,2,2160,0
generated-library-5-Ring,True,24,24,1,3901,3
generated-library-6-PipeFlange,True,12,12,2,1932,19
generated-ring-inserts,True,16,16,2,2016,2
generated-curved-C,True,16,16,3,6051,0
generated-narrow-U,True,24,24,3,5925,0
generated-stars,True,20,20,1,3901,0
generated-seed-00,True,19,19,2,1886,1
generated-seed-01,True,22,22,2,2016,1
generated-seed-02,True,21,21,2,2150,1
generated-seed-03,True,20,20,1,1012,1
generated-seed-04,True,24,24,1,1080,1
generated-seed-05,True,22,22,2,2050,1
generated-seed-06,True,27,27,2,1932,1
generated-seed-07,True,19,19,1,1032,1
generated-seed-08,True,17,17,1,1100,1
generated-seed-09,True,22,22,2,2070,1
generated-seed-10,True,20,20,2,1968,1
generated-seed-11,True,19,19,2,2100,1
1 case valid placed requested sheets area milliseconds
2 generated-library-0-RoundedRectangle True 24 24 2 1886 24
3 generated-library-1-T True 24 24 3 5917 0
4 generated-library-2-Trapezoid True 24 24 2 2150 0
5 generated-library-3-Ngon True 24 24 2 2024 0
6 generated-library-4-Ngon True 24 24 2 2160 0
7 generated-library-5-Ring True 24 24 1 3901 3
8 generated-library-6-PipeFlange True 12 12 2 1932 19
9 generated-ring-inserts True 16 16 2 2016 2
10 generated-curved-C True 16 16 3 6051 0
11 generated-narrow-U True 24 24 3 5925 0
12 generated-stars True 20 20 1 3901 0
13 generated-seed-00 True 19 19 2 1886 1
14 generated-seed-01 True 22 22 2 2016 1
15 generated-seed-02 True 21 21 2 2150 1
16 generated-seed-03 True 20 20 1 1012 1
17 generated-seed-04 True 24 24 1 1080 1
18 generated-seed-05 True 22 22 2 2050 1
19 generated-seed-06 True 27 27 2 1932 1
20 generated-seed-07 True 19 19 1 1032 1
21 generated-seed-08 True 17 17 1 1100 1
22 generated-seed-09 True 22 22 2 2070 1
23 generated-seed-10 True 20 20 2 1968 1
24 generated-seed-11 True 19 19 2 2100 1
@@ -0,0 +1,12 @@
case,valid,placed,requested,sheets,area,milliseconds
triangles,True,60,60,4,8064,30
circles,True,90,90,3,3456,4
circles-dense,True,80,80,3,3456,0
concave-L,True,60,60,2,5760,0
mixed,True,105,105,4,4608,1
holes,True,16,16,2,2304,2
rectangles,True,96,96,3,3456,1
grain,True,60,60,4,4608,0
scarce-stock,True,9,9,5,228,0
tail,True,17,17,1,600,0
plate-cap,True,4,10,1,100,0
1 case valid placed requested sheets area milliseconds
2 triangles True 60 60 4 8064 30
3 circles True 90 90 3 3456 4
4 circles-dense True 80 80 3 3456 0
5 concave-L True 60 60 2 5760 0
6 mixed True 105 105 4 4608 1
7 holes True 16 16 2 2304 2
8 rectangles True 96 96 3 3456 1
9 grain True 60 60 4 4608 0
10 scarce-stock True 9 9 5 228 0
11 tail True 17 17 1 600 0
12 plate-cap True 4 10 1 100 0
@@ -0,0 +1,5 @@
Job,Engine,Valid,Crashed,FullyPlaced,PartsPlaced,PartsRequested,Utilization,NetUtilization,PlateArea,NetSheetArea,Cost,PlatesUsed,SizeBreakdown,ElapsedMs,Notes
locked.manifest,AstraNestingEngine,True,False,True,12,12,0.6481,0.6481,115200.00,115200.00,115200.00,1,240 x 480×1,259,
mixed.manifest,AstraNestingEngine,True,False,True,15,15,0.7479,0.7479,115200.00,115200.00,115200.00,1,240 x 480×1,1724,
original.manifest,AstraNestingEngine,True,False,True,12,12,0.6481,0.6481,115200.00,115200.00,115200.00,1,240 x 480×1,133,
volume.manifest,AstraNestingEngine,True,False,True,48,48,0.7977,0.7977,374400.00,374400.00,374400.00,4,240 x 480×3; 120 x 240×1,389,
1 Job Engine Valid Crashed FullyPlaced PartsPlaced PartsRequested Utilization NetUtilization PlateArea NetSheetArea Cost PlatesUsed SizeBreakdown ElapsedMs Notes
2 locked.manifest AstraNestingEngine True False True 12 12 0.6481 0.6481 115200.00 115200.00 115200.00 1 240 x 480×1 259
3 mixed.manifest AstraNestingEngine True False True 15 15 0.7479 0.7479 115200.00 115200.00 115200.00 1 240 x 480×1 1724
4 original.manifest AstraNestingEngine True False True 12 12 0.6481 0.6481 115200.00 115200.00 115200.00 1 240 x 480×1 133
5 volume.manifest AstraNestingEngine True False True 48 48 0.7977 0.7977 374400.00 374400.00 374400.00 4 240 x 480×3; 120 x 240×1 389
@@ -0,0 +1,24 @@
case,valid,placed,requested,sheets,area,milliseconds
generated-library-0-RoundedRectangle,True,24,24,2,1886,175
generated-library-1-T,True,24,24,2,2016,175
generated-library-2-Trapezoid,True,24,24,2,2150,120
generated-library-3-Ngon,True,24,24,2,2024,536
generated-library-4-Ngon,True,24,24,1,1080,93
generated-library-5-Ring,True,24,24,1,3901,85
generated-library-6-PipeFlange,True,12,12,1,966,46
generated-ring-inserts,True,16,16,2,2016,48
generated-curved-C,True,16,16,2,2150,1929
generated-narrow-U,True,24,24,1,3901,136
generated-stars,True,20,20,1,3901,3118
generated-seed-00,True,19,19,2,1886,578
generated-seed-01,True,22,22,2,2016,403
generated-seed-02,True,21,21,2,2150,1447
generated-seed-03,True,20,20,1,1012,356
generated-seed-04,True,24,24,1,1080,600
generated-seed-05,True,22,22,2,2050,1467
generated-seed-06,True,27,27,2,1932,1251
generated-seed-07,True,19,19,1,1032,724
generated-seed-08,True,17,17,1,1100,980
generated-seed-09,True,22,22,2,2070,930
generated-seed-10,True,20,20,1,984,460
generated-seed-11,True,19,19,1,1050,1151
1 case valid placed requested sheets area milliseconds
2 generated-library-0-RoundedRectangle True 24 24 2 1886 175
3 generated-library-1-T True 24 24 2 2016 175
4 generated-library-2-Trapezoid True 24 24 2 2150 120
5 generated-library-3-Ngon True 24 24 2 2024 536
6 generated-library-4-Ngon True 24 24 1 1080 93
7 generated-library-5-Ring True 24 24 1 3901 85
8 generated-library-6-PipeFlange True 12 12 1 966 46
9 generated-ring-inserts True 16 16 2 2016 48
10 generated-curved-C True 16 16 2 2150 1929
11 generated-narrow-U True 24 24 1 3901 136
12 generated-stars True 20 20 1 3901 3118
13 generated-seed-00 True 19 19 2 1886 578
14 generated-seed-01 True 22 22 2 2016 403
15 generated-seed-02 True 21 21 2 2150 1447
16 generated-seed-03 True 20 20 1 1012 356
17 generated-seed-04 True 24 24 1 1080 600
18 generated-seed-05 True 22 22 2 2050 1467
19 generated-seed-06 True 27 27 2 1932 1251
20 generated-seed-07 True 19 19 1 1032 724
21 generated-seed-08 True 17 17 1 1100 980
22 generated-seed-09 True 22 22 2 2070 930
23 generated-seed-10 True 20 20 1 984 460
24 generated-seed-11 True 19 19 1 1050 1151
@@ -0,0 +1,12 @@
case,valid,placed,requested,sheets,area,milliseconds
triangles,True,60,60,1,4608,3354
circles,True,90,90,3,3456,1021
circles-dense,True,80,80,2,2304,742
concave-L,True,60,60,3,3456,1055
mixed,True,105,105,3,3456,1990
holes,True,16,16,1,1152,306
rectangles,True,96,96,3,3456,261
grain,True,60,60,2,2304,527
scarce-stock,True,9,9,5,228,1
tail,True,17,17,1,600,4
plate-cap,True,10,10,1,400,4
1 case valid placed requested sheets area milliseconds
2 triangles True 60 60 1 4608 3354
3 circles True 90 90 3 3456 1021
4 circles-dense True 80 80 2 2304 742
5 concave-L True 60 60 3 3456 1055
6 mixed True 105 105 3 3456 1990
7 holes True 16 16 1 1152 306
8 rectangles True 96 96 3 3456 261
9 grain True 60 60 2 2304 527
10 scarce-stock True 9 9 5 228 1
11 tail True 17 17 1 600 4
12 plate-cap True 10 10 1 400 4
@@ -0,0 +1,8 @@
q=1 offset=0 valid=True:
q=1 offset=0.0003 valid=True:
q=1 offset=0.05 valid=True:
q=1 offset=0.1 valid=True:
q=2 offset=0 valid=True:
q=2 offset=0.0003 valid=True:
q=2 offset=0.05 valid=True:
q=2 offset=0.1 valid=True:
@@ -0,0 +1,8 @@
q=1 offset=0 valid=False: 'ring' and 'insert' are closer than the required spacing (0.175)
q=1 offset=0.0003 valid=False: 'ring' and 'insert' are closer than the required spacing (0.175)
q=1 offset=0.05 valid=True:
q=1 offset=0.1 valid=True:
q=2 offset=0 valid=False: 'ring' and 'insert' are closer than the required spacing (0.175)
q=2 offset=0.0003 valid=False: 'ring' and 'insert' are closer than the required spacing (0.175)
q=2 offset=0.05 valid=False: 'ring' and 'insert' are closer than the required spacing (0.175)
q=2 offset=0.1 valid=False: 'ring' and 'insert' are closer than the required spacing (0.175)
@@ -0,0 +1,5 @@
Job,Engine,Valid,Crashed,FullyPlaced,PartsPlaced,PartsRequested,Utilization,NetUtilization,PlateArea,NetSheetArea,Cost,PlatesUsed,SizeBreakdown,ElapsedMs,Notes
locked.manifest,AstraNestingEngine,True,False,True,12,12,0.6481,0.6481,115200.00,115200.00,115200.00,1,240 x 480×1,466,
mixed.manifest,AstraNestingEngine,True,False,True,15,15,0.7479,0.7479,115200.00,115200.00,115200.00,1,240 x 480×1,2820,
original.manifest,AstraNestingEngine,True,False,True,12,12,0.6481,0.6481,115200.00,115200.00,115200.00,1,240 x 480×1,435,
volume.manifest,AstraNestingEngine,True,False,True,48,48,0.7977,0.7977,374400.00,374400.00,374400.00,4,240 x 480×3; 120 x 240×1,2278,
1 Job Engine Valid Crashed FullyPlaced PartsPlaced PartsRequested Utilization NetUtilization PlateArea NetSheetArea Cost PlatesUsed SizeBreakdown ElapsedMs Notes
2 locked.manifest AstraNestingEngine True False True 12 12 0.6481 0.6481 115200.00 115200.00 115200.00 1 240 x 480×1 466
3 mixed.manifest AstraNestingEngine True False True 15 15 0.7479 0.7479 115200.00 115200.00 115200.00 1 240 x 480×1 2820
4 original.manifest AstraNestingEngine True False True 12 12 0.6481 0.6481 115200.00 115200.00 115200.00 1 240 x 480×1 435
5 volume.manifest AstraNestingEngine True False True 48 48 0.7977 0.7977 374400.00 374400.00 374400.00 4 240 x 480×3; 120 x 240×1 2278
@@ -0,0 +1,35 @@
case,valid,placed,requested,sheets,area,milliseconds
triangles,True,60,60,1,4608,3344
circles,True,90,90,3,3456,1008
circles-dense,True,80,80,2,2304,748
concave-L,True,60,60,3,3456,1082
mixed,True,105,105,3,3456,1966
holes,True,16,16,1,1152,293
rectangles,True,96,96,3,3456,246
grain,True,60,60,2,2304,513
scarce-stock,True,9,9,5,228,1
tail,True,17,17,1,600,4
plate-cap,True,10,10,1,400,4
generated-library-0-RoundedRectangle,True,24,24,2,1886,170
generated-library-1-T,True,24,24,2,2016,172
generated-library-2-Trapezoid,True,24,24,2,2150,115
generated-library-3-Ngon,True,24,24,2,2024,510
generated-library-4-Ngon,True,24,24,1,1080,89
generated-library-5-Ring,True,24,24,1,3901,918
generated-library-6-PipeFlange,True,12,12,1,966,1467
generated-ring-inserts,True,16,16,2,2016,4755
generated-curved-C,True,16,16,2,2150,1883
generated-narrow-U,True,24,24,1,3901,134
generated-stars,True,20,20,1,3901,3087
generated-seed-00,True,19,19,2,1886,568
generated-seed-01,True,22,22,2,2016,398
generated-seed-02,True,21,21,2,2150,1427
generated-seed-03,True,20,20,1,1012,352
generated-seed-04,True,24,24,1,1080,600
generated-seed-05,True,22,22,2,2050,1447
generated-seed-06,True,27,27,2,1932,1254
generated-seed-07,True,19,19,1,1032,705
generated-seed-08,True,17,17,1,1100,1008
generated-seed-09,True,22,22,2,2070,1025
generated-seed-10,True,20,20,1,984,504
generated-seed-11,True,19,19,1,1050,1353
1 case valid placed requested sheets area milliseconds
2 triangles True 60 60 1 4608 3344
3 circles True 90 90 3 3456 1008
4 circles-dense True 80 80 2 2304 748
5 concave-L True 60 60 3 3456 1082
6 mixed True 105 105 3 3456 1966
7 holes True 16 16 1 1152 293
8 rectangles True 96 96 3 3456 246
9 grain True 60 60 2 2304 513
10 scarce-stock True 9 9 5 228 1
11 tail True 17 17 1 600 4
12 plate-cap True 10 10 1 400 4
13 generated-library-0-RoundedRectangle True 24 24 2 1886 170
14 generated-library-1-T True 24 24 2 2016 172
15 generated-library-2-Trapezoid True 24 24 2 2150 115
16 generated-library-3-Ngon True 24 24 2 2024 510
17 generated-library-4-Ngon True 24 24 1 1080 89
18 generated-library-5-Ring True 24 24 1 3901 918
19 generated-library-6-PipeFlange True 12 12 1 966 1467
20 generated-ring-inserts True 16 16 2 2016 4755
21 generated-curved-C True 16 16 2 2150 1883
22 generated-narrow-U True 24 24 1 3901 134
23 generated-stars True 20 20 1 3901 3087
24 generated-seed-00 True 19 19 2 1886 568
25 generated-seed-01 True 22 22 2 2016 398
26 generated-seed-02 True 21 21 2 2150 1427
27 generated-seed-03 True 20 20 1 1012 352
28 generated-seed-04 True 24 24 1 1080 600
29 generated-seed-05 True 22 22 2 2050 1447
30 generated-seed-06 True 27 27 2 1932 1254
31 generated-seed-07 True 19 19 1 1032 705
32 generated-seed-08 True 17 17 1 1100 1008
33 generated-seed-09 True 22 22 2 2070 1025
34 generated-seed-10 True 20 20 1 984 504
35 generated-seed-11 True 19 19 1 1050 1353