mirror of
https://github.com/sockspls/badfish
synced 2025-07-12 03:59:15 +00:00
Merge branch 'master' into aspiration
This commit is contained in:
commit
e074a19f5c
1 changed files with 34 additions and 41 deletions
|
@ -482,7 +482,7 @@ namespace {
|
||||||
assert(PvNode || (alpha == beta - 1));
|
assert(PvNode || (alpha == beta - 1));
|
||||||
assert(depth > DEPTH_ZERO);
|
assert(depth > DEPTH_ZERO);
|
||||||
|
|
||||||
Move movesSearched[64];
|
Move quietsSearched[64];
|
||||||
StateInfo st;
|
StateInfo st;
|
||||||
const TTEntry *tte;
|
const TTEntry *tte;
|
||||||
SplitPoint* splitPoint;
|
SplitPoint* splitPoint;
|
||||||
|
@ -493,11 +493,11 @@ namespace {
|
||||||
Value eval, nullValue, futilityValue;
|
Value eval, nullValue, futilityValue;
|
||||||
bool inCheck, givesCheck, pvMove, singularExtensionNode;
|
bool inCheck, givesCheck, pvMove, singularExtensionNode;
|
||||||
bool captureOrPromotion, dangerous, doFullDepthSearch;
|
bool captureOrPromotion, dangerous, doFullDepthSearch;
|
||||||
int moveCount, playedMoveCount;
|
int moveCount, quietCount;
|
||||||
|
|
||||||
// Step 1. Initialize node
|
// Step 1. Initialize node
|
||||||
Thread* thisThread = pos.this_thread();
|
Thread* thisThread = pos.this_thread();
|
||||||
moveCount = playedMoveCount = 0;
|
moveCount = quietCount = 0;
|
||||||
inCheck = pos.checkers();
|
inCheck = pos.checkers();
|
||||||
|
|
||||||
if (SpNode)
|
if (SpNode)
|
||||||
|
@ -605,10 +605,10 @@ namespace {
|
||||||
|
|
||||||
// Update gain for the parent non-capture move given the static position
|
// Update gain for the parent non-capture move given the static position
|
||||||
// evaluation before and after the move.
|
// evaluation before and after the move.
|
||||||
if ( (move = (ss-1)->currentMove) != MOVE_NULL
|
if ( !pos.captured_piece_type()
|
||||||
&& (ss-1)->staticEval != VALUE_NONE
|
|
||||||
&& ss->staticEval != VALUE_NONE
|
&& ss->staticEval != VALUE_NONE
|
||||||
&& !pos.captured_piece_type()
|
&& (ss-1)->staticEval != VALUE_NONE
|
||||||
|
&& (move = (ss-1)->currentMove) != MOVE_NULL
|
||||||
&& type_of(move) == NORMAL)
|
&& type_of(move) == NORMAL)
|
||||||
{
|
{
|
||||||
Square to = to_sq(move);
|
Square to = to_sq(move);
|
||||||
|
@ -917,8 +917,8 @@ split_point_start: // At split points actual search starts from here
|
||||||
|
|
||||||
pvMove = PvNode && moveCount == 1;
|
pvMove = PvNode && moveCount == 1;
|
||||||
ss->currentMove = move;
|
ss->currentMove = move;
|
||||||
if (!SpNode && !captureOrPromotion && playedMoveCount < 64)
|
if (!SpNode && !captureOrPromotion && quietCount < 64)
|
||||||
movesSearched[playedMoveCount++] = move;
|
quietsSearched[quietCount++] = move;
|
||||||
|
|
||||||
// Step 14. Make the move
|
// Step 14. Make the move
|
||||||
pos.do_move(move, st, ci, givesCheck);
|
pos.do_move(move, st, ci, givesCheck);
|
||||||
|
@ -1069,43 +1069,37 @@ split_point_start: // At split points actual search starts from here
|
||||||
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
bestValue = alpha;
|
bestValue = alpha;
|
||||||
}
|
|
||||||
|
|
||||||
if (bestValue >= beta) // Failed high
|
TT.store(posKey, value_to_tt(bestValue, ss->ply),
|
||||||
{
|
bestValue >= beta ? BOUND_LOWER :
|
||||||
TT.store(posKey, value_to_tt(bestValue, ss->ply), BOUND_LOWER, depth,
|
PvNode && bestMove ? BOUND_EXACT : BOUND_UPPER,
|
||||||
bestMove, ss->staticEval, ss->evalMargin);
|
depth, bestMove, ss->staticEval, ss->evalMargin);
|
||||||
|
|
||||||
if (!pos.is_capture_or_promotion(bestMove) && !inCheck)
|
// Quiet best move: update killers, history and countermoves
|
||||||
|
if ( bestValue >= beta
|
||||||
|
&& !pos.is_capture_or_promotion(bestMove)
|
||||||
|
&& !inCheck)
|
||||||
{
|
{
|
||||||
if (bestMove != ss->killers[0])
|
if (ss->killers[0] != bestMove)
|
||||||
{
|
{
|
||||||
ss->killers[1] = ss->killers[0];
|
ss->killers[1] = ss->killers[0];
|
||||||
ss->killers[0] = bestMove;
|
ss->killers[0] = bestMove;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increase history value of the cut-off move
|
// Increase history value of the cut-off move and decrease all the other
|
||||||
|
// played non-capture moves.
|
||||||
Value bonus = Value(int(depth) * int(depth));
|
Value bonus = Value(int(depth) * int(depth));
|
||||||
History.update(pos.piece_moved(bestMove), to_sq(bestMove), bonus);
|
History.update(pos.piece_moved(bestMove), to_sq(bestMove), bonus);
|
||||||
if (is_ok((ss-1)->currentMove))
|
for (int i = 0; i < quietCount - 1; i++)
|
||||||
Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, bestMove);
|
|
||||||
|
|
||||||
// Decrease history of all the other played non-capture moves
|
|
||||||
for (int i = 0; i < playedMoveCount - 1; i++)
|
|
||||||
{
|
{
|
||||||
Move m = movesSearched[i];
|
Move m = quietsSearched[i];
|
||||||
History.update(pos.piece_moved(m), to_sq(m), -bonus);
|
History.update(pos.piece_moved(m), to_sq(m), -bonus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_ok((ss-1)->currentMove))
|
||||||
|
Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, bestMove);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else // Failed low or PV search
|
|
||||||
TT.store(posKey, value_to_tt(bestValue, ss->ply),
|
|
||||||
PvNode && bestMove != MOVE_NONE ? BOUND_EXACT : BOUND_UPPER,
|
|
||||||
depth, bestMove, ss->staticEval, ss->evalMargin);
|
|
||||||
|
|
||||||
assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
|
assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
|
||||||
|
|
||||||
|
@ -1153,8 +1147,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
ttDepth = InCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS
|
ttDepth = InCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS
|
||||||
: DEPTH_QS_NO_CHECKS;
|
: DEPTH_QS_NO_CHECKS;
|
||||||
|
|
||||||
// Transposition table lookup. At PV nodes, we don't use the TT for
|
// Transposition table lookup
|
||||||
// pruning, but only for move ordering.
|
|
||||||
posKey = pos.key();
|
posKey = pos.key();
|
||||||
tte = TT.probe(posKey);
|
tte = TT.probe(posKey);
|
||||||
ttMove = tte ? tte->move() : MOVE_NONE;
|
ttMove = tte ? tte->move() : MOVE_NONE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue