Skip to content

Fix small performance regression versus v2.9#214

Open
tameware wants to merge 3 commits into
dds-bridge:developfrom
tameware:opus-two-percent
Open

Fix small performance regression versus v2.9#214
tameware wants to merge 3 commits into
dds-bridge:developfrom
tameware:opus-two-percent

Conversation

@tameware

Copy link
Copy Markdown
Collaborator

Regains roughly 2% of performance.

Compare is the speedup-opus branch. Branch is this branch.

solver file           compare_avg   branch_avg cmp/branch note
------ ------------- ------------ ------------ ---------- ---------------
solve  list1000.txt          1.96         1.93      1.02x branch faster
solve  list100.txt           1.97         1.95      1.01x branch faster
solve  list10.txt            4.18         4.16      1.00x equal
solve  list1.txt            12.20        12.00      1.02x branch faster
calc   list1000.txt         10.68        10.58      1.01x branch faster
calc   list100.txt           8.88         8.80      1.01x branch faster
calc   list10.txt           15.50        14.56      1.06x branch faster
calc   list1.txt            39.60        39.00      1.02x branch faster

tameware and others added 3 commits June 27, 2026 18:51
The heuristic extraction refactor changed weight_alloc_trump_void1's
first branch from `lead_suit == trump` to `suit == trump`. Since that
is exhaustive with the following `else if (suit != trump)`, the three
ruffing branches (using the `24 - rank + ...` formula) became dead
code, and trump ruffs were scored with side-suit discard weights
instead. This mis-ordered ruffs, costing alpha-beta cutoffs.

The effect is small for solve but compounds heavily in calc's warm-TT
iterative deepening: calc explored ~34% more nodes than v2.9. Restoring
the original `lead_suit == trump` pitch branch makes the ruffing
branches reachable again and cuts calc time ~25% (gap to v2.9: 1.37x ->
1.02x). Ordering-only change; double-dummy results are unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
Per Copilot.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
The heuristic/quick-tricks refactor introduced static_cast<unsigned char>
wrappers on values that v2.9 used as signed, changing search behavior:

- make_3 / make_3_ctx: winner[]/second_best[] .hand and .rank were cast
  to unsigned char, turning the -1 "no card" sentinel into 255. This broke
  winner[trump].hand == -1 style checks in QuickTricks, losing cutoffs.
- weight_alloc_trump_void2 / _void3: rel_rank[aggr[suit]][...] indexed
  through static_cast<unsigned char>(aggr[suit]), truncating the 13-bit
  aggregate holding to 8 bits and reading the wrong rel_rank row.
- QuickTricksPartnerHand{Trump,NT}: bit_map_rank index cast the signed
  rank through unsigned char.

With these reverted to v2.9's signed handling, the per-move-generation
ordering trace now matches v2.9 exactly (0 divergences on list1), closing
the residual calc gap to parity. Ordering/pruning-only change; double-dummy
results are unchanged and all library tests pass.

Co-authored-by: Cursor <cursoragent@cursor.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR aims to regain a small (~2%) performance regression vs v2.9 by removing redundant/narrowing casts and simplifying a hot-path heuristic branch, reducing unnecessary conversions and work in frequently executed code paths.

Changes:

  • Removes redundant static_cast<unsigned char>(...) / double-cast patterns when indexing rank/relative-rank tables.
  • Simplifies part of weight_alloc_trump_void1() for the “void in trump when trump is led” discard case.
  • Removes unnecessary casts when copying winner/second-best ranks and hands from RelRanksType into Pos.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
library/src/quick_tricks.cpp Simplifies rank-to-index conversion when setting win_ranks from AbsRankType::rank.
library/src/heuristic_sorting/heuristic_sorting.cpp Removes redundant casts in rel_rank indexing and simplifies a discard-weighting branch in a hot heuristic function.
library/src/ab_search.cpp Removes unnecessary casts when updating cached winner/second-best info from thrp->rel[...].

@tameware tameware requested a review from zzcgumn June 28, 2026 14:09
@tameware tameware marked this pull request as ready for review June 28, 2026 14:09
@tameware tameware self-assigned this Jun 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants