void extract_pv_from_tt(Position& pos);
void insert_pv_in_tt(Position& pos);
- std::string pv_info_to_uci(Position& pos, int depth, Value alpha, Value beta, int pvLine = 0);
+ std::string pv_info_to_uci(Position& pos, int depth, Value alpha, Value beta, int pvLine);
int64_t nodes;
Value pv_score;
std::string name = Options["Search Log Filename"].value<std::string>();
LogFile.open(name.c_str(), std::ios::out | std::ios::app);
- LogFile << "Searching: " << pos.to_fen()
- << "\ninfinite: " << infinite
- << " ponder: " << ponder
- << " time: " << myTime
- << " increment: " << myIncrement
- << " moves to go: " << movesToGo << endl;
+ LogFile << "\nSearching: " << pos.to_fen()
+ << "\ninfinite: " << infinite
+ << " ponder: " << ponder
+ << " time: " << myTime
+ << " increment: " << myIncrement
+ << " moves to go: " << movesToGo
+ << endl;
}
// We're ready to start thinking. Call the iterative deepening loop function
if (UseLogFile)
{
- LogFile << "\nNodes: " << pos.nodes_searched()
+ LogFile << "Nodes: " << pos.nodes_searched()
<< "\nNodes/second: " << nps(pos)
- << "\nBest move: " << move_to_san(pos, bestMove);
+ << "\nBest move: " << move_to_san(pos, bestMove);
StateInfo st;
pos.do_move(bestMove, st);
- LogFile << "\nPonder move: "
- << move_to_san(pos, ponderMove) // Works also with MOVE_NONE
- << endl;
-
- // Return from think() with unchanged position
- pos.undo_move(bestMove);
-
+ LogFile << "\nPonder move: " << move_to_san(pos, ponderMove) << endl;
+ pos.undo_move(bestMove); // Return from think() with unchanged position
LogFile.close();
}
bestValues[depth] = value;
bestMoveChanges[depth] = Rml.bestMoveChanges;
+ if (UseLogFile)
+ LogFile << pretty_pv(pos, depth, value, current_search_time(), Rml[0].pv) << endl;
+
// Drop the easy move if differs from the new best move
if (bestMove != easyMove)
easyMove = MOVE_NONE;
// Update current move (this must be done after singular extension search)
ss->currentMove = move;
- newDepth = depth - (!Root ? ONE_PLY : DEPTH_ZERO) + ext;
+ newDepth = depth - ONE_PLY + ext;
// Step 12. Futility pruning (is omitted in PV nodes)
if ( !PvNode
&& ss->killers[0] != move
&& ss->killers[1] != move)
{
- ss->reduction = Root ? reduction<PvNode>(depth, moveCount - MultiPV + 1)
- : reduction<PvNode>(depth, moveCount);
+ ss->reduction = reduction<PvNode>(depth, moveCount);
if (ss->reduction)
{
alpha = SpNode ? sp->alpha : alpha;
alpha = sp->alpha;
}
- if (!Root && value > bestValue && !(SpNode && ThreadsMgr.cutoff_at_splitpoint(threadID)))
+ if (value > bestValue && !(SpNode && ThreadsMgr.cutoff_at_splitpoint(threadID)))
{
bestValue = value;
if (SpNode)
sp->bestValue = value;
- if (value > alpha)
+ if (!Root && value > alpha)
{
if (PvNode && value < beta) // We want always alpha < beta
{
if (Root)
{
- // To avoid to exit with bestValue == -VALUE_INFINITE
- if (value > bestValue)
- bestValue = value;
-
// Finished searching the move. If StopRequest is true, the search
// was aborted because the user interrupted the search or because we
// ran out of time. In this case, the return value of the search cannot
// Remember searched nodes counts for this move
mp.rm->nodes += pos.nodes_searched() - nodes;
- // Step 17. Check for new best move
- if (!isPvMove && value <= alpha)
- mp.rm->pv_score = -VALUE_INFINITE;
- else
+ // PV move or new best move ?
+ if (isPvMove || value > alpha)
{
- // PV move or new best move!
-
// Update PV
ss->bestMove = move;
mp.rm->pv_score = value;
alpha = Rml[Min(moveCount, MultiPV) - 1].pv_score; // FIXME why moveCount?
else if (value > alpha)
alpha = value;
+ }
+ else
+ mp.rm->pv_score = -VALUE_INFINITE;
- } // PV move or new best move
- }
+ } // Root
// Step 18. Check for split
if ( !Root
if (abs(v) < VALUE_MATE - PLY_MAX * ONE_PLY)
s << "cp " << int(v) * 100 / int(PawnValueMidgame); // Scale to centipawns
else
- s << "mate " << (v > 0 ? (VALUE_MATE - v + 1) / 2 : -(VALUE_MATE + v) / 2 );
+ s << "mate " << (v > 0 ? (VALUE_MATE - v + 1) / 2 : -(VALUE_MATE + v) / 2);
return s.str();
}
}
// pv_info_to_uci() returns a string with information on the current PV line
- // formatted according to UCI specification and eventually writes the info
- // to a log file. It is called at each iteration or after a new pv is found.
+ // formatted according to UCI specification. It is called at each iteration
+ // or after a new pv is found.
std::string RootMove::pv_info_to_uci(Position& pos, int depth, Value alpha, Value beta, int pvLine) {
<< " nps " << nps(pos)
<< " pv " << l.str();
- if (UseLogFile && pvLine == 0)
- {
- ValueType t = pv_score >= beta ? VALUE_TYPE_LOWER :
- pv_score <= alpha ? VALUE_TYPE_UPPER : VALUE_TYPE_EXACT;
-
- LogFile << pretty_pv(pos, current_search_time(), depth, pv_score, t, pv) << endl;
- }
return s.str();
}