Tweak fairy piece PSQT
authorFabian Fichter <ianfab@users.noreply.github.com>
Sun, 31 May 2020 21:57:14 +0000 (23:57 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Sun, 31 May 2020 22:09:33 +0000 (00:09 +0200)
makruk STC
LLR: 2.95 (-2.94,2.94) [0.00,10.00]
Total: 3823 W: 362 L: 289 D: 3172
http://www.variantfishtest.org:6543/tests/view/5ed10d906e23db36d55f2c6b

janggi
LLR: 2.97 (-2.94,2.94) [0.00,10.00]
Total: 1166 W: 619 L: 503 D: 44

xiangqi
Total: 1000 W: 291 L: 287 D: 422

shogi
Total: 1000 W: 489 L: 482 D: 29

src/psqt.cpp

index e653344..6b7fe5f 100644 (file)
@@ -141,14 +141,16 @@ void init(const Variant* v) {
 
       // Scale slider piece values with board size
       const PieceInfo* pi = pieceMap.find(pt)->second;
-      if (pi->sliderQuiet.size() || pi->sliderCapture.size())
+      bool isSlider = pi->sliderQuiet.size() || pi->sliderCapture.size() || pi->hopperQuiet.size() || pi->hopperCapture.size();
+      bool isPawn = !isSlider && pi->stepsQuiet.size() && !std::any_of(pi->stepsQuiet.begin(), pi->stepsQuiet.end(), [](Direction d) { return d < SOUTH / 2; });
+      if (isSlider)
       {
           constexpr int lc = 5;
           constexpr int rm = 5;
           constexpr int r0 = rm + RANK_8;
           int r1 = rm + (v->maxRank + v->maxFile) / 2;
           int leaper = pi->stepsQuiet.size() + pi->stepsCapture.size();
-          int slider = pi->sliderQuiet.size() + pi->sliderCapture.size();
+          int slider = pi->sliderQuiet.size() + pi->sliderCapture.size() + pi->hopperQuiet.size() + pi->hopperCapture.size();
           score = make_score(mg_value(score) * (lc * leaper + r1 * slider) / (lc * leaper + r0 * slider),
                              eg_value(score) * (lc * leaper + r1 * slider) / (lc * leaper + r0 * slider));
       }
@@ -192,7 +194,9 @@ void init(const Variant* v) {
                                   : pt == KING  ? KingBonus[std::min(r, RANK_8)][std::min(f, FILE_D)] * (1 + v->capturesToHand)
                                   : pt <= QUEEN ? Bonus[pc][std::min(r, RANK_8)][std::min(f, FILE_D)]
                                   : pt == HORSE ? Bonus[KNIGHT][std::min(r, RANK_8)][std::min(f, FILE_D)]
-                                                : make_score(5, 5) * (2 * f + std::max(std::min(r, Rank(v->maxRank - r)), RANK_1) - 8));
+                                  : isSlider    ? make_score(5, 5) * (2 * f + std::max(std::min(r, Rank(v->maxRank - r)), RANK_1) - v->maxFile - 1)
+                                  : isPawn      ? make_score(5, 5) * (2 * f - v->maxFile)
+                                                : make_score(10, 10) * (f + std::max(std::min(r, Rank(v->maxRank - r)), RANK_1) - v->maxFile / 2));
           if (pt == SOLDIER && r < v->soldierPromotionRank)
               psq[pc][s] -= score * (v->soldierPromotionRank - r) / (4 + f);
           psq[~pc][rank_of(s) <= v->maxRank ? relative_square(BLACK, s, v->maxRank) : s] = -psq[pc][s];