mirror of
https://github.com/sockspls/badfish
synced 2025-05-02 09:39:36 +00:00
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 <mcostalba@gmail.com>
This commit is contained in:
parent
ea5616785e
commit
43f84efa15
1 changed files with 5 additions and 16 deletions
|
@ -130,7 +130,7 @@ namespace {
|
||||||
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth);
|
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth);
|
||||||
|
|
||||||
void id_loop(Position& pos);
|
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);
|
bool connected_moves(const Position& pos, Move m1, Move m2);
|
||||||
Value value_to_tt(Value v, int ply);
|
Value value_to_tt(Value v, int ply);
|
||||||
Value value_from_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
|
&& move != ttMove
|
||||||
&& !pos.is_capture_or_promotion(move)
|
&& !pos.is_capture_or_promotion(move)
|
||||||
&& ss->eval + PawnValueMidgame / 4 < beta
|
&& ss->eval + PawnValueMidgame / 4 < beta
|
||||||
&& !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
|
&& !check_is_dangerous(pos, move, futilityBase, beta))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Check for legality only before to do the move
|
// 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
|
// bestValue is updated only when returning false because in that case move
|
||||||
// will be pruned.
|
// 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;
|
Bitboard b, occ, oldAtt, newAtt, kingAtt;
|
||||||
Square from, to, ksq, victimSq;
|
Square from, to, ksq;
|
||||||
Piece pc;
|
Piece pc;
|
||||||
Color them;
|
Color them;
|
||||||
Value futilityValue, bv = *bestValue;
|
|
||||||
|
|
||||||
from = from_sq(move);
|
from = from_sq(move);
|
||||||
to = to_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
|
// Rule 3. Creating new double threats with checks
|
||||||
b = pos.pieces(them) & newAtt & ~oldAtt & ~(1ULL << ksq);
|
b = pos.pieces(them) & newAtt & ~oldAtt & ~(1ULL << ksq);
|
||||||
|
|
||||||
while (b)
|
while (b)
|
||||||
{
|
{
|
||||||
victimSq = pop_1st_bit(&b);
|
|
||||||
futilityValue = futilityBase + PieceValueEndgame[pos.piece_on(victimSq)];
|
|
||||||
|
|
||||||
// Note that here we generate illegal "double move"!
|
// Note that here we generate illegal "double move"!
|
||||||
if ( futilityValue >= beta
|
if (futilityBase + PieceValueEndgame[pos.piece_on(pop_1st_bit(&b))] >= beta)
|
||||||
&& pos.see_sign(make_move(from, victimSq)) >= 0)
|
|
||||||
return true;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue