]> git.sesse.net Git - stockfish/blob - src/search.cpp
c4613ccd07e2ca23d639f8297e7602b336db7a88
[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 PV and SpNode nodes we want all moves to be legal since the beginning
957       if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, ci.pinned))
958           continue;
959
960       if (SpNode)
961       {
962           moveCount = ++sp->moveCount;
963           lock_release(&(sp->lock));
964       }
965       else
966           moveCount++;
967
968       if (RootNode)
969       {
970           // This is used by time management
971           FirstRootMove = (moveCount == 1);
972
973           // Save the current node count before the move is searched
974           nodes = pos.nodes_searched();
975
976           // If it's time to send nodes info, do it here where we have the
977           // correct accumulated node counts searched by each thread.
978           if (SendSearchedNodes)
979           {
980               SendSearchedNodes = false;
981               cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
982           }
983
984           // For long searches send current move info to GUI
985           if (current_search_time() > 2000)
986               cout << "info" << depth_to_uci(depth)
987                    << " currmove " << move << " currmovenumber " << moveCount << endl;
988       }
989
990       // At Root and at first iteration do a PV search on all the moves to score root moves
991       isPvMove = (PvNode && moveCount <= (!RootNode ? 1 : depth <= ONE_PLY ? MAX_MOVES : MultiPV));
992       givesCheck = pos.move_gives_check(move, ci);
993       captureOrPromotion = pos.move_is_capture_or_promotion(move);
994
995       // Step 12. Decide the new search depth
996       ext = extension<PvNode>(pos, move, captureOrPromotion, givesCheck, &dangerous);
997
998       // Singular extension search. If all moves but one fail low on a search of
999       // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
1000       // is singular and should be extended. To verify this we do a reduced search
1001       // on all the other moves but the ttMove, if result is lower than ttValue minus
1002       // a margin then we extend ttMove.
1003       if (   singularExtensionNode
1004           && move == ttMove
1005           && pos.pl_move_is_legal(move, ci.pinned)
1006           && ext < ONE_PLY)
1007       {
1008           Value ttValue = value_from_tt(tte->value(), ss->ply);
1009
1010           if (abs(ttValue) < VALUE_KNOWN_WIN)
1011           {
1012               Value rBeta = ttValue - int(depth);
1013               ss->excludedMove = move;
1014               ss->skipNullMove = true;
1015               Value v = search<NonPV>(pos, ss, rBeta - 1, rBeta, depth / 2);
1016               ss->skipNullMove = false;
1017               ss->excludedMove = MOVE_NONE;
1018               ss->bestMove = MOVE_NONE;
1019               if (v < rBeta)
1020                   ext = ONE_PLY;
1021           }
1022       }
1023
1024       // Update current move (this must be done after singular extension search)
1025       newDepth = depth - ONE_PLY + ext;
1026
1027       // Step 13. Futility pruning (is omitted in PV nodes)
1028       if (   !PvNode
1029           && !captureOrPromotion
1030           && !inCheck
1031           && !dangerous
1032           &&  move != ttMove
1033           && !move_is_castle(move))
1034       {
1035           // Move count based pruning
1036           if (   moveCount >= futility_move_count(depth)
1037               && (!threatMove || !connected_threat(pos, move, threatMove))
1038               && bestValue > VALUE_MATED_IN_PLY_MAX) // FIXME bestValue is racy
1039           {
1040               if (SpNode)
1041                   lock_grab(&(sp->lock));
1042
1043               continue;
1044           }
1045
1046           // Value based pruning
1047           // We illogically ignore reduction condition depth >= 3*ONE_PLY for predicted depth,
1048           // but fixing this made program slightly weaker.
1049           Depth predictedDepth = newDepth - reduction<PvNode>(depth, moveCount);
1050           futilityValueScaled =  futilityBase + futility_margin(predictedDepth, moveCount)
1051                                + H.gain(pos.piece_on(move_from(move)), move_to(move));
1052
1053           if (futilityValueScaled < beta)
1054           {
1055               if (SpNode)
1056               {
1057                   lock_grab(&(sp->lock));
1058                   if (futilityValueScaled > sp->bestValue)
1059                       sp->bestValue = bestValue = futilityValueScaled;
1060               }
1061               else if (futilityValueScaled > bestValue)
1062                   bestValue = futilityValueScaled;
1063
1064               continue;
1065           }
1066
1067           // Prune moves with negative SEE at low depths
1068           if (   predictedDepth < 2 * ONE_PLY
1069               && bestValue > VALUE_MATED_IN_PLY_MAX
1070               && pos.see_sign(move) < 0)
1071           {
1072               if (SpNode)
1073                   lock_grab(&(sp->lock));
1074
1075               continue;
1076           }
1077       }
1078
1079       // Check for legality only before to do the move
1080       if (!pos.pl_move_is_legal(move, ci.pinned))
1081       {
1082           moveCount--;
1083           continue;
1084       }
1085
1086       ss->currentMove = move;
1087       if (!SpNode && !captureOrPromotion)
1088           movesSearched[playedMoveCount++] = move;
1089
1090       // Step 14. Make the move
1091       pos.do_move(move, st, ci, givesCheck);
1092
1093       // Step extra. pv search (only in PV nodes)
1094       // The first move in list is the expected PV
1095       if (isPvMove)
1096           value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
1097                                      : - search<PV>(pos, ss+1, -beta, -alpha, newDepth);
1098       else
1099       {
1100           // Step 15. Reduced depth search
1101           // If the move fails high will be re-searched at full depth.
1102           bool doFullDepthSearch = true;
1103
1104           if (    depth > 3 * ONE_PLY
1105               && !captureOrPromotion
1106               && !dangerous
1107               && !move_is_castle(move)
1108               &&  ss->killers[0] != move
1109               &&  ss->killers[1] != move
1110               && (ss->reduction = reduction<PvNode>(depth, moveCount)) != DEPTH_ZERO)
1111           {
1112               Depth d = newDepth - ss->reduction;
1113               alpha = SpNode ? sp->alpha : alpha;
1114
1115               value = d < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
1116                                   : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d);
1117
1118               ss->reduction = DEPTH_ZERO;
1119               doFullDepthSearch = (value > alpha);
1120           }
1121
1122           // Step 16. Full depth search
1123           if (doFullDepthSearch)
1124           {
1125               alpha = SpNode ? sp->alpha : alpha;
1126               value = newDepth < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
1127                                          : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth);
1128
1129               // Step extra. pv search (only in PV nodes)
1130               // Search only for possible new PV nodes, if instead value >= beta then
1131               // parent node fails low with value <= alpha and tries another move.
1132               if (PvNode && value > alpha && (RootNode || value < beta))
1133                   value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
1134                                              : - search<PV>(pos, ss+1, -beta, -alpha, newDepth);
1135           }
1136       }
1137
1138       // Step 17. Undo move
1139       pos.undo_move(move);
1140
1141       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1142
1143       // Step 18. Check for new best move
1144       if (SpNode)
1145       {
1146           lock_grab(&(sp->lock));
1147           bestValue = sp->bestValue;
1148           alpha = sp->alpha;
1149       }
1150
1151       if (value > bestValue)
1152       {
1153           bestValue = value;
1154           ss->bestMove = move;
1155
1156           if (  !RootNode
1157               && PvNode
1158               && value > alpha
1159               && value < beta) // We want always alpha < beta
1160               alpha = value;
1161
1162           if (SpNode && !thread.cutoff_occurred())
1163           {
1164               sp->bestValue = value;
1165               sp->ss->bestMove = move;
1166               sp->alpha = alpha;
1167               sp->is_betaCutoff = (value >= beta);
1168           }
1169       }
1170
1171       if (RootNode)
1172       {
1173           // Finished searching the move. If StopRequest is true, the search
1174           // was aborted because the user interrupted the search or because we
1175           // ran out of time. In this case, the return value of the search cannot
1176           // be trusted, and we break out of the loop without updating the best
1177           // move and/or PV.
1178           if (StopRequest)
1179               break;
1180
1181           // Remember searched nodes counts for this move
1182           Rml.find(move)->nodes += pos.nodes_searched() - nodes;
1183
1184           // PV move or new best move ?
1185           if (isPvMove || value > alpha)
1186           {
1187               // Update PV
1188               Rml.find(move)->pv_score = value;
1189               Rml.find(move)->extract_pv_from_tt(pos);
1190
1191               // We record how often the best move has been changed in each
1192               // iteration. This information is used for time management: When
1193               // the best move changes frequently, we allocate some more time.
1194               if (!isPvMove && MultiPV == 1)
1195                   Rml.bestMoveChanges++;
1196
1197               // Update alpha.
1198               if (value > alpha)
1199                   alpha = value;
1200           }
1201           else
1202               // All other moves but the PV are set to the lowest value, this
1203               // is not a problem when sorting becuase sort is stable and move
1204               // position in the list is preserved, just the PV is pushed up.
1205               Rml.find(move)->pv_score = -VALUE_INFINITE;
1206
1207       } // RootNode
1208
1209       // Step 19. Check for split
1210       if (   !RootNode
1211           && !SpNode
1212           && depth >= Threads.min_split_depth()
1213           && bestValue < beta
1214           && Threads.available_slave_exists(pos.thread())
1215           && !StopRequest
1216           && !thread.cutoff_occurred())
1217           Threads.split<FakeSplit>(pos, ss, &alpha, beta, &bestValue, depth,
1218                                    threatMove, moveCount, &mp, PvNode);
1219     }
1220
1221     // Step 20. Check for mate and stalemate
1222     // All legal moves have been searched and if there are
1223     // no legal moves, it must be mate or stalemate.
1224     // If one move was excluded return fail low score.
1225     if (!SpNode && !moveCount)
1226         return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
1227
1228     // Step 21. Update tables
1229     // If the search is not aborted, update the transposition table,
1230     // history counters, and killer moves.
1231     if (!SpNode && !StopRequest && !thread.cutoff_occurred())
1232     {
1233         move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
1234         vt   = bestValue <= oldAlpha ? VALUE_TYPE_UPPER
1235              : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT;
1236
1237         TT.store(posKey, value_to_tt(bestValue, ss->ply), vt, depth, move, ss->eval, ss->evalMargin);
1238
1239         // Update killers and history only for non capture moves that fails high
1240         if (    bestValue >= beta
1241             && !pos.move_is_capture_or_promotion(move))
1242         {
1243             if (move != ss->killers[0])
1244             {
1245                 ss->killers[1] = ss->killers[0];
1246                 ss->killers[0] = move;
1247             }
1248             update_history(pos, move, depth, movesSearched, playedMoveCount);
1249         }
1250     }
1251
1252     if (SpNode)
1253     {
1254         // Here we have the lock still grabbed
1255         sp->is_slave[pos.thread()] = false;
1256         sp->nodes += pos.nodes_searched();
1257         lock_release(&(sp->lock));
1258     }
1259
1260     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1261
1262     return bestValue;
1263   }
1264
1265   // qsearch() is the quiescence search function, which is called by the main
1266   // search function when the remaining depth is zero (or, to be more precise,
1267   // less than ONE_PLY).
1268
1269   template <NodeType NT>
1270   Value qsearch(Position& pos, SearchStack* ss, Value alpha, Value beta, Depth depth) {
1271
1272     const bool PvNode = (NT == PV);
1273
1274     assert(NT == PV || NT == NonPV);
1275     assert(alpha >= -VALUE_INFINITE && alpha <= VALUE_INFINITE);
1276     assert(beta >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
1277     assert(PvNode || alpha == beta - 1);
1278     assert(depth <= 0);
1279     assert(pos.thread() >= 0 && pos.thread() < Threads.size());
1280
1281     StateInfo st;
1282     Move ttMove, move;
1283     Value bestValue, value, evalMargin, futilityValue, futilityBase;
1284     bool inCheck, enoughMaterial, givesCheck, evasionPrunable;
1285     const TTEntry* tte;
1286     Depth ttDepth;
1287     Value oldAlpha = alpha;
1288
1289     ss->bestMove = ss->currentMove = MOVE_NONE;
1290     ss->ply = (ss-1)->ply + 1;
1291
1292     // Check for an instant draw or maximum ply reached
1293     if (pos.is_draw<true>() || ss->ply > PLY_MAX)
1294         return VALUE_DRAW;
1295
1296     // Decide whether or not to include checks, this fixes also the type of
1297     // TT entry depth that we are going to use. Note that in qsearch we use
1298     // only two types of depth in TT: DEPTH_QS_CHECKS or DEPTH_QS_NO_CHECKS.
1299     inCheck = pos.in_check();
1300     ttDepth = (inCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS : DEPTH_QS_NO_CHECKS);
1301
1302     // Transposition table lookup. At PV nodes, we don't use the TT for
1303     // pruning, but only for move ordering.
1304     tte = TT.probe(pos.get_key());
1305     ttMove = (tte ? tte->move() : MOVE_NONE);
1306
1307     if (!PvNode && tte && ok_to_use_TT(tte, ttDepth, beta, ss->ply))
1308     {
1309         ss->bestMove = ttMove; // Can be MOVE_NONE
1310         return value_from_tt(tte->value(), ss->ply);
1311     }
1312
1313     // Evaluate the position statically
1314     if (inCheck)
1315     {
1316         bestValue = futilityBase = -VALUE_INFINITE;
1317         ss->eval = evalMargin = VALUE_NONE;
1318         enoughMaterial = false;
1319     }
1320     else
1321     {
1322         if (tte)
1323         {
1324             assert(tte->static_value() != VALUE_NONE);
1325
1326             evalMargin = tte->static_value_margin();
1327             ss->eval = bestValue = tte->static_value();
1328         }
1329         else
1330             ss->eval = bestValue = evaluate(pos, evalMargin);
1331
1332         // Stand pat. Return immediately if static value is at least beta
1333         if (bestValue >= beta)
1334         {
1335             if (!tte)
1336                 TT.store(pos.get_key(), value_to_tt(bestValue, ss->ply), VALUE_TYPE_LOWER, DEPTH_NONE, MOVE_NONE, ss->eval, evalMargin);
1337
1338             return bestValue;
1339         }
1340
1341         if (PvNode && bestValue > alpha)
1342             alpha = bestValue;
1343
1344         // Futility pruning parameters, not needed when in check
1345         futilityBase = ss->eval + evalMargin + FutilityMarginQS;
1346         enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
1347     }
1348
1349     // Initialize a MovePicker object for the current position, and prepare
1350     // to search the moves. Because the depth is <= 0 here, only captures,
1351     // queen promotions and checks (only if depth >= DEPTH_QS_CHECKS) will
1352     // be generated.
1353     MovePicker mp(pos, ttMove, depth, H, move_to((ss-1)->currentMove));
1354     CheckInfo ci(pos);
1355
1356     // Loop through the moves until no moves remain or a beta cutoff occurs
1357     while (   alpha < beta
1358            && (move = mp.get_next_move()) != MOVE_NONE)
1359     {
1360       assert(move_is_ok(move));
1361
1362       givesCheck = pos.move_gives_check(move, ci);
1363
1364       // Futility pruning
1365       if (   !PvNode
1366           && !inCheck
1367           && !givesCheck
1368           &&  move != ttMove
1369           &&  enoughMaterial
1370           && !move_is_promotion(move)
1371           && !pos.move_is_passed_pawn_push(move))
1372       {
1373           futilityValue =  futilityBase
1374                          + piece_value_endgame(pos.piece_on(move_to(move)))
1375                          + (move_is_ep(move) ? PawnValueEndgame : VALUE_ZERO);
1376
1377           if (futilityValue < alpha)
1378           {
1379               if (futilityValue > bestValue)
1380                   bestValue = futilityValue;
1381               continue;
1382           }
1383
1384           // Prune moves with negative or equal SEE
1385           if (   futilityBase < beta
1386               && depth < DEPTH_ZERO
1387               && pos.see(move) <= 0)
1388               continue;
1389       }
1390
1391       // Detect non-capture evasions that are candidate to be pruned
1392       evasionPrunable =   !PvNode
1393                        && inCheck
1394                        && bestValue > VALUE_MATED_IN_PLY_MAX
1395                        && !pos.move_is_capture(move)
1396                        && !pos.can_castle(pos.side_to_move());
1397
1398       // Don't search moves with negative SEE values
1399       if (   !PvNode
1400           && (!inCheck || evasionPrunable)
1401           &&  move != ttMove
1402           && !move_is_promotion(move)
1403           &&  pos.see_sign(move) < 0)
1404           continue;
1405
1406       // Don't search useless checks
1407       if (   !PvNode
1408           && !inCheck
1409           &&  givesCheck
1410           &&  move != ttMove
1411           && !pos.move_is_capture_or_promotion(move)
1412           &&  ss->eval + PawnValueMidgame / 4 < beta
1413           && !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
1414       {
1415           if (ss->eval + PawnValueMidgame / 4 > bestValue)
1416               bestValue = ss->eval + PawnValueMidgame / 4;
1417
1418           continue;
1419       }
1420
1421       // Check for legality only before to do the move
1422       if (!pos.pl_move_is_legal(move, ci.pinned))
1423           continue;
1424
1425       // Update current move
1426       ss->currentMove = move;
1427
1428       // Make and search the move
1429       pos.do_move(move, st, ci, givesCheck);
1430       value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth-ONE_PLY);
1431       pos.undo_move(move);
1432
1433       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1434
1435       // New best move?
1436       if (value > bestValue)
1437       {
1438           bestValue = value;
1439           if (value > alpha)
1440           {
1441               alpha = value;
1442               ss->bestMove = move;
1443           }
1444        }
1445     }
1446
1447     // All legal moves have been searched. A special case: If we're in check
1448     // and no legal moves were found, it is checkmate.
1449     if (inCheck && bestValue == -VALUE_INFINITE)
1450         return value_mated_in(ss->ply);
1451
1452     // Update transposition table
1453     ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
1454     TT.store(pos.get_key(), value_to_tt(bestValue, ss->ply), vt, ttDepth, ss->bestMove, ss->eval, evalMargin);
1455
1456     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1457
1458     return bestValue;
1459   }
1460
1461
1462   // check_is_dangerous() tests if a checking move can be pruned in qsearch().
1463   // bestValue is updated only when returning false because in that case move
1464   // will be pruned.
1465
1466   bool check_is_dangerous(Position &pos, Move move, Value futilityBase, Value beta, Value *bestValue)
1467   {
1468     Bitboard b, occ, oldAtt, newAtt, kingAtt;
1469     Square from, to, ksq, victimSq;
1470     Piece pc;
1471     Color them;
1472     Value futilityValue, bv = *bestValue;
1473
1474     from = move_from(move);
1475     to = move_to(move);
1476     them = opposite_color(pos.side_to_move());
1477     ksq = pos.king_square(them);
1478     kingAtt = pos.attacks_from<KING>(ksq);
1479     pc = pos.piece_on(from);
1480
1481     occ = pos.occupied_squares() & ~(1ULL << from) & ~(1ULL << ksq);
1482     oldAtt = pos.attacks_from(pc, from, occ);
1483     newAtt = pos.attacks_from(pc,   to, occ);
1484
1485     // Rule 1. Checks which give opponent's king at most one escape square are dangerous
1486     b = kingAtt & ~pos.pieces(them) & ~newAtt & ~(1ULL << to);
1487
1488     if (!(b && (b & (b - 1))))
1489         return true;
1490
1491     // Rule 2. Queen contact check is very dangerous
1492     if (   piece_type(pc) == QUEEN
1493         && bit_is_set(kingAtt, to))
1494         return true;
1495
1496     // Rule 3. Creating new double threats with checks
1497     b = pos.pieces(them) & newAtt & ~oldAtt & ~(1ULL << ksq);
1498
1499     while (b)
1500     {
1501         victimSq = pop_1st_bit(&b);
1502         futilityValue = futilityBase + piece_value_endgame(pos.piece_on(victimSq));
1503
1504         // Note that here we generate illegal "double move"!
1505         if (   futilityValue >= beta
1506             && pos.see_sign(make_move(from, victimSq)) >= 0)
1507             return true;
1508
1509         if (futilityValue > bv)
1510             bv = futilityValue;
1511     }
1512
1513     // Update bestValue only if check is not dangerous (because we will prune the move)
1514     *bestValue = bv;
1515     return false;
1516   }
1517
1518
1519   // connected_moves() tests whether two moves are 'connected' in the sense
1520   // that the first move somehow made the second move possible (for instance
1521   // if the moving piece is the same in both moves). The first move is assumed
1522   // to be the move that was made to reach the current position, while the
1523   // second move is assumed to be a move from the current position.
1524
1525   bool connected_moves(const Position& pos, Move m1, Move m2) {
1526
1527     Square f1, t1, f2, t2;
1528     Piece p1, p2;
1529     Square ksq;
1530
1531     assert(m1 && move_is_ok(m1));
1532     assert(m2 && move_is_ok(m2));
1533
1534     // Case 1: The moving piece is the same in both moves
1535     f2 = move_from(m2);
1536     t1 = move_to(m1);
1537     if (f2 == t1)
1538         return true;
1539
1540     // Case 2: The destination square for m2 was vacated by m1
1541     t2 = move_to(m2);
1542     f1 = move_from(m1);
1543     if (t2 == f1)
1544         return true;
1545
1546     // Case 3: Moving through the vacated square
1547     p2 = pos.piece_on(f2);
1548     if (   piece_is_slider(p2)
1549         && bit_is_set(squares_between(f2, t2), f1))
1550       return true;
1551
1552     // Case 4: The destination square for m2 is defended by the moving piece in m1
1553     p1 = pos.piece_on(t1);
1554     if (bit_is_set(pos.attacks_from(p1, t1), t2))
1555         return true;
1556
1557     // Case 5: Discovered check, checking piece is the piece moved in m1
1558     ksq = pos.king_square(pos.side_to_move());
1559     if (    piece_is_slider(p1)
1560         &&  bit_is_set(squares_between(t1, ksq), f2))
1561     {
1562         Bitboard occ = pos.occupied_squares();
1563         clear_bit(&occ, f2);
1564         if (bit_is_set(pos.attacks_from(p1, t1, occ), ksq))
1565             return true;
1566     }
1567     return false;
1568   }
1569
1570
1571   // value_to_tt() adjusts a mate score from "plies to mate from the root" to
1572   // "plies to mate from the current ply".  Non-mate scores are unchanged.
1573   // The function is called before storing a value to the transposition table.
1574
1575   Value value_to_tt(Value v, int ply) {
1576
1577     if (v >= VALUE_MATE_IN_PLY_MAX)
1578       return v + ply;
1579
1580     if (v <= VALUE_MATED_IN_PLY_MAX)
1581       return v - ply;
1582
1583     return v;
1584   }
1585
1586
1587   // value_from_tt() is the inverse of value_to_tt(): It adjusts a mate score from
1588   // the transposition table to a mate score corrected for the current ply.
1589
1590   Value value_from_tt(Value v, int ply) {
1591
1592     if (v >= VALUE_MATE_IN_PLY_MAX)
1593       return v - ply;
1594
1595     if (v <= VALUE_MATED_IN_PLY_MAX)
1596       return v + ply;
1597
1598     return v;
1599   }
1600
1601
1602   // connected_threat() tests whether it is safe to forward prune a move or if
1603   // is somehow connected to the threat move returned by null search.
1604
1605   bool connected_threat(const Position& pos, Move m, Move threat) {
1606
1607     assert(move_is_ok(m));
1608     assert(threat && move_is_ok(threat));
1609     assert(!pos.move_is_capture_or_promotion(m));
1610     assert(!pos.move_is_passed_pawn_push(m));
1611
1612     Square mfrom, mto, tfrom, tto;
1613
1614     mfrom = move_from(m);
1615     mto = move_to(m);
1616     tfrom = move_from(threat);
1617     tto = move_to(threat);
1618
1619     // Case 1: Don't prune moves which move the threatened piece
1620     if (mfrom == tto)
1621         return true;
1622
1623     // Case 2: If the threatened piece has value less than or equal to the
1624     // value of the threatening piece, don't prune moves which defend it.
1625     if (   pos.move_is_capture(threat)
1626         && (   piece_value_midgame(pos.piece_on(tfrom)) >= piece_value_midgame(pos.piece_on(tto))
1627             || piece_type(pos.piece_on(tfrom)) == KING)
1628         && pos.move_attacks_square(m, tto))
1629         return true;
1630
1631     // Case 3: If the moving piece in the threatened move is a slider, don't
1632     // prune safe moves which block its ray.
1633     if (   piece_is_slider(pos.piece_on(tfrom))
1634         && bit_is_set(squares_between(tfrom, tto), mto)
1635         && pos.see_sign(m) >= 0)
1636         return true;
1637
1638     return false;
1639   }
1640
1641
1642   // ok_to_use_TT() returns true if a transposition table score
1643   // can be used at a given point in search.
1644
1645   bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply) {
1646
1647     Value v = value_from_tt(tte->value(), ply);
1648
1649     return   (   tte->depth() >= depth
1650               || v >= Max(VALUE_MATE_IN_PLY_MAX, beta)
1651               || v < Min(VALUE_MATED_IN_PLY_MAX, beta))
1652
1653           && (   ((tte->type() & VALUE_TYPE_LOWER) && v >= beta)
1654               || ((tte->type() & VALUE_TYPE_UPPER) && v < beta));
1655   }
1656
1657
1658   // refine_eval() returns the transposition table score if
1659   // possible otherwise falls back on static position evaluation.
1660
1661   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply) {
1662
1663       assert(tte);
1664
1665       Value v = value_from_tt(tte->value(), ply);
1666
1667       if (   ((tte->type() & VALUE_TYPE_LOWER) && v >= defaultEval)
1668           || ((tte->type() & VALUE_TYPE_UPPER) && v < defaultEval))
1669           return v;
1670
1671       return defaultEval;
1672   }
1673
1674
1675   // update_history() registers a good move that produced a beta-cutoff
1676   // in history and marks as failures all the other moves of that ply.
1677
1678   void update_history(const Position& pos, Move move, Depth depth,
1679                       Move movesSearched[], int moveCount) {
1680     Move m;
1681     Value bonus = Value(int(depth) * int(depth));
1682
1683     H.update(pos.piece_on(move_from(move)), move_to(move), bonus);
1684
1685     for (int i = 0; i < moveCount - 1; i++)
1686     {
1687         m = movesSearched[i];
1688
1689         assert(m != move);
1690
1691         H.update(pos.piece_on(move_from(m)), move_to(m), -bonus);
1692     }
1693   }
1694
1695
1696   // update_gains() updates the gains table of a non-capture move given
1697   // the static position evaluation before and after the move.
1698
1699   void update_gains(const Position& pos, Move m, Value before, Value after) {
1700
1701     if (   m != MOVE_NULL
1702         && before != VALUE_NONE
1703         && after != VALUE_NONE
1704         && pos.captured_piece_type() == PIECE_TYPE_NONE
1705         && !move_is_special(m))
1706         H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
1707   }
1708
1709
1710   // current_search_time() returns the number of milliseconds which have passed
1711   // since the beginning of the current search.
1712
1713   int current_search_time(int set) {
1714
1715     static int searchStartTime;
1716
1717     if (set)
1718         searchStartTime = set;
1719
1720     return get_system_time() - searchStartTime;
1721   }
1722
1723
1724   // score_to_uci() converts a value to a string suitable for use with the UCI
1725   // protocol specifications:
1726   //
1727   // cp <x>     The score from the engine's point of view in centipawns.
1728   // mate <y>   Mate in y moves, not plies. If the engine is getting mated
1729   //            use negative values for y.
1730
1731   string score_to_uci(Value v, Value alpha, Value beta) {
1732
1733     std::stringstream s;
1734
1735     if (abs(v) < VALUE_MATE - PLY_MAX * ONE_PLY)
1736         s << " score cp " << int(v) * 100 / int(PawnValueMidgame); // Scale to centipawns
1737     else
1738         s << " score mate " << (v > 0 ? VALUE_MATE - v + 1 : -VALUE_MATE - v) / 2;
1739
1740     s << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : "");
1741
1742     return s.str();
1743   }
1744
1745
1746   // speed_to_uci() returns a string with time stats of current search suitable
1747   // to be sent to UCI gui.
1748
1749   string speed_to_uci(int64_t nodes) {
1750
1751     std::stringstream s;
1752     int t = current_search_time();
1753
1754     s << " nodes " << nodes
1755       << " nps " << (t > 0 ? int(nodes * 1000 / t) : 0)
1756       << " time "  << t;
1757
1758     return s.str();
1759   }
1760
1761   // pv_to_uci() returns a string with information on the current PV line
1762   // formatted according to UCI specification.
1763
1764   string pv_to_uci(Move pv[], int pvNum, bool chess960) {
1765
1766     std::stringstream s;
1767
1768     s << " multipv " << pvNum << " pv " << set960(chess960);
1769
1770     for ( ; *pv != MOVE_NONE; pv++)
1771         s << *pv << " ";
1772
1773     return s.str();
1774   }
1775
1776   // depth_to_uci() returns a string with information on the current depth and
1777   // seldepth formatted according to UCI specification.
1778
1779   string depth_to_uci(Depth depth) {
1780
1781     std::stringstream s;
1782
1783     // Retrieve max searched depth among threads
1784     int selDepth = 0;
1785     for (int i = 0; i < Threads.size(); i++)
1786         if (Threads[i].maxPly > selDepth)
1787             selDepth = Threads[i].maxPly;
1788
1789      s << " depth " << depth / ONE_PLY << " seldepth " << selDepth;
1790
1791     return s.str();
1792   }
1793
1794   string time_to_string(int millisecs) {
1795
1796     const int MSecMinute = 1000 * 60;
1797     const int MSecHour   = 1000 * 60 * 60;
1798
1799     int hours = millisecs / MSecHour;
1800     int minutes =  (millisecs % MSecHour) / MSecMinute;
1801     int seconds = ((millisecs % MSecHour) % MSecMinute) / 1000;
1802
1803     std::stringstream s;
1804
1805     if (hours)
1806         s << hours << ':';
1807
1808     s << std::setfill('0') << std::setw(2) << minutes << ':' << std::setw(2) << seconds;
1809     return s.str();
1810   }
1811
1812   string score_to_string(Value v) {
1813
1814     std::stringstream s;
1815
1816     if (v >= VALUE_MATE_IN_PLY_MAX)
1817         s << "#" << (VALUE_MATE - v + 1) / 2;
1818     else if (v <= VALUE_MATED_IN_PLY_MAX)
1819         s << "-#" << (VALUE_MATE + v) / 2;
1820     else
1821         s << std::setprecision(2) << std::fixed << std::showpos << float(v) / PawnValueMidgame;
1822
1823     return s.str();
1824   }
1825
1826   // pretty_pv() creates a human-readable string from a position and a PV.
1827   // It is used to write search information to the log file (which is created
1828   // when the UCI parameter "Use Search Log" is "true").
1829
1830   string pretty_pv(Position& pos, int depth, Value value, int time, Move pv[]) {
1831
1832     const int64_t K = 1000;
1833     const int64_t M = 1000000;
1834     const int startColumn = 28;
1835     const size_t maxLength = 80 - startColumn;
1836
1837     StateInfo state[PLY_MAX_PLUS_2], *st = state;
1838     Move* m = pv;
1839     string san;
1840     std::stringstream s;
1841     size_t length = 0;
1842
1843     // First print depth, score, time and searched nodes...
1844     s << set960(pos.is_chess960())
1845       << std::setw(2) << depth
1846       << std::setw(8) << score_to_string(value)
1847       << std::setw(8) << time_to_string(time);
1848
1849     if (pos.nodes_searched() < M)
1850         s << std::setw(8) << pos.nodes_searched() / 1 << "  ";
1851     else if (pos.nodes_searched() < K * M)
1852         s << std::setw(7) << pos.nodes_searched() / K << "K  ";
1853     else
1854         s << std::setw(7) << pos.nodes_searched() / M << "M  ";
1855
1856     // ...then print the full PV line in short algebraic notation
1857     while (*m != MOVE_NONE)
1858     {
1859         san = move_to_san(pos, *m);
1860         length += san.length() + 1;
1861
1862         if (length > maxLength)
1863         {
1864             length = san.length() + 1;
1865             s << "\n" + string(startColumn, ' ');
1866         }
1867         s << san << ' ';
1868
1869         pos.do_move(*m++, *st++);
1870     }
1871
1872     // Restore original position before to leave
1873     while (m != pv) pos.undo_move(*--m);
1874
1875     return s.str();
1876   }
1877
1878   // poll() performs two different functions: It polls for user input, and it
1879   // looks at the time consumed so far and decides if it's time to abort the
1880   // search.
1881
1882   void poll(const Position& pos) {
1883
1884     static int lastInfoTime;
1885     int t = current_search_time();
1886
1887     //  Poll for input
1888     if (input_available())
1889     {
1890         // We are line oriented, don't read single chars
1891         string command;
1892
1893         if (!std::getline(std::cin, command) || command == "quit")
1894         {
1895             // Quit the program as soon as possible
1896             Limits.ponder = false;
1897             QuitRequest = StopRequest = true;
1898             return;
1899         }
1900         else if (command == "stop")
1901         {
1902             // Stop calculating as soon as possible, but still send the "bestmove"
1903             // and possibly the "ponder" token when finishing the search.
1904             Limits.ponder = false;
1905             StopRequest = true;
1906         }
1907         else if (command == "ponderhit")
1908         {
1909             // The opponent has played the expected move. GUI sends "ponderhit" if
1910             // we were told to ponder on the same move the opponent has played. We
1911             // should continue searching but switching from pondering to normal search.
1912             Limits.ponder = false;
1913
1914             if (StopOnPonderhit)
1915                 StopRequest = true;
1916         }
1917     }
1918
1919     // Print search information
1920     if (t < 1000)
1921         lastInfoTime = 0;
1922
1923     else if (lastInfoTime > t)
1924         // HACK: Must be a new search where we searched less than
1925         // NodesBetweenPolls nodes during the first second of search.
1926         lastInfoTime = 0;
1927
1928     else if (t - lastInfoTime >= 1000)
1929     {
1930         lastInfoTime = t;
1931
1932         dbg_print_mean();
1933         dbg_print_hit_rate();
1934
1935         // Send info on searched nodes as soon as we return to root
1936         SendSearchedNodes = true;
1937     }
1938
1939     // Should we stop the search?
1940     if (Limits.ponder)
1941         return;
1942
1943     bool stillAtFirstMove =    FirstRootMove
1944                            && !AspirationFailLow
1945                            &&  t > TimeMgr.available_time();
1946
1947     bool noMoreTime =   t > TimeMgr.maximum_time()
1948                      || stillAtFirstMove;
1949
1950     if (   (Limits.useTimeManagement() && noMoreTime)
1951         || (Limits.maxTime && t >= Limits.maxTime)
1952         || (Limits.maxNodes && pos.nodes_searched() >= Limits.maxNodes)) // FIXME
1953         StopRequest = true;
1954   }
1955
1956
1957   // wait_for_stop_or_ponderhit() is called when the maximum depth is reached
1958   // while the program is pondering. The point is to work around a wrinkle in
1959   // the UCI protocol: When pondering, the engine is not allowed to give a
1960   // "bestmove" before the GUI sends it a "stop" or "ponderhit" command.
1961   // We simply wait here until one of these commands is sent, and return,
1962   // after which the bestmove and pondermove will be printed.
1963
1964   void wait_for_stop_or_ponderhit() {
1965
1966     string command;
1967
1968     // Wait for a command from stdin
1969     while (   std::getline(std::cin, command)
1970            && command != "ponderhit" && command != "stop" && command != "quit") {};
1971
1972     if (command != "ponderhit" && command != "stop")
1973         QuitRequest = true; // Must be "quit" or getline() returned false
1974   }
1975
1976
1977   // When playing with strength handicap choose best move among the MultiPV set
1978   // using a statistical rule dependent on SkillLevel. Idea by Heinz van Saanen.
1979   void do_skill_level(Move* best, Move* ponder) {
1980
1981     assert(MultiPV > 1);
1982
1983     static RKISS rk;
1984
1985     // Rml list is already sorted by pv_score in descending order
1986     int s;
1987     int max_s = -VALUE_INFINITE;
1988     int size = Min(MultiPV, (int)Rml.size());
1989     int max = Rml[0].pv_score;
1990     int var = Min(max - Rml[size - 1].pv_score, PawnValueMidgame);
1991     int wk = 120 - 2 * SkillLevel;
1992
1993     // PRNG sequence should be non deterministic
1994     for (int i = abs(get_system_time() % 50); i > 0; i--)
1995         rk.rand<unsigned>();
1996
1997     // Choose best move. For each move's score we add two terms both dependent
1998     // on wk, one deterministic and bigger for weaker moves, and one random,
1999     // then we choose the move with the resulting highest score.
2000     for (int i = 0; i < size; i++)
2001     {
2002         s = Rml[i].pv_score;
2003
2004         // Don't allow crazy blunders even at very low skills
2005         if (i > 0 && Rml[i-1].pv_score > s + EasyMoveMargin)
2006             break;
2007
2008         // This is our magical formula
2009         s += ((max - s) * wk + var * (rk.rand<unsigned>() % wk)) / 128;
2010
2011         if (s > max_s)
2012         {
2013             max_s = s;
2014             *best = Rml[i].pv[0];
2015             *ponder = Rml[i].pv[1];
2016         }
2017     }
2018   }
2019
2020
2021   /// RootMove and RootMoveList method's definitions
2022
2023   RootMove::RootMove() {
2024
2025     nodes = 0;
2026     pv_score = -VALUE_INFINITE;
2027     pv[0] = MOVE_NONE;
2028   }
2029
2030   RootMove& RootMove::operator=(const RootMove& rm) {
2031
2032     const Move* src = rm.pv;
2033     Move* dst = pv;
2034
2035     // Avoid a costly full rm.pv[] copy
2036     do *dst++ = *src; while (*src++ != MOVE_NONE);
2037
2038     nodes = rm.nodes;
2039     pv_score = rm.pv_score;
2040     return *this;
2041   }
2042
2043   void RootMoveList::init(Position& pos, Move searchMoves[]) {
2044
2045     Move* sm;
2046     bestMoveChanges = 0;
2047     clear();
2048
2049     // Generate all legal moves and add them to RootMoveList
2050     for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
2051     {
2052         // If we have a searchMoves[] list then verify the move
2053         // is in the list before to add it.
2054         for (sm = searchMoves; *sm && *sm != ml.move(); sm++) {}
2055
2056         if (sm != searchMoves && *sm != ml.move())
2057             continue;
2058
2059         RootMove rm;
2060         rm.pv[0] = ml.move();
2061         rm.pv[1] = MOVE_NONE;
2062         rm.pv_score = -VALUE_INFINITE;
2063         push_back(rm);
2064     }
2065   }
2066
2067   RootMove* RootMoveList::find(const Move &m) {
2068
2069       for (int i = 0; i < int(size()); i++)
2070       {
2071           if ((*this)[i].pv[0] == m)
2072               return &(*this)[i];
2073       }
2074
2075       return NULL;
2076   }
2077
2078   // extract_pv_from_tt() builds a PV by adding moves from the transposition table.
2079   // We consider also failing high nodes and not only VALUE_TYPE_EXACT nodes. This
2080   // allow to always have a ponder move even when we fail high at root and also a
2081   // long PV to print that is important for position analysis.
2082
2083   void RootMove::extract_pv_from_tt(Position& pos) {
2084
2085     StateInfo state[PLY_MAX_PLUS_2], *st = state;
2086     TTEntry* tte;
2087     int ply = 1;
2088
2089     assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
2090
2091     pos.do_move(pv[0], *st++);
2092
2093     while (   (tte = TT.probe(pos.get_key())) != NULL
2094            && tte->move() != MOVE_NONE
2095            && pos.move_is_pl(tte->move())
2096            && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces())
2097            && ply < PLY_MAX
2098            && (!pos.is_draw<false>() || ply < 2))
2099     {
2100         pv[ply] = tte->move();
2101         pos.do_move(pv[ply++], *st++);
2102     }
2103     pv[ply] = MOVE_NONE;
2104
2105     do pos.undo_move(pv[--ply]); while (ply);
2106   }
2107
2108   // insert_pv_in_tt() is called at the end of a search iteration, and inserts
2109   // the PV back into the TT. This makes sure the old PV moves are searched
2110   // first, even if the old TT entries have been overwritten.
2111
2112   void RootMove::insert_pv_in_tt(Position& pos) {
2113
2114     StateInfo state[PLY_MAX_PLUS_2], *st = state;
2115     TTEntry* tte;
2116     Key k;
2117     Value v, m = VALUE_NONE;
2118     int ply = 0;
2119
2120     assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
2121
2122     do {
2123         k = pos.get_key();
2124         tte = TT.probe(k);
2125
2126         // Don't overwrite existing correct entries
2127         if (!tte || tte->move() != pv[ply])
2128         {
2129             v = (pos.in_check() ? VALUE_NONE : evaluate(pos, m));
2130             TT.store(k, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, pv[ply], v, m);
2131         }
2132         pos.do_move(pv[ply], *st++);
2133
2134     } while (pv[++ply] != MOVE_NONE);
2135
2136     do pos.undo_move(pv[--ply]); while (ply);
2137   }
2138 } // namespace
2139
2140
2141 // ThreadsManager::idle_loop() is where the threads are parked when they have no work
2142 // to do. The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint
2143 // object for which the current thread is the master.
2144
2145 void ThreadsManager::idle_loop(int threadID, SplitPoint* sp) {
2146
2147   assert(threadID >= 0 && threadID < MAX_THREADS);
2148
2149   int i;
2150   bool allFinished;
2151
2152   while (true)
2153   {
2154       // Slave threads can exit as soon as AllThreadsShouldExit raises,
2155       // master should exit as last one.
2156       if (allThreadsShouldExit)
2157       {
2158           assert(!sp);
2159           threads[threadID].state = Thread::TERMINATED;
2160           return;
2161       }
2162
2163       // If we are not thinking, wait for a condition to be signaled
2164       // instead of wasting CPU time polling for work.
2165       while (   threadID >= activeThreads
2166              || threads[threadID].state == Thread::INITIALIZING
2167              || (useSleepingThreads && threads[threadID].state == Thread::AVAILABLE))
2168       {
2169           assert(!sp || useSleepingThreads);
2170           assert(threadID != 0 || useSleepingThreads);
2171
2172           if (threads[threadID].state == Thread::INITIALIZING)
2173               threads[threadID].state = Thread::AVAILABLE;
2174
2175           // Grab the lock to avoid races with Thread::wake_up()
2176           lock_grab(&threads[threadID].sleepLock);
2177
2178           // If we are master and all slaves have finished do not go to sleep
2179           for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {}
2180           allFinished = (i == activeThreads);
2181
2182           if (allFinished || allThreadsShouldExit)
2183           {
2184               lock_release(&threads[threadID].sleepLock);
2185               break;
2186           }
2187
2188           // Do sleep here after retesting sleep conditions
2189           if (threadID >= activeThreads || threads[threadID].state == Thread::AVAILABLE)
2190               cond_wait(&threads[threadID].sleepCond, &threads[threadID].sleepLock);
2191
2192           lock_release(&threads[threadID].sleepLock);
2193       }
2194
2195       // If this thread has been assigned work, launch a search
2196       if (threads[threadID].state == Thread::WORKISWAITING)
2197       {
2198           assert(!allThreadsShouldExit);
2199
2200           threads[threadID].state = Thread::SEARCHING;
2201
2202           // Copy split point position and search stack and call search()
2203           // with SplitPoint template parameter set to true.
2204           SearchStack ss[PLY_MAX_PLUS_2];
2205           SplitPoint* tsp = threads[threadID].splitPoint;
2206           Position pos(*tsp->pos, threadID);
2207
2208           memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack));
2209           (ss+1)->sp = tsp;
2210
2211           if (tsp->pvNode)
2212               search<SplitPointPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
2213           else
2214               search<SplitPointNonPV>(pos, ss+1, tsp->alpha, tsp->beta, tsp->depth);
2215
2216           assert(threads[threadID].state == Thread::SEARCHING);
2217
2218           threads[threadID].state = Thread::AVAILABLE;
2219
2220           // Wake up master thread so to allow it to return from the idle loop in
2221           // case we are the last slave of the split point.
2222           if (   useSleepingThreads
2223               && threadID != tsp->master
2224               && threads[tsp->master].state == Thread::AVAILABLE)
2225               threads[tsp->master].wake_up();
2226       }
2227
2228       // If this thread is the master of a split point and all slaves have
2229       // finished their work at this split point, return from the idle loop.
2230       for (i = 0; sp && i < activeThreads && !sp->is_slave[i]; i++) {}
2231       allFinished = (i == activeThreads);
2232
2233       if (allFinished)
2234       {
2235           // Because sp->slaves[] is reset under lock protection,
2236           // be sure sp->lock has been released before to return.
2237           lock_grab(&(sp->lock));
2238           lock_release(&(sp->lock));
2239
2240           // In helpful master concept a master can help only a sub-tree, and
2241           // because here is all finished is not possible master is booked.
2242           assert(threads[threadID].state == Thread::AVAILABLE);
2243
2244           threads[threadID].state = Thread::SEARCHING;
2245           return;
2246       }
2247   }
2248 }