along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstring> // For std::memset
// starts with statScore = 0. Later grandchildren start with the last calculated
// statScore of the previous grandchild. This influences the reduction rules in
// LMR which are based on the statScore of parent position.
- (ss+2)->statScore = 0;
+ if (rootNode)
+ (ss + 4)->statScore = 0;
+ else
+ (ss + 2)->statScore = 0;
// Step 4. Transposition table lookup. We don't want the score of a partial
// search to overwrite a previous full search TT value, so we use a different
&& move == ttMove
&& !rootNode
&& !excludedMove // Avoid recursive singular search
- /* && ttValue != VALUE_NONE Already implicit in the next condition */
+ /* && ttValue != VALUE_NONE Already implicit in the next condition */
&& abs(ttValue) < VALUE_KNOWN_WIN
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3 * ONE_PLY
else if (type_of(move) == CASTLING)
extension = ONE_PLY;
+ // Shuffle extension
+ else if ( PvNode
+ && pos.rule50_count() > 18
+ && depth < 3 * ONE_PLY
+ && ss->ply < 3 * thisThread->rootDepth / ONE_PLY) // To avoid too deep searches
+ extension = ONE_PLY;
+
// Passed pawn extension
else if ( move == ss->killers[0]
&& pos.advanced_pawn_push(move)
// Step 16. Reduced depth search (LMR). If the move fails high it will be
// re-searched at full depth.
if ( depth >= 3 * ONE_PLY
- && moveCount > 1
- && (!captureOrPromotion || moveCountPruning))
+ && moveCount > 1 + 3 * rootNode
+ && ( !captureOrPromotion
+ || moveCountPruning
+ || ss->staticEval + PieceValue[EG][pos.captured_piece()] <= alpha))
{
Depth r = reduction<PvNode>(improving, depth, moveCount);
}
- // qsearch() is the quiescence search function, which is called by the main
- // search function with depth zero, or recursively with depth less than ONE_PLY.
+ // qsearch() is the quiescence search function, which is called by the main search
+ // function with zero depth, or recursively with further decreasing depth per call.
template <NodeType NT>
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth) {