Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ invariant over the convenient edit.
from the same representative benchmark command, inputs, features, and
environment. Use `bench-vs-linalg` (vs nalgebra / faer) or `bench-exact`
(exact arithmetic), as appropriate.
- For nanosecond-scale fixed-size kernels, prefer Criterion `bencher.iter` so
the complete public operation is measured symmetrically across implementations.
Use `iter_batched` only when setup is explicitly outside the estimand, the
exclusion is applied comparably to every implementation, and a same-binary
comparison shows that batching does not materially distort the result.
- Preserve benchmark provenance and distinguish descriptive point-estimate
ratios from statistically supported performance claims. Marginal Criterion
interval separation is not a paired confidence interval for the change.
Expand Down
104 changes: 104 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,108 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.4.4] - 2026-07-13

### ⚠️ Breaking Changes

- Make numerical invariants and errors explicit
- Require Rust 1.97.0

### Added

- [**breaking**] Make numerical invariants and errors explicit
[`668daed`](https://github.com/acgetchell/la-stack/commit/668daed6f5d83a03fc95a7872a0a302d097e3fc4)

- add structured error reasons, locations, origins, and factorization context
- make determinant, exact-conversion, LU, and LDLT paths range-safe and mathematically explicit
- validate benchmark inputs independently and require reproducible, provenance-backed performance evidence
- centralize tool versions, adopt nextest profiles, and replace Codacy with repository-owned checks and SARIF reporting

### Changed

- Consolidate setup abort handling [`b9e453e`](https://github.com/acgetchell/la-stack/commit/b9e453e540da3c63b0a14ca94b4bcfbc9c8ff6bd)

- Share `OrAbort` across exact and comparison benchmarks while preserving contextual panic behavior.
- Centralize Clippy policy in Cargo.toml for consistent local and CI checks.
- Keep `unreachable_pub` enforced while allowing intentional crate-visible helpers.
- Enable CodeRabbit's request-changes review workflow.

### Dependencies

- Bump python-multipart in the uv group across 1 directory [`6bb4fb7`](https://github.com/acgetchell/la-stack/commit/6bb4fb7ce48e49d4d2a5bfe4ff5d55b09e6300e2)
- Bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 [`4a999a6`](https://github.com/acgetchell/la-stack/commit/4a999a664211126e581da47713f6d2426d6db698)
- Bump github/codeql-action/upload-sarif [`85c0a7b`](https://github.com/acgetchell/la-stack/commit/85c0a7bd6a1b3d3e0e00f4e82c6d544c2ca0f22b)
- Bump actions/checkout from 6.0.2 to 7.0.0 [`0f0f956`](https://github.com/acgetchell/la-stack/commit/0f0f956c64ddbc5700f3c2f96b90242703e0a410)
- Bump astral-sh/setup-uv from 8.1.0 to 8.2.0 [`259acaa`](https://github.com/acgetchell/la-stack/commit/259acaa06cc2d6b50f5c024c60cbdf9fe3172f7f)
- Bump codecov/codecov-action from 6.0.1 to 7.0.0 [`035807c`](https://github.com/acgetchell/la-stack/commit/035807c9312ce1ff818dcab9dd986980dfcb37d8)
- Bump vulnerable Python tooling dependencies [`4990260`](https://github.com/acgetchell/la-stack/commit/49902604db70de7c6831f559aee967bf3c376bc1)

### Documentation

- Add mathematical basis and clarify numerical guarantees [`31b7b1e`](https://github.com/acgetchell/la-stack/commit/31b7b1e7c547fc69edbb601e68b2f29e83d5cd24)

- define the binary64, factorization, determinant-filter, exact-arithmetic, tolerance, and error contracts
- align README, API documentation, examples, and LDLT diagnostics with guarantees over stored values
- audit academic references and extend Criterion coverage for determinant error-bound paths
- Clarify determinant and LDLT failure contracts [`e257343`](https://github.com/acgetchell/la-stack/commit/e2573434c541a8115750b3a965882f7b484b6be0)
- State the determinant sign condition without ambiguous Markdown delimiters.
- Distinguish singular zero pivots from coupled zero-pivot LDLT rejections.
- Align citation and contributor guidance with the positive-definite domain.

### Fixed

- Make v0.4.3 comparisons correctness-aware [`4ac5af9`](https://github.com/acgetchell/la-stack/commit/4ac5af9ce104c5126bfd6217414977cca269b62e)

- Adapt the shared benchmark harness across v0.4.3 API differences without changing measured operations
- Exclude invalid balanced-range baselines while requiring current samples and reporting unavailable comparisons
- Preserve benchmark provenance, suite-specific fallback commands, and publication rollback guarantees
- Harden Windows Git input, changelog links, and version-reference parsing across platforms
- Harden exact arithmetic and benchmark publication [`db2fad5`](https://github.com/acgetchell/la-stack/commit/db2fad50087c773f7ae37f181f720da2a9ff4a23)
- add `DeterminantWithErrorBound` for paired determinant estimates and certified bounds
- scale exact systems independently and round exact values directly to IEEE-754
- fail benchmark publication closed on invalid samples or mismatched provenance
- make release and changelog tooling transactional, path-safe, and Windows-portable
- align benchmark CI with pinned local tools and least-privilege publishing

### Maintenance

- Update setuptools requirement in the dependencies group [`6a6c339`](https://github.com/acgetchell/la-stack/commit/6a6c339e7fbec1c9ca4226005794e8ab87f0c2d6)

Updates the requirements on [setuptools](https://github.com/pypa/setuptools) to permit the latest version.

Updates `setuptools` to 83.0.0

- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v65.0.0...v83.0.0)
- Avoid duplicate review checks [`5e15d92`](https://github.com/acgetchell/la-stack/commit/5e15d9250455fd1467e47a735412f65449f30b56)
- Use the legacy required status while preserving automatic approvals.
- Add explicit dense D3 determinant coverage and document the D4 error bound.
- [**breaking**] Require Rust 1.97.0 [`4033f1f`](https://github.com/acgetchell/la-stack/commit/4033f1f39e411ed066fec808805371979995964b)
- Align Cargo, the pinned toolchain, Clippy, dependency-audit triggers, and maintainer guidance with the new baseline.
- Audit Rust 1.97 integer bit helpers against exact-arithmetic hot paths and retain existing operations where alternatives do not preserve performance.
- Correct v0.4.3 citation metadata and document exact decomposition and solve scaling accurately.

### Performance

- Restore det_direct throughput for D=2..4 [`f6d6885`](https://github.com/acgetchell/la-stack/commit/f6d68855a314fc4802c559080d9faca85db81bb9)

- Reintroduce branch-free dense expansions for D=2 and D=3.
- Share D=4 minors while retaining guarded sparse evaluation.
- Preserve non-finite handling for mathematically inactive terms.
- Restore small-matrix det_sign_exact throughput [`b8bfa9f`](https://github.com/acgetchell/la-stack/commit/b8bfa9fa0c908ea034d294ceb123c8191eff3395)
- Reuse proof-bearing shared minors for D4 determinant and permanent evaluation.
- Restore the dense D3 filter while preserving sparse, overflow, and underflow fallbacks.
- Require headline benchmarks to exercise the intended filter and document historical harness overhead.
- Improve inf_norm throughput [`dc28f98`](https://github.com/acgetchell/la-stack/commit/dc28f9828a1e90b5604e4a55284175e50f84d7e2)
- Check row-sum finiteness once per completed row on the success path.
- Replay only overflowing rows to preserve the first failing matrix coordinate.
- Preserve left-to-right accumulation and const evaluation across dimensions.
- Improve dot and norm2_sq throughput [`ece54d7`](https://github.com/acgetchell/la-stack/commit/ece54d7b2a73111c2bc378a417189e2951a39cbc)
- Check accumulator finiteness once after the success-path reduction.
- Replay only non-finite reductions to preserve the first failing step.
- Preserve left-to-right fused accumulation and const evaluation.

## [0.4.3] - 2026-06-09

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

### Fixed

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

[0.4.4]: https://github.com/acgetchell/la-stack/compare/v0.4.3...v0.4.4
[0.4.3]: https://github.com/acgetchell/la-stack/compare/v0.4.2...v0.4.3
[0.4.2]: https://github.com/acgetchell/la-stack/compare/v0.4.1...v0.4.2
[0.4.1]: https://github.com/acgetchell/la-stack/compare/v0.4.0...v0.4.1
Expand Down
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ cff-version: 1.2.0
message: "If you use this software, please cite it as below."
type: software
title: "la-stack: Fast, stack-allocated linear algebra for fixed dimensions in Rust"
version: 0.4.3
date-released: 2026-06-09
version: 0.4.4
date-released: 2026-07-12
url: "https://github.com/acgetchell/la-stack"
repository-code: "https://github.com/acgetchell/la-stack"
identifiers:
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "la-stack"
version = "0.4.3"
version = "0.4.4"
edition = "2024"
rust-version = "1.97.0"
license = "BSD-3-Clause"
Expand Down
68 changes: 32 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.18158926.svg)](https://doi.org/10.5281/zenodo.18158926)
[![Crates.io](https://badgen.net/crates/v/la-stack)](https://crates.io/crates/la-stack)
[![Downloads](https://badgen.net/crates/d/la-stack)](https://crates.io/crates/la-stack)
[![License](https://badgen.net/github/license/acgetchell/la-stack)](https://github.com/acgetchell/la-stack/blob/v0.4.3/LICENSE)
[![License](https://badgen.net/github/license/acgetchell/la-stack)](https://github.com/acgetchell/la-stack/blob/v0.4.4/LICENSE)
[![Docs.rs](https://docs.rs/la-stack/badge.svg)](https://docs.rs/la-stack)
[![CI](https://github.com/acgetchell/la-stack/actions/workflows/ci.yml/badge.svg)](https://github.com/acgetchell/la-stack/actions/workflows/ci.yml)
[![rust-clippy analyze][clippy-badge]][clippy-workflow]
Expand Down Expand Up @@ -60,9 +60,9 @@ for the algorithms, validity boundaries, and supporting references.
exact values allocate as required
- ✅ `unsafe` forbidden

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

## 🚫 Anti-goals
Expand Down Expand Up @@ -102,7 +102,7 @@ Add this to your `Cargo.toml`:

```toml
[dependencies]
la-stack = "0.4.3"
la-stack = "0.4.4"
```

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

```toml
[dependencies]
la-stack = { version = "0.4.3", features = ["exact"] }
la-stack = { version = "0.4.4", features = ["exact"] }
```

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

Raw data:
[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)
Historical provenance status:
[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)
Measurement provenance:
[docs/assets/bench/vs_linalg_lu_solve_median.provenance.json][benchmark-provenance]

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

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

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

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

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

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

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

## 📝 Citation

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

## 📚 References

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

## 🤖 AI Agents

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

## 📄 License

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

[audit-badge]: https://github.com/acgetchell/la-stack/actions/workflows/audit.yml/badge.svg
[audit-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/audit.yml
[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/668daed6/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json
[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json
[clippy-badge]: https://github.com/acgetchell/la-stack/actions/workflows/rust-clippy.yml/badge.svg
[clippy-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/rust-clippy.yml
[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.4.3/docs/assets/bench/vs_linalg_lu_solve_median.svg
[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.4.4/docs/assets/bench/vs_linalg_lu_solve_median.svg
Loading
Loading