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
2 changes: 0 additions & 2 deletions .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ on:
- "src/**"
- "benches/**"
- "tests/exact_bench_config.rs"
- "tests/vs_linalg_inputs.rs"
- ".config/nextest.toml"
- "Cargo.toml"
- "Cargo.lock"
Expand All @@ -32,7 +31,6 @@ on:
- "src/**"
- "benches/**"
- "tests/exact_bench_config.rs"
- "tests/vs_linalg_inputs.rs"
- ".config/nextest.toml"
- "Cargo.toml"
- "Cargo.lock"
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ jobs:
cargo_machete_version="$(resolve_version cargo_machete_version)"
cargo_nextest_version="$(resolve_version cargo_nextest_version)"
dprint_version="$(resolve_version dprint_version)"
git_cliff_version="$(resolve_version git_cliff_version)"
rumdl_version="$(resolve_version rumdl_version)"
taplo_version="$(resolve_version taplo_version)"
typos_version="$(resolve_version typos_version)"
Expand All @@ -101,6 +102,7 @@ jobs:
echo "CARGO_MACHETE_VERSION=$cargo_machete_version"
echo "CARGO_NEXTEST_VERSION=$cargo_nextest_version"
echo "DPRINT_VERSION=$dprint_version"
echo "GIT_CLIFF_VERSION=$git_cliff_version"
echo "RUMDL_VERSION=$rumdl_version"
echo "TAPLO_VERSION=$taplo_version"
echo "TYPOS_VERSION=$typos_version"
Expand Down Expand Up @@ -166,5 +168,10 @@ jobs:
with:
tool: cargo-nextest@${{ steps.tool_versions.outputs.CARGO_NEXTEST_VERSION }}

- name: Install git-cliff
uses: taiki-e/cache-cargo-install-action@9ee83daaa7b96a6fab930949ecf1122bba04a389 # v3.0.8
with:
tool: git-cliff@${{ steps.tool_versions.outputs.GIT_CLIFF_VERSION }}

- name: Run CI checks
run: just ci
11 changes: 6 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,11 +220,12 @@ Favor the invariant over a convenient edit or faster implementation.

## Project Context

This is one Rust library crate, rooted at `src/lib.rs`. Core dimensions are
compile-time constants. The `exact` feature enables arbitrary-precision
arithmetic; `bench` gates benchmark targets while their dependencies remain
dev-only. The [Code organization guide](docs/code_organization.md) maps
modules, features, tests, and tooling. Update that guide when file ownership
The published Rust library is rooted at `src/lib.rs`. The unpublished
`benches/comparison` workspace member owns nalgebra/faer benchmark dependencies
and input tests. Core dimensions are compile-time constants. The `exact` feature
enables arbitrary-precision arithmetic; `bench` gates benchmark targets while
their dependencies remain dev-only. The [Code organization guide](docs/code_organization.md)
maps modules, features, tests, and tooling. Update that guide when file ownership
or layout changes.

## Agent Expectations
Expand Down
231 changes: 225 additions & 6 deletions CHANGELOG.md

Large diffs are not rendered by default.

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.5
date-released: 2026-08-21
version: 0.4.6
date-released: 2026-09-08
url: "https://github.com/acgetchell/la-stack"
repository-code: "https://github.com/acgetchell/la-stack"
doi: "10.5281/zenodo.18158926"
Expand Down
15 changes: 12 additions & 3 deletions Cargo.lock

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

26 changes: 14 additions & 12 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
[package]
name = "la-stack"
version = "0.4.5"
version = "0.4.6"
edition = "2024"
rust-version = "1.98.1"
autobenches = false
license = "BSD-3-Clause"
description = "Fast, stack-allocated linear algebra for fixed dimensions"
readme = "README.md"
Expand Down Expand Up @@ -45,8 +46,6 @@ num-traits = { version = "0.2.19", optional = true }
allocation-counter = "0.8.1"
approx = "0.5.1"
criterion = { version = "0.8.2", features = [ "html_reports" ] }
faer = { version = "0.24.4", default-features = false, features = [ "std", "linalg" ] }
nalgebra = { version = "0.35.0", default-features = false, features = [ "std" ] }
pastey = "0.2.3"
proptest = "1.11.0"

Expand All @@ -72,11 +71,6 @@ required-features = [ "exact" ]
name = "rational_input_5x5"
required-features = [ "exact" ]

[[bench]]
name = "vs_linalg"
harness = false
required-features = [ "bench" ]

[[bench]]
name = "exact"
harness = false
Expand Down Expand Up @@ -105,19 +99,27 @@ codegen-units = 1
features = [ "exact" ]
rustdoc-args = [ "--cfg", "docsrs" ]

[lints.rust]
[workspace]
members = [ "benches/comparison" ]
default-members = [ "." ]
resolver = "3"

[lints]
workspace = true

[workspace.lints.rust]
warnings = { level = "deny", priority = -1 }
unsafe_code = "forbid"
missing_docs = { level = "deny", priority = 0 }
dead_code = { level = "deny", priority = 0 }
unreachable_pub = { level = "deny", priority = 0 }
unexpected_cfgs = { level = "deny", priority = 0, check-cfg = [ 'cfg(docsrs)', 'cfg(la_stack_pre_rational_input_api)', 'cfg(la_stack_v0_4_3_api)' ] }
unexpected_cfgs = { level = "deny", priority = 0, check-cfg = [ 'cfg(docsrs)', 'cfg(la_stack_pre_rational_input_api)' ] }

[lints.rustdoc]
[workspace.lints.rustdoc]
bare_urls = "deny"
broken_intra_doc_links = "deny"

