X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fpawns.cpp;h=0ab1c2622f14372b39baf9f82d99e744a0a9f97a;hb=15d265cc664e0e49fa82cccb7471da0a5612ce25;hp=b5c377efcd1e30221a514ea050e8787ba8b5a692;hpb=95388a952b5882a4e32c0af49b3a7fd1251df85b;p=stockfish diff --git a/src/pawns.cpp b/src/pawns.cpp index b5c377ef..0ab1c262 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -110,12 +110,13 @@ namespace { /// PawnInfoTable c'tor and d'tor instantiated one each thread -PawnInfoTable::PawnInfoTable(unsigned numOfEntries) : size(numOfEntries) { +PawnInfoTable::PawnInfoTable() { + + entries = new PawnInfo[PawnTableSize]; - entries = new PawnInfo[size]; if (!entries) { - std::cerr << "Failed to allocate " << (numOfEntries * sizeof(PawnInfo)) + std::cerr << "Failed to allocate " << (PawnTableSize * sizeof(PawnInfo)) << " bytes for pawn hash table." << std::endl; Application::exit_with_failure(); } @@ -128,16 +129,6 @@ PawnInfoTable::~PawnInfoTable() { } -/// PawnInfo::clear() resets to zero the PawnInfo entry. Note that -/// kingSquares[] is initialized to SQ_NONE instead. - -void PawnInfo::clear() { - - memset(this, 0, sizeof(PawnInfo)); - kingSquares[WHITE] = kingSquares[BLACK] = SQ_NONE; -} - - /// PawnInfoTable::get_pawn_info() takes a position object as input, computes /// a PawnInfo object, and returns a pointer to it. The result is also stored /// in a hash table, so we don't have to recompute everything when the same @@ -148,7 +139,7 @@ PawnInfo* PawnInfoTable::get_pawn_info(const Position& pos) const { assert(pos.is_ok()); Key key = pos.get_pawn_key(); - unsigned index = unsigned(key & (size - 1)); + unsigned index = unsigned(key & (PawnTableSize - 1)); PawnInfo* pi = entries + index; // If pi->key matches the position's pawn hash key, it means that we @@ -158,7 +149,8 @@ PawnInfo* PawnInfoTable::get_pawn_info(const Position& pos) const { return pi; // Clear the PawnInfo object, and set the key - pi->clear(); + memset(pi, 0, sizeof(PawnInfo)); + pi->kingSquares[WHITE] = pi->kingSquares[BLACK] = SQ_NONE; pi->key = key; // Calculate pawn attacks @@ -185,7 +177,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, Rank r; int bonus; bool passed, isolated, doubled, opposed, chain, backward, candidate; - Score value = make_score(0, 0); + Score value = SCORE_ZERO; const Square* ptr = pos.piece_list_begin(Us, PAWN); // Initialize pawn storm scores by giving bonuses for open files @@ -214,7 +206,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, pi->qsStormValue[Us] += QStormTable[relative_square(Us, s)] + bonus; // Our rank plus previous one. Used for chain detection. - b = rank_bb(r) | rank_bb(Us == WHITE ? r - 1 : r + 1); + b = rank_bb(r) | rank_bb(Us == WHITE ? r - Rank(1) : r + Rank(1)); // Passed, isolated, doubled or member of a pawn // chain (but not the backward one) ? @@ -268,7 +260,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, // Mark the pawn as passed. Pawn will be properly scored in evaluation // because we need full attack info to evaluate passed pawns. if (passed) - set_bit(&(pi->passedPawns), s); + set_bit(&(pi->passedPawns[Us]), s); // Score this pawn if (isolated) @@ -331,19 +323,24 @@ int PawnInfoTable::evaluate_pawn_storm(Square s, Rank r, File f, Bitboard theirP /// PawnInfo::updateShelter calculates and caches king shelter. It is called -/// only when king square changes, about 20% of total get_king_shelter() calls. -int PawnInfo::updateShelter(const Position& pos, Color c, Square ksq) { +/// only when king square changes, about 20% of total king_shelter() calls. +Score PawnInfo::updateShelter(const Position& pos, Color c, Square ksq) { - Bitboard pawns = pos.pieces(PAWN, c) & this_and_neighboring_files_bb(ksq); - unsigned shelter = 0; - unsigned r = ksq & (7 << 3); + Bitboard pawns; + unsigned r, k, shelter = 0; - for (int i = 1, k = (c ? -8 : 8); i < 4; i++) + if (relative_rank(c, ksq) <= RANK_4) { - r += k; - shelter += BitCount8Bit[(pawns >> r) & 0xFF] * (128 >> i); + pawns = pos.pieces(PAWN, c) & this_and_neighboring_files_bb(ksq); + r = ksq & (7 << 3); + k = (c ? -8 : 8); + for (int i = 1; i < 4; i++) + { + r += k; + shelter += BitCount8Bit[(pawns >> r) & 0xFF] * (128 >> i); + } } kingSquares[c] = ksq; - kingShelters[c] = shelter; - return shelter; + kingShelters[c] = make_score(shelter, 0); + return kingShelters[c]; }