- // Fast lookup table of sliding pieces indexed by Piece
- const bool Slidings[18] = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 };
- inline bool piece_is_slider(Piece p) { return Slidings[p]; }
-
- // ThreadsManager class is used to handle all the threads related stuff in search,
- // init, starting, parking and, the most important, launching a slave thread at a
- // split point are what this class does. All the access to shared thread data is
- // done through this class, so that we avoid using global variables instead.
-
- class ThreadsManager {
- /* As long as the single ThreadsManager object is defined as a global we don't
- need to explicitly initialize to zero its data members because variables with
- static storage duration are automatically set to zero before enter main()
- */
- public:
- void init_threads();
- void exit_threads();
-
- int min_split_depth() const { return minimumSplitDepth; }
- int active_threads() const { return activeThreads; }
- void set_active_threads(int cnt) { activeThreads = cnt; }
-
- void read_uci_options();
- bool available_thread_exists(int master) const;
- bool thread_is_available(int slave, int master) const;
- bool cutoff_at_splitpoint(int threadID) const;
- void wake_sleeping_thread(int threadID);
- void idle_loop(int threadID, SplitPoint* sp);
-
- template <bool Fake>
- void split(Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue,
- Depth depth, Move threatMove, bool mateThreat, int moveCount, MovePicker* mp, bool pvNode);
-
- private:
- Depth minimumSplitDepth;
- int maxThreadsPerSplitPoint;
- bool useSleepingThreads;
- int activeThreads;
- volatile bool allThreadsShouldExit;
- Thread threads[MAX_THREADS];
- Lock mpLock, sleepLock[MAX_THREADS];
- WaitCondition sleepCond[MAX_THREADS];
- };
-
-
- // RootMove struct is used for moves at the root at the tree. For each root
- // move, we store two scores, a node count, and a PV (really a refutation
- // in the case of moves which fail low). Value pv_score is normally set at
- // -VALUE_INFINITE for all non-pv moves, while non_pv_score is computed
- // according to the order in which moves are returned by MovePicker.
-
- struct RootMove {
-
- RootMove();
- RootMove(const RootMove& rm) { *this = rm; }
- RootMove& operator=(const RootMove& rm);
-
- // RootMove::operator<() is the comparison function used when
- // sorting the moves. A move m1 is considered to be better
- // than a move m2 if it has an higher pv_score, or if it has
- // equal pv_score but m1 has the higher non_pv_score. In this
- // way we are guaranteed that PV moves are always sorted as first.
- bool operator<(const RootMove& m) const {
- return pv_score != m.pv_score ? pv_score < m.pv_score
- : non_pv_score < m.non_pv_score;
- }
-
- void extract_pv_from_tt(Position& pos);
- void insert_pv_in_tt(Position& pos);
- std::string pv_info_to_uci(Position& pos, int depth, Value alpha, Value beta, int pvLine);
-
- int64_t nodes;
- Value pv_score;
- Value non_pv_score;
- Move pv[PLY_MAX_PLUS_2];
- };
-