diff --git a/.github/workflows/release-benchmarks.yml b/.github/workflows/release-benchmarks.yml index 1d5e2d6..e3b4cdd 100644 --- a/.github/workflows/release-benchmarks.yml +++ b/.github/workflows/release-benchmarks.yml @@ -54,7 +54,7 @@ jobs: echo "::error::Dispatch with --ref $RELEASE_TAG and the matching tag input" exit 1 fi - target="$(uvx --python 3.15 --from research-repo-tools==0.2.0 research-repo-tools \ + target="$(uvx --python 3.15 --from research-repo-tools==0.2.2 research-repo-tools \ --root "$RUNNER_TEMP" performance release-draft "$GH_REPO" "$RELEASE_TAG" \ --commit "$GITHUB_SHA" --expected-title "$RELEASE_TAG" | jq -c .)" echo "target=$target" >> "$GITHUB_OUTPUT" @@ -194,7 +194,7 @@ jobs: [[ "$RELEASE_ASSET" == "la-stack-${RELEASE_TAG}-criterion-baseline.tar.gz" ]] || exit 1 printf '%s\n' "$RELEASE_TARGET" > "$RUNNER_TEMP/release-target.json" - uvx --python 3.15 --from research-repo-tools==0.2.0 research-repo-tools \ + uvx --python 3.15 --from research-repo-tools==0.2.2 research-repo-tools \ --root "$RUNNER_TEMP" performance release-upload "$GH_REPO" "$RELEASE_TAG" \ "$GITHUB_WORKSPACE/$RELEASE_ASSET" --target "$RUNNER_TEMP/release-target.json" diff --git a/AGENTS.md b/AGENTS.md index bfd2972..b7e72b4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -31,7 +31,7 @@ if the scope expands. Unrelated guides need not be loaded for every task. | Module ownership, features, or file organization | [Code organization](docs/code_organization.md) | | Setup, commands, or validation selection | [Contributor workflow](CONTRIBUTING.md#validation-workflow), [justfile](justfile), `just --list` | | Benchmark execution or performance reports | [Benchmarking](docs/BENCHMARKING.md) | -| Python support scripts | [Scripts guide](scripts/README.md) | +| Python tooling and consumer tests | [Tooling guide](tooling/README.md) | | Maintainer-requested release work | [Releasing](docs/RELEASING.md) | ## Priorities @@ -218,7 +218,7 @@ Favor the invariant over a convenient edit or faster implementation. Python scripts; never invoke `python` or `python3` directly. - Use pytest, not unittest, and add type hints to new code. - `just python-check` includes blocking type checking; all code must pass. -- Read the [Scripts guide](scripts/README.md) for maintenance rules and +- Read the [Tooling guide](tooling/README.md) for maintenance rules and entry-point ownership. ## Project Context diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6db1d8c..18065d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,9 +9,9 @@ clarity, and the fixed-dimension stack-allocation model. Reusable Python development tooling has moved into [`research-repo-tools`](https://github.com/acgetchell/research-repo-tools). It is a development dependency for this repository's setup, validation, -maintenance, benchmark reporting, and release workflows. Local scripts retain -la-stack's scientific policy and remaining benchmark adapters; see the -[Scripts guide](scripts/README.md) for the ownership boundary. +maintenance, benchmark reporting, and release workflows. Static declarations +and native correctness gates retain la-stack's scientific policy; see the +[Tooling guide](tooling/README.md) for the ownership boundary. Building and using `la-stack` as a Rust library does not require Python, `uv`, or `research-repo-tools`. The setup below is for contributors working on this @@ -39,12 +39,12 @@ change files. Run bare `just` for the complete generated command list, including arguments and descriptions. The [command policy](docs/dev/docs.md#command-discovery-and-placement) owns recipe naming and documentation placement. -Setup, tool checks, updates, changelog, and opt-in CodeRabbit review use the published `research-repo-tools==0.2.0` package, +Setup, tool checks, updates, changelog, and opt-in CodeRabbit review use the published `research-repo-tools==0.2.2` package, locked in the `tooling` dependency group and included by `dev`. Normal setup and CI install it from PyPI through `uv sync --locked --group dev`; a sibling checkout is unnecessary. To upgrade it deliberately, review the exact `tooling` and project runtime requirements and refresh `uv.lock` together, then run the consumer -integration tests and `just ci`. See the [Scripts guide](scripts/README.md#changelog-and-release-tooling) +integration tests and `just ci`. See the [Tooling guide](tooling/README.md#changelog-and-release-tooling) for the retained changelog policy and ownership boundary. The shared setup contract requires an existing uv and does not generate bootstrap @@ -288,7 +288,7 @@ Use the existing canonical documents instead of duplicating their guidance: | Mathematical basis and numerical validity | [`docs/mathematical_basis.md`](docs/mathematical_basis.md) | | Package metadata, features, and dependencies | [`Cargo.toml`](Cargo.toml) | | Commands and validation workflow | [`justfile`](justfile), `just --list` | -| Python support tooling | [`scripts/README.md`](scripts/README.md) | +| Python support tooling | [`tooling/README.md`](tooling/README.md) | | Benchmark methodology and baselines | [`docs/BENCHMARKING.md`](docs/BENCHMARKING.md) | | Coverage workflow and reports | [`docs/MEASURING_COVERAGE.md`](docs/MEASURING_COVERAGE.md) | | Citations and bibliography | [`CITATION.cff`](CITATION.cff), [`REFERENCES.md`](REFERENCES.md) | @@ -339,10 +339,10 @@ for before-and-after measurements. The local release comparison is: just performance-local ``` -It writes `target/bench-reports/performance.md` without changing committed -release documentation or requiring a version bump. Staged and unstaged changes -to tracked files participate; untracked files are excluded, so stage any new -benchmark-relevant file first. Treat regressions as design feedback. If a +It writes `target/bench-reports/full/report.md` without changing committed +release documentation or requiring a version bump. Tracked changes and +nonignored untracked regular files participate; keep scratch output under +ignored `target/`. Treat regressions as design feedback. If a slowdown is intentional, explain the correctness, API clarity, or composability benefit that justifies it. diff --git a/README.md b/README.md index bdc6d62..741d173 100644 --- a/README.md +++ b/README.md @@ -453,6 +453,8 @@ cargo run --locked --example vector_angles ## 📈 Benchmarks (vs nalgebra/faer) + + ![LU solve (factor + solve): median time vs dimension][lu-solve-benchmark] Raw data: @@ -460,6 +462,37 @@ Raw data: Measurement provenance: [docs/assets/bench/vs_linalg_lu_solve_median.provenance.json][benchmark-provenance] +[benchmark-provenance]: https://github.com/acgetchell/la-stack/blob/v0.5.0/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json +[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.5.0/docs/assets/bench/vs_linalg_lu_solve_median.svg + +Run: `634bc9527c2caf0a431a9bdfac082c190e1094f0b29eb6e3f28c4b96961cdec5`. Statistic: median. Unit: ns. + +- la-stack (v0.5.0): current phase, v0.5.0, revision 51868ea4725c1a4790bba4c59341d2113b18b2bb. +- nalgebra (0.35.0): baseline phase, v0.4.6, revision 0215e65763f8eecb4bcad8bf29de4aca67531aa1. +- faer (0.24.4): baseline phase, v0.4.6, revision 0215e65763f8eecb4bcad8bf29de4aca67531aa1. + +| Dimension | la-stack | nalgebra | faer | Speedup vs nalgebra | Speedup vs faer | +| --- | --- | --- | --- | --- | --- | +| 2 | 2.10359
[2.08908, 2.11912] | 4.53894
[4.53141, 4.54661] | 154.45
[153.658, 155.846] | 2.15771× | 73.4219× | +| 3 | 9.93879
[9.92881, 9.95117] | 32.9342
[32.8554, 33.057] | 191.85
[191.206, 192.814] | 3.3137× | 19.3032× | +| 4 | 21.7341
[21.7035, 21.776] | 55.0106
[54.9217, 55.0615] | 221.887
[221.678, 222.673] | 2.53107× | 10.2091× | +| 5 | 49.1031
[49.0318, 49.1659] | 74.629
[74.3476, 74.9906] | 272.864
[272.009, 273.512] | 1.51984× | 5.55695× | +| 8 | 133.665
[133.426, 133.861] | 166.317
[166.02, 166.604] | 374.912
[372.746, 376.096] | 1.24429× | 2.80487× | +| 16 | 750.027
[649.969, 761.453] | 589.011
[586.474, 592.341] | 938.943
[932.02, 944.127] | 0.78532× | 1.25188× | +| 32 | 2829.62
[2819.66, 2837.22] | 2722.74
[2720.98, 2729.21] | 3023.87
[3017.73, 3030.19] | 0.962229× | 1.06865× | +| 64 | 18280.4
[18138, 18489.9] | 13835.1
[13822.9, 13852.2] | 12678.8
[12660.2, 12699.3] | 0.756828× | 0.693573× | + +Median time in ns; brackets show the lower and upper bounds of the **95% confidence interval**. +Speedups are ratios of point estimates; no ratio intervals or significance claims are inferred. + +Selection coverage: + +- la-stack (v0.5.0): 8 selected; 0 unavailable rows; 437 phase cases omitted. Complete evidence is retained independently. +- nalgebra (0.35.0): 8 selected; 0 unavailable rows; 789 phase cases omitted. Complete evidence is retained independently. +- faer (0.24.4): 8 selected; 0 unavailable rows; 789 phase cases omitted. Complete evidence is retained independently. + + + Representative benchmark: `lu_solve` factors the matrix and solves one right-hand side. Median time is lower-is-better, and the “Speedup vs nalgebra/faer” columns divide each peer's median by the la-stack median @@ -472,9 +505,10 @@ correctness guarantees and invariants. Performance claims require comparable before-and-after evidence using the same inputs, configuration, and environment. This snapshot records the measured source state, available CPU model, 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. +correctness-gate result in the linked evidence. The publication workflow +requires complete canonical-dimension coverage and publishes the CSV, SVG, +README table, and evidence links together. Original plot-provenance sidecars +remain available as frozen records. For the full per-kernel comparison methodology, algorithm citations, input construction, and release-comparison workflow details, see @@ -498,36 +532,6 @@ products and covers both well-separated and inconclusive dot/affine-difference filters at D=4. Run it with `just bench-linear-form`; exact small-integer fixture expectations are validated outside the timed closures. - - -Run: `634bc9527c2caf0a431a9bdfac082c190e1094f0b29eb6e3f28c4b96961cdec5`. Statistic: median. Unit: ns. - -- la-stack (v0.5.0): current phase, v0.5.0, revision 51868ea4725c1a4790bba4c59341d2113b18b2bb. -- nalgebra (0.35.0): baseline phase, v0.4.6, revision 0215e65763f8eecb4bcad8bf29de4aca67531aa1. -- faer (0.24.4): baseline phase, v0.4.6, revision 0215e65763f8eecb4bcad8bf29de4aca67531aa1. - -| Dimension | la-stack | nalgebra | faer | Speedup vs nalgebra | Speedup vs faer | -| --- | --- | --- | --- | --- | --- | -| 2 | 2.10359
[2.08908, 2.11912] | 4.53894
[4.53141, 4.54661] | 154.45
[153.658, 155.846] | 2.15771× | 73.4219× | -| 3 | 9.93879
[9.92881, 9.95117] | 32.9342
[32.8554, 33.057] | 191.85
[191.206, 192.814] | 3.3137× | 19.3032× | -| 4 | 21.7341
[21.7035, 21.776] | 55.0106
[54.9217, 55.0615] | 221.887
[221.678, 222.673] | 2.53107× | 10.2091× | -| 5 | 49.1031
[49.0318, 49.1659] | 74.629
[74.3476, 74.9906] | 272.864
[272.009, 273.512] | 1.51984× | 5.55695× | -| 8 | 133.665
[133.426, 133.861] | 166.317
[166.02, 166.604] | 374.912
[372.746, 376.096] | 1.24429× | 2.80487× | -| 16 | 750.027
[649.969, 761.453] | 589.011
[586.474, 592.341] | 938.943
[932.02, 944.127] | 0.78532× | 1.25188× | -| 32 | 2829.62
[2819.66, 2837.22] | 2722.74
[2720.98, 2729.21] | 3023.87
[3017.73, 3030.19] | 0.962229× | 1.06865× | -| 64 | 18280.4
[18138, 18489.9] | 13835.1
[13822.9, 13852.2] | 12678.8
[12660.2, 12699.3] | 0.756828× | 0.693573× | - -Median time in ns; brackets show the lower and upper bounds of the **95% confidence interval**. -Speedups are ratios of point estimates; no ratio intervals or significance claims are inferred. - -Selection coverage: - -- la-stack (v0.5.0): 8 selected; 0 unavailable rows; 437 phase cases omitted. Complete evidence is retained independently. -- nalgebra (0.35.0): 8 selected; 0 unavailable rows; 789 phase cases omitted. Complete evidence is retained independently. -- faer (0.24.4): 8 selected; 0 unavailable rows; 789 phase cases omitted. Complete evidence is retained independently. - - - ## 🤝 Contributing See [CONTRIBUTING.md](https://github.com/acgetchell/la-stack/blob/main/CONTRIBUTING.md) @@ -562,7 +566,6 @@ BSD 3-Clause License. See [LICENSE](https://github.com/acgetchell/la-stack/blob/ [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.5.0/docs/assets/bench/vs_linalg_lu_solve_median.provenance.json [benchmarks-badge]: https://github.com/acgetchell/la-stack/actions/workflows/benchmarks.yml/badge.svg [benchmarks-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/benchmarks.yml [clippy-badge]: https://github.com/acgetchell/la-stack/actions/workflows/rust-clippy.yml/badge.svg @@ -573,7 +576,6 @@ BSD 3-Clause License. See [LICENSE](https://github.com/acgetchell/la-stack/blob/ [coverage-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/codecov.yml [dependabot-badge]: https://github.com/acgetchell/la-stack/actions/workflows/dependabot-auto-merge.yml/badge.svg [dependabot-workflow]: https://github.com/acgetchell/la-stack/actions/workflows/dependabot-auto-merge.yml -[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/v0.5.0/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 diff --git a/docs/BENCHMARKING.md b/docs/BENCHMARKING.md index d9a41f1..3d083b7 100644 --- a/docs/BENCHMARKING.md +++ b/docs/BENCHMARKING.md @@ -23,49 +23,33 @@ the commands measure and where their outputs go. ## Start Here -For explicit release comparisons, set `CURRENT_TAG` and `PREVIOUS_TAG` to the -stable tags you want to compare. Omit both arguments to use each recipe's -documented defaults. These variables keep command examples independent of the -next release; measured artifact links and historical reports retain their tags. +Run `just performance-prepare` before measurements to fetch the release tags. +This explicit Git operation and the measurement recipes' temporary worktrees +require authorization. Both labels of new measurements must be v0.5.0 or newer. | Goal | Recipe | -|------|--------| -| Latest-release local audit | `just performance-local` | -| Non-exact release-signal check against tags | `just performance-local-non-exact "$CURRENT_TAG" "$PREVIOUS_TAG"` | -| Fast saved-baseline loop | `just bench-save-baseline ` then `just bench-compare ` | -| Full crate comparison | `just bench-vs-linalg` | +| --- | --- | +| Working tree versus latest release | `just performance-local` | +| Non-exact working tree versus latest release | `just performance-local-non-exact` | +| Two existing tags, full or non-exact | `just performance-measure "$CURRENT_TAG" "$PREVIOUS_TAG" full` | +| Fast saved-baseline loop | `just bench-save-baseline `, then `just bench-compare ` | +| Native comparison suite | `just bench-vs-linalg` | | Interval determinant filter | `just bench-interval` | | Certified dot/linear-form filter | `just bench-linear-form` | -| README table and plot | `just performance-release` then `just performance-readme` | -| Release report | `just performance-release "$CURRENT_TAG" "$PREVIOUS_TAG"` | -| Build docs from retained release inputs | `just performance-doc` | - -Rule of thumb: - -- Use `performance-local*` for clean, self-contained answers. -- Use `bench-save-*` plus `bench-compare` for tight local optimization loops. -- Use `plot-vs-linalg` to render dimension plots from a retained complete run. -- Use `performance-release` only when preparing committed release artifacts. -- After `performance-release`, use `performance-readme` to publish its - retained crate-to-crate measurements without benchmarking again. -- Use `performance-doc` for report-format changes after a valid, promotable - comparison dataset has already been retained. - -The three canonical workflows compose around one artifact schema, metric set, -and renderer: - -| Recipe | Measure | Retain complete-run JSON | Promote release docs | -|--------|---------|-----------------|----------------------| -| `performance-local` | Yes | Yes | No | -| `performance-doc` | No | Consumes retained inputs | Yes | -| `performance-release` | Yes | Yes | Yes | - -For a distinct release pair with no intervening source or configuration changes, -running `performance-local` followed by `performance-doc` produces the same -report and committed documentation as `performance-release`. -`performance-release` exists as the safer one-step release operation: it keeps -fresh measurement, validated artifact publication, and rollback-capable document -promotion in one command. +| Measure and promote a release report | `just performance-release` | +| Promote an explicit full scratch run | `just performance-promote` | +| Render the retained release report offline | `just performance-doc` | + +`performance-local*` creates scratch evidence. `performance-promote` selects +that scratch pair explicitly and requires a distinct release pair. +`performance-doc` selects archived evidence explicitly. Missing or incomplete +scratch cannot silently select history. `performance-release` composes fresh +full measurement and promotion; a failed measurement stops before promotion. + +README and plot publication require independent current/baseline tag and full +commit assertions. The commands are shown below. Keep those assertions from the +reviewed source checkouts or workflow inputs, rather than reading them from the +evidence being validated. ## Benchmark Suites @@ -169,307 +153,206 @@ release-to-release report schema. ### Compare Current Code With The Latest Release -Use this when you want a clean local answer to "how does this checkout compare -with the latest published release?" - ```bash +just performance-prepare just performance-local ``` -This creates isolated temporary worktrees and runs both library revisions on the -same machine with the current checkout's benchmark sources, manifests, lockfile, -benchmark-input tests, native Just recipes, measurement configuration, and Rust -toolchain. The declarations live in `tooling/performance.just` and -`tooling/performance.toml`; `tooling/performance-report.toml` owns shared report -and retention paths. Current example sources are -also copied so Cargo can resolve every target declared by the shared manifest; -the comparison does not build or time those examples. Staged and unstaged changes -to tracked files are applied to the current worktree. Untracked files are -excluded; stage a new file before running the command if it must participate in -the comparison. Only the baseline library implementation comes from the release -tag. Both revisions must pass the same benchmark-input tests used by -`just test-bench-inputs`, via locked Cargo commands, before either timing phase. This is a prerequisite -correctness gate over the deterministic fixtures and operations, not validation -of each timed Criterion sample. It writes -`target/bench-reports/performance.md` plus retained `performance.run.json` and -`performance.evidence.json` complete-run inputs. The Markdown report includes -the run identity and each series' phase, release, and revision. The evidence -JSON retains the CPU, operating system, Rust toolchain, lockfile and harness -digests, Criterion selection/commands, and both correctness-gate results. The -report reader rejects malformed or mismatched provenance and incomplete -selected-suite coverage. - -For the default `all` suite, timing runs occur in this order: - -1. Baseline la-stack, nalgebra, and faer comparison benchmarks. -2. Baseline la-stack exact benchmarks. -3. Current la-stack comparison benchmarks, filtered to `la_stack` names. -4. Current la-stack exact benchmarks. - -La-stack is measured once per revision; the nalgebra/faer measurements from the -baseline phase are reused as peer context. The filtered current run disables -Criterion HTML generation because skipped peer `new` samples are deliberately -absent from the isolated current phase. The retained complete-run inputs and Python -renderer provide the release report. Baseline-saving recipes also disable unused -Criterion plots and HTML without changing sampling. - -New measurements require v0.5.0 or newer on both sides. Earlier releases are -rejected before fetching tags, creating worktrees or discovering benchmarks. -The old API and root-test layout adapters are retired; both phases must contain -every selected report row, including rational-input and norm cases. -Comparison builds cap lint diagnostics at warning for both revisions because -the current manifest's lint policy may reject released source that predates a -lint, even though that source remains valid benchmark input. - -Historical reports, raw artifacts and their hashes remain unchanged. The -measurement floor does not prevent offline rendering of retained complete runs -that satisfy the modern scientific policy. Older records requiring retired API -adapters remain readable directly in their original formats. - -This command does not depend on existing local `target/criterion/` baselines. -It is slower than reusing a saved baseline, but less sensitive to stale local -benchmark state. - -The workflow streams its correctness-gate, Cargo, and Criterion output as each -phase runs. `[performance]` markers identify baseline validation, baseline -timing, current validation, and current timing, so a long comparison exposes -completed samples and its active phase instead of remaining silent until the -final report is rendered. - -The local report may compare a checkout whose package version is identical to -the latest published release. Commit/ref and source-state provenance distinguish -the modified checkout from the tagged baseline even though both display the same -package version. Release artifact publication remains stricter and requires two -distinct release identifiers. - -### Compare Current Code With A Specific Release - -For a narrower non-exact check against a known release pair, run: +This compares the current working tree with the latest stable GitHub release. +The shared snapshot includes tracked changes and nonignored untracked regular +files, and rechecks them before publishing measurement outputs. This replaces +the former tracked-only snapshot policy. Keep generated files under ignored +`target/`; symlinks, junctions and submodules are outside this snapshot contract. + +Both sources use the captured current harness, dependency lock and toolchain. +The declarations in `tooling/measurements/full.toml` and +`tooling/performance.just` select the native host target and recorded Rust +code-generation settings. Inherited Rust flag, compiler-wrapper or target +overrides do not customize these recipes. Edit and review the declarations for +a different measurement environment. + +The shared engine discovers complete native inventories on both sources, checks +independent required scientific IDs, and runs both correctness gates before any +timing. The gates cover `vs_linalg_inputs` and `exact_bench_config`. +Baseline measurements include nalgebra and faer; current measurements reuse +those baseline-phase peers and measure la-stack and the exact suite. Diagnostic +cases remain in the complete samples even when omitted from selected report rows. + +Every case requires 100 samples, mean and median estimates, 95% confidence +intervals and nanoseconds. Host, CPU, architecture, tool versions, dependencies, +source/harness membership and hashes, commands, environments, discovery and +acquisition declarations are retained with the run. Runs with incompatible +required provenance are rejected. + +Outputs are `target/bench-reports/full/{run.json,evidence.json,report.md}`. +They survive worktree cleanup. Same-version local comparisons require distinct +source identities and cannot be promoted as release documentation. + +For a shorter comparison that omits the exact suite: ```bash -just performance-local-non-exact "$CURRENT_TAG" "$PREVIOUS_TAG" +just performance-local-non-exact ``` -This generates a local `$PREVIOUS_TAG` `vs_linalg` baseline, measures the current -la-stack `vs_linalg` rows, and renders a `vs_linalg` report. The report includes -saved baseline nalgebra/faer timings as context where matching peer rows exist, -without rerunning current peer crates. +It uses `tooling/measurements/non-exact.toml` and writes the separate +`target/bench-reports/non-exact/` bundle. It retains the same sampling, +correctness gates and original reference phases. -This narrowed peer-context view uses the same metrics and renderer but writes a -separate `performance-non-exact.*` scratch bundle so it cannot replace the -canonical full comparison inputs accidentally. +### Compare Current Code With A Specific Release -When tags are provided explicitly, the current tag must match the package -version in the `HEAD` checkout. A mismatch is rejected before tags are fetched, -worktrees are created, or benchmarks run. +The installed explicit-tag mode measures two existing immutable tags: -### Iterate Against A Local Saved Baseline +```bash +just performance-measure "$CURRENT_TAG" "$PREVIOUS_TAG" full +just performance-measure "$CURRENT_TAG" "$PREVIOUS_TAG" non-exact +``` -Use local saved baselines when tuning one kernel and comparing several edits -against the same starting point. These baselines are local scratch data, not -release artifacts. +Use `performance-local*` for working-tree changes against the latest release. +The old positional labels on `performance-local-non-exact` and the local +`--suite`/`--scope` adapter flags are retired. Full and non-exact selection now +uses named declarations. To include an open-ended report selection, maintain a +named measurement declaration using the shared `series.select` contract; +selection never weakens complete sampling or the independent required inventory. -For example, before optimizing `Matrix::norm_inf`, save a named baseline: +### Iterate Against A Local Saved Baseline ```bash -just bench-save-baseline inf-norm-before vs_linalg +just bench-save-baseline before vs_linalg +# Make the change, then measure again. +just bench-vs-linalg +just bench-compare before ``` -Then make a change, rerun only the current measurements you care about, and -compare: +This is exploratory saved-Criterion comparison. It includes added and omitted +rows and does not establish common-harness release eligibility. Use +`performance-local` for that gate. Native Criterion reports remain useful for +individual benchmarks. + +The hosted release workflow discovers the full inventory, measures each suite +once, saves its requested baseline name and verifies exact saved copies before +packaging. The installed verifier is also available directly: ```bash -just bench-vs-linalg-la-stack -just bench-compare inf-norm-before +just bench-release-check "$CURRENT_TAG" target/criterion ``` -The `just bench-compare ` recipe calls the installed shared Criterion -comparison CLI. It reports every available row, additions and omissions; old -suite/scope flags are retired. These exploratory ratios do not validate a common -harness or scientific release eligibility. Use `performance-local` for that gate. +The second argument explicitly selects the root-relative Criterion home. +`tooling/criterion-saved.toml` independently declares required scientific IDs +and their canonical storage paths. Fresh and saved samples must contain the +same exact `benchmark.json`, `estimates.json`, `sample.json` and +`tukey.json` bytes. A shortened discovery inventory or matching samples at +the wrong path are errors. -`just bench-save-baseline ` writes Criterion samples under -`target/criterion/`. `just bench-save-last` saves the conventional local -baseline named `last`, which enables shortcuts such as: +### Update The README nalgebra/faer Table + +After promoting a full release comparison, supply the source identities +captured independently before measurement: ```bash -just bench-latest-vs-last -just bench-vs-linalg-latest-vs -just bench-compare +just performance-readme "$CURRENT_TAG" "$CURRENT_COMMIT" "$PREVIOUS_TAG" "$PREVIOUS_COMMIT" ``` -Saved baselines persist across `git checkout` but not across `cargo clean`, and -they are not pushed to GitHub. A manually saved baseline is comparable only when -its harness has not changed; use `performance-local` for a checked -revision-to-revision comparison. +The canonical README view is LU solve, median, logarithmic time axis, declared +in `tooling/performance-readme.toml`. It selects archived evidence and checks +release eligibility, current source/harness membership and hashes, package and +report release references, and existing-tag artifact identity. The current +release may be prospective; tag-pinned links become available when its reviewed +tag is pushed. -### Update The README nalgebra/faer Table +The installed publisher formats and checks the candidate README before replacing +the document and CSV/SVG together. The complete-run payload and evidence envelope +supply provenance links; new publication does not create a redundant plot JSON +sidecar. Original sidecars remain frozen. The table retains recorded intervals, +a confidence legend, versioned originating series and explicit peer/library +ratio direction. -The README benchmark table and SVG plot are derived from the retained release -comparison. Generate and validate that comparison first, then publish its -crate-to-crate measurements: +For plot/CSV-only output, select a named view and input source: ```bash -just performance-release -just performance-readme +just plot-vs-linalg "$CURRENT_TAG" "$CURRENT_COMMIT" "$PREVIOUS_TAG" "$PREVIOUS_COMMIT" dot-mean-log retained +just plot-vs-linalg "$CURRENT_TAG" "$CURRENT_COMMIT" "$PREVIOUS_TAG" "$PREVIOUS_COMMIT" lu_solve-median-linear scratch +just plot-vs-linalg "$CURRENT_TAG" "$CURRENT_COMMIT" "$PREVIOUS_TAG" "$PREVIOUS_COMMIT" lu_solve-median-log non-exact ``` -`performance-readme` does not run benchmarks. It loads the canonical -`target/bench-reports/performance.run.json` and its evidence envelope retained by -`performance-release`, falling back to the validated retained complete-run history when -all scratch inputs are absent. It then uses the current la-stack result and the peer -nalgebra/faer results measured by that same shared current harness. It requires -all three timings for every canonical dimension (D=2, 3, 4, 5, 8, 16, 32, and -64) before updating: - -- `README.md` -- `docs/assets/bench/vs_linalg_lu_solve_median.csv` -- `docs/assets/bench/vs_linalg_lu_solve_median.svg` -- `docs/assets/bench/vs_linalg_lu_solve_median.provenance.json` - -The publisher verifies the complete-run identity, release version, current -source and harness inventories/digests, dependency resolution, complete peer -coverage, and recorded phase provenance before writing. The derived sidecar -records the run identity and the actual current/baseline origins of each series. -Historical CSV/JSON evidence remains frozen with its original provenance. -The README table shows median times in nanoseconds, with lower and upper 95% -confidence bounds below each timing. Its compact comparison columns show -speedup ratios; the recorded confidence level is stated once in the table caption. -Shared `RunTableStyle` options produce this layout directly. Timing headings retain -measured versions, and each speedup names its peer-time numerator and la-stack-time -denominator. Ratios remain point estimates without ratio intervals or significance claims. -Missing, stale, or inconsistent input aborts publication atomically. -An existing local release tag must contain the exact selected asset bytes. -A future release tag may be absent during release preparation. - -`plot-vs-linalg` renders the same complete-run selection without editing README. -The raw-Criterion/gnuplot renderer and CSV-to-README transport are retired after -complete-run integration parity. Historical figures and CSV/JSON remain unchanged; -they cannot be relabeled as complete runs. Raw exploratory timing reports remain -available through Criterion and `bench-compare`. Dimension publication requires -all canonical dimensions and uses the shared SVG, long-form CSV and table -renderers, with configured selections in `tooling/performance-plot.toml`. - -See `uv run --locked scripts/archive_performance.py plot --help` for plotting options. +View names combine a metric, `mean` or `median`, and `linear` or `log`. +Metrics are `det_from_lu`, `det_via_lu`, `dot`, `inf_norm`, `lu`, +`lu_solve`, `norm2_sq` and `solve_from_lu`. All 32 views have static +declarations under each of `tooling/plots/non-exact/`, +`tooling/plots/retained/` and `tooling/plots/scratch/`. Scratch views consume +the full scratch pair; retained views work after scratch cleanup. Non-exact +views consume the non-exact scratch pair and use separate +`vs_linalg_non_exact_*` output paths. The old separate metric/statistic, +`sample=new` and boolean log arguments are replaced by this named view. +There is no implicit input fallback. + +Plots preserve scientific coordinates, nanoseconds, the selected statistic +and original baseline-phase peers. They render evidence without measuring or +probing the current host. Independent identity and measurement-policy checks +still apply. README publication additionally requires live source freshness. ### Create The Release Performance Report -Release PRs promote one complete release-to-release comparison into committed -docs: +After updating the package version and fetching tags: + +```bash +just performance-release +``` + +With no labels, the installed CLI infers the current package's release pair +using publication chronology. A prospective version compares the working tree +with the latest release; a published version compares existing tags. Explicit +labels select existing tags: ```bash just performance-release "$CURRENT_TAG" "$PREVIOUS_TAG" ``` -With no arguments, `just performance-release` infers the current release tag -from `Cargo.toml` and discovers the previous stable published release. During -release preparation, passing both tags explicitly removes ambiguity. - -This command uses the shared common-harness engine in isolated worktrees. -The native driver resolves `CRITERION_HOME` from each checkout root before -Cargo launches the benchmarks, keeping comparison-member and root-package -measurements in one output tree. -Each timing command has a four-hour timeout because `baseline-all` combines both -full suites. This accommodates the combined 150-minute comparison and 90-minute -exact-suite budgets described under [Hosted Release Runtime Budget](#hosted-release-runtime-budget). -The native Criterion inventory declares every expected semantic ID, including -diagnostics outside the selected report. Each case requires 100 raw samples, -both mean and median estimates, and complete 95% intervals in nanoseconds. -The consumer declares canonical report rows and baseline-only nalgebra/faer -reference series. Both phases must include every selected la-stack row; -missing baseline rows fail validation. - -Scratch evidence uses `performance.run.json` and `performance.evidence.json` -under `target/bench-reports/`. These preserve raw Criterion JSON, both source -identities, one captured harness identity, commands, environments, toolchain, -dependency versions, host identity, and independent gate results. - -Promotion publishes immutable `run.json`, `evidence.json`, and `report.md` -under `docs/performance-runs/runs//`, plus the shared index, latest -pointer, history index, and `docs/performance.md` in one transaction. -Repeated runs for one release pair coexist. `tooling/performance-report.toml` -selects the current report path and title. The shared renderer produces mean -and median tables with named series and recorded marginal intervals; unavailable -cases appear as an em dash. Each series identifies its measurement phase, -release, and revision. Full environment, harness, command, and gate provenance -remains in that run's `evidence.json`, beside `run.json` and `report.md`. -New reports no longer use the custom percentage-change, ratio, or interval-overlap -columns. README publication uses the shared coordinate SVG, long-form timing CSV -and per-series estimate table, retaining nanoseconds, intervals and original phases. -Serialization, validation, rendering, and promotion failures preserve existing -published reports and selection. Review and commit the whole new run and index. -Legacy snapshots under `docs/performance/` retain their original bytes, -hashes and framing; see the [legacy index](performance/README.md). -Their custom writers, report renderer and CSV conversion declaration are retired. -Read their original CSV/JSON and archived reports directly. They cannot reconstruct -raw samples or supply complete-run provenance. Publication accepts the declared -Just phase format; replay of the retired Python phase driver is unsupported. -The last published legacy report is preserved in the -[Markdown archive](archive/performance/README.md). The checked-in current report -keeps its historical format until a complete run is promoted; old summaries do -not contain the raw samples required to reconstruct complete-run evidence. -Existing history and optimization studies are retained. No automatic pruning is -performed; removing indexed runs requires a coordinated change to the shared -index and latest pointer, while preserving evidence referenced by active reports. - -The Markdown check and format recipes exclude the generated -`docs/performance-runs/` archive and `docs/performance.md` because these outputs -belong to the shared renderer. Shared validation requires exact retained report -bytes. Keep both recipe exclusions aligned with `archive` and `current` in -`tooling/performance-report.toml` when relocating them. - -To reproduce and promote the report without running Cargo or creating Git -worktrees, use: +The shared release report configuration requires the full measurement policy, +independent eligibility and distinct release labels. Non-exact runs retain +their local report and plot workflow. Successful promotion writes the immutable complete +run, evidence envelope and report under `docs/performance-runs/runs//`, +and updates the indexes, latest pointer and `docs/performance.md` in a single +publication transaction. Repeated measurements coexist. + +To promote an already measured full scratch pair or rerender retained history: ```bash +just performance-promote just performance-doc ``` -This command fails closed on a missing, partial, malformed, mismatched, or -unsupported artifact pair. It consumes the default complete-run payload/envelope -or follows the validated `docs/performance-runs/latest.json` when all scratch -inputs are absent. Legacy-only input fails with a missing complete-run error; -run `performance-release` to create the supported replacement. Frozen historical -reports remain readable directly. Report replay runs offline and updates the current -document and shared history transactionally. Promotion requires distinct -current and baseline package versions, so a same-version local comparison is -retained and reproducible but cannot become release documentation. Use promotion -for presentation-only report corrections; changes to benchmark inputs, code, -toolchains, or measurement configuration require a fresh local or release run. - -The historical `performance-github-assets` comparison command is retired. -Published Criterion archives remain available as original release artifacts; -their missing source, host and gate provenance is not reconstructed. Use -`performance-local` or `performance-release` for new checked comparisons. +Those commands deliberately select different inputs. A partial scratch pair +fails `performance-promote`; it never triggers a retained-history fallback. + +Historical reports, plots, CSV/JSON, indexes and immutable complete runs keep +their original bytes and links during this migration. The existing +v0.5.0/v0.4.6 comparison lacks the newer acquisition declaration and is now a +frozen record, with no regeneration requirement. Current publication checks +must not be relaxed and missing provenance must not be invented to replay it. +Future runs acquired with the current declarations support offline rendering. + +The metadata-free `performance-github-assets` command and historical benchmark +execution compatibility remain retired. Published release assets remain +downloadable as original records. ## Output Locations -| Path | Committed? | Producer | Purpose | -|------|------------|----------|---------| -| `target/criterion/` | No | `cargo bench`, `bench-save-*` | Local Criterion measurements and named baselines. | -| `target/bench-reports/performance.md` | No | `bench-compare`, `performance-local`, `performance-release`, `performance-doc` | Canonical local comparison report. | -| `target/bench-reports/performance.run.json` | No | `performance-local`, `performance-release` | Complete native cases, samples, and named phase series. | -| `target/bench-reports/performance.evidence.json` | No | `performance-local`, `performance-release` | Shared evidence envelope with source/harness and phase provenance. | -| `target/bench-reports/performance-non-exact.*` | No | `performance-local-non-exact` | Narrowed non-exact report and retained peer-context comparison inputs. | -| `docs/performance.md` | Yes | `performance-release`, `performance-doc` | Current shared full report; last legacy report until complete-run promotion. | -| `docs/performance-runs/` | Yes | `performance-release`, `performance-doc` | Immutable complete runs, reports, index, and validated latest pointer. | -| `docs/performance/` | Yes | Frozen record | Unchanged historical CSV/JSON evidence and hashes. | -| `docs/archive/performance/` | Yes | Frozen record | Preserved reports in the historical format. | -| `docs/archive/performance/studies/` | Yes | Maintainer investigations | Completed optimization studies and decisions. | -| `docs/assets/bench/` | Yes | `performance-readme` | README benchmark CSV/SVG assets and JSON provenance. | -| GitHub Release | Remote | `.github/workflows/release-benchmarks.yml` | Criterion baseline archive. | - -Published baseline assets use the filename -`la-stack-$TAG-criterion-baseline.tar.gz`. - -Everything under `target/bench-reports/` is reproducible local scratch owned by -the performance-report workflows. It survives temporary-worktree cleanup but -may be removed by `just clean` or `cargo clean`. Promoted local snapshots remain -under `docs/performance-runs/`, so report and README regeneration do not require -another measurement run. Unpromoted local experiments remain scratch data. -The saved summaries do not replace the full native Criterion `.tar.gz` archive -attached to each GitHub Release. Hosted archives retain raw samples from a -different machine; local summary comparisons must use their recorded environment. +| Path | Commit? | Owner | +| --- | --- | --- | +| `target/bench-reports/full/` | No | Complete full scratch run, envelope and report | +| `target/bench-reports/non-exact/` | No | Separate non-exact scratch run, envelope and report | +| `target/bench-reports/performance.md` | No | Exploratory `bench-compare` report | +| `docs/performance.md` | Yes | Current promoted release report | +| `docs/performance-runs/` | Yes | Immutable complete runs, reports and retained-history indexes | +| `docs/performance/` | Yes | Frozen historical CSV/JSON evidence | +| `docs/archive/performance/` | Yes | Frozen historical reports and maintained study records | +| `docs/assets/bench/` | Yes | Named-view CSV/SVG outputs and frozen original sidecars | +| `target/criterion/` | No | Native raw Criterion output and saved baselines | + +The Markdown recipes exclude immutable performance history and the generated +current report from formatting. Keep those exclusions aligned with +`tooling/performance-report.toml`. No historical file is normalized to the +current formatter or regenerated by an adoption check. ## `vs_linalg` Methodology diff --git a/docs/RELEASING.md b/docs/RELEASING.md index a616d81..c28cff4 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -112,7 +112,7 @@ and does not update package or citation metadata. Use `just changelog-preview --tag "$TAG" --date "$RELEASE_DATE"` for a read-only preview, and `just changelog-check` to validate the root and every archive. Review the generated changelog and any archive changes. The -[Scripts guide](../scripts/README.md#changelog-and-release-tooling) explains +[Tooling guide](../tooling/README.md#changelog-and-release-tooling) explains the supported `dependency-bodies = "preserve"` policy in `pyproject.toml`, which preserves authored dependency-note links, text, and code without a local template. @@ -129,45 +129,61 @@ original command and `just changelog-check`. ### 4. Generate the release performance comparison -Run this after the package version has been updated: +After updating the package version, fetch the tags and select the previous +stable release shown by GitHub's publication history: ```bash +just performance-prepare +gh release list --exclude-drafts --exclude-pre-releases --json tagName,publishedAt +``` + +Set `PREVIOUS_TAG` to that reviewed baseline. Capture the source commit +assertions independently before measurement: + +```bash +CURRENT_COMMIT=$(git --no-pager rev-parse HEAD) +PREVIOUS_COMMIT=$(git --no-pager rev-parse "$PREVIOUS_TAG^{commit}") just performance-release ``` -The no-argument form compares the current package version with the previous -stable published release. Review the shared report at `docs/performance.md` -and the immutable complete-run evidence, -reports, index, and latest pointer under `docs/performance-runs/`. Include the -entire new run and index changes in the release PR. Shared complete evidence -retains both phases, mean and median estimates, 100 raw samples per case, and -95% intervals. It survives target cleanup and supports offline report/README -replay. Multiple runs for one release pair coexist without rewriting older -evidence. Historical CSV/JSON snapshots under `docs/performance/` remain -readable with unchanged hashes. Results from `performance-local` remain -scratch until explicitly promoted. +The no-argument measurement compares the prospective package version with the +latest stable published release. Review `docs/performance.md` and the complete +new run and index changes under `docs/performance-runs/`. Its current/baseline +tags and commits must match the selected assertions. Both labels must be v0.5.0 +or newer. + +Evidence retains both phases, mean and median estimates, 100 raw samples per +case and 95% intervals. Current declarations record acquisition policy as well +as source/harness provenance. Future runs support offline rendering after +scratch cleanup; `just performance-doc` explicitly selects retained history. +`just performance-promote` explicitly selects the full scratch pair. + +Historical artifacts, including the v0.5.0/v0.4.6 comparison, remain frozen with +their original bytes and links. That older run lacks the new acquisition +declaration and is no longer a regeneration input. Never backfill provenance +or relax current eligibility checks to replay it. ### 5. Refresh the README benchmark comparison ```bash -just performance-readme +just performance-readme "$TAG" "$CURRENT_COMMIT" "$PREVIOUS_TAG" "$PREVIOUS_COMMIT" ``` -This consumes the complete-run payload and evidence envelope retained by -`just performance-release`; it does not run benchmarks again. It atomically -updates the table and tag-pinned benchmark links in `README.md` with the CSV, -SVG, and provenance JSON under `docs/assets/bench/`. Until it succeeds, those -README links continue to reference the previous published artifacts. -After regeneration, the new tag-pinned image and data links become available -when the release tag is pushed. Before then, preview the SVG directly from -`docs/assets/bench/`; a failed image load in the README does not imply that -generation failed. -If scratch inputs were cleaned, it uses the validated -`docs/performance-runs/latest.json` run. Existing -partial or corrupt scratch inputs remain errors and never trigger a fallback. - -See `docs/BENCHMARKING.md` for repair commands, local comparison modes, artifact -ownership, and provenance details. +This consumes archived, release-eligible evidence without benchmarking again. +It verifies the independent identities, current source/harness membership and +hashes, package/report references and existing-tag artifact identity. +The canonical LU-solve median/log view is declared in +`tooling/performance-readme.toml`. + +The installed publisher formats and checks the candidate README before +atomically replacing its benchmark section and CSV/SVG outputs. Links to the +complete-run payload and evidence envelope replace new plot-provenance sidecars; +original sidecars remain unchanged. Tag-pinned links become available when the +release tag is pushed. Until then, preview the SVG directly under +`docs/assets/bench/`. + +See [Benchmarking](BENCHMARKING.md) for explicit scratch versus retained plot +inputs, named metric/statistic/axis views, output ownership and methodology. ### 6. Validate the release branch @@ -321,7 +337,7 @@ release ID and tag commit before attaching the archive. Do not edit the draft, move the tag, or publish manually while the workflow is running. -The privileged jobs install the exact published `research-repo-tools==0.2.0` +The privileged jobs install the exact published `research-repo-tools==0.2.2` package on Python 3.15 without repository checkout. Preflight emits versioned target JSON with the captured ID, commit and title assertion. Its trusted job output passes directly to the publisher, separately from the producer's inert diff --git a/docs/code_organization.md b/docs/code_organization.md index d6d16a9..8592f17 100644 --- a/docs/code_organization.md +++ b/docs/code_organization.md @@ -93,7 +93,7 @@ The [Cargo manifest](../Cargo.toml) owns feature and dependency declarations. workspace packages. - `tests/semgrep/` contains deliberate static-analysis fixtures, not ordinary runnable API examples. -- Python tests live under `scripts/tests/` and run with pytest through +- Python tests live under `tooling/tests/` and run with pytest through `just test-python` or the aggregate validation workflows. - `examples/` contains complete runnable workflows. README mirrors and public guide doctests live in `src/lib.rs`. @@ -124,16 +124,16 @@ it with `just bench-vs-linalg` or Cargo's `-p la-stack-comparison`. Both package inherit the root workspace lints and share the lockfile and target directory. The [Benchmarking guide](BENCHMARKING.md) owns benchmark commands, methodology, -baselines, output locations, and report promotion. The [Scripts guide](../scripts/README.md) -owns the Python script inventory and entry points for comparisons and plotting. +baselines, output locations, and report promotion. The [Tooling guide](../tooling/README.md) +owns the performance declaration inventory, consumer-test scope, and recipe ownership. The pinned published `research-repo-tools` dependency owns changelog generation, normalization, minor-series archiving, note lookup, and tag preparation through its CLI. Consumer identity and dependency-body policy stay in `[tool.research-repo-tools.changelog]` in `pyproject.toml`, with formatting in `changelog-rumdl.toml`; no common template is copied locally. -focused integration checks live in `scripts/tests/test_changelog_integration.py`. +Focused integration checks live in `tooling/tests/test_changelog_integration.py`. The same dependency owns CodeRabbit review orchestration through thin Just -wrappers. `scripts/tests/test_review_integration.py` owns consumer wiring checks +wrappers. `tooling/tests/test_review_integration.py` owns consumer wiring checks with local stubs; the [contributor review workflow](../CONTRIBUTING.md#coderabbit-review) owns prerequisites and invocation policy. The [justfile](../justfile) owns executable development workflows. @@ -144,7 +144,7 @@ and review policy belong in [Security Checks](../SECURITY.md#security-checks). The shared package also owns managed tool installation, verification, and update implementation. `.python-version`, `rust-toolchain.toml`, and `pyproject.toml` -own consumer declarations; `scripts/tests/test_toolchain_integration.py` checks +own consumer declarations; `tooling/tests/test_toolchain_integration.py` checks the exact published pin, registry lock, installed version and distribution hashes, alongside actual recipe sequencing and native managed execution. The `.github/actions/setup-tools/action.yml` composite synchronizes the locked PyPI @@ -152,9 +152,9 @@ package and exports verified paths for CI. Release callers disable its caches. Release metadata, version checks, Markdown line checks, and Semgrep fixture validation also belong to the shared CLI. Consumer policy stays in -`pyproject.toml`; `scripts/tests/test_maintenance_integration.py` verifies the +`pyproject.toml`; `tooling/tests/test_maintenance_integration.py` verifies the actual release selectors and preservation of scientific evidence. -`scripts/tests/test_cargo_update_integration.py` exercises native dependency +`tooling/tests/test_cargo_update_integration.py` exercises native dependency upgrades and coupled exclusions against a disposable local registry. The shared package also owns process discovery, captured/live execution, exact @@ -167,7 +167,7 @@ Performance consumers use shared Criterion parsing and estimate/comparison validation, digest verification, archive extraction, byte-preserving document sections, and multi-file transactions. Shared rendering produces complete-run reports, coordinate SVG, timing CSV and document tables. Historical artifact -bytes and fingerprint framing remain frozen and readable directly. Published v0.2.0 +bytes and fingerprint framing remain frozen and readable directly. Published v0.2.2 owns common-harness orchestration, completeness, worktrees, complete run retention, validated latest selection, and transactional report publication. Its `RunTableStyle` API owns compact README table formatting; the consumer selects @@ -185,29 +185,33 @@ minimum scientific report/plot coverage. `tooling/criterion-saved.toml` declares complete saved-sample requirements. Shared discovery and saved-sample APIs own inventory parsing and exact raw-file verification. The release workflow packages only datasets that pass that gate; its regression and archive tests live in -`scripts/tests/test_release_baseline.py`. - -`tooling/performance.just` declares native Cargo commands, features, and input -gates for both local measurements and release inventories. -`tooling/performance.toml` uses the shared measurement schema for source/harness -inputs, probes, timeouts, and compatibility fields. -`tooling/performance-policy.toml` owns the scientific metric catalog, exact groups, -peer mappings and the minimum release for new measurements. `scripts/performance_runs.py` -binds those declarations to scientific coverage, measurement eligibility and -named reference-phase assertions. `scripts/archive_performance.py` composes -shared APIs for tracked-only measurements and la-stack README publication. -Old API cfg and root-test layout adapters and the metadata-free historical -asset comparison command are retired; original archives remain unchanged. -`tooling/performance-plot.toml` declares dimensions, units, series and axes. -`tooling/performance-report.toml` owns the canonical report path, title, and shared history path. -The obsolete CSV conversion declaration and pre-Just Python phase replay are removed. -The old comparison renderer, CSV/provenance writer, summary reader, plotter, -release-inventory wrapper and Python packaging are removed. Only the two -consumer adapters remain; `scripts/tests/test_performance_workflow.py` verifies -installed-package integration and offline replay. Shared renderers preserve the -figure’s scientific coordinates, units and originating series. The -[adoption record](dev/performance-tooling-adoption.md) owns retained-helper -dispositions, Python 3.15 review and native validation gates. +`tooling/tests/test_release_baseline.py`. + +`tooling/performance.just` declares native Cargo discovery, correctness gates +and measurements. `tooling/measurements/{full,non-exact}.toml` declares the +minimum release, complete sampling, independent required cases, original +baseline-phase peers, sources, harness, probes, environment and compatibility. +`tooling/performance-policy.toml` remains the independent scientific catalog +used by consumer acceptance tests; runtime commands consume the shared schemas. + +`tooling/performance-report.toml` binds release eligibility to the full +measurement declaration and owns the current report and immutable history. +`tooling/performance-readme.toml` declares the canonical README view, formatter, +freshness checks and tagged evidence links. Static named configurations under +`tooling/plots/{non-exact,retained,scratch}/` preserve eight metrics, mean/median and +linear/log choices with explicit input ownership. + +Both production Python adapters and the root `scripts/` directory are retired. +The installed CLI owns orchestration, validation and publication transactions. +Working-tree measurements now include nonignored untracked regular files. +`tooling/tests/test_performance_workflow.py` exercises actual recipes and +scientific policy. Shared failure matrices remain upstream. The +[adoption record](dev/performance-tooling-adoption.md) records replacement +ownership and native validation gates. + +Original artifacts, including the v0.5.0/v0.4.6 complete run, remain frozen +without regeneration or invented acquisition records. New complete runs +support offline rendering through the declared eligibility policy. `tooling/semgrep/` owns a locked Python 3.14 environment for Semgrep 1.180.0 while its wheels exclude Python 3.15. Local scans, shared fixture validation @@ -224,7 +228,7 @@ input validation, and inventory under the release workflow's shared setup timeou Cargo dry-run, deployment approval and OIDC upload. The publishing declaration in `pyproject.toml` selects `la-stack`, native checks and the Criterion asset; shared release gates own generic identity, ancestry and registry checks. -`scripts/tests/test_release_publishing.py` owns installed-package consumer checks +`tooling/tests/test_release_publishing.py` owns installed-package consumer checks and upload-barrier tests. The [release guide](RELEASING.md) owns account setup, manual publication, registry verification and recovery. diff --git a/docs/dev/docs.md b/docs/dev/docs.md index 07a9bf7..930c56e 100644 --- a/docs/dev/docs.md +++ b/docs/dev/docs.md @@ -134,6 +134,11 @@ semantics in the linked guide when shortening a README section. executable examples with the default and matching feature doctest recipes. - Ordinary Markdown changes use `just markdown-fix` and `just markdown-ci`; the latter includes Markdown and spelling checks. +- README uses rumdl's Markdown-aware line limit because the shared benchmark + publisher emits full immutable evidence URLs. It remains subject to Markdown + formatting, prose length, syntax, and link checks, but is excluded from the + separate 160-character raw-source line check. Other active documents retain + that additional check; generated reports retain their existing exclusions. ## Scientific notation and references diff --git a/docs/dev/performance-tooling-adoption.md b/docs/dev/performance-tooling-adoption.md index d8c97ce..05129ad 100644 --- a/docs/dev/performance-tooling-adoption.md +++ b/docs/dev/performance-tooling-adoption.md @@ -1,154 +1,158 @@ # Performance tooling adoption -This records [#276](https://github.com/acgetchell/la-stack/issues/276) against -the published `research-repo-tools==0.1.9` base package. No extras are required. -Publication prerequisite [upstream #99](https://github.com/acgetchell/research-repo-tools/issues/99) -is closed. PyPI's unyanked wheel and sdist hashes match the exact lockfile entries; -runtime code comes from the installed package. - -## Capability disposition - -Follow-up [#285](https://github.com/acgetchell/la-stack/issues/285) adopts the -published `research-repo-tools==0.2.0` wheel and sdist, including -[upstream #110](https://github.com/acgetchell/research-repo-tools/issues/110). -The exact PyPI pin and lock replace v0.1.9; the package also advances its required -Just dependency to v1.59.0. `RunTableStyle` now supplies the six-column README -layout directly, so `_readme_table()` and its Markdown string/column rewrites -are removed. The shared renderer retains recorded intervals, the selected -statistic, confidence level and explicit ratio direction. Scientific selection, -original reference phases, README markers, evidence freshness and transactional -asset pointers remain consumer responsibilities. - -Offline consumer checks exercise the actual `performance-readme` recipe with -mean and median estimates, original peer phases, retained history and the README -figure. No new measurements or regenerated immutable reports are required. -Offline rendering of the retained published run preserves its SVG and CSV bytes. -Current README republication still rejects the stale source digest and leaves -the figure and measured-asset pointers untouched. -The obsolete CSV conversion declaration and pre-Just Python phase replay are -removed. Retained complete runs use the declared Just driver; original legacy -CSV/JSON and Markdown records remain available without regeneration or conversion. -Closure of #285 requires native Linux/macOS/Windows CI on the adoption commit; -local validation alone does not establish those results. - -| Upstream capability | Consumer adoption | Local responsibility | -| --- | --- | --- | -| #94 captured targets | Installed release-target CLI passes versioned JSON from trusted preflight to writer | Dispatch/ref equality, current attempt, title, privilege separation, asset filename and explicit publication | -| #95 coordinate plots | Shared coordinate SVG, table and CSV renderers | Scientific metric mappings, dimensions, nanoseconds and original phases | -| #96 provenance reports | Shared renderer 2 and publication-relative evidence links | Scientific eligibility and frozen historical records | -| #97 complete-run sections | Shared presentation and publication transaction | README markers, measured-asset pointers and current source/harness checks | -| #98 Criterion verification | Declarative shared discovery, versioned inventory and saved-sample APIs | Full Cargo suites/features, minimum scientific coverage and correctness gates | -| #110 compact table styles | Installed `RunTableStyle` selects headings, intervals, confidence caption and ratio-only columns | Scientific selections, ratio pairs and README publication policy | +[#296](https://github.com/acgetchell/la-stack/issues/296) completes the shared +performance-tooling migration begun in #276 and #285. The consumer retains +scientific declarations, native correctness gates, and installed-package +integration tests. Generic execution, validation, rendering, and publication +belong to research-repo-tools. + +## Publication boundary + +The dependency-only environment pins the published `research-repo-tools==0.2.2` +package, including the release workflow's isolated installations. +Upstream [#118](https://github.com/acgetchell/research-repo-tools/pull/118) +adds the missing minimum-release acquisition contract; release +[#119](https://github.com/acgetchell/research-repo-tools/pull/119) published it +from commit `e9310163d2789532bdcb155ef93b721473dc5523`. v0.2.1 supplied the declarative workflow interfaces but could +not express the consumer's v0.5.0 measurement floor. + +[PyPI v0.2.2](https://pypi.org/project/research-repo-tools/0.2.2/) lists both +distributions as unyanked. Their SHA-256 hashes match the signed +[GitHub release assets](https://github.com/acgetchell/research-repo-tools/releases/tag/v0.2.2) +and the exact registry lock entries: + +| Distribution | SHA-256 | +| --- | --- | +| Wheel | `b82e11ef8265f0b03c37cac93f59d5854a63543c29ee378f5980623af57d9381` | +| Source distribution | `4937f202a55c5678af30bae915e01ddbc17f9dd8dd9e143b2f430331b42e8f50` | + +Runtime imports and acceptance checks use this installed package. No sibling +checkout, private API, or release-candidate installation supplies final evidence. -The full-report standardization from #277 remains. New reports expose recorded -provenance and evidence links. Shared mixed-renderer history preserves immutable -older complete-run reports while upgrading mutable indexes. +The maintainer approved freezing earlier evidence instead of extending the +shared policy gate to accept missing acquisition declarations. This deliberately +supersedes #296's original v0.5.0/v0.4.6 replay requirement. The minimum release +applies to new acquisition; it does not redefine eligibility of already +declared complete runs. -## Python deletion audit +## Entry-point replacements -The audit compared the dependency-only MCMC environment and declarative -`tooling/` commands with the installed v0.1.9 public APIs. +The root Justfile calls the installed CLI directly. Static TOML describes +measurement and publication; the native Justfile contains Cargo commands. +There are no replacement Python wrappers, runtime configuration generators, +or shell implementations of the shared workflow. -| Former helper | Disposition and supported replacement | +| Consumer command | Installed owner and declaration | | --- | --- | -| `bench_compare.py` | Deleted; saved-baseline reports use the installed shared Criterion comparison CLI | -| `benchmark_contract.py` | Deleted; metric/group/peer/API declarations moved to `tooling/performance-policy.toml`; historical digests stay frozen | -| `benchmark_summaries.py` | Deleted; frozen historical summaries are records rather than regeneration inputs | -| `criterion_dim_plot.py` | Deleted; shared complete-run SVG/CSV/table presentation replaces raw-Criterion/gnuplot rendering | -| `performance_artifacts.py` | Deleted; shared evidence/publication replace writers and readers; historical CSV conversion retired in #285 | -| `release_baseline.py` | Deleted; native discovery uses the shared CLI and saved-copy verification uses the shared configured API | -| Local wheel/sdist and console-entry-point packaging | Removed; `uv` manages a dependency-only environment | -| Duplicate parser, renderer, legacy-writer and packaging tests | Removed; actual installed-package/configuration and scientific integration tests remain | - -Retirement conditions are satisfied by installed replacement checks, preservation -of original bytes/hashes and a documented supported workflow. The old report -layout need not be regenerated indefinitely. New reports use the shared format; -historical reports, CSV/JSON, indexes, plots and archives remain untouched. -Historical conversion was verified during #276 and retired in #285. Original -summaries remain independently readable with their original hashes and opaque -metadata. They cannot provide complete-run samples or newly captured host provenance. - -Only two production modules remain: - -- `archive_performance.py`: la-stack release eligibility, tracked-only snapshots, - and README publication composition. -- `performance_runs.py`: captured measurement environment, scientific selection, - sampling, originating reference phases and source/harness eligibility. - -New measurements require v0.5.0 or newer on both sides. -The historical API cfg, missing-row exemptions, root-test layout adapter and -metadata-free `performance-github-assets` command are retired. Their Rust -benchmark branches are removed while the independent scientific gates remain. -Original reports, CSV/JSON, plots and archives retain their bytes and hashes. -The measurement floor does not block offline use of retained complete runs -satisfying the modern scientific policy. - -Shared CLI snapshots include untracked files; la-stack's established contract -excludes them. Independent scientific eligibility, saved-sample storage checks -and publication composition also remain local. -[Upstream #115](https://github.com/acgetchell/research-repo-tools/issues/115) -targets declarative replacements in v0.2.1. Adoption and deletion of the final -production Python modules follow publication of that package. - -Generic subprocesses, discovery parsing, worktrees, measurement, completeness, -estimates, comparison arithmetic, rendering, run identity, history, downloads, -extraction and publication transactions all remain upstream. The retained Python -calls public APIs. Scientific names and mappings live in `tooling/`. - -## Python 3.15 review - -Metadata, `.python-version`, the locked environment and CI select Python 3.15. -The remaining code uses deferred annotations, typed boundaries and explicit -byte/UTF-8 transport. Scientific catalogs parse into immutable typed records before -discovery; malformed dimensions, names, peer pairs and metric rows retain field -diagnostics. Existing evidence records are supplied by the shared -package. Deleting the historical serializer also removes its custom recursive -freezing/thawing machinery. No artificial syntax modernization replaces a -supported shared implementation. - -Semgrep 1.180.0 wheels stop at Python 3.14. `tooling/semgrep/` pins the current -scanner and Python 3.14. The obsolete PyJWT override is retired because the pinned -scanner accepts patched PyJWT 2.15.1 with its crypto extra. Local scans, -fixture validation and hosted SARIF use that lock. Retire this exception after -current published wheels support Python 3.15 and native gates pass. - -## Size and validation evidence - -The #285 consumer-test cleanup was checked against tests bundled in the published -v0.2.0 sdist. Shared implementation matrices are removed only where that release -already covers them; consumer policy and installed-package integration remain. - -| Coverage | Published upstream owner | Retained consumer check | +| `performance-local` | `performance measure`, `measurements/full.toml`, current versus latest published release | +| `performance-local-non-exact` | `performance measure`, `measurements/non-exact.toml`, current versus latest published release | +| `performance-measure` | Explicit current/baseline labels and a named full/non-exact declaration | +| `performance-release` | `performance measure`, followed by explicit `performance promote` | +| `performance-promote` | Explicit scratch payload and envelope, checked against `performance-report.toml` | +| `performance-doc` | Offline retained history through `performance promote` and the independent full policy | +| `performance-readme` | `performance publish` with `performance-readme.toml`, independent identities and transactional formatting | +| `plot-vs-linalg` | `performance publish --artifacts-only` with named full scratch, retained, or non-exact scratch views | +| `bench-release-check` | `performance verify-saved` with saved name, Criterion directory and `criterion-saved.toml` | +| `bench-compare` | Existing installed saved-Criterion comparison CLI | + +Paths in the table are relative to `tooling/`. +[Benchmarking](../BENCHMARKING.md) owns arguments and examples. + +## Consumer contracts + +- Both acquisition labels must be v0.5.0 or newer. The published parser rejects + older labels before Git mutations or measurement output. +- Independent scientific catalogs require 417 full-report IDs. The non-exact + declaration selects the comparison suite. Native discovery may capture + additional diagnostic cases without weakening required coverage. +- Every phase retains 100 samples, mean and median estimates, 95% intervals, + nanoseconds, and the exact discovered inventory. Both native scientific gates + run before collection. +- nalgebra and faer references always originate in the baseline phase. + Compatibility includes host, CPU, architecture, harness, Rust/Cargo/Just, and + dependency identities. +- Measurements use the captured current harness with explicit Rust toolchain, + native host target, compiler/wrapper settings, flags, and isolated output + directories. Ambient code-generation overrides no longer silently change + the measured configuration. +- Snapshots include tracked changes and nonignored untracked regular files. + This intentionally replaces tracked-only snapshots. Source and harness + membership and bytes are checked again before README publication. +- Saved samples require the independent inventory, canonical storage paths, + matching fresh/saved raw files and complete statistical data. The configured + raw inventory remains `benchmark.json`, `estimates.json`, `sample.json`, and + `tukey.json`. +- Scratch and retained inputs are explicit choices. Incomplete scratch never + falls back to an older run. Promotion and document publication validate + independent declarations, not only a payload's self-consistency. +- All eight scientific plot metrics retain mean/median and linear/log choices, + giving 32 named views for each input source. Non-exact scratch views use + separate asset paths; official release promotion requires the full policy. + The README has one canonical + LU-solve median/log view and one shared publication section. +- README publication requires independently supplied releases and full Git + revisions, a retained run, current source/harness freshness, package/report + reference checks, tag checks, and successful formatting before any output + changes. The shared publisher emits full immutable links, so README uses + rumdl's Markdown-aware line policy; the extra raw-character gate continues + to cover other active documents. + +The minimum release, scientific rows, native commands, and publication choices +remain reviewable static consumer data. The shared engine owns their runtime +validation. `tooling/performance-policy.toml` is the independent scientific +catalog used by acceptance tests, not a local production parser. + +## Historical evidence + +Historical reports, plots, CSV/JSON, archives, and complete-run files retain +their original bytes and links. The existing v0.5.0/v0.4.6 complete run +`634bc9527c2caf0a431a9bdfac082c190e1094f0b29eb6e3f28c4b96961cdec5` +is a frozen readable record. It predates acquisition declarations and is no +longer an input for regeneration or current publication. Do not backfill its +provenance or relax the shared eligibility gate. + +New declared complete runs support offline report and plot rendering after +scratch deletion. README publication additionally requires current-source +freshness. New axis-specific plot paths preserve existing historical assets; +release metadata updates exclude immutable archive contents and their README +links. Regression hashes protect both the legacy CSV/JSON evidence and the +frozen complete run. + +## Deletion and test ownership + +The retirement removes `archive_performance.py`, `performance_runs.py`, +their adapter tests, and their obsolete measurement/plot declarations. +Useful non-performance integration tests move from `scripts/tests/` to +`tooling/tests/`. The root `scripts/` directory then has no production or +test owner. Semgrep fixtures under `tests/semgrep/scripts/` and historical +security-exception paths keep their existing identities. + +| Generic behavior | Upstream owner | Consumer evidence retained | | --- | --- | --- | -| Changelog rendering and repeatability | `tests/changelog/test_cliff_template.py` and `test_workflow.py` | Actual la-stack formatter/preservation policy, one authored-note generation and historical notes | -| Measurement completeness and failed gates | `tests/performance/public_complete_consumer.py` | Actual sampling policy, required scientific inventory, native gate commands and original peer phases | -| Package identity | Consumer-owned | One test in `test_toolchain_integration.py` checks pin, registry, installed version and wheel/sdist hashes; recipe tests verify preservation and forwarding | -| Release event identity and check-status matrices | `tests/releases/test_publishing.py` | Every configured native check remains required; actual workflow approval, immutability, notes and upload barriers remain tested | - -Counts use physical lines from `wc -l scripts/*.py scripts/tests/*.py` and -`uv run --locked pytest --collect-only -q`. Baseline is `905aba7`; test counts -describe consumer checks, not measurements. - -| Measure | Before | After | -| --- | ---: | ---: | -| Production modules | 8 | 2 | -| Production Python lines | 5,323 | 788 | -| Test Python lines | 5,096 | 1,952 | -| Collected tests | 371 | 130 | - -Production Python is reduced by about 85%. Focused installed-package tests cover -complete-run gates/coverage, original reference phases, offline report/plot replay, -source membership and unindexed-history freshness, captured release targets, -native archive round trips and unchanged historical hashes. The actual saved -comparison recipe and declarative historical conversion passed replacement checks. -Native discovery compiled/listed 533 comparison and 264 exact cases with all -417 required report/plot IDs, without collecting timings. - -Local executor: macOS arm64, CPython 3.15.0; Semgrep uses CPython 3.14.7. -The final repository validation includes Python format/lint/types, consumer tests, -Rust tests/doctests, docs, examples, benchmark compilation and native static checks. -No new scientific measurements or regenerated historical artifacts are claimed. - -Issue closure still requires an adoption commit, native Linux/macOS/Windows CI -for that exact commit, linked run evidence and merge. Local macOS -validation does not substitute for native Linux or Windows results. +| Floors, captured phases, complete samples and independent policy validation | `tests/performance/public_complete_consumer.py` | Actual full/non-exact declarations, release floor, scientific coverage and native commands | +| Transactional publication, formatting and provenance | `tests/publication/public_publication_consumer.py` and complete-run consumer suite | Actual recipes, stale source/harness, partial scratch, formatter failure, immutable links and frozen hashes | +| Saved-sample validation and archive transport | `tests/performance/public_performance_consumer.py` and Criterion baseline tests | Actual workflow archive, required IDs, canonical storage and saved/fresh bytes | +| Changelog, release target capture, toolchains and maintenance | Capability-specific installed-consumer suites | Existing la-stack workflow, package identity, release policy and configuration checks | + +The shared package runs public consumer suites from isolated wheel and sdist +installations. la-stack acceptance imports public APIs only and invokes the +actual Just recipes against bounded synthetic samples. No historic benchmark +reruns or new performance claims are needed. + +## Runtime and validation + +The dependency-only environment remains Python 3.15. Python supports shared +tools and consumer tests; deleting production scripts does not remove it. +Semgrep 1.180.0 still requires its separately locked Python 3.14 environment +under `tooling/semgrep/`. Retire that exception only when published scanner +wheels support Python 3.15 and native gates pass. + +Native discovery listed 533 comparison and 354 exact cases while verifying +the independent 417 required IDs. The scientific gates passed 26 exact-input +tests and 42 comparison-input tests. These checks compiled/listed the native +benchmarks without collecting timing measurements. + +Final acceptance also requires focused installed-package tests, `just check`, +`just ci`, Markdown/spelling/docs checks, and Linux/macOS/Windows CI for the +adoption commit. Local macOS validation does not establish other native results. +Release and adoption PRs retain the source-bound validation evidence. diff --git a/justfile b/justfile index b4356c8..6fd956c 100644 --- a/justfile +++ b/justfile @@ -111,8 +111,8 @@ bench-linear-form: {{ _run }} cargo bench --locked --features bench --bench linear_form # Check every discovered benchmark before the release workflow packages it. -bench-release-check tag: _ensure-uv - {{ _run }} uv run --locked scripts/archive_performance.py release-check {{ quote(tag) }} +bench-release-check tag criterion_dir="target/criterion": _ensure-uv + {{ _run }} uv run --locked research-repo-tools performance verify-saved tooling/criterion-saved.toml --saved-sample {{ quote(tag) }} --criterion-dir {{ quote(criterion_dir) }} # Discover all release benchmarks and report their expected measurement budget. bench-release-inventory: _ensure-uv @@ -341,17 +341,25 @@ markdown-check: tools-check _ensure-uv #!/usr/bin/env bash set -euo pipefail files=() + raw_files=() while IFS= read -r -d '' file; do case "$file" in CHANGELOG.md|docs/archive/*|docs/archives/changelog/*|docs/performance.md|docs/performance-runs/*) continue ;; esac if [ -f "$file" ]; then files+=("$file") + # Shared README publication retains full immutable evidence URLs. + # rumdl still checks its prose, syntax, links, and rendered line length. + if [ "$file" != README.md ]; then + raw_files+=("$file") + fi fi done < <(git ls-files -co --exclude-standard -z -- '*.md') if [ "${#files[@]}" -gt 0 ]; then printf '%s\0' "${files[@]}" | xargs -0 -n100 {{ _run }} rumdl check - uv run --locked --group dev research-repo-tools docs check-lines "${files[@]}" + if [ "${#raw_files[@]}" -gt 0 ]; then + uv run --locked --group dev research-repo-tools docs check-lines "${raw_files[@]}" + fi else echo "No markdown files found to check." fi @@ -380,41 +388,42 @@ markdown-fix: tools-check echo "No markdown files found to format." fi -# Render release docs from complete runs or their validated retained history. +# Render the retained release report offline, with independent eligibility checks. performance-doc: python-sync - {{ _run }} uv run --locked scripts/archive_performance.py report + {{ _run }} uv run --locked research-repo-tools performance promote tooling/performance-report.toml -# Measure tracked current inputs and the latest release with the captured current harness. +# Measure tracked and nonignored untracked current inputs against the latest release. performance-local: _ensure-gh python-sync - {{ _run }} uv run --locked scripts/archive_performance.py local + {{ _run }} uv run --locked research-repo-tools performance measure tooling/measurements/full.toml --mode current-vs-latest --repository acgetchell/la-stack --allow-git-mutations --payload target/bench-reports/full/run.json --manifest target/bench-reports/full/evidence.json --report target/bench-reports/full/report.md # Measure the comparison suite while retaining baseline-phase nalgebra/faer context. -performance-local-non-exact current_tag="" baseline_tag="": _ensure-gh python-sync - {{ _run }} uv run --locked scripts/archive_performance.py local {{ quote(current_tag) }} {{ quote(baseline_tag) }} --suite vs_linalg --stem target/bench-reports/performance-non-exact +performance-local-non-exact: _ensure-gh python-sync + {{ _run }} uv run --locked research-repo-tools performance measure tooling/measurements/non-exact.toml --mode current-vs-latest --repository acgetchell/la-stack --allow-git-mutations --payload target/bench-reports/non-exact/run.json --manifest target/bench-reports/non-exact/evidence.json --report target/bench-reports/non-exact/report.md -# Publish the dimension plot and README section directly from complete-run evidence. -performance-readme metric="lu_solve" stat="median" sample="new" log_y="true": python-sync - #!/usr/bin/env bash - set -euo pipefail - args=(--metric {{ quote(metric) }} --stat {{ quote(stat) }} --sample {{ quote(sample) }} --update-readme) - if [ {{ quote(log_y) }} = "true" ]; then - args+=(--log-y) - fi - {{ _run }} uv run --locked scripts/archive_performance.py plot "${args[@]}" +# Measure two existing tags with the full or non-exact declaration. +performance-measure current_tag baseline_tag view="full": python-sync + {{ _run }} uv run --locked research-repo-tools performance measure {{ quote("tooling/measurements/" + view + ".toml") }} {{ quote(current_tag) }} {{ quote(baseline_tag) }} --allow-git-mutations --payload {{ quote("target/bench-reports/" + view + "/run.json") }} --manifest {{ quote("target/bench-reports/" + view + "/evidence.json") }} --report {{ quote("target/bench-reports/" + view + "/report.md") }} + +# Fetch measurement tags explicitly before the isolated measurement commands. +performance-prepare: + git fetch origin --tags + +# Promote the explicitly selected full scratch run; missing inputs never fall back. +performance-promote: python-sync + {{ _run }} uv run --locked research-repo-tools performance promote tooling/performance-report.toml --payload target/bench-reports/full/run.json --manifest target/bench-reports/full/evidence.json + +# Publish the canonical README view with independently asserted source identities. +performance-readme current_tag current_revision baseline_tag baseline_revision: python-sync + {{ _run }} uv run --locked research-repo-tools performance publish tooling/performance-readme.toml --current-release {{ quote(current_tag) }} --current-revision {{ quote(current_revision) }} --baseline-release {{ quote(baseline_tag) }} --baseline-revision {{ quote(baseline_revision) }} # Measure, retain an immutable complete run, and promote distinct-release documentation. performance-release current_tag="" baseline_tag="": _ensure-gh python-sync - {{ _run }} uv run --locked scripts/archive_performance.py release {{ quote(current_tag) }} {{ quote(baseline_tag) }} + {{ _run }} uv run --locked research-repo-tools performance measure tooling/measurements/full.toml {{ quote(current_tag) }} {{ quote(baseline_tag) }} --repository acgetchell/la-stack --allow-git-mutations --payload target/bench-reports/full/run.json --manifest target/bench-reports/full/evidence.json --report target/bench-reports/full/report.md + {{ _run }} uv run --locked research-repo-tools performance promote tooling/performance-report.toml --payload target/bench-reports/full/run.json --manifest target/bench-reports/full/evidence.json -# Plot the complete retained comparison without measuring again. -plot-vs-linalg metric="lu_solve" stat="median" sample="new" log_y="false": python-sync - #!/usr/bin/env bash - set -euo pipefail - args=(--metric {{ quote(metric) }} --stat {{ quote(stat) }} --sample {{ quote(sample) }}) - if [ {{ quote(log_y) }} = "true" ]; then - args+=(--log-y) - fi - {{ _run }} uv run --locked scripts/archive_performance.py plot "${args[@]}" +# Render a named metric/statistic/axis view from explicitly retained or scratch inputs. +plot-vs-linalg current_tag current_revision baseline_tag baseline_revision view="lu_solve-median-linear" input="retained": python-sync + {{ _run }} uv run --locked research-repo-tools performance publish {{ quote("tooling/plots/" + input + "/" + view + ".toml") }} --artifacts-only --current-release {{ quote(current_tag) }} --current-revision {{ quote(current_revision) }} --baseline-release {{ quote(baseline_tag) }} --baseline-revision {{ quote(baseline_revision) }} # Check Python formatting, lint, fixtures, and types. python-check: python-format-check python-lint python-fixture-lint python-typecheck @@ -425,8 +434,8 @@ python-ci: python-format-check python-lint python-fixture-lint python-typecheck # Apply Python lint fixes and formatting. python-fix: python-sync - uv run --locked ruff check scripts/ --fix - uv run --locked ruff format scripts/ tests/semgrep/scripts/ + uv run --locked ruff check tooling/tests/ --fix + uv run --locked ruff format tooling/tests/ tests/semgrep/scripts/ # Lint deliberate Python fixtures with their declared exceptions. python-fixture-lint: python-sync @@ -434,11 +443,11 @@ python-fixture-lint: python-sync # Check Python formatting, including static-analysis fixtures. python-format-check: python-sync - uv run --locked ruff format --check scripts/ tests/semgrep/scripts/ + uv run --locked ruff format --check tooling/tests/ tests/semgrep/scripts/ # Lint Python support tools and their tests. python-lint: python-sync - uv run --locked ruff check scripts/ + uv run --locked ruff check tooling/tests/ # Synchronize the locked Python development environment. python-sync: _ensure-uv @@ -446,7 +455,7 @@ python-sync: _ensure-uv # Check all Python support and fixture types; fail on every diagnostic. python-typecheck: python-sync - uv run --locked ty check scripts/ tests/semgrep/scripts/ --error all + uv run --locked ty check tooling/tests/ tests/semgrep/scripts/ --error all # Require the release event, reviewed commit, native checks, assets, and notes. release-gate tag: diff --git a/pyproject.toml b/pyproject.toml index 3975c73..94f82e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ dependencies = [ ] [tool.ruff] line-length = 160 -src = [ "scripts" ] +src = [ "tooling/tests" ] [tool.ruff.lint] select = [ "E", "F", "W", "ANN001", "ANN002", "ANN003", "ANN201", "ANN202", "ANN204", "ANN205", "ANN206", "C90", "I", "N", "UP", "YTT", "ASYNC", "S", "BLE", "FBT", "B", "A", "COM", "C4", "DTZ", "FA", "T10", "EM", "EXE", "FIX", "FLY", "FURB", "ISC", "ICN", "LOG", "G", "INP", "PERF", "PIE", "T20", "PYI", "PT", "Q", "RSE", "RET", "SLF", "SIM", "SLOT", "TC", "TID", "TD", "ARG", "PTH", "ERA", "PD", "PGH", "PL", "TRY", "NPY", "RUF", "D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107" ] @@ -42,7 +42,6 @@ ignore = [ max-complexity = 10 [tool.ruff.lint.isort] -known-first-party = [ "archive_performance", "performance_runs" ] force-single-line = false split-on-trailing-comma = true combine-as-imports = true @@ -64,8 +63,7 @@ line-ending = "auto" [tool.pytest.ini_options] minversion = "9.0" addopts = [ "-ra", "--strict-markers", "--strict-config", "--color=yes" ] -testpaths = [ "scripts/tests" ] -pythonpath = [ "scripts" ] +testpaths = [ "tooling/tests" ] python_files = [ "test_*.py", "*_test.py" ] python_classes = [ "Test*" ] python_functions = [ "test_*" ] @@ -92,7 +90,7 @@ required-version = "==0.13.3" # Semgrep has its own locked Python 3.14 environment under tooling/semgrep. [dependency-groups] -tooling = [ "research-repo-tools==0.2.0" ] +tooling = [ "research-repo-tools==0.2.2" ] dev = [ { include-group = "tooling" }, "actionlint-py==1.7.12.25", @@ -154,14 +152,14 @@ date-policy = "declared" tag-policy = "canonical-stable" required-files = [ "Cargo.lock", "pyproject.toml", "uv.lock", "CITATION.cff", "CHANGELOG.md", "README.md", "REFERENCES.md" ] # Retained scientific reports and measured links do not advance with metadata. -exclude = [ "docs/archive/**", "docs/performance/**", "docs/performance.md" ] +exclude = [ "docs/archive/**", "docs/performance/**", "docs/performance-runs/**", "docs/performance.md" ] [[tool.research-repo-tools.release.rules]] path = "README.md" pattern = 'https://(?:github\.com/acgetchell/la-stack/(?:blob|raw|tree)/|raw\.githubusercontent\.com/acgetchell/la-stack/)(?Pmain|v[0-9]+\.[0-9]+\.[0-9]+|[0-9a-f]{7,40})/[^\s)\]>"?]+' value = "main" count = 41 -exclude = '/docs/assets/bench/' +exclude = '/docs/(?:assets/bench|performance-runs)/' [[tool.research-repo-tools.release.rules]] path = "CITATION.cff" diff --git a/scripts/README.md b/scripts/README.md deleted file mode 100644 index addc898..0000000 --- a/scripts/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# scripts/ - -Only two production Python adapters remain. Generic tools run from the installed -`research-repo-tools==0.2.0` base package; their declarations belong in -`tooling/` and `pyproject.toml`. The project is a dependency-only environment, -with no local Python distribution, build backend or console entry points. - -## Setup - -Use `just setup`, then `uv run --locked` for every Python command. The support -environment targets Python 3.15. `just python-check` checks formatting, lint and -types; `just test-python` runs focused installed-package consumer tests. - -Semgrep 1.180.0 has a separate locked Python 3.14 environment under -`tooling/semgrep/`, because its published wheels do not support Python 3.15. -Both local scans and hosted SARIF use that environment. Review its manifest and -refresh its lock deliberately when updating the scanner. - -## Performance tooling - -The [benchmark guide](../docs/BENCHMARKING.md) owns command selection, scientific -interpretation, output paths and release procedures. - -| Owner | Responsibility | -| --- | --- | -| `archive_performance.py` | Release eligibility, tracked-only snapshots, and la-stack README markers/pointers | -| `performance_runs.py` | Measurement environment, scientific coverage, sampling and original reference-phase assertions | -| `tooling/performance-policy.toml` | Exact group selections, metric names, peers, dimensions and minimum measurement release | -| `tooling/performance.toml` | Shared sources, harness, probes, dependencies, timeouts and compatibility | -| `tooling/performance.just` | Native Cargo discovery, independent correctness gates and timing commands | -| `tooling/performance-report.toml` | Shared current report and immutable complete-run history | -| `tooling/performance-plot.toml` | Scientific coordinate, unit, series and axis declarations | -| `tooling/criterion-inventory.toml` | Shared native discovery and minimum coverage of all report/plot consumers | -| `tooling/criterion-saved.toml` | Shared complete saved-sample policy, including exact `tukey.json` bytes | - -The adapters call public shared APIs for subprocesses, worktrees, Criterion -discovery, completeness, estimates, comparison arithmetic, evidence, rendering, -retention and publication. They -contain no generic renderer, CSV parser, legacy writer or measurement engine. - -New measurements require v0.5.0 or newer on both sides. Historical API cfg, -missing-row exemptions, root-test layout adapters and the metadata-free -`performance-github-assets` command are retired. Archived artifacts remain -unchanged; retained complete runs satisfying the modern policy still render -offline regardless of the measurement floor. - -The remaining composition preserves tracked-only local snapshots, independent -scientific eligibility checks and baseline-origin nalgebra/faer reference views. -The shared CLI's default worktree snapshot includes untracked files. -[Upstream #115](https://github.com/acgetchell/research-repo-tools/issues/115) -tracks the declarative interfaces needed to retire these final adapters. - -`bench-compare` now calls the shared Criterion CLI directly. It compares every -available row, including additions and omissions, as an exploratory local report. -Its former suite/scope flags and snapshot CLI are retired. Use Criterion's native -reports for a single snapshot and `performance-local` for checked scientific -release comparisons. - -`performance-local` and `performance-release` retain complete native measurements. -`performance-doc` renders those inputs or validated shared history offline. -`performance-readme` and `plot-vs-linalg` use the shared complete-run SVG, CSV and -table renderers. The former preserves current source/harness membership and -digests and advances the three existing measured-artifact pointers transactionally. -README candidates pass the shared Markdown formatter with repository policy -before any publication files are replaced. -README publication configures the shared `RunTableStyle` API to label dimensions, -keep both interval bounds below each timing, state the recorded confidence level -once, and select ratio-only speedup columns with explicit numerator/denominator -semantics. Series labels supply the timing headings and measured versions. -The shared renderer owns formatting, timing estimates and comparison arithmetic. - -```bash -just performance-release -just performance-readme lu_solve median new true -just plot-vs-linalg dot mean new true -``` - -The raw-Criterion/gnuplot publisher, historical summary writer and custom -report renderer are retired after installed-package replacement checks. -Original CSV/JSON, reports, fingerprints and archives remain unchanged. -They are read directly as frozen records; no regeneration requirement keeps -their writers alive. The obsolete CSV conversion declaration and pre-Just Python -phase format are retired. Report and README publication require complete-run -evidence with the declared Just driver. Historical summaries lack raw samples -and cannot supply that evidence; their original bytes remain available directly. - -Generic parser, renderer, transaction and provider failure matrices belong -upstream. Consumer tests retain scientific selection/phase/gate checks, actual -native recipe wiring, complete release archive round trips, captured-target -handoff, offline publication and original artifact hashes. -`scripts/tests/test_toolchain_integration.py` owns the single published-package -contract: manifest pin, registry lock, installed version and wheel/sdist hashes. -Dependency-update and release-workflow tests derive that requirement from the -manifest and verify it survives their actual recipe execution. - -## Changelog and release tooling - -Use the shared commands exposed by `just --list`. The [release guide](../docs/RELEASING.md) -owns release metadata, changelog generation, tagging and registry publication. -Repository declarations in `pyproject.toml` retain the concept DOI, active link -policy, declared date policy, changelog formatter and dependency-body handling. - -The publishing declaration selects only `la-stack`, requires the native platform -and scientific check results on the exact commit, and requires the durable -Criterion release asset. `release-gate`, `release-publish` and `release-verify` -use the shared release contract; `release-package` owns native default/exact -Cargo dry-runs. The local notes check binds the GitHub title/body to the generated -changelog. `scripts/tests/test_release_publishing.py` checks this consumer policy, -installed CLI failures and the actual workflow's upload barriers without network -access or registry credentials. Account registration and live release evidence -remain separate from fixture results. - -The exact shared package pin lives in the `tooling` dependency group, included -by `dev`, and is resolved from PyPI in `uv.lock`. No sibling checkout supplies -runtime code. Shared `deps update-python` advances direct exact development -requirements; the shared package pin advances deliberately with its lockfile. - -Setup, tool verification, managed execution, dependency updates, Markdown line -checks, Semgrep fixture validation, security scanning and opt-in CodeRabbit -review also use shared commands. Consumer tests check configuration and actual -recipe forwarding; shared implementation regressions belong upstream. - -See the [adoption record](../docs/dev/performance-tooling-adoption.md) for deletion -dispositions, Python 3.15 review, size measurements and validation evidence. diff --git a/scripts/archive_performance.py b/scripts/archive_performance.py deleted file mode 100644 index ea10aeb..0000000 --- a/scripts/archive_performance.py +++ /dev/null @@ -1,365 +0,0 @@ -#!/usr/bin/env -S uv run --locked -"""Consumer release selection and publication over shared performance workflows.""" - -import argparse -import json -import os -import re -import shutil -import subprocess -import sys -import tempfile -import tomllib -from dataclasses import replace -from pathlib import Path -from typing import Literal - -from research_repo_tools.common_measurement import measure_prepared_pair -from research_repo_tools.complete_runs import render_run, run_identity -from research_repo_tools.evidence import Evidence, serialize_evidence -from research_repo_tools.measurement import resolve_revision -from research_repo_tools.postprocess_changelog import MarkdownFormatError, format_markdown -from research_repo_tools.process import ExecutableNotFoundError, format_exception_diagnostics, run_command -from research_repo_tools.publication import GitCheck, GlobCheck, MarkerPair, RunSelectionCheck, plan_outputs, publish_publication, replace_section -from research_repo_tools.release_discovery import normalize_tag, stable_published_releases -from research_repo_tools.release_pairs import PairMode, ReleasePair, resolve_pair -from research_repo_tools.run_presentation import ( - CoordinatePlot, - RunLayout, - RunRow, - RunTableStyle, - SeriesSelection, - render_coordinate_svg, - render_run_table, - serialize_run_csv, -) -from research_repo_tools.run_reports import load_latest_run, load_run_report_plan -from research_repo_tools.worktrees import apply_snapshot, capture_snapshot, temporary_worktree - -from performance_runs import ( - REPORT_CONFIG, - archive_directory, - find_project_root, - measurement_plan, - required_report_ids, - retained_run, - scientific_policy, - scratch_paths, - validate_measurement_pair, - validate_scientific_run, -) - - -def select_pair(root: Path, mode: PairMode, current: str | None, baseline: str | None, *, local: bool = False) -> ReleasePair: - """Use publication chronology while retaining la-stack release eligibility.""" - package = tomllib.loads((root / "Cargo.toml").read_text(encoding="utf-8"))["package"]["version"] - releases = () - if mode != "explicit": - response = run_command( - "gh", - ["release", "list", "--repo", "acgetchell/la-stack", "--limit", "1000", "--json", "tagName,isDraft,isPrerelease,publishedAt"], - cwd=root, - ) - releases = stable_published_releases(json.loads(response.stdout)) - # Shared explicit selection describes release pairs. Consumer local audits - # additionally permit two different sources carrying the same package label. - if local and current is not None and baseline is not None and normalize_tag(current) == normalize_tag(baseline): - pair = ReleasePair(current, baseline) - else: - pair = resolve_pair(mode, package_tag=package, releases=releases, current=current, baseline=baseline, order="published") - validate_measurement_pair(pair, root) - return pair - - -def measure(root: Path, pair: ReleasePair, suite: str, scope: str) -> Evidence: - """Capture tracked changes and delegate isolated phases to the published engine.""" - validate_measurement_pair(pair, root) - version = tomllib.loads((root / "Cargo.toml").read_text(encoding="utf-8"))["package"]["version"] - if pair.current != normalize_tag(version): - msg = "current release label must match the measured checkout package" - raise ValueError(msg) - snapshot = replace(capture_snapshot(root), untracked=()) - # The existing consumer contract deliberately excludes untracked files. - run_command("git", ["--no-pager", "fetch", "origin", f"refs/tags/{pair.baseline}:refs/tags/{pair.baseline}"], cwd=root) - baseline_revision = resolve_revision(root, pair.baseline) - parent = Path(tempfile.mkdtemp(prefix="la-stack-performance-")).resolve(strict=True) - try: - with ( - temporary_worktree(root, parent / "baseline", baseline_revision, allow_git_mutations=True) as baseline, - temporary_worktree(root, parent / "current", snapshot.revision, allow_git_mutations=True) as current, - ): - apply_snapshot(current, snapshot) - plan = measurement_plan(current, pair, suite, scope) - evidence = measure_prepared_pair(baseline, current, plan, pair, working_tree=True) - if replace(capture_snapshot(root), untracked=()) != snapshot: - msg = "source working tree changed while measurement ran" - raise ValueError(msg) - finally: - # A failed shared worktree cleanup leaves its path intact for recovery. - if not (parent / "baseline").exists() and not (parent / "current").exists(): - shutil.rmtree(parent) - validate_scientific_run(evidence, root=root) - return evidence - - -def save_scratch(root: Path, stem: Path, evidence: Evidence) -> None: - """Save complete evidence and the shared report without touching legacy files.""" - validate_scientific_run(evidence, root=root) - payload, manifest = scratch_paths(stem) - data, envelope = serialize_evidence(evidence) - report = render_run( - evidence, - report_path=stem.with_suffix(".md").relative_to(root).as_posix(), - payload_path=payload.relative_to(root).as_posix(), - manifest_path=manifest.relative_to(root).as_posix(), - ) - plan = plan_outputs( - root, - {path.relative_to(root).as_posix(): value for path, value in ((payload, data), (manifest, envelope), (stem.with_suffix(".md"), report))}, - inputs={REPORT_CONFIG: (root / REPORT_CONFIG).read_bytes()}, - ) - publish_publication(plan) - - -def promote(root: Path, stem: Path) -> None: - """Validate consumer policy and publish the shared report and history plan.""" - evidence = retained_run(root, stem) - validate_scientific_run(evidence, release=True, root=root) - payload, manifest = scratch_paths(stem) - kwargs = {} - if payload.exists() or manifest.exists(): - kwargs = {"payload": payload.relative_to(root).as_posix(), "manifest": manifest.relative_to(root).as_posix()} - history = load_run_report_plan(root, REPORT_CONFIG, **kwargs) - outputs = dict(history.outputs) - if json.loads(outputs[f"{archive_directory(root)}/latest.json"])["run"]["id"] != run_identity(evidence): - msg = "selected evidence changed while planning report publication" - raise ValueError(msg) - publish_publication(history) - - -def check_release_sample(root: Path, name: str) -> int: - """Require canonical report identities and complete, matching saved bytes.""" - from research_repo_tools.criterion_baselines import load_saved_sample, validate_saved_sample # noqa: PLC0415 - - plan = load_saved_sample(root, "tooling/criterion-saved.toml") - required = required_report_ids(root) - if not required <= set(plan.policy.expected): - msg = "release inventory omits report consumers" - raise ValueError(msg) - saved = validate_saved_sample(Path(os.environ.get("CRITERION_HOME", str(root / plan.criterion_dir))), name, plan.policy, raw_files=plan.raw_files) - for case in saved.cases: - if case.full_id in required and case.storage_path != case.full_id: - msg = f"non-canonical report benchmark storage path for {case.full_id}: {case.storage_path}" - raise ValueError(msg) - return len(saved.cases) - - -def main(argv: list[str] | None = None) -> int: - """Keep routine performance commands thin and explicit.""" - parser = argparse.ArgumentParser(description=__doc__) - commands = parser.add_subparsers(dest="command", required=True) - for name in ("local", "release"): - command = commands.add_parser(name) - command.add_argument("current", nargs="?") - command.add_argument("baseline", nargs="?") - command.add_argument("--suite", choices=("all", "exact", "vs_linalg"), default="all") - command.add_argument("--scope", choices=("release-signal", "all-benches"), default="release-signal") - command.add_argument("--stem", type=Path, default=Path("target/bench-reports/performance")) - commands.add_parser("report").add_argument("--stem", type=Path, default=Path("target/bench-reports/performance")) - commands.add_parser("release-check").add_argument("current", help="Saved Criterion sample name") - args = parser.parse_args(argv) - try: - root = find_project_root(Path.cwd()).resolve() - if args.command == "release-check": - print(f"Verified {check_release_sample(root, args.current)} complete saved Criterion benchmarks") - return 0 - if args.command == "report": - promote(root, root / args.stem) - return 0 - modes: dict[str, PairMode] = {"local": "current-vs-latest", "release": "infer-release"} - mode: PairMode = "explicit" if args.current or args.baseline else modes[args.command] - pair = select_pair(root, mode, args.current or None, args.baseline or None, local=args.command == "local") - stem = root / args.stem - if args.command == "release" and pair.current == pair.baseline: - parser.error("release requires distinct release labels") - evidence = measure(root, pair, args.suite, args.scope) - save_scratch(root, stem, evidence) - if args.command == "release": - promote(root, stem) - return 0 - except (OSError, ValueError, TypeError, KeyError, ExecutableNotFoundError, subprocess.SubprocessError, ExceptionGroup) as error: - print(f"performance: {format_exception_diagnostics(error)}", file=sys.stderr) - return 1 - - -PLOT_CONFIG = "tooling/performance-plot.toml" -README_TABLE_STYLE = RunTableStyle( - row_heading="Dimension", - intervals="below", - timing_legend=True, - comparison_columns=("ratio",), - ratio_headings=("Speedup vs nalgebra", "Speedup vs faer"), - ratio_suffix="\N{MULTIPLICATION SIGN}", -) - - -def _repo_root() -> Path: - """Resolve installed commands against the caller's checkout.""" - return find_project_root(Path.cwd()).resolve() - - -def presentation(root: Path, metric_name: str, statistic: Literal["mean", "median"], *, log_y: bool) -> tuple[RunLayout, CoordinatePlot]: - """Map the scientific catalog onto the shared coordinate presentation plan.""" - config = tomllib.loads((root / PLOT_CONFIG).read_text(encoding="utf-8")) - if ( - type(config["schema"]) is not int - or config["schema"] != 1 - or tuple(config["dimensions"]) != scientific_policy(root).dimensions - or config["unit"] != "ns" - ): - msg = "dimension publication requires the canonical D=2-64 selection" - raise ValueError(msg) - catalog = scientific_policy(root) - metric = catalog.metrics[metric_name] - benches = dict(zip(("la-stack current", "nalgebra", "faer"), metric.benchmarks, strict=True)) - selected = tuple( - SeriesSelection(item["name"], item["label"], tuple((str(d), f"d{d}/{benches[item['name']]}") for d in catalog.dimensions)) for item in config["series"] - ) - if tuple(item.name for item in selected) != tuple(benches): - msg = "dimension publication requires current la-stack and both baseline peer views" - raise ValueError(msg) - layout = RunLayout( - selected, - tuple(RunRow(str(d), str(d), d) for d in catalog.dimensions), - statistic, - config["unit"], - comparisons=(("nalgebra", "la-stack current"), ("faer", "la-stack current")), - ) - settings = config["plot"] - plot = CoordinatePlot( - f"{metric.title}: {statistic} time vs dimension", settings["x-label"], settings["y-label"], settings["x-scale"], "log" if log_y else "linear" - ) - return layout, plot - - -def _asset_links(document: bytes, *, metric: str, statistic: str, release: str) -> bytes: - """Advance precisely the three existing la-stack artifact pointers.""" - stem = f"/docs/assets/bench/vs_linalg_{metric}_{statistic}" - pattern = re.compile( - rb"(?Phttps://(?:github\.com/acgetchell/la-stack/(?:blob|raw|tree)/|raw\.githubusercontent\.com/acgetchell/la-stack/))" - rb"v[0-9]+\.[0-9]+\.[0-9]+" - rb"(?P" + re.escape(stem.encode()) + rb"(?:\.csv|\.provenance\.json|\.svg))" - ) - found = sorted(match["asset"] for match in pattern.finditer(document)) - if found != sorted(f"{stem}{suffix}".encode() for suffix in (".csv", ".svg", ".provenance.json")): - msg = "README requires exactly one tagged pointer to each selected artifact" - raise ValueError(msg) - return pattern.sub(lambda match: match["prefix"] + release.encode() + match["asset"], document) - - -def publish_plot(root: Path, metric: str, statistic: Literal["mean", "median"], *, log_y: bool, update_readme: bool) -> None: - """Retain original phases, enforce scientific eligibility, and publish once.""" - # The report registry imports only the independent benchmark catalog. - import performance_runs as policy # noqa: PLC0415 - - stem = root / "target/bench-reports/performance" - evidence = policy.retained_run(root, stem) - run = policy.validate_scientific_run(evidence, release=update_readme, root=root) - verified_inputs = policy.verify_current_source(root, evidence) if update_readme else {} - layout, plot = presentation(root, metric, statistic, log_y=log_y) - phases = dict(evidence.sources) - current_context, peer_context = dict(phases["current"].context), dict(phases["baseline"].context) - versions = {"la-stack current": current_context["release"], "nalgebra": peer_context["dependency.nalgebra"], "faer": peer_context["dependency.faer"]} - layout = replace(layout, series=tuple(replace(item, label=f"{item.label} ({versions[item.name]})") for item in layout.series)) - svg = render_coordinate_svg(evidence, layout, plot) - csv = serialize_run_csv(evidence, layout) - identity = run_identity(evidence) - payload, manifest = policy.scratch_paths(stem) - from_archive = not payload.exists() - inputs = { - PLOT_CONFIG: (root / PLOT_CONFIG).read_bytes(), - policy.POLICY_CONFIG: (root / policy.POLICY_CONFIG).read_bytes(), - policy.REPORT_CONFIG: (root / policy.REPORT_CONFIG).read_bytes(), - **verified_inputs, - } - archive = root / policy.archive_directory(root) - if not from_archive: - inputs.update(zip((payload.relative_to(root).as_posix(), manifest.relative_to(root).as_posix()), serialize_evidence(evidence), strict=True)) - # README provenance must remain valid after scratch cleanup. Require the - # selected measurement to have been promoted before referencing its archive. - use_archive = from_archive or update_readme - if use_archive: - if not from_archive and run_identity(load_latest_run(root, policy.archive_directory(root))) != identity: - msg = "README evidence differs from the retained latest run; run performance-doc first" - raise ValueError(msg) - payload, manifest = archive / "runs" / identity / "run.json", archive / "runs" / identity / "evidence.json" - inputs.update({path.relative_to(root).as_posix(): path.read_bytes() for path in archive.rglob("*") if path.is_file()}) - inputs.update(zip((payload.relative_to(root).as_posix(), manifest.relative_to(root).as_posix()), serialize_evidence(evidence), strict=True)) - prefix = f"docs/assets/bench/vs_linalg_{metric}_{statistic}" - provenance = { - "schema": 4, - "artifact": "la-stack dimension plot", - "run_id": identity, - "payload": payload.relative_to(root).as_posix(), - "manifest": manifest.relative_to(root).as_posix(), - "statistic": statistic, - "unit": layout.unit, - "series": {item.name: item.phase for item in run.series if item.name in {selected.name for selected in layout.series}}, - } - outputs = {f"{prefix}.svg": svg, f"{prefix}.csv": csv, f"{prefix}.provenance.json": (json.dumps(provenance, indent=2, sort_keys=True) + "\n").encode()} - git_checks = () - document: bytes | None = None - if update_readme: - context = dict(dict(evidence.sources)["current"].context) - markers = MarkerPair(f"", f"") - document = (root / "README.md").read_bytes() - git_checks = (GitCheck(context["release"], tuple(outputs), allow_missing=True),) - inputs["pyproject.toml"] = (root / "pyproject.toml").read_bytes() - outputs["README.md"] = format_markdown( - _asset_links( - replace_section(document, markers, render_run_table(evidence, layout, style=README_TABLE_STYLE)), - metric=metric, - statistic=statistic, - release=context["release"], - ).decode("utf-8"), - root / "README.md", - root / "pyproject.toml", - ).encode("utf-8") - plan = plan_outputs(root, outputs, inputs=inputs) - if update_readme and dict(plan.originals)["README.md"] != document: - msg = "README changed during rendering" - raise ValueError(msg) - checks = () - if update_readme: - config = policy.configuration(root) - checks = tuple( - GlobCheck(patterns, tuple(json.loads(current_context[field]))) - for field, patterns in (("source-inventory", config.sources), ("harness-inventory", config.harness)) - ) - # Preserve the shared planner's snapshots and add its public freshness - # checks for the independently validated consumer selections. - plan = replace( - plan, git_checks=git_checks, glob_checks=checks, run_checks=(RunSelectionCheck(policy.archive_directory(root), identity),) if use_archive else () - ) - publish_publication(plan) - - -def dimension_main(argv: list[str] | None = None) -> int: - """Plot complete evidence or publish its canonical README section.""" - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--metric", default="lu_solve", help="Metric declared in tooling/performance-policy.toml") - parser.add_argument("--stat", choices=("mean", "median"), default="median") - parser.add_argument("--sample", choices=("new",), default="new", help="Retained current series; raw Criterion samples are no longer publication inputs.") - parser.add_argument("--log-y", action="store_true") - parser.add_argument("--update-readme", action="store_true") - args = parser.parse_args(argv) - try: - publish_plot(_repo_root(), args.metric, args.stat, log_y=args.log_y, update_readme=args.update_readme) - return 0 - except (OSError, ValueError, TypeError, KeyError, MarkdownFormatError, ExecutableNotFoundError, subprocess.SubprocessError, ExceptionGroup) as error: - print(f"dimension publication: {format_exception_diagnostics(error)}", file=sys.stderr) - return 2 - - -if __name__ == "__main__": - raise SystemExit(dimension_main(sys.argv[2:]) if sys.argv[1:2] == ["plot"] else main()) diff --git a/scripts/performance_runs.py b/scripts/performance_runs.py deleted file mode 100644 index 0406dd1..0000000 --- a/scripts/performance_runs.py +++ /dev/null @@ -1,367 +0,0 @@ -"""la-stack scientific policy and series selection over shared complete runs.""" - -import json -import os -import re -import tomllib -from dataclasses import dataclass, replace -from pathlib import Path -from types import MappingProxyType -from typing import TYPE_CHECKING, cast - -from research_repo_tools.common_measurement import CommonHarnessPlan, MeasurementPhase -from research_repo_tools.complete_runs import CompletePolicy, CompleteRun, RunSeries, validate_run_evidence -from research_repo_tools.criterion_inventory import DiscoveryCommand, DiscoveryPlan, discover_inventory, load_discovery -from research_repo_tools.evidence import Evidence, fingerprint_files, load_evidence -from research_repo_tools.measurement import MeasurementConfig, load_measurement -from research_repo_tools.release_discovery import normalize_tag -from research_repo_tools.release_pairs import ReleasePair -from research_repo_tools.run_reports import load_latest_run - -if TYPE_CHECKING: - from collections.abc import Mapping - -REPORT_CONFIG = "tooling/performance-report.toml" -MEASUREMENT_CONFIG = "tooling/performance.toml" -POLICY_CONFIG = "tooling/performance-policy.toml" -type ReleaseVersion = tuple[int, int, int] - - -@dataclass(frozen=True) -class PlotMetric: - """One scientific operation and its current/baseline peer identifiers.""" - - title: str - benchmarks: tuple[str, str, str] - - -@dataclass(frozen=True) -class ScientificPolicy: - """Parsed, immutable consumer declarations used by every performance path.""" - - dimensions: tuple[int, ...] - minimum_release: ReleaseVersion - library_benchmarks: tuple[str, ...] - exact: Mapping[str, tuple[str, ...]] - additional: Mapping[str, tuple[str, ...]] - peers: Mapping[str, tuple[str, str]] - metrics: Mapping[str, PlotMetric] - - -def _names(value: object, field: str, *, length: int | None = None) -> tuple[str, ...]: - """Reject malformed or ambiguous Criterion names before constructing rows.""" - if not isinstance(value, list) or any(not isinstance(item, str) or re.fullmatch(r"[A-Za-z0-9_]+", item) is None for item in value): - raise ValueError(f"{field} requires a list of Criterion names") - names = cast("tuple[str, ...]", tuple(value)) - if len(set(names)) != len(names) or (length is not None and len(names) != length): - raise ValueError(f"{field} requires distinct names" + (f" with exactly {length} entries" if length is not None else "")) - return names - - -def _table(value: object, field: str) -> dict[str, object]: - """Admit only named catalog tables, leaving their values to owning parsers.""" - if not isinstance(value, dict) or any(not isinstance(key, str) or re.fullmatch(r"[A-Za-z0-9_]+", key) is None for key in value): - raise ValueError(f"{field} requires a named catalog table") - return cast("dict[str, object]", value) - - -def _dimensions(value: object) -> tuple[int, ...]: - """Keep dimensions positive, unique and in the declared plotting order.""" - if not isinstance(value, list) or not value or any(type(item) is not int or item <= 0 for item in value): - msg = "dimensions requires positive integers" - raise ValueError(msg) - dimensions = cast("tuple[int, ...]", tuple(value)) - if tuple(sorted(set(dimensions))) != dimensions: - msg = "dimensions requires increasing, distinct integers" - raise ValueError(msg) - return dimensions - - -def _metrics(value: object, peers: Mapping[str, tuple[str, str]]) -> Mapping[str, PlotMetric]: - """Bind each plotted operation to its declared pair of baseline peers.""" - metrics = {} - for name, record in _table(value, "metrics").items(): - fields = _table(record, f"metrics.{name}") - title = fields.get("title") - if not isinstance(title, str) or not title.strip(): - raise ValueError(f"metrics.{name}.title requires nonempty text") - benchmarks = cast("tuple[str, str, str]", _names(fields.get("benchmarks"), f"metrics.{name}.benchmarks", length=3)) - if peers.get(benchmarks[0]) != benchmarks[1:]: - raise ValueError(f"metrics.{name}.benchmarks differs from the declared peer pair") - metrics[name] = PlotMetric(title, benchmarks) - if not metrics: - msg = "metrics requires at least one operation" - raise ValueError(msg) - return MappingProxyType(metrics) - - -def _release_threshold(value: object, field: str) -> ReleaseVersion: - """Parse one canonical, nonnegative release threshold from TOML.""" - if not isinstance(value, list) or len(value) != 3 or any(type(item) is not int or item < 0 for item in value): - raise ValueError(f"{field} requires three nonnegative integers") - return cast("ReleaseVersion", tuple(value)) - - -def find_project_root(start: Path | None = None) -> Path: - """Resolve consumer commands from their Cargo checkout.""" - directory = (start or Path.cwd()).resolve() - for candidate in (directory, *directory.parents): - if (candidate / "Cargo.toml").is_file(): - return candidate - msg = "Could not locate Cargo.toml to determine benchmark root" - raise FileNotFoundError(msg) - - -def scientific_policy(root: Path | None = None) -> ScientificPolicy: - """Parse the consumer-owned scientific catalog before discovery or measurement.""" - policy = tomllib.loads(((root or find_project_root()) / POLICY_CONFIG).read_text(encoding="utf-8")) - if type(policy.get("schema")) is not int or policy["schema"] != 1: - msg = "scientific policy requires schema 1" - raise ValueError(msg) - minimum = _release_threshold(policy.get("minimum-release"), "minimum-release") - dimensions = _dimensions(policy.get("dimensions")) - library = _names(policy.get("library-benchmarks"), "library-benchmarks") - exact = {name: _names(names, f"exact.{name}") for name, names in _table(policy.get("exact"), "exact").items()} - if not library or not exact or any(not names for names in exact.values()): - msg = "scientific policy requires library and exact benchmark selections" - raise ValueError(msg) - additional = {dimension: _names(names, f"additional.{dimension}") for dimension, names in _table(policy.get("additional"), "additional").items()} - if not set(additional) <= {str(value) for value in dimensions}: - msg = "additional benchmark dimensions must occur in dimensions" - raise ValueError(msg) - peers = {name: cast("tuple[str, str]", _names(names, f"peers.{name}", length=2)) for name, names in _table(policy.get("peers"), "peers").items()} - if not set(peers) <= {*library, *(name for names in additional.values() for name in names)}: - msg = "peers must refer to declared library benchmarks" - raise ValueError(msg) - return ScientificPolicy( - dimensions=dimensions, - minimum_release=minimum, - library_benchmarks=library, - exact=MappingProxyType(exact), - additional=MappingProxyType(additional), - peers=MappingProxyType(peers), - metrics=_metrics(policy.get("metrics"), peers), - ) - - -def validate_measurement_pair(pair: ReleasePair, root: Path | None = None) -> None: - """Reject unsupported releases before any new measurement side effects.""" - policy = scientific_policy(root) - versions = {phase: tuple(map(int, normalize_tag(tag)[1:].split("."))) for phase, tag in (("baseline", pair.baseline), ("current", pair.current))} - if any(version < policy.minimum_release for version in versions.values()): - minimum_release = ".".join(map(str, policy.minimum_release)) - msg = f"unsupported comparison release; requires v{minimum_release} or newer" - raise ValueError(msg) - - -def required_report_ids(root: Path | None = None) -> set[str]: - """Keep release discovery accountable to every report and plot selection.""" - return set(load_discovery(root or find_project_root(), "tooling/criterion-inventory.toml").required) - - -def configuration(root: Path | None = None) -> MeasurementConfig: - """Load the shared measurement schema from the consumer checkout.""" - config = load_measurement(root or find_project_root(), MEASUREMENT_CONFIG) - if not isinstance(config, MeasurementConfig): - msg = "la-stack requires schema 1 with dynamically discovered Criterion inventories" - raise ValueError(msg) # noqa: TRY004 - wrong configuration schema, not a caller type error - return config - - -def archive_directory(root: Path) -> str: - """Read the history path; shared report APIs validate its path and contents.""" - archive = tomllib.loads((root / REPORT_CONFIG).read_text(encoding="utf-8")).get("archive") - if not isinstance(archive, str) or not archive: - msg = "performance report configuration requires an archive path" - raise ValueError(msg) - return archive - - -def selected_ids(suite: str, scope: str, expected: tuple[str, ...], root: Path | None = None) -> tuple[str, ...]: - """Require the repository report registry, keeping diagnostic cases in the run.""" - if suite not in {"all", "exact", "vs_linalg"} or scope not in {"all-benches", "release-signal"}: - msg = "unknown la-stack suite or report scope" - raise ValueError(msg) - if scope == "all-benches": - return tuple(name for name in expected if not name.split("/")[0].removeprefix("d").isdigit() or "/la_stack_" in name) - policy = scientific_policy(root) - required = { - *(f"{group}/{bench}" for group, benches in policy.exact.items() for bench in benches if suite != "vs_linalg"), - *( - f"d{dimension}/{bench}" - for dimension in policy.dimensions - for bench in (*policy.library_benchmarks, *policy.additional.get(str(dimension), ())) - if suite != "exact" - ), - } - missing = required - set(expected) - if missing: - raise ValueError(f"inventory omits selected report rows: {sorted(missing)}") - return tuple(sorted(required)) - - -def phase_environment(root: Path) -> tuple[tuple[str, str], ...]: - """Capture code-generation overrides and isolate each phase's output tree.""" - toolchain = tomllib.loads((root / "rust-toolchain.toml").read_text(encoding="utf-8"))["toolchain"]["channel"] - env = {key: os.environ[key] for key in ("RUSTFLAGS", "CARGO_ENCODED_RUSTFLAGS", "RUSTC", "RUSTC_WRAPPER", "CARGO_BUILD_TARGET") if key in os.environ} - env.update(RUSTUP_TOOLCHAIN=os.environ.get("RUSTUP_TOOLCHAIN", toolchain), CARGO_TARGET_DIR="target", CRITERION_HOME="target/criterion") - key, separator = ("CARGO_ENCODED_RUSTFLAGS", "\x1f") if "CARGO_ENCODED_RUSTFLAGS" in env else ("RUSTFLAGS", " ") - flags = [env.get(key, ""), "--cap-lints=warn"] - env[key] = separator.join(flag for flag in flags if flag) - return tuple(sorted(env.items())) - - -def measurement_plan(root: Path, pair: ReleasePair, suite: str, scope: str) -> CommonHarnessPlan: - """Build the shared plan from complete native inventories.""" - validate_measurement_pair(pair, root) - environment = phase_environment(root) - config = configuration(root) - inventories = {} - for phase in ("baseline", "current"): - # Both revisions use the captured current harness. The shared collector - # later checks this entire inventory on each measured source. - declarations = load_discovery(root, "tooling/criterion-inventory.toml") - discovery = DiscoveryPlan( - tuple( - DiscoveryCommand(item.name, (*config.command[:-1], f"{phase}-{item.name}", "list"), timeout=config.timeout) - for item in declarations.suites - if suite in {"all", item.name} - ) - ) - inventories[phase] = discover_inventory(root, discovery, env=os.environ | dict(environment)).expected - return declared_plan(suite, scope, inventories, baseline_env=environment, current_env=environment, config=config, root=root) - - -def declared_plan( # noqa: PLR0913 - suite: str, - scope: str, - inventories: dict[str, tuple[str, ...]], - *, - baseline_env: tuple[tuple[str, str], ...], - current_env: tuple[tuple[str, str], ...], - config: MeasurementConfig | None = None, - root: Path | None = None, -) -> CommonHarnessPlan: - """Bind exact case inventories, reference phases, commands and completeness.""" - config = config or configuration(root) - policy = scientific_policy(root) - selected = selected_ids(suite, scope, inventories["current"], root) - missing = set(selected) - set(inventories["baseline"]) - if missing: - raise ValueError(f"baseline inventory omits selected rows: {sorted(missing)}") - series = [ - RunSeries("la-stack baseline", "baseline", tuple((name, name) for name in selected)), - RunSeries("la-stack current", "current", tuple((name, name) for name in selected)), - ] - peers = policy.peers - for library, peer_index in (("nalgebra", 0), ("faer", 1)): - rows = tuple( - (name, f"{name.split('/')[0]}/{peers[name.split('/')[1]][peer_index]}") for name in selected if name.startswith("d") and name.split("/")[1] in peers - ) - if rows: - series.append(RunSeries(library, "baseline", rows)) - phases = { - phase: MeasurementPhase( - (*config.command[:-1], f"{phase}-{suite}"), - (*config.command[:-1], "gate"), - CompletePolicy(inventories[phase], sample_count=100, statistics=("mean", "median"), confidence_level=0.95), - environment, - ) - for phase, environment in (("baseline", baseline_env), ("current", current_env)) - } - config = replace( - config, - command=phases["current"].command, - context=( - *config.context, - ("suite", suite), - ("scope", scope), - # Preserve the provenance field used by retained modern complete runs. - ("baseline-api-compatibility", "none"), - ), - ) - return CommonHarnessPlan(config, phases["baseline"], phases["current"], tuple(series)) - - -def validate_scientific_run(evidence: Evidence, *, release: bool = False, root: Path | None = None) -> CompleteRun: - """Require la-stack's sampling, selected coverage and original reference phases.""" - run = validate_run_evidence(evidence) - sources = dict(evidence.sources) - context = dict(sources["current"].context) - pair = ReleasePair(context["release"], dict(sources["baseline"].context)["release"]) - if release and pair.current == pair.baseline: - msg = "cannot promote a same-version local comparison as release documentation" - raise ValueError(msg) - if pair.current == pair.baseline and sources["current"].source_sha256 == sources["baseline"].source_sha256: - msg = "same-version local comparisons require distinct source identities" - raise ValueError(msg) - samples = dict(run.phases) - if any(sample.policy != CompletePolicy(sample.policy.expected) for sample in samples.values()): - msg = "la-stack requires 100 samples, mean and median, and 95% intervals in ns" - raise ValueError(msg) - expected = declared_plan( - context["suite"], - context["scope"], - {phase: sample.policy.expected for phase, sample in samples.items()}, - baseline_env=(), - current_env=(), - root=root, - ) - if run.series != expected.series: - msg = "retained series differs from la-stack declarations" - raise ValueError(msg) - if set(run.compatible) != set(expected.measurement.compatible): - msg = "retained run omits required host, toolchain, or dependency compatibility" - raise ValueError(msg) - required = dict(expected.measurement.context) - for phase, source in evidence.sources: - actual = dict(source.context) - if any(actual.get(key) != value for key, value in required.items()): - msg = "retained phase differs from the declared consumer policy" - raise ValueError(msg) - for key, native_command in (("command", getattr(expected, phase).command), ("gate-command", getattr(expected, phase).gate)): - recorded = tuple(json.loads(actual[key])) - if recorded != native_command: - raise ValueError(f"retained {phase} {key} differs from the declared Cargo phase") - return run - - -def scratch_paths(stem: Path) -> tuple[Path, Path]: - """Use new paths and framing, independent of historical CSV/JSON evidence.""" - return stem.with_suffix(".run.json"), stem.with_suffix(".evidence.json") - - -def retained_run(root: Path, stem: Path) -> Evidence: - """Resolve validated shared history only when every scratch input is absent.""" - paths = scratch_paths(stem) - legacy = (stem.with_suffix(".csv"), stem.with_suffix(".provenance.json"), stem.with_suffix(".full.csv"), stem.with_suffix(".full.provenance.json")) - # Partial new or legacy scratch must never silently select older history. - present = any(path.exists() or path.is_symlink() for path in (*paths, *legacy)) - evidence = load_evidence(*paths) if present else load_latest_run(root, archive_directory(root)) - validate_scientific_run(evidence, root=root) - return evidence - - -def verify_current_source(root: Path, evidence: Evidence) -> dict[str, bytes]: - """Bind README publication to the measured current library and captured harness.""" - source = dict(evidence.sources)["current"] - context = dict(source.context) - config = configuration(root) - inputs: dict[str, bytes] = {} - for key, expected in (("source-inventory", source.source_sha256), ("harness-inventory", source.harness_sha256)): - names = cast("list[str]", json.loads(context[key])) - patterns = config.sources if key == "source-inventory" else config.harness - actual = {path.relative_to(root).as_posix() for pattern in patterns for path in root.glob(pattern)} - if actual != set(names): - raise ValueError(f"current {key} has stale file membership") - observed = {name: (root / name).read_bytes() for name in names} - if fingerprint_files(root, tuple(Path(name) for name in names)) != expected or any( - (root / name).read_bytes() != data for name, data in observed.items() - ): - raise ValueError(f"current {key} is stale relative to retained measurements") - inputs.update(observed) - version = tomllib.loads(inputs["Cargo.toml"].decode("utf-8"))["package"]["version"] - if f"v{version}" != context["release"]: - msg = "retained release does not match the current package" - raise ValueError(msg) - return inputs diff --git a/scripts/tests/__init__.py b/scripts/tests/__init__.py deleted file mode 100644 index 2f9b1e9..0000000 --- a/scripts/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for the repository's Python support scripts.""" diff --git a/scripts/tests/test_performance_workflow.py b/scripts/tests/test_performance_workflow.py deleted file mode 100644 index 8bd6ac1..0000000 --- a/scripts/tests/test_performance_workflow.py +++ /dev/null @@ -1,937 +0,0 @@ -"""Installed-package acceptance of la-stack's complete performance workflow.""" - -import hashlib -import json -import os -import shlex -import shutil -import subprocess -import sys -import tomllib -from dataclasses import replace -from pathlib import Path -from typing import TYPE_CHECKING - -import pytest -from research_repo_tools import publication -from research_repo_tools.common_measurement import CommonHarnessPlan, measure_prepared_pair -from research_repo_tools.complete_runs import CompletePolicy, RunSeries, render_run, run_identity, serialize_run -from research_repo_tools.just_inspect import dry_run -from research_repo_tools.postprocess_changelog import MarkdownFormatError -from research_repo_tools.process import ExecutableNotFoundError, run_command -from research_repo_tools.release_pairs import ReleasePair - -import archive_performance as plot -import archive_performance as workflow -import performance_runs as policy -from performance_runs import required_report_ids - -if TYPE_CHECKING: - from research_repo_tools.evidence import Evidence - from research_repo_tools.publication import PublicationPlan - -ROOT = Path(__file__).resolve().parents[2] -PAIR = ReleasePair("v0.5.1", "v0.5.0") -DRIVER = """import json, sys -from pathlib import Path -action, phase = sys.argv[1:] -if action == "measure": - for name in INVENTORIES[phase]: - path = Path("target/criterion") / name / "new" - path.mkdir(parents=True) - value = (16.0 if "/faer_" in name else 10.0) if phase == "baseline" else 8.0 - estimate = {"point_estimate": value, "confidence_interval": {"lower_bound": value * .9, "upper_bound": value * 1.1, "confidence_level": .95}} - mean = (32.0 if "/faer_" in name else 20.0) if phase == "baseline" else 12.0 - mean_interval = {"lower_bound": mean - mean / 10, "upper_bound": mean + mean / 10, "confidence_level": .95} - mean_estimate = {"point_estimate": mean, "confidence_interval": mean_interval} - estimates = {"mean": mean_estimate, "median": estimate} - sample = {"iters": [1] * 100, "times": [value] * 100} - for filename, data in (("benchmark.json", {"full_id": name}), ("estimates.json", estimates), ("sample.json", sample)): - (path / filename).write_text(json.dumps(data)) -""" - - -def prepared(tmp_path: Path) -> tuple[Path, Path, CommonHarnessPlan]: - """Use the real consumer inventory and policies with a bounded timing fixture.""" - ids = tuple(sorted(required_report_ids())) - inventories = { - "baseline": ids, - "current": tuple(name for name in ids if not name.startswith("d") or "/la_stack_" in name), - } - for phase in ("baseline", "current"): - root = tmp_path / phase - root.mkdir(parents=True) - shutil.copyfile(ROOT / "pyproject.toml", root / "pyproject.toml") - (root / "src").mkdir() - (root / "src/lib.rs").write_text(f"// {phase}\n", encoding="utf-8") - for pattern in policy.configuration(ROOT).harness: - for source in ROOT.glob(pattern): - destination = root / source.relative_to(ROOT) - destination.parent.mkdir(parents=True, exist_ok=True) - shutil.copyfile(source, destination) - # The synthetic release pair stays fixed when the real crate advances. - manifest = root / "Cargo.toml" - contents = manifest.read_text(encoding="utf-8") - version = tomllib.loads(contents)["package"]["version"] - contents = contents.replace(f'version = "{version}"', f'version = "{PAIR.current.removeprefix("v")}"', 1) - manifest.write_text(contents, encoding="utf-8") - (root / "tooling/fixture.py").write_text(f"INVENTORIES = {inventories!r}\n" + DRIVER, encoding="utf-8") - (root / "tooling/performance.just").write_text( - "\n".join( - f"{recipe}:\n {shlex.quote(sys.executable)} tooling/fixture.py {action} {phase}\n" - for recipe, action, phase in (("gate", "gate", "current"), ("baseline-all", "measure", "baseline"), ("current-all", "measure", "current")) - ), - encoding="utf-8", - ) - config = (root / policy.MEASUREMENT_CONFIG).read_text(encoding="utf-8") - (root / policy.MEASUREMENT_CONFIG).write_text( - config.replace(' "tooling/performance.just",', ' "tooling/performance.just", "tooling/fixture.py",'), encoding="utf-8" - ) - run_command("git", ["--no-pager", "init", "--quiet"], cwd=root) - run_command( - "git", - [ - "--no-pager", - "-c", - "user.name=Fixture", - "-c", - "user.email=fixture@example.invalid", - "-c", - "commit.gpgsign=false", - "commit", - "--allow-empty", - "--quiet", - "-m", - phase, - ], - cwd=root, - ) - baseline, current = tmp_path / "baseline", tmp_path / "current" - plan = policy.declared_plan("all", "release-signal", inventories, baseline_env=(), current_env=(), config=policy.configuration(current)) - return baseline, current, plan - - -def measured(tmp_path: Path) -> tuple[Path, Evidence]: - baseline, current, plan = prepared(tmp_path) - evidence = measure_prepared_pair(baseline, current, plan, PAIR, working_tree=True) - (current / "tooling").mkdir(exist_ok=True) - shutil.copyfile(ROOT / policy.REPORT_CONFIG, current / policy.REPORT_CONFIG) - shutil.copyfile(ROOT / workflow.PLOT_CONFIG, current / workflow.PLOT_CONFIG) - return current, evidence - - -@pytest.fixture(scope="module") -def measured_run(tmp_path_factory: pytest.TempPathFactory) -> tuple[Path, Evidence]: - """Measure once; publication regressions operate on independent copies.""" - return measured(tmp_path_factory.mktemp("measured-run")) - - -@pytest.fixture -def complete_run(tmp_path: Path, measured_run: tuple[Path, Evidence]) -> tuple[Path, Evidence]: - root, evidence = measured_run - destination = tmp_path / "current" - shutil.copytree(root, destination) - return destination, evidence - - -def test_common_harness_and_reference_phase(tmp_path: Path) -> None: - baseline, current, plan = prepared(tmp_path) - (baseline / "benches/exact.rs").write_text("obsolete harness\n", encoding="utf-8") - evidence = measure_prepared_pair(baseline, current, plan, PAIR, working_tree=True) - run = policy.validate_scientific_run(evidence) - sources = dict(evidence.sources) - assert sources["baseline"].harness_sha256 == sources["current"].harness_sha256 - assert sources["baseline"].source_sha256 != sources["current"].source_sha256 - assert (baseline / "benches/exact.rs").read_bytes() == (current / "benches/exact.rs").read_bytes() - assert {series.phase for series in run.series if series.name in {"nalgebra", "faer"}} == {"baseline"} - for _, sample in run.phases: - assert sample.policy.sample_count == 100 - assert sample.policy.statistics == ("mean", "median") - assert sample.policy.confidence_level == 0.95 - assert sample.policy.unit == "ns" - - -def test_measurement_worktrees_accept_an_aliased_system_temporary_directory(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - """Canonicalize owned temporary paths before the native worktree safety check.""" - root = tmp_path.resolve() / "repository" - root.mkdir() - (root / "Cargo.toml").write_text('[package]\nname = "fixture"\nversion = "0.5.1"\n', encoding="utf-8") - (root / "tooling").mkdir() - shutil.copyfile(ROOT / policy.POLICY_CONFIG, root / policy.POLICY_CONFIG) - run_command("git", ["--no-pager", "init", "--quiet"], cwd=root) - run_command("git", ["--no-pager", "add", "Cargo.toml"], cwd=root) - run_command( - "git", - [ - "--no-pager", - "-c", - "user.name=Fixture", - "-c", - "user.email=fixture@example.invalid", - "-c", - "commit.gpgsign=false", - "commit", - "--quiet", - "-m", - "fixture", - ], - cwd=root, - ) - run_command("git", ["--no-pager", "-c", "tag.gpgsign=false", "tag", PAIR.baseline], cwd=root) - run_command("git", ["--no-pager", "remote", "add", "origin", str(root)], cwd=root) - physical = tmp_path.resolve() / "temporary" - physical.mkdir() - alias = tmp_path.resolve() / "temporary-alias" - if sys.platform == "win32": - run_command("cmd", ["/c", "mklink", "/J", str(alias), str(physical)], cwd=tmp_path) - else: - alias.symlink_to(physical, target_is_directory=True) - monkeypatch.setattr(workflow.tempfile, "tempdir", str(alias)) - monkeypatch.setattr(workflow, "measurement_plan", lambda *_args: object()) - - def benchmark_ready(baseline: Path, current: Path, _plan: object, _pair: ReleasePair, *, working_tree: bool) -> Evidence: - assert working_tree - for checkout in (baseline, current): - assert checkout.is_dir() - assert not any(path.is_symlink() or path.is_junction() for path in (checkout, *checkout.parents)) - assert (checkout / "Cargo.toml").read_bytes() == (root / "Cargo.toml").read_bytes() - msg = "native worktrees ready" - raise RuntimeError(msg) - - monkeypatch.setattr(workflow, "measure_prepared_pair", benchmark_ready) - with pytest.raises(RuntimeError, match="native worktrees ready"): - workflow.measure(root, PAIR, "all", "release-signal") - assert list(physical.iterdir()) == [] - - -@pytest.mark.parametrize("phase", ["baseline", "current"]) -def test_consumer_plan_rejects_an_inventory_missing_a_required_report_row(phase: str) -> None: - missing = "d64/la_stack_lu_solve" - ids = tuple(sorted(required_report_ids())) - assert missing in ids - inventories = {"baseline": ids, "current": ids} - inventories[phase] = tuple(name for name in ids if name != missing) - with pytest.raises(ValueError, match=rf"inventory omits selected (?:report )?rows: \['{missing}'\]"): - policy.declared_plan("all", "release-signal", inventories, baseline_env=(), current_env=(), root=ROOT) - - -@pytest.mark.parametrize("report_path", ["docs/performance.md", "docs/reports/current.md"]) -def test_shared_retention_repeated_runs_and_offline_report(complete_run: tuple[Path, Evidence], report_path: str) -> None: - root, first = complete_run - config = root / policy.REPORT_CONFIG - config.write_text( - config.read_text(encoding="utf-8") - .replace("docs/performance-runs", "docs/performance-history") - .replace("docs/performance.md", report_path) - .replace("la-stack complete benchmark measurements", "Configured performance report"), - encoding="utf-8", - newline="\n", - ) - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, first) - assert stem.with_suffix(".md").read_bytes() == render_run( - first, - report_path="target/bench-reports/performance.md", - payload_path="target/bench-reports/performance.run.json", - manifest_path="target/bench-reports/performance.evidence.json", - ) - workflow.promote(root, stem) - first_report = (root / report_path).read_bytes() - assert b"Configured performance report" in first_report - assert b"Recorded measurement provenance" in first_report - assert b"run.json" in first_report - assert b"evidence.json" in first_report - assert b"## Mean (ns)" in first_report - assert b"## Median (ns)" in first_report - assert b"nalgebra: measured in **baseline** phase" in first_report - assert b"faer: measured in **baseline** phase" in first_report - assert not (root / policy.archive_directory(root) / "current.md").exists() - if report_path != "docs/performance.md": - assert not (root / "docs/performance.md").exists() - retained = root / policy.archive_directory(root) / "runs" / run_identity(first) - original = {path: path.read_bytes() for path in retained.iterdir()} - # A second valid measurement with the same release pair has new provenance. - sources = tuple((phase, replace(source, context=(*source.context, ("experiment", "second")))) for phase, source in first.sources) - second = replace(first, sources=sources) - workflow.save_scratch(root, stem, second) - workflow.promote(root, stem) - assert len(list((root / policy.archive_directory(root) / "runs").iterdir())) == 2 - assert {path: path.read_bytes() for path in original} == original - assert (retained / "run.json").is_file() - assert first_report != (root / report_path).read_bytes() - assert not (root / "docs/archive/performance").exists() - shutil.rmtree(root / "target") - assert run_identity(policy.retained_run(root, stem)) == run_identity(second) - before = (root / report_path).read_bytes() - workflow.promote(root, stem) - assert (root / report_path).read_bytes() == before - (root / policy.archive_directory(root) / "latest.json").write_text("{}", encoding="utf-8") - with pytest.raises(ValueError, match=r"latest|pointer|fields|schema"): - policy.retained_run(root, stem) - - -def test_partial_scratch_and_stale_source_cannot_select_old_history(tmp_path: Path) -> None: - root, evidence = measured(tmp_path) - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - workflow.promote(root, stem) - policy.scratch_paths(stem)[1].unlink() - with pytest.raises(FileNotFoundError): - policy.retained_run(root, stem) - (root / "src/lib.rs").write_text("// stale\n", encoding="utf-8") - with pytest.raises(ValueError, match="stale"): - policy.verify_current_source(root, evidence) - - -def prepare_readme_recipe(root: Path, statistic: str) -> None: - """Make the native README recipe runnable against the retained fixture.""" - original = ( - (ROOT / "README.md") - .read_text(encoding="utf-8") - .replace(":lu_solve:median:new:", f":lu_solve:{statistic}:new:") - .replace("vs_linalg_lu_solve_median", f"vs_linalg_lu_solve_{statistic}") - .replace("median time vs dimension", f"{statistic} time vs dimension") - ) - (root / "README.md").write_text(original, encoding="utf-8") - for name in ("justfile", "uv.lock", ".python-version"): - shutil.copyfile(ROOT / name, root / name) - (root / "scripts").mkdir() - for name in ("archive_performance.py", "performance_runs.py"): - shutil.copyfile(ROOT / "scripts" / name, root / "scripts" / name) - - -def assert_readme_presentation(readme: str, statistic: str) -> None: - """Check the consumer's compact style, comparison direction and figure.""" - table = readme.split(f"", 1)[1].split(f"", 1)[0] - assert f"| Dimension | la-stack ({PAIR.current}) | nalgebra (" in table - assert "| faer (" in table - assert "| Speedup vs nalgebra | Speedup vs faer |" in table - assert "(0.95 confidence)" not in table - assert table.count("Confidence level: 95%.") == 1 - assert f"Statistic: {statistic}. Unit: ns." in table - current, peer, ratio = ("12
[10.8, 13.2]", "20
[18, 22]", "1.66667") if statistic == "mean" else ("8
[7.2, 8.8]", "10
[9, 11]", "1.25") - faer, faer_ratio = ("32
[28.8, 35.2]", "2.66667") if statistic == "mean" else ("16
[14.4, 17.6]", "2") - multiplication_sign = "\N{MULTIPLICATION SIGN}" - assert f"| 2 | {current} | {peer} | {faer} | {ratio}{multiplication_sign} | {faer_ratio}{multiplication_sign} |" in table - assert "ratios are point estimates, with no ratio intervals or significance claims" in table - for name in ("nalgebra", "faer"): - assert f"Speedup vs {name}: ratio; numerator = {name} (" in table - assert table.count(f"denominator = la-stack ({PAIR.current})") == 2 - assert "time reduction" not in table - assert f"![LU solve (factor + solve): {statistic} time vs dimension][lu-solve-benchmark]" in readme - assert ( - f"[lu-solve-benchmark]: https://raw.githubusercontent.com/acgetchell/la-stack/{PAIR.current}/docs/assets/bench/vs_linalg_lu_solve_{statistic}.svg" - in readme - ) - - -@pytest.mark.parametrize(("archive", "statistic"), [("docs/performance-runs", "median"), ("docs/performance-history", "mean")]) -def test_readme_uses_original_reference_phases_after_cleanup( - complete_run: tuple[Path, Evidence], monkeypatch: pytest.MonkeyPatch, archive: str, statistic: str -) -> None: - root, evidence = complete_run - config = root / policy.REPORT_CONFIG - config.write_text(config.read_text(encoding="utf-8").replace("docs/performance-runs", archive), encoding="utf-8") - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - workflow.promote(root, stem) - prepare_readme_recipe(root, statistic) - monkeypatch.setenv("UV_PROJECT_ENVIRONMENT", sys.prefix) - # Execute the actual recipe and installed renderer, without measurements. - result = run_command("just", ["--no-deps", "performance-readme", "lu_solve", statistic, "new", "true"], cwd=root, check=False) - assert result.returncode == 0, result.stdout + result.stderr - monkeypatch.setattr(plot, "_repo_root", lambda: root) - monkeypatch.chdir(root.parent) - arguments = ["--stat", statistic, "--update-readme", "--log-y"] - assert_readme_presentation((root / "README.md").read_text(encoding="utf-8"), statistic) - assets = root / "docs/assets/bench" - csv = assets / f"vs_linalg_lu_solve_{statistic}.csv" - import csv as csv_module # noqa: PLC0415 - - with csv.open(encoding="utf-8", newline="") as stream: - rows = list(csv_module.DictReader(stream)) - assert len(rows) == 24 - assert {row["phase"] for row in rows if row["series"] in {"nalgebra", "faer"}} == {"baseline"} - assert {row["phase"] for row in rows if row["series"] == "la-stack current"} == {"current"} - assert {float(row["coordinate"]) for row in rows} == {2, 3, 4, 5, 8, 16, 32, 64} - assert {row["unit"] for row in rows} == {"ns"} - dimension_two = [row for row in rows if float(row["coordinate"]) == 2] - expected = [(12.0, 10.8, 13.2), (20.0, 18.0, 22.0), (32.0, 28.8, 35.2)] if statistic == "mean" else [(8.0, 7.2, 8.8), (10.0, 9.0, 11.0), (16.0, 14.4, 17.6)] - assert [(float(row["point"]), float(row["lower"]), float(row["upper"])) for row in dimension_two] == expected - provenance = json.loads(csv.with_suffix(".provenance.json").read_bytes()) - assert provenance["series"]["nalgebra"] == "baseline" - assert provenance["run_id"] == run_identity(evidence) - assert b" None: - root, evidence = complete_run - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - workflow.promote(root, stem) - shutil.copyfile(ROOT / "README.md", root / "README.md") - assets = root / "docs/assets/bench" - assets.mkdir(parents=True) - for suffix in (".svg", ".csv", ".provenance.json"): - (assets / f"vs_linalg_lu_solve_median{suffix}").write_bytes(b"previous artifact\n") - before = {path: path.read_bytes() for path in (*assets.iterdir(), root / "README.md")} - - def fail_before_publication(*_args: object, **_kwargs: object) -> None: - raise error - - if isinstance(error, MarkdownFormatError): - monkeypatch.setattr(plot, "format_markdown", fail_before_publication) - else: - monkeypatch.setattr(publication, "run_git_bytes", fail_before_publication) - monkeypatch.setattr(plot, "_repo_root", lambda: root) - assert plot.dimension_main(["--update-readme"]) == 2 - output = capsys.readouterr() - assert output.out == "" - assert output.err.startswith("dimension publication:") - assert diagnostic in output.err - assert "Traceback" not in output.err - assert {path: path.read_bytes() for path in (*assets.iterdir(), root / "README.md")} == before - - -def test_stale_source_prevents_dimension_publication(complete_run: tuple[Path, Evidence], monkeypatch: pytest.MonkeyPatch) -> None: - root, evidence = complete_run - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - shutil.copyfile(ROOT / "README.md", root / "README.md") - original = (root / "README.md").read_bytes() - (root / "src/lib.rs").write_text("// changed library\n", encoding="utf-8") - monkeypatch.setattr(plot, "_repo_root", lambda: root) - assert plot.dimension_main(["--update-readme"]) == 2 - assert (root / "README.md").read_bytes() == original - assert not (root / "docs/assets/bench").exists() - - -@pytest.mark.parametrize("retained", [False, True]) -def test_readme_requires_matching_retained_evidence( - complete_run: tuple[Path, Evidence], monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], retained: bool -) -> None: - root, evidence = complete_run - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - if retained: - workflow.promote(root, stem) - sources = tuple((phase, replace(source, context=(*source.context, ("experiment", "unpromoted")))) for phase, source in evidence.sources) - workflow.save_scratch(root, stem, replace(evidence, sources=sources)) - shutil.copyfile(ROOT / "README.md", root / "README.md") - before = {path: path.read_bytes() for path in (root / "docs").rglob("*") if path.is_file()} if retained else {} - before[root / "README.md"] = (root / "README.md").read_bytes() - monkeypatch.setattr(plot, "_repo_root", lambda: root) - - assert plot.dimension_main(["--update-readme"]) == 2 - - output = capsys.readouterr() - assert output.out == "" - assert ("README evidence differs from the retained latest run" if retained else "no retained latest run") in output.err - assert {path: path.read_bytes() for path in before} == before - assert not (root / "docs/assets/bench").exists() - - -def test_readme_edit_during_rendering_is_preserved(complete_run: tuple[Path, Evidence], monkeypatch: pytest.MonkeyPatch) -> None: - root, evidence = complete_run - workflow.save_scratch(root, root / "target/bench-reports/performance", evidence) - workflow.promote(root, root / "target/bench-reports/performance") - shutil.copyfile(ROOT / "README.md", root / "README.md") - document = root / "README.md" - edited = document.read_bytes() + b"\nConcurrent maintainer edit.\n" - planner = workflow.plan_outputs - - def edit_before_snapshot(directory: Path, outputs: dict[str, bytes], *, inputs: dict[str, bytes]) -> PublicationPlan: - document.write_bytes(edited) - return planner(directory, outputs, inputs=inputs) - - monkeypatch.setattr(workflow, "plan_outputs", edit_before_snapshot) - with pytest.raises(ValueError, match="README changed during rendering"): - workflow.publish_plot(root, "lu_solve", "median", log_y=True, update_readme=True) - assert document.read_bytes() == edited - assert not (root / "docs/assets/bench").exists() - - -def test_existing_tag_cannot_receive_different_measured_assets(complete_run: tuple[Path, Evidence]) -> None: - root, evidence = complete_run - workflow.save_scratch(root, root / "target/bench-reports/performance", evidence) - workflow.promote(root, root / "target/bench-reports/performance") - shutil.copyfile(ROOT / "README.md", root / "README.md") - assets = root / "docs/assets/bench" - assets.mkdir(parents=True) - for suffix in (".svg", ".csv", ".provenance.json"): - (assets / f"vs_linalg_lu_solve_median{suffix}").write_bytes(b"previous tagged artifact\n") - run_command("git", ["--no-pager", "add", "docs/assets/bench"], cwd=root) - run_command( - "git", - [ - "--no-pager", - "-c", - "user.name=Fixture", - "-c", - "user.email=fixture@example.invalid", - "-c", - "commit.gpgsign=false", - "commit", - "--quiet", - "-m", - "previous artifacts", - ], - cwd=root, - ) - run_command("git", ["--no-pager", "-c", "tag.gpgsign=false", "tag", PAIR.current], cwd=root) - originals = {path: path.read_bytes() for path in (*assets.iterdir(), root / "README.md")} - with pytest.raises(ValueError, match="exact publication artifact"): - workflow.publish_plot(root, "lu_solve", "median", log_y=True, update_readme=True) - assert {path: path.read_bytes() for path in originals} == originals - - -@pytest.mark.parametrize("scratch_present", [False, True]) -@pytest.mark.parametrize("changed", ["source-membership", "unindexed-run", "selected-evidence"]) -def test_dimension_publication_rechecks_membership_and_retained_selection( - complete_run: tuple[Path, Evidence], monkeypatch: pytest.MonkeyPatch, changed: str, scratch_present: bool -) -> None: - root, evidence = complete_run - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - workflow.promote(root, stem) - shutil.copyfile(ROOT / "README.md", root / "README.md") - if not scratch_present: - shutil.rmtree(root / "target") - original = (root / "README.md").read_bytes() - publish = workflow.publish_publication - - def change_before_publication(plan: PublicationPlan) -> tuple[Path, ...]: - if changed == "source-membership": - (root / "src/added.rs").write_text("// added after planning\n", encoding="utf-8") - elif changed == "selected-evidence": - # Scratch is an input only while present; the archive remains the - # selected source after cleanup. - if scratch_present: - policy.scratch_paths(stem)[0].write_bytes(b"{}\n") - else: - (root / policy.archive_directory(root) / "runs" / run_identity(evidence) / "run.json").write_bytes(b"{}\n") - else: - unexpected = root / policy.archive_directory(root) / "runs" / ("f" * 64) - unexpected.mkdir() - (unexpected / "run.json").write_bytes(b"{}\n") - return publish(plan) - - monkeypatch.setattr(workflow, "_repo_root", lambda: root) - monkeypatch.setattr(workflow, "publish_publication", change_before_publication) - assert workflow.dimension_main(["--update-readme"]) == 2 - assert (root / "README.md").read_bytes() == original - assert not (root / "docs/assets/bench").exists() - - -def test_complete_report_passes_markdown_recipes_without_rewriting_history(complete_run: tuple[Path, Evidence]) -> None: - root, evidence = complete_run - stem = root / "target/bench-reports/performance" - workflow.save_scratch(root, stem, evidence) - workflow.promote(root, stem) - # Exercise the real recipes against generated, nonignored Markdown in a - # disposable checkout, reusing the already locked test environment. - for name in ("uv.lock", ".python-version"): - shutil.copyfile(ROOT / name, root / name) - shutil.copyfile(ROOT / "README.md", root / "README.md") - workflow.publish_plot(root, "lu_solve", "median", log_y=True, update_readme=True) - history = root / policy.archive_directory(root) - originals = {path: path.read_bytes() for path in history.rglob("*") if path.is_file()} - originals[root / "docs/performance.md"] = (root / "docs/performance.md").read_bytes() - originals[root / "README.md"] = (root / "README.md").read_bytes() - for recipe in ("markdown-check", "markdown-fix", "markdown-check"): - result = run_command( - "just", - ["--no-deps", "--justfile", str(ROOT / "justfile"), "--working-directory", str(root), recipe], - env={**os.environ, "UV_NO_SYNC": "1", "UV_PROJECT_ENVIRONMENT": sys.prefix}, - check=False, - ) - assert result.returncode == 0, result.stdout + result.stderr - assert {path: path.read_bytes() for path in originals} == originals - shutil.rmtree(root / "target") - assert run_identity(policy.retained_run(root, stem)) == run_identity(evidence) - - -def test_legacy_bytes_hashes_are_unchanged() -> None: - directory = ROOT / "docs/performance/v0.4.6-vs-v0.4.5/39719a1eb599d294dbbc1e46dc6fb0de2028ad2e59aab5f94fb48c7bf3d7f841" - hashes = { - "performance.csv": "b263bb34bcfd43b8fc8109110db9f2e908516aef6c01ce16f70f5ac18dc7ef2d", - "performance.full.csv": "4fa5cc13159f5dc91e711ae67554845bcbd1ace2cfc3e31487fc85f75d3dc459", - "performance.full.provenance.json": "a43f66e52035aecd8d235dfded916b23c3240529d0c07f793d27322521cfb0d0", - "performance.provenance.json": "89144a2899ba73f55d009da4fa20b4e6477600902b93cde469383f719c497508", - } - assert {name: hashlib.sha256((directory / name).read_bytes()).hexdigest() for name in hashes} == hashes - - -def test_retained_modern_evidence_below_measurement_floor_remains_readable() -> None: - """The execution floor must not disable replay of complete archived evidence.""" - identity = "634bc9527c2caf0a431a9bdfac082c190e1094f0b29eb6e3f28c4b96961cdec5" - directory = ROOT / "docs/performance-runs/runs" / identity - evidence = policy.load_evidence(directory / "run.json", directory / "evidence.json") - run = policy.validate_scientific_run(evidence, release=True, root=ROOT) - releases = {phase: dict(source.context)["release"] for phase, source in evidence.sources} - assert releases == {"baseline": "v0.4.6", "current": "v0.5.0"} - with pytest.raises(ValueError, match=r"requires v0\.5\.0 or newer"): - policy.validate_measurement_pair(ReleasePair(releases["current"], releases["baseline"]), ROOT) - assert {series.phase for series in run.series if series.name in {"nalgebra", "faer"}} == {"baseline"} - report = render_run( - evidence, - report_path="docs/performance.md", - payload_path=f"docs/performance-runs/runs/{identity}/run.json", - manifest_path=f"docs/performance-runs/runs/{identity}/evidence.json", - ) - assert identity.encode() in report - assert b"v0.4.6" in report - - -def test_native_command_policy_and_phase_environment() -> None: - justfile = Path("tooling/performance.just") - baseline = dry_run(ROOT, "baseline-all", justfile=justfile).stderr - current = dry_run(ROOT, "current-all", justfile=justfile).stderr - assert baseline.count("cargo bench --locked") == current.count("cargo bench --locked") == 2 - assert baseline.count("--noplot") == current.count("--noplot") == 2 - assert "la_stack" in current - assert "la_stack" not in baseline - assert "--list" not in baseline - assert dry_run(ROOT, "baseline-all", ["list"], justfile=justfile).stderr.count("--list") == 2 - gate = dry_run(ROOT, "gate", justfile=justfile).stderr - assert "--test vs_linalg_inputs --test exact_bench_config" in gate - environment = dict(policy.phase_environment(ROOT)) - assert environment["CARGO_TARGET_DIR"] == "target" - assert environment["CRITERION_HOME"] == "target/criterion" - - -@pytest.mark.parametrize("baseline_tag", ["v0.5.0", "v0.5.1"]) -@pytest.mark.parametrize("scope", ["release-signal", "all-benches"]) -def test_native_inventory_and_phase_commands_use_the_measured_checkout(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, baseline_tag: str, scope: str) -> None: - """Exercise the configured Justfile, stubbing only the expensive Cargo boundary.""" - root = tmp_path / "checkout with spaces" - # Native benchmark policy needs the root configs, not the scanner environment. - shutil.copytree(ROOT / "tooling", root / "tooling", ignore=shutil.ignore_patterns("semgrep")) - shutil.copyfile(ROOT / "rust-toolchain.toml", root / "rust-toolchain.toml") - binary = tmp_path / "bin" - binary.mkdir() - cargo = binary / "cargo" - # Diagnostic norm registrations include the two reference scenario kernels. - norm_rows = { - f"d{dimension}/{bench}" - for dimension in (2, 3, 4, 5) - for bench in ( - "la_stack_norm2", - *( - f"{kernel}_norm2_scenario_{scenario}" - for kernel in ("la_stack", "iterative_f64_hypot", "delaunay_scaled_norm") - for scenario in ("descending", "repeated_scale", "sparse", "wide_dynamic_range") - ), - ) - } - ordinary_norm_peers = { - f"d{dimension}/{bench}" for dimension in (2, 3, 4, 5) for bench in ("iterative_f64_hypot", "delaunay_scaled_norm", "nalgebra_norm", "faer_norm_l2") - } - ids = required_report_ids() | norm_rows | ordinary_norm_peers - exact = sorted(name for name in ids if not name.startswith("d")) - baseline_ids = sorted(name for name in ids if name.startswith("d")) - current_ids = sorted(name for name in baseline_ids if "/la_stack_" in name) - cargo.write_text( - "#!/bin/sh\n" - "directory=$(pwd -W 2>/dev/null || pwd -P)\n" - 'printf "%s|%s|%s\\n" "$directory" "$CRITERION_HOME" "$*" >> "$CARGO_RECORD"\n' - 'case "$*" in\n' - f' *"--bench exact"*) printf "%s: benchmark\\n" {shlex.join(exact)} ;;\n' - f' *"la_stack --noplot"*) printf "%s: benchmark\\n" {shlex.join(current_ids)} ;;\n' - f' *"--bench vs_linalg"*) printf "%s: benchmark\\n" {shlex.join(baseline_ids)} ;;\n' - "esac\n", - encoding="utf-8", - newline="\n", - ) - cargo.chmod(0o755) - record = tmp_path / "commands.txt" - monkeypatch.setenv("PATH", f"{binary}{os.pathsep}{os.environ['PATH']}") - monkeypatch.setenv("CARGO_RECORD", str(record)) - monkeypatch.setenv("CRITERION_HOME", "target/criterion") - monkeypatch.chdir(tmp_path) - pair = ReleasePair(PAIR.current, baseline_tag) - plan = policy.measurement_plan(root, pair, "all", scope) - assert isinstance(plan.current.policy, CompletePolicy) - assert isinstance(plan.baseline.policy, CompletePolicy) - assert set(plan.current.policy.expected) == set(current_ids) | set(exact) - assert set(plan.baseline.policy.expected) == ids - assert ordinary_norm_peers <= set(plan.baseline.policy.expected) - assert "d2/la_stack_norm2_sq" in plan.baseline.policy.expected - series = {item.name: {name for name, _ in item.rows} for item in plan.series} - assert series["la-stack baseline"] == series["la-stack current"] - if scope == "all-benches": - assert "d2/la_stack_norm2" in series["la-stack current"] - assert "d2/la_stack_norm2_scenario_sparse" in series["la-stack current"] - for command in (plan.baseline.gate, plan.baseline.command, plan.current.command): - run_command(command[0], command[1:], cwd=root) - lines = record.read_text(encoding="utf-8").splitlines() - assert len(lines) == 9 - for index, line in enumerate(lines): - directory, criterion_home, arguments = line.split("|", 2) - assert Path(directory).samefile(root) - output = Path(criterion_home) - assert output.is_absolute() - if index < 4: - # Discovery supplies its own disposable absolute output tree. - assert not output.is_relative_to(root) - else: - # Cargo runs comparison benches from their workspace member, so - # every benchmark process must receive the same absolute tree. - assert output == root / "target/criterion" - assert "--locked" in arguments.split() - assert all("--list" in line for line in lines[:4]) - assert all("--list" not in line for line in lines[4:]) - assert "test --locked --workspace --features bench,exact --test vs_linalg_inputs --test exact_bench_config" in lines[4] - - -def test_retired_python_phase_format_is_rejected(tmp_path: Path) -> None: - _, evidence = measured(tmp_path) - run = policy.validate_scientific_run(evidence) - cargo = { - "baseline": [ - ["cargo", "bench", "--locked", "-p", "la-stack-comparison", "--features", "bench", "--bench", "vs_linalg", "--", "--noplot"], - ["cargo", "bench", "--locked", "--features", "bench,exact", "--bench", "exact", "--", "--noplot"], - ], - "current": [ - ["cargo", "bench", "--locked", "-p", "la-stack-comparison", "--features", "bench", "--bench", "vs_linalg", "--", "la_stack", "--noplot"], - ["cargo", "bench", "--locked", "--features", "bench,exact", "--bench", "exact", "--", "--noplot"], - ], - } - sources = [] - for phase, source in evidence.sources: - context = dict(source.context) - del context["phase-driver"] - del context["tool.just"] - context.update((f"{name}-cargo-commands", json.dumps(commands)) for name, commands in cargo.items()) - for key, action in (("command", "measure"), ("gate-command", "gate")): - context[key] = json.dumps(["/retired/venv/python", "scripts/performance_phase.py", action, "all", phase]) - sources.append((phase, replace(source, context=tuple(context.items())))) - legacy = replace( - evidence, - sources=tuple(sources), - payload=serialize_run(replace(run, compatible=tuple(field for field in run.compatible if field != "context.tool.just"))), - ) - with pytest.raises(ValueError, match="required host, toolchain, or dependency compatibility"): - policy.validate_scientific_run(legacy) - - -def test_local_explicit_labels_and_release_eligibility(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.chdir(tmp_path) - assert workflow.select_pair(ROOT, "explicit", "v0.5.0", "v0.5.0", local=True) == ReleasePair("v0.5.0", "v0.5.0") - with pytest.raises(ValueError, match="must differ"): - workflow.select_pair(ROOT, "explicit", "v0.5.0", "v0.5.0") - assert workflow.select_pair(ROOT, "explicit", PAIR.current, PAIR.baseline) == PAIR - - -@pytest.mark.parametrize("old_tag", ["v0.4.3", "v0.4.4", "v0.4.5", "v0.4.6", "v0.4.99"]) -@pytest.mark.parametrize("phase", ["baseline", "current"]) -def test_old_releases_are_rejected_before_measurement_side_effects(old_tag: str, phase: str, monkeypatch: pytest.MonkeyPatch) -> None: - pair = ReleasePair(PAIR.current, old_tag) if phase == "baseline" else ReleasePair(old_tag, PAIR.baseline) - - def forbidden(*_args: object, **_kwargs: object) -> None: - pytest.fail("unsupported releases must fail before snapshot, fetch, worktree creation or discovery") - - monkeypatch.setattr(workflow, "capture_snapshot", forbidden) - monkeypatch.setattr(workflow, "run_command", forbidden) - monkeypatch.setattr(policy, "discover_inventory", forbidden) - for action in ( - lambda: workflow.select_pair(ROOT, "explicit", pair.current, pair.baseline, local=True), - lambda: workflow.measure(ROOT, pair, "all", "release-signal"), - lambda: policy.measurement_plan(ROOT, pair, "all", "release-signal"), - ): - with pytest.raises(ValueError, match=r"requires v0\.5\.0 or newer"): - action() - - -@pytest.mark.parametrize( - ("field", "value"), - [ - ("minimum-release", "[]"), - ("minimum-release", "[0, 4]"), - ("minimum-release", "[0, 4, true]"), - ("minimum-release", "[0, 4, -1]"), - ], -) -def test_malformed_release_policy_is_rejected(tmp_path: Path, field: str, value: str) -> None: - directory = tmp_path / "tooling" - directory.mkdir() - text = (ROOT / policy.POLICY_CONFIG).read_text(encoding="utf-8") - import re # noqa: PLC0415 - - text = re.sub(rf"(?m)^{re.escape(field)} = .*$", f"{field} = {value}", text) - (tmp_path / policy.POLICY_CONFIG).write_text(text, encoding="utf-8") - with pytest.raises(ValueError, match="minimum-release"): - policy.validate_measurement_pair(PAIR, tmp_path) - - -@pytest.mark.parametrize( - ("field", "value", "diagnostic"), - [ - ("dimensions", "[]", "dimensions"), - ("dimensions", "[2, true]", "dimensions"), - ("dimensions", "[2, -3]", "dimensions"), - ("dimensions", "[3, 2]", "dimensions"), - ("dimensions", "[2, 2]", "dimensions"), - ("library-benchmarks", '"la_stack_lu"', "library-benchmarks"), - ("library-benchmarks", '["la_stack_lu", "la_stack_lu"]', "library-benchmarks"), - ("exact_d2", '"det"', "exact.exact_d2"), - ('"8"', "[false]", "additional.8"), - ("la_stack_lu", '["nalgebra_lu"]', "peers.la_stack_lu"), - ("la_stack_lu", '["nalgebra_lu", "faer_lu", "extra"]', "peers.la_stack_lu"), - ("la_stack_lu", '["nalgebra_lu", "nalgebra_lu"]', "peers.la_stack_lu"), - ("title", '" "', "metrics.det_via_lu.title"), - ("benchmarks", '["la_stack_det_via_lu", "nalgebra_det_via_lu"]', "metrics.det_via_lu.benchmarks"), - ("benchmarks", '["la_stack_det_via_lu", "nalgebra_det_via_lu", "wrong_peer"]', "declared peer pair"), - ], -) -def test_malformed_scientific_catalog_is_rejected(tmp_path: Path, field: str, value: str, diagnostic: str) -> None: - """Bad declarations fail at admission, before inventory indexing or timing.""" - import re # noqa: PLC0415 - - (tmp_path / "tooling").mkdir() - text = (ROOT / policy.POLICY_CONFIG).read_text(encoding="utf-8") - text, count = re.subn(rf"(?m)^{re.escape(field)} = .*$", f"{field} = {value}", text, count=1) - assert count == 1 - (tmp_path / policy.POLICY_CONFIG).write_text(text, encoding="utf-8") - with pytest.raises(ValueError, match=re.escape(diagnostic)): - policy.scientific_policy(tmp_path) - - -@pytest.mark.parametrize( - ("original", "replacement", "diagnostic"), - [ - ("[exact]", "[renamed_exact]", "exact requires a named catalog table"), - ('"8" =', '"7" =', "additional benchmark dimensions"), - ("la_stack_lu =", "unknown_benchmark =", "peers must refer"), - ("[metrics.det_via_lu]", "[metrics]", "metrics.title requires a named catalog table"), - ], -) -def test_malformed_scientific_tables_are_rejected(tmp_path: Path, original: str, replacement: str, diagnostic: str) -> None: - """Missing tables and cross-catalog inconsistencies retain field diagnostics.""" - (tmp_path / "tooling").mkdir() - text = (ROOT / policy.POLICY_CONFIG).read_text(encoding="utf-8") - assert original in text - (tmp_path / policy.POLICY_CONFIG).write_text(text.replace(original, replacement, 1), encoding="utf-8") - with pytest.raises(ValueError, match=diagnostic): - policy.scientific_policy(tmp_path) - - -def test_parsed_scientific_catalog_preserves_immutable_peer_and_metric_rows() -> None: - """Shared planners consume stable, typed catalog rows rather than raw TOML.""" - catalog = policy.scientific_policy(ROOT) - assert catalog.dimensions == (2, 3, 4, 5, 8, 16, 32, 64) - assert catalog.peers["la_stack_lu"] == ("nalgebra_lu", "faer_lu") - assert catalog.metrics["lu"].benchmarks == ("la_stack_lu", "nalgebra_lu", "faer_lu") - from typing import cast # noqa: PLC0415 - - with pytest.raises(TypeError): - cast("dict[str, tuple[str, str]]", catalog.peers)["la_stack_lu"] = ("wrong", "peer") - - -def test_historical_asset_command_is_retired(capsys: pytest.CaptureFixture[str]) -> None: - with pytest.raises(SystemExit) as error: - workflow.main(["assets"]) - assert error.value.code == 2 - assert "invalid choice: 'assets'" in capsys.readouterr().err - - -@pytest.mark.parametrize("command", ["plot", "local"]) -def test_cli_help_and_missing_checkout_diagnostics(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], command: str) -> None: - monkeypatch.chdir(tmp_path) - cli = workflow.dimension_main if command == "plot" else workflow.main - arguments = [] if command == "plot" else [command] - with pytest.raises(SystemExit) as error: - cli([*arguments, "--help"]) - assert error.value.code == 0 - output = capsys.readouterr() - assert "usage:" in output.out - assert not output.err - assert cli(arguments) == (2 if command == "plot" else 1) - output = capsys.readouterr() - assert "Could not locate Cargo.toml" in output.err - assert "Traceback" not in output.err - - -def test_reference_phase_and_same_version_policy(tmp_path: Path) -> None: - _, evidence = measured(tmp_path) - run = policy.validate_scientific_run(evidence) - # Same semantic IDs exist in both phases, so only consumer policy detects - # an otherwise well-formed la-stack series assigned to the wrong phase. - series = tuple(RunSeries(item.name, "current", item.rows) if item.name == "la-stack baseline" else item for item in run.series) - with pytest.raises(ValueError, match="retained series"): - policy.validate_scientific_run(replace(evidence, payload=serialize_run(replace(run, series=series)))) - # Use a current/current release pair with both sources under the same API. - baseline, current, plan = prepared(tmp_path / "same") - pair = ReleasePair(PAIR.current, PAIR.current) - inventories = {phase: tuple(case.full_id for case in sample.cases) for phase, sample in run.phases} - driver = f"INVENTORIES = {inventories!r}\n" + DRIVER - (current / "tooling/fixture.py").write_text(driver, encoding="utf-8") - plan = policy.declared_plan("all", "all-benches", inventories, baseline_env=(), current_env=(), config=policy.configuration(current)) - same = measure_prepared_pair(baseline, current, plan, pair, working_tree=True) - policy.validate_scientific_run(same) - with pytest.raises(ValueError, match="same-version"): - policy.validate_scientific_run(same, release=True) - sources = dict(same.sources) - identical = replace( - same, sources=(("baseline", replace(sources["baseline"], source_sha256=sources["current"].source_sha256)), ("current", sources["current"])) - ) - with pytest.raises(ValueError, match="distinct source"): - policy.validate_scientific_run(identical) - - -def test_shared_saved_comparison_recipe_reports_coverage(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - """Exercise the actual recipe and installed CLI, with no consumer package.""" - for name in ("justfile", "pyproject.toml", "uv.lock", ".python-version", "rust-toolchain.toml"): - shutil.copyfile(ROOT / name, tmp_path / name) - for name, sample, value in (("workload/shared", "last", 10), ("workload/shared", "new", 8), ("diagnostic/new", "new", 3)): - path = tmp_path / "target/criterion" / name / sample - path.mkdir(parents=True) - (path / "benchmark.json").write_text(json.dumps({"full_id": name}), encoding="utf-8") - estimate = {"point_estimate": value, "confidence_interval": {"lower_bound": value * 0.9, "upper_bound": value * 1.1}} - (path / "estimates.json").write_text(json.dumps({"median": estimate}), encoding="utf-8") - monkeypatch.setenv("UV_PROJECT_ENVIRONMENT", sys.prefix) - result = run_command("just", ["--no-deps", "bench-compare", "last"], cwd=tmp_path, check=False) - assert result.returncode == 0, result.stdout + result.stderr - report = (tmp_path / "target/bench-reports/performance.md").read_text(encoding="utf-8") - assert "workload/shared" in report - assert "diagnostic/new" in report - assert not (tmp_path / "target/bench-reports/performance.csv").exists() - assert not (tmp_path / "target/bench-reports/performance.provenance.json").exists() diff --git a/semgrep.yaml b/semgrep.yaml index b0d3f6f..8927d23 100644 --- a/semgrep.yaml +++ b/semgrep.yaml @@ -1038,10 +1038,10 @@ rules: rationale: "Git patches and hash inputs should retain their original bytes without passing through text encoding choices." paths: include: - - "/scripts/**/*.py" + - "/tooling/**/*.py" - "/tests/semgrep/scripts/**/*.py" exclude: - - "/scripts/tests/**" + - "/tooling/tests/**" - "/tests/semgrep/scripts/tests/**" patterns: - pattern-either: @@ -1060,10 +1060,10 @@ rules: rationale: "Platform-default text writes make artifact bytes depend on the host OS, even when Git checkout conversion is disabled." paths: include: - - "/scripts/**/*.py" + - "/tooling/**/*.py" - "/tests/semgrep/scripts/**/*.py" exclude: - - "/scripts/tests/**" + - "/tooling/tests/**" - "/tests/semgrep/scripts/tests/**" pattern-either: - patterns: @@ -1137,7 +1137,7 @@ rules: while failing on Windows when output contains Unicode symbols. paths: include: - - "/scripts/tests/**/*.py" + - "/tooling/tests/**/*.py" - "/tests/semgrep/scripts/tests/**/*.py" patterns: - pattern-either: @@ -1162,7 +1162,7 @@ rules: rationale: "Python tooling should surface expected failure modes explicitly." paths: include: - - "/scripts/**/*.py" + - "/tooling/**/*.py" - "/tests/semgrep/scripts/tests/python_exceptions.py" pattern-regex: '^\s*except\s+Exception(?:\s+as\s+\w+)?\s*:' @@ -1176,7 +1176,7 @@ rules: rationale: "Command-wrapper mocks should stay aligned with the real subprocess result shape." paths: include: - - "/scripts/tests/**/*.py" + - "/tooling/tests/**/*.py" - "/tests/semgrep/scripts/tests/python_exceptions.py" pattern-either: - patterns: @@ -1254,8 +1254,8 @@ rules: rationale: "Support scripts should inherit the repository's subprocess hardening." paths: include: - - "/scripts/**/*.py" + - "/tooling/**/*.py" - "/tests/semgrep/scripts/tests/python_exceptions.py" exclude: - - "/scripts/tests/**/*.py" + - "/tooling/tests/**/*.py" pattern: subprocess.run(...) diff --git a/tooling/README.md b/tooling/README.md new file mode 100644 index 0000000..10b537b --- /dev/null +++ b/tooling/README.md @@ -0,0 +1,99 @@ +# Tooling + +The installed `research-repo-tools` package owns common development and +performance tooling. The exact released pin and registry hashes live in +`pyproject.toml` and `uv.lock`. This dependency-only environment has no local +Python distribution, console entry points, or production Python adapters. + +## Setup and validation + +Use `just setup`, then `uv run --locked` for Python commands. Python 3.15 +runs the shared package and the consumer tests in `tooling/tests/`. +`just python-check` checks formatting, lint and types; `just test-python` +runs the installed-package integration tests. `just ci` is the final +repository validation. Native Linux, macOS and Windows CI is required for +adoption; local macOS results do not establish the other platforms. + +Semgrep 1.180.0 retains its separate locked Python 3.14 environment in +`tooling/semgrep/` while its wheels exclude Python 3.15. Ordinary Rust and +Python tests remain scan targets; deliberate `tests/semgrep/` fixtures are +checked separately by `just semgrep-test`. + +## Performance ownership + +The [benchmark guide](../docs/BENCHMARKING.md) owns command selection, +interpretation and output paths. Every performance recipe calls the installed +CLI or a native Cargo command. There is no runtime configuration generator. + +| Declaration | Responsibility | +| --- | --- | +| `measurements/full.toml`, `measurements/non-exact.toml` | Release floor, required cases, sampling, original peer phases, source/harness inventories, probes and environments | +| `performance-policy.toml` | Independent scientific catalog used by consumer acceptance tests | +| `performance.just` | Native discovery, correctness gates and measurement commands | +| `criterion-inventory.toml` | Release discovery and independent required scientific IDs | +| `criterion-saved.toml` | Required IDs, canonical paths, 100 samples and exact saved raw JSON bytes | +| `performance-report.toml` | Independent release eligibility, current report and immutable run history | +| `performance-readme.toml` | Canonical README selection, formatter, source freshness and tagged links | +| `plots/{non-exact,retained,scratch}/*.toml` | Named metric/statistic/axis selections with explicit input ownership | + +Both labels of a new measurement must be v0.5.0 or newer. The full and +non-exact declarations require 100 samples, mean and median estimates, +95% intervals and nanoseconds. Both native correctness gates run before +timing. Reference libraries originate in the baseline phase. + +Working-tree measurements include tracked changes and nonignored untracked +regular files. Scratch outputs belong under ignored `target/`. +Tag preparation is explicit: `just performance-prepare` fetches tags and +requires authorization to mutate Git. Measurement recipes create temporary +worktrees. Their declared environment fixes the Rust toolchain and +code-generation flags; native recipes select the host target. Change and +review the declarations for a different measurement environment instead of +relying on inherited Cargo flag overrides. + +Input selection is explicit. `performance-promote` consumes the full scratch +pair; `performance-doc` selects retained history. A missing scratch file is +an error. The plot recipe selects a full scratch, retained, or non-exact +scratch configuration. Non-exact plots use separate asset paths; official +release promotion and README publication require the full measurement policy. +README publication requires archived release-eligible evidence, independently +supplied release/commit assertions, matching current source/harness membership +and digests, and a successful formatter before replacing any output. + +Historical CSV/JSON, plots, reports and complete runs remain frozen with their +original bytes and links. This includes the v0.5.0/v0.4.6 comparison: it lacks +the newer acquisition declaration and is no longer a regeneration input. +Do not invent missing provenance or relax publication checks to replay it. +Future complete runs acquired with the declarations above support offline +report and plot rendering after scratch cleanup. + +Shared implementation matrices live upstream, including +`tests/performance/public_complete_consumer.py` and +`public_criterion_consumer.py`, exercised from wheel and sdist installations. +Consumer tests retain independent scientific selections, actual recipe wiring, +saved archive round trips, publication boundaries and historical hashes. + +## Changelog and release tooling + +Use the shared commands exposed by `just --list`. The +[release guide](../docs/RELEASING.md) owns metadata, changelog generation, +tagging and registry publication. Declarations in `pyproject.toml` retain +the concept DOI, active link policy, declared date policy, formatter and +authored dependency notes. + +The publishing declaration selects only `la-stack`, requires native platform +and scientific checks on the exact commit, and requires the durable Criterion +release asset. `release-gate`, `release-publish` and `release-verify` +use the shared release contract; `release-package` owns native default/exact +Cargo dry-runs. `tests/test_release_publishing.py` checks consumer policy and +upload barriers without registry credentials. + +`tests/test_toolchain_integration.py` owns the package-identity check: +manifest pin, registry lock, installed version and distribution hashes. +Dependency updates and release tests derive their requirement from the +manifest. The shared package pin advances deliberately with its lockfile; +no sibling checkout supplies runtime code. + +Setup, managed execution, dependency updates, Markdown checks, Semgrep, +security scans and opt-in CodeRabbit review also use shared commands. +See the [adoption record](../docs/dev/performance-tooling-adoption.md) for +deletion dispositions and release validation evidence. diff --git a/tooling/criterion-saved.toml b/tooling/criterion-saved.toml index e75ad5d..c668418 100644 --- a/tooling/criterion-saved.toml +++ b/tooling/criterion-saved.toml @@ -1,9 +1,847 @@ -# The release adapter supplies the workflow tag; all verification is shared. +# The installed verifier checks independent scientific coverage and exact saved bytes. schema = 1 saved-sample = "last" inventory = "target/release-benchmark-inventory.json" +required = [ + "d16/faer_det_from_ldlt", + "d16/faer_det_from_lu", + "d16/faer_det_via_lu", + "d16/faer_dot_native", + "d16/faer_inf_norm", + "d16/faer_ldlt", + "d16/faer_ldlt_solve", + "d16/faer_lu", + "d16/faer_lu_solve", + "d16/faer_norm2_sq", + "d16/faer_solve_from_ldlt", + "d16/faer_solve_from_lu", + "d16/la_stack_det", + "d16/la_stack_det_from_ldlt", + "d16/la_stack_det_from_lu", + "d16/la_stack_det_via_lu", + "d16/la_stack_dot", + "d16/la_stack_inf_norm", + "d16/la_stack_ldlt", + "d16/la_stack_ldlt_solve", + "d16/la_stack_lu", + "d16/la_stack_lu_solve", + "d16/la_stack_norm2_sq", + "d16/la_stack_solve_from_ldlt", + "d16/la_stack_solve_from_lu", + "d16/nalgebra_cholesky", + "d16/nalgebra_cholesky_solve", + "d16/nalgebra_det_from_cholesky", + "d16/nalgebra_det_from_lu", + "d16/nalgebra_det_via_lu", + "d16/nalgebra_dot", + "d16/nalgebra_inf_norm", + "d16/nalgebra_lu", + "d16/nalgebra_lu_solve", + "d16/nalgebra_norm_squared", + "d16/nalgebra_solve_from_cholesky", + "d16/nalgebra_solve_from_lu", + "d2/faer_det_from_ldlt", + "d2/faer_det_from_lu", + "d2/faer_det_via_lu", + "d2/faer_dot_native", + "d2/faer_inf_norm", + "d2/faer_ldlt", + "d2/faer_ldlt_solve", + "d2/faer_lu", + "d2/faer_lu_solve", + "d2/faer_norm2_sq", + "d2/faer_solve_from_ldlt", + "d2/faer_solve_from_lu", + "d2/la_stack_det", + "d2/la_stack_det_from_ldlt", + "d2/la_stack_det_from_lu", + "d2/la_stack_det_via_lu", + "d2/la_stack_dot", + "d2/la_stack_inf_norm", + "d2/la_stack_ldlt", + "d2/la_stack_ldlt_solve", + "d2/la_stack_lu", + "d2/la_stack_lu_solve", + "d2/la_stack_norm2_sq", + "d2/la_stack_solve_from_ldlt", + "d2/la_stack_solve_from_lu", + "d2/nalgebra_cholesky", + "d2/nalgebra_cholesky_solve", + "d2/nalgebra_det_from_cholesky", + "d2/nalgebra_det_from_lu", + "d2/nalgebra_det_via_lu", + "d2/nalgebra_dot", + "d2/nalgebra_inf_norm", + "d2/nalgebra_lu", + "d2/nalgebra_lu_solve", + "d2/nalgebra_norm_squared", + "d2/nalgebra_solve_from_cholesky", + "d2/nalgebra_solve_from_lu", + "d3/faer_det_from_ldlt", + "d3/faer_det_from_lu", + "d3/faer_det_via_lu", + "d3/faer_dot_native", + "d3/faer_inf_norm", + "d3/faer_ldlt", + "d3/faer_ldlt_solve", + "d3/faer_lu", + "d3/faer_lu_solve", + "d3/faer_norm2_sq", + "d3/faer_solve_from_ldlt", + "d3/faer_solve_from_lu", + "d3/la_stack_det", + "d3/la_stack_det_from_ldlt", + "d3/la_stack_det_from_lu", + "d3/la_stack_det_via_lu", + "d3/la_stack_dot", + "d3/la_stack_inf_norm", + "d3/la_stack_ldlt", + "d3/la_stack_ldlt_solve", + "d3/la_stack_lu", + "d3/la_stack_lu_solve", + "d3/la_stack_norm2_sq", + "d3/la_stack_solve_from_ldlt", + "d3/la_stack_solve_from_lu", + "d3/nalgebra_cholesky", + "d3/nalgebra_cholesky_solve", + "d3/nalgebra_det_from_cholesky", + "d3/nalgebra_det_from_lu", + "d3/nalgebra_det_via_lu", + "d3/nalgebra_dot", + "d3/nalgebra_inf_norm", + "d3/nalgebra_lu", + "d3/nalgebra_lu_solve", + "d3/nalgebra_norm_squared", + "d3/nalgebra_solve_from_cholesky", + "d3/nalgebra_solve_from_lu", + "d32/faer_det_from_ldlt", + "d32/faer_det_from_lu", + "d32/faer_det_via_lu", + "d32/faer_dot_native", + "d32/faer_inf_norm", + "d32/faer_ldlt", + "d32/faer_ldlt_solve", + "d32/faer_lu", + "d32/faer_lu_solve", + "d32/faer_norm2_sq", + "d32/faer_solve_from_ldlt", + "d32/faer_solve_from_lu", + "d32/la_stack_det", + "d32/la_stack_det_from_ldlt", + "d32/la_stack_det_from_lu", + "d32/la_stack_det_via_lu", + "d32/la_stack_dot", + "d32/la_stack_inf_norm", + "d32/la_stack_ldlt", + "d32/la_stack_ldlt_solve", + "d32/la_stack_lu", + "d32/la_stack_lu_solve", + "d32/la_stack_norm2_sq", + "d32/la_stack_solve_from_ldlt", + "d32/la_stack_solve_from_lu", + "d32/nalgebra_cholesky", + "d32/nalgebra_cholesky_solve", + "d32/nalgebra_det_from_cholesky", + "d32/nalgebra_det_from_lu", + "d32/nalgebra_det_via_lu", + "d32/nalgebra_dot", + "d32/nalgebra_inf_norm", + "d32/nalgebra_lu", + "d32/nalgebra_lu_solve", + "d32/nalgebra_norm_squared", + "d32/nalgebra_solve_from_cholesky", + "d32/nalgebra_solve_from_lu", + "d4/faer_det_from_ldlt", + "d4/faer_det_from_lu", + "d4/faer_det_via_lu", + "d4/faer_dot_native", + "d4/faer_inf_norm", + "d4/faer_ldlt", + "d4/faer_ldlt_solve", + "d4/faer_lu", + "d4/faer_lu_solve", + "d4/faer_norm2_sq", + "d4/faer_solve_from_ldlt", + "d4/faer_solve_from_lu", + "d4/la_stack_det", + "d4/la_stack_det_from_ldlt", + "d4/la_stack_det_from_lu", + "d4/la_stack_det_via_lu", + "d4/la_stack_dot", + "d4/la_stack_inf_norm", + "d4/la_stack_ldlt", + "d4/la_stack_ldlt_solve", + "d4/la_stack_lu", + "d4/la_stack_lu_solve", + "d4/la_stack_norm2_sq", + "d4/la_stack_solve_from_ldlt", + "d4/la_stack_solve_from_lu", + "d4/nalgebra_cholesky", + "d4/nalgebra_cholesky_solve", + "d4/nalgebra_det_from_cholesky", + "d4/nalgebra_det_from_lu", + "d4/nalgebra_det_via_lu", + "d4/nalgebra_dot", + "d4/nalgebra_inf_norm", + "d4/nalgebra_lu", + "d4/nalgebra_lu_solve", + "d4/nalgebra_norm_squared", + "d4/nalgebra_solve_from_cholesky", + "d4/nalgebra_solve_from_lu", + "d5/faer_det_from_ldlt", + "d5/faer_det_from_lu", + "d5/faer_det_via_lu", + "d5/faer_dot_native", + "d5/faer_inf_norm", + "d5/faer_ldlt", + "d5/faer_ldlt_solve", + "d5/faer_lu", + "d5/faer_lu_solve", + "d5/faer_norm2_sq", + "d5/faer_solve_from_ldlt", + "d5/faer_solve_from_lu", + "d5/la_stack_det", + "d5/la_stack_det_from_ldlt", + "d5/la_stack_det_from_lu", + "d5/la_stack_det_via_lu", + "d5/la_stack_dot", + "d5/la_stack_inf_norm", + "d5/la_stack_ldlt", + "d5/la_stack_ldlt_solve", + "d5/la_stack_lu", + "d5/la_stack_lu_solve", + "d5/la_stack_norm2_sq", + "d5/la_stack_solve_from_ldlt", + "d5/la_stack_solve_from_lu", + "d5/nalgebra_cholesky", + "d5/nalgebra_cholesky_solve", + "d5/nalgebra_det_from_cholesky", + "d5/nalgebra_det_from_lu", + "d5/nalgebra_det_via_lu", + "d5/nalgebra_dot", + "d5/nalgebra_inf_norm", + "d5/nalgebra_lu", + "d5/nalgebra_lu_solve", + "d5/nalgebra_norm_squared", + "d5/nalgebra_solve_from_cholesky", + "d5/nalgebra_solve_from_lu", + "d64/faer_det_from_ldlt", + "d64/faer_det_from_lu", + "d64/faer_det_via_lu", + "d64/faer_dot_native", + "d64/faer_inf_norm", + "d64/faer_ldlt", + "d64/faer_ldlt_solve", + "d64/faer_lu", + "d64/faer_lu_solve", + "d64/faer_norm2_sq", + "d64/faer_solve_from_ldlt", + "d64/faer_solve_from_lu", + "d64/la_stack_det", + "d64/la_stack_det_from_ldlt", + "d64/la_stack_det_from_lu", + "d64/la_stack_det_via_lu", + "d64/la_stack_dot", + "d64/la_stack_inf_norm", + "d64/la_stack_ldlt", + "d64/la_stack_ldlt_solve", + "d64/la_stack_lu", + "d64/la_stack_lu_solve", + "d64/la_stack_norm2_sq", + "d64/la_stack_solve_from_ldlt", + "d64/la_stack_solve_from_lu", + "d64/nalgebra_cholesky", + "d64/nalgebra_cholesky_solve", + "d64/nalgebra_det_from_cholesky", + "d64/nalgebra_det_from_lu", + "d64/nalgebra_det_via_lu", + "d64/nalgebra_dot", + "d64/nalgebra_inf_norm", + "d64/nalgebra_lu", + "d64/nalgebra_lu_solve", + "d64/nalgebra_norm_squared", + "d64/nalgebra_solve_from_cholesky", + "d64/nalgebra_solve_from_lu", + "d8/faer_det_from_ldlt", + "d8/faer_det_from_lu", + "d8/faer_det_via_lu", + "d8/faer_dot_native", + "d8/faer_inf_norm", + "d8/faer_ldlt", + "d8/faer_ldlt_solve", + "d8/faer_lu", + "d8/faer_lu_solve", + "d8/faer_norm2_sq", + "d8/faer_solve_from_ldlt", + "d8/faer_solve_from_lu", + "d8/la_stack_det", + "d8/la_stack_det_from_ldlt", + "d8/la_stack_det_from_ldlt_balanced_range", + "d8/la_stack_det_from_lu", + "d8/la_stack_det_from_lu_balanced_range", + "d8/la_stack_det_via_lu", + "d8/la_stack_dot", + "d8/la_stack_inf_norm", + "d8/la_stack_ldlt", + "d8/la_stack_ldlt_ill_conditioned", + "d8/la_stack_ldlt_solve", + "d8/la_stack_lu", + "d8/la_stack_lu_ill_conditioned", + "d8/la_stack_lu_pivoting", + "d8/la_stack_lu_solve", + "d8/la_stack_norm2_sq", + "d8/la_stack_solve_from_ldlt", + "d8/la_stack_solve_from_lu", + "d8/nalgebra_cholesky", + "d8/nalgebra_cholesky_solve", + "d8/nalgebra_det_from_cholesky", + "d8/nalgebra_det_from_lu", + "d8/nalgebra_det_via_lu", + "d8/nalgebra_dot", + "d8/nalgebra_inf_norm", + "d8/nalgebra_lu", + "d8/nalgebra_lu_solve", + "d8/nalgebra_norm_squared", + "d8/nalgebra_solve_from_cholesky", + "d8/nalgebra_solve_from_lu", + "exact_d2/det", + "exact_d2/det_direct", + "exact_d2/det_direct_with_errbound", + "exact_d2/det_errbound", + "exact_d2/det_exact", + "exact_d2/det_exact_f64_result", + "exact_d2/det_exact_rounded_f64", + "exact_d2/det_sign_exact", + "exact_d2/solve_exact", + "exact_d2/solve_exact_f64_result", + "exact_d2/solve_exact_rounded_f64", + "exact_d3/det", + "exact_d3/det_direct", + "exact_d3/det_direct_with_errbound", + "exact_d3/det_errbound", + "exact_d3/det_exact", + "exact_d3/det_exact_f64_result", + "exact_d3/det_exact_rounded_f64", + "exact_d3/det_sign_exact", + "exact_d3/solve_exact", + "exact_d3/solve_exact_f64_result", + "exact_d3/solve_exact_rounded_f64", + "exact_d4/det", + "exact_d4/det_direct", + "exact_d4/det_direct_with_errbound", + "exact_d4/det_errbound", + "exact_d4/det_exact", + "exact_d4/det_exact_f64_result", + "exact_d4/det_exact_rounded_f64", + "exact_d4/det_sign_exact", + "exact_d4/solve_exact", + "exact_d4/solve_exact_f64_result", + "exact_d4/solve_exact_rounded_f64", + "exact_d5/det", + "exact_d5/det_exact", + "exact_d5/det_exact_f64_result", + "exact_d5/det_exact_rounded_f64", + "exact_d5/det_sign_exact", + "exact_d5/solve_exact", + "exact_d5/solve_exact_f64_result", + "exact_d5/solve_exact_rounded_f64", + "exact_hilbert_4x4/det_exact", + "exact_hilbert_4x4/det_sign_exact", + "exact_hilbert_4x4/solve_exact", + "exact_hilbert_4x4/solve_exact_f64_result", + "exact_hilbert_4x4/solve_exact_rounded_f64", + "exact_hilbert_5x5/det_exact", + "exact_hilbert_5x5/det_sign_exact", + "exact_hilbert_5x5/solve_exact", + "exact_hilbert_5x5/solve_exact_f64_result", + "exact_hilbert_5x5/solve_exact_rounded_f64", + "exact_large_entries_3x3/det_exact", + "exact_large_entries_3x3/det_sign_exact", + "exact_large_entries_3x3/solve_exact", + "exact_large_entries_3x3/solve_exact_f64_result", + "exact_large_entries_3x3/solve_exact_rounded_f64", + "exact_near_singular_3x3/det_exact", + "exact_near_singular_3x3/det_sign_exact", + "exact_near_singular_3x3/solve_exact", + "exact_near_singular_3x3/solve_exact_f64_result", + "exact_near_singular_3x3/solve_exact_rounded_f64", + "exact_random_corpus_d2/det_exact", + "exact_random_corpus_d2/det_sign_exact", + "exact_random_corpus_d2/solve_exact", + "exact_random_corpus_d2/solve_exact_f64_result", + "exact_random_corpus_d2/solve_exact_rounded_f64", + "exact_random_corpus_d3/det_exact", + "exact_random_corpus_d3/det_sign_exact", + "exact_random_corpus_d3/solve_exact", + "exact_random_corpus_d3/solve_exact_f64_result", + "exact_random_corpus_d3/solve_exact_rounded_f64", + "exact_random_corpus_d4/det_exact", + "exact_random_corpus_d4/det_sign_exact", + "exact_random_corpus_d4/solve_exact", + "exact_random_corpus_d4/solve_exact_f64_result", + "exact_random_corpus_d4/solve_exact_rounded_f64", + "exact_random_corpus_d5/det_exact", + "exact_random_corpus_d5/det_sign_exact", + "exact_random_corpus_d5/solve_exact", + "exact_random_corpus_d5/solve_exact_f64_result", + "exact_random_corpus_d5/solve_exact_rounded_f64", + "rational_input_d2/det_big_rational_gaussian", + "rational_input_d2/det_row_cleared_bareiss", + "rational_input_d2/det_sign_row_cleared_bareiss", + "rational_input_d2/solve_big_rational_gaussian", + "rational_input_d2/solve_row_cleared_bareiss", + "rational_input_d3/det_big_rational_gaussian", + "rational_input_d3/det_row_cleared_bareiss", + "rational_input_d3/det_sign_row_cleared_bareiss", + "rational_input_d3/solve_big_rational_gaussian", + "rational_input_d3/solve_row_cleared_bareiss", + "rational_input_d4/det_big_rational_gaussian", + "rational_input_d4/det_row_cleared_bareiss", + "rational_input_d4/det_sign_row_cleared_bareiss", + "rational_input_d4/solve_big_rational_gaussian", + "rational_input_d4/solve_row_cleared_bareiss", + "rational_input_d5/det_big_rational_gaussian", + "rational_input_d5/det_row_cleared_bareiss", + "rational_input_d5/det_sign_row_cleared_bareiss", + "rational_input_d5/solve_big_rational_gaussian", + "rational_input_d5/solve_row_cleared_bareiss", + "rational_input_d6/det_big_rational_gaussian", + "rational_input_d6/det_row_cleared_bareiss", + "rational_input_d6/det_sign_row_cleared_bareiss", + "rational_input_d6/solve_big_rational_gaussian", + "rational_input_d6/solve_row_cleared_bareiss", + "rational_input_d7/det_big_rational_gaussian", + "rational_input_d7/det_row_cleared_bareiss", + "rational_input_d7/det_sign_row_cleared_bareiss", + "rational_input_d7/solve_big_rational_gaussian", + "rational_input_d7/solve_row_cleared_bareiss", + "rational_input_d8/det_big_rational_gaussian", + "rational_input_d8/det_row_cleared_bareiss", + "rational_input_d8/det_sign_row_cleared_bareiss", + "rational_input_d8/solve_big_rational_gaussian", + "rational_input_d8/solve_row_cleared_bareiss", +] raw-files = [ "benchmark.json", "estimates.json", "sample.json", "tukey.json" ] sample-count = 100 statistics = [ "mean", "median" ] confidence-level = 0.95 unit = "ns" + +[storage-paths] +"d16/faer_det_from_ldlt" = "d16/faer_det_from_ldlt" +"d16/faer_det_from_lu" = "d16/faer_det_from_lu" +"d16/faer_det_via_lu" = "d16/faer_det_via_lu" +"d16/faer_dot_native" = "d16/faer_dot_native" +"d16/faer_inf_norm" = "d16/faer_inf_norm" +"d16/faer_ldlt" = "d16/faer_ldlt" +"d16/faer_ldlt_solve" = "d16/faer_ldlt_solve" +"d16/faer_lu" = "d16/faer_lu" +"d16/faer_lu_solve" = "d16/faer_lu_solve" +"d16/faer_norm2_sq" = "d16/faer_norm2_sq" +"d16/faer_solve_from_ldlt" = "d16/faer_solve_from_ldlt" +"d16/faer_solve_from_lu" = "d16/faer_solve_from_lu" +"d16/la_stack_det" = "d16/la_stack_det" +"d16/la_stack_det_from_ldlt" = "d16/la_stack_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/la_stack_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/la_stack_det_via_lu" +"d16/la_stack_dot" = "d16/la_stack_dot" +"d16/la_stack_inf_norm" = "d16/la_stack_inf_norm" +"d16/la_stack_ldlt" = "d16/la_stack_ldlt" +"d16/la_stack_ldlt_solve" = "d16/la_stack_ldlt_solve" +"d16/la_stack_lu" = "d16/la_stack_lu" +"d16/la_stack_lu_solve" = "d16/la_stack_lu_solve" +"d16/la_stack_norm2_sq" = "d16/la_stack_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/la_stack_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/la_stack_solve_from_lu" +"d16/nalgebra_cholesky" = "d16/nalgebra_cholesky" +"d16/nalgebra_cholesky_solve" = "d16/nalgebra_cholesky_solve" +"d16/nalgebra_det_from_cholesky" = "d16/nalgebra_det_from_cholesky" +"d16/nalgebra_det_from_lu" = "d16/nalgebra_det_from_lu" +"d16/nalgebra_det_via_lu" = "d16/nalgebra_det_via_lu" +"d16/nalgebra_dot" = "d16/nalgebra_dot" +"d16/nalgebra_inf_norm" = "d16/nalgebra_inf_norm" +"d16/nalgebra_lu" = "d16/nalgebra_lu" +"d16/nalgebra_lu_solve" = "d16/nalgebra_lu_solve" +"d16/nalgebra_norm_squared" = "d16/nalgebra_norm_squared" +"d16/nalgebra_solve_from_cholesky" = "d16/nalgebra_solve_from_cholesky" +"d16/nalgebra_solve_from_lu" = "d16/nalgebra_solve_from_lu" +"d2/faer_det_from_ldlt" = "d2/faer_det_from_ldlt" +"d2/faer_det_from_lu" = "d2/faer_det_from_lu" +"d2/faer_det_via_lu" = "d2/faer_det_via_lu" +"d2/faer_dot_native" = "d2/faer_dot_native" +"d2/faer_inf_norm" = "d2/faer_inf_norm" +"d2/faer_ldlt" = "d2/faer_ldlt" +"d2/faer_ldlt_solve" = "d2/faer_ldlt_solve" +"d2/faer_lu" = "d2/faer_lu" +"d2/faer_lu_solve" = "d2/faer_lu_solve" +"d2/faer_norm2_sq" = "d2/faer_norm2_sq" +"d2/faer_solve_from_ldlt" = "d2/faer_solve_from_ldlt" +"d2/faer_solve_from_lu" = "d2/faer_solve_from_lu" +"d2/la_stack_det" = "d2/la_stack_det" +"d2/la_stack_det_from_ldlt" = "d2/la_stack_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/la_stack_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/la_stack_det_via_lu" +"d2/la_stack_dot" = "d2/la_stack_dot" +"d2/la_stack_inf_norm" = "d2/la_stack_inf_norm" +"d2/la_stack_ldlt" = "d2/la_stack_ldlt" +"d2/la_stack_ldlt_solve" = "d2/la_stack_ldlt_solve" +"d2/la_stack_lu" = "d2/la_stack_lu" +"d2/la_stack_lu_solve" = "d2/la_stack_lu_solve" +"d2/la_stack_norm2_sq" = "d2/la_stack_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/la_stack_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/la_stack_solve_from_lu" +"d2/nalgebra_cholesky" = "d2/nalgebra_cholesky" +"d2/nalgebra_cholesky_solve" = "d2/nalgebra_cholesky_solve" +"d2/nalgebra_det_from_cholesky" = "d2/nalgebra_det_from_cholesky" +"d2/nalgebra_det_from_lu" = "d2/nalgebra_det_from_lu" +"d2/nalgebra_det_via_lu" = "d2/nalgebra_det_via_lu" +"d2/nalgebra_dot" = "d2/nalgebra_dot" +"d2/nalgebra_inf_norm" = "d2/nalgebra_inf_norm" +"d2/nalgebra_lu" = "d2/nalgebra_lu" +"d2/nalgebra_lu_solve" = "d2/nalgebra_lu_solve" +"d2/nalgebra_norm_squared" = "d2/nalgebra_norm_squared" +"d2/nalgebra_solve_from_cholesky" = "d2/nalgebra_solve_from_cholesky" +"d2/nalgebra_solve_from_lu" = "d2/nalgebra_solve_from_lu" +"d3/faer_det_from_ldlt" = "d3/faer_det_from_ldlt" +"d3/faer_det_from_lu" = "d3/faer_det_from_lu" +"d3/faer_det_via_lu" = "d3/faer_det_via_lu" +"d3/faer_dot_native" = "d3/faer_dot_native" +"d3/faer_inf_norm" = "d3/faer_inf_norm" +"d3/faer_ldlt" = "d3/faer_ldlt" +"d3/faer_ldlt_solve" = "d3/faer_ldlt_solve" +"d3/faer_lu" = "d3/faer_lu" +"d3/faer_lu_solve" = "d3/faer_lu_solve" +"d3/faer_norm2_sq" = "d3/faer_norm2_sq" +"d3/faer_solve_from_ldlt" = "d3/faer_solve_from_ldlt" +"d3/faer_solve_from_lu" = "d3/faer_solve_from_lu" +"d3/la_stack_det" = "d3/la_stack_det" +"d3/la_stack_det_from_ldlt" = "d3/la_stack_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/la_stack_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/la_stack_det_via_lu" +"d3/la_stack_dot" = "d3/la_stack_dot" +"d3/la_stack_inf_norm" = "d3/la_stack_inf_norm" +"d3/la_stack_ldlt" = "d3/la_stack_ldlt" +"d3/la_stack_ldlt_solve" = "d3/la_stack_ldlt_solve" +"d3/la_stack_lu" = "d3/la_stack_lu" +"d3/la_stack_lu_solve" = "d3/la_stack_lu_solve" +"d3/la_stack_norm2_sq" = "d3/la_stack_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/la_stack_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/la_stack_solve_from_lu" +"d3/nalgebra_cholesky" = "d3/nalgebra_cholesky" +"d3/nalgebra_cholesky_solve" = "d3/nalgebra_cholesky_solve" +"d3/nalgebra_det_from_cholesky" = "d3/nalgebra_det_from_cholesky" +"d3/nalgebra_det_from_lu" = "d3/nalgebra_det_from_lu" +"d3/nalgebra_det_via_lu" = "d3/nalgebra_det_via_lu" +"d3/nalgebra_dot" = "d3/nalgebra_dot" +"d3/nalgebra_inf_norm" = "d3/nalgebra_inf_norm" +"d3/nalgebra_lu" = "d3/nalgebra_lu" +"d3/nalgebra_lu_solve" = "d3/nalgebra_lu_solve" +"d3/nalgebra_norm_squared" = "d3/nalgebra_norm_squared" +"d3/nalgebra_solve_from_cholesky" = "d3/nalgebra_solve_from_cholesky" +"d3/nalgebra_solve_from_lu" = "d3/nalgebra_solve_from_lu" +"d32/faer_det_from_ldlt" = "d32/faer_det_from_ldlt" +"d32/faer_det_from_lu" = "d32/faer_det_from_lu" +"d32/faer_det_via_lu" = "d32/faer_det_via_lu" +"d32/faer_dot_native" = "d32/faer_dot_native" +"d32/faer_inf_norm" = "d32/faer_inf_norm" +"d32/faer_ldlt" = "d32/faer_ldlt" +"d32/faer_ldlt_solve" = "d32/faer_ldlt_solve" +"d32/faer_lu" = "d32/faer_lu" +"d32/faer_lu_solve" = "d32/faer_lu_solve" +"d32/faer_norm2_sq" = "d32/faer_norm2_sq" +"d32/faer_solve_from_ldlt" = "d32/faer_solve_from_ldlt" +"d32/faer_solve_from_lu" = "d32/faer_solve_from_lu" +"d32/la_stack_det" = "d32/la_stack_det" +"d32/la_stack_det_from_ldlt" = "d32/la_stack_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/la_stack_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/la_stack_det_via_lu" +"d32/la_stack_dot" = "d32/la_stack_dot" +"d32/la_stack_inf_norm" = "d32/la_stack_inf_norm" +"d32/la_stack_ldlt" = "d32/la_stack_ldlt" +"d32/la_stack_ldlt_solve" = "d32/la_stack_ldlt_solve" +"d32/la_stack_lu" = "d32/la_stack_lu" +"d32/la_stack_lu_solve" = "d32/la_stack_lu_solve" +"d32/la_stack_norm2_sq" = "d32/la_stack_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/la_stack_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/la_stack_solve_from_lu" +"d32/nalgebra_cholesky" = "d32/nalgebra_cholesky" +"d32/nalgebra_cholesky_solve" = "d32/nalgebra_cholesky_solve" +"d32/nalgebra_det_from_cholesky" = "d32/nalgebra_det_from_cholesky" +"d32/nalgebra_det_from_lu" = "d32/nalgebra_det_from_lu" +"d32/nalgebra_det_via_lu" = "d32/nalgebra_det_via_lu" +"d32/nalgebra_dot" = "d32/nalgebra_dot" +"d32/nalgebra_inf_norm" = "d32/nalgebra_inf_norm" +"d32/nalgebra_lu" = "d32/nalgebra_lu" +"d32/nalgebra_lu_solve" = "d32/nalgebra_lu_solve" +"d32/nalgebra_norm_squared" = "d32/nalgebra_norm_squared" +"d32/nalgebra_solve_from_cholesky" = "d32/nalgebra_solve_from_cholesky" +"d32/nalgebra_solve_from_lu" = "d32/nalgebra_solve_from_lu" +"d4/faer_det_from_ldlt" = "d4/faer_det_from_ldlt" +"d4/faer_det_from_lu" = "d4/faer_det_from_lu" +"d4/faer_det_via_lu" = "d4/faer_det_via_lu" +"d4/faer_dot_native" = "d4/faer_dot_native" +"d4/faer_inf_norm" = "d4/faer_inf_norm" +"d4/faer_ldlt" = "d4/faer_ldlt" +"d4/faer_ldlt_solve" = "d4/faer_ldlt_solve" +"d4/faer_lu" = "d4/faer_lu" +"d4/faer_lu_solve" = "d4/faer_lu_solve" +"d4/faer_norm2_sq" = "d4/faer_norm2_sq" +"d4/faer_solve_from_ldlt" = "d4/faer_solve_from_ldlt" +"d4/faer_solve_from_lu" = "d4/faer_solve_from_lu" +"d4/la_stack_det" = "d4/la_stack_det" +"d4/la_stack_det_from_ldlt" = "d4/la_stack_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/la_stack_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/la_stack_det_via_lu" +"d4/la_stack_dot" = "d4/la_stack_dot" +"d4/la_stack_inf_norm" = "d4/la_stack_inf_norm" +"d4/la_stack_ldlt" = "d4/la_stack_ldlt" +"d4/la_stack_ldlt_solve" = "d4/la_stack_ldlt_solve" +"d4/la_stack_lu" = "d4/la_stack_lu" +"d4/la_stack_lu_solve" = "d4/la_stack_lu_solve" +"d4/la_stack_norm2_sq" = "d4/la_stack_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/la_stack_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/la_stack_solve_from_lu" +"d4/nalgebra_cholesky" = "d4/nalgebra_cholesky" +"d4/nalgebra_cholesky_solve" = "d4/nalgebra_cholesky_solve" +"d4/nalgebra_det_from_cholesky" = "d4/nalgebra_det_from_cholesky" +"d4/nalgebra_det_from_lu" = "d4/nalgebra_det_from_lu" +"d4/nalgebra_det_via_lu" = "d4/nalgebra_det_via_lu" +"d4/nalgebra_dot" = "d4/nalgebra_dot" +"d4/nalgebra_inf_norm" = "d4/nalgebra_inf_norm" +"d4/nalgebra_lu" = "d4/nalgebra_lu" +"d4/nalgebra_lu_solve" = "d4/nalgebra_lu_solve" +"d4/nalgebra_norm_squared" = "d4/nalgebra_norm_squared" +"d4/nalgebra_solve_from_cholesky" = "d4/nalgebra_solve_from_cholesky" +"d4/nalgebra_solve_from_lu" = "d4/nalgebra_solve_from_lu" +"d5/faer_det_from_ldlt" = "d5/faer_det_from_ldlt" +"d5/faer_det_from_lu" = "d5/faer_det_from_lu" +"d5/faer_det_via_lu" = "d5/faer_det_via_lu" +"d5/faer_dot_native" = "d5/faer_dot_native" +"d5/faer_inf_norm" = "d5/faer_inf_norm" +"d5/faer_ldlt" = "d5/faer_ldlt" +"d5/faer_ldlt_solve" = "d5/faer_ldlt_solve" +"d5/faer_lu" = "d5/faer_lu" +"d5/faer_lu_solve" = "d5/faer_lu_solve" +"d5/faer_norm2_sq" = "d5/faer_norm2_sq" +"d5/faer_solve_from_ldlt" = "d5/faer_solve_from_ldlt" +"d5/faer_solve_from_lu" = "d5/faer_solve_from_lu" +"d5/la_stack_det" = "d5/la_stack_det" +"d5/la_stack_det_from_ldlt" = "d5/la_stack_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/la_stack_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/la_stack_det_via_lu" +"d5/la_stack_dot" = "d5/la_stack_dot" +"d5/la_stack_inf_norm" = "d5/la_stack_inf_norm" +"d5/la_stack_ldlt" = "d5/la_stack_ldlt" +"d5/la_stack_ldlt_solve" = "d5/la_stack_ldlt_solve" +"d5/la_stack_lu" = "d5/la_stack_lu" +"d5/la_stack_lu_solve" = "d5/la_stack_lu_solve" +"d5/la_stack_norm2_sq" = "d5/la_stack_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/la_stack_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/la_stack_solve_from_lu" +"d5/nalgebra_cholesky" = "d5/nalgebra_cholesky" +"d5/nalgebra_cholesky_solve" = "d5/nalgebra_cholesky_solve" +"d5/nalgebra_det_from_cholesky" = "d5/nalgebra_det_from_cholesky" +"d5/nalgebra_det_from_lu" = "d5/nalgebra_det_from_lu" +"d5/nalgebra_det_via_lu" = "d5/nalgebra_det_via_lu" +"d5/nalgebra_dot" = "d5/nalgebra_dot" +"d5/nalgebra_inf_norm" = "d5/nalgebra_inf_norm" +"d5/nalgebra_lu" = "d5/nalgebra_lu" +"d5/nalgebra_lu_solve" = "d5/nalgebra_lu_solve" +"d5/nalgebra_norm_squared" = "d5/nalgebra_norm_squared" +"d5/nalgebra_solve_from_cholesky" = "d5/nalgebra_solve_from_cholesky" +"d5/nalgebra_solve_from_lu" = "d5/nalgebra_solve_from_lu" +"d64/faer_det_from_ldlt" = "d64/faer_det_from_ldlt" +"d64/faer_det_from_lu" = "d64/faer_det_from_lu" +"d64/faer_det_via_lu" = "d64/faer_det_via_lu" +"d64/faer_dot_native" = "d64/faer_dot_native" +"d64/faer_inf_norm" = "d64/faer_inf_norm" +"d64/faer_ldlt" = "d64/faer_ldlt" +"d64/faer_ldlt_solve" = "d64/faer_ldlt_solve" +"d64/faer_lu" = "d64/faer_lu" +"d64/faer_lu_solve" = "d64/faer_lu_solve" +"d64/faer_norm2_sq" = "d64/faer_norm2_sq" +"d64/faer_solve_from_ldlt" = "d64/faer_solve_from_ldlt" +"d64/faer_solve_from_lu" = "d64/faer_solve_from_lu" +"d64/la_stack_det" = "d64/la_stack_det" +"d64/la_stack_det_from_ldlt" = "d64/la_stack_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/la_stack_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/la_stack_det_via_lu" +"d64/la_stack_dot" = "d64/la_stack_dot" +"d64/la_stack_inf_norm" = "d64/la_stack_inf_norm" +"d64/la_stack_ldlt" = "d64/la_stack_ldlt" +"d64/la_stack_ldlt_solve" = "d64/la_stack_ldlt_solve" +"d64/la_stack_lu" = "d64/la_stack_lu" +"d64/la_stack_lu_solve" = "d64/la_stack_lu_solve" +"d64/la_stack_norm2_sq" = "d64/la_stack_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/la_stack_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/la_stack_solve_from_lu" +"d64/nalgebra_cholesky" = "d64/nalgebra_cholesky" +"d64/nalgebra_cholesky_solve" = "d64/nalgebra_cholesky_solve" +"d64/nalgebra_det_from_cholesky" = "d64/nalgebra_det_from_cholesky" +"d64/nalgebra_det_from_lu" = "d64/nalgebra_det_from_lu" +"d64/nalgebra_det_via_lu" = "d64/nalgebra_det_via_lu" +"d64/nalgebra_dot" = "d64/nalgebra_dot" +"d64/nalgebra_inf_norm" = "d64/nalgebra_inf_norm" +"d64/nalgebra_lu" = "d64/nalgebra_lu" +"d64/nalgebra_lu_solve" = "d64/nalgebra_lu_solve" +"d64/nalgebra_norm_squared" = "d64/nalgebra_norm_squared" +"d64/nalgebra_solve_from_cholesky" = "d64/nalgebra_solve_from_cholesky" +"d64/nalgebra_solve_from_lu" = "d64/nalgebra_solve_from_lu" +"d8/faer_det_from_ldlt" = "d8/faer_det_from_ldlt" +"d8/faer_det_from_lu" = "d8/faer_det_from_lu" +"d8/faer_det_via_lu" = "d8/faer_det_via_lu" +"d8/faer_dot_native" = "d8/faer_dot_native" +"d8/faer_inf_norm" = "d8/faer_inf_norm" +"d8/faer_ldlt" = "d8/faer_ldlt" +"d8/faer_ldlt_solve" = "d8/faer_ldlt_solve" +"d8/faer_lu" = "d8/faer_lu" +"d8/faer_lu_solve" = "d8/faer_lu_solve" +"d8/faer_norm2_sq" = "d8/faer_norm2_sq" +"d8/faer_solve_from_ldlt" = "d8/faer_solve_from_ldlt" +"d8/faer_solve_from_lu" = "d8/faer_solve_from_lu" +"d8/la_stack_det" = "d8/la_stack_det" +"d8/la_stack_det_from_ldlt" = "d8/la_stack_det_from_ldlt" +"d8/la_stack_det_from_ldlt_balanced_range" = "d8/la_stack_det_from_ldlt_balanced_range" +"d8/la_stack_det_from_lu" = "d8/la_stack_det_from_lu" +"d8/la_stack_det_from_lu_balanced_range" = "d8/la_stack_det_from_lu_balanced_range" +"d8/la_stack_det_via_lu" = "d8/la_stack_det_via_lu" +"d8/la_stack_dot" = "d8/la_stack_dot" +"d8/la_stack_inf_norm" = "d8/la_stack_inf_norm" +"d8/la_stack_ldlt" = "d8/la_stack_ldlt" +"d8/la_stack_ldlt_ill_conditioned" = "d8/la_stack_ldlt_ill_conditioned" +"d8/la_stack_ldlt_solve" = "d8/la_stack_ldlt_solve" +"d8/la_stack_lu" = "d8/la_stack_lu" +"d8/la_stack_lu_ill_conditioned" = "d8/la_stack_lu_ill_conditioned" +"d8/la_stack_lu_pivoting" = "d8/la_stack_lu_pivoting" +"d8/la_stack_lu_solve" = "d8/la_stack_lu_solve" +"d8/la_stack_norm2_sq" = "d8/la_stack_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/la_stack_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/la_stack_solve_from_lu" +"d8/nalgebra_cholesky" = "d8/nalgebra_cholesky" +"d8/nalgebra_cholesky_solve" = "d8/nalgebra_cholesky_solve" +"d8/nalgebra_det_from_cholesky" = "d8/nalgebra_det_from_cholesky" +"d8/nalgebra_det_from_lu" = "d8/nalgebra_det_from_lu" +"d8/nalgebra_det_via_lu" = "d8/nalgebra_det_via_lu" +"d8/nalgebra_dot" = "d8/nalgebra_dot" +"d8/nalgebra_inf_norm" = "d8/nalgebra_inf_norm" +"d8/nalgebra_lu" = "d8/nalgebra_lu" +"d8/nalgebra_lu_solve" = "d8/nalgebra_lu_solve" +"d8/nalgebra_norm_squared" = "d8/nalgebra_norm_squared" +"d8/nalgebra_solve_from_cholesky" = "d8/nalgebra_solve_from_cholesky" +"d8/nalgebra_solve_from_lu" = "d8/nalgebra_solve_from_lu" +"exact_d2/det" = "exact_d2/det" +"exact_d2/det_direct" = "exact_d2/det_direct" +"exact_d2/det_direct_with_errbound" = "exact_d2/det_direct_with_errbound" +"exact_d2/det_errbound" = "exact_d2/det_errbound" +"exact_d2/det_exact" = "exact_d2/det_exact" +"exact_d2/det_exact_f64_result" = "exact_d2/det_exact_f64_result" +"exact_d2/det_exact_rounded_f64" = "exact_d2/det_exact_rounded_f64" +"exact_d2/det_sign_exact" = "exact_d2/det_sign_exact" +"exact_d2/solve_exact" = "exact_d2/solve_exact" +"exact_d2/solve_exact_f64_result" = "exact_d2/solve_exact_f64_result" +"exact_d2/solve_exact_rounded_f64" = "exact_d2/solve_exact_rounded_f64" +"exact_d3/det" = "exact_d3/det" +"exact_d3/det_direct" = "exact_d3/det_direct" +"exact_d3/det_direct_with_errbound" = "exact_d3/det_direct_with_errbound" +"exact_d3/det_errbound" = "exact_d3/det_errbound" +"exact_d3/det_exact" = "exact_d3/det_exact" +"exact_d3/det_exact_f64_result" = "exact_d3/det_exact_f64_result" +"exact_d3/det_exact_rounded_f64" = "exact_d3/det_exact_rounded_f64" +"exact_d3/det_sign_exact" = "exact_d3/det_sign_exact" +"exact_d3/solve_exact" = "exact_d3/solve_exact" +"exact_d3/solve_exact_f64_result" = "exact_d3/solve_exact_f64_result" +"exact_d3/solve_exact_rounded_f64" = "exact_d3/solve_exact_rounded_f64" +"exact_d4/det" = "exact_d4/det" +"exact_d4/det_direct" = "exact_d4/det_direct" +"exact_d4/det_direct_with_errbound" = "exact_d4/det_direct_with_errbound" +"exact_d4/det_errbound" = "exact_d4/det_errbound" +"exact_d4/det_exact" = "exact_d4/det_exact" +"exact_d4/det_exact_f64_result" = "exact_d4/det_exact_f64_result" +"exact_d4/det_exact_rounded_f64" = "exact_d4/det_exact_rounded_f64" +"exact_d4/det_sign_exact" = "exact_d4/det_sign_exact" +"exact_d4/solve_exact" = "exact_d4/solve_exact" +"exact_d4/solve_exact_f64_result" = "exact_d4/solve_exact_f64_result" +"exact_d4/solve_exact_rounded_f64" = "exact_d4/solve_exact_rounded_f64" +"exact_d5/det" = "exact_d5/det" +"exact_d5/det_exact" = "exact_d5/det_exact" +"exact_d5/det_exact_f64_result" = "exact_d5/det_exact_f64_result" +"exact_d5/det_exact_rounded_f64" = "exact_d5/det_exact_rounded_f64" +"exact_d5/det_sign_exact" = "exact_d5/det_sign_exact" +"exact_d5/solve_exact" = "exact_d5/solve_exact" +"exact_d5/solve_exact_f64_result" = "exact_d5/solve_exact_f64_result" +"exact_d5/solve_exact_rounded_f64" = "exact_d5/solve_exact_rounded_f64" +"exact_hilbert_4x4/det_exact" = "exact_hilbert_4x4/det_exact" +"exact_hilbert_4x4/det_sign_exact" = "exact_hilbert_4x4/det_sign_exact" +"exact_hilbert_4x4/solve_exact" = "exact_hilbert_4x4/solve_exact" +"exact_hilbert_4x4/solve_exact_f64_result" = "exact_hilbert_4x4/solve_exact_f64_result" +"exact_hilbert_4x4/solve_exact_rounded_f64" = "exact_hilbert_4x4/solve_exact_rounded_f64" +"exact_hilbert_5x5/det_exact" = "exact_hilbert_5x5/det_exact" +"exact_hilbert_5x5/det_sign_exact" = "exact_hilbert_5x5/det_sign_exact" +"exact_hilbert_5x5/solve_exact" = "exact_hilbert_5x5/solve_exact" +"exact_hilbert_5x5/solve_exact_f64_result" = "exact_hilbert_5x5/solve_exact_f64_result" +"exact_hilbert_5x5/solve_exact_rounded_f64" = "exact_hilbert_5x5/solve_exact_rounded_f64" +"exact_large_entries_3x3/det_exact" = "exact_large_entries_3x3/det_exact" +"exact_large_entries_3x3/det_sign_exact" = "exact_large_entries_3x3/det_sign_exact" +"exact_large_entries_3x3/solve_exact" = "exact_large_entries_3x3/solve_exact" +"exact_large_entries_3x3/solve_exact_f64_result" = "exact_large_entries_3x3/solve_exact_f64_result" +"exact_large_entries_3x3/solve_exact_rounded_f64" = "exact_large_entries_3x3/solve_exact_rounded_f64" +"exact_near_singular_3x3/det_exact" = "exact_near_singular_3x3/det_exact" +"exact_near_singular_3x3/det_sign_exact" = "exact_near_singular_3x3/det_sign_exact" +"exact_near_singular_3x3/solve_exact" = "exact_near_singular_3x3/solve_exact" +"exact_near_singular_3x3/solve_exact_f64_result" = "exact_near_singular_3x3/solve_exact_f64_result" +"exact_near_singular_3x3/solve_exact_rounded_f64" = "exact_near_singular_3x3/solve_exact_rounded_f64" +"exact_random_corpus_d2/det_exact" = "exact_random_corpus_d2/det_exact" +"exact_random_corpus_d2/det_sign_exact" = "exact_random_corpus_d2/det_sign_exact" +"exact_random_corpus_d2/solve_exact" = "exact_random_corpus_d2/solve_exact" +"exact_random_corpus_d2/solve_exact_f64_result" = "exact_random_corpus_d2/solve_exact_f64_result" +"exact_random_corpus_d2/solve_exact_rounded_f64" = "exact_random_corpus_d2/solve_exact_rounded_f64" +"exact_random_corpus_d3/det_exact" = "exact_random_corpus_d3/det_exact" +"exact_random_corpus_d3/det_sign_exact" = "exact_random_corpus_d3/det_sign_exact" +"exact_random_corpus_d3/solve_exact" = "exact_random_corpus_d3/solve_exact" +"exact_random_corpus_d3/solve_exact_f64_result" = "exact_random_corpus_d3/solve_exact_f64_result" +"exact_random_corpus_d3/solve_exact_rounded_f64" = "exact_random_corpus_d3/solve_exact_rounded_f64" +"exact_random_corpus_d4/det_exact" = "exact_random_corpus_d4/det_exact" +"exact_random_corpus_d4/det_sign_exact" = "exact_random_corpus_d4/det_sign_exact" +"exact_random_corpus_d4/solve_exact" = "exact_random_corpus_d4/solve_exact" +"exact_random_corpus_d4/solve_exact_f64_result" = "exact_random_corpus_d4/solve_exact_f64_result" +"exact_random_corpus_d4/solve_exact_rounded_f64" = "exact_random_corpus_d4/solve_exact_rounded_f64" +"exact_random_corpus_d5/det_exact" = "exact_random_corpus_d5/det_exact" +"exact_random_corpus_d5/det_sign_exact" = "exact_random_corpus_d5/det_sign_exact" +"exact_random_corpus_d5/solve_exact" = "exact_random_corpus_d5/solve_exact" +"exact_random_corpus_d5/solve_exact_f64_result" = "exact_random_corpus_d5/solve_exact_f64_result" +"exact_random_corpus_d5/solve_exact_rounded_f64" = "exact_random_corpus_d5/solve_exact_rounded_f64" +"rational_input_d2/det_big_rational_gaussian" = "rational_input_d2/det_big_rational_gaussian" +"rational_input_d2/det_row_cleared_bareiss" = "rational_input_d2/det_row_cleared_bareiss" +"rational_input_d2/det_sign_row_cleared_bareiss" = "rational_input_d2/det_sign_row_cleared_bareiss" +"rational_input_d2/solve_big_rational_gaussian" = "rational_input_d2/solve_big_rational_gaussian" +"rational_input_d2/solve_row_cleared_bareiss" = "rational_input_d2/solve_row_cleared_bareiss" +"rational_input_d3/det_big_rational_gaussian" = "rational_input_d3/det_big_rational_gaussian" +"rational_input_d3/det_row_cleared_bareiss" = "rational_input_d3/det_row_cleared_bareiss" +"rational_input_d3/det_sign_row_cleared_bareiss" = "rational_input_d3/det_sign_row_cleared_bareiss" +"rational_input_d3/solve_big_rational_gaussian" = "rational_input_d3/solve_big_rational_gaussian" +"rational_input_d3/solve_row_cleared_bareiss" = "rational_input_d3/solve_row_cleared_bareiss" +"rational_input_d4/det_big_rational_gaussian" = "rational_input_d4/det_big_rational_gaussian" +"rational_input_d4/det_row_cleared_bareiss" = "rational_input_d4/det_row_cleared_bareiss" +"rational_input_d4/det_sign_row_cleared_bareiss" = "rational_input_d4/det_sign_row_cleared_bareiss" +"rational_input_d4/solve_big_rational_gaussian" = "rational_input_d4/solve_big_rational_gaussian" +"rational_input_d4/solve_row_cleared_bareiss" = "rational_input_d4/solve_row_cleared_bareiss" +"rational_input_d5/det_big_rational_gaussian" = "rational_input_d5/det_big_rational_gaussian" +"rational_input_d5/det_row_cleared_bareiss" = "rational_input_d5/det_row_cleared_bareiss" +"rational_input_d5/det_sign_row_cleared_bareiss" = "rational_input_d5/det_sign_row_cleared_bareiss" +"rational_input_d5/solve_big_rational_gaussian" = "rational_input_d5/solve_big_rational_gaussian" +"rational_input_d5/solve_row_cleared_bareiss" = "rational_input_d5/solve_row_cleared_bareiss" +"rational_input_d6/det_big_rational_gaussian" = "rational_input_d6/det_big_rational_gaussian" +"rational_input_d6/det_row_cleared_bareiss" = "rational_input_d6/det_row_cleared_bareiss" +"rational_input_d6/det_sign_row_cleared_bareiss" = "rational_input_d6/det_sign_row_cleared_bareiss" +"rational_input_d6/solve_big_rational_gaussian" = "rational_input_d6/solve_big_rational_gaussian" +"rational_input_d6/solve_row_cleared_bareiss" = "rational_input_d6/solve_row_cleared_bareiss" +"rational_input_d7/det_big_rational_gaussian" = "rational_input_d7/det_big_rational_gaussian" +"rational_input_d7/det_row_cleared_bareiss" = "rational_input_d7/det_row_cleared_bareiss" +"rational_input_d7/det_sign_row_cleared_bareiss" = "rational_input_d7/det_sign_row_cleared_bareiss" +"rational_input_d7/solve_big_rational_gaussian" = "rational_input_d7/solve_big_rational_gaussian" +"rational_input_d7/solve_row_cleared_bareiss" = "rational_input_d7/solve_row_cleared_bareiss" +"rational_input_d8/det_big_rational_gaussian" = "rational_input_d8/det_big_rational_gaussian" +"rational_input_d8/det_row_cleared_bareiss" = "rational_input_d8/det_row_cleared_bareiss" +"rational_input_d8/det_sign_row_cleared_bareiss" = "rational_input_d8/det_sign_row_cleared_bareiss" +"rational_input_d8/solve_big_rational_gaussian" = "rational_input_d8/solve_big_rational_gaussian" +"rational_input_d8/solve_row_cleared_bareiss" = "rational_input_d8/solve_row_cleared_bareiss" diff --git a/tooling/measurements/full.toml b/tooling/measurements/full.toml new file mode 100644 index 0000000..47f94f8 --- /dev/null +++ b/tooling/measurements/full.toml @@ -0,0 +1,1393 @@ +# Scientific measurement policy consumed directly by research-repo-tools. +schema = 2 +minimum-release = "v0.5.0" +sources = [ "src/**/*.rs", "Cargo.toml" ] +harness = [ + "benches/**/*.rs", + "benches/comparison/Cargo.toml", + "examples/**/*.rs", + "Cargo.toml", + "Cargo.lock", + "rust-toolchain.toml", + "tests/exact_bench_config.rs", + "tooling/performance.just", + "tooling/criterion-inventory.toml", + "tooling/measurements/*.toml", +] +sample-count = 100 +statistics = [ "mean", "median" ] +confidence-level = 0.95 +unit = "ns" +timeout = 14400 +compatible = [ + "harness_sha256", + "context.os", + "context.architecture", + "context.cpu", + "context.tool.rustc", + "context.tool.cargo", + "context.tool.just", + "context.dependency.criterion", + "context.dependency.nalgebra", + "context.dependency.faer", +] + +[context] +phase-driver = "just-v1" +suite = "all" +scope = "release-signal" +baseline-api-compatibility = "none" + +[probes] +rustc = [ "rustc", "-vV" ] +cargo = [ "cargo", "--version" ] +just = [ "just", "--version" ] + +[dependencies] +criterion = "Cargo.lock" +nalgebra = "Cargo.lock" +faer = "Cargo.lock" + +[phases.baseline] +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "baseline-all" ] +gate = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "gate" ] +# Fixed code-generation settings are recorded for both phases. +environment = { CARGO_TARGET_DIR = "target", CRITERION_HOME = "target/criterion", RUSTUP_TOOLCHAIN = "1.99.1", RUSTFLAGS = "--cap-lints=warn", CARGO_ENCODED_RUSTFLAGS = "--cap-lints=warn", RUSTC = "rustc", RUSTC_WRAPPER = "", RUSTC_WORKSPACE_WRAPPER = "" } + +[phases.baseline.discovery] +required = [ + "d16/faer_det_from_ldlt", + "d16/faer_det_from_lu", + "d16/faer_det_via_lu", + "d16/faer_dot_native", + "d16/faer_inf_norm", + "d16/faer_ldlt", + "d16/faer_ldlt_solve", + "d16/faer_lu", + "d16/faer_lu_solve", + "d16/faer_norm2_sq", + "d16/faer_solve_from_ldlt", + "d16/faer_solve_from_lu", + "d16/la_stack_det", + "d16/la_stack_det_from_ldlt", + "d16/la_stack_det_from_lu", + "d16/la_stack_det_via_lu", + "d16/la_stack_dot", + "d16/la_stack_inf_norm", + "d16/la_stack_ldlt", + "d16/la_stack_ldlt_solve", + "d16/la_stack_lu", + "d16/la_stack_lu_solve", + "d16/la_stack_norm2_sq", + "d16/la_stack_solve_from_ldlt", + "d16/la_stack_solve_from_lu", + "d16/nalgebra_cholesky", + "d16/nalgebra_cholesky_solve", + "d16/nalgebra_det_from_cholesky", + "d16/nalgebra_det_from_lu", + "d16/nalgebra_det_via_lu", + "d16/nalgebra_dot", + "d16/nalgebra_inf_norm", + "d16/nalgebra_lu", + "d16/nalgebra_lu_solve", + "d16/nalgebra_norm_squared", + "d16/nalgebra_solve_from_cholesky", + "d16/nalgebra_solve_from_lu", + "d2/faer_det_from_ldlt", + "d2/faer_det_from_lu", + "d2/faer_det_via_lu", + "d2/faer_dot_native", + "d2/faer_inf_norm", + "d2/faer_ldlt", + "d2/faer_ldlt_solve", + "d2/faer_lu", + "d2/faer_lu_solve", + "d2/faer_norm2_sq", + "d2/faer_solve_from_ldlt", + "d2/faer_solve_from_lu", + "d2/la_stack_det", + "d2/la_stack_det_from_ldlt", + "d2/la_stack_det_from_lu", + "d2/la_stack_det_via_lu", + "d2/la_stack_dot", + "d2/la_stack_inf_norm", + "d2/la_stack_ldlt", + "d2/la_stack_ldlt_solve", + "d2/la_stack_lu", + "d2/la_stack_lu_solve", + "d2/la_stack_norm2_sq", + "d2/la_stack_solve_from_ldlt", + "d2/la_stack_solve_from_lu", + "d2/nalgebra_cholesky", + "d2/nalgebra_cholesky_solve", + "d2/nalgebra_det_from_cholesky", + "d2/nalgebra_det_from_lu", + "d2/nalgebra_det_via_lu", + "d2/nalgebra_dot", + "d2/nalgebra_inf_norm", + "d2/nalgebra_lu", + "d2/nalgebra_lu_solve", + "d2/nalgebra_norm_squared", + "d2/nalgebra_solve_from_cholesky", + "d2/nalgebra_solve_from_lu", + "d3/faer_det_from_ldlt", + "d3/faer_det_from_lu", + "d3/faer_det_via_lu", + "d3/faer_dot_native", + "d3/faer_inf_norm", + "d3/faer_ldlt", + "d3/faer_ldlt_solve", + "d3/faer_lu", + "d3/faer_lu_solve", + "d3/faer_norm2_sq", + "d3/faer_solve_from_ldlt", + "d3/faer_solve_from_lu", + "d3/la_stack_det", + "d3/la_stack_det_from_ldlt", + "d3/la_stack_det_from_lu", + "d3/la_stack_det_via_lu", + "d3/la_stack_dot", + "d3/la_stack_inf_norm", + "d3/la_stack_ldlt", + "d3/la_stack_ldlt_solve", + "d3/la_stack_lu", + "d3/la_stack_lu_solve", + "d3/la_stack_norm2_sq", + "d3/la_stack_solve_from_ldlt", + "d3/la_stack_solve_from_lu", + "d3/nalgebra_cholesky", + "d3/nalgebra_cholesky_solve", + "d3/nalgebra_det_from_cholesky", + "d3/nalgebra_det_from_lu", + "d3/nalgebra_det_via_lu", + "d3/nalgebra_dot", + "d3/nalgebra_inf_norm", + "d3/nalgebra_lu", + "d3/nalgebra_lu_solve", + "d3/nalgebra_norm_squared", + "d3/nalgebra_solve_from_cholesky", + "d3/nalgebra_solve_from_lu", + "d32/faer_det_from_ldlt", + "d32/faer_det_from_lu", + "d32/faer_det_via_lu", + "d32/faer_dot_native", + "d32/faer_inf_norm", + "d32/faer_ldlt", + "d32/faer_ldlt_solve", + "d32/faer_lu", + "d32/faer_lu_solve", + "d32/faer_norm2_sq", + "d32/faer_solve_from_ldlt", + "d32/faer_solve_from_lu", + "d32/la_stack_det", + "d32/la_stack_det_from_ldlt", + "d32/la_stack_det_from_lu", + "d32/la_stack_det_via_lu", + "d32/la_stack_dot", + "d32/la_stack_inf_norm", + "d32/la_stack_ldlt", + "d32/la_stack_ldlt_solve", + "d32/la_stack_lu", + "d32/la_stack_lu_solve", + "d32/la_stack_norm2_sq", + "d32/la_stack_solve_from_ldlt", + "d32/la_stack_solve_from_lu", + "d32/nalgebra_cholesky", + "d32/nalgebra_cholesky_solve", + "d32/nalgebra_det_from_cholesky", + "d32/nalgebra_det_from_lu", + "d32/nalgebra_det_via_lu", + "d32/nalgebra_dot", + "d32/nalgebra_inf_norm", + "d32/nalgebra_lu", + "d32/nalgebra_lu_solve", + "d32/nalgebra_norm_squared", + "d32/nalgebra_solve_from_cholesky", + "d32/nalgebra_solve_from_lu", + "d4/faer_det_from_ldlt", + "d4/faer_det_from_lu", + "d4/faer_det_via_lu", + "d4/faer_dot_native", + "d4/faer_inf_norm", + "d4/faer_ldlt", + "d4/faer_ldlt_solve", + "d4/faer_lu", + "d4/faer_lu_solve", + "d4/faer_norm2_sq", + "d4/faer_solve_from_ldlt", + "d4/faer_solve_from_lu", + "d4/la_stack_det", + "d4/la_stack_det_from_ldlt", + "d4/la_stack_det_from_lu", + "d4/la_stack_det_via_lu", + "d4/la_stack_dot", + "d4/la_stack_inf_norm", + "d4/la_stack_ldlt", + "d4/la_stack_ldlt_solve", + "d4/la_stack_lu", + "d4/la_stack_lu_solve", + "d4/la_stack_norm2_sq", + "d4/la_stack_solve_from_ldlt", + "d4/la_stack_solve_from_lu", + "d4/nalgebra_cholesky", + "d4/nalgebra_cholesky_solve", + "d4/nalgebra_det_from_cholesky", + "d4/nalgebra_det_from_lu", + "d4/nalgebra_det_via_lu", + "d4/nalgebra_dot", + "d4/nalgebra_inf_norm", + "d4/nalgebra_lu", + "d4/nalgebra_lu_solve", + "d4/nalgebra_norm_squared", + "d4/nalgebra_solve_from_cholesky", + "d4/nalgebra_solve_from_lu", + "d5/faer_det_from_ldlt", + "d5/faer_det_from_lu", + "d5/faer_det_via_lu", + "d5/faer_dot_native", + "d5/faer_inf_norm", + "d5/faer_ldlt", + "d5/faer_ldlt_solve", + "d5/faer_lu", + "d5/faer_lu_solve", + "d5/faer_norm2_sq", + "d5/faer_solve_from_ldlt", + "d5/faer_solve_from_lu", + "d5/la_stack_det", + "d5/la_stack_det_from_ldlt", + "d5/la_stack_det_from_lu", + "d5/la_stack_det_via_lu", + "d5/la_stack_dot", + "d5/la_stack_inf_norm", + "d5/la_stack_ldlt", + "d5/la_stack_ldlt_solve", + "d5/la_stack_lu", + "d5/la_stack_lu_solve", + "d5/la_stack_norm2_sq", + "d5/la_stack_solve_from_ldlt", + "d5/la_stack_solve_from_lu", + "d5/nalgebra_cholesky", + "d5/nalgebra_cholesky_solve", + "d5/nalgebra_det_from_cholesky", + "d5/nalgebra_det_from_lu", + "d5/nalgebra_det_via_lu", + "d5/nalgebra_dot", + "d5/nalgebra_inf_norm", + "d5/nalgebra_lu", + "d5/nalgebra_lu_solve", + "d5/nalgebra_norm_squared", + "d5/nalgebra_solve_from_cholesky", + "d5/nalgebra_solve_from_lu", + "d64/faer_det_from_ldlt", + "d64/faer_det_from_lu", + "d64/faer_det_via_lu", + "d64/faer_dot_native", + "d64/faer_inf_norm", + "d64/faer_ldlt", + "d64/faer_ldlt_solve", + "d64/faer_lu", + "d64/faer_lu_solve", + "d64/faer_norm2_sq", + "d64/faer_solve_from_ldlt", + "d64/faer_solve_from_lu", + "d64/la_stack_det", + "d64/la_stack_det_from_ldlt", + "d64/la_stack_det_from_lu", + "d64/la_stack_det_via_lu", + "d64/la_stack_dot", + "d64/la_stack_inf_norm", + "d64/la_stack_ldlt", + "d64/la_stack_ldlt_solve", + "d64/la_stack_lu", + "d64/la_stack_lu_solve", + "d64/la_stack_norm2_sq", + "d64/la_stack_solve_from_ldlt", + "d64/la_stack_solve_from_lu", + "d64/nalgebra_cholesky", + "d64/nalgebra_cholesky_solve", + "d64/nalgebra_det_from_cholesky", + "d64/nalgebra_det_from_lu", + "d64/nalgebra_det_via_lu", + "d64/nalgebra_dot", + "d64/nalgebra_inf_norm", + "d64/nalgebra_lu", + "d64/nalgebra_lu_solve", + "d64/nalgebra_norm_squared", + "d64/nalgebra_solve_from_cholesky", + "d64/nalgebra_solve_from_lu", + "d8/faer_det_from_ldlt", + "d8/faer_det_from_lu", + "d8/faer_det_via_lu", + "d8/faer_dot_native", + "d8/faer_inf_norm", + "d8/faer_ldlt", + "d8/faer_ldlt_solve", + "d8/faer_lu", + "d8/faer_lu_solve", + "d8/faer_norm2_sq", + "d8/faer_solve_from_ldlt", + "d8/faer_solve_from_lu", + "d8/la_stack_det", + "d8/la_stack_det_from_ldlt", + "d8/la_stack_det_from_ldlt_balanced_range", + "d8/la_stack_det_from_lu", + "d8/la_stack_det_from_lu_balanced_range", + "d8/la_stack_det_via_lu", + "d8/la_stack_dot", + "d8/la_stack_inf_norm", + "d8/la_stack_ldlt", + "d8/la_stack_ldlt_ill_conditioned", + "d8/la_stack_ldlt_solve", + "d8/la_stack_lu", + "d8/la_stack_lu_ill_conditioned", + "d8/la_stack_lu_pivoting", + "d8/la_stack_lu_solve", + "d8/la_stack_norm2_sq", + "d8/la_stack_solve_from_ldlt", + "d8/la_stack_solve_from_lu", + "d8/nalgebra_cholesky", + "d8/nalgebra_cholesky_solve", + "d8/nalgebra_det_from_cholesky", + "d8/nalgebra_det_from_lu", + "d8/nalgebra_det_via_lu", + "d8/nalgebra_dot", + "d8/nalgebra_inf_norm", + "d8/nalgebra_lu", + "d8/nalgebra_lu_solve", + "d8/nalgebra_norm_squared", + "d8/nalgebra_solve_from_cholesky", + "d8/nalgebra_solve_from_lu", + "exact_d2/det", + "exact_d2/det_direct", + "exact_d2/det_direct_with_errbound", + "exact_d2/det_errbound", + "exact_d2/det_exact", + "exact_d2/det_exact_f64_result", + "exact_d2/det_exact_rounded_f64", + "exact_d2/det_sign_exact", + "exact_d2/solve_exact", + "exact_d2/solve_exact_f64_result", + "exact_d2/solve_exact_rounded_f64", + "exact_d3/det", + "exact_d3/det_direct", + "exact_d3/det_direct_with_errbound", + "exact_d3/det_errbound", + "exact_d3/det_exact", + "exact_d3/det_exact_f64_result", + "exact_d3/det_exact_rounded_f64", + "exact_d3/det_sign_exact", + "exact_d3/solve_exact", + "exact_d3/solve_exact_f64_result", + "exact_d3/solve_exact_rounded_f64", + "exact_d4/det", + "exact_d4/det_direct", + "exact_d4/det_direct_with_errbound", + "exact_d4/det_errbound", + "exact_d4/det_exact", + "exact_d4/det_exact_f64_result", + "exact_d4/det_exact_rounded_f64", + "exact_d4/det_sign_exact", + "exact_d4/solve_exact", + "exact_d4/solve_exact_f64_result", + "exact_d4/solve_exact_rounded_f64", + "exact_d5/det", + "exact_d5/det_exact", + "exact_d5/det_exact_f64_result", + "exact_d5/det_exact_rounded_f64", + "exact_d5/det_sign_exact", + "exact_d5/solve_exact", + "exact_d5/solve_exact_f64_result", + "exact_d5/solve_exact_rounded_f64", + "exact_hilbert_4x4/det_exact", + "exact_hilbert_4x4/det_sign_exact", + "exact_hilbert_4x4/solve_exact", + "exact_hilbert_4x4/solve_exact_f64_result", + "exact_hilbert_4x4/solve_exact_rounded_f64", + "exact_hilbert_5x5/det_exact", + "exact_hilbert_5x5/det_sign_exact", + "exact_hilbert_5x5/solve_exact", + "exact_hilbert_5x5/solve_exact_f64_result", + "exact_hilbert_5x5/solve_exact_rounded_f64", + "exact_large_entries_3x3/det_exact", + "exact_large_entries_3x3/det_sign_exact", + "exact_large_entries_3x3/solve_exact", + "exact_large_entries_3x3/solve_exact_f64_result", + "exact_large_entries_3x3/solve_exact_rounded_f64", + "exact_near_singular_3x3/det_exact", + "exact_near_singular_3x3/det_sign_exact", + "exact_near_singular_3x3/solve_exact", + "exact_near_singular_3x3/solve_exact_f64_result", + "exact_near_singular_3x3/solve_exact_rounded_f64", + "exact_random_corpus_d2/det_exact", + "exact_random_corpus_d2/det_sign_exact", + "exact_random_corpus_d2/solve_exact", + "exact_random_corpus_d2/solve_exact_f64_result", + "exact_random_corpus_d2/solve_exact_rounded_f64", + "exact_random_corpus_d3/det_exact", + "exact_random_corpus_d3/det_sign_exact", + "exact_random_corpus_d3/solve_exact", + "exact_random_corpus_d3/solve_exact_f64_result", + "exact_random_corpus_d3/solve_exact_rounded_f64", + "exact_random_corpus_d4/det_exact", + "exact_random_corpus_d4/det_sign_exact", + "exact_random_corpus_d4/solve_exact", + "exact_random_corpus_d4/solve_exact_f64_result", + "exact_random_corpus_d4/solve_exact_rounded_f64", + "exact_random_corpus_d5/det_exact", + "exact_random_corpus_d5/det_sign_exact", + "exact_random_corpus_d5/solve_exact", + "exact_random_corpus_d5/solve_exact_f64_result", + "exact_random_corpus_d5/solve_exact_rounded_f64", + "rational_input_d2/det_big_rational_gaussian", + "rational_input_d2/det_row_cleared_bareiss", + "rational_input_d2/det_sign_row_cleared_bareiss", + "rational_input_d2/solve_big_rational_gaussian", + "rational_input_d2/solve_row_cleared_bareiss", + "rational_input_d3/det_big_rational_gaussian", + "rational_input_d3/det_row_cleared_bareiss", + "rational_input_d3/det_sign_row_cleared_bareiss", + "rational_input_d3/solve_big_rational_gaussian", + "rational_input_d3/solve_row_cleared_bareiss", + "rational_input_d4/det_big_rational_gaussian", + "rational_input_d4/det_row_cleared_bareiss", + "rational_input_d4/det_sign_row_cleared_bareiss", + "rational_input_d4/solve_big_rational_gaussian", + "rational_input_d4/solve_row_cleared_bareiss", + "rational_input_d5/det_big_rational_gaussian", + "rational_input_d5/det_row_cleared_bareiss", + "rational_input_d5/det_sign_row_cleared_bareiss", + "rational_input_d5/solve_big_rational_gaussian", + "rational_input_d5/solve_row_cleared_bareiss", + "rational_input_d6/det_big_rational_gaussian", + "rational_input_d6/det_row_cleared_bareiss", + "rational_input_d6/det_sign_row_cleared_bareiss", + "rational_input_d6/solve_big_rational_gaussian", + "rational_input_d6/solve_row_cleared_bareiss", + "rational_input_d7/det_big_rational_gaussian", + "rational_input_d7/det_row_cleared_bareiss", + "rational_input_d7/det_sign_row_cleared_bareiss", + "rational_input_d7/solve_big_rational_gaussian", + "rational_input_d7/solve_row_cleared_bareiss", + "rational_input_d8/det_big_rational_gaussian", + "rational_input_d8/det_row_cleared_bareiss", + "rational_input_d8/det_sign_row_cleared_bareiss", + "rational_input_d8/solve_big_rational_gaussian", + "rational_input_d8/solve_row_cleared_bareiss", +] + +[[phases.baseline.discovery.suites]] +name = "vs_linalg" +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "baseline-vs_linalg", "list" ] +timeout = 14400 + +[[phases.baseline.discovery.suites]] +name = "exact" +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "baseline-exact", "list" ] +timeout = 14400 + +[phases.current] +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "current-all" ] +gate = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "gate" ] +# Fixed code-generation settings are recorded for both phases. +environment = { CARGO_TARGET_DIR = "target", CRITERION_HOME = "target/criterion", RUSTUP_TOOLCHAIN = "1.99.1", RUSTFLAGS = "--cap-lints=warn", CARGO_ENCODED_RUSTFLAGS = "--cap-lints=warn", RUSTC = "rustc", RUSTC_WRAPPER = "", RUSTC_WORKSPACE_WRAPPER = "" } + +[phases.current.discovery] +required = [ + "d16/la_stack_det", + "d16/la_stack_det_from_ldlt", + "d16/la_stack_det_from_lu", + "d16/la_stack_det_via_lu", + "d16/la_stack_dot", + "d16/la_stack_inf_norm", + "d16/la_stack_ldlt", + "d16/la_stack_ldlt_solve", + "d16/la_stack_lu", + "d16/la_stack_lu_solve", + "d16/la_stack_norm2_sq", + "d16/la_stack_solve_from_ldlt", + "d16/la_stack_solve_from_lu", + "d2/la_stack_det", + "d2/la_stack_det_from_ldlt", + "d2/la_stack_det_from_lu", + "d2/la_stack_det_via_lu", + "d2/la_stack_dot", + "d2/la_stack_inf_norm", + "d2/la_stack_ldlt", + "d2/la_stack_ldlt_solve", + "d2/la_stack_lu", + "d2/la_stack_lu_solve", + "d2/la_stack_norm2_sq", + "d2/la_stack_solve_from_ldlt", + "d2/la_stack_solve_from_lu", + "d3/la_stack_det", + "d3/la_stack_det_from_ldlt", + "d3/la_stack_det_from_lu", + "d3/la_stack_det_via_lu", + "d3/la_stack_dot", + "d3/la_stack_inf_norm", + "d3/la_stack_ldlt", + "d3/la_stack_ldlt_solve", + "d3/la_stack_lu", + "d3/la_stack_lu_solve", + "d3/la_stack_norm2_sq", + "d3/la_stack_solve_from_ldlt", + "d3/la_stack_solve_from_lu", + "d32/la_stack_det", + "d32/la_stack_det_from_ldlt", + "d32/la_stack_det_from_lu", + "d32/la_stack_det_via_lu", + "d32/la_stack_dot", + "d32/la_stack_inf_norm", + "d32/la_stack_ldlt", + "d32/la_stack_ldlt_solve", + "d32/la_stack_lu", + "d32/la_stack_lu_solve", + "d32/la_stack_norm2_sq", + "d32/la_stack_solve_from_ldlt", + "d32/la_stack_solve_from_lu", + "d4/la_stack_det", + "d4/la_stack_det_from_ldlt", + "d4/la_stack_det_from_lu", + "d4/la_stack_det_via_lu", + "d4/la_stack_dot", + "d4/la_stack_inf_norm", + "d4/la_stack_ldlt", + "d4/la_stack_ldlt_solve", + "d4/la_stack_lu", + "d4/la_stack_lu_solve", + "d4/la_stack_norm2_sq", + "d4/la_stack_solve_from_ldlt", + "d4/la_stack_solve_from_lu", + "d5/la_stack_det", + "d5/la_stack_det_from_ldlt", + "d5/la_stack_det_from_lu", + "d5/la_stack_det_via_lu", + "d5/la_stack_dot", + "d5/la_stack_inf_norm", + "d5/la_stack_ldlt", + "d5/la_stack_ldlt_solve", + "d5/la_stack_lu", + "d5/la_stack_lu_solve", + "d5/la_stack_norm2_sq", + "d5/la_stack_solve_from_ldlt", + "d5/la_stack_solve_from_lu", + "d64/la_stack_det", + "d64/la_stack_det_from_ldlt", + "d64/la_stack_det_from_lu", + "d64/la_stack_det_via_lu", + "d64/la_stack_dot", + "d64/la_stack_inf_norm", + "d64/la_stack_ldlt", + "d64/la_stack_ldlt_solve", + "d64/la_stack_lu", + "d64/la_stack_lu_solve", + "d64/la_stack_norm2_sq", + "d64/la_stack_solve_from_ldlt", + "d64/la_stack_solve_from_lu", + "d8/la_stack_det", + "d8/la_stack_det_from_ldlt", + "d8/la_stack_det_from_ldlt_balanced_range", + "d8/la_stack_det_from_lu", + "d8/la_stack_det_from_lu_balanced_range", + "d8/la_stack_det_via_lu", + "d8/la_stack_dot", + "d8/la_stack_inf_norm", + "d8/la_stack_ldlt", + "d8/la_stack_ldlt_ill_conditioned", + "d8/la_stack_ldlt_solve", + "d8/la_stack_lu", + "d8/la_stack_lu_ill_conditioned", + "d8/la_stack_lu_pivoting", + "d8/la_stack_lu_solve", + "d8/la_stack_norm2_sq", + "d8/la_stack_solve_from_ldlt", + "d8/la_stack_solve_from_lu", + "exact_d2/det", + "exact_d2/det_direct", + "exact_d2/det_direct_with_errbound", + "exact_d2/det_errbound", + "exact_d2/det_exact", + "exact_d2/det_exact_f64_result", + "exact_d2/det_exact_rounded_f64", + "exact_d2/det_sign_exact", + "exact_d2/solve_exact", + "exact_d2/solve_exact_f64_result", + "exact_d2/solve_exact_rounded_f64", + "exact_d3/det", + "exact_d3/det_direct", + "exact_d3/det_direct_with_errbound", + "exact_d3/det_errbound", + "exact_d3/det_exact", + "exact_d3/det_exact_f64_result", + "exact_d3/det_exact_rounded_f64", + "exact_d3/det_sign_exact", + "exact_d3/solve_exact", + "exact_d3/solve_exact_f64_result", + "exact_d3/solve_exact_rounded_f64", + "exact_d4/det", + "exact_d4/det_direct", + "exact_d4/det_direct_with_errbound", + "exact_d4/det_errbound", + "exact_d4/det_exact", + "exact_d4/det_exact_f64_result", + "exact_d4/det_exact_rounded_f64", + "exact_d4/det_sign_exact", + "exact_d4/solve_exact", + "exact_d4/solve_exact_f64_result", + "exact_d4/solve_exact_rounded_f64", + "exact_d5/det", + "exact_d5/det_exact", + "exact_d5/det_exact_f64_result", + "exact_d5/det_exact_rounded_f64", + "exact_d5/det_sign_exact", + "exact_d5/solve_exact", + "exact_d5/solve_exact_f64_result", + "exact_d5/solve_exact_rounded_f64", + "exact_hilbert_4x4/det_exact", + "exact_hilbert_4x4/det_sign_exact", + "exact_hilbert_4x4/solve_exact", + "exact_hilbert_4x4/solve_exact_f64_result", + "exact_hilbert_4x4/solve_exact_rounded_f64", + "exact_hilbert_5x5/det_exact", + "exact_hilbert_5x5/det_sign_exact", + "exact_hilbert_5x5/solve_exact", + "exact_hilbert_5x5/solve_exact_f64_result", + "exact_hilbert_5x5/solve_exact_rounded_f64", + "exact_large_entries_3x3/det_exact", + "exact_large_entries_3x3/det_sign_exact", + "exact_large_entries_3x3/solve_exact", + "exact_large_entries_3x3/solve_exact_f64_result", + "exact_large_entries_3x3/solve_exact_rounded_f64", + "exact_near_singular_3x3/det_exact", + "exact_near_singular_3x3/det_sign_exact", + "exact_near_singular_3x3/solve_exact", + "exact_near_singular_3x3/solve_exact_f64_result", + "exact_near_singular_3x3/solve_exact_rounded_f64", + "exact_random_corpus_d2/det_exact", + "exact_random_corpus_d2/det_sign_exact", + "exact_random_corpus_d2/solve_exact", + "exact_random_corpus_d2/solve_exact_f64_result", + "exact_random_corpus_d2/solve_exact_rounded_f64", + "exact_random_corpus_d3/det_exact", + "exact_random_corpus_d3/det_sign_exact", + "exact_random_corpus_d3/solve_exact", + "exact_random_corpus_d3/solve_exact_f64_result", + "exact_random_corpus_d3/solve_exact_rounded_f64", + "exact_random_corpus_d4/det_exact", + "exact_random_corpus_d4/det_sign_exact", + "exact_random_corpus_d4/solve_exact", + "exact_random_corpus_d4/solve_exact_f64_result", + "exact_random_corpus_d4/solve_exact_rounded_f64", + "exact_random_corpus_d5/det_exact", + "exact_random_corpus_d5/det_sign_exact", + "exact_random_corpus_d5/solve_exact", + "exact_random_corpus_d5/solve_exact_f64_result", + "exact_random_corpus_d5/solve_exact_rounded_f64", + "rational_input_d2/det_big_rational_gaussian", + "rational_input_d2/det_row_cleared_bareiss", + "rational_input_d2/det_sign_row_cleared_bareiss", + "rational_input_d2/solve_big_rational_gaussian", + "rational_input_d2/solve_row_cleared_bareiss", + "rational_input_d3/det_big_rational_gaussian", + "rational_input_d3/det_row_cleared_bareiss", + "rational_input_d3/det_sign_row_cleared_bareiss", + "rational_input_d3/solve_big_rational_gaussian", + "rational_input_d3/solve_row_cleared_bareiss", + "rational_input_d4/det_big_rational_gaussian", + "rational_input_d4/det_row_cleared_bareiss", + "rational_input_d4/det_sign_row_cleared_bareiss", + "rational_input_d4/solve_big_rational_gaussian", + "rational_input_d4/solve_row_cleared_bareiss", + "rational_input_d5/det_big_rational_gaussian", + "rational_input_d5/det_row_cleared_bareiss", + "rational_input_d5/det_sign_row_cleared_bareiss", + "rational_input_d5/solve_big_rational_gaussian", + "rational_input_d5/solve_row_cleared_bareiss", + "rational_input_d6/det_big_rational_gaussian", + "rational_input_d6/det_row_cleared_bareiss", + "rational_input_d6/det_sign_row_cleared_bareiss", + "rational_input_d6/solve_big_rational_gaussian", + "rational_input_d6/solve_row_cleared_bareiss", + "rational_input_d7/det_big_rational_gaussian", + "rational_input_d7/det_row_cleared_bareiss", + "rational_input_d7/det_sign_row_cleared_bareiss", + "rational_input_d7/solve_big_rational_gaussian", + "rational_input_d7/solve_row_cleared_bareiss", + "rational_input_d8/det_big_rational_gaussian", + "rational_input_d8/det_row_cleared_bareiss", + "rational_input_d8/det_sign_row_cleared_bareiss", + "rational_input_d8/solve_big_rational_gaussian", + "rational_input_d8/solve_row_cleared_bareiss", +] + +[[phases.current.discovery.suites]] +name = "vs_linalg" +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "current-vs_linalg", "list" ] +timeout = 14400 + +[[phases.current.discovery.suites]] +name = "exact" +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "current-exact", "list" ] +timeout = 14400 + +[[series]] +name = "la-stack baseline" +phase = "baseline" +[series.rows] +"d16/la_stack_det" = "d16/la_stack_det" +"d16/la_stack_det_from_ldlt" = "d16/la_stack_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/la_stack_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/la_stack_det_via_lu" +"d16/la_stack_dot" = "d16/la_stack_dot" +"d16/la_stack_inf_norm" = "d16/la_stack_inf_norm" +"d16/la_stack_ldlt" = "d16/la_stack_ldlt" +"d16/la_stack_ldlt_solve" = "d16/la_stack_ldlt_solve" +"d16/la_stack_lu" = "d16/la_stack_lu" +"d16/la_stack_lu_solve" = "d16/la_stack_lu_solve" +"d16/la_stack_norm2_sq" = "d16/la_stack_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/la_stack_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/la_stack_solve_from_lu" +"d2/la_stack_det" = "d2/la_stack_det" +"d2/la_stack_det_from_ldlt" = "d2/la_stack_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/la_stack_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/la_stack_det_via_lu" +"d2/la_stack_dot" = "d2/la_stack_dot" +"d2/la_stack_inf_norm" = "d2/la_stack_inf_norm" +"d2/la_stack_ldlt" = "d2/la_stack_ldlt" +"d2/la_stack_ldlt_solve" = "d2/la_stack_ldlt_solve" +"d2/la_stack_lu" = "d2/la_stack_lu" +"d2/la_stack_lu_solve" = "d2/la_stack_lu_solve" +"d2/la_stack_norm2_sq" = "d2/la_stack_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/la_stack_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/la_stack_solve_from_lu" +"d3/la_stack_det" = "d3/la_stack_det" +"d3/la_stack_det_from_ldlt" = "d3/la_stack_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/la_stack_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/la_stack_det_via_lu" +"d3/la_stack_dot" = "d3/la_stack_dot" +"d3/la_stack_inf_norm" = "d3/la_stack_inf_norm" +"d3/la_stack_ldlt" = "d3/la_stack_ldlt" +"d3/la_stack_ldlt_solve" = "d3/la_stack_ldlt_solve" +"d3/la_stack_lu" = "d3/la_stack_lu" +"d3/la_stack_lu_solve" = "d3/la_stack_lu_solve" +"d3/la_stack_norm2_sq" = "d3/la_stack_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/la_stack_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/la_stack_solve_from_lu" +"d32/la_stack_det" = "d32/la_stack_det" +"d32/la_stack_det_from_ldlt" = "d32/la_stack_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/la_stack_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/la_stack_det_via_lu" +"d32/la_stack_dot" = "d32/la_stack_dot" +"d32/la_stack_inf_norm" = "d32/la_stack_inf_norm" +"d32/la_stack_ldlt" = "d32/la_stack_ldlt" +"d32/la_stack_ldlt_solve" = "d32/la_stack_ldlt_solve" +"d32/la_stack_lu" = "d32/la_stack_lu" +"d32/la_stack_lu_solve" = "d32/la_stack_lu_solve" +"d32/la_stack_norm2_sq" = "d32/la_stack_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/la_stack_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/la_stack_solve_from_lu" +"d4/la_stack_det" = "d4/la_stack_det" +"d4/la_stack_det_from_ldlt" = "d4/la_stack_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/la_stack_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/la_stack_det_via_lu" +"d4/la_stack_dot" = "d4/la_stack_dot" +"d4/la_stack_inf_norm" = "d4/la_stack_inf_norm" +"d4/la_stack_ldlt" = "d4/la_stack_ldlt" +"d4/la_stack_ldlt_solve" = "d4/la_stack_ldlt_solve" +"d4/la_stack_lu" = "d4/la_stack_lu" +"d4/la_stack_lu_solve" = "d4/la_stack_lu_solve" +"d4/la_stack_norm2_sq" = "d4/la_stack_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/la_stack_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/la_stack_solve_from_lu" +"d5/la_stack_det" = "d5/la_stack_det" +"d5/la_stack_det_from_ldlt" = "d5/la_stack_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/la_stack_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/la_stack_det_via_lu" +"d5/la_stack_dot" = "d5/la_stack_dot" +"d5/la_stack_inf_norm" = "d5/la_stack_inf_norm" +"d5/la_stack_ldlt" = "d5/la_stack_ldlt" +"d5/la_stack_ldlt_solve" = "d5/la_stack_ldlt_solve" +"d5/la_stack_lu" = "d5/la_stack_lu" +"d5/la_stack_lu_solve" = "d5/la_stack_lu_solve" +"d5/la_stack_norm2_sq" = "d5/la_stack_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/la_stack_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/la_stack_solve_from_lu" +"d64/la_stack_det" = "d64/la_stack_det" +"d64/la_stack_det_from_ldlt" = "d64/la_stack_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/la_stack_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/la_stack_det_via_lu" +"d64/la_stack_dot" = "d64/la_stack_dot" +"d64/la_stack_inf_norm" = "d64/la_stack_inf_norm" +"d64/la_stack_ldlt" = "d64/la_stack_ldlt" +"d64/la_stack_ldlt_solve" = "d64/la_stack_ldlt_solve" +"d64/la_stack_lu" = "d64/la_stack_lu" +"d64/la_stack_lu_solve" = "d64/la_stack_lu_solve" +"d64/la_stack_norm2_sq" = "d64/la_stack_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/la_stack_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/la_stack_solve_from_lu" +"d8/la_stack_det" = "d8/la_stack_det" +"d8/la_stack_det_from_ldlt" = "d8/la_stack_det_from_ldlt" +"d8/la_stack_det_from_ldlt_balanced_range" = "d8/la_stack_det_from_ldlt_balanced_range" +"d8/la_stack_det_from_lu" = "d8/la_stack_det_from_lu" +"d8/la_stack_det_from_lu_balanced_range" = "d8/la_stack_det_from_lu_balanced_range" +"d8/la_stack_det_via_lu" = "d8/la_stack_det_via_lu" +"d8/la_stack_dot" = "d8/la_stack_dot" +"d8/la_stack_inf_norm" = "d8/la_stack_inf_norm" +"d8/la_stack_ldlt" = "d8/la_stack_ldlt" +"d8/la_stack_ldlt_ill_conditioned" = "d8/la_stack_ldlt_ill_conditioned" +"d8/la_stack_ldlt_solve" = "d8/la_stack_ldlt_solve" +"d8/la_stack_lu" = "d8/la_stack_lu" +"d8/la_stack_lu_ill_conditioned" = "d8/la_stack_lu_ill_conditioned" +"d8/la_stack_lu_pivoting" = "d8/la_stack_lu_pivoting" +"d8/la_stack_lu_solve" = "d8/la_stack_lu_solve" +"d8/la_stack_norm2_sq" = "d8/la_stack_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/la_stack_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/la_stack_solve_from_lu" +"exact_d2/det" = "exact_d2/det" +"exact_d2/det_direct" = "exact_d2/det_direct" +"exact_d2/det_direct_with_errbound" = "exact_d2/det_direct_with_errbound" +"exact_d2/det_errbound" = "exact_d2/det_errbound" +"exact_d2/det_exact" = "exact_d2/det_exact" +"exact_d2/det_exact_f64_result" = "exact_d2/det_exact_f64_result" +"exact_d2/det_exact_rounded_f64" = "exact_d2/det_exact_rounded_f64" +"exact_d2/det_sign_exact" = "exact_d2/det_sign_exact" +"exact_d2/solve_exact" = "exact_d2/solve_exact" +"exact_d2/solve_exact_f64_result" = "exact_d2/solve_exact_f64_result" +"exact_d2/solve_exact_rounded_f64" = "exact_d2/solve_exact_rounded_f64" +"exact_d3/det" = "exact_d3/det" +"exact_d3/det_direct" = "exact_d3/det_direct" +"exact_d3/det_direct_with_errbound" = "exact_d3/det_direct_with_errbound" +"exact_d3/det_errbound" = "exact_d3/det_errbound" +"exact_d3/det_exact" = "exact_d3/det_exact" +"exact_d3/det_exact_f64_result" = "exact_d3/det_exact_f64_result" +"exact_d3/det_exact_rounded_f64" = "exact_d3/det_exact_rounded_f64" +"exact_d3/det_sign_exact" = "exact_d3/det_sign_exact" +"exact_d3/solve_exact" = "exact_d3/solve_exact" +"exact_d3/solve_exact_f64_result" = "exact_d3/solve_exact_f64_result" +"exact_d3/solve_exact_rounded_f64" = "exact_d3/solve_exact_rounded_f64" +"exact_d4/det" = "exact_d4/det" +"exact_d4/det_direct" = "exact_d4/det_direct" +"exact_d4/det_direct_with_errbound" = "exact_d4/det_direct_with_errbound" +"exact_d4/det_errbound" = "exact_d4/det_errbound" +"exact_d4/det_exact" = "exact_d4/det_exact" +"exact_d4/det_exact_f64_result" = "exact_d4/det_exact_f64_result" +"exact_d4/det_exact_rounded_f64" = "exact_d4/det_exact_rounded_f64" +"exact_d4/det_sign_exact" = "exact_d4/det_sign_exact" +"exact_d4/solve_exact" = "exact_d4/solve_exact" +"exact_d4/solve_exact_f64_result" = "exact_d4/solve_exact_f64_result" +"exact_d4/solve_exact_rounded_f64" = "exact_d4/solve_exact_rounded_f64" +"exact_d5/det" = "exact_d5/det" +"exact_d5/det_exact" = "exact_d5/det_exact" +"exact_d5/det_exact_f64_result" = "exact_d5/det_exact_f64_result" +"exact_d5/det_exact_rounded_f64" = "exact_d5/det_exact_rounded_f64" +"exact_d5/det_sign_exact" = "exact_d5/det_sign_exact" +"exact_d5/solve_exact" = "exact_d5/solve_exact" +"exact_d5/solve_exact_f64_result" = "exact_d5/solve_exact_f64_result" +"exact_d5/solve_exact_rounded_f64" = "exact_d5/solve_exact_rounded_f64" +"exact_hilbert_4x4/det_exact" = "exact_hilbert_4x4/det_exact" +"exact_hilbert_4x4/det_sign_exact" = "exact_hilbert_4x4/det_sign_exact" +"exact_hilbert_4x4/solve_exact" = "exact_hilbert_4x4/solve_exact" +"exact_hilbert_4x4/solve_exact_f64_result" = "exact_hilbert_4x4/solve_exact_f64_result" +"exact_hilbert_4x4/solve_exact_rounded_f64" = "exact_hilbert_4x4/solve_exact_rounded_f64" +"exact_hilbert_5x5/det_exact" = "exact_hilbert_5x5/det_exact" +"exact_hilbert_5x5/det_sign_exact" = "exact_hilbert_5x5/det_sign_exact" +"exact_hilbert_5x5/solve_exact" = "exact_hilbert_5x5/solve_exact" +"exact_hilbert_5x5/solve_exact_f64_result" = "exact_hilbert_5x5/solve_exact_f64_result" +"exact_hilbert_5x5/solve_exact_rounded_f64" = "exact_hilbert_5x5/solve_exact_rounded_f64" +"exact_large_entries_3x3/det_exact" = "exact_large_entries_3x3/det_exact" +"exact_large_entries_3x3/det_sign_exact" = "exact_large_entries_3x3/det_sign_exact" +"exact_large_entries_3x3/solve_exact" = "exact_large_entries_3x3/solve_exact" +"exact_large_entries_3x3/solve_exact_f64_result" = "exact_large_entries_3x3/solve_exact_f64_result" +"exact_large_entries_3x3/solve_exact_rounded_f64" = "exact_large_entries_3x3/solve_exact_rounded_f64" +"exact_near_singular_3x3/det_exact" = "exact_near_singular_3x3/det_exact" +"exact_near_singular_3x3/det_sign_exact" = "exact_near_singular_3x3/det_sign_exact" +"exact_near_singular_3x3/solve_exact" = "exact_near_singular_3x3/solve_exact" +"exact_near_singular_3x3/solve_exact_f64_result" = "exact_near_singular_3x3/solve_exact_f64_result" +"exact_near_singular_3x3/solve_exact_rounded_f64" = "exact_near_singular_3x3/solve_exact_rounded_f64" +"exact_random_corpus_d2/det_exact" = "exact_random_corpus_d2/det_exact" +"exact_random_corpus_d2/det_sign_exact" = "exact_random_corpus_d2/det_sign_exact" +"exact_random_corpus_d2/solve_exact" = "exact_random_corpus_d2/solve_exact" +"exact_random_corpus_d2/solve_exact_f64_result" = "exact_random_corpus_d2/solve_exact_f64_result" +"exact_random_corpus_d2/solve_exact_rounded_f64" = "exact_random_corpus_d2/solve_exact_rounded_f64" +"exact_random_corpus_d3/det_exact" = "exact_random_corpus_d3/det_exact" +"exact_random_corpus_d3/det_sign_exact" = "exact_random_corpus_d3/det_sign_exact" +"exact_random_corpus_d3/solve_exact" = "exact_random_corpus_d3/solve_exact" +"exact_random_corpus_d3/solve_exact_f64_result" = "exact_random_corpus_d3/solve_exact_f64_result" +"exact_random_corpus_d3/solve_exact_rounded_f64" = "exact_random_corpus_d3/solve_exact_rounded_f64" +"exact_random_corpus_d4/det_exact" = "exact_random_corpus_d4/det_exact" +"exact_random_corpus_d4/det_sign_exact" = "exact_random_corpus_d4/det_sign_exact" +"exact_random_corpus_d4/solve_exact" = "exact_random_corpus_d4/solve_exact" +"exact_random_corpus_d4/solve_exact_f64_result" = "exact_random_corpus_d4/solve_exact_f64_result" +"exact_random_corpus_d4/solve_exact_rounded_f64" = "exact_random_corpus_d4/solve_exact_rounded_f64" +"exact_random_corpus_d5/det_exact" = "exact_random_corpus_d5/det_exact" +"exact_random_corpus_d5/det_sign_exact" = "exact_random_corpus_d5/det_sign_exact" +"exact_random_corpus_d5/solve_exact" = "exact_random_corpus_d5/solve_exact" +"exact_random_corpus_d5/solve_exact_f64_result" = "exact_random_corpus_d5/solve_exact_f64_result" +"exact_random_corpus_d5/solve_exact_rounded_f64" = "exact_random_corpus_d5/solve_exact_rounded_f64" +"rational_input_d2/det_big_rational_gaussian" = "rational_input_d2/det_big_rational_gaussian" +"rational_input_d2/det_row_cleared_bareiss" = "rational_input_d2/det_row_cleared_bareiss" +"rational_input_d2/det_sign_row_cleared_bareiss" = "rational_input_d2/det_sign_row_cleared_bareiss" +"rational_input_d2/solve_big_rational_gaussian" = "rational_input_d2/solve_big_rational_gaussian" +"rational_input_d2/solve_row_cleared_bareiss" = "rational_input_d2/solve_row_cleared_bareiss" +"rational_input_d3/det_big_rational_gaussian" = "rational_input_d3/det_big_rational_gaussian" +"rational_input_d3/det_row_cleared_bareiss" = "rational_input_d3/det_row_cleared_bareiss" +"rational_input_d3/det_sign_row_cleared_bareiss" = "rational_input_d3/det_sign_row_cleared_bareiss" +"rational_input_d3/solve_big_rational_gaussian" = "rational_input_d3/solve_big_rational_gaussian" +"rational_input_d3/solve_row_cleared_bareiss" = "rational_input_d3/solve_row_cleared_bareiss" +"rational_input_d4/det_big_rational_gaussian" = "rational_input_d4/det_big_rational_gaussian" +"rational_input_d4/det_row_cleared_bareiss" = "rational_input_d4/det_row_cleared_bareiss" +"rational_input_d4/det_sign_row_cleared_bareiss" = "rational_input_d4/det_sign_row_cleared_bareiss" +"rational_input_d4/solve_big_rational_gaussian" = "rational_input_d4/solve_big_rational_gaussian" +"rational_input_d4/solve_row_cleared_bareiss" = "rational_input_d4/solve_row_cleared_bareiss" +"rational_input_d5/det_big_rational_gaussian" = "rational_input_d5/det_big_rational_gaussian" +"rational_input_d5/det_row_cleared_bareiss" = "rational_input_d5/det_row_cleared_bareiss" +"rational_input_d5/det_sign_row_cleared_bareiss" = "rational_input_d5/det_sign_row_cleared_bareiss" +"rational_input_d5/solve_big_rational_gaussian" = "rational_input_d5/solve_big_rational_gaussian" +"rational_input_d5/solve_row_cleared_bareiss" = "rational_input_d5/solve_row_cleared_bareiss" +"rational_input_d6/det_big_rational_gaussian" = "rational_input_d6/det_big_rational_gaussian" +"rational_input_d6/det_row_cleared_bareiss" = "rational_input_d6/det_row_cleared_bareiss" +"rational_input_d6/det_sign_row_cleared_bareiss" = "rational_input_d6/det_sign_row_cleared_bareiss" +"rational_input_d6/solve_big_rational_gaussian" = "rational_input_d6/solve_big_rational_gaussian" +"rational_input_d6/solve_row_cleared_bareiss" = "rational_input_d6/solve_row_cleared_bareiss" +"rational_input_d7/det_big_rational_gaussian" = "rational_input_d7/det_big_rational_gaussian" +"rational_input_d7/det_row_cleared_bareiss" = "rational_input_d7/det_row_cleared_bareiss" +"rational_input_d7/det_sign_row_cleared_bareiss" = "rational_input_d7/det_sign_row_cleared_bareiss" +"rational_input_d7/solve_big_rational_gaussian" = "rational_input_d7/solve_big_rational_gaussian" +"rational_input_d7/solve_row_cleared_bareiss" = "rational_input_d7/solve_row_cleared_bareiss" +"rational_input_d8/det_big_rational_gaussian" = "rational_input_d8/det_big_rational_gaussian" +"rational_input_d8/det_row_cleared_bareiss" = "rational_input_d8/det_row_cleared_bareiss" +"rational_input_d8/det_sign_row_cleared_bareiss" = "rational_input_d8/det_sign_row_cleared_bareiss" +"rational_input_d8/solve_big_rational_gaussian" = "rational_input_d8/solve_big_rational_gaussian" +"rational_input_d8/solve_row_cleared_bareiss" = "rational_input_d8/solve_row_cleared_bareiss" + +[[series]] +name = "la-stack current" +phase = "current" +[series.rows] +"d16/la_stack_det" = "d16/la_stack_det" +"d16/la_stack_det_from_ldlt" = "d16/la_stack_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/la_stack_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/la_stack_det_via_lu" +"d16/la_stack_dot" = "d16/la_stack_dot" +"d16/la_stack_inf_norm" = "d16/la_stack_inf_norm" +"d16/la_stack_ldlt" = "d16/la_stack_ldlt" +"d16/la_stack_ldlt_solve" = "d16/la_stack_ldlt_solve" +"d16/la_stack_lu" = "d16/la_stack_lu" +"d16/la_stack_lu_solve" = "d16/la_stack_lu_solve" +"d16/la_stack_norm2_sq" = "d16/la_stack_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/la_stack_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/la_stack_solve_from_lu" +"d2/la_stack_det" = "d2/la_stack_det" +"d2/la_stack_det_from_ldlt" = "d2/la_stack_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/la_stack_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/la_stack_det_via_lu" +"d2/la_stack_dot" = "d2/la_stack_dot" +"d2/la_stack_inf_norm" = "d2/la_stack_inf_norm" +"d2/la_stack_ldlt" = "d2/la_stack_ldlt" +"d2/la_stack_ldlt_solve" = "d2/la_stack_ldlt_solve" +"d2/la_stack_lu" = "d2/la_stack_lu" +"d2/la_stack_lu_solve" = "d2/la_stack_lu_solve" +"d2/la_stack_norm2_sq" = "d2/la_stack_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/la_stack_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/la_stack_solve_from_lu" +"d3/la_stack_det" = "d3/la_stack_det" +"d3/la_stack_det_from_ldlt" = "d3/la_stack_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/la_stack_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/la_stack_det_via_lu" +"d3/la_stack_dot" = "d3/la_stack_dot" +"d3/la_stack_inf_norm" = "d3/la_stack_inf_norm" +"d3/la_stack_ldlt" = "d3/la_stack_ldlt" +"d3/la_stack_ldlt_solve" = "d3/la_stack_ldlt_solve" +"d3/la_stack_lu" = "d3/la_stack_lu" +"d3/la_stack_lu_solve" = "d3/la_stack_lu_solve" +"d3/la_stack_norm2_sq" = "d3/la_stack_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/la_stack_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/la_stack_solve_from_lu" +"d32/la_stack_det" = "d32/la_stack_det" +"d32/la_stack_det_from_ldlt" = "d32/la_stack_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/la_stack_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/la_stack_det_via_lu" +"d32/la_stack_dot" = "d32/la_stack_dot" +"d32/la_stack_inf_norm" = "d32/la_stack_inf_norm" +"d32/la_stack_ldlt" = "d32/la_stack_ldlt" +"d32/la_stack_ldlt_solve" = "d32/la_stack_ldlt_solve" +"d32/la_stack_lu" = "d32/la_stack_lu" +"d32/la_stack_lu_solve" = "d32/la_stack_lu_solve" +"d32/la_stack_norm2_sq" = "d32/la_stack_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/la_stack_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/la_stack_solve_from_lu" +"d4/la_stack_det" = "d4/la_stack_det" +"d4/la_stack_det_from_ldlt" = "d4/la_stack_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/la_stack_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/la_stack_det_via_lu" +"d4/la_stack_dot" = "d4/la_stack_dot" +"d4/la_stack_inf_norm" = "d4/la_stack_inf_norm" +"d4/la_stack_ldlt" = "d4/la_stack_ldlt" +"d4/la_stack_ldlt_solve" = "d4/la_stack_ldlt_solve" +"d4/la_stack_lu" = "d4/la_stack_lu" +"d4/la_stack_lu_solve" = "d4/la_stack_lu_solve" +"d4/la_stack_norm2_sq" = "d4/la_stack_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/la_stack_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/la_stack_solve_from_lu" +"d5/la_stack_det" = "d5/la_stack_det" +"d5/la_stack_det_from_ldlt" = "d5/la_stack_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/la_stack_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/la_stack_det_via_lu" +"d5/la_stack_dot" = "d5/la_stack_dot" +"d5/la_stack_inf_norm" = "d5/la_stack_inf_norm" +"d5/la_stack_ldlt" = "d5/la_stack_ldlt" +"d5/la_stack_ldlt_solve" = "d5/la_stack_ldlt_solve" +"d5/la_stack_lu" = "d5/la_stack_lu" +"d5/la_stack_lu_solve" = "d5/la_stack_lu_solve" +"d5/la_stack_norm2_sq" = "d5/la_stack_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/la_stack_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/la_stack_solve_from_lu" +"d64/la_stack_det" = "d64/la_stack_det" +"d64/la_stack_det_from_ldlt" = "d64/la_stack_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/la_stack_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/la_stack_det_via_lu" +"d64/la_stack_dot" = "d64/la_stack_dot" +"d64/la_stack_inf_norm" = "d64/la_stack_inf_norm" +"d64/la_stack_ldlt" = "d64/la_stack_ldlt" +"d64/la_stack_ldlt_solve" = "d64/la_stack_ldlt_solve" +"d64/la_stack_lu" = "d64/la_stack_lu" +"d64/la_stack_lu_solve" = "d64/la_stack_lu_solve" +"d64/la_stack_norm2_sq" = "d64/la_stack_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/la_stack_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/la_stack_solve_from_lu" +"d8/la_stack_det" = "d8/la_stack_det" +"d8/la_stack_det_from_ldlt" = "d8/la_stack_det_from_ldlt" +"d8/la_stack_det_from_ldlt_balanced_range" = "d8/la_stack_det_from_ldlt_balanced_range" +"d8/la_stack_det_from_lu" = "d8/la_stack_det_from_lu" +"d8/la_stack_det_from_lu_balanced_range" = "d8/la_stack_det_from_lu_balanced_range" +"d8/la_stack_det_via_lu" = "d8/la_stack_det_via_lu" +"d8/la_stack_dot" = "d8/la_stack_dot" +"d8/la_stack_inf_norm" = "d8/la_stack_inf_norm" +"d8/la_stack_ldlt" = "d8/la_stack_ldlt" +"d8/la_stack_ldlt_ill_conditioned" = "d8/la_stack_ldlt_ill_conditioned" +"d8/la_stack_ldlt_solve" = "d8/la_stack_ldlt_solve" +"d8/la_stack_lu" = "d8/la_stack_lu" +"d8/la_stack_lu_ill_conditioned" = "d8/la_stack_lu_ill_conditioned" +"d8/la_stack_lu_pivoting" = "d8/la_stack_lu_pivoting" +"d8/la_stack_lu_solve" = "d8/la_stack_lu_solve" +"d8/la_stack_norm2_sq" = "d8/la_stack_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/la_stack_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/la_stack_solve_from_lu" +"exact_d2/det" = "exact_d2/det" +"exact_d2/det_direct" = "exact_d2/det_direct" +"exact_d2/det_direct_with_errbound" = "exact_d2/det_direct_with_errbound" +"exact_d2/det_errbound" = "exact_d2/det_errbound" +"exact_d2/det_exact" = "exact_d2/det_exact" +"exact_d2/det_exact_f64_result" = "exact_d2/det_exact_f64_result" +"exact_d2/det_exact_rounded_f64" = "exact_d2/det_exact_rounded_f64" +"exact_d2/det_sign_exact" = "exact_d2/det_sign_exact" +"exact_d2/solve_exact" = "exact_d2/solve_exact" +"exact_d2/solve_exact_f64_result" = "exact_d2/solve_exact_f64_result" +"exact_d2/solve_exact_rounded_f64" = "exact_d2/solve_exact_rounded_f64" +"exact_d3/det" = "exact_d3/det" +"exact_d3/det_direct" = "exact_d3/det_direct" +"exact_d3/det_direct_with_errbound" = "exact_d3/det_direct_with_errbound" +"exact_d3/det_errbound" = "exact_d3/det_errbound" +"exact_d3/det_exact" = "exact_d3/det_exact" +"exact_d3/det_exact_f64_result" = "exact_d3/det_exact_f64_result" +"exact_d3/det_exact_rounded_f64" = "exact_d3/det_exact_rounded_f64" +"exact_d3/det_sign_exact" = "exact_d3/det_sign_exact" +"exact_d3/solve_exact" = "exact_d3/solve_exact" +"exact_d3/solve_exact_f64_result" = "exact_d3/solve_exact_f64_result" +"exact_d3/solve_exact_rounded_f64" = "exact_d3/solve_exact_rounded_f64" +"exact_d4/det" = "exact_d4/det" +"exact_d4/det_direct" = "exact_d4/det_direct" +"exact_d4/det_direct_with_errbound" = "exact_d4/det_direct_with_errbound" +"exact_d4/det_errbound" = "exact_d4/det_errbound" +"exact_d4/det_exact" = "exact_d4/det_exact" +"exact_d4/det_exact_f64_result" = "exact_d4/det_exact_f64_result" +"exact_d4/det_exact_rounded_f64" = "exact_d4/det_exact_rounded_f64" +"exact_d4/det_sign_exact" = "exact_d4/det_sign_exact" +"exact_d4/solve_exact" = "exact_d4/solve_exact" +"exact_d4/solve_exact_f64_result" = "exact_d4/solve_exact_f64_result" +"exact_d4/solve_exact_rounded_f64" = "exact_d4/solve_exact_rounded_f64" +"exact_d5/det" = "exact_d5/det" +"exact_d5/det_exact" = "exact_d5/det_exact" +"exact_d5/det_exact_f64_result" = "exact_d5/det_exact_f64_result" +"exact_d5/det_exact_rounded_f64" = "exact_d5/det_exact_rounded_f64" +"exact_d5/det_sign_exact" = "exact_d5/det_sign_exact" +"exact_d5/solve_exact" = "exact_d5/solve_exact" +"exact_d5/solve_exact_f64_result" = "exact_d5/solve_exact_f64_result" +"exact_d5/solve_exact_rounded_f64" = "exact_d5/solve_exact_rounded_f64" +"exact_hilbert_4x4/det_exact" = "exact_hilbert_4x4/det_exact" +"exact_hilbert_4x4/det_sign_exact" = "exact_hilbert_4x4/det_sign_exact" +"exact_hilbert_4x4/solve_exact" = "exact_hilbert_4x4/solve_exact" +"exact_hilbert_4x4/solve_exact_f64_result" = "exact_hilbert_4x4/solve_exact_f64_result" +"exact_hilbert_4x4/solve_exact_rounded_f64" = "exact_hilbert_4x4/solve_exact_rounded_f64" +"exact_hilbert_5x5/det_exact" = "exact_hilbert_5x5/det_exact" +"exact_hilbert_5x5/det_sign_exact" = "exact_hilbert_5x5/det_sign_exact" +"exact_hilbert_5x5/solve_exact" = "exact_hilbert_5x5/solve_exact" +"exact_hilbert_5x5/solve_exact_f64_result" = "exact_hilbert_5x5/solve_exact_f64_result" +"exact_hilbert_5x5/solve_exact_rounded_f64" = "exact_hilbert_5x5/solve_exact_rounded_f64" +"exact_large_entries_3x3/det_exact" = "exact_large_entries_3x3/det_exact" +"exact_large_entries_3x3/det_sign_exact" = "exact_large_entries_3x3/det_sign_exact" +"exact_large_entries_3x3/solve_exact" = "exact_large_entries_3x3/solve_exact" +"exact_large_entries_3x3/solve_exact_f64_result" = "exact_large_entries_3x3/solve_exact_f64_result" +"exact_large_entries_3x3/solve_exact_rounded_f64" = "exact_large_entries_3x3/solve_exact_rounded_f64" +"exact_near_singular_3x3/det_exact" = "exact_near_singular_3x3/det_exact" +"exact_near_singular_3x3/det_sign_exact" = "exact_near_singular_3x3/det_sign_exact" +"exact_near_singular_3x3/solve_exact" = "exact_near_singular_3x3/solve_exact" +"exact_near_singular_3x3/solve_exact_f64_result" = "exact_near_singular_3x3/solve_exact_f64_result" +"exact_near_singular_3x3/solve_exact_rounded_f64" = "exact_near_singular_3x3/solve_exact_rounded_f64" +"exact_random_corpus_d2/det_exact" = "exact_random_corpus_d2/det_exact" +"exact_random_corpus_d2/det_sign_exact" = "exact_random_corpus_d2/det_sign_exact" +"exact_random_corpus_d2/solve_exact" = "exact_random_corpus_d2/solve_exact" +"exact_random_corpus_d2/solve_exact_f64_result" = "exact_random_corpus_d2/solve_exact_f64_result" +"exact_random_corpus_d2/solve_exact_rounded_f64" = "exact_random_corpus_d2/solve_exact_rounded_f64" +"exact_random_corpus_d3/det_exact" = "exact_random_corpus_d3/det_exact" +"exact_random_corpus_d3/det_sign_exact" = "exact_random_corpus_d3/det_sign_exact" +"exact_random_corpus_d3/solve_exact" = "exact_random_corpus_d3/solve_exact" +"exact_random_corpus_d3/solve_exact_f64_result" = "exact_random_corpus_d3/solve_exact_f64_result" +"exact_random_corpus_d3/solve_exact_rounded_f64" = "exact_random_corpus_d3/solve_exact_rounded_f64" +"exact_random_corpus_d4/det_exact" = "exact_random_corpus_d4/det_exact" +"exact_random_corpus_d4/det_sign_exact" = "exact_random_corpus_d4/det_sign_exact" +"exact_random_corpus_d4/solve_exact" = "exact_random_corpus_d4/solve_exact" +"exact_random_corpus_d4/solve_exact_f64_result" = "exact_random_corpus_d4/solve_exact_f64_result" +"exact_random_corpus_d4/solve_exact_rounded_f64" = "exact_random_corpus_d4/solve_exact_rounded_f64" +"exact_random_corpus_d5/det_exact" = "exact_random_corpus_d5/det_exact" +"exact_random_corpus_d5/det_sign_exact" = "exact_random_corpus_d5/det_sign_exact" +"exact_random_corpus_d5/solve_exact" = "exact_random_corpus_d5/solve_exact" +"exact_random_corpus_d5/solve_exact_f64_result" = "exact_random_corpus_d5/solve_exact_f64_result" +"exact_random_corpus_d5/solve_exact_rounded_f64" = "exact_random_corpus_d5/solve_exact_rounded_f64" +"rational_input_d2/det_big_rational_gaussian" = "rational_input_d2/det_big_rational_gaussian" +"rational_input_d2/det_row_cleared_bareiss" = "rational_input_d2/det_row_cleared_bareiss" +"rational_input_d2/det_sign_row_cleared_bareiss" = "rational_input_d2/det_sign_row_cleared_bareiss" +"rational_input_d2/solve_big_rational_gaussian" = "rational_input_d2/solve_big_rational_gaussian" +"rational_input_d2/solve_row_cleared_bareiss" = "rational_input_d2/solve_row_cleared_bareiss" +"rational_input_d3/det_big_rational_gaussian" = "rational_input_d3/det_big_rational_gaussian" +"rational_input_d3/det_row_cleared_bareiss" = "rational_input_d3/det_row_cleared_bareiss" +"rational_input_d3/det_sign_row_cleared_bareiss" = "rational_input_d3/det_sign_row_cleared_bareiss" +"rational_input_d3/solve_big_rational_gaussian" = "rational_input_d3/solve_big_rational_gaussian" +"rational_input_d3/solve_row_cleared_bareiss" = "rational_input_d3/solve_row_cleared_bareiss" +"rational_input_d4/det_big_rational_gaussian" = "rational_input_d4/det_big_rational_gaussian" +"rational_input_d4/det_row_cleared_bareiss" = "rational_input_d4/det_row_cleared_bareiss" +"rational_input_d4/det_sign_row_cleared_bareiss" = "rational_input_d4/det_sign_row_cleared_bareiss" +"rational_input_d4/solve_big_rational_gaussian" = "rational_input_d4/solve_big_rational_gaussian" +"rational_input_d4/solve_row_cleared_bareiss" = "rational_input_d4/solve_row_cleared_bareiss" +"rational_input_d5/det_big_rational_gaussian" = "rational_input_d5/det_big_rational_gaussian" +"rational_input_d5/det_row_cleared_bareiss" = "rational_input_d5/det_row_cleared_bareiss" +"rational_input_d5/det_sign_row_cleared_bareiss" = "rational_input_d5/det_sign_row_cleared_bareiss" +"rational_input_d5/solve_big_rational_gaussian" = "rational_input_d5/solve_big_rational_gaussian" +"rational_input_d5/solve_row_cleared_bareiss" = "rational_input_d5/solve_row_cleared_bareiss" +"rational_input_d6/det_big_rational_gaussian" = "rational_input_d6/det_big_rational_gaussian" +"rational_input_d6/det_row_cleared_bareiss" = "rational_input_d6/det_row_cleared_bareiss" +"rational_input_d6/det_sign_row_cleared_bareiss" = "rational_input_d6/det_sign_row_cleared_bareiss" +"rational_input_d6/solve_big_rational_gaussian" = "rational_input_d6/solve_big_rational_gaussian" +"rational_input_d6/solve_row_cleared_bareiss" = "rational_input_d6/solve_row_cleared_bareiss" +"rational_input_d7/det_big_rational_gaussian" = "rational_input_d7/det_big_rational_gaussian" +"rational_input_d7/det_row_cleared_bareiss" = "rational_input_d7/det_row_cleared_bareiss" +"rational_input_d7/det_sign_row_cleared_bareiss" = "rational_input_d7/det_sign_row_cleared_bareiss" +"rational_input_d7/solve_big_rational_gaussian" = "rational_input_d7/solve_big_rational_gaussian" +"rational_input_d7/solve_row_cleared_bareiss" = "rational_input_d7/solve_row_cleared_bareiss" +"rational_input_d8/det_big_rational_gaussian" = "rational_input_d8/det_big_rational_gaussian" +"rational_input_d8/det_row_cleared_bareiss" = "rational_input_d8/det_row_cleared_bareiss" +"rational_input_d8/det_sign_row_cleared_bareiss" = "rational_input_d8/det_sign_row_cleared_bareiss" +"rational_input_d8/solve_big_rational_gaussian" = "rational_input_d8/solve_big_rational_gaussian" +"rational_input_d8/solve_row_cleared_bareiss" = "rational_input_d8/solve_row_cleared_bareiss" + +[[series]] +name = "nalgebra" +phase = "baseline" +[series.rows] +"d16/la_stack_det_from_ldlt" = "d16/nalgebra_det_from_cholesky" +"d16/la_stack_det_from_lu" = "d16/nalgebra_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/nalgebra_det_via_lu" +"d16/la_stack_dot" = "d16/nalgebra_dot" +"d16/la_stack_inf_norm" = "d16/nalgebra_inf_norm" +"d16/la_stack_ldlt" = "d16/nalgebra_cholesky" +"d16/la_stack_ldlt_solve" = "d16/nalgebra_cholesky_solve" +"d16/la_stack_lu" = "d16/nalgebra_lu" +"d16/la_stack_lu_solve" = "d16/nalgebra_lu_solve" +"d16/la_stack_norm2_sq" = "d16/nalgebra_norm_squared" +"d16/la_stack_solve_from_ldlt" = "d16/nalgebra_solve_from_cholesky" +"d16/la_stack_solve_from_lu" = "d16/nalgebra_solve_from_lu" +"d2/la_stack_det_from_ldlt" = "d2/nalgebra_det_from_cholesky" +"d2/la_stack_det_from_lu" = "d2/nalgebra_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/nalgebra_det_via_lu" +"d2/la_stack_dot" = "d2/nalgebra_dot" +"d2/la_stack_inf_norm" = "d2/nalgebra_inf_norm" +"d2/la_stack_ldlt" = "d2/nalgebra_cholesky" +"d2/la_stack_ldlt_solve" = "d2/nalgebra_cholesky_solve" +"d2/la_stack_lu" = "d2/nalgebra_lu" +"d2/la_stack_lu_solve" = "d2/nalgebra_lu_solve" +"d2/la_stack_norm2_sq" = "d2/nalgebra_norm_squared" +"d2/la_stack_solve_from_ldlt" = "d2/nalgebra_solve_from_cholesky" +"d2/la_stack_solve_from_lu" = "d2/nalgebra_solve_from_lu" +"d3/la_stack_det_from_ldlt" = "d3/nalgebra_det_from_cholesky" +"d3/la_stack_det_from_lu" = "d3/nalgebra_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/nalgebra_det_via_lu" +"d3/la_stack_dot" = "d3/nalgebra_dot" +"d3/la_stack_inf_norm" = "d3/nalgebra_inf_norm" +"d3/la_stack_ldlt" = "d3/nalgebra_cholesky" +"d3/la_stack_ldlt_solve" = "d3/nalgebra_cholesky_solve" +"d3/la_stack_lu" = "d3/nalgebra_lu" +"d3/la_stack_lu_solve" = "d3/nalgebra_lu_solve" +"d3/la_stack_norm2_sq" = "d3/nalgebra_norm_squared" +"d3/la_stack_solve_from_ldlt" = "d3/nalgebra_solve_from_cholesky" +"d3/la_stack_solve_from_lu" = "d3/nalgebra_solve_from_lu" +"d32/la_stack_det_from_ldlt" = "d32/nalgebra_det_from_cholesky" +"d32/la_stack_det_from_lu" = "d32/nalgebra_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/nalgebra_det_via_lu" +"d32/la_stack_dot" = "d32/nalgebra_dot" +"d32/la_stack_inf_norm" = "d32/nalgebra_inf_norm" +"d32/la_stack_ldlt" = "d32/nalgebra_cholesky" +"d32/la_stack_ldlt_solve" = "d32/nalgebra_cholesky_solve" +"d32/la_stack_lu" = "d32/nalgebra_lu" +"d32/la_stack_lu_solve" = "d32/nalgebra_lu_solve" +"d32/la_stack_norm2_sq" = "d32/nalgebra_norm_squared" +"d32/la_stack_solve_from_ldlt" = "d32/nalgebra_solve_from_cholesky" +"d32/la_stack_solve_from_lu" = "d32/nalgebra_solve_from_lu" +"d4/la_stack_det_from_ldlt" = "d4/nalgebra_det_from_cholesky" +"d4/la_stack_det_from_lu" = "d4/nalgebra_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/nalgebra_det_via_lu" +"d4/la_stack_dot" = "d4/nalgebra_dot" +"d4/la_stack_inf_norm" = "d4/nalgebra_inf_norm" +"d4/la_stack_ldlt" = "d4/nalgebra_cholesky" +"d4/la_stack_ldlt_solve" = "d4/nalgebra_cholesky_solve" +"d4/la_stack_lu" = "d4/nalgebra_lu" +"d4/la_stack_lu_solve" = "d4/nalgebra_lu_solve" +"d4/la_stack_norm2_sq" = "d4/nalgebra_norm_squared" +"d4/la_stack_solve_from_ldlt" = "d4/nalgebra_solve_from_cholesky" +"d4/la_stack_solve_from_lu" = "d4/nalgebra_solve_from_lu" +"d5/la_stack_det_from_ldlt" = "d5/nalgebra_det_from_cholesky" +"d5/la_stack_det_from_lu" = "d5/nalgebra_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/nalgebra_det_via_lu" +"d5/la_stack_dot" = "d5/nalgebra_dot" +"d5/la_stack_inf_norm" = "d5/nalgebra_inf_norm" +"d5/la_stack_ldlt" = "d5/nalgebra_cholesky" +"d5/la_stack_ldlt_solve" = "d5/nalgebra_cholesky_solve" +"d5/la_stack_lu" = "d5/nalgebra_lu" +"d5/la_stack_lu_solve" = "d5/nalgebra_lu_solve" +"d5/la_stack_norm2_sq" = "d5/nalgebra_norm_squared" +"d5/la_stack_solve_from_ldlt" = "d5/nalgebra_solve_from_cholesky" +"d5/la_stack_solve_from_lu" = "d5/nalgebra_solve_from_lu" +"d64/la_stack_det_from_ldlt" = "d64/nalgebra_det_from_cholesky" +"d64/la_stack_det_from_lu" = "d64/nalgebra_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/nalgebra_det_via_lu" +"d64/la_stack_dot" = "d64/nalgebra_dot" +"d64/la_stack_inf_norm" = "d64/nalgebra_inf_norm" +"d64/la_stack_ldlt" = "d64/nalgebra_cholesky" +"d64/la_stack_ldlt_solve" = "d64/nalgebra_cholesky_solve" +"d64/la_stack_lu" = "d64/nalgebra_lu" +"d64/la_stack_lu_solve" = "d64/nalgebra_lu_solve" +"d64/la_stack_norm2_sq" = "d64/nalgebra_norm_squared" +"d64/la_stack_solve_from_ldlt" = "d64/nalgebra_solve_from_cholesky" +"d64/la_stack_solve_from_lu" = "d64/nalgebra_solve_from_lu" +"d8/la_stack_det_from_ldlt" = "d8/nalgebra_det_from_cholesky" +"d8/la_stack_det_from_lu" = "d8/nalgebra_det_from_lu" +"d8/la_stack_det_via_lu" = "d8/nalgebra_det_via_lu" +"d8/la_stack_dot" = "d8/nalgebra_dot" +"d8/la_stack_inf_norm" = "d8/nalgebra_inf_norm" +"d8/la_stack_ldlt" = "d8/nalgebra_cholesky" +"d8/la_stack_ldlt_solve" = "d8/nalgebra_cholesky_solve" +"d8/la_stack_lu" = "d8/nalgebra_lu" +"d8/la_stack_lu_solve" = "d8/nalgebra_lu_solve" +"d8/la_stack_norm2_sq" = "d8/nalgebra_norm_squared" +"d8/la_stack_solve_from_ldlt" = "d8/nalgebra_solve_from_cholesky" +"d8/la_stack_solve_from_lu" = "d8/nalgebra_solve_from_lu" + +[[series]] +name = "faer" +phase = "baseline" +[series.rows] +"d16/la_stack_det_from_ldlt" = "d16/faer_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/faer_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/faer_det_via_lu" +"d16/la_stack_dot" = "d16/faer_dot_native" +"d16/la_stack_inf_norm" = "d16/faer_inf_norm" +"d16/la_stack_ldlt" = "d16/faer_ldlt" +"d16/la_stack_ldlt_solve" = "d16/faer_ldlt_solve" +"d16/la_stack_lu" = "d16/faer_lu" +"d16/la_stack_lu_solve" = "d16/faer_lu_solve" +"d16/la_stack_norm2_sq" = "d16/faer_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/faer_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/faer_solve_from_lu" +"d2/la_stack_det_from_ldlt" = "d2/faer_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/faer_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/faer_det_via_lu" +"d2/la_stack_dot" = "d2/faer_dot_native" +"d2/la_stack_inf_norm" = "d2/faer_inf_norm" +"d2/la_stack_ldlt" = "d2/faer_ldlt" +"d2/la_stack_ldlt_solve" = "d2/faer_ldlt_solve" +"d2/la_stack_lu" = "d2/faer_lu" +"d2/la_stack_lu_solve" = "d2/faer_lu_solve" +"d2/la_stack_norm2_sq" = "d2/faer_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/faer_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/faer_solve_from_lu" +"d3/la_stack_det_from_ldlt" = "d3/faer_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/faer_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/faer_det_via_lu" +"d3/la_stack_dot" = "d3/faer_dot_native" +"d3/la_stack_inf_norm" = "d3/faer_inf_norm" +"d3/la_stack_ldlt" = "d3/faer_ldlt" +"d3/la_stack_ldlt_solve" = "d3/faer_ldlt_solve" +"d3/la_stack_lu" = "d3/faer_lu" +"d3/la_stack_lu_solve" = "d3/faer_lu_solve" +"d3/la_stack_norm2_sq" = "d3/faer_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/faer_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/faer_solve_from_lu" +"d32/la_stack_det_from_ldlt" = "d32/faer_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/faer_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/faer_det_via_lu" +"d32/la_stack_dot" = "d32/faer_dot_native" +"d32/la_stack_inf_norm" = "d32/faer_inf_norm" +"d32/la_stack_ldlt" = "d32/faer_ldlt" +"d32/la_stack_ldlt_solve" = "d32/faer_ldlt_solve" +"d32/la_stack_lu" = "d32/faer_lu" +"d32/la_stack_lu_solve" = "d32/faer_lu_solve" +"d32/la_stack_norm2_sq" = "d32/faer_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/faer_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/faer_solve_from_lu" +"d4/la_stack_det_from_ldlt" = "d4/faer_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/faer_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/faer_det_via_lu" +"d4/la_stack_dot" = "d4/faer_dot_native" +"d4/la_stack_inf_norm" = "d4/faer_inf_norm" +"d4/la_stack_ldlt" = "d4/faer_ldlt" +"d4/la_stack_ldlt_solve" = "d4/faer_ldlt_solve" +"d4/la_stack_lu" = "d4/faer_lu" +"d4/la_stack_lu_solve" = "d4/faer_lu_solve" +"d4/la_stack_norm2_sq" = "d4/faer_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/faer_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/faer_solve_from_lu" +"d5/la_stack_det_from_ldlt" = "d5/faer_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/faer_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/faer_det_via_lu" +"d5/la_stack_dot" = "d5/faer_dot_native" +"d5/la_stack_inf_norm" = "d5/faer_inf_norm" +"d5/la_stack_ldlt" = "d5/faer_ldlt" +"d5/la_stack_ldlt_solve" = "d5/faer_ldlt_solve" +"d5/la_stack_lu" = "d5/faer_lu" +"d5/la_stack_lu_solve" = "d5/faer_lu_solve" +"d5/la_stack_norm2_sq" = "d5/faer_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/faer_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/faer_solve_from_lu" +"d64/la_stack_det_from_ldlt" = "d64/faer_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/faer_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/faer_det_via_lu" +"d64/la_stack_dot" = "d64/faer_dot_native" +"d64/la_stack_inf_norm" = "d64/faer_inf_norm" +"d64/la_stack_ldlt" = "d64/faer_ldlt" +"d64/la_stack_ldlt_solve" = "d64/faer_ldlt_solve" +"d64/la_stack_lu" = "d64/faer_lu" +"d64/la_stack_lu_solve" = "d64/faer_lu_solve" +"d64/la_stack_norm2_sq" = "d64/faer_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/faer_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/faer_solve_from_lu" +"d8/la_stack_det_from_ldlt" = "d8/faer_det_from_ldlt" +"d8/la_stack_det_from_lu" = "d8/faer_det_from_lu" +"d8/la_stack_det_via_lu" = "d8/faer_det_via_lu" +"d8/la_stack_dot" = "d8/faer_dot_native" +"d8/la_stack_inf_norm" = "d8/faer_inf_norm" +"d8/la_stack_ldlt" = "d8/faer_ldlt" +"d8/la_stack_ldlt_solve" = "d8/faer_ldlt_solve" +"d8/la_stack_lu" = "d8/faer_lu" +"d8/la_stack_lu_solve" = "d8/faer_lu_solve" +"d8/la_stack_norm2_sq" = "d8/faer_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/faer_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/faer_solve_from_lu" diff --git a/tooling/measurements/non-exact.toml b/tooling/measurements/non-exact.toml new file mode 100644 index 0000000..858dfd0 --- /dev/null +++ b/tooling/measurements/non-exact.toml @@ -0,0 +1,919 @@ +# Scientific measurement policy consumed directly by research-repo-tools. +schema = 2 +minimum-release = "v0.5.0" +sources = [ "src/**/*.rs", "Cargo.toml" ] +harness = [ + "benches/**/*.rs", + "benches/comparison/Cargo.toml", + "examples/**/*.rs", + "Cargo.toml", + "Cargo.lock", + "rust-toolchain.toml", + "tests/exact_bench_config.rs", + "tooling/performance.just", + "tooling/criterion-inventory.toml", + "tooling/measurements/*.toml", +] +sample-count = 100 +statistics = [ "mean", "median" ] +confidence-level = 0.95 +unit = "ns" +timeout = 14400 +compatible = [ + "harness_sha256", + "context.os", + "context.architecture", + "context.cpu", + "context.tool.rustc", + "context.tool.cargo", + "context.tool.just", + "context.dependency.criterion", + "context.dependency.nalgebra", + "context.dependency.faer", +] + +[context] +phase-driver = "just-v1" +suite = "vs_linalg" +scope = "release-signal" +baseline-api-compatibility = "none" + +[probes] +rustc = [ "rustc", "-vV" ] +cargo = [ "cargo", "--version" ] +just = [ "just", "--version" ] + +[dependencies] +criterion = "Cargo.lock" +nalgebra = "Cargo.lock" +faer = "Cargo.lock" + +[phases.baseline] +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "baseline-vs_linalg" ] +gate = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "gate" ] +# Fixed code-generation settings are recorded for both phases. +environment = { CARGO_TARGET_DIR = "target", CRITERION_HOME = "target/criterion", RUSTUP_TOOLCHAIN = "1.99.1", RUSTFLAGS = "--cap-lints=warn", CARGO_ENCODED_RUSTFLAGS = "--cap-lints=warn", RUSTC = "rustc", RUSTC_WRAPPER = "", RUSTC_WORKSPACE_WRAPPER = "" } + +[phases.baseline.discovery] +required = [ + "d16/faer_det_from_ldlt", + "d16/faer_det_from_lu", + "d16/faer_det_via_lu", + "d16/faer_dot_native", + "d16/faer_inf_norm", + "d16/faer_ldlt", + "d16/faer_ldlt_solve", + "d16/faer_lu", + "d16/faer_lu_solve", + "d16/faer_norm2_sq", + "d16/faer_solve_from_ldlt", + "d16/faer_solve_from_lu", + "d16/la_stack_det", + "d16/la_stack_det_from_ldlt", + "d16/la_stack_det_from_lu", + "d16/la_stack_det_via_lu", + "d16/la_stack_dot", + "d16/la_stack_inf_norm", + "d16/la_stack_ldlt", + "d16/la_stack_ldlt_solve", + "d16/la_stack_lu", + "d16/la_stack_lu_solve", + "d16/la_stack_norm2_sq", + "d16/la_stack_solve_from_ldlt", + "d16/la_stack_solve_from_lu", + "d16/nalgebra_cholesky", + "d16/nalgebra_cholesky_solve", + "d16/nalgebra_det_from_cholesky", + "d16/nalgebra_det_from_lu", + "d16/nalgebra_det_via_lu", + "d16/nalgebra_dot", + "d16/nalgebra_inf_norm", + "d16/nalgebra_lu", + "d16/nalgebra_lu_solve", + "d16/nalgebra_norm_squared", + "d16/nalgebra_solve_from_cholesky", + "d16/nalgebra_solve_from_lu", + "d2/faer_det_from_ldlt", + "d2/faer_det_from_lu", + "d2/faer_det_via_lu", + "d2/faer_dot_native", + "d2/faer_inf_norm", + "d2/faer_ldlt", + "d2/faer_ldlt_solve", + "d2/faer_lu", + "d2/faer_lu_solve", + "d2/faer_norm2_sq", + "d2/faer_solve_from_ldlt", + "d2/faer_solve_from_lu", + "d2/la_stack_det", + "d2/la_stack_det_from_ldlt", + "d2/la_stack_det_from_lu", + "d2/la_stack_det_via_lu", + "d2/la_stack_dot", + "d2/la_stack_inf_norm", + "d2/la_stack_ldlt", + "d2/la_stack_ldlt_solve", + "d2/la_stack_lu", + "d2/la_stack_lu_solve", + "d2/la_stack_norm2_sq", + "d2/la_stack_solve_from_ldlt", + "d2/la_stack_solve_from_lu", + "d2/nalgebra_cholesky", + "d2/nalgebra_cholesky_solve", + "d2/nalgebra_det_from_cholesky", + "d2/nalgebra_det_from_lu", + "d2/nalgebra_det_via_lu", + "d2/nalgebra_dot", + "d2/nalgebra_inf_norm", + "d2/nalgebra_lu", + "d2/nalgebra_lu_solve", + "d2/nalgebra_norm_squared", + "d2/nalgebra_solve_from_cholesky", + "d2/nalgebra_solve_from_lu", + "d3/faer_det_from_ldlt", + "d3/faer_det_from_lu", + "d3/faer_det_via_lu", + "d3/faer_dot_native", + "d3/faer_inf_norm", + "d3/faer_ldlt", + "d3/faer_ldlt_solve", + "d3/faer_lu", + "d3/faer_lu_solve", + "d3/faer_norm2_sq", + "d3/faer_solve_from_ldlt", + "d3/faer_solve_from_lu", + "d3/la_stack_det", + "d3/la_stack_det_from_ldlt", + "d3/la_stack_det_from_lu", + "d3/la_stack_det_via_lu", + "d3/la_stack_dot", + "d3/la_stack_inf_norm", + "d3/la_stack_ldlt", + "d3/la_stack_ldlt_solve", + "d3/la_stack_lu", + "d3/la_stack_lu_solve", + "d3/la_stack_norm2_sq", + "d3/la_stack_solve_from_ldlt", + "d3/la_stack_solve_from_lu", + "d3/nalgebra_cholesky", + "d3/nalgebra_cholesky_solve", + "d3/nalgebra_det_from_cholesky", + "d3/nalgebra_det_from_lu", + "d3/nalgebra_det_via_lu", + "d3/nalgebra_dot", + "d3/nalgebra_inf_norm", + "d3/nalgebra_lu", + "d3/nalgebra_lu_solve", + "d3/nalgebra_norm_squared", + "d3/nalgebra_solve_from_cholesky", + "d3/nalgebra_solve_from_lu", + "d32/faer_det_from_ldlt", + "d32/faer_det_from_lu", + "d32/faer_det_via_lu", + "d32/faer_dot_native", + "d32/faer_inf_norm", + "d32/faer_ldlt", + "d32/faer_ldlt_solve", + "d32/faer_lu", + "d32/faer_lu_solve", + "d32/faer_norm2_sq", + "d32/faer_solve_from_ldlt", + "d32/faer_solve_from_lu", + "d32/la_stack_det", + "d32/la_stack_det_from_ldlt", + "d32/la_stack_det_from_lu", + "d32/la_stack_det_via_lu", + "d32/la_stack_dot", + "d32/la_stack_inf_norm", + "d32/la_stack_ldlt", + "d32/la_stack_ldlt_solve", + "d32/la_stack_lu", + "d32/la_stack_lu_solve", + "d32/la_stack_norm2_sq", + "d32/la_stack_solve_from_ldlt", + "d32/la_stack_solve_from_lu", + "d32/nalgebra_cholesky", + "d32/nalgebra_cholesky_solve", + "d32/nalgebra_det_from_cholesky", + "d32/nalgebra_det_from_lu", + "d32/nalgebra_det_via_lu", + "d32/nalgebra_dot", + "d32/nalgebra_inf_norm", + "d32/nalgebra_lu", + "d32/nalgebra_lu_solve", + "d32/nalgebra_norm_squared", + "d32/nalgebra_solve_from_cholesky", + "d32/nalgebra_solve_from_lu", + "d4/faer_det_from_ldlt", + "d4/faer_det_from_lu", + "d4/faer_det_via_lu", + "d4/faer_dot_native", + "d4/faer_inf_norm", + "d4/faer_ldlt", + "d4/faer_ldlt_solve", + "d4/faer_lu", + "d4/faer_lu_solve", + "d4/faer_norm2_sq", + "d4/faer_solve_from_ldlt", + "d4/faer_solve_from_lu", + "d4/la_stack_det", + "d4/la_stack_det_from_ldlt", + "d4/la_stack_det_from_lu", + "d4/la_stack_det_via_lu", + "d4/la_stack_dot", + "d4/la_stack_inf_norm", + "d4/la_stack_ldlt", + "d4/la_stack_ldlt_solve", + "d4/la_stack_lu", + "d4/la_stack_lu_solve", + "d4/la_stack_norm2_sq", + "d4/la_stack_solve_from_ldlt", + "d4/la_stack_solve_from_lu", + "d4/nalgebra_cholesky", + "d4/nalgebra_cholesky_solve", + "d4/nalgebra_det_from_cholesky", + "d4/nalgebra_det_from_lu", + "d4/nalgebra_det_via_lu", + "d4/nalgebra_dot", + "d4/nalgebra_inf_norm", + "d4/nalgebra_lu", + "d4/nalgebra_lu_solve", + "d4/nalgebra_norm_squared", + "d4/nalgebra_solve_from_cholesky", + "d4/nalgebra_solve_from_lu", + "d5/faer_det_from_ldlt", + "d5/faer_det_from_lu", + "d5/faer_det_via_lu", + "d5/faer_dot_native", + "d5/faer_inf_norm", + "d5/faer_ldlt", + "d5/faer_ldlt_solve", + "d5/faer_lu", + "d5/faer_lu_solve", + "d5/faer_norm2_sq", + "d5/faer_solve_from_ldlt", + "d5/faer_solve_from_lu", + "d5/la_stack_det", + "d5/la_stack_det_from_ldlt", + "d5/la_stack_det_from_lu", + "d5/la_stack_det_via_lu", + "d5/la_stack_dot", + "d5/la_stack_inf_norm", + "d5/la_stack_ldlt", + "d5/la_stack_ldlt_solve", + "d5/la_stack_lu", + "d5/la_stack_lu_solve", + "d5/la_stack_norm2_sq", + "d5/la_stack_solve_from_ldlt", + "d5/la_stack_solve_from_lu", + "d5/nalgebra_cholesky", + "d5/nalgebra_cholesky_solve", + "d5/nalgebra_det_from_cholesky", + "d5/nalgebra_det_from_lu", + "d5/nalgebra_det_via_lu", + "d5/nalgebra_dot", + "d5/nalgebra_inf_norm", + "d5/nalgebra_lu", + "d5/nalgebra_lu_solve", + "d5/nalgebra_norm_squared", + "d5/nalgebra_solve_from_cholesky", + "d5/nalgebra_solve_from_lu", + "d64/faer_det_from_ldlt", + "d64/faer_det_from_lu", + "d64/faer_det_via_lu", + "d64/faer_dot_native", + "d64/faer_inf_norm", + "d64/faer_ldlt", + "d64/faer_ldlt_solve", + "d64/faer_lu", + "d64/faer_lu_solve", + "d64/faer_norm2_sq", + "d64/faer_solve_from_ldlt", + "d64/faer_solve_from_lu", + "d64/la_stack_det", + "d64/la_stack_det_from_ldlt", + "d64/la_stack_det_from_lu", + "d64/la_stack_det_via_lu", + "d64/la_stack_dot", + "d64/la_stack_inf_norm", + "d64/la_stack_ldlt", + "d64/la_stack_ldlt_solve", + "d64/la_stack_lu", + "d64/la_stack_lu_solve", + "d64/la_stack_norm2_sq", + "d64/la_stack_solve_from_ldlt", + "d64/la_stack_solve_from_lu", + "d64/nalgebra_cholesky", + "d64/nalgebra_cholesky_solve", + "d64/nalgebra_det_from_cholesky", + "d64/nalgebra_det_from_lu", + "d64/nalgebra_det_via_lu", + "d64/nalgebra_dot", + "d64/nalgebra_inf_norm", + "d64/nalgebra_lu", + "d64/nalgebra_lu_solve", + "d64/nalgebra_norm_squared", + "d64/nalgebra_solve_from_cholesky", + "d64/nalgebra_solve_from_lu", + "d8/faer_det_from_ldlt", + "d8/faer_det_from_lu", + "d8/faer_det_via_lu", + "d8/faer_dot_native", + "d8/faer_inf_norm", + "d8/faer_ldlt", + "d8/faer_ldlt_solve", + "d8/faer_lu", + "d8/faer_lu_solve", + "d8/faer_norm2_sq", + "d8/faer_solve_from_ldlt", + "d8/faer_solve_from_lu", + "d8/la_stack_det", + "d8/la_stack_det_from_ldlt", + "d8/la_stack_det_from_ldlt_balanced_range", + "d8/la_stack_det_from_lu", + "d8/la_stack_det_from_lu_balanced_range", + "d8/la_stack_det_via_lu", + "d8/la_stack_dot", + "d8/la_stack_inf_norm", + "d8/la_stack_ldlt", + "d8/la_stack_ldlt_ill_conditioned", + "d8/la_stack_ldlt_solve", + "d8/la_stack_lu", + "d8/la_stack_lu_ill_conditioned", + "d8/la_stack_lu_pivoting", + "d8/la_stack_lu_solve", + "d8/la_stack_norm2_sq", + "d8/la_stack_solve_from_ldlt", + "d8/la_stack_solve_from_lu", + "d8/nalgebra_cholesky", + "d8/nalgebra_cholesky_solve", + "d8/nalgebra_det_from_cholesky", + "d8/nalgebra_det_from_lu", + "d8/nalgebra_det_via_lu", + "d8/nalgebra_dot", + "d8/nalgebra_inf_norm", + "d8/nalgebra_lu", + "d8/nalgebra_lu_solve", + "d8/nalgebra_norm_squared", + "d8/nalgebra_solve_from_cholesky", + "d8/nalgebra_solve_from_lu", +] + +[[phases.baseline.discovery.suites]] +name = "vs_linalg" +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "baseline-vs_linalg", "list" ] +timeout = 14400 + +[phases.current] +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "current-vs_linalg" ] +gate = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "gate" ] +# Fixed code-generation settings are recorded for both phases. +environment = { CARGO_TARGET_DIR = "target", CRITERION_HOME = "target/criterion", RUSTUP_TOOLCHAIN = "1.99.1", RUSTFLAGS = "--cap-lints=warn", CARGO_ENCODED_RUSTFLAGS = "--cap-lints=warn", RUSTC = "rustc", RUSTC_WRAPPER = "", RUSTC_WORKSPACE_WRAPPER = "" } + +[phases.current.discovery] +required = [ + "d16/la_stack_det", + "d16/la_stack_det_from_ldlt", + "d16/la_stack_det_from_lu", + "d16/la_stack_det_via_lu", + "d16/la_stack_dot", + "d16/la_stack_inf_norm", + "d16/la_stack_ldlt", + "d16/la_stack_ldlt_solve", + "d16/la_stack_lu", + "d16/la_stack_lu_solve", + "d16/la_stack_norm2_sq", + "d16/la_stack_solve_from_ldlt", + "d16/la_stack_solve_from_lu", + "d2/la_stack_det", + "d2/la_stack_det_from_ldlt", + "d2/la_stack_det_from_lu", + "d2/la_stack_det_via_lu", + "d2/la_stack_dot", + "d2/la_stack_inf_norm", + "d2/la_stack_ldlt", + "d2/la_stack_ldlt_solve", + "d2/la_stack_lu", + "d2/la_stack_lu_solve", + "d2/la_stack_norm2_sq", + "d2/la_stack_solve_from_ldlt", + "d2/la_stack_solve_from_lu", + "d3/la_stack_det", + "d3/la_stack_det_from_ldlt", + "d3/la_stack_det_from_lu", + "d3/la_stack_det_via_lu", + "d3/la_stack_dot", + "d3/la_stack_inf_norm", + "d3/la_stack_ldlt", + "d3/la_stack_ldlt_solve", + "d3/la_stack_lu", + "d3/la_stack_lu_solve", + "d3/la_stack_norm2_sq", + "d3/la_stack_solve_from_ldlt", + "d3/la_stack_solve_from_lu", + "d32/la_stack_det", + "d32/la_stack_det_from_ldlt", + "d32/la_stack_det_from_lu", + "d32/la_stack_det_via_lu", + "d32/la_stack_dot", + "d32/la_stack_inf_norm", + "d32/la_stack_ldlt", + "d32/la_stack_ldlt_solve", + "d32/la_stack_lu", + "d32/la_stack_lu_solve", + "d32/la_stack_norm2_sq", + "d32/la_stack_solve_from_ldlt", + "d32/la_stack_solve_from_lu", + "d4/la_stack_det", + "d4/la_stack_det_from_ldlt", + "d4/la_stack_det_from_lu", + "d4/la_stack_det_via_lu", + "d4/la_stack_dot", + "d4/la_stack_inf_norm", + "d4/la_stack_ldlt", + "d4/la_stack_ldlt_solve", + "d4/la_stack_lu", + "d4/la_stack_lu_solve", + "d4/la_stack_norm2_sq", + "d4/la_stack_solve_from_ldlt", + "d4/la_stack_solve_from_lu", + "d5/la_stack_det", + "d5/la_stack_det_from_ldlt", + "d5/la_stack_det_from_lu", + "d5/la_stack_det_via_lu", + "d5/la_stack_dot", + "d5/la_stack_inf_norm", + "d5/la_stack_ldlt", + "d5/la_stack_ldlt_solve", + "d5/la_stack_lu", + "d5/la_stack_lu_solve", + "d5/la_stack_norm2_sq", + "d5/la_stack_solve_from_ldlt", + "d5/la_stack_solve_from_lu", + "d64/la_stack_det", + "d64/la_stack_det_from_ldlt", + "d64/la_stack_det_from_lu", + "d64/la_stack_det_via_lu", + "d64/la_stack_dot", + "d64/la_stack_inf_norm", + "d64/la_stack_ldlt", + "d64/la_stack_ldlt_solve", + "d64/la_stack_lu", + "d64/la_stack_lu_solve", + "d64/la_stack_norm2_sq", + "d64/la_stack_solve_from_ldlt", + "d64/la_stack_solve_from_lu", + "d8/la_stack_det", + "d8/la_stack_det_from_ldlt", + "d8/la_stack_det_from_ldlt_balanced_range", + "d8/la_stack_det_from_lu", + "d8/la_stack_det_from_lu_balanced_range", + "d8/la_stack_det_via_lu", + "d8/la_stack_dot", + "d8/la_stack_inf_norm", + "d8/la_stack_ldlt", + "d8/la_stack_ldlt_ill_conditioned", + "d8/la_stack_ldlt_solve", + "d8/la_stack_lu", + "d8/la_stack_lu_ill_conditioned", + "d8/la_stack_lu_pivoting", + "d8/la_stack_lu_solve", + "d8/la_stack_norm2_sq", + "d8/la_stack_solve_from_ldlt", + "d8/la_stack_solve_from_lu", +] + +[[phases.current.discovery.suites]] +name = "vs_linalg" +command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "current-vs_linalg", "list" ] +timeout = 14400 + +[[series]] +name = "la-stack baseline" +phase = "baseline" +[series.rows] +"d16/la_stack_det" = "d16/la_stack_det" +"d16/la_stack_det_from_ldlt" = "d16/la_stack_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/la_stack_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/la_stack_det_via_lu" +"d16/la_stack_dot" = "d16/la_stack_dot" +"d16/la_stack_inf_norm" = "d16/la_stack_inf_norm" +"d16/la_stack_ldlt" = "d16/la_stack_ldlt" +"d16/la_stack_ldlt_solve" = "d16/la_stack_ldlt_solve" +"d16/la_stack_lu" = "d16/la_stack_lu" +"d16/la_stack_lu_solve" = "d16/la_stack_lu_solve" +"d16/la_stack_norm2_sq" = "d16/la_stack_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/la_stack_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/la_stack_solve_from_lu" +"d2/la_stack_det" = "d2/la_stack_det" +"d2/la_stack_det_from_ldlt" = "d2/la_stack_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/la_stack_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/la_stack_det_via_lu" +"d2/la_stack_dot" = "d2/la_stack_dot" +"d2/la_stack_inf_norm" = "d2/la_stack_inf_norm" +"d2/la_stack_ldlt" = "d2/la_stack_ldlt" +"d2/la_stack_ldlt_solve" = "d2/la_stack_ldlt_solve" +"d2/la_stack_lu" = "d2/la_stack_lu" +"d2/la_stack_lu_solve" = "d2/la_stack_lu_solve" +"d2/la_stack_norm2_sq" = "d2/la_stack_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/la_stack_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/la_stack_solve_from_lu" +"d3/la_stack_det" = "d3/la_stack_det" +"d3/la_stack_det_from_ldlt" = "d3/la_stack_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/la_stack_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/la_stack_det_via_lu" +"d3/la_stack_dot" = "d3/la_stack_dot" +"d3/la_stack_inf_norm" = "d3/la_stack_inf_norm" +"d3/la_stack_ldlt" = "d3/la_stack_ldlt" +"d3/la_stack_ldlt_solve" = "d3/la_stack_ldlt_solve" +"d3/la_stack_lu" = "d3/la_stack_lu" +"d3/la_stack_lu_solve" = "d3/la_stack_lu_solve" +"d3/la_stack_norm2_sq" = "d3/la_stack_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/la_stack_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/la_stack_solve_from_lu" +"d32/la_stack_det" = "d32/la_stack_det" +"d32/la_stack_det_from_ldlt" = "d32/la_stack_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/la_stack_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/la_stack_det_via_lu" +"d32/la_stack_dot" = "d32/la_stack_dot" +"d32/la_stack_inf_norm" = "d32/la_stack_inf_norm" +"d32/la_stack_ldlt" = "d32/la_stack_ldlt" +"d32/la_stack_ldlt_solve" = "d32/la_stack_ldlt_solve" +"d32/la_stack_lu" = "d32/la_stack_lu" +"d32/la_stack_lu_solve" = "d32/la_stack_lu_solve" +"d32/la_stack_norm2_sq" = "d32/la_stack_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/la_stack_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/la_stack_solve_from_lu" +"d4/la_stack_det" = "d4/la_stack_det" +"d4/la_stack_det_from_ldlt" = "d4/la_stack_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/la_stack_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/la_stack_det_via_lu" +"d4/la_stack_dot" = "d4/la_stack_dot" +"d4/la_stack_inf_norm" = "d4/la_stack_inf_norm" +"d4/la_stack_ldlt" = "d4/la_stack_ldlt" +"d4/la_stack_ldlt_solve" = "d4/la_stack_ldlt_solve" +"d4/la_stack_lu" = "d4/la_stack_lu" +"d4/la_stack_lu_solve" = "d4/la_stack_lu_solve" +"d4/la_stack_norm2_sq" = "d4/la_stack_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/la_stack_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/la_stack_solve_from_lu" +"d5/la_stack_det" = "d5/la_stack_det" +"d5/la_stack_det_from_ldlt" = "d5/la_stack_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/la_stack_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/la_stack_det_via_lu" +"d5/la_stack_dot" = "d5/la_stack_dot" +"d5/la_stack_inf_norm" = "d5/la_stack_inf_norm" +"d5/la_stack_ldlt" = "d5/la_stack_ldlt" +"d5/la_stack_ldlt_solve" = "d5/la_stack_ldlt_solve" +"d5/la_stack_lu" = "d5/la_stack_lu" +"d5/la_stack_lu_solve" = "d5/la_stack_lu_solve" +"d5/la_stack_norm2_sq" = "d5/la_stack_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/la_stack_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/la_stack_solve_from_lu" +"d64/la_stack_det" = "d64/la_stack_det" +"d64/la_stack_det_from_ldlt" = "d64/la_stack_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/la_stack_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/la_stack_det_via_lu" +"d64/la_stack_dot" = "d64/la_stack_dot" +"d64/la_stack_inf_norm" = "d64/la_stack_inf_norm" +"d64/la_stack_ldlt" = "d64/la_stack_ldlt" +"d64/la_stack_ldlt_solve" = "d64/la_stack_ldlt_solve" +"d64/la_stack_lu" = "d64/la_stack_lu" +"d64/la_stack_lu_solve" = "d64/la_stack_lu_solve" +"d64/la_stack_norm2_sq" = "d64/la_stack_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/la_stack_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/la_stack_solve_from_lu" +"d8/la_stack_det" = "d8/la_stack_det" +"d8/la_stack_det_from_ldlt" = "d8/la_stack_det_from_ldlt" +"d8/la_stack_det_from_ldlt_balanced_range" = "d8/la_stack_det_from_ldlt_balanced_range" +"d8/la_stack_det_from_lu" = "d8/la_stack_det_from_lu" +"d8/la_stack_det_from_lu_balanced_range" = "d8/la_stack_det_from_lu_balanced_range" +"d8/la_stack_det_via_lu" = "d8/la_stack_det_via_lu" +"d8/la_stack_dot" = "d8/la_stack_dot" +"d8/la_stack_inf_norm" = "d8/la_stack_inf_norm" +"d8/la_stack_ldlt" = "d8/la_stack_ldlt" +"d8/la_stack_ldlt_ill_conditioned" = "d8/la_stack_ldlt_ill_conditioned" +"d8/la_stack_ldlt_solve" = "d8/la_stack_ldlt_solve" +"d8/la_stack_lu" = "d8/la_stack_lu" +"d8/la_stack_lu_ill_conditioned" = "d8/la_stack_lu_ill_conditioned" +"d8/la_stack_lu_pivoting" = "d8/la_stack_lu_pivoting" +"d8/la_stack_lu_solve" = "d8/la_stack_lu_solve" +"d8/la_stack_norm2_sq" = "d8/la_stack_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/la_stack_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/la_stack_solve_from_lu" + +[[series]] +name = "la-stack current" +phase = "current" +[series.rows] +"d16/la_stack_det" = "d16/la_stack_det" +"d16/la_stack_det_from_ldlt" = "d16/la_stack_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/la_stack_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/la_stack_det_via_lu" +"d16/la_stack_dot" = "d16/la_stack_dot" +"d16/la_stack_inf_norm" = "d16/la_stack_inf_norm" +"d16/la_stack_ldlt" = "d16/la_stack_ldlt" +"d16/la_stack_ldlt_solve" = "d16/la_stack_ldlt_solve" +"d16/la_stack_lu" = "d16/la_stack_lu" +"d16/la_stack_lu_solve" = "d16/la_stack_lu_solve" +"d16/la_stack_norm2_sq" = "d16/la_stack_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/la_stack_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/la_stack_solve_from_lu" +"d2/la_stack_det" = "d2/la_stack_det" +"d2/la_stack_det_from_ldlt" = "d2/la_stack_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/la_stack_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/la_stack_det_via_lu" +"d2/la_stack_dot" = "d2/la_stack_dot" +"d2/la_stack_inf_norm" = "d2/la_stack_inf_norm" +"d2/la_stack_ldlt" = "d2/la_stack_ldlt" +"d2/la_stack_ldlt_solve" = "d2/la_stack_ldlt_solve" +"d2/la_stack_lu" = "d2/la_stack_lu" +"d2/la_stack_lu_solve" = "d2/la_stack_lu_solve" +"d2/la_stack_norm2_sq" = "d2/la_stack_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/la_stack_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/la_stack_solve_from_lu" +"d3/la_stack_det" = "d3/la_stack_det" +"d3/la_stack_det_from_ldlt" = "d3/la_stack_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/la_stack_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/la_stack_det_via_lu" +"d3/la_stack_dot" = "d3/la_stack_dot" +"d3/la_stack_inf_norm" = "d3/la_stack_inf_norm" +"d3/la_stack_ldlt" = "d3/la_stack_ldlt" +"d3/la_stack_ldlt_solve" = "d3/la_stack_ldlt_solve" +"d3/la_stack_lu" = "d3/la_stack_lu" +"d3/la_stack_lu_solve" = "d3/la_stack_lu_solve" +"d3/la_stack_norm2_sq" = "d3/la_stack_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/la_stack_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/la_stack_solve_from_lu" +"d32/la_stack_det" = "d32/la_stack_det" +"d32/la_stack_det_from_ldlt" = "d32/la_stack_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/la_stack_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/la_stack_det_via_lu" +"d32/la_stack_dot" = "d32/la_stack_dot" +"d32/la_stack_inf_norm" = "d32/la_stack_inf_norm" +"d32/la_stack_ldlt" = "d32/la_stack_ldlt" +"d32/la_stack_ldlt_solve" = "d32/la_stack_ldlt_solve" +"d32/la_stack_lu" = "d32/la_stack_lu" +"d32/la_stack_lu_solve" = "d32/la_stack_lu_solve" +"d32/la_stack_norm2_sq" = "d32/la_stack_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/la_stack_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/la_stack_solve_from_lu" +"d4/la_stack_det" = "d4/la_stack_det" +"d4/la_stack_det_from_ldlt" = "d4/la_stack_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/la_stack_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/la_stack_det_via_lu" +"d4/la_stack_dot" = "d4/la_stack_dot" +"d4/la_stack_inf_norm" = "d4/la_stack_inf_norm" +"d4/la_stack_ldlt" = "d4/la_stack_ldlt" +"d4/la_stack_ldlt_solve" = "d4/la_stack_ldlt_solve" +"d4/la_stack_lu" = "d4/la_stack_lu" +"d4/la_stack_lu_solve" = "d4/la_stack_lu_solve" +"d4/la_stack_norm2_sq" = "d4/la_stack_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/la_stack_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/la_stack_solve_from_lu" +"d5/la_stack_det" = "d5/la_stack_det" +"d5/la_stack_det_from_ldlt" = "d5/la_stack_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/la_stack_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/la_stack_det_via_lu" +"d5/la_stack_dot" = "d5/la_stack_dot" +"d5/la_stack_inf_norm" = "d5/la_stack_inf_norm" +"d5/la_stack_ldlt" = "d5/la_stack_ldlt" +"d5/la_stack_ldlt_solve" = "d5/la_stack_ldlt_solve" +"d5/la_stack_lu" = "d5/la_stack_lu" +"d5/la_stack_lu_solve" = "d5/la_stack_lu_solve" +"d5/la_stack_norm2_sq" = "d5/la_stack_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/la_stack_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/la_stack_solve_from_lu" +"d64/la_stack_det" = "d64/la_stack_det" +"d64/la_stack_det_from_ldlt" = "d64/la_stack_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/la_stack_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/la_stack_det_via_lu" +"d64/la_stack_dot" = "d64/la_stack_dot" +"d64/la_stack_inf_norm" = "d64/la_stack_inf_norm" +"d64/la_stack_ldlt" = "d64/la_stack_ldlt" +"d64/la_stack_ldlt_solve" = "d64/la_stack_ldlt_solve" +"d64/la_stack_lu" = "d64/la_stack_lu" +"d64/la_stack_lu_solve" = "d64/la_stack_lu_solve" +"d64/la_stack_norm2_sq" = "d64/la_stack_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/la_stack_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/la_stack_solve_from_lu" +"d8/la_stack_det" = "d8/la_stack_det" +"d8/la_stack_det_from_ldlt" = "d8/la_stack_det_from_ldlt" +"d8/la_stack_det_from_ldlt_balanced_range" = "d8/la_stack_det_from_ldlt_balanced_range" +"d8/la_stack_det_from_lu" = "d8/la_stack_det_from_lu" +"d8/la_stack_det_from_lu_balanced_range" = "d8/la_stack_det_from_lu_balanced_range" +"d8/la_stack_det_via_lu" = "d8/la_stack_det_via_lu" +"d8/la_stack_dot" = "d8/la_stack_dot" +"d8/la_stack_inf_norm" = "d8/la_stack_inf_norm" +"d8/la_stack_ldlt" = "d8/la_stack_ldlt" +"d8/la_stack_ldlt_ill_conditioned" = "d8/la_stack_ldlt_ill_conditioned" +"d8/la_stack_ldlt_solve" = "d8/la_stack_ldlt_solve" +"d8/la_stack_lu" = "d8/la_stack_lu" +"d8/la_stack_lu_ill_conditioned" = "d8/la_stack_lu_ill_conditioned" +"d8/la_stack_lu_pivoting" = "d8/la_stack_lu_pivoting" +"d8/la_stack_lu_solve" = "d8/la_stack_lu_solve" +"d8/la_stack_norm2_sq" = "d8/la_stack_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/la_stack_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/la_stack_solve_from_lu" + +[[series]] +name = "nalgebra" +phase = "baseline" +[series.rows] +"d16/la_stack_det_from_ldlt" = "d16/nalgebra_det_from_cholesky" +"d16/la_stack_det_from_lu" = "d16/nalgebra_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/nalgebra_det_via_lu" +"d16/la_stack_dot" = "d16/nalgebra_dot" +"d16/la_stack_inf_norm" = "d16/nalgebra_inf_norm" +"d16/la_stack_ldlt" = "d16/nalgebra_cholesky" +"d16/la_stack_ldlt_solve" = "d16/nalgebra_cholesky_solve" +"d16/la_stack_lu" = "d16/nalgebra_lu" +"d16/la_stack_lu_solve" = "d16/nalgebra_lu_solve" +"d16/la_stack_norm2_sq" = "d16/nalgebra_norm_squared" +"d16/la_stack_solve_from_ldlt" = "d16/nalgebra_solve_from_cholesky" +"d16/la_stack_solve_from_lu" = "d16/nalgebra_solve_from_lu" +"d2/la_stack_det_from_ldlt" = "d2/nalgebra_det_from_cholesky" +"d2/la_stack_det_from_lu" = "d2/nalgebra_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/nalgebra_det_via_lu" +"d2/la_stack_dot" = "d2/nalgebra_dot" +"d2/la_stack_inf_norm" = "d2/nalgebra_inf_norm" +"d2/la_stack_ldlt" = "d2/nalgebra_cholesky" +"d2/la_stack_ldlt_solve" = "d2/nalgebra_cholesky_solve" +"d2/la_stack_lu" = "d2/nalgebra_lu" +"d2/la_stack_lu_solve" = "d2/nalgebra_lu_solve" +"d2/la_stack_norm2_sq" = "d2/nalgebra_norm_squared" +"d2/la_stack_solve_from_ldlt" = "d2/nalgebra_solve_from_cholesky" +"d2/la_stack_solve_from_lu" = "d2/nalgebra_solve_from_lu" +"d3/la_stack_det_from_ldlt" = "d3/nalgebra_det_from_cholesky" +"d3/la_stack_det_from_lu" = "d3/nalgebra_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/nalgebra_det_via_lu" +"d3/la_stack_dot" = "d3/nalgebra_dot" +"d3/la_stack_inf_norm" = "d3/nalgebra_inf_norm" +"d3/la_stack_ldlt" = "d3/nalgebra_cholesky" +"d3/la_stack_ldlt_solve" = "d3/nalgebra_cholesky_solve" +"d3/la_stack_lu" = "d3/nalgebra_lu" +"d3/la_stack_lu_solve" = "d3/nalgebra_lu_solve" +"d3/la_stack_norm2_sq" = "d3/nalgebra_norm_squared" +"d3/la_stack_solve_from_ldlt" = "d3/nalgebra_solve_from_cholesky" +"d3/la_stack_solve_from_lu" = "d3/nalgebra_solve_from_lu" +"d32/la_stack_det_from_ldlt" = "d32/nalgebra_det_from_cholesky" +"d32/la_stack_det_from_lu" = "d32/nalgebra_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/nalgebra_det_via_lu" +"d32/la_stack_dot" = "d32/nalgebra_dot" +"d32/la_stack_inf_norm" = "d32/nalgebra_inf_norm" +"d32/la_stack_ldlt" = "d32/nalgebra_cholesky" +"d32/la_stack_ldlt_solve" = "d32/nalgebra_cholesky_solve" +"d32/la_stack_lu" = "d32/nalgebra_lu" +"d32/la_stack_lu_solve" = "d32/nalgebra_lu_solve" +"d32/la_stack_norm2_sq" = "d32/nalgebra_norm_squared" +"d32/la_stack_solve_from_ldlt" = "d32/nalgebra_solve_from_cholesky" +"d32/la_stack_solve_from_lu" = "d32/nalgebra_solve_from_lu" +"d4/la_stack_det_from_ldlt" = "d4/nalgebra_det_from_cholesky" +"d4/la_stack_det_from_lu" = "d4/nalgebra_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/nalgebra_det_via_lu" +"d4/la_stack_dot" = "d4/nalgebra_dot" +"d4/la_stack_inf_norm" = "d4/nalgebra_inf_norm" +"d4/la_stack_ldlt" = "d4/nalgebra_cholesky" +"d4/la_stack_ldlt_solve" = "d4/nalgebra_cholesky_solve" +"d4/la_stack_lu" = "d4/nalgebra_lu" +"d4/la_stack_lu_solve" = "d4/nalgebra_lu_solve" +"d4/la_stack_norm2_sq" = "d4/nalgebra_norm_squared" +"d4/la_stack_solve_from_ldlt" = "d4/nalgebra_solve_from_cholesky" +"d4/la_stack_solve_from_lu" = "d4/nalgebra_solve_from_lu" +"d5/la_stack_det_from_ldlt" = "d5/nalgebra_det_from_cholesky" +"d5/la_stack_det_from_lu" = "d5/nalgebra_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/nalgebra_det_via_lu" +"d5/la_stack_dot" = "d5/nalgebra_dot" +"d5/la_stack_inf_norm" = "d5/nalgebra_inf_norm" +"d5/la_stack_ldlt" = "d5/nalgebra_cholesky" +"d5/la_stack_ldlt_solve" = "d5/nalgebra_cholesky_solve" +"d5/la_stack_lu" = "d5/nalgebra_lu" +"d5/la_stack_lu_solve" = "d5/nalgebra_lu_solve" +"d5/la_stack_norm2_sq" = "d5/nalgebra_norm_squared" +"d5/la_stack_solve_from_ldlt" = "d5/nalgebra_solve_from_cholesky" +"d5/la_stack_solve_from_lu" = "d5/nalgebra_solve_from_lu" +"d64/la_stack_det_from_ldlt" = "d64/nalgebra_det_from_cholesky" +"d64/la_stack_det_from_lu" = "d64/nalgebra_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/nalgebra_det_via_lu" +"d64/la_stack_dot" = "d64/nalgebra_dot" +"d64/la_stack_inf_norm" = "d64/nalgebra_inf_norm" +"d64/la_stack_ldlt" = "d64/nalgebra_cholesky" +"d64/la_stack_ldlt_solve" = "d64/nalgebra_cholesky_solve" +"d64/la_stack_lu" = "d64/nalgebra_lu" +"d64/la_stack_lu_solve" = "d64/nalgebra_lu_solve" +"d64/la_stack_norm2_sq" = "d64/nalgebra_norm_squared" +"d64/la_stack_solve_from_ldlt" = "d64/nalgebra_solve_from_cholesky" +"d64/la_stack_solve_from_lu" = "d64/nalgebra_solve_from_lu" +"d8/la_stack_det_from_ldlt" = "d8/nalgebra_det_from_cholesky" +"d8/la_stack_det_from_lu" = "d8/nalgebra_det_from_lu" +"d8/la_stack_det_via_lu" = "d8/nalgebra_det_via_lu" +"d8/la_stack_dot" = "d8/nalgebra_dot" +"d8/la_stack_inf_norm" = "d8/nalgebra_inf_norm" +"d8/la_stack_ldlt" = "d8/nalgebra_cholesky" +"d8/la_stack_ldlt_solve" = "d8/nalgebra_cholesky_solve" +"d8/la_stack_lu" = "d8/nalgebra_lu" +"d8/la_stack_lu_solve" = "d8/nalgebra_lu_solve" +"d8/la_stack_norm2_sq" = "d8/nalgebra_norm_squared" +"d8/la_stack_solve_from_ldlt" = "d8/nalgebra_solve_from_cholesky" +"d8/la_stack_solve_from_lu" = "d8/nalgebra_solve_from_lu" + +[[series]] +name = "faer" +phase = "baseline" +[series.rows] +"d16/la_stack_det_from_ldlt" = "d16/faer_det_from_ldlt" +"d16/la_stack_det_from_lu" = "d16/faer_det_from_lu" +"d16/la_stack_det_via_lu" = "d16/faer_det_via_lu" +"d16/la_stack_dot" = "d16/faer_dot_native" +"d16/la_stack_inf_norm" = "d16/faer_inf_norm" +"d16/la_stack_ldlt" = "d16/faer_ldlt" +"d16/la_stack_ldlt_solve" = "d16/faer_ldlt_solve" +"d16/la_stack_lu" = "d16/faer_lu" +"d16/la_stack_lu_solve" = "d16/faer_lu_solve" +"d16/la_stack_norm2_sq" = "d16/faer_norm2_sq" +"d16/la_stack_solve_from_ldlt" = "d16/faer_solve_from_ldlt" +"d16/la_stack_solve_from_lu" = "d16/faer_solve_from_lu" +"d2/la_stack_det_from_ldlt" = "d2/faer_det_from_ldlt" +"d2/la_stack_det_from_lu" = "d2/faer_det_from_lu" +"d2/la_stack_det_via_lu" = "d2/faer_det_via_lu" +"d2/la_stack_dot" = "d2/faer_dot_native" +"d2/la_stack_inf_norm" = "d2/faer_inf_norm" +"d2/la_stack_ldlt" = "d2/faer_ldlt" +"d2/la_stack_ldlt_solve" = "d2/faer_ldlt_solve" +"d2/la_stack_lu" = "d2/faer_lu" +"d2/la_stack_lu_solve" = "d2/faer_lu_solve" +"d2/la_stack_norm2_sq" = "d2/faer_norm2_sq" +"d2/la_stack_solve_from_ldlt" = "d2/faer_solve_from_ldlt" +"d2/la_stack_solve_from_lu" = "d2/faer_solve_from_lu" +"d3/la_stack_det_from_ldlt" = "d3/faer_det_from_ldlt" +"d3/la_stack_det_from_lu" = "d3/faer_det_from_lu" +"d3/la_stack_det_via_lu" = "d3/faer_det_via_lu" +"d3/la_stack_dot" = "d3/faer_dot_native" +"d3/la_stack_inf_norm" = "d3/faer_inf_norm" +"d3/la_stack_ldlt" = "d3/faer_ldlt" +"d3/la_stack_ldlt_solve" = "d3/faer_ldlt_solve" +"d3/la_stack_lu" = "d3/faer_lu" +"d3/la_stack_lu_solve" = "d3/faer_lu_solve" +"d3/la_stack_norm2_sq" = "d3/faer_norm2_sq" +"d3/la_stack_solve_from_ldlt" = "d3/faer_solve_from_ldlt" +"d3/la_stack_solve_from_lu" = "d3/faer_solve_from_lu" +"d32/la_stack_det_from_ldlt" = "d32/faer_det_from_ldlt" +"d32/la_stack_det_from_lu" = "d32/faer_det_from_lu" +"d32/la_stack_det_via_lu" = "d32/faer_det_via_lu" +"d32/la_stack_dot" = "d32/faer_dot_native" +"d32/la_stack_inf_norm" = "d32/faer_inf_norm" +"d32/la_stack_ldlt" = "d32/faer_ldlt" +"d32/la_stack_ldlt_solve" = "d32/faer_ldlt_solve" +"d32/la_stack_lu" = "d32/faer_lu" +"d32/la_stack_lu_solve" = "d32/faer_lu_solve" +"d32/la_stack_norm2_sq" = "d32/faer_norm2_sq" +"d32/la_stack_solve_from_ldlt" = "d32/faer_solve_from_ldlt" +"d32/la_stack_solve_from_lu" = "d32/faer_solve_from_lu" +"d4/la_stack_det_from_ldlt" = "d4/faer_det_from_ldlt" +"d4/la_stack_det_from_lu" = "d4/faer_det_from_lu" +"d4/la_stack_det_via_lu" = "d4/faer_det_via_lu" +"d4/la_stack_dot" = "d4/faer_dot_native" +"d4/la_stack_inf_norm" = "d4/faer_inf_norm" +"d4/la_stack_ldlt" = "d4/faer_ldlt" +"d4/la_stack_ldlt_solve" = "d4/faer_ldlt_solve" +"d4/la_stack_lu" = "d4/faer_lu" +"d4/la_stack_lu_solve" = "d4/faer_lu_solve" +"d4/la_stack_norm2_sq" = "d4/faer_norm2_sq" +"d4/la_stack_solve_from_ldlt" = "d4/faer_solve_from_ldlt" +"d4/la_stack_solve_from_lu" = "d4/faer_solve_from_lu" +"d5/la_stack_det_from_ldlt" = "d5/faer_det_from_ldlt" +"d5/la_stack_det_from_lu" = "d5/faer_det_from_lu" +"d5/la_stack_det_via_lu" = "d5/faer_det_via_lu" +"d5/la_stack_dot" = "d5/faer_dot_native" +"d5/la_stack_inf_norm" = "d5/faer_inf_norm" +"d5/la_stack_ldlt" = "d5/faer_ldlt" +"d5/la_stack_ldlt_solve" = "d5/faer_ldlt_solve" +"d5/la_stack_lu" = "d5/faer_lu" +"d5/la_stack_lu_solve" = "d5/faer_lu_solve" +"d5/la_stack_norm2_sq" = "d5/faer_norm2_sq" +"d5/la_stack_solve_from_ldlt" = "d5/faer_solve_from_ldlt" +"d5/la_stack_solve_from_lu" = "d5/faer_solve_from_lu" +"d64/la_stack_det_from_ldlt" = "d64/faer_det_from_ldlt" +"d64/la_stack_det_from_lu" = "d64/faer_det_from_lu" +"d64/la_stack_det_via_lu" = "d64/faer_det_via_lu" +"d64/la_stack_dot" = "d64/faer_dot_native" +"d64/la_stack_inf_norm" = "d64/faer_inf_norm" +"d64/la_stack_ldlt" = "d64/faer_ldlt" +"d64/la_stack_ldlt_solve" = "d64/faer_ldlt_solve" +"d64/la_stack_lu" = "d64/faer_lu" +"d64/la_stack_lu_solve" = "d64/faer_lu_solve" +"d64/la_stack_norm2_sq" = "d64/faer_norm2_sq" +"d64/la_stack_solve_from_ldlt" = "d64/faer_solve_from_ldlt" +"d64/la_stack_solve_from_lu" = "d64/faer_solve_from_lu" +"d8/la_stack_det_from_ldlt" = "d8/faer_det_from_ldlt" +"d8/la_stack_det_from_lu" = "d8/faer_det_from_lu" +"d8/la_stack_det_via_lu" = "d8/faer_det_via_lu" +"d8/la_stack_dot" = "d8/faer_dot_native" +"d8/la_stack_inf_norm" = "d8/faer_inf_norm" +"d8/la_stack_ldlt" = "d8/faer_ldlt" +"d8/la_stack_ldlt_solve" = "d8/faer_ldlt_solve" +"d8/la_stack_lu" = "d8/faer_lu" +"d8/la_stack_lu_solve" = "d8/faer_lu_solve" +"d8/la_stack_norm2_sq" = "d8/faer_norm2_sq" +"d8/la_stack_solve_from_ldlt" = "d8/faer_solve_from_ldlt" +"d8/la_stack_solve_from_lu" = "d8/faer_solve_from_lu" diff --git a/tooling/performance-plot.toml b/tooling/performance-plot.toml deleted file mode 100644 index 1c87651..0000000 --- a/tooling/performance-plot.toml +++ /dev/null @@ -1,13 +0,0 @@ -schema = 1 -dimensions = [ 2, 3, 4, 5, 8, 16, 32, 64 ] -unit = "ns" -series = [ - { name = "la-stack current", label = "la-stack" }, - { name = "nalgebra", label = "nalgebra" }, - { name = "faer", label = "faer" }, -] - -[plot] -x-label = "Dimension D" -y-label = "Time" -x-scale = "linear" diff --git a/tooling/performance-readme.toml b/tooling/performance-readme.toml new file mode 100644 index 0000000..9e9d864 --- /dev/null +++ b/tooling/performance-readme.toml @@ -0,0 +1,66 @@ +# Canonical README view; plot-only alternatives live under tooling/plots/. +schema = 2 +document = "README.md" +begin = "" +end = "" +formatter = "pyproject.toml" +repository = "acgetchell/la-stack" +tag-policy = "prepare" +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_median_log.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] + +[table] +row-heading = "Dimension" +intervals = "below" +timing-legend = true +comparison-columns = [ "ratio" ] +ratio-headings = [ "Speedup vs nalgebra", "Speedup vs faer" ] +ratio-suffix = "×" + +[[references]] +path = "Cargo.toml" +pattern = '^version\s*=\s*"(?P[^"]+)"\r?$' +source = "version" + +[[references]] +path = "docs/performance.md" +pattern = '^- la-stack baseline: measured in \*\*baseline\*\* phase \((?Pv[0-9]+\.[0-9]+\.[0-9]+)\),' +source = "previous-tag" + +[[references]] +path = "docs/performance.md" +pattern = '^- la-stack current: measured in \*\*current\*\* phase \((?Pv[0-9]+\.[0-9]+\.[0-9]+)\),' +source = "tag" diff --git a/tooling/performance-report.toml b/tooling/performance-report.toml index 9a41123..dbe2547 100644 --- a/tooling/performance-report.toml +++ b/tooling/performance-report.toml @@ -1,4 +1,6 @@ schema = 2 +measurement = "tooling/measurements/full.toml" +release = true current = "docs/performance.md" # Keep current/archive exclusions in both Markdown recipes aligned. archive = "docs/performance-runs" diff --git a/tooling/performance.just b/tooling/performance.just index 6b58ba5..9dc35db 100644 --- a/tooling/performance.just +++ b/tooling/performance.just @@ -5,20 +5,23 @@ # Resolve the shared output tree before those working directories change. export CRITERION_HOME := absolute_path(env("CRITERION_HOME", "target/criterion")) +# Compare native targets on the measured host regardless of a caller's target override. +host_target := `rustc --print host-tuple` + baseline-all mode="measure": (baseline-vs_linalg mode) (baseline-exact mode) baseline-exact mode="measure": - cargo bench --locked --features bench,exact --bench exact -- --noplot {{ if mode == "list" { "--list" } else { "" } }} + cargo bench --locked --target {{ host_target }} --features bench,exact --bench exact -- --noplot {{ if mode == "list" { "--list" } else { "" } }} baseline-vs_linalg mode="measure": - cargo bench --locked -p la-stack-comparison --features bench --bench vs_linalg -- --noplot {{ if mode == "list" { "--list" } else { "" } }} + cargo bench --locked --target {{ host_target }} -p la-stack-comparison --features bench --bench vs_linalg -- --noplot {{ if mode == "list" { "--list" } else { "" } }} current-all mode="measure": (current-vs_linalg mode) (current-exact mode) current-exact mode="measure": (baseline-exact mode) current-vs_linalg mode="measure": - cargo bench --locked -p la-stack-comparison --features bench --bench vs_linalg -- la_stack --noplot {{ if mode == "list" { "--list" } else { "" } }} + cargo bench --locked --target {{ host_target }} -p la-stack-comparison --features bench --bench vs_linalg -- la_stack --noplot {{ if mode == "list" { "--list" } else { "" } }} gate: - cargo test --locked --workspace --features bench,exact --test vs_linalg_inputs --test exact_bench_config + cargo test --locked --target {{ host_target }} --workspace --features bench,exact --test vs_linalg_inputs --test exact_bench_config diff --git a/tooling/performance.toml b/tooling/performance.toml deleted file mode 100644 index b8573b2..0000000 --- a/tooling/performance.toml +++ /dev/null @@ -1,44 +0,0 @@ -# Shared measurement inputs; scientific rows are declared in performance-policy.toml. -schema = 1 -command = [ "just", "--justfile", "tooling/performance.just", "--working-directory", ".", "current-all" ] -sources = [ "src/**/*.rs", "Cargo.toml" ] -harness = [ - "benches/**/*.rs", - "benches/comparison/Cargo.toml", - "examples/**/*.rs", - "Cargo.toml", - "Cargo.lock", - "rust-toolchain.toml", - "tests/exact_bench_config.rs", - "tooling/performance.toml", - "tooling/performance-policy.toml", - "tooling/performance.just", - "tooling/criterion-inventory.toml", -] -# Each timing command can combine the full 150-minute and 90-minute suites. -timeout = 14400 -compatible = [ - "harness_sha256", - "context.os", - "context.architecture", - "context.cpu", - "context.tool.rustc", - "context.tool.cargo", - "context.tool.just", - "context.dependency.criterion", - "context.dependency.nalgebra", - "context.dependency.faer", -] - -[probes] -rustc = [ "rustc", "-vV" ] -cargo = [ "cargo", "--version" ] -just = [ "just", "--version" ] - -[dependencies] -criterion = "Cargo.lock" -nalgebra = "Cargo.lock" -faer = "Cargo.lock" - -[context] -phase-driver = "just-v1" diff --git a/tooling/plots/non-exact/det_from_lu-mean-linear.toml b/tooling/plots/non-exact/det_from_lu-mean-linear.toml new file mode 100644 index 0000000..04478d1 --- /dev/null +++ b/tooling/plots/non-exact/det_from_lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_mean_linear.svg" +title = "Determinant from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_from_lu-mean-log.toml b/tooling/plots/non-exact/det_from_lu-mean-log.toml new file mode 100644 index 0000000..fec2868 --- /dev/null +++ b/tooling/plots/non-exact/det_from_lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_mean_log.svg" +title = "Determinant from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_from_lu-median-linear.toml b/tooling/plots/non-exact/det_from_lu-median-linear.toml new file mode 100644 index 0000000..521f9d0 --- /dev/null +++ b/tooling/plots/non-exact/det_from_lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_median_linear.svg" +title = "Determinant from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_from_lu-median-log.toml b/tooling/plots/non-exact/det_from_lu-median-log.toml new file mode 100644 index 0000000..69e5d43 --- /dev/null +++ b/tooling/plots/non-exact/det_from_lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_from_lu_median_log.svg" +title = "Determinant from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_via_lu-mean-linear.toml b/tooling/plots/non-exact/det_via_lu-mean-linear.toml new file mode 100644 index 0000000..8cfd88e --- /dev/null +++ b/tooling/plots/non-exact/det_via_lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_mean_linear.svg" +title = "Determinant via LU (factor + det): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_via_lu-mean-log.toml b/tooling/plots/non-exact/det_via_lu-mean-log.toml new file mode 100644 index 0000000..6779609 --- /dev/null +++ b/tooling/plots/non-exact/det_via_lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_mean_log.svg" +title = "Determinant via LU (factor + det): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_via_lu-median-linear.toml b/tooling/plots/non-exact/det_via_lu-median-linear.toml new file mode 100644 index 0000000..fdac127 --- /dev/null +++ b/tooling/plots/non-exact/det_via_lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_median_linear.svg" +title = "Determinant via LU (factor + det): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/det_via_lu-median-log.toml b/tooling/plots/non-exact/det_via_lu-median-log.toml new file mode 100644 index 0000000..de251ce --- /dev/null +++ b/tooling/plots/non-exact/det_via_lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_det_via_lu_median_log.svg" +title = "Determinant via LU (factor + det): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/dot-mean-linear.toml b/tooling/plots/non-exact/dot-mean-linear.toml new file mode 100644 index 0000000..0841dba --- /dev/null +++ b/tooling/plots/non-exact/dot-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_dot_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_dot_mean_linear.svg" +title = "Vector dot product: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/dot-mean-log.toml b/tooling/plots/non-exact/dot-mean-log.toml new file mode 100644 index 0000000..daa2cc5 --- /dev/null +++ b/tooling/plots/non-exact/dot-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_dot_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_dot_mean_log.svg" +title = "Vector dot product: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/dot-median-linear.toml b/tooling/plots/non-exact/dot-median-linear.toml new file mode 100644 index 0000000..dbfb9dd --- /dev/null +++ b/tooling/plots/non-exact/dot-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_dot_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_dot_median_linear.svg" +title = "Vector dot product: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/dot-median-log.toml b/tooling/plots/non-exact/dot-median-log.toml new file mode 100644 index 0000000..7d3619e --- /dev/null +++ b/tooling/plots/non-exact/dot-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_dot_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_dot_median_log.svg" +title = "Vector dot product: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/inf_norm-mean-linear.toml b/tooling/plots/non-exact/inf_norm-mean-linear.toml new file mode 100644 index 0000000..e4aed4c --- /dev/null +++ b/tooling/plots/non-exact/inf_norm-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_inf_norm_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_inf_norm_mean_linear.svg" +title = "Matrix infinity norm (max abs row sum): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/inf_norm-mean-log.toml b/tooling/plots/non-exact/inf_norm-mean-log.toml new file mode 100644 index 0000000..c9b4933 --- /dev/null +++ b/tooling/plots/non-exact/inf_norm-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_inf_norm_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_inf_norm_mean_log.svg" +title = "Matrix infinity norm (max abs row sum): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/inf_norm-median-linear.toml b/tooling/plots/non-exact/inf_norm-median-linear.toml new file mode 100644 index 0000000..ebac53e --- /dev/null +++ b/tooling/plots/non-exact/inf_norm-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_inf_norm_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_inf_norm_median_linear.svg" +title = "Matrix infinity norm (max abs row sum): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/inf_norm-median-log.toml b/tooling/plots/non-exact/inf_norm-median-log.toml new file mode 100644 index 0000000..e5b4dec --- /dev/null +++ b/tooling/plots/non-exact/inf_norm-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_inf_norm_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_inf_norm_median_log.svg" +title = "Matrix infinity norm (max abs row sum): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu-mean-linear.toml b/tooling/plots/non-exact/lu-mean-linear.toml new file mode 100644 index 0000000..9e431c8 --- /dev/null +++ b/tooling/plots/non-exact/lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_mean_linear.svg" +title = "LU factorization: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu-mean-log.toml b/tooling/plots/non-exact/lu-mean-log.toml new file mode 100644 index 0000000..cbc18c8 --- /dev/null +++ b/tooling/plots/non-exact/lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_mean_log.svg" +title = "LU factorization: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu-median-linear.toml b/tooling/plots/non-exact/lu-median-linear.toml new file mode 100644 index 0000000..c72141b --- /dev/null +++ b/tooling/plots/non-exact/lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_median_linear.svg" +title = "LU factorization: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu-median-log.toml b/tooling/plots/non-exact/lu-median-log.toml new file mode 100644 index 0000000..ca7e218 --- /dev/null +++ b/tooling/plots/non-exact/lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_median_log.svg" +title = "LU factorization: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu_solve-mean-linear.toml b/tooling/plots/non-exact/lu_solve-mean-linear.toml new file mode 100644 index 0000000..ee1e881 --- /dev/null +++ b/tooling/plots/non-exact/lu_solve-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_solve_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_solve_mean_linear.svg" +title = "LU solve (factor + solve): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu_solve-mean-log.toml b/tooling/plots/non-exact/lu_solve-mean-log.toml new file mode 100644 index 0000000..454c8cb --- /dev/null +++ b/tooling/plots/non-exact/lu_solve-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_solve_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_solve_mean_log.svg" +title = "LU solve (factor + solve): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu_solve-median-linear.toml b/tooling/plots/non-exact/lu_solve-median-linear.toml new file mode 100644 index 0000000..d7cead3 --- /dev/null +++ b/tooling/plots/non-exact/lu_solve-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_solve_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_solve_median_linear.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/lu_solve-median-log.toml b/tooling/plots/non-exact/lu_solve-median-log.toml new file mode 100644 index 0000000..a69a9a6 --- /dev/null +++ b/tooling/plots/non-exact/lu_solve-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_lu_solve_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_lu_solve_median_log.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/norm2_sq-mean-linear.toml b/tooling/plots/non-exact/norm2_sq-mean-linear.toml new file mode 100644 index 0000000..56c1611 --- /dev/null +++ b/tooling/plots/non-exact/norm2_sq-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_mean_linear.svg" +title = "Vector squared 2-norm: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/norm2_sq-mean-log.toml b/tooling/plots/non-exact/norm2_sq-mean-log.toml new file mode 100644 index 0000000..9cd03ab --- /dev/null +++ b/tooling/plots/non-exact/norm2_sq-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_mean_log.svg" +title = "Vector squared 2-norm: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/norm2_sq-median-linear.toml b/tooling/plots/non-exact/norm2_sq-median-linear.toml new file mode 100644 index 0000000..ef6a31e --- /dev/null +++ b/tooling/plots/non-exact/norm2_sq-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_median_linear.svg" +title = "Vector squared 2-norm: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/norm2_sq-median-log.toml b/tooling/plots/non-exact/norm2_sq-median-log.toml new file mode 100644 index 0000000..5ed7fda --- /dev/null +++ b/tooling/plots/non-exact/norm2_sq-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_norm2_sq_median_log.svg" +title = "Vector squared 2-norm: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/solve_from_lu-mean-linear.toml b/tooling/plots/non-exact/solve_from_lu-mean-linear.toml new file mode 100644 index 0000000..798dd88 --- /dev/null +++ b/tooling/plots/non-exact/solve_from_lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_mean_linear.svg" +title = "Solve from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/solve_from_lu-mean-log.toml b/tooling/plots/non-exact/solve_from_lu-mean-log.toml new file mode 100644 index 0000000..6cfeff1 --- /dev/null +++ b/tooling/plots/non-exact/solve_from_lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_mean_log.svg" +title = "Solve from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/solve_from_lu-median-linear.toml b/tooling/plots/non-exact/solve_from_lu-median-linear.toml new file mode 100644 index 0000000..b7c163a --- /dev/null +++ b/tooling/plots/non-exact/solve_from_lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_median_linear.svg" +title = "Solve from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/non-exact/solve_from_lu-median-log.toml b/tooling/plots/non-exact/solve_from_lu-median-log.toml new file mode 100644 index 0000000..ef8a797 --- /dev/null +++ b/tooling/plots/non-exact/solve_from_lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/non-exact.toml" +payload = "target/bench-reports/non-exact/run.json" +manifest = "target/bench-reports/non-exact/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_non_exact_solve_from_lu_median_log.svg" +title = "Solve from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_from_lu-mean-linear.toml b/tooling/plots/retained/det_from_lu-mean-linear.toml new file mode 100644 index 0000000..03d132d --- /dev/null +++ b/tooling/plots/retained/det_from_lu-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_mean_linear.svg" +title = "Determinant from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_from_lu-mean-log.toml b/tooling/plots/retained/det_from_lu-mean-log.toml new file mode 100644 index 0000000..64e0ae8 --- /dev/null +++ b/tooling/plots/retained/det_from_lu-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_mean_log.svg" +title = "Determinant from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_from_lu-median-linear.toml b/tooling/plots/retained/det_from_lu-median-linear.toml new file mode 100644 index 0000000..d8f72c3 --- /dev/null +++ b/tooling/plots/retained/det_from_lu-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_median_linear.svg" +title = "Determinant from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_from_lu-median-log.toml b/tooling/plots/retained/det_from_lu-median-log.toml new file mode 100644 index 0000000..d39bdd5 --- /dev/null +++ b/tooling/plots/retained/det_from_lu-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_median_log.svg" +title = "Determinant from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_via_lu-mean-linear.toml b/tooling/plots/retained/det_via_lu-mean-linear.toml new file mode 100644 index 0000000..8665e80 --- /dev/null +++ b/tooling/plots/retained/det_via_lu-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_mean_linear.svg" +title = "Determinant via LU (factor + det): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_via_lu-mean-log.toml b/tooling/plots/retained/det_via_lu-mean-log.toml new file mode 100644 index 0000000..09d260e --- /dev/null +++ b/tooling/plots/retained/det_via_lu-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_mean_log.svg" +title = "Determinant via LU (factor + det): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_via_lu-median-linear.toml b/tooling/plots/retained/det_via_lu-median-linear.toml new file mode 100644 index 0000000..5defb8d --- /dev/null +++ b/tooling/plots/retained/det_via_lu-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_median_linear.svg" +title = "Determinant via LU (factor + det): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/det_via_lu-median-log.toml b/tooling/plots/retained/det_via_lu-median-log.toml new file mode 100644 index 0000000..0895fb0 --- /dev/null +++ b/tooling/plots/retained/det_via_lu-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_median_log.svg" +title = "Determinant via LU (factor + det): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/dot-mean-linear.toml b/tooling/plots/retained/dot-mean-linear.toml new file mode 100644 index 0000000..d692547 --- /dev/null +++ b/tooling/plots/retained/dot-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_mean_linear.svg" +title = "Vector dot product: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/dot-mean-log.toml b/tooling/plots/retained/dot-mean-log.toml new file mode 100644 index 0000000..e09928e --- /dev/null +++ b/tooling/plots/retained/dot-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_mean_log.svg" +title = "Vector dot product: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/dot-median-linear.toml b/tooling/plots/retained/dot-median-linear.toml new file mode 100644 index 0000000..3b14952 --- /dev/null +++ b/tooling/plots/retained/dot-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_median_linear.svg" +title = "Vector dot product: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/dot-median-log.toml b/tooling/plots/retained/dot-median-log.toml new file mode 100644 index 0000000..a33067c --- /dev/null +++ b/tooling/plots/retained/dot-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_median_log.svg" +title = "Vector dot product: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/inf_norm-mean-linear.toml b/tooling/plots/retained/inf_norm-mean-linear.toml new file mode 100644 index 0000000..e40ca91 --- /dev/null +++ b/tooling/plots/retained/inf_norm-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_mean_linear.svg" +title = "Matrix infinity norm (max abs row sum): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/inf_norm-mean-log.toml b/tooling/plots/retained/inf_norm-mean-log.toml new file mode 100644 index 0000000..574b0b4 --- /dev/null +++ b/tooling/plots/retained/inf_norm-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_mean_log.svg" +title = "Matrix infinity norm (max abs row sum): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/inf_norm-median-linear.toml b/tooling/plots/retained/inf_norm-median-linear.toml new file mode 100644 index 0000000..5156293 --- /dev/null +++ b/tooling/plots/retained/inf_norm-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_median_linear.svg" +title = "Matrix infinity norm (max abs row sum): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/inf_norm-median-log.toml b/tooling/plots/retained/inf_norm-median-log.toml new file mode 100644 index 0000000..ed3474f --- /dev/null +++ b/tooling/plots/retained/inf_norm-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_median_log.svg" +title = "Matrix infinity norm (max abs row sum): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu-mean-linear.toml b/tooling/plots/retained/lu-mean-linear.toml new file mode 100644 index 0000000..b583855 --- /dev/null +++ b/tooling/plots/retained/lu-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_mean_linear.svg" +title = "LU factorization: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu-mean-log.toml b/tooling/plots/retained/lu-mean-log.toml new file mode 100644 index 0000000..8b4bcd7 --- /dev/null +++ b/tooling/plots/retained/lu-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_mean_log.svg" +title = "LU factorization: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu-median-linear.toml b/tooling/plots/retained/lu-median-linear.toml new file mode 100644 index 0000000..5b5b502 --- /dev/null +++ b/tooling/plots/retained/lu-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_median_linear.svg" +title = "LU factorization: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu-median-log.toml b/tooling/plots/retained/lu-median-log.toml new file mode 100644 index 0000000..c1ffdc0 --- /dev/null +++ b/tooling/plots/retained/lu-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_median_log.svg" +title = "LU factorization: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu_solve-mean-linear.toml b/tooling/plots/retained/lu_solve-mean-linear.toml new file mode 100644 index 0000000..c5ab421 --- /dev/null +++ b/tooling/plots/retained/lu_solve-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_mean_linear.svg" +title = "LU solve (factor + solve): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu_solve-mean-log.toml b/tooling/plots/retained/lu_solve-mean-log.toml new file mode 100644 index 0000000..8bf8416 --- /dev/null +++ b/tooling/plots/retained/lu_solve-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_mean_log.svg" +title = "LU solve (factor + solve): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu_solve-median-linear.toml b/tooling/plots/retained/lu_solve-median-linear.toml new file mode 100644 index 0000000..d1a2aec --- /dev/null +++ b/tooling/plots/retained/lu_solve-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_median_linear.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/lu_solve-median-log.toml b/tooling/plots/retained/lu_solve-median-log.toml new file mode 100644 index 0000000..06a8ede --- /dev/null +++ b/tooling/plots/retained/lu_solve-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_median_log.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/norm2_sq-mean-linear.toml b/tooling/plots/retained/norm2_sq-mean-linear.toml new file mode 100644 index 0000000..3e2c497 --- /dev/null +++ b/tooling/plots/retained/norm2_sq-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_mean_linear.svg" +title = "Vector squared 2-norm: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/norm2_sq-mean-log.toml b/tooling/plots/retained/norm2_sq-mean-log.toml new file mode 100644 index 0000000..339d26a --- /dev/null +++ b/tooling/plots/retained/norm2_sq-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_mean_log.svg" +title = "Vector squared 2-norm: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/norm2_sq-median-linear.toml b/tooling/plots/retained/norm2_sq-median-linear.toml new file mode 100644 index 0000000..76b2815 --- /dev/null +++ b/tooling/plots/retained/norm2_sq-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_median_linear.svg" +title = "Vector squared 2-norm: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/norm2_sq-median-log.toml b/tooling/plots/retained/norm2_sq-median-log.toml new file mode 100644 index 0000000..efaeff7 --- /dev/null +++ b/tooling/plots/retained/norm2_sq-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_median_log.svg" +title = "Vector squared 2-norm: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/solve_from_lu-mean-linear.toml b/tooling/plots/retained/solve_from_lu-mean-linear.toml new file mode 100644 index 0000000..4f1598c --- /dev/null +++ b/tooling/plots/retained/solve_from_lu-mean-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_mean_linear.svg" +title = "Solve from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/solve_from_lu-mean-log.toml b/tooling/plots/retained/solve_from_lu-mean-log.toml new file mode 100644 index 0000000..74bcfb9 --- /dev/null +++ b/tooling/plots/retained/solve_from_lu-mean-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_mean_log.svg" +title = "Solve from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/solve_from_lu-median-linear.toml b/tooling/plots/retained/solve_from_lu-median-linear.toml new file mode 100644 index 0000000..c82ee2e --- /dev/null +++ b/tooling/plots/retained/solve_from_lu-median-linear.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_median_linear.svg" +title = "Solve from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/retained/solve_from_lu-median-log.toml b/tooling/plots/retained/solve_from_lu-median-log.toml new file mode 100644 index 0000000..8c6574d --- /dev/null +++ b/tooling/plots/retained/solve_from_lu-median-log.toml @@ -0,0 +1,37 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +archive = "docs/performance-runs" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_median_log.svg" +title = "Solve from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_from_lu-mean-linear.toml b/tooling/plots/scratch/det_from_lu-mean-linear.toml new file mode 100644 index 0000000..e34eeb9 --- /dev/null +++ b/tooling/plots/scratch/det_from_lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_mean_linear.svg" +title = "Determinant from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_from_lu-mean-log.toml b/tooling/plots/scratch/det_from_lu-mean-log.toml new file mode 100644 index 0000000..c54ab5f --- /dev/null +++ b/tooling/plots/scratch/det_from_lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_mean_log.svg" +title = "Determinant from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_from_lu-median-linear.toml b/tooling/plots/scratch/det_from_lu-median-linear.toml new file mode 100644 index 0000000..e2bb150 --- /dev/null +++ b/tooling/plots/scratch/det_from_lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_median_linear.svg" +title = "Determinant from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_from_lu-median-log.toml b/tooling/plots/scratch/det_from_lu-median-log.toml new file mode 100644 index 0000000..2a13623 --- /dev/null +++ b/tooling/plots/scratch/det_from_lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_from_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_from_lu", "3" = "d3/la_stack_det_from_lu", "4" = "d4/la_stack_det_from_lu", "5" = "d5/la_stack_det_from_lu", "8" = "d8/la_stack_det_from_lu", "16" = "d16/la_stack_det_from_lu", "32" = "d32/la_stack_det_from_lu", "64" = "d64/la_stack_det_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_from_lu", "3" = "d3/nalgebra_det_from_lu", "4" = "d4/nalgebra_det_from_lu", "5" = "d5/nalgebra_det_from_lu", "8" = "d8/nalgebra_det_from_lu", "16" = "d16/nalgebra_det_from_lu", "32" = "d32/nalgebra_det_from_lu", "64" = "d64/nalgebra_det_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_from_lu", "3" = "d3/faer_det_from_lu", "4" = "d4/faer_det_from_lu", "5" = "d5/faer_det_from_lu", "8" = "d8/faer_det_from_lu", "16" = "d16/faer_det_from_lu", "32" = "d32/faer_det_from_lu", "64" = "d64/faer_det_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_from_lu_median_log.svg" +title = "Determinant from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_via_lu-mean-linear.toml b/tooling/plots/scratch/det_via_lu-mean-linear.toml new file mode 100644 index 0000000..acef9c2 --- /dev/null +++ b/tooling/plots/scratch/det_via_lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_mean_linear.svg" +title = "Determinant via LU (factor + det): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_via_lu-mean-log.toml b/tooling/plots/scratch/det_via_lu-mean-log.toml new file mode 100644 index 0000000..826a7ce --- /dev/null +++ b/tooling/plots/scratch/det_via_lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_mean_log.svg" +title = "Determinant via LU (factor + det): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_via_lu-median-linear.toml b/tooling/plots/scratch/det_via_lu-median-linear.toml new file mode 100644 index 0000000..759623b --- /dev/null +++ b/tooling/plots/scratch/det_via_lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_median_linear.svg" +title = "Determinant via LU (factor + det): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/det_via_lu-median-log.toml b/tooling/plots/scratch/det_via_lu-median-log.toml new file mode 100644 index 0000000..df7e8fa --- /dev/null +++ b/tooling/plots/scratch/det_via_lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_det_via_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_det_via_lu", "3" = "d3/la_stack_det_via_lu", "4" = "d4/la_stack_det_via_lu", "5" = "d5/la_stack_det_via_lu", "8" = "d8/la_stack_det_via_lu", "16" = "d16/la_stack_det_via_lu", "32" = "d32/la_stack_det_via_lu", "64" = "d64/la_stack_det_via_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_det_via_lu", "3" = "d3/nalgebra_det_via_lu", "4" = "d4/nalgebra_det_via_lu", "5" = "d5/nalgebra_det_via_lu", "8" = "d8/nalgebra_det_via_lu", "16" = "d16/nalgebra_det_via_lu", "32" = "d32/nalgebra_det_via_lu", "64" = "d64/nalgebra_det_via_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_det_via_lu", "3" = "d3/faer_det_via_lu", "4" = "d4/faer_det_via_lu", "5" = "d5/faer_det_via_lu", "8" = "d8/faer_det_via_lu", "16" = "d16/faer_det_via_lu", "32" = "d32/faer_det_via_lu", "64" = "d64/faer_det_via_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_det_via_lu_median_log.svg" +title = "Determinant via LU (factor + det): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/dot-mean-linear.toml b/tooling/plots/scratch/dot-mean-linear.toml new file mode 100644 index 0000000..62171ab --- /dev/null +++ b/tooling/plots/scratch/dot-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_mean_linear.svg" +title = "Vector dot product: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/dot-mean-log.toml b/tooling/plots/scratch/dot-mean-log.toml new file mode 100644 index 0000000..7bda27f --- /dev/null +++ b/tooling/plots/scratch/dot-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_mean_log.svg" +title = "Vector dot product: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/dot-median-linear.toml b/tooling/plots/scratch/dot-median-linear.toml new file mode 100644 index 0000000..bd64825 --- /dev/null +++ b/tooling/plots/scratch/dot-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_median_linear.svg" +title = "Vector dot product: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/dot-median-log.toml b/tooling/plots/scratch/dot-median-log.toml new file mode 100644 index 0000000..4f0b7d6 --- /dev/null +++ b/tooling/plots/scratch/dot-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_dot_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_dot", "3" = "d3/la_stack_dot", "4" = "d4/la_stack_dot", "5" = "d5/la_stack_dot", "8" = "d8/la_stack_dot", "16" = "d16/la_stack_dot", "32" = "d32/la_stack_dot", "64" = "d64/la_stack_dot" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_dot", "3" = "d3/nalgebra_dot", "4" = "d4/nalgebra_dot", "5" = "d5/nalgebra_dot", "8" = "d8/nalgebra_dot", "16" = "d16/nalgebra_dot", "32" = "d32/nalgebra_dot", "64" = "d64/nalgebra_dot" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_dot_native", "3" = "d3/faer_dot_native", "4" = "d4/faer_dot_native", "5" = "d5/faer_dot_native", "8" = "d8/faer_dot_native", "16" = "d16/faer_dot_native", "32" = "d32/faer_dot_native", "64" = "d64/faer_dot_native" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_dot_median_log.svg" +title = "Vector dot product: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/inf_norm-mean-linear.toml b/tooling/plots/scratch/inf_norm-mean-linear.toml new file mode 100644 index 0000000..68d08dd --- /dev/null +++ b/tooling/plots/scratch/inf_norm-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_mean_linear.svg" +title = "Matrix infinity norm (max abs row sum): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/inf_norm-mean-log.toml b/tooling/plots/scratch/inf_norm-mean-log.toml new file mode 100644 index 0000000..6d2250a --- /dev/null +++ b/tooling/plots/scratch/inf_norm-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_mean_log.svg" +title = "Matrix infinity norm (max abs row sum): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/inf_norm-median-linear.toml b/tooling/plots/scratch/inf_norm-median-linear.toml new file mode 100644 index 0000000..fb5ac73 --- /dev/null +++ b/tooling/plots/scratch/inf_norm-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_median_linear.svg" +title = "Matrix infinity norm (max abs row sum): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/inf_norm-median-log.toml b/tooling/plots/scratch/inf_norm-median-log.toml new file mode 100644 index 0000000..6e37f8f --- /dev/null +++ b/tooling/plots/scratch/inf_norm-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_inf_norm_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_inf_norm", "3" = "d3/la_stack_inf_norm", "4" = "d4/la_stack_inf_norm", "5" = "d5/la_stack_inf_norm", "8" = "d8/la_stack_inf_norm", "16" = "d16/la_stack_inf_norm", "32" = "d32/la_stack_inf_norm", "64" = "d64/la_stack_inf_norm" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_inf_norm", "3" = "d3/nalgebra_inf_norm", "4" = "d4/nalgebra_inf_norm", "5" = "d5/nalgebra_inf_norm", "8" = "d8/nalgebra_inf_norm", "16" = "d16/nalgebra_inf_norm", "32" = "d32/nalgebra_inf_norm", "64" = "d64/nalgebra_inf_norm" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_inf_norm", "3" = "d3/faer_inf_norm", "4" = "d4/faer_inf_norm", "5" = "d5/faer_inf_norm", "8" = "d8/faer_inf_norm", "16" = "d16/faer_inf_norm", "32" = "d32/faer_inf_norm", "64" = "d64/faer_inf_norm" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_inf_norm_median_log.svg" +title = "Matrix infinity norm (max abs row sum): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu-mean-linear.toml b/tooling/plots/scratch/lu-mean-linear.toml new file mode 100644 index 0000000..d32c229 --- /dev/null +++ b/tooling/plots/scratch/lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_mean_linear.svg" +title = "LU factorization: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu-mean-log.toml b/tooling/plots/scratch/lu-mean-log.toml new file mode 100644 index 0000000..62ac95f --- /dev/null +++ b/tooling/plots/scratch/lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_mean_log.svg" +title = "LU factorization: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu-median-linear.toml b/tooling/plots/scratch/lu-median-linear.toml new file mode 100644 index 0000000..1c45ecf --- /dev/null +++ b/tooling/plots/scratch/lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_median_linear.svg" +title = "LU factorization: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu-median-log.toml b/tooling/plots/scratch/lu-median-log.toml new file mode 100644 index 0000000..85516ab --- /dev/null +++ b/tooling/plots/scratch/lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu", "3" = "d3/la_stack_lu", "4" = "d4/la_stack_lu", "5" = "d5/la_stack_lu", "8" = "d8/la_stack_lu", "16" = "d16/la_stack_lu", "32" = "d32/la_stack_lu", "64" = "d64/la_stack_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu", "3" = "d3/nalgebra_lu", "4" = "d4/nalgebra_lu", "5" = "d5/nalgebra_lu", "8" = "d8/nalgebra_lu", "16" = "d16/nalgebra_lu", "32" = "d32/nalgebra_lu", "64" = "d64/nalgebra_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu", "3" = "d3/faer_lu", "4" = "d4/faer_lu", "5" = "d5/faer_lu", "8" = "d8/faer_lu", "16" = "d16/faer_lu", "32" = "d32/faer_lu", "64" = "d64/faer_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_median_log.svg" +title = "LU factorization: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu_solve-mean-linear.toml b/tooling/plots/scratch/lu_solve-mean-linear.toml new file mode 100644 index 0000000..bd68839 --- /dev/null +++ b/tooling/plots/scratch/lu_solve-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_mean_linear.svg" +title = "LU solve (factor + solve): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu_solve-mean-log.toml b/tooling/plots/scratch/lu_solve-mean-log.toml new file mode 100644 index 0000000..a2814bd --- /dev/null +++ b/tooling/plots/scratch/lu_solve-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_mean_log.svg" +title = "LU solve (factor + solve): mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu_solve-median-linear.toml b/tooling/plots/scratch/lu_solve-median-linear.toml new file mode 100644 index 0000000..b76f745 --- /dev/null +++ b/tooling/plots/scratch/lu_solve-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_median_linear.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/lu_solve-median-log.toml b/tooling/plots/scratch/lu_solve-median-log.toml new file mode 100644 index 0000000..c1c50cb --- /dev/null +++ b/tooling/plots/scratch/lu_solve-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_lu_solve_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_lu_solve", "3" = "d3/la_stack_lu_solve", "4" = "d4/la_stack_lu_solve", "5" = "d5/la_stack_lu_solve", "8" = "d8/la_stack_lu_solve", "16" = "d16/la_stack_lu_solve", "32" = "d32/la_stack_lu_solve", "64" = "d64/la_stack_lu_solve" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_lu_solve", "3" = "d3/nalgebra_lu_solve", "4" = "d4/nalgebra_lu_solve", "5" = "d5/nalgebra_lu_solve", "8" = "d8/nalgebra_lu_solve", "16" = "d16/nalgebra_lu_solve", "32" = "d32/nalgebra_lu_solve", "64" = "d64/nalgebra_lu_solve" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_lu_solve", "3" = "d3/faer_lu_solve", "4" = "d4/faer_lu_solve", "5" = "d5/faer_lu_solve", "8" = "d8/faer_lu_solve", "16" = "d16/faer_lu_solve", "32" = "d32/faer_lu_solve", "64" = "d64/faer_lu_solve" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_lu_solve_median_log.svg" +title = "LU solve (factor + solve): median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/norm2_sq-mean-linear.toml b/tooling/plots/scratch/norm2_sq-mean-linear.toml new file mode 100644 index 0000000..aa34559 --- /dev/null +++ b/tooling/plots/scratch/norm2_sq-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_mean_linear.svg" +title = "Vector squared 2-norm: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/norm2_sq-mean-log.toml b/tooling/plots/scratch/norm2_sq-mean-log.toml new file mode 100644 index 0000000..0924a20 --- /dev/null +++ b/tooling/plots/scratch/norm2_sq-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_mean_log.svg" +title = "Vector squared 2-norm: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/norm2_sq-median-linear.toml b/tooling/plots/scratch/norm2_sq-median-linear.toml new file mode 100644 index 0000000..806a948 --- /dev/null +++ b/tooling/plots/scratch/norm2_sq-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_median_linear.svg" +title = "Vector squared 2-norm: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/norm2_sq-median-log.toml b/tooling/plots/scratch/norm2_sq-median-log.toml new file mode 100644 index 0000000..b7f644d --- /dev/null +++ b/tooling/plots/scratch/norm2_sq-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_norm2_sq_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_norm2_sq", "3" = "d3/la_stack_norm2_sq", "4" = "d4/la_stack_norm2_sq", "5" = "d5/la_stack_norm2_sq", "8" = "d8/la_stack_norm2_sq", "16" = "d16/la_stack_norm2_sq", "32" = "d32/la_stack_norm2_sq", "64" = "d64/la_stack_norm2_sq" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_norm_squared", "3" = "d3/nalgebra_norm_squared", "4" = "d4/nalgebra_norm_squared", "5" = "d5/nalgebra_norm_squared", "8" = "d8/nalgebra_norm_squared", "16" = "d16/nalgebra_norm_squared", "32" = "d32/nalgebra_norm_squared", "64" = "d64/nalgebra_norm_squared" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_norm2_sq", "3" = "d3/faer_norm2_sq", "4" = "d4/faer_norm2_sq", "5" = "d5/faer_norm2_sq", "8" = "d8/faer_norm2_sq", "16" = "d16/faer_norm2_sq", "32" = "d32/faer_norm2_sq", "64" = "d64/faer_norm2_sq" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_norm2_sq_median_log.svg" +title = "Vector squared 2-norm: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/solve_from_lu-mean-linear.toml b/tooling/plots/scratch/solve_from_lu-mean-linear.toml new file mode 100644 index 0000000..daad11b --- /dev/null +++ b/tooling/plots/scratch/solve_from_lu-mean-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_mean_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_mean_linear.svg" +title = "Solve from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/solve_from_lu-mean-log.toml b/tooling/plots/scratch/solve_from_lu-mean-log.toml new file mode 100644 index 0000000..e46a030 --- /dev/null +++ b/tooling/plots/scratch/solve_from_lu-mean-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "mean" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_mean_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_mean_log.svg" +title = "Solve from precomputed LU: mean time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/solve_from_lu-median-linear.toml b/tooling/plots/scratch/solve_from_lu-median-linear.toml new file mode 100644 index 0000000..390023a --- /dev/null +++ b/tooling/plots/scratch/solve_from_lu-median-linear.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_median_linear.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_median_linear.svg" +title = "Solve from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "linear" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/plots/scratch/solve_from_lu-median-log.toml b/tooling/plots/scratch/solve_from_lu-median-log.toml new file mode 100644 index 0000000..0738c3b --- /dev/null +++ b/tooling/plots/scratch/solve_from_lu-median-log.toml @@ -0,0 +1,38 @@ +# Named view consumed directly by `performance publish --artifacts-only`. +schema = 2 +measurement = "tooling/measurements/full.toml" +payload = "target/bench-reports/full/run.json" +manifest = "target/bench-reports/full/evidence.json" +statistic = "median" +unit = "ns" +missing = "error" +csv = "docs/assets/bench/vs_linalg_solve_from_lu_median_log.csv" +rows = [ + { key = "2", label = "2", coordinate = 2 }, + { key = "3", label = "3", coordinate = 3 }, + { key = "4", label = "4", coordinate = 4 }, + { key = "5", label = "5", coordinate = 5 }, + { key = "8", label = "8", coordinate = 8 }, + { key = "16", label = "16", coordinate = 16 }, + { key = "32", label = "32", coordinate = 32 }, + { key = "64", label = "64", coordinate = 64 }, +] +series = [ + { name = "la-stack current", label = "la-stack", label-version = "release", rows = { "2" = "d2/la_stack_solve_from_lu", "3" = "d3/la_stack_solve_from_lu", "4" = "d4/la_stack_solve_from_lu", "5" = "d5/la_stack_solve_from_lu", "8" = "d8/la_stack_solve_from_lu", "16" = "d16/la_stack_solve_from_lu", "32" = "d32/la_stack_solve_from_lu", "64" = "d64/la_stack_solve_from_lu" } }, + { name = "nalgebra", label = "nalgebra", label-version = "dependency.nalgebra", rows = { "2" = "d2/nalgebra_solve_from_lu", "3" = "d3/nalgebra_solve_from_lu", "4" = "d4/nalgebra_solve_from_lu", "5" = "d5/nalgebra_solve_from_lu", "8" = "d8/nalgebra_solve_from_lu", "16" = "d16/nalgebra_solve_from_lu", "32" = "d32/nalgebra_solve_from_lu", "64" = "d64/nalgebra_solve_from_lu" } }, + { name = "faer", label = "faer", label-version = "dependency.faer", rows = { "2" = "d2/faer_solve_from_lu", "3" = "d3/faer_solve_from_lu", "4" = "d4/faer_solve_from_lu", "5" = "d5/faer_solve_from_lu", "8" = "d8/faer_solve_from_lu", "16" = "d16/faer_solve_from_lu", "32" = "d32/faer_solve_from_lu", "64" = "d64/faer_solve_from_lu" } }, +] +comparisons = [ { numerator = "nalgebra", denominator = "la-stack current" }, { numerator = "faer", denominator = "la-stack current" } ] + +[plot] +path = "docs/assets/bench/vs_linalg_solve_from_lu_median_log.svg" +title = "Solve from precomputed LU: median time vs dimension" +x-label = "Dimension D" +y-label = "Time" +x-scale = "linear" +y-scale = "log" + +[provenance.baseline] +# Supply independent release and full commit assertions on the command line. + +[provenance.current] diff --git a/tooling/tests/__init__.py b/tooling/tests/__init__.py new file mode 100644 index 0000000..02c1fe6 --- /dev/null +++ b/tooling/tests/__init__.py @@ -0,0 +1 @@ +"""Integration tests for the repository's installed tooling and declarations.""" diff --git a/scripts/tests/test_cargo_update_integration.py b/tooling/tests/test_cargo_update_integration.py similarity index 100% rename from scripts/tests/test_cargo_update_integration.py rename to tooling/tests/test_cargo_update_integration.py diff --git a/scripts/tests/test_changelog_integration.py b/tooling/tests/test_changelog_integration.py similarity index 100% rename from scripts/tests/test_changelog_integration.py rename to tooling/tests/test_changelog_integration.py diff --git a/scripts/tests/test_justfile_discoverability.py b/tooling/tests/test_justfile_discoverability.py similarity index 100% rename from scripts/tests/test_justfile_discoverability.py rename to tooling/tests/test_justfile_discoverability.py diff --git a/scripts/tests/test_maintenance_integration.py b/tooling/tests/test_maintenance_integration.py similarity index 88% rename from scripts/tests/test_maintenance_integration.py rename to tooling/tests/test_maintenance_integration.py index 257872b..38f7056 100644 --- a/scripts/tests/test_maintenance_integration.py +++ b/tooling/tests/test_maintenance_integration.py @@ -51,7 +51,10 @@ def test_release_preview_and_update_preserve_scientific_evidence_and_dependency_ assert main(release_args(consumer)) == 0 after = snapshot(consumer) for name, contents in before.items(): - if name.startswith(("docs/archive/", "docs/archives/", "docs/performance/")) or name in {"docs/performance.md", "CHANGELOG.md"}: + if name.startswith(("docs/archive/", "docs/archives/", "docs/performance/", "docs/performance-runs/")) or name in { + "docs/performance.md", + "CHANGELOG.md", + }: assert after[name] == contents, name original_cargo = tomllib.loads(before["Cargo.lock"].decode()) updated_cargo = tomllib.loads(after["Cargo.lock"].decode()) @@ -94,6 +97,20 @@ def test_readme_release_selector_requires_the_reviewed_link_inventory(consumer: assert snapshot(consumer) == before +def test_release_updates_preserve_new_complete_evidence_links_and_reports(consumer: Path) -> None: + """New publication links retain their measured tag through later metadata updates.""" + readme = consumer / "README.md" + links = [f"https://github.com/acgetchell/la-stack/blob/v0.5.0/docs/performance-runs/runs/frozen/{name}.json" for name in ("run", "evidence")] + with readme.open("a", encoding="utf-8", newline="\n") as stream: + stream.write("\n" + "\n".join(f"[Retained {index}]({link})" for index, link in enumerate(links)) + "\n") + report = consumer / "docs/performance-runs/frozen.md" + report.parent.mkdir(parents=True, exist_ok=True) + report.write_bytes(b"# la-stack v0.5.0 measured report\n") + assert main(release_args(consumer)) == 0 + assert all(link in readme.read_text(encoding="utf-8") for link in links) + assert report.read_bytes() == b"# la-stack v0.5.0 measured report\n" + + def test_update_recipe_runs_the_installed_cli_with_preview_arguments(consumer: Path) -> None: """Execute the imported adapter with managed tools, skipping sync and gh lookup.""" wrapper = consumer / "recipes.just" @@ -116,7 +133,9 @@ def test_update_recipe_runs_the_installed_cli_with_preview_arguments(consumer: P def test_markdown_recipe_uses_the_published_checker() -> None: """Retain the consumer's tracked-file selection and quoted path forwarding.""" result = dry_run(REPO_ROOT, "markdown-check") - assert 'research-repo-tools docs check-lines "${files[@]}"' in result.stderr + assert 'research-repo-tools docs check-lines "${raw_files[@]}"' in result.stderr + assert 'if [ "$file" != README.md ]; then' in result.stderr + assert '"${files[@]}" | xargs -0 -n100' in result.stderr assert "git ls-files -co --exclude-standard -z" in result.stderr @@ -148,7 +167,7 @@ def test_semgrep_production_targets_include_tests_and_exclude_rule_fixtures(tmp_ included = { "tests/proptest_exact.rs", "benches/comparison/tests/vs_linalg_inputs.rs", - "scripts/tests/test_release_baseline.py", + "tooling/tests/test_release_baseline.py", ".github/workflows/semgrep-sarif.yml", "test/control.rs", "testsuite/control.py", diff --git a/tooling/tests/test_performance_workflow.py b/tooling/tests/test_performance_workflow.py new file mode 100644 index 0000000..bcbe7a8 --- /dev/null +++ b/tooling/tests/test_performance_workflow.py @@ -0,0 +1,438 @@ +"""Installed workflow acceptance with independent la-stack scientific declarations.""" + +import hashlib +import json +import os +import shlex +import shutil +import sys +import tomllib +from pathlib import Path +from typing import TYPE_CHECKING, cast + +import pytest +from research_repo_tools.common_measurement import CommonHarnessPlan, DiscoveryPolicy, measure_prepared_pair, validate_run_policy +from research_repo_tools.complete_runs import RunSeries +from research_repo_tools.evidence import load_evidence, publish_evidence +from research_repo_tools.just_inspect import dry_run +from research_repo_tools.measurement import load_measurement +from research_repo_tools.process import run_command +from research_repo_tools.release_pairs import ReleasePair +from research_repo_tools.worktrees import capture_snapshot + +if TYPE_CHECKING: + import subprocess + + from research_repo_tools.evidence import Evidence + +ROOT = Path(__file__).resolve().parents[2] +PAIR = ReleasePair("v0.5.1", "v0.5.0") +DRIVER = """import json, os, sys +from pathlib import Path +phase, suite, action = sys.argv[1:] +if action == "gate": + Path("target").mkdir(exist_ok=True) + with Path("target/gates.txt").open("a", encoding="utf-8", newline="\\n") as stream: + stream.write("gate\\n") + raise SystemExit(0) +ids = [name for name in IDS[phase] if (name.startswith("d") if suite == "vs_linalg" else not name.startswith("d"))] +if action == "list": + for name in ids: + print(name + ": benchmark") + raise SystemExit(0) +assert Path("target/gates.txt").exists() +for name in ids: + path = Path(os.environ["CRITERION_HOME"]) / name / "new" + path.mkdir(parents=True) + median = (16.0 if "/faer_" in name else 10.0) if phase == "baseline" else 8.0 + mean = (32.0 if "/faer_" in name else 20.0) if phase == "baseline" else 12.0 + def estimate(value): + return {"point_estimate": value, "confidence_interval": {"lower_bound": value * .9, "upper_bound": value * 1.1, "confidence_level": .95}} + data = { + "benchmark.json": {"full_id": name}, + "estimates.json": {"mean": estimate(mean), "median": estimate(median)}, + "sample.json": {"iters": [1] * 100, "times": [median] * 100}, + } + for filename, value in data.items(): + (path / filename).write_text(json.dumps(value), encoding="utf-8", newline="\\n") +""" + + +def declaration(root: Path, view: str = "full") -> CommonHarnessPlan: + plan = load_measurement(root, f"tooling/measurements/{view}.toml") + assert isinstance(plan, CommonHarnessPlan) + return plan + + +def scientific_ids() -> tuple[set[str], set[str]]: + """Derive expectations from the independent domain catalog, not a measured run.""" + catalog = tomllib.loads((ROOT / "tooling/performance-policy.toml").read_text(encoding="utf-8")) + library = { + *(f"{group}/{name}" for group, names in catalog["exact"].items() for name in names), + *( + f"d{dimension}/{name}" + for dimension in catalog["dimensions"] + for name in [*catalog["library-benchmarks"], *catalog["additional"].get(str(dimension), [])] + ), + } + peers = {f"{name.split('/')[0]}/{peer}" for name in library for peer in catalog["peers"].get(name.split("/")[1], [])} + return library, peers + + +@pytest.mark.parametrize("view", ["full", "non-exact"]) +def test_declared_scientific_sampling_coverage_and_original_peer_phases(view: str) -> None: + library, peers = scientific_ids() + if view == "non-exact": + library = {name for name in library if name.startswith("d")} + plan = declaration(ROOT, view) + catalog = tomllib.loads((ROOT / "tooling/performance-policy.toml").read_text(encoding="utf-8")) + assert plan.measurement.minimum_release == "v" + ".".join(str(part) for part in catalog["minimum-release"]) + for phase, required in ((plan.baseline, library | peers), (plan.current, library)): + assert isinstance(phase.policy, DiscoveryPolicy) + assert set(phase.policy.discovery.required) == required + assert phase.policy.sample_count == 100 + assert phase.policy.statistics == ("mean", "median") + assert phase.policy.confidence_level == 0.95 + assert phase.policy.unit == "ns" + assert phase.gate[-1] == "gate" + environment = dict(phase.environment) + assert environment["RUSTFLAGS"] == environment["CARGO_ENCODED_RUSTFLAGS"] == "--cap-lints=warn" + assert environment["RUSTUP_TOOLCHAIN"] == tomllib.loads((ROOT / "rust-toolchain.toml").read_text(encoding="utf-8"))["toolchain"]["channel"] + assert {item.name: item.phase for item in plan.series} == { + "la-stack baseline": "baseline", + "la-stack current": "current", + "nalgebra": "baseline", + "faer": "baseline", + } + for item in plan.series: + assert isinstance(item, RunSeries) + if item.name.startswith("la-stack"): + assert dict(item.rows) == {name: name for name in library} + assert {"context.os", "context.architecture", "context.cpu", "harness_sha256"} <= set(plan.measurement.compatible) + assert {"benches/**/*.rs", "tests/exact_bench_config.rs", "tooling/performance.just", "tooling/measurements/*.toml"} <= set(plan.harness) + + +def test_named_views_keep_every_metric_statistic_axis_and_explicit_input_choice() -> None: + catalog = tomllib.loads((ROOT / "tooling/performance-policy.toml").read_text(encoding="utf-8")) + for source in ("scratch", "retained", "non-exact"): + files = sorted((ROOT / "tooling/plots" / source).glob("*.toml")) + assert len(files) == len(catalog["metrics"]) * 4 + for path in files: + metric, statistic, axis = path.stem.split("-") + view = tomllib.loads(path.read_text(encoding="utf-8")) + assert view["statistic"] == statistic + assert statistic in {"mean", "median"} + assert view["unit"] == "ns" + assert view["plot"]["y-scale"] == axis + assert axis in {"linear", "log"} + assert [row["coordinate"] for row in view["rows"]] == catalog["dimensions"] + assert [series["name"] for series in view["series"]] == ["la-stack current", "nalgebra", "faer"] + for series, benchmark in zip(view["series"], catalog["metrics"][metric]["benchmarks"], strict=True): + assert series["rows"] == {str(d): f"d{d}/{benchmark}" for d in catalog["dimensions"]} + measurement = "non-exact" if source == "non-exact" else "full" + assert view["measurement"] == f"tooling/measurements/{measurement}.toml" + assert ("archive" in view) == (source == "retained") + if source != "retained": + assert view["payload"] == f"target/bench-reports/{measurement}/run.json" + assert view["manifest"] == f"target/bench-reports/{measurement}/evidence.json" + else: + assert "payload" not in view + assert "manifest" not in view + + +def recipe(root: Path, name: str, *arguments: str) -> subprocess.CompletedProcess[str]: + """Invoke the actual recipe with the already-installed locked consumer environment.""" + return run_command( + "just", + ["--no-deps", "--justfile", str(ROOT / "justfile"), "--working-directory", str(root), name, *arguments], + env={**os.environ, "UV_NO_SYNC": "1", "UV_PROJECT_ENVIRONMENT": sys.prefix}, + check=False, + ) + + +def test_native_recipes_preserve_scientific_gates_and_peer_reuse() -> None: + justfile = Path("tooling/performance.just") + baseline = dry_run(ROOT, "baseline-all", justfile=justfile).stderr + current = dry_run(ROOT, "current-all", justfile=justfile).stderr + assert baseline.count("cargo bench --locked") == current.count("cargo bench --locked") == 2 + assert "la_stack --noplot" in current + assert "la_stack --noplot" not in baseline + assert "--target" in baseline + assert "--target" in current + assert dry_run(ROOT, "baseline-all", ["list"], justfile=justfile).stderr.count("--list") == 2 + assert "--test vs_linalg_inputs --test exact_bench_config" in dry_run(ROOT, "gate", justfile=justfile).stderr + for name in ("performance-local", "performance-local-non-exact"): + command = dry_run(ROOT, name).stderr + assert "research-repo-tools performance measure" in command + assert "--mode current-vs-latest" in command + assert "--allow-git-mutations" in command + command = dry_run(ROOT, "performance-release", [PAIR.current, PAIR.baseline]).stderr + assert command.count("performance measure") == command.count("performance promote") == 1 + assert "--payload target/bench-reports/full/run.json" in command + assert "scripts/" not in command + + +def prepared(tmp_path: Path) -> tuple[Path, Path]: + """Replace only native timing/gates with a bounded fixture, retaining real policy.""" + library, peers = scientific_ids() + ids = {"baseline": sorted(library | peers), "current": sorted(library)} + for phase in ("baseline", "current"): + root = tmp_path / phase + root.mkdir(parents=True) + for name in ("pyproject.toml", "uv.lock", ".python-version", "justfile"): + shutil.copyfile(ROOT / name, root / name) + for pattern in declaration(ROOT).harness: + for source in ROOT.glob(pattern): + destination = root / source.relative_to(ROOT) + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(source, destination) + (root / "src").mkdir() + (root / "src/lib.rs").write_text(f"// {phase}\n", encoding="utf-8", newline="\n") + (root / ".gitignore").write_text("/target/\n", encoding="utf-8", newline="\n") + if phase == "current": + (root / "src/untracked.rs").write_bytes(b"// included working-tree input\n") + manifest = root / "Cargo.toml" + contents = manifest.read_text(encoding="utf-8") + version = tomllib.loads(contents)["package"]["version"] + manifest.write_text(contents.replace(f'version = "{version}"', 'version = "0.5.1"', 1), encoding="utf-8", newline="\n") + (root / "tooling/fixture.py").write_text(f"IDS = {ids!r}\n" + DRIVER, encoding="utf-8", newline="\n") + driver = f"{shlex.quote(sys.executable)} -X utf8 tooling/fixture.py" + native = 'export CRITERION_HOME := absolute_path(env("CRITERION_HOME", "target/criterion"))\n' + for side in ("baseline", "current"): + native += f'\n{side}-all mode="measure": ({side}-vs_linalg mode) ({side}-exact mode)\n' + for suite in ("vs_linalg", "exact"): + native += f'\n{side}-{suite} mode="measure":\n {driver} {side} {suite} {{{{mode}}}}\n' + native += f"\ngate:\n {driver} current all gate\n" + (root / "tooling/performance.just").write_text(native, encoding="utf-8", newline="\n") + for config in (root / "tooling/measurements").glob("*.toml"): + config.write_text( + config.read_text(encoding="utf-8").replace('"tooling/measurements/*.toml"', '"tooling/measurements/*.toml", "tooling/fixture.py"'), + encoding="utf-8", + newline="\n", + ) + run_command("git", ["init", "--quiet"], cwd=root) + run_command( + "git", + [ + "-c", + "user.name=Fixture", + "-c", + "user.email=fixture@example.invalid", + "-c", + "commit.gpgsign=false", + "commit", + "--allow-empty", + "--quiet", + "-m", + phase, + ], + cwd=root, + ) + return tmp_path / "baseline", tmp_path / "current" + + +@pytest.fixture(scope="module") +def measured_run(tmp_path_factory: pytest.TempPathFactory) -> tuple[Path, Evidence]: + baseline, current = prepared(tmp_path_factory.mktemp("performance")) + asserted = [ + PAIR.current, + run_command("git", ["--no-pager", "rev-parse", "HEAD"], cwd=current).stdout.strip(), + PAIR.baseline, + run_command("git", ["--no-pager", "rev-parse", "HEAD"], cwd=baseline).stdout.strip(), + ] + (current / "fixture-identities.json").write_text(json.dumps(asserted), encoding="utf-8", newline="\n") + evidence = measure_prepared_pair(baseline, current, declaration(current), PAIR, working_tree=True) + for path in (ROOT / "tooling").glob("performance-*.toml"): + shutil.copyfile(path, current / "tooling" / path.name) + shutil.copytree(ROOT / "tooling/plots", current / "tooling/plots") + (current / "README.md").write_text("# Fixture\n\n\nOld table\n\n", encoding="utf-8", newline="\n") + publish_evidence(evidence, current / "target/bench-reports/full/run.json", current / "target/bench-reports/full/evidence.json") + return current, evidence + + +@pytest.fixture +def complete_run(tmp_path: Path, measured_run: tuple[Path, Evidence]) -> tuple[Path, Evidence]: + root, evidence = measured_run + destination = tmp_path / "current" + shutil.copytree(root, destination) + return destination, evidence + + +def identities(root: Path) -> list[str]: + """Read assertions captured from the fixture's Git sources before acquisition.""" + return cast("list[str]", json.loads((root / "fixture-identities.json").read_text(encoding="utf-8"))) + + +def test_working_tree_inputs_include_nonignored_untracked_consumer_sources(complete_run: tuple[Path, Evidence]) -> None: + root, evidence = complete_run + snapshot = capture_snapshot(root) + files = {name: data for name, data, _mode in snapshot.untracked} + assert files["src/untracked.rs"] == b"// included working-tree input\n" + assert not any(name.startswith("target/") for name in files) + context = dict(dict(evidence.sources)["current"].context) + assert "src/untracked.rs" in json.loads(context["source-inventory"]) + + +def test_actual_non_exact_measurement_recipe_discovers_and_retains_complete_samples(tmp_path: Path) -> None: + _baseline, root = prepared(tmp_path) + shutil.copytree(ROOT / "tooling/plots/non-exact", root / "tooling/plots/non-exact") + manifest = root / "Cargo.toml" + current = manifest.read_text(encoding="utf-8") + manifest.write_text(current.replace('version = "0.5.1"', 'version = "0.5.0"', 1), encoding="utf-8", newline="\n") + for arguments in ( + ["add", "."], + ["-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "commit.gpgsign=false", "commit", "--quiet", "-m", "baseline"], + ["-c", "tag.gpgsign=false", "tag", PAIR.baseline], + ): + run_command("git", arguments, cwd=root) + manifest.write_text(current, encoding="utf-8", newline="\n") + (root / "src/lib.rs").write_text("// current changed source\n", encoding="utf-8", newline="\n") + for arguments in ( + ["add", "."], + ["-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "commit.gpgsign=false", "commit", "--quiet", "-m", "current"], + ["-c", "tag.gpgsign=false", "tag", PAIR.current], + ): + run_command("git", arguments, cwd=root) + asserted = [ + PAIR.current, + run_command("git", ["--no-pager", "rev-parse", f"{PAIR.current}^{{commit}}"], cwd=root).stdout.strip(), + PAIR.baseline, + run_command("git", ["--no-pager", "rev-parse", f"{PAIR.baseline}^{{commit}}"], cwd=root).stdout.strip(), + ] + result = recipe(root, "performance-measure", PAIR.current, PAIR.baseline, "non-exact") + assert result.returncode == 0, result.stdout + result.stderr + evidence = load_evidence(root / "target/bench-reports/non-exact/run.json", root / "target/bench-reports/non-exact/evidence.json") + run = validate_run_policy(evidence, declaration(root, "non-exact")) + assert all(name.startswith("d") for _phase, sample in run.phases for name in sample.policy.expected) + assert (root / "target/bench-reports/non-exact/report.md").is_file() + assert not (root / "target/bench-reports/full").exists() + result = recipe(root, "plot-vs-linalg", *asserted, "lu_solve-median-log", "non-exact") + assert result.returncode == 0, result.stdout + result.stderr + assert (root / "docs/assets/bench/vs_linalg_non_exact_lu_solve_median_log.csv").is_file() + assert not (root / "docs/assets/bench/vs_linalg_lu_solve_median_log.csv").exists() + + +@pytest.mark.parametrize(("statistic", "axis", "source"), [("mean", "linear", "scratch"), ("median", "log", "retained")]) +def test_actual_retention_offline_plot_and_readme_recipes(complete_run: tuple[Path, Evidence], statistic: str, axis: str, source: str) -> None: + root, _evidence = complete_run + result = recipe(root, "performance-promote") + assert result.returncode == 0, result.stdout + result.stderr + if source == "retained": + shutil.rmtree(root / "target") + result = recipe(root, "performance-doc") + assert result.returncode == 0, result.stdout + result.stderr + result = recipe(root, "plot-vs-linalg", *identities(root), f"lu_solve-{statistic}-{axis}", source) + assert result.returncode == 0, result.stdout + result.stderr + csv = (root / f"docs/assets/bench/vs_linalg_lu_solve_{statistic}_{axis}.csv").read_text(encoding="utf-8") + assert "nalgebra" in csv + assert "faer" in csv + assert "baseline" in csv + assert statistic in csv + result = recipe(root, "performance-readme", *identities(root)) + assert result.returncode == 0, result.stdout + result.stderr + document = (root / "README.md").read_text(encoding="utf-8") + assert "Speedup vs nalgebra" in document + assert "Speedup vs faer" in document + assert "Complete run evidence" in document + assert "Evidence envelope" in document + assert "la-stack v0.5.1" in document + checked = recipe(root, "markdown-check") + assert checked.returncode == 0, checked.stderr + + +@pytest.mark.parametrize("failure", ["partial-scratch", "stale-source", "stale-harness", "formatter"]) +def test_publication_boundaries_leave_all_outputs_unchanged(complete_run: tuple[Path, Evidence], failure: str) -> None: + root, _evidence = complete_run + result = recipe(root, "performance-promote") + assert result.returncode == 0, result.stdout + result.stderr + if failure == "partial-scratch": + (root / "target/bench-reports/full/evidence.json").unlink() + elif failure == "stale-source": + (root / "src/lib.rs").write_text("// changed\n", encoding="utf-8", newline="\n") + elif failure == "stale-harness": + (root / "tooling/performance.just").write_text("# changed\n", encoding="utf-8", newline="\n") + else: + config = root / "tooling/performance-readme.toml" + config.write_text( + config.read_text(encoding="utf-8").replace('formatter = "pyproject.toml"', 'formatter = "bad-formatter.toml"'), encoding="utf-8", newline="\n" + ) + (root / "bad-formatter.toml").write_text("[invalid TOML\n", encoding="utf-8", newline="\n") + outputs = [root / "README.md", *(root / "docs").rglob("*")] + before = {path: path.read_bytes() for path in outputs if path.is_file()} + result = recipe(root, "performance-promote") if failure == "partial-scratch" else recipe(root, "performance-readme", *identities(root)) + assert result.returncode != 0 + if failure == "stale-source": + assert "current-sources differ" in result.stderr + elif failure == "stale-harness": + assert "current-harness differ" in result.stderr + elif failure == "formatter": + assert "rumdl could not format README.md" in result.stderr + if failure == "partial-scratch": + result = recipe(root, "plot-vs-linalg", *identities(root), "lu_solve-median-log", "scratch") + assert result.returncode != 0 + assert {path: path.read_bytes() for path in before} == before + assert not (root / "docs/assets").exists() + + +@pytest.mark.parametrize("phase", ["baseline", "current"]) +def test_actual_measurement_recipe_rejects_old_releases_before_git(phase: str, tmp_path: Path) -> None: + root = tmp_path / "consumer" + root.mkdir() + for name in ("pyproject.toml", "uv.lock", ".python-version", "Cargo.toml", "rust-toolchain.toml"): + shutil.copyfile(ROOT / name, root / name) + for pattern in declaration(ROOT).harness: + for source in ROOT.glob(pattern): + destination = root / source.relative_to(ROOT) + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(source, destination) + (root / "src").mkdir() + (root / "src/lib.rs").write_text("// fixture\n", encoding="utf-8", newline="\n") + result = recipe(root, "performance-measure", "v0.4.6" if phase == "current" else PAIR.current, "v0.4.6" if phase == "baseline" else PAIR.baseline) + assert result.returncode != 0 + assert "requires v0.5.0 or newer" in result.stderr + assert not (root / ".git").exists() + assert not (root / "target").exists() + + +def test_legacy_bytes_hashes_are_unchanged() -> None: + directory = ROOT / "docs/performance/v0.4.6-vs-v0.4.5/39719a1eb599d294dbbc1e46dc6fb0de2028ad2e59aab5f94fb48c7bf3d7f841" + hashes = { + "performance.csv": "b263bb34bcfd43b8fc8109110db9f2e908516aef6c01ce16f70f5ac18dc7ef2d", + "performance.full.csv": "4fa5cc13159f5dc91e711ae67554845bcbd1ace2cfc3e31487fc85f75d3dc459", + "performance.full.provenance.json": "a43f66e52035aecd8d235dfded916b23c3240529d0c07f793d27322521cfb0d0", + "performance.provenance.json": "89144a2899ba73f55d009da4fa20b4e6477600902b93cde469383f719c497508", + } + assert {name: hashlib.sha256((directory / name).read_bytes()).hexdigest() for name in hashes} == hashes + + +def test_pre_declaration_complete_run_is_preserved_as_a_frozen_record() -> None: + directory = ROOT / "docs/performance-runs/runs/634bc9527c2caf0a431a9bdfac082c190e1094f0b29eb6e3f28c4b96961cdec5" + hashes = { + "evidence.json": "6565bbb489662b68df8cbb039947a35de9ecdec0b25aa7f4de03dcf76bf8ed9d", + "report.md": "ac5ca08784750ea04211dc3142e8b33ecf01fe7c3520d6d5de7cab78187235a7", + "run.json": "9b860d8a56a4313d60031039fd518f142c1aa2e74933fc9e73fb128a00023b2a", + } + evidence = load_evidence(directory / "run.json", directory / "evidence.json") + with pytest.raises(ValueError, match="acquisition declaration"): + validate_run_policy(evidence, declaration(ROOT), release=True) + assert {name: hashlib.sha256((directory / name).read_bytes()).hexdigest() for name in hashes} == hashes + + +def test_shared_saved_comparison_recipe_reports_coverage(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + """Exercise the actual recipe and installed CLI, with no consumer package.""" + for name in ("justfile", "pyproject.toml", "uv.lock", ".python-version", "rust-toolchain.toml"): + shutil.copyfile(ROOT / name, tmp_path / name) + for name, sample, value in (("workload/shared", "last", 10), ("workload/shared", "new", 8), ("diagnostic/new", "new", 3)): + path = tmp_path / "target/criterion" / name / sample + path.mkdir(parents=True) + (path / "benchmark.json").write_text(json.dumps({"full_id": name}), encoding="utf-8") + estimate = {"point_estimate": value, "confidence_interval": {"lower_bound": value * 0.9, "upper_bound": value * 1.1}} + (path / "estimates.json").write_text(json.dumps({"median": estimate}), encoding="utf-8") + monkeypatch.setenv("UV_PROJECT_ENVIRONMENT", sys.prefix) + result = run_command("just", ["--no-deps", "bench-compare", "last"], cwd=tmp_path, check=False) + assert result.returncode == 0, result.stdout + result.stderr + report = (tmp_path / "target/bench-reports/performance.md").read_text(encoding="utf-8") + assert "workload/shared" in report + assert "diagnostic/new" in report + assert not (tmp_path / "target/bench-reports/performance.csv").exists() + assert not (tmp_path / "target/bench-reports/performance.provenance.json").exists() diff --git a/scripts/tests/test_release_baseline.py b/tooling/tests/test_release_baseline.py similarity index 91% rename from scripts/tests/test_release_baseline.py rename to tooling/tests/test_release_baseline.py index 2a10a65..0368a7d 100644 --- a/scripts/tests/test_release_baseline.py +++ b/tooling/tests/test_release_baseline.py @@ -15,15 +15,14 @@ import pytest from research_repo_tools.criterion_inventory import CriterionInventory, load_discovery, serialize_inventory - -import archive_performance as workflow -from performance_runs import required_report_ids +from research_repo_tools.process import run_command REPO_ROOT = Path(__file__).resolve().parents[2] TOOLING_REQUIREMENT = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8"))["dependency-groups"]["tooling"][0] WORKFLOW = REPO_ROOT / ".github/workflows/release-benchmarks.yml" PREPARATION = REPO_ROOT / ".github/actions/prepare-release-benchmarks/action.yml" -IDS = {"vs_linalg": ["d2/la_stack_dot", "diagnostic/peer"], "exact": ["exact_d2/det_exact"]} +REQUIRED = load_discovery(REPO_ROOT, "tooling/criterion-inventory.toml").required +IDS = {"vs_linalg": sorted(name for name in REQUIRED if name.startswith("d")), "exact": sorted(name for name in REQUIRED if not name.startswith("d"))} BASELINE = "v1.2.3" RAW_FILES = ("benchmark.json", "estimates.json", "sample.json", "tukey.json") @@ -36,13 +35,13 @@ def write_json(path: Path, data: object) -> None: @pytest.fixture def dataset(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> tuple[Path, Path]: monkeypatch.chdir(tmp_path) + for name in ("pyproject.toml", "uv.lock", ".python-version", "rust-toolchain.toml"): + shutil.copyfile(REPO_ROOT / name, tmp_path / name) (tmp_path / "Cargo.toml").write_text('[package]\nname = "fixture"\nversion = "1.2.3"\n', encoding="utf-8") tooling = tmp_path / "tooling" tooling.mkdir() shutil.copyfile(REPO_ROOT / "tooling/criterion-saved.toml", tooling / "criterion-saved.toml") - (tooling / "criterion-inventory.toml").write_text( - 'schema = 1\nrequired = ["d2/la_stack_dot", "exact_d2/det_exact"]\n[[suites]]\nname = "release"\ncommand = ["unused"]\n', encoding="utf-8" - ) + shutil.copyfile(REPO_ROOT / "tooling/criterion-inventory.toml", tooling / "criterion-inventory.toml") criterion = tmp_path / "target/criterion" manifest = tmp_path / "target/release-benchmark-inventory.json" manifest.parent.mkdir(parents=True) @@ -59,6 +58,16 @@ def dataset(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> tuple[Path, Path return criterion, manifest +def verify_saved(root: Path) -> subprocess.CompletedProcess[str]: + """Exercise the installed verifier through the actual release-check recipe.""" + return run_command( + "just", + ["--no-deps", "--justfile", str(REPO_ROOT / "justfile"), "--working-directory", str(root), "bench-release-check", BASELINE], + env={**os.environ, "UV_NO_SYNC": "1", "UV_PROJECT_ENVIRONMENT": sys.prefix}, + check=False, + ) + + def shell_step(name: str, source: Path = WORKFLOW) -> str: """Extract a literal run block so tests exercise the workflow's actual shell.""" text = source.read_text(encoding="utf-8") @@ -88,7 +97,8 @@ def run_shell(script: str, cwd: Path, extra_env: dict[str, str]) -> subprocess.C def test_complete_dataset_round_trips_through_workflow_archive(dataset: tuple[Path, Path], tmp_path: Path) -> None: criterion, _manifest = dataset - assert workflow.main(["release-check", BASELINE]) == 0 + verified = verify_saved(tmp_path) + assert verified.returncode == 0, verified.stdout + verified.stderr output = tmp_path / "step outputs" # Git Bash accepts forward-slash drive paths on Windows as well as POSIX paths. result = run_shell( @@ -115,11 +125,11 @@ def test_complete_dataset_round_trips_through_workflow_archive(dataset: tuple[Pa def test_saved_baseline_must_match_fresh_samples(dataset: tuple[Path, Path]) -> None: criterion, _manifest = dataset write_json(criterion / "d2/la_stack_dot" / BASELINE / "sample.json", {"iters": [1.0] * 100, "times": [3.0] * 100}) - assert workflow.main(["release-check", BASELINE]) == 1 + assert verify_saved(criterion.parent.parent).returncode != 0 @pytest.mark.parametrize("relocation", ["moved", "swapped"]) -def test_report_consumers_require_canonical_paths(dataset: tuple[Path, Path], capsys: pytest.CaptureFixture[str], relocation: str) -> None: +def test_report_consumers_require_canonical_paths(dataset: tuple[Path, Path], relocation: str) -> None: criterion, _manifest = dataset original = criterion / "d2/la_stack_dot" moved = original.rename(criterion / "d2/misplaced") @@ -129,23 +139,25 @@ def test_report_consumers_require_canonical_paths(dataset: tuple[Path, Path], ca moved.rename(peer) before = {path: path.read_bytes() for path in criterion.rglob("*") if path.is_file()} - assert workflow.main(["release-check", BASELINE]) == 1 - - output = capsys.readouterr() - assert output.out == "" - assert "non-canonical report benchmark storage path" in output.err - assert "d2/la_stack_dot" in output.err + result = verify_saved(criterion.parent.parent) + assert result.returncode != 0 + assert "required storage path differs" in result.stderr + assert "d2/la_stack_dot" in result.stderr assert {path: path.read_bytes() for path in criterion.rglob("*") if path.is_file()} == before def test_configured_inventory_includes_release_consumers_and_peers() -> None: - expected = required_report_ids(REPO_ROOT) + expected = set(REQUIRED) assert {"d64/faer_lu_solve", "d64/nalgebra_lu_solve", "exact_hilbert_5x5/solve_exact", "rational_input_d8/solve_big_rational_gaussian"} <= expected assert "d64/faer_dot_native" in expected assert "d64/faer_dot" not in expected discovery = load_discovery(REPO_ROOT, "tooling/criterion-inventory.toml") assert {suite.name for suite in discovery.suites} == {"vs_linalg", "exact"} assert all(suite.command[-1] == "list" for suite in discovery.suites) + saved = tomllib.loads((REPO_ROOT / "tooling/criterion-saved.toml").read_text(encoding="utf-8")) + assert set(saved["required"]) == expected + assert saved["storage-paths"] == {name: name for name in expected} + assert saved["raw-files"] == list(RAW_FILES) def test_workflow_requires_preflight_and_isolates_publication_permissions() -> None: diff --git a/scripts/tests/test_release_publishing.py b/tooling/tests/test_release_publishing.py similarity index 100% rename from scripts/tests/test_release_publishing.py rename to tooling/tests/test_release_publishing.py diff --git a/scripts/tests/test_review_integration.py b/tooling/tests/test_review_integration.py similarity index 100% rename from scripts/tests/test_review_integration.py rename to tooling/tests/test_review_integration.py diff --git a/scripts/tests/test_security_integration.py b/tooling/tests/test_security_integration.py similarity index 100% rename from scripts/tests/test_security_integration.py rename to tooling/tests/test_security_integration.py diff --git a/scripts/tests/test_toolchain_integration.py b/tooling/tests/test_toolchain_integration.py similarity index 97% rename from scripts/tests/test_toolchain_integration.py rename to tooling/tests/test_toolchain_integration.py index 50931d2..ce22077 100644 --- a/scripts/tests/test_toolchain_integration.py +++ b/tooling/tests/test_toolchain_integration.py @@ -47,7 +47,7 @@ def test_published_tooling_package_matches_manifest_lock_and_installation() -> None: """Keep the exact published-package contract in one consumer test.""" - expected_version = "0.2.0" + expected_version = "0.2.2" manifest = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")) assert manifest["project"]["dependencies"] == [] assert manifest["tool"]["uv"]["package"] is False @@ -59,8 +59,8 @@ def test_published_tooling_package_matches_manifest_lock_and_installation() -> N package = next(item for item in lock["package"] if item["name"] == "research-repo-tools") assert package["version"] == expected_version assert package["source"] == {"registry": "https://pypi.org/simple"} - assert package["wheels"][0]["hash"] == "sha256:73c4052993ca86fe4b1dec972b2b3bc9699493064c4acfdbe8969d89e453c602" - assert package["sdist"]["hash"] == "sha256:6a173267d09c8495ecac909ef4201a3e9c71ed453e3295a05d8f1a21585096a6" + assert package["wheels"][0]["hash"] == "sha256:b82e11ef8265f0b03c37cac93f59d5854a63543c29ee378f5980623af57d9381" + assert package["sdist"]["hash"] == "sha256:4937f202a55c5678af30bae915e01ddbc17f9dd8dd9e143b2f430331b42e8f50" @pytest.fixture diff --git a/ty.toml b/ty.toml index 293c364..9f035a9 100644 --- a/ty.toml +++ b/ty.toml @@ -1,10 +1,10 @@ # ty.toml # Astral ty configuration for la-stack -# Python is auxiliary tooling only (scripts/), Rust is primary +# Python contains tooling integration tests; Rust is primary. [src] # Restrict analysis strictly to Python tooling. -include = [ "scripts" ] +include = [ "tooling/tests" ] [terminal] # Keep output concise by default. diff --git a/uv.lock b/uv.lock index 4525530..3fd2c28 100644 --- a/uv.lock +++ b/uv.lock @@ -52,14 +52,14 @@ tooling = [ dev = [ { name = "actionlint-py", specifier = "==1.7.12.25" }, { name = "pytest", specifier = "==9.1.1" }, - { name = "research-repo-tools", specifier = "==0.2.0" }, + { name = "research-repo-tools", specifier = "==0.2.2" }, { name = "ruff", specifier = "==0.17.1" }, { name = "shellcheck-py", specifier = "==0.11.0.1" }, { name = "shfmt-py", specifier = "==4.2.0" }, { name = "ty", specifier = "==0.0.89" }, { name = "yamllint", specifier = "==1.38.0" }, ] -tooling = [{ name = "research-repo-tools", specifier = "==0.2.0" }] +tooling = [{ name = "research-repo-tools", specifier = "==0.2.2" }] [[package]] name = "packaging" @@ -121,16 +121,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd77 [[package]] name = "research-repo-tools" -version = "0.2.0" +version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pyyaml" }, { name = "rust-just" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/b0/fdb4c8428e58a4528d34249be50221b240e598f24679e637dedbaeed0a77/research_repo_tools-0.2.0.tar.gz", hash = "sha256:6a173267d09c8495ecac909ef4201a3e9c71ed453e3295a05d8f1a21585096a6", size = 855482, upload-time = "2026-10-19T23:35:46.864Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/d1/a2f0444e568abe7529721d7b8e342c5fd4ecb9021333d06b66be420215d5/research_repo_tools-0.2.2.tar.gz", hash = "sha256:4937f202a55c5678af30bae915e01ddbc17f9dd8dd9e143b2f430331b42e8f50", size = 872467, upload-time = "2026-10-21T10:17:15.454Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/24/46ac38772a7925460f3973162ca438093115a3e2750de8bdf4cebe15a35d/research_repo_tools-0.2.0-py3-none-any.whl", hash = "sha256:73c4052993ca86fe4b1dec972b2b3bc9699493064c4acfdbe8969d89e453c602", size = 372885, upload-time = "2026-10-19T23:35:45.405Z" }, + { url = "https://files.pythonhosted.org/packages/6c/5c/cd74485ccb20cf85d615402097b5e216b55a95c83475cb9b51ed329a739a/research_repo_tools-0.2.2-py3-none-any.whl", hash = "sha256:b82e11ef8265f0b03c37cac93f59d5854a63543c29ee378f5980623af57d9381", size = 378782, upload-time = "2026-10-21T10:17:13.727Z" }, ] [[package]]