From 0da461f23b84990d17e1f1341aeb7c0589ab98e7 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 6 Dec 2010 10:26:01 +0100 Subject: [PATCH 1/1] Various cleanups in Position's ancillary functions No functional change. Signed-off-by: Marco Costalba --- src/position.cpp | 164 +++++++++++++++++++---------------------------- src/position.h | 18 ++++-- 2 files changed, 76 insertions(+), 106 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 001d233d..ded3dd17 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -312,7 +312,7 @@ bool Position::set_castling_rights(char token) { for (Square sq = sqH; sq >= sqA; sq--) if (piece_on(sq) == rook) { - allow_oo(c); + do_allow_oo(c); initialKRFile = square_file(sq); break; } @@ -322,7 +322,7 @@ bool Position::set_castling_rights(char token) { for (Square sq = sqA; sq <= sqH; sq++) if (piece_on(sq) == rook) { - allow_ooo(c); + do_allow_ooo(c); initialQRFile = square_file(sq); break; } @@ -332,12 +332,12 @@ bool Position::set_castling_rights(char token) { File rookFile = File(token - 'A') + FILE_A; if (rookFile < initialKFile) { - allow_ooo(c); + do_allow_ooo(c); initialQRFile = rookFile; } else { - allow_oo(c); + do_allow_oo(c); initialKRFile = rookFile; } } @@ -1393,7 +1393,7 @@ int Position::see_sign(Move m) const { int Position::see(Square from, Square to) const { - Bitboard occ, attackers, stmAttackers, b; + Bitboard occupied, attackers, stmAttackers, b; int swapList[32], slIndex = 1; PieceType capturedType, pt; Color stm; @@ -1407,30 +1407,30 @@ int Position::see(Square from, Square to) const { if (capturedType == KING) return seeValues[capturedType]; - occ = occupied_squares(); + occupied = occupied_squares(); // Handle en passant moves if (st->epSquare == to && type_of_piece_on(from) == PAWN) { - Square capQq = (side_to_move() == WHITE) ? (to - DELTA_N) : (to - DELTA_S); + Square capQq = (side_to_move() == WHITE ? to - DELTA_N : to - DELTA_S); assert(capturedType == PIECE_TYPE_NONE); assert(type_of_piece_on(capQq) == PAWN); // Remove the captured pawn - clear_bit(&occ, capQq); + clear_bit(&occupied, capQq); capturedType = PAWN; } // Find all attackers to the destination square, with the moving piece // removed, but possibly an X-ray attacker added behind it. - clear_bit(&occ, from); - attackers = (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN)) - | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN)) - | (attacks_from(to) & pieces(KNIGHT)) - | (attacks_from(to) & pieces(KING)) - | (attacks_from(to, WHITE) & pieces(PAWN, BLACK)) - | (attacks_from(to, BLACK) & pieces(PAWN, WHITE)); + clear_bit(&occupied, from); + attackers = (rook_attacks_bb(to, occupied) & pieces(ROOK, QUEEN)) + | (bishop_attacks_bb(to, occupied)& pieces(BISHOP, QUEEN)) + | (attacks_from(to) & pieces(KNIGHT)) + | (attacks_from(to) & pieces(KING)) + | (attacks_from(to, WHITE) & pieces(PAWN, BLACK)) + | (attacks_from(to, BLACK) & pieces(PAWN, WHITE)); // If the opponent has no attackers we are finished stm = opposite_color(color_of_piece_on(from)); @@ -1454,28 +1454,28 @@ int Position::see(Square from, Square to) const { for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++) assert(pt < KING); - // Remove the attacker we just found from the 'attackers' bitboard, + // Remove the attacker we just found from the 'occupied' bitboard, // and scan for new X-ray attacks behind the attacker. b = stmAttackers & pieces(pt); - occ ^= (b & (~b + 1)); - attackers |= (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN)) - | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN)); + occupied ^= (b & (~b + 1)); + attackers |= (rook_attacks_bb(to, occupied) & pieces(ROOK, QUEEN)) + | (bishop_attacks_bb(to, occupied) & pieces(BISHOP, QUEEN)); - attackers &= occ; // Cut out pieces we've already done + attackers &= occupied; // Cut out pieces we've already done // Add the new entry to the swap list assert(slIndex < 32); swapList[slIndex] = -swapList[slIndex - 1] + seeValues[capturedType]; slIndex++; - // Remember the value of the capturing piece, and change the side to move - // before beginning the next iteration + // Remember the value of the capturing piece, and change the side to + // move before beginning the next iteration. capturedType = pt; stm = opposite_color(stm); stmAttackers = attackers & pieces_of_color(stm); - // Stop after a king capture - if (pt == KING && stmAttackers) + // Stop before processing a king capture + if (capturedType == KING && stmAttackers) { assert(slIndex < 32); swapList[slIndex++] = QueenValueMidgame*10; @@ -1484,7 +1484,7 @@ int Position::see(Square from, Square to) const { } while (stmAttackers); // Having built the swap list, we negamax through it to find the best - // achievable score from the point of view of the side to move + // achievable score from the point of view of the side to move. while (--slIndex) swapList[slIndex-1] = Min(-swapList[slIndex], swapList[slIndex-1]); @@ -1542,7 +1542,7 @@ void Position::inc_startpos_ply_counter() { } /// Position::put_piece() puts a piece on the given square of the board, -/// updating the board array, bitboards, and piece counts. +/// updating the board array, pieces list, bitboards, and piece counts. void Position::put_piece(Piece p, Square s) { @@ -1550,32 +1550,12 @@ void Position::put_piece(Piece p, Square s) { PieceType pt = type_of_piece(p); board[s] = p; - index[s] = pieceCount[c][pt]; + index[s] = pieceCount[c][pt]++; pieceList[c][pt][index[s]] = s; set_bit(&(byTypeBB[pt]), s); set_bit(&(byColorBB[c]), s); - set_bit(&byTypeBB[0], s); // HACK: byTypeBB[0] contains all occupied squares. - - pieceCount[c][pt]++; -} - - -/// Position::allow_oo() gives the given side the right to castle kingside. -/// Used when setting castling rights during parsing of FEN strings. - -void Position::allow_oo(Color c) { - - st->castleRights |= (1 + int(c)); -} - - -/// Position::allow_ooo() gives the given side the right to castle queenside. -/// Used when setting castling rights during parsing of FEN strings. - -void Position::allow_ooo(Color c) { - - st->castleRights |= (4 + 4*int(c)); + set_bit(&(byTypeBB[0]), s); // HACK: byTypeBB[0] contains all occupied squares. } @@ -1586,7 +1566,7 @@ void Position::allow_ooo(Color c) { Key Position::compute_key() const { - Key result = 0; + Key result = zobCastle[st->castleRights]; for (Square s = SQ_A1; s <= SQ_H8; s++) if (square_is_occupied(s)) @@ -1595,7 +1575,6 @@ Key Position::compute_key() const { if (ep_square() != SQ_NONE) result ^= zobEp[ep_square()]; - result ^= zobCastle[st->castleRights]; if (side_to_move() == BLACK) result ^= zobSideToMove; @@ -1611,18 +1590,14 @@ Key Position::compute_key() const { Key Position::compute_pawn_key() const { - Key result = 0; Bitboard b; - Square s; + Key result = 0; for (Color c = WHITE; c <= BLACK; c++) { b = pieces(PAWN, c); while (b) - { - s = pop_1st_bit(&b); - result ^= zobrist[c][PAWN][s]; - } + result ^= zobrist[c][PAWN][pop_1st_bit(&b)]; } return result; } @@ -1636,11 +1611,13 @@ Key Position::compute_pawn_key() const { Key Position::compute_material_key() const { + int count; Key result = 0; + for (Color c = WHITE; c <= BLACK; c++) for (PieceType pt = PAWN; pt <= QUEEN; pt++) { - int count = piece_count(c, pt); + count = piece_count(c, pt); for (int i = 0; i < count; i++) result ^= zobrist[c][pt][i]; } @@ -1654,20 +1631,15 @@ Key Position::compute_material_key() const { /// updated by do_move and undo_move when the program is running in debug mode. Score Position::compute_value() const { - Score result = SCORE_ZERO; Bitboard b; - Square s; + Score result = SCORE_ZERO; for (Color c = WHITE; c <= BLACK; c++) for (PieceType pt = PAWN; pt <= KING; pt++) { b = pieces(pt, c); while (b) - { - s = pop_1st_bit(&b); - assert(piece_on(s) == piece_of_color_and_type(c, pt)); - result += pst(c, pt, s); - } + result += pst(c, pt, pop_1st_bit(&b)); } result += (side_to_move() == WHITE ? TempoValue / 2 : -TempoValue / 2); @@ -1676,7 +1648,7 @@ Score Position::compute_value() const { /// Position::compute_non_pawn_material() computes the total non-pawn middle -/// game material score for the given side. Material scores are updated +/// game material value for the given side. Material values are updated /// incrementally during the search, this function is only used while /// initializing a new Position object. @@ -1685,16 +1657,8 @@ Value Position::compute_non_pawn_material(Color c) const { Value result = VALUE_ZERO; for (PieceType pt = KNIGHT; pt <= QUEEN; pt++) - { - Bitboard b = pieces(pt, c); - while (b) - { - assert(piece_on(first_1(b)) == piece_of_color_and_type(c, pt)); + result += piece_count(c, pt) * PieceValueMidgame[pt]; - pop_1st_bit(&b); - result += PieceValueMidgame[pt]; - } - } return result; } @@ -1729,7 +1693,7 @@ bool Position::is_draw() const { bool Position::is_mate() const { MoveStack moves[MOVES_MAX]; - return is_check() && (generate_moves(*this, moves) == moves); + return is_check() && generate_moves(*this, moves) == moves; } @@ -1749,7 +1713,7 @@ bool Position::has_mate_threat() { // First pass the move to our opponent doing a null move do_null_move(st1); - // Then generate pseudo-legal moves that give check + // Then generate pseudo-legal moves that could give check last = generate_non_capture_checks(*this, mlist); last = generate_captures(*this, last); @@ -1781,20 +1745,20 @@ bool Position::has_mate_threat() { void Position::init_zobrist() { - RKISS RKiss; int i,j, k; + RKISS rk; for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) for (k = 0; k < 64; k++) - zobrist[i][j][k] = RKiss.rand(); + zobrist[i][j][k] = rk.rand(); for (i = 0; i < 64; i++) - zobEp[i] = RKiss.rand(); + zobEp[i] = rk.rand(); for (i = 0; i < 16; i++) - zobCastle[i] = RKiss.rand(); + zobCastle[i] = rk.rand(); - zobSideToMove = RKiss.rand(); - zobExclusion = RKiss.rand(); + zobSideToMove = rk.rand(); + zobExclusion = rk.rand(); } @@ -1830,16 +1794,16 @@ void Position::flipped_copy(const Position& pos) { // Board for (Square s = SQ_A1; s <= SQ_H8; s++) if (!pos.square_is_empty(s)) - put_piece(Piece(int(pos.piece_on(s)) ^ 8), flip_square(s)); + put_piece(Piece(pos.piece_on(s) ^ 8), flip_square(s)); // Side to move sideToMove = opposite_color(pos.side_to_move()); // Castling rights - if (pos.can_castle_kingside(WHITE)) allow_oo(BLACK); - if (pos.can_castle_queenside(WHITE)) allow_ooo(BLACK); - if (pos.can_castle_kingside(BLACK)) allow_oo(WHITE); - if (pos.can_castle_queenside(BLACK)) allow_ooo(WHITE); + if (pos.can_castle_kingside(WHITE)) do_allow_oo(BLACK); + if (pos.can_castle_queenside(WHITE)) do_allow_ooo(BLACK); + if (pos.can_castle_kingside(BLACK)) do_allow_oo(WHITE); + if (pos.can_castle_queenside(BLACK)) do_allow_ooo(WHITE); initialKFile = pos.initialKFile; initialKRFile = pos.initialKRFile; @@ -1881,18 +1845,20 @@ void Position::flipped_copy(const Position& pos) { bool Position::is_ok(int* failedStep) const { // What features of the position should be verified? - static const bool debugBitboards = false; - static const bool debugKingCount = false; - static const bool debugKingCapture = false; - static const bool debugCheckerCount = false; - static const bool debugKey = false; - static const bool debugMaterialKey = false; - static const bool debugPawnKey = false; - static const bool debugIncrementalEval = false; - static const bool debugNonPawnMaterial = false; - static const bool debugPieceCounts = false; - static const bool debugPieceList = false; - static const bool debugCastleSquares = false; + const bool debugAll = false; + + const bool debugBitboards = debugAll || false; + const bool debugKingCount = debugAll || false; + const bool debugKingCapture = debugAll || false; + const bool debugCheckerCount = debugAll || false; + const bool debugKey = debugAll || false; + const bool debugMaterialKey = debugAll || false; + const bool debugPawnKey = debugAll || false; + const bool debugIncrementalEval = debugAll || false; + const bool debugNonPawnMaterial = debugAll || false; + const bool debugPieceCounts = debugAll || false; + const bool debugPieceList = debugAll || false; + const bool debugCastleSquares = debugAll || false; if (failedStep) *failedStep = 1; diff --git a/src/position.h b/src/position.h index 220bb31d..cc70bcf8 100644 --- a/src/position.h +++ b/src/position.h @@ -281,8 +281,8 @@ private: // Initialization helper functions (used while setting up a position) void clear(); void put_piece(Piece p, Square s); - void allow_oo(Color c); - void allow_ooo(Color c); + void do_allow_oo(Color c); + void do_allow_ooo(Color c); bool set_castling_rights(char token); // Helper functions for doing and undoing moves @@ -391,7 +391,7 @@ inline Bitboard Position::occupied_squares() const { } inline Bitboard Position::empty_squares() const { - return ~(occupied_squares()); + return ~occupied_squares(); } inline Bitboard Position::pieces_of_color(Color c) const { @@ -535,12 +535,10 @@ inline bool Position::move_is_passed_pawn_push(Move m) const { } inline int Position::rule_50_counter() const { - return st->rule50; } inline int Position::startpos_ply_counter() const { - return startPosPlyCounter; } @@ -552,12 +550,10 @@ inline bool Position::opposite_colored_bishops() const { } inline bool Position::has_pawn_on_7th(Color c) const { - return pieces(PAWN, c) & relative_rank_bb(c, RANK_7); } inline bool Position::is_chess960() const { - return isChess960; } @@ -581,4 +577,12 @@ inline int Position::thread() const { return threadID; } +inline void Position::do_allow_oo(Color c) { + st->castleRights |= (1 + int(c)); +} + +inline void Position::do_allow_ooo(Color c) { + st->castleRights |= (4 + 4*int(c)); +} + #endif // !defined(POSITION_H_INCLUDED) -- 2.39.2