From 7ef4626b375b0a9ba677eb5e8b296e903b11e97e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:59:46 +0000 Subject: [PATCH 1/2] Initial plan From ee533f1fc60225efb3c45b3b5c03023aab6a8dc4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:13:10 +0000 Subject: [PATCH 2/2] Fix ASAN CI: add missing semicolon and remove redundant casts The ASAN CI job was failing because PR #223 (Two percent solution) introduced a missing semicolon at the end of ab_search.cpp:884 in the make_3() function: posPoint->second_best[st].hand = thrp->rel[aggr].abs_rank[2][st].hand ^ missing ; This commit applies all of PR #223's changes (removing unnecessary static_cast() wrappers and fixing indentation) with the missing semicolon corrected. --- library/src/ab_search.cpp | 16 ++++---- .../heuristic_sorting/heuristic_sorting.cpp | 39 +++++++------------ library/src/quick_tricks.cpp | 4 +- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/library/src/ab_search.cpp b/library/src/ab_search.cpp index 762d75f0..a0037e3e 100644 --- a/library/src/ab_search.cpp +++ b/library/src/ab_search.cpp @@ -878,10 +878,10 @@ void make_3( int aggr = posPoint->aggr[st]; - posPoint->winner[st].rank = static_cast(thrp->rel[aggr].abs_rank[1][st].rank); - posPoint->winner[st].hand = static_cast(thrp->rel[aggr].abs_rank[1][st].hand); - posPoint->second_best[st].rank = static_cast(thrp->rel[aggr].abs_rank[2][st].rank); - posPoint->second_best[st].hand = static_cast(thrp->rel[aggr].abs_rank[2][st].hand); + posPoint->winner[st].rank = thrp->rel[aggr].abs_rank[1][st].rank; + posPoint->winner[st].hand = thrp->rel[aggr].abs_rank[1][st].hand; + posPoint->second_best[st].rank = thrp->rel[aggr].abs_rank[2][st].rank; + posPoint->second_best[st].hand = thrp->rel[aggr].abs_rank[2][st].hand; } } @@ -944,10 +944,10 @@ static void make_3_ctx( int aggr = posPoint->aggr[st]; - posPoint->winner[st].rank = static_cast(thrp->rel[aggr].abs_rank[1][st].rank); - posPoint->winner[st].hand = static_cast(thrp->rel[aggr].abs_rank[1][st].hand); - posPoint->second_best[st].rank = static_cast(thrp->rel[aggr].abs_rank[2][st].rank); - posPoint->second_best[st].hand = static_cast(thrp->rel[aggr].abs_rank[2][st].hand); + posPoint->winner[st].rank = thrp->rel[aggr].abs_rank[1][st].rank; + posPoint->winner[st].hand = thrp->rel[aggr].abs_rank[1][st].hand; + posPoint->second_best[st].rank = thrp->rel[aggr].abs_rank[2][st].rank; + posPoint->second_best[st].hand = thrp->rel[aggr].abs_rank[2][st].hand; } } diff --git a/library/src/heuristic_sorting/heuristic_sorting.cpp b/library/src/heuristic_sorting/heuristic_sorting.cpp index 88478881..d175e451 100644 --- a/library/src/heuristic_sorting/heuristic_sorting.cpp +++ b/library/src/heuristic_sorting/heuristic_sorting.cpp @@ -672,7 +672,7 @@ void weight_alloc_trump_void1(HeuristicContext& ctx) const int partner_lh = partner[lead_hand]; const int rho_lh = rho[lead_hand]; - + unsigned short suitCount = tpos.length[curr_hand][suit]; int suitAdd; @@ -702,10 +702,10 @@ void weight_alloc_trump_void1(HeuristicContext& ctx) if (tpos.length[partner_lh][lead_suit] != 0) { // 3rd hand will follow. - if (tpos.rank_in_suit[rho_lh][lead_suit] > - (tpos.rank_in_suit[partner_lh][lead_suit] | - bit_map_rank[ctx.lead0_rank])) - // Partner has winning card. + if (tpos.rank_in_suit[rho_lh][lead_suit] > + (tpos.rank_in_suit[partner_lh][lead_suit] | + bit_map_rank[ctx.lead0_rank])) + // RHO can win. suitAdd = 60 + (suitCount << 6) / 44; else if ((tpos.length[rho_lh][lead_suit] == 0) && (tpos.length[rho_lh][trump] != 0)) @@ -726,9 +726,9 @@ void weight_alloc_trump_void1(HeuristicContext& ctx) tpos.rank_in_suit[partner_lh][trump])) // Partner can overruff 3rd hand. suitAdd = 60 + (suitCount << 6) / 44; - else if ((tpos.length[partner_lh][trump] == 0) - && (tpos.rank_in_suit[rho_lh][lead_suit] > - bit_map_rank[ctx.lead0_rank])) + else if ((tpos.length[partner_lh][trump] == 0) + && (tpos.rank_in_suit[rho_lh][lead_suit] > + bit_map_rank[ctx.lead0_rank])) // 3rd hand has no trumps, and partner has suit winner. suitAdd = 60 + (suitCount << 6) / 44; else @@ -1181,7 +1181,7 @@ void weight_alloc_trump_void2(HeuristicContext& ctx) MoveType* mply = ctx.mply; const int rho_lh = rho[lead_hand]; - + int suitAdd; const unsigned short suitCount = tpos.length[curr_hand][suit]; const int max4th = highest_rank[tpos.rank_in_suit[rho_lh][lead_suit]]; @@ -1209,19 +1209,16 @@ void weight_alloc_trump_void2(HeuristicContext& ctx) for (int k = last_num_moves; k < num_moves; k++) { - if (ctx.move1_suit == trump && - mply[k].rank < ctx.move1_rank) + if (ctx.move1_suit == trump && + mply[k].rank < ctx.move1_rank) { // Don't underruff. - unsigned char aggrSuit = static_cast(tpos.aggr[suit]); - unsigned char moveRank = static_cast(mply[k].rank); - unsigned char relRankValue = static_cast(rel_rank[aggrSuit][moveRank]); - int r_rank = static_cast(relRankValue); + int r_rank = rel_rank[tpos.aggr[suit]][mply[k].rank]; suitAdd = (suitCount << 6) / 40; mply[k].weight = -32 + r_rank + suitAdd; } - else if (ctx.high1 == 0) + else if (ctx.high1 == 0) { // We ruff partner's winner over 2nd hand. if (max4th != 0) @@ -1386,10 +1383,7 @@ void weight_alloc_trump_void3(HeuristicContext& ctx) { for (int k = last_num_moves; k < num_moves; k++) { - int r_rank = static_cast( - static_cast( - rel_rank[static_cast(tpos.aggr[suit])] - [static_cast(mply[k].rank)])); + int r_rank = rel_rank[tpos.aggr[suit]][mply[k].rank]; if (mply[k].rank > ctx.move2_rank) mply[k].weight = 33 + r_rank; // Overruff else @@ -1404,10 +1398,7 @@ void weight_alloc_trump_void3(HeuristicContext& ctx) { for (int k = last_num_moves; k < num_moves; k++) { - int r_rank = static_cast( - static_cast( - rel_rank[static_cast(tpos.aggr[suit])] - [static_cast(mply[k].rank)])); + int r_rank = rel_rank[tpos.aggr[suit]][mply[k].rank]; mply[k].weight = 33 + r_rank; } } diff --git a/library/src/quick_tricks.cpp b/library/src/quick_tricks.cpp index 0c161406..48f37fe5 100644 --- a/library/src/quick_tricks.cpp +++ b/library/src/quick_tricks.cpp @@ -1000,7 +1000,7 @@ int QuickTricksPartnerHandTrump( if (ctx.thread_ptr()->rel[ranks].abs_rank[3][suit].hand == partner[hand]) { tpos.win_ranks[depth][suit] |= bit_map_rank[ - static_cast(static_cast(ctx.thread_ptr()->rel[ranks].abs_rank[3][suit].rank)) ]; + static_cast(ctx.thread_ptr()->rel[ranks].abs_rank[3][suit].rank) ]; tpos.win_ranks[depth][commSuit] |= bit_map_rank[commRank]; @@ -1110,7 +1110,7 @@ int QuickTricksPartnerHandNT( if (ctx.thread_ptr()->rel[ranks].abs_rank[3][suit].hand == partner[hand]) { tpos.win_ranks[depth][suit] |= bit_map_rank[ - static_cast(static_cast(ctx.thread_ptr()->rel[ranks].abs_rank[3][suit].rank)) ]; + static_cast(ctx.thread_ptr()->rel[ranks].abs_rank[3][suit].rank) ]; qt++; if (qt >= cutoff) return qt;