From 3981b382fc655e5e209f6de5bfb3074769e476f1 Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Sun, 2 Sep 2018 15:10:24 +0200 Subject: [PATCH] Symmetrize evaluation for smaller board sizes Piece-square tables remain asymmetrical. --- src/evaluate.cpp | 14 +++++++------- src/pawns.cpp | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index a0d34be..971b44c 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -253,7 +253,7 @@ namespace { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH); constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH); - constexpr Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB: Rank7BB | Rank6BB); + Bitboard LowRanks = rank_bb(relative_rank(Us, RANK_2, pos.max_rank())) | rank_bb(relative_rank(Us, RANK_3, pos.max_rank())); // Find our pawns that are blocked or on the first two ranks Bitboard b = pos.pieces(Us, PAWN) & (shift(pos.pieces()) | LowRanks); @@ -272,7 +272,7 @@ namespace { if (pos.count(Us) && pos.non_pawn_material(Them) >= RookValueMg + KnightValueMg) { kingRing[Us] = attackedBy[Us][KING]; - if (relative_rank(Us, pos.square(Us)) == RANK_1) + if (relative_rank(Us, pos.square(Us), pos.max_rank()) == RANK_1) kingRing[Us] |= shift(kingRing[Us]); if (file_of(pos.square(Us)) == FILE_H) @@ -352,7 +352,7 @@ namespace { score += Outpost[Pt == BISHOP][bool(attackedBy[Us][PAWN] & bb)]; // Bonus when behind a pawn - if ( relative_rank(Us, s) < RANK_5 + if ( relative_rank(Us, s, pos.max_rank()) < RANK_5 && (pos.pieces(PAWN) & (s + pawn_push(Us)))) score += MinorBehindPawn; @@ -388,7 +388,7 @@ namespace { if (Pt == ROOK) { // Bonus for aligning rook with enemy pawns on the same rank/file - if (relative_rank(Us, s) >= RANK_5) + if (relative_rank(Us, s, pos.max_rank()) >= RANK_5) score += RookOnPawn * popcount(pos.pieces(Them, PAWN) & PseudoAttacks[Us][ROOK][s]); // Bonus for rook on an open or semi-open file @@ -575,7 +575,7 @@ namespace { Square s = pop_lsb(&b); score += ThreatByMinor[type_of(pos.piece_on(s))]; if (type_of(pos.piece_on(s)) != PAWN) - score += ThreatByRank * (int)relative_rank(Them, s); + score += ThreatByRank * (int)relative_rank(Them, s, pos.max_rank()); } b = (pos.pieces(Them, QUEEN) | weak) & attackedBy[Us][ROOK]; @@ -584,7 +584,7 @@ namespace { Square s = pop_lsb(&b); score += ThreatByRook[type_of(pos.piece_on(s))]; if (type_of(pos.piece_on(s)) != PAWN) - score += ThreatByRank * (int)relative_rank(Them, s); + score += ThreatByRank * (int)relative_rank(Them, s, pos.max_rank()); } b = weak & attackedBy[Us][KING]; @@ -679,7 +679,7 @@ namespace { bb = forward_file_bb(Us, s) & (attackedBy[Them][ALL_PIECES] | pos.pieces(Them)); score -= HinderPassedPawn * popcount(bb); - int r = relative_rank(Us, s); + int r = relative_rank(Us, s, pos.max_rank()); int w = PassedDanger[r]; Score bonus = PassedRank[r]; diff --git a/src/pawns.cpp b/src/pawns.cpp index 78f395b..5c1e8b1 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -124,7 +124,7 @@ namespace { e->passedPawns[Us] |= s; else if ( stoppers == SquareBB[s + Up] - && relative_rank(Us, s) >= RANK_5) + && relative_rank(Us, s, pos.max_rank()) >= RANK_5) { b = shift(supported) & ~theirPawns; while (b) @@ -134,7 +134,7 @@ namespace { // Score this pawn if (supported | phalanx) - score += Connected[opposed][bool(phalanx)][popcount(supported)][relative_rank(Us, s)]; + score += Connected[opposed][bool(phalanx)][popcount(supported)][relative_rank(Us, s, pos.max_rank())]; else if (!neighbours) score -= Isolated, e->weakUnopposed[Us] += !opposed; @@ -206,7 +206,7 @@ Value Entry::evaluate_shelter(const Position& pos, Square ksq) { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH); - constexpr Bitboard BlockRanks = (Us == WHITE ? Rank1BB | Rank2BB : Rank8BB | Rank7BB); + Bitboard BlockRanks = rank_bb(relative_rank(Us, RANK_1, pos.max_rank())) | rank_bb(relative_rank(Us, RANK_2, pos.max_rank())); Bitboard b = pos.pieces(PAWN) & (forward_ranks_bb(Us, ksq) | rank_bb(ksq)); Bitboard ourPawns = b & pos.pieces(Us); @@ -221,10 +221,10 @@ Value Entry::evaluate_shelter(const Position& pos, Square ksq) { for (File f = File(center - 1); f <= File(center + 1); ++f) { b = ourPawns & file_bb(f); - int ourRank = b ? relative_rank(Us, backmost_sq(Us, b)) : 0; + int ourRank = b ? relative_rank(Us, backmost_sq(Us, b), pos.max_rank()) : 0; b = theirPawns & file_bb(f); - int theirRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : 0; + int theirRank = b ? relative_rank(Us, frontmost_sq(Them, b), pos.max_rank()) : 0; int d = std::min(f, ~f); safety += ShelterStrength[d][ourRank]; -- 1.7.0.4