Stability Boundary After Backtracking (Sweep v2)#
hard_regime_boundary_sweep.md mapped
the Df/kf/σ/N stability boundary under greedy first-fit pairing and was
explicitly reserved as the baseline against which a future
pairing-choice fix would be benchmarked. This page reports that
measurement: an identical grid, identical seeds, and identical trial
counts (configs/boundary_sweep_v2.toml is a copy of the original
config with only the output directory changed), run against the current
defaults — backtracking pairing, the overlap-acceptance fix, and
mass-based CCA Γ.
Overall: 3374/4200 trials succeeded (80.3%), against 3039/4200 (72.4%) before. The aggregate number understates the change, since the grid deliberately extends well past the boundary into regions no pairing strategy can rescue; the informative result is where the boundary moved.
Results#
σ = 1.9 (the hard polydisperse case)#
Success rate averaged over N ∈ {64…1024}, old → new. Rows that were 1.00 throughout and remained so are omitted.
Df |
kf=0.8 |
kf=0.9 |
kf=1.0 |
kf=1.1 |
kf=1.2 |
kf=1.3 |
kf=1.4 |
|---|---|---|---|---|---|---|---|
2.0 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00 |
0.92→1.00 |
2.1 |
1.00 |
1.00 |
1.00 |
1.00 |
0.80→1.00 |
0.32→1.00 |
0.08→1.00 |
2.2 |
1.00 |
0.92→1.00 |
0.52→1.00 |
0.16→0.84 |
0.00→0.64 |
0.00→0.52 |
0.00→0.36 |
2.3 |
0.56→0.84 |
0.12→0.72 |
0.04→0.44 |
0.00→0.40 |
0.04→0.20 |
0.00→0.16 |
0.00→0.04 |
2.4 |
0.16→0.44 |
0.00→0.32 |
0.00→0.20 |
0.00→0.12 |
0.00 |
0.00 |
0.00 |
2.5 |
0.00→0.20 |
0.00→0.12 |
0.00 |
0.00 |
0.00 |
0.00 |
0.00 |
The Df=2.1 row summarizes the change most clearly: it previously collapsed from 1.00 to 0.08 as kf rose from 0.8 to 1.4, and is now uniformly 1.00. The previously-safe ceiling at σ=1.9 was Df≈2.0–2.1; it is now Df≈2.2 across most of the kf range, with non-zero success appearing for the first time at Df=2.4–2.5.
σ = 1.5#
Df |
kf=0.8 |
kf=0.9 |
kf=1.0 |
kf=1.1 |
kf=1.2 |
kf=1.3 |
kf=1.4 |
|---|---|---|---|---|---|---|---|
2.2 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00 |
0.92→1.00 |
2.3 |
1.00 |
1.00 |
1.00 |
0.84→0.96 |
0.44→0.84 |
0.08→0.72 |
0.04→0.44 |
2.4 |
0.92→0.96 |
0.60→0.84 |
0.36→0.64 |
0.00→0.44 |
0.00→0.40 |
0.00→0.08 |
0.00→0.04 |
2.5 |
0.40→0.60 |
0.08→0.40 |
0.04→0.28 |
0.00→0.12 |
0.00 |
0.00 |
0.00 |
σ = 1.0 (monodisperse)#
Df |
kf=0.8 |
kf=0.9 |
kf=1.0 |
kf=1.1 |
kf=1.2 |
kf=1.3 |
kf=1.4 |
|---|---|---|---|---|---|---|---|
2.3 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00 |
1.00→0.96 |
2.4 |
1.00 |
1.00 |
1.00 |
0.88→0.80 |
0.68→0.72 |
0.56→0.72 |
0.36→0.60 |
2.5 |
0.92 |
0.68→0.80 |
0.60→0.64 |
0.52→0.48 |
0.20→0.40 |
0.04→0.36 |
0.00→0.24 |
Gains are smaller in the monodisperse case, as the diagnosis predicts: monodisperse aggregates were never the frustrated case. Two cells move down slightly (Df=2.4/kf=1.1: 0.88→0.80, Df=2.5/kf=1.1: 0.52→0.48). At 25 trials per cell both movements are within sampling noise, and they sit alongside much larger gains in the same rows; they are recorded as observed and do not indicate a regression.
N dependence#
The previous sweep found that N does not independently cause failure but sharpens whatever margin Df/kf/σ leaves. Backtracking flattens that sharpening substantially at σ=1.9:
Df, kf |
N=64 |
N=128 |
N=256 |
N=512 |
N=1024 |
|---|---|---|---|---|---|
2.2, 1.0 |
1.00→1.00 |
0.60→1.00 |
0.60→1.00 |
0.40→1.00 |
0.00→1.00 |
2.3, 0.8 |
1.00→1.00 |
1.00→1.00 |
0.40→1.00 |
0.40→1.00 |
0.00→0.20 |
Df=2.2/kf=1.0 previously degraded monotonically to total failure at N=1024 and is now flat at 1.00 across the whole range. This result carries more practical weight than the averaged tables: large N was where the previous implementation was least usable, and it is where backtracking helps most, since a single unlucky pair no longer discards an entire expensive attempt.
Cost#
Backtracking makes infeasible configurations more expensive, not less.
Where greedy pairing abandoned an attempt at the first failed pair,
backtracking tries several partners per cluster first, and
run_simulation then retries the whole attempt up to 20 times. The
first run of this sweep stalled at roughly 12 trials per five minutes
in the Df=2.5 corners despite a nominal 120 s per-trial timeout,
because that timeout was only checked between attempts and could not
interrupt a long attempt in progress.
This has been fixed: CCAggregator accepts a wall-clock deadline,
threaded from run_simulation’s max_runtime_seconds, and checked
inside the round loop and before each additional partner attempt. An
infeasible N=512/Df=2.5 configuration given a 20 s budget returns in
20.1 s. Sweeps extending past the boundary should set trial_timeout;
without it, hard corners are slow to fail.
Raw output: benchmark_results/boundary_sweep_v2/stability_sweeps/.