Native Rust GTOP benchmark results
This report collects the recorded GTOP tables in one Markdown document. All
three tests use relaxed stopping values of approximately
1.005 * absolute_best for positive objectives and the corresponding 0.5%
relaxation toward zero for negative objectives. The raw TSV files preserve
every individual experiment.
The problem definitions and putative best solutions originate from ESA’s Global Trajectory Optimisation Problems database. The unusually difficult Tandem case is documented separately on ESA’s TandEM problem page, including its 18-variable box bounds and selectable fly-by sequences.
Coordinated retry
Messenger Full remains excluded because its full 100-run measurement is too expensive for this test. Tandem was measured separately with the same configuration and is included here.
| Problem | Runs | Absolute best | Stop value | Success rate | Mean optimum | Sdev optimum | Mean evaluations | Mean wall time | Wall-time sdev |
|---|---|---|---|---|---|---|---|---|---|
| Cassini1 | 100 | 4.9307 | 4.95535 | 100% | 4.939523 | 0.007950 | 1,525,802 | 0.25 s | 0.12 s |
| Cassini2 | 100 | 8.383 | 8.42491 | 100% | 8.411108 | 0.010416 | 19,890,045 | 4.16 s | 2.26 s |
| Gtoc1 | 100 | -1581950 | -1574080 | 100% | -1578336.739669 | 2457.727903 | 14,729,200 | 3.33 s | 2.87 s |
| Messenger | 100 | 8.6299 | 8.673 | 100% | 8.658779 | 0.008303 | 19,603,567 | 3.36 s | 1.83 s |
| Rosetta | 100 | 1.3433 | 1.35 | 100% | 1.347849 | 0.001672 | 21,406,666 | 4.58 s | 1.73 s |
| Tandem | 100 | -1500.46 | -1493 | 85% | -1488.503885 | 21.850556 | 230,727,025 | 40.21 s | 39.11 s |
| Sagas | 100 | 18.188 | 18.279 | 100% | 18.199375 | 0.020433 | 8,978,824 | 0.90 s | 0.95 s |
Raw data: benchmark_gtop_100_raw.tsv and
benchmark_gtop_tandem_100_raw.tsv.
The separate
benchmark_gtop_tandem_100_metadata.json
records the slow-run configuration and total invocation time.
Configuration:
- 32 native retry threads and 100 independent experiments per problem
- 1,500 initial evaluations per retry
- advanced maximum evaluation factor 50
- diversity checkpoint interval 100 retries
- optimizer sequence: 40% Differential Evolution, then 60% active CMA-ES
- per-problem retry caps and value limits from
examples/src/benchmark_gtop.rs
The coordinated test has an adaptive budget, not the 240,000-evaluation
allowance used by the basic-retry and external-library comparison. A retry’s
limit grows linearly from 1,500 to 75,000 evaluations as the run ID approaches
the per-problem retry cap. The ramp’s mean is 38,250 evaluations, so each exact
theoretical ceiling is 38,250 × retry cap. The actual recorded means are:
| Problem | Retry cap | Exact configured ceiling | Mean actual evaluations | Actual range |
|---|---|---|---|---|
| Cassini1 | 4,000 | 153,000,000 | 1,525,802 | 369,151–4,664,857 |
| Cassini2 | 6,000 | 229,500,000 | 19,890,045 | 5,219,854–54,945,340 |
| Gtoc1 | 10,000 | 382,500,000 | 14,729,200 | 1,339,960–71,104,757 |
| Messenger | 8,000 | 306,000,000 | 19,603,567 | 3,592,572–66,816,828 |
| Rosetta | 4,000 | 153,000,000 | 21,406,666 | 6,733,813–43,991,489 |
| Tandem | 20,000 | 765,000,000 | 230,727,025 | 6,962,364–707,799,769 |
| Sagas | 4,000 | 153,000,000 | 8,978,824 | 1,190,960–56,583,789 |
Every run consumed less than its theoretical ceiling. The 15 Tandem failures are included in its mean and sdev. Across all 100 Tandem runs, the mean final optimum was -1488.503885 (population sdev 21.850556); the best was -1500.468716.
The original Python/C++ fcmaes Performance report records 81% Tandem success, 166.92 s mean wall time, and 147.87 s wall-time sdev on the same AMD 9950X class of CPU with 32 parallel Python processes. The native Rust run records 85%, 40.21 s, and 39.11 s with 32 native retry threads. The close success rates are consistent with the implementations using the same adaptive search policy; the wall times also reflect their different process and thread execution models.
The substantially larger actual budgets explain why coordinated retry has much better success rates than the 240,000-evaluation comparison. This table is a quality reference, not an equal-budget speed comparison.
BiteOpt basic retry
This benchmark includes Tandem, excludes Messenger Full, and uses 24 independent BiteOpt retries of at most 10,000 evaluations on 24 native worker threads for every experiment.
| Problem | Runs | Absolute best | Stop value | Success rate | Mean optimum | Sdev optimum | Mean evaluations | Mean wall time | Wall-time sdev |
|---|---|---|---|---|---|---|---|---|---|
| Cassini1 | 100 | 4.9307 | 4.95535 | 57% | 5.094738 | 0.180157 | 236,597 | 0.05 s | 0.00 s |
| Cassini2 | 100 | 8.383 | 8.42491 | 0% | 13.778437 | 2.559722 | 240,000 | 0.07 s | 0.00 s |
| Gtoc1 | 100 | -1581950 | -1574080 | 0% | -1103593.281024 | 142070.428562 | 240,000 | 0.08 s | 0.00 s |
| Messenger | 100 | 8.6299 | 8.673 | 0% | 11.896085 | 0.930384 | 240,000 | 0.06 s | 0.00 s |
| Rosetta | 100 | 1.3433 | 1.35 | 0% | 4.358705 | 1.120562 | 240,000 | 0.07 s | 0.00 s |
| Tandem | 100 | -1500.46 | -1493 | 0% | -419.987695 | 168.414195 | 240,000 | 0.07 s | 0.00 s |
| Sagas | 100 | 18.188 | 18.279 | 2% | 83.081492 | 52.445301 | 239,913 | 0.03 s | 0.00 s |
Raw data:
benchmark_biteopt_gtop_rust_100_raw.tsv.
DE→CMA basic retry
This test has the same 100 experiments, 24 workers, 24 retries, and 10,000 evaluations per retry as the BiteOpt test. Each retry assigns 4,000 evaluations to Differential Evolution and 6,000 to active CMA-ES.
| Problem | Runs | Absolute best | Stop value | Success rate | Mean optimum | Sdev optimum | Mean evaluations | Mean wall time | Wall-time sdev |
|---|---|---|---|---|---|---|---|---|---|
| Cassini1 | 100 | 4.9307 | 4.95535 | 22% | 5.343353 | 0.889715 | 238,227 | 0.05 s | 0.00 s |
| Cassini2 | 100 | 8.383 | 8.42491 | 0% | 13.324033 | 2.034216 | 240,153 | 0.07 s | 0.00 s |
| Gtoc1 | 100 | -1581950 | -1574080 | 0% | -1102350.655440 | 143746.821645 | 239,224 | 0.07 s | 0.00 s |
| Messenger | 100 | 8.6299 | 8.673 | 0% | 11.042875 | 0.750887 | 240,574 | 0.05 s | 0.00 s |
| Rosetta | 100 | 1.3433 | 1.35 | 0% | 2.705204 | 0.846640 | 240,729 | 0.07 s | 0.00 s |
| Tandem | 100 | -1500.46 | -1493 | 0% | -490.089599 | 181.284594 | 240,755 | 0.06 s | 0.00 s |
| Sagas | 100 | 18.188 | 18.279 | 0% | 111.796178 | 68.411041 | 227,294 | 0.03 s | 0.00 s |
The 240,000 value is the requested budget. DE and CMA-ES complete their current population batch, so mean actual work can exceed it slightly; the largest mean overshoot above is 755 evaluations (0.31%). Values below the request reflect early target stops or optimizer termination; the success column distinguishes target attainment.
Raw data:
benchmark_de_cma_gtop_rust_100_raw.tsv.
External CMA-ES through generic retry
The dependency-isolated
GTOP CMA-ES retry experiment adds an external
single-threaded optimizer to this benchmark family. Its primary comparison
gives one serial CMA-ES restart lane and 16 lanes coordinated through
fcmaes_core::retry the same four-second wall allowance. Protective CMA-ES
terminations trigger immediate deterministic restarts, so both arms consume
the allowance rather than silently returning early. Across 100 paired seeds,
best-objective mean/sdev and paired retry wins are the main outcomes; measured
wall mean/sdev audits fairness.
The retry arm deliberately spends more aggregate CPU during the same user wait. That is the practical value being measured: converting the otherwise idle physical cores of a modern processor into a better solution distribution. The coordinated DE→CMA table above remains the full fcmaes system-level reference because it intentionally uses adaptive budgets and search coordination.
In the 100-pair equal-wall result, retry improves the objective mean on all seven non-Messenger-Full cases and wins 86–96 paired runs. It reduces objective sdev on five cases; SAGAS and Tandem instead have better means but larger spreads. Cassini1 target success improves from 38/100 to 100/100. Both arms remain at 0/100 target success on the other six cases, so the result is not presented as a four-second solution of the GTOP suite. Serial and retry wall means stay within 4.000109–4.000523 s, while measured active cores are approximately 1 and 16.
The paired win count is mainly a scheduler check. The retry arm completed 14.75–15.00 times as many independent starts; under iid restarts with no information sharing, that ratio predicts a 93.7%–93.8% win probability. The observed win/tie/loss counts are consistent with that null. The mean and sdev columns quantify the more informative change in the returned distribution.
The original SAGAS block found a physically impossible negative time-to-50-AU value. A nonnegative travel-time guard was added to the port and the complete SAGAS block was repeated with the same seeds. The final bundle links the correction provenance and uses only the corrected rows.
The secondary five-pair scaling pilot uses 40 retries of 2,000 evaluations and reaches 11.18×–12.23× mean fixed-work speedup at 16 workers across Cassini1, Rosetta, and Tandem. Every one of the 60 worker-count pairs passes the same-work audit. These runs deliberately do not reach the GTOP targets; they demonstrate multicore scheduling, not optimizer quality. It is not the main result.
Statistics and environment
Means and standard deviations include every experiment, including failures.
Standard deviations use the population definition (ddof=0), matching NumPy’s
default.
- CPU: AMD Ryzen 9 9950X, 16 physical cores / 32 logical CPUs
- Compiler: rustc 1.93.0 for the original six-problem run and rustc 1.97.1 for the later Tandem run; Cargo release profile
- OS: Linux 6.8.0-136-generic x86_64
- Date: 2026-07-22 for the original run; 2026-07-23 for Tandem
Rust workers are native threads. Each top-level experiment is run sequentially and has exclusive use of its configured retry workers.
Reproduce
From the repository root:
cargo run --release -p fcmaes-examples --bin benchmark-gtop -- \
--runs 100 --workers 32 --seed 1 \
--raw-output benchmarks/benchmark_gtop_100_raw.tsv
python3 benchmarks/run_coordinated_tandem.py
cargo run --release -p fcmaes-examples --bin benchmark-biteopt-gtop -- \
--algo biteopt --runs 100 --workers 24 --retries 24 \
--evaluations 10000 --seed 1 \
--raw-output benchmarks/benchmark_biteopt_gtop_rust_100_raw.tsv
cargo run --release -p fcmaes-examples --bin benchmark-biteopt-gtop -- \
--algo de_cma --runs 100 --workers 24 --retries 24 \
--evaluations 10000 --seed 1 \
--raw-output benchmarks/benchmark_de_cma_gtop_rust_100_raw.tsv
Each binary prints the corresponding Markdown table. --table-output PATH can
also write that table to a chosen .md file. The Tandem driver records each
experiment in a resumable shard before combining the final raw file. For
coordinated retry, --include-slow adds Tandem and Messenger Full;
--problem NAME runs one case explicitly.