// Use internal iterative deepening?
const bool UseIIDAtPVNodes = true;
- const bool UseIIDAtNonPVNodes = false;
+ const bool UseIIDAtNonPVNodes = true;
// Internal iterative deepening margin. At Non-PV moves, when
// UseIIDAtNonPVNodes is true, we do an internal iterative deepening
bool idle_thread_exists(int master);
bool split(const Position& pos, SearchStack* ss, int ply,
Value *alpha, Value *beta, Value *bestValue,
- const Value futilityValue, const Value approximateValue,
- Depth depth, int *moves,
+ const Value futilityValue, Depth depth, int *moves,
MovePicker *mp, int master, bool pvNode);
void wake_sleeping_threads();
{
Move bookMove;
if (get_option_value_string("Book File") != OpeningBook.file_name())
- OpeningBook.open("book.bin");
+ OpeningBook.open(get_option_value_string("Book File"));
bookMove = OpeningBook.get_move(pos);
if (bookMove != MOVE_NONE)
search_pv(pos, ss, alpha, beta, depth-2*OnePly, ply, threadID);
ttMove = ss[ply].pv[ply];
tte = TT.retrieve(pos.get_key());
-
- // If tte->move() != MOVE_NONE then it equals ttMove
- assert(!(tte && tte->move()) || tte->move() == ttMove);
}
// Initialize a MovePicker object for the current position, and prepare
&& idle_thread_exists(threadID)
&& !AbortSearch
&& !thread_should_stop(threadID)
- && split(pos, ss, ply, &alpha, &beta, &bestValue, VALUE_NONE, VALUE_NONE,
+ && split(pos, ss, ply, &alpha, &beta, &bestValue, VALUE_NONE,
depth, &moveCount, &mp, threadID, true))
break;
}
// Go with internal iterative deepening if we don't have a TT move
if (UseIIDAtNonPVNodes && ttMove == MOVE_NONE && depth >= 8*OnePly &&
- evaluate(pos, ei, threadID) >= beta - IIDMargin)
+ !isCheck && evaluate(pos, ei, threadID) >= beta - IIDMargin)
{
search(pos, ss, beta, Min(depth/2, depth-2*OnePly), ply, false, threadID);
ttMove = ss[ply].pv[ply];
&& idle_thread_exists(threadID)
&& !AbortSearch
&& !thread_should_stop(threadID)
- && split(pos, ss, ply, &beta, &beta, &bestValue, futilityValue, approximateEval,
+ && split(pos, ss, ply, &beta, &beta, &bestValue, futilityValue,
depth, &moveCount, &mp, threadID, false))
break;
}
assert(!pos.move_is_check(m));
assert(!pos.move_is_capture_or_promotion(m));
assert(!pos.move_is_passed_pawn_push(m));
- assert(d >= OnePly);
Square mfrom, mto, tfrom, tto;
bool split(const Position& p, SearchStack* sstck, int ply,
Value* alpha, Value* beta, Value* bestValue, const Value futilityValue,
- const Value approximateEval, Depth depth, int* moves,
- MovePicker* mp, int master, bool pvNode) {
+ Depth depth, int* moves, MovePicker* mp, int master, bool pvNode) {
assert(p.is_ok());
assert(sstck != NULL);
splitPoint->pvNode = pvNode;
splitPoint->bestValue = *bestValue;
splitPoint->futilityValue = futilityValue;
- splitPoint->approximateEval = approximateEval;
splitPoint->master = master;
splitPoint->mp = mp;
splitPoint->moves = *moves;