]> git.sesse.net Git - stockfish/blob - src/search.cpp
Reimplement support for "searchmoves" option
[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);
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;
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     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         // Calculate dynamic aspiration window based on previous iterations
542         if (MultiPV == 1 && depth >= 5 && abs(bestValues[depth - 1]) < VALUE_KNOWN_WIN)
543         {
544             int prevDelta1 = bestValues[depth - 1] - bestValues[depth - 2];
545             int prevDelta2 = bestValues[depth - 2] - bestValues[depth - 3];
546
547             aspirationDelta = Min(Max(abs(prevDelta1) + abs(prevDelta2) / 2, 16), 24);
548             aspirationDelta = (aspirationDelta + 7) / 8 * 8; // Round to match grainSize
549
550             alpha = Max(bestValues[depth - 1] - aspirationDelta, -VALUE_INFINITE);
551             beta  = Min(bestValues[depth - 1] + aspirationDelta,  VALUE_INFINITE);
552         }
553
554         // Start with a small aspiration window and, in case of fail high/low,
555         // research with bigger window until not failing high/low anymore.
556         do {
557             // Search starting from ss+1 to allow calling update_gains()
558             value = search<Root>(pos, ss+1, alpha, beta, depth * ONE_PLY);
559
560             // It is critical that sorting is done with a stable algorithm
561             // because all the values but the first are usually set to
562             // -VALUE_INFINITE and we want to keep the same order for all
563             // the moves but the new PV that goes to head.
564             sort<RootMove>(Rml.begin(), Rml.end());
565
566             // Write PV back to transposition table in case the relevant entries
567             // have been overwritten during the search.
568             for (int i = 0; i < Min(MultiPV, (int)Rml.size()); i++)
569                 Rml[i].insert_pv_in_tt(pos);
570
571             // Value cannot be trusted. Break out immediately!
572             if (StopRequest)
573                 break;
574
575             // Send full PV info to GUI if we are going to leave the loop or
576             // if we have a fail high/low and we are deep in the search.
577             if ((value > alpha && value < beta) || current_search_time() > 2000)
578                 for (int i = 0; i < Min(UCIMultiPV, (int)Rml.size()); i++)
579                     cout << "info"
580                          << depth_to_uci(depth * ONE_PLY)
581                          << score_to_uci(Rml[i].pv_score, alpha, beta)
582                          << speed_to_uci(pos.nodes_searched())
583                          << pv_to_uci(Rml[i].pv, i + 1, pos.is_chess960()) << endl;
584
585             // In case of failing high/low increase aspiration window and research,
586             // otherwise exit the fail high/low loop.
587             if (value >= beta)
588             {
589                 beta = Min(beta + aspirationDelta, VALUE_INFINITE);
590                 aspirationDelta += aspirationDelta / 2;
591             }
592             else if (value <= alpha)
593             {
594                 AspirationFailLow = true;
595                 StopOnPonderhit = false;
596
597                 alpha = Max(alpha - aspirationDelta, -VALUE_INFINITE);
598                 aspirationDelta += aspirationDelta / 2;
599             }
600             else
601                 break;
602
603         } while (abs(value) < VALUE_KNOWN_WIN);
604
605         // Collect info about search result
606         bestMove = Rml[0].pv[0];
607         *ponderMove = Rml[0].pv[1];
608         bestValues[depth] = value;
609         bestMoveChanges[depth] = Rml.bestMoveChanges;
610
611         // Do we need to pick now the best and the ponder moves ?
612         if (SkillLevelEnabled && depth == 1 + SkillLevel)
613             do_skill_level(&skillBest, &skillPonder);
614
615         if (LogFile.is_open())
616             LogFile << pretty_pv(pos, depth, value, current_search_time(), Rml[0].pv) << endl;
617
618         // Init easyMove after first iteration or drop if differs from the best move
619         if (depth == 1 && (Rml.size() == 1 || Rml[0].pv_score > Rml[1].pv_score + EasyMoveMargin))
620             easyMove = bestMove;
621         else if (bestMove != easyMove)
622             easyMove = MOVE_NONE;
623
624         // Check for some early stop condition
625         if (!StopRequest && Limits.useTimeManagement())
626         {
627             // Stop search early if one move seems to be much better than the
628             // others or if there is only a single legal move. Also in the latter
629             // case we search up to some depth anyway to get a proper score.
630             if (   depth >= 7
631                 && easyMove == bestMove
632                 && (   Rml.size() == 1
633                     ||(   Rml[0].nodes > (pos.nodes_searched() * 85) / 100
634                        && current_search_time() > TimeMgr.available_time() / 16)
635                     ||(   Rml[0].nodes > (pos.nodes_searched() * 98) / 100
636                        && current_search_time() > TimeMgr.available_time() / 32)))
637                 StopRequest = true;
638
639             // Take in account some extra time if the best move has changed
640             if (depth > 4 && depth < 50)
641                 TimeMgr.pv_instability(bestMoveChanges[depth], bestMoveChanges[depth - 1]);
642
643             // Stop search if most of available time is already consumed. We probably don't
644             // have enough time to search the first move at the next iteration anyway.
645             if (current_search_time() > (TimeMgr.available_time() * 62) / 100)
646                 StopRequest = true;
647
648             // If we are allowed to ponder do not stop the search now but keep pondering
649             if (StopRequest && Limits.ponder)
650             {
651                 StopRequest = false;
652                 StopOnPonderhit = true;
653             }
654         }
655     }
656
657     // When using skills overwrite best and ponder moves with the sub-optimal ones
658     if (SkillLevelEnabled)
659     {
660         if (skillBest == MOVE_NONE) // Still unassigned ?
661             do_skill_level(&skillBest, &skillPonder);
662
663         bestMove = skillBest;
664         *ponderMove = skillPonder;
665     }
666
667     return bestMove;
668   }
669
670
671   // search<>() is the main search function for both PV and non-PV nodes and for
672   // normal and SplitPoint nodes. When called just after a split point the search
673   // is simpler because we have already probed the hash table, done a null move
674   // search, and searched the first move before splitting, we don't have to repeat
675   // all this work again. We also don't need to store anything to the hash table
676   // here: This is taken care of after we return from the split point.
677
678   template <NodeType NT>
679   Value search(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) {
680
681     const bool PvNode   = (NT == PV || NT == Root || NT == SplitPointPV);
682     const bool SpNode   = (NT == SplitPointPV || NT == SplitPointNonPV);
683     const bool RootNode = (NT == Root);
684
685     assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE);
686     assert(beta > alpha && beta <= VALUE_INFINITE);
687     assert(PvNode || alpha == beta - 1);
688     assert(pos.thread() >= 0 && pos.thread() < Threads.size());
689
690     Move movesSearched[MAX_MOVES];
691     int64_t nodes;
692     StateInfo st;
693     const TTEntry *tte;
694     Key posKey;
695     Move ttMove, move, excludedMove, threatMove;
696     Depth ext, newDepth;
697     ValueType vt;
698     Value bestValue, value, oldAlpha;
699     Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific
700     bool isPvMove, inCheck, singularExtensionNode, givesCheck, captureOrPromotion, dangerous;
701     int moveCount = 0, playedMoveCount = 0;
702     Thread& thread = Threads[pos.thread()];
703     SplitPoint* sp = NULL;
704
705     refinedValue = bestValue = value = -VALUE_INFINITE;
706     oldAlpha = alpha;
707     inCheck = pos.in_check();
708     ss->ply = (ss-1)->ply + 1;
709
710     // Used to send selDepth info to GUI
711     if (PvNode && thread.maxPly < ss->ply)
712         thread.maxPly = ss->ply;
713
714     // Step 1. Initialize node and poll. Polling can abort search
715     if (!SpNode)
716     {
717         ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
718         (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO;
719         (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE;
720     }
721     else
722     {
723         sp = ss->sp;
724         tte = NULL;
725         ttMove = excludedMove = MOVE_NONE;
726         threatMove = sp->threatMove;
727         goto split_point_start;
728     }
729
730     if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
731     {
732         NodesSincePoll = 0;
733         poll(pos);
734     }
735
736     // Step 2. Check for aborted search and immediate draw
737     if ((   StopRequest
738          || pos.is_draw<false>()
739          || ss->ply > PLY_MAX) && !RootNode)
740         return VALUE_DRAW;
741
742     // Step 3. Mate distance pruning
743     if (!RootNode)
744     {
745         alpha = Max(value_mated_in(ss->ply), alpha);
746         beta = Min(value_mate_in(ss->ply+1), beta);
747         if (alpha >= beta)
748             return alpha;
749     }
750
751     // Step 4. Transposition table lookup
752     // We don't want the score of a partial search to overwrite a previous full search
753     // TT value, so we use a different position key in case of an excluded move.
754     excludedMove = ss->excludedMove;
755     posKey = excludedMove ? pos.get_exclusion_key() : pos.get_key();
756     tte = TT.probe(posKey);
757     ttMove = tte ? tte->move() : MOVE_NONE;
758
759     // At PV nodes we check for exact scores, while at non-PV nodes we check for
760     // a fail high/low. Biggest advantage at probing at PV nodes is to have a
761     // smooth experience in analysis mode. We don't probe at Root nodes otherwise
762     // we should also update RootMoveList to avoid bogus output.
763     if (!RootNode && tte && (PvNode ? tte->depth() >= depth && tte->type() == VALUE_TYPE_EXACT
764                                     : ok_to_use_TT(tte, depth, beta, ss->ply)))
765     {
766         TT.refresh(tte);
767         ss->bestMove = ttMove; // Can be MOVE_NONE
768         return value_from_tt(tte->value(), ss->ply);
769     }
770
771     // Step 5. Evaluate the position statically and update parent's gain statistics
772     if (inCheck)
773         ss->eval = ss->evalMargin = VALUE_NONE;
774     else if (tte)
775     {
776         assert(tte->static_value() != VALUE_NONE);
777
778         ss->eval = tte->static_value();
779         ss->evalMargin = tte->static_value_margin();
780         refinedValue = refine_eval(tte, ss->eval, ss->ply);
781     }
782     else
783     {
784         refinedValue = ss->eval = evaluate(pos, ss->evalMargin);
785         TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, ss->evalMargin);
786     }
787
788     // Save gain for the parent non-capture move
789     update_gains(pos, (ss-1)->currentMove, (ss-1)->eval, ss->eval);
790
791     // Step 6. Razoring (is omitted in PV nodes)
792     if (   !PvNode
793         &&  depth < RazorDepth
794         && !inCheck
795         &&  refinedValue + razor_margin(depth) < beta
796         &&  ttMove == MOVE_NONE
797         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX
798         && !pos.has_pawn_on_7th(pos.side_to_move()))
799     {
800         Value rbeta = beta - razor_margin(depth);
801         Value v = qsearch<NonPV>(pos, ss, rbeta-1, rbeta, DEPTH_ZERO);
802         if (v < rbeta)
803             // Logically we should return (v + razor_margin(depth)), but
804             // surprisingly this did slightly weaker in tests.
805             return v;
806     }
807
808     // Step 7. Static null move pruning (is omitted in PV nodes)
809     // We're betting that the opponent doesn't have a move that will reduce
810     // the score by more than futility_margin(depth) if we do a null move.
811     if (   !PvNode
812         && !ss->skipNullMove
813         &&  depth < RazorDepth
814         && !inCheck
815         &&  refinedValue - futility_margin(depth, 0) >= beta
816         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX
817         &&  pos.non_pawn_material(pos.side_to_move()))
818         return refinedValue - futility_margin(depth, 0);
819
820     // Step 8. Null move search with verification search (is omitted in PV nodes)
821     if (   !PvNode
822         && !ss->skipNullMove
823         &&  depth > ONE_PLY
824         && !inCheck
825         &&  refinedValue >= beta
826         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX
827         &&  pos.non_pawn_material(pos.side_to_move()))
828     {
829         ss->currentMove = MOVE_NULL;
830
831         // Null move dynamic reduction based on depth
832         int R = 3 + (depth >= 5 * ONE_PLY ? depth / 8 : 0);
833
834         // Null move dynamic reduction based on value
835         if (refinedValue - PawnValueMidgame > beta)
836             R++;
837
838         pos.do_null_move(st);
839         (ss+1)->skipNullMove = true;
840         nullValue = depth-R*ONE_PLY < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
841                                               : - search<NonPV>(pos, ss+1, -beta, -alpha, depth-R*ONE_PLY);
842         (ss+1)->skipNullMove = false;
843         pos.undo_null_move();
844
845         if (nullValue >= beta)
846         {
847             // Do not return unproven mate scores
848             if (nullValue >= VALUE_MATE_IN_PLY_MAX)
849                 nullValue = beta;
850
851             if (depth < 6 * ONE_PLY)
852                 return nullValue;
853
854             // Do verification search at high depths
855             ss->skipNullMove = true;
856             Value v = search<NonPV>(pos, ss, alpha, beta, depth-R*ONE_PLY);
857             ss->skipNullMove = false;
858
859             if (v >= beta)
860                 return nullValue;
861         }
862         else
863         {
864             // The null move failed low, which means that we may be faced with
865             // some kind of threat. If the previous move was reduced, check if
866             // the move that refuted the null move was somehow connected to the
867             // move which was reduced. If a connection is found, return a fail
868             // low score (which will cause the reduced move to fail high in the
869             // parent node, which will trigger a re-search with full depth).
870             threatMove = (ss+1)->bestMove;
871
872             if (   depth < ThreatDepth
873                 && (ss-1)->reduction
874                 && threatMove != MOVE_NONE
875                 && connected_moves(pos, (ss-1)->currentMove, threatMove))
876                 return beta - 1;
877         }
878     }
879
880     // Step 9. ProbCut (is omitted in PV nodes)
881     // If we have a very good capture (i.e. SEE > seeValues[captured_piece_type])
882     // and a reduced search returns a value much above beta, we can (almost) safely
883     // prune the previous move.
884     if (   !PvNode
885         &&  depth >= RazorDepth + ONE_PLY
886         && !inCheck
887         && !ss->skipNullMove
888         &&  excludedMove == MOVE_NONE
889         &&  abs(beta) < VALUE_MATE_IN_PLY_MAX)
890     {
891         Value rbeta = beta + 200;
892         Depth rdepth = depth - ONE_PLY - 3 * ONE_PLY;
893
894         assert(rdepth >= ONE_PLY);
895
896         MovePicker mp(pos, ttMove, H, pos.captured_piece_type());
897         CheckInfo ci(pos);
898
899         while ((move = mp.get_next_move()) != MOVE_NONE)
900             if (pos.pl_move_is_legal(move, ci.pinned))
901             {
902                 pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
903                 value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
904                 pos.undo_move(move);
905                 if (value >= rbeta)
906                     return value;
907             }
908     }
909
910     // Step 10. Internal iterative deepening
911     if (   depth >= IIDDepth[PvNode]
912         && ttMove == MOVE_NONE
913         && (PvNode || (!inCheck && ss->eval + IIDMargin >= beta)))
914     {
915         Depth d = (PvNode ? depth - 2 * ONE_PLY : depth / 2);
916
917         ss->skipNullMove = true;
918         search<PvNode ? PV : NonPV>(pos, ss, alpha, beta, d);
919         ss->skipNullMove = false;
920
921         tte = TT.probe(posKey);
922         ttMove = tte ? tte->move() : MOVE_NONE;
923     }
924
925 split_point_start: // At split points actual search starts from here
926
927     // Initialize a MovePicker object for the current position
928     MovePickerExt<NT> mp(pos, RootNode ? Rml[0].pv[0] : ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
929     CheckInfo ci(pos);
930     ss->bestMove = MOVE_NONE;
931     futilityBase = ss->eval + ss->evalMargin;
932     singularExtensionNode =   !RootNode
933                            && !SpNode
934                            && depth >= SingularExtensionDepth[PvNode]
935                            && ttMove != MOVE_NONE
936                            && !excludedMove // Do not allow recursive singular extension search
937                            && (tte->type() & VALUE_TYPE_LOWER)
938                            && tte->depth() >= depth - 3 * ONE_PLY;
939     if (SpNode)
940     {
941         lock_grab(&(sp->lock));
942         bestValue = sp->bestValue;
943     }
944
945     // Step 11. Loop through moves
946     // Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
947     while (   bestValue < beta
948            && (move = mp.get_next_move()) != MOVE_NONE
949            && !thread.cutoff_occurred())
950     {
951       assert(move_is_ok(move));
952
953       if (move == excludedMove)
954           continue;
955
956       // At root obey the "searchmoves" option and skip moves not listed in Root Move List
957       if (RootNode && !Rml.find(move))
958           continue;
959
960       // At PV and SpNode nodes we want all moves to be legal since the beginning
961       if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, ci.pinned))
962           continue;
963
964       if (SpNode)
965       {
966           moveCount = ++sp->moveCount;
967           lock_release(&(sp->lock));
968       }
969       else
970           moveCount++;
971
972       if (RootNode)
973       {
974           // This is used by time management
975           FirstRootMove = (moveCount == 1);
976
977           // Save the current node count before the move is searched
978           nodes = pos.nodes_searched();
979
980           // If it's time to send nodes info, do it here where we have the
981           // correct accumulated node counts searched by each thread.
982           if (SendSearchedNodes)
983           {
984               SendSearchedNodes = false;
985               cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
986           }
987
988           // For long searches send current move info to GUI
989           if (current_search_time() > 2000)
990               cout << "info" << depth_to_uci(depth)
991                    << " currmove " << move << " currmovenumber " << moveCount << endl;
992       }
993
994       // At Root and at first iteration do a PV search on all the moves to score root moves
995       isPvMove = (PvNode && moveCount <= (!RootNode ? 1 : depth <= ONE_PLY ? MAX_MOVES : MultiPV));
996       givesCheck = pos.move_gives_check(move, ci);
997       captureOrPromotion = pos.move_is_capture_or_promotion(move);
998
999       // Step 12. Decide the new search depth
1000       ext = extension<PvNode>(pos, move, captureOrPromotion, givesCheck, &dangerous);
1001
1002       // Singular extension search. If all moves but one fail low on a search of
1003       // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
1004       // is singular and should be extended. To verify this we do a reduced search
1005       // on all the other moves but the ttMove, if result is lower than ttValue minus
1006       // a margin then we extend ttMove.
1007       if (   singularExtensionNode
1008           && move == ttMove
1009           && pos.pl_move_is_legal(move, ci.pinned)
1010           && ext < ONE_PLY)
1011       {
1012           Value ttValue = value_from_tt(tte->value(), ss->ply);
1013
1014           if (abs(ttValue) < VALUE_KNOWN_WIN)
1015           {
1016               Value rBeta = ttValue - int(depth);
1017               ss->excludedMove = move;
1018               ss->skipNullMove = true;
1019               Value v = search<NonPV>(pos, ss, rBeta - 1, rBeta, depth / 2);
1020               ss->skipNullMove = false;
1021               ss->excludedMove = MOVE_NONE;
1022               ss->bestMove = MOVE_NONE;
1023               if (v < rBeta)
1024                   ext = ONE_PLY;
1025           }
1026       }
1027
1028       // Update current move (this must be done after singular extension search)
1029       newDepth = depth - ONE_PLY + ext;
1030
1031       // Step 13. Futility pruning (is omitted in PV nodes)
1032       if (   !PvNode
1033           && !captureOrPromotion
1034           && !inCheck
1035           && !dangerous
1036           &&  move != ttMove
1037           && !move_is_castle(move))
1038       {
1039           // Move count based pruning
1040           if (   moveCount >= futility_move_count(depth)
1041               && (!threatMove || !connected_threat(pos, move, threatMove))
1042               && bestValue > VALUE_MATED_IN_PLY_MAX) // FIXME bestValue is racy
1043           {
1044               if (SpNode)
1045                   lock_grab(&(sp->lock));
1046
1047               continue;
1048           }
1049
1050           // Value based pruning
1051           // We illogically ignore reduction condition depth >= 3*ONE_PLY for predicted depth,
1052           // but fixing this made program slightly weaker.
1053           Depth predictedDepth = newDepth - reduction<PvNode>(depth, moveCount);
1054           futilityValueScaled =  futilityBase + futility_margin(predictedDepth, moveCount)
1055                                + H.gain(pos.piece_on(move_from(move)), move_to(move));
1056
1057           if (futilityValueScaled < beta)
1058           {
1059               if (SpNode)
1060               {
1061                   lock_grab(&(sp->lock));
1062                   if (futilityValueScaled > sp->bestValue)
1063                       sp->bestValue = bestValue = futilityValueScaled;
1064               }
1065               else if (futilityValueScaled > bestValue)
1066                   bestValue = futilityValueScaled;
1067
1068               continue;
1069           }
1070
1071           // Prune moves with negative SEE at low depths
1072           if (   predictedDepth < 2 * ONE_PLY
1073               && bestValue > VALUE_MATED_IN_PLY_MAX
1074               && pos.see_sign(move) < 0)
1075           {
1076               if (SpNode)
1077                   lock_grab(&(sp->lock));
1078
1079               continue;
1080           }
1081       }
1082
1083       // Check for legality only before to do the move
1084       if (!pos.pl_move_is_legal(move, ci.pinned))
1085       {
1086           moveCount--;
1087           continue;
1088       }
1089
1090       ss->currentMove = move;
1091       if (!SpNode && !captureOrPromotion)
1092           movesSearched[playedMoveCount++] = move;
1093
1094       // Step 14. Make the move
1095       pos.do_move(move, st, ci, givesCheck);
1096
1097       // Step extra. pv search (only in PV nodes)
1098       // The first move in list is the expected PV
1099       if (isPvMove)
1100           value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
1101                                      : - search<PV>(pos, ss+1, -beta, -alpha, newDepth);
1102       else
1103       {
1104           // Step 15. Reduced depth search
1105           // If the move fails high will be re-searched at full depth.
1106           bool doFullDepthSearch = true;
1107
1108           if (    depth > 3 * ONE_PLY
1109               && !captureOrPromotion
1110               && !dangerous
1111               && !move_is_castle(move)
1112               &&  ss->killers[0] != move
1113               &&  ss->killers[1] != move
1114               && (ss->reduction = reduction<PvNode>(depth, moveCount)) != DEPTH_ZERO)
1115           {
1116               Depth d = newDepth - ss->reduction;
1117               alpha = SpNode ? sp->alpha : alpha;
1118
1119               value = d < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
1120                                   : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d);
1121
1122               ss->reduction = DEPTH_ZERO;
1123               doFullDepthSearch = (value > alpha);
1124           }
1125
1126           // Step 16. Full depth search
1127           if (doFullDepthSearch)
1128           {
1129               alpha = SpNode ? sp->alpha : alpha;
1130               value = newDepth < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
1131                                          : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth);
1132
1133               // Step extra. pv search (only in PV nodes)
1134               // Search only for possible new PV nodes, if instead value >= beta then
1135               // parent node fails low with value <= alpha and tries another move.
1136               if (PvNode && value > alpha && (RootNode || value < beta))
1137                   value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
1138                                              : - search<PV>(pos, ss+1, -beta, -alpha, newDepth);
1139           }
1140       }
1141
1142       // Step 17. Undo move
1143       pos.undo_move(move);
1144
1145       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1146
1147       // Step 18. Check for new best move
1148       if (SpNode)
1149       {
1150           lock_grab(&(sp->lock));
1151           bestValue = sp->bestValue;
1152           alpha = sp->alpha;
1153       }
1154
1155       if (value > bestValue)
1156       {
1157           bestValue = value;
1158           ss->bestMove = move;
1159
1160           if (  !RootNode
1161               && PvNode
1162               && value > alpha
1163               && value < beta) // We want always alpha < beta
1164               alpha = value;
1165
1166           if (SpNode && !thread.cutoff_occurred())
1167           {
1168               sp->bestValue = value;
1169               sp->ss->bestMove = move;
1170               sp->alpha = alpha;
1171               sp->is_betaCutoff = (value >= beta);
1172           }
1173       }
1174
1175       if (RootNode)
1176       {
1177           // Finished searching the move. If StopRequest is true, the search
1178           // was aborted because the user interrupted the search or because we
1179           // ran out of time. In this case, the return value of the search cannot
1180           // be trusted, and we break out of the loop without updating the best
1181           // move and/or PV.
1182           if (StopRequest)
1183               break;
1184
1185           // Remember searched nodes counts for this move
1186           Rml.find(move)->nodes += pos.nodes_searched() - nodes;
1187
1188           // PV move or new best move ?
1189           if (isPvMove || value > alpha)
1190           {
1191               // Update PV
1192               Rml.find(move)->pv_score = value;
1193               Rml.find(move)->extract_pv_from_tt(pos);
1194
1195               // We record how often the best move has been changed in each
1196               // iteration. This information is used for time management: When
1197               // the best move changes frequently, we allocate some more time.
1198               if (!isPvMove && MultiPV == 1)
1199                   Rml.bestMoveChanges++;
1200
1201               // Update alpha.
1202               if (value > alpha)
1203                   alpha = value;
1204           }
1205           else
1206               // All other moves but the PV are set to the lowest value, this
1207               // is not a problem when sorting becuase sort is stable and move
1208               // position in the list is preserved, just the PV is pushed up.
1209               Rml.find(move)->pv_score = -VALUE_INFINITE;
1210
1211       } // RootNode
1212
1213       // Step 19. Check for split
1214       if (   !RootNode
1215           && !SpNode
1216           && depth >= Threads.min_split_depth()
1217           && bestValue < beta
1218           && Threads.available_slave_exists(pos.thread())
1219           && !StopRequest
1220           && !thread.cutoff_occurred())
1221           Threads.split<FakeSplit>(pos, ss, &alpha, beta, &bestValue, depth,
1222                                    threatMove, moveCount, &mp, PvNode);
1223     }
1224
1225     // Step 20. Check for mate and stalemate
1226     // All legal moves have been searched and if there are
1227     // no legal moves, it must be mate or stalemate.
1228     // If one move was excluded return fail low score.
1229     if (!SpNode && !moveCount)
1230         return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
1231
1232     // Step 21. Update tables
1233     // If the search is not aborted, update the transposition table,
1234     // history counters, and killer moves.
1235     if (!SpNode && !StopRequest && !thread.cutoff_occurred())
1236     {
1237         move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
1238         vt   = bestValue <= oldAlpha ? VALUE_TYPE_UPPER
1239              : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT;
1240
1241         TT.store(posKey, value_to_tt(bestValue, ss->ply), vt, depth, move, ss->eval, ss->evalMargin);
1242
1243         // Update killers and history only for non capture moves that fails high
1244         if (    bestValue >= beta
1245             && !pos.move_is_capture_or_promotion(move))
1246         {
1247             if (move != ss->killers[0])
1248             {
1249                 ss->killers[1] = ss->killers[0];
1250                 ss->killers[0] = move;
1251             }
1252             update_history(pos, move, depth, movesSearched, playedMoveCount);
1253         }
1254     }
1255
1256     if (SpNode)
1257     {
1258         // Here we have the lock still grabbed
1259         sp->is_slave[pos.thread()] = false;
1260         sp->nodes += pos.nodes_searched();
1261         lock_release(&(sp->lock));
1262     }
1263
1264     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1265
1266     return bestValue;
1267   }
1268
1269   // qsearch() is the quiescence search function, which is called by the main
1270   // search function when the remaining depth is zero (or, to be more precise,
1271   // less than ONE_PLY).
1272
1273   template <NodeType NT>
1274   Value qsearch(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) {
1275
1276     const bool PvNode = (NT == PV);
1277
1278     assert(NT == PV || NT == NonPV);
1279     assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE);
1280     assert(beta >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
1281     assert(PvNode || alpha == beta - 1);
1282     assert(depth <= 0);
1283     assert(pos.thread() >= 0 && pos.thread() < Threads.size());
1284
1285     StateInfo st;
1286     Move ttMove, move;
1287     Value bestValue, value, evalMargin, futilityValue, futilityBase;
1288     bool inCheck, enoughMaterial, givesCheck, evasionPrunable;
1289     const TTEntry* tte;
1290     Depth ttDepth;
1291     Value oldAlpha = alpha;
1292
1293     ss->bestMove = ss->currentMove = MOVE_NONE;
1294     ss->ply = (ss-1)->ply + 1;
1295
1296     // Check for an instant draw or maximum ply reached
1297     if (pos.is_draw<true>() || ss->ply > PLY_MAX)
1298         return VALUE_DRAW;
1299
1300     // Decide whether or not to include checks, this fixes also the type of
1301     // TT entry depth that we are going to use. Note that in qsearch we use
1302     // only two types of depth in TT: DEPTH_QS_CHECKS or DEPTH_QS_NO_CHECKS.
1303     inCheck = pos.in_check();
1304     ttDepth = (inCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS : DEPTH_QS_NO_CHECKS);
1305
1306     // Transposition table lookup. At PV nodes, we don't use the TT for
1307     // pruning, but only for move ordering.
1308     tte = TT.probe(pos.get_key());
1309     ttMove = (tte ? tte->move() : MOVE_NONE);
1310
1311     if (!PvNode && tte && ok_to_use_TT(tte, ttDepth, beta, ss->ply))
1312     {
1313         ss->bestMove = ttMove; // Can be MOVE_NONE
1314         return value_from_tt(tte->value(), ss->ply);
1315     }
1316
1317     // Evaluate the position statically
1318     if (inCheck)
1319     {
1320         bestValue = futilityBase = -VALUE_INFINITE;
1321         ss->eval = evalMargin = VALUE_NONE;
1322         enoughMaterial = false;
1323     }
1324     else
1325     {
1326         if (tte)
1327         {
1328             assert(tte->static_value() != VALUE_NONE);
1329
1330             evalMargin = tte->static_value_margin();
1331             ss->eval = bestValue = tte->static_value();
1332         }
1333         else
1334             ss->eval = bestValue = evaluate(pos, evalMargin);
1335
1336         // Stand pat. Return immediately if static value is at least beta
1337         if (bestValue >= beta)
1338         {
1339             if (!tte)
1340                 TT.store(pos.get_key(), value_to_tt(bestValue, ss->ply), VALUE_TYPE_LOWER, DEPTH_NONE, MOVE_NONE, ss->eval, evalMargin);
1341
1342             return bestValue;
1343         }
1344
1345         if (PvNode && bestValue > alpha)
1346             alpha = bestValue;
1347
1348         // Futility pruning parameters, not needed when in check
1349         futilityBase = ss->eval + evalMargin + FutilityMarginQS;
1350         enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
1351     }
1352
1353     // Initialize a MovePicker object for the current position, and prepare
1354     // to search the moves. Because the depth is <= 0 here, only captures,
1355     // queen promotions and checks (only if depth >= DEPTH_QS_CHECKS) will
1356     // be generated.
1357     MovePicker mp(pos, ttMove, depth, H, move_to((ss-1)->currentMove));
1358     CheckInfo ci(pos);
1359
1360     // Loop through the moves until no moves remain or a beta cutoff occurs
1361     while (   alpha < beta
1362            && (move = mp.get_next_move()) != MOVE_NONE)
1363     {
1364       assert(move_is_ok(move));
1365
1366       givesCheck = pos.move_gives_check(move, ci);
1367
1368       // Futility pruning
1369       if (   !PvNode
1370           && !inCheck
1371           && !givesCheck
1372           &&  move != ttMove
1373           &&  enoughMaterial
1374           && !move_is_promotion(move)
1375           && !pos.move_is_passed_pawn_push(move))
1376       {
1377           futilityValue =  futilityBase
1378                          + piece_value_endgame(pos.piece_on(move_to(move)))
1379                          + (move_is_ep(move) ? PawnValueEndgame : VALUE_ZERO);
1380
1381           if (futilityValue < alpha)
1382           {
1383               if (futilityValue > bestValue)
1384                   bestValue = futilityValue;
1385               continue;
1386           }
1387
1388           // Prune moves with negative or equal SEE
1389           if (   futilityBase < beta
1390               && depth < DEPTH_ZERO
1391               && pos.see(move) <= 0)
1392               continue;
1393       }
1394
1395       // Detect non-capture evasions that are candidate to be pruned
1396       evasionPrunable =   !PvNode
1397                        && inCheck
1398                        && bestValue > VALUE_MATED_IN_PLY_MAX
1399                        && !pos.move_is_capture(move)
1400                        && !pos.can_castle(pos.side_to_move());
1401
1402       // Don't search moves with negative SEE values
1403       if (   !PvNode
1404           && (!inCheck || evasionPrunable)
1405           &&  move != ttMove
1406           && !move_is_promotion(move)
1407           &&  pos.see_sign(move) < 0)
1408           continue;
1409
1410       // Don't search useless checks
1411       if (   !PvNode
1412           && !inCheck
1413           &&  givesCheck
1414           &&  move != ttMove
1415           && !pos.move_is_capture_or_promotion(move)
1416           &&  ss->eval + PawnValueMidgame / 4 < beta
1417           && !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
1418       {
1419           if (ss->eval + PawnValueMidgame / 4 > bestValue)
1420               bestValue = ss->eval + PawnValueMidgame / 4;
1421
1422           continue;
1423       }
1424
1425       // Check for legality only before to do the move
1426       if (!pos.pl_move_is_legal(move, ci.pinned))
1427           continue;
1428
1429       // Update current move
1430       ss->currentMove = move;
1431
1432       // Make and search the move
1433       pos.do_move(move, st, ci, givesCheck);
1434       value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth-ONE_PLY);
1435       pos.undo_move(move);
1436
1437       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1438
1439       // New best move?
1440       if (value > bestValue)
1441       {
1442           bestValue = value;
1443           if (value > alpha)
1444           {
1445               alpha = value;
1446               ss->bestMove = move;
1447           }
1448        }
1449     }
1450
1451     // All legal moves have been searched. A special case: If we're in check
1452     // and no legal moves were found, it is checkmate.
1453     if (inCheck && bestValue == -VALUE_INFINITE)
1454         return value_mated_in(ss->ply);
1455
1456     // Update transposition table
1457     ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
1458     TT.store(pos.get_key(), value_to_tt(bestValue, ss->ply), vt, ttDepth, ss->bestMove, ss->eval, evalMargin);
1459
1460     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1461
1462     return bestValue;
1463   }
1464
1465
1466   // check_is_dangerous() tests if a checking move can be pruned in qsearch().
1467   // bestValue is updated only when returning false because in that case move
1468   // will be pruned.
1469
1470   bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta, Value *bestValue)
1471   {
1472     Bitboard b, occ, oldAtt, newAtt, kingAtt;
1473     Square from, to, ksq, victimSq;
1474     Piece pc;
1475     Color them;
1476     Value futilityValue, bv = *bestValue;
1477
1478     from = move_from(move);
1479     to = move_to(move);
1480     them = opposite_color(pos.side_to_move());
1481     ksq = pos.king_square(them);
1482     kingAtt = pos.attacks_from<KING>(ksq);
1483     pc = pos.piece_on(from);
1484
1485     occ = pos.occupied_squares() & ~(1ULL << from) & ~(1ULL << ksq);
1486     oldAtt = pos.attacks_from(pc, from, occ);
1487     newAtt = pos.attacks_from(pc,   to, occ);
1488
1489     // Rule 1. Checks which give opponent's king at most one escape square are dangerous
1490     b = kingAtt & ~pos.pieces(them) & ~newAtt & ~(1ULL << to);
1491
1492     if (!(b && (b & (b - 1))))
1493         return true;
1494
1495     // Rule 2. Queen contact check is very dangerous
1496     if (   piece_type(pc) == QUEEN
1497         && bit_is_set(kingAtt, to))
1498         return true;
1499
1500     // Rule 3. Creating new double threats with checks
1501     b = pos.pieces(them) & newAtt & ~oldAtt & ~(1ULL << ksq);
1502
1503     while (b)
1504     {
1505         victimSq = pop_1st_bit(&b);
1506         futilityValue = futilityBase + piece_value_endgame(pos.piece_on(victimSq));
1507
1508         // Note that here we generate illegal "double move"!
1509         if (   futilityValue >= beta
1510             && pos.see_sign(make_move(from, victimSq)) >= 0)
1511             return true;
1512
1513         if (futilityValue > bv)
1514             bv = futilityValue;
1515     }
1516
1517     // Update bestValue only if check is not dangerous (because we will prune the move)
1518     *bestValue = bv;
1519     return false;
1520   }
1521
1522
1523   // connected_moves() tests whether two moves are 'connected' in the sense
1524   // that the first move somehow made the second move possible (for instance
1525   // if the moving piece is the same in both moves). The first move is assumed
1526   // to be the move that was made to reach the current position, while the
1527   // second move is assumed to be a move from the current position.
1528
1529   bool connected_moves(const Position& pos, Move m1, Move m2) {
1530
1531     Square f1, t1, f2, t2;
1532     Piece p1, p2;
1533     Square ksq;
1534
1535     assert(m1 && move_is_ok(m1));
1536     assert(m2 && move_is_ok(m2));
1537
1538     // Case 1: The moving piece is the same in both moves
1539     f2 = move_from(m2);
1540     t1 = move_to(m1);
1541     if (f2 == t1)
1542         return true;
1543
1544     // Case 2: The destination square for m2 was vacated by m1
1545     t2 = move_to(m2);
1546     f1 = move_from(m1);
1547     if (t2 == f1)
1548         return true;
1549
1550     // Case 3: Moving through the vacated square
1551     p2 = pos.piece_on(f2);
1552     if (   piece_is_slider(p2)
1553         && bit_is_set(squares_between(f2, t2), f1))
1554       return true;
1555
1556     // Case 4: The destination square for m2 is defended by the moving piece in m1
1557     p1 = pos.piece_on(t1);
1558     if (bit_is_set(pos.attacks_from(p1, t1), t2))
1559         return true;
1560
1561     // Case 5: Discovered check, checking piece is the piece moved in m1
1562     ksq = pos.king_square(pos.side_to_move());
1563     if (    piece_is_slider(p1)
1564         &&  bit_is_set(squares_between(t1, ksq), f2))
1565     {
1566         Bitboard occ = pos.occupied_squares();
1567         clear_bit(&occ, f2);
1568         if (bit_is_set(pos.attacks_from(p1, t1, occ), ksq))
1569             return true;
1570     }
1571     return false;
1572   }
1573
1574
1575   // value_to_tt() adjusts a mate score from "plies to mate from the root" to
1576   // "plies to mate from the current ply".  Non-mate scores are unchanged.
1577   // The function is called before storing a value to the transposition table.
1578
1579   Value value_to_tt(Value v, int ply) {
1580
1581     if (v >= VALUE_MATE_IN_PLY_MAX)
1582       return v + ply;
1583
1584     if (v <= VALUE_MATED_IN_PLY_MAX)
1585       return v - ply;
1586
1587     return v;
1588   }
1589
1590
1591   // value_from_tt() is the inverse of value_to_tt(): It adjusts a mate score from
1592   // the transposition table to a mate score corrected for the current ply.
1593
1594   Value value_from_tt(Value v, int ply) {
1595
1596     if (v >= VALUE_MATE_IN_PLY_MAX)
1597       return v - ply;
1598
1599     if (v <= VALUE_MATED_IN_PLY_MAX)
1600       return v + ply;
1601
1602     return v;
1603   }
1604
1605
1606   // connected_threat() tests whether it is safe to forward prune a move or if
1607   // is somehow connected to the threat move returned by null search.
1608
1609   bool connected_threat(const Position& pos, Move m, Move threat) {
1610
1611     assert(move_is_ok(m));
1612     assert(threat && move_is_ok(threat));
1613     assert(!pos.move_is_capture_or_promotion(m));
1614     assert(!pos.move_is_passed_pawn_push(m));
1615
1616     Square mfrom, mto, tfrom, tto;
1617
1618     mfrom = move_from(m);
1619     mto = move_to(m);
1620     tfrom = move_from(threat);
1621     tto = move_to(threat);
1622
1623     // Case 1: Don't prune moves which move the threatened piece
1624     if (mfrom == tto)
1625         return true;
1626
1627     // Case 2: If the threatened piece has value less than or equal to the
1628     // value of the threatening piece, don't prune moves which defend it.
1629     if (   pos.move_is_capture(threat)
1630         && (   piece_value_midgame(pos.piece_on(tfrom)) >= piece_value_midgame(pos.piece_on(tto))
1631             || piece_type(pos.piece_on(tfrom)) == KING)
1632         && pos.move_attacks_square(m, tto))
1633         return true;
1634
1635     // Case 3: If the moving piece in the threatened move is a slider, don't
1636     // prune safe moves which block its ray.
1637     if (   piece_is_slider(pos.piece_on(tfrom))
1638         && bit_is_set(squares_between(tfrom, tto), mto)
1639         && pos.see_sign(m) >= 0)
1640         return true;
1641
1642     return false;
1643   }
1644
1645
1646   // ok_to_use_TT() returns true if a transposition table score
1647   // can be used at a given point in search.
1648
1649   bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply) {
1650
1651     Value v = value_from_tt(tte->value(), ply);
1652
1653     return   (   tte->depth() >= depth
1654               || v >= Max(VALUE_MATE_IN_PLY_MAX, beta)
1655               || v < Min(VALUE_MATED_IN_PLY_MAX, beta))
1656
1657           && (   ((tte->type() & VALUE_TYPE_LOWER) && v >= beta)
1658               || ((tte->type() & VALUE_TYPE_UPPER) && v < beta));
1659   }
1660
1661
1662   // refine_eval() returns the transposition table score if
1663   // possible otherwise falls back on static position evaluation.
1664
1665   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply) {
1666
1667       assert(tte);
1668
1669       Value v = value_from_tt(tte->value(), ply);
1670
1671       if (   ((tte->type() & VALUE_TYPE_LOWER) && v >= defaultEval)
1672           || ((tte->type() & VALUE_TYPE_UPPER) && v < defaultEval))
1673           return v;
1674
1675       return defaultEval;
1676   }
1677
1678
1679   // update_history() registers a good move that produced a beta-cutoff
1680   // in history and marks as failures all the other moves of that ply.
1681
1682   void update_history(const Position& pos, Move move, Depth depth,
1683                       Move movesSearched[], int moveCount) {
1684     Move m;
1685     Value bonus = Value(int(depth) * int(depth));
1686
1687     H.update(pos.piece_on(move_from(move)), move_to(move), bonus);
1688
1689     for (int i = 0; i < moveCount - 1; i++)
1690     {
1691         m = movesSearched[i];
1692
1693         assert(m != move);
1694
1695         H.update(pos.piece_on(move_from(m)), move_to(m), -bonus);
1696     }
1697   }
1698
1699
1700   // update_gains() updates the gains table of a non-capture move given
1701   // the static position evaluation before and after the move.
1702
1703   void update_gains(const Position& pos, Move m, Value before, Value after) {
1704
1705     if (   m != MOVE_NULL
1706         && before != VALUE_NONE
1707         && after != VALUE_NONE
1708         && pos.captured_piece_type() == PIECE_TYPE_NONE
1709         && !move_is_special(m))
1710         H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
1711   }
1712
1713
1714   // current_search_time() returns the number of milliseconds which have passed
1715   // since the beginning of the current search.
1716
1717   int current_search_time(int set) {
1718
1719     static int searchStartTime;
1720
1721     if (set)
1722         searchStartTime = set;
1723
1724     return get_system_time() - searchStartTime;
1725   }
1726
1727
1728   // score_to_uci() converts a value to a string suitable for use with the UCI
1729   // protocol specifications:
1730   //
1731   // cp <x>     The score from the engine's point of view in centipawns.
1732   // mate <y>   Mate in y moves, not plies. If the engine is getting mated
1733   //            use negative values for y.
1734
1735   string score_to_uci(Value v, Value alpha, Value beta) {
1736
1737     std::stringstream s;
1738
1739     if (abs(v) < VALUE_MATE - PLY_MAX * ONE_PLY)
1740         s << " score cp " << int(v) * 100 / int(PawnValueMidgame); // Scale to centipawns
1741     else
1742         s << " score mate " << (v > 0 ? VALUE_MATE - v + 1 : -VALUE_MATE - v) / 2;
1743
1744     s << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : "");
1745
1746     return s.str();
1747   }
1748
1749
1750   // speed_to_uci() returns a string with time stats of current search suitable
1751   // to be sent to UCI gui.
1752
1753   string speed_to_uci(int64_t nodes) {
1754
1755     std::stringstream s;
1756     int t = current_search_time();
1757
1758     s << " nodes " << nodes
1759       << " nps " << (t > 0 ? int(nodes * 1000 / t) : 0)
1760       << " time "  << t;
1761
1762     return s.str();
1763   }
1764
1765   // pv_to_uci() returns a string with information on the current PV line
1766   // formatted according to UCI specification.
1767
1768   string pv_to_uci(Move pv[], int pvNum, bool chess960) {
1769
1770     std::stringstream s;
1771
1772     s << " multipv " << pvNum << " pv " << set960(chess960);
1773
1774     for ( ; *pv != MOVE_NONE; pv++)
1775         s << *pv << " ";
1776
1777     return s.str();
1778   }
1779
1780   // depth_to_uci() returns a string with information on the current depth and
1781   // seldepth formatted according to UCI specification.
1782
1783   string depth_to_uci(Depth depth) {
1784
1785     std::stringstream s;
1786
1787     // Retrieve max searched depth among threads
1788     int selDepth = 0;
1789     for (int i = 0; i < Threads.size(); i++)
1790         if (Threads[i].maxPly > selDepth)
1791             selDepth = Threads[i].maxPly;
1792
1793      s << " depth " << depth / ONE_PLY << " seldepth " << selDepth;
1794
1795     return s.str();
1796   }
1797
1798   string time_to_string(int millisecs) {
1799
1800     const int MSecMinute = 1000 * 60;
1801     const int MSecHour   = 1000 * 60 * 60;
1802
1803     int hours = millisecs / MSecHour;
1804     int minutes =  (millisecs % MSecHour) / MSecMinute;
1805     int seconds = ((millisecs % MSecHour) % MSecMinute) / 1000;
1806
1807     std::stringstream s;
1808
1809     if (hours)
1810         s << hours << ':';
1811
1812     s << std::setfill('0') << std::setw(2) << minutes << ':' << std::setw(2) << seconds;
1813     return s.str();
1814   }
1815
1816   string score_to_string(Value v) {
1817
1818     std::stringstream s;
1819
1820     if (v >= VALUE_MATE_IN_PLY_MAX)
1821         s << "#" << (VALUE_MATE - v + 1) / 2;
1822     else if (v <= VALUE_MATED_IN_PLY_MAX)
1823         s << "-#" << (VALUE_MATE + v) / 2;
1824     else
1825         s << std::setprecision(2) << std::fixed << std::showpos << float(v) / PawnValueMidgame;
1826
1827     return s.str();
1828   }
1829
1830   // pretty_pv() creates a human-readable string from a position and a PV.
1831   // It is used to write search information to the log file (which is created
1832   // when the UCI parameter "Use Search Log" is "true").
1833
1834   string pretty_pv(Position& pos, int depth, Value value, int time, Move pv[]) {
1835
1836     const int64_t K = 1000;
1837     const int64_t M = 1000000;
1838     const int startColumn = 28;
1839     const size_t maxLength = 80 - startColumn;
1840
1841     StateInfo state[PLY_MAX_PLUS_2], *st = state;
1842     Move* m = pv;
1843     string san;
1844     std::stringstream s;
1845     size_t length = 0;
1846
1847     // First print depth, score, time and searched nodes...
1848     s << set960(pos.is_chess960())
1849       << std::setw(2) << depth
1850       << std::setw(8) << score_to_string(value)
1851       << std::setw(8) << time_to_string(time);
1852
1853     if (pos.nodes_searched() < M)
1854         s << std::setw(8) << pos.nodes_searched() / 1 << "  ";
1855     else if (pos.nodes_searched() < K * M)
1856         s << std::setw(7) << pos.nodes_searched() / K << "K  ";
1857     else
1858         s << std::setw(7) << pos.nodes_searched() / M << "M  ";
1859
1860     // ...then print the full PV line in short algebraic notation
1861     while (*m != MOVE_NONE)
1862     {
1863         san = move_to_san(pos, *m);
1864         length += san.length() + 1;
1865
1866         if (length > maxLength)
1867         {
1868             length = san.length() + 1;
1869             s << "\n" + string(startColumn, ' ');
1870         }
1871         s << san << ' ';
1872
1873         pos.do_move(*m++, *st++);
1874     }
1875
1876     // Restore original position before to leave
1877     while (m != pv) pos.undo_move(*--m);
1878
1879     return s.str();
1880   }
1881
1882   // poll() performs two different functions: It polls for user input, and it
1883   // looks at the time consumed so far and decides if it's time to abort the
1884   // search.
1885
1886   void poll(const Position& pos) {
1887
1888     static int lastInfoTime;
1889     int t = current_search_time();
1890
1891     //  Poll for input
1892     if (input_available())
1893     {
1894         // We are line oriented, don't read single chars
1895         string command;
1896
1897         if (!std::getline(std::cin, command) || command == "quit")
1898         {
1899             // Quit the program as soon as possible
1900             Limits.ponder = false;
1901             QuitRequest = StopRequest = true;
1902             return;
1903         }
1904         else if (command == "stop")
1905         {
1906             // Stop calculating as soon as possible, but still send the "bestmove"
1907             // and possibly the "ponder" token when finishing the search.
1908             Limits.ponder = false;
1909             StopRequest = true;
1910         }
1911         else if (command == "ponderhit")
1912         {
1913             // The opponent has played the expected move. GUI sends "ponderhit" if
1914             // we were told to ponder on the same move the opponent has played. We
1915             // should continue searching but switching from pondering to normal search.
1916             Limits.ponder = false;
1917
1918             if (StopOnPonderhit)
1919                 StopRequest = true;
1920         }
1921     }
1922
1923     // Print search information
1924     if (t < 1000)
1925         lastInfoTime = 0;
1926
1927     else if (lastInfoTime > t)
1928         // HACK: Must be a new search where we searched less than
1929         // NodesBetweenPolls nodes during the first second of search.
1930         lastInfoTime = 0;
1931
1932     else if (t - lastInfoTime >= 1000)
1933     {
1934         lastInfoTime = t;
1935
1936         dbg_print_mean();
1937         dbg_print_hit_rate();
1938
1939         // Send info on searched nodes as soon as we return to root
1940         SendSearchedNodes = true;
1941     }
1942
1943     // Should we stop the search?
1944     if (Limits.ponder)
1945         return;
1946
1947     bool stillAtFirstMove =    FirstRootMove
1948                            && !AspirationFailLow
1949                            &&  t > TimeMgr.available_time();
1950
1951     bool noMoreTime =   t > TimeMgr.maximum_time()
1952                      || stillAtFirstMove;
1953
1954     if (   (Limits.useTimeManagement() && noMoreTime)
1955         || (Limits.maxTime && t >= Limits.maxTime)
1956         || (Limits.maxNodes && pos.nodes_searched() >= Limits.maxNodes)) // FIXME
1957         StopRequest = true;
1958   }
1959
1960
1961   // wait_for_stop_or_ponderhit() is called when the maximum depth is reached
1962   // while the program is pondering. The point is to work around a wrinkle in
1963   // the UCI protocol: When pondering, the engine is not allowed to give a
1964   // "bestmove" before the GUI sends it a "stop" or "ponderhit" command.
1965   // We simply wait here until one of these commands is sent, and return,
1966   // after which the bestmove and pondermove will be printed.
1967
1968   void wait_for_stop_or_ponderhit() {
1969
1970     string command;
1971
1972     // Wait for a command from stdin
1973     while (   std::getline(std::cin, command)
1974            && command != "ponderhit" && command != "stop" && command != "quit") {};
1975
1976     if (command != "ponderhit" && command != "stop")
1977         QuitRequest = true; // Must be "quit" or getline() returned false
1978   }
1979
1980
1981   // When playing with strength handicap choose best move among the MultiPV set
1982   // using a statistical rule dependent on SkillLevel. Idea by Heinz van Saanen.
1983   void do_skill_level(Move* best, Move* ponder) {
1984
1985     assert(MultiPV > 1);
1986
1987     static RKISS rk;
1988
1989     // Rml list is already sorted by pv_score in descending order
1990     int s;
1991     int max_s = -VALUE_INFINITE;
1992     int size = Min(MultiPV, (int)Rml.size());
1993     int max = Rml[0].pv_score;
1994     int var = Min(max - Rml[size - 1].pv_score, PawnValueMidgame);
1995     int wk = 120 - 2 * SkillLevel;
1996
1997     // PRNG sequence should be non deterministic
1998     for (int i = abs(get_system_time() % 50); i > 0; i--)
1999         rk.rand<unsigned>();
2000
2001     // Choose best move. For each move's score we add two terms both dependent
2002     // on wk, one deterministic and bigger for weaker moves, and one random,
2003     // then we choose the move with the resulting highest score.
2004     for (int i = 0; i < size; i++)
2005     {
2006         s = Rml[i].pv_score;
2007
2008         // Don't allow crazy blunders even at very low skills
2009         if (i > 0 && Rml[i-1].pv_score > s + EasyMoveMargin)
2010             break;
2011
2012         // This is our magical formula
2013         s += ((max - s) * wk + var * (rk.rand<unsigned>() % wk)) / 128;
2014
2015         if (s > max_s)
2016         {
2017             max_s = s;
2018             *best = Rml[i].pv[0];
2019             *ponder = Rml[i].pv[1];
2020         }
2021     }
2022   }
2023
2024
2025   /// RootMove and RootMoveList method's definitions
2026
2027   RootMove::RootMove() {
2028
2029     nodes = 0;
2030     pv_score = -VALUE_INFINITE;
2031     pv[0] = MOVE_NONE;
2032   }
2033
2034   RootMove& RootMove::operator=(const RootMove& rm) {
2035
2036     const Move* src = rm.pv;
2037     Move* dst = pv;
2038
2039     // Avoid a costly full rm.pv[] copy
2040     do *dst++ = *src; while (*src++ != MOVE_NONE);
2041
2042     nodes = rm.nodes;
2043     pv_score = rm.pv_score;
2044     return *this;
2045   }
2046
2047   void RootMoveList::init(Position& pos, Move searchMoves[]) {
2048
2049     Move* sm;
2050     bestMoveChanges = 0;
2051     clear();
2052
2053     // Generate all legal moves and add them to RootMoveList
2054     for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
2055     {
2056         // If we have a searchMoves[] list then verify the move
2057         // is in the list before to add it.
2058         for (sm = searchMoves; *sm && *sm != ml.move(); sm++) {}
2059
2060         if (sm != searchMoves && *sm != ml.move())
2061             continue;
2062
2063         RootMove rm;
2064         rm.pv[0] = ml.move();
2065         rm.pv[1] = MOVE_NONE;
2066         rm.pv_score = -VALUE_INFINITE;
2067         push_back(rm);
2068     }
2069   }
2070
2071   RootMove* RootMoveList::find(const Move &m) {
2072
2073       for (int i = 0; i < int(size()); i++)
2074       {
2075           if ((*this)[i].pv[0] == m)
2076               return &(*this)[i];
2077       }
2078
2079       return NULL;
2080   }
2081
2082   // extract_pv_from_tt() builds a PV by adding moves from the transposition table.
2083   // We consider also failing high nodes and not only VALUE_TYPE_EXACT nodes. This
2084   // allow to always have a ponder move even when we fail high at root and also a
2085   // long PV to print that is important for position analysis.
2086
2087   void RootMove::extract_pv_from_tt(Position& pos) {
2088
2089     StateInfo state[PLY_MAX_PLUS_2], *st = state;
2090     TTEntry* tte;
2091     int ply = 1;
2092
2093     assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
2094
2095     pos.do_move(pv[0], *st++);
2096
2097     while (   (tte = TT.probe(pos.get_key())) != NULL
2098            && tte->move() != MOVE_NONE
2099            && pos.move_is_pl(tte->move())
2100            && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces())
2101            && ply < PLY_MAX
2102            && (!pos.is_draw<false>() || ply < 2))
2103     {
2104         pv[ply] = tte->move();
2105         pos.do_move(pv[ply++], *st++);
2106     }
2107     pv[ply] = MOVE_NONE;
2108
2109     do pos.undo_move(pv[--ply]); while (ply);
2110   }
2111
2112   // insert_pv_in_tt() is called at the end of a search iteration, and inserts
2113   // the PV back into the TT. This makes sure the old PV moves are searched
2114   // first, even if the old TT entries have been overwritten.
2115
2116   void RootMove::insert_pv_in_tt(Position& pos) {
2117
2118     StateInfo state[PLY_MAX_PLUS_2], *st = state;
2119     TTEntry* tte;
2120     Key k;
2121     Value v, m = VALUE_NONE;
2122     int ply = 0;
2123
2124     assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
2125
2126     do {
2127         k = pos.get_key();
2128         tte = TT.probe(k);
2129
2130         // Don't overwrite existing correct entries
2131         if (!tte || tte->move() != pv[ply])
2132         {
2133             v = (pos.in_check() ? VALUE_NONE : evaluate(pos, m));
2134             TT.store(k, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, pv[ply], v, m);
2135         }
2136         pos.do_move(pv[ply], *st++);
2137
2138     } while (pv[++ply] != MOVE_NONE);
2139
2140     do pos.undo_move(pv[--ply]); while (ply);
2141   }
2142 } // namespace
2143
2144
2145 // ThreadsManager::idle_loop() is where the threads are parked when they have no work
2146 // to do. The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint
2147 // object for which the current thread is the master.
2148
2149 void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) {
2150
2151   assert(threadID >= 0 && threadID < MAX_THREADS);
2152
2153   int i;
2154   bool allFinished;
2155
2156   while (true)
2157   {
2158       // Slave threads can exit as soon as AllThreadsShouldExit raises,
2159       // master should exit as last one.
2160       if (allThreadsShouldExit)
2161       {
2162           assert(!sp);
2163           threads[threadID].state = Thread::TERMINATED;
2164           return;
2165       }
2166
2167       // If we are not thinking, wait for a condition to be signaled
2168       // instead of wasting CPU time polling for work.
2169       while (   threadID >= activeThreads
2170              || threads[threadID].state == Thread::INITIALIZING
2171              || (useSleepingThreads && threads[threadID].state == Thread::AVAILABLE))
2172       {
2173           assert(!sp || useSleepingThreads);
2174           assert(threadID != 0 || useSleepingThreads);
2175
2176           if (threads[threadID].state == Thread::INITIALIZING)
2177               threads[threadID].state = Thread::AVAILABLE;
2178
2179           // Grab the lock to avoid races with Thread::wake_up()
2180           lock_grab(&threads[threadID].sleepLock);
2181
2182           // If we are master and all slaves have finished do not go to sleep
2183           for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {}
2184           allFinished = (i == activeThreads);
2185
2186           if (allFinished || allThreadsShouldExit)
2187           {
2188               lock_release(&threads[threadID].sleepLock);
2189               break;
2190           }
2191
2192           // Do sleep here after retesting sleep conditions
2193           if (threadID >= activeThreads || threads[threadID].state == Thread::AVAILABLE)
2194               cond_wait(&threads[threadID].sleepCond, &threads[threadID].sleepLock);
2195
2196           lock_release(&threads[threadID].sleepLock);
2197       }
2198
2199       // If this thread has been assigned work, launch a search
2200       if (threads[threadID].state == Thread::WORKISWAITING)
2201       {
2202           assert(!allThreadsShouldExit);
2203
2204           threads[threadID].state = Thread::SEARCHING;
2205
2206           // Copy split point position and search stack and call search()
2207           // with SplitPoint template parameter set to true.
2208           SearchStack ss[PLY_MAX_PLUS_2];
2209           SplitPoint* tsp = threads[threadID].splitPoint;
2210           Position pos(*tsp->pos, threadID);
2211
2212           memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack));
2213           (ss+1)->sp = tsp;
2214
2215           if (tsp->pvNode)
2216               search<SplitPointPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
2217           else
2218               search<SplitPointNonPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
2219
2220           assert(threads[threadID].state == Thread::SEARCHING);
2221
2222           threads[threadID].state = Thread::AVAILABLE;
2223
2224           // Wake up master thread so to allow it to return from the idle loop in
2225           // case we are the last slave of the split point.
2226           if (   useSleepingThreads
2227               && threadID != tsp->master
2228               && threads[tsp->master].state == Thread::AVAILABLE)
2229               threads[tsp->master].wake_up();
2230       }
2231
2232       // If this thread is the master of a split point and all slaves have
2233       // finished their work at this split point, return from the idle loop.
2234       for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {}
2235       allFinished = (i == activeThreads);
2236
2237       if (allFinished)
2238       {
2239           // Because sp->slaves[] is reset under lock protection,
2240           // be sure sp->lock has been released before to return.
2241           lock_grab(&(sp->lock));
2242           lock_release(&(sp->lock));
2243
2244           // In helpful master concept a master can help only a sub-tree, and
2245           // because here is all finished is not possible master is booked.
2246           assert(threads[threadID].state == Thread::AVAILABLE);
2247
2248           threads[threadID].state = Thread::SEARCHING;
2249           return;
2250       }
2251   }
2252 }