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:
parent
038235ba35
commit
73cce873de
1 changed files with 104 additions and 147 deletions
251
src/material.cpp
251
src/material.cpp
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue