Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
* text=auto eol=lf
*.cff text eol=lf
*.csv text eol=lf
*.dxf text eol=lf
*.json text eol=lf
*.md text eol=lf
*.mjs text eol=lf
*.nc1 text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
*.xlsx binary
*.zip binary
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@ All notable changes to public benchmark suites and sample assets are recorded
here. Released dataset inputs are immutable; semantic input changes create a new
suite version.

## Unreleased
## 1.0.1 - 2026-07-21

- Enforced LF line endings for generated and checksummed text assets so clean
Windows, macOS, and Linux checkouts reproduce the committed bytes.
- Added the confirmed public repository and canonical guide to citation metadata.

## 1.0.0 - 2026-07-21

- Added the initial 13-case synthetic 1D suite and methodology v1.
- Added synthetic DXF and DSTV/NC1 import fixtures.
Expand Down
3 changes: 3 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ type: dataset
authors:
- name: Technodweep
version: 1.0.0
date-released: 2026-07-21
license: CC-BY-4.0
repository-code: "https://github.com/technodweep/cutnesting-benchmarks"
url: "https://cutnesting.com/benchmarks/1d-cutting/"
keywords:
- cutting stock
- nesting
Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ No reference-machine result is published yet. Development runs must remain
clearly labeled as local diagnostics and must not be copied into marketing
claims. See [results/README.md](results/README.md).

