mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-23 21:27:14 +00:00
Merge branch 'master' into clusterMergeMaster16
This commit is contained in:
+25
-24
@@ -247,7 +247,7 @@ void MainThread::search() {
|
||||
th->previousDepth = bestThread->completedDepth;
|
||||
|
||||
// Prepare PVLine and ponder move
|
||||
std::string PVLine = UCI::pv(bestThread->rootPos, bestThread->completedDepth, -VALUE_INFINITE, VALUE_INFINITE);
|
||||
std::string PVLine = UCI::pv(bestThread->rootPos, bestThread->completedDepth);
|
||||
bestPreviousScore = bestThread->rootMoves[0].score;
|
||||
bestPreviousAverageScore = bestThread->rootMoves[0].averageScore;
|
||||
|
||||
@@ -339,7 +339,6 @@ void Thread::search() {
|
||||
|
||||
complexityAverage.set(155, 1);
|
||||
|
||||
trend = SCORE_ZERO;
|
||||
optimism[us] = optimism[~us] = VALUE_ZERO;
|
||||
|
||||
int searchAgainCounter = 0;
|
||||
@@ -387,11 +386,7 @@ void Thread::search() {
|
||||
alpha = std::max(prev - delta,-VALUE_INFINITE);
|
||||
beta = std::min(prev + delta, VALUE_INFINITE);
|
||||
|
||||
// Adjust trend and optimism based on root move's previousScore
|
||||
int tr = 116 * prev / (std::abs(prev) + 89);
|
||||
trend = (us == WHITE ? make_score(tr, tr / 2)
|
||||
: -make_score(tr, tr / 2));
|
||||
|
||||
// Adjust optimism based on root move's previousScore
|
||||
int opt = 118 * prev / (std::abs(prev) + 169);
|
||||
optimism[ us] = Value(opt);
|
||||
optimism[~us] = -optimism[us];
|
||||
@@ -430,7 +425,7 @@ void Thread::search() {
|
||||
&& (bestValue <= alpha || bestValue >= beta)
|
||||
&& Time.elapsed() > 3000)
|
||||
{
|
||||
sync_cout << UCI::pv(rootPos, rootDepth, alpha, beta) << sync_endl;
|
||||
sync_cout << UCI::pv(rootPos, rootDepth) << sync_endl;
|
||||
Cluster::cluster_info(rootDepth);
|
||||
}
|
||||
|
||||
@@ -464,7 +459,7 @@ void Thread::search() {
|
||||
if ( Cluster::is_root() && mainThread
|
||||
&& (Threads.stop || pvIdx + 1 == multiPV || Time.elapsed() > 3000))
|
||||
{
|
||||
sync_cout << UCI::pv(rootPos, rootDepth, alpha, beta) << sync_endl;
|
||||
sync_cout << UCI::pv(rootPos, rootDepth) << sync_endl;
|
||||
Cluster::cluster_info(rootDepth);
|
||||
}
|
||||
}
|
||||
@@ -901,7 +896,7 @@ namespace {
|
||||
{
|
||||
assert(probCutBeta < VALUE_INFINITE);
|
||||
|
||||
MovePicker mp(pos, ttMove, probCutBeta - ss->staticEval, depth - 3, &captureHistory);
|
||||
MovePicker mp(pos, ttMove, probCutBeta - ss->staticEval, &captureHistory);
|
||||
|
||||
while ((move = mp.next_move()) != MOVE_NONE)
|
||||
if (move != excludedMove && pos.legal(move))
|
||||
@@ -1203,13 +1198,13 @@ moves_loop: // When in check, search starts here
|
||||
if (singularQuietLMR)
|
||||
r--;
|
||||
|
||||
// Dicrease reduction if we move a threatened piece (~1 Elo)
|
||||
// Decrease reduction if we move a threatened piece (~1 Elo)
|
||||
if ( depth > 9
|
||||
&& (mp.threatenedPieces & from_sq(move)))
|
||||
r--;
|
||||
|
||||
// Increase reduction if next ply has a lot of fail high
|
||||
if ((ss+1)->cutoffCnt > 3 && !PvNode)
|
||||
if ((ss+1)->cutoffCnt > 3)
|
||||
r++;
|
||||
|
||||
ss->statScore = 2 * thisThread->mainHistory[us][from_to(move)]
|
||||
@@ -1219,7 +1214,7 @@ moves_loop: // When in check, search starts here
|
||||
- 4433;
|
||||
|
||||
// Decrease/increase reduction for moves with a good/bad history (~30 Elo)
|
||||
r -= ss->statScore / 13628;
|
||||
r -= ss->statScore / (13628 + 4000 * (depth > 7 && depth < 19));
|
||||
|
||||
// In general we want to cap the LMR depth search at newDepth, but when
|
||||
// reduction is negative, we allow this move a limited search extension
|
||||
@@ -1231,8 +1226,15 @@ moves_loop: // When in check, search starts here
|
||||
// Do full depth search when reduced LMR search fails high
|
||||
if (value > alpha && d < newDepth)
|
||||
{
|
||||
// Adjust full depth search based on LMR results - if result
|
||||
// was good enough search deeper, if it was bad enough search shallower
|
||||
const bool doDeeperSearch = value > (alpha + 64 + 11 * (newDepth - d));
|
||||
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth + doDeeperSearch, !cutNode);
|
||||
const bool doShallowerSearch = value < bestValue + newDepth;
|
||||
|
||||
newDepth += doDeeperSearch - doShallowerSearch;
|
||||
|
||||
if (newDepth > d)
|
||||
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode);
|
||||
|
||||
int bonus = value > alpha ? stat_bonus(newDepth)
|
||||
: -stat_bonus(newDepth);
|
||||
@@ -1286,6 +1288,8 @@ moves_loop: // When in check, search starts here
|
||||
{
|
||||
rm.score = value;
|
||||
rm.selDepth = thisThread->selDepth;
|
||||
rm.scoreLowerbound = value >= beta;
|
||||
rm.scoreUpperbound = value <= alpha;
|
||||
rm.pv.resize(1);
|
||||
|
||||
assert((ss+1)->pv);
|
||||
@@ -1339,8 +1343,6 @@ moves_loop: // When in check, search starts here
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ss->cutoffCnt = 0;
|
||||
|
||||
|
||||
// If the move is worse than some previously searched move, remember it to update its stats later
|
||||
@@ -1596,12 +1598,11 @@ moves_loop: // When in check, search starts here
|
||||
&& (*contHist[1])[pos.moved_piece(move)][to_sq(move)] < 0)
|
||||
continue;
|
||||
|
||||
// movecount pruning for quiet check evasions
|
||||
// We prune after 2nd quiet check evasion where being 'in check' is implicitly checked through the counter
|
||||
// and being a 'quiet' apart from being a tt move is assumed after an increment because captures are pushed ahead.
|
||||
if ( bestValue > VALUE_TB_LOSS_IN_MAX_PLY
|
||||
&& quietCheckEvasions > 1
|
||||
&& !capture
|
||||
&& ss->inCheck)
|
||||
continue;
|
||||
&& quietCheckEvasions > 1)
|
||||
break;
|
||||
|
||||
quietCheckEvasions += !capture && ss->inCheck;
|
||||
|
||||
@@ -1869,7 +1870,7 @@ void MainThread::check_time() {
|
||||
/// UCI::pv() formats PV information according to the UCI protocol. UCI requires
|
||||
/// that all (if any) unsearched PV lines are sent using a previous search score.
|
||||
|
||||
string UCI::pv(const Position& pos, Depth depth, Value alpha, Value beta) {
|
||||
string UCI::pv(const Position& pos, Depth depth) {
|
||||
|
||||
std::stringstream ss;
|
||||
TimePoint elapsed = Time.elapsed() + 1;
|
||||
@@ -1907,8 +1908,8 @@ string UCI::pv(const Position& pos, Depth depth, Value alpha, Value beta) {
|
||||
if (Options["UCI_ShowWDL"])
|
||||
ss << UCI::wdl(v, pos.game_ply());
|
||||
|
||||
if (!tb && i == pvIdx)
|
||||
ss << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : "");
|
||||
if (i == pvIdx && !tb && updated) // tablebase- and previous-scores are exact
|
||||
ss << (rootMoves[i].scoreLowerbound ? " lowerbound" : (rootMoves[i].scoreUpperbound ? " upperbound" : ""));
|
||||
|
||||
ss << " nodes " << nodesSearched
|
||||
<< " nps " << nodesSearched * 1000 / elapsed
|
||||
|
||||
Reference in New Issue
Block a user