4 Commits
Author SHA1 Message Date
swaits 38dfeafe56 chore: repoint remaining links at git.swaits.com
CI / rustfmt (push) Waiting to run
CI / clippy --all-features (push) Waiting to run
CI / test (default) (push) Waiting to run
CI / test (parallel) (push) Waiting to run
CI / test (serde) (push) Waiting to run
CI / test (serde,parallel) (push) Waiting to run
CI / cargo doc (push) Waiting to run
CI / minimum supported Rust version (1.85) (push) Waiting to run
CI / fuzz smoke (clamp_to_bounds) (push) Waiting to run
CI / fuzz smoke (crowding_distance) (push) Waiting to run
CI / fuzz smoke (hypervolume_2d) (push) Waiting to run
CI / fuzz smoke (non_dominated_sort) (push) Waiting to run
CI / fuzz smoke (pareto_archive) (push) Waiting to run
CI / fuzz smoke (pareto_compare) (push) Waiting to run
CI / fuzz smoke (sbx_polymut) (push) Waiting to run
CI / fuzz smoke (spacing) (push) Waiting to run
Docs / Build mdbook (push) Waiting to run
Docs / Deploy to GitHub Pages (push) Blocked by required conditions
Rewrites lingering github.com / *.sr.ht references to this Gitea instance,
translating GitHub and Sourcehut URL shapes to Gitea's (/blob/<ref>/ and
sr.ht /tree/<ref>/item/ -> /src/branch/<ref>/, /tree/<tag> -> /src/tag/<tag>,
/actions/workflows/X -> /actions?workflow=X, /edit/ -> /_edit/).

Left pointing at the old hosts on purpose: pull-request links (PRs were not
migrated), forks that were never migrated, and GitHub-only surfaces Gitea
lacks. OpenPGP identity proofs are untouched by design.
2026-08-31 18:32:17 -06:00
swaits 2a7051c51d chore: repoint URLs at git.swaits.com and bump for release
CI / rustfmt (push) Waiting to run
CI / clippy --all-features (push) Waiting to run
CI / test (default) (push) Waiting to run
CI / test (parallel) (push) Waiting to run
CI / test (serde) (push) Waiting to run
CI / test (serde,parallel) (push) Waiting to run
CI / cargo doc (push) Waiting to run
CI / minimum supported Rust version (1.85) (push) Waiting to run
CI / fuzz smoke (clamp_to_bounds) (push) Waiting to run
CI / fuzz smoke (crowding_distance) (push) Waiting to run
CI / fuzz smoke (hypervolume_2d) (push) Waiting to run
CI / fuzz smoke (non_dominated_sort) (push) Waiting to run
CI / fuzz smoke (pareto_archive) (push) Waiting to run
CI / fuzz smoke (pareto_compare) (push) Waiting to run
CI / fuzz smoke (sbx_polymut) (push) Waiting to run
CI / fuzz smoke (spacing) (push) Waiting to run
Docs / Build mdbook (push) Canceled after 0s
Docs / Deploy to GitHub Pages (push) Canceled after 0s
Rewrites remaining github.com / git.sr.ht references to git.swaits.com,
translating GitHub URL shapes to Gitea's (/blob/<ref>/ -> /src/branch/<ref>/,
/tree/<tag> -> /src/tag/<tag>, /actions/workflows/X -> /actions?workflow=X,
/edit/ -> /_edit/).

