Repository navigation
Conversation
Every annealing run took its full 2000 steps. A run now stops when its best result has not improved for a fifth of its budget. Replayed from the improvement traces of every run mpl made on 18 ORFS designs (asap7, gf180, nangate45), against the full budget: runs steps kept cost loss: median p95 worst cluster placement 59% 0.00% 0.01% 0.08% macro placement 30% 0.00% 0.00% 0.00% tilings 26% 0.00% 0.00% 9.62% A tenth of the budget cost up to 9.85% on a cluster placement and 20% on a tiling. The one tiling outlier loses the same 9.62% at every patience from 300 to 1000 steps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
This was referenced Oct 17, 2026
Contributor
There was a problem hiding this comment.
Code Review
This pull request introduces an early stopping mechanism to the simulated annealing loop in SimulatedAnnealingCore::fastSA(). It defines a patience threshold of one-fifth of the maximum steps and terminates the loop early if the best result has not improved within this window, saving computation time when the temperature is too low to escape local minima. There are no review comments, so I have no feedback to provide.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Opened for discussion.
Every annealing run in mpl took its full 2000 steps. A run now stops when its best result has not improved for a fifth of its budget (400 steps).
mpl on 18 ORFS designs at each design's own core and settings, measured with
mpl_bench(#11809): median of 3 runs per arm, 8 threads pinned to 8 cores, same machine. Run-to-run spread was up to 7% of the median; read differences below 10% as noise.Per design
The patience was chosen by replaying the improvement traces of every annealing run mpl made on 18 ORFS designs (asap7, gf180, nangate45) against the full budget. An early stop changes nothing before it fires, so the replay is exact:
A tenth of the budget (200 steps) cost up to 9.85% on a cluster placement and 20% on a tiling. The one tiling outlier loses the same 9.62% at every patience from 300 to 1000 steps.
QoR at global route, one ORFS build per arm through
GRT(the full study series, whose macro placements equal this PR's on all 18 designs, so the moves are this change's): 12 identical, 2 with positive slack in both arms, and 4 whose worst slack moved: nangate45/ariane133 +87.7 ps, asap7/swerv_wrapper +20.5 ps, asap7/riscv32i -0.7 ps, nangate45/cva6 -5.8 ps. One build per arm; a different placement moves slack either way.How these were measured, and the rest of the study: The-OpenROAD-Project/bazel-orfs#1290. The bench is offered separately in #11809.
Tests
No new test: the change is a stopping rule, and its effect is runtime and the quality numbers above, which a unit test would only pin down as golden output. The existing regressions pass unchanged.
Claude made the changes and stared at paint drying.
🤖 Generated with Claude Code