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
8 changes: 5 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ just test # Lib + doc tests (fast)
just test-all # All tests (Rust, benchmark inputs, and Python)
just examples # Run all examples
just update # Update dependency locks and repository-owned Cargo tools
just update-version vX.Y.Z # Update release metadata without upgrading dependencies
```

### Detailed Command Reference
Expand All @@ -305,9 +306,9 @@ just update # Update dependency locks and repository-owned Cargo tools
- Benchmarks: `cargo bench --locked --features bench` (or `just bench`)
- Benchmarks (exact arithmetic): `just bench-exact`
- Benchmarks (la-stack vs nalgebra/faer): `just bench-vs-linalg [filter]` (full run) or `just bench-vs-linalg-quick [filter]` (reduced)
- Benchmarks (plot vs_linalg CSV/SVG/JSON provenance): `just plot-vs-linalg [metric] [stat] [sample] [log_y]`;
publish a freshly gated full run to README with
`just plot-vs-linalg-readme [metric] [stat] [sample] [log_y]`
- Benchmarks (plot exploratory vs_linalg CSV/SVG/JSON provenance): `just plot-vs-linalg [metric] [stat] [sample] [log_y]`;
after `just performance-release`, publish its retained measurements to README
with `just performance-readme [metric] [stat] [sample] [log_y]`
- Benchmarks (save baseline): `just bench-save-baseline v0.4.1`
- Build (debug): `cargo build` (or `just build`)
- Build (release): `cargo build --release` (or `just build-release`)
Expand All @@ -326,6 +327,7 @@ just update # Update dependency locks and repository-owned Cargo tools
- Lint/validate: `just check`
- Cargo manifest/lockfile synchronization: `just cargo-lock-check`
- Unused dependency check: `just unused-deps` (uses `cargo-machete`)
- Update release metadata: `just update-version vX.Y.Z` (infers the previous stable published GitHub release)
- Pre-commit validation / CI simulation: `just ci` (lint + tests + examples + bench compile)
- Python setup from the lockfile: `uv sync --locked --group dev` (or `just python-sync`)
- Python tests: `just test-python`
Expand Down
117 changes: 117 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,117 @@ 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.5] - 2026-08-21

### ⚠️ Breaking Changes

- Unify local and release performance workflows
- Require Rust 1.97.1
- Require Rust 1.98.0

### Merged Pull Requests

- Bump the dependencies group with 3 updates [#211](https://github.com/acgetchell/la-stack/pull/211)
- Bump the github-actions group with 7 updates [#200](https://github.com/acgetchell/la-stack/pull/200)

### Added

- Persist release report artifacts for rerendering [`600445c`](https://github.com/acgetchell/la-stack/commit/600445c325ade517631d50a5f625923f56387f1c)

- Store deterministic comparison CSV with an adjacent schema-versioned provenance sidecar before temporary worktrees are removed.
- Render and promote reports only from validated artifact reloads, with fail-closed path checks and transactional rollback.
- Add performance-rerender and document artifact retention, GitHub assets, and the release workflow.
- Refresh Rust, Python, contributor-tool, and GitHub Action pins, and separate Dependabot security update groups.

### Dependencies

- Bump the github-actions group with 7 updates [#200](https://github.com/acgetchell/la-stack/pull/200)
[`9728daf`](https://github.com/acgetchell/la-stack/commit/9728dafc026bb2a849bae49feaca6144c5598698)

### Fixed

- Enforce pinned uv in local recipe guards [`938aff6`](https://github.com/acgetchell/la-stack/commit/938aff62517d5055d1db49bc7734e4069ef74d72)

- Reject missing or mismatched uv versions with actionable diagnostics.
- Reuse the canonical version guard across uv-backed validation helpers.
- Harden release artifact promotion [`8b8537b`](https://github.com/acgetchell/la-stack/commit/8b8537b86226285a343976ea987cf2759bf3dd7d)
- Treat CRLF and LF archive reports as equivalent while preserving stored bytes.
- Share comparison selection and report-update guidance across generation paths.
- Isolate artifact path resolution and retained-artifact rendering.
- Clarify that durable benchmark downloads are GitHub Release assets.
- Harden numerical and release evidence [`c878701`](https://github.com/acgetchell/la-stack/commit/c8787017122c3e94958e82d327fdab8a305999b8)
- Surface determinant overflow even when error-bound terms underflow.
- Measure complete benchmark operations symmetrically and bind retained reports to atomic, validated provenance.
- Fail closed on inconsistent release metadata, tags, changelog sections, Semgrep annotations, and recorded CPU provenance.
- Align docs.rs feature annotations, citation identifiers, all-target linting, and configurable property-test runs with documented contracts.
- Harden release and validation edge cases [`260afb8`](https://github.com/acgetchell/la-stack/commit/260afb85fdc8eaa873bdb64b6d7eae76ab6b9abc)
- Preserve archived changelog bytes during rollback and reject malformed Unreleased headings.
- Match overlapping Semgrep fixture spans deterministically and centralize immutable benchmark provenance handling.
- Document exact matrix/RHS scaling and the power-of-two factor that preserves linear systems.
- [**breaking**] Unify local and release performance workflows
[`c601c41`](https://github.com/acgetchell/la-stack/commit/c601c4146b01868a29288b7221e413706e3e01c7)
- Retain local Markdown, CSV, and provenance artifacts while allowing same-version comparisons of tracked changes.
- Exclude untracked files explicitly and isolate the narrowed non-exact comparison bundle.
- Promote distinct-release artifacts through performance-doc and keep performance-release atomic and rollback-capable.
- Render one consolidated table per benchmark suite and reject invalid release publication states.
- Isolate algebraic float fixture scans [`56e848f`](https://github.com/acgetchell/la-stack/commit/56e848fb3dbbc93f2fd4c0b566d71489c96dc857)
- exclude intentional algebraic float violations from production Semgrep scans while preserving direct fixture validation
- cover f64 associated-call syntax alongside f32 and receiver forms
- forbid dead-code suppressions and remove blanket allowances from static-analysis fixtures

### Maintenance

- Gate auto-merge on CodeRabbit approval [`2a37961`](https://github.com/acgetchell/la-stack/commit/2a37961ee8c95f2482541910de78680af22bb968)

- Request one SHA-scoped CodeRabbit review for each Dependabot update.
- Enable squash auto-merge only for the triggering head after required checks pass.
- Group GitHub Actions updates, remove autopep8, and refresh pinned tooling.
- Print an explicit release title in tag-release follow-up guidance.
- [**breaking**] Require Rust 1.97.1 [`99bac26`](https://github.com/acgetchell/la-stack/commit/99bac263ae773cc8cb42c418630c8e7dd7d023b8)
- align contributor, CI, release, and Clippy toolchain baselines
- compile benchmarks with Cargo's warning policy to preserve cache reuse
- publish CodeRabbit's canonical review check for ruleset enforcement
- Restore ruleset-compatible status [`5235365`](https://github.com/acgetchell/la-stack/commit/5235365efaf38a0d4035d74a46a7468ad10921d0)
- publish the legacy CodeRabbit commit status required by the main ruleset
- keep review progress disabled until CodeRabbit can publish the required check run
- Standardize validation and centralize tool pins [`54a7e3a`](https://github.com/acgetchell/la-stack/commit/54a7e3a8e8a640fa5069d5c07fffbf1c1dfab903)
- Compose CI from orthogonal leaf validators with one release-profile nextest pass and separate doctests.
- Resolve workflow tooling through the justfile and shared setup action.
- Document focused validation, notebook scope, and Rust 1.97 tooling policy.
- Refresh development tools, security actions, Dependabot schedules, and lockfiles.
- [**breaking**] Require Rust 1.98.0 [`2f9e0a8`](https://github.com/acgetchell/la-stack/commit/2f9e0a83c4fd974f34f87f29409cf1eac4da5343)
- align the MSRV, contributor toolchain, dependency locks, and documented maintenance baseline
- forbid algebraic float operations in numerical kernels to preserve IEEE-754 error and reproducibility contracts
- add a scoped just update workflow with atomic Cargo tool-pin reconciliation
- clean failed changelog and performance staging files without disturbing published artifacts
- Bump the dependencies group with 3 updates [#211](https://github.com/acgetchell/la-stack/pull/211)
[`493068a`](https://github.com/acgetchell/la-stack/commit/493068ac653724959f7083f34d5c909a496314bd)

Updates the requirements on [ruff](https://github.com/astral-sh/ruff) , [ty](https://github.com/astral-sh/ty) and
[setuptools](https://github.com/pypa/setuptools) to permit the latest version.

Updates `ruff` from 0.16.1 to 0.16.2
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.16.1...0.16.2)

Updates `ty` from 0.0.66 to 0.0.69
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ty/compare/0.0.66...0.0.69)

Updates `setuptools` to 84.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/v83.0.0...v84.0.0)

### Performance

- Reduce checked determinant query overhead [`2bdf1d3`](https://github.com/acgetchell/la-stack/commit/2bdf1d3dc4b4a27928a888be678b4c360916e94c)

- Aggregate D≥5 range proofs before a single cold scaled replay.
- Preserve immediate small-dimension fallback and range-safe determinant behavior.

## [0.4.4] - 2026-07-13

### ⚠️ Breaking Changes
Expand Down Expand Up @@ -67,6 +178,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- 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
- Harden changelog and version generation [`2e1eb2e`](https://github.com/acgetchell/la-stack/commit/2e1eb2e965333fab51934c2b605fe3465e4b57e6)
- Reject tag prefixes embedded in longer non-semver revisions
- Preserve fenced examples when stripping Dependabot metadata
- Document the conditional exact-solve scaling invariant
- Regenerate the v0.4.4 changelog through the release workflow

### Maintenance

Expand Down Expand Up @@ -775,6 +891,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.5]: https://github.com/acgetchell/la-stack/compare/v0.4.4...v0.4.5
[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
Expand Down
8 changes: 2 additions & 6 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@ 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.4
date-released: 2026-07-13
version: 0.4.5
date-released: 2026-08-21
url: "https://github.com/acgetchell/la-stack"
repository-code: "https://github.com/acgetchell/la-stack"
doi: "10.5281/zenodo.18158926"
identifiers:
- description: "Zenodo DOI for version 0.4.4"
type: doi
value: "10.5281/zenodo.21331524"
authors:
- family-names: "Getchell"
given-names: "Adam"
Expand Down
6 changes: 3 additions & 3 deletions 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.4"
version = "0.4.5"
edition = "2024"
rust-version = "1.98.0"
license = "BSD-3-Clause"
Expand Down
50 changes: 25 additions & 25 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.4/LICENSE)
[![License](https://badgen.net/github/license/acgetchell/la-stack)](https://github.com/acgetchell/la-stack/blob/v0.4.5/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.4/CHANGELOG.md)
See [CHANGELOG.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/CHANGELOG.md)
for release history and
[docs/roadmap.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/roadmap.md)
[docs/roadmap.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/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.4"
la-stack = "0.4.5"
```

