}
// Add a small random component to draw evaluations to avoid 3fold-blindness
- Value value_draw(Depth depth, Thread* thisThread) {
- return depth < 4 * ONE_PLY ? VALUE_DRAW
- : VALUE_DRAW + Value(2 * (thisThread->nodes & 1) - 1);
+ Value value_draw(Thread* thisThread) {
+ return VALUE_DRAW + Value(2 * (thisThread->nodes & 1) - 1);
}
// Skill structure is used to implement strength limit
void Search::init() {
for (int i = 1; i < MAX_MOVES; ++i)
- Reductions[i] = int(23.4 * std::log(i));
+ Reductions[i] = int((23.4 + std::log(Threads.size()) / 2) * std::log(i));
}
&& !rootNode
&& pos.has_game_cycle(ss->ply))
{
- alpha = value_draw(depth, pos.this_thread());
+ alpha = value_draw(pos.this_thread());
if (alpha >= beta)
return alpha;
}
|| pos.is_draw(ss->ply)
|| ss->ply >= MAX_PLY)
return (ss->ply >= MAX_PLY && !inCheck) ? evaluate(pos)
- : value_draw(depth, pos.this_thread());
+ : value_draw(pos.this_thread());
// Step 3. Mate distance pruning. Even if we mate at the next move our score
// would be at best mate_in(ss->ply+1), but if alpha is already bigger because
ss->staticEval = eval = evaluate(pos);
if (eval == VALUE_DRAW)
- eval = value_draw(depth, thisThread);
+ eval = value_draw(thisThread);
// Can ttValue be used as a better position evaluation?
if ( ttValue != VALUE_NONE
&& pos.advanced_pawn_push(move)
&& pos.pawn_passed(us, to_sq(move)))
extension = ONE_PLY;
-
+
// Castling extension
if (type_of(move) == CASTLING)
extension = ONE_PLY;