Skip to content

Commit

Permalink
Stockfish 07312018
Browse files Browse the repository at this point in the history
Small tweaks to recent code changes
  • Loading branch information
amchess committed Jul 31, 2018
1 parent d827c95 commit d186d0e
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 28 deletions.
2 changes: 1 addition & 1 deletion src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1092,7 +1092,7 @@ namespace {
int lmrDepth = std::max(newDepth - reduction<PvNode>(improving, depth, moveCount), DEPTH_ZERO) / ONE_PLY;

// Countermoves based pruning (~20 Elo)
if ( lmrDepth <= ((ss-1)->statScore > 0 ? 3 : 2)
if ( lmrDepth < 3 + ((ss-1)->statScore > 0)
&& (*contHist[0])[movedPiece][to_sq(move)] < CounterMovePruneThreshold
&& (*contHist[1])[movedPiece][to_sq(move)] < CounterMovePruneThreshold)
continue;
Expand Down
77 changes: 51 additions & 26 deletions src/syzygy/tbprobe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ int Tablebases::MaxCardinality;

namespace {

constexpr int TBPIECES = 6; // Max number of supported pieces
constexpr int TBPIECES = 7; // Max number of supported pieces

enum { BigEndian, LittleEndian };
enum TBType { KEY, WDL, DTZ }; // Used as template parameter

// Each table has a set of flags: all of them refer to DTZ tables, the last one to WDL tables
enum TBFlag { STM = 1, Mapped = 2, WinPlies = 4, LossPlies = 8, SingleValue = 128 };
enum TBFlag { STM = 1, Mapped = 2, WinPlies = 4, LossPlies = 8, Wide = 16, SingleValue = 128 };

inline WDLScore operator-(WDLScore d) { return WDLScore(-int(d)); }
inline Square operator^=(Square& s, int i) { return s = Square(int(s) ^ i); }
Expand All @@ -75,8 +75,8 @@ int MapA1D1D4[SQUARE_NB];
int MapKK[10][SQUARE_NB]; // [MapA1D1D4][SQUARE_NB]

int Binomial[6][SQUARE_NB]; // [k][n] k elements from a set of n elements
int LeadPawnIdx[5][SQUARE_NB]; // [leadPawnsCnt][SQUARE_NB]
int LeadPawnsSize[5][4]; // [leadPawnsCnt][FILE_A..FILE_D]
int LeadPawnIdx[6][SQUARE_NB]; // [leadPawnsCnt][SQUARE_NB]
int LeadPawnsSize[6][4]; // [leadPawnsCnt][FILE_A..FILE_D]

// Comparison function to sort leading pawns in ascending MapPawns[] order
bool pawns_comp(Square i, Square j) { return MapPawns[i] < MapPawns[j]; }
Expand Down Expand Up @@ -144,16 +144,15 @@ static_assert(sizeof(SparseEntry) == 6, "SparseEntry must be 6 bytes");
typedef uint16_t Sym; // Huffman symbol

struct LR {
enum Side { Left, Right, Value };
enum Side { Left, Right };

uint8_t lr[3]; // The first 12 bits is the left-hand symbol, the second 12
// bits is the right-hand symbol. If symbol has length 1,
// then the first byte is the stored value.
// then the left-hand symbol is the stored value.
template<Side S>
Sym get() {
return S == Left ? ((lr[1] & 0xF) << 8) | lr[0] :
S == Right ? (lr[2] << 4) | (lr[1] >> 4) :
S == Value ? lr[0] : (assert(false), Sym(-1));
S == Right ? (lr[2] << 4) | (lr[1] >> 4) : (assert(false), Sym(-1));
}
};

Expand Down Expand Up @@ -385,7 +384,7 @@ class TBTables {

typedef std::tuple<Key, TBTable<WDL>*, TBTable<DTZ>*> Entry;

static const int Size = 1 << 12; // 4K table, indexed by key's 12 lsb
static const int Size = 1 << 16; // 64K table, indexed by key's 16 lsb

Entry hashTable[Size];

Expand Down Expand Up @@ -487,7 +486,7 @@ int decompress_pairs(PairsData* d, uint64_t idx) {
// I(k) = k * d->span + d->span / 2 (1)

// First step is to get the 'k' of the I(k) nearest to our idx, using definition (1)
uint32_t k = uint32_t(idx / d->span);
uint32_t k = idx / d->span;

// Then we read the corresponding SparseIndex[] entry
uint32_t block = number<uint32_t, LittleEndian>(&d->sparseIndex[k].block);
Expand All @@ -512,7 +511,7 @@ int decompress_pairs(PairsData* d, uint64_t idx) {
offset -= d->blockLength[block++] + 1;

// Finally, we find the start address of our block of canonical Huffman symbols
uint32_t* ptr = (uint32_t*)(d->data + block * d->sizeofBlock);
uint32_t* ptr = (uint32_t*)(d->data + ((uint64_t)block * d->sizeofBlock));

// Read the first 64 bits in our block, this is a (truncated) sequence of
// unknown number of symbols of unknown length but we know the first one
Expand All @@ -533,7 +532,7 @@ int decompress_pairs(PairsData* d, uint64_t idx) {
// All the symbols of a given length are consecutive integers (numerical
// sequence property), so we can compute the offset of our symbol of
// length len, stored at the beginning of buf64.
sym = uint16_t((buf64 - d->base64[len]) >> (64 - len - d->minSymLen));
sym = (buf64 - d->base64[len]) >> (64 - len - d->minSymLen);

// Now add the value of the lowest symbol of length len to get our symbol
sym += number<Sym, LittleEndian>(&d->lowestSym[len]);
Expand Down Expand Up @@ -575,7 +574,7 @@ int decompress_pairs(PairsData* d, uint64_t idx) {
}
}

return d->btree[sym].get<LR::Value>();
return d->btree[sym].get<LR::Left>();
}

bool check_dtz_stm(TBTable<WDL>*, int, File) { return true; }
Expand All @@ -601,8 +600,12 @@ int map_score(TBTable<DTZ>* entry, File f, int value, WDLScore wdl) {

uint8_t* map = entry->map;
uint16_t* idx = entry->get(0, f)->map_idx;
if (flags & TBFlag::Mapped)
value = map[idx[WDLMap[wdl + 2]] + value];
if (flags & TBFlag::Mapped) {
if (flags & TBFlag::Wide)
value = ((uint16_t *)map)[idx[WDLMap[wdl + 2]] + value];
else
value = map[idx[WDLMap[wdl + 2]] + value];
}

// DTZ tables store distance to zero in number of moves or plies. We
// want to return plies, so we have convert to plies when needed.
Expand Down Expand Up @@ -935,7 +938,7 @@ uint8_t* set_sizes(PairsData* d, uint8_t* data) {

// groupLen[] is a zero-terminated list of group lengths, the last groupIdx[]
// element stores the biggest index that is the tb size.
size_t tbSize = size_t(d->groupIdx[std::find(d->groupLen, d->groupLen + 7, 0) - d->groupLen]);
uint64_t tbSize = d->groupIdx[std::find(d->groupLen, d->groupLen + 7, 0) - d->groupLen];

d->sizeofBlock = 1ULL << *data++;
d->span = 1ULL << *data++;
Expand Down Expand Up @@ -994,11 +997,22 @@ uint8_t* set_dtz_map(TBTable<DTZ>& e, uint8_t* data, File maxFile) {
e.map = data;

for (File f = FILE_A; f <= maxFile; ++f) {
if (e.get(0, f)->flags & TBFlag::Mapped)
for (int i = 0; i < 4; ++i) { // Sequence like 3,x,x,x,1,x,0,2,x,x
e.get(0, f)->map_idx[i] = (uint16_t)(data - e.map + 1);
data += *data + 1;
auto flags = e.get(0, f)->flags;
if (flags & TBFlag::Mapped) {
if (flags & TBFlag::Wide) {
data += (uintptr_t)data & 1; // Word alignment, we may have a mixed table
for (int i = 0; i < 4; ++i) { // Sequence like 3,x,x,x,1,x,0,2,x,x
e.get(0, f)->map_idx[i] = (uint16_t)((uint16_t *)data - (uint16_t *)e.map + 1);
data += 2 * number<uint16_t, LittleEndian>(data) + 2;
}
}
else {
for (int i = 0; i < 4; ++i) {
e.get(0, f)->map_idx[i] = (uint16_t)(data - e.map + 1);
data += *data + 1;
}
}
}
}

return data += (uintptr_t)data & 1; // Word alignment
Expand Down Expand Up @@ -1274,9 +1288,9 @@ void Tablebases::init(const std::string& paths) {
// among pawns with same file, the one with lowest rank.
int availableSquares = 47; // Available squares when lead pawn is in a2

// Init the tables for the encoding of leading pawns group: with 6-men TB we
// can have up to 4 leading pawns (KPPPPK).
for (int leadPawnsCnt = 1; leadPawnsCnt <= 4; ++leadPawnsCnt)
// Init the tables for the encoding of leading pawns group: with 7-men TB we
// can have up to 5 leading pawns (KPPPPPK).
for (int leadPawnsCnt = 1; leadPawnsCnt <= 5; ++leadPawnsCnt)
for (File f = FILE_A; f <= FILE_D; ++f)
{
// Restart the index at every file because TB table is splitted
Expand Down Expand Up @@ -1320,11 +1334,22 @@ void Tablebases::init(const std::string& paths) {
for (PieceType p3 = PAWN; p3 <= p2; ++p3) {
TBTables.add({KING, p1, p2, p3, KING});

for (PieceType p4 = PAWN; p4 <= p3; ++p4)
for (PieceType p4 = PAWN; p4 <= p3; ++p4) {
TBTables.add({KING, p1, p2, p3, p4, KING});

for (PieceType p4 = PAWN; p4 < KING; ++p4)
for (PieceType p5 = PAWN; p5 <= p4; ++p5)
TBTables.add({KING, p1, p2, p3, p4, p5, KING});

for (PieceType p5 = PAWN; p5 < KING; ++p5)
TBTables.add({KING, p1, p2, p3, p4, KING, p5});
}

for (PieceType p4 = PAWN; p4 < KING; ++p4) {
TBTables.add({KING, p1, p2, p3, KING, p4});

for (PieceType p5 = PAWN; p5 <= p4; ++p5)
TBTables.add({KING, p1, p2, p3, KING, p4, p5});
}
}

for (PieceType p3 = PAWN; p3 <= p1; ++p3)
Expand Down Expand Up @@ -1541,4 +1566,4 @@ bool Tablebases::root_probe_wdl(Position& pos, Search::RootMoves& rootMoves) {
}

return true;
}
}
2 changes: 1 addition & 1 deletion src/ucioption.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ void init(OptionsMap& o) {
o["LoadEpdToHash"] << Option(LoadEpdToHash);
o["SyzygyPath"] << Option("<empty>", on_tb_path);
o["SyzygyProbeDepth"] << Option(1, 1, 100);
o["SyzygyProbeLimit"] << Option(6, 0, 6);
o["SyzygyProbeLimit"] << Option(7, 0, 7);
o["Deep Analysis Mode"] << Option(0, 0, 8);
o["Clean Search"] << Option(false);
o["Variety"] << Option (0, 0, 40);
Expand Down

0 comments on commit d186d0e

Please # to comment.