1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Use extendable instead of depth extension

We can have depth(0) also in problematic cases
according to how extensions are tweaked by the user.

In any case we don't want to prune these moves.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2008-11-24 17:50:54 +01:00
parent 8a0dd93c56
commit ee9f650242

View file

@ -245,7 +245,7 @@ namespace {
void sp_update_pv(SearchStack *pss, SearchStack ss[], int ply); void sp_update_pv(SearchStack *pss, SearchStack ss[], int ply);
bool connected_moves(const Position &pos, Move m1, Move m2); bool connected_moves(const Position &pos, Move m1, Move m2);
bool move_is_killer(Move m, const SearchStack& ss); bool move_is_killer(Move m, const SearchStack& ss);
Depth extension(const Position &pos, Move m, bool pvNode, bool check, bool singleReply, bool mateThreat); Depth extension(const Position &pos, Move m, bool pvNode, bool check, bool singleReply, bool mateThreat, bool* extendable);
bool ok_to_do_nullmove(const Position &pos); bool ok_to_do_nullmove(const Position &pos);
bool ok_to_prune(const Position &pos, Move m, Move threat, Depth d); bool ok_to_prune(const Position &pos, Move m, Move threat, Depth d);
bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply); bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply);
@ -778,7 +778,8 @@ namespace {
<< " currmovenumber " << i + 1 << std::endl; << " currmovenumber " << i + 1 << std::endl;
// Decide search depth for this move // Decide search depth for this move
ext = extension(pos, move, true, pos.move_is_check(move), false, false); bool dummy;
ext = extension(pos, move, true, pos.move_is_check(move), false, false, &dummy);
newDepth = (Iteration - 2) * OnePly + ext + InitialDepth; newDepth = (Iteration - 2) * OnePly + ext + InitialDepth;
// Make the move, and search it // Make the move, and search it
@ -978,7 +979,8 @@ namespace {
ss[ply].currentMoveCaptureValue = Value(0); ss[ply].currentMoveCaptureValue = Value(0);
// Decide the new search depth // Decide the new search depth
Depth ext = extension(pos, move, true, moveIsCheck, singleReply, mateThreat); bool extendable;
Depth ext = extension(pos, move, true, moveIsCheck, singleReply, mateThreat, &extendable);
Depth newDepth = depth - OnePly + ext; Depth newDepth = depth - OnePly + ext;
// Make and search the move // Make and search the move
@ -992,7 +994,7 @@ namespace {
// Try to reduce non-pv search depth by one ply if move seems not problematic, // Try to reduce non-pv search depth by one ply if move seems not problematic,
// if the move fails high will be re-searched at full depth. // if the move fails high will be re-searched at full depth.
if ( depth >= 2*OnePly if ( depth >= 2*OnePly
&& ext == Depth(0) && !extendable
&& moveCount >= LMRPVMoves && moveCount >= LMRPVMoves
&& !moveIsCapture && !moveIsCapture
&& !move_promotion(move) && !move_promotion(move)
@ -1225,12 +1227,13 @@ namespace {
movesSearched[moveCount++] = ss[ply].currentMove = move; movesSearched[moveCount++] = ss[ply].currentMove = move;
// Decide the new search depth // Decide the new search depth
Depth ext = extension(pos, move, false, moveIsCheck, singleReply, mateThreat); bool extendable;
Depth ext = extension(pos, move, false, moveIsCheck, singleReply, mateThreat, &extendable);
Depth newDepth = depth - OnePly + ext; Depth newDepth = depth - OnePly + ext;
// Futility pruning // Futility pruning
if ( useFutilityPruning if ( useFutilityPruning
&& ext == Depth(0) && !extendable
&& !moveIsCapture && !moveIsCapture
&& !moveIsPassedPawnPush && !moveIsPassedPawnPush
&& !move_promotion(move)) && !move_promotion(move))
@ -1261,7 +1264,7 @@ namespace {
// Try to reduce non-pv search depth by one ply if move seems not problematic, // Try to reduce non-pv search depth by one ply if move seems not problematic,
// if the move fails high will be re-searched at full depth. // if the move fails high will be re-searched at full depth.
if ( depth >= 2*OnePly if ( depth >= 2*OnePly
&& ext == Depth(0) && !extendable
&& moveCount >= LMRNonPVMoves && moveCount >= LMRNonPVMoves
&& !moveIsCapture && !moveIsCapture
&& !move_promotion(move) && !move_promotion(move)
@ -1515,12 +1518,13 @@ namespace {
ss[sp->ply].currentMove = move; ss[sp->ply].currentMove = move;
// Decide the new search depth. // Decide the new search depth.
Depth ext = extension(pos, move, false, moveIsCheck, false, false); bool extendable;
Depth ext = extension(pos, move, false, moveIsCheck, false, false, &extendable);
Depth newDepth = sp->depth - OnePly + ext; Depth newDepth = sp->depth - OnePly + ext;
// Prune? // Prune?
if ( useFutilityPruning if ( useFutilityPruning
&& ext == Depth(0) && !extendable
&& !moveIsCapture && !moveIsCapture
&& !moveIsPassedPawnPush && !moveIsPassedPawnPush
&& !move_promotion(move) && !move_promotion(move)
@ -1534,7 +1538,7 @@ namespace {
// Try to reduce non-pv search depth by one ply if move seems not problematic, // Try to reduce non-pv search depth by one ply if move seems not problematic,
// if the move fails high will be re-searched at full depth. // if the move fails high will be re-searched at full depth.
if ( ext == Depth(0) if ( !extendable
&& moveCount >= LMRNonPVMoves && moveCount >= LMRNonPVMoves
&& !moveIsCapture && !moveIsCapture
&& !moveIsPassedPawnPush && !moveIsPassedPawnPush
@ -1632,7 +1636,8 @@ namespace {
ss[sp->ply].currentMove = move; ss[sp->ply].currentMove = move;
// Decide the new search depth. // Decide the new search depth.
Depth ext = extension(pos, move, true, moveIsCheck, false, false); bool extendable;
Depth ext = extension(pos, move, true, moveIsCheck, false, false, &extendable);
Depth newDepth = sp->depth - OnePly + ext; Depth newDepth = sp->depth - OnePly + ext;
// Make and search the move. // Make and search the move.
@ -1641,7 +1646,7 @@ namespace {
// Try to reduce non-pv search depth by one ply if move seems not problematic, // Try to reduce non-pv search depth by one ply if move seems not problematic,
// if the move fails high will be re-searched at full depth. // if the move fails high will be re-searched at full depth.
if ( ext == Depth(0) if ( !extendable
&& moveCount >= LMRPVMoves && moveCount >= LMRPVMoves
&& !moveIsCapture && !moveIsCapture
&& !moveIsPassedPawnPush && !moveIsPassedPawnPush
@ -1923,7 +1928,6 @@ namespace {
NodesSincePoll = 0; NodesSincePoll = 0;
} }
} }
ss[ply].pv[ply] = ss[ply].pv[ply+1] = ss[ply].currentMove = MOVE_NONE; ss[ply].pv[ply] = ss[ply].pv[ply+1] = ss[ply].currentMove = MOVE_NONE;
ss[ply+2].mateKiller = MOVE_NONE; ss[ply+2].mateKiller = MOVE_NONE;
ss[ply].threatMove = MOVE_NONE; ss[ply].threatMove = MOVE_NONE;
@ -2052,9 +2056,10 @@ namespace {
// particular) are searched with bigger depth than ordinary moves. // particular) are searched with bigger depth than ordinary moves.
Depth extension(const Position &pos, Move m, bool pvNode, Depth extension(const Position &pos, Move m, bool pvNode,
bool check, bool singleReply, bool mateThreat) { bool check, bool singleReply, bool mateThreat, bool* extendable) {
Depth result = Depth(0); Depth result = Depth(0);
*extendable = check || singleReply || mateThreat;
if (check) if (check)
result += CheckExtension[pvNode]; result += CheckExtension[pvNode];
@ -2062,26 +2067,37 @@ namespace {
if (singleReply) if (singleReply)
result += SingleReplyExtension[pvNode]; result += SingleReplyExtension[pvNode];
if (pos.move_is_pawn_push_to_7th(m))
result += PawnPushTo7thExtension[pvNode];
if (pos.move_is_passed_pawn_push(m))
result += PassedPawnExtension[pvNode];
if (mateThreat) if (mateThreat)
result += MateThreatExtension[pvNode]; result += MateThreatExtension[pvNode];
if (pos.move_is_pawn_push_to_7th(m))
{
result += PawnPushTo7thExtension[pvNode];
*extendable = true;
}
if (pos.move_is_passed_pawn_push(m))
{
result += PassedPawnExtension[pvNode];
*extendable = true;
}
if ( pos.midgame_value_of_piece_on(move_to(m)) >= RookValueMidgame if ( pos.midgame_value_of_piece_on(move_to(m)) >= RookValueMidgame
&& ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) && ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK)
- pos.midgame_value_of_piece_on(move_to(m)) == Value(0)) - pos.midgame_value_of_piece_on(move_to(m)) == Value(0))
&& !move_promotion(m)) && !move_promotion(m))
{
result += PawnEndgameExtension[pvNode]; result += PawnEndgameExtension[pvNode];
*extendable = true;
}
if ( pvNode if ( pvNode
&& pos.move_is_capture(m) && pos.move_is_capture(m)
&& pos.type_of_piece_on(move_to(m)) != PAWN && pos.type_of_piece_on(move_to(m)) != PAWN
&& pos.see(m) >= 0) && pos.see(m) >= 0)
{
result += OnePly/2; result += OnePly/2;
*extendable = true;
}
return Min(result, OnePly); return Min(result, OnePly);
} }