X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=84c7ae8f1c65539101650b68492fe4a902de8f7d;hp=00e673b2bd662b1e1c03523de1be4250bebf5e90;hb=bc3b148d5712ef9ea00e74d3ff5aea10a4d3cabe;hpb=fd4585ef077085f643e15e5854a7b1f865c3bb90 diff --git a/src/position.cpp b/src/position.cpp index 00e673b2..84c7ae8f 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -36,10 +36,6 @@ using std::string; -namespace PSQT { - extern Score psq[PIECE_NB][SQUARE_NB]; -} - namespace Zobrist { Key psq[PIECE_NB][SQUARE_NB]; @@ -172,6 +168,8 @@ void Position::init() { Zobrist::noPawns = rng.rand(); // Prepare the cuckoo tables + std::memset(cuckoo, 0, sizeof(cuckoo)); + std::memset(cuckooMove, 0, sizeof(cuckooMove)); int count = 0; for (Piece pc : Pieces) for (Square s1 = SQ_A1; s1 <= SQ_H8; ++s1) @@ -381,7 +379,6 @@ void Position::set_state(StateInfo* si) const { si->key = si->materialKey = 0; si->pawnKey = Zobrist::noPawns; si->nonPawnMaterial[WHITE] = si->nonPawnMaterial[BLACK] = VALUE_ZERO; - si->psq = SCORE_ZERO; si->checkersBB = attackers_to(square(sideToMove)) & pieces(~sideToMove); set_check_info(si); @@ -391,7 +388,6 @@ void Position::set_state(StateInfo* si) const { Square s = pop_lsb(&b); Piece pc = piece_on(s); si->key ^= Zobrist::psq[pc][s]; - si->psq += PSQT::psq[pc][s]; } if (si->epSquare != SQ_NONE) @@ -752,7 +748,6 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) { Square rfrom, rto; do_castling(us, from, to, rfrom, rto); - st->psq += PSQT::psq[captured][rto] - PSQT::psq[captured][rfrom]; k ^= Zobrist::psq[captured][rfrom] ^ Zobrist::psq[captured][rto]; captured = NO_PIECE; } @@ -791,9 +786,6 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) { st->materialKey ^= Zobrist::psq[captured][pieceCount[captured]]; prefetch(thisThread->materialTable[st->materialKey]); - // Update incremental scores - st->psq -= PSQT::psq[captured][capsq]; - // Reset rule 50 counter st->rule50 = 0; } @@ -847,9 +839,6 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) { st->materialKey ^= Zobrist::psq[promotion][pieceCount[promotion]-1] ^ Zobrist::psq[pc][pieceCount[pc]]; - // Update incremental score - st->psq += PSQT::psq[promotion][to] - PSQT::psq[pc][to]; - // Update material st->nonPawnMaterial[us] += PieceValue[MG][promotion]; } @@ -862,9 +851,6 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) { st->rule50 = 0; } - // Update incremental scores - st->psq += PSQT::psq[pc][to] - PSQT::psq[pc][from]; - // Set capture piece st->capturedPiece = captured; @@ -1153,7 +1139,7 @@ bool Position::has_repeated() const { if (end < i) return false; - StateInfo* stp = st->previous->previous; + StateInfo* stp = stc->previous->previous; do { stp = stp->previous->previous; @@ -1193,14 +1179,15 @@ bool Position::has_game_cycle(int ply) const { || (j = H2(moveKey), cuckoo[j] == moveKey)) { Move move = cuckooMove[j]; - Square from = from_sq(move); - Square to = to_sq(move); + Square s1 = from_sq(move); + Square s2 = to_sq(move); - if (!(between_bb(from, to) & pieces())) + if (!(between_bb(s1, s2) & pieces())) { - // Take care to reverse the move in the no-progress case (opponent to move) - if (empty(from)) - move = make_move(to, from); + // In the cuckoo table, both moves Rc1c5 and Rc5c1 are stored in the same + // location. We select the legal one by reversing the move variable if necessary. + if (empty(s1)) + move = make_move(s2, s1); if (ply > i) return true;