Prior art¶
atune is not the first hyperparameter optimiser, and most of what it does was done first by somebody else. This page records where each capability lives in the tools it is comparable to.
It is a table of citations, not a scoreboard. There is no total, no gap column and no recommendation, because which capabilities matter depends entirely on what you are tuning. Each cell names the symbol, module or facility that provides the capability in that tool — so a cell is the evidence, and you can check it.
How the table was built¶
Every cell outside the rustuna column was checked on 2026-07-30 against a local checkout of the tool's own source, by reading the file that defines the symbol named in the cell. The version is whatever that checkout reports about itself:
| Tool | Version checked | Where the version came from |
|---|---|---|
| Optuna | 5.0.0.dev |
optuna/version.py in a checkout of the development branch |
| Syne Tune | 0.15.0 |
the syne_tune/version file |
| SMAC3 | 2.4.0 |
smac/__init__.py |
optimizer (Rust) |
1.0.1 |
its Cargo.toml |
| rustuna (Rust) | commit aa68144, untagged |
git rev-parse in the checkout; see below |
| atune | 0.1.0, unreleased |
this repository |
"none found" is a statement about that search, not about the tool. It means the capability was not located in that version's source under any name looked for. A tool may provide it through a plugin, an example, or a name the search missed; if you know of one, the page's edit link is at the top right.
The declared bounds that grow during the study row was checked on
2026-08-25, against the same four checkouts. The nearest thing found anywhere was a
commented-out trust-region experiment in SMAC3's smac/main/old/ — a local
subspace that moves inside the declared box, never a declared bound that
moves outward.
The rustuna column was checked on 2026-10-11 against commit
aa681448f722407915b1fb979bb79fbee818296d on rustuna's main branch, committed
2026-10-05, and every cell in it links the file at that commit. The commit is
not a release: git tag --contains aa68144 prints nothing. At that commit the
workspace Cargo.toml declares 0.1.0-dev and the Python
package's pyproject.toml declares
0.2.0.dev. The python-v0.1.1 tag, whose pyproject.toml declares 0.1.1,
sits on the separate release-python-v0.1.1 branch, which left main at
d7ac17c; aa68144 is ten commits past that point on main and does not
descend from the tag. So the column describes main shortly after the 0.1.1
Python release, not the release itself.
The Optuna row is worth one caveat: the checkout is a development snapshot, which
is why its version string is a .dev. The Optuna arm on
Benchmarks is the released 4.9.0, a different thing measured for
a different purpose.
The matrix¶
| Capability | Optuna 5.0.0.dev | Syne Tune 0.15.0 | SMAC3 2.4.0 | optimizer 1.0.1 |
rustuna aa68144 |
atune 0.1.0 |
|---|---|---|---|---|---|---|
| Core in a compiled language | Python package | Python package | Python package | Rust crate | Rust crates | Rust crate |
| Space as a declarative object, separate from the objective | optuna.distributions (per parameter) |
syne_tune.config_space |
ConfigSpace |
Parameter trait |
Distribution (per parameter) |
SpaceSchema, TOML [space] |
| Space derived from the program's own config type | none found | none found | none found | #[derive(Categorical)] (enum choices only) |
none found (no proc-macro crate among the workspace members) | #[derive(Space)] |
| Suggest a parameter inside the objective (define-by-run) | Trial.suggest_float |
none found | none found | Trial::suggest_param |
Trial::suggest_float |
TrialCtx::suggest_f64 |
| Successive halving / Hyperband | SuccessiveHalvingPruner, HyperbandPruner |
AsynchronousSuccessiveHalving |
smac.intensifier.hyperband |
pruner/successive_halving.rs |
none found (trial.rs: "does not currently provide pruner support") |
AshaPruner, HyperbandPruner |
| Pause, resume and fork a running trial | none found | PopulationBasedTraining |
none found | none found | none found (no scheduler module in rustuna_core) |
Pbt, FreezeThaw |
| DEHB | none found | none found in the package (named in its docs) | none found | none found | none found (rustuna_sampler has nsgaii, qmc, tpe) |
Dehb |
| Several seeds per configuration, aggregated | none found | none found | n_seeds (multi-fidelity facade) |
none found | none found (no seed protocol on Study) |
SeedProtocol |
| A held-out seed set used only after the search | none found | none found | none found | none found | none found (no seed protocol on Study) |
SeedProtocol::with_test_seeds |
| Append-only journal storage | JournalStorage |
none found | none found | JournalStorage |
JournalStorage |
JournalStorage |
| Ask/tell from a shell, for a program in any language | optuna ask, optuna tell |
none found | none found | none found | none found (library Study::ask and Study::tell; no binary target, no [project.scripts] in pyproject.toml) |
atune ask, atune tell |
| Hyperparameter importance | PedAnovaImportanceEvaluator |
none found | none found | optimizer::fanova |
PedAnovaImportanceEvaluator |
param_importances |
| Multi-objective optimisation | NSGAIISampler |
optimizer/schedulers/multiobjective |
smac.multi_objective |
multi_objective.rs |
NsgaiiSampler |
Nsga2 |
| Tuning inside a single training run | none found | none found | none found | none found | none found (no such API on Study) |
OnlineTuner |
| Declared bounds that grow during the study | none found | none found | none found | none found | none found (Distribution bounds are fixed low/high) |
Open, suggest_open_f64 |
| Core builds for a browser target | none found | none found | none found | none found | rustuna_js: wasm32-unknown-unknown, wasm-bindgen --target web; CI job on pull requests touching rustuna_js/ or rustuna_core/src/ |
wasm32-unknown-unknown, gated on every change |
What is not in the table, and why¶
The selection rule is: a general-purpose hyperparameter optimiser of comparable scope, with a source checkout available to cite from. Tools that fail the second half are absent, however relevant they are:
- Ray Tune is the most significant absence: it is the tool whose separation of a scheduler from a searcher atune's own seam is modelled on. There was no checkout on this machine to read, and a row of unchecked cells is worse than no row at all.
- Ax/BoTorch, nevergrad, hyperopt, Vizier, NePS, HEBO each cover part of the surface — acquisition functions, gradient-free algorithm zoos, service architecture, prior-guided multi-fidelity — rather than the whole framework shape this table is about.
- goptuna is an Optuna port in Go, and a second static-language data point, but a port's capability set mostly restates the original's. rustuna is also an Optuna reimplementation, and is in the table anyway: its core is Rust, the language atune's is written in, and it implements a chosen subset of Optuna (no pruners, for one), so its column differs from Optuna's.
- Managed services (Weights & Biases sweeps, Katib, Determined) are not libraries; the comparison would be about operating models, not capabilities.
What atune took from which¶
Attribution, since the table above does not carry it:
- Optuna supplies the storage contract atune's own backends implement: race-safe trial numbering, immutable finished trials, workers coordinating only through storage, and an append-only journal with periodic snapshots. Its relative/independent sampling split is also why a model-based sampler can survive a define-by-run space at all. atune reads and writes Optuna's journal format for exactly this reason — see Optuna interop.
- Ray Tune supplies the idea that a scheduler and a searcher are different objects, and that a scheduler may pause, resume and mutate a trial rather than only stopping it.
- SMAC3 supplies, through ConfigSpace, the model of the search space as a
serialisable object separate from the objective — which is how atune's
SpaceSchemaand TOML[space]overlay are shaped. ConfigSpace's schema-level conditionals were read and deliberately not adopted: atune keeps conditional structure as control flow inside a define-by-run objective (search spaces states the trade). - Syne Tune was the scheduler reading list: the breadth of its zoo is what told atune which schedulers were worth implementing.
optimizeris the Rust framework atune's seams were designed against, and the source of several negative lessons — parameters keyed by construction order rather than by name, and a per-parameter sampler API that cannot express joint sampling or return an error.- kurobako, Optuna's own benchmark harness, is used rather than reimplemented; it is what drives Benchmarks.
Where to go next¶
| If you want to | Go to |
|---|---|
| What atune does that is unusual, stated as capability | Why atune |
| Measurements against Optuna, with reproduction commands | Benchmarks |
| Why the RL-oriented features exist | RL evidence |
| To move an existing Optuna study across | Optuna interop |
| The capabilities themselves, in one list | Catalog |