"Fossies" - the Fresh Open Source Software Archive

Member "stockfish-11-linux/src/endgame.h" (18 Jan 2020, 3601 Bytes) of package /linux/privat/stockfish-11-linux.zip:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "endgame.h": 9-linux_vs_10-linux.

    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   Copyright (C) 2015-2020 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
    6 
    7   Stockfish is free software: you can redistribute it and/or modify
    8   it under the terms of the GNU General Public License as published by
    9   the Free Software Foundation, either version 3 of the License, or
   10   (at your option) any later version.
   11 
   12   Stockfish is distributed in the hope that it will be useful,
   13   but WITHOUT ANY WARRANTY; without even the implied warranty of
   14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   15   GNU General Public License for more details.
   16 
   17   You should have received a copy of the GNU General Public License
   18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
   19 */
   20 
   21 #ifndef ENDGAME_H_INCLUDED
   22 #define ENDGAME_H_INCLUDED
   23 
   24 #include <unordered_map>
   25 #include <memory>
   26 #include <string>
   27 #include <type_traits>
   28 #include <utility>
   29 
   30 #include "position.h"
   31 #include "types.h"
   32 
   33 
   34 /// EndgameCode lists all supported endgame functions by corresponding codes
   35 
   36 enum EndgameCode {
   37 
   38   EVALUATION_FUNCTIONS,
   39   KNNK,  // KNN vs K
   40   KNNKP, // KNN vs KP
   41   KXK,   // Generic "mate lone king" eval
   42   KBNK,  // KBN vs K
   43   KPK,   // KP vs K
   44   KRKP,  // KR vs KP
   45   KRKB,  // KR vs KB
   46   KRKN,  // KR vs KN
   47   KQKP,  // KQ vs KP
   48   KQKR,  // KQ vs KR
   49 
   50   SCALING_FUNCTIONS,
   51   KBPsK,   // KB and pawns vs K
   52   KQKRPs,  // KQ vs KR and pawns
   53   KRPKR,   // KRP vs KR
   54   KRPKB,   // KRP vs KB
   55   KRPPKRP, // KRPP vs KRP
   56   KPsK,    // K and pawns vs K
   57   KBPKB,   // KBP vs KB
   58   KBPPKB,  // KBPP vs KB
   59   KBPKN,   // KBP vs KN
   60   KNPK,    // KNP vs K
   61   KNPKB,   // KNP vs KB
   62   KPKP     // KP vs KP
   63 };
   64 
   65 
   66 /// Endgame functions can be of two types depending on whether they return a
   67 /// Value or a ScaleFactor.
   68 
   69 template<EndgameCode E> using
   70 eg_type = typename std::conditional<(E < SCALING_FUNCTIONS), Value, ScaleFactor>::type;
   71 
   72 
   73 /// Base and derived functors for endgame evaluation and scaling functions
   74 
   75 template<typename T>
   76 struct EndgameBase {
   77 
   78   explicit EndgameBase(Color c) : strongSide(c), weakSide(~c) {}
   79   virtual ~EndgameBase() = default;
   80   virtual T operator()(const Position&) const = 0;
   81 
   82   const Color strongSide, weakSide;
   83 };
   84 
   85 
   86 template<EndgameCode E, typename T = eg_type<E>>
   87 struct Endgame : public EndgameBase<T> {
   88 
   89   explicit Endgame(Color c) : EndgameBase<T>(c) {}
   90   T operator()(const Position&) const override;
   91 };
   92 
   93 
   94 /// The Endgames namespace handles the pointers to endgame evaluation and scaling
   95 /// base objects in two std::map. We use polymorphism to invoke the actual
   96 /// endgame function by calling its virtual operator().
   97 
   98 namespace Endgames {
   99 
  100   template<typename T> using Ptr = std::unique_ptr<EndgameBase<T>>;
  101   template<typename T> using Map = std::unordered_map<Key, Ptr<T>>;
  102 
  103   extern std::pair<Map<Value>, Map<ScaleFactor>> maps;
  104 
  105   void init();
  106 
  107   template<typename T>
  108   Map<T>& map() {
  109     return std::get<std::is_same<T, ScaleFactor>::value>(maps);
  110   }
  111 
  112   template<EndgameCode E, typename T = eg_type<E>>
  113   void add(const std::string& code) {
  114 
  115     StateInfo st;
  116     map<T>()[Position().set(code, WHITE, &st).material_key()] = Ptr<T>(new Endgame<E>(WHITE));
  117     map<T>()[Position().set(code, BLACK, &st).material_key()] = Ptr<T>(new Endgame<E>(BLACK));
  118   }
  119 
  120   template<typename T>
  121   const EndgameBase<T>* probe(Key key) {
  122     auto it = map<T>().find(key);
  123     return it != map<T>().end() ? it->second.get() : nullptr;
  124   }
  125 }
  126 
  127 #endif // #ifndef ENDGAME_H_INCLUDED