Skip to content

Changelog

Documentation maintenance for 0.19.0

Documentation-only changes; no new package release or calculation change:

  • Use canonical trim in new Python/JSON onboarding examples; keep legacy migration explicit.
  • Distinguish per-contribution trim, full-pull traces and actual-order event counters.
  • Clarify positive/zero trim, partial pulls, zero kerf and the absence of added saw-operation time.
  • Correct integration wording about physical grouping and retain the container-section butt contract.
  • Align current version references and mechanical/thermal interpretation limits.

0.19.0 — 2026-10-03

  • Adds canonical trim_total_per_billet_m: the total industrial reject reserve per incoming billet, divided across sequential pulls. It is not a predicted charge-weld length.
  • Preserves legacy front_scrap_m interpretation (per billet for p=1, per sequential pull for p=2), adds explicit migrate_legacy_trim, and rejects ambiguous canonical/legacy combinations. Omitted legacy values now serialize as null; no-input trim remains zero.
  • Corrects positive-trim multibillet geometry and final-saw accounting: each actual billet contribution requires cuts + 1 transverse final-saw events, including a partial last pull. Puller kerf is shared once per pull. Zero trim retains the existing single end-preparation allowance per pull.
  • Separates commercial positions from public final-saw, internal-transition, puller-saw and billet-saw counters. JSON schema 1.1 remains additive; the canonical field itself identifies semantics.
  • Extra downstream kerf propagates through billet length, physical loss, extrusion time and productivity. Press dead-time events, butt physics and engineering equations are unchanged; mechanical propagation uses only the changed billet length.
  • Adds synthetic public topology, migration, partial-pull and boundary regressions, and an independent physical ledger. Plant-derived acceptance data remain outside the public repository and distributions. Public docs explain topology, legacy migration and model limits.

0.18.0

  • Corrects physical butt semantics: butt_mm remains residual thickness inside the container; butt mass uses density and container area, then converts once to equivalent incoming-billet length.
  • Preserves measured billet_kg_per_mm_override for original-billet mass/length and billet-saw loss. It does not replace the container-section butt mass coefficient.
  • Applies equivalent butt length consistently to both supported production families and minimum/maximum checks, including detection of unsupported sequential-pull counts.
  • Adds per-billet butt mass, equivalent length and coefficient-source traces to calculation/process results. Existing physical input values, defaults and JSON input schemas remain unchanged; result schemas gain additive fields.
  • Keeps volume-based upsetting, pressure/rheology formulas, downstream kerfs and time rules unchanged. Derived contact length, friction, force and losses receive the corrected billet length/mass. Physical net productivity is invariant only when the selected configuration and events remain unchanged.
  • Adds independent physical-equation tests, partial-pull and sequential-pull coverage, strict geometric boundaries, override/rounding cases and propagation checks. Reframes the old two-cut boundary separately from billet-first selection policy.
  • Documents that observable lengths, losses, scores and discrete feasibility can differ from v0.17.0. This pre-1.0 physical correction is not a silent replacement of historical results.
  • Preserves equivalent-axisymmetric mechanical screening scope and limited thermal baselines. No new porthole correction, exit-temperature predictor or annual-economic workflow is introduced.
  • Adds public AA6060 and AA6063 aliases of the existing source-specific model objects; preserves both scientific names, datasets and provenance without a registry or additional alloys.
  • Integrates the new home page, Engineering section and Engineering/Economics API references for 0.18.0; updates physical-butt documentation and normal alloy examples.
  • Restricts automatic Pages deployment to main, with main-only guards for both build and deploy jobs.

