]> git.sesse.net Git - stockfish/blob - src/search.cpp
19cb3b511a27f4844caba4916f1cc4b3a8a4fc8c
[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-2013 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 <algorithm>
21 #include <cassert>
22 #include <cfloat>
23 #include <cmath>
24 #include <cstring>
25 #include <iostream>
26 #include <sstream>
27
28 #include "book.h"
29 #include "evaluate.h"
30 #include "movegen.h"
31 #include "movepick.h"
32 #include "notation.h"
33 #include "search.h"
34 #include "timeman.h"
35 #include "thread.h"
36 #include "tt.h"
37 #include "ucioption.h"
38
39 namespace Search {
40
41   volatile SignalsType Signals;
42   LimitsType Limits;
43   std::vector<RootMove> RootMoves;
44   Position RootPos;
45   Color RootColor;
46   Time::point SearchTime;
47   StateStackPtr SetupStates;
48 }
49
50 using std::string;
51 using Eval::evaluate;
52 using namespace Search;
53
54 namespace {
55
56   // Set to true to force running with one thread. Used for debugging
57   const bool FakeSplit = false;
58
59   // Different node types, used as template parameter
60   enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV };
61
62   // Dynamic razoring margin based on depth
63   inline Value razor_margin(Depth d) { return Value(512 + 16 * int(d)); }
64
65   // Futility lookup tables (initialized at startup) and their access functions
66   int FutilityMoveCounts[2][32]; // [improving][depth]
67
68   inline Value futility_margin(Depth d) {
69     return Value(100 * int(d));
70   }
71
72   // Reduction lookup tables (initialized at startup) and their access function
73   int8_t Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber]
74
75   template <bool PvNode> inline Depth reduction(bool i, Depth d, int mn) {
76
77     return (Depth) Reductions[PvNode][i][std::min(int(d) / ONE_PLY, 63)][std::min(mn, 63)];
78   }
79
80   size_t PVSize, PVIdx;
81   TimeManager TimeMgr;
82   double BestMoveChanges;
83   Value DrawValue[COLOR_NB];
84   HistoryStats History;
85   GainsStats Gains;
86   CountermovesStats Countermoves;
87
88   template <NodeType NT>
89   Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode);
90
91   template <NodeType NT, bool InCheck>
92   Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth);
93
94   void id_loop(Position& pos);
95   Value value_to_tt(Value v, int ply);
96   Value value_from_tt(Value v, int ply);
97   string uci_pv(const Position& pos, int depth, Value alpha, Value beta);
98
99   struct Skill {
100     Skill(int l) : level(l), best(MOVE_NONE) {}
101    ~Skill() {
102       if (enabled()) // Swap best PV line with the sub-optimal one
103           std::swap(RootMoves[0], *std::find(RootMoves.begin(),
104                     RootMoves.end(), best ? best : pick_move()));
105     }
106
107     bool enabled() const { return level < 20; }
108     bool time_to_pick(int depth) const { return depth == 1 + level; }
109     Move pick_move();
110
111     int level;
112     Move best;
113   };
114
115 } // namespace
116
117
118 /// Search::init() is called during startup to initialize various lookup tables
119
120 void Search::init() {
121
122   int d;  // depth (ONE_PLY == 2)
123   int hd; // half depth (ONE_PLY == 1)
124   int mc; // moveCount
125
126   // Init reductions array
127   for (hd = 1; hd < 64; ++hd) for (mc = 1; mc < 64; ++mc)
128   {
129       double    pvRed = log(double(hd)) * log(double(mc)) / 3.0;
130       double nonPVRed = 0.33 + log(double(hd)) * log(double(mc)) / 2.25;
131       Reductions[1][1][hd][mc] = (int8_t) (   pvRed >= 1.0 ? floor(   pvRed * int(ONE_PLY)) : 0);
132       Reductions[0][1][hd][mc] = (int8_t) (nonPVRed >= 1.0 ? floor(nonPVRed * int(ONE_PLY)) : 0);
133
134       Reductions[1][0][hd][mc] = Reductions[1][1][hd][mc];
135       Reductions[0][0][hd][mc] = Reductions[0][1][hd][mc];
136
137       if (Reductions[0][0][hd][mc] > 2 * ONE_PLY)
138           Reductions[0][0][hd][mc] += ONE_PLY;
139
140       else if (Reductions[0][0][hd][mc] > 1 * ONE_PLY)
141           Reductions[0][0][hd][mc] += ONE_PLY / 2;
142   }
143
144   // Init futility move count array
145   for (d = 0; d < 32; ++d)
146   {
147       FutilityMoveCounts[0][d] = int(2.4 + 0.222 * pow(d +  0.0, 1.8));
148       FutilityMoveCounts[1][d] = int(3.0 +   0.3 * pow(d + 0.98, 1.8));
149   }
150 }
151
152
153 /// Search::perft() is our utility to verify move generation. All the leaf nodes
154 /// up to the given depth are generated and counted and the sum returned.
155
156 static size_t perft(Position& pos, Depth depth) {
157
158   StateInfo st;
159   size_t cnt = 0;
160   CheckInfo ci(pos);
161   const bool leaf = depth == 2 * ONE_PLY;
162
163   for (MoveList<LEGAL> it(pos); *it; ++it)
164   {
165       pos.do_move(*it, st, ci, pos.gives_check(*it, ci));
166       cnt += leaf ? MoveList<LEGAL>(pos).size() : ::perft(pos, depth - ONE_PLY);
167       pos.undo_move(*it);
168   }
169   return cnt;
170 }
171
172 size_t Search::perft(Position& pos, Depth depth) {
173   return depth > ONE_PLY ? ::perft(pos, depth) : MoveList<LEGAL>(pos).size();
174 }
175
176 /// Search::think() is the external interface to Stockfish's search, and is
177 /// called by the main thread when the program receives the UCI 'go' command. It
178 /// searches from RootPos and at the end prints the "bestmove" to output.
179
180 void Search::think() {
181
182   static PolyglotBook book; // Defined static to initialize the PRNG only once
183
184   RootColor = RootPos.side_to_move();
185   TimeMgr.init(Limits, RootPos.game_ply(), RootColor);
186
187   if (RootMoves.empty())
188   {
189       RootMoves.push_back(MOVE_NONE);
190       sync_cout << "info depth 0 score "
191                 << score_to_uci(RootPos.checkers() ? -VALUE_MATE : VALUE_DRAW)
192                 << sync_endl;
193
194       goto finalize;
195   }
196
197   if (Options["OwnBook"] && !Limits.infinite && !Limits.mate)
198   {
199       Move bookMove = book.probe(RootPos, Options["Book File"], Options["Best Book Move"]);
200
201       if (bookMove && std::count(RootMoves.begin(), RootMoves.end(), bookMove))
202       {
203           std::swap(RootMoves[0], *std::find(RootMoves.begin(), RootMoves.end(), bookMove));
204           goto finalize;
205       }
206   }
207
208   if (Options["Contempt Factor"] && !Options["UCI_AnalyseMode"])
209   {
210       int cf = Options["Contempt Factor"] * PawnValueMg / 100; // From centipawns
211       cf = cf * Material::game_phase(RootPos) / PHASE_MIDGAME; // Scale down with phase
212       DrawValue[ RootColor] = VALUE_DRAW - Value(cf);
213       DrawValue[~RootColor] = VALUE_DRAW + Value(cf);
214   }
215   else
216       DrawValue[WHITE] = DrawValue[BLACK] = VALUE_DRAW;
217
218   if (Options["Write Search Log"])
219   {
220       Log log(Options["Search Log Filename"]);
221       log << "\nSearching: "  << RootPos.fen()
222           << "\ninfinite: "   << Limits.infinite
223           << " ponder: "      << Limits.ponder
224           << " time: "        << Limits.time[RootColor]
225           << " increment: "   << Limits.inc[RootColor]
226           << " moves to go: " << Limits.movestogo
227           << std::endl;
228   }
229
230   // Reset the threads, still sleeping: will wake up at split time
231   for (size_t i = 0; i < Threads.size(); ++i)
232       Threads[i]->maxPly = 0;
233
234   Threads.sleepWhileIdle = Options["Idle Threads Sleep"];
235   Threads.timer->run = true;
236   Threads.timer->notify_one(); // Wake up the recurring timer
237
238   id_loop(RootPos); // Let's start searching !
239
240   Threads.timer->run = false; // Stop the timer
241   Threads.sleepWhileIdle = true; // Send idle threads to sleep
242
243   if (Options["Write Search Log"])
244   {
245       Time::point elapsed = Time::now() - SearchTime + 1;
246
247       Log log(Options["Search Log Filename"]);
248       log << "Nodes: "          << RootPos.nodes_searched()
249           << "\nNodes/second: " << RootPos.nodes_searched() * 1000 / elapsed
250           << "\nBest move: "    << move_to_san(RootPos, RootMoves[0].pv[0]);
251
252       StateInfo st;
253       RootPos.do_move(RootMoves[0].pv[0], st);
254       log << "\nPonder move: " << move_to_san(RootPos, RootMoves[0].pv[1]) << std::endl;
255       RootPos.undo_move(RootMoves[0].pv[0]);
256   }
257
258 finalize:
259
260   // When search is stopped this info is not printed
261   sync_cout << "info nodes " << RootPos.nodes_searched()
262             << " time " << Time::now() - SearchTime + 1 << sync_endl;
263
264   // When we reach the maximum depth, we can arrive here without a raise of
265   // Signals.stop. However, if we are pondering or in an infinite search,
266   // the UCI protocol states that we shouldn't print the best move before the
267   // GUI sends a "stop" or "ponderhit" command. We therefore simply wait here
268   // until the GUI sends one of those commands (which also raises Signals.stop).
269   if (!Signals.stop && (Limits.ponder || Limits.infinite))
270   {
271       Signals.stopOnPonderhit = true;
272       RootPos.this_thread()->wait_for(Signals.stop);
273   }
274
275   // Best move could be MOVE_NONE when searching on a stalemate position
276   sync_cout << "bestmove " << move_to_uci(RootMoves[0].pv[0], RootPos.is_chess960())
277             << " ponder "  << move_to_uci(RootMoves[0].pv[1], RootPos.is_chess960())
278             << sync_endl;
279 }
280
281
282 namespace {
283
284   // id_loop() is the main iterative deepening loop. It calls search() repeatedly
285   // with increasing depth until the allocated thinking time has been consumed,
286   // user stops the search, or the maximum search depth is reached.
287
288   void id_loop(Position& pos) {
289
290     Stack stack[MAX_PLY_PLUS_6], *ss = stack+2; // To allow referencing (ss-2)
291     int depth;
292     Value bestValue, alpha, beta, delta;
293
294     std::memset(ss-2, 0, 5 * sizeof(Stack));
295     (ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains
296
297     depth = 0;
298     BestMoveChanges = 0;
299     bestValue = delta = alpha = -VALUE_INFINITE;
300     beta = VALUE_INFINITE;
301
302     TT.new_search();
303     History.clear();
304     Gains.clear();
305     Countermoves.clear();
306
307     PVSize = Options["MultiPV"];
308     Skill skill(Options["Skill Level"]);
309
310     // Do we have to play with skill handicap? In this case enable MultiPV search
311     // that we will use behind the scenes to retrieve a set of possible moves.
312     if (skill.enabled() && PVSize < 4)
313         PVSize = 4;
314
315     PVSize = std::min(PVSize, RootMoves.size());
316
317     // Iterative deepening loop until requested to stop or target depth reached
318     while (++depth <= MAX_PLY && !Signals.stop && (!Limits.depth || depth <= Limits.depth))
319     {
320         // Age out PV variability metric
321         BestMoveChanges *= 0.8;
322
323         // Save the last iteration's scores before first PV line is searched and
324         // all the move scores except the (new) PV are set to -VALUE_INFINITE.
325         for (size_t i = 0; i < RootMoves.size(); ++i)
326             RootMoves[i].prevScore = RootMoves[i].score;
327
328         // MultiPV loop. We perform a full root search for each PV line
329         for (PVIdx = 0; PVIdx < PVSize && !Signals.stop; ++PVIdx)
330         {
331             // Reset aspiration window starting size
332             if (depth >= 5)
333             {
334                 delta = Value(16);
335                 alpha = std::max(RootMoves[PVIdx].prevScore - delta,-VALUE_INFINITE);
336                 beta  = std::min(RootMoves[PVIdx].prevScore + delta, VALUE_INFINITE);
337             }
338
339             // Start with a small aspiration window and, in the case of a fail
340             // high/low, re-search with a bigger window until we're not failing
341             // high/low anymore.
342             while (true)
343             {
344                 bestValue = search<Root>(pos, ss, alpha, beta, depth * ONE_PLY, false);
345
346                 // Bring the best move to the front. It is critical that sorting
347                 // is done with a stable algorithm because all the values but the
348                 // first and eventually the new best one are set to -VALUE_INFINITE
349                 // and we want to keep the same order for all the moves except the
350                 // new PV that goes to the front. Note that in case of MultiPV
351                 // search the already searched PV lines are preserved.
352                 std::stable_sort(RootMoves.begin() + PVIdx, RootMoves.end());
353
354                 // Write PV back to transposition table in case the relevant
355                 // entries have been overwritten during the search.
356                 for (size_t i = 0; i <= PVIdx; ++i)
357                     RootMoves[i].insert_pv_in_tt(pos);
358
359                 // If search has been stopped break immediately. Sorting and
360                 // writing PV back to TT is safe because RootMoves is still
361                 // valid, although it refers to previous iteration.
362                 if (Signals.stop)
363                     break;
364
365                 // When failing high/low give some update (without cluttering
366                 // the UI) before a re-search.
367                 if (  (bestValue <= alpha || bestValue >= beta)
368                     && Time::now() - SearchTime > 3000)
369                     sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
370
371                 // In case of failing low/high increase aspiration window and
372                 // re-search, otherwise exit the loop.
373                 if (bestValue <= alpha)
374                 {
375                     alpha = std::max(bestValue - delta, -VALUE_INFINITE);
376
377                     Signals.failedLowAtRoot = true;
378                     Signals.stopOnPonderhit = false;
379                 }
380                 else if (bestValue >= beta)
381                     beta = std::min(bestValue + delta, VALUE_INFINITE);
382
383                 else
384                     break;
385
386                 delta += delta / 2;
387
388                 assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
389             }
390
391             // Sort the PV lines searched so far and update the GUI
392             std::stable_sort(RootMoves.begin(), RootMoves.begin() + PVIdx + 1);
393
394             if (PVIdx + 1 == PVSize || Time::now() - SearchTime > 3000)
395                 sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
396         }
397
398         // If skill levels are enabled and time is up, pick a sub-optimal best move
399         if (skill.enabled() && skill.time_to_pick(depth))
400             skill.pick_move();
401
402         if (Options["Write Search Log"])
403         {
404             RootMove& rm = RootMoves[0];
405             if (skill.best != MOVE_NONE)
406                 rm = *std::find(RootMoves.begin(), RootMoves.end(), skill.best);
407
408             Log log(Options["Search Log Filename"]);
409             log << pretty_pv(pos, depth, rm.score, Time::now() - SearchTime, &rm.pv[0])
410                 << std::endl;
411         }
412
413         // Have we found a "mate in x"?
414         if (   Limits.mate
415             && bestValue >= VALUE_MATE_IN_MAX_PLY
416             && VALUE_MATE - bestValue <= 2 * Limits.mate)
417             Signals.stop = true;
418
419         // Do we have time for the next iteration? Can we stop searching now?
420         if (Limits.use_time_management() && !Signals.stop && !Signals.stopOnPonderhit)
421         {
422             bool stop = false; // Local variable, not the volatile Signals.stop
423
424             // Take some extra time if the best move has changed
425             if (depth > 4 && depth < 50 &&  PVSize == 1)
426                 TimeMgr.pv_instability(BestMoveChanges);
427
428             // Stop the search if most of the available time has been used. We
429             // probably don't have enough time to search the first move at the
430             // next iteration anyway.
431             if (Time::now() - SearchTime > (TimeMgr.available_time() * 62) / 100)
432                 stop = true;
433
434             // Stop the search early if one move seems to be much better than others
435             if (    depth >= 12
436                 &&  BestMoveChanges <= DBL_EPSILON
437                 && !stop
438                 &&  PVSize == 1
439                 &&  bestValue > VALUE_MATED_IN_MAX_PLY
440                 && (   RootMoves.size() == 1
441                     || Time::now() - SearchTime > (TimeMgr.available_time() * 20) / 100))
442             {
443                 Value rBeta = bestValue - 2 * PawnValueMg;
444                 ss->excludedMove = RootMoves[0].pv[0];
445                 ss->skipNullMove = true;
446                 Value v = search<NonPV>(pos, ss, rBeta - 1, rBeta, (depth - 3) * ONE_PLY, true);
447                 ss->skipNullMove = false;
448                 ss->excludedMove = MOVE_NONE;
449
450                 if (v < rBeta)
451                     stop = true;
452             }
453
454             if (stop)
455             {
456                 // If we are allowed to ponder do not stop the search now but
457                 // keep pondering until the GUI sends "ponderhit" or "stop".
458                 if (Limits.ponder)
459                     Signals.stopOnPonderhit = true;
460                 else
461                     Signals.stop = true;
462             }
463         }
464     }
465   }
466
467
468   // search<>() is the main search function for both PV and non-PV nodes and for
469   // normal and SplitPoint nodes. When called just after a split point the search
470   // is simpler because we have already probed the hash table, done a null move
471   // search, and searched the first move before splitting, so we don't have to
472   // repeat all this work again. We also don't need to store anything to the hash
473   // table here: This is taken care of after we return from the split point.
474
475   template <NodeType NT>
476   Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode) {
477
478     const bool PvNode   = (NT == PV || NT == Root || NT == SplitPointPV || NT == SplitPointRoot);
479     const bool SpNode   = (NT == SplitPointPV || NT == SplitPointNonPV || NT == SplitPointRoot);
480     const bool RootNode = (NT == Root || NT == SplitPointRoot);
481
482     assert(alpha >= -VALUE_INFINITE && alpha < beta && beta <= VALUE_INFINITE);
483     assert(PvNode || (alpha == beta - 1));
484     assert(depth > DEPTH_ZERO);
485
486     Move quietsSearched[64];
487     StateInfo st;
488     const TTEntry *tte;
489     SplitPoint* splitPoint;
490     Key posKey;
491     Move ttMove, move, excludedMove, bestMove;
492     Depth ext, newDepth, predictedDepth;
493     Value bestValue, value, ttValue, eval, nullValue, futilityValue;
494     bool inCheck, givesCheck, pvMove, singularExtensionNode, improving;
495     bool captureOrPromotion, dangerous, doFullDepthSearch;
496     int moveCount, quietCount;
497
498     // Step 1. Initialize node
499     Thread* thisThread = pos.this_thread();
500     inCheck = pos.checkers();
501
502     if (SpNode)
503     {
504         splitPoint = ss->splitPoint;
505         bestMove   = splitPoint->bestMove;
506         bestValue  = splitPoint->bestValue;
507         tte = NULL;
508         ttMove = excludedMove = MOVE_NONE;
509         ttValue = VALUE_NONE;
510
511         assert(splitPoint->bestValue > -VALUE_INFINITE && splitPoint->moveCount > 0);
512
513         goto moves_loop;
514     }
515
516     moveCount = quietCount = 0;
517     bestValue = -VALUE_INFINITE;
518     ss->currentMove = (ss+1)->excludedMove = bestMove = MOVE_NONE;
519     ss->ply = (ss-1)->ply + 1;
520     (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO;
521     (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE;
522
523     // Used to send selDepth info to GUI
524     if (PvNode && thisThread->maxPly < ss->ply)
525         thisThread->maxPly = ss->ply;
526
527     if (!RootNode)
528     {
529         // Step 2. Check for aborted search and immediate draw
530         if (Signals.stop || pos.is_draw() || ss->ply > MAX_PLY)
531             return DrawValue[pos.side_to_move()];
532
533         // Step 3. Mate distance pruning. Even if we mate at the next move our score
534         // would be at best mate_in(ss->ply+1), but if alpha is already bigger because
535         // a shorter mate was found upward in the tree then there is no need to search
536         // because we will never beat the current alpha. Same logic but with reversed
537         // signs applies also in the opposite condition of being mated instead of giving
538         // mate. In this case return a fail-high score.
539         alpha = std::max(mated_in(ss->ply), alpha);
540         beta = std::min(mate_in(ss->ply+1), beta);
541         if (alpha >= beta)
542             return alpha;
543     }
544
545     // Step 4. Transposition table lookup
546     // We don't want the score of a partial search to overwrite a previous full search
547     // TT value, so we use a different position key in case of an excluded move.
548     excludedMove = ss->excludedMove;
549     posKey = excludedMove ? pos.exclusion_key() : pos.key();
550     tte = TT.probe(posKey);
551     ttMove = RootNode ? RootMoves[PVIdx].pv[0] : tte ? tte->move() : MOVE_NONE;
552     ttValue = tte ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE;
553
554     // At PV nodes we check for exact scores, whilst at non-PV nodes we check for
555     // a fail high/low. The biggest advantage to probing at PV nodes is to have a
556     // smooth experience in analysis mode. We don't probe at Root nodes otherwise
557     // we should also update RootMoveList to avoid bogus output.
558     if (   !RootNode
559         && tte
560         && tte->depth() >= depth
561         && ttValue != VALUE_NONE // Only in case of TT access race
562         && (           PvNode ?  tte->bound() == BOUND_EXACT
563             : ttValue >= beta ? (tte->bound() &  BOUND_LOWER)
564                               : (tte->bound() &  BOUND_UPPER)))
565     {
566         TT.refresh(tte);
567         ss->currentMove = ttMove; // Can be MOVE_NONE
568
569         // Update killers, history, and counter move on TT hit
570         if (    ttValue >= beta
571             &&  ttMove
572             && !pos.capture_or_promotion(ttMove)
573             && !inCheck)
574         {
575             if (ss->killers[0] != ttMove)
576             {
577                 ss->killers[1] = ss->killers[0];
578                 ss->killers[0] = ttMove;
579             }
580
581             Value bonus = Value(int(depth) * int(depth));
582             History.update(pos.moved_piece(ttMove), to_sq(ttMove), bonus);
583
584             if (is_ok((ss-1)->currentMove))
585             {
586                 Square prevMoveSq = to_sq((ss-1)->currentMove);
587                 Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, ttMove);
588             }
589         }
590         return ttValue;
591     }
592
593     // Step 5. Evaluate the position statically and update parent's gain statistics
594     if (inCheck)
595     {
596         ss->staticEval = eval = VALUE_NONE;
597         goto moves_loop;
598     }
599
600     else if (tte)
601     {
602         // Never assume anything on values stored in TT
603         if ((ss->staticEval = eval = tte->eval_value()) == VALUE_NONE)
604             eval = ss->staticEval = evaluate(pos);
605
606         // Can ttValue be used as a better position evaluation?
607         if (ttValue != VALUE_NONE)
608             if (tte->bound() & (ttValue > eval ? BOUND_LOWER : BOUND_UPPER))
609                 eval = ttValue;
610     }
611     else
612     {
613         eval = ss->staticEval = evaluate(pos);
614         TT.store(posKey, VALUE_NONE, BOUND_NONE, DEPTH_NONE, MOVE_NONE, ss->staticEval);
615     }
616
617     if (   !pos.captured_piece_type()
618         &&  ss->staticEval != VALUE_NONE
619         && (ss-1)->staticEval != VALUE_NONE
620         && (move = (ss-1)->currentMove) != MOVE_NULL
621         &&  type_of(move) == NORMAL)
622     {
623         Square to = to_sq(move);
624         Gains.update(pos.piece_on(to), to, -(ss-1)->staticEval - ss->staticEval);
625     }
626
627     // Step 6. Razoring (skipped when in check)
628     if (   !PvNode
629         &&  depth < 4 * ONE_PLY
630         &&  eval + razor_margin(depth) < beta
631         &&  ttMove == MOVE_NONE
632         &&  abs(beta) < VALUE_MATE_IN_MAX_PLY
633         && !pos.pawn_on_7th(pos.side_to_move()))
634     {
635         Value rbeta = beta - razor_margin(depth);
636         Value v = qsearch<NonPV, false>(pos, ss, rbeta-1, rbeta, DEPTH_ZERO);
637         if (v < rbeta)
638             // Logically we should return (v + razor_margin(depth)), but
639             // surprisingly this performed slightly weaker in tests.
640             return v;
641     }
642
643     // Step 7. Futility pruning: child node (skipped when in check)
644     if (   !PvNode
645         && !ss->skipNullMove
646         &&  depth < 7 * ONE_PLY
647         &&  eval - futility_margin(depth) >= beta
648         &&  abs(beta) < VALUE_MATE_IN_MAX_PLY
649         &&  abs(eval) < VALUE_KNOWN_WIN
650         &&  pos.non_pawn_material(pos.side_to_move()))
651         return eval - futility_margin(depth);
652
653     // Step 8. Null move search with verification search (is omitted in PV nodes)
654     if (   !PvNode
655         && !ss->skipNullMove
656         &&  depth >= 2 * ONE_PLY
657         &&  eval >= beta
658         &&  abs(beta) < VALUE_MATE_IN_MAX_PLY
659         &&  pos.non_pawn_material(pos.side_to_move()))
660     {
661         ss->currentMove = MOVE_NULL;
662
663         // Null move dynamic reduction based on depth
664         Depth R = 3 * ONE_PLY + depth / 4;
665
666         // Null move dynamic reduction based on value
667         if (eval - PawnValueMg > beta)
668             R += ONE_PLY;
669
670         pos.do_null_move(st);
671         (ss+1)->skipNullMove = true;
672         nullValue = depth-R < ONE_PLY ? -qsearch<NonPV, false>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
673                                       : - search<NonPV>(pos, ss+1, -beta, -alpha, depth-R, !cutNode);
674         (ss+1)->skipNullMove = false;
675         pos.undo_null_move();
676
677         if (nullValue >= beta)
678         {
679             // Do not return unproven mate scores
680             if (nullValue >= VALUE_MATE_IN_MAX_PLY)
681                 nullValue = beta;
682
683             if (depth < 12 * ONE_PLY)
684                 return nullValue;
685
686             // Do verification search at high depths
687             ss->skipNullMove = true;
688             Value v = search<NonPV>(pos, ss, alpha, beta, depth-R, false);
689             ss->skipNullMove = false;
690
691             if (v >= beta)
692                 return nullValue;
693         }
694     }
695
696     // Step 9. ProbCut (skipped when in check)
697     // If we have a very good capture (i.e. SEE > seeValues[captured_piece_type])
698     // and a reduced search returns a value much above beta, we can (almost) safely
699     // prune the previous move.
700     if (   !PvNode
701         &&  depth >= 5 * ONE_PLY
702         && !ss->skipNullMove
703         &&  abs(beta) < VALUE_MATE_IN_MAX_PLY)
704     {
705         Value rbeta = beta + 200;
706         Depth rdepth = depth - ONE_PLY - 3 * ONE_PLY;
707
708         assert(rdepth >= ONE_PLY);
709         assert((ss-1)->currentMove != MOVE_NONE);
710         assert((ss-1)->currentMove != MOVE_NULL);
711
712         MovePicker mp(pos, ttMove, History, pos.captured_piece_type());
713         CheckInfo ci(pos);
714
715         while ((move = mp.next_move<false>()) != MOVE_NONE)
716             if (pos.legal(move, ci.pinned))
717             {
718                 ss->currentMove = move;
719                 pos.do_move(move, st, ci, pos.gives_check(move, ci));
720                 value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth, !cutNode);
721                 pos.undo_move(move);
722                 if (value >= rbeta)
723                     return value;
724             }
725     }
726
727     // Step 10. Internal iterative deepening (skipped when in check)
728     if (   depth >= (PvNode ? 5 * ONE_PLY : 8 * ONE_PLY)
729         && ttMove == MOVE_NONE
730         && (PvNode || ss->staticEval + Value(256) >= beta))
731     {
732         Depth d = depth - 2 * ONE_PLY - (PvNode ? DEPTH_ZERO : depth / 4);
733
734         ss->skipNullMove = true;
735         search<PvNode ? PV : NonPV>(pos, ss, alpha, beta, d, true);
736         ss->skipNullMove = false;
737
738         tte = TT.probe(posKey);
739         ttMove = tte ? tte->move() : MOVE_NONE;
740     }
741
742 moves_loop: // When in check and at SpNode search starts from here
743
744     Square prevMoveSq = to_sq((ss-1)->currentMove);
745     Move countermoves[] = { Countermoves[pos.piece_on(prevMoveSq)][prevMoveSq].first,
746                             Countermoves[pos.piece_on(prevMoveSq)][prevMoveSq].second };
747
748     MovePicker mp(pos, ttMove, depth, History, countermoves, ss);
749     CheckInfo ci(pos);
750     value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc
751     improving =   ss->staticEval >= (ss-2)->staticEval
752                || ss->staticEval == VALUE_NONE
753                ||(ss-2)->staticEval == VALUE_NONE;
754
755     singularExtensionNode =   !RootNode
756                            && !SpNode
757                            &&  depth >= 8 * ONE_PLY
758                            &&  ttMove != MOVE_NONE
759                            && !excludedMove // Recursive singular search is not allowed
760                            && (tte->bound() & BOUND_LOWER)
761                            &&  tte->depth() >= depth - 3 * ONE_PLY;
762
763     // Step 11. Loop through moves
764     // Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
765     while ((move = mp.next_move<SpNode>()) != MOVE_NONE)
766     {
767       assert(is_ok(move));
768
769       if (move == excludedMove)
770           continue;
771
772       // At root obey the "searchmoves" option and skip moves not listed in Root
773       // Move List. As a consequence any illegal move is also skipped. In MultiPV
774       // mode we also skip PV moves which have been already searched.
775       if (RootNode && !std::count(RootMoves.begin() + PVIdx, RootMoves.end(), move))
776           continue;
777
778       if (SpNode)
779       {
780           // Shared counter cannot be decremented later if the move turns out to be illegal
781           if (!pos.legal(move, ci.pinned))
782               continue;
783
784           moveCount = ++splitPoint->moveCount;
785           splitPoint->mutex.unlock();
786       }
787       else
788           ++moveCount;
789
790       if (RootNode)
791       {
792           Signals.firstRootMove = (moveCount == 1);
793
794           if (thisThread == Threads.main() && Time::now() - SearchTime > 3000)
795               sync_cout << "info depth " << depth / ONE_PLY
796                         << " currmove " << move_to_uci(move, pos.is_chess960())
797                         << " currmovenumber " << moveCount + PVIdx << sync_endl;
798       }
799
800       ext = DEPTH_ZERO;
801       captureOrPromotion = pos.capture_or_promotion(move);
802       givesCheck = pos.gives_check(move, ci);
803       dangerous =   givesCheck
804                  || type_of(move) != NORMAL
805                  || pos.advanced_pawn_push(move);
806
807       // Step 12. Extend checks
808       if (givesCheck && pos.see_sign(move) >= 0)
809           ext = ONE_PLY;
810
811       // Singular extension search. If all moves but one fail low on a search of
812       // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
813       // is singular and should be extended. To verify this we do a reduced search
814       // on all the other moves but the ttMove and if the result is lower than
815       // ttValue minus a margin then we extend the ttMove.
816       if (    singularExtensionNode
817           &&  move == ttMove
818           && !ext
819           &&  pos.legal(move, ci.pinned)
820           &&  abs(ttValue) < VALUE_KNOWN_WIN)
821       {
822           assert(ttValue != VALUE_NONE);
823
824           Value rBeta = ttValue - int(depth);
825           ss->excludedMove = move;
826           ss->skipNullMove = true;
827           value = search<NonPV>(pos, ss, rBeta - 1, rBeta, depth / 2, cutNode);
828           ss->skipNullMove = false;
829           ss->excludedMove = MOVE_NONE;
830
831           if (value < rBeta)
832               ext = ONE_PLY;
833       }
834
835       // Update the current move (this must be done after singular extension search)
836       newDepth = depth - ONE_PLY + ext;
837
838       // Step 13. Pruning at shallow depth (exclude PV nodes)
839       if (   !PvNode
840           && !captureOrPromotion
841           && !inCheck
842           && !dangerous
843        /* &&  move != ttMove Already implicit in the next condition */
844           &&  bestValue > VALUE_MATED_IN_MAX_PLY)
845       {
846           // Move count based pruning
847           if (   depth < 16 * ONE_PLY
848               && moveCount >= FutilityMoveCounts[improving][depth] )
849           {
850               if (SpNode)
851                   splitPoint->mutex.lock();
852
853               continue;
854           }
855
856           predictedDepth = newDepth - reduction<PvNode>(improving, depth, moveCount);
857
858           // Futility pruning: parent node
859           if (predictedDepth < 7 * ONE_PLY)
860           {
861               futilityValue = ss->staticEval + futility_margin(predictedDepth)
862                             + Value(128) + Gains[pos.moved_piece(move)][to_sq(move)];
863
864               if (futilityValue <= alpha)
865               {
866                   bestValue = std::max(bestValue, futilityValue);
867
868                   if (SpNode)
869                   {
870                       splitPoint->mutex.lock();
871                       if (bestValue > splitPoint->bestValue)
872                           splitPoint->bestValue = bestValue;
873                   }
874                   continue;
875               }
876           }
877
878           // Prune moves with negative SEE at low depths
879           if (predictedDepth < 4 * ONE_PLY && pos.see_sign(move) < 0)
880           {
881               if (SpNode)
882                   splitPoint->mutex.lock();
883
884               continue;
885           }
886       }
887
888       // Check for legality just before making the move
889       if (!RootNode && !SpNode && !pos.legal(move, ci.pinned))
890       {
891           moveCount--;
892           continue;
893       }
894
895       pvMove = PvNode && moveCount == 1;
896       ss->currentMove = move;
897       if (!SpNode && !captureOrPromotion && quietCount < 64)
898           quietsSearched[quietCount++] = move;
899
900       // Step 14. Make the move
901       pos.do_move(move, st, ci, givesCheck);
902
903       // Step 15. Reduced depth search (LMR). If the move fails high it will be
904       // re-searched at full depth.
905       if (    depth >= 3 * ONE_PLY
906           && !pvMove
907           && !captureOrPromotion
908           &&  move != ttMove
909           &&  move != ss->killers[0]
910           &&  move != ss->killers[1])
911       {
912           ss->reduction = reduction<PvNode>(improving, depth, moveCount);
913
914           if (!PvNode && cutNode)
915               ss->reduction += ONE_PLY;
916
917           else if (History[pos.piece_on(to_sq(move))][to_sq(move)] < 0)
918               ss->reduction += ONE_PLY / 2;
919
920           if (move == countermoves[0] || move == countermoves[1])
921               ss->reduction = std::max(DEPTH_ZERO, ss->reduction - ONE_PLY);
922
923           Depth d = std::max(newDepth - ss->reduction, ONE_PLY);
924           if (SpNode)
925               alpha = splitPoint->alpha;
926
927           value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d, true);
928
929           // Research at intermediate depth if reduction is very high
930           if (value > alpha && ss->reduction >= 4 * ONE_PLY)
931           {
932               Depth d2 = std::max(newDepth - 2 * ONE_PLY, ONE_PLY);
933               value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d2, true);
934           }
935
936           doFullDepthSearch = (value > alpha && ss->reduction != DEPTH_ZERO);
937           ss->reduction = DEPTH_ZERO;
938       }
939       else
940           doFullDepthSearch = !pvMove;
941
942       // Step 16. Full depth search, when LMR is skipped or fails high
943       if (doFullDepthSearch)
944       {
945           if (SpNode)
946               alpha = splitPoint->alpha;
947
948           value = newDepth < ONE_PLY ?
949                           givesCheck ? -qsearch<NonPV,  true>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
950                                      : -qsearch<NonPV, false>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
951                                      : - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode);
952       }
953
954       // For PV nodes only, do a full PV search on the first move or after a fail
955       // high (in the latter case search only if value < beta), otherwise let the
956       // parent node fail low with value <= alpha and to try another move.
957       if (PvNode && (pvMove || (value > alpha && (RootNode || value < beta))))
958           value = newDepth < ONE_PLY ?
959                           givesCheck ? -qsearch<PV,  true>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
960                                      : -qsearch<PV, false>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
961                                      : - search<PV>(pos, ss+1, -beta, -alpha, newDepth, false);
962       // Step 17. Undo move
963       pos.undo_move(move);
964
965       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
966
967       // Step 18. Check for new best move
968       if (SpNode)
969       {
970           splitPoint->mutex.lock();
971           bestValue = splitPoint->bestValue;
972           alpha = splitPoint->alpha;
973       }
974
975       // Finished searching the move. If Signals.stop is true, the search
976       // was aborted because the user interrupted the search or because we
977       // ran out of time. In this case, the return value of the search cannot
978       // be trusted, and we don't update the best move and/or PV.
979       if (Signals.stop || thisThread->cutoff_occurred())
980           return value; // To avoid returning VALUE_INFINITE
981
982       if (RootNode)
983       {
984           RootMove& rm = *std::find(RootMoves.begin(), RootMoves.end(), move);
985
986           // PV move or new best move ?
987           if (pvMove || value > alpha)
988           {
989               rm.score = value;
990               rm.extract_pv_from_tt(pos);
991
992               // We record how often the best move has been changed in each
993               // iteration. This information is used for time management: When
994               // the best move changes frequently, we allocate some more time.
995               if (!pvMove)
996                   ++BestMoveChanges;
997           }
998           else
999               // All other moves but the PV are set to the lowest value: this is
1000               // not a problem when sorting because the sort is stable and the
1001               // move position in the list is preserved - just the PV is pushed up.
1002               rm.score = -VALUE_INFINITE;
1003       }
1004
1005       if (value > bestValue)
1006       {
1007           bestValue = SpNode ? splitPoint->bestValue = value : value;
1008
1009           if (value > alpha)
1010           {
1011               bestMove = SpNode ? splitPoint->bestMove = move : move;
1012
1013               if (PvNode && value < beta) // Update alpha! Always alpha < beta
1014                   alpha = SpNode ? splitPoint->alpha = value : value;
1015               else
1016               {
1017                   assert(value >= beta); // Fail high
1018
1019                   if (SpNode)
1020                       splitPoint->cutoff = true;
1021
1022                   break;
1023               }
1024           }
1025       }
1026
1027       // Step 19. Check for splitting the search
1028       if (   !SpNode
1029           &&  depth >= Threads.minimumSplitDepth
1030           &&  Threads.available_slave(thisThread)
1031           &&  thisThread->splitPointsSize < MAX_SPLITPOINTS_PER_THREAD)
1032       {
1033           assert(bestValue < beta);
1034
1035           thisThread->split<FakeSplit>(pos, ss, alpha, beta, &bestValue, &bestMove,
1036                                        depth, moveCount, &mp, NT, cutNode);
1037           if (bestValue >= beta)
1038               break;
1039       }
1040     }
1041
1042     if (SpNode)
1043         return bestValue;
1044
1045     // Step 20. Check for mate and stalemate
1046     // All legal moves have been searched and if there are no legal moves, it
1047     // must be mate or stalemate. Note that we can have a false positive in
1048     // case of Signals.stop or thread.cutoff_occurred() are set, but this is
1049     // harmless because return value is discarded anyhow in the parent nodes.
1050     // If we are in a singular extension search then return a fail low score.
1051     // A split node has at least one move - the one tried before to be splitted.
1052     if (!moveCount)
1053         return  excludedMove ? alpha
1054               : inCheck ? mated_in(ss->ply) : DrawValue[pos.side_to_move()];
1055
1056     // If we have pruned all the moves without searching return a fail-low score
1057     if (bestValue == -VALUE_INFINITE)
1058         bestValue = alpha;
1059
1060     TT.store(posKey, value_to_tt(bestValue, ss->ply),
1061              bestValue >= beta  ? BOUND_LOWER :
1062              PvNode && bestMove ? BOUND_EXACT : BOUND_UPPER,
1063              depth, bestMove, ss->staticEval);
1064
1065     // Quiet best move: update killers, history and countermoves
1066     if (    bestValue >= beta
1067         && !pos.capture_or_promotion(bestMove)
1068         && !inCheck)
1069     {
1070         if (ss->killers[0] != bestMove)
1071         {
1072             ss->killers[1] = ss->killers[0];
1073             ss->killers[0] = bestMove;
1074         }
1075
1076         // Increase history value of the cut-off move and decrease all the other
1077         // played non-capture moves.
1078         Value bonus = Value(int(depth) * int(depth));
1079         History.update(pos.moved_piece(bestMove), to_sq(bestMove), bonus);
1080         for (int i = 0; i < quietCount - 1; ++i)
1081         {
1082             Move m = quietsSearched[i];
1083             History.update(pos.moved_piece(m), to_sq(m), -bonus);
1084         }
1085
1086         if (is_ok((ss-1)->currentMove))
1087             Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, bestMove);
1088     }
1089
1090     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1091
1092     return bestValue;
1093   }
1094
1095
1096   // qsearch() is the quiescence search function, which is called by the main
1097   // search function when the remaining depth is zero (or, to be more precise,
1098   // less than ONE_PLY).
1099
1100   template <NodeType NT, bool InCheck>
1101   Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth) {
1102
1103     const bool PvNode = (NT == PV);
1104
1105     assert(NT == PV || NT == NonPV);
1106     assert(InCheck == !!pos.checkers());
1107     assert(alpha >= -VALUE_INFINITE && alpha < beta && beta <= VALUE_INFINITE);
1108     assert(PvNode || (alpha == beta - 1));
1109     assert(depth <= DEPTH_ZERO);
1110
1111     StateInfo st;
1112     const TTEntry* tte;
1113     Key posKey;
1114     Move ttMove, move, bestMove;
1115     Value bestValue, value, ttValue, futilityValue, futilityBase, oldAlpha;
1116     bool givesCheck, evasionPrunable;
1117     Depth ttDepth;
1118
1119     // To flag BOUND_EXACT a node with eval above alpha and no available moves
1120     if (PvNode)
1121         oldAlpha = alpha;
1122
1123     ss->currentMove = bestMove = MOVE_NONE;
1124     ss->ply = (ss-1)->ply + 1;
1125
1126     // Check for an instant draw or if the maximum ply has been reached
1127     if (pos.is_draw() || ss->ply > MAX_PLY)
1128         return DrawValue[pos.side_to_move()];
1129
1130     // Decide whether or not to include checks: this fixes also the type of
1131     // TT entry depth that we are going to use. Note that in qsearch we use
1132     // only two types of depth in TT: DEPTH_QS_CHECKS or DEPTH_QS_NO_CHECKS.
1133     ttDepth = InCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS
1134                                                   : DEPTH_QS_NO_CHECKS;
1135
1136     // Transposition table lookup
1137     posKey = pos.key();
1138     tte = TT.probe(posKey);
1139     ttMove = tte ? tte->move() : MOVE_NONE;
1140     ttValue = tte ? value_from_tt(tte->value(),ss->ply) : VALUE_NONE;
1141
1142     if (   tte
1143         && tte->depth() >= ttDepth
1144         && ttValue != VALUE_NONE // Only in case of TT access race
1145         && (           PvNode ?  tte->bound() == BOUND_EXACT
1146             : ttValue >= beta ? (tte->bound() &  BOUND_LOWER)
1147                               : (tte->bound() &  BOUND_UPPER)))
1148     {
1149         ss->currentMove = ttMove; // Can be MOVE_NONE
1150         return ttValue;
1151     }
1152
1153     // Evaluate the position statically
1154     if (InCheck)
1155     {
1156         ss->staticEval = VALUE_NONE;
1157         bestValue = futilityBase = -VALUE_INFINITE;
1158     }
1159     else
1160     {
1161         if (tte)
1162         {
1163             // Never assume anything on values stored in TT
1164             if ((ss->staticEval = bestValue = tte->eval_value()) == VALUE_NONE)
1165                 ss->staticEval = bestValue = evaluate(pos);
1166
1167             // Can ttValue be used as a better position evaluation?
1168             if (ttValue != VALUE_NONE)
1169                 if (tte->bound() & (ttValue > bestValue ? BOUND_LOWER : BOUND_UPPER))
1170                     bestValue = ttValue;
1171         }
1172         else
1173             ss->staticEval = bestValue = evaluate(pos);
1174
1175         // Stand pat. Return immediately if static value is at least beta
1176         if (bestValue >= beta)
1177         {
1178             if (!tte)
1179                 TT.store(pos.key(), value_to_tt(bestValue, ss->ply), BOUND_LOWER,
1180                          DEPTH_NONE, MOVE_NONE, ss->staticEval);
1181
1182             return bestValue;
1183         }
1184
1185         if (PvNode && bestValue > alpha)
1186             alpha = bestValue;
1187
1188         futilityBase = bestValue + Value(128);
1189     }
1190
1191     // Initialize a MovePicker object for the current position, and prepare
1192     // to search the moves. Because the depth is <= 0 here, only captures,
1193     // queen promotions and checks (only if depth >= DEPTH_QS_CHECKS) will
1194     // be generated.
1195     MovePicker mp(pos, ttMove, depth, History, to_sq((ss-1)->currentMove));
1196     CheckInfo ci(pos);
1197
1198     // Loop through the moves until no moves remain or a beta cutoff occurs
1199     while ((move = mp.next_move<false>()) != MOVE_NONE)
1200     {
1201       assert(is_ok(move));
1202
1203       givesCheck = pos.gives_check(move, ci);
1204
1205       // Futility pruning
1206       if (   !PvNode
1207           && !InCheck
1208           && !givesCheck
1209           &&  move != ttMove
1210           &&  futilityBase > -VALUE_KNOWN_WIN
1211           && !pos.advanced_pawn_push(move))
1212       {
1213           assert(type_of(move) != ENPASSANT); // Due to !pos.advanced_pawn_push
1214
1215           futilityValue = futilityBase + PieceValue[EG][pos.piece_on(to_sq(move))];
1216
1217           if (futilityValue < beta)
1218           {
1219               bestValue = std::max(bestValue, futilityValue);
1220               continue;
1221           }
1222
1223           if (futilityBase < beta && pos.see(move) <= 0)
1224           {
1225               bestValue = std::max(bestValue, futilityBase);
1226               continue;
1227           }
1228       }
1229
1230       // Detect non-capture evasions that are candidates to be pruned
1231       evasionPrunable =    InCheck
1232                        &&  bestValue > VALUE_MATED_IN_MAX_PLY
1233                        && !pos.capture(move)
1234                        && !pos.can_castle(pos.side_to_move());
1235
1236       // Don't search moves with negative SEE values
1237       if (   !PvNode
1238           && (!InCheck || evasionPrunable)
1239           &&  move != ttMove
1240           &&  type_of(move) != PROMOTION
1241           &&  pos.see_sign(move) < 0)
1242           continue;
1243
1244       // Check for legality just before making the move
1245       if (!pos.legal(move, ci.pinned))
1246           continue;
1247
1248       ss->currentMove = move;
1249
1250       // Make and search the move
1251       pos.do_move(move, st, ci, givesCheck);
1252       value = givesCheck ? -qsearch<NT,  true>(pos, ss+1, -beta, -alpha, depth - ONE_PLY)
1253                          : -qsearch<NT, false>(pos, ss+1, -beta, -alpha, depth - ONE_PLY);
1254       pos.undo_move(move);
1255
1256       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
1257
1258       // Check for new best move
1259       if (value > bestValue)
1260       {
1261           bestValue = value;
1262
1263           if (value > alpha)
1264           {
1265               if (PvNode && value < beta) // Update alpha here! Always alpha < beta
1266               {
1267                   alpha = value;
1268                   bestMove = move;
1269               }
1270               else // Fail high
1271               {
1272                   TT.store(posKey, value_to_tt(value, ss->ply), BOUND_LOWER,
1273                            ttDepth, move, ss->staticEval);
1274
1275                   return value;
1276               }
1277           }
1278        }
1279     }
1280
1281     // All legal moves have been searched. A special case: If we're in check
1282     // and no legal moves were found, it is checkmate.
1283     if (InCheck && bestValue == -VALUE_INFINITE)
1284         return mated_in(ss->ply); // Plies to mate from the root
1285
1286     TT.store(posKey, value_to_tt(bestValue, ss->ply),
1287              PvNode && bestValue > oldAlpha ? BOUND_EXACT : BOUND_UPPER,
1288              ttDepth, bestMove, ss->staticEval);
1289
1290     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
1291
1292     return bestValue;
1293   }
1294
1295
1296   // value_to_tt() adjusts a mate score from "plies to mate from the root" to
1297   // "plies to mate from the current position". Non-mate scores are unchanged.
1298   // The function is called before storing a value in the transposition table.
1299
1300   Value value_to_tt(Value v, int ply) {
1301
1302     assert(v != VALUE_NONE);
1303
1304     return  v >= VALUE_MATE_IN_MAX_PLY  ? v + ply
1305           : v <= VALUE_MATED_IN_MAX_PLY ? v - ply : v;
1306   }
1307
1308
1309   // value_from_tt() is the inverse of value_to_tt(): It adjusts a mate score
1310   // from the transposition table (which refers to the plies to mate/be mated
1311   // from current position) to "plies to mate/be mated from the root".
1312
1313   Value value_from_tt(Value v, int ply) {
1314
1315     return  v == VALUE_NONE             ? VALUE_NONE
1316           : v >= VALUE_MATE_IN_MAX_PLY  ? v - ply
1317           : v <= VALUE_MATED_IN_MAX_PLY ? v + ply : v;
1318   }
1319
1320
1321   // When playing with a strength handicap, choose best move among the MultiPV
1322   // set using a statistical rule dependent on 'level'. Idea by Heinz van Saanen.
1323
1324   Move Skill::pick_move() {
1325
1326     static RKISS rk;
1327
1328     // PRNG sequence should be not deterministic
1329     for (int i = Time::now() % 50; i > 0; --i)
1330         rk.rand<unsigned>();
1331
1332     // RootMoves are already sorted by score in descending order
1333     int variance = std::min(RootMoves[0].score - RootMoves[PVSize - 1].score, PawnValueMg);
1334     int weakness = 120 - 2 * level;
1335     int max_s = -VALUE_INFINITE;
1336     best = MOVE_NONE;
1337
1338     // Choose best move. For each move score we add two terms both dependent on
1339     // weakness. One deterministic and bigger for weaker moves, and one random,
1340     // then we choose the move with the resulting highest score.
1341     for (size_t i = 0; i < PVSize; ++i)
1342     {
1343         int s = RootMoves[i].score;
1344
1345         // Don't allow crazy blunders even at very low skills
1346         if (i > 0 && RootMoves[i-1].score > s + 2 * PawnValueMg)
1347             break;
1348
1349         // This is our magic formula
1350         s += (  weakness * int(RootMoves[0].score - s)
1351               + variance * (rk.rand<unsigned>() % weakness)) / 128;
1352
1353         if (s > max_s)
1354         {
1355             max_s = s;
1356             best = RootMoves[i].pv[0];
1357         }
1358     }
1359     return best;
1360   }
1361
1362
1363   // uci_pv() formats PV information according to the UCI protocol. UCI
1364   // requires that all (if any) unsearched PV lines are sent using a previous
1365   // search score.
1366
1367   string uci_pv(const Position& pos, int depth, Value alpha, Value beta) {
1368
1369     std::stringstream s;
1370     Time::point elapsed = Time::now() - SearchTime + 1;
1371     size_t uciPVSize = std::min((size_t)Options["MultiPV"], RootMoves.size());
1372     int selDepth = 0;
1373
1374     for (size_t i = 0; i < Threads.size(); ++i)
1375         if (Threads[i]->maxPly > selDepth)
1376             selDepth = Threads[i]->maxPly;
1377
1378     for (size_t i = 0; i < uciPVSize; ++i)
1379     {
1380         bool updated = (i <= PVIdx);
1381
1382         if (depth == 1 && !updated)
1383             continue;
1384
1385         int d   = updated ? depth : depth - 1;
1386         Value v = updated ? RootMoves[i].score : RootMoves[i].prevScore;
1387
1388         if (s.rdbuf()->in_avail()) // Not at first line
1389             s << "\n";
1390
1391         s << "info depth " << d
1392           << " seldepth "  << selDepth
1393           << " score "     << (i == PVIdx ? score_to_uci(v, alpha, beta) : score_to_uci(v))
1394           << " nodes "     << pos.nodes_searched()
1395           << " nps "       << pos.nodes_searched() * 1000 / elapsed
1396           << " time "      << elapsed
1397           << " multipv "   << i + 1
1398           << " pv";
1399
1400         for (size_t j = 0; RootMoves[i].pv[j] != MOVE_NONE; ++j)
1401             s <<  " " << move_to_uci(RootMoves[i].pv[j], pos.is_chess960());
1402     }
1403
1404     return s.str();
1405   }
1406
1407 } // namespace
1408
1409
1410 /// RootMove::extract_pv_from_tt() builds a PV by adding moves from the TT table.
1411 /// We also consider both failing high nodes and BOUND_EXACT nodes here to
1412 /// ensure that we have a ponder move even when we fail high at root. This
1413 /// results in a long PV to print that is important for position analysis.
1414
1415 void RootMove::extract_pv_from_tt(Position& pos) {
1416
1417   StateInfo state[MAX_PLY_PLUS_6], *st = state;
1418   const TTEntry* tte;
1419   int ply = 0;
1420   Move m = pv[0];
1421
1422   pv.clear();
1423
1424   do {
1425       pv.push_back(m);
1426
1427       assert(MoveList<LEGAL>(pos).contains(pv[ply]));
1428
1429       pos.do_move(pv[ply++], *st++);
1430       tte = TT.probe(pos.key());
1431
1432   } while (   tte
1433            && pos.pseudo_legal(m = tte->move()) // Local copy, TT could change
1434            && pos.legal(m, pos.pinned_pieces(pos.side_to_move()))
1435            && ply < MAX_PLY
1436            && (!pos.is_draw() || ply < 2));
1437
1438   pv.push_back(MOVE_NONE); // Must be zero-terminating
1439
1440   while (ply) pos.undo_move(pv[--ply]);
1441 }
1442
1443
1444 /// RootMove::insert_pv_in_tt() is called at the end of a search iteration, and
1445 /// inserts the PV back into the TT. This makes sure the old PV moves are searched
1446 /// first, even if the old TT entries have been overwritten.
1447
1448 void RootMove::insert_pv_in_tt(Position& pos) {
1449
1450   StateInfo state[MAX_PLY_PLUS_6], *st = state;
1451   const TTEntry* tte;
1452   int ply = 0;
1453
1454   do {
1455       tte = TT.probe(pos.key());
1456
1457       if (!tte || tte->move() != pv[ply]) // Don't overwrite correct entries
1458           TT.store(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE, pv[ply], VALUE_NONE);
1459
1460       assert(MoveList<LEGAL>(pos).contains(pv[ply]));
1461
1462       pos.do_move(pv[ply++], *st++);
1463
1464   } while (pv[ply] != MOVE_NONE);
1465
1466   while (ply) pos.undo_move(pv[--ply]);
1467 }
1468
1469
1470 /// Thread::idle_loop() is where the thread is parked when it has no work to do
1471
1472 void Thread::idle_loop() {
1473
1474   // Pointer 'this_sp' is not null only if we are called from split(), and not
1475   // at the thread creation. This means we are the split point's master.
1476   SplitPoint* this_sp = splitPointsSize ? activeSplitPoint : NULL;
1477
1478   assert(!this_sp || (this_sp->masterThread == this && searching));
1479
1480   while (true)
1481   {
1482       // If we are not searching, wait for a condition to be signaled instead of
1483       // wasting CPU time polling for work.
1484       while ((!searching && Threads.sleepWhileIdle) || exit)
1485       {
1486           if (exit)
1487           {
1488               assert(!this_sp);
1489               return;
1490           }
1491
1492           // Grab the lock to avoid races with Thread::notify_one()
1493           mutex.lock();
1494
1495           // If we are master and all slaves have finished then exit idle_loop
1496           if (this_sp && !this_sp->slavesMask)
1497           {
1498               mutex.unlock();
1499               break;
1500           }
1501
1502           // Do sleep after retesting sleep conditions under lock protection. In
1503           // particular we need to avoid a deadlock in case a master thread has,
1504           // in the meanwhile, allocated us and sent the notify_one() call before
1505           // we had the chance to grab the lock.
1506           if (!searching && !exit)
1507               sleepCondition.wait(mutex);
1508
1509           mutex.unlock();
1510       }
1511
1512       // If this thread has been assigned work, launch a search
1513       if (searching)
1514       {
1515           assert(!exit);
1516
1517           Threads.mutex.lock();
1518
1519           assert(searching);
1520           assert(activeSplitPoint);
1521           SplitPoint* sp = activeSplitPoint;
1522
1523           Threads.mutex.unlock();
1524
1525           Stack stack[MAX_PLY_PLUS_6], *ss = stack+2; // To allow referencing (ss-2)
1526           Position pos(*sp->pos, this);
1527
1528           std::memcpy(ss-2, sp->ss-2, 5 * sizeof(Stack));
1529           ss->splitPoint = sp;
1530
1531           sp->mutex.lock();
1532
1533           assert(activePosition == NULL);
1534
1535           activePosition = &pos;
1536
1537           switch (sp->nodeType) {
1538           case Root:
1539               search<SplitPointRoot>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
1540               break;
1541           case PV:
1542               search<SplitPointPV>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
1543               break;
1544           case NonPV:
1545               search<SplitPointNonPV>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
1546               break;
1547           default:
1548               assert(false);
1549           }
1550
1551           assert(searching);
1552
1553           searching = false;
1554           activePosition = NULL;
1555           sp->slavesMask &= ~(1ULL << idx);
1556           sp->nodes += pos.nodes_searched();
1557
1558           // Wake up the master thread so to allow it to return from the idle
1559           // loop in case we are the last slave of the split point.
1560           if (    Threads.sleepWhileIdle
1561               &&  this != sp->masterThread
1562               && !sp->slavesMask)
1563           {
1564               assert(!sp->masterThread->searching);
1565               sp->masterThread->notify_one();
1566           }
1567
1568           // After releasing the lock we can't access any SplitPoint related data
1569           // in a safe way because it could have been released under our feet by
1570           // the sp master. Also accessing other Thread objects is unsafe because
1571           // if we are exiting there is a chance that they are already freed.
1572           sp->mutex.unlock();
1573       }
1574
1575       // If this thread is the master of a split point and all slaves have finished
1576       // their work at this split point, return from the idle loop.
1577       if (this_sp && !this_sp->slavesMask)
1578       {
1579           this_sp->mutex.lock();
1580           bool finished = !this_sp->slavesMask; // Retest under lock protection
1581           this_sp->mutex.unlock();
1582           if (finished)
1583               return;
1584       }
1585   }
1586 }
1587
1588
1589 /// check_time() is called by the timer thread when the timer triggers. It is
1590 /// used to print debug info and, more importantly, to detect when we are out of
1591 /// available time and thus stop the search.
1592
1593 void check_time() {
1594
1595   static Time::point lastInfoTime = Time::now();
1596   int64_t nodes = 0; // Workaround silly 'uninitialized' gcc warning
1597
1598   if (Time::now() - lastInfoTime >= 1000)
1599   {
1600       lastInfoTime = Time::now();
1601       dbg_print();
1602   }
1603
1604   if (Limits.ponder)
1605       return;
1606
1607   if (Limits.nodes)
1608   {
1609       Threads.mutex.lock();
1610
1611       nodes = RootPos.nodes_searched();
1612
1613       // Loop across all split points and sum accumulated SplitPoint nodes plus
1614       // all the currently active positions nodes.
1615       for (size_t i = 0; i < Threads.size(); ++i)
1616           for (int j = 0; j < Threads[i]->splitPointsSize; ++j)
1617           {
1618               SplitPoint& sp = Threads[i]->splitPoints[j];
1619
1620               sp.mutex.lock();
1621
1622               nodes += sp.nodes;
1623               Bitboard sm = sp.slavesMask;
1624               while (sm)
1625               {
1626                   Position* pos = Threads[pop_lsb(&sm)]->activePosition;
1627                   if (pos)
1628                       nodes += pos->nodes_searched();
1629               }
1630
1631               sp.mutex.unlock();
1632           }
1633
1634       Threads.mutex.unlock();
1635   }
1636
1637   Time::point elapsed = Time::now() - SearchTime;
1638   bool stillAtFirstMove =    Signals.firstRootMove
1639                          && !Signals.failedLowAtRoot
1640                          &&  elapsed > TimeMgr.available_time();
1641
1642   bool noMoreTime =   elapsed > TimeMgr.maximum_time() - 2 * TimerThread::Resolution
1643                    || stillAtFirstMove;
1644
1645   if (   (Limits.use_time_management() && noMoreTime)
1646       || (Limits.movetime && elapsed >= Limits.movetime)
1647       || (Limits.nodes && nodes >= Limits.nodes))
1648       Signals.stop = true;
1649 }