if (RootMoves.empty())
{
- RootMoves.push_back(MOVE_NONE);
+ RootMoves.push_back(RootMove(MOVE_NONE));
sync_cout << "info depth 0 score "
<< UCI::value(RootPos.checkers() ? -VALUE_MATE : VALUE_DRAW)
<< sync_endl;
// then we choose the move with the resulting highest score.
for (size_t i = 0; i < multiPV; ++i)
{
- int score = RootMoves[i].score;
-
// This is our magic formula
- score += ( weakness * int(RootMoves[0].score - score)
- + variance * (rng.rand<unsigned>() % weakness)) / 128;
+ int push = ( weakness * int(RootMoves[0].score - RootMoves[i].score)
+ + variance * (rng.rand<unsigned>() % weakness)) / 128;
- if (score > maxScore)
+ if (RootMoves[i].score + push > maxScore)
{
- maxScore = score;
+ maxScore = RootMoves[i].score + push;
best = RootMoves[i].pv[0];
}
}
<< " nps " << pos.nodes_searched() * 1000 / elapsed;
if (elapsed > 1000) // Earlier makes little sense
- ss << " hashfull " << TT.hashfull();
+ ss << " hashfull " << TT.hashfull();
ss << " tbhits " << TB::Hits
<< " time " << elapsed
struct RootMove {
- RootMove(Move m) : score(-VALUE_INFINITE), previousScore(-VALUE_INFINITE), pv(1, m) {}
+ explicit RootMove(Move m) : pv(1, m) {}
bool operator<(const RootMove& m) const { return score > m.score; } // Ascending sort
bool operator==(const Move& m) const { return pv[0] == m; }
void insert_pv_in_tt(Position& pos);
bool extract_ponder_from_tt(Position& pos);
- Value score;
- Value previousScore;
+ Value score = -VALUE_INFINITE;
+ Value previousScore = -VALUE_INFINITE;
std::vector<Move> pv;
};