X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=ed1cdc7faa0187184d3a1ac14df6a2b7ab269d2e;hp=3f4ad24ca17652319456568ef0169d1ab1ecd7e4;hb=ee9f650242899373136a76d9549db7f2858c1b06;hpb=18677852315b960132b0e8daa220c83b1c3c17cd diff --git a/src/search.cpp b/src/search.cpp index 3f4ad24c..ed1cdc7f 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -245,7 +245,7 @@ namespace { void sp_update_pv(SearchStack *pss, SearchStack ss[], int ply); bool connected_moves(const Position &pos, Move m1, Move m2); 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_prune(const Position &pos, Move m, Move threat, Depth d); bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply); @@ -778,7 +778,8 @@ namespace { << " currmovenumber " << i + 1 << std::endl; // 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; // Make the move, and search it @@ -978,7 +979,8 @@ namespace { ss[ply].currentMoveCaptureValue = Value(0); // 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; // 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, // if the move fails high will be re-searched at full depth. if ( depth >= 2*OnePly - && ext == Depth(0) + && !extendable && moveCount >= LMRPVMoves && !moveIsCapture && !move_promotion(move) @@ -1225,12 +1227,13 @@ namespace { movesSearched[moveCount++] = ss[ply].currentMove = move; // 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; // Futility pruning if ( useFutilityPruning - && ext == Depth(0) + && !extendable && !moveIsCapture && !moveIsPassedPawnPush && !move_promotion(move)) @@ -1261,7 +1264,7 @@ namespace { // 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 ( depth >= 2*OnePly - && ext == Depth(0) + && !extendable && moveCount >= LMRNonPVMoves && !moveIsCapture && !move_promotion(move) @@ -1515,12 +1518,13 @@ namespace { ss[sp->ply].currentMove = move; // 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; // Prune? if ( useFutilityPruning - && ext == Depth(0) + && !extendable && !moveIsCapture && !moveIsPassedPawnPush && !move_promotion(move) @@ -1534,7 +1538,7 @@ namespace { // 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 ( ext == Depth(0) + if ( !extendable && moveCount >= LMRNonPVMoves && !moveIsCapture && !moveIsPassedPawnPush @@ -1632,7 +1636,8 @@ namespace { ss[sp->ply].currentMove = move; // 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; // 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, // if the move fails high will be re-searched at full depth. - if ( ext == Depth(0) + if ( !extendable && moveCount >= LMRPVMoves && !moveIsCapture && !moveIsPassedPawnPush @@ -1923,7 +1928,6 @@ namespace { NodesSincePoll = 0; } } - ss[ply].pv[ply] = ss[ply].pv[ply+1] = ss[ply].currentMove = MOVE_NONE; ss[ply+2].mateKiller = MOVE_NONE; ss[ply].threatMove = MOVE_NONE; @@ -2052,9 +2056,10 @@ namespace { // particular) are searched with bigger depth than ordinary moves. 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); + *extendable = check || singleReply || mateThreat; if (check) result += CheckExtension[pvNode]; @@ -2062,26 +2067,37 @@ namespace { if (singleReply) result += SingleReplyExtension[pvNode]; + if (mateThreat) + 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]; - - if (mateThreat) - result += MateThreatExtension[pvNode]; + *extendable = true; + } if ( pos.midgame_value_of_piece_on(move_to(m)) >= RookValueMidgame && ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) - pos.midgame_value_of_piece_on(move_to(m)) == Value(0)) && !move_promotion(m)) + { result += PawnEndgameExtension[pvNode]; + *extendable = true; + } if ( pvNode && pos.move_is_capture(m) && pos.type_of_piece_on(move_to(m)) != PAWN && pos.see(m) >= 0) + { result += OnePly/2; + *extendable = true; + } return Min(result, OnePly); }