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