Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Surrogate validation: delivered M0 versus reviewed build

Generated by scripts/surrogate/analyze.py from examples/benchmark.rs and examples/overhead.rs outputs. M0 is the delivered code (4dd693b); now is the reviewed build: bounded L-BFGS MAP fit with analytic gradients, packed row-major Cholesky, a trust region for two of three proposals and nugget 1e-10 (M0: 1e-8). The comparison with other libraries is in benchmarks/surrogate-comparison. Host: x86_64 Linux, 2 usable CPUs, rustc 1.97.0 (2d8144b78 2026-07-07). Timings come from a shared host and are observations, not portable guarantees.

Proposal overhead

examples/overhead.rs: one propose call on a Levy-like objective over an LHS history of n points in d dimensions, default configuration, median of three seeds. Fit is a round with a fresh MAP fit (two restarts) plus the acquisition for q points; carried reuses the hyperparameters (no fit). NLP is the fitted negative log posterior (lower is better). Times are the minimum over alternating M0/now repetitions where several were recorded.

1 installed thread

dnqfit ms M0fit ms nowspeedupcarried ms M0carried ms nowspeedupNLP M0NLP now
23212.31.21.9x0.80.71.2x14.52114.505
23287.95.81.4x6.35.31.2x14.52114.505
2128139.015.92.5x6.13.81.6x-179.478-179.594
2128861.538.71.6x33.825.51.3x-179.478-179.594
22481148.379.41.9x14.610.21.4x-589.062-589.289
22488224.0151.31.5x96.872.31.3x-589.062-589.289
53214.82.02.5x1.01.11.0x35.68435.673
532812.19.41.3x8.48.31.0x35.68435.673
5128181.218.64.4x9.24.91.9x99.69099.612
51288130.852.92.5x54.838.91.4x99.69099.612
52481413.6115.13.6x21.915.11.5x130.133130.020
52488525.4209.82.5x152.8108.71.4x130.133130.020
1032112.13.23.7x2.01.91.0x49.14849.046
1032827.315.61.8x16.816.31.0x49.14849.046
101281197.833.06.0x14.89.01.6x152.486152.304
101288288.591.83.1x92.266.41.4x152.486152.304
102481896.0187.74.8x33.123.51.4x250.468250.048
1024881164.4345.43.4x265.1196.91.3x250.468250.048
2032131.55.16.2x4.23.71.1x70.05469.995
2032869.332.42.1x40.530.51.3x70.05469.995
201281545.262.18.8x30.617.21.8x168.387167.740
201288703.5186.53.8x198.2139.01.4x168.387167.740
2024812289.9299.47.6x64.646.61.4x302.929301.935
2024882636.8631.44.2x524.3357.01.5x302.929301.935
3232167.99.47.2x8.97.91.1x90.64090.312
32328137.565.82.1x77.764.31.2x90.64090.312
3212811151.790.812.7x55.633.41.7x177.059175.827
3212881530.2347.44.4x384.5281.51.4x177.059175.827
3224814592.3498.49.2x111.586.61.3x243.343241.918
3224885572.41087.95.1x963.6664.51.5x243.343241.918

The current fit reaches an equal or lower NLP in 46 of 50 configurations (all sizes, including those not shown).

2 installed threads

