Skip to content

Commit 7019b82

Browse files
committed
chore(release): release v0.4.4
- Bump crate, utility package, citation, and documentation metadata - Publish the v0.4.4 changelog and release performance comparison - Refresh reproducible LU-solve benchmarks and archived performance reports - Include exact-conversion and LDLT performance improvements - Harden version-sync checks and generated Markdown formatting
1 parent e736c5f commit 7019b82

29 files changed

Lines changed: 1084 additions & 362 deletions

AGENTS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ invariant over the convenient edit.
124124
from the same representative benchmark command, inputs, features, and
125125
environment. Use `bench-vs-linalg` (vs nalgebra / faer) or `bench-exact`
126126
(exact arithmetic), as appropriate.
127+
- For nanosecond-scale fixed-size kernels, prefer Criterion `bencher.iter` so
128+
the complete public operation is measured symmetrically across implementations.
129+
Use `iter_batched` only when setup is explicitly outside the estimand, the
130+
exclusion is applied comparably to every implementation, and a same-binary
131+
comparison shows that batching does not materially distort the result.
127132
- Preserve benchmark provenance and distinguish descriptive point-estimate
128133
ratios from statistically supported performance claims. Marginal Criterion
129134
interval separation is not a paired confidence interval for the change.

CHANGELOG.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,108 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.4.4] - 2026-07-12
9+
10+
### ⚠️ Breaking Changes
11+
12+
- Make numerical invariants and errors explicit
13+
- Require Rust 1.97.0
14+
15+
### Added
16+
17+
- [**breaking**] Make numerical invariants and errors explicit
18+
[`668daed`](https://github.com/acgetchell/la-stack/commit/668daed6f5d83a03fc95a7872a0a302d097e3fc4)
19+
20+
- add structured error reasons, locations, origins, and factorization context
21+
- make determinant, exact-conversion, LU, and LDLT paths range-safe and mathematically explicit
22+
- validate benchmark inputs independently and require reproducible, provenance-backed performance evidence
23+
- centralize tool versions, adopt nextest profiles, and replace Codacy with repository-owned checks and SARIF reporting
24+
25+
### Changed
26+
27+
- Consolidate setup abort handling [`b9e453e`](https://github.com/acgetchell/la-stack/commit/b9e453e540da3c63b0a14ca94b4bcfbc9c8ff6bd)
28+
29+
- Share `OrAbort` across exact and comparison benchmarks while preserving contextual panic behavior.
30+
- Centralize Clippy policy in Cargo.toml for consistent local and CI checks.
31+
- Keep `unreachable_pub` enforced while allowing intentional crate-visible helpers.
32+
- Enable CodeRabbit's request-changes review workflow.
33+
34+
### Dependencies
35+
36+
- Bump python-multipart in the uv group across 1 directory [`6bb4fb7`](https://github.com/acgetchell/la-stack/commit/6bb4fb7ce48e49d4d2a5bfe4ff5d55b09e6300e2)
37+
- Bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 [`4a999a6`](https://github.com/acgetchell/la-stack/commit/4a999a664211126e581da47713f6d2426d6db698)
38+
- Bump github/codeql-action/upload-sarif [`85c0a7b`](https://github.com/acgetchell/la-stack/commit/85c0a7bd6a1b3d3e0e00f4e82c6d544c2ca0f22b)
39+
- Bump actions/checkout from 6.0.2 to 7.0.0 [`0f0f956`](https://github.com/acgetchell/la-stack/commit/0f0f956c64ddbc5700f3c2f96b90242703e0a410)
40+
- Bump astral-sh/setup-uv from 8.1.0 to 8.2.0 [`259acaa`](https://github.com/acgetchell/la-stack/commit/259acaa06cc2d6b50f5c024c60cbdf9fe3172f7f)
41+
- Bump codecov/codecov-action from 6.0.1 to 7.0.0 [`035807c`](https://github.com/acgetchell/la-stack/commit/035807c9312ce1ff818dcab9dd986980dfcb37d8)
42+
- Bump vulnerable Python tooling dependencies [`4990260`](https://github.com/acgetchell/la-stack/commit/49902604db70de7c6831f559aee967bf3c376bc1)
43+
44+
### Documentation
45+
46+
- Add mathematical basis and clarify numerical guarantees [`31b7b1e`](https://github.com/acgetchell/la-stack/commit/31b7b1e7c547fc69edbb601e68b2f29e83d5cd24)
47+
48+
- define the binary64, factorization, determinant-filter, exact-arithmetic, tolerance, and error contracts
49+
- align README, API documentation, examples, and LDLT diagnostics with guarantees over stored values
50+
- audit academic references and extend Criterion coverage for determinant error-bound paths
51+
- Clarify determinant and LDLT failure contracts [`e257343`](https://github.com/acgetchell/la-stack/commit/e2573434c541a8115750b3a965882f7b484b6be0)
52+
- State the determinant sign condition without ambiguous Markdown delimiters.
53+
- Distinguish singular zero pivots from coupled zero-pivot LDLT rejections.
54+
- Align citation and contributor guidance with the positive-definite domain.
55+
56+
### Fixed
57+
58+
- Make v0.4.3 comparisons correctness-aware [`4ac5af9`](https://github.com/acgetchell/la-stack/commit/4ac5af9ce104c5126bfd6217414977cca269b62e)
59+
60+
- Adapt the shared benchmark harness across v0.4.3 API differences without changing measured operations
61+
- Exclude invalid balanced-range baselines while requiring current samples and reporting unavailable comparisons
62+
- Preserve benchmark provenance, suite-specific fallback commands, and publication rollback guarantees
63+
- Harden Windows Git input, changelog links, and version-reference parsing across platforms
64+
- Harden exact arithmetic and benchmark publication [`db2fad5`](https://github.com/acgetchell/la-stack/commit/db2fad50087c773f7ae37f181f720da2a9ff4a23)
65+
- add `DeterminantWithErrorBound` for paired determinant estimates and certified bounds
66+
- scale exact systems independently and round exact values directly to IEEE-754
67+
- fail benchmark publication closed on invalid samples or mismatched provenance
68+
- make release and changelog tooling transactional, path-safe, and Windows-portable
69+
- align benchmark CI with pinned local tools and least-privilege publishing
70+
71+
### Maintenance
72+
73+
- Update setuptools requirement in the dependencies group [`6a6c339`](https://github.com/acgetchell/la-stack/commit/6a6c339e7fbec1c9ca4226005794e8ab87f0c2d6)
74+
75+
Updates the requirements on [setuptools](https://github.com/pypa/setuptools) to permit the latest version.
76+
77+
Updates `setuptools` to 83.0.0
78+
79+
- [Release notes](https://github.com/pypa/setuptools/releases)
80+
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
81+
- [Commits](https://github.com/pypa/setuptools/compare/v65.0.0...v83.0.0)
82+
- Avoid duplicate review checks [`5e15d92`](https://github.com/acgetchell/la-stack/commit/5e15d9250455fd1467e47a735412f65449f30b56)
83+
- Use the legacy required status while preserving automatic approvals.
84+
- Add explicit dense D3 determinant coverage and document the D4 error bound.
85+
- [**breaking**] Require Rust 1.97.0 [`4033f1f`](https://github.com/acgetchell/la-stack/commit/4033f1f39e411ed066fec808805371979995964b)
86+
- Align Cargo, the pinned toolchain, Clippy, dependency-audit triggers, and maintainer guidance with the new baseline.
87+
- Audit Rust 1.97 integer bit helpers against exact-arithmetic hot paths and retain existing operations where alternatives do not preserve performance.
88+
- Correct v0.4.3 citation metadata and document exact decomposition and solve scaling accurately.
89+
90+
### Performance
91+
92+
- Restore det_direct throughput for D=2..4 [`f6d6885`](https://github.com/acgetchell/la-stack/commit/f6d68855a314fc4802c559080d9faca85db81bb9)
93+
94+
- Reintroduce branch-free dense expansions for D=2 and D=3.
95+
- Share D=4 minors while retaining guarded sparse evaluation.
96+
- Preserve non-finite handling for mathematically inactive terms.
97+
- Restore small-matrix det_sign_exact throughput [`b8bfa9f`](https://github.com/acgetchell/la-stack/commit/b8bfa9fa0c908ea034d294ceb123c8191eff3395)
98+
- Reuse proof-bearing shared minors for D4 determinant and permanent evaluation.
99+
- Restore the dense D3 filter while preserving sparse, overflow, and underflow fallbacks.
100+
- Require headline benchmarks to exercise the intended filter and document historical harness overhead.
101+
- Improve inf_norm throughput [`dc28f98`](https://github.com/acgetchell/la-stack/commit/dc28f9828a1e90b5604e4a55284175e50f84d7e2)
102+
- Check row-sum finiteness once per completed row on the success path.
103+
- Replay only overflowing rows to preserve the first failing matrix coordinate.
104+
- Preserve left-to-right accumulation and const evaluation across dimensions.
105+
- Improve dot and norm2_sq throughput [`ece54d7`](https://github.com/acgetchell/la-stack/commit/ece54d7b2a73111c2bc378a417189e2951a39cbc)
106+
- Check accumulator finiteness once after the success-path reduction.
107+
- Replay only non-finite reductions to preserve the first failing step.
108+
- Preserve left-to-right fused accumulation and const evaluation.
109+
8110
## [0.4.3] - 2026-06-09
9111

10112
### ⚠️ Breaking Changes
@@ -93,6 +195,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
93195
- Align the Python utility package metadata and lockfile with the crate release.
94196
- Add citation metadata validation to the release checklist and config lint flow.
95197
- Include CITATION.cff in YAML/CFF formatting checks.
198+
- Make release documentation links portable [`dd4ad19`](https://github.com/acgetchell/la-stack/commit/dd4ad192a42e28d9cc72b336b40802fe65cea4f0)
96199

97200
### Fixed
98201

@@ -672,6 +775,7 @@ Older releases are archived by minor series:
672775
- [0.2.x](docs/archive/changelog/0.2.md)
673776
- [0.1.x](docs/archive/changelog/0.1.md)
674777

778+
[0.4.4]: https://github.com/acgetchell/la-stack/compare/v0.4.3...v0.4.4
675779
[0.4.3]: https://github.com/acgetchell/la-stack/compare/v0.4.2...v0.4.3
676780
[0.4.2]: https://github.com/acgetchell/la-stack/compare/v0.4.1...v0.4.2
677781
[0.4.1]: https://github.com/acgetchell/la-stack/compare/v0.4.0...v0.4.1

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ cff-version: 1.2.0
22
message: "If you use this software, please cite it as below."
33
type: software
44
title: "la-stack: Fast, stack-allocated linear algebra for fixed dimensions in Rust"
5-
version: 0.4.3
6-
date-released: 2026-06-09
5+
version: 0.4.4
6+
date-released: 2026-07-12
77
url: "https://github.com/acgetchell/la-stack"
88
repository-code: "https://github.com/acgetchell/la-stack"
99
identifiers:

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "la-stack"
3-
version = "0.4.3"
3+
version = "0.4.4"
44
edition = "2024"
55
rust-version = "1.97.0"
66
license = "BSD-3-Clause"

README.md

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.18158926.svg)](https://doi.org/10.5281/zenodo.18158926)
44
[![Crates.io](https://badgen.net/crates/v/la-stack)](https://crates.io/crates/la-stack)
55
[![Downloads](https://badgen.net/crates/d/la-stack)](https://crates.io/crates/la-stack)
6-
[![License](https://badgen.net/github/license/acgetchell/la-stack)](https://github.com/acgetchell/la-stack/blob/v0.4.3/LICENSE)
6+
[![License](https://badgen.net/github/license/acgetchell/la-stack)](https://github.com/acgetchell/la-stack/blob/v0.4.4/LICENSE)
77
[![Docs.rs](https://docs.rs/la-stack/badge.svg)](https://docs.rs/la-stack)
88
[![CI](https://github.com/acgetchell/la-stack/actions/workflows/ci.yml/badge.svg)](https://github.com/acgetchell/la-stack/actions/workflows/ci.yml)
99
[![rust-clippy analyze][clippy-badge]][clippy-workflow]
@@ -60,9 +60,9 @@ for the algorithms, validity boundaries, and supporting references.
6060
exact values allocate as required
6161
-`unsafe` forbidden
6262

63-
See [CHANGELOG.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/CHANGELOG.md)
63+
See [CHANGELOG.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/CHANGELOG.md)
6464
for release history and
65-
[docs/roadmap.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/docs/roadmap.md)
65+
[docs/roadmap.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/roadmap.md)
6666
for current release planning.
6767

6868
## 🚫 Anti-goals
@@ -102,7 +102,7 @@ Add this to your `Cargo.toml`:
102102

103103
```toml
104104
[dependencies]
105-
la-stack = "0.4.3"
105+
la-stack = "0.4.4"
106106
```
107107

108108
### Feature flags
@@ -256,7 +256,7 @@ rationals (this pulls in `num-bigint`, `num-rational`, and `num-traits` for
256256

257257
```toml
258258
[dependencies]
259-
la-stack = { version = "0.4.3", features = ["exact"] }
259+
la-stack = { version = "0.4.4", features = ["exact"] }
260260
```
261261

262262
These routines are exact with respect to the finite binary64 values stored in
@@ -501,8 +501,8 @@ breaking callers.
501501
![LU solve (factor + solve): median time vs dimension][lu-solve-benchmark]
502502

503503
Raw data:
504-
[docs/assets/bench/vs_linalg_lu_solve_median.csv](https://github.com/acgetchell/la-stack/blob/v0.4.3/docs/assets/bench/vs_linalg_lu_solve_median.csv)
505-
Historical provenance status:
504+
[docs/assets/bench/vs_linalg_lu_solve_median.csv](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/assets/bench/vs_linalg_lu_solve_median.csv)
505+
Measurement provenance:
506506
[docs/assets/bench/vs_linalg_lu_solve_median.provenance.json][benchmark-provenance]
507507

508508
Representative benchmark: `lu_solve` factors the matrix and solves one
@@ -515,34 +515,30 @@ across operations.
515515
Timings count only when the implementation preserves the documented
516516
correctness guarantees and invariants. Performance claims require comparable
517517
before-and-after evidence using the same inputs, configuration, and environment.
518-
This v0.4.3 snapshot predates deterministic measurement-provenance capture, so
519-
its CPU, operating system, Rust toolchain, exact measured source state,
520-
dependency lock digest, and Criterion configuration are unavailable. The CSV
521-
preserves confidence bounds, but without the missing configuration and
522-
environment they do not make the result reproducible across environments. Treat
523-
it as a historical snapshot, not reproducible cross-environment evidence. Future
524-
`just plot-vs-linalg-readme` publications run the benchmark-input correctness
525-
gate, require complete canonical-dimension coverage, and write deterministic
526-
JSON provenance beside the CSV and SVG.
518+
This snapshot records the measured source state, CPU, operating system, Rust
519+
toolchain, dependency lock and harness digests, Criterion command, and
520+
correctness-gate result in the adjacent JSON sidecar. The publication workflow
521+
requires complete canonical-dimension coverage and regenerates the CSV, SVG,
522+
README table, and provenance together.
527523

528524
For the full per-kernel comparison methodology, input construction, and
529525
release-comparison workflow details, see
530-
[docs/BENCHMARKING.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/docs/BENCHMARKING.md).
526+
[docs/BENCHMARKING.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/BENCHMARKING.md).
531527
For the current release-to-release performance snapshot, see
532-
[docs/PERFORMANCE.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/docs/PERFORMANCE.md).
528+
[docs/PERFORMANCE.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/PERFORMANCE.md).
533529

534530
<!-- BENCH_TABLE:lu_solve:median:new:BEGIN -->
535531

536-
| D | la-stack median (ns) | nalgebra median (ns) | faer median (ns) | la-stack vs nalgebra | la-stack vs faer |
532+
| D | la-stack median (ns) | nalgebra median (ns) | faer median (ns) | reduction vs nalgebra (point est.) | reduction vs faer (point est.) |
537533
|---:|--------------------:|--------------------:|----------------:|---------------------:|----------------:|
538-
| 2 | 2.044 | 4.542 | 143.958 | +55.0% | +98.6% |
539-
| 3 | 9.596 | 23.599 | 185.466 | +59.3% | +94.8% |
540-
| 4 | 23.338 | 50.717 | 210.976 | +54.0% | +88.9% |
541-
| 5 | 45.368 | 69.065 | 277.564 | +34.3% | +83.7% |
542-
| 8 | 127.861 | 164.412 | 364.864 | +22.2% | +65.0% |
543-
| 16 | 631.997 | 663.822 | 882.674 | +4.8% | +28.4% |
544-
| 32 | 2,745.604 | 2,424.540 | 2,867.431 | -13.2% | +4.2% |
545-
| 64 | 17,543.034 | 14,747.731 | 12,266.271 | -19.0% | -43.0% |
534+
| 2 | 2.051 | 4.609 | 149.537 | +55.5% | +98.6% |
535+
| 3 | 10.032 | 23.094 | 185.935 | +56.6% | +94.6% |
536+
| 4 | 21.806 | 53.542 | 218.921 | +59.3% | +90.0% |
537+
| 5 | 43.787 | 70.437 | 282.262 | +37.8% | +84.5% |
538+
| 8 | 128.337 | 167.505 | 414.791 | +23.4% | +69.1% |
539+
| 16 | 672.680 | 581.273 | 875.411 | -15.7% | +23.2% |
540+
| 32 | 2,873.720 | 2,470.435 | 2,861.209 | -16.3% | -0.4% |
541+
| 64 | 18,165.369 | 15,021.737 | 12,225.703 | -20.9% | -48.6% |
546542

547543
<!-- BENCH_TABLE:lu_solve:median:new:END -->
548544

@@ -597,38 +593,38 @@ CI runs `just ci` on Ubuntu, macOS, and Windows to keep platform coverage
597593
aligned with the local comprehensive validation path.
598594

599595
For coverage commands and report locations, see
600-
[`docs/COVERAGE.md`](https://github.com/acgetchell/la-stack/blob/v0.4.3/docs/COVERAGE.md).
596+
[`docs/COVERAGE.md`](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/COVERAGE.md).
601597
For the full contributor workflow, see
602-
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/CONTRIBUTING.md).
598+
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/CONTRIBUTING.md).
603599

604600
## 📝 Citation
605601

606602
If you use this library in academic work, please cite it using
607-
[CITATION.cff](https://github.com/acgetchell/la-stack/blob/v0.4.3/CITATION.cff)
603+
[CITATION.cff](https://github.com/acgetchell/la-stack/blob/v0.4.4/CITATION.cff)
608604
(or GitHub's "Cite this repository" feature). Tagged releases are archived on
609605
Zenodo under the
610606
[all-versions concept DOI](https://doi.org/10.5281/zenodo.18158926).
611607

612608
## 📚 References
613609

614610
For canonical references to the algorithms used by this crate, see
615-
[REFERENCES.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/REFERENCES.md).
611+
[REFERENCES.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/REFERENCES.md).
616612

617613
## 🤖 AI Agents
618614

619615
AI coding assistants should read
620-
[AGENTS.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/AGENTS.md)
616+
[AGENTS.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/AGENTS.md)
621617
before proposing or applying changes. See
622-
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.3/CONTRIBUTING.md)
618+
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/CONTRIBUTING.md)
623619
for the repository's AI-assisted development note.
624620

625621
## 📄 License
626622

627-
BSD 3-Clause License. See [LICENSE](https://github.com/acgetchell/la-stack/blob/v0.4.3/LICENSE).
623+
BSD 3-Clause License. See [LICENSE](https://github.com/acgetchell/la-stack/blob/v0.4.4/LICENSE).
628624

629625
[audit-badge]: https://github.com/acgetchell/la-stack/actions/workflows/audit.yml/badge.svg
630626
[audit-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/audit.yml
631-
[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/668daed6/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json
627+
[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json
632628
[clippy-badge]: https://github.com/acgetchell/la-stack/actions/workflows/rust-clippy.yml/badge.svg
633629
[clippy-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/rust-clippy.yml
634-
[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.4.3/docs/assets/bench/vs_linalg_lu_solve_median.svg
630+
[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.4.4/docs/assets/bench/vs_linalg_lu_solve_median.svg

0 commit comments

Comments
 (0)