mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Do not manually build endgame functions hash keys
Use Position::compute_material_key() to do the job, so we are sure there is not key mismatch during endgame function lookups. This fixes two endgames hash errors that caused two endgames to be disabled. This patch is also a code cleanup because removes a lot of messy key assignments. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
67375f4693
commit
30e8f0c9ad
2 changed files with 58 additions and 42 deletions
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <sstream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "material.h"
|
#include "material.h"
|
||||||
|
@ -58,8 +59,9 @@ public:
|
||||||
EndgameScalingFunctionBase* getESF(Key key, Color* c) const;
|
EndgameScalingFunctionBase* getESF(Key key, Color* c) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void add(Key k, EndgameEvaluationFunctionBase* f);
|
void add(const std::string& keyCode, EndgameEvaluationFunctionBase* f);
|
||||||
void add(Key k, Color c, EndgameScalingFunctionBase* f);
|
void add(const std::string& keyCode, Color c, EndgameScalingFunctionBase* f);
|
||||||
|
Key buildKey(const std::string& keyCode);
|
||||||
|
|
||||||
struct ScalingInfo
|
struct ScalingInfo
|
||||||
{
|
{
|
||||||
|
@ -316,54 +318,68 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) {
|
||||||
|
|
||||||
EndgameFunctions::EndgameFunctions() {
|
EndgameFunctions::EndgameFunctions() {
|
||||||
|
|
||||||
typedef Key ZM[2][8][16];
|
KNNKMaterialKey = buildKey("KNNK");
|
||||||
const ZM& z = Position::zobMaterial;
|
KKNNMaterialKey = buildKey("KKNN");
|
||||||
|
|
||||||
static const Color W = WHITE;
|
add("KPK", &EvaluateKPK);
|
||||||
static const Color B = BLACK;
|
add("KKP", &EvaluateKKP);
|
||||||
|
add("KBNK", &EvaluateKBNK);
|
||||||
|
add("KKBN", &EvaluateKKBN);
|
||||||
|
add("KRKP", &EvaluateKRKP);
|
||||||
|
add("KPKR", &EvaluateKPKR);
|
||||||
|
add("KRKB", &EvaluateKRKB);
|
||||||
|
add("KBKR", &EvaluateKBKR);
|
||||||
|
add("KRKN", &EvaluateKRKN);
|
||||||
|
add("KNKR", &EvaluateKNKR);
|
||||||
|
add("KQKR", &EvaluateKQKR);
|
||||||
|
add("KRKQ", &EvaluateKRKQ);
|
||||||
|
add("KBBKN", &EvaluateKBBKN);
|
||||||
|
add("KNKBB", &EvaluateKNKBB);
|
||||||
|
|
||||||
KNNKMaterialKey = z[W][KNIGHT][1] ^ z[W][KNIGHT][2];
|
add("KNPK", WHITE, &ScaleKNPK);
|
||||||
KKNNMaterialKey = z[B][KNIGHT][1] ^ z[B][KNIGHT][2];
|
add("KKNP", BLACK, &ScaleKKNP);
|
||||||
|
add("KRPKR", WHITE, &ScaleKRPKR);
|
||||||
add(z[W][PAWN][1], &EvaluateKPK);
|
add("KRKRP", BLACK, &ScaleKRKRP);
|
||||||
add(z[B][PAWN][1], &EvaluateKKP);
|
add("KBPKB", WHITE, &ScaleKBPKB);
|
||||||
|
add("KBKBP", BLACK, &ScaleKBKBP);
|
||||||
add(z[W][BISHOP][1] ^ z[W][KNIGHT][1], &EvaluateKBNK);
|
add("KBPKN", WHITE, &ScaleKBPKN);
|
||||||
add(z[B][BISHOP][1] ^ z[B][KNIGHT][1], &EvaluateKKBN);
|
add("KNKBP", BLACK, &ScaleKNKBP);
|
||||||
add(z[W][ROOK][1] ^ z[B][PAWN][1], &EvaluateKRKP);
|
add("KRPPKRP", WHITE, &ScaleKRPPKRP);
|
||||||
add(z[W][PAWN][1] ^ z[B][ROOK][1], &EvaluateKPKR);
|
add("KRPKRPP", BLACK, &ScaleKRPKRPP);
|
||||||
add(z[W][ROOK][1] ^ z[B][BISHOP][1], &EvaluateKRKB);
|
add("KRPPKRP", WHITE, &ScaleKRPPKRP);
|
||||||
add(z[W][BISHOP][1] ^ z[B][ROOK][1], &EvaluateKBKR);
|
add("KRPKRPP", BLACK, &ScaleKRPKRPP);
|
||||||
add(z[W][ROOK][1] ^ z[B][KNIGHT][1], &EvaluateKRKN);
|
|
||||||
add(z[W][KNIGHT][1] ^ z[B][ROOK][1], &EvaluateKNKR);
|
|
||||||
add(z[W][QUEEN][1] ^ z[B][ROOK][1], &EvaluateKQKR);
|
|
||||||
add(z[W][ROOK][1] ^ z[B][QUEEN][1], &EvaluateKRKQ);
|
|
||||||
add(z[W][BISHOP][2] ^ z[B][KNIGHT][1], &EvaluateKBBKN);
|
|
||||||
add(z[W][KNIGHT][1] ^ z[B][BISHOP][2], &EvaluateKNKBB);
|
|
||||||
|
|
||||||
add(z[W][KNIGHT][1] ^ z[W][PAWN][1], W, &ScaleKNPK);
|
|
||||||
add(z[B][KNIGHT][1] ^ z[B][PAWN][1], B, &ScaleKKNP);
|
|
||||||
|
|
||||||
add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[B][ROOK][1] , W, &ScaleKRPKR);
|
|
||||||
add(z[W][ROOK][1] ^ z[B][ROOK][1] ^ z[B][PAWN][1] , B, &ScaleKRKRP);
|
|
||||||
add(z[W][BISHOP][1] ^ z[W][PAWN][1] ^ z[B][BISHOP][1], W, &ScaleKBPKB);
|
|
||||||
add(z[W][BISHOP][1] ^ z[B][BISHOP][1] ^ z[B][PAWN][1] , B, &ScaleKBKBP);
|
|
||||||
add(z[W][BISHOP][1] ^ z[W][PAWN][1] ^ z[B][KNIGHT][1], W, &ScaleKBPKN);
|
|
||||||
add(z[W][KNIGHT][1] ^ z[B][BISHOP][1] ^ z[B][PAWN][1] , B, &ScaleKNKBP);
|
|
||||||
|
|
||||||
add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[W][PAWN][2] ^ z[B][ROOK][1] ^ z[B][PAWN][1], W, &ScaleKRPPKRP);
|
|
||||||
add(z[W][ROOK][1] ^ z[W][PAWN][1] ^ z[B][ROOK][1] ^ z[B][PAWN][1] ^ z[B][PAWN][2], B, &ScaleKRPKRPP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EndgameFunctions::add(Key k, EndgameEvaluationFunctionBase* f) {
|
Key EndgameFunctions::buildKey(const std::string& keyCode) {
|
||||||
|
|
||||||
EEFmap.insert(std::pair<Key, EndgameEvaluationFunctionBase*>(k, f));
|
assert(keyCode.length() > 0 && keyCode[0] == 'K');
|
||||||
|
assert(keyCode.length() < 8);
|
||||||
|
|
||||||
|
std::stringstream s;
|
||||||
|
bool upcase = false;
|
||||||
|
|
||||||
|
// Build up a fen substring with the given pieces, note
|
||||||
|
// that the fen string could be of an illegal position.
|
||||||
|
for (size_t i = 0; i < keyCode.length(); i++)
|
||||||
|
{
|
||||||
|
if (keyCode[i] == 'K')
|
||||||
|
upcase = !upcase;
|
||||||
|
|
||||||
|
s << char(upcase? toupper(keyCode[i]) : tolower(keyCode[i]));
|
||||||
|
}
|
||||||
|
s << 8 - keyCode.length() << "/8/8/8/8/8/8/8 w -";
|
||||||
|
return Position(s.str()).get_material_key();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EndgameFunctions::add(Key k, Color c, EndgameScalingFunctionBase* f) {
|
void EndgameFunctions::add(const std::string& keyCode, EndgameEvaluationFunctionBase* f) {
|
||||||
|
|
||||||
|
EEFmap.insert(std::pair<Key, EndgameEvaluationFunctionBase*>(buildKey(keyCode), f));
|
||||||
|
}
|
||||||
|
|
||||||
|
void EndgameFunctions::add(const std::string& keyCode, Color c, EndgameScalingFunctionBase* f) {
|
||||||
|
|
||||||
ScalingInfo s = {c, f};
|
ScalingInfo s = {c, f};
|
||||||
ESFmap.insert(std::pair<Key, ScalingInfo>(k, s));
|
ESFmap.insert(std::pair<Key, ScalingInfo>(buildKey(keyCode), s));
|
||||||
}
|
}
|
||||||
|
|
||||||
EndgameEvaluationFunctionBase* EndgameFunctions::getEEF(Key key) const {
|
EndgameEvaluationFunctionBase* EndgameFunctions::getEEF(Key key) const {
|
||||||
|
|
|
@ -118,7 +118,7 @@ void Position::from_fen(const std::string& fen) {
|
||||||
}
|
}
|
||||||
sideToMove = (fen[i] == 'w' ? WHITE : BLACK);
|
sideToMove = (fen[i] == 'w' ? WHITE : BLACK);
|
||||||
|
|
||||||
// Castling rights:
|
// Castling rights
|
||||||
i++;
|
i++;
|
||||||
if (fen[i] != ' ')
|
if (fen[i] != ' ')
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue