]> git.sesse.net Git - stockfish/blob - src/search.cpp
Reimplement MultiPV mode
[stockfish] / src / search.cpp
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4   Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
5
6   Stockfish is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   Stockfish is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <cassert>
21 #include <cmath>
22 #include <cstring>
23 #include <fstream>
24 #include <iomanip>
25 #include <iostream>
26 #include <sstream>
27 #include <vector>
28
29 #include "book.h"
30 #include "evaluate.h"
31 #include "history.h"
32 #include "misc.h"
33 #include "move.h"
34 #include "movegen.h"
35 #include "movepick.h"
36 #include "search.h"
37 #include "timeman.h"
38 #include "thread.h"
39 #include "tt.h"
40 #include "ucioption.h"
41
42 using std::cout;
43 using std::endl;
44 using std::string;
45
46 namespace {
47
48   // Set to true to force running with one thread. Used for debugging
49   const bool FakeSplit = false;
50
51   // Different node types, used as template parameter
52   enum NodeType { Root, PV, NonPV, SplitPointPV, SplitPointNonPV };
53
54   // RootMove struct is used for moves at the root of the tree. For each root
55   // move, we store a pv_score, a node count, and a PV (really a refutation
56   // in the case of moves which fail low). Value pv_score is normally set at
57   // -VALUE_INFINITE for all non-pv moves.
58   struct RootMove {
59
60     RootMove();
61     RootMove(const RootMove& rm) { *this = rm; }
62     RootMove& operator=(const RootMove& rm);
63
64     // RootMove::operator<() is the comparison function used when
65     // sorting the moves. A move m1 is considered to be better
66     // than a move m2 if it has an higher pv_score
67     bool operator<(const RootMove& m) const { return pv_score < m.pv_score; }
68
69     void extract_pv_from_tt(Position& pos);
70     void insert_pv_in_tt(Position& pos);
71
72     int64_t nodes;
73     Value pv_score;
74     Move pv[PLY_MAX_PLUS_2];
75   };
76
77   // RootMoveList struct is mainly a std::vector of RootMove objects
78   struct RootMoveList : public std::vector<RootMove> {
79     void init(Position& pos, Move searchMoves[]);
80     RootMove* find(const Move &m, const int startIndex = 0);
81     int bestMoveChanges;
82   };
83
84
85   /// Constants
86
87   // Lookup table to check if a Piece is a slider and its access function
88   const bool Slidings[18] = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 };
89   inline bool piece_is_slider(Piece p) { return Slidings[p]; }
90
91   // Step 6. Razoring
92
93   // Maximum depth for razoring
94   const Depth RazorDepth = 4 * ONE_PLY;
95
96   // Dynamic razoring margin based on depth
97   inline Value razor_margin(Depth d) { return Value(0x200 + 0x10 * int(d)); }
98
99   // Maximum depth for use of dynamic threat detection when null move fails low
100   const Depth ThreatDepth = 5 * ONE_PLY;
101
102   // Step 9. Internal iterative deepening
103
104   // Minimum depth for use of internal iterative deepening
105   const Depth IIDDepth[] = { 8 * ONE_PLY, 5 * ONE_PLY };
106
107   // At Non-PV nodes we do an internal iterative deepening search
108   // when the static evaluation is bigger then beta - IIDMargin.
109   const Value IIDMargin = Value(0x100);
110
111   // Step 11. Decide the new search depth
112
113   // Extensions. Array index 0 is used for non-PV nodes, index 1 for PV nodes
114   const Depth CheckExtension[]         = { ONE_PLY / 2, ONE_PLY / 1 };
115   const Depth PawnEndgameExtension[]   = { ONE_PLY / 1, ONE_PLY / 1 };
116   const Depth PawnPushTo7thExtension[] = { ONE_PLY / 2, ONE_PLY / 2 };
117   const Depth PassedPawnExtension[]    = {  DEPTH_ZERO, ONE_PLY / 2 };
118
119   // Minimum depth for use of singular extension
120   const Depth SingularExtensionDepth[] = { 8 * ONE_PLY, 6 * ONE_PLY };
121
122   // Step 12. Futility pruning
123
124   // Futility margin for quiescence search
125   const Value FutilityMarginQS = Value(0x80);
126
127   // Futility lookup tables (initialized at startup) and their access functions
128   Value FutilityMargins[16][64]; // [depth][moveNumber]
129   int FutilityMoveCounts[32];    // [depth]
130
131   inline Value futility_margin(Depth d, int mn) {
132
133     return d < 7 * ONE_PLY ? FutilityMargins[Max(d, 1)][Min(mn, 63)]
134                            : 2 * VALUE_INFINITE;
135   }
136
137   inline int futility_move_count(Depth d) {
138
139     return d < 16 * ONE_PLY ? FutilityMoveCounts[d] : MAX_MOVES;
140   }
141
142   // Step 14. Reduced search
143
144   // Reduction lookup tables (initialized at startup) and their access function
145   int8_t Reductions[2][64][64]; // [pv][depth][moveNumber]
146
147   template <bool PvNode> inline Depth reduction(Depth d, int mn) {
148
149     return (Depth) Reductions[PvNode][Min(d / ONE_PLY, 63)][Min(mn, 63)];
150   }
151
152   // Easy move margin. An easy move candidate must be at least this much
153   // better than the second best move.
154   const Value EasyMoveMargin = Value(0x200);
155
156
157   /// Namespace variables
158
159   // Root move list
160   RootMoveList Rml;
161
162   // MultiPV mode
163   int MultiPV, UCIMultiPV, MultiPVIteration;
164
165   // Time management variables
166   bool StopOnPonderhit, FirstRootMove, StopRequest, QuitRequest, AspirationFailLow;
167   TimeManager TimeMgr;
168   SearchLimits Limits;
169
170   // Log file
171   std::ofstream LogFile;
172
173   // Skill level adjustment
174   int SkillLevel;
175   bool SkillLevelEnabled;
176
177   // Node counters, used only by thread[0] but try to keep in different cache
178   // lines (64 bytes each) from the heavy multi-thread read accessed variables.
179   bool SendSearchedNodes;
180   int NodesSincePoll;
181   int NodesBetweenPolls = 30000;
182
183   // History table
184   History H;
185
186
187   /// Local functions
188
189   Move id_loop(Position& pos, Move searchMoves[], Move* ponderMove);
190
191   template <NodeType NT>
192   Value search(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth);
193
194   template <NodeType NT>
195   Value qsearch(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth);
196
197   bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta, Value *bValue);
198   bool connected_moves(const Position& pos, Move m1, Move m2);
199   Value value_to_tt(Value v, int ply);
200   Value value_from_tt(Value v, int ply);
201   bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply);
202   bool connected_threat(const Position& pos, Move m, Move threat);
203   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply);
204   void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
205   void update_gains(const Position& pos, Move move, Value before, Value after);
206   void do_skill_level(Move* best, Move* ponder);
207
208   int current_search_time(int set = 0);
209   string score_to_uci(Value v, Value alpha, Value beta);
210   string speed_to_uci(int64_t nodes);
211   string pv_to_uci(Move pv[], int pvNum, bool chess960);
212   string pretty_pv(Position& pos, int depth, Value score, int time, Move pv[]);
213   string depth_to_uci(Depth depth);
214   void poll(const Position& pos);
215   void wait_for_stop_or_ponderhit();
216
217   // MovePickerExt template class extends MovePicker and allows to choose at compile
218   // time the proper moves source according to the type of node. In the default case
219   // we simply create and use a standard MovePicker object.
220   template<NodeType> struct MovePickerExt : public MovePicker {
221
222     MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b)
223                   : MovePicker(p, ttm, d, h, ss, b) {}
224   };
225
226   // In case of a SpNode we use split point's shared MovePicker object as moves source
227   template<> struct MovePickerExt<SplitPointNonPV> : public MovePickerExt<NonPV> {
228
229     MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b)
230                   : MovePickerExt<NonPV>(p, ttm, d, h, ss, b), mp(ss->sp->mp) {}
231
232     Move get_next_move() { return mp->get_next_move(); }
233     MovePicker* mp;
234   };
235
236   template<> struct MovePickerExt<SplitPointPV> : public MovePickerExt<SplitPointNonPV> {
237
238     MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b)
239                   : MovePickerExt<SplitPointNonPV>(p, ttm, d, h, ss, b) {}
240   };
241
242   // Overload operator<<() to make it easier to print moves in a coordinate
243   // notation compatible with UCI protocol.
244   std::ostream& operator<<(std::ostream& os, Move m) {
245
246     bool chess960 = (os.iword(0) != 0); // See set960()
247     return os << move_to_uci(m, chess960);
248   }
249
250   // When formatting a move for std::cout we must know if we are in Chess960
251   // or not. To keep using the handy operator<<() on the move the trick is to
252   // embed this flag in the stream itself. Function-like named enum set960 is
253   // used as a custom manipulator and the stream internal general-purpose array,
254   // accessed through ios_base::iword(), is used to pass the flag to the move's
255   // operator<<() that will read it to properly format castling moves.
256   enum set960 {};
257
258   std::ostream& operator<< (std::ostream& os, const set960& f) {
259
260     os.iword(0) = int(f);
261     return os;
262   }
263
264   // extension() decides whether a move should be searched with normal depth,
265   // or with extended depth. Certain classes of moves (checking moves, in
266   // particular) are searched with bigger depth than ordinary moves and in
267   // any case are marked as 'dangerous'. Note that also if a move is not
268   // extended, as example because the corresponding UCI option is set to zero,
269   // the move is marked as 'dangerous' so, at least, we avoid to prune it.
270   template <bool PvNode>
271   FORCE_INLINE Depth extension(const Position& pos, Move m, bool captureOrPromotion,
272                                bool moveIsCheck, bool* dangerous) {
273     assert(m != MOVE_NONE);
274
275     Depth result = DEPTH_ZERO;
276     *dangerous = moveIsCheck;
277
278     if (moveIsCheck && pos.see_sign(m) >= 0)
279         result += CheckExtension[PvNode];
280
281     if (piece_type(pos.piece_on(move_from(m))) == PAWN)
282     {
283         Color c = pos.side_to_move();
284         if (relative_rank(c, move_to(m)) == RANK_7)
285         {
286             result += PawnPushTo7thExtension[PvNode];
287             *dangerous = true;
288         }
289         if (pos.pawn_is_passed(c, move_to(m)))
290         {
291             result += PassedPawnExtension[PvNode];
292             *dangerous = true;
293         }
294     }
295
296     if (   captureOrPromotion
297         && piece_type(pos.piece_on(move_to(m))) != PAWN
298         && (  pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK)
299             - piece_value_midgame(pos.piece_on(move_to(m))) == VALUE_ZERO)
300         && !move_is_special(m))
301     {
302         result += PawnEndgameExtension[PvNode];
303         *dangerous = true;
304     }
305
306     return Min(result, ONE_PLY);
307   }
308
309 } // namespace
310
311
312 /// init_search() is called during startup to initialize various lookup tables
313
314 void init_search() {
315
316   int d;  // depth (ONE_PLY == 2)
317   int hd; // half depth (ONE_PLY == 1)
318   int mc; // moveCount
319
320   // Init reductions array
321   for (hd = 1; hd < 64; hd++) for (mc = 1; mc < 64; mc++)
322   {
323       double    pvRed = log(double(hd)) * log(double(mc)) / 3.0;
324       double nonPVRed = 0.33 + log(double(hd)) * log(double(mc)) / 2.25;
325       Reductions[1][hd][mc] = (int8_t) (   pvRed >= 1.0 ? floor(   pvRed * int(ONE_PLY)) : 0);
326       Reductions[0][hd][mc] = (int8_t) (nonPVRed >= 1.0 ? floor(nonPVRed * int(ONE_PLY)) : 0);
327   }
328
329   // Init futility margins array
330   for (d = 1; d < 16; d++) for (mc = 0; mc < 64; mc++)
331       FutilityMargins[d][mc] = Value(112 * int(log(double(d * d) / 2) / log(2.0) + 1.001) - 8 * mc + 45);
332
333   // Init futility move count array
334   for (d = 0; d < 32; d++)
335       FutilityMoveCounts[d] = int(3.001 + 0.25 * pow(d, 2.0));
336 }
337
338
339 /// perft() is our utility to verify move generation. All the leaf nodes up to
340 /// the given depth are generated and counted and the sum returned.
341
342 int64_t perft(Position& pos, Depth depth) {
343
344   StateInfo st;
345   int64_t sum = 0;
346
347   // Generate all legal moves
348   MoveList<MV_LEGAL> ml(pos);
349
350   // If we are at the last ply we don't need to do and undo
351   // the moves, just to count them.
352   if (depth <= ONE_PLY)
353       return ml.size();
354
355   // Loop through all legal moves
356   CheckInfo ci(pos);
357   for ( ; !ml.end(); ++ml)
358   {
359       pos.do_move(ml.move(), st, ci, pos.move_gives_check(ml.move(), ci));
360       sum += perft(pos, depth - ONE_PLY);
361       pos.undo_move(ml.move());
362   }
363   return sum;
364 }
365
366
367 /// think() is the external interface to Stockfish's search, and is called when
368 /// the program receives the UCI 'go' command. It initializes various global
369 /// variables, and calls id_loop(). It returns false when a "quit" command is
370 /// received during the search.
371
372 bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
373
374   static Book book;
375
376   // Initialize global search-related variables
377   StopOnPonderhit = StopRequest = QuitRequest = AspirationFailLow = SendSearchedNodes = false;
378   NodesSincePoll = 0;
379   current_search_time(get_system_time());
380   Limits = limits;
381   TimeMgr.init(Limits, pos.startpos_ply_counter());
382
383   // Set output steram in normal or chess960 mode
384   cout << set960(pos.is_chess960());
385
386   // Set best NodesBetweenPolls interval to avoid lagging under time pressure
387   if (Limits.maxNodes)
388       NodesBetweenPolls = Min(Limits.maxNodes, 30000);
389   else if (Limits.time && Limits.time < 1000)
390       NodesBetweenPolls = 1000;
391   else if (Limits.time && Limits.time < 5000)
392       NodesBetweenPolls = 5000;
393   else
394       NodesBetweenPolls = 30000;
395
396   // Look for a book move
397   if (Options["OwnBook"].value<bool>())
398   {
399       if (Options["Book File"].value<string>() != book.name())
400           book.open(Options["Book File"].value<string>());
401
402       Move bookMove = book.get_move(pos, Options["Best Book Move"].value<bool>());
403       if (bookMove != MOVE_NONE)
404       {
405           if (Limits.ponder)
406               wait_for_stop_or_ponderhit();
407
408           cout << "bestmove " << bookMove << endl;
409           return !QuitRequest;
410       }
411   }
412
413   // Read UCI options
414   UCIMultiPV = Options["MultiPV"].value<int>();
415   SkillLevel = Options["Skill Level"].value<int>();
416
417   read_evaluation_uci_options(pos.side_to_move());
418   Threads.read_uci_options();
419
420   // If needed allocate pawn and material hash tables and adjust TT size
421   Threads.init_hash_tables();
422   TT.set_size(Options["Hash"].value<int>());
423
424   if (Options["Clear Hash"].value<bool>())
425   {
426       Options["Clear Hash"].set_value("false");
427       TT.clear();
428   }
429
430   // Do we have to play with skill handicap? In this case enable MultiPV that
431   // we will use behind the scenes to retrieve a set of possible moves.
432   SkillLevelEnabled = (SkillLevel < 20);
433   MultiPV = (SkillLevelEnabled ? Max(UCIMultiPV, 4) : UCIMultiPV);
434
435   // Wake up needed threads and reset maxPly counter
436   for (int i = 0; i < Threads.size(); i++)
437   {
438       Threads[i].wake_up();
439       Threads[i].maxPly = 0;
440   }
441
442   // Write to log file and keep it open to be accessed during the search
443   if (Options["Use Search Log"].value<bool>())
444   {
445       string name = Options["Search Log Filename"].value<string>();
446       LogFile.open(name.c_str(), std::ios::out | std::ios::app);
447
448       if (LogFile.is_open())
449           LogFile << "\nSearching: "  << pos.to_fen()
450                   << "\ninfinite: "   << Limits.infinite
451                   << " ponder: "      << Limits.ponder
452                   << " time: "        << Limits.time
453                   << " increment: "   << Limits.increment
454                   << " moves to go: " << Limits.movesToGo
455                   << endl;
456   }
457
458   // We're ready to start thinking. Call the iterative deepening loop function
459   Move ponderMove = MOVE_NONE;
460   Move bestMove = id_loop(pos, searchMoves, &ponderMove);
461
462   // Write final search statistics and close log file
463   if (LogFile.is_open())
464   {
465       int t = current_search_time();
466
467       LogFile << "Nodes: "          << pos.nodes_searched()
468               << "\nNodes/second: " << (t > 0 ? pos.nodes_searched() * 1000 / t : 0)
469               << "\nBest move: "    << move_to_san(pos, bestMove);
470
471       StateInfo st;
472       pos.do_move(bestMove, st);
473       LogFile << "\nPonder move: " << move_to_san(pos, ponderMove) << endl;
474       pos.undo_move(bestMove); // Return from think() with unchanged position
475       LogFile.close();
476   }
477
478   // This makes all the threads to go to sleep
479   Threads.set_size(1);
480
481   // If we are pondering or in infinite search, we shouldn't print the
482   // best move before we are told to do so.
483   if (!StopRequest && (Limits.ponder || Limits.infinite))
484       wait_for_stop_or_ponderhit();
485
486   // Could be MOVE_NONE when searching on a stalemate position
487   cout << "bestmove " << bestMove;
488
489   // UCI protol is not clear on allowing sending an empty ponder move, instead
490   // it is clear that ponder move is optional. So skip it if empty.
491   if (ponderMove != MOVE_NONE)
492       cout << " ponder " << ponderMove;
493
494   cout << endl;
495
496   return !QuitRequest;
497 }
498
499
500 namespace {
501
502   // id_loop() is the main iterative deepening loop. It calls search() repeatedly
503   // with increasing depth until the allocated thinking time has been consumed,
504   // user stops the search, or the maximum search depth is reached.
505
506   Move id_loop(Position& pos, Move searchMoves[], Move* ponderMove) {
507
508     SearchStack ss[PLY_MAX_PLUS_2];
509     Value bestValues[PLY_MAX_PLUS_2];
510     int bestMoveChanges[PLY_MAX_PLUS_2];
511     int depth, aspirationDelta;
512     Value value, alpha, beta;
513     Move bestMove, easyMove, skillBest, skillPonder;
514
515     // Initialize stuff before a new search
516     memset(ss, 0, 4 * sizeof(SearchStack));
517     TT.new_search();
518     H.clear();
519     *ponderMove = bestMove = easyMove = skillBest = skillPonder = MOVE_NONE;
520     depth = aspirationDelta = 0;
521     value = alpha = -VALUE_INFINITE, beta = VALUE_INFINITE;
522     ss->currentMove = MOVE_NULL; // Hack to skip update_gains()
523
524     // Moves to search are verified and copied
525     Rml.init(pos, searchMoves);
526
527     // Handle special case of searching on a mate/stalemate position
528     if (!Rml.size())
529     {
530         cout << "info" << depth_to_uci(DEPTH_ZERO)
531              << score_to_uci(pos.in_check() ? -VALUE_MATE : VALUE_DRAW, alpha, beta) << endl;
532
533         return MOVE_NONE;
534     }
535
536     // Iterative deepening loop until requested to stop or target depth reached
537     while (!StopRequest && ++depth <= PLY_MAX && (!Limits.maxDepth || depth <= Limits.maxDepth))
538     {
539         Rml.bestMoveChanges = 0;
540
541         // Remember best moves and values from previous iteration
542         std::vector<Move> prevMoves;
543         std::vector<Value> prevValues;
544
545         for (int i = 0; i < Min(MultiPV, (int)Rml.size()); i++)
546         {
547             prevMoves.push_back(Rml[i].pv[0]);
548             prevValues.push_back(Rml[i].pv_score);
549         }
550
551         // MultiPV iteration loop
552         for (MultiPVIteration = 0; MultiPVIteration < Min(MultiPV, (int)Rml.size()); MultiPVIteration++)
553         {
554             // Calculate dynamic aspiration window based on previous iterations
555             if (depth >= 5 && abs(prevValues[MultiPVIteration]) < VALUE_KNOWN_WIN)
556             {
557                 int prevDelta1 = bestValues[depth - 1] - bestValues[depth - 2];
558                 int prevDelta2 = bestValues[depth - 2] - bestValues[depth - 3];
559
560                 aspirationDelta = Min(Max(abs(prevDelta1) + abs(prevDelta2) / 2, 16), 24);
561                 aspirationDelta = (aspirationDelta + 7) / 8 * 8; // Round to match grainSize
562
563                 alpha = Max(prevValues[MultiPVIteration] - aspirationDelta, -VALUE_INFINITE);
564                 beta  = Min(prevValues[MultiPVIteration] + aspirationDelta,  VALUE_INFINITE);
565             }
566             else
567             {
568                 alpha = -VALUE_INFINITE;
569                 beta  =  VALUE_INFINITE;
570             }
571
572             // Start with a small aspiration window and, in case of fail high/low,
573             // research with bigger window until not failing high/low anymore.
574             do {
575                 // Search starting from ss+1 to allow calling update_gains()
576                 value = search<Root>(pos, ss+1, alpha, beta, depth * ONE_PLY);
577
578                 // It is critical that sorting is done with a stable algorithm
579                 // because all the values but the first are usually set to
580                 // -VALUE_INFINITE and we want to keep the same order for all
581                 // the moves but the new PV that goes to head.
582                 if (value > alpha && value < beta)
583                     sort<RootMove>(Rml.begin(), Rml.end());
584                 else
585                     // In MultiPV mode, sort only the tail of the list
586                     // until all fail-highs and fail-lows have been resolved
587                     sort<RootMove>(Rml.begin() + MultiPVIteration, Rml.end());
588
589                 // Write PV back to transposition table in case the relevant entries
590                 // have been overwritten during the search.
591                 for (int i = 0; i <= MultiPVIteration; i++)
592                     Rml[i].insert_pv_in_tt(pos);
593
594                 // Value cannot be trusted. Break out immediately!
595                 if (StopRequest)
596                     break;
597
598                 // Send full PV info to GUI if we are going to leave the loop or
599                 // if we have a fail high/low and we are deep in the search.
600                 if ((value > alpha && value < beta) || current_search_time() > 2000)
601                     for (int i = 0; i < Min(UCIMultiPV, (int)Rml.size()); i++)
602                     {
603                         bool updated = (i <= MultiPVIteration);
604                         bool match = (i == MultiPVIteration);
605
606                         if (!updated && depth == 1)
607                               continue;
608
609                         cout << "info"
610                              << depth_to_uci((updated ? depth : depth - 1)  * ONE_PLY)
611                              << score_to_uci(updated ? Rml[i].pv_score : prevValues[i],
612                                              match ? alpha : -VALUE_INFINITE,
613                                              match ? beta  :  VALUE_INFINITE)
614                              << speed_to_uci(pos.nodes_searched())
615                              << pv_to_uci(updated ? Rml[i].pv : Rml.find(prevMoves[i])->pv,
616                                           i + 1, pos.is_chess960())
617                              << endl;
618                     }
619
620                 // In case of failing high/low increase aspiration window and research,
621                 // otherwise exit the fail high/low loop.
622                 if (value >= beta)
623                 {
624                     beta = Min(beta + aspirationDelta, VALUE_INFINITE);
625                     aspirationDelta += aspirationDelta / 2;
626                 }
627                 else if (value <= alpha)
628                 {
629                     AspirationFailLow = true;
630                     StopOnPonderhit = false;
631
632                     alpha = Max(alpha - aspirationDelta, -VALUE_INFINITE);
633                     aspirationDelta += aspirationDelta / 2;
634                 }
635                 else
636                     break;
637
638             } while (abs(value) < VALUE_KNOWN_WIN);
639         }
640
641         // Collect info about search result
642         bestMove = Rml[0].pv[0];
643         *ponderMove = Rml[0].pv[1];
644         bestValues[depth] = value;
645         bestMoveChanges[depth] = Rml.bestMoveChanges;
646
647         // Do we need to pick now the best and the ponder moves ?
648         if (SkillLevelEnabled && depth == 1 + SkillLevel)
649             do_skill_level(&skillBest, &skillPonder);
650
651         if (LogFile.is_open())
652             LogFile << pretty_pv(pos, depth, value, current_search_time(), Rml[0].pv) << endl;
653
654         // Init easyMove after first iteration or drop if differs from the best move
655         if (depth == 1 && (Rml.size() == 1 || Rml[0].pv_score > Rml[1].pv_score + EasyMoveMargin))
656             easyMove = bestMove;
657         else if (bestMove != easyMove)
658             easyMove = MOVE_NONE;
659
660         // Check for some early stop condition
661         if (!StopRequest && Limits.useTimeManagement())
662         {
663             // Stop search early if one move seems to be much better than the
664             // others or if there is only a single legal move. Also in the latter
665             // case we search up to some depth anyway to get a proper score.
666             if (   depth >= 7
667                 && easyMove == bestMove
668                 && (   Rml.size() == 1
669                     ||(   Rml[0].nodes > (pos.nodes_searched() * 85) / 100
670                        && current_search_time() > TimeMgr.available_time() / 16)
671                     ||(   Rml[0].nodes > (pos.nodes_searched() * 98) / 100
672                        && current_search_time() > TimeMgr.available_time() / 32)))
673                 StopRequest = true;
674
675             // Take in account some extra time if the best move has changed
676             if (depth > 4 && depth < 50)
677                 TimeMgr.pv_instability(bestMoveChanges[depth], bestMoveChanges[depth - 1]);
678
679             // Stop search if most of available time is already consumed. We probably don't
680             // have enough time to search the first move at the next iteration anyway.
681             if (current_search_time() > (TimeMgr.available_time() * 62) / 100)
682                 StopRequest = true;
683
684             // If we are allowed to ponder do not stop the search now but keep pondering
685             if (StopRequest && Limits.ponder)
686             {
687                 StopRequest = false;
688                 StopOnPonderhit = true;
689             }
690         }
691     }
692
693     // When using skills overwrite best and ponder moves with the sub-optimal ones
694     if (SkillLevelEnabled)
695     {
696         if (skillBest == MOVE_NONE) // Still unassigned ?
697             do_skill_level(&skillBest, &skillPonder);
698
699         bestMove = skillBest;
700         *ponderMove = skillPonder;
701     }
702
703     return bestMove;
704   }
705
706
707   // search<>() is the main search function for both PV and non-PV nodes and for
708   // normal and SplitPoint nodes. When called just after a split point the search
709   // is simpler because we have already probed the hash table, done a null move
710   // search, and searched the first move before splitting, we don't have to repeat
711   // all this work again. We also don't need to store anything to the hash table
712   // here: This is taken care of after we return from the split point.
713
714   template <NodeType NT>
715   Value search(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) {
716
717     const bool PvNode   = (NT == PV || NT == Root || NT == SplitPointPV);
718     const bool SpNode   = (NT == SplitPointPV || NT == SplitPointNonPV);
719     const bool RootNode = (NT == Root);
720
721     assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE);
722     assert(beta > alpha && beta <= VALUE_INFINITE);
723     assert(PvNode || alpha == beta - 1);
724     assert(pos.thread() >= 0 && pos.thread() < Threads.size());
725
726     Move movesSearched[MAX_MOVES];
727     int64_t nodes;
728     StateInfo st;
729     const TTEntry *tte;
730     Key posKey;
731     Move ttMove, move, excludedMove, threatMove;
732     Depth ext, newDepth;
733     ValueType vt;
734     Value bestValue, value, oldAlpha;
735     Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific
736     bool isPvMove, inCheck, singularExtensionNode, givesCheck, captureOrPromotion, dangerous;
737     int moveCount = 0, playedMoveCount = 0;
738     Thread& thread = Threads[pos.thread()];
739     SplitPoint* sp = NULL;
740
741     refinedValue = bestValue = value = -VALUE_INFINITE;
742     oldAlpha = alpha;
743     inCheck = pos.in_check();
744     ss->ply = (ss-1)->ply + 1;
745
746     // Used to send selDepth info to GUI
747     if (PvNode && thread.maxPly < ss->ply)
748         thread.maxPly = ss->ply;
749
750     // Step 1. Initialize node and poll. Polling can abort search
751     if (!SpNode)
752     {
753         ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
754         (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO;
755         (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE;
756     }
757     else
758     {
759         sp = ss->sp;
760         tte = NULL;
761         ttMove = excludedMove = MOVE_NONE;
762         threatMove = sp->threatMove;
763         goto split_point_start;
764     }
765
766     if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
767     {
768         NodesSincePoll = 0;
769         poll(pos);
770     }
771
772     // Step 2. Check for aborted search and immediate draw
773     if ((   StopRequest
774          || pos.is_draw<false>()
775          || ss->ply > PLY_MAX) && !RootNode)
776         return VALUE_DRAW;
777
778     // Step 3. Mate distance pruning
779     if (!RootNode)
780     {
781         alpha = Max(value_mated_in(ss->ply), alpha);
782         beta = Min(value_mate_in(ss->ply+1), beta);
783         if (alpha >= beta)
784             return alpha;
785     }
786
787     // Step 4. Transposition table lookup
788     // We don't want the score of a partial search to overwrite a previous full search
789     // TT value, so we use a different position key in case of an excluded move.
790     excludedMove = ss->excludedMove;
791     posKey = excludedMove ? pos.get_exclusion_key() : pos.get_key();
792     tte = TT.probe(posKey);
793     ttMove = tte ? tte->move() : MOVE_NONE;
794
795     // At PV nodes we check for exact scores, while at non-PV nodes we check for
796     // a fail high/low. Biggest advantage at probing at PV nodes is to have a
797     // smooth experience in analysis mode. We don't probe at Root nodes otherwise
798     // we should also update RootMoveList to avoid bogus output.
799     if (!RootNode && tte && (PvNode ? tte->depth() >= depth && tte->type() == VALUE_TYPE_EXACT
800                                     : ok_to_use_TT(tte, depth, beta, ss->ply)))
801     {
802         TT.refresh(tte);
803         ss->bestMove = ttMove; // Can be MOVE_NONE
804         return value_from_tt(tte->value(), ss->ply);
805     }
806
807     // Step 5. Evaluate the position statically and update parent's gain statistics
808     if (inCheck)
809         ss->eval = ss->evalMargin = VALUE_NONE;
810     else if (tte)
811     {
812         assert(tte->static_value() != VALUE_NONE);
813
814         ss->eval = tte->static_value();
815         ss->evalMargin = tte->static_value_margin();
816         refinedValue = refine_eval(tte, ss->eval, ss->ply);
817     }
818     else
819     {
820         refinedValue = ss->eval = evaluate(pos, ss->evalMargin);
821         TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, ss->evalMargin);
822     }
823
824     // Save gain for the parent non-capture move
825     update_gains(pos, (ss-1)->currentMove, (ss-1)->eval, ss->eval);
826
827     // Step 6. Razoring (is omitted in PV nodes)
828     if (   !PvNode
829         &&  depth < RazorDepth
830         && !inCheck
831         &&  refinedValue + razor_margin(depth) < beta
832         &&  ttMove == MOVE_NONE
833         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX
834         && !pos.has_pawn_on_7th(pos.side_to_move()))
835     {
836         Value rbeta = beta - razor_margin(depth);
837         Value v = qsearch<NonPV>(pos, ss, rbeta-1, rbeta, DEPTH_ZERO);
838         if (v < rbeta)
839             // Logically we should return (v + razor_margin(depth)), but
840             // surprisingly this did slightly weaker in tests.
841             return v;
842     }
843
844     // Step 7. Static null move pruning (is omitted in PV nodes)
845     // We're betting that the opponent doesn't have a move that will reduce
846     // the score by more than futility_margin(depth) if we do a null move.
847     if (   !PvNode
848         && !ss->skipNullMove
849         &&  depth < RazorDepth
850         && !inCheck
851         &&  refinedValue - futility_margin(depth, 0) >= beta
852         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX
853         &&  pos.non_pawn_material(pos.side_to_move()))
854         return refinedValue - futility_margin(depth, 0);
855
856     // Step 8. Null move search with verification search (is omitted in PV nodes)
857     if (   !PvNode
858         && !ss->skipNullMove
859         &&  depth > ONE_PLY
860         && !inCheck
861         &&  refinedValue >= beta
862         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX
863         &&  pos.non_pawn_material(pos.side_to_move()))
864     {
865         ss->currentMove = MOVE_NULL;
866
867         // Null move dynamic reduction based on depth
868         int R = 3 + (depth >= 5 * ONE_PLY ? depth / 8 : 0);
869
870         // Null move dynamic reduction based on value
871         if (refinedValue - PawnValueMidgame > beta)
872             R++;
873
874         pos.do_null_move(st);
875         (ss+1)->skipNullMove = true;
876         nullValue = depth-R*ONE_PLY < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
877                                               : - search<NonPV>(pos, ss+1, -beta, -alpha, depth-R*ONE_PLY);
878         (ss+1)->skipNullMove = false;
879         pos.undo_null_move();
880
881         if (nullValue >= beta)
882         {
883             // Do not return unproven mate scores
884             if (nullValue >= VALUE_MATE_IN_PLY_MAX)
885                 nullValue = beta;
886
887             if (depth < 6 * ONE_PLY)
888                 return nullValue;
889
890             // Do verification search at high depths
891             ss->skipNullMove = true;
892             Value v = search<NonPV>(pos, ss, alpha, beta, depth-R*ONE_PLY);
893             ss->skipNullMove = false;
894
895             if (v >= beta)
896                 return nullValue;
897         }
898         else
899         {
900             // The null move failed low, which means that we may be faced with
901             // some kind of threat. If the previous move was reduced, check if
902             // the move that refuted the null move was somehow connected to the
903             // move which was reduced. If a connection is found, return a fail
904             // low score (which will cause the reduced move to fail high in the
905             // parent node, which will trigger a re-search with full depth).
906             threatMove = (ss+1)->bestMove;
907
908             if (   depth < ThreatDepth
909                 && (ss-1)->reduction
910                 && threatMove != MOVE_NONE
911                 && connected_moves(pos, (ss-1)->currentMove, threatMove))
912                 return beta - 1;
913         }
914     }
915
916     // Step 9. ProbCut (is omitted in PV nodes)
917     // If we have a very good capture (i.e. SEE > seeValues[captured_piece_type])
918     // and a reduced search returns a value much above beta, we can (almost) safely
919     // prune the previous move.
920     if (   !PvNode
921         &&  depth >= RazorDepth + ONE_PLY
922         && !inCheck
923         && !ss->skipNullMove
924         &&  excludedMove == MOVE_NONE
925         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX)
926     {
927         Value rbeta = beta + 200;
928         Depth rdepth = depth - ONE_PLY - 3 * ONE_PLY;
929
930         assert(rdepth >= ONE_PLY);
931
932         MovePicker mp(pos, ttMove, H, pos.captured_piece_type());
933         CheckInfo ci(pos);
934
935         while ((move = mp.get_next_move()) != MOVE_NONE)
936             if (pos.pl_move_is_legal(move, ci.pinned))
937             {
938                 pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
939                 value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
940                 pos.undo_move(move);
941                 if (value >= rbeta)
942                     return value;
943             }
944     }
945
946     // Step 10. Internal iterative deepening
947     if (   depth >= IIDDepth[PvNode]
948         && ttMove == MOVE_NONE
949         && (PvNode || (!inCheck && ss->eval + IIDMargin >= beta)))
950     {
951         Depth d = (PvNode ? depth - 2 * ONE_PLY : depth / 2);
952
953         ss->skipNullMove = true;
954         search<PvNode ? PV : NonPV>(pos, ss, alpha, beta, d);
955         ss->skipNullMove = false;
956
957         tte = TT.probe(posKey);
958         ttMove = tte ? tte->move() : MOVE_NONE;
959     }
960
961 split_point_start: // At split points actual search starts from here
962
963     // Initialize a MovePicker object for the current position
964     MovePickerExt<NT> mp(pos, RootNode ? Rml[MultiPVIteration].pv[0] : ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
965     CheckInfo ci(pos);
966     ss->bestMove = MOVE_NONE;
967     futilityBase = ss->eval + ss->evalMargin;
968     singularExtensionNode =   !RootNode
969                            && !SpNode
970                            && depth >= SingularExtensionDepth[PvNode]
971                            && ttMove != MOVE_NONE
972                            && !excludedMove // Do not allow recursive singular extension search
973                            && (tte->type() & VALUE_TYPE_LOWER)
974                            && tte->depth() >= depth - 3 * ONE_PLY;
975     if (SpNode)
976     {
977         lock_grab(&(sp->lock));
978         bestValue = sp->bestValue;
979     }
980
981     // Step 11. Loop through moves
982     // Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
983     while (   bestValue < beta
984            && (move = mp.get_next_move()) != MOVE_NONE
985            && !thread.cutoff_occurred())
986     {
987       assert(move_is_ok(move));
988
989       if (move == excludedMove)
990           continue;
991
992       // At root obey the "searchmoves" option and skip moves not listed in Root Move List.
993       // Also in MultiPV mode we skip moves which already have got an exact score
994       // in previous MultiPV Iteration.
995       if (RootNode && !Rml.find(move, MultiPVIteration))
996           continue;
997
998       // At PV and SpNode nodes we want all moves to be legal since the beginning
999       if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, ci.pinned))
1000           continue;
1001
1002       if (SpNode)
1003       {
1004           moveCount = ++sp->moveCount;
1005           lock_release(&(sp->lock));
1006       }
1007       else
1008           moveCount++;
1009
1010       if (RootNode)
1011       {
1012           // This is used by time management
1013           FirstRootMove = (moveCount == 1);
1014
1015           // Save the current node count before the move is searched
1016           nodes = pos.nodes_searched();
1017
1018           // If it's time to send nodes info, do it here where we have the
1019           // correct accumulated node counts searched by each thread.
1020           if (SendSearchedNodes)
1021           {
1022               SendSearchedNodes = false;
1023               cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
1024           }
1025
1026           // For long searches send current move info to GUI
1027           if (current_search_time() > 2000)
1028               cout << "info" << depth_to_uci(depth)
1029                    << " currmove " << move << " currmovenumber " << moveCount + MultiPVIteration << endl;
1030       }
1031
1032       // At Root and at first iteration do a PV search on all the moves to score root moves
1033       isPvMove = (PvNode && moveCount <= ((RootNode && depth <= ONE_PLY) ? MAX_MOVES : 1));
1034       givesCheck = pos.move_gives_check(move, ci);
1035       captureOrPromotion = pos.move_is_capture_or_promotion(move);
1036
1037       // Step 12. Decide the new search depth
1038       ext = extension<PvNode>(pos, move, captureOrPromotion, givesCheck, &dangerous);
1039
1040       // Singular extension search. If all moves but one fail low on a search of
1041       // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
1042       // is singular and should be extended. To verify this we do a reduced search
1043       // on all the other moves but the ttMove, if result is lower than ttValue minus
1044       // a margin then we extend ttMove.
1045       if (   singularExtensionNode
1046           && move == ttMove
1047           && pos.pl_move_is_legal(move, ci.pinned)
1048           && ext < ONE_PLY)
1049       {
1050           Value ttValue = value_from_tt(tte->value(), ss->ply);
1051
1052           if (abs(ttValue) < VALUE_KNOWN_WIN)
1053           {
1054               Value rBeta = ttValue - int(depth);
1055               ss->excludedMove = move;
1056               ss->skipNullMove = true;
1057               Value v = search<NonPV>(pos, ss, rBeta - 1, rBeta, depth / 2);
1058               ss->skipNullMove = false;
1059               ss->excludedMove = MOVE_NONE;
1060               ss->bestMove = MOVE_NONE;
1061               if (v < rBeta)
1062                   ext = ONE_PLY;
1063           }
1064       }
1065
1066       // Update current move (this must be done after singular extension search)
1067       newDepth = depth - ONE_PLY + ext;
1068
1069       // Step 13. Futility pruning (is omitted in PV nodes)
1070       if (   !PvNode
1071           && !captureOrPromotion
1072           && !inCheck
1073           && !dangerous
1074           &&  move != ttMove
1075           && !move_is_castle(move))
1076       {
1077           // Move count based pruning
1078           if (   moveCount >= futility_move_count(depth)
1079               && (!threatMove || !connected_threat(pos, move, threatMove))
1080               && bestValue > VALUE_MATED_IN_PLY_MAX) // FIXME bestValue is racy
1081           {
1082               if (SpNode)
1083                   lock_grab(&(sp->lock));
1084
1085               continue;
1086           }
1087
1088           // Value based pruning
1089           // We illogically ignore reduction condition depth >= 3*ONE_PLY for predicted depth,
1090           // but fixing this made program slightly weaker.
1091           Depth predictedDepth = newDepth - reduction<PvNode>(depth, moveCount);
1092           futilityValueScaled =  futilityBase + futility_margin(predictedDepth, moveCount)
1093                                + H.gain(pos.piece_on(move_from(move)), move_to(move));
1094
1095           if (futilityValueScaled < beta)
1096           {
1097               if (SpNode)
1098               {
1099                   lock_grab(&(sp->lock));
1100                   if (futilityValueScaled > sp->bestValue)
1101                       sp->bestValue = bestValue = futilityValueScaled;
1102               }
1103               else if (futilityValueScaled > bestValue)
1104                   bestValue = futilityValueScaled;
1105
1106               continue;
1107           }
1108
1109           // Prune moves with negative SEE at low depths
1110           if (   predictedDepth < 2 * ONE_PLY
1111               && bestValue > VALUE_MATED_IN_PLY_MAX
1112               && pos.see_sign(move) < 0)
1113           {
1114               if (SpNode)
1115                   lock_grab(&(sp->lock));
1116
1117               continue;
1118           }
1119       }
1120
1121       // Check for legality only before to do the move
1122       if (!pos.pl_move_is_legal(move, ci.pinned))
1123       {
1124           moveCount--;
1125           continue;
1126       }
1127
1128       ss->currentMove = move;
1129       if (!SpNode && !captureOrPromotion)
1130           movesSearched[playedMoveCount++] = move;
1131
1132       // Step 14. Make the move
1133       pos.do_move(move, st, ci, givesCheck);
1134
1135       // Step extra. pv search (only in PV nodes)
1136       // The first move in list is the expected PV
1137       if (isPvMove)
1138           value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
1139                                      : - search<PV>(pos, ss+1, -beta, -alpha, newDepth);
1140       else
1141       {
1142           // Step 15. Reduced depth search
1143           // If the move fails high will be re-searched at full depth.
1144           bool doFullDepthSearch = true;
1145
1146           if (    depth > 3 * ONE_PLY
1147               && !captureOrPromotion
1148               && !dangerous
1149               && !move_is_castle(move)
1150               &&  ss->killers[0] != move
1151               &&  ss->killers[1] != move
1152               && (ss->reduction = reduction<PvNode>(depth, moveCount)) != DEPTH_ZERO)
1153           {
1154               Depth d = newDepth - ss->reduction;
1155               alpha = SpNode ? sp->alpha : alpha;
1156
1157               value = d < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
1158                                   : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d);
1159
1160               ss->reduction = DEPTH_ZERO;
1161               doFullDepthSearch = (value > alpha);
1162           }
1163
1164           // Step 16. Full depth search
1165           if (doFullDepthSearch)
1166           {
1167               alpha = SpNode ? sp->alpha : alpha;
1168               value = newDepth < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
1169                                          : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth);
1170
1171               // Step extra. pv search (only in PV nodes)
1172               // Search only for possible new PV nodes, if instead value >= beta then
1173               // parent node fails low with value <= alpha and tries another move.
1174               if (PvNode && value > alpha && (RootNode || value < beta))
1175                   value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
1176                                              : - search<PV>(pos, ss+1, -beta, -alpha, newDepth);
1177           }
1178       }
1179
1180       // Step 17. Undo move
1181       pos.undo_move(move);
1182
1183       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1184
1185       // Step 18. Check for new best move
1186       if (SpNode)
1187       {
1188           lock_grab(&(sp->lock));
1189           bestValue = sp->bestValue;
1190           alpha = sp->alpha;
1191       }
1192
1193       if (value > bestValue)
1194       {
1195           bestValue = value;
1196           ss->bestMove = move;
1197
1198           if (  !RootNode
1199               && PvNode
1200               && value > alpha
1201               && value < beta) // We want always alpha < beta
1202               alpha = value;
1203
1204           if (SpNode && !thread.cutoff_occurred())
1205           {
1206               sp->bestValue = value;
1207               sp->ss->bestMove = move;
1208               sp->alpha = alpha;
1209               sp->is_betaCutoff = (value >= beta);
1210           }
1211       }
1212
1213       if (RootNode)
1214       {
1215           // Finished searching the move. If StopRequest is true, the search
1216           // was aborted because the user interrupted the search or because we
1217           // ran out of time. In this case, the return value of the search cannot
1218           // be trusted, and we break out of the loop without updating the best
1219           // move and/or PV.
1220           if (StopRequest)
1221               break;
1222
1223           // Remember searched nodes counts for this move
1224           Rml.find(move)->nodes += pos.nodes_searched() - nodes;
1225
1226           // PV move or new best move ?
1227           if (isPvMove || value > alpha)
1228           {
1229               // Update PV
1230               Rml.find(move)->pv_score = value;
1231               Rml.find(move)->extract_pv_from_tt(pos);
1232
1233               // We record how often the best move has been changed in each
1234               // iteration. This information is used for time management: When
1235               // the best move changes frequently, we allocate some more time.
1236               if (!isPvMove && MultiPV == 1)
1237                   Rml.bestMoveChanges++;
1238
1239               // Update alpha.
1240               if (value > alpha)
1241                   alpha = value;
1242           }
1243           else
1244               // All other moves but the PV are set to the lowest value, this
1245               // is not a problem when sorting becuase sort is stable and move
1246               // position in the list is preserved, just the PV is pushed up.
1247               Rml.find(move)->pv_score = -VALUE_INFINITE;
1248
1249       } // RootNode
1250
1251       // Step 19. Check for split
1252       if (   !RootNode
1253           && !SpNode
1254           && depth >= Threads.min_split_depth()
1255           && bestValue < beta
1256           && Threads.available_slave_exists(pos.thread())
1257           && !StopRequest
1258           && !thread.cutoff_occurred())
1259           Threads.split<FakeSplit>(pos, ss, &alpha, beta, &bestValue, depth,
1260                                    threatMove, moveCount, &mp, PvNode);
1261     }
1262
1263     // Step 20. Check for mate and stalemate
1264     // All legal moves have been searched and if there are
1265     // no legal moves, it must be mate or stalemate.
1266     // If one move was excluded return fail low score.
1267     if (!SpNode && !moveCount)
1268         return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
1269
1270     // Step 21. Update tables
1271     // If the search is not aborted, update the transposition table,
1272     // history counters, and killer moves.
1273     if (!SpNode && !StopRequest && !thread.cutoff_occurred())
1274     {
1275         move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
1276         vt   = bestValue <= oldAlpha ? VALUE_TYPE_UPPER
1277              : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT;
1278
1279         TT.store(posKey, value_to_tt(bestValue, ss->ply), vt, depth, move, ss->eval, ss->evalMargin);
1280
1281         // Update killers and history only for non capture moves that fails high
1282         if (    bestValue >= beta
1283             && !pos.move_is_capture_or_promotion(move))
1284         {
1285             if (move != ss->killers[0])
1286             {
1287                 ss->killers[1] = ss->killers[0];
1288                 ss->killers[0] = move;
1289             }
1290             update_history(pos, move, depth, movesSearched, playedMoveCount);
1291         }
1292     }
1293
1294     if (SpNode)
1295     {
1296         // Here we have the lock still grabbed
1297         sp->is_slave[pos.thread()] = false;
1298         sp->nodes += pos.nodes_searched();
1299         lock_release(&(sp->lock));
1300     }
1301
1302     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1303
1304     return bestValue;
1305   }
1306
1307   // qsearch() is the quiescence search function, which is called by the main
1308   // search function when the remaining depth is zero (or, to be more precise,
1309   // less than ONE_PLY).
1310
1311   template <NodeType NT>
1312   Value qsearch(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) {
1313
1314     const bool PvNode = (NT == PV);
1315
1316     assert(NT == PV || NT == NonPV);
1317     assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE);
1318     assert(beta >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
1319     assert(PvNode || alpha == beta - 1);
1320     assert(depth <= 0);
1321     assert(pos.thread() >= 0 && pos.thread() < Threads.size());
1322
1323     StateInfo st;
1324     Move ttMove, move;
1325     Value bestValue, value, evalMargin, futilityValue, futilityBase;
1326     bool inCheck, enoughMaterial, givesCheck, evasionPrunable;
1327     const TTEntry* tte;
1328     Depth ttDepth;
1329     Value oldAlpha = alpha;
1330
1331     ss->bestMove = ss->currentMove = MOVE_NONE;
1332     ss->ply = (ss-1)->ply + 1;
1333
1334     // Check for an instant draw or maximum ply reached
1335     if (pos.is_draw<true>() || ss->ply > PLY_MAX)
1336         return VALUE_DRAW;
1337
1338     // Decide whether or not to include checks, this fixes also the type of
1339     // TT entry depth that we are going to use. Note that in qsearch we use
1340     // only two types of depth in TT: DEPTH_QS_CHECKS or DEPTH_QS_NO_CHECKS.
1341     inCheck = pos.in_check();
1342     ttDepth = (inCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS : DEPTH_QS_NO_CHECKS);
1343
1344     // Transposition table lookup. At PV nodes, we don't use the TT for
1345     // pruning, but only for move ordering.
1346     tte = TT.probe(pos.get_key());
1347     ttMove = (tte ? tte->move() : MOVE_NONE);
1348
1349     if (!PvNode && tte && ok_to_use_TT(tte, ttDepth, beta, ss->ply))
1350     {
1351         ss->bestMove = ttMove; // Can be MOVE_NONE
1352         return value_from_tt(tte->value(), ss->ply);
1353     }
1354
1355     // Evaluate the position statically
1356     if (inCheck)
1357     {
1358         bestValue = futilityBase = -VALUE_INFINITE;
1359         ss->eval = evalMargin = VALUE_NONE;
1360         enoughMaterial = false;
1361     }
1362     else
1363     {
1364         if (tte)
1365         {
1366             assert(tte->static_value() != VALUE_NONE);
1367
1368             evalMargin = tte->static_value_margin();
1369             ss->eval = bestValue = tte->static_value();
1370         }
1371         else
1372             ss->eval = bestValue = evaluate(pos, evalMargin);
1373
1374         // Stand pat. Return immediately if static value is at least beta
1375         if (bestValue >= beta)
1376         {
1377             if (!tte)
1378                 TT.store(pos.get_key(), value_to_tt(bestValue, ss->ply), VALUE_TYPE_LOWER, DEPTH_NONE, MOVE_NONE, ss->eval, evalMargin);
1379
1380             return bestValue;
1381         }
1382
1383         if (PvNode && bestValue > alpha)
1384             alpha = bestValue;
1385
1386         // Futility pruning parameters, not needed when in check
1387         futilityBase = ss->eval + evalMargin + FutilityMarginQS;
1388         enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
1389     }
1390
1391     // Initialize a MovePicker object for the current position, and prepare
1392     // to search the moves. Because the depth is <= 0 here, only captures,
1393     // queen promotions and checks (only if depth >= DEPTH_QS_CHECKS) will
1394     // be generated.
1395     MovePicker mp(pos, ttMove, depth, H, move_to((ss-1)->currentMove));
1396     CheckInfo ci(pos);
1397
1398     // Loop through the moves until no moves remain or a beta cutoff occurs
1399     while (   alpha < beta
1400            && (move = mp.get_next_move()) != MOVE_NONE)
1401     {
1402       assert(move_is_ok(move));
1403
1404       givesCheck = pos.move_gives_check(move, ci);
1405
1406       // Futility pruning
1407       if (   !PvNode
1408           && !inCheck
1409           && !givesCheck
1410           &&  move != ttMove
1411           &&  enoughMaterial
1412           && !move_is_promotion(move)
1413           && !pos.move_is_passed_pawn_push(move))
1414       {
1415           futilityValue =  futilityBase
1416                          + piece_value_endgame(pos.piece_on(move_to(move)))
1417                          + (move_is_ep(move) ? PawnValueEndgame : VALUE_ZERO);
1418
1419           if (futilityValue < alpha)
1420           {
1421               if (futilityValue > bestValue)
1422                   bestValue = futilityValue;
1423               continue;
1424           }
1425
1426           // Prune moves with negative or equal SEE
1427           if (   futilityBase < beta
1428               && depth < DEPTH_ZERO
1429               && pos.see(move) <= 0)
1430               continue;
1431       }
1432
1433       // Detect non-capture evasions that are candidate to be pruned
1434       evasionPrunable =   !PvNode
1435                        && inCheck
1436                        && bestValue > VALUE_MATED_IN_PLY_MAX
1437                        && !pos.move_is_capture(move)
1438                        && !pos.can_castle(pos.side_to_move());
1439
1440       // Don't search moves with negative SEE values
1441       if (   !PvNode
1442           && (!inCheck || evasionPrunable)
1443           &&  move != ttMove
1444           && !move_is_promotion(move)
1445           &&  pos.see_sign(move) < 0)
1446           continue;
1447
1448       // Don't search useless checks
1449       if (   !PvNode
1450           && !inCheck
1451           &&  givesCheck
1452           &&  move != ttMove
1453           && !pos.move_is_capture_or_promotion(move)
1454           &&  ss->eval + PawnValueMidgame / 4 < beta
1455           && !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
1456       {
1457           if (ss->eval + PawnValueMidgame / 4 > bestValue)
1458               bestValue = ss->eval + PawnValueMidgame / 4;
1459
1460           continue;
1461       }
1462
1463       // Check for legality only before to do the move
1464       if (!pos.pl_move_is_legal(move, ci.pinned))
1465           continue;
1466
1467       // Update current move
1468       ss->currentMove = move;
1469
1470       // Make and search the move
1471       pos.do_move(move, st, ci, givesCheck);
1472       value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth-ONE_PLY);
1473       pos.undo_move(move);
1474
1475       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1476
1477       // New best move?
1478       if (value > bestValue)
1479       {
1480           bestValue = value;
1481           if (value > alpha)
1482           {
1483               alpha = value;
1484               ss->bestMove = move;
1485           }
1486        }
1487     }
1488
1489     // All legal moves have been searched. A special case: If we're in check
1490     // and no legal moves were found, it is checkmate.
1491     if (inCheck && bestValue == -VALUE_INFINITE)
1492         return value_mated_in(ss->ply);
1493
1494     // Update transposition table
1495     ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
1496     TT.store(pos.get_key(), value_to_tt(bestValue, ss->ply), vt, ttDepth, ss->bestMove, ss->eval, evalMargin);
1497
1498     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1499
1500     return bestValue;
1501   }
1502
1503
1504   // check_is_dangerous() tests if a checking move can be pruned in qsearch().
1505   // bestValue is updated only when returning false because in that case move
1506   // will be pruned.
1507
1508   bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta, Value *bestValue)
1509   {
1510     Bitboard b, occ, oldAtt, newAtt, kingAtt;
1511     Square from, to, ksq, victimSq;
1512     Piece pc;
1513     Color them;
1514     Value futilityValue, bv = *bestValue;
1515
1516     from = move_from(move);
1517     to = move_to(move);
1518     them = opposite_color(pos.side_to_move());
1519     ksq = pos.king_square(them);
1520     kingAtt = pos.attacks_from<KING>(ksq);
1521     pc = pos.piece_on(from);
1522
1523     occ = pos.occupied_squares() & ~(1ULL << from) & ~(1ULL << ksq);
1524     oldAtt = pos.attacks_from(pc, from, occ);
1525     newAtt = pos.attacks_from(pc,   to, occ);
1526
1527     // Rule 1. Checks which give opponent's king at most one escape square are dangerous
1528     b = kingAtt & ~pos.pieces(them) & ~newAtt & ~(1ULL << to);
1529
1530     if (!(b && (b & (b - 1))))
1531         return true;
1532
1533     // Rule 2. Queen contact check is very dangerous
1534     if (   piece_type(pc) == QUEEN
1535         && bit_is_set(kingAtt, to))
1536         return true;
1537
1538     // Rule 3. Creating new double threats with checks
1539     b = pos.pieces(them) & newAtt & ~oldAtt & ~(1ULL << ksq);
1540
1541     while (b)
1542     {
1543         victimSq = pop_1st_bit(&b);
1544         futilityValue = futilityBase + piece_value_endgame(pos.piece_on(victimSq));
1545
1546         // Note that here we generate illegal "double move"!
1547         if (   futilityValue >= beta
1548             && pos.see_sign(make_move(from, victimSq)) >= 0)
1549             return true;
1550
1551         if (futilityValue > bv)
1552             bv = futilityValue;
1553     }
1554
1555     // Update bestValue only if check is not dangerous (because we will prune the move)
1556     *bestValue = bv;
1557     return false;
1558   }
1559
1560
1561   // connected_moves() tests whether two moves are 'connected' in the sense
1562   // that the first move somehow made the second move possible (for instance
1563   // if the moving piece is the same in both moves). The first move is assumed
1564   // to be the move that was made to reach the current position, while the
1565   // second move is assumed to be a move from the current position.
1566
1567   bool connected_moves(const Position& pos, Move m1, Move m2) {
1568
1569     Square f1, t1, f2, t2;
1570     Piece p1, p2;
1571     Square ksq;
1572
1573     assert(m1 && move_is_ok(m1));
1574     assert(m2 && move_is_ok(m2));
1575
1576     // Case 1: The moving piece is the same in both moves
1577     f2 = move_from(m2);
1578     t1 = move_to(m1);
1579     if (f2 == t1)
1580         return true;
1581
1582     // Case 2: The destination square for m2 was vacated by m1
1583     t2 = move_to(m2);
1584     f1 = move_from(m1);
1585     if (t2 == f1)
1586         return true;
1587
1588     // Case 3: Moving through the vacated square
1589     p2 = pos.piece_on(f2);
1590     if (   piece_is_slider(p2)
1591         && bit_is_set(squares_between(f2, t2), f1))
1592       return true;
1593
1594     // Case 4: The destination square for m2 is defended by the moving piece in m1
1595     p1 = pos.piece_on(t1);
1596     if (bit_is_set(pos.attacks_from(p1, t1), t2))
1597         return true;
1598
1599     // Case 5: Discovered check, checking piece is the piece moved in m1
1600     ksq = pos.king_square(pos.side_to_move());
1601     if (    piece_is_slider(p1)
1602         &&  bit_is_set(squares_between(t1, ksq), f2))
1603     {
1604         Bitboard occ = pos.occupied_squares();
1605         clear_bit(&occ, f2);
1606         if (bit_is_set(pos.attacks_from(p1, t1, occ), ksq))
1607             return true;
1608     }
1609     return false;
1610   }
1611
1612
1613   // value_to_tt() adjusts a mate score from "plies to mate from the root" to
1614   // "plies to mate from the current ply".  Non-mate scores are unchanged.
1615   // The function is called before storing a value to the transposition table.
1616
1617   Value value_to_tt(Value v, int ply) {
1618
1619     if (v >= VALUE_MATE_IN_PLY_MAX)
1620       return v + ply;
1621
1622     if (v <= VALUE_MATED_IN_PLY_MAX)
1623       return v - ply;
1624
1625     return v;
1626   }
1627
1628
1629   // value_from_tt() is the inverse of value_to_tt(): It adjusts a mate score from
1630   // the transposition table to a mate score corrected for the current ply.
1631
1632   Value value_from_tt(Value v, int ply) {
1633
1634     if (v >= VALUE_MATE_IN_PLY_MAX)
1635       return v - ply;
1636
1637     if (v <= VALUE_MATED_IN_PLY_MAX)
1638       return v + ply;
1639
1640     return v;
1641   }
1642
1643
1644   // connected_threat() tests whether it is safe to forward prune a move or if
1645   // is somehow connected to the threat move returned by null search.
1646
1647   bool connected_threat(const Position& pos, Move m, Move threat) {
1648
1649     assert(move_is_ok(m));
1650     assert(threat && move_is_ok(threat));
1651     assert(!pos.move_is_capture_or_promotion(m));
1652     assert(!pos.move_is_passed_pawn_push(m));
1653
1654     Square mfrom, mto, tfrom, tto;
1655
1656     mfrom = move_from(m);
1657     mto = move_to(m);
1658     tfrom = move_from(threat);
1659     tto = move_to(threat);
1660
1661     // Case 1: Don't prune moves which move the threatened piece
1662     if (mfrom == tto)
1663         return true;
1664
1665     // Case 2: If the threatened piece has value less than or equal to the
1666     // value of the threatening piece, don't prune moves which defend it.
1667     if (   pos.move_is_capture(threat)
1668         && (   piece_value_midgame(pos.piece_on(tfrom)) >= piece_value_midgame(pos.piece_on(tto))
1669             || piece_type(pos.piece_on(tfrom)) == KING)
1670         && pos.move_attacks_square(m, tto))
1671         return true;
1672
1673     // Case 3: If the moving piece in the threatened move is a slider, don't
1674     // prune safe moves which block its ray.
1675     if (   piece_is_slider(pos.piece_on(tfrom))
1676         && bit_is_set(squares_between(tfrom, tto), mto)
1677         && pos.see_sign(m) >= 0)
1678         return true;
1679
1680     return false;
1681   }
1682
1683
1684   // ok_to_use_TT() returns true if a transposition table score
1685   // can be used at a given point in search.
1686
1687   bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply) {
1688
1689     Value v = value_from_tt(tte->value(), ply);
1690
1691     return   (   tte->depth() >= depth
1692               || v >= Max(VALUE_MATE_IN_PLY_MAX, beta)
1693               || v < Min(VALUE_MATED_IN_PLY_MAX, beta))
1694
1695           && (   ((tte->type() & VALUE_TYPE_LOWER) && v >= beta)
1696               || ((tte->type() & VALUE_TYPE_UPPER) && v < beta));
1697   }
1698
1699
1700   // refine_eval() returns the transposition table score if
1701   // possible otherwise falls back on static position evaluation.
1702
1703   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply) {
1704
1705       assert(tte);
1706
1707       Value v = value_from_tt(tte->value(), ply);
1708
1709       if (   ((tte->type() & VALUE_TYPE_LOWER) && v >= defaultEval)
1710           || ((tte->type() & VALUE_TYPE_UPPER) && v < defaultEval))
1711           return v;
1712
1713       return defaultEval;
1714   }
1715
1716
1717   // update_history() registers a good move that produced a beta-cutoff
1718   // in history and marks as failures all the other moves of that ply.
1719
1720   void update_history(const Position& pos, Move move, Depth depth,
1721                       Move movesSearched[], int moveCount) {
1722     Move m;
1723     Value bonus = Value(int(depth) * int(depth));
1724
1725     H.update(pos.piece_on(move_from(move)), move_to(move), bonus);
1726
1727     for (int i = 0; i < moveCount - 1; i++)
1728     {
1729         m = movesSearched[i];
1730
1731         assert(m != move);
1732
1733         H.update(pos.piece_on(move_from(m)), move_to(m), -bonus);
1734     }
1735   }
1736
1737
1738   // update_gains() updates the gains table of a non-capture move given
1739   // the static position evaluation before and after the move.
1740
1741   void update_gains(const Position& pos, Move m, Value before, Value after) {
1742
1743     if (   m != MOVE_NULL
1744         && before != VALUE_NONE
1745         && after != VALUE_NONE
1746         && pos.captured_piece_type() == PIECE_TYPE_NONE
1747         && !move_is_special(m))
1748         H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
1749   }
1750
1751
1752   // current_search_time() returns the number of milliseconds which have passed
1753   // since the beginning of the current search.
1754
1755   int current_search_time(int set) {
1756
1757     static int searchStartTime;
1758
1759     if (set)
1760         searchStartTime = set;
1761
1762     return get_system_time() - searchStartTime;
1763   }
1764
1765
1766   // score_to_uci() converts a value to a string suitable for use with the UCI
1767   // protocol specifications:
1768   //
1769   // cp <x>     The score from the engine's point of view in centipawns.
1770   // mate <y>   Mate in y moves, not plies. If the engine is getting mated
1771   //            use negative values for y.
1772
1773   string score_to_uci(Value v, Value alpha, Value beta) {
1774
1775     std::stringstream s;
1776
1777     if (abs(v) < VALUE_MATE - PLY_MAX * ONE_PLY)
1778         s << " score cp " << int(v) * 100 / int(PawnValueMidgame); // Scale to centipawns
1779     else
1780         s << " score mate " << (v > 0 ? VALUE_MATE - v + 1 : -VALUE_MATE - v) / 2;
1781
1782     s << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : "");
1783
1784     return s.str();
1785   }
1786
1787
1788   // speed_to_uci() returns a string with time stats of current search suitable
1789   // to be sent to UCI gui.
1790
1791   string speed_to_uci(int64_t nodes) {
1792
1793     std::stringstream s;
1794     int t = current_search_time();
1795
1796     s << " nodes " << nodes
1797       << " nps " << (t > 0 ? int(nodes * 1000 / t) : 0)
1798       << " time "  << t;
1799
1800     return s.str();
1801   }
1802
1803   // pv_to_uci() returns a string with information on the current PV line
1804   // formatted according to UCI specification.
1805
1806   string pv_to_uci(Move pv[], int pvNum, bool chess960) {
1807
1808     std::stringstream s;
1809
1810     s << " multipv " << pvNum << " pv " << set960(chess960);
1811
1812     for ( ; *pv != MOVE_NONE; pv++)
1813         s << *pv << " ";
1814
1815     return s.str();
1816   }
1817
1818   // depth_to_uci() returns a string with information on the current depth and
1819   // seldepth formatted according to UCI specification.
1820
1821   string depth_to_uci(Depth depth) {
1822
1823     std::stringstream s;
1824
1825     // Retrieve max searched depth among threads
1826     int selDepth = 0;
1827     for (int i = 0; i < Threads.size(); i++)
1828         if (Threads[i].maxPly > selDepth)
1829             selDepth = Threads[i].maxPly;
1830
1831      s << " depth " << depth / ONE_PLY << " seldepth " << selDepth;
1832
1833     return s.str();
1834   }
1835
1836   string time_to_string(int millisecs) {
1837
1838     const int MSecMinute = 1000 * 60;
1839     const int MSecHour   = 1000 * 60 * 60;
1840
1841     int hours = millisecs / MSecHour;
1842     int minutes =  (millisecs % MSecHour) / MSecMinute;
1843     int seconds = ((millisecs % MSecHour) % MSecMinute) / 1000;
1844
1845     std::stringstream s;
1846
1847     if (hours)
1848         s << hours << ':';
1849
1850     s << std::setfill('0') << std::setw(2) << minutes << ':' << std::setw(2) << seconds;
1851     return s.str();
1852   }
1853
1854   string score_to_string(Value v) {
1855
1856     std::stringstream s;
1857
1858     if (v >= VALUE_MATE_IN_PLY_MAX)
1859         s << "#" << (VALUE_MATE - v + 1) / 2;
1860     else if (v <= VALUE_MATED_IN_PLY_MAX)
1861         s << "-#" << (VALUE_MATE + v) / 2;
1862     else
1863         s << std::setprecision(2) << std::fixed << std::showpos << float(v) / PawnValueMidgame;
1864
1865     return s.str();
1866   }
1867
1868   // pretty_pv() creates a human-readable string from a position and a PV.
1869   // It is used to write search information to the log file (which is created
1870   // when the UCI parameter "Use Search Log" is "true").
1871
1872   string pretty_pv(Position& pos, int depth, Value value, int time, Move pv[]) {
1873
1874     const int64_t K = 1000;
1875     const int64_t M = 1000000;
1876     const int startColumn = 28;
1877     const size_t maxLength = 80 - startColumn;
1878
1879     StateInfo state[PLY_MAX_PLUS_2], *st = state;
1880     Move* m = pv;
1881     string san;
1882     std::stringstream s;
1883     size_t length = 0;
1884
1885     // First print depth, score, time and searched nodes...
1886     s << set960(pos.is_chess960())
1887       << std::setw(2) << depth
1888       << std::setw(8) << score_to_string(value)
1889       << std::setw(8) << time_to_string(time);
1890
1891     if (pos.nodes_searched() < M)
1892         s << std::setw(8) << pos.nodes_searched() / 1 << "  ";
1893     else if (pos.nodes_searched() < K * M)
1894         s << std::setw(7) << pos.nodes_searched() / K << "K  ";
1895     else
1896         s << std::setw(7) << pos.nodes_searched() / M << "M  ";
1897
1898     // ...then print the full PV line in short algebraic notation
1899     while (*m != MOVE_NONE)
1900     {
1901         san = move_to_san(pos, *m);
1902         length += san.length() + 1;
1903
1904         if (length > maxLength)
1905         {
1906             length = san.length() + 1;
1907             s << "\n" + string(startColumn, ' ');
1908         }
1909         s << san << ' ';
1910
1911         pos.do_move(*m++, *st++);
1912     }
1913
1914     // Restore original position before to leave
1915     while (m != pv) pos.undo_move(*--m);
1916
1917     return s.str();
1918   }
1919
1920   // poll() performs two different functions: It polls for user input, and it
1921   // looks at the time consumed so far and decides if it's time to abort the
1922   // search.
1923
1924   void poll(const Position& pos) {
1925
1926     static int lastInfoTime;
1927     int t = current_search_time();
1928
1929     //  Poll for input
1930     if (input_available())
1931     {
1932         // We are line oriented, don't read single chars
1933         string command;
1934
1935         if (!std::getline(std::cin, command) || command == "quit")
1936         {
1937             // Quit the program as soon as possible
1938             Limits.ponder = false;
1939             QuitRequest = StopRequest = true;
1940             return;
1941         }
1942         else if (command == "stop")
1943         {
1944             // Stop calculating as soon as possible, but still send the "bestmove"
1945             // and possibly the "ponder" token when finishing the search.
1946             Limits.ponder = false;
1947             StopRequest = true;
1948         }
1949         else if (command == "ponderhit")
1950         {
1951             // The opponent has played the expected move. GUI sends "ponderhit" if
1952             // we were told to ponder on the same move the opponent has played. We
1953             // should continue searching but switching from pondering to normal search.
1954             Limits.ponder = false;
1955
1956             if (StopOnPonderhit)
1957                 StopRequest = true;
1958         }
1959     }
1960
1961     // Print search information
1962     if (t < 1000)
1963         lastInfoTime = 0;
1964
1965     else if (lastInfoTime > t)
1966         // HACK: Must be a new search where we searched less than
1967         // NodesBetweenPolls nodes during the first second of search.
1968         lastInfoTime = 0;
1969
1970     else if (t - lastInfoTime >= 1000)
1971     {
1972         lastInfoTime = t;
1973
1974         dbg_print_mean();
1975         dbg_print_hit_rate();
1976
1977         // Send info on searched nodes as soon as we return to root
1978         SendSearchedNodes = true;
1979     }
1980
1981     // Should we stop the search?
1982     if (Limits.ponder)
1983         return;
1984
1985     bool stillAtFirstMove =    FirstRootMove
1986                            && !AspirationFailLow
1987                            &&  t > TimeMgr.available_time();
1988
1989     bool noMoreTime =   t > TimeMgr.maximum_time()
1990                      || stillAtFirstMove;
1991
1992     if (   (Limits.useTimeManagement() && noMoreTime)
1993         || (Limits.maxTime && t >= Limits.maxTime)
1994         || (Limits.maxNodes && pos.nodes_searched() >= Limits.maxNodes)) // FIXME
1995         StopRequest = true;
1996   }
1997
1998
1999   // wait_for_stop_or_ponderhit() is called when the maximum depth is reached
2000   // while the program is pondering. The point is to work around a wrinkle in
2001   // the UCI protocol: When pondering, the engine is not allowed to give a
2002   // "bestmove" before the GUI sends it a "stop" or "ponderhit" command.
2003   // We simply wait here until one of these commands is sent, and return,
2004   // after which the bestmove and pondermove will be printed.
2005
2006   void wait_for_stop_or_ponderhit() {
2007
2008     string command;
2009
2010     // Wait for a command from stdin
2011     while (   std::getline(std::cin, command)
2012            && command != "ponderhit" && command != "stop" && command != "quit") {};
2013
2014     if (command != "ponderhit" && command != "stop")
2015         QuitRequest = true; // Must be "quit" or getline() returned false
2016   }
2017
2018
2019   // When playing with strength handicap choose best move among the MultiPV set
2020   // using a statistical rule dependent on SkillLevel. Idea by Heinz van Saanen.
2021   void do_skill_level(Move* best, Move* ponder) {
2022
2023     assert(MultiPV > 1);
2024
2025     static RKISS rk;
2026
2027     // Rml list is already sorted by pv_score in descending order
2028     int s;
2029     int max_s = -VALUE_INFINITE;
2030     int size = Min(MultiPV, (int)Rml.size());
2031     int max = Rml[0].pv_score;
2032     int var = Min(max - Rml[size - 1].pv_score, PawnValueMidgame);
2033     int wk = 120 - 2 * SkillLevel;
2034
2035     // PRNG sequence should be non deterministic
2036     for (int i = abs(get_system_time() % 50); i > 0; i--)
2037         rk.rand<unsigned>();
2038
2039     // Choose best move. For each move's score we add two terms both dependent
2040     // on wk, one deterministic and bigger for weaker moves, and one random,
2041     // then we choose the move with the resulting highest score.
2042     for (int i = 0; i < size; i++)
2043     {
2044         s = Rml[i].pv_score;
2045
2046         // Don't allow crazy blunders even at very low skills
2047         if (i > 0 && Rml[i-1].pv_score > s + EasyMoveMargin)
2048             break;
2049
2050         // This is our magical formula
2051         s += ((max - s) * wk + var * (rk.rand<unsigned>() % wk)) / 128;
2052
2053         if (s > max_s)
2054         {
2055             max_s = s;
2056             *best = Rml[i].pv[0];
2057             *ponder = Rml[i].pv[1];
2058         }
2059     }
2060   }
2061
2062
2063   /// RootMove and RootMoveList method's definitions
2064
2065   RootMove::RootMove() {
2066
2067     nodes = 0;
2068     pv_score = -VALUE_INFINITE;
2069     pv[0] = MOVE_NONE;
2070   }
2071
2072   RootMove& RootMove::operator=(const RootMove& rm) {
2073
2074     const Move* src = rm.pv;
2075     Move* dst = pv;
2076
2077     // Avoid a costly full rm.pv[] copy
2078     do *dst++ = *src; while (*src++ != MOVE_NONE);
2079
2080     nodes = rm.nodes;
2081     pv_score = rm.pv_score;
2082     return *this;
2083   }
2084
2085   void RootMoveList::init(Position& pos, Move searchMoves[]) {
2086
2087     Move* sm;
2088     bestMoveChanges = 0;
2089     clear();
2090
2091     // Generate all legal moves and add them to RootMoveList
2092     for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
2093     {
2094         // If we have a searchMoves[] list then verify the move
2095         // is in the list before to add it.
2096         for (sm = searchMoves; *sm && *sm != ml.move(); sm++) {}
2097
2098         if (sm != searchMoves && *sm != ml.move())
2099             continue;
2100
2101         RootMove rm;
2102         rm.pv[0] = ml.move();
2103         rm.pv[1] = MOVE_NONE;
2104         rm.pv_score = -VALUE_INFINITE;
2105         push_back(rm);
2106     }
2107   }
2108
2109   RootMove* RootMoveList::find(const Move &m, const int startIndex) {
2110
2111       for (int i = startIndex; i < int(size()); i++)
2112       {
2113           if ((*this)[i].pv[0] == m)
2114               return &(*this)[i];
2115       }
2116
2117       return NULL;
2118   }
2119
2120   // extract_pv_from_tt() builds a PV by adding moves from the transposition table.
2121   // We consider also failing high nodes and not only VALUE_TYPE_EXACT nodes. This
2122   // allow to always have a ponder move even when we fail high at root and also a
2123   // long PV to print that is important for position analysis.
2124
2125   void RootMove::extract_pv_from_tt(Position& pos) {
2126
2127     StateInfo state[PLY_MAX_PLUS_2], *st = state;
2128     TTEntry* tte;
2129     int ply = 1;
2130
2131     assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
2132
2133     pos.do_move(pv[0], *st++);
2134
2135     while (   (tte = TT.probe(pos.get_key())) != NULL
2136            && tte->move() != MOVE_NONE
2137            && pos.move_is_pl(tte->move())
2138            && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces())
2139            && ply < PLY_MAX
2140            && (!pos.is_draw<false>() || ply < 2))
2141     {
2142         pv[ply] = tte->move();
2143         pos.do_move(pv[ply++], *st++);
2144     }
2145     pv[ply] = MOVE_NONE;
2146
2147     do pos.undo_move(pv[--ply]); while (ply);
2148   }
2149
2150   // insert_pv_in_tt() is called at the end of a search iteration, and inserts
2151   // the PV back into the TT. This makes sure the old PV moves are searched
2152   // first, even if the old TT entries have been overwritten.
2153
2154   void RootMove::insert_pv_in_tt(Position& pos) {
2155
2156     StateInfo state[PLY_MAX_PLUS_2], *st = state;
2157     TTEntry* tte;
2158     Key k;
2159     Value v, m = VALUE_NONE;
2160     int ply = 0;
2161
2162     assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
2163
2164     do {
2165         k = pos.get_key();
2166         tte = TT.probe(k);
2167
2168         // Don't overwrite existing correct entries
2169         if (!tte || tte->move() != pv[ply])
2170         {
2171             v = (pos.in_check() ? VALUE_NONE : evaluate(pos, m));
2172             TT.store(k, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, pv[ply], v, m);
2173         }
2174         pos.do_move(pv[ply], *st++);
2175
2176     } while (pv[++ply] != MOVE_NONE);
2177
2178     do pos.undo_move(pv[--ply]); while (ply);
2179   }
2180 } // namespace
2181
2182
2183 // ThreadsManager::idle_loop() is where the threads are parked when they have no work
2184 // to do. The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint
2185 // object for which the current thread is the master.
2186
2187 void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) {
2188
2189   assert(threadID >= 0 && threadID < MAX_THREADS);
2190
2191   int i;
2192   bool allFinished;
2193
2194   while (true)
2195   {
2196       // Slave threads can exit as soon as AllThreadsShouldExit raises,
2197       // master should exit as last one.
2198       if (allThreadsShouldExit)
2199       {
2200           assert(!sp);
2201           threads[threadID].state = Thread::TERMINATED;
2202           return;
2203       }
2204
2205       // If we are not thinking, wait for a condition to be signaled
2206       // instead of wasting CPU time polling for work.
2207       while (   threadID >= activeThreads
2208              || threads[threadID].state == Thread::INITIALIZING
2209              || (useSleepingThreads && threads[threadID].state == Thread::AVAILABLE))
2210       {
2211           assert(!sp || useSleepingThreads);
2212           assert(threadID != 0 || useSleepingThreads);
2213
2214           if (threads[threadID].state == Thread::INITIALIZING)
2215               threads[threadID].state = Thread::AVAILABLE;
2216
2217           // Grab the lock to avoid races with Thread::wake_up()
2218           lock_grab(&threads[threadID].sleepLock);
2219
2220           // If we are master and all slaves have finished do not go to sleep
2221           for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {}
2222           allFinished = (i == activeThreads);
2223
2224           if (allFinished || allThreadsShouldExit)
2225           {
2226               lock_release(&threads[threadID].sleepLock);
2227               break;
2228           }
2229
2230           // Do sleep here after retesting sleep conditions
2231           if (threadID >= activeThreads || threads[threadID].state == Thread::AVAILABLE)
2232               cond_wait(&threads[threadID].sleepCond, &threads[threadID].sleepLock);
2233
2234           lock_release(&threads[threadID].sleepLock);
2235       }
2236
2237       // If this thread has been assigned work, launch a search
2238       if (threads[threadID].state == Thread::WORKISWAITING)
2239       {
2240           assert(!allThreadsShouldExit);
2241
2242           threads[threadID].state = Thread::SEARCHING;
2243
2244           // Copy split point position and search stack and call search()
2245           // with SplitPoint template parameter set to true.
2246           SearchStack ss[PLY_MAX_PLUS_2];
2247           SplitPoint* tsp = threads[threadID].splitPoint;
2248           Position pos(*tsp->pos, threadID);
2249
2250           memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack));
2251           (ss+1)->sp = tsp;
2252
2253           if (tsp->pvNode)
2254               search<SplitPointPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
2255           else
2256               search<SplitPointNonPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
2257
2258           assert(threads[threadID].state == Thread::SEARCHING);
2259
2260           threads[threadID].state = Thread::AVAILABLE;
2261
2262           // Wake up master thread so to allow it to return from the idle loop in
2263           // case we are the last slave of the split point.
2264           if (   useSleepingThreads
2265               && threadID != tsp->master
2266               && threads[tsp->master].state == Thread::AVAILABLE)
2267               threads[tsp->master].wake_up();
2268       }
2269
2270       // If this thread is the master of a split point and all slaves have
2271       // finished their work at this split point, return from the idle loop.
2272       for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {}
2273       allFinished = (i == activeThreads);
2274
2275       if (allFinished)
2276       {
2277           // Because sp->slaves[] is reset under lock protection,
2278           // be sure sp->lock has been released before to return.
2279           lock_grab(&(sp->lock));
2280           lock_release(&(sp->lock));
2281
2282           // In helpful master concept a master can help only a sub-tree, and
2283           // because here is all finished is not possible master is booked.
2284           assert(threads[threadID].state == Thread::AVAILABLE);
2285
2286           threads[threadID].state = Thread::SEARCHING;
2287           return;
2288       }
2289   }
2290 }