cb087b4b4cfe0e3686081f2543c3a31c5c4d2d3d
[stockfish] / src / endgame.h
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 Marco Costalba
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
21 #if !defined(ENDGAME_H_INCLUDED)
22 #define ENDGAME_H_INCLUDED
23
24 ////
25 //// Includes
26 ////
27
28 #include "position.h"
29 #include "scale.h"
30 #include "value.h"
31
32
33 ////
34 //// Types
35 ////
36
37 enum EndgameType {
38
39     // Evaluation functions
40     KXK,   // Generic "mate lone king" eval
41     KBNK,  // KBN vs K
42     KPK,   // KP vs K
43     KRKP,  // KR vs KP
44     KRKB,  // KR vs KB
45     KRKN,  // KR vs KN
46     KQKR,  // KQ vs KR
47     KBBKN, // KBB vs KN
48     KmmKm, // K and two minors vs K and one or two minors
49
50     // Scaling functions
51     KBPK,    // KBP vs K
52     KQKRP,   // KQ vs KRP
53     KRPKR,   // KRP vs KR
54     KRPPKRP, // KRPP vs KRP
55     KPsK,    // King and pawns vs king
56     KBPKB,   // KBP vs KB
57     KBPKN,   // KBP vs KN
58     KNPK,    // KNP vs K
59     KPKP     // KP vs KP
60 };
61
62 /// Template abstract base class for all special endgame functions
63
64 template<typename T>
65 class EndgameFunctionBase {
66 public:
67   EndgameFunctionBase(Color c) : strongerSide(c) { weakerSide = opposite_color(strongerSide); }
68   virtual ~EndgameFunctionBase() {}
69   virtual T apply(const Position&) = 0;
70
71 protected:
72   Color strongerSide, weakerSide;
73 };
74
75 typedef EndgameFunctionBase<Value> EndgameEvaluationFunctionBase;
76 typedef EndgameFunctionBase<ScaleFactor> EndgameScalingFunctionBase;
77
78
79 /// Templates subclass for various concrete endgames
80
81 template<EndgameType>
82 struct EvaluationFunction : public EndgameEvaluationFunctionBase {
83   explicit EvaluationFunction(Color c): EndgameEvaluationFunctionBase(c) {}
84   Value apply(const Position&);
85 };
86
87 template<EndgameType>
88 struct ScalingFunction : public EndgameScalingFunctionBase {
89   explicit ScalingFunction(Color c) : EndgameScalingFunctionBase(c) {}
90   ScaleFactor apply(const Position&);
91 };
92
93
94 ////
95 //// Constants and variables
96 ////
97
98 extern EvaluationFunction<KXK> EvaluateKXK, EvaluateKKX;       // Generic "mate lone king" eval
99 extern EvaluationFunction<KBNK> EvaluateKBNK, EvaluateKKBN;    // KBN vs K
100 extern EvaluationFunction<KPK> EvaluateKPK, EvaluateKKP;       // KP vs K
101 extern EvaluationFunction<KRKP> EvaluateKRKP, EvaluateKPKR;    // KR vs KP
102 extern EvaluationFunction<KRKB> EvaluateKRKB, EvaluateKBKR;    // KR vs KB
103 extern EvaluationFunction<KRKN> EvaluateKRKN, EvaluateKNKR;    // KR vs KN
104 extern EvaluationFunction<KQKR> EvaluateKQKR, EvaluateKRKQ;    // KQ vs KR
105 extern EvaluationFunction<KBBKN> EvaluateKBBKN, EvaluateKNKBB; // KBB vs KN
106 extern EvaluationFunction<KmmKm> EvaluateKmmKm; // K and two minors vs K and one or two minors:
107
108 extern ScalingFunction<KBPK> ScaleKBPK, ScaleKKBP;    // KBP vs K
109 extern ScalingFunction<KQKRP> ScaleKQKRP, ScaleKRPKQ; // KQ vs KRP
110 extern ScalingFunction<KRPKR> ScaleKRPKR, ScaleKRKRP; // KRP vs KR
111 extern ScalingFunction<KRPPKRP> ScaleKRPPKRP, ScaleKRPKRPP; // KRPP vs KRP
112 extern ScalingFunction<KPsK> ScaleKPsK, ScaleKKPs;    // King and pawns vs king
113 extern ScalingFunction<KBPKB> ScaleKBPKB, ScaleKBKBP; // KBP vs KB
114 extern ScalingFunction<KBPKN> ScaleKBPKN, ScaleKNKBP; // KBP vs KN
115 extern ScalingFunction<KNPK> ScaleKNPK, ScaleKKNP;    // KNP vs K
116 extern ScalingFunction<KPKP> ScaleKPKPw, ScaleKPKPb;  // KP vs KP
117
118 ////
119 //// Prototypes
120 ////
121
122 extern void init_bitbases();
123
124
125 #endif // !defined(ENDGAME_H_INCLUDED)