From 9675981139f3d20a79681c167bc38c9abf721c99 Mon Sep 17 00:00:00 2001 From: Sandeep kurien Date: Wed, 22 Jul 2026 13:51:55 +0530 Subject: [PATCH] Publish first 2D reference results --- README.md | 4 + SHA256SUMS | 9 +- results/2d/v1.1.0/README.md | 47 + .../reference-windows-x64-i5-9400f.json | 1942 +++++++++++++++++ ...reference-windows-x64-i5-9400f.summary.csv | 6 + results/README.md | 3 + scripts/validate-repository.mjs | 171 ++ 7 files changed, 2179 insertions(+), 3 deletions(-) create mode 100644 results/2d/v1.1.0/README.md create mode 100644 results/2d/v1.1.0/reference-windows-x64-i5-9400f.json create mode 100644 results/2d/v1.1.0/reference-windows-x64-i5-9400f.summary.csv diff --git a/README.md b/README.md index 936ad0b..05acf12 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,10 @@ exhaustion. Its primary metric is geometric utilization. "Estimated unused area" is not disposable waste because kerf, lead-ins, pierces, and toolpaths are outside this benchmark's scope. +The first [2D reference-machine result](results/2d/v1.1.0/README.md) publishes +complete production layouts, raw timings, independent area accounting, and +machine provenance for every case. + The current immutable dataset release is [v1.1.0](https://github.com/technodweep/cutnesting-benchmarks/releases/tag/v1.1.0). This release adds the initial public 2D suite without changing the immutable 1D diff --git a/SHA256SUMS b/SHA256SUMS index e3fb6af..8891cfa 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -12,12 +12,12 @@ 379c6258142310a26b56e19a12090219a7842230c93043add22165d92543ed8a datasets/1d/v1/cases/1d-oversized-cut.json 3872aa21644f029e59717c5d383b8f56cae2ddc46f714569658504c3f9b0e7ba CONTRIBUTING.md 389631286dcf8f56adac4738d308f494a2d5a07739ece075b328f523b2f0dfde templates/2d-sheet-and-plate.xlsx -3c1ac369feffeb30b7661cb30c25415430e348c589c1e5ee8e618a18a0129b88 scripts/validate-repository.mjs 3f9b228cb1790199f4f5d57c0c5273d0bc31afc56085cf84a45f18d62291c55a templates/definitions.json 3fa1679686c4089d3f40cf5c775c44fd13a86c73ae0b8248dc6d09abc4d19b73 datasets/2d/v1/cases/2d-exact-square-grid.json 4075b6de75729e73d7c885871b65ed82977f2cb410da0fda05a8a8ff3acfb12c datasets/1d/v1/cases/1d-high-piece-count.json 416bdf8ab60a5c061d0f03bb3b6b7ca72d3de33a13b0be2ce248d6905590af56 samples/dxf/self-intersection.dxf 469b6ae250e6ed87b69eb74c4a4465a5a115d4f9177f43ff05ea3f8c49305cba docs/dstv-nc1-supported-subset.md +4a0daebaafb7e39cd2c2a6ec58dc2dff7674c098828d6703c3d3a71b22557b9c README.md 4e6d54ec0510235190e6d0c99adc0723b178bd96eba8cc56432588a7ded33054 datasets/2d/v1/manifest.json 530c7acb6679f73e273f6837c91113de1a4ac4f891340137186237e921238411 templates/1d-pipe.csv 54d511cc31cd3abf7bfcdff8b5375fbf6380d641e0613d6da74315ac35131fb0 templates/1d-aluminium.csv @@ -33,10 +33,10 @@ 730ec1858fcd0d8639002409c367b3d49b3627a6a81f7a1b3eb810fc3efbcb75 datasets/2d/v1/cases/2d-steel-plate-grid.json 754fe4464a7ea94ab81eebe10a69f07ccb27abace529301fab6673b2e98a648c samples/nc1/unsupported-profile.nc1 782d465d88d25f1dffd6f9fafa1620b6607aa1f6bf96c73c379f15b17992be0b results/1d/v1.0.1/README.md -7dc97fd0976ecc0a6bcc852fe44c5a13f8bae4b879866a440b14ac180fc25132 results/README.md 8b616e1bb088f6fb56910aa453e74aaae1c5411928f8622b25374c3eec0d1e80 LICENSE 8c899cfafd3434d17c6b3530160924e6b3aae38c8247e02c17d151af0e8bfb4d scripts/generate-templates.mjs 8e4cbbe934b9f3f1ff4478ec7387ba22b042966c3df45b08d2e43cda7f2c771e samples/dxf/unsupported-entity.dxf +8f49453b8ef308d6c2fdc1b6fb5cf2b6c17215eb93e1a20bc5e8ebac3326b35a results/README.md 95f51b0bbfbcde9d53690fdf5055714a0b7ada002c76b799f907ef0e70c6b361 datasets/1d/v1/cases/1d-pipe-batch.json 988e03e819c1fd5064f1a48e1cf72b9e11a5b1b067630234f4647363b69901f3 docs/repository-contract.md 9cc055698c8c63b83eda5b2bdf21e57b49a80989365730438f9bc1fdeb349c9e samples/dxf/unitless-open-contour.dxf @@ -48,8 +48,10 @@ a4980b24140bd58dda422718e4b189f208715976b670c33f257c224b20c9942f samples/nc1/pl a574cffc3eb42f427a035157e78948adc13d4694907ceaaf0a6765dd6d0df4b7 datasets/2d/v1/cases/2d-wood-panel-grid.json aac5abb1eacaee94944a150db7d0facf886c71a26def8a36e4be7db3137f3bfc .gitignore af57dba5ee88fb4ce9aee2b1d5b6dfbfb784981a43c25c41f8e6ce9cc09cfc5a results/1d/v1.0.1/reference-windows-x64-i5-9400f.json +b806fe512326d7e0f2a09d8bd556fb505b0008b1df907ff2f3f56a13c69999a3 scripts/validate-repository.mjs c4aa3a77b37562ab4206221aab32cf68a89c3de33f411533c08547097d61a7a2 templates/1d-steel.csv c680e32b10dee44df1f84b3f57e8c7c75591e01ee2686ffc53ec9ce7e05e25dc datasets/1d/v1/cases/1d-cost-tradeoff.json +ca01339838d276d94c12c7b50007d562b0840435c0be13f3936fb943d1dfc3ea results/2d/v1.1.0/reference-windows-x64-i5-9400f.summary.csv cb1136ac89f569865b72f8af974ec059abe7914013f0c32f1396d8b99e874a28 schemas/1d-case.schema.json cb6c36568a75c8d10b06ec7d8731789e56023b11cc8d498cfca57703c13a9ad1 datasets/1d/v1/cases/1d-wood-furniture.json cd13e90119f89a461de8d5a7d14bbe96cf8708110172ad2d019da5f376a262b8 CITATION.cff @@ -59,9 +61,10 @@ da6e8342856133226cad0ca6c6bca1e607497c30a1d016105b7d54f4ce254a70 datasets/2d/v1 e603eb378f7453f5e14ce87bc5ea0285b93f0fbce3a6edb225190df987ebdace samples/manifest.json e6dc9fea66d59eb62cdc747718fc784bb962952ff7501280b15ba6472042fc36 templates/2d-sheet-and-plate.csv eeb3bc4f2215d6ed7e29a743946c4075fd77f23316cd3cdffe607cc38c99474d schemas/2d-manifest.schema.json +eff9c1bba52b9d7b7bfb09a7bf202bd0716ffda73fd2dcdf8def2af541af5907 results/2d/v1.1.0/README.md f1ce8f5048968c79ad8e7406696389708e3fb51ee08626b23a80916b9e5d1984 LICENSE-DATA.md f27e13aa8a94fc76ce4766ed9f3910ad00e28cfd48d6ff42177e11dc799cc65a scripts/verify-checksums.mjs +f2d26570c37279a45974a3726a5c06b6bb2f8109b035fbf087fb90602289e22e results/2d/v1.1.0/reference-windows-x64-i5-9400f.json f839d9a035286c9dddde94329a0bbffd0d0880eaf985687b1588cf1020c17866 samples/dxf/unitless-rectangle.dxf f8ee19613ce597319f2cb9b1a89c9dbe1257b01a9742145633bba14170078c0a methodology/2d-v1.md -fa23d582976607d64ce1497aeebdaa43eb43adc68a9f46e9866d316c17b4bfd3 README.md ff9ea556c36d48d767b4d6f87f9aa61e58248e8683fa90d3ee4a8c7ff0d0604a .github/workflows/validate.yml diff --git a/results/2d/v1.1.0/README.md b/results/2d/v1.1.0/README.md new file mode 100644 index 0000000..fcffa5f --- /dev/null +++ b/results/2d/v1.1.0/README.md @@ -0,0 +1,47 @@ +# CutNesting 2D reference result - dataset v1.1.0 + +This is the first public reference-machine run of the CutNesting production 2D +nesting engine. It measures a named engine commit against an immutable public +dataset; it is not a comparison with another tool. + +## Reproducibility record + +- Generated: 2026-07-22T08:19:02.698Z +- Dataset: `v1.1.0` at commit `403f9c4eaea7757d2ba6106e917d4d7657675c72` +- Suite and methodology: `1.0.0` +- Engine: `nesting-2d-wasm` `0.1.0`, commit `b974023d6c66aa19959dd8d9f2dc1e88fb56cefb` +- Production entry point: `optimize_nest` +- Execution target: native Rust, not browser WebAssembly +- Timing: 3 warmups and 30 measured synchronous solver calls per case +- Reference machine: Intel Core i5-9400F, 6 logical cores, Windows x64 +- Toolchain: Rust/Cargo 1.96.1 and Node.js 26.4.0 +- Source and dataset worktrees: clean + +The complete JSON retains every raw timing sample, production layout, +validation outcome, input hash and machine field. The CSV is a compact, +analysis-friendly view of the same per-case metrics. + +## Results + +| Case | Placed | Unplaced | Geometric utilization | Estimated unused area | p50 solve time | +| ----------------------------- | -----: | -------: | --------------------: | --------------------: | -------------: | +| Exact square grid | 4 | 0 | 100.000% | 0.000% | 0.565 ms | +| Steel plate panel grid | 12 | 0 | 93.440% | 6.560% | 7.944 ms | +| Wood sheet panel grid | 12 | 0 | 96.748% | 3.252% | 7.652 ms | +| Irregular remnant with a void | 4 | 0 | 25.397% | 74.603% | 7.863 ms | +| Finite sheet stock exhausted | 1 | 2 | 36.000% | 64.000% | 0.516 ms | + +The irregular-remnant case is a geometry and feasibility fixture, not a low- +waste claim. The finite-stock case intentionally leaves two parts unplaced and +tests explicit stock-exhaustion reporting. + +Geometric unused area is sheet polygon area minus placed part polygon area. +It is not disposable manufacturing waste: this benchmark does not model kerf, +lead-ins, pierces, common-line cutting, or generated toolpaths. Part gaps and +edge margins constrain placement but remain included in unused area. + +## Files + +- [`reference-windows-x64-i5-9400f.json`](reference-windows-x64-i5-9400f.json) - complete result and provenance +- [`reference-windows-x64-i5-9400f.summary.csv`](reference-windows-x64-i5-9400f.summary.csv) - compact result table +- [`../../../methodology/2d-v1.md`](../../../methodology/2d-v1.md) - area, timing and validation rules diff --git a/results/2d/v1.1.0/reference-windows-x64-i5-9400f.json b/results/2d/v1.1.0/reference-windows-x64-i5-9400f.json new file mode 100644 index 0000000..5c5f9e4 --- /dev/null +++ b/results/2d/v1.1.0/reference-windows-x64-i5-9400f.json @@ -0,0 +1,1942 @@ +{ + "schemaVersion": "cutnesting.benchmark.run.2d.v1", + "suiteVersion": "1.0.0", + "methodologyVersion": "1.0.0", + "suiteDescription": "Synthetic two-dimensional nesting cases covering exact area accounting, realistic sheet and plate grids, irregular remnant geometry and finite-stock failure boundaries.", + "engine": { + "name": "nesting-2d-wasm", + "version": "0.1.0", + "executionTarget": "native-rust", + "productionEntryPoint": "optimize_nest" + }, + "timingPolicy": { + "warmupRuns": 3, + "measuredRuns": 30, + "boundary": "synchronous production engine call only" + }, + "cases": [ + { + "caseId": "2d-exact-square-grid", + "title": "Exact square grid", + "description": "Four equal square parts exactly cover one square sheet with zero gap and edge margin, providing a minimal area-accounting fixture.", + "difficulty": "small", + "category": "exact", + "tags": ["exact-fit", "area-accounting", "deterministic"], + "inputFile": "cases/2d-exact-square-grid.json", + "source": "synthetic", + "license": "CC-BY-4.0", + "provenance": "Created by Technodweep as a deterministic exact-area and complete-placement fixture.", + "solverStatus": "completed", + "metrics": { + "sheetsUsed": 1, + "totalParts": 4, + "placedParts": 4, + "unplacedParts": 0, + "totalSheetArea": 1000000, + "placedPartArea": 1000000, + "estimatedUnusedArea": 0, + "utilizationPercent": 100, + "estimatedUnusedAreaPercent": 0 + }, + "timing": { + "rawSolveTimeMs": [ + 0.5473, 0.583, 0.5548, 0.5923, 0.586, 0.8272, 0.6832, 0.5638, 0.549, + 0.5998, 0.5799, 0.5658, 0.5634, 0.562, 0.5554, 0.5572, 0.5652, 0.5595, + 0.5638, 0.561, 0.5512, 0.5573, 0.5679, 0.5613, 0.5648, 0.652, 0.6105, + 0.5702, 0.5708, 0.5664 + ], + "p50SolveTimeMs": 0.5648, + "p95SolveTimeMs": 0.6832 + }, + "validation": { + "valid": true, + "errors": [], + "areaAccountingValid": true, + "solverInvariantsValid": true + }, + "productionResult": { + "schemaVersion": 1, + "sheets": [ + { + "cost": null, + "estimatedLeftoverArea": 0, + "geometry": { + "holes": [], + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 1000, + "y": 0 + }, + { + "x": 1000, + "y": 1000 + }, + { + "x": 0, + "y": 1000 + } + ] + }, + "height": 1000, + "isRemnant": false, + "materialGroup": "synthetic::exact::1", + "placedPartArea": 1000000, + "placements": [ + { + "area": 250000, + "bounds": { + "maxX": 500, + "maxY": 500, + "minX": 0, + "minY": 0 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 500 + }, + { + "x": 0, + "y": 500 + } + ], + "partDefinitionId": "square-panel", + "partInstanceId": "square-panel-1", + "partName": "Square panel", + "rotationDeg": 0, + "sheetInstanceId": "square-sheet-1", + "x": 0, + "y": 0 + }, + { + "area": 250000, + "bounds": { + "maxX": 1000, + "maxY": 500, + "minX": 500, + "minY": 0 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 500, + "y": 0 + }, + { + "x": 1000, + "y": 0 + }, + { + "x": 1000, + "y": 500 + }, + { + "x": 500, + "y": 500 + } + ], + "partDefinitionId": "square-panel", + "partInstanceId": "square-panel-2", + "partName": "Square panel", + "rotationDeg": 0, + "sheetInstanceId": "square-sheet-1", + "x": 500, + "y": 0 + }, + { + "area": 250000, + "bounds": { + "maxX": 500, + "maxY": 1000, + "minX": 0, + "minY": 500 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 0, + "y": 500 + }, + { + "x": 500, + "y": 500 + }, + { + "x": 500, + "y": 1000 + }, + { + "x": 0, + "y": 1000 + } + ], + "partDefinitionId": "square-panel", + "partInstanceId": "square-panel-3", + "partName": "Square panel", + "rotationDeg": 0, + "sheetInstanceId": "square-sheet-1", + "x": 0, + "y": 500 + }, + { + "area": 250000, + "bounds": { + "maxX": 1000, + "maxY": 1000, + "minX": 500, + "minY": 500 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 500, + "y": 500 + }, + { + "x": 1000, + "y": 500 + }, + { + "x": 1000, + "y": 1000 + }, + { + "x": 500, + "y": 1000 + } + ], + "partDefinitionId": "square-panel", + "partInstanceId": "square-panel-4", + "partName": "Square panel", + "rotationDeg": 0, + "sheetInstanceId": "square-sheet-1", + "x": 500, + "y": 500 + } + ], + "sheetDefinitionId": "square-sheet", + "sheetInstanceId": "square-sheet-1", + "sheetName": "1000 x 1000 sheet", + "usableArea": 1000000, + "utilizationPercent": 100, + "width": 1000 + } + ], + "solver": { + "deterministicSeed": 2026072201, + "engine": "wasm", + "evaluatedCandidates": 32, + "invariantErrors": [], + "invariantsValid": true, + "searchTimeMs": 0.3046875, + "status": "completed", + "strategiesAttempted": 2 + }, + "summary": { + "estimatedLeftoverArea": 0, + "placedPartArea": 1000000, + "placedParts": 4, + "sheetsUsed": 1, + "totalKnownCost": 0, + "totalParts": 4, + "totalSheetArea": 1000000, + "unknownCostSheets": 1, + "unplacedParts": 0, + "utilizationPercent": 100 + }, + "unplaced": [], + "warnings": [ + "This beta result is a deterministic heuristic, not a proof of globally optimal nesting.", + "Part-in-hole placement and machine toolpath generation are not enabled." + ] + } + }, + { + "caseId": "2d-steel-plate-grid", + "title": "Steel plate panel grid", + "description": "Twelve repeated steel panels are nested on one 3000 by 1500 millimetre plate with a 10 millimetre part gap and edge margin.", + "difficulty": "medium", + "category": "steel", + "tags": ["steel-plate", "part-gap", "edge-margin", "realistic-scale"], + "inputFile": "cases/2d-steel-plate-grid.json", + "source": "synthetic", + "license": "CC-BY-4.0", + "provenance": "Created by Technodweep as a realistic-scale synthetic steel plate utilization case.", + "solverStatus": "completed", + "metrics": { + "sheetsUsed": 1, + "totalParts": 12, + "placedParts": 12, + "unplacedParts": 0, + "totalSheetArea": 4500000, + "placedPartArea": 4204800, + "estimatedUnusedArea": 295200, + "utilizationPercent": 93.44, + "estimatedUnusedAreaPercent": 6.56 + }, + "timing": { + "rawSolveTimeMs": [ + 7.813, 8.1806, 8.4191, 8.5063, 8.1033, 7.9439, 8.0248, 7.8844, 8.2195, + 7.8306, 7.9972, 7.8411, 7.9251, 7.8636, 7.9394, 7.8355, 8.4091, + 8.1935, 8.3622, 8.0422, 7.9066, 8.0936, 7.8641, 7.9261, 7.8366, + 8.1902, 7.8393, 8.188, 7.824, 8.0239 + ], + "p50SolveTimeMs": 7.9439, + "p95SolveTimeMs": 8.4191 + }, + "validation": { + "valid": true, + "errors": [], + "areaAccountingValid": true, + "solverInvariantsValid": true + }, + "productionResult": { + "schemaVersion": 1, + "sheets": [ + { + "cost": 180, + "estimatedLeftoverArea": 295200, + "geometry": { + "holes": [], + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 3000, + "y": 0 + }, + { + "x": 3000, + "y": 1500 + }, + { + "x": 0, + "y": 1500 + } + ] + }, + "height": 1500, + "isRemnant": false, + "materialGroup": "steel::s275::6", + "placedPartArea": 4204800, + "placements": [ + { + "area": 350400, + "bounds": { + "maxX": 740, + "maxY": 490, + "minX": 10, + "minY": 10 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 10, + "y": 10 + }, + { + "x": 740, + "y": 10 + }, + { + "x": 740, + "y": 490 + }, + { + "x": 10, + "y": 490 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-1", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 10, + "y": 10 + }, + { + "area": 350400, + "bounds": { + "maxX": 1480, + "maxY": 490, + "minX": 750, + "minY": 10 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 750, + "y": 10 + }, + { + "x": 1480, + "y": 10 + }, + { + "x": 1480, + "y": 490 + }, + { + "x": 750, + "y": 490 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-2", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 750, + "y": 10 + }, + { + "area": 350400, + "bounds": { + "maxX": 2220, + "maxY": 490, + "minX": 1490, + "minY": 10 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1490, + "y": 10 + }, + { + "x": 2220, + "y": 10 + }, + { + "x": 2220, + "y": 490 + }, + { + "x": 1490, + "y": 490 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-3", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 1490, + "y": 10 + }, + { + "area": 350400, + "bounds": { + "maxX": 2960, + "maxY": 490, + "minX": 2230, + "minY": 10 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 2230, + "y": 10 + }, + { + "x": 2960, + "y": 10 + }, + { + "x": 2960, + "y": 490 + }, + { + "x": 2230, + "y": 490 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-4", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 2230, + "y": 10 + }, + { + "area": 350400, + "bounds": { + "maxX": 740, + "maxY": 980, + "minX": 10, + "minY": 500 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 10, + "y": 500 + }, + { + "x": 740, + "y": 500 + }, + { + "x": 740, + "y": 980 + }, + { + "x": 10, + "y": 980 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-5", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 10, + "y": 500 + }, + { + "area": 350400, + "bounds": { + "maxX": 1480, + "maxY": 980, + "minX": 750, + "minY": 500 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 750, + "y": 500 + }, + { + "x": 1480, + "y": 500 + }, + { + "x": 1480, + "y": 980 + }, + { + "x": 750, + "y": 980 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-6", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 750, + "y": 500 + }, + { + "area": 350400, + "bounds": { + "maxX": 2220, + "maxY": 980, + "minX": 1490, + "minY": 500 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1490, + "y": 500 + }, + { + "x": 2220, + "y": 500 + }, + { + "x": 2220, + "y": 980 + }, + { + "x": 1490, + "y": 980 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-7", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 1490, + "y": 500 + }, + { + "area": 350400, + "bounds": { + "maxX": 2960, + "maxY": 980, + "minX": 2230, + "minY": 500 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 2230, + "y": 500 + }, + { + "x": 2960, + "y": 500 + }, + { + "x": 2960, + "y": 980 + }, + { + "x": 2230, + "y": 980 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-8", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 2230, + "y": 500 + }, + { + "area": 350400, + "bounds": { + "maxX": 740, + "maxY": 1470, + "minX": 10, + "minY": 990 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 10, + "y": 990 + }, + { + "x": 740, + "y": 990 + }, + { + "x": 740, + "y": 1470 + }, + { + "x": 10, + "y": 1470 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-9", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 10, + "y": 990 + }, + { + "area": 350400, + "bounds": { + "maxX": 1480, + "maxY": 1470, + "minX": 750, + "minY": 990 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 750, + "y": 990 + }, + { + "x": 1480, + "y": 990 + }, + { + "x": 1480, + "y": 1470 + }, + { + "x": 750, + "y": 1470 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-10", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 750, + "y": 990 + }, + { + "area": 350400, + "bounds": { + "maxX": 2220, + "maxY": 1470, + "minX": 1490, + "minY": 990 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1490, + "y": 990 + }, + { + "x": 2220, + "y": 990 + }, + { + "x": 2220, + "y": 1470 + }, + { + "x": 1490, + "y": 1470 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-11", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 1490, + "y": 990 + }, + { + "area": 350400, + "bounds": { + "maxX": 2960, + "maxY": 1470, + "minX": 2230, + "minY": 990 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 2230, + "y": 990 + }, + { + "x": 2960, + "y": 990 + }, + { + "x": 2960, + "y": 1470 + }, + { + "x": 2230, + "y": 1470 + } + ], + "partDefinitionId": "steel-panel-730x480", + "partInstanceId": "steel-panel-730x480-12", + "partName": "Steel panel 730 x 480", + "rotationDeg": 0, + "sheetInstanceId": "steel-plate-3000x1500-1", + "x": 2230, + "y": 990 + } + ], + "sheetDefinitionId": "steel-plate-3000x1500", + "sheetInstanceId": "steel-plate-3000x1500-1", + "sheetName": "S275 plate 3000 x 1500 x 6", + "usableArea": 4500000, + "utilizationPercent": 93.44, + "width": 3000 + } + ], + "solver": { + "deterministicSeed": 2026072202, + "engine": "wasm", + "evaluatedCandidates": 590, + "invariantErrors": [], + "invariantsValid": true, + "searchTimeMs": 7.232421875, + "status": "completed", + "strategiesAttempted": 2 + }, + "summary": { + "estimatedLeftoverArea": 295200, + "placedPartArea": 4204800, + "placedParts": 12, + "sheetsUsed": 1, + "totalKnownCost": 180, + "totalParts": 12, + "totalSheetArea": 4500000, + "unknownCostSheets": 0, + "unplacedParts": 0, + "utilizationPercent": 93.44 + }, + "unplaced": [], + "warnings": [ + "This beta result is a deterministic heuristic, not a proof of globally optimal nesting.", + "Part-in-hole placement and machine toolpath generation are not enabled." + ] + } + }, + { + "caseId": "2d-wood-panel-grid", + "title": "Wood sheet panel grid", + "description": "Twelve cabinet-sized panels are nested on one 2440 by 1220 millimetre sheet with a 5 millimetre tool gap and edge margin.", + "difficulty": "medium", + "category": "wood", + "tags": ["sheet-goods", "part-gap", "edge-margin", "realistic-scale"], + "inputFile": "cases/2d-wood-panel-grid.json", + "source": "synthetic", + "license": "CC-BY-4.0", + "provenance": "Created by Technodweep as a realistic-scale synthetic sheet-goods utilization case.", + "solverStatus": "completed", + "metrics": { + "sheetsUsed": 1, + "totalParts": 12, + "placedParts": 12, + "unplacedParts": 0, + "totalSheetArea": 2976800, + "placedPartArea": 2880000, + "estimatedUnusedArea": 96800, + "utilizationPercent": 96.748186, + "estimatedUnusedAreaPercent": 3.251814 + }, + "timing": { + "rawSolveTimeMs": [ + 8.0543, 7.691, 7.5814, 7.6168, 7.6321, 7.6373, 8.1201, 7.7839, 7.8053, + 7.6524, 7.7335, 7.5931, 7.8269, 7.7049, 8.0381, 7.5677, 7.8028, 7.572, + 7.7623, 7.6454, 7.8898, 7.6042, 7.7306, 7.5973, 7.6737, 7.629, 7.6973, + 7.562, 7.6186, 7.5688 + ], + "p50SolveTimeMs": 7.6524, + "p95SolveTimeMs": 8.0543 + }, + "validation": { + "valid": true, + "errors": [], + "areaAccountingValid": true, + "solverInvariantsValid": true + }, + "productionResult": { + "schemaVersion": 1, + "sheets": [ + { + "cost": 95, + "estimatedLeftoverArea": 96800, + "geometry": { + "holes": [], + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 2440, + "y": 0 + }, + { + "x": 2440, + "y": 1220 + }, + { + "x": 0, + "y": 1220 + } + ] + }, + "height": 1220, + "isRemnant": false, + "materialGroup": "plywood::birch::18", + "placedPartArea": 2880000, + "placements": [ + { + "area": 240000, + "bounds": { + "maxX": 605, + "maxY": 405, + "minX": 5, + "minY": 5 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 5, + "y": 5 + }, + { + "x": 605, + "y": 5 + }, + { + "x": 605, + "y": 405 + }, + { + "x": 5, + "y": 405 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-1", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 5, + "y": 5 + }, + { + "area": 240000, + "bounds": { + "maxX": 1210, + "maxY": 405, + "minX": 610, + "minY": 5 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 610, + "y": 5 + }, + { + "x": 1210, + "y": 5 + }, + { + "x": 1210, + "y": 405 + }, + { + "x": 610, + "y": 405 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-2", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 610, + "y": 5 + }, + { + "area": 240000, + "bounds": { + "maxX": 1815, + "maxY": 405, + "minX": 1215, + "minY": 5 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1215, + "y": 5 + }, + { + "x": 1815, + "y": 5 + }, + { + "x": 1815, + "y": 405 + }, + { + "x": 1215, + "y": 405 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-3", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 1215, + "y": 5 + }, + { + "area": 240000, + "bounds": { + "maxX": 2420, + "maxY": 405, + "minX": 1820, + "minY": 5 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1820, + "y": 5 + }, + { + "x": 2420, + "y": 5 + }, + { + "x": 2420, + "y": 405 + }, + { + "x": 1820, + "y": 405 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-4", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 1820, + "y": 5 + }, + { + "area": 240000, + "bounds": { + "maxX": 605, + "maxY": 810, + "minX": 5, + "minY": 410 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 5, + "y": 410 + }, + { + "x": 605, + "y": 410 + }, + { + "x": 605, + "y": 810 + }, + { + "x": 5, + "y": 810 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-5", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 5, + "y": 410 + }, + { + "area": 240000, + "bounds": { + "maxX": 1210, + "maxY": 810, + "minX": 610, + "minY": 410 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 610, + "y": 410 + }, + { + "x": 1210, + "y": 410 + }, + { + "x": 1210, + "y": 810 + }, + { + "x": 610, + "y": 810 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-6", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 610, + "y": 410 + }, + { + "area": 240000, + "bounds": { + "maxX": 1815, + "maxY": 810, + "minX": 1215, + "minY": 410 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1215, + "y": 410 + }, + { + "x": 1815, + "y": 410 + }, + { + "x": 1815, + "y": 810 + }, + { + "x": 1215, + "y": 810 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-7", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 1215, + "y": 410 + }, + { + "area": 240000, + "bounds": { + "maxX": 2420, + "maxY": 810, + "minX": 1820, + "minY": 410 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1820, + "y": 410 + }, + { + "x": 2420, + "y": 410 + }, + { + "x": 2420, + "y": 810 + }, + { + "x": 1820, + "y": 810 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-8", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 1820, + "y": 410 + }, + { + "area": 240000, + "bounds": { + "maxX": 605, + "maxY": 1215, + "minX": 5, + "minY": 815 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 5, + "y": 815 + }, + { + "x": 605, + "y": 815 + }, + { + "x": 605, + "y": 1215 + }, + { + "x": 5, + "y": 1215 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-9", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 5, + "y": 815 + }, + { + "area": 240000, + "bounds": { + "maxX": 1210, + "maxY": 1215, + "minX": 610, + "minY": 815 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 610, + "y": 815 + }, + { + "x": 1210, + "y": 815 + }, + { + "x": 1210, + "y": 1215 + }, + { + "x": 610, + "y": 1215 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-10", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 610, + "y": 815 + }, + { + "area": 240000, + "bounds": { + "maxX": 1815, + "maxY": 1215, + "minX": 1215, + "minY": 815 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1215, + "y": 815 + }, + { + "x": 1815, + "y": 815 + }, + { + "x": 1815, + "y": 1215 + }, + { + "x": 1215, + "y": 1215 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-11", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 1215, + "y": 815 + }, + { + "area": 240000, + "bounds": { + "maxX": 2420, + "maxY": 1215, + "minX": 1820, + "minY": 815 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1820, + "y": 815 + }, + { + "x": 2420, + "y": 815 + }, + { + "x": 2420, + "y": 1215 + }, + { + "x": 1820, + "y": 1215 + } + ], + "partDefinitionId": "wood-panel-600x400", + "partInstanceId": "wood-panel-600x400-12", + "partName": "Cabinet panel 600 x 400", + "rotationDeg": 0, + "sheetInstanceId": "wood-sheet-2440x1220-1", + "x": 1820, + "y": 815 + } + ], + "sheetDefinitionId": "wood-sheet-2440x1220", + "sheetInstanceId": "wood-sheet-2440x1220-1", + "sheetName": "Birch plywood 2440 x 1220 x 18", + "usableArea": 2976800, + "utilizationPercent": 96.74818597151304, + "width": 2440 + } + ], + "solver": { + "deterministicSeed": 2026072203, + "engine": "wasm", + "evaluatedCandidates": 583, + "invariantErrors": [], + "invariantsValid": true, + "searchTimeMs": 7.445556640625, + "status": "completed", + "strategiesAttempted": 2 + }, + "summary": { + "estimatedLeftoverArea": 96800, + "placedPartArea": 2880000, + "placedParts": 12, + "sheetsUsed": 1, + "totalKnownCost": 95, + "totalParts": 12, + "totalSheetArea": 2976800, + "unknownCostSheets": 0, + "unplacedParts": 0, + "utilizationPercent": 96.74818597151304 + }, + "unplaced": [], + "warnings": [ + "This beta result is a deterministic heuristic, not a proof of globally optimal nesting.", + "Part-in-hole placement and machine toolpath generation are not enabled." + ] + } + }, + { + "caseId": "2d-irregular-remnant-with-void", + "title": "Irregular remnant with a void", + "description": "Four square tiles must fit inside a concave L-shaped reusable remnant while avoiding an internal stock void and preserving edge margin.", + "difficulty": "medium", + "category": "irregular-remnant", + "tags": ["concave-stock", "stock-void", "reusable-remnant"], + "inputFile": "cases/2d-irregular-remnant-with-void.json", + "source": "synthetic", + "license": "CC-BY-4.0", + "provenance": "Created by Technodweep to validate true polygon area, concave stock, void avoidance and remnant use.", + "solverStatus": "completed", + "metrics": { + "sheetsUsed": 1, + "totalParts": 4, + "placedParts": 4, + "unplacedParts": 0, + "totalSheetArea": 6300, + "placedPartArea": 1600, + "estimatedUnusedArea": 4700, + "utilizationPercent": 25.396825, + "estimatedUnusedAreaPercent": 74.603175 + }, + "timing": { + "rawSolveTimeMs": [ + 7.9066, 7.9437, 7.8511, 7.9013, 7.7933, 7.8412, 7.8605, 7.8619, + 8.0961, 8.1894, 8.9197, 8.1669, 8.4312, 7.9992, 8.015, 7.8073, 7.9323, + 7.7823, 7.8306, 7.7814, 7.909, 7.8162, 7.8634, 7.7928, 7.8992, 7.7833, + 7.9924, 7.8008, 7.9343, 7.8191 + ], + "p50SolveTimeMs": 7.8634, + "p95SolveTimeMs": 8.4312 + }, + "validation": { + "valid": true, + "errors": [], + "areaAccountingValid": true, + "solverInvariantsValid": true + }, + "productionResult": { + "schemaVersion": 1, + "sheets": [ + { + "cost": 0, + "estimatedLeftoverArea": 4700, + "geometry": { + "holes": [ + [ + { + "x": 10, + "y": 10 + }, + { + "x": 20, + "y": 10 + }, + { + "x": 20, + "y": 20 + }, + { + "x": 10, + "y": 20 + } + ] + ], + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 100, + "y": 0 + }, + { + "x": 100, + "y": 40 + }, + { + "x": 40, + "y": 40 + }, + { + "x": 40, + "y": 100 + }, + { + "x": 0, + "y": 100 + } + ] + }, + "height": 100, + "isRemnant": true, + "materialGroup": "steel::s275::6", + "placedPartArea": 1600, + "placements": [ + { + "area": 400, + "bounds": { + "maxX": 99, + "maxY": 21, + "minX": 79, + "minY": 1 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 79, + "y": 1 + }, + { + "x": 99, + "y": 1 + }, + { + "x": 99, + "y": 21 + }, + { + "x": 79, + "y": 21 + } + ], + "partDefinitionId": "tile", + "partInstanceId": "tile-1", + "partName": "Tile", + "rotationDeg": 0, + "sheetInstanceId": "l-remnant-1", + "x": 79, + "y": 1 + }, + { + "area": 400, + "bounds": { + "maxX": 77, + "maxY": 21, + "minX": 57, + "minY": 1 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 57, + "y": 1 + }, + { + "x": 77, + "y": 1 + }, + { + "x": 77, + "y": 21 + }, + { + "x": 57, + "y": 21 + } + ], + "partDefinitionId": "tile", + "partInstanceId": "tile-2", + "partName": "Tile", + "rotationDeg": 0, + "sheetInstanceId": "l-remnant-1", + "x": 57, + "y": 1 + }, + { + "area": 400, + "bounds": { + "maxX": 55, + "maxY": 21, + "minX": 35, + "minY": 1 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 35, + "y": 1 + }, + { + "x": 55, + "y": 1 + }, + { + "x": 55, + "y": 21 + }, + { + "x": 35, + "y": 21 + } + ], + "partDefinitionId": "tile", + "partInstanceId": "tile-3", + "partName": "Tile", + "rotationDeg": 0, + "sheetInstanceId": "l-remnant-1", + "x": 35, + "y": 1 + }, + { + "area": 400, + "bounds": { + "maxX": 21, + "maxY": 43, + "minX": 1, + "minY": 23 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 1, + "y": 23 + }, + { + "x": 21, + "y": 23 + }, + { + "x": 21, + "y": 43 + }, + { + "x": 1, + "y": 43 + } + ], + "partDefinitionId": "tile", + "partInstanceId": "tile-4", + "partName": "Tile", + "rotationDeg": 0, + "sheetInstanceId": "l-remnant-1", + "x": 1, + "y": 23 + } + ], + "sheetDefinitionId": "l-remnant", + "sheetInstanceId": "l-remnant-1", + "sheetName": "L remnant", + "usableArea": 6300, + "utilizationPercent": 25.396825396825395, + "width": 100 + } + ], + "solver": { + "deterministicSeed": 2026072204, + "engine": "wasm", + "evaluatedCandidates": 614, + "invariantErrors": [], + "invariantsValid": true, + "searchTimeMs": 7.607666015625, + "status": "completed", + "strategiesAttempted": 2 + }, + "summary": { + "estimatedLeftoverArea": 4700, + "placedPartArea": 1600, + "placedParts": 4, + "sheetsUsed": 1, + "totalKnownCost": 0, + "totalParts": 4, + "totalSheetArea": 6300, + "unknownCostSheets": 0, + "unplacedParts": 0, + "utilizationPercent": 25.396825396825395 + }, + "unplaced": [], + "warnings": [ + "This beta result is a deterministic heuristic, not a proof of globally optimal nesting.", + "Part-in-hole placement and machine toolpath generation are not enabled." + ] + } + }, + { + "caseId": "2d-stock-exhausted", + "title": "Finite sheet stock exhausted", + "description": "Three large panels compete for one finite sheet that can hold only one, requiring two explicit stock-exhausted results.", + "difficulty": "small", + "category": "failure-boundary", + "tags": ["finite-stock", "unplaced-parts", "feasibility"], + "inputFile": "cases/2d-stock-exhausted.json", + "source": "synthetic", + "license": "CC-BY-4.0", + "provenance": "Created by Technodweep as a deterministic 2D feasibility and unplaced-part reporting boundary.", + "solverStatus": "completed", + "metrics": { + "sheetsUsed": 1, + "totalParts": 3, + "placedParts": 1, + "unplacedParts": 2, + "totalSheetArea": 10000, + "placedPartArea": 3600, + "estimatedUnusedArea": 6400, + "utilizationPercent": 36, + "estimatedUnusedAreaPercent": 64 + }, + "timing": { + "rawSolveTimeMs": [ + 0.4296, 0.5127, 0.5167, 0.5423, 0.5462, 0.5671, 0.5585, 0.5183, 0.519, + 0.5171, 0.5194, 0.5158, 0.5176, 0.5143, 0.5174, 0.5137, 0.5161, + 0.5123, 0.5165, 0.5134, 0.5161, 0.5138, 0.5162, 0.5144, 0.5348, + 0.5135, 0.5178, 0.5514, 0.5543, 0.5139 + ], + "p50SolveTimeMs": 0.5165, + "p95SolveTimeMs": 0.5585 + }, + "validation": { + "valid": true, + "errors": [], + "areaAccountingValid": true, + "solverInvariantsValid": true + }, + "productionResult": { + "schemaVersion": 1, + "sheets": [ + { + "cost": 10, + "estimatedLeftoverArea": 6400, + "geometry": { + "holes": [], + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 100, + "y": 0 + }, + { + "x": 100, + "y": 100 + }, + { + "x": 0, + "y": 100 + } + ] + }, + "height": 100, + "isRemnant": false, + "materialGroup": "steel::s275::6", + "placedPartArea": 3600, + "placements": [ + { + "area": 3600, + "bounds": { + "maxX": 60, + "maxY": 60, + "minX": 0, + "minY": 0 + }, + "holes": [], + "locked": false, + "manuallyEdited": false, + "mirrored": false, + "outer": [ + { + "x": 0, + "y": 0 + }, + { + "x": 60, + "y": 0 + }, + { + "x": 60, + "y": 60 + }, + { + "x": 0, + "y": 60 + } + ], + "partDefinitionId": "large-panel", + "partInstanceId": "large-panel-1", + "partName": "Large panel", + "rotationDeg": 0, + "sheetInstanceId": "single-plate-1", + "x": 0, + "y": 0 + } + ], + "sheetDefinitionId": "single-plate", + "sheetInstanceId": "single-plate-1", + "sheetName": "Single 100 x 100 plate", + "usableArea": 10000, + "utilizationPercent": 36, + "width": 100 + } + ], + "solver": { + "deterministicSeed": 2026072205, + "engine": "wasm", + "evaluatedCandidates": 24, + "invariantErrors": [], + "invariantsValid": true, + "searchTimeMs": 0.25439453125, + "status": "completed", + "strategiesAttempted": 2 + }, + "summary": { + "estimatedLeftoverArea": 6400, + "placedPartArea": 3600, + "placedParts": 1, + "sheetsUsed": 1, + "totalKnownCost": 10, + "totalParts": 3, + "totalSheetArea": 10000, + "unknownCostSheets": 0, + "unplacedParts": 2, + "utilizationPercent": 36 + }, + "unplaced": [ + { + "message": "Compatible sheet quantity was exhausted before this part could be placed.", + "partDefinitionId": "large-panel", + "partInstanceId": "large-panel-2", + "partName": "Large panel", + "reason": "stock_exhausted" + }, + { + "message": "Compatible sheet quantity was exhausted before this part could be placed.", + "partDefinitionId": "large-panel", + "partInstanceId": "large-panel-3", + "partName": "Large panel", + "reason": "stock_exhausted" + } + ], + "warnings": [ + "This beta result is a deterministic heuristic, not a proof of globally optimal nesting.", + "Part-in-hole placement and machine toolpath generation are not enabled." + ] + } + } + ], + "generatedAt": "2026-07-22T08:19:02.698Z", + "source": { + "repository": "git@github.com:sandeepkurien/1dcutoptimizer.git", + "commit": "b974023d6c66aa19959dd8d9f2dc1e88fb56cefb", + "dirty": false + }, + "datasetSource": { + "checkout": "external-checkout", + "repository": "git@github.com:technodweep/cutnesting-benchmarks.git", + "ref": "v1.1.0", + "commit": "403f9c4eaea7757d2ba6106e917d4d7657675c72", + "dirty": false, + "productMirror": false + }, + "environment": { + "executionTarget": "native-rust", + "operatingSystem": "win32 10.0.22000", + "architecture": "x64", + "cpu": "Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz", + "logicalCores": 6, + "totalMemoryBytes": 34286440448, + "freeMemoryBytesAtReportTime": 20976574464, + "nodeVersion": "v26.4.0", + "rustcVersion": "rustc 1.96.1 (31fca3adb 2026-06-26)", + "cargoVersion": "cargo 1.96.1 (356927216 2026-06-26)" + }, + "artifacts": { + "manifest": { + "path": "datasets/2d/v1/manifest.json", + "bytes": 2073, + "sha256": "4e6d54ec0510235190e6d0c99adc0723b178bd96eba8cc56432588a7ded33054" + }, + "cases": [ + { + "path": "datasets/2d/v1/cases/2d-exact-square-grid.json", + "bytes": 1800, + "sha256": "3fa1679686c4089d3f40cf5c775c44fd13a86c73ae0b8248dc6d09abc4d19b73" + }, + { + "path": "datasets/2d/v1/cases/2d-steel-plate-grid.json", + "bytes": 1822, + "sha256": "730ec1858fcd0d8639002409c367b3d49b3627a6a81f7a1b3eb810fc3efbcb75" + }, + { + "path": "datasets/2d/v1/cases/2d-wood-panel-grid.json", + "bytes": 1826, + "sha256": "a574cffc3eb42f427a035157e78948adc13d4694907ceaaf0a6765dd6d0df4b7" + }, + { + "path": "datasets/2d/v1/cases/2d-irregular-remnant-with-void.json", + "bytes": 2046, + "sha256": "26ff9196bfed893627627676cd65f1b79238e04bc9f0a911a031e11a6ca54236" + }, + { + "path": "datasets/2d/v1/cases/2d-stock-exhausted.json", + "bytes": 1787, + "sha256": "da6e8342856133226cad0ca6c6bca1e607497c30a1d016105b7d54f4ce254a70" + } + ], + "schemas": [ + { + "path": "schemas/2d-manifest.schema.json", + "bytes": 2236, + "sha256": "eeb3bc4f2215d6ed7e29a743946c4075fd77f23316cd3cdffe607cc38c99474d" + }, + { + "path": "schemas/2d-case.schema.json", + "bytes": 1623, + "sha256": "5e5dfadffe824f61c3245ecfb43e5a765efbc9f33e25398a5eb1bacb3cfb79dc" + }, + { + "path": "schemas/2d-result.schema.json", + "bytes": 2424, + "sha256": "2b95191fd5257e96d6a23fd25b3c5e21c0de53f359fa5711d3773f74db7540e5" + } + ] + }, + "interpretation": { + "primaryMetric": "utilizationPercent", + "unusedAreaMetric": "estimatedUnusedAreaPercent", + "limitation": "Estimated unused area is geometric sheet area minus placed part area. It is not disposable manufacturing waste and does not model kerf, lead-ins, pierces, or toolpath loss." + } +} diff --git a/results/2d/v1.1.0/reference-windows-x64-i5-9400f.summary.csv b/results/2d/v1.1.0/reference-windows-x64-i5-9400f.summary.csv new file mode 100644 index 0000000..94d39fb --- /dev/null +++ b/results/2d/v1.1.0/reference-windows-x64-i5-9400f.summary.csv @@ -0,0 +1,6 @@ +case_id,category,solver_status,sheets_used,total_parts,placed_parts,unplaced_parts,total_sheet_area,placed_part_area,estimated_unused_area,utilization_percent,estimated_unused_area_percent,p50_solve_time_ms,p95_solve_time_ms +2d-exact-square-grid,exact,completed,1,4,4,0,1000000,1000000,0,100,0,0.5648,0.6832 +2d-steel-plate-grid,steel,completed,1,12,12,0,4500000,4204800,295200,93.44,6.56,7.9439,8.4191 +2d-wood-panel-grid,wood,completed,1,12,12,0,2976800,2880000,96800,96.748186,3.251814,7.6524,8.0543 +2d-irregular-remnant-with-void,irregular-remnant,completed,1,4,4,0,6300,1600,4700,25.396825,74.603175,7.8634,8.4312 +2d-stock-exhausted,failure-boundary,completed,1,3,1,2,10000,3600,6400,36,64,0.5165,0.5585 diff --git a/results/README.md b/results/README.md index abf81dc..167689f 100644 --- a/results/README.md +++ b/results/README.md @@ -18,3 +18,6 @@ metrics, and independent validation outcome. - [1D dataset v1.0.1 — Windows x64 / Intel Core i5-9400F](1d/v1.0.1/README.md) contains the complete JSON report, raw timing samples and CSV summary for all 13 cases. +- [2D dataset v1.1.0 - Windows x64 / Intel Core i5-9400F](2d/v1.1.0/README.md) + contains the complete production layouts, raw timing samples, independent + area validation and CSV summary for all five cases. diff --git a/scripts/validate-repository.mjs b/scripts/validate-repository.mjs index e91e2f4..4b050d0 100644 --- a/scripts/validate-repository.mjs +++ b/scripts/validate-repository.mjs @@ -523,11 +523,182 @@ async function validateResults() { ); } +async function validate2dResults() { + const resultDir = join(root, "results", "2d", "v1.1.0"); + const resultPath = join(resultDir, "reference-windows-x64-i5-9400f.json"); + const summaryPath = join( + resultDir, + "reference-windows-x64-i5-9400f.summary.csv", + ); + const report = await readJson(resultPath); + const manifest = await readJson( + join(root, "datasets", "2d", "v1", "manifest.json"), + ); + if (!report || !manifest) return; + + check( + report.schemaVersion === "cutnesting.benchmark.run.2d.v1", + "The published 2D result has the wrong schemaVersion.", + ); + check( + report.suiteVersion === manifest.suiteVersion, + "2D result and suite versions differ.", + ); + check( + report.methodologyVersion === manifest.methodologyVersion, + "2D result and methodology versions differ.", + ); + check( + report.engine?.executionTarget === "native-rust", + "The 2D reference result must declare native-rust.", + ); + check( + report.timingPolicy?.warmupRuns === 3, + "The 2D reference result must contain three warmups.", + ); + check( + report.timingPolicy?.measuredRuns === 30, + "The 2D reference result must contain 30 measured runs.", + ); + check( + report.source?.dirty === false, + "The 2D reference engine worktree must be clean.", + ); + check( + report.source?.commit === "b974023d6c66aa19959dd8d9f2dc1e88fb56cefb", + "The 2D reference engine commit changed unexpectedly.", + ); + check( + report.datasetSource?.dirty === false, + "The 2D reference dataset worktree must be clean.", + ); + check( + report.datasetSource?.ref === "v1.1.0", + "The 2D reference result must name dataset tag v1.1.0.", + ); + check( + report.datasetSource?.commit === "403f9c4eaea7757d2ba6106e917d4d7657675c72", + "The 2D reference dataset commit changed unexpectedly.", + ); + check( + report.interpretation?.limitation?.includes( + "not disposable manufacturing waste", + ), + "The 2D result must preserve the unused-area limitation.", + ); + check( + Array.isArray(report.cases) && + report.cases.length === manifest.cases.length, + "The 2D reference result must contain every suite case.", + ); + + const expectedIds = new Set(manifest.cases.map((entry) => entry.id)); + const resultIds = new Set(); + for (const result of report.cases ?? []) { + resultIds.add(result.caseId); + check( + expectedIds.has(result.caseId), + `Unknown 2D result case: ${result.caseId}`, + ); + check( + result.validation?.valid === true, + `${result.caseId} did not pass independent 2D validation.`, + ); + check( + result.validation?.errors?.length === 0, + `${result.caseId} contains 2D validation errors.`, + ); + check( + result.validation?.areaAccountingValid === true, + `${result.caseId} did not pass area accounting.`, + ); + check( + result.validation?.solverInvariantsValid === true, + `${result.caseId} did not pass production solver invariants.`, + ); + check( + result.timing?.rawSolveTimeMs?.length === + report.timingPolicy.measuredRuns, + `${result.caseId} has an incomplete 2D timing series.`, + ); + check( + result.timing?.rawSolveTimeMs?.every( + (value) => Number.isFinite(value) && value >= 0, + ), + `${result.caseId} contains an invalid 2D timing sample.`, + ); + + const metric = result.metrics ?? {}; + check( + Math.abs( + metric.totalSheetArea - + (metric.placedPartArea + metric.estimatedUnusedArea), + ) <= 0.01, + `${result.caseId} does not satisfy 2D area balance.`, + ); + check( + Math.abs( + metric.utilizationPercent + metric.estimatedUnusedAreaPercent - 100, + ) <= 0.001, + `${result.caseId} has inconsistent utilization percentages.`, + ); + check( + metric.placedParts + metric.unplacedParts === metric.totalParts, + `${result.caseId} has inconsistent part counts.`, + ); + } + check( + resultIds.size === expectedIds.size, + "The 2D reference result contains duplicate or missing cases.", + ); + + const artifactGroups = [ + [report.artifacts?.manifest], + report.artifacts?.cases, + report.artifacts?.schemas, + ]; + for (const artifact of artifactGroups.flat().filter(Boolean)) { + const artifactPath = safeChild(root, artifact.path); + check( + Boolean(artifactPath), + `2D result artifact has an unsafe path: ${artifact.path}`, + ); + if (!artifactPath) continue; + const content = await readFile(artifactPath); + const sha256 = createHash("sha256").update(content).digest("hex"); + check( + content.length === artifact.bytes, + `2D result artifact byte count changed: ${artifact.path}`, + ); + check( + sha256 === artifact.sha256, + `2D result artifact hash changed: ${artifact.path}`, + ); + } + + const summaryLines = (await readFile(summaryPath, "utf8")) + .trim() + .split(/\r?\n/u); + check( + summaryLines.length === manifest.cases.length + 1, + "The 2D result summary has the wrong row count.", + ); + const summaryIds = new Set( + summaryLines.slice(1).map((line) => line.split(",", 1)[0]), + ); + check( + summaryIds.size === expectedIds.size && + [...expectedIds].every((id) => summaryIds.has(id)), + "The 2D result summary must contain every suite case exactly once.", + ); +} + await validateCases(); await validate2dCases(); await validateSamples(); await validateTemplates(); await validateResults(); +await validate2dResults(); if (failures.length > 0) { console.error(