The current immutable dataset release is
[v1.0.1](https://github.com/technodweep/cutnesting-benchmarks/releases/tag/v1.0.1).
Release `v1.0.0` is superseded because Windows checkout line-ending conversion
prevented byte-for-byte template verification; benchmark case semantics did not
change in `v1.0.1`.

## Licensing

- Dataset cases, sample files, templates, and documentation: CC BY 4.0. See
Expand Down
27 changes: 14 additions & 13 deletions SHA256SUMS
Original file line number Diff line number Diff line change
@@ -1,53 +1,54 @@
0320ed1ae154dac21719844b3b528eae7c4317145bcfe527047917755f957ddb datasets/1d/v1/cases/1d-kerf-exact-fit.json
053f4fb4b195271d458c8cffb3340dee3b90cbf577a4ade64babf73a559fe06f datasets/1d/v1/cases/1d-steel-fabrication.json
092be2892d2dfd6811947879bacbc17d73163a163b8bee4fa2f7e41379c8697f samples/dxf/unitless-rectangle.dxf
0af41137f18d762612180d83e5829e12b6c08c0cf8e48475ed14ce809af5ceb8 datasets/1d/v1/cases/1d-aluminium-profile.json
0d7fdb8681b884bd548e656d281453537d892269cc430e77531acb989fb8ca7b samples/README.md
10370f0d118b25a5845ab3272b3048d78ed431c85964319da538424d7c8e0787 datasets/1d/v1/manifest.json
110a2ea93050ba4e4c3e2844a3a80360a1834c34fa6c85140caa5ce1d1c5a33d datasets/1d/v1/cases/1d-asymmetric-trim.json
12b54b0d2f112eebbef39d13424b586574ec200a74dcb757c5deb472f77ec0f6 samples/nc1/radius-too-large.nc1
227d419d4d0bb2eeb7165f6aa69c25ac9c80ef0d6496fb8cfc2fb5cdd08a725e datasets/1d/v1/cases/1d-mixed-finite-stock.json
2291cdc07004e2ceeba3b68a061dc705f0c4e0d43a09e8574bd46a37aff08277 templates/1d-wood.csv
2e831894024b572c937b6910d640d750d05da7d551cadaf4443caa412ed18dfd datasets/1d/v1/cases/1d-offcut-threshold.json
33dd7fc4e34e876a32e8fd28760f66e909ba1e7de62d35c32ccc393ffbd16195 README.md
340f79e38c1e9c54e4c4f7fa7a10f779595171562b39d69b86b7ce04c3b5a708 samples/nc1/unsupported-profile.nc1
379c6258142310a26b56e19a12090219a7842230c93043add22165d92543ed8a datasets/1d/v1/cases/1d-oversized-cut.json
3872aa21644f029e59717c5d383b8f56cae2ddc46f714569658504c3f9b0e7ba CONTRIBUTING.md
389631286dcf8f56adac4738d308f494a2d5a07739ece075b328f523b2f0dfde templates/2d-sheet-and-plate.xlsx
3f9b228cb1790199f4f5d57c0c5273d0bc31afc56085cf84a45f18d62291c55a templates/definitions.json
4075b6de75729e73d7c885871b65ed82977f2cb410da0fda05a8a8ff3acfb12c datasets/1d/v1/cases/1d-high-piece-count.json
416bdf8ab60a5c061d0f03bb3b6b7ca72d3de33a13b0be2ce248d6905590af56 samples/dxf/self-intersection.dxf
469b6ae250e6ed87b69eb74c4a4465a5a115d4f9177f43ff05ea3f8c49305cba docs/dstv-nc1-supported-subset.md
4f057e5f5625c18c5c5f1abe368d98ffae0ea89ef0be4fa038ba30e6aa346500 CITATION.cff
530c7acb6679f73e273f6837c91113de1a4ac4f891340137186237e921238411 templates/1d-pipe.csv
54d511cc31cd3abf7bfcdff8b5375fbf6380d641e0613d6da74315ac35131fb0 templates/1d-aluminium.csv
575c34472b5be7655cec94cbf64e3cf10d4e1fbb48b3dd7379d1497d32f7c9d2 datasets/1d/v1/cases/1d-stock-exhausted.json
5c6a1002bfe7181ff28461564609d19833dd0619600949d5f19fa02adcc61d4d templates/README.md
61515a9f1f98ce6615cee16851055fb5ee0c6c1e8c8c461a99c960aeaef6a6c8 .gitattributes
62a4cd80cacd5038ee4db3aa59f2eb505f974911f8073f8e3b7aee466b65766a SECURITY.md
672ed6618f1e15138e5a7aa747c2a84671664ec83b5062c17f1d96f763ba9e53 methodology/v1.md
67ea1f3f5aa0366ba04cbfa4d40a7ddb6e51112cfb49e3cbf4b705f2473473b4 datasets/1d/v1/cases/1d-exact-fit.json
68bf7443fae19274bad90ab0ee55f571fb2387b2dbeb3cfa04bba408b1c4f3b5 schemas/1d-result.schema.json
7225ad3c3de17ec306e427b4f9880cddc19460f9e90bdb4443269ceb59a05239 datasets/README.md
7692b25145f8cca22f75134a24a81aefb6db8507b2115aaaa06d0a1829d0fbc8 CHANGELOG.md
77dfc7641646c9f915ee54d20bd0b1ea5d66d0c6eeffa8f743e1516deb22791c samples/dxf/self-intersection.dxf
754fe4464a7ea94ab81eebe10a69f07ccb27abace529301fab6673b2e98a648c samples/nc1/unsupported-profile.nc1
8403f1fc3b7e8f9d0bee935cbcdef1469007cb086256facc2cb89b1dbb57f405 results/README.md
8b616e1bb088f6fb56910aa453e74aaae1c5411928f8622b25374c3eec0d1e80 LICENSE
8c899cfafd3434d17c6b3530160924e6b3aae38c8247e02c17d151af0e8bfb4d scripts/generate-templates.mjs
8e4cbbe934b9f3f1ff4478ec7387ba22b042966c3df45b08d2e43cda7f2c771e samples/dxf/unsupported-entity.dxf
95f51b0bbfbcde9d53690fdf5055714a0b7ada002c76b799f907ef0e70c6b361 datasets/1d/v1/cases/1d-pipe-batch.json
965da75f235f334eb556cf63e12306627a1dad9ecc2ff05aed75be6f57292776 scripts/validate-repository.mjs
988e03e819c1fd5064f1a48e1cf72b9e11a5b1b067630234f4647363b69901f3 docs/repository-contract.md
9e7c7dad84df75e01601c22b4afa3458fd1553d0bfb93afb475c951079a18383 samples/dxf/unitless-open-contour.dxf
9cc055698c8c63b83eda5b2bdf21e57b49a80989365730438f9bc1fdeb349c9e samples/dxf/unitless-open-contour.dxf
9e47e498a7f75119e124d12613407228452a0beb4041086db8046020aade65da samples/nc1/radius-too-large.nc1
a34257ca65ac5f44b99f05b2d180931de5796c0f78fea81d29d94987b16717d4 samples/dxf/layer-block-insert.dxf
a4980b24140bd58dda422718e4b189f208715976b670c33f257c224b20c9942f samples/nc1/plate-radius.nc1
aac5abb1eacaee94944a150db7d0facf886c71a26def8a36e4be7db3137f3bfc .gitignore
ba553dce6c7e6058ce11002f162bb8cf517d683fd08aaddb9cc4d5e192c0af57 package.json
c4aa3a77b37562ab4206221aab32cf68a89c3de33f411533c08547097d61a7a2 templates/1d-steel.csv
c680e32b10dee44df1f84b3f57e8c7c75591e01ee2686ffc53ec9ce7e05e25dc datasets/1d/v1/cases/1d-cost-tradeoff.json
c69cab60731a7e60036138b23e57b7a2f842475692fad5132df695f4e6068427 scripts/verify-checksums.mjs
c835f63b88d549850553fb6c9ffe01c3c9cfc197b6a3c74334deeb6cc2c8f896 package.json
cb1136ac89f569865b72f8af974ec059abe7914013f0c32f1396d8b99e874a28 schemas/1d-case.schema.json
cb6c36568a75c8d10b06ec7d8731789e56023b11cc8d498cfca57703c13a9ad1 datasets/1d/v1/cases/1d-wood-furniture.json
cec44b1e590e04b98c94fe10b58e7f2ceef9a8e38c44c502fe7fa68c4eb993e4 samples/dxf/layer-block-insert.dxf
d06f3820426f42512831c0bafa3a82dfc26525ed72e3edffec02f53e37ad5e48 samples/nc1/plate-radius.nc1
d4a1e22458b89677bdffa737876f92e78fef7fc7afcca7d70343872f7bda6121 README.md
d52a2c32095f4035f5d23002f14a2310548ee469f1a9175a8c893362f653fbc6 schemas/manifest.schema.json
d8c42e7b49d05cd04a59481dd71d87654bbf2592ed8cd7cf3cd5bd86b365e432 samples/dxf/unsupported-entity.dxf
da697e0db4946a0c42bb8aa4aa8c65546561ec8434fc52ead383804fb087fcce CHANGELOG.md
e5067d3ddbfbffc4a53bc184199a1ff67c64bac88c83ce3fb9b4549010f40d85 CITATION.cff
e603eb378f7453f5e14ce87bc5ea0285b93f0fbce3a6edb225190df987ebdace samples/manifest.json
e6dc9fea66d59eb62cdc747718fc784bb962952ff7501280b15ba6472042fc36 templates/2d-sheet-and-plate.csv
f1ce8f5048968c79ad8e7406696389708e3fb51ee08626b23a80916b9e5d1984 LICENSE-DATA.md
f27e13aa8a94fc76ce4766ed9f3910ad00e28cfd48d6ff42177e11dc799cc65a scripts/verify-checksums.mjs
f839d9a035286c9dddde94329a0bbffd0d0880eaf985687b1588cf1020c17866 samples/dxf/unitless-rectangle.dxf
ff9ea556c36d48d767b4d6f87f9aa61e58248e8683fa90d3ee4a8c7ff0d0604a .github/workflows/validate.yml
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cutnesting-benchmarks",
"version": "1.0.0",
"version": "1.0.1",
"private": true,
"type": "module",
"description": "Public benchmark datasets and sample files for cutting and nesting workflows.",
Expand Down
12 changes: 12 additions & 0 deletions scripts/verify-checksums.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,28 @@ if (write) {
}
if (actual !== expected) {
console.error("SHA256SUMS is missing or stale.");
reportDifference(actual, expected);
console.error("Run npm run generate:checksums and commit the result.");
process.exitCode = 1;
} else {
console.log(`Checksum verification passed (${lines.length} files).`);
}
}

function reportDifference(actual, expected) {
const actualLines = new Set(actual.split(/\r?\n/u).filter(Boolean));
const expectedLines = new Set(expected.split(/\r?\n/u).filter(Boolean));
const missing = [...expectedLines].filter((line) => !actualLines.has(line));
const stale = [...actualLines].filter((line) => !expectedLines.has(line));

for (const line of missing) console.error(`Expected: ${line}`);
for (const line of stale) console.error(`Found: ${line}`);
}

async function walk(directory) {
const output = [];
for (const entry of await readdir(directory, { withFileTypes: true })) {
if (entry.name === ".git") continue;
if (entry.isDirectory() && ignoredDirectories.has(entry.name)) continue;
const path = join(directory, entry.name);
if (entry.isDirectory()) output.push(...(await walk(path)));
Expand Down
Loading