X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpawns.cpp;h=c314c4ae6634bad6fc97bd9831dd89a6f2c32ee7;hb=2a2353aac65d6f7263081dc373c768c8717602db;hp=c89f2d0585891ec2ebe253b89de39eb305f56a8f;hpb=26a8b844177ad6abd4aca1bef2ebb7f644bd465c;p=stockfish diff --git a/src/pawns.cpp b/src/pawns.cpp index c89f2d05..c314c4ae 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 @@ -183,9 +175,9 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, Square s; File f; Rank r; - int bonus, backwardWeight; + 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) ? @@ -227,7 +219,6 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, // Test for backward pawn // backward = false; - backwardWeight = 6; // If the pawn is passed, isolated, or member of a pawn chain // it cannot be backward. If can capture an enemy pawn or if @@ -246,12 +237,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, // Note that we are sure to find something because pawn is not passed // nor isolated, so loop is potentially infinite, but it isn't. while (!(b & (ourPawns | theirPawns))) - { Us == WHITE ? b <<= 8 : b >>= 8; - backwardWeight--; - } - - assert(backwardWeight > 0); // The friendly pawn needs to be at least two ranks closer than the enemy // pawn in order to help the potentially backward pawn advance. @@ -274,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) @@ -288,7 +274,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, if (backward) { - value -= backwardWeight * BackwardPawnPenalty[f] / 4; + value -= BackwardPawnPenalty[f]; if (!opposed) value -= BackwardPawnPenalty[f] / 2; } @@ -334,22 +320,3 @@ int PawnInfoTable::evaluate_pawn_storm(Square s, Rank r, File f, Bitboard theirP } return bonus; } - - -/// 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) { - - Bitboard pawns = pos.pieces(PAWN, c) & this_and_neighboring_files_bb(ksq); - unsigned shelter = 0; - unsigned r = ksq & (7 << 3); - - for (int i = 1, k = (c ? -8 : 8); i < 4; i++) - { - r += k; - shelter += BitCount8Bit[(pawns >> r) & 0xFF] * (128 >> i); - } - kingSquares[c] = ksq; - kingShelters[c] = shelter; - return shelter; -}