From 43f84efa1552a82c87db7e791035e74bba6c6157 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 20 Feb 2012 14:07:43 +0100 Subject: [PATCH] Don't update bestValue in check_is_dangerous() It is a prerequisite for next patch and simplifies the function. testing at ultra fast TC shows no regression. After 24302 games at 2"+0.05 Mod vs Orig 5122 - 5038 - 13872 ELO +1 (+- 2.9) Signed-off-by: Marco Costalba --- src/search.cpp | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 28e231dd..e53baabd 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -130,7 +130,7 @@ namespace { Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth); void id_loop(Position& pos); - bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta, Value *bValue); + bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta); bool connected_moves(const Position& pos, Move m1, Move m2); Value value_to_tt(Value v, int ply); Value value_from_tt(Value v, int ply); @@ -1279,7 +1279,7 @@ split_point_start: // At split points actual search starts from here && move != ttMove && !pos.is_capture_or_promotion(move) && ss->eval + PawnValueMidgame / 4 < beta - && !check_is_dangerous(pos, move, futilityBase, beta, &bestValue)) + && !check_is_dangerous(pos, move, futilityBase, beta)) continue; // Check for legality only before to do the move @@ -1330,13 +1330,12 @@ split_point_start: // At split points actual search starts from here // bestValue is updated only when returning false because in that case move // will be pruned. - bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta, Value *bestValue) + bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta) { Bitboard b, occ, oldAtt, newAtt, kingAtt; - Square from, to, ksq, victimSq; + Square from, to, ksq; Piece pc; Color them; - Value futilityValue, bv = *bestValue; from = from_sq(move); to = to_sq(move); @@ -1361,23 +1360,13 @@ split_point_start: // At split points actual search starts from here // Rule 3. Creating new double threats with checks b = pos.pieces(them) & newAtt & ~oldAtt & ~(1ULL << ksq); - while (b) { - victimSq = pop_1st_bit(&b); - futilityValue = futilityBase + PieceValueEndgame[pos.piece_on(victimSq)]; - // Note that here we generate illegal "double move"! - if ( futilityValue >= beta - && pos.see_sign(make_move(from, victimSq)) >= 0) + if (futilityBase + PieceValueEndgame[pos.piece_on(pop_1st_bit(&b))] >= beta) return true; - - if (futilityValue > bv) - bv = futilityValue; } - // Update bestValue only if check is not dangerous (because we will prune the move) - *bestValue = bv; return false; } -- 2.39.2