0.17.0

  • Adds the public pyextrusion.engineering foundation with strict provenance, metadata, force-limit, hydraulic, power, energy and specific-energy helpers.
  • Adds basic deterministic production economics with recurring production cost, material/scrap economics, sales-margin calculations, one-time tooling/development cost, die-trial surcharges and optional customer tooling revenue.
  • Corrects the physical boundary for downstream saw kerfs: puller and final-saw kerfs now reserve extruded material in billet sizing, runout-table occupancy and technical extrusion time, while billet-saw kerf remains an upstream stock loss.
  • Reframes startup and complexity scrap as planning allowances rather than physical extruded-length/time contributions.
  • Adds source-traced AA6063 hot-working constants from Sheppard and AA6060 hot-working constants attributed to Verlinden et al.; the two alloy models remain explicitly separate.
  • Adds modified Feltham mean strain rate, Zener-Hollomon and Sheppard-Wright steady-state flow-stress calculations with strict validation.
  • Adds Sheppard axisymmetric pressure correlations: deformation pressure, billet-container friction, breakthrough increment, peak pressure and equivalent-axisymmetric required-force baseline.
  • Keeps the pressure/force model explicitly scoped to equivalent-axisymmetric direct extrusion; shaped-section, bridge-die and porthole-die corrections are not inferred or approximated with hidden multipliers.
  • Adds an AA6063 single-operation thermomechanical composition that keeps mechanical and thermal model boundaries visible.
  • Adds the Sheppard/Stüwe three-component surface-temperature estimate as a limited analytical baseline, not as a production-grade exit-temperature predictor.
  • Adds source-traced Saha local thermal source terms for deformation, billet-container friction, dead-metal-zone friction and die-bearing friction.
  • Keeps Saha's documented 45 degree semi-dead-metal-zone assumption isolated from the Sheppard/Feltham geometry model.
  • Adds complete-sticking die-bearing shear/heat-flux helpers without claiming a transient temperature field or exit-temperature solution.
  • Adds Sheppard Eq. 2.25 billet/tooling interface-temperature calculation with source-stated aluminium and Cr-V tooling-steel thermal properties and thermal-effusivity reporting.
  • Explicitly avoids interpreting Eq. 2.25 as a source-exact friction-heat partition model.
  • Keeps Saha's omitted boundary conditions, Integral Profile reconstruction, transient tooling heat storage and production-grade exit-temperature prediction outside the implemented scope.
  • Adds regression coverage across Python 3.10-3.13 for the new engineering and thermomechanical calculations.

0.16.0

  • Aligns the multi-press comparison layer with the current PyExtrusion calculation engine.
  • Adds compare_processes() for quantity-free process comparison across two or more presses.
  • Adds compare_planning() for one explicit PlanningRequest across two or more presses.
  • Adds compare_production_sequences() for the exact same ordered production list across two or more presses.
  • Adds ProcessComparisonResult, PlanningComparisonResult and ProductionSequenceComparisonResult.
  • Preserves press order and sequence order exactly.
  • Performs no automatic ranking, winner selection, order allocation, load balancing or sequence optimisation.
  • Adds strict JSON output and human-readable formatters for all three new comparison layers.
  • Adds CLI compare-process, compare-planning and compare-sequence.
  • Adds PX1013 InvalidComparison.
  • Keeps JSON input schema 1.1; existing press, planning-case and sequence input formats are reused.
  • Does not change the v0.15.0 physical, billet-first, scrap, productivity, planning or sequence mathematics.

0.15.0

  • Adds the public production-sequence layer on top of the existing planning API.
  • Adds ProductionOrder, ProductionSequenceEntry, ProductionSequenceResult and calculate_production_sequence().
  • Preserves the exact user-supplied order; no automatic sequence optimisation or sorting is performed.
  • Chains only existing planning time (extrusion + technical dead time) and inserts no setup, die-change, waiting, die-preparation, correction, maintenance or calendar assumptions.
  • Supports sequence-order quantities in bars, kg, metres and exact billets.
  • Rejects minutes/hours as sequence-order quantities; they remain planning capacity-window requests.
  • Adds optional theoretical timestamps from a user-supplied datetime; without start_at, only relative cumulative minutes are returned.
  • Keeps unresolved orders in place with diagnostics and zero calculable duration so the caller can decide what to do.
  • Adds aggregate sequence totals for billets, pulls, bars, metres, good kg, scrap and technical press time.
  • Adds strict JSON serialization for calculated sequence results and a human-readable sequence formatter.
  • Adds PX1012 InvalidProductionSequence.
  • Does not change v0.14.0 physical, billet-first, scrap, productivity or single-order planning mathematics.

