void SearchStack::init() {
currentMove = threatMove = bestMove = MOVE_NONE;
- reduction = Depth(0);
}
// SearchStack::initKillers() initializes killers for a search stack entry
void SearchStack::initKillers() {
- mateKiller = MOVE_NONE;
- for (int i = 0; i < KILLER_MAX; i++)
- killers[i] = MOVE_NONE;
+ killers[0] = killers[1] = mateKiller = MOVE_NONE;
}
beta = *betaPtr;
isCheck = pos.is_check();
- // Step 1. Initialize node and poll (omitted at root, init_ss_array() has already initialized root node)
+ // Step 1. Initialize node (polling is omitted at root)
+ ss->init();
+
// Step 2. Check for aborted search (omitted at root)
// Step 3. Mate distance pruning (omitted at root)
// Step 4. Transposition table lookup (omitted at root)
isCheck = pos.is_check();
if (!isCheck)
{
- if (tte && tte->static_value() != VALUE_NONE)
+ if (tte)
{
+ assert(tte->static_value() != VALUE_NONE);
ss->eval = tte->static_value();
ei.kingDanger[pos.side_to_move()] = tte->king_danger();
}
&& !pos.has_pawn_on_7th(pos.side_to_move()))
{
// Pass ss->eval to qsearch() and avoid an evaluate call
- if (!tte || tte->static_value() == VALUE_NONE)
+ if (!tte)
TT.store(posKey, ss->eval, VALUE_TYPE_EXACT, Depth(-127*OnePly), MOVE_NONE, ss->eval, ei.kingDanger[pos.side_to_move()]);
Value rbeta = beta - razor_margin(depth);
}
else
{
- if (tte && tte->static_value() != VALUE_NONE)
+ if (tte)
{
+ assert(tte->static_value() != VALUE_NONE);
ei.kingDanger[pos.side_to_move()] = tte->king_danger();
bestValue = tte->static_value();
}
bool move_is_killer(Move m, SearchStack* ss) {
- const Move* k = ss->killers;
- for (int i = 0; i < KILLER_MAX; i++, k++)
- if (*k == m)
- return true;
+ if (ss->killers[0] == m || ss->killers[1] == m)
+ return true;
return false;
}
if (m == ss->killers[0])
return;
- for (int i = KILLER_MAX - 1; i > 0; i--)
- ss->killers[i] = ss->killers[i - 1];
-
+ ss->killers[1] = ss->killers[0];
ss->killers[0] = m;
}
{
ss->excludedMove = MOVE_NONE;
ss->skipNullMove = false;
+ ss->reduction = Depth(0);
if (i < 3)
- {
- ss->init();
ss->initKillers();
- }
}
}
StateInfo st;
bool includeAllMoves = (searchMoves[0] == MOVE_NONE);
+ // Initialize search stack
+ init_ss_array(ss, PLY_MAX_PLUS_2);
+ ss[0].init();
+ ss[0].eval = VALUE_NONE;
+
// Generate all legal moves
MoveStack* last = generate_moves(pos, mlist);
continue;
// Find a quick score for the move
- init_ss_array(ss, PLY_MAX_PLUS_2);
- ss[0].eval = VALUE_NONE;
- ss[0].currentMove = cur->move;
pos.do_move(cur->move, st);
+ ss[0].currentMove = cur->move;
moves[count].move = cur->move;
moves[count].score = -qsearch<PV>(pos, ss+1, -VALUE_INFINITE, VALUE_INFINITE, Depth(0), 1);
moves[count].pv[0] = cur->move;