1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

Further rearrange search()

No functional change.
This commit is contained in:
Marco Costalba 2012-10-01 09:33:13 +02:00
parent faaa1f1116
commit 1b6b711c44
3 changed files with 46 additions and 47 deletions

View file

@ -528,46 +528,43 @@ namespace {
Key posKey; Key posKey;
Move ttMove, move, excludedMove, bestMove, threatMove; Move ttMove, move, excludedMove, bestMove, threatMove;
Depth ext, newDepth; Depth ext, newDepth;
Bound bt;
Value bestValue, value, oldAlpha, ttValue; Value bestValue, value, oldAlpha, ttValue;
Value refinedValue, nullValue, futilityValue; Value refinedValue, nullValue, futilityValue;
bool pvMove, inCheck, singularExtensionNode, givesCheck; bool pvMove, inCheck, singularExtensionNode, givesCheck;
bool captureOrPromotion, dangerous, doFullDepthSearch; bool captureOrPromotion, dangerous, doFullDepthSearch;
int moveCount, playedMoveCount; int moveCount, playedMoveCount;
// Step 1. Initialize node
Thread* thisThread = pos.this_thread(); Thread* thisThread = pos.this_thread();
moveCount = playedMoveCount = 0; moveCount = playedMoveCount = 0;
oldAlpha = alpha; oldAlpha = alpha;
inCheck = pos.in_check(); inCheck = pos.in_check();
if (SpNode)
{
sp = ss->sp;
bestMove = sp->bestMove;
threatMove = sp->threatMove;
bestValue = sp->bestValue;
tte = NULL;
ttMove = excludedMove = MOVE_NONE;
ttValue = VALUE_NONE;
assert(sp->bestValue > -VALUE_INFINITE && sp->moveCount > 0);
goto split_point_start;
}
bestValue = -VALUE_INFINITE;
ss->currentMove = threatMove = (ss+1)->excludedMove = bestMove = MOVE_NONE;
ss->ply = (ss-1)->ply + 1; ss->ply = (ss-1)->ply + 1;
(ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO;
(ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE;
// Used to send selDepth info to GUI // Used to send selDepth info to GUI
if (PvNode && thisThread->maxPly < ss->ply) if (PvNode && thisThread->maxPly < ss->ply)
thisThread->maxPly = ss->ply; thisThread->maxPly = ss->ply;
// Step 1. Initialize node
if (SpNode)
{
tte = NULL;
ttMove = excludedMove = MOVE_NONE;
ttValue = VALUE_NONE;
sp = ss->sp;
bestMove = sp->bestMove;
threatMove = sp->threatMove;
bestValue = sp->bestValue;
assert(bestValue > -VALUE_INFINITE && sp->moveCount > 0);
goto split_point_start;
}
else
{
bestValue = -VALUE_INFINITE;
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;
}
if (!RootNode) if (!RootNode)
{ {
// Step 2. Check for aborted search and immediate draw // Step 2. Check for aborted search and immediate draw
@ -1005,7 +1002,6 @@ split_point_start: // At split points actual search starts from here
// is not a problem when sorting becuase sort is stable and move // is not a problem when sorting becuase sort is stable and move
// position in the list is preserved, just the PV is pushed up. // position in the list is preserved, just the PV is pushed up.
rm.score = -VALUE_INFINITE; rm.score = -VALUE_INFINITE;
} }
if (value > bestValue) if (value > bestValue)
@ -1016,15 +1012,17 @@ split_point_start: // At split points actual search starts from here
if ( PvNode if ( PvNode
&& value > alpha && value > alpha
&& value < beta) // We want always alpha < beta && value < beta) // We want always alpha < beta
alpha = value; {
alpha = bestValue; // Update alpha here!
}
if (SpNode && !thisThread->cutoff_occurred()) if (SpNode && !thisThread->cutoff_occurred())
{ {
sp->bestValue = value; sp->bestValue = bestValue;
sp->bestMove = move; sp->bestMove = bestMove;
sp->alpha = alpha; sp->alpha = alpha;
if (value >= beta) if (bestValue >= beta)
sp->cutoff = true; sp->cutoff = true;
} }
} }
@ -1037,7 +1035,7 @@ split_point_start: // At split points actual search starts from here
&& !Signals.stop && !Signals.stop
&& !thisThread->cutoff_occurred()) && !thisThread->cutoff_occurred())
bestValue = Threads.split<FakeSplit>(pos, ss, alpha, beta, bestValue, &bestMove, bestValue = Threads.split<FakeSplit>(pos, ss, alpha, beta, bestValue, &bestMove,
depth, threatMove, moveCount, &mp, NT); depth, threatMove, moveCount, mp, NT);
} }
// Step 20. Check for mate and stalemate // Step 20. Check for mate and stalemate
@ -1046,41 +1044,42 @@ split_point_start: // At split points actual search starts from here
// case of Signals.stop or thread.cutoff_occurred() are set, but this is // case of Signals.stop or thread.cutoff_occurred() are set, but this is
// harmless because return value is discarded anyhow in the parent nodes. // harmless because return value is discarded anyhow in the parent nodes.
// If we are in a singular extension search then return a fail low score. // If we are in a singular extension search then return a fail low score.
if (!moveCount) // A split node has at least one move, the one tried before to be splitted.
return excludedMove ? oldAlpha : inCheck ? mated_in(ss->ply) : VALUE_DRAW; if (!SpNode && !moveCount)
return excludedMove ? alpha : inCheck ? mated_in(ss->ply) : VALUE_DRAW;
// If we have pruned all the moves without searching return a fail-low score // If we have pruned all the moves without searching return a fail-low score
if (bestValue == -VALUE_INFINITE) if (bestValue == -VALUE_INFINITE)
{ {
assert(!playedMoveCount); assert(!playedMoveCount);
bestValue = oldAlpha; bestValue = alpha;
} }
// Step 21. Update tables // Step 21. Update tables
// Update transposition table entry, killers and history // Update transposition table entry, killers and history
if (!SpNode && !Signals.stop && !thisThread->cutoff_occurred()) if (!SpNode && !Signals.stop && !thisThread->cutoff_occurred())
{ {
move = bestValue <= oldAlpha ? MOVE_NONE : bestMove; Move ttm = bestValue <= oldAlpha ? MOVE_NONE : bestMove;
bt = bestValue <= oldAlpha ? BOUND_UPPER Bound bt = bestValue <= oldAlpha ? BOUND_UPPER
: bestValue >= beta ? BOUND_LOWER : BOUND_EXACT; : bestValue >= beta ? BOUND_LOWER : BOUND_EXACT;
TT.store(posKey, value_to_tt(bestValue, ss->ply), bt, depth, move, ss->eval, ss->evalMargin); TT.store(posKey, value_to_tt(bestValue, ss->ply), bt, depth, ttm, ss->eval, ss->evalMargin);
// Update killers and history for non capture cut-off moves // Update killers and history for non capture cut-off moves
if ( bestValue >= beta if ( bestValue >= beta
&& !pos.is_capture_or_promotion(move) && !pos.is_capture_or_promotion(bestMove)
&& !inCheck) && !inCheck)
{ {
if (move != ss->killers[0]) if (bestMove != ss->killers[0])
{ {
ss->killers[1] = ss->killers[0]; ss->killers[1] = ss->killers[0];
ss->killers[0] = move; ss->killers[0] = bestMove;
} }
// Increase history value of the cut-off move // Increase history value of the cut-off move
Value bonus = Value(int(depth) * int(depth)); Value bonus = Value(int(depth) * int(depth));
H.add(pos.piece_moved(move), to_sq(move), bonus); H.add(pos.piece_moved(bestMove), to_sq(bestMove), bonus);
// Decrease history of all the other played non-capture moves // Decrease history of all the other played non-capture moves
for (int i = 0; i < playedMoveCount - 1; i++) for (int i = 0; i < playedMoveCount - 1; i++)

View file

@ -284,8 +284,8 @@ bool ThreadPool::available_slave_exists(Thread* master) const {
template <bool Fake> template <bool Fake>
Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta, Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
Value bestValue, Move* bestMove, Depth depth, Value bestValue, Move* bestMove, Depth depth, Move threatMove,
Move threatMove, int moveCount, MovePicker* mp, int nodeType) { int moveCount, MovePicker& mp, int nodeType) {
assert(pos.pos_is_ok()); assert(pos.pos_is_ok());
assert(bestValue > -VALUE_INFINITE); assert(bestValue > -VALUE_INFINITE);
@ -313,7 +313,7 @@ Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
sp.beta = beta; sp.beta = beta;
sp.nodeType = nodeType; sp.nodeType = nodeType;
sp.bestValue = bestValue; sp.bestValue = bestValue;
sp.mp = mp; sp.mp = &mp;
sp.moveCount = moveCount; sp.moveCount = moveCount;
sp.pos = &pos; sp.pos = &pos;
sp.nodes = 0; sp.nodes = 0;
@ -381,8 +381,8 @@ Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
} }
// Explicit template instantiations // Explicit template instantiations
template Value ThreadPool::split<false>(Position&, Stack*, Value, Value, Value, Move*, Depth, Move, int, MovePicker*, int); template Value ThreadPool::split<false>(Position&, Stack*, Value, Value, Value, Move*, Depth, Move, int, MovePicker&, int);
template Value ThreadPool::split<true>(Position&, Stack*, Value, Value, Value, Move*, Depth, Move, int, MovePicker*, int); template Value ThreadPool::split<true>(Position&, Stack*, Value, Value, Value, Move*, Depth, Move, int, MovePicker&, int);
// set_timer() is used to set the timer to trigger after msec milliseconds. // set_timer() is used to set the timer to trigger after msec milliseconds.

View file

@ -151,7 +151,7 @@ public:
template <bool Fake> template <bool Fake>
Value split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value bestValue, Move* bestMove, Value split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value bestValue, Move* bestMove,
Depth depth, Move threatMove, int moveCount, MovePicker* mp, int nodeType); Depth depth, Move threatMove, int moveCount, MovePicker& mp, int nodeType);
private: private:
friend class Thread; friend class Thread;
friend void check_time(); friend void check_time();