### 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.4", features = ["exact"] }
la-stack = { version = "0.4.5", features = ["exact"] }
```

These routines are exact with respect to the finite binary64 values stored in
Expand Down Expand Up @@ -501,7 +501,7 @@ 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.4/docs/assets/bench/vs_linalg_lu_solve_median.csv)
[docs/assets/bench/vs_linalg_lu_solve_median.csv](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/assets/bench/vs_linalg_lu_solve_median.csv)
Measurement provenance:
[docs/assets/bench/vs_linalg_lu_solve_median.provenance.json][benchmark-provenance]

Expand All @@ -523,22 +523,22 @@ 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.4/docs/BENCHMARKING.md).
[docs/BENCHMARKING.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/BENCHMARKING.md).
For the current release-to-release performance snapshot, see
[docs/PERFORMANCE.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/docs/PERFORMANCE.md).
[docs/PERFORMANCE.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/PERFORMANCE.md).

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

| D | la-stack median (ns) | nalgebra median (ns) | faer median (ns) | reduction vs nalgebra (point est.) | reduction vs faer (point est.) |
|---:|--------------------:|--------------------:|----------------:|---------------------:|----------------:|
| 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% |
| 2 | 2.044 | 4.601 | 151.939 | +55.6% | +98.7% |
| 3 | 9.989 | 23.513 | 196.357 | +57.5% | +94.9% |
| 4 | 21.865 | 54.716 | 223.910 | +60.0% | +90.2% |
| 5 | 44.510 | 71.219 | 293.420 | +37.5% | +84.8% |
| 8 | 145.405 | 188.352 | 381.872 | +22.8% | +61.9% |
| 16 | 672.491 | 585.261 | 897.236 | -14.9% | +25.0% |
| 32 | 2,777.707 | 2,501.361 | 2,952.778 | -11.0% | +5.9% |
| 64 | 17,357.785 | 13,878.401 | 12,199.761 | -25.1% | -42.3% |

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

Expand Down Expand Up @@ -593,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.4/docs/COVERAGE.md).
[`docs/COVERAGE.md`](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/COVERAGE.md).
For the full contributor workflow, see
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/CONTRIBUTING.md).
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/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.4/CITATION.cff)
[CITATION.cff](https://github.com/acgetchell/la-stack/blob/v0.4.5/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.4/REFERENCES.md).
[REFERENCES.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/REFERENCES.md).

## 🤖 AI Agents

AI coding assistants should read
[AGENTS.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/AGENTS.md)
[AGENTS.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/AGENTS.md)
before proposing or applying changes. See
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.4/CONTRIBUTING.md)
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/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.4/LICENSE).
BSD 3-Clause License. See [LICENSE](https://github.com/acgetchell/la-stack/blob/v0.4.5/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/v0.4.4/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json
[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/v0.4.5/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.4/docs/assets/bench/vs_linalg_lu_solve_median.svg
[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.4.5/docs/assets/bench/vs_linalg_lu_solve_median.svg
Loading
Loading