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;
|
||||
Move ttMove, move, excludedMove, bestMove, threatMove;
|
||||
Depth ext, newDepth;
|
||||
Bound bt;
|
||||
Value bestValue, value, oldAlpha, ttValue;
|
||||
Value refinedValue, nullValue, futilityValue;
|
||||
bool pvMove, inCheck, singularExtensionNode, givesCheck;
|
||||
bool captureOrPromotion, dangerous, doFullDepthSearch;
|
||||
int moveCount, playedMoveCount;
|
||||
|
||||
// Step 1. Initialize node
|
||||
Thread* thisThread = pos.this_thread();
|
||||
moveCount = playedMoveCount = 0;
|
||||
oldAlpha = alpha;
|
||||
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+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
|
||||
if (PvNode && 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)
|
||||
{
|
||||
// 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
|
||||
// position in the list is preserved, just the PV is pushed up.
|
||||
rm.score = -VALUE_INFINITE;
|
||||
|
||||
}
|
||||
|
||||
if (value > bestValue)
|
||||
|
@ -1016,15 +1012,17 @@ split_point_start: // At split points actual search starts from here
|
|||
if ( PvNode
|
||||
&& value > alpha
|
||||
&& value < beta) // We want always alpha < beta
|
||||
alpha = value;
|
||||
{
|
||||
alpha = bestValue; // Update alpha here!
|
||||
}
|
||||
|
||||
if (SpNode && !thisThread->cutoff_occurred())
|
||||
{
|
||||
sp->bestValue = value;
|
||||
sp->bestMove = move;
|
||||
sp->bestValue = bestValue;
|
||||
sp->bestMove = bestMove;
|
||||
sp->alpha = alpha;
|
||||
|
||||
if (value >= beta)
|
||||
if (bestValue >= beta)
|
||||
sp->cutoff = true;
|
||||
}
|
||||
}
|
||||
|
@ -1037,7 +1035,7 @@ split_point_start: // At split points actual search starts from here
|
|||
&& !Signals.stop
|
||||
&& !thisThread->cutoff_occurred())
|
||||
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
|
||||
|
@ -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
|
||||
// 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 (!moveCount)
|
||||
return excludedMove ? oldAlpha : inCheck ? mated_in(ss->ply) : VALUE_DRAW;
|
||||
// A split node has at least one move, the one tried before to be splitted.
|
||||
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 (bestValue == -VALUE_INFINITE)
|
||||
{
|
||||
assert(!playedMoveCount);
|
||||
|
||||
bestValue = oldAlpha;
|
||||
bestValue = alpha;
|
||||
}
|
||||
|
||||
// Step 21. Update tables
|
||||
// Update transposition table entry, killers and history
|
||||
if (!SpNode && !Signals.stop && !thisThread->cutoff_occurred())
|
||||
{
|
||||
move = bestValue <= oldAlpha ? MOVE_NONE : bestMove;
|
||||
bt = bestValue <= oldAlpha ? BOUND_UPPER
|
||||
: bestValue >= beta ? BOUND_LOWER : BOUND_EXACT;
|
||||
Move ttm = bestValue <= oldAlpha ? MOVE_NONE : bestMove;
|
||||
Bound bt = bestValue <= oldAlpha ? BOUND_UPPER
|
||||
: 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
|
||||
if ( bestValue >= beta
|
||||
&& !pos.is_capture_or_promotion(move)
|
||||
&& !pos.is_capture_or_promotion(bestMove)
|
||||
&& !inCheck)
|
||||
{
|
||||
if (move != ss->killers[0])
|
||||
if (bestMove != 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
|
||||
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
|
||||
for (int i = 0; i < playedMoveCount - 1; i++)
|
||||
|
|
|
@ -284,8 +284,8 @@ bool ThreadPool::available_slave_exists(Thread* master) const {
|
|||
|
||||
template <bool Fake>
|
||||
Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||
Value bestValue, Move* bestMove, Depth depth,
|
||||
Move threatMove, int moveCount, MovePicker* mp, int nodeType) {
|
||||
Value bestValue, Move* bestMove, Depth depth, Move threatMove,
|
||||
int moveCount, MovePicker& mp, int nodeType) {
|
||||
|
||||
assert(pos.pos_is_ok());
|
||||
assert(bestValue > -VALUE_INFINITE);
|
||||
|
@ -313,7 +313,7 @@ Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
|||
sp.beta = beta;
|
||||
sp.nodeType = nodeType;
|
||||
sp.bestValue = bestValue;
|
||||
sp.mp = mp;
|
||||
sp.mp = ∓
|
||||
sp.moveCount = moveCount;
|
||||
sp.pos = &pos;
|
||||
sp.nodes = 0;
|
||||
|
@ -381,8 +381,8 @@ Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
|
|||
}
|
||||
|
||||
// Explicit template instantiations
|
||||
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<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);
|
||||
|
||||
|
||||
// set_timer() is used to set the timer to trigger after msec milliseconds.
|
||||
|
|
|
@ -151,7 +151,7 @@ public:
|
|||
|
||||
template <bool Fake>
|
||||
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:
|
||||
friend class Thread;
|
||||
friend void check_time();
|
||||
|
|
Loading…
Add table
Reference in a new issue