# Plank waste study: engine-counted offcuts vs flat waste allowances

Version 1.0.0, 2026-10-02. Author: Calculiva. Outputs (rows.csv, summary.csv, this README, datapackage.json) are licensed CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/).

Every number in this folder is produced by the Calculiva flooring layout engine on a fixed grid of inputs. No third-party waste figure enters the calculation.

## Method

The Calculiva flooring layout engine (source not published; engine file SHA-1 `087e859c0b8ddf053f8039543a080906e7ba6e34`) is run once per grid cell. For each plan it records the pieces placed, the whole planks consumed and the offcut area. That plank count is then compared with the order a flat allowance would give, `ceil((1 + allowance) x room area / plank face area)`, for allowances of 5, 8, 10 and 15 %. All areas, percentages and plank counts in the outputs are computed in exact integer arithmetic.

The four allowances are comparison levels, not recommendations. In the Calculiva register sheet `flooring-cost-estimator-bases` (observed runs of public online flooring estimators), 8 % is recorded as a default setting and 15 % as an option; 5 % and 10 % are recorded as the waste value entered in observed runs.

Reproduction: the public Flooring Calculator at https://calculiva.com/flooring/flooring-calculator/ exposes every parameter varied here: room width and length, plank length and width, the repeating starter sequence (Halves = 1/2, Thirds = 1/3, Aligned = 0), pairing of starter and end cuts (reuse), saw kerf, balanced edge rows, first-row starter, clearance, direction, planks per carton and reserve. Each row can be reproduced there with clearance 0, first-row starter 0, balanced unchecked, direction horizontal, 1 plank per carton, reserve 0 and the row's kerf (enter 3 mm in metric mode); the result to compare is "Source boards".

## Parameters

| Parameter | Value |
|---|---|
| Room width x length | 72 to 288 in (6 to 24 ft) in 6 in steps on each side: 37 x 37 = 1,369 rooms; W x L and L x W are distinct. A 2 ft grid would land on whole multiples of 48 in planks and bias the medians. |
| Unit conversion | mm = in x 25.4 |
| offset | 1/2 and 1/3 for every format; 0 for sourced formats only, reference only |
| reuse | true (start and end cut from opposite ends of one plank) and false (worst case) |
| kerf | 0 mm everywhere; plus 3 mm on reuse = true rows at offsets 1/2 and 1/3 |
| direction | horizontal |
| first | 0: the engine convention for "the first row starts with a full plank", not a zero-length cut. Row i then starts with a piece of ((i x offset) mod 1) x plank length, or a full plank when that is 0. |
| gap (clearance), minStagger, minStart, minRow | 0 (engine defaults; the three minimums only raise warnings) |
| balanced | false (engine default: last row is the remainder width) |
| perBox, extra (reserve), price | 1, 0, 0: the plank count is the purchase count with no carton rounding |

### Plank formats

