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_minterpretation (per billet for p=1, per sequential pull for p=2), adds explicitmigrate_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 + 1transverse 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_mmremains 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_overridefor 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
AA6060andAA6063aliases 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.engineeringfoundation 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 explicitPlanningRequestacross two or more presses. - Adds
compare_production_sequences()for the exact same ordered production list across two or more presses. - Adds
ProcessComparisonResult,PlanningComparisonResultandProductionSequenceComparisonResult. - 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-planningandcompare-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,ProductionSequenceResultandcalculate_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; withoutstart_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)returningProcessResultwithout any order quantity. calculate_planning()no longer creates a fictitious one-bar study to resolve billet, cuts, configuration or table occupancy.- Adds
PlanningResult.processas the canonical quantity-free process reference. - Keeps
StudyCaseplanning 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
CalculationResultonly 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_sas 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.2through1.0readable, 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_minandprocess.speed_input_sourceto 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_profilemodel with dynamick_billets_1_profile. - Implements billet-first optimisation: the longest valid billet is selected before
billets_per_pullis 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_profilesand explicitly limits the supported model to a maximum of two sequential profiles per billet. - Adds controlled
supported=Falsediagnostics 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_ratioto use cuts represented by the complete table-occupying pull. - Adds
ProcessSpec/ProcessandPlanningCaseso process conditions can be defined independently from order quantity. - Keeps
StudyCaseaccepted 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; schemas0.2through0.9remain 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()andformat_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_pctimplicitly; an explicit operational target remains exact. - Adds CLI
pyextrusion planfor 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_profilesvalidation so an individual sequential pull cannot exceedtable_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.9is 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
_provenancemetadata to serialized press objects while keepingPress.to_dict()configuration-only for API compatibility. - Preserves provenance in standalone press JSON and embedded study JSON.
- Bumps JSON output schema to
0.9; schemas0.2through0.8remain 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_inpress definition and documented inference of billet diameter, container diameter, billet-length limits and reference productivity. - Makes
table_length_mmandatory and keepspress_force_toptional. - 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_overrideremains 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;
0kerf explicitly means no material loss for that saw operation. - Keeps 15 s as default dead time.
- Keeps complexity levels
normal/medium/highat 3/5/7%, withnormaldefault. - 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; schemas0.2through0.7remain readable. - New serialised press names use
press_force_t,billet_min_length_mm,billet_max_length_mm,density_kg_m3, andbillet_kg_per_mm_overridewhile 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_pctdemand flag, disabled by default. - Applied the 10% supplement before annual-demand normalization.
- Removed the old automatic warning based on
extra_pct < 10%. - Redefined
extra_pctas 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_billetto the public result contract. - Made
profile_typemandatory for new profiles/cases. - Added public aliases:
solid,plate,hollow,tubular; aliases normalize tosolid/hollowinternally. - Missing or invalid profile types raise
PX1002with 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()anddescribe_field(). - Added CLI
pyextrusion fieldsandpyextrusion field <path>. - Added immutable StudyCase derivation helpers:
with_profile(),with_production()and flatreplace(). - Added stable documented errors
PX1001throughPX1010and publicPyExtrusionErrorsubclasses. - Added
ERROR_CATALOG,get_error_info()andlist_error_info(). - Added CLI
pyextrusion errorsandpyextrusion 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,--fieldsand--sectionresult 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.mdandCITATION.cff. - Established Enrique Calvo Ordonez as project creator and lead author.
- Established https://pyextrusion.com as the official project website.
- Added
pyextrusion infofor version, description, author, license and website.
0.5.0¶
- Added annual demand normalization for kg/year, metres/year and bars/year.
- Added
AnnualDemandSpec,NormalizedAnnualDemandandAnnualCalculationResult. - Added
calculate_annual_demand()andnormalize_annual_demand(). - Added annual demand JSON load/save helpers.
- Added
pyextrusion annualCLI command. - Added MkDocs + Material documentation source.
0.4.0¶
- Added
ProductionSpec/Productionand reusableStudyCase. - Added
calculate_case()to run one case on any press. - Added
compare_presses()andComparisonResult. - 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
PressandProfilefriendly 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.