]> git.sesse.net Git - stockfish/blobdiff - src/search.h
Remove failedLow from the mainThread struct
[stockfish] / src / search.h
index 831248bacc8ee05cb197bd5841d45b3ebe89c660..26ec6f01c37903ecc1e7e6fe9d0a503a3805d412 100644 (file)
 /*
-  Glaurung, a UCI chess playing engine.
-  Copyright (C) 2004-2008 Tord Romstad
+  Stockfish, a UCI chess playing engine derived from Glaurung 2.1
+  Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
+  Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
+  Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
 
-  Glaurung is free software: you can redistribute it and/or modify
+  Stockfish is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
-  
-  Glaurung is distributed in the hope that it will be useful,
+
+  Stockfish is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
-  
+
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-
-#if !defined(SEARCH_H_INCLUDED)
+#ifndef SEARCH_H_INCLUDED
 #define SEARCH_H_INCLUDED
 
-////
-//// Includes
-////
+#include <vector>
 
+#include "misc.h"
+#include "movepick.h"
 #include "types.h"
-#include "depth.h"
-#include "history.h"
-#include "lock.h"
-#include "movegen.h"
-#include "position.h"
-#include "tt.h"
-#include "value.h"
 
+class Position;
 
-////
-//// Constants
-////
+namespace Search {
 
-const int PLY_MAX = 100;
-const int PLY_MAX_PLUS_2 = 102;
+/// Threshold used for countermoves based pruning
+constexpr int CounterMovePruneThreshold = 0;
 
 
-////
-//// Types
-////
+/// Stack struct keeps track of the information we need to remember from nodes
+/// shallower and deeper in the tree during the search. Each search thread has
+/// its own array of Stack objects, indexed by the current ply.
 
-/// The SearchStack struct keeps track of the information we need to remember
-/// from nodes shallower and deeper in the tree during the search.  Each
-/// search thread has its own array of SearchStack objects, indexed by the
-/// current ply.
-
-struct SearchStack {
-  Move pv[PLY_MAX];
+struct Stack {
+  Move* pv;
+  PieceToHistory* contHistory;
+  int ply;
   Move currentMove;
-  Value currentMoveCaptureValue;
-  Move mateKiller, killer1, killer2;
-  Move threatMove;
-  Depth reduction;
+  Move excludedMove;
+  Move killers[2];
+  Value staticEval;
+  int statScore;
+  int moveCount;
 };
 
 
-////
-//// Global variables
-////
+/// RootMove struct is used for moves at the root of the tree. For each root move
+/// we store a score and a PV (really a refutation in the case of moves which
+/// fail low). Score is normally set at -VALUE_INFINITE for all non-pv moves.
+
+struct RootMove {
 
-extern TranspositionTable TT;
+  explicit RootMove(Move m) : pv(1, m) {}
+  bool extract_ponder_from_tt(Position& pos);
+  bool operator==(const Move& m) const { return pv[0] == m; }
+  bool operator<(const RootMove& m) const { // Sort in descending order
+    return m.score != score ? m.score < score
+                            : m.previousScore < previousScore;
+  }
 
-extern int ActiveThreads;
+  Value score = -VALUE_INFINITE;
+  Value previousScore = -VALUE_INFINITE;
+  int selDepth = 0;
+  int tbRank;
+  Value tbScore;
+  std::vector<Move> pv;
+};
 
-extern Lock SMPLock;
+typedef std::vector<RootMove> RootMoves;
 
-// Perhaps better to make H local, and pass as parameter to MovePicker?
-extern History H;  
 
+/// LimitsType struct stores information sent by GUI about available time to
+/// search the current move, maximum depth/time, or if we are in analysis mode.
+
+struct LimitsType {
+
+  LimitsType() { // Init explicitly due to broken value-initialization of non POD in MSVC
+    time[WHITE] = time[BLACK] = inc[WHITE] = inc[BLACK] = npmsec = movetime = TimePoint(0);
+    movestogo = depth = mate = perft = infinite = 0;
+    nodes = 0;
+  }
+
+  bool use_time_management() const {
+    return !(mate | movetime | depth | nodes | perft | infinite);
+  }
+
+  std::vector<Move> searchmoves;
+  TimePoint time[COLOR_NB], inc[COLOR_NB], npmsec, movetime, startTime;
+  int movestogo, depth, mate, perft, infinite;
+  int64_t nodes;
+};
 
-////
-//// Prototypes
-////
+extern LimitsType Limits;
 
-extern void init_threads();
-extern void stop_threads();
-extern void think(const Position &pos, bool infinite, bool ponder, int time,
-                  int increment, int movesToGo, int maxDepth, int maxNodes,
-                  int maxTime, Move searchMoves[]);
-extern int64_t nodes_searched();
+void init();
+void clear();
 
+} // namespace Search
 
-#endif // !defined(SEARCH_H_INCLUDED)
+#endif // #ifndef SEARCH_H_INCLUDED