Advertisement
Guest User

Untitled

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