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:
parent
faaa1f1116
commit
1b6b711c44
3 changed files with 46 additions and 47 deletions
|
@ -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++)
|
||||||
|
|
|
@ -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 = ∓
|
||||||
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.
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue