/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
Copyright (C) 2008 Marco Costalba
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.
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 .
*/
#if !defined(ENDGAME_H_INCLUDED)
#define ENDGAME_H_INCLUDED
////
//// Includes
////
#include "position.h"
#include "scale.h"
#include "value.h"
////
//// Types
////
enum EndgameType {
// Evaluation functions
KXK, // Generic "mate lone king" eval
KBNK, // KBN vs K
KPK, // KP vs K
KRKP, // KR vs KP
KRKB, // KR vs KB
KRKN, // KR vs KN
KQKR, // KQ vs KR
KBBKN, // KBB vs KN
KmmKm, // K and two minors vs K and one or two minors
// Scaling functions
KBPK, // KBP vs K
KQKRP, // KQ vs KRP
KRPKR, // KRP vs KR
KRPPKRP, // KRPP vs KRP
KPsK, // King and pawns vs king
KBPKB, // KBP vs KB
KBPPKB, // KBPP vs KB
KBPKN, // KBP vs KN
KNPK, // KNP vs K
KPKP // KP vs KP
};
/// Template abstract base class for all special endgame functions
template
class EndgameFunctionBase {
public:
EndgameFunctionBase(Color c) : strongerSide(c) { weakerSide = opposite_color(strongerSide); }
virtual ~EndgameFunctionBase() {}
virtual T apply(const Position&) = 0;
protected:
Color strongerSide, weakerSide;
};
typedef EndgameFunctionBase EndgameEvaluationFunctionBase;
typedef EndgameFunctionBase EndgameScalingFunctionBase;
/// Templates subclass for various concrete endgames
template
struct EvaluationFunction : public EndgameEvaluationFunctionBase {
explicit EvaluationFunction(Color c): EndgameEvaluationFunctionBase(c) {}
Value apply(const Position&);
};
template
struct ScalingFunction : public EndgameScalingFunctionBase {
explicit ScalingFunction(Color c) : EndgameScalingFunctionBase(c) {}
ScaleFactor apply(const Position&);
};
////
//// Constants and variables
////
extern EvaluationFunction EvaluateKXK, EvaluateKKX; // Generic "mate lone king" eval
extern EvaluationFunction EvaluateKBNK, EvaluateKKBN; // KBN vs K
extern EvaluationFunction EvaluateKPK, EvaluateKKP; // KP vs K
extern EvaluationFunction EvaluateKRKP, EvaluateKPKR; // KR vs KP
extern EvaluationFunction EvaluateKRKB, EvaluateKBKR; // KR vs KB
extern EvaluationFunction EvaluateKRKN, EvaluateKNKR; // KR vs KN
extern EvaluationFunction EvaluateKQKR, EvaluateKRKQ; // KQ vs KR
extern EvaluationFunction EvaluateKBBKN, EvaluateKNKBB; // KBB vs KN
extern EvaluationFunction EvaluateKmmKm; // K and two minors vs K and one or two minors:
extern ScalingFunction ScaleKBPK, ScaleKKBP; // KBP vs K
extern ScalingFunction ScaleKQKRP, ScaleKRPKQ; // KQ vs KRP
extern ScalingFunction ScaleKRPKR, ScaleKRKRP; // KRP vs KR
extern ScalingFunction ScaleKRPPKRP, ScaleKRPKRPP; // KRPP vs KRP
extern ScalingFunction ScaleKPsK, ScaleKKPs; // King and pawns vs king
extern ScalingFunction ScaleKBPKB, ScaleKBKBP; // KBP vs KB
extern ScalingFunction ScaleKBPPKB, ScaleKBKBPP; // KBPP vs KB
extern ScalingFunction ScaleKBPKN, ScaleKNKBP; // KBP vs KN
extern ScalingFunction ScaleKNPK, ScaleKKNP; // KNP vs K
extern ScalingFunction ScaleKPKPw, ScaleKPKPb; // KP vs KP
////
//// Prototypes
////
extern void init_bitbases();
#endif // !defined(ENDGAME_H_INCLUDED)