1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Start to simplify material.cpp

It is posisble to simplify a lot here!

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2008-10-27 19:07:48 +01:00
parent 038235ba35
commit 73cce873de

View file

@ -23,6 +23,7 @@
//// ////
#include <cassert> #include <cassert>
#include <map>
#include "material.h" #include "material.h"
@ -36,20 +37,20 @@ namespace {
const Value BishopPairMidgameBonus = Value(100); const Value BishopPairMidgameBonus = Value(100);
const Value BishopPairEndgameBonus = Value(100); const Value BishopPairEndgameBonus = Value(100);
Key KPKMaterialKey, KKPMaterialKey;
Key KBNKMaterialKey, KKBNMaterialKey;
Key KRKPMaterialKey, KPKRMaterialKey;
Key KRKBMaterialKey, KBKRMaterialKey;
Key KRKNMaterialKey, KNKRMaterialKey;
Key KQKRMaterialKey, KRKQMaterialKey;
Key KRPKRMaterialKey, KRKRPMaterialKey; Key KRPKRMaterialKey, KRKRPMaterialKey;
Key KRPPKRPMaterialKey, KRPKRPPMaterialKey; Key KNNKMaterialKey, KKNNMaterialKey;
Key KNNKMaterialKey, KKNNMaterialKey;
Key KBPKBMaterialKey, KBKBPMaterialKey; Key KBPKBMaterialKey, KBKBPMaterialKey;
Key KBPKNMaterialKey, KNKBPMaterialKey; Key KBPKNMaterialKey, KNKBPMaterialKey;
Key KNPKMaterialKey, KKNPMaterialKey; Key KNPKMaterialKey, KKNPMaterialKey;
Key KPKPMaterialKey; Key KPKPMaterialKey;
Key KRPPKRPMaterialKey, KRPKRPPMaterialKey;
std::map<Key, EndgameEvaluationFunction*> EEFmap;
void EEFAdd(Key k, EndgameEvaluationFunction* f) {
EEFmap.insert(std::pair<Key, EndgameEvaluationFunction*>(k, f));
}
} }
@ -57,114 +58,108 @@ namespace {
//// Functions //// Functions
//// ////
/// MaterialInfo::init() is called during program initialization. It /// MaterialInfo::init() is called during program initialization. It
/// precomputes material hash keys for a few basic endgames, in order /// precomputes material hash keys for a few basic endgames, in order
/// to make it easy to recognize such endgames when they occur. /// to make it easy to recognize such endgames when they occur.
void MaterialInfo::init() { void MaterialInfo::init() {
KPKMaterialKey = Position::zobMaterial[WHITE][PAWN][1];
KKPMaterialKey = Position::zobMaterial[BLACK][PAWN][1]; typedef Key ZM[2][8][16];
KBNKMaterialKey = const ZM& z = Position::zobMaterial;
Position::zobMaterial[WHITE][BISHOP][1] ^
Position::zobMaterial[WHITE][KNIGHT][1]; static const Color W = WHITE;
KKBNMaterialKey = static const Color B = BLACK;
Position::zobMaterial[BLACK][BISHOP][1] ^
Position::zobMaterial[BLACK][KNIGHT][1]; EEFAdd(z[W][PAWN][1], &EvaluateKPK);
KRKPMaterialKey = EEFAdd(z[B][PAWN][1], &EvaluateKKP);
Position::zobMaterial[WHITE][ROOK][1] ^
Position::zobMaterial[BLACK][PAWN][1]; EEFAdd(z[W][BISHOP][1] ^ z[W][KNIGHT][1], &EvaluateKBNK);
KPKRMaterialKey = EEFAdd(z[B][BISHOP][1] ^ z[B][KNIGHT][1], &EvaluateKKBN);
Position::zobMaterial[WHITE][PAWN][1] ^ EEFAdd(z[W][ROOK][1] ^ z[B][PAWN][1], &EvaluateKRKP);
Position::zobMaterial[BLACK][ROOK][1]; EEFAdd(z[W][PAWN][1] ^ z[B][ROOK][1], &EvaluateKPKR);
KRKBMaterialKey = EEFAdd(z[W][ROOK][1] ^ z[B][BISHOP][1], &EvaluateKRKB);
Position::zobMaterial[WHITE][ROOK][1] ^ EEFAdd(z[W][BISHOP][1] ^ z[B][ROOK][1], &EvaluateKBKR);
Position::zobMaterial[BLACK][BISHOP][1]; EEFAdd(z[W][ROOK][1] ^ z[B][KNIGHT][1], &EvaluateKRKN);
KBKRMaterialKey = EEFAdd(z[W][KNIGHT][1] ^ z[B][ROOK][1], &EvaluateKNKR);
Position::zobMaterial[WHITE][BISHOP][1] ^ EEFAdd(z[W][QUEEN][1] ^ z[B][ROOK][1], &EvaluateKQKR);
Position::zobMaterial[BLACK][ROOK][1]; EEFAdd(z[W][ROOK][1] ^ z[B][QUEEN][1], &EvaluateKRKQ);
KRKNMaterialKey =
Position::zobMaterial[WHITE][ROOK][1] ^ KRPKRMaterialKey = z[W][ROOK][1]
Position::zobMaterial[BLACK][KNIGHT][1]; ^ z[W][PAWN][1]
KNKRMaterialKey = ^ z[B][ROOK][1];
Position::zobMaterial[WHITE][KNIGHT][1] ^
Position::zobMaterial[BLACK][ROOK][1]; KRKRPMaterialKey = z[W][ROOK][1]
KQKRMaterialKey = ^ z[B][ROOK][1]
Position::zobMaterial[WHITE][QUEEN][1] ^ ^ z[B][PAWN][1];
Position::zobMaterial[BLACK][ROOK][1];
KRKQMaterialKey =
Position::zobMaterial[WHITE][ROOK][1] ^
Position::zobMaterial[BLACK][QUEEN][1];
KRPKRMaterialKey =
Position::zobMaterial[WHITE][ROOK][1] ^
Position::zobMaterial[WHITE][PAWN][1] ^
Position::zobMaterial[BLACK][ROOK][1];
KRKRPMaterialKey =
Position::zobMaterial[WHITE][ROOK][1] ^
Position::zobMaterial[BLACK][ROOK][1] ^
Position::zobMaterial[BLACK][PAWN][1];
KRPPKRPMaterialKey = KRPPKRPMaterialKey =
Position::zobMaterial[WHITE][ROOK][1] ^ z[W][ROOK][1] ^
Position::zobMaterial[WHITE][PAWN][1] ^ z[W][PAWN][1] ^
Position::zobMaterial[WHITE][PAWN][2] ^ z[W][PAWN][2] ^
Position::zobMaterial[BLACK][ROOK][1] ^ z[B][ROOK][1] ^
Position::zobMaterial[BLACK][PAWN][1]; z[B][PAWN][1];
KRPKRPPMaterialKey = KRPKRPPMaterialKey =
Position::zobMaterial[WHITE][ROOK][1] ^ z[W][ROOK][1] ^
Position::zobMaterial[WHITE][PAWN][1] ^ z[W][PAWN][1] ^
Position::zobMaterial[BLACK][ROOK][1] ^ z[B][ROOK][1] ^
Position::zobMaterial[BLACK][PAWN][1] ^ z[B][PAWN][1] ^
Position::zobMaterial[BLACK][PAWN][2]; z[B][PAWN][2];
KNNKMaterialKey = KNNKMaterialKey =
Position::zobMaterial[WHITE][KNIGHT][1] ^ z[W][KNIGHT][1] ^
Position::zobMaterial[WHITE][KNIGHT][2]; z[W][KNIGHT][2];
KKNNMaterialKey = KKNNMaterialKey =
Position::zobMaterial[BLACK][KNIGHT][1] ^ z[B][KNIGHT][1] ^
Position::zobMaterial[BLACK][KNIGHT][2]; z[B][KNIGHT][2];
KBPKBMaterialKey = KBPKBMaterialKey =
Position::zobMaterial[WHITE][BISHOP][1] ^ z[W][BISHOP][1] ^
Position::zobMaterial[WHITE][PAWN][1] ^ z[W][PAWN][1] ^
Position::zobMaterial[BLACK][BISHOP][1]; z[B][BISHOP][1];
KBKBPMaterialKey = KBKBPMaterialKey =
Position::zobMaterial[WHITE][BISHOP][1] ^ z[W][BISHOP][1] ^
Position::zobMaterial[BLACK][BISHOP][1] ^ z[B][BISHOP][1] ^
Position::zobMaterial[BLACK][PAWN][1]; z[B][PAWN][1];
KBPKNMaterialKey = KBPKNMaterialKey =
Position::zobMaterial[WHITE][BISHOP][1] ^ z[W][BISHOP][1] ^
Position::zobMaterial[WHITE][PAWN][1] ^ z[W][PAWN][1] ^
Position::zobMaterial[BLACK][KNIGHT][1]; z[B][KNIGHT][1];
KNKBPMaterialKey = KNKBPMaterialKey =
Position::zobMaterial[WHITE][KNIGHT][1] ^ z[W][KNIGHT][1] ^
Position::zobMaterial[BLACK][BISHOP][1] ^ z[B][BISHOP][1] ^
Position::zobMaterial[BLACK][PAWN][1]; z[B][PAWN][1];
KNPKMaterialKey = KNPKMaterialKey =
Position::zobMaterial[WHITE][KNIGHT][1] ^ z[W][KNIGHT][1] ^
Position::zobMaterial[WHITE][PAWN][1]; z[W][PAWN][1];
KKNPMaterialKey = KKNPMaterialKey =
Position::zobMaterial[BLACK][KNIGHT][1] ^ z[B][KNIGHT][1] ^
Position::zobMaterial[BLACK][PAWN][1]; z[B][PAWN][1];
KPKPMaterialKey = KPKPMaterialKey =
Position::zobMaterial[WHITE][PAWN][1] ^ z[W][PAWN][1] ^
Position::zobMaterial[BLACK][PAWN][1]; z[B][PAWN][1];
} }
/// Constructor for the MaterialInfoTable class. /// Constructor for the MaterialInfoTable class.
MaterialInfoTable::MaterialInfoTable(unsigned numOfEntries) { MaterialInfoTable::MaterialInfoTable(unsigned numOfEntries) {
size = numOfEntries; size = numOfEntries;
entries = new MaterialInfo[size]; entries = new MaterialInfo[size];
if(entries == NULL) { if (!entries)
std::cerr << "Failed to allocate " << (numOfEntries * sizeof(MaterialInfo)) {
<< " bytes for material hash table." << std::endl; std::cerr << "Failed to allocate " << (numOfEntries * sizeof(MaterialInfo))
exit(EXIT_FAILURE); << " bytes for material hash table." << std::endl;
exit(EXIT_FAILURE);
} }
this->clear(); clear();
} }
/// Destructor for the MaterialInfoTable class. /// Destructor for the MaterialInfoTable class.
MaterialInfoTable::~MaterialInfoTable() { MaterialInfoTable::~MaterialInfoTable() {
delete [] entries; delete [] entries;
} }
@ -173,6 +168,7 @@ MaterialInfoTable::~MaterialInfoTable() {
/// all entries to 0. /// all entries to 0.
void MaterialInfoTable::clear() { void MaterialInfoTable::clear() {
memset(entries, 0, size * sizeof(MaterialInfo)); memset(entries, 0, size * sizeof(MaterialInfo));
} }
@ -184,6 +180,7 @@ void MaterialInfoTable::clear() {
/// same material configuration occurs again. /// same material configuration occurs again.
MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) { MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
Key key = pos.get_material_key(); Key key = pos.get_material_key();
int index = key & (size - 1); int index = key & (size - 1);
MaterialInfo *mi = entries + index; MaterialInfo *mi = entries + index;
@ -200,76 +197,36 @@ MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
// A special case before looking for a specialized evaluation function: // A special case before looking for a specialized evaluation function:
// KNN vs K is a draw: // KNN vs K is a draw:
if(key == KNNKMaterialKey || key == KKNNMaterialKey) { if (key == KNNKMaterialKey || key == KKNNMaterialKey)
{
mi->factor[WHITE] = mi->factor[BLACK] = 0; mi->factor[WHITE] = mi->factor[BLACK] = 0;
return mi; return mi;
} }
// Let's look if we have a specialized evaluation function for this // Let's look if we have a specialized evaluation function for this
// particular material configuration: // particular material configuration
if(key == KPKMaterialKey) { if (EEFmap.find(key) != EEFmap.end())
mi->evaluationFunction = &EvaluateKPK; {
return mi; mi->evaluationFunction = EEFmap[key];
return mi;
} }
else if(key == KKPMaterialKey) { else if ( pos.non_pawn_material(BLACK) == Value(0)
mi->evaluationFunction = &EvaluateKKP; && pos.piece_count(BLACK, PAWN) == 0
return mi; && pos.non_pawn_material(WHITE) >= RookValueEndgame)
{
mi->evaluationFunction = &EvaluateKXK;
return mi;
} }
else if(key == KBNKMaterialKey) { else if ( pos.non_pawn_material(WHITE) == Value(0)
mi->evaluationFunction = &EvaluateKBNK; && pos.piece_count(WHITE, PAWN) == 0
return mi; && pos.non_pawn_material(BLACK) >= RookValueEndgame)
} {
else if(key == KKBNMaterialKey) { mi->evaluationFunction = &EvaluateKKX;
mi->evaluationFunction = &EvaluateKKBN; return mi;
return mi;
}
else if(key == KRKPMaterialKey) {
mi->evaluationFunction = &EvaluateKRKP;
return mi;
}
else if(key == KPKRMaterialKey) {
mi->evaluationFunction = &EvaluateKPKR;
return mi;
}
else if(key == KRKBMaterialKey) {
mi->evaluationFunction = &EvaluateKRKB;
return mi;
}
else if(key == KBKRMaterialKey) {
mi->evaluationFunction = &EvaluateKBKR;
return mi;
}
else if(key == KRKNMaterialKey) {
mi->evaluationFunction = &EvaluateKRKN;
return mi;
}
else if(key == KNKRMaterialKey) {
mi->evaluationFunction = &EvaluateKNKR;
return mi;
}
else if(key == KQKRMaterialKey) {
mi->evaluationFunction = &EvaluateKQKR;
return mi;
}
else if(key == KRKQMaterialKey) {
mi->evaluationFunction = &EvaluateKRKQ;
return mi;
}
else if(pos.non_pawn_material(BLACK) == Value(0) &&
pos.piece_count(BLACK, PAWN) == 0 &&
pos.non_pawn_material(WHITE) >= RookValueEndgame) {
mi->evaluationFunction = &EvaluateKXK;
return mi;
}
else if(pos.non_pawn_material(WHITE) == Value(0) &&
pos.piece_count(WHITE, PAWN) == 0 &&
pos.non_pawn_material(BLACK) >= RookValueEndgame) {
mi->evaluationFunction = &EvaluateKKX;
return mi;
} }
// OK, we didn't find any special evaluation function for the current // OK, we didn't find any special evaluation function for the current
// material configuration. Is there a suitable scaling function? // material configuration. Is there a suitable scaling function?
// //
// The code below is rather messy, and it could easily get worse later, // The code below is rather messy, and it could easily get worse later,
// if we decide to add more special cases. We face problems when there // if we decide to add more special cases. We face problems when there