[lints.clippy]
[workspace.lints.clippy]
cargo = { level = "warn", priority = -1 }
extra_unused_type_parameters = "warn"
nursery = { level = "warn", priority = -1 }
Expand Down
52 changes: 26 additions & 26 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.5/LICENSE)
[![License](https://badgen.net/github/license/acgetchell/la-stack)](https://github.com/acgetchell/la-stack/blob/v0.4.6/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 @@ -92,7 +92,7 @@ Add this to your `Cargo.toml`:

```toml
[dependencies]
la-stack = "0.4.5"
la-stack = "0.4.6"
```

### Solve a 5×5 system
Expand Down Expand Up @@ -229,7 +229,7 @@ Enable exact determinant signs, determinant values, and solves:

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

`Matrix` / `Vector` exact methods preserve stored `f64` values;
Expand Down Expand Up @@ -338,9 +338,9 @@ for the algorithms, validity boundaries, and supporting references.
- ✅ No runtime dependencies by default (optional features may add deps)
- ✅ `unsafe` forbidden

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

## 🚫 Anti-goals
Expand All @@ -361,12 +361,12 @@ for current release planning.
## 🗺️ Documentation Map

- [API guide][api-guide] — worked examples, API selection, storage, and error contracts.
- [Benchmarking](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/BENCHMARKING.md) — benchmark suites, comparison workflows, and measurement methodology.
- [Benchmarking](https://github.com/acgetchell/la-stack/blob/v0.4.6/docs/BENCHMARKING.md) — benchmark suites, comparison workflows, and measurement methodology.
- [Coverage](https://github.com/acgetchell/la-stack/blob/main/docs/MEASURING_COVERAGE.md) — local and CI coverage commands and report locations.
- [Mathematical basis](https://github.com/acgetchell/la-stack/blob/main/docs/mathematical_basis.md) — algorithms, numerical guarantees, and limitations.
- [Performance reports](https://github.com/acgetchell/la-stack/blob/main/docs/performance.md) — release-to-release measurement results and provenance.
- [Releasing](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/RELEASING.md) — release preparation, validation, and publication.
- [Roadmap](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/roadmap.md) — release planning, future directions, and non-goals.
- [Releasing](https://github.com/acgetchell/la-stack/blob/v0.4.6/docs/RELEASING.md) — release preparation, validation, and publication.
- [Roadmap](https://github.com/acgetchell/la-stack/blob/v0.4.6/docs/roadmap.md) — release planning, future directions, and non-goals.

## 📋 Examples

Expand Down Expand Up @@ -399,7 +399,7 @@ cargo run --example solve_5x5
![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.5/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.6/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 @@ -421,7 +421,7 @@ README table, and provenance together.

For the full per-kernel comparison methodology, algorithm citations, input
construction, and release-comparison workflow details, see
[docs/BENCHMARKING.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/docs/BENCHMARKING.md).
[docs/BENCHMARKING.md](https://github.com/acgetchell/la-stack/blob/v0.4.6/docs/BENCHMARKING.md).
For the current release-to-release performance snapshot, see
[docs/performance.md](https://github.com/acgetchell/la-stack/blob/main/docs/performance.md).
The exact release suite includes the already-exact rational-input groups for
Expand All @@ -445,14 +445,14 @@ expectations are validated outside the timed closures.

| 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.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% |
| 2 | 2.021 | 4.479 | 182.532 | +54.9% | +98.9% |
| 3 | 9.977 | 22.795 | 217.567 | +56.2% | +95.4% |
| 4 | 22.101 | 51.739 | 241.525 | +57.3% | +90.8% |
| 5 | 46.070 | 69.003 | 326.848 | +33.2% | +85.9% |
| 8 | 128.364 | 165.933 | 401.400 | +22.6% | +68.0% |
| 16 | 643.532 | 569.446 | 903.140 | -13.0% | +28.7% |
| 32 | 2,755.773 | 2,710.235 | 2,919.290 | -1.7% | +5.6% |
| 64 | 17,518.634 | 14,313.979 | 12,108.783 | -22.4% | -44.7% |

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

Expand Down Expand Up @@ -486,39 +486,39 @@ aligned with the local comprehensive validation path.
For coverage commands and report locations, see
[`docs/MEASURING_COVERAGE.md`](https://github.com/acgetchell/la-stack/blob/main/docs/MEASURING_COVERAGE.md).
For the full contributor workflow, see
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/CONTRIBUTING.md).
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.6/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.5/CITATION.cff)
[CITATION.cff](https://github.com/acgetchell/la-stack/blob/v0.4.6/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.5/REFERENCES.md).
[REFERENCES.md](https://github.com/acgetchell/la-stack/blob/v0.4.6/REFERENCES.md).

## 🤖 AI Agents

AI coding assistants should read
[AGENTS.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/AGENTS.md)
[AGENTS.md](https://github.com/acgetchell/la-stack/blob/v0.4.6/AGENTS.md)
before proposing or applying changes. See
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.5/CONTRIBUTING.md)
[CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/v0.4.6/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.5/LICENSE).
BSD 3-Clause License. See [LICENSE](https://github.com/acgetchell/la-stack/blob/v0.4.6/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.5/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json
[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/v0.4.6/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.5/docs/assets/bench/vs_linalg_lu_solve_median.svg
[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.4.6/docs/assets/bench/vs_linalg_lu_solve_median.svg
[refs-det-bound]: https://github.com/acgetchell/la-stack/blob/main/REFERENCES.md#absolute-error-bound-for-closed-form-determinants
[refs-exact-sign]: https://github.com/acgetchell/la-stack/blob/main/REFERENCES.md#exact-determinant-sign-adaptive-precision-integer-arithmetic
[refs-exact-solve]: https://github.com/acgetchell/la-stack/blob/main/REFERENCES.md#exact-linear-system-solve-hybrid-bareiss--bigrational
Expand Down
Loading
Loading