Left pointing at GitHub on purpose: pull-request links (PRs were not migrated)
and GitHub-only surfaces Gitea lacks (security advisories, discussions).
2026-08-31 17:58:32 -06:00
swaits 7f623d5740 chore: point repository at git.swaits.com
CI / rustfmt (push) Waiting to run
CI / clippy --all-features (push) Waiting to run
CI / test (default) (push) Waiting to run
CI / test (parallel) (push) Waiting to run
CI / test (serde) (push) Waiting to run
CI / test (serde,parallel) (push) Waiting to run
CI / cargo doc (push) Waiting to run
CI / minimum supported Rust version (1.85) (push) Waiting to run
CI / fuzz smoke (clamp_to_bounds) (push) Waiting to run
CI / fuzz smoke (crowding_distance) (push) Waiting to run
CI / fuzz smoke (hypervolume_2d) (push) Waiting to run
CI / fuzz smoke (non_dominated_sort) (push) Waiting to run
CI / fuzz smoke (pareto_archive) (push) Waiting to run
CI / fuzz smoke (pareto_compare) (push) Waiting to run
CI / fuzz smoke (sbx_polymut) (push) Waiting to run
CI / fuzz smoke (spacing) (push) Waiting to run
Docs / Build mdbook (push) Canceled after 0s
Docs / Deploy to GitHub Pages (push) Canceled after 0s
2026-08-31 17:19:15 -06:00
swaits 16e9f732b1 chore: cargo fmt 2026-05-14 14:41:37 -06:00
11 changed files with 33 additions and 33 deletions
+4 -4
View File
@@ -1,8 +1,8 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Security vulnerability - name: Security vulnerability
url: https://github.com/swaits/heuropt/security/advisories/new url: https://git.swaits.com/swaits/heuropt/src/branch/main/SECURITY.md
about: Please use private vulnerability reporting — do not open a public issue. See SECURITY.md. about: Do not open a public issue. Email steve@waits.net — see SECURITY.md.
- name: Question / discussion - name: Question / discussion
url: https://github.com/swaits/heuropt/discussions url: https://git.swaits.com/swaits/heuropt/issues
about: For open-ended questions or design discussions. about: For open-ended questions or design discussions, open an issue and label it "question".
+12 -12
View File
@@ -91,7 +91,7 @@ unchanged, verified by the per-algorithm snapshot tests.
catch rate from ~74% to ~85%. See `.cargo/mutants.toml` for the catch rate from ~74% to ~85%. See `.cargo/mutants.toml` for the
campaign notes and the residual equivalent-mutant categories. campaign notes and the residual equivalent-mutant categories.
[0.11.0]: https://github.com/swaits/heuropt/releases/tag/v0.11.0 [0.11.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.11.0
## [0.10.0] — 2026-05-06 ## [0.10.0] — 2026-05-06
@@ -151,7 +151,7 @@ strings (e.g. `if name == "Nsga3"`) needs updating to the new
canonical strings. The names are stable now (they match the canonical strings. The names are stable now (they match the
literature), so this is a one-time fix. literature), so this is a one-time fix.
[0.10.0]: https://github.com/swaits/heuropt/releases/tag/v0.10.0 [0.10.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.10.0
## [0.9.0] — 2026-05-06 ## [0.9.0] — 2026-05-06
@@ -236,7 +236,7 @@ compile untouched.
count went from 229 to 242 (10 new explorer tests + 3 from the count went from 229 to 242 (10 new explorer tests + 3 from the
new `Objective` / `DecisionVariable` builders). new `Objective` / `DecisionVariable` builders).
[0.9.0]: https://github.com/swaits/heuropt/releases/tag/v0.9.0 [0.9.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.9.0
## [0.8.0] — 2026-05-06 ## [0.8.0] — 2026-05-06
@@ -319,7 +319,7 @@ gated behind a new `async` feature flag.
flag ULP-level slop in the simplex projection's flag ULP-level slop in the simplex projection's
`max(x_i τ, 0)` clamp boundary. `max(x_i τ, 0)` clamp boundary.
[0.8.0]: https://github.com/swaits/heuropt/releases/tag/v0.8.0 [0.8.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.8.0
## [0.5.0] — 2026-05-05 ## [0.5.0] — 2026-05-05
@@ -405,7 +405,7 @@ Three new polished examples covering distinct domains:
- `lib.rs` crate-level docs polished — better intro, points readers - `lib.rs` crate-level docs polished — better intro, points readers
at the user guide and the design spec. at the user guide and the design spec.
[0.5.0]: https://github.com/swaits/heuropt/releases/tag/v0.5.0 [0.5.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.5.0
## [0.4.0] — 2026-05-05 ## [0.4.0] — 2026-05-05
@@ -543,7 +543,7 @@ last decimal in every benchmark.
ratio, and is robust to floating-point precision loss in the ratio, and is robust to floating-point precision loss in the
algorithm's inner loop. algorithm's inner loop.
[0.4.0]: https://github.com/swaits/heuropt/releases/tag/v0.4.0 [0.4.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.4.0
## [0.3.0] — 2026-05-05 ## [0.3.0] — 2026-05-05
@@ -622,7 +622,7 @@ constraint-handling gaps. No breaking changes to the v0.2.0 public API.
preserves the existing midpoint-of-bounds default; `IpopCmaEs` sets preserves the existing midpoint-of-bounds default; `IpopCmaEs` sets
it to inject restart diversity without shrinking the search box. it to inject restart diversity without shrinking the search box.
[0.3.0]: https://github.com/swaits/heuropt/releases/tag/v0.3.0 [0.3.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.3.0
## [0.2.0] — 2026-05-05 ## [0.2.0] — 2026-05-05
@@ -688,7 +688,7 @@ benchmark problems. No breaking changes to the v0.1.0 public API.
- `benchmarks` — canonical reference runs of NSGA-II on ZDT1 and DE on - `benchmarks` — canonical reference runs of NSGA-II on ZDT1 and DE on
Rastrigin. Rastrigin.
- `jiggly_tuning` — real-world 4-objective NSGA-III firmware tuning - `jiggly_tuning` — real-world 4-objective NSGA-III firmware tuning
for the [`jiggly`](https://github.com/swaits/jiggly) USB-mouse-jiggler, for the [`jiggly`](https://git.swaits.com/swaits/jiggly) USB-mouse-jiggler,
with an a-posteriori weighted-decision step that picks one with an a-posteriori weighted-decision step that picks one
recommendation off the Pareto front. recommendation off the Pareto front.
@@ -714,7 +714,7 @@ benchmark problems. No breaking changes to the v0.1.0 public API.
`Problem` / decision type without exotic interior mutability already `Problem` / decision type without exotic interior mutability already
satisfies these. satisfies these.
[0.2.0]: https://github.com/swaits/heuropt/releases/tag/v0.2.0 [0.2.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.2.0
## [0.1.0] — 2026-05-04 ## [0.1.0] — 2026-05-04
@@ -772,7 +772,7 @@ Initial release.
algorithm on ZDT1 (2-obj), DTLZ2 (3-obj), and Rastrigin (single-obj), algorithm on ZDT1 (2-obj), DTLZ2 (3-obj), and Rastrigin (single-obj),
reporting hypervolume, spacing, mean L2, front size, and wall time. reporting hypervolume, spacing, mean L2, front size, and wall time.
- `jiggly_tuning` — 4-objective NSGA-III tuning of the - `jiggly_tuning` — 4-objective NSGA-III tuning of the
[`jiggly`](https://github.com/swaits/jiggly) USB-mouse-jiggler firmware [`jiggly`](https://git.swaits.com/swaits/jiggly) USB-mouse-jiggler firmware
with an a-posteriori weighted-decision step that picks one with an a-posteriori weighted-decision step that picks one
recommendation off the Pareto front. recommendation off the Pareto front.
@@ -783,5 +783,5 @@ Initial release.
`RandomSearch`, `Nsga2`, and `DifferentialEvolution`. Seeded runs stay `RandomSearch`, `Nsga2`, and `DifferentialEvolution`. Seeded runs stay
bit-identical to serial mode. bit-identical to serial mode.
[Unreleased]: https://github.com/swaits/heuropt/compare/v0.10.0...HEAD [Unreleased]: https://git.swaits.com/swaits/heuropt/compare/v0.10.0...main
[0.1.0]: https://github.com/swaits/heuropt/releases/tag/v0.1.0 [0.1.0]: https://git.swaits.com/swaits/heuropt/releases/tag/v0.1.0
+3 -3
View File
@@ -1,14 +1,14 @@
[package] [package]
name = "heuropt" name = "heuropt"
version = "0.11.0" version = "0.11.1"
edition = "2024" edition = "2024"
rust-version = "1.85" rust-version = "1.85"
authors = ["Stephen Waits <steve@waits.net>"] authors = ["Stephen Waits <steve@waits.net>"]
description = "A practical Rust toolkit for heuristic single-, multi-, and many-objective optimization." description = "A practical Rust toolkit for heuristic single-, multi-, and many-objective optimization."
license = "MIT" license = "MIT"
readme = "README.md" readme = "README.md"
repository = "https://github.com/swaits/heuropt" repository = "https://git.swaits.com/swaits/heuropt"
homepage = "https://github.com/swaits/heuropt" homepage = "https://git.swaits.com/swaits/heuropt"
documentation = "https://docs.rs/heuropt" documentation = "https://docs.rs/heuropt"
keywords = ["optimization", "evolutionary", "nsga", "pareto", "moead"] keywords = ["optimization", "evolutionary", "nsga", "pareto", "moead"]
categories = ["algorithms", "science", "mathematics", "simulation"] categories = ["algorithms", "science", "mathematics", "simulation"]
+1 -1
View File
@@ -4,7 +4,7 @@
[![Documentation](https://docs.rs/heuropt/badge.svg)](https://docs.rs/heuropt) [![Documentation](https://docs.rs/heuropt/badge.svg)](https://docs.rs/heuropt)
[![Book](https://img.shields.io/badge/book-online-blue.svg)](https://swaits.github.io/heuropt/) [![Book](https://img.shields.io/badge/book-online-blue.svg)](https://swaits.github.io/heuropt/)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![CI](https://github.com/swaits/heuropt/actions/workflows/ci.yml/badge.svg)](https://github.com/swaits/heuropt/actions/workflows/ci.yml) [![CI](https://git.swaits.com/swaits/heuropt/actions/workflows/ci.yml/badge.svg)](https://git.swaits.com/swaits/heuropt/actions?workflow=ci.yml)
**A practical Rust toolkit for heuristic optimization.** Single-objective. **A practical Rust toolkit for heuristic optimization.** Single-objective.
Multi-objective. Many-objective. 33 algorithms — every one of them with a Multi-objective. Many-objective. 33 algorithms — every one of them with a
+5 -4
View File
@@ -17,14 +17,15 @@ minor versions.
## Reporting a vulnerability ## Reporting a vulnerability
Please **do not** open a public GitHub issue for a security bug. Please **do not** open a public issue for a security bug.
Instead use one of these channels: Instead:
- GitHub's [private vulnerability reporting](https://github.com/swaits/heuropt/security/advisories/new)
on the repository.
- Email **steve@waits.net** with subject line `[heuropt security] - Email **steve@waits.net** with subject line `[heuropt security]
<short summary>`. <short summary>`.
(This project is hosted on [git.swaits.com](https://git.swaits.com/swaits/heuropt),
which has no private-advisory feature, so email is the reporting channel.)
Please include: Please include:
1. A description of the vulnerability and the affected versions. 1. A description of the vulnerability and the affected versions.
+1 -2
View File
@@ -42,7 +42,6 @@ library_benchmark_group!(
// (`Ir`) only, so callgrind's cache simulation is pure overhead here — // (`Ir`) only, so callgrind's cache simulation is pure overhead here —
// disabling it roughly halves each profiling run. // disabling it roughly halves each profiling run.
main!( main!(
config = LibraryBenchmarkConfig::default() config = LibraryBenchmarkConfig::default().tool(Callgrind::with_args(["--cache-sim=no"])),
.tool(Callgrind::with_args(["--cache-sim=no"])),
library_benchmark_groups = compare_group library_benchmark_groups = compare_group
); );
+2 -2
View File
@@ -12,8 +12,8 @@ create-missing = false
[output.html] [output.html]
default-theme = "rust" default-theme = "rust"
preferred-dark-theme = "navy" preferred-dark-theme = "navy"
git-repository-url = "https://github.com/swaits/heuropt" git-repository-url = "https://git.swaits.com/swaits/heuropt"
edit-url-template = "https://github.com/swaits/heuropt/edit/main/docs/book/{path}" edit-url-template = "https://git.swaits.com/swaits/heuropt/_edit/main/docs/book/{path}"
site-url = "/heuropt/" site-url = "/heuropt/"
no-section-label = true no-section-label = true
+2 -2
View File
@@ -89,7 +89,7 @@ are heavily optimized — see the perf entry in the v0.4.0 CHANGELOG.
On the comparison harness in `examples/compare.rs` (10-seed mean, On the comparison harness in `examples/compare.rs` (10-seed mean,
30 000 evaluations on DTLZ2), the total wall-clock time across 12 30 000 evaluations on DTLZ2), the total wall-clock time across 12
algorithms is ~5 seconds. Per-algorithm timings are in algorithms is ~5 seconds. Per-algorithm timings are in
[`examples/compare-results.md`](https://github.com/swaits/heuropt/blob/main/examples/compare-results.md). [`examples/compare-results.md`](https://git.swaits.com/swaits/heuropt/src/branch/main/examples/compare-results.md).
For comparison-shopping speed against Python libraries, the gap is For comparison-shopping speed against Python libraries, the gap is
typically 10×–100× in heuropt's favor for compute-bound typically 10×–100× in heuropt's favor for compute-bound
@@ -106,4 +106,4 @@ Hyperband+BO hybrids, distributed runners). heuropt is younger; the
core is solid but the ecosystem is small. core is solid but the ecosystem is small.
If you adopt heuropt and miss a thing, the project is small enough If you adopt heuropt and miss a thing, the project is small enough
that contributions land fast. See [CONTRIBUTING.md](https://github.com/swaits/heuropt/blob/main/CONTRIBUTING.md). that contributions land fast. See [CONTRIBUTING.md](https://git.swaits.com/swaits/heuropt/src/branch/main/CONTRIBUTING.md).
+1 -1
View File
@@ -444,4 +444,4 @@ let neighbors = |x: &Vec<usize>, _rng: &mut Rng| -> Vec<Vec<usize>> {
[`InsertionMutation`]: https://docs.rs/heuropt/latest/heuropt/operators/struct.InsertionMutation.html [`InsertionMutation`]: https://docs.rs/heuropt/latest/heuropt/operators/struct.InsertionMutation.html
[`ScrambleMutation`]: https://docs.rs/heuropt/latest/heuropt/operators/struct.ScrambleMutation.html [`ScrambleMutation`]: https://docs.rs/heuropt/latest/heuropt/operators/struct.ScrambleMutation.html
[`CompositeVariation`]: https://docs.rs/heuropt/latest/heuropt/operators/struct.CompositeVariation.html [`CompositeVariation`]: https://docs.rs/heuropt/latest/heuropt/operators/struct.CompositeVariation.html
[CompareExample]: https://github.com/swaits/heuropt/blob/main/examples/tsp_operators_compare.rs [CompareExample]: https://git.swaits.com/swaits/heuropt/src/branch/main/examples/tsp_operators_compare.rs
+1 -1
View File
@@ -35,7 +35,7 @@ hyperopt, optuna, DEAP). heuropt's design priorities:
outputs. outputs.
3. **Algorithms that work.** Every algorithm is benchmarked against 3. **Algorithms that work.** Every algorithm is benchmarked against
the canonical test problems (ZDT, DTLZ, Rastrigin, Rosenbrock, the canonical test problems (ZDT, DTLZ, Rastrigin, Rosenbrock,
Ackley) and the results are checked into [examples/compare-results.md](https://github.com/swaits/heuropt/blob/main/examples/compare-results.md) Ackley) and the results are checked into [examples/compare-results.md](https://git.swaits.com/swaits/heuropt/src/branch/main/examples/compare-results.md)
so you can see what each algorithm's strengths actually are. so you can see what each algorithm's strengths actually are.
4. **Testing as a first-class concern.** 316+ unit / integration / 4. **Testing as a first-class concern.** 316+ unit / integration /
property tests, eight cargo-fuzz targets in CI, gungraun property tests, eight cargo-fuzz targets in CI, gungraun
+1 -1
View File
@@ -89,7 +89,7 @@ breaking API change.
- **Migration guides** — per-release, in this book at - **Migration guides** — per-release, in this book at
[migration](./migration.md). [migration](./migration.md).
- **GitHub releases** — each tag has release notes. - **GitHub releases** — each tag has release notes.
- **Watch the repo** — https://github.com/swaits/heuropt — to be - **Watch the repo** — https://git.swaits.com/swaits/heuropt — to be
notified of new releases. notified of new releases.
[`heuropt::prelude`]: https://docs.rs/heuropt/latest/heuropt/prelude/index.html [`heuropt::prelude`]: https://docs.rs/heuropt/latest/heuropt/prelude/index.html