0.14.0

  • Consolidates the quantity-free planning API.
  • Adds public calculate_process(press, PlanningCase) returning ProcessResult without any order quantity.
  • calculate_planning() no longer creates a fictitious one-bar study to resolve billet, cuts, configuration or table occupancy.
  • Adds PlanningResult.process as the canonical quantity-free process reference.
  • Keeps StudyCase planning support only as a compatibility bridge and emits a deprecation warning.
  • Adds direct planning outputs for optimized billet length, table occupancy and fixed/total scrap.
  • Time-window planning creates a full order CalculationResult only when at least one complete billet is actually planned.
  • Keeps JSON schema 1.1; no persistence-schema change is required.
  • Does not change the existing physical/productivity mathematics for equivalent valid inputs.

0.13.1

  • Hardens input validation and public interfaces.
  • Restricts nominal press size to strict whole-inch values from 6 to 16.
  • Enforces configurable billet lengths of 100-3000 mm and runout tables of 10-100 m.
  • Enforces finished cut lengths of 1000-15000 mm and rejects cuts longer than the table.
  • Enforces exit/profile speed of 1-100 m/min and adds ram_speed_mm_s as an alternative process input.
  • Rejects simultaneous exit-speed and ram-speed inputs as ambiguous; ram-input calculations derive and validate exit speed through volume constancy.
  • Enforces technical dead time of 5-30 s and saw kerfs of 0 or 3-10 mm.
  • Makes exits, manual cuts, requested bars, requested billets and nominal press size strict integers; rejects booleans, fractional counts and numeric strings.
  • Rejects NaN, Infinity and non-finite intermediate values and writes strict JSON with schema 1.1.
  • Keeps schemas 0.2 through 1.0 readable, including migration of historical whole-valued float nominal press sizes.
  • Hardens file/JSON errors into documented PX errors instead of predictable raw tracebacks.
  • Replaces automatic cut enumeration with direct bounded billet-first integer limits to prevent resource-exhaustion inputs.
  • Adds geometry.exit_speed_m_min and process.speed_input_source to the public result glossary (98 fields).
  • Does not change the v0.13.0 calculation mathematics for inputs that remain valid under the new validation rules.

0.13.0

  • Introduces dynamic multi-billet behaviour and the quantity-free planning architecture.
  • Replaces the historical fixed 2_billets_1_profile / 3_billets_1_profile model with dynamic k_billets_1_profile.
  • Implements billet-first optimisation: the longest valid billet is selected before billets_per_pull is derived from table length.
  • Prevents the optimiser from shortening a billet merely to fit more billets on the runout table.
  • Allows 4, 5 or more billets per continuous pull when geometry permits.
  • Keeps 1_billet_2_profiles and explicitly limits the supported model to a maximum of two sequential profiles per billet.
  • Adds controlled supported=False diagnostics when a scenario would require 3+ profiles/billet.
  • Counts multi-billet puller and final-saw losses per pull, including partial final pulls.
  • Corrects multi-billet cuts_ratio to use cuts represented by the complete table-occupying pull.
  • Adds ProcessSpec / Process and PlanningCase so process conditions can be defined independently from order quantity.
  • Keeps StudyCase accepted by planning for backwards compatibility.
  • Adds PlanningCase JSON load/save/validation and CLI planning support for quantity-free process files.
  • Bumps current JSON write schema to 1.0; schemas 0.2 through 0.9 remain readable.
  • Expands the documented result glossary to 96 structured fields, including support status and pull-grouping fields.
  • Adds regression coverage for dynamic k, billet-first behaviour, partial pulls, pull-level saw accounting, unsupported 3+ profiles/billet and PlanningCase workflows.

