mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Let material probing to access per-thread table
It is up to material (and pawn) table look up code to know where the per-thread tables are, so change API to reflect this. Also some comment fixing while there No functional change.
This commit is contained in:
parent
19b8249ff4
commit
91cc82aa25
10 changed files with 66 additions and 66 deletions
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring> // For memset
|
#include <cstring> // For std::memset
|
||||||
|
|
||||||
#include "bitboard.h"
|
#include "bitboard.h"
|
||||||
#include "bitcount.h"
|
#include "bitcount.h"
|
||||||
|
|
|
@ -76,7 +76,7 @@ template<typename T>
|
||||||
struct EndgameBase {
|
struct EndgameBase {
|
||||||
|
|
||||||
virtual ~EndgameBase() {}
|
virtual ~EndgameBase() {}
|
||||||
virtual Color color() const = 0;
|
virtual Color strong_side() const = 0;
|
||||||
virtual T operator()(const Position&) const = 0;
|
virtual T operator()(const Position&) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ template<EndgameType E, typename T = typename eg_fun<(E > SCALE_FUNS)>::type>
|
||||||
struct Endgame : public EndgameBase<T> {
|
struct Endgame : public EndgameBase<T> {
|
||||||
|
|
||||||
explicit Endgame(Color c) : strongSide(c), weakSide(~c) {}
|
explicit Endgame(Color c) : strongSide(c), weakSide(~c) {}
|
||||||
Color color() const { return strongSide; }
|
Color strong_side() const { return strongSide; }
|
||||||
T operator()(const Position&) const;
|
T operator()(const Position&) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <cstring> // For std::memset
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
@ -26,7 +27,6 @@
|
||||||
#include "evaluate.h"
|
#include "evaluate.h"
|
||||||
#include "material.h"
|
#include "material.h"
|
||||||
#include "pawns.h"
|
#include "pawns.h"
|
||||||
#include "thread.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -677,7 +677,6 @@ namespace {
|
||||||
|
|
||||||
EvalInfo ei;
|
EvalInfo ei;
|
||||||
Score score, mobility[2] = { SCORE_ZERO, SCORE_ZERO };
|
Score score, mobility[2] = { SCORE_ZERO, SCORE_ZERO };
|
||||||
Thread* thisThread = pos.this_thread();
|
|
||||||
|
|
||||||
// Initialize score by reading the incrementally updated scores included
|
// Initialize score by reading the incrementally updated scores included
|
||||||
// in the position object (material + piece square tables).
|
// in the position object (material + piece square tables).
|
||||||
|
@ -685,7 +684,7 @@ namespace {
|
||||||
score = pos.psq_score();
|
score = pos.psq_score();
|
||||||
|
|
||||||
// Probe the material hash table
|
// Probe the material hash table
|
||||||
ei.mi = Material::probe(pos, thisThread->materialTable, thisThread->endgames);
|
ei.mi = Material::probe(pos);
|
||||||
score += ei.mi->imbalance();
|
score += ei.mi->imbalance();
|
||||||
|
|
||||||
// If we have a specialized evaluation function for the current material
|
// If we have a specialized evaluation function for the current material
|
||||||
|
@ -694,7 +693,7 @@ namespace {
|
||||||
return ei.mi->evaluate(pos);
|
return ei.mi->evaluate(pos);
|
||||||
|
|
||||||
// Probe the pawn hash table
|
// Probe the pawn hash table
|
||||||
ei.pi = Pawns::probe(pos, thisThread->pawnsTable);
|
ei.pi = Pawns::probe(pos);
|
||||||
score += apply_weight(ei.pi->pawns_score(), Weights[PawnStructure]);
|
score += apply_weight(ei.pi->pawns_score(), Weights[PawnStructure]);
|
||||||
|
|
||||||
// Initialize attack and king safety bitboards
|
// Initialize attack and king safety bitboards
|
||||||
|
|
|
@ -17,11 +17,12 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <algorithm> // For std::min
|
#include <algorithm> // For std::min
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring> // For std::memset
|
||||||
|
|
||||||
#include "material.h"
|
#include "material.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -32,7 +33,7 @@ namespace {
|
||||||
// pair pawn knight bishop rook queen
|
// pair pawn knight bishop rook queen
|
||||||
const int Linear[6] = { 1852, -162, -1122, -183, 249, -154 };
|
const int Linear[6] = { 1852, -162, -1122, -183, 249, -154 };
|
||||||
|
|
||||||
const int QuadraticSameSide[][PIECE_TYPE_NB] = {
|
const int QuadraticOurs[][PIECE_TYPE_NB] = {
|
||||||
// OUR PIECES
|
// OUR PIECES
|
||||||
// pair pawn knight bishop rook queen
|
// pair pawn knight bishop rook queen
|
||||||
{ 0 }, // Bishop pair
|
{ 0 }, // Bishop pair
|
||||||
|
@ -43,7 +44,7 @@ namespace {
|
||||||
{-177, 25, 129, 142, -137, 0 } // Queen
|
{-177, 25, 129, 142, -137, 0 } // Queen
|
||||||
};
|
};
|
||||||
|
|
||||||
const int QuadraticOppositeSide[][PIECE_TYPE_NB] = {
|
const int QuadraticTheirs[][PIECE_TYPE_NB] = {
|
||||||
// THEIR PIECES
|
// THEIR PIECES
|
||||||
// pair pawn knight bishop rook queen
|
// pair pawn knight bishop rook queen
|
||||||
{ 0 }, // Bishop pair
|
{ 0 }, // Bishop pair
|
||||||
|
@ -56,7 +57,7 @@ namespace {
|
||||||
|
|
||||||
// Endgame evaluation and scaling functions are accessed directly and not through
|
// Endgame evaluation and scaling functions are accessed directly and not through
|
||||||
// the function maps because they correspond to more than one material hash key.
|
// the function maps because they correspond to more than one material hash key.
|
||||||
Endgame<KXK> EvaluateKXK[] = { Endgame<KXK>(WHITE), Endgame<KXK>(BLACK) };
|
Endgame<KXK> EvaluateKXK[] = { Endgame<KXK>(WHITE), Endgame<KXK>(BLACK) };
|
||||||
|
|
||||||
Endgame<KBPsK> ScaleKBPsK[] = { Endgame<KBPsK>(WHITE), Endgame<KBPsK>(BLACK) };
|
Endgame<KBPsK> ScaleKBPsK[] = { Endgame<KBPsK>(WHITE), Endgame<KBPsK>(BLACK) };
|
||||||
Endgame<KQKRPs> ScaleKQKRPs[] = { Endgame<KQKRPs>(WHITE), Endgame<KQKRPs>(BLACK) };
|
Endgame<KQKRPs> ScaleKQKRPs[] = { Endgame<KQKRPs>(WHITE), Endgame<KQKRPs>(BLACK) };
|
||||||
|
@ -104,8 +105,8 @@ namespace {
|
||||||
int v = Linear[pt1];
|
int v = Linear[pt1];
|
||||||
|
|
||||||
for (int pt2 = NO_PIECE_TYPE; pt2 <= pt1; ++pt2)
|
for (int pt2 = NO_PIECE_TYPE; pt2 <= pt1; ++pt2)
|
||||||
v += QuadraticSameSide[pt1][pt2] * pieceCount[Us][pt2]
|
v += QuadraticOurs[pt1][pt2] * pieceCount[Us][pt2]
|
||||||
+ QuadraticOppositeSide[pt1][pt2] * pieceCount[Them][pt2];
|
+ QuadraticTheirs[pt1][pt2] * pieceCount[Them][pt2];
|
||||||
|
|
||||||
bonus += pieceCount[Us][pt1] * v;
|
bonus += pieceCount[Us][pt1] * v;
|
||||||
}
|
}
|
||||||
|
@ -117,19 +118,16 @@ namespace {
|
||||||
|
|
||||||
namespace Material {
|
namespace Material {
|
||||||
|
|
||||||
/// Material::probe() takes a position object as input, looks up a MaterialEntry
|
/// Material::probe() looks up the current position's material configuration in
|
||||||
/// object, and returns a pointer to it. If the material configuration is not
|
/// the material hash table. It returns a pointer to the Entry if the position
|
||||||
/// already present in the table, it is computed and stored there, so we don't
|
/// is found. Otherwise a new Entry is computed and stored there, so we don't
|
||||||
/// have to recompute everything when the same material configuration occurs again.
|
/// have to recompute all when the same material configuration occurs again.
|
||||||
|
|
||||||
Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
|
Entry* probe(const Position& pos) {
|
||||||
|
|
||||||
Key key = pos.material_key();
|
Key key = pos.material_key();
|
||||||
Entry* e = entries[key];
|
Entry* e = pos.this_thread()->materialTable[key];
|
||||||
|
|
||||||
// If e->key matches the position's material hash key, it means that we
|
|
||||||
// have analysed this material configuration before, and we can simply
|
|
||||||
// return the information we found the last time instead of recomputing it.
|
|
||||||
if (e->key == key)
|
if (e->key == key)
|
||||||
return e;
|
return e;
|
||||||
|
|
||||||
|
@ -141,7 +139,7 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
|
||||||
// Let's look if we have a specialized evaluation function for this particular
|
// Let's look if we have a specialized evaluation function for this particular
|
||||||
// material configuration. Firstly we look for a fixed configuration one, then
|
// material configuration. Firstly we look for a fixed configuration one, then
|
||||||
// for a generic one if the previous search failed.
|
// for a generic one if the previous search failed.
|
||||||
if (endgames.probe(key, e->evaluationFunction))
|
if (pos.this_thread()->endgames.probe(key, e->evaluationFunction))
|
||||||
return e;
|
return e;
|
||||||
|
|
||||||
if (is_KXK<WHITE>(pos))
|
if (is_KXK<WHITE>(pos))
|
||||||
|
@ -156,22 +154,19 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
||||||
// material configuration. Is there a suitable scaling function?
|
// configuration. Is there a suitable specialized scaling function?
|
||||||
//
|
|
||||||
// We face problems when there are several conflicting applicable
|
|
||||||
// scaling functions and we need to decide which one to use.
|
|
||||||
EndgameBase<ScaleFactor>* sf;
|
EndgameBase<ScaleFactor>* sf;
|
||||||
|
|
||||||
if (endgames.probe(key, sf))
|
if (pos.this_thread()->endgames.probe(key, sf))
|
||||||
{
|
{
|
||||||
e->scalingFunction[sf->color()] = sf;
|
e->scalingFunction[sf->strong_side()] = sf; // Only strong color assigned
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic scaling functions that refer to more than one material
|
// We didn't find any specialized scaling function, so fall back on generic
|
||||||
// distribution. They should be probed after the specialized ones.
|
// ones that refer to more than one material distribution. Note that in this
|
||||||
// Note that these ones don't return after setting the function.
|
// case we don't return after setting the function.
|
||||||
if (is_KBPsKs<WHITE>(pos))
|
if (is_KBPsKs<WHITE>(pos))
|
||||||
e->scalingFunction[WHITE] = &ScaleKBPsK[WHITE];
|
e->scalingFunction[WHITE] = &ScaleKBPsK[WHITE];
|
||||||
|
|
||||||
|
@ -187,16 +182,18 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
|
||||||
Value npm_w = pos.non_pawn_material(WHITE);
|
Value npm_w = pos.non_pawn_material(WHITE);
|
||||||
Value npm_b = pos.non_pawn_material(BLACK);
|
Value npm_b = pos.non_pawn_material(BLACK);
|
||||||
|
|
||||||
if (npm_w + npm_b == VALUE_ZERO && pos.pieces(PAWN))
|
if (npm_w + npm_b == VALUE_ZERO && pos.pieces(PAWN)) // Only pawns on the board
|
||||||
{
|
{
|
||||||
if (!pos.count<PAWN>(BLACK))
|
if (!pos.count<PAWN>(BLACK))
|
||||||
{
|
{
|
||||||
assert(pos.count<PAWN>(WHITE) >= 2);
|
assert(pos.count<PAWN>(WHITE) >= 2);
|
||||||
|
|
||||||
e->scalingFunction[WHITE] = &ScaleKPsK[WHITE];
|
e->scalingFunction[WHITE] = &ScaleKPsK[WHITE];
|
||||||
}
|
}
|
||||||
else if (!pos.count<PAWN>(WHITE))
|
else if (!pos.count<PAWN>(WHITE))
|
||||||
{
|
{
|
||||||
assert(pos.count<PAWN>(BLACK) >= 2);
|
assert(pos.count<PAWN>(BLACK) >= 2);
|
||||||
|
|
||||||
e->scalingFunction[BLACK] = &ScaleKPsK[BLACK];
|
e->scalingFunction[BLACK] = &ScaleKPsK[BLACK];
|
||||||
}
|
}
|
||||||
else if (pos.count<PAWN>(WHITE) == 1 && pos.count<PAWN>(BLACK) == 1)
|
else if (pos.count<PAWN>(WHITE) == 1 && pos.count<PAWN>(BLACK) == 1)
|
||||||
|
@ -208,14 +205,16 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// No pawns makes it difficult to win, even with a material advantage. This
|
// Zero or just one pawn makes it difficult to win, even with a small material
|
||||||
// catches some trivial draws like KK, KBK and KNK and gives a very drawish
|
// advantage. This catches some trivial draws like KK, KBK and KNK and gives a
|
||||||
// scale factor for cases such as KRKBP and KmmKm (except for KBBKN).
|
// drawish scale factor for cases such as KRKBP and KmmKm (except for KBBKN).
|
||||||
if (!pos.count<PAWN>(WHITE) && npm_w - npm_b <= BishopValueMg)
|
if (!pos.count<PAWN>(WHITE) && npm_w - npm_b <= BishopValueMg)
|
||||||
e->factor[WHITE] = uint8_t(npm_w < RookValueMg ? SCALE_FACTOR_DRAW : npm_b <= BishopValueMg ? 4 : 12);
|
e->factor[WHITE] = uint8_t(npm_w < RookValueMg ? SCALE_FACTOR_DRAW :
|
||||||
|
npm_b <= BishopValueMg ? 4 : 12);
|
||||||
|
|
||||||
if (!pos.count<PAWN>(BLACK) && npm_b - npm_w <= BishopValueMg)
|
if (!pos.count<PAWN>(BLACK) && npm_b - npm_w <= BishopValueMg)
|
||||||
e->factor[BLACK] = uint8_t(npm_b < RookValueMg ? SCALE_FACTOR_DRAW : npm_w <= BishopValueMg ? 4 : 12);
|
e->factor[BLACK] = uint8_t(npm_b < RookValueMg ? SCALE_FACTOR_DRAW :
|
||||||
|
npm_w <= BishopValueMg ? 4 : 12);
|
||||||
|
|
||||||
if (pos.count<PAWN>(WHITE) == 1 && npm_w - npm_b <= BishopValueMg)
|
if (pos.count<PAWN>(WHITE) == 1 && npm_w - npm_b <= BishopValueMg)
|
||||||
e->factor[WHITE] = (uint8_t) SCALE_FACTOR_ONEPAWN;
|
e->factor[WHITE] = (uint8_t) SCALE_FACTOR_ONEPAWN;
|
||||||
|
@ -226,13 +225,13 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
|
||||||
// Evaluate the material imbalance. We use PIECE_TYPE_NONE as a place holder
|
// Evaluate the material imbalance. We use PIECE_TYPE_NONE as a place holder
|
||||||
// for the bishop pair "extended piece", which allows us to be more flexible
|
// for the bishop pair "extended piece", which allows us to be more flexible
|
||||||
// in defining bishop pair bonuses.
|
// in defining bishop pair bonuses.
|
||||||
const int pieceCount[COLOR_NB][PIECE_TYPE_NB] = {
|
const int PieceCount[COLOR_NB][PIECE_TYPE_NB] = {
|
||||||
{ pos.count<BISHOP>(WHITE) > 1, pos.count<PAWN>(WHITE), pos.count<KNIGHT>(WHITE),
|
{ pos.count<BISHOP>(WHITE) > 1, pos.count<PAWN>(WHITE), pos.count<KNIGHT>(WHITE),
|
||||||
pos.count<BISHOP>(WHITE) , pos.count<ROOK>(WHITE), pos.count<QUEEN >(WHITE) },
|
pos.count<BISHOP>(WHITE) , pos.count<ROOK>(WHITE), pos.count<QUEEN >(WHITE) },
|
||||||
{ pos.count<BISHOP>(BLACK) > 1, pos.count<PAWN>(BLACK), pos.count<KNIGHT>(BLACK),
|
{ pos.count<BISHOP>(BLACK) > 1, pos.count<PAWN>(BLACK), pos.count<KNIGHT>(BLACK),
|
||||||
pos.count<BISHOP>(BLACK) , pos.count<ROOK>(BLACK), pos.count<QUEEN >(BLACK) } };
|
pos.count<BISHOP>(BLACK) , pos.count<ROOK>(BLACK), pos.count<QUEEN >(BLACK) } };
|
||||||
|
|
||||||
e->value = (int16_t)((imbalance<WHITE>(pieceCount) - imbalance<BLACK>(pieceCount)) / 16);
|
e->value = int16_t((imbalance<WHITE>(PieceCount) - imbalance<BLACK>(PieceCount)) / 16);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,11 +30,11 @@ namespace Material {
|
||||||
/// Material::Entry contains various information about a material configuration.
|
/// Material::Entry contains various information about a material configuration.
|
||||||
/// It contains a material imbalance evaluation, a function pointer to a special
|
/// It contains a material imbalance evaluation, a function pointer to a special
|
||||||
/// endgame evaluation function (which in most cases is NULL, meaning that the
|
/// endgame evaluation function (which in most cases is NULL, meaning that the
|
||||||
/// standard evaluation function will be used), and "scale factors".
|
/// standard evaluation function will be used), and scale factors.
|
||||||
///
|
///
|
||||||
/// The scale factors are used to scale the evaluation score up or down.
|
/// The scale factors are used to scale the evaluation score up or down. For
|
||||||
/// For instance, in KRB vs KR endgames, the score is scaled down by a factor
|
/// instance, in KRB vs KR endgames, the score is scaled down by a factor of 4,
|
||||||
/// of 4, which will result in scores of absolute value less than one pawn.
|
/// which will result in scores of absolute value less than one pawn.
|
||||||
|
|
||||||
struct Entry {
|
struct Entry {
|
||||||
|
|
||||||
|
@ -43,12 +43,11 @@ struct Entry {
|
||||||
bool specialized_eval_exists() const { return evaluationFunction != NULL; }
|
bool specialized_eval_exists() const { return evaluationFunction != NULL; }
|
||||||
Value evaluate(const Position& pos) const { return (*evaluationFunction)(pos); }
|
Value evaluate(const Position& pos) const { return (*evaluationFunction)(pos); }
|
||||||
|
|
||||||
// scale_factor takes a position and a color as input, and returns a scale factor
|
// scale_factor takes a position and a color as input and returns a scale factor
|
||||||
// for the given color. We have to provide the position in addition to the color,
|
// for the given color. We have to provide the position in addition to the color
|
||||||
// because the scale factor need not be a constant: It can also be a function
|
// because the scale factor may also be a function which should be applied to
|
||||||
// which should be applied to the position. For instance, in KBP vs K endgames,
|
// the position. For instance, in KBP vs K endgames, the scaling function looks
|
||||||
// a scaling function for draws with rook pawns and wrong-colored bishops.
|
// for rook pawns and wrong-colored bishops.
|
||||||
|
|
||||||
ScaleFactor scale_factor(const Position& pos, Color c) const {
|
ScaleFactor scale_factor(const Position& pos, Color c) const {
|
||||||
|
|
||||||
return !scalingFunction[c] || (*scalingFunction[c])(pos) == SCALE_FACTOR_NONE
|
return !scalingFunction[c] || (*scalingFunction[c])(pos) == SCALE_FACTOR_NONE
|
||||||
|
@ -59,13 +58,14 @@ struct Entry {
|
||||||
int16_t value;
|
int16_t value;
|
||||||
uint8_t factor[COLOR_NB];
|
uint8_t factor[COLOR_NB];
|
||||||
EndgameBase<Value>* evaluationFunction;
|
EndgameBase<Value>* evaluationFunction;
|
||||||
EndgameBase<ScaleFactor>* scalingFunction[COLOR_NB];
|
EndgameBase<ScaleFactor>* scalingFunction[COLOR_NB]; // Could be one for each
|
||||||
|
// side (e.g. KPKP, KBPsKs)
|
||||||
Phase gamePhase;
|
Phase gamePhase;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef HashTable<Entry, 8192> Table;
|
typedef HashTable<Entry, 8192> Table;
|
||||||
|
|
||||||
Entry* probe(const Position& pos, Table& entries, Endgames& endgames);
|
Entry* probe(const Position& pos);
|
||||||
|
|
||||||
} // namespace Material
|
} // namespace Material
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "bitcount.h"
|
#include "bitcount.h"
|
||||||
#include "pawns.h"
|
#include "pawns.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -202,9 +203,9 @@ namespace {
|
||||||
|
|
||||||
namespace Pawns {
|
namespace Pawns {
|
||||||
|
|
||||||
/// init() initializes some tables used by evaluation. Instead of hard-coded
|
/// Pawns::init() initializes some tables needed by evaluation. Instead of using
|
||||||
/// tables, when makes sense, we prefer to calculate them with a formula to
|
/// hard-coded tables, when makes sense, we prefer to calculate them with a formula
|
||||||
/// reduce independent parameters and to allow easier tuning and better insight.
|
/// to reduce independent parameters and to allow easier tuning and better insight.
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
|
@ -220,14 +221,15 @@ void init()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// probe() takes a position as input, computes a Entry object, and returns a
|
/// Pawns::probe() looks up the current position's pawns configuration in
|
||||||
/// pointer to it. The result is also stored in a hash table, so we don't have
|
/// the pawns hash table. It returns a pointer to the Entry if the position
|
||||||
/// to recompute everything when the same pawn structure occurs again.
|
/// is found. Otherwise a new Entry is computed and stored there, so we don't
|
||||||
|
/// have to recompute all when the same pawns configuration occurs again.
|
||||||
|
|
||||||
Entry* probe(const Position& pos, Table& entries) {
|
Entry* probe(const Position& pos) {
|
||||||
|
|
||||||
Key key = pos.pawn_key();
|
Key key = pos.pawn_key();
|
||||||
Entry* e = entries[key];
|
Entry* e = pos.this_thread()->pawnsTable[key];
|
||||||
|
|
||||||
if (e->key == key)
|
if (e->key == key)
|
||||||
return e;
|
return e;
|
||||||
|
|
|
@ -80,7 +80,7 @@ struct Entry {
|
||||||
typedef HashTable<Entry, 16384> Table;
|
typedef HashTable<Entry, 16384> Table;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
Entry* probe(const Position& pos, Table& entries);
|
Entry* probe(const Position& pos);
|
||||||
|
|
||||||
} // namespace Pawns
|
} // namespace Pawns
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring> // For std::memset
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring> // For std::memset
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring> // For std::memset
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "bitboard.h"
|
#include "bitboard.h"
|
||||||
|
|
Loading…
Add table
Reference in a new issue