mirror of
https://github.com/peterosterlund2/droidfish.git
synced 2025-12-17 19:22:18 +01:00
DroidFish: Updated stockfish engine to git version from 2016-07-16.
This commit is contained in:
@@ -261,19 +261,6 @@ void MainThread::search() {
|
||||
DrawValue[ us] = VALUE_DRAW - Value(contempt);
|
||||
DrawValue[~us] = VALUE_DRAW + Value(contempt);
|
||||
|
||||
TB::Hits = 0;
|
||||
TB::RootInTB = false;
|
||||
TB::UseRule50 = Options["Syzygy50MoveRule"];
|
||||
TB::ProbeDepth = Options["SyzygyProbeDepth"] * ONE_PLY;
|
||||
TB::Cardinality = Options["SyzygyProbeLimit"];
|
||||
|
||||
// Skip TB probing when no TB found: !TBLargest -> !TB::Cardinality
|
||||
if (TB::Cardinality > TB::MaxCardinality)
|
||||
{
|
||||
TB::Cardinality = TB::MaxCardinality;
|
||||
TB::ProbeDepth = DEPTH_ZERO;
|
||||
}
|
||||
|
||||
if (rootMoves.empty())
|
||||
{
|
||||
rootMoves.push_back(RootMove(MOVE_NONE));
|
||||
@@ -283,38 +270,6 @@ void MainThread::search() {
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( TB::Cardinality >= rootPos.count<ALL_PIECES>(WHITE)
|
||||
+ rootPos.count<ALL_PIECES>(BLACK)
|
||||
&& !rootPos.can_castle(ANY_CASTLING))
|
||||
{
|
||||
// If the current root position is in the tablebases, then RootMoves
|
||||
// contains only moves that preserve the draw or the win.
|
||||
TB::RootInTB = Tablebases::root_probe(rootPos, rootMoves, TB::Score);
|
||||
|
||||
if (TB::RootInTB)
|
||||
TB::Cardinality = 0; // Do not probe tablebases during the search
|
||||
|
||||
else // If DTZ tables are missing, use WDL tables as a fallback
|
||||
{
|
||||
// Filter out moves that do not preserve the draw or the win.
|
||||
TB::RootInTB = Tablebases::root_probe_wdl(rootPos, rootMoves, TB::Score);
|
||||
|
||||
// Only probe during search if winning
|
||||
if (TB::RootInTB && TB::Score <= VALUE_DRAW)
|
||||
TB::Cardinality = 0;
|
||||
}
|
||||
|
||||
if (TB::RootInTB)
|
||||
{
|
||||
TB::Hits = rootMoves.size();
|
||||
|
||||
if (!TB::UseRule50)
|
||||
TB::Score = TB::Score > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1
|
||||
: TB::Score < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1
|
||||
: VALUE_DRAW;
|
||||
}
|
||||
}
|
||||
|
||||
for (Thread* th : Threads)
|
||||
if (th != this)
|
||||
th->start_searching();
|
||||
@@ -458,11 +413,6 @@ void Thread::search() {
|
||||
// search the already searched PV lines are preserved.
|
||||
std::stable_sort(rootMoves.begin() + PVIdx, rootMoves.end());
|
||||
|
||||
// Write PV back to the transposition table in case the relevant
|
||||
// entries have been overwritten during the search.
|
||||
for (size_t i = 0; i <= PVIdx; ++i)
|
||||
rootMoves[i].insert_pv_in_tt(rootPos);
|
||||
|
||||
// If search has been stopped, break immediately. Sorting and
|
||||
// writing PV back to TT is safe because RootMoves is still
|
||||
// valid, although it refers to the previous iteration.
|
||||
@@ -599,6 +549,7 @@ namespace {
|
||||
assert(-VALUE_INFINITE <= alpha && alpha < beta && beta <= VALUE_INFINITE);
|
||||
assert(PvNode || (alpha == beta - 1));
|
||||
assert(DEPTH_ZERO < depth && depth < DEPTH_MAX);
|
||||
assert(!(PvNode && cutNode));
|
||||
|
||||
Move pv[MAX_PLY+1], quietsSearched[64];
|
||||
StateInfo st;
|
||||
@@ -606,9 +557,9 @@ namespace {
|
||||
Key posKey;
|
||||
Move ttMove, move, excludedMove, bestMove;
|
||||
Depth extension, newDepth, predictedDepth;
|
||||
Value bestValue, value, ttValue, eval, nullValue, futilityValue;
|
||||
Value bestValue, value, ttValue, eval, nullValue;
|
||||
bool ttHit, inCheck, givesCheck, singularExtensionNode, improving;
|
||||
bool captureOrPromotion, doFullDepthSearch;
|
||||
bool captureOrPromotion, doFullDepthSearch, moveCountPruning;
|
||||
Piece moved_piece;
|
||||
int moveCount, quietCount;
|
||||
|
||||
@@ -780,6 +731,7 @@ namespace {
|
||||
if ( !PvNode
|
||||
&& depth >= 2 * ONE_PLY
|
||||
&& eval >= beta
|
||||
&& (ss->staticEval >= beta - 35 * (depth / ONE_PLY - 6) || depth >= 13 * ONE_PLY)
|
||||
&& pos.non_pawn_material(pos.side_to_move()))
|
||||
{
|
||||
ss->currentMove = MOVE_NULL;
|
||||
@@ -855,7 +807,7 @@ namespace {
|
||||
{
|
||||
Depth d = depth - 2 * ONE_PLY - (PvNode ? DEPTH_ZERO : depth / 4);
|
||||
ss->skipEarlyPruning = true;
|
||||
search<NT>(pos, ss, alpha, beta, d, true);
|
||||
search<NT>(pos, ss, alpha, beta, d, cutNode);
|
||||
ss->skipEarlyPruning = false;
|
||||
|
||||
tte = TT.probe(posKey, ttHit);
|
||||
@@ -864,7 +816,6 @@ namespace {
|
||||
|
||||
moves_loop: // When in check search starts from here
|
||||
|
||||
Square prevSq = to_sq((ss-1)->currentMove);
|
||||
const CounterMoveStats* cmh = (ss-1)->counterMoves;
|
||||
const CounterMoveStats* fmh = (ss-2)->counterMoves;
|
||||
const CounterMoveStats* fmh2 = (ss-4)->counterMoves;
|
||||
@@ -873,7 +824,7 @@ moves_loop: // When in check search starts from here
|
||||
CheckInfo ci(pos);
|
||||
value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc
|
||||
improving = ss->staticEval >= (ss-2)->staticEval
|
||||
|| ss->staticEval == VALUE_NONE
|
||||
/* || ss->staticEval == VALUE_NONE Already implicit in the previous condition */
|
||||
||(ss-2)->staticEval == VALUE_NONE;
|
||||
|
||||
singularExtensionNode = !rootNode
|
||||
@@ -919,8 +870,13 @@ moves_loop: // When in check search starts from here
|
||||
? ci.checkSquares[type_of(pos.piece_on(from_sq(move)))] & to_sq(move)
|
||||
: pos.gives_check(move, ci);
|
||||
|
||||
moveCountPruning = depth < 16 * ONE_PLY
|
||||
&& moveCount >= FutilityMoveCounts[improving][depth];
|
||||
|
||||
// Step 12. Extend checks
|
||||
if (givesCheck && pos.see_sign(move) >= VALUE_ZERO)
|
||||
if ( givesCheck
|
||||
&& !moveCountPruning
|
||||
&& pos.see_sign(move) >= VALUE_ZERO)
|
||||
extension = ONE_PLY;
|
||||
|
||||
// Singular extension search. If all moves but one fail low on a search of
|
||||
@@ -956,8 +912,7 @@ moves_loop: // When in check search starts from here
|
||||
&& bestValue > VALUE_MATED_IN_MAX_PLY)
|
||||
{
|
||||
// Move count based pruning
|
||||
if ( depth < 16 * ONE_PLY
|
||||
&& moveCount >= FutilityMoveCounts[improving][depth])
|
||||
if (moveCountPruning)
|
||||
continue;
|
||||
|
||||
// Countermoves based pruning
|
||||
@@ -971,16 +926,9 @@ moves_loop: // When in check search starts from here
|
||||
predictedDepth = std::max(newDepth - reduction<PvNode>(improving, depth, moveCount), DEPTH_ZERO);
|
||||
|
||||
// Futility pruning: parent node
|
||||
if (predictedDepth < 7 * ONE_PLY)
|
||||
{
|
||||
futilityValue = ss->staticEval + futility_margin(predictedDepth) + 256;
|
||||
|
||||
if (futilityValue <= alpha)
|
||||
{
|
||||
bestValue = std::max(bestValue, futilityValue);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ( predictedDepth < 7 * ONE_PLY
|
||||
&& ss->staticEval + futility_margin(predictedDepth) + 256 <= alpha)
|
||||
continue;
|
||||
|
||||
// Prune moves with negative SEE at low depths
|
||||
if (predictedDepth < 4 * ONE_PLY && pos.see_sign(move) < VALUE_ZERO)
|
||||
@@ -1016,22 +964,21 @@ moves_loop: // When in check search starts from here
|
||||
+ (fmh2 ? (*fmh2)[moved_piece][to_sq(move)] : VALUE_ZERO);
|
||||
|
||||
// Increase reduction for cut nodes
|
||||
if (!PvNode && cutNode)
|
||||
r += ONE_PLY;
|
||||
|
||||
// Decrease/increase reduction for moves with a good/bad history
|
||||
int rHist = (val - 10000) / 20000;
|
||||
r = std::max(DEPTH_ZERO, r - rHist * ONE_PLY);
|
||||
if (cutNode)
|
||||
r += 2 * ONE_PLY;
|
||||
|
||||
// Decrease reduction for moves that escape a capture. Filter out
|
||||
// castling moves, because they are coded as "king captures rook" and
|
||||
// hence break make_move(). Also use see() instead of see_sign(),
|
||||
// because the destination square is empty.
|
||||
if ( r
|
||||
&& type_of(move) == NORMAL
|
||||
&& type_of(pos.piece_on(to_sq(move))) != PAWN
|
||||
&& pos.see(make_move(to_sq(move), from_sq(move))) < VALUE_ZERO)
|
||||
r = std::max(DEPTH_ZERO, r - ONE_PLY);
|
||||
else if ( type_of(move) == NORMAL
|
||||
&& type_of(pos.piece_on(to_sq(move))) != PAWN
|
||||
&& pos.see(make_move(to_sq(move), from_sq(move))) < VALUE_ZERO)
|
||||
r -= 2 * ONE_PLY;
|
||||
|
||||
// Decrease/increase reduction for moves with a good/bad history
|
||||
int rHist = (val - 10000) / 20000;
|
||||
r = std::max(DEPTH_ZERO, r - rHist * ONE_PLY);
|
||||
|
||||
Depth d = std::max(newDepth - r, ONE_PLY);
|
||||
|
||||
@@ -1159,11 +1106,11 @@ moves_loop: // When in check search starts from here
|
||||
// Bonus for prior countermove that caused the fail low
|
||||
else if ( depth >= 3 * ONE_PLY
|
||||
&& !bestMove
|
||||
&& !inCheck
|
||||
&& !pos.captured_piece_type()
|
||||
&& is_ok((ss-1)->currentMove))
|
||||
{
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY - 1);
|
||||
Square prevSq = to_sq((ss-1)->currentMove);
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + 2 * depth / ONE_PLY - 2);
|
||||
if ((ss-2)->counterMoves)
|
||||
(ss-2)->counterMoves->update(pos.piece_on(prevSq), prevSq, bonus);
|
||||
|
||||
@@ -1443,7 +1390,7 @@ moves_loop: // When in check search starts from here
|
||||
ss->killers[0] = move;
|
||||
}
|
||||
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY - 1);
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + 2 * depth / ONE_PLY - 2);
|
||||
|
||||
Square prevSq = to_sq((ss-1)->currentMove);
|
||||
CounterMoveStats* cmh = (ss-1)->counterMoves;
|
||||
@@ -1484,13 +1431,13 @@ moves_loop: // When in check search starts from here
|
||||
if ((ss-1)->moveCount == 1 && !pos.captured_piece_type())
|
||||
{
|
||||
if ((ss-2)->counterMoves)
|
||||
(ss-2)->counterMoves->update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY);
|
||||
(ss-2)->counterMoves->update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY - 1);
|
||||
|
||||
if ((ss-3)->counterMoves)
|
||||
(ss-3)->counterMoves->update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY);
|
||||
(ss-3)->counterMoves->update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY - 1);
|
||||
|
||||
if ((ss-5)->counterMoves)
|
||||
(ss-5)->counterMoves->update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY);
|
||||
(ss-5)->counterMoves->update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY - 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1613,33 +1560,6 @@ string UCI::pv(const Position& pos, Depth depth, Value alpha, Value beta) {
|
||||
}
|
||||
|
||||
|
||||
/// RootMove::insert_pv_in_tt() is called at the end of a search iteration, and
|
||||
/// inserts the PV back into the TT. This makes sure the old PV moves are searched
|
||||
/// first, even if the old TT entries have been overwritten.
|
||||
|
||||
void RootMove::insert_pv_in_tt(Position& pos) {
|
||||
|
||||
StateInfo state[MAX_PLY], *st = state;
|
||||
bool ttHit;
|
||||
|
||||
for (Move m : pv)
|
||||
{
|
||||
assert(MoveList<LEGAL>(pos).contains(m));
|
||||
|
||||
TTEntry* tte = TT.probe(pos.key(), ttHit);
|
||||
|
||||
if (!ttHit || tte->move() != m) // Don't overwrite correct entries
|
||||
tte->save(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE,
|
||||
m, VALUE_NONE, TT.generation());
|
||||
|
||||
pos.do_move(m, *st++, pos.gives_check(m, CheckInfo(pos)));
|
||||
}
|
||||
|
||||
for (size_t i = pv.size(); i > 0; )
|
||||
pos.undo_move(pv[--i]);
|
||||
}
|
||||
|
||||
|
||||
/// RootMove::extract_ponder_from_tt() is called in case we have no ponder move
|
||||
/// before exiting the search, for instance, in case we stop the search during a
|
||||
/// fail high at root. We try hard to have a ponder move to return to the GUI,
|
||||
@@ -1654,14 +1574,60 @@ bool RootMove::extract_ponder_from_tt(Position& pos)
|
||||
|
||||
pos.do_move(pv[0], st, pos.gives_check(pv[0], CheckInfo(pos)));
|
||||
TTEntry* tte = TT.probe(pos.key(), ttHit);
|
||||
pos.undo_move(pv[0]);
|
||||
|
||||
if (ttHit)
|
||||
{
|
||||
Move m = tte->move(); // Local copy to be SMP safe
|
||||
if (MoveList<LEGAL>(pos).contains(m))
|
||||
return pv.push_back(m), true;
|
||||
pv.push_back(m);
|
||||
}
|
||||
|
||||
return false;
|
||||
pos.undo_move(pv[0]);
|
||||
return pv.size() > 1;
|
||||
}
|
||||
|
||||
void Tablebases::filter_root_moves(Position& pos, Search::RootMoves& rootMoves) {
|
||||
|
||||
Hits = 0;
|
||||
RootInTB = false;
|
||||
UseRule50 = Options["Syzygy50MoveRule"];
|
||||
ProbeDepth = Options["SyzygyProbeDepth"] * ONE_PLY;
|
||||
Cardinality = Options["SyzygyProbeLimit"];
|
||||
|
||||
// Skip TB probing when no TB found: !TBLargest -> !TB::Cardinality
|
||||
if (Cardinality > MaxCardinality)
|
||||
{
|
||||
Cardinality = MaxCardinality;
|
||||
ProbeDepth = DEPTH_ZERO;
|
||||
}
|
||||
|
||||
if (Cardinality < popcount(pos.pieces()) || pos.can_castle(ANY_CASTLING))
|
||||
return;
|
||||
|
||||
// If the current root position is in the tablebases, then RootMoves
|
||||
// contains only moves that preserve the draw or the win.
|
||||
RootInTB = root_probe(pos, rootMoves, TB::Score);
|
||||
|
||||
if (RootInTB)
|
||||
Cardinality = 0; // Do not probe tablebases during the search
|
||||
|
||||
else // If DTZ tables are missing, use WDL tables as a fallback
|
||||
{
|
||||
// Filter out moves that do not preserve the draw or the win.
|
||||
RootInTB = root_probe_wdl(pos, rootMoves, TB::Score);
|
||||
|
||||
// Only probe during search if winning
|
||||
if (TB::RootInTB && TB::Score <= VALUE_DRAW)
|
||||
Cardinality = 0;
|
||||
}
|
||||
|
||||
if (RootInTB)
|
||||
{
|
||||
Hits = rootMoves.size();
|
||||
|
||||
if (!UseRule50)
|
||||
TB::Score = TB::Score > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1
|
||||
: TB::Score < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1
|
||||
: VALUE_DRAW;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user