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