const char * get( const char * k ) { for ( int i=0; i<params.size(); i++ ) { if ( ! strcmp( params[i].k, k ) ) { return params[i].v; } } return 0; }
void UsiClient::onUpdatePV(const Searcher& searcher, const PV& pv, float elapsed, int depth, Score score) { if (pv.size() == 0) { LOG(warning) << "PV is empty."; return; } auto& info = searcher.getInfo(); auto timeMs = static_cast<uint32_t>(elapsed * 1e3); auto realDepth = depth / Searcher::Depth1Ply; auto totalNodes = info.nodes + info.quiesNodes; auto nps = static_cast<uint32_t>(totalNodes / elapsed); auto hashfull = static_cast<int>(searcher_->ttUsageRates() * 1000); const char* scoreKey; int scoreValue; if (score > -Score::mate() && score < Score::mate()) { scoreKey = "cp"; scoreValue = score.raw() * 100.0 / material::Pawn; } else { scoreKey = "mate"; if (score >= 0) { scoreValue = (Score::infinity() - score).raw(); } else { scoreValue = -(Score::infinity() + score).raw(); } } OUT(info) << std::setw(2) << realDepth << ": " << std::setw(10) << (info.nodes + info.quiesNodes) << ": " << std::setw(7) << timeMs << ' ' << pv.toString() << ": " << score; if (!inPonder_) { send("info", "time", timeMs, "depth", realDepth, "nodes", totalNodes, "nps", nps, "currmove", pv.getMove(0).toStringSFEN(), "score", scoreKey, scoreValue, "pv", pv.toStringSFEN(), "hashfull", hashfull); } }