| format_id | Length x width (in) | format_origin | Offsets | Origin |
|---|---|---|---|---|
| 48x8in | 48 x 8 | calculator_preset | 0, 1/2, 1/3 | default of the Flooring Calculator (https://calculiva.com/flooring/flooring-calculator/), the Laminate Flooring Calculator (https://calculiva.com/flooring/laminate-flooring-calculator/) and Product A of the Flooring Cost Calculator (https://calculiva.com/flooring/flooring-calculator-cost/) |
| 48x7.5in | 48 x 7.5 | calculator_preset | 0, 1/2, 1/3 | default of Product B in the Flooring Cost Calculator (https://calculiva.com/flooring/flooring-calculator-cost/) |
| 48x5in | 48 x 5 | register_observation | 0, 1/2, 1/3 | recorded as an example in an online estimator (Calculiva register, sheet flooring-cost-estimator-bases) |
| 36x7.5in | 36 x 7.5 | parametric | 1/2, 1/3 | design-of-experiment value (length sweep at 7.5 in width), not a retail format |
| 60x7.5in | 60 x 7.5 | parametric | 1/2, 1/3 | design-of-experiment value (length sweep at 7.5 in width), not a retail format |
| 72x7.5in | 72 x 7.5 | parametric | 1/2, 1/3 | design-of-experiment value (length sweep at 7.5 in width), not a retail format |

The `parametric` formats (36, 60 and 72 in long at 7.5 in wide) are design-of-experiment values that isolate the effect of plank length. They are not retail formats and no product is claimed to exist at these dimensions. Preset and register formats are recorded inputs, not product recommendations.

Not used: the 4 x 12 in herringbone tile example of register sheet `herringbone-format-guidance` (tile, not a straight-lay plank) and the 60 / 50 / 35 in boards of the Hardwood Flooring Calculator (https://calculiva.com/flooring/hardwood-flooring-calculator/), a random-length inventory for a separate racking planner.

**Offset 0 is reference only: no stagger, not an installation pattern.** It is kept for the sourced formats because its plank count has a closed form, and it is excluded from every headline figure.

Grid size: 57498 rows. No InputError was raised.

## Headline figures (offsets 1/2 and 1/3 only)

Reuse is the reference scenario. "No reuse" is the worst case: every end offcut is discarded, which is not an installation practice. Reuse here follows a fixed repeating pattern; an installer who starts each row with the previous row's offcut (free stagger) can waste less than this pattern.

Kerf 0 is a floor: a real saw cut can only remove start/end pairs, never add one. At kerf 0, 56165 of 246383 start/end pairs (22.8 %) have lengths summing exactly to the plank length; none of them can be formed with any kerf above 0. The 3 mm value is a parametric sensitivity value, not a statement about any saw blade.

Without reuse the kerf changes nothing, since it only enters pairing: re-running every no-reuse plan with a 3 mm kerf gave identical plank counts on 20535 of 20535 plans.

Cells give the share of plans (%) where a flat allowance orders fewer planks than the engine needs (short) / more (excess). Median of an even-sized group = mean of the two middle values, rounded half up.

| Formats | Scenario | Plans | Median waste % | 5 %: short / excess | 8 %: short / excess | 10 %: short / excess | 15 %: short / excess |
|---|---|---:|---:|---:|---:|---:|---:|
| sourced formats | reuse, kerf 0 mm | 8214 | 6.262 | 50.1 / 39.5 | 26.6 / 64.8 | 16.8 / 76.9 | 4.1 / 92.4 |
| sourced formats | reuse, kerf 3 mm | 8214 | 8.516 | 70.1 / 20.3 | 44.2 / 46.2 | 31.2 / 60.9 | 11.4 / 83.7 |
| sourced formats | no reuse (worst case) | 8214 | 22.054 | 100.0 / 0.0 | 99.6 / 0.0 | 97.5 / 1.3 | 80.5 / 15.3 |
| parametric lengths | reuse, kerf 0 mm | 8214 | 6.707 | 51.6 / 37.0 | 31.2 / 59.0 | 22.1 / 70.1 | 8.9 / 86.5 |
| parametric lengths | reuse, kerf 3 mm | 8214 | 9.852 | 77.0 / 13.4 | 52.4 / 36.5 | 39.6 / 50.7 | 18.2 / 75.2 |
| parametric lengths | no reuse (worst case) | 8214 | 25.295 | 100.0 / 0.0 | 98.8 / 0.7 | 96.0 / 2.8 | 82.0 / 15.0 |

## Results by group

| Format | Origin | Offset | Scenario | Median waste % | Max waste % | 5 %: short / excess | 8 %: short / excess | 10 %: short / excess | 15 %: short / excess |
|---|---|---|---|---:|---:|---:|---:|---:|---:|
| 48x8in | calculator_preset | 0 (reference only) | reuse, kerf 0 mm | 13.400 | 50.588 | 75.1 / 19.5 | 63.3 / 31.1 | 56.4 / 39.0 | 38.7 / 56.2 |
| 48x8in | calculator_preset | 0 (reference only) | no reuse (worst case) | 13.400 | 50.588 | 75.1 / 19.5 | 63.3 / 31.1 | 56.4 / 39.0 | 38.7 / 56.2 |
| 48x8in | calculator_preset | 1/2 | reuse, kerf 0 mm | 6.667 | 31.282 | 53.3 / 36.4 | 32.7 / 58.3 | 22.1 / 70.6 | 7.6 / 88.5 |
| 48x8in | calculator_preset | 1/2 | reuse, kerf 3 mm | 10.458 | 42.222 | 80.2 / 11.3 | 58.7 / 31.5 | 44.7 / 46.2 | 19.8 / 74.1 |
| 48x8in | calculator_preset | 1/2 | no reuse (worst case) | 20.430 | 64.103 | 100.0 / 0.0 | 98.9 / 0.2 | 94.8 / 2.7 | 71.6 / 22.1 |
| 48x8in | calculator_preset | 1/3 | reuse, kerf 0 mm | 6.043 | 21.905 | 45.1 / 39.7 | 20.4 / 68.3 | 11.8 / 81.3 | 0.9 / 95.4 |
| 48x8in | calculator_preset | 1/3 | reuse, kerf 3 mm | 7.029 | 24.444 | 57.9 / 27.0 | 29.2 / 57.8 | 17.9 / 73.6 | 2.8 / 92.1 |
| 48x8in | calculator_preset | 1/3 | no reuse (worst case) | 23.892 | 65.926 | 100.0 / 0.0 | 100.0 / 0.0 | 99.9 / 0.0 | 88.4 / 7.7 |
| 48x7.5in | calculator_preset | 0 (reference only) | reuse, kerf 0 mm | 13.636 | 51.261 | 76.3 / 18.9 | 64.3 / 30.8 | 57.1 / 38.6 | 39.4 / 55.7 |
| 48x7.5in | calculator_preset | 0 (reference only) | no reuse (worst case) | 13.636 | 51.261 | 76.3 / 18.9 | 64.3 / 30.8 | 57.1 / 38.6 | 39.4 / 55.7 |
| 48x7.5in | calculator_preset | 1/2 | reuse, kerf 0 mm | 7.023 | 31.868 | 55.7 / 35.7 | 34.1 / 57.8 | 22.6 / 70.0 | 7.7 / 88.2 |
| 48x7.5in | calculator_preset | 1/2 | reuse, kerf 3 mm | 10.577 | 42.857 | 82.4 / 11.2 | 60.5 / 30.8 | 45.5 / 45.1 | 20.4 / 73.6 |
| 48x7.5in | calculator_preset | 1/2 | no reuse (worst case) | 20.732 | 64.835 | 100.0 / 0.0 | 99.3 / 0.0 | 95.5 / 2.2 | 73.6 / 21.3 |
| 48x7.5in | calculator_preset | 1/3 | reuse, kerf 0 mm | 6.101 | 22.449 | 48.6 / 38.1 | 22.6 / 66.7 | 12.7 / 79.4 | 1.0 / 95.0 |
| 48x7.5in | calculator_preset | 1/3 | reuse, kerf 3 mm | 7.372 | 25.000 | 61.7 / 25.6 | 31.6 / 56.2 | 19.1 / 71.7 | 3.4 / 91.7 |
| 48x7.5in | calculator_preset | 1/3 | no reuse (worst case) | 24.000 | 66.667 | 100.0 / 0.0 | 100.0 / 0.0 | 99.9 / 0.0 | 89.3 / 7.4 |
| 48x5in | register_observation | 0 (reference only) | reuse, kerf 0 mm | 12.493 | 47.059 | 75.1 / 21.7 | 63.0 / 33.7 | 55.9 / 41.1 | 37.7 / 57.7 |
| 48x5in | register_observation | 0 (reference only) | no reuse (worst case) | 12.493 | 47.059 | 75.1 / 21.7 | 63.0 / 33.7 | 55.9 / 41.1 | 37.7 / 57.7 |
| 48x5in | register_observation | 1/2 | reuse, kerf 0 mm | 6.280 | 28.205 | 53.3 / 41.1 | 31.3 / 63.2 | 20.8 / 74.7 | 6.9 / 90.2 |
| 48x5in | register_observation | 1/2 | reuse, kerf 3 mm | 9.866 | 38.889 | 80.3 / 14.3 | 57.9 / 36.2 | 43.1 / 50.5 | 18.9 / 76.9 |
| 48x5in | register_observation | 1/2 | no reuse (worst case) | 20.000 | 60.256 | 100.0 / 0.0 | 99.6 / 0.0 | 95.1 / 2.8 | 71.9 / 24.6 |
| 48x5in | register_observation | 1/3 | reuse, kerf 0 mm | 5.263 | 19.048 | 44.4 / 46.2 | 18.6 / 74.4 | 10.9 / 85.1 | 0.6 / 96.9 |
| 48x5in | register_observation | 1/3 | reuse, kerf 3 mm | 6.667 | 22.396 | 57.8 / 32.7 | 27.1 / 64.8 | 16.7 / 78.4 | 3.1 / 93.9 |
| 48x5in | register_observation | 1/3 | no reuse (worst case) | 23.167 | 63.194 | 100.0 / 0.0 | 100.0 / 0.0 | 100.0 / 0.0 | 88.3 / 8.9 |
| 36x7.5in | parametric | 1/2 | reuse, kerf 0 mm | 5.281 | 24.260 | 44.7 / 46.3 | 20.2 / 72.8 | 11.3 / 83.6 | 2.6 / 95.4 |
| 36x7.5in | parametric | 1/2 | reuse, kerf 3 mm | 8.974 | 33.929 | 79.1 / 14.2 | 49.5 / 41.6 | 33.3 / 58.6 | 12.6 / 83.3 |
| 36x7.5in | parametric | 1/2 | no reuse (worst case) | 15.741 | 48.352 | 100.0 / 0.0 | 93.8 / 4.0 | 82.7 / 12.7 | 48.4 / 45.5 |
| 36x7.5in | parametric | 1/3 | reuse, kerf 0 mm | 3.687 | 15.385 | 24.0 / 64.6 | 5.1 / 88.8 | 0.9 / 95.5 | 0.0 / 99.6 |
| 36x7.5in | parametric | 1/3 | reuse, kerf 3 mm | 7.313 | 25.000 | 68.8 / 20.5 | 31.3 / 57.5 | 17.8 / 73.8 | 3.7 / 92.7 |
| 36x7.5in | parametric | 1/3 | no reuse (worst case) | 17.378 | 48.352 | 100.0 / 0.0 | 99.3 / 0.1 | 93.6 / 3.9 | 59.3 / 35.4 |
| 60x7.5in | parametric | 1/2 | reuse, kerf 0 mm | 9.012 | 36.218 | 65.2 / 25.0 | 46.3 / 43.3 | 35.0 / 56.0 | 15.1 / 78.1 |
| 60x7.5in | parametric | 1/2 | reuse, kerf 3 mm | 12.293 | 42.857 | 84.0 / 7.9 | 65.2 / 24.5 | 53.8 / 37.1 | 27.7 / 63.8 |
| 60x7.5in | parametric | 1/2 | no reuse (worst case) | 25.558 | 78.571 | 100.0 / 0.0 | 100.0 / 0.0 | 99.9 / 0.0 | 89.8 / 6.4 |
| 60x7.5in | parametric | 1/3 | reuse, kerf 0 mm | 7.494 | 30.495 | 57.7 / 27.4 | 32.7 / 53.9 | 21.3 / 68.3 | 5.6 / 90.1 |
| 60x7.5in | parametric | 1/3 | reuse, kerf 3 mm | 8.359 | 30.495 | 65.8 / 19.9 | 40.1 / 45.9 | 27.2 / 61.4 | 8.0 / 86.9 |
| 60x7.5in | parametric | 1/3 | no reuse (worst case) | 29.819 | 78.571 | 100.0 / 0.0 | 100.0 / 0.0 | 100.0 / 0.0 | 99.5 / 0.0 |
| 72x7.5in | parametric | 1/2 | reuse, kerf 0 mm | 10.294 | 50.888 | 66.1 / 24.6 | 51.4 / 40.1 | 42.7 / 49.0 | 23.1 / 69.5 |
| 72x7.5in | parametric | 1/2 | reuse, kerf 3 mm | 14.286 | 60.714 | 85.0 / 7.5 | 70.3 / 21.3 | 61.6 / 30.1 | 38.1 / 53.0 |
| 72x7.5in | parametric | 1/2 | no reuse (worst case) | 30.814 | 97.802 | 100.0 / 0.0 | 100.0 / 0.0 | 100.0 / 0.0 | 95.0 / 2.9 |
| 72x7.5in | parametric | 1/3 | reuse, kerf 0 mm | 7.143 | 34.615 | 52.2 / 34.2 | 31.8 / 54.9 | 21.2 / 68.3 | 7.0 / 86.5 |
| 72x7.5in | parametric | 1/3 | reuse, kerf 3 mm | 10.994 | 44.231 | 79.3 / 10.3 | 57.8 / 28.3 | 43.8 / 43.5 | 18.8 / 71.5 |
| 72x7.5in | parametric | 1/3 | no reuse (worst case) | 34.146 | 97.802 | 100.0 / 0.0 | 100.0 / 0.0 | 100.0 / 0.0 | 99.9 / 0.0 |

## Columns: rows.csv

| Column | Type | Definition |
|---|---|---|
| format_id | string | Plank format identifier (installed face length x width, inches). |
| format_origin | string | calculator_preset (default of a public Calculiva calculator), register_observation (recorded as an example in an online estimator, Calculiva register) or parametric (design-of-experiment value, not a retail format). |
| plank_length_in | number | Installed plank length, inches. |
| plank_width_in | number | Installed plank width, inches. |
| plank_length_mm | number | Plank length passed to the engine, mm (inches x 25.4). |
| plank_width_mm | number | Plank width passed to the engine, mm (inches x 25.4). |
| room_width_in | integer | Room width, inches (72 to 288 by 6). Laying direction is horizontal, so planks run along this side. |
| room_length_in | integer | Room length, inches (72 to 288 by 6). Rows are stacked across this side. |
| room_width_mm | number | Room width passed to the engine, mm (inches x 25.4). |
| room_length_mm | number | Room length passed to the engine, mm (inches x 25.4). |
| offset | string | Repeating row offset as a fraction of plank length: 0 (reference only), 1/2 or 1/3. |
| reuse | boolean | true = a row-start piece and a row-end piece may be cut from opposite factory ends of the same source plank. false = worst case: every end offcut is discarded. |
| kerf_mm | integer | Saw kerf reserved twice per paired plank, mm: 0 (idealised) or 3 (parametric sensitivity value). Only reuse = true rows at offsets 1/2 and 1/3 have a 3 mm variant. |
| rows | integer | Number of plank rows in the plan. |
| installed_pieces | integer | Pieces placed on the floor (full and cut). |
| source_planks | integer | Whole planks consumed (engine sourceCount). With 1 plank per carton and 0 % reserve this is the purchase count. |
| reused_pieces | integer | installed_pieces minus source_planks: pieces taken from the offcut of another piece. |
| used_area_mm2 | number | Floor area covered by placed pieces, mm2 (equals room area: clearance is 0). Exact. |
| source_area_mm2 | number | Face area of all source planks, mm2. Exact. |
| offcut_area_mm2 | number | source_area_mm2 minus used_area_mm2, mm2. Exact. |
| waste_pct | number | 100 x offcut_area_mm2 / used_area_mm2, rounded half up to 3 decimals from the exact fraction. |
| allow05_planks | integer | Planks ordered under a flat 5 % allowance: ceil(1.05 x room area / plank face area), exact. Short when below source_planks. |
| allow08_planks | integer | Planks ordered under a flat 8 % allowance: ceil(1.08 x room area / plank face area), exact. Short when below source_planks. |
| allow10_planks | integer | Planks ordered under a flat 10 % allowance: ceil(1.1 x room area / plank face area), exact. Short when below source_planks. |
| allow15_planks | integer | Planks ordered under a flat 15 % allowance: ceil(1.15 x room area / plank face area), exact. Short when below source_planks. |
| h_alignment | boolean | true when the engine flags end joints aligned two rows apart (H alignment). |

## Columns: summary.csv

One row per format x offset x scenario (1,369 rooms each).

| Column | Type | Definition |
|---|---|---|
| format_id | string | Plank format identifier. |
| format_origin | string | As in rows.csv. |
| offset | string | Row offset: 0, 1/2 or 1/3. |
| reuse | boolean | Offcut reuse on or off (off = worst case). |
| kerf_mm | integer | Saw kerf, mm. |
| reference_only | boolean | true for offset 0 (no stagger, not an installation pattern); excluded from headline figures. |
| cases | integer | Number of rooms in the group (1,369). |
| waste_pct_min | number | Minimum of the waste_pct column. |
| waste_pct_median | number | Median of the waste_pct column (odd group size: middle value). |
| waste_pct_mean | number | Mean of the waste_pct column, rounded half up to 3 decimals. |
| waste_pct_max | number | Maximum of the waste_pct column. |
| allow05_short | integer | Rooms where the 5 % order is below source_planks. |
| allow05_exact | integer | Rooms where the 5 % order equals source_planks. |
| allow05_excess | integer | Rooms where the 5 % order is above source_planks. |
| allow05_short_pct | number | 100 x allow05_short / cases, rounded half up to 1 decimal. |
| allow05_excess_pct | number | 100 x allow05_excess / cases, rounded half up to 1 decimal. |
| allow08_short | integer | Rooms where the 8 % order is below source_planks. |
| allow08_exact | integer | Rooms where the 8 % order equals source_planks. |
| allow08_excess | integer | Rooms where the 8 % order is above source_planks. |
| allow08_short_pct | number | 100 x allow08_short / cases, rounded half up to 1 decimal. |
| allow08_excess_pct | number | 100 x allow08_excess / cases, rounded half up to 1 decimal. |
| allow10_short | integer | Rooms where the 10 % order is below source_planks. |
| allow10_exact | integer | Rooms where the 10 % order equals source_planks. |
| allow10_excess | integer | Rooms where the 10 % order is above source_planks. |
| allow10_short_pct | number | 100 x allow10_short / cases, rounded half up to 1 decimal. |
| allow10_excess_pct | number | 100 x allow10_excess / cases, rounded half up to 1 decimal. |
| allow15_short | integer | Rooms where the 15 % order is below source_planks. |
| allow15_exact | integer | Rooms where the 15 % order equals source_planks. |
| allow15_excess | integer | Rooms where the 15 % order is above source_planks. |
| allow15_short_pct | number | 100 x allow15_short / cases, rounded half up to 1 decimal. |
| allow15_excess_pct | number | 100 x allow15_excess / cases, rounded half up to 1 decimal. |

## Independent checks

An independent checker (Python, exact integer arithmetic, no access to the engine code) rebuilds every plan from the layout rules (row widths, starter sequence, opposite-end pairing with kerf) and compares every column of every row of rows.csv, every row of summary.csv and every computed figure of this README. The worked cases below were done by hand.

### Case 1: 48x8in, 120 x 72 in, offset 1/2, reuse, kerf 0 mm

- Run 120 in, span 72 in: 72 / 8 = 9 rows of 8 in.
- Rows 1, 3, 5, 7, 9 start with a full 48 in plank (48 + 48 + 24 end); rows 2, 4, 6, 8 start with a 24 in piece (24 + 48 + 48).
- Pieces: 9 x 3 = 27. Without reuse: 27 planks.
- With reuse, each 24 in start pairs with a 24 in end (24 + 24 <= 48): 4 pairs, one 24 in end left alone. Planks: 27 - 4 = 23.
- Offcut: 23 x 384 - 8,640 = 192 in2 = 123,870.72 mm2 (2.222 %). Allowances on 8,640 / 384 = 22.5 planks: 5 % -> 24, 8 % -> 25, 10 % -> 25, 15 % -> 26, all above 23.
- Hand result: 27 pieces, 23 planks, offcut 123870.72 mm2. Engine: 27 pieces, 23 planks, offcut 123870.72 mm2.

### Case 2: 48x8in, 120 x 72 in, offset 1/2, reuse, kerf 3 mm

- Same room with a 3 mm kerf: 24 in + 24 in + 2 x 3 mm exceeds 48 in, so no pair forms. Planks: 27.
- Offcut: 27 x 384 - 8,640 = 1,728 in2 = 1,114,836.48 mm2 (20.000 %). Every allowance from 5 to 15 % (24 to 26 planks) is short.
- Hand result: 27 pieces, 27 planks, offcut 1114836.48 mm2. Engine: 27 pieces, 27 planks, offcut 1114836.48 mm2.

### Case 3: 60x7.5in, 90 x 72 in, offset 1/2, reuse, kerf 0 mm

- Parametric length. Run 90 in, span 72 in: 72 / 7.5 = 9.6, so 9 rows of 7.5 in and a last row of 4.5 in (10 rows).
- Rows 1, 3, 5, 7, 9 start with a full 60 in plank (60 + 30 end); rows 2, 4, 6, 8, 10 start with a 30 in piece (30 + 60).
- Pieces: 10 x 2 = 20. Without reuse: 20 planks.
- With reuse, each 30 in start pairs with a 30 in end (30 + 30 <= 60): 5 pairs. Planks: 20 - 5 = 15.
- Offcut: 15 x 450 - 6,480 = 270 in2 = 174,193.20 mm2 (4.167 %): the 3 in rip strip of the 4.5 in last row along 90 in. Allowances on 6,480 / 450 = 14.4 planks: 5 % -> 16, 8 % -> 16, 10 % -> 16, 15 % -> 17.
- Hand result: 20 pieces, 15 planks, offcut 174193.20 mm2. Engine: 20 pieces, 15 planks, offcut 174193.20 mm2.

### Case 4: 48x7.5in, 72 x 96 in, offset 1/3, reuse, kerf 0 mm

- Run 72 in, span 96 in: 96 / 7.5 = 12.8, so 12 rows of 7.5 in and a last row of 6 in (13 rows).
- Starts cycle 48, 16, 32 in. 48-start rows (5): 48 + 24 end. 16-start rows (4): 16 + 48 + 8 end. 32-start rows (4): 32 + 40 end.
- Pieces: 5 x 2 + 4 x 3 + 4 x 2 = 30. Without reuse: 30 planks.
- With reuse, starts are served longest first: each 32 in start can only take an end of 16 in or less, so takes an 8 in end (4 pairs); each 16 in start then takes a 24 in end (4 pairs). Planks: 30 - 8 = 22.
- Offcut: 22 x 360 - 6,912 = 1,008 in2 = 650,321.28 mm2 (14.583 %). Allowances on 6,912 / 360 = 19.2 planks: 5 % -> 21 and 8 % -> 21 (short), 10 % -> 22 (exact), 15 % -> 23.
- Hand result: 30 pieces, 22 planks, offcut 650321.28 mm2. Engine: 30 pieces, 22 planks, offcut 650321.28 mm2.

## Limits

- Empty rectangular room; no closets, doorways, columns, hearths or transitions.
- No plank defects, damaged boards or grading rejects; every plank is assumed usable end to end.
- Zero clearance. Kerf 0 is idealised (see the headline section for the 3 mm sensitivity).
- Offcut reuse is limited to one start piece and one end piece from opposite factory ends of the same plank. No same-end pairing, no face flipping, no reuse of rip offcuts from the last row.
- No minimum length is imposed on cut pieces. In the 16428 staggered layouts (offsets 1/2 and 1/3), 592 contain at least one piece of 2 in or less, 5292 such pieces in total; the shortest piece is 2.0 in.
- The last row is the remainder width (balanced = false) and no minimum row width is imposed: 3848 of the 16428 staggered layouts have an edge row of 2 in or less; the narrowest is 1.0 in. Its rip offcut counts as waste.
- Offset 1/2 plans carry H-alignment flags (column h_alignment); a product may forbid that pattern.
- One plank per carton and no reserve: carton rounding, which usually adds planks, is excluded.
- Room sides are multiples of 6 in; results between grid points are not computed.
