- /* 
-     Texel - A UCI chess engine. 
-     Copyright (C) 2014  Peter Ă–sterlund, peterosterlund2@gmail.com 
-   
-     This program 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. 
-   
-     This program 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/>. 
- */ 
-   
- /* 
-  * tbprobe.hpp 
-  * 
-  *  Created on: Jun 2, 2014 
-  *      Author: petero 
-  */ 
-   
- #ifndef TBPROBE_HPP_ 
- #define TBPROBE_HPP_ 
-   
- #include "transpositionTable.hpp" 
- #include "moveGen.hpp" 
-   
- #include <string> 
-   
-   
- class Position; 
-   
- /** 
-  * Handle tablebase probing. 
-  */ 
- class TBProbe { 
-     friend class TBTest; 
- public: 
-     /** Initialize tablebases. */ 
-     static void initialize(const std::string& gtbPath, int cacheMB, 
-                            const std::string& rtbPath); 
-   
-     /** Return true if GTB or RTB probing is enabled. */ 
-     static bool tbEnabled(); 
-   
-     /** Probe one or more tablebases to get an exact score or a usable bound. 
-      * @param pos  The position to probe. The position can be temporarily modified 
-      *             but is restored to original state before function returns. 
-      */ 
-     static bool tbProbe(Position& pos, int ply, int alpha, int beta, 
-                         TranspositionTable::TTEntry& ent); 
-   
-     /** If some TB files are missing, it may be necessary to only search a subset 
-      * of the root moves in order to make progress. This might happen for example 
-      * in KPK if the KQK table is missing and search is not able to see the mate 
-      * after promoting the pawn. 
-      * @param pos           The root position. 
-      * @param legalMoves    The set of legal root moves. 
-      * @param movesToSearch The moves to search. 
-      * @return True if a subset should be searched, false to search all moves. 
-      */ 
-     static bool getSearchMoves(Position& pos, const MoveList& legalMoves, 
-                                std::vector<Move>& movesToSearch); 
-   
-     /** Enhance PV with DTM information from gaviota tablebases. */ 
-     static void extendPV(const Position& rootPos, std::vector<Move>& pv); 
-   
-     /** Probe gaviota DTM tablebases. 
-      * @param pos  The position to probe. The position can be temporarily modified 
-      *             but is restored to original state before function returns. 
-      * @param ply  The ply value used to adjust mate scores. 
-      * @param score The tablebase score. Only modified for tablebase hits. 
-      * @return True if pos was found in the tablebases. 
-      */ 
-     static bool gtbProbeDTM(Position& pos, int ply, int& score); 
-   
-     /** 
-      * Probe gaviota WDL tablebases. 
-      * @param pos  The position to probe. The position can be temporarily modified 
-      *             but is restored to original state before function returns. 
-      * @param ply  The ply value used to adjust mate scores. 
-      * @param score The tablebase score. Only modified for tablebase hits. 
-      *              The returned score is either 0 or a mate bound. 
-      */ 
-     static bool gtbProbeWDL(Position& pos, int ply, int& score); 
-   
-     /** 
-      * Probe syzygy DTZ tablebases. 
-      * @param pos  The position to probe. The position can be temporarily modified 
-      *             but is restored to original state before function returns. 
-      * @param ply  The ply value used to adjust mate scores. 
-      * @param score The tablebase score. Only modified for tablebase hits. 
-      *              The returned score is either 0 or a mate bound. The bound 
-      *              is computed by considering the DTZ value and the maximum number 
-      *              of zeroing moves before mate. 
-      */ 
-     static bool rtbProbeDTZ(Position& pos, int ply, int& score); 
-   
-     /** 
-      * Probe syzygy WDL tablebases. 
-      * @param pos  The position to probe. The position can be temporarily modified 
-      *             but is restored to original state before function returns. 
-      * @param ply  The ply value used to adjust mate scores. 
-      * @param score The tablebase score. Only modified for tablebase hits. 
-      *              The returned score is either 0 or a mate bound. 
-      */ 
-     static bool rtbProbeWDL(Position& pos, int ply, int& score); 
-   
- private: 
-     /** Initialize */ 
-     static void gtbInitialize(const std::string& path, int cacheMB, int wdlFraction); 
-   
-     static void initWDLBounds(); 
-     static int getMaxDTZ(int matId); 
-     static int getMaxSubMate(const Position& pos); 
-     static int getMaxSubMate(std::vector<int>& pieces, int pawnMoves); 
-     static void initMaxDTM(); 
-     static void initMaxDTZ(); 
-   
-     struct GtbProbeData { 
-         unsigned int stm, epsq, castles; 
-         static const int MAXLEN = 17; 
-         unsigned int  wSq[MAXLEN]; 
-         unsigned int  bSq[MAXLEN]; 
-         unsigned char wP[MAXLEN]; 
-         unsigned char bP[MAXLEN]; 
-         int materialId; 
-     }; 
-   
-     /** Convert position to GTB probe format. */ 
-     static void getGTBProbeData(const Position& pos, GtbProbeData& gtbData); 
-   
-     static bool gtbProbeDTM(const GtbProbeData& gtbData, int ply, int& score); 
-   
-     static bool gtbProbeWDL(const GtbProbeData& gtbData, int ply, int& score); 
- }; 
-   
-   
- #endif /* TBPROBE_HPP_ */ 
-