-
- // RootMoveList::scan_for_easy_move() is called at the end of the first
- // iteration, and is used to detect an "easy move", i.e. a move which appears
- // to be much bester than all the rest. If an easy move is found, the move
- // is returned, otherwise the function returns MOVE_NONE. It is very
- // important that this function is called at the right moment: The code
- // assumes that the first iteration has been completed and the moves have
- // been sorted. This is done in RootMoveList c'tor.
-
- Move RootMoveList::scan_for_easy_move() const {
-
- assert(count);
-
- if (count == 1)
- return get_move(0);
-
- // moves are sorted so just consider the best and the second one
- if (get_move_score(0) > get_move_score(1) + EasyMoveMargin)
- return get_move(0);
-
- return MOVE_NONE;
- }
-
- // RootMoveList::sort() sorts the root move list at the beginning of a new
- // iteration.
-
- inline void RootMoveList::sort() {
-
- sort_multipv(count - 1); // all items
- }
-
-
- // RootMoveList::sort_multipv() sorts the first few moves in the root move
- // list by their scores and depths. It is used to order the different PVs
- // correctly in MultiPV mode.
-
- void RootMoveList::sort_multipv(int n) {
-
- for (int i = 1; i <= n; i++)
- {
- RootMove rm = moves[i];
- int j;
- for (j = i; j > 0 && moves[j-1] < rm; j--)
- moves[j] = moves[j-1];
- moves[j] = rm;
- }
- }
-
-
- // init_search_stack() initializes a search stack at the beginning of a
- // new search from the root.
- void init_search_stack(SearchStack& ss) {
-
- ss.pv[0] = MOVE_NONE;
- ss.pv[1] = MOVE_NONE;
- ss.currentMove = MOVE_NONE;
- ss.threatMove = MOVE_NONE;
- ss.reduction = Depth(0);
- for (int j = 0; j < KILLER_MAX; j++)
- ss.killers[j] = MOVE_NONE;
- }
-
- void init_search_stack(SearchStack ss[]) {
-
- for (int i = 0; i < 3; i++)
- {
- ss[i].pv[i] = MOVE_NONE;
- ss[i].pv[i+1] = MOVE_NONE;
- ss[i].currentMove = MOVE_NONE;
- ss[i].threatMove = MOVE_NONE;
- ss[i].reduction = Depth(0);
- for (int j = 0; j < KILLER_MAX; j++)
- ss[i].killers[j] = MOVE_NONE;
- }
- }
-
-
- // init_node() is called at the beginning of all the search functions
- // (search(), search_pv(), qsearch(), and so on) and initializes the search
- // stack object corresponding to the current node. Once every
- // NodesBetweenPolls nodes, init_node() also calls poll(), which polls
- // for user input and checks whether it is time to stop the search.
-
- void init_node(const Position &pos, SearchStack ss[], int ply, int threadID) {
- assert(ply >= 0 && ply < PLY_MAX);
- assert(threadID >= 0 && threadID < ActiveThreads);
-
- Threads[threadID].nodes++;
-
- if(threadID == 0) {
- NodesSincePoll++;
- if(NodesSincePoll >= NodesBetweenPolls) {
- poll();
- NodesSincePoll = 0;
- }