X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=a322a01df4cec0fe93f517f5fc2c6c6049641718;hp=e53baabd98903430ae37bdc78d4bf64e3e4525bf;hb=2608b9249d9c25a699c8db8725e35bd4ec0b65ab;hpb=43f84efa1552a82c87db7e791035e74bba6c6157 diff --git a/src/search.cpp b/src/search.cpp index e53baabd..a322a01d 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -548,7 +548,7 @@ namespace { StateInfo st; const TTEntry *tte; Key posKey; - Move ttMove, move, excludedMove, threatMove; + Move ttMove, move, excludedMove, bestMove, threatMove; Depth ext, newDepth; Bound bt; Value bestValue, value, oldAlpha; @@ -574,6 +574,7 @@ namespace { tte = NULL; ttMove = excludedMove = MOVE_NONE; sp = ss->sp; + bestMove = sp->bestMove; threatMove = sp->threatMove; bestValue = sp->bestValue; moveCount = sp->moveCount; // Lock must be held here @@ -584,7 +585,7 @@ namespace { } else { - ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE; + ss->currentMove = threatMove = (ss+1)->excludedMove = bestMove = MOVE_NONE; (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO; (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; @@ -630,16 +631,16 @@ namespace { : can_return_tt(tte, depth, beta, ss->ply))) { TT.refresh(tte); - ss->bestMove = move = ttMove; // Can be MOVE_NONE + ss->currentMove = ttMove; // Can be MOVE_NONE value = value_from_tt(tte->value(), ss->ply); if ( value >= beta - && move - && !pos.is_capture_or_promotion(move) - && move != ss->killers[0]) + && ttMove + && !pos.is_capture_or_promotion(ttMove) + && ttMove != ss->killers[0]) { ss->killers[1] = ss->killers[0]; - ss->killers[0] = move; + ss->killers[0] = ttMove; } return value; } @@ -752,7 +753,7 @@ namespace { // move which was reduced. If a connection is found, return a fail // low score (which will cause the reduced move to fail high in the // parent node, which will trigger a re-search with full depth). - threatMove = (ss+1)->bestMove; + threatMove = (ss+1)->currentMove; if ( depth < ThreatDepth && (ss-1)->reduction @@ -778,6 +779,7 @@ namespace { assert(rdepth >= ONE_PLY); assert((ss-1)->currentMove != MOVE_NONE); + assert((ss-1)->currentMove != MOVE_NULL); MovePicker mp(pos, ttMove, H, pos.captured_piece_type()); CheckInfo ci(pos); @@ -813,7 +815,6 @@ split_point_start: // At split points actual search starts from here MovePickerExt mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta); CheckInfo ci(pos); - ss->bestMove = MOVE_NONE; futilityBase = ss->eval + ss->evalMargin; singularExtensionNode = !RootNode && !SpNode @@ -896,7 +897,6 @@ split_point_start: // At split points actual search starts from here value = search(pos, ss, rBeta - 1, rBeta, depth / 2); ss->skipNullMove = false; ss->excludedMove = MOVE_NONE; - ss->bestMove = MOVE_NONE; if (value < rBeta) ext = ONE_PLY; } @@ -1045,7 +1045,7 @@ split_point_start: // At split points actual search starts from here if (value > bestValue) { bestValue = value; - ss->bestMove = move; + bestMove = move; if ( PvNode && value > alpha @@ -1055,7 +1055,7 @@ split_point_start: // At split points actual search starts from here if (SpNode && !thread.cutoff_occurred()) { sp->bestValue = value; - sp->ss->bestMove = move; + sp->bestMove = move; sp->alpha = alpha; if (value >= beta) @@ -1070,8 +1070,8 @@ split_point_start: // At split points actual search starts from here && Threads.available_slave_exists(pos.thread()) && !Signals.stop && !thread.cutoff_occurred()) - bestValue = Threads.split(pos, ss, alpha, beta, bestValue, depth, - threatMove, moveCount, &mp, NT); + bestValue = Threads.split(pos, ss, alpha, beta, bestValue, &bestMove, + depth, threatMove, moveCount, &mp, NT); } // Step 20. Check for mate and stalemate @@ -1088,14 +1088,14 @@ split_point_start: // At split points actual search starts from here { assert(!playedMoveCount); - bestValue = alpha; + bestValue = oldAlpha; } // Step 21. Update tables // Update transposition table entry, killers and history if (!SpNode && !Signals.stop && !thread.cutoff_occurred()) { - move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove; + move = bestValue <= oldAlpha ? MOVE_NONE : bestMove; bt = bestValue <= oldAlpha ? BOUND_UPPER : bestValue >= beta ? BOUND_LOWER : BOUND_EXACT; @@ -1147,7 +1147,7 @@ split_point_start: // At split points actual search starts from here assert(pos.thread() >= 0 && pos.thread() < Threads.size()); StateInfo st; - Move ttMove, move; + Move ttMove, move, bestMove; Value bestValue, value, evalMargin, futilityValue, futilityBase; bool inCheck, enoughMaterial, givesCheck, evasionPrunable; const TTEntry* tte; @@ -1155,7 +1155,7 @@ split_point_start: // At split points actual search starts from here Bound bt; Value oldAlpha = alpha; - ss->bestMove = ss->currentMove = MOVE_NONE; + ss->currentMove = bestMove = MOVE_NONE; ss->ply = (ss-1)->ply + 1; // Check for an instant draw or maximum ply reached @@ -1175,7 +1175,7 @@ split_point_start: // At split points actual search starts from here if (!PvNode && tte && can_return_tt(tte, ttDepth, beta, ss->ply)) { - ss->bestMove = ttMove; // Can be MOVE_NONE + ss->currentMove = ttMove; // Can be MOVE_NONE return value_from_tt(tte->value(), ss->ply); } @@ -1299,7 +1299,7 @@ split_point_start: // At split points actual search starts from here if (value > bestValue) { bestValue = value; - ss->bestMove = move; + bestMove = move; if ( PvNode && value > alpha @@ -1314,7 +1314,7 @@ split_point_start: // At split points actual search starts from here return mated_in(ss->ply); // Plies to mate from the root // Update transposition table - move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove; + move = bestValue <= oldAlpha ? MOVE_NONE : bestMove; bt = bestValue <= oldAlpha ? BOUND_UPPER : bestValue >= beta ? BOUND_LOWER : BOUND_EXACT;