Exemple #1
0
void ThreadPool::start_thinking(const Position& pos, StateListPtr& states,
                                const Search::LimitsType& limits) {

  main()->wait_for_search_finished();

  Search::Signals.stopOnPonderhit = Search::Signals.stop = false;
  Search::Limits = limits;
  Search::RootMoves rootMoves;

  for (const auto& m : MoveList<LEGAL>(pos))
      if (   limits.searchmoves.empty()
          || std::count(limits.searchmoves.begin(), limits.searchmoves.end(), m))
          rootMoves.push_back(Search::RootMove(m));

  // After ownership transfer 'states' becomes empty, so if we stop the search
  // and call 'go' again without setting a new position states.get() == NULL.
  assert(states.get() || setupStates.get());

  if (states.get())
      setupStates = std::move(states); // Ownership transfer, states is now empty

  StateInfo tmp = setupStates->back();

  for (Thread* th : Threads)
  {
      th->maxPly = 0;
      th->rootDepth = DEPTH_ZERO;
      th->rootMoves = rootMoves;
      th->rootPos.set(pos.fen(), pos.is_chess960(), &setupStates->back(), th);
  }

  setupStates->back() = tmp; // Restore st->previous, cleared by Position::set()

  main()->start_searching();
}