0.12.0

  • Adds the first operational production-planning layer for daily and short/medium batch calculations.
  • Adds PlanningRequest, PlanningResult, calculate_planning() and format_planning_result().
  • Supports explicit planning targets in bars, kg, metres and exact billet count.
  • Supports available press-time windows in minutes or hours and returns the maximum number of complete billets that fit.
  • Reports planned billets, bars, good metres, good kg, used time, remaining time and extra time required for the next billet.
  • Planning uses complete billets only; fractional billets are never created.
  • Planning does not apply the annual supplement_10_pct implicitly; an explicit operational target remains exact.
  • Adds CLI pyextrusion plan for bars, kg, metres, billets, minutes and hours.
  • Adds documented PX1011 InvalidPlanningRequest.
  • Adds planning documentation and a runnable public planning example.
  • Keeps the existing core formulas, JSON schema 0.9, provenance rules and all 0.11.2 calculation behavior unchanged.

0.11.2

  • Fixes 1_billet_2_profiles validation so an individual sequential pull cannot exceed table_length_m; sequential pulls do not occupy the table simultaneously, but each complete pull must fit.
  • Adds a regression test covering manual cuts that exceed the runout-table length.
  • Corrects the integration guides to state that JSON schema 0.9 is the current write format.
  • Clarifies README and documentation availability for wheel-only users.
  • No other calculation formulas, defaults, JSON schema, provenance rules, or productivity-index behaviour changed from v0.11.1.

0.11.1

  • Fixes press JSON provenance round-tripping: inferred press values remain identified as inferred after save/load instead of being relabelled as user_value.
  • Adds _provenance metadata to serialized press objects while keeping Press.to_dict() configuration-only for API compatibility.
  • Preserves provenance in standalone press JSON and embedded study JSON.
  • Bumps JSON output schema to 0.9; schemas 0.2 through 0.8 remain readable.
  • No calculation formulas, industrial defaults, productivity-index behaviour or complexity behaviour changed from v0.11.0.

0.11.0

  • Refactors the calculation engine into the generic direct-extrusion model used by current PyExtrusion.
  • Reframes the engine as a generic model for direct aluminium extrusion presses.
  • Adds nominal_size_in press definition and documented inference of billet diameter, container diameter, billet-length limits and reference productivity.
  • Makes table_length_m mandatory and keeps press_force_t optional.
  • Changes extrusion ratio and ram-speed calculations to use container-bore area.
  • Keeps actual billet area for billet mass, kg/mm and billet-length calculations.
  • Retires the historical billet-area override from active v2.0 calculations; actual billet diameter now always defines billet area, while billet_kg_per_mm_override remains available for measured mass coefficients.
  • Changes default butt discard to 15 mm for solid/plate and 20 mm for hollow/tubular.
  • Changes default saw kerfs to 5/5/5 mm; 0 kerf explicitly means no material loss for that saw operation.
  • Keeps 15 s as default dead time.
  • Keeps complexity levels normal/medium/high at 3/5/7%, with normal default.
  • Keeps the documented startup-scrap rule.
  • Adds a reference-productivity heuristic based on nominal press size, with user value taking priority.
  • Adds percentage-based productivity deficit and penalty.
  • Adds an orientative 0-100 productivity index and rating.
  • Adds mathematical and upward-rounded recommended billet lengths.
  • Adds container/billet area separation to structured results.
  • Suppresses downstream geometry/productivity warnings when a case is completely non-viable with cuts=0.
  • Removes the old recommended minimum linear-weight concept from the public configuration.
  • New JSON output schema is 0.8; schemas 0.2 through 0.7 remain readable.
  • New serialised press names use press_force_t, billet_min_length_mm, billet_max_length_mm, density_kg_m3, and billet_kg_per_mm_override while historical aliases remain accepted.
  • Public structured field glossary expands to 82 fields.
  • Direct calculation validation now raises the documented PX1001/PX1002/PX1003 error classes for press/profile/production input failures.

