Fathom Probing Crashing

Discussion of chess software programming and technical issues.

Moderator: Ras

Joeger-Bahar
Posts: 5
Joined: Thu Sep 18, 2025 3:55 am
Full name: Joshua Bahr

Fathom Probing Crashing

Post by Joeger-Bahar »

My code that returns WDL at a position. tb_probe_root works fine and returns the expected values. However, tb_probe_wdl crashes because b == 0 in a PopLSB intrinsic function. I've tried not flipping the bitboards, flipping them horizontally, only flipping them for the probe_root, and it still crashes.

Code: Select all

bool Tablebase::ProbeLeaf(Engine* engine, Color color, int& scoreOut) const
{
    const BitboardBoard& board = engine->GetBitboardBoard();
    if (!Probeable(board))
        return false;

    // Flip vertically so LSB is a8 (seems to be the expected format)
    uint64_t white = flipVertical(board.allPieces[0]);
    uint64_t black = flipVertical(board.allPieces[1]);
    uint64_t kings = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::KING) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::KING) - 1]);
    uint64_t queens = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::QUEEN) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::QUEEN) - 1]);
    uint64_t rooks = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::ROOK) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::ROOK) - 1]);
    uint64_t bishops = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::BISHOP) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::BISHOP) - 1]);
    uint64_t knights = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::KNIGHT) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::KNIGHT) - 1]);
    uint64_t pawns = flipVertical(board.pieceBitboards[0][static_cast<int>(Pieces::PAWN) - 1] | board.pieceBitboards[1][static_cast<int>(Pieces::PAWN) - 1]);

    unsigned rule50 = GameState::halfmoves;
    unsigned castling = 0;
    unsigned ep = (GameState::enPassantTarget == -1) ? 0 : GameState::enPassantTarget;
    bool turn = (color == Color::WHITE);

    unsigned wdl = tb_probe_wdl(
        white, black, kings, queens, rooks, bishops,
        knights, pawns, 0, castling, ep, turn);

    if (wdl == TB_RESULT_FAILED)
    {
        std::cout << "Failed\n";
        return false;
    }

    int dtz = 0;
    unsigned result = tb_probe_root(
        white, black, kings, queens, rooks, bishops,
        knights, pawns, rule50, castling, ep, turn, nullptr);
    if (result != TB_RESULT_FAILED)
        dtz = TB_GET_DTZ(result);

    switch (wdl)
    {
    case TB_WIN:
    case TB_CURSED_WIN:
        scoreOut = MATE_VAL - dtz;
        return true;
    case TB_DRAW:
        scoreOut = 0;
        return true;
    case TB_LOSS:
    case TB_BLESSED_LOSS:
        scoreOut = -(MATE_VAL - dtz);
        return true;
    default:
        return false;
    }
}