&& type_of(pos.piece_on(to_sq(m))) != PAWN
&& type_of(m) == NORMAL
&& ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK)
- - PieceValueMidgame[pos.piece_on(to_sq(m))] == VALUE_ZERO))
+ - PieceValue[Mg][pos.piece_on(to_sq(m))] == VALUE_ZERO))
return true;
return false;
/// Search::perft() is our utility to verify move generation. All the leaf nodes
/// up to the given depth are generated and counted and the sum returned.
-int64_t Search::perft(Position& pos, Depth depth) {
+size_t Search::perft(Position& pos, Depth depth) {
- StateInfo st;
- int64_t cnt = 0;
-
- MoveList<LEGAL> ml(pos);
-
- // At the last ply just return the number of moves (leaf nodes)
+ // At the last ply just return the number of legal moves (leaf nodes)
if (depth == ONE_PLY)
- return ml.size();
+ return MoveList<LEGAL>(pos).size();
+ StateInfo st;
+ size_t cnt = 0;
CheckInfo ci(pos);
- for ( ; !ml.end(); ++ml)
+
+ for (MoveList<LEGAL> ml(pos); !ml.end(); ++ml)
{
pos.do_move(ml.move(), st, ci, pos.move_gives_check(ml.move(), ci));
cnt += perft(pos, depth - ONE_PLY);
pos.undo_move(ml.move());
}
+
return cnt;
}
Depth R = 3 * ONE_PLY + depth / 4;
// Null move dynamic reduction based on value
- if (refinedValue - PawnValueMidgame > beta)
+ if (refinedValue - PawnValueMg > beta)
R += ONE_PLY;
pos.do_null_move<true>(st);
alpha = bestValue;
futilityBase = ss->eval + evalMargin + FutilityMarginQS;
- enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
+ enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMg;
}
// Initialize a MovePicker object for the current position, and prepare
&& !pos.is_passed_pawn_push(move))
{
futilityValue = futilityBase
- + PieceValueEndgame[pos.piece_on(to_sq(move))]
- + (type_of(move) == ENPASSANT ? PawnValueEndgame : VALUE_ZERO);
+ + PieceValue[Eg][pos.piece_on(to_sq(move))]
+ + (type_of(move) == ENPASSANT ? PawnValueEg : VALUE_ZERO);
if (futilityValue < beta)
{
&& givesCheck
&& move != ttMove
&& !pos.is_capture_or_promotion(move)
- && ss->eval + PawnValueMidgame / 4 < beta
+ && ss->eval + PawnValueMg / 4 < beta
&& !check_is_dangerous(pos, move, futilityBase, beta))
continue;
while (b)
{
// Note that here we generate illegal "double move"!
- if (futilityBase + PieceValueEndgame[pos.piece_on(pop_lsb(&b))] >= beta)
+ if (futilityBase + PieceValue[Eg][pos.piece_on(pop_lsb(&b))] >= beta)
return true;
}
// Case 2: If the threatened piece has value less than or equal to the
// value of the threatening piece, don't prune moves which defend it.
if ( pos.is_capture(threat)
- && ( PieceValueMidgame[pos.piece_on(tfrom)] >= PieceValueMidgame[pos.piece_on(tto)]
+ && ( PieceValue[Mg][pos.piece_on(tfrom)] >= PieceValue[Mg][pos.piece_on(tto)]
|| type_of(pos.piece_on(tfrom)) == KING)
&& pos.move_attacks_square(m, tto))
return true;
// RootMoves are already sorted by score in descending order
size_t size = std::min(MultiPV, RootMoves.size());
- int variance = std::min(RootMoves[0].score - RootMoves[size - 1].score, PawnValueMidgame);
+ int variance = std::min(RootMoves[0].score - RootMoves[size - 1].score, PawnValueMg);
int weakness = 120 - 2 * SkillLevel;
int max_s = -VALUE_INFINITE;
Move best = MOVE_NONE;
int t = SearchTime.elapsed();
int selDepth = 0;
- for (int i = 0; i < Threads.size(); i++)
+ for (size_t i = 0; i < Threads.size(); i++)
if (Threads[i].maxPly > selDepth)
selDepth = Threads[i].maxPly;
}
-/// Thread::idle_loop() is where the thread is parked when it has no work to do.
-/// The parameter 'master_sp', if non-NULL, is a pointer to an active SplitPoint
-/// object for which the thread is the master.
+/// Thread::idle_loop() is where the thread is parked when it has no work to do
+
+void Thread::idle_loop() {
+
+ // Pointer 'sp_master', if non-NULL, points to the active SplitPoint
+ // object for which the thread is the master.
+ const SplitPoint* sp_master = splitPointsCnt ? curSplitPoint : NULL;
-void Thread::idle_loop(SplitPoint* sp_master) {
+ assert(!sp_master || (sp_master->master == this && is_searching));
// If this thread is the master of a split point and all slaves have
// finished their work at this split point, return from the idle loop.
// case we are the last slave of the split point.
if ( Threads.use_sleeping_threads()
&& this != sp->master
- && !sp->master->is_searching)
+ && !sp->slavesMask)
+ {
+ assert(!sp->master->is_searching);
sp->master->wake_up();
+ }
// After releasing the lock we cannot access anymore any SplitPoint
// related data in a safe way becuase it could have been released under