X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsyzygy%2Ftbprobe.cpp;h=76d8ec68628eb9995142bdffaa007db9a2fad13d;hp=2dd50a6609427b0ca8e591a3f16315b7d319f1c4;hb=01b6cdb76bbe6cea4d9bb3c23cd285a1d607aedc;hpb=d8f683760c9eb6d2c4714ec83e717dd2143de55c diff --git a/src/syzygy/tbprobe.cpp b/src/syzygy/tbprobe.cpp index 2dd50a66..76d8ec68 100644 --- a/src/syzygy/tbprobe.cpp +++ b/src/syzygy/tbprobe.cpp @@ -531,14 +531,14 @@ 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 defintion (1) + // First step is to get the 'k' of the I(k) nearest to our idx, using definition (1) uint32_t k = idx / d->span; // Then we read the corresponding SparseIndex[] entry uint32_t block = number(&d->sparseIndex[k].block); int offset = number(&d->sparseIndex[k].offset); - // Now compute the difference idx - I(k). From defintion of k we know that + // Now compute the difference idx - I(k). From definition of k we know that // // idx = k * d->span + idx % d->span (2) // @@ -673,7 +673,7 @@ int map_score(DTZEntry* entry, File f, int value, WDLScore wdl) { // idx = Binomial[1][s1] + Binomial[2][s2] + ... + Binomial[k][sk] // template::type> -T do_probe_table(const Position& pos, Entry* entry, WDLScore wdl, ProbeState* result) { +T do_probe_table(const Position& pos, Entry* entry, WDLScore wdl, ProbeState* result) { const bool IsWDL = std::is_same::value; @@ -713,8 +713,9 @@ T do_probe_table(const Position& pos, Entry* entry, WDLScore wdl, ProbeState* r assert(type_of(pc) == PAWN); leadPawns = b = pos.pieces(color_of(pc), PAWN); - while (b) + do squares[size++] = pop_lsb(&b) ^ flipSquares; + while (b); leadPawnsCnt = size; @@ -737,11 +738,13 @@ T do_probe_table(const Position& pos, Entry* entry, WDLScore wdl, ProbeState* r // Now we are ready to get all the position pieces (but the lead pawns) and // directly map them to the correct color and square. b = pos.pieces() ^ leadPawns; - while (b) { + do { Square s = pop_lsb(&b); squares[size] = s ^ flipSquares; pieces[size++] = Piece(pos.piece_on(s) ^ flipColor); - } + } while (b); + + assert(size >= 2); // Then we reorder the pieces to have the same sequence as the one stored // in precomp->pieces[i]: the sequence that ensures the best compression. @@ -978,8 +981,8 @@ uint8_t* set_sizes(PairsData* d, uint8_t* data) { d->flags = *data++; if (d->flags & TBFlag::SingleValue) { - d->blocksNum = d->span = - d->blockLengthSize = d->sparseIndexSize = 0; // Broken MSVC zero-init + d->blocksNum = d->blockLengthSize = 0; + d->span = d->sparseIndexSize = 0; // Broken MSVC zero-init d->minSymLen = *data++; // Here we store the single value return data; } @@ -1107,7 +1110,7 @@ void do_init(Entry& e, T& p, uint8_t* data) { for (File f = FILE_A; f <= MaxFile; ++f) for (int i = 0; i < Sides; i++) { (d = item(p, i, f).precomp)->sparseIndex = (SparseEntry*)data; - data += d->sparseIndexSize * sizeof(SparseEntry) ; + data += d->sparseIndexSize * sizeof(SparseEntry); } for (File f = FILE_A; f <= MaxFile; ++f) @@ -1292,7 +1295,7 @@ void Tablebases::init(const std::string& paths) { if (MapA1D1D4[s1] == idx && (idx || s1 == SQ_B1)) // SQ_B1 is mapped to 0 { for (Square s2 = SQ_A1; s2 <= SQ_H8; ++s2) - if ((StepAttacksBB[KING][s1] | s1) & s2) + if ((PseudoAttacks[KING][s1] | s1) & s2) continue; // Illegal position else if (!off_A1H8(s1) && off_A1H8(s2) > 0) @@ -1517,6 +1520,8 @@ static int has_repeated(StateInfo *st) // no moves were filtered out. bool Tablebases::root_probe(Position& pos, Search::RootMoves& rootMoves, Value& score) { + assert(rootMoves.size()); + ProbeState result; int dtz = probe_dtz(pos, &result); @@ -1562,7 +1567,7 @@ bool Tablebases::root_probe(Position& pos, Search::RootMoves& rootMoves, Value& // Obtain 50-move counter for the root position. // In Stockfish there seems to be no clean way, so we do it like this: - int cnt50 = st.previous->rule50; + int cnt50 = st.previous ? st.previous->rule50 : 0; // Use 50-move counter to determine whether the root position is // won, lost or drawn.