const bool FakeSplit = false;
// Different node types, used as template parameter
- enum NodeType { Root, PV, NonPV, SplitPointPV, SplitPointNonPV };
+ enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV };
// RootMove struct is used for moves at the root of the tree. For each root
// move, we store a score, a node count, and a PV (really a refutation
template <NodeType NT>
Value search(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) {
- const bool PvNode = (NT == PV || NT == Root || NT == SplitPointPV);
- const bool SpNode = (NT == SplitPointPV || NT == SplitPointNonPV);
- const bool RootNode = (NT == Root);
+ const bool PvNode = (NT == PV || NT == Root || NT == SplitPointPV || NT == SplitPointRoot);
+ const bool SpNode = (NT == SplitPointPV || NT == SplitPointNonPV || NT == SplitPointRoot);
+ const bool RootNode = (NT == Root || NT == SplitPointRoot);
assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE);
assert(beta > alpha && beta <= VALUE_INFINITE);
// If it's time to send nodes info, do it here where we have the
// correct accumulated node counts searched by each thread.
- if (SendSearchedNodes)
+ if (!SpNode && SendSearchedNodes)
{
SendSearchedNodes = false;
cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
}
// For long searches send current move info to GUI
- if (current_search_time() > 2000)
+ if (pos.thread() == 0 && current_search_time() > 2000)
cout << "info" << depth_to_uci(depth)
<< " currmove " << move
<< " currmovenumber " << moveCount + MultiPVIteration << endl;
alpha = sp->alpha;
}
- if (value > bestValue)
- {
- bestValue = value;
- ss->bestMove = move;
-
- if ( !RootNode
- && PvNode
- && value > alpha
- && value < beta) // We want always alpha < beta
- alpha = value;
-
- if (SpNode && !thread.cutoff_occurred())
- {
- sp->bestValue = value;
- sp->ss->bestMove = move;
- sp->alpha = alpha;
- sp->is_betaCutoff = (value >= beta);
- }
- }
if (RootNode)
{
// the best move changes frequently, we allocate some more time.
if (!isPvMove && MultiPV == 1)
Rml.bestMoveChanges++;
-
- // Update alpha
- if (value > alpha)
- alpha = value;
}
else
// All other moves but the PV are set to the lowest value, this
} // RootNode
+ if (value > bestValue)
+ {
+ bestValue = value;
+ ss->bestMove = move;
+
+ if ( PvNode
+ && value > alpha
+ && value < beta) // We want always alpha < beta
+ alpha = value;
+
+ if (SpNode && !thread.cutoff_occurred())
+ {
+ sp->bestValue = value;
+ sp->ss->bestMove = move;
+ sp->alpha = alpha;
+ sp->is_betaCutoff = (value >= beta);
+ }
+ }
+
// Step 19. Check for split
if ( !RootNode
&& !SpNode