]> git.sesse.net Git - stockfish/blob - src/psqt.cpp
3d06a07c0c46029130982e024e4ebbb7ea80795f
[stockfish] / src / psqt.cpp
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4   Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
5
6   Stockfish is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   Stockfish is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "types.h"
21
22 namespace PSQT {
23
24 #define S(mg, eg) make_score(mg, eg)
25
26 // Bonus[PieceType][Square / 2] contains Piece-Square scores. For each piece
27 // type on a given square a (middlegame, endgame) score pair is assigned. Table
28 // is defined for files A..D and white side: it is symmetric for black side and
29 // second half of the files.
30 const Score Bonus[][int(SQUARE_NB) / 2] = {
31   { },
32   { // Pawn
33    S(  0, 0), S(  0, 0), S( 0, 0), S( 0, 0),
34    S(-22, 4), S(  3,-6), S( 7, 8), S( 3,-1),
35    S(-25,-3), S( -7,-4), S(18, 4), S(24, 5),
36    S(-27, 1), S(-15, 2), S(15,-8), S(30,-2),
37    S(-14, 7), S(  0,12), S(-2, 4), S(18,-3),
38    S(-12, 8), S(-13,-5), S(-6, 1), S(-4, 7),
39    S(-17, 1), S( 10,-9), S(-4, 1), S(-6,16),
40    S(  0, 0), S(  0, 0), S( 0, 0), S( 0, 0)
41   },
42   { // Knight
43    S(-144,-98), S(-109,-83), S(-85,-51), S(-73,-16),
44    S( -88,-68), S( -43,-53), S(-19,-21), S( -7, 14),
45    S( -69,-53), S( -24,-38), S(  0, -6), S( 12, 29),
46    S( -28,-42), S(  17,-27), S( 41,  5), S( 53, 40),
47    S( -30,-42), S(  15,-27), S( 39,  5), S( 51, 40),
48    S( -10,-53), S(  35,-38), S( 59, -6), S( 71, 29),
49    S( -64,-68), S( -19,-53), S(  5,-21), S( 17, 14),
50    S(-200,-98), S( -65,-83), S(-41,-51), S(-29,-16)
51   },
52   { // Bishop
53    S(-54,-65), S(-27,-42), S(-34,-44), S(-43,-26),
54    S(-29,-43), S(  8,-20), S(  1,-22), S( -8, -4),
55    S(-20,-33), S( 17,-10), S( 10,-12), S(  1,  6),
56    S(-19,-35), S( 18,-12), S( 11,-14), S(  2,  4),
57    S(-22,-35), S( 15,-12), S(  8,-14), S( -1,  4),
58    S(-28,-33), S(  9,-10), S(  2,-12), S( -7,  6),
59    S(-32,-43), S(  5,-20), S( -2,-22), S(-11, -4),
60    S(-49,-65), S(-22,-42), S(-29,-44), S(-38,-26)
61   },
62   { // Rook
63    S(-22, 3), S(-17, 3), S(-12, 3), S(-8, 3),
64    S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
65    S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
66    S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
67    S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
68    S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
69    S(-11, 3), S(  4, 3), S(  9, 3), S(13, 3),
70    S(-22, 3), S(-17, 3), S(-12, 3), S(-8, 3)
71   },
72   { // Queen
73    S(-2,-80), S(-2,-54), S(-2,-42), S(-2,-30),
74    S(-2,-54), S( 8,-30), S( 8,-18), S( 8, -6),
75    S(-2,-42), S( 8,-18), S( 8, -6), S( 8,  6),
76    S(-2,-30), S( 8, -6), S( 8,  6), S( 8, 18),
77    S(-2,-30), S( 8, -6), S( 8,  6), S( 8, 18),
78    S(-2,-42), S( 8,-18), S( 8, -6), S( 8,  6),
79    S(-2,-54), S( 8,-30), S( 8,-18), S( 8, -6),
80    S(-2,-80), S(-2,-54), S(-2,-42), S(-2,-30)
81   },
82   { // King
83    S(298, 27), S(332, 81), S(273,108), S(225,116),
84    S(287, 74), S(321,128), S(262,155), S(214,163),
85    S(224,111), S(258,165), S(199,192), S(151,200),
86    S(196,135), S(230,189), S(171,216), S(123,224),
87    S(173,135), S(207,189), S(148,216), S(100,224),
88    S(146,111), S(180,165), S(121,192), S( 73,200),
89    S(119, 74), S(153,128), S( 94,155), S( 46,163),
90    S( 98, 27), S(132, 81), S( 73,108), S( 25,116)
91   }
92 };
93
94 #undef S
95
96 Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
97
98 // init() initializes piece square tables: the white halves of the tables are
99 // copied from Bonus[] adding the piece value, then the black halves of the
100 // tables are initialized by flipping and changing the sign of the white scores.
101 void init() {
102
103   for (PieceType pt = PAWN; pt <= KING; ++pt)
104   {
105       PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt];
106       PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt];
107
108       Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]);
109
110       for (Square s = SQ_A1; s <= SQ_H8; ++s)
111       {
112           // Flip to the left half of the board and subtract 4 for each rank
113           int ss = (file_of(s) < FILE_E ? s : s ^ 7) - 4 * rank_of(s);
114           psq[BLACK][pt][~s] = -(psq[WHITE][pt][s] = v + Bonus[pt][ss]);
115       }
116   }
117 }
118
119 } // namespace PSQT