#define V Value
#define S(mg, eg) make_score(mg, eg)
- // Isolated pawn penalty
+ // Pawn penalties
constexpr Score Isolated = S(13, 16);
-
- // Backward pawn penalty
constexpr Score Backward = S(17, 11);
+ constexpr Score Doubled = S(13, 40);
// Connected pawn bonus by opposed, phalanx, #support and rank
Score Connected[2][2][3][RANK_NB];
- // Doubled pawn penalty
- constexpr Score Doubled = S(13, 40);
-
// Strength of pawn shelter for our king by [distance from edge][rank].
// RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king.
constexpr Value ShelterStrength[int(FILE_NB) / 2][RANK_NB] = {
};
// Danger of enemy pawns moving toward our king by [distance from edge][rank].
- // RANK_1 = 0 is used for files where the enemy has no pawn, or their pawn
+ // RANK_1 = 0 is used for files where the enemy has no pawn, or their pawn
// is behind our king.
constexpr Value UnblockedStorm[int(FILE_NB) / 2][RANK_NB] = {
{ V( 25), V( 79), V(107), V( 51), V( 27), V( 0), V( 0) },
for (RootMove& rm : rootMoves)
rm.previousScore = rm.score;
- size_t PVFirst = 0;
- PVLast = 0;
+ size_t pvFirst = 0;
+ pvLast = 0;
// MultiPV loop. We perform a full root search for each PV line
- for (PVIdx = 0; PVIdx < multiPV && !Threads.stop; ++PVIdx)
+ for (pvIdx = 0; pvIdx < multiPV && !Threads.stop; ++pvIdx)
{
- if (PVIdx == PVLast)
+ if (pvIdx == pvLast)
{
- PVFirst = PVLast;
- for (PVLast++; PVLast < rootMoves.size(); PVLast++)
- if (rootMoves[PVLast].TBRank != rootMoves[PVFirst].TBRank)
+ pvFirst = pvLast;
+ for (pvLast++; pvLast < rootMoves.size(); pvLast++)
+ if (rootMoves[pvLast].tbRank != rootMoves[pvFirst].tbRank)
break;
}
// Reset aspiration window starting size
if (rootDepth >= 5 * ONE_PLY)
{
- Value previousScore = rootMoves[PVIdx].previousScore;
+ Value previousScore = rootMoves[pvIdx].previousScore;
delta = Value(18);
alpha = std::max(previousScore - delta,-VALUE_INFINITE);
beta = std::min(previousScore + delta, VALUE_INFINITE);
// and we want to keep the same order for all the moves except the
// new PV that goes to the front. Note that in case of MultiPV
// search the already searched PV lines are preserved.
- std::stable_sort(rootMoves.begin() + PVIdx, rootMoves.begin() + PVLast);
+ std::stable_sort(rootMoves.begin() + pvIdx, rootMoves.begin() + pvLast);
// If search has been stopped, we break immediately. Sorting is
// safe because RootMoves is still valid, although it refers to
}
// Sort the PV lines searched so far and update the GUI
- std::stable_sort(rootMoves.begin() + PVFirst, rootMoves.begin() + PVIdx + 1);
+ std::stable_sort(rootMoves.begin() + pvFirst, rootMoves.begin() + pvIdx + 1);
if ( mainThread
- && (Threads.stop || PVIdx + 1 == multiPV || Time.elapsed() > 3000))
+ && (Threads.stop || pvIdx + 1 == multiPV || Time.elapsed() > 3000))
sync_cout << UCI::pv(rootPos, rootDepth, alpha, beta) << sync_endl;
}
posKey = pos.key() ^ Key(excludedMove << 16); // Isn't a very good hash
tte = TT.probe(posKey, ttHit);
ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE;
- ttMove = rootNode ? thisThread->rootMoves[thisThread->PVIdx].pv[0]
+ ttMove = rootNode ? thisThread->rootMoves[thisThread->pvIdx].pv[0]
: ttHit ? tte->move() : MOVE_NONE;
// At non-PV nodes we check for an early TT cutoff
&& ss->staticEval >= beta - 36 * depth / ONE_PLY + 225
&& !excludedMove
&& pos.non_pawn_material(us)
- && (ss->ply > thisThread->nmp_min_ply || us != thisThread->nmp_color))
+ && (ss->ply > thisThread->nmpMinPly || us != thisThread->nmpColor))
{
assert(eval - beta >= 0);
if (nullValue >= VALUE_MATE_IN_MAX_PLY)
nullValue = beta;
- if (thisThread->nmp_min_ply || (abs(beta) < VALUE_KNOWN_WIN && depth < 12 * ONE_PLY))
+ if (thisThread->nmpMinPly || (abs(beta) < VALUE_KNOWN_WIN && depth < 12 * ONE_PLY))
return nullValue;
- assert(!thisThread->nmp_min_ply); // Recursive verification is not allowed
+ assert(!thisThread->nmpMinPly); // Recursive verification is not allowed
// Do verification search at high depths, with null move pruning disabled
- // for us, until ply exceeds nmp_min_ply.
- thisThread->nmp_min_ply = ss->ply + 3 * (depth-R) / 4 - 1;
- thisThread->nmp_color = us;
+ // for us, until ply exceeds nmpMinPly.
+ thisThread->nmpMinPly = ss->ply + 3 * (depth-R) / 4 - 1;
+ thisThread->nmpColor = us;
Value v = search<NonPV>(pos, ss, beta-1, beta, depth-R, false);
- thisThread->nmp_min_ply = 0;
+ thisThread->nmpMinPly = 0;
if (v >= beta)
return nullValue;
// Move List. As a consequence any illegal move is also skipped. In MultiPV
// mode we also skip PV moves which have been already searched and those
// of lower "TB rank" if we are in a TB root position.
- if (rootNode && !std::count(thisThread->rootMoves.begin() + thisThread->PVIdx,
- thisThread->rootMoves.begin() + thisThread->PVLast, move))
+ if (rootNode && !std::count(thisThread->rootMoves.begin() + thisThread->pvIdx,
+ thisThread->rootMoves.begin() + thisThread->pvLast, move))
continue;
ss->moveCount = ++moveCount;
if (rootNode && thisThread == Threads.main() && Time.elapsed() > 3000)
sync_cout << "info depth " << depth / ONE_PLY
<< " currmove " << UCI::move(move, pos.is_chess960())
- << " currmovenumber " << moveCount + thisThread->PVIdx << sync_endl;
+ << " currmovenumber " << moveCount + thisThread->pvIdx << sync_endl;
if (PvNode)
(ss+1)->pv = nullptr;
if (captureOrPromotion) // (~5 Elo)
{
- //Increase reduction by comparing opponent's stat score
- if ( (ss-1)->statScore >= 0
+ // Increase reduction by comparing opponent's stat score
+ if ( (ss-1)->statScore >= 0
&& thisThread->captureHistory[movedPiece][to_sq(move)][type_of(pos.captured_piece())] < 0)
r += ONE_PLY;
-
+
r -= r ? ONE_PLY : DEPTH_ZERO;
}
else
std::stringstream ss;
TimePoint elapsed = Time.elapsed() + 1;
const RootMoves& rootMoves = pos.this_thread()->rootMoves;
- size_t PVIdx = pos.this_thread()->PVIdx;
+ size_t pvIdx = pos.this_thread()->pvIdx;
size_t multiPV = std::min((size_t)Options["MultiPV"], rootMoves.size());
uint64_t nodesSearched = Threads.nodes_searched();
uint64_t tbHits = Threads.tb_hits() + (TB::RootInTB ? rootMoves.size() : 0);
for (size_t i = 0; i < multiPV; ++i)
{
- bool updated = (i <= PVIdx && rootMoves[i].score != -VALUE_INFINITE);
+ bool updated = (i <= pvIdx && rootMoves[i].score != -VALUE_INFINITE);
if (depth == ONE_PLY && !updated)
continue;
Value v = updated ? rootMoves[i].score : rootMoves[i].previousScore;
bool tb = TB::RootInTB && abs(v) < VALUE_MATE - MAX_PLY;
- v = tb ? rootMoves[i].TBScore : v;
+ v = tb ? rootMoves[i].tbScore : v;
if (ss.rdbuf()->in_avail()) // Not at first line
ss << "\n";
<< " multipv " << i + 1
<< " score " << UCI::value(v);
- if (!tb && i == PVIdx)
+ if (!tb && i == pvIdx)
ss << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : "");
ss << " nodes " << nodesSearched
{
// Sort moves according to TB rank
std::sort(rootMoves.begin(), rootMoves.end(),
- [](const RootMove &a, const RootMove &b) { return a.TBRank > b.TBRank; } );
+ [](const RootMove &a, const RootMove &b) { return a.tbRank > b.tbRank; } );
// Probe during search only if DTZ is not available and we are winning
- if (dtz_available || rootMoves[0].TBScore <= VALUE_DRAW)
+ if (dtz_available || rootMoves[0].tbScore <= VALUE_DRAW)
Cardinality = 0;
}
else
{
// Assign the same rank to all moves
for (auto& m : rootMoves)
- m.TBRank = 0;
+ m.tbRank = 0;
}
}
d->symlen.resize(number<uint16_t, LittleEndian>(data)); data += sizeof(uint16_t);
d->btree = (LR*)data;
- // The comrpession scheme used is "Recursive Pairing", that replaces the most
+ // The compression scheme used is "Recursive Pairing", that replaces the most
// frequent adjacent pair of symbols in the source message by a new symbol,
// reevaluating the frequencies of all of the symbol pairs with respect to
// the extended alphabet, and then repeating the process.
int r = dtz > 0 ? (dtz + cnt50 <= 99 && !rep ? 1000 : 1000 - (dtz + cnt50))
: dtz < 0 ? (-dtz * 2 + cnt50 < 100 ? -1000 : -1000 + (-dtz + cnt50))
: 0;
- m.TBRank = r;
+ m.tbRank = r;
// Determine the score to be displayed for this move. Assign at least
// 1 cp to cursed wins and let it grow to 49 cp as the positions gets
// closer to a real win.
- m.TBScore = r >= bound ? VALUE_MATE - MAX_PLY - 1
+ m.tbScore = r >= bound ? VALUE_MATE - MAX_PLY - 1
: r > 0 ? Value((std::max( 3, r - 800) * int(PawnValueEg)) / 200)
: r == 0 ? VALUE_DRAW
: r > -bound ? Value((std::min(-3, r + 800) * int(PawnValueEg)) / 200)
if (result == FAIL)
return false;
- m.TBRank = WDL_to_rank[wdl + 2];
+ m.tbRank = WDL_to_rank[wdl + 2];
if (!rule50)
wdl = wdl > WDLDraw ? WDLWin
: wdl < WDLDraw ? WDLLoss : WDLDraw;
- m.TBScore = WDL_to_value[wdl + 2];
+ m.tbScore = WDL_to_value[wdl + 2];
}
return true;