0.10.0

  • Added RE status thresholds: solid/plate low <25, OK 25-85, high >85; hollow/tubular low <15, OK 15-75, high >75.
  • Added the explicit optional supplement_10_pct demand flag, disabled by default.
  • Applied the 10% supplement before annual-demand normalization.
  • Removed the old automatic warning based on extra_pct < 10%.
  • Redefined extra_pct as complete-billet rounding excess relative to the effective bar target.
  • Added base/effective demand trace fields and CLI supplement overrides.
  • Bumped JSON schema output to 0.7 while retaining backward compatibility with 0.2-0.6.

0.9.0

  • Corrected bars per billet using cuts × exits × profiles_per_billet.
  • Corrected billet count and manufactured quantity for the double-profile configuration.
  • Corrected front-scrap, puller-saw and final-saw losses to account for two complete pulls per billet.
  • Kept butt-discard and billet-saw losses once per billet.
  • Kept the extra dead-time event per billet for 1_billet_2_profiles.
  • Added production.profiles_per_billet to the public result contract.
  • Made profile_type mandatory for new profiles/cases.
  • Added public aliases: solid, plate, hollow, tubular; aliases normalize to solid/hollow internally.
  • Missing or invalid profile types raise PX1002 with the valid values listed.
  • Bumped current JSON schema version to 0.6.

0.8.0

  • Added the official result-field glossary with exact path, unit, data type and description.
  • Added FieldInfo, FIELD_GLOSSARY, list_fields() and describe_field().
  • Added CLI pyextrusion fields and pyextrusion field <path>.
  • Added immutable StudyCase derivation helpers: with_profile(), with_production() and flat replace().
  • Added stable documented errors PX1001 through PX1010 and public PyExtrusionError subclasses.
  • Added ERROR_CATALOG, get_error_info() and list_error_info().
  • Added CLI pyextrusion errors and pyextrusion error <code>.
  • Validation messages now include relevant PX codes for errors.
  • CLI scalar output keeps Python numeric precision by design.

0.7.0

  • Added structured result blocks for geometry, billet, production, scrap, productivity, timing and process trace.
  • Exposed the complete scrap breakdown.
  • Added CalculationResult.value(), select(), section(), field_paths() and dotted-path __getitem__.
  • Added CLI --field, --fields and --section result selectors.
  • Added butt-discard and front-scrap provenance.
  • Added documented warnings for low cuts ratio, fixed scrap above 12%, and <=3 bars/billet.
  • Preserved legacy flat result attributes for backwards compatibility.

0.6.0

  • Adopted the Apache License 2.0 as the official project license.
  • Added LICENSE, NOTICE, AUTHORS.md and CITATION.cff.
  • Established Enrique Calvo Ordonez as project creator and lead author.
  • Established https://pyextrusion.com as the official project website.
  • Added pyextrusion info for version, description, author, license and website.

0.5.0

  • Added annual demand normalization for kg/year, metres/year and bars/year.
  • Added AnnualDemandSpec, NormalizedAnnualDemand and AnnualCalculationResult.
  • Added calculate_annual_demand() and normalize_annual_demand().
  • Added annual demand JSON load/save helpers.
  • Added pyextrusion annual CLI command.
  • Added MkDocs + Material documentation source.

0.4.0

  • Added ProductionSpec / Production and reusable StudyCase.
  • Added calculate_case() to run one case on any press.
  • Added compare_presses() and ComparisonResult.
  • Added standalone press and case JSON persistence.
  • Added human-readable press, result and comparison reports.
  • CLI gained external press files and multi-press comparison.

0.3.0

  • Added all four documented billet/profile configurations.
  • Added multi-billet front-scrap recalculation.
  • Added special dead-time rule for 1_billet_2_profiles.
  • Separated total extruded/configuration length from runout-table occupancy.

0.2.0

  • Added Press and Profile friendly aliases.
  • Added calculate_simple().
  • Added JSON schema support and validation.
  • Added structured validation messages.
  • Profile section inference uses press-configured aluminium density.

0.1.0

  • Initial calculation-core development preview.