2008-08-31 23:59:13 -06:00
|
|
|
/*
|
2008-10-19 10:56:28 -06:00
|
|
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
2021-01-08 09:04:23 -07:00
|
|
|
Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file)
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2008-10-19 10:56:28 -06:00
|
|
|
Stockfish is free software: you can redistribute it and/or modify
|
2008-08-31 23:59:13 -06:00
|
|
|
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.
|
2009-01-07 06:26:58 -07:00
|
|
|
|
2008-10-19 10:56:28 -06:00
|
|
|
Stockfish is distributed in the hope that it will be useful,
|
2008-08-31 23:59:13 -06:00
|
|
|
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.
|
2009-01-07 06:26:58 -07:00
|
|
|
|
2008-08-31 23:59:13 -06:00
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2019-03-31 04:02:19 -06:00
|
|
|
#include <algorithm>
|
2008-08-31 23:59:13 -06:00
|
|
|
#include <cassert>
|
|
|
|
|
2011-04-09 12:50:56 -06:00
|
|
|
#include "bitboard.h"
|
2008-08-31 23:59:13 -06:00
|
|
|
#include "pawns.h"
|
2009-03-18 08:36:03 -06:00
|
|
|
#include "position.h"
|
2014-12-30 02:31:50 -07:00
|
|
|
#include "thread.h"
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2021-02-26 02:02:13 -07:00
|
|
|
namespace Stockfish {
|
|
|
|
|
2008-08-31 23:59:13 -06:00
|
|
|
namespace {
|
|
|
|
|
2012-03-28 23:04:44 -06:00
|
|
|
#define V Value
|
2009-11-13 09:23:21 -07:00
|
|
|
#define S(mg, eg) make_score(mg, eg)
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2018-06-02 09:41:37 -06:00
|
|
|
// Pawn penalties
|
Pawns Tuning
A simple tuning of Pawns parameters, and some PSQT changes.
Passed STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 219424 W: 43681 L: 43103 D: 132640
Ptnml(0-2): 4014, 25760, 49669, 26172, 4097
https://tests.stockfishchess.org/tests/view/601bce167f517a561bc491eb
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 317312 W: 42525 L: 41579 D: 233208
Ptnml(0-2): 2447, 30157, 92636, 30835, 2581
https://tests.stockfishchess.org/tests/view/601c21557f517a561bc49227
closes https://github.com/official-stockfish/Stockfish/pull/3337
Bench: 4154473
2021-02-07 04:44:11 -07:00
|
|
|
constexpr Score Backward = S( 9, 22);
|
|
|
|
constexpr Score Doubled = S(13, 51);
|
|
|
|
constexpr Score DoubledEarly = S(20, 7);
|
|
|
|
constexpr Score Isolated = S( 3, 15);
|
|
|
|
constexpr Score WeakLever = S( 4, 58);
|
|
|
|
constexpr Score WeakUnopposed = S(13, 24);
|
2016-01-16 14:34:29 -07:00
|
|
|
|
Add a rank based bonus for blocked pawns.
Fix for overevaluated blocked pawns on the 5th and 6th rank.
This is a rewrite of the original idea that uses only two parameters.
Thanks to rocky640 for pointing this out.
STC:
LLR: 2.94 (-2.94,2.94) {-0.50,1.50}
Total: 50800 W: 9707 L: 9446 D: 31647
Ptnml(0-2): 831, 5851, 11822, 6018, 878
https://tests.stockfishchess.org/tests/view/5f00b4f359f6f03532894304
LTC:
LLR: 2.93 (-2.94,2.94) {0.25,1.75}
Total: 52064 W: 6477 L: 6167 D: 39420
Ptnml(0-2): 331, 4628, 15834, 4878, 361
https://tests.stockfishchess.org/tests/view/5f0115fe59f6f03532894345
closes https://github.com/official-stockfish/Stockfish/pull/2794
Bench: 4882833
2020-07-06 01:30:23 -06:00
|
|
|
// Bonus for blocked pawns at 5th or 6th rank
|
Pawns Tuning
A simple tuning of Pawns parameters, and some PSQT changes.
Passed STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 219424 W: 43681 L: 43103 D: 132640
Ptnml(0-2): 4014, 25760, 49669, 26172, 4097
https://tests.stockfishchess.org/tests/view/601bce167f517a561bc491eb
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 317312 W: 42525 L: 41579 D: 233208
Ptnml(0-2): 2447, 30157, 92636, 30835, 2581
https://tests.stockfishchess.org/tests/view/601c21557f517a561bc49227
closes https://github.com/official-stockfish/Stockfish/pull/3337
Bench: 4154473
2021-02-07 04:44:11 -07:00
|
|
|
constexpr Score BlockedPawn[2] = { S(-17, -6), S(-9, 2) };
|
Add a rank based bonus for blocked pawns.
Fix for overevaluated blocked pawns on the 5th and 6th rank.
This is a rewrite of the original idea that uses only two parameters.
Thanks to rocky640 for pointing this out.
STC:
LLR: 2.94 (-2.94,2.94) {-0.50,1.50}
Total: 50800 W: 9707 L: 9446 D: 31647
Ptnml(0-2): 831, 5851, 11822, 6018, 878
https://tests.stockfishchess.org/tests/view/5f00b4f359f6f03532894304
LTC:
LLR: 2.93 (-2.94,2.94) {0.25,1.75}
Total: 52064 W: 6477 L: 6167 D: 39420
Ptnml(0-2): 331, 4628, 15834, 4878, 361
https://tests.stockfishchess.org/tests/view/5f0115fe59f6f03532894345
closes https://github.com/official-stockfish/Stockfish/pull/2794
Bench: 4882833
2020-07-06 01:30:23 -06:00
|
|
|
|
Use arrays
for safe checks, outposts and king protectors in evaluate.cpp
Tested for non regression on the safe checks
https://tests.stockfishchess.org/tests/view/5ef8b75c020eec13834a9596
LLR: 2.95 (-2.94,2.94) {-1.50,0.50}
Total: 22256 W: 4283 L: 4143 D: 13830
Ptnml(0-2): 291, 2439, 5588, 2459, 351
Tested for non regression on the safe checks, outposts and king protectors
https://tests.stockfishchess.org/tests/view/5ef8e543020eec13834a95e7
LLR: 2.95 (-2.94,2.94) {-1.50,0.50}
Total: 28400 W: 5382 L: 5253 D: 17765
Ptnml(0-2): 394, 3078, 7119, 3223, 386
closes https://github.com/official-stockfish/Stockfish/pull/2785
No functional change
2020-07-01 00:12:59 -06:00
|
|
|
constexpr Score BlockedStorm[RANK_NB] = {
|
Adjust definition of unsafeSquares
and adjust related bonus values. The bonus is now not given whenever
there is an enemy piece in front of the pawn.
Passed STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 109472 W: 22097 L: 21673 D: 65702
Ptnml(0-2): 2111, 12800, 24482, 13240, 2103
https://tests.stockfishchess.org/tests/view/5fd8d3740c5870924361ffad
Passed LTC:
LLR: 2.95 (-2.94,2.94) {0.25,1.25}
Total: 39384 W: 5334 L: 4990 D: 29060
Ptnml(0-2): 279, 3648, 11535, 3910, 320
https://tests.stockfishchess.org/tests/view/5fd971ab0c5870924361fff0
closes https://github.com/official-stockfish/Stockfish/pull/3266
Bench: 4488955
2020-12-16 06:35:39 -07:00
|
|
|
S(0, 0), S(0, 0), S(75, 78), S(-8, 16), S(-6, 10), S(-6, 6), S(0, 2)
|
Use arrays
for safe checks, outposts and king protectors in evaluate.cpp
Tested for non regression on the safe checks
https://tests.stockfishchess.org/tests/view/5ef8b75c020eec13834a9596
LLR: 2.95 (-2.94,2.94) {-1.50,0.50}
Total: 22256 W: 4283 L: 4143 D: 13830
Ptnml(0-2): 291, 2439, 5588, 2459, 351
Tested for non regression on the safe checks, outposts and king protectors
https://tests.stockfishchess.org/tests/view/5ef8e543020eec13834a95e7
LLR: 2.95 (-2.94,2.94) {-1.50,0.50}
Total: 28400 W: 5382 L: 5253 D: 17765
Ptnml(0-2): 394, 3078, 7119, 3223, 386
closes https://github.com/official-stockfish/Stockfish/pull/2785
No functional change
2020-07-01 00:12:59 -06:00
|
|
|
};
|
Remove attacked pawns from storm evaluation
STC:
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 54456 W: 11009 L: 10737 D: 32710
Ptnml(0-2): 929, 6326, 12523, 6444, 1006
https://tests.stockfishchess.org/tests/view/5ec962e4404591b2793008a5
LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.75}
Total: 62448 W: 9018 L: 8664 D: 44766
Ptnml(0-2): 462, 5928, 18121, 6220, 493
https://tests.stockfishchess.org/tests/view/5ec976a8a586eee45aa2ab40
Non regression STC with "noob_3moves.epd" opening book
LLR: 3.81 (-2.94,2.94) {-1.50,0.50}
Total: 91896 W: 17770 L: 17653 D: 56473
Ptnml(0-2): 1598, 10782, 21124, 10793, 1651
https://tests.stockfishchess.org/tests/view/5ec9b83ea586eee45aa2ab96
closes https://github.com/official-stockfish/Stockfish/pull/2698
Bench 4488597
2020-05-23 17:54:37 -06:00
|
|
|
|
2019-03-25 13:04:14 -06:00
|
|
|
// Connected pawn bonus
|
Pawns Tuning
A simple tuning of Pawns parameters, and some PSQT changes.
Passed STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 219424 W: 43681 L: 43103 D: 132640
Ptnml(0-2): 4014, 25760, 49669, 26172, 4097
https://tests.stockfishchess.org/tests/view/601bce167f517a561bc491eb
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 317312 W: 42525 L: 41579 D: 233208
Ptnml(0-2): 2447, 30157, 92636, 30835, 2581
https://tests.stockfishchess.org/tests/view/601c21557f517a561bc49227
closes https://github.com/official-stockfish/Stockfish/pull/3337
Bench: 4154473
2021-02-07 04:44:11 -07:00
|
|
|
constexpr int Connected[RANK_NB] = { 0, 5, 7, 11, 23, 48, 87 };
|
2016-01-16 14:34:29 -07:00
|
|
|
|
2018-04-23 01:48:53 -06:00
|
|
|
// 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.
|
2018-07-15 06:30:59 -06:00
|
|
|
constexpr Value ShelterStrength[int(FILE_NB) / 2][RANK_NB] = {
|
Introducing King On File
this new concept calculates bonuses/penalties for the king when the king is in a semiopen or open file.
Passed STC:
LLR: 2.95 (-2.94,2.94) {-0.25,1.25}
Total: 44904 W: 9365 L: 9028 D: 26511
Ptnml(0-2): 857, 5309, 9841, 5530, 915
https://tests.stockfishchess.org/tests/view/5fa343625d72639a7acef72b
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 60552 W: 8449 L: 8051 D: 44052
Ptnml(0-2): 466, 5772, 17481, 6012, 545
https://tests.stockfishchess.org/tests/view/5fa40e365d72639a7acef79e
closes https://github.com/official-stockfish/Stockfish/pull/3219
Bench: 3689484
2020-11-04 16:54:53 -07:00
|
|
|
{ V( -5), V( 82), V( 92), V( 54), V( 36), V( 22), V( 28) },
|
|
|
|
{ V(-44), V( 63), V( 33), V(-50), V(-30), V(-12), V( -62) },
|
|
|
|
{ V(-11), V( 77), V( 22), V( -6), V( 31), V( 8), V( -45) },
|
|
|
|
{ V(-39), V(-12), V(-29), V(-50), V(-43), V(-68), V(-164) }
|
2016-09-23 11:28:34 -06:00
|
|
|
};
|
2012-03-26 05:52:10 -06:00
|
|
|
|
2018-05-24 10:46:38 -06:00
|
|
|
// Danger of enemy pawns moving toward our king by [distance from edge][rank].
|
2018-06-02 09:41:37 -06:00
|
|
|
// RANK_1 = 0 is used for files where the enemy has no pawn, or their pawn
|
2019-08-14 14:15:41 -06:00
|
|
|
// is behind our king. Note that UnblockedStorm[0][1-2] accommodate opponent pawn
|
|
|
|
// on edge, likely blocked by our king.
|
2018-05-24 10:46:38 -06:00
|
|
|
constexpr Value UnblockedStorm[int(FILE_NB) / 2][RANK_NB] = {
|
Introducing King On File
this new concept calculates bonuses/penalties for the king when the king is in a semiopen or open file.
Passed STC:
LLR: 2.95 (-2.94,2.94) {-0.25,1.25}
Total: 44904 W: 9365 L: 9028 D: 26511
Ptnml(0-2): 857, 5309, 9841, 5530, 915
https://tests.stockfishchess.org/tests/view/5fa343625d72639a7acef72b
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 60552 W: 8449 L: 8051 D: 44052
Ptnml(0-2): 466, 5772, 17481, 6012, 545
https://tests.stockfishchess.org/tests/view/5fa40e365d72639a7acef79e
closes https://github.com/official-stockfish/Stockfish/pull/3219
Bench: 3689484
2020-11-04 16:54:53 -07:00
|
|
|
{ V( 87), V(-288), V(-168), V( 96), V( 47), V( 44), V( 46) },
|
|
|
|
{ V( 42), V( -25), V( 120), V( 45), V( 34), V( -9), V( 24) },
|
|
|
|
{ V( -8), V( 51), V( 167), V( 35), V( -4), V(-16), V(-12) },
|
|
|
|
{ V(-17), V( -13), V( 100), V( 4), V( 9), V(-16), V(-31) }
|
2016-09-23 11:28:34 -06:00
|
|
|
};
|
2012-03-28 04:44:41 -06:00
|
|
|
|
New Imbalance Tables Tweak
Imbalance tables tweaked to contain MiddleGame and Endgame values, instead of a single value.
The idea started from Fisherman, which requested my help to tune the values back in June/July,
so I tuned the values back then, and we were able to accomplish good results,
but not enough to pass both STC and LTC tests.
So after the recent changes, I decided to give it another shot, and I am glad that it was a successful attempt.
A special thanks goes also to mstembera, which notified me a simple way to let the patch perform a little better.
Passed STC:
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 115976 W: 23124 L: 22695 D: 70157
Ptnml(0-2): 2074, 13652, 26285, 13725, 2252
https://tests.stockfishchess.org/tests/view/5fc92d2d42a050a89f02ccc8
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 156304 W: 20617 L: 20024 D: 115663
Ptnml(0-2): 1138, 14647, 46084, 15050, 1233
https://tests.stockfishchess.org/tests/view/5fc9fee142a050a89f02cd3e
closes https://github.com/official-stockfish/Stockfish/pull/3255
Bench: 4278746
2020-12-07 10:28:47 -07:00
|
|
|
|
Introducing King On File
this new concept calculates bonuses/penalties for the king when the king is in a semiopen or open file.
Passed STC:
LLR: 2.95 (-2.94,2.94) {-0.25,1.25}
Total: 44904 W: 9365 L: 9028 D: 26511
Ptnml(0-2): 857, 5309, 9841, 5530, 915
https://tests.stockfishchess.org/tests/view/5fa343625d72639a7acef72b
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 60552 W: 8449 L: 8051 D: 44052
Ptnml(0-2): 466, 5772, 17481, 6012, 545
https://tests.stockfishchess.org/tests/view/5fa40e365d72639a7acef79e
closes https://github.com/official-stockfish/Stockfish/pull/3219
Bench: 3689484
2020-11-04 16:54:53 -07:00
|
|
|
// KingOnFile[semi-open Us][semi-open Them] contains bonuses/penalties
|
|
|
|
// for king when the king is on a semi-open or open file.
|
WeakUnopposed penalty for backwards on file A or H
Do not give the WeakUnopposed penalty for backwards on file A or H
The original idea comes from Lolligerhans, and a series of tunings and tests done by Fauzi.
Passed STC:
LLR: 2.96 (-2.94,2.94) {-0.25,1.25}
Total: 140864 W: 28127 L: 27660 D: 85077
Ptnml(0-2): 2529, 16660, 31735, 16831, 2677
https://tests.stockfishchess.org/tests/view/5fe39dec3932f79192d39673
Passed LTC:
LLR: 2.95 (-2.94,2.94) {0.25,1.25}
Total: 67568 W: 8993 L: 8590 D: 49985
Ptnml(0-2): 523, 6176, 19983, 6579, 523
https://tests.stockfishchess.org/tests/view/5fe3dd1b3932f79192d39693
closes https://github.com/official-stockfish/Stockfish/pull/3275
Bench: 4109336
2020-12-25 07:19:04 -07:00
|
|
|
constexpr Score KingOnFile[2][2] = {{ S(-21,10), S(-7, 1) },
|
|
|
|
{ S( 0,-3), S( 9,-4) }};
|
Introducing King On File
this new concept calculates bonuses/penalties for the king when the king is in a semiopen or open file.
Passed STC:
LLR: 2.95 (-2.94,2.94) {-0.25,1.25}
Total: 44904 W: 9365 L: 9028 D: 26511
Ptnml(0-2): 857, 5309, 9841, 5530, 915
https://tests.stockfishchess.org/tests/view/5fa343625d72639a7acef72b
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 60552 W: 8449 L: 8051 D: 44052
Ptnml(0-2): 466, 5772, 17481, 6012, 545
https://tests.stockfishchess.org/tests/view/5fa40e365d72639a7acef79e
closes https://github.com/official-stockfish/Stockfish/pull/3219
Bench: 3689484
2020-11-04 16:54:53 -07:00
|
|
|
|
2012-03-28 23:04:44 -06:00
|
|
|
#undef S
|
|
|
|
#undef V
|
2012-12-22 03:21:06 -07:00
|
|
|
|
2020-06-24 14:19:58 -06:00
|
|
|
|
|
|
|
/// evaluate() calculates a score for the static pawn structure of the given position.
|
|
|
|
/// We cannot use the location of pieces or king in this function, as the evaluation
|
|
|
|
/// of the pawn structure will be stored in a small cache for speed reasons, and will
|
|
|
|
/// be re-used even when the pieces have moved.
|
|
|
|
|
2012-12-22 03:21:06 -07:00
|
|
|
template<Color Us>
|
2013-06-16 02:51:17 -06:00
|
|
|
Score evaluate(const Position& pos, Pawns::Entry* e) {
|
2012-12-22 03:21:06 -07:00
|
|
|
|
2020-03-30 14:45:35 -06:00
|
|
|
constexpr Color Them = ~Us;
|
2019-10-31 10:17:46 -06:00
|
|
|
constexpr Direction Up = pawn_push(Us);
|
Add penalty for doubled pawns in agile structure
Give an additional penalty of S(20, 10) for any doubled pawn if none of
the opponent's pawns is facing any of our
- pawns or
- pawn attacks;
that means, each of their pawns can push at least one square without
being captured.
This ignores their non-pawns pieces and attacks.
One possible justification: Their pawns' ability to push freely provides
options to react to our threats by changing their pawn structure. Our
doubled pawns however will likely lead to an exploitable weakness, even
if the pawn structure is not yet fixed.
Note that the notion of "their pawns not being fixed" is symmetric for
both players: If all of their pawns can push freely so can ours. All
pawns being freely pushable might just be an early-game-indicator.
However, it can trigger during endgame pawns races, where doubled pawns
are especially hindering, too.
LTC
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 134976 W: 17964 L: 17415 D: 99597
Ptnml(0-2): 998, 12702, 39619, 13091, 1078
https://tests.stockfishchess.org/tests/view/5ffdd5316019e097de3ef281
STC
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 35640 W: 7219 L: 6904 D: 21517
Ptnml(0-2): 645, 4096, 8084, 4289, 706
https://tests.stockfishchess.org/tests/view/5ffda4a16019e097de3ef265
closes https://github.com/official-stockfish/Stockfish/pull/3302
Bench: 4363873
2021-01-12 06:30:25 -07:00
|
|
|
constexpr Direction Down = -Up;
|
2012-12-22 03:21:06 -07:00
|
|
|
|
2019-09-27 02:18:22 -06:00
|
|
|
Bitboard neighbours, stoppers, support, phalanx, opposed;
|
2019-10-06 16:48:19 -06:00
|
|
|
Bitboard lever, leverPush, blocked;
|
2012-12-22 03:21:06 -07:00
|
|
|
Square s;
|
2019-09-27 02:18:22 -06:00
|
|
|
bool backward, passed, doubled;
|
2014-12-27 02:47:21 -07:00
|
|
|
Score score = SCORE_ZERO;
|
Remove piece lists
This patch removes the incrementally updated piece lists from the Position object.
This has been tried before but always failed. My reasons for trying again are:
* 32-bit systems (including phones) are now much less important than they were some years ago (and are absent from fishtest);
* NNUE may have made SF less finely tuned to the order in which moves were generated.
STC:
LLR: 2.94 (-2.94,2.94) {-1.25,0.25}
Total: 55272 W: 5260 L: 5216 D: 44796
Ptnml(0-2): 208, 4147, 18898, 4159, 224
https://tests.stockfishchess.org/tests/view/5fc2986a42a050a89f02c926
LTC:
LLR: 2.96 (-2.94,2.94) {-0.75,0.25}
Total: 16600 W: 673 L: 608 D: 15319
Ptnml(0-2): 14, 533, 7138, 604, 11
https://tests.stockfishchess.org/tests/view/5fc2f98342a050a89f02c95c
closes https://github.com/official-stockfish/Stockfish/pull/3247
Bench: 3940967
2020-11-29 04:05:26 -07:00
|
|
|
Bitboard b = pos.pieces(Us, PAWN);
|
2012-12-22 03:21:06 -07:00
|
|
|
|
2017-06-11 15:31:15 -06:00
|
|
|
Bitboard ourPawns = pos.pieces( Us, PAWN);
|
2013-06-16 02:51:17 -06:00
|
|
|
Bitboard theirPawns = pos.pieces(Them, PAWN);
|
|
|
|
|
2019-07-25 01:02:26 -06:00
|
|
|
Bitboard doubleAttackThem = pawn_double_attacks_bb<Them>(theirPawns);
|
|
|
|
|
2019-10-06 16:48:19 -06:00
|
|
|
e->passedPawns[Us] = 0;
|
Bonus for double attacks on unsupported pawns
This is a functional change that rewards double attacks on an unsupported pawns.
STC (non-functional difference)
LLR: 2.96 (-2.94,2.94) [0.50,4.50]
Total: 83276 W: 18981 L: 18398 D: 45897
http://tests.stockfishchess.org/tests/view/5d0970500ebc5925cf0a77d4
LTC (incomplete looping version)
LLR: 0.50 (-2.94,2.94) [0.00,3.50]
Total: 82999 W: 14244 L: 13978 D: 54777
http://tests.stockfishchess.org/tests/view/5d0a8d480ebc5925cf0a8d58
LTC (completed non-looping version).
LLR: 2.96 (-2.94,2.94) [0.00,3.50]
Total: 223381 W: 38323 L: 37512 D: 147546
http://tests.stockfishchess.org/tests/view/5d0e80510ebc5925cf0ad320
Closes https://github.com/official-stockfish/Stockfish/pull/2205
Bench 3633546
----------------------------------
Comments by Alain SAVARD:
interesting result ! I would have expected that search would resolve such positions
correctly on the very next move. This is not a very common pattern, and when it happens,
it will quickly disappear. So I'm quite surprised that it passed LTC.
I would be even more surprised if this would resist a simplification.
Anyway, let's try to imagine a few cases.
a) If you have White d5 f5 against Black e6, and White to move
last move by Black was probably a capture on e6 and White is about to recapture on e6
b) If you have White d5 f5 against e6, and Black to move
last move by White was possibly a capture on d5 or f5
or the pawn on e6 was pinned or could not move for some reason.
and white wants to blast open the position and just pushed d4-d5 or f4-f5
Some possible follow-ups
a) Motif is so rare that the popcount() can be safely replaced with a bool()
But this would not pass a SPRT[0,4],
So try a simplification with bool() and also without the & ~theirAttacks
b) If it works, we probably can simply have this in the loop
if (lever) score += S(0, 20);
c) remove all this and tweak something in search for pawn captures (priority, SEE, extension,..)
2019-06-27 01:45:53 -06:00
|
|
|
e->kingSquares[Us] = SQ_NONE;
|
2019-10-06 16:48:19 -06:00
|
|
|
e->pawnAttacks[Us] = e->pawnAttacksSpan[Us] = pawn_attacks_bb<Us>(ourPawns);
|
2020-05-23 05:26:13 -06:00
|
|
|
e->blockedCount += popcount(shift<Up>(ourPawns) & (theirPawns | doubleAttackThem));
|
Bonus for double attacks on unsupported pawns
This is a functional change that rewards double attacks on an unsupported pawns.
STC (non-functional difference)
LLR: 2.96 (-2.94,2.94) [0.50,4.50]
Total: 83276 W: 18981 L: 18398 D: 45897
http://tests.stockfishchess.org/tests/view/5d0970500ebc5925cf0a77d4
LTC (incomplete looping version)
LLR: 0.50 (-2.94,2.94) [0.00,3.50]
Total: 82999 W: 14244 L: 13978 D: 54777
http://tests.stockfishchess.org/tests/view/5d0a8d480ebc5925cf0a8d58
LTC (completed non-looping version).
LLR: 2.96 (-2.94,2.94) [0.00,3.50]
Total: 223381 W: 38323 L: 37512 D: 147546
http://tests.stockfishchess.org/tests/view/5d0e80510ebc5925cf0ad320
Closes https://github.com/official-stockfish/Stockfish/pull/2205
Bench 3633546
----------------------------------
Comments by Alain SAVARD:
interesting result ! I would have expected that search would resolve such positions
correctly on the very next move. This is not a very common pattern, and when it happens,
it will quickly disappear. So I'm quite surprised that it passed LTC.
I would be even more surprised if this would resist a simplification.
Anyway, let's try to imagine a few cases.
a) If you have White d5 f5 against Black e6, and White to move
last move by Black was probably a capture on e6 and White is about to recapture on e6
b) If you have White d5 f5 against e6, and Black to move
last move by White was possibly a capture on d5 or f5
or the pawn on e6 was pinned or could not move for some reason.
and white wants to blast open the position and just pushed d4-d5 or f4-f5
Some possible follow-ups
a) Motif is so rare that the popcount() can be safely replaced with a bool()
But this would not pass a SPRT[0,4],
So try a simplification with bool() and also without the & ~theirAttacks
b) If it works, we probably can simply have this in the loop
if (lever) score += S(0, 20);
c) remove all this and tweak something in search for pawn captures (priority, SEE, extension,..)
2019-06-27 01:45:53 -06:00
|
|
|
|
2012-12-22 03:21:06 -07:00
|
|
|
// Loop through all pawns of the current color and score each pawn
|
2021-03-19 12:43:25 -06:00
|
|
|
while (b)
|
|
|
|
{
|
2021-03-13 09:40:07 -07:00
|
|
|
s = pop_lsb(b);
|
Remove piece lists
This patch removes the incrementally updated piece lists from the Position object.
This has been tried before but always failed. My reasons for trying again are:
* 32-bit systems (including phones) are now much less important than they were some years ago (and are absent from fishtest);
* NNUE may have made SF less finely tuned to the order in which moves were generated.
STC:
LLR: 2.94 (-2.94,2.94) {-1.25,0.25}
Total: 55272 W: 5260 L: 5216 D: 44796
Ptnml(0-2): 208, 4147, 18898, 4159, 224
https://tests.stockfishchess.org/tests/view/5fc2986a42a050a89f02c926
LTC:
LLR: 2.96 (-2.94,2.94) {-0.75,0.25}
Total: 16600 W: 673 L: 608 D: 15319
Ptnml(0-2): 14, 533, 7138, 604, 11
https://tests.stockfishchess.org/tests/view/5fc2f98342a050a89f02c95c
closes https://github.com/official-stockfish/Stockfish/pull/3247
Bench: 3940967
2020-11-29 04:05:26 -07:00
|
|
|
|
2012-12-22 03:21:06 -07:00
|
|
|
assert(pos.piece_on(s) == make_piece(Us, PAWN));
|
|
|
|
|
2019-04-11 08:38:53 -06:00
|
|
|
Rank r = relative_rank(Us, s);
|
2012-12-22 03:21:06 -07:00
|
|
|
|
2015-02-24 03:33:40 -07:00
|
|
|
// Flag the pawn
|
2017-06-22 22:03:58 -06:00
|
|
|
opposed = theirPawns & forward_file_bb(Us, s);
|
2019-10-06 16:48:19 -06:00
|
|
|
blocked = theirPawns & (s + Up);
|
2019-02-08 02:36:03 -07:00
|
|
|
stoppers = theirPawns & passed_pawn_span(Us, s);
|
2020-05-28 09:48:31 -06:00
|
|
|
lever = theirPawns & pawn_attacks_bb(Us, s);
|
|
|
|
leverPush = theirPawns & pawn_attacks_bb(Us, s + Up);
|
2017-04-11 11:50:24 -06:00
|
|
|
doubled = ourPawns & (s - Up);
|
2019-06-09 06:31:16 -06:00
|
|
|
neighbours = ourPawns & adjacent_files_bb(s);
|
2016-04-08 12:05:36 -06:00
|
|
|
phalanx = neighbours & rank_bb(s);
|
2018-12-11 05:47:56 -07:00
|
|
|
support = neighbours & rank_bb(s - Up);
|
2016-04-08 12:05:36 -06:00
|
|
|
|
Add penalty for doubled pawns in agile structure
Give an additional penalty of S(20, 10) for any doubled pawn if none of
the opponent's pawns is facing any of our
- pawns or
- pawn attacks;
that means, each of their pawns can push at least one square without
being captured.
This ignores their non-pawns pieces and attacks.
One possible justification: Their pawns' ability to push freely provides
options to react to our threats by changing their pawn structure. Our
doubled pawns however will likely lead to an exploitable weakness, even
if the pawn structure is not yet fixed.
Note that the notion of "their pawns not being fixed" is symmetric for
both players: If all of their pawns can push freely so can ours. All
pawns being freely pushable might just be an early-game-indicator.
However, it can trigger during endgame pawns races, where doubled pawns
are especially hindering, too.
LTC
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 134976 W: 17964 L: 17415 D: 99597
Ptnml(0-2): 998, 12702, 39619, 13091, 1078
https://tests.stockfishchess.org/tests/view/5ffdd5316019e097de3ef281
STC
LLR: 2.94 (-2.94,2.94) {-0.25,1.25}
Total: 35640 W: 7219 L: 6904 D: 21517
Ptnml(0-2): 645, 4096, 8084, 4289, 706
https://tests.stockfishchess.org/tests/view/5ffda4a16019e097de3ef265
closes https://github.com/official-stockfish/Stockfish/pull/3302
Bench: 4363873
2021-01-12 06:30:25 -07:00
|
|
|
if (doubled)
|
|
|
|
{
|
|
|
|
// Additional doubled penalty if none of their pawns is fixed
|
|
|
|
if (!(ourPawns & shift<Down>(theirPawns | pawn_attacks_bb<Them>(theirPawns))))
|
|
|
|
score -= DoubledEarly;
|
|
|
|
}
|
|
|
|
|
2019-06-09 07:07:36 -06:00
|
|
|
// A pawn is backward when it is behind all pawns of the same color on
|
2019-10-06 16:48:19 -06:00
|
|
|
// the adjacent files and cannot safely advance.
|
|
|
|
backward = !(neighbours & forward_ranks_bb(Them, s + Up))
|
2019-10-18 18:20:38 -06:00
|
|
|
&& (leverPush | blocked);
|
2019-10-06 16:48:19 -06:00
|
|
|
|
|
|
|
// Compute additional span if pawn is not backward nor blocked
|
|
|
|
if (!backward && !blocked)
|
|
|
|
e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s);
|
2019-09-27 02:18:22 -06:00
|
|
|
|
2019-07-25 01:02:26 -06:00
|
|
|
// A pawn is passed if one of the three following conditions is true:
|
|
|
|
// (a) there is no stoppers except some levers
|
|
|
|
// (b) the only stoppers are the leverPush, but we outnumber them
|
|
|
|
// (c) there is only one front stopper which can be levered.
|
Remove candidate passers w/o feasible lever
+-------+
| o . . | o their pawns
| x . . | x our pawns
| . x . | <- Can sacrifice to create passer?
+-------+
yes
1 2 3 4 5
+-------+ +-------+ +-------+ +-------+ +-------+
| o . . | | o r . | | o r . | | o . b | | o . b | lowercase: theirs
| x b . | | x . . | | x . R | | x . R | | x . . | uppercase: ours
| . x . | | . x . | | . x . | | . x . | | . x B |
+-------+ +-------+ +-------+ +-------+ +-------+
no no yes no yes
The value of our top pawn depends on our ability to advance our bottom
pawn, levering their blocker. Previously, this pawn configuration was
always scored as passer (although a blocked one).
Add requirements for the square s above our (possibly) sacrificed pawn:
- s must not be occupied by them (1).
- If they attack s (2), we must attack s (3).
- If they attack s with a minor (4), we must attack s with a minor (5).
The attack from their blocker is ignored because it is inherent in the
structure; we are ok with sacrificing our bottom pawn.
LTC
LLR: 2.95 (-2.94,2.94) {0.25,1.75}
Total: 37030 W: 4962 L: 4682 D: 27386
Ptnml(0-2): 266, 3445, 10863, 3625, 316
https://tests.stockfishchess.org/tests/view/5e92a2b4be6ede5b954bf239
STC
LLR: 2.94 (-2.94,2.94) {-0.50,1.50}
Total: 40874 W: 8066 L: 7813 D: 24995
Ptnml(0-2): 706, 4753, 9324, 4890, 764
https://tests.stockfishchess.org/tests/view/5e922199af0a0143109dc90e
closes https://github.com/official-stockfish/Stockfish/pull/2624
Bench: 4828294
2020-04-11 09:28:45 -06:00
|
|
|
// (Refined in Evaluation::passed)
|
2019-07-25 01:02:26 -06:00
|
|
|
passed = !(stoppers ^ lever)
|
|
|
|
|| ( !(stoppers ^ leverPush)
|
|
|
|
&& popcount(phalanx) >= popcount(leverPush))
|
2019-10-06 16:48:19 -06:00
|
|
|
|| ( stoppers == blocked && r >= RANK_5
|
2019-07-25 01:02:26 -06:00
|
|
|
&& (shift<Up>(support) & ~(theirPawns | doubleAttackThem)));
|
|
|
|
|
Count only the most advanced passed pawn for each file.
This patch adjusts definition of passed pawns - if there is a pawn of our color in the same file in front of a current pawn it's no longer counts as passed.
passed STC
https://tests.stockfishchess.org/tests/view/5e802037e42a5c3b3ca2ed07
LLR: 2.94 (-2.94,2.94) {-0.50,1.50}
Total: 215296 W: 41843 L: 41341 D: 132112
Ptnml(0-2): 3688, 25313, 49304, 25495, 3848
passed LTC
https://tests.stockfishchess.org/tests/view/5e806441e42a5c3b3ca2ed2b
LLR: 2.95 (-2.94,2.94) {0.25,1.75}
Total: 74050 W: 9761 L: 9379 D: 54910
Ptnml(0-2): 510, 6838, 22025, 7064, 588
closes https://github.com/official-stockfish/Stockfish/pull/2602
bench: 4902237
2020-03-29 11:04:20 -06:00
|
|
|
passed &= !(forward_file_bb(Us, s) & ourPawns);
|
|
|
|
|
2019-07-25 01:02:26 -06:00
|
|
|
// Passed pawns will be properly scored later in evaluation when we have
|
|
|
|
// full attack info.
|
|
|
|
if (passed)
|
2012-12-22 03:21:06 -07:00
|
|
|
e->passedPawns[Us] |= s;
|
|
|
|
|
|
|
|
// Score this pawn
|
2018-12-11 05:47:56 -07:00
|
|
|
if (support | phalanx)
|
2019-03-25 13:04:14 -06:00
|
|
|
{
|
Connected / blocked pawns simplification
There is no need to score blocked pawns at many places.
The idea originated from: Rocky
Tuning and testing by: Fauzi
Passed STC:
https://tests.stockfishchess.org/tests/view/5f04f8fd59f6f035328945d4
LLR: 2.94 (-2.94,2.94) {-1.50,0.50}
Total: 6352 W: 1299 L: 1118 D: 3935
Ptnml(0-2): 89, 695, 1469, 792, 131
Passed LTC:
https://tests.stockfishchess.org/tests/view/5f0527bd59f6f035328945e3
LLR: 2.94 (-2.94,2.94) {-1.50,0.50}
Total: 27648 W: 3517 L: 3433 D: 20698
Ptnml(0-2): 177, 2561, 8301, 2571, 214
closes https://github.com/official-stockfish/Stockfish/pull/2799
Bench: 4734746
2020-07-07 16:29:03 -06:00
|
|
|
int v = Connected[r] * (2 + bool(phalanx) - bool(opposed))
|
Pawn Tuning
Tuning of pawns, for classical evaluation:
Passed STC:
https://tests.stockfishchess.org/tests/view/5f771f0e52560f5fc78559ec
LLR: 2.96 (-2.94,2.94) {-0.25,1.25}
Total: 252696 W: 50321 L: 49692 D: 152683
Ptnml(0-2): 4614, 29845, 57049, 29978, 4862
Passed LTC:
https://tests.stockfishchess.org/tests/view/5f77cfef090dcf9aaa16d38b
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 48184 W: 6556 L: 6193 D: 35435
Ptnml(0-2): 335, 4516, 14100, 4733, 408
closes https://github.com/official-stockfish/Stockfish/pull/3169
bench: 4016121
2020-10-02 06:32:19 -06:00
|
|
|
+ 22 * popcount(support);
|
2019-04-23 12:26:58 -06:00
|
|
|
|
2019-03-25 13:04:14 -06:00
|
|
|
score += make_score(v, v * (r - 2) / 4);
|
|
|
|
}
|
2019-06-09 07:07:36 -06:00
|
|
|
|
Rework the "unsupported" penalty into a "supported" bonus
A pawn (according to all the searched positions of a bench run) is not supported 85% of the time,
(in current master it is either isolated, backward or "unsupported").
So it made sense to try moving the S(17, 8) "unsupported" penalty value into the base pawn value hoping for a more representative pawn value, and accordingly
a) adjust backward and isolated so that they stay more or less the same as master
b) increase the mg connected bonus in the supported case by S(17, 0) and let the Connected formula find a suitable eg value according to rank.
Tested as a simplification SPRT(-3, 1)
Passed STC
http://tests.stockfishchess.org/tests/view/5970dbd30ebc5916ff649dd6
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 19613 W: 3663 L: 3540 D: 12410
Passed LTC
http://tests.stockfishchess.org/tests/view/597137780ebc5916ff649de3
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 24721 W: 3306 L: 3191 D: 18224
Bench: 5581946
Closes #1179
2017-08-01 19:36:33 -06:00
|
|
|
else if (!neighbours)
|
Add doubled isolated pawn penalty.
This patch gives an additional penalty if a doubled isolated pawn is stopped
only by a single opponent pawn on the same file. Thanks to NKONSTANTAKIS,
who shared this idea on the forum!
https://groups.google.com/forum/?fromgroups=#!topic/fishcooking/vC4Qn-PMlS4.
STC:
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 84872 W: 16688 L: 16370 D: 51814
Ptnml(0-2): 1507, 9940, 19274, 10158, 1557
https://tests.stockfishchess.org/tests/view/5ec65bd955202b947dc5d4ac
LTC:
LLR: 2.93 (-2.94,2.94) {0.25,1.75}
Total: 58104 W: 7614 L: 7278 D: 43212
Ptnml(0-2): 411, 5369, 17196, 5625, 451
https://tests.stockfishchess.org/tests/view/5ec6e9f2c23f5b0710632b19
Closes https://github.com/official-stockfish/Stockfish/pull/2694
Bench: 5148950
2020-05-22 03:08:44 -06:00
|
|
|
{
|
Isolated pawns tweak
Give opposed doubled isolated pawns only the Doubled penalty.
The other isolated pawns get the Isolated penalty and the WeakUnopposed penalty.
The popcount condition has been replaced with an opposed check,
which is non-functional, but probably gives a speed-up.
Passed STC (https://tests.stockfishchess.org/tests/view/5ed0f0f0042fa6d77c3552f5):
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 121832 W: 23562 L: 23195 D: 75075
Ptnml(0-2): 2092, 14064, 28313, 14279, 2168
LTC: (https://tests.stockfishchess.org/tests/view/5ed22e40042fa6d77c355387)
LLR: 2.96 (-2.94,2.94) {0.25,1.75}
Total: 103368 W: 13232 L: 12768 D: 77368
Ptnml(0-2): 693, 9484, 30919, 9842, 746
closes https://github.com/official-stockfish/Stockfish/pull/2706
Bench: 4085694
2020-05-31 08:39:03 -06:00
|
|
|
if ( opposed
|
|
|
|
&& (ourPawns & forward_file_bb(Them, s))
|
Add doubled isolated pawn penalty.
This patch gives an additional penalty if a doubled isolated pawn is stopped
only by a single opponent pawn on the same file. Thanks to NKONSTANTAKIS,
who shared this idea on the forum!
https://groups.google.com/forum/?fromgroups=#!topic/fishcooking/vC4Qn-PMlS4.
STC:
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 84872 W: 16688 L: 16370 D: 51814
Ptnml(0-2): 1507, 9940, 19274, 10158, 1557
https://tests.stockfishchess.org/tests/view/5ec65bd955202b947dc5d4ac
LTC:
LLR: 2.93 (-2.94,2.94) {0.25,1.75}
Total: 58104 W: 7614 L: 7278 D: 43212
Ptnml(0-2): 411, 5369, 17196, 5625, 451
https://tests.stockfishchess.org/tests/view/5ec6e9f2c23f5b0710632b19
Closes https://github.com/official-stockfish/Stockfish/pull/2694
Bench: 5148950
2020-05-22 03:08:44 -06:00
|
|
|
&& !(theirPawns & adjacent_files_bb(s)))
|
Remove and replace DoubledIsolated penalty by Doubled
The values for both penalties were very close, so DoubledIsolated can be removed and replaced by Doubled.
Passed STC (simplification): https://tests.stockfishchess.org/tests/view/5ec7c18e2a585b485af54407
LLR: 2.97 (-2.94,2.94) {-1.50,0.50}
Total: 105360 W: 20175 L: 20136 D: 65049
Ptnml(0-2): 1803, 12230, 24572, 12275, 1800
Passed LTC:
LLR: 2.94 (-2.94,2.94) {-1.50,0.50}
Total: 15440 W: 1978 L: 1877 D: 11585
Ptnml(0-2): 92, 1405, 4667, 1422, 134
closes https://github.com/official-stockfish/Stockfish/pull/2696
Bench: 4668875
2020-05-23 05:14:02 -06:00
|
|
|
score -= Doubled;
|
Isolated pawns tweak
Give opposed doubled isolated pawns only the Doubled penalty.
The other isolated pawns get the Isolated penalty and the WeakUnopposed penalty.
The popcount condition has been replaced with an opposed check,
which is non-functional, but probably gives a speed-up.
Passed STC (https://tests.stockfishchess.org/tests/view/5ed0f0f0042fa6d77c3552f5):
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 121832 W: 23562 L: 23195 D: 75075
Ptnml(0-2): 2092, 14064, 28313, 14279, 2168
LTC: (https://tests.stockfishchess.org/tests/view/5ed22e40042fa6d77c355387)
LLR: 2.96 (-2.94,2.94) {0.25,1.75}
Total: 103368 W: 13232 L: 12768 D: 77368
Ptnml(0-2): 693, 9484, 30919, 9842, 746
closes https://github.com/official-stockfish/Stockfish/pull/2706
Bench: 4085694
2020-05-31 08:39:03 -06:00
|
|
|
else
|
2020-06-21 07:21:46 -06:00
|
|
|
score -= Isolated
|
|
|
|
+ WeakUnopposed * !opposed;
|
Add doubled isolated pawn penalty.
This patch gives an additional penalty if a doubled isolated pawn is stopped
only by a single opponent pawn on the same file. Thanks to NKONSTANTAKIS,
who shared this idea on the forum!
https://groups.google.com/forum/?fromgroups=#!topic/fishcooking/vC4Qn-PMlS4.
STC:
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 84872 W: 16688 L: 16370 D: 51814
Ptnml(0-2): 1507, 9940, 19274, 10158, 1557
https://tests.stockfishchess.org/tests/view/5ec65bd955202b947dc5d4ac
LTC:
LLR: 2.93 (-2.94,2.94) {0.25,1.75}
Total: 58104 W: 7614 L: 7278 D: 43212
Ptnml(0-2): 411, 5369, 17196, 5625, 451
https://tests.stockfishchess.org/tests/view/5ec6e9f2c23f5b0710632b19
Closes https://github.com/official-stockfish/Stockfish/pull/2694
Bench: 5148950
2020-05-22 03:08:44 -06:00
|
|
|
}
|
|
|
|
|
2015-03-28 17:30:46 -06:00
|
|
|
else if (backward)
|
2020-06-21 07:21:46 -06:00
|
|
|
score -= Backward
|
WeakUnopposed penalty for backwards on file A or H
Do not give the WeakUnopposed penalty for backwards on file A or H
The original idea comes from Lolligerhans, and a series of tunings and tests done by Fauzi.
Passed STC:
LLR: 2.96 (-2.94,2.94) {-0.25,1.25}
Total: 140864 W: 28127 L: 27660 D: 85077
Ptnml(0-2): 2529, 16660, 31735, 16831, 2677
https://tests.stockfishchess.org/tests/view/5fe39dec3932f79192d39673
Passed LTC:
LLR: 2.95 (-2.94,2.94) {0.25,1.25}
Total: 67568 W: 8993 L: 8590 D: 49985
Ptnml(0-2): 523, 6176, 19983, 6579, 523
https://tests.stockfishchess.org/tests/view/5fe3dd1b3932f79192d39693
closes https://github.com/official-stockfish/Stockfish/pull/3275
Bench: 4109336
2020-12-25 07:19:04 -07:00
|
|
|
+ WeakUnopposed * !opposed * bool(~(FileABB | FileHBB) & s);
|
2015-03-29 01:24:17 -06:00
|
|
|
|
2019-09-11 12:36:58 -06:00
|
|
|
if (!support)
|
2020-06-21 07:21:46 -06:00
|
|
|
score -= Doubled * doubled
|
|
|
|
+ WeakLever * more_than_one(lever);
|
Add a rank based bonus for blocked pawns.
Fix for overevaluated blocked pawns on the 5th and 6th rank.
This is a rewrite of the original idea that uses only two parameters.
Thanks to rocky640 for pointing this out.
STC:
LLR: 2.94 (-2.94,2.94) {-0.50,1.50}
Total: 50800 W: 9707 L: 9446 D: 31647
Ptnml(0-2): 831, 5851, 11822, 6018, 878
https://tests.stockfishchess.org/tests/view/5f00b4f359f6f03532894304
LTC:
LLR: 2.93 (-2.94,2.94) {0.25,1.75}
Total: 52064 W: 6477 L: 6167 D: 39420
Ptnml(0-2): 331, 4628, 15834, 4878, 361
https://tests.stockfishchess.org/tests/view/5f0115fe59f6f03532894345
closes https://github.com/official-stockfish/Stockfish/pull/2794
Bench: 4882833
2020-07-06 01:30:23 -06:00
|
|
|
|
2020-11-12 06:05:28 -07:00
|
|
|
if (blocked && r >= RANK_5)
|
|
|
|
score += BlockedPawn[r - RANK_5];
|
2012-12-22 03:21:06 -07:00
|
|
|
}
|
|
|
|
|
2014-12-27 02:47:21 -07:00
|
|
|
return score;
|
2012-12-22 03:21:06 -07:00
|
|
|
}
|
2013-06-16 02:51:17 -06:00
|
|
|
|
|
|
|
} // namespace
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2012-12-22 03:21:06 -07:00
|
|
|
namespace Pawns {
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2020-06-24 14:19:58 -06:00
|
|
|
|
2014-12-30 02:31:50 -07:00
|
|
|
/// 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
|
|
|
|
/// have to recompute all when the same pawns configuration occurs again.
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2014-12-30 02:31:50 -07:00
|
|
|
Entry* probe(const Position& pos) {
|
2008-12-09 08:46:10 -07:00
|
|
|
|
2011-12-25 03:50:59 -07:00
|
|
|
Key key = pos.pawn_key();
|
2014-12-30 02:31:50 -07:00
|
|
|
Entry* e = pos.this_thread()->pawnsTable[key];
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2012-03-31 05:15:57 -06:00
|
|
|
if (e->key == key)
|
|
|
|
return e;
|
2008-08-31 23:59:13 -06:00
|
|
|
|
2012-03-31 05:15:57 -06:00
|
|
|
e->key = key;
|
2020-04-29 09:39:25 -06:00
|
|
|
e->blockedCount = 0;
|
2018-02-20 09:10:37 -07:00
|
|
|
e->scores[WHITE] = evaluate<WHITE>(pos, e);
|
|
|
|
e->scores[BLACK] = evaluate<BLACK>(pos, e);
|
|
|
|
|
2012-03-31 05:15:57 -06:00
|
|
|
return e;
|
2008-08-31 23:59:13 -06:00
|
|
|
}
|
2009-07-24 04:16:18 -06:00
|
|
|
|
|
|
|
|
2018-04-23 01:48:53 -06:00
|
|
|
/// Entry::evaluate_shelter() calculates the shelter bonus and the storm
|
|
|
|
/// penalty for a king, looking at the king file and the two closest files.
|
2012-03-28 23:04:44 -06:00
|
|
|
|
2012-03-26 05:52:10 -06:00
|
|
|
template<Color Us>
|
2020-06-21 07:21:46 -06:00
|
|
|
Score Entry::evaluate_shelter(const Position& pos, Square ksq) const {
|
2012-03-28 04:44:41 -06:00
|
|
|
|
2020-03-30 14:45:35 -06:00
|
|
|
constexpr Color Them = ~Us;
|
2012-03-28 04:44:41 -06:00
|
|
|
|
2018-07-21 00:17:27 -06:00
|
|
|
Bitboard b = pos.pieces(PAWN) & ~forward_ranks_bb(Them, ksq);
|
Remove attacked pawns from storm evaluation
STC:
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 54456 W: 11009 L: 10737 D: 32710
Ptnml(0-2): 929, 6326, 12523, 6444, 1006
https://tests.stockfishchess.org/tests/view/5ec962e4404591b2793008a5
LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.75}
Total: 62448 W: 9018 L: 8664 D: 44766
Ptnml(0-2): 462, 5928, 18121, 6220, 493
https://tests.stockfishchess.org/tests/view/5ec976a8a586eee45aa2ab40
Non regression STC with "noob_3moves.epd" opening book
LLR: 3.81 (-2.94,2.94) {-1.50,0.50}
Total: 91896 W: 17770 L: 17653 D: 56473
Ptnml(0-2): 1598, 10782, 21124, 10793, 1651
https://tests.stockfishchess.org/tests/view/5ec9b83ea586eee45aa2ab96
closes https://github.com/official-stockfish/Stockfish/pull/2698
Bench 4488597
2020-05-23 17:54:37 -06:00
|
|
|
Bitboard ourPawns = b & pos.pieces(Us) & ~pawnAttacks[Them];
|
In BlockedStorm, theirPawns includes ones attacked by us.
Pawns heading towards our king tend to be dangerous whether or not we are attacking them so remove this test.
STC:
LLR: 2.93 (-2.94,2.94) {-1.50,0.50}
Total: 91184 W: 18196 L: 18137 D: 54851
Ptnml(0-2): 1580, 10656, 21092, 10653, 1611
https://tests.stockfishchess.org/tests/view/5ecc3f7080f2c838b9655841
LTC:
LLR: 2.93 (-2.94,2.94) {-1.50,0.50}
Total: 14152 W: 2045 L: 1937 D: 10170
Ptnml(0-2): 99, 1325, 4130, 1413, 109
https://tests.stockfishchess.org/tests/view/5ecc4f3180f2c838b9655861
closes https://github.com/official-stockfish/Stockfish/pull/2702
Bench 4828973
2020-05-25 17:27:05 -06:00
|
|
|
Bitboard theirPawns = b & pos.pieces(Them);
|
2018-04-23 01:48:53 -06:00
|
|
|
|
2019-07-09 14:03:00 -06:00
|
|
|
Score bonus = make_score(5, 5);
|
2018-05-01 15:50:23 -06:00
|
|
|
|
2020-07-11 08:59:33 -06:00
|
|
|
File center = std::clamp(file_of(ksq), FILE_B, FILE_G);
|
2017-12-04 09:52:31 -07:00
|
|
|
for (File f = File(center - 1); f <= File(center + 1); ++f)
|
2012-03-28 04:44:41 -06:00
|
|
|
{
|
2013-10-24 12:34:11 -06:00
|
|
|
b = ourPawns & file_bb(f);
|
2019-08-14 14:15:41 -06:00
|
|
|
int ourRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : 0;
|
2012-03-28 04:44:41 -06:00
|
|
|
|
2017-06-22 22:03:58 -06:00
|
|
|
b = theirPawns & file_bb(f);
|
2019-08-14 14:15:41 -06:00
|
|
|
int theirRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : 0;
|
2014-01-10 19:00:17 -07:00
|
|
|
|
2020-05-23 05:26:13 -06:00
|
|
|
int d = edge_distance(f);
|
2019-07-09 14:03:00 -06:00
|
|
|
bonus += make_score(ShelterStrength[d][ourRank], 0);
|
2019-05-12 15:20:51 -06:00
|
|
|
|
|
|
|
if (ourRank && (ourRank == theirRank - 1))
|
Remove attacked pawns from storm evaluation
STC:
LLR: 2.96 (-2.94,2.94) {-0.50,1.50}
Total: 54456 W: 11009 L: 10737 D: 32710
Ptnml(0-2): 929, 6326, 12523, 6444, 1006
https://tests.stockfishchess.org/tests/view/5ec962e4404591b2793008a5
LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.75}
Total: 62448 W: 9018 L: 8664 D: 44766
Ptnml(0-2): 462, 5928, 18121, 6220, 493
https://tests.stockfishchess.org/tests/view/5ec976a8a586eee45aa2ab40
Non regression STC with "noob_3moves.epd" opening book
LLR: 3.81 (-2.94,2.94) {-1.50,0.50}
Total: 91896 W: 17770 L: 17653 D: 56473
Ptnml(0-2): 1598, 10782, 21124, 10793, 1651
https://tests.stockfishchess.org/tests/view/5ec9b83ea586eee45aa2ab96
closes https://github.com/official-stockfish/Stockfish/pull/2698
Bench 4488597
2020-05-23 17:54:37 -06:00
|
|
|
bonus -= BlockedStorm[theirRank];
|
2019-05-12 15:20:51 -06:00
|
|
|
else
|
2019-07-09 14:03:00 -06:00
|
|
|
bonus -= make_score(UnblockedStorm[d][theirRank], 0);
|
2012-03-26 05:52:10 -06:00
|
|
|
}
|
2012-03-28 04:44:41 -06:00
|
|
|
|
Introducing King On File
this new concept calculates bonuses/penalties for the king when the king is in a semiopen or open file.
Passed STC:
LLR: 2.95 (-2.94,2.94) {-0.25,1.25}
Total: 44904 W: 9365 L: 9028 D: 26511
Ptnml(0-2): 857, 5309, 9841, 5530, 915
https://tests.stockfishchess.org/tests/view/5fa343625d72639a7acef72b
Passed LTC:
LLR: 2.94 (-2.94,2.94) {0.25,1.25}
Total: 60552 W: 8449 L: 8051 D: 44052
Ptnml(0-2): 466, 5772, 17481, 6012, 545
https://tests.stockfishchess.org/tests/view/5fa40e365d72639a7acef79e
closes https://github.com/official-stockfish/Stockfish/pull/3219
Bench: 3689484
2020-11-04 16:54:53 -07:00
|
|
|
// King On File
|
|
|
|
bonus -= KingOnFile[pos.is_on_semiopen_file(Us, ksq)][pos.is_on_semiopen_file(Them, ksq)];
|
|
|
|
|
2019-08-24 00:16:20 -06:00
|
|
|
return bonus;
|
2012-03-26 05:52:10 -06:00
|
|
|
}
|
2011-04-09 12:50:56 -06:00
|
|
|
|
2012-03-28 04:44:41 -06:00
|
|
|
|
2014-04-13 05:35:58 -06:00
|
|
|
/// Entry::do_king_safety() calculates a bonus for king safety. It is called only
|
|
|
|
/// when king square changes, which is about 20% of total king_safety() calls.
|
2012-03-28 04:44:41 -06:00
|
|
|
|
2011-04-09 12:50:56 -06:00
|
|
|
template<Color Us>
|
2018-11-10 20:49:13 -07:00
|
|
|
Score Entry::do_king_safety(const Position& pos) {
|
2012-03-28 04:44:41 -06:00
|
|
|
|
2018-11-10 20:49:13 -07:00
|
|
|
Square ksq = pos.square<KING>(Us);
|
2012-03-28 23:04:44 -06:00
|
|
|
kingSquares[Us] = ksq;
|
2018-12-11 05:47:56 -07:00
|
|
|
castlingRights[Us] = pos.castling_rights(Us);
|
2019-10-05 03:15:24 -06:00
|
|
|
auto compare = [](Score a, Score b) { return mg_value(a) < mg_value(b); };
|
2012-06-17 02:03:05 -06:00
|
|
|
|
2019-08-24 16:04:41 -06:00
|
|
|
Score shelter = evaluate_shelter<Us>(pos, ksq);
|
2019-08-24 00:16:20 -06:00
|
|
|
|
|
|
|
// If we can castle use the bonus after castling if it is bigger
|
2019-08-24 16:04:41 -06:00
|
|
|
|
2019-08-24 00:16:20 -06:00
|
|
|
if (pos.can_castle(Us & KING_SIDE))
|
2019-08-24 16:04:41 -06:00
|
|
|
shelter = std::max(shelter, evaluate_shelter<Us>(pos, relative_square(Us, SQ_G1)), compare);
|
2019-08-24 00:16:20 -06:00
|
|
|
|
|
|
|
if (pos.can_castle(Us & QUEEN_SIDE))
|
2019-08-24 16:04:41 -06:00
|
|
|
shelter = std::max(shelter, evaluate_shelter<Us>(pos, relative_square(Us, SQ_C1)), compare);
|
2019-08-24 00:16:20 -06:00
|
|
|
|
|
|
|
// In endgame we like to bring our king near our closest pawn
|
2012-06-17 02:03:05 -06:00
|
|
|
Bitboard pawns = pos.pieces(Us, PAWN);
|
Simplify minPawnDistance
This is a functional simplification which fixes an awkward numerical cliff.
With master king_safety, no pawns is scored higher than pawn(s) that is/are far from the king. This may motivate SF to throw away pawns to increase king safety. With this patch, there is a consistent value for minPawnDistance where losing a pawn never increases king safety.
STC
LLR: 2.94 (-2.94,2.94) {-1.50,0.50}
Total: 45548 W: 8624 L: 8525 D: 28399
Ptnml(0-2): 592, 4937, 11587, 5096, 562
https://tests.stockfishchess.org/tests/view/5e98ced630be947a14e9ddc5
LTC
LLR: 2.94 (-2.94,2.94) {-1.50,0.50}
Total: 42084 W: 5292 L: 5242 D: 31550
Ptnml(0-2): 193, 3703, 13252, 3649, 245
https://tests.stockfishchess.org/tests/view/5e98e22e30be947a14e9de07
closes https://github.com/official-stockfish/Stockfish/pull/2639
bench 4600292
2020-04-16 23:12:43 -06:00
|
|
|
int minPawnDist = 6;
|
2019-04-17 12:38:38 -06:00
|
|
|
|
2020-05-28 09:48:31 -06:00
|
|
|
if (pawns & attacks_bb<KING>(ksq))
|
2019-04-17 12:38:38 -06:00
|
|
|
minPawnDist = 1;
|
|
|
|
else while (pawns)
|
2021-03-13 09:40:07 -07:00
|
|
|
minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(pawns)));
|
2011-04-09 12:50:56 -06:00
|
|
|
|
2019-08-24 16:04:41 -06:00
|
|
|
return shelter - make_score(0, 16 * minPawnDist);
|
2011-04-09 12:50:56 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Explicit template instantiation
|
2018-11-10 20:49:13 -07:00
|
|
|
template Score Entry::do_king_safety<WHITE>(const Position& pos);
|
|
|
|
template Score Entry::do_king_safety<BLACK>(const Position& pos);
|
2012-12-22 03:21:06 -07:00
|
|
|
|
|
|
|
} // namespace Pawns
|
2021-02-26 02:02:13 -07:00
|
|
|
|
|
|
|
} // namespace Stockfish
|