dnqfit ms M0fit ms nowspeedupcarried ms M0carried ms nowspeedupNLP M0NLP now
23211.71.01.6x0.60.61.0x14.52114.505
23285.64.11.4x4.33.81.1x14.52114.505
2128122.59.32.4x4.42.31.9x-179.478-179.594
2128844.125.41.7x19.714.61.3x-179.478-179.594
2248185.047.21.8x8.76.51.3x-589.062-589.289
22488140.297.81.4x68.044.41.5x-589.062-589.289
53213.61.23.0x0.90.71.2x35.68435.673
53289.95.91.7x6.15.21.2x35.68435.673
5128144.112.43.6x5.33.81.4x99.69099.612
5128870.531.22.3x32.021.81.5x99.69099.612
52481235.558.74.0x14.110.01.4x130.133130.020
52488261.2124.32.1x86.666.21.3x130.133130.020
103217.32.72.7x1.51.41.1x49.14849.046
1032820.410.71.9x9.69.11.1x49.14849.046
101281109.724.84.4x8.26.51.2x152.486152.304
101288146.251.32.8x51.537.41.4x152.486152.304
102481445.6100.84.4x20.113.81.5x250.468250.048
102488628.0192.33.3x154.9103.21.5x250.468250.048
2032116.04.04.0x2.52.70.9x70.05469.995
2032836.221.01.7x21.318.51.2x70.05469.995
201281266.539.36.8x16.311.31.4x168.387167.740
201288361.9116.03.1x112.5100.41.1x168.387167.740
2024811213.2201.76.0x42.629.21.5x302.929301.935
2024881510.4370.54.1x329.6227.61.4x302.929301.935
3232137.26.45.9x5.24.61.1x90.64090.312
3232888.339.62.2x45.040.91.1x90.64090.312
321281624.955.511.3x30.022.91.3x177.059175.827
321288811.2198.54.1x225.7164.11.4x177.059175.827
3224812645.2270.89.8x84.050.61.7x243.343241.918
3224883005.1585.85.1x565.7385.21.5x243.343241.918

The current fit reaches an equal or lower NLP in 46 of 50 configurations (all sizes, including those not shown).

Quality, branin, hartmann3

5 seeds, batch size 4, 2 installed threads; branin 48 calls, hartmann3 48 calls. All methods share the eight-point centre/LHS start. Simple regret = best found minus known minimum (lower is better). Proposal seconds are the GP’s total time in propose per run.

ProblemMethodMedian regretMean regretMedian regret M0Mean regret M0Seeds where now < M0Proposal s/runProposal s/run M0
braningp3.52e-071.239e-065.739e-068.957e-064 of 50.0220.021
braninrandom0.64370.7301
branincmaes0.19620.3342
braninbiteopt0.11080.5061
hartmann3gp2.487e-073.628e-077.698e-061.466e-055 of 50.0230.028
hartmann3random0.46820.4605
hartmann3cmaes0.13810.1433
hartmann3biteopt0.016680.07834

Quality, hartmann6, styblinski10

20 seeds, batch size 4, 2 installed threads; hartmann6 96 calls, styblinski10 128 calls. All methods share the eight-point centre/LHS start. Simple regret = best found minus known minimum (lower is better). Proposal seconds are the GP’s total time in propose per run.

ProblemMethodMedian regretMean regretMedian regret M0Mean regret M0Seeds where now < M0Proposal s/runProposal s/run M0
hartmann6gp1.056e-060.035779.68e-050.045420 of 200.1370.179
hartmann6random1.2721.282
hartmann6cmaes0.41470.4761
hartmann6biteopt0.43470.5825
styblinski10gp57.1462.5587.8586.9515 of 200.3650.726
styblinski10random153.1150.1
styblinski10cmaes128.3123.8
styblinski10biteopt35.9152.49

Quality, oscillator

20 seeds, batch size 4, 2 installed threads; oscillator 32 calls. All methods share the eight-point centre/LHS start. Simple regret = best found minus known minimum (lower is better). Proposal seconds are the GP’s total time in propose per run.

ProblemMethodMedian regretMean regretMedian regret M0Mean regret M0Seeds where now < M0Proposal s/runProposal s/run M0
oscillatorgp5.518e-078.772e-061.981e-065.025e-0613 of 200.0090.008
oscillatorrandom0.0057490.009219
oscillatorcmaes0.0018430.006996
oscillatorbiteopt0.0053040.006558

Baseline methods are unchanged code: all 210 paired random/CMA-ES/BiteOpt histories are identical between the two builds.

Thread-count determinism

  • new medium: all 160 runs have identical observation histories on 1, 2 installed threads.
  • new oscillator: all 80 runs have identical observation histories on 1, 2 installed threads.
  • new small: all 40 runs have identical observation histories on 1, 2, 8 installed threads.

Scope

Small deterministic test functions with known minima (the oscillator is the tutorial’s RK4 calibration), not the expensive Rust simulations the profile targets. Per-seed counts, no significance tests. The equal-budget comparison with BoTorch, egobox, scikit-optimize and Optuna is in benchmarks/surrogate-comparison.