X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=6fd3e215b6fbee634489d76690fd101e5de5a89f;hp=a09fe68337d8aa7ab3bbbd5f93dc86023e901fc1;hb=c97104e8540b72ee2c6c9c13d3773d2c0f9ec32f;hpb=ab29d8df678adb97e2bc40b04f13e4f17577ada0 diff --git a/src/pawns.cpp b/src/pawns.cpp index a09fe683..6fd3e215 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -7,12 +7,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + Stockfish is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -72,13 +72,13 @@ namespace { Value(32), Value(32), Value(32), Value(28) }; - // Pawn chain membership bonus by file, middle game. + // Pawn chain membership bonus by file, middle game. const Value ChainMidgameBonus[8] = { Value(14), Value(16), Value(17), Value(18), Value(18), Value(17), Value(16), Value(14) }; - // Pawn chain membership bonus by file, endgame. + // Pawn chain membership bonus by file, endgame. const Value ChainEndgameBonus[8] = { Value(16), Value(16), Value(16), Value(16), Value(16), Value(16), Value(16), Value(16) @@ -96,9 +96,6 @@ namespace { Value(80), Value(180), Value(0), Value( 0) }; - // Evaluate pawn storms? - const bool EvaluatePawnStorms = true; - // Pawn storm tables for positions with opposite castling: const int QStormTable[64] = { 0, 0, 0, 0, 0, 0, 0, 0, @@ -110,7 +107,7 @@ namespace { 31, 40, 40, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - + const int KStormTable[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4,-13,-22,-27,-27, @@ -170,7 +167,7 @@ void PawnInfoTable::clear() { /// PawnInfoTable::get_pawn_info() takes a position object as input, computes -/// a PawnInfo object, and returns a pointer to it. The result is also +/// 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 pawn structure occurs again. @@ -182,7 +179,7 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) { int index = int(key & (size - 1)); PawnInfo *pi = entries + index; - // If pi->key matches the position's pawn hash key, it means that we + // If pi->key matches the position's pawn hash key, it means that we // have analysed this pawn structure before, and we can simply return the // information we found the last time instead of recomputing it if (pi->key == key) @@ -204,13 +201,12 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) { Bitboard pawns = ourPawns; // Initialize pawn storm scores by giving bonuses for open files - if (EvaluatePawnStorms) - for(File f = FILE_A; f <= FILE_H; f++) - if(pos.file_is_half_open(us, f)) - { - pi->ksStormValue[us] += KStormOpenFileBonus[f]; - pi->qsStormValue[us] += QStormOpenFileBonus[f]; - } + for (File f = FILE_A; f <= FILE_H; f++) + if (pos.file_is_half_open(us, f)) + { + pi->ksStormValue[us] += KStormOpenFileBonus[f]; + pi->qsStormValue[us] += QStormOpenFileBonus[f]; + } // Loop through all pawns of the current color and score each pawn while (pawns) @@ -230,57 +226,54 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) { isolated = pos.pawn_is_isolated(us, s); doubled = pos.pawn_is_doubled(us, s); - if (EvaluatePawnStorms) - { - // We calculate kingside and queenside pawn storm scores - // for both colors. These are used when evaluating middle - // game positions with opposite side castling. - // - // Each pawn is given a base score given by a piece square table - // (KStormTable[] or QStormTable[]). This score is increased if - // there are enemy pawns on adjacent files in front of the pawn. - // This is because we want to be able to open files against the - // enemy king, and to avoid blocking the pawn structure (e.g. white - // pawns on h6, g5, black pawns on h7, g6, f7). - - // Kingside and queenside pawn storms - int KBonus = KStormTable[relative_square(us, s)]; - int QBonus = QStormTable[relative_square(us, s)]; - bool outPost = (KBonus > 0 && (outpost_mask(us, s) & theirPawns)); - bool passed = (QBonus > 0 && (passed_pawn_mask(us, s) & theirPawns)); - - switch (f) { - - case FILE_A: - QBonus += passed * QBonus / 2; - break; - - case FILE_B: - QBonus += passed * (QBonus / 2 + QBonus / 4); - break; - - case FILE_C: - QBonus += passed * QBonus / 2; - break; - - case FILE_F: - KBonus += outPost * KBonus / 4; - break; - - case FILE_G: - KBonus += outPost * (KBonus / 2 + KBonus / 4); - break; - - case FILE_H: - KBonus += outPost * KBonus / 2; - break; - - default: - break; - } - pi->ksStormValue[us] += KBonus; - pi->qsStormValue[us] += QBonus; + // We calculate kingside and queenside pawn storm scores + // for both colors. These are used when evaluating middle + // game positions with opposite side castling. + // + // Each pawn is given a base score given by a piece square table + // (KStormTable[] or QStormTable[]). This score is increased if + // there are enemy pawns on adjacent files in front of the pawn. + // This is because we want to be able to open files against the + // enemy king, and to avoid blocking the pawn structure (e.g. white + // pawns on h6, g5, black pawns on h7, g6, f7). + + // Kingside and queenside pawn storms + int KBonus = KStormTable[relative_square(us, s)]; + int QBonus = QStormTable[relative_square(us, s)]; + bool outPostFlag = (KBonus > 0 && (outpost_mask(us, s) & theirPawns)); + bool passedFlag = (QBonus > 0 && (passed_pawn_mask(us, s) & theirPawns)); + + switch (f) { + + case FILE_A: + QBonus += passedFlag * QBonus / 2; + break; + + case FILE_B: + QBonus += passedFlag * (QBonus / 2 + QBonus / 4); + break; + + case FILE_C: + QBonus += passedFlag * QBonus / 2; + break; + + case FILE_F: + KBonus += outPostFlag * KBonus / 4; + break; + + case FILE_G: + KBonus += outPostFlag * (KBonus / 2 + KBonus / 4); + break; + + case FILE_H: + KBonus += outPostFlag * KBonus / 2; + break; + + default: + break; } + pi->ksStormValue[us] += KBonus; + pi->qsStormValue[us] += QBonus; // Member of a pawn chain (but not the backward one)? We could speed up // the test a little by introducing an array of masks indexed by color @@ -377,7 +370,7 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) { mgValue[us] += mv; egValue[us] += ev; - + // If the pawn is passed, set the square of the pawn in the passedPawns // bitboard if (passed)