Changelog¶
All notable changes to industrialstats are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
Nothing yet.
[0.3.0] - 2026-09-16¶
Added¶
- Genuine definitive screening designs backed by conference-matrix construction, algebraic property tests, and a published Jones-Nachtsheim reference case.
- Regular two-level factorial blocking with explicit block generators, visible confounding semantics, treatment-based block assignment, and canonical published blocked-design validation.
- Canonical two-level factorial effect estimation shared across design and analysis APIs, including higher-order interaction support.
- General factorial model-term generation with hierarchical saturated or truncated interaction structure and correct mixed-level degrees of freedom.
- Split-plot experimental-unit semantics, restricted randomization, classical whole-plot/subplot error strata, mixed-model inference, and expected-mean- square validation.
- Expanded Plackett-Burman catalogue support with NIST reference validation and foldover guarantees that separate main effects from two-factor interactions.
- Property-based validation for definitive-screening and simplex-lattice mixture designs.
- Published Cornell/NIST three-component simplex-lattice mixture reference case.
- Monte Carlo validation for factorial-effect recovery, ANOVA Type I error, response-surface coefficient recovery, split-plot variance components, and balanced ANOVA under mild heteroskedasticity.
- Independent
statsmodelsreference checks for two-sample t-test and one-way ANOVA power calculations. - Structured DataExcept coverage for additional configuration, CLI, transform, CRD, and split-plot response-data boundaries.
- Milestone 2 and Milestone 3 validation audits documenting the package's current evidence base and remaining independent-reference gaps.
Changed¶
- Factorial blocking now derives block membership from defining treatment contrasts rather than row position.
- Split-plot analysis now treats replicated whole plots as distinct experimental units and preserves the intended two-stratum error structure.
- The package's validation policy now emphasizes hand-derived identities, published references, property tests, and repeated-sampling studies rather than shape/run-count checks alone.
- Data-loading and transformation boundaries expose more structured exception metadata while preserving native mathematical errors where appropriate.
Fixed¶
- Corrected definitive-screening semantics that previously did not implement a genuine DSD construction.
- Removed factorial-effect sign/scale inconsistencies between design and analysis paths.
- Prevented split-plot and blocking logic from depending on row order where treatment or experimental-unit structure should determine the result.
- Hardened configuration parsing and optional-dependency failures with explicit structured exception types and preserved causes.
[0.2.0] - 2026-09-04¶
Added¶
- PEP 561
py.typedmarker, so the shipped type annotations are visible to type checkers in downstream projects. - Documentation site built with MkDocs Material and mkdocstrings, published to GitHub Pages.
SECURITY.md, issue forms (including a statistical-correctness report), a pull request template, andCODEOWNERS.- Test coverage measurement with an enforced floor, plus CodeQL and
pip-auditscanning in CI. - CI now runs on pushes to
mainand covers Windows and macOS in addition to Linux.
Changed¶
- Replaced black, isort, and flake8 with Ruff for both linting and formatting.
The previous flake8 configuration silenced real defect classes (unused
imports and variables, bare
except, star imports); these are now enforced. - Enabled real type checking.
mypypreviously ran withignore_errors = true, which disabled it entirely. Six numerically dense modules carry documented, shrinking debt via per-module overrides; everything else is clean. zip()calls over design matrices now passstrict=True, so a length mismatch raises instead of silently truncating.- The CLI reports a stable program name in help output rather than inheriting
it from
sys.argv[0]. - Example scripts use
numpy.random.Generatorinstead of the legacy globalnumpy.random.seedAPI.
Removed¶
- BREAKING:
industrialstats.visualizationsno longer re-exports its third-party imports. A star-import plus a computed__all__madenp,pd,plt,sns,goandstatspart of the package's public API; the module now exports onlyExperimentPlotterandResponseSurfacePlotter. Import those libraries directly instead of viaindustrialstats.visualizations.
Security¶
- Raised the
pytestdevelopment dependency past GHSA-6w46-j5rx-g56g (predictable/tmp/pytest-of-{user}handling on UNIX, allowing a local user to cause denial of service or possibly escalate privileges). The constraint was^8.0.0, which pins to a range that is affected in its entirety, and did not match the 9.x that CI already installed. It is now>=9.0.3,<10, matched byminversionand by an explicit floor in the workflow install steps.pytestis a development dependency and is never installed by users of the package.
Fixed¶
- Eight modules had
from __future__ import annotationsplaced above their module docstring, which left__doc__asNoneand would have produced empty API documentation. DesignValidator.check_confoundingno longer emits a divide-by-zeroRuntimeWarningon perfectly confounded designs, which is the case it exists to report; it returns an infinite VIF as expected.- Guarded
design_matrixaccess in the CRD, RCBD, and screening designs, which previously raisedAttributeErrorwhen called beforegenerate_design(). CompletelyRandomizedDesignvalidates response columns withpandas.api.types.is_numeric_dtype, which handles nullable extension dtypes thatnumpy.issubdtyperejects.- Mutable default arguments in
PowerAnalysis(factor_levels,powers) are no longer shared across calls. - Exceptions raised while wrapping model-fitting failures now chain the
original error with
raise ... from. ModelDiagnostics.assumption_testsno longer depends on SciPy's deprecated implicit Anderson-Darling behaviour. SciPy 1.17 requires an explicit p-value method and removes the critical-value tables in 1.19; the test now requests an interpolated p-value where that is supported and falls back to the tables on older SciPy. The reportedandersonmapping gains ap_valuekey alongsidecritical_value_5pct; whichever the installed SciPy cannot supply isNone.ModelFitting.regularized_fittingno longer passesalphas=Noneexplicitly to scikit-learn, which is deprecated and removed in 1.9. The argument is now omitted when unset, preserving the automatic grid on every supported version.DesignValidator.check_confoundingalso suppresses the singular-matrix conditioning warning newer statsmodels emits for perfectly confounded designs, which is the case the function exists to report.- The performance regression benchmark compared two adjacent timings of the same call, so a single descheduled run failed it. It now warms up and takes the minimum of several repetitions on each side.
0.1.0 (2026-09-04)¶
Features¶
- add DataExcept dependency (852723c)
- add DataExcept file boundaries (55f9156)
- add structured CSV loading boundary (df894b0)
- export structured CSV loader (3762fd6)
- route CLI file I/O through DataExcept boundaries (3576008)
- wrap export boundary failures with DataExcept (ba1948d)
Bug Fixes¶
Documentation¶
- add changelog for automated releases (7ce4c6d)
- add PyPI and Zenodo release checklist (471fdb3)
- document automated release flow (82d6890)
- install development tools in setup instructions (f148493)
- let release please own changelog entries (e36a4af)
- prepare README for package release (dc3ddcc)
- reflect active DataExcept runtime integration (81c9abe)
- refresh README and correctness-first roadmap (efbadb8)
- refresh README with current DOE capabilities (7d5d1cd)
- replace stale roadmap with correctness-first plan (7bb2a91)
- simplify release flow (feb4999)