From: protonspring Date: Mon, 25 Mar 2019 19:04:14 +0000 (-0600) Subject: Use simple array for Pawns Connected bonus #2061 X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=95ba7f78d5e025499ec8124e37e9f3b769660e4a Use simple array for Pawns Connected bonus #2061 Simplification which removes the pawns connected array. Instead of storing the values in an array, the values are calculated real-time. This is about 1.6% faster on my machines. Performance: master ave nps: 159,248,672 patch ave nps: 161,905,592 STC LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 20363 W: 4579 L: 4455 D: 11329 http://tests.stockfishchess.org/tests/view/5c9925ba0ebc5925cfff79a6 Non functional change. --- diff --git a/src/main.cpp b/src/main.cpp index a093b5bf..fc78b38c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,7 +42,6 @@ int main(int argc, char* argv[]) { Position::init(); Bitbases::init(); Search::init(); - Pawns::init(); Threads.set(Options["Threads"]); Search::clear(); // After threads are up diff --git a/src/pawns.cpp b/src/pawns.cpp index c9c9e599..7edaa6e1 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -35,8 +35,8 @@ namespace { constexpr Score Doubled = S(11, 56); constexpr Score Isolated = S( 5, 15); - // Connected pawn bonus by opposed, phalanx, #support and rank - Score Connected[2][2][3][RANK_NB]; + // Connected pawn bonus + constexpr int Connected[RANK_NB] = { 0, 13, 24, 18, 65, 100, 175, 330 }; // Strength of pawn shelter for our king by [distance from edge][rank]. // RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king. @@ -128,8 +128,12 @@ namespace { // Score this pawn if (support | phalanx) - score += Connected[opposed][bool(phalanx)][popcount(support)][relative_rank(Us, s)]; - + { + int r = relative_rank(Us, s); + int v = phalanx ? Connected[r] + Connected[r + 1] : 2 * Connected[r]; + v = 17 * popcount(support) + (v >> (opposed + 1)); + score += make_score(v, v * (r - 2) / 4); + } else if (!neighbours) score -= Isolated, e->weakUnopposed[Us] += !opposed; @@ -147,27 +151,6 @@ namespace { namespace Pawns { -/// Pawns::init() initializes some tables needed by evaluation. Instead of using -/// hard-coded tables, when makes sense, we prefer to calculate them with a formula -/// to reduce independent parameters and to allow easier tuning and better insight. - -void init() { - - static constexpr int Seed[RANK_NB] = { 0, 13, 24, 18, 65, 100, 175, 330 }; - - for (int opposed = 0; opposed <= 1; ++opposed) - for (int phalanx = 0; phalanx <= 1; ++phalanx) - for (int support = 0; support <= 2; ++support) - for (Rank r = RANK_2; r < RANK_8; ++r) - { - int v = 17 * support; - v += (Seed[r] + (phalanx ? (Seed[r + 1] - Seed[r]) / 2 : 0)) >> opposed; - - Connected[opposed][phalanx][support][r] = make_score(v, v * (r - 2) / 4); - } -} - - /// Pawns::probe() looks up the current position's pawns configuration in /// the pawns hash table. It returns a pointer to the Entry if the position /// is found. Otherwise a new Entry is computed and stored there, so we don't diff --git a/src/pawns.h b/src/pawns.h index 0426ec36..71d18ee8 100644 --- a/src/pawns.h +++ b/src/pawns.h @@ -76,7 +76,6 @@ struct Entry { typedef HashTable Table; -void init(); Entry* probe(const Position& pos); } // namespace Pawns