Skip to content

Commit

Permalink
Halve PSQT row data
Browse files Browse the repository at this point in the history
Use symmetry along vertical middle axis of the board
to reduce the number of parameters.

For instance psqt value of SQ_A5 == SQ_A4 and value of
SQ_F8 == SQ_F1.

This is always true, at least until now nobody came in
with an asymmetric psqt table that worked.

Original patch by Lucas.

No functional change.
  • Loading branch information
mcostalba committed May 3, 2015
1 parent 578b21b commit 7231b18
Showing 1 changed file with 59 additions and 54 deletions.
113 changes: 59 additions & 54 deletions src/psqt.cpp
Expand Up @@ -23,70 +23,71 @@ namespace PSQT {

#define S(mg, eg) make_score(mg, eg)

/// BaseTable[PieceType][Square] contains Piece-Square scores. For each piece
/// type on a given square a (middlegame, endgame) score pair is assigned. Table
/// is defined just for the white side; it is symmetric for the black side.
const Score BaseTable[][SQUARE_NB] = {
// Bonus[PieceType][Square / 2] contains Piece-Square scores. For each piece
// type on a given square a (middlegame, endgame) score pair is assigned. Table
// is defined for files A..D and white side: it is symmetric for black side and
// second half of the files.
const Score Bonus[][int(SQUARE_NB) / 2] = {
{ },
{ // Pawn
S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0),
S(-22, 4), S( 3,-6), S( 7, 8), S( 3,-1), S( 3,-1), S( 7, 8), S( 3,-6), S(-22, 4),
S(-25,-3), S( -7,-4), S(18, 4), S(24, 5), S(24, 5), S(18, 4), S( -7,-4), S(-25,-3),
S(-27, 1), S(-15, 2), S(15,-8), S(30,-2), S(30,-2), S(15,-8), S(-15, 2), S(-27, 1),
S(-14, 7), S( 0,12), S(-2, 4), S(18,-3), S(18,-3), S(-2, 4), S( 0,12), S(-14, 7),
S(-12, 8), S(-13,-5), S(-6, 1), S(-4, 7), S(-4, 7), S(-6, 1), S(-13,-5), S(-12, 8),
S(-17, 1), S( 10,-9), S(-4, 1), S(-6,16), S(-6,16), S(-4, 1), S( 10,-9), S(-17, 1),
S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0)
S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0),
S(-22, 4), S( 3,-6), S( 7, 8), S( 3,-1),
S(-25,-3), S( -7,-4), S(18, 4), S(24, 5),
S(-27, 1), S(-15, 2), S(15,-8), S(30,-2),
S(-14, 7), S( 0,12), S(-2, 4), S(18,-3),
S(-12, 8), S(-13,-5), S(-6, 1), S(-4, 7),
S(-17, 1), S( 10,-9), S(-4, 1), S(-6,16),
S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0)
},
{ // Knight
S(-144,-98), S(-109,-83), S(-85,-51), S(-73,-16), S(-73,-16), S(-85,-51), S(-109,-83), S(-144,-98),
S( -88,-68), S( -43,-53), S(-19,-21), S( -7, 14), S( -7, 14), S(-19,-21), S( -43,-53), S( -88,-68),
S( -69,-53), S( -24,-38), S( 0, -6), S( 12, 29), S( 12, 29), S( 0, -6), S( -24,-38), S( -69,-53),
S( -28,-42), S( 17,-27), S( 41, 5), S( 53, 40), S( 53, 40), S( 41, 5), S( 17,-27), S( -28,-42),
S( -30,-42), S( 15,-27), S( 39, 5), S( 51, 40), S( 51, 40), S( 39, 5), S( 15,-27), S( -30,-42),
S( -10,-53), S( 35,-38), S( 59, -6), S( 71, 29), S( 71, 29), S( 59, -6), S( 35,-38), S( -10,-53),
S( -64,-68), S( -19,-53), S( 5,-21), S( 17, 14), S( 17, 14), S( 5,-21), S( -19,-53), S( -64,-68),
S(-200,-98), S( -65,-83), S(-41,-51), S(-29,-16), S(-29,-16), S(-41,-51), S( -65,-83), S(-200,-98)
S(-144,-98), S(-109,-83), S(-85,-51), S(-73,-16),
S( -88,-68), S( -43,-53), S(-19,-21), S( -7, 14),
S( -69,-53), S( -24,-38), S( 0, -6), S( 12, 29),
S( -28,-42), S( 17,-27), S( 41, 5), S( 53, 40),
S( -30,-42), S( 15,-27), S( 39, 5), S( 51, 40),
S( -10,-53), S( 35,-38), S( 59, -6), S( 71, 29),
S( -64,-68), S( -19,-53), S( 5,-21), S( 17, 14),
S(-200,-98), S( -65,-83), S(-41,-51), S(-29,-16)
},
{ // Bishop
S(-54,-65), S(-27,-42), S(-34,-44), S(-43,-26), S(-43,-26), S(-34,-44), S(-27,-42), S(-54,-65),
S(-29,-43), S( 8,-20), S( 1,-22), S( -8, -4), S( -8, -4), S( 1,-22), S( 8,-20), S(-29,-43),
S(-20,-33), S( 17,-10), S( 10,-12), S( 1, 6), S( 1, 6), S( 10,-12), S( 17,-10), S(-20,-33),
S(-19,-35), S( 18,-12), S( 11,-14), S( 2, 4), S( 2, 4), S( 11,-14), S( 18,-12), S(-19,-35),
S(-22,-35), S( 15,-12), S( 8,-14), S( -1, 4), S( -1, 4), S( 8,-14), S( 15,-12), S(-22,-35),
S(-28,-33), S( 9,-10), S( 2,-12), S( -7, 6), S( -7, 6), S( 2,-12), S( 9,-10), S(-28,-33),
S(-32,-43), S( 5,-20), S( -2,-22), S(-11, -4), S(-11, -4), S( -2,-22), S( 5,-20), S(-32,-43),
S(-49,-65), S(-22,-42), S(-29,-44), S(-38,-26), S(-38,-26), S(-29,-44), S(-22,-42), S(-49,-65)
S(-54,-65), S(-27,-42), S(-34,-44), S(-43,-26),
S(-29,-43), S( 8,-20), S( 1,-22), S( -8, -4),
S(-20,-33), S( 17,-10), S( 10,-12), S( 1, 6),
S(-19,-35), S( 18,-12), S( 11,-14), S( 2, 4),
S(-22,-35), S( 15,-12), S( 8,-14), S( -1, 4),
S(-28,-33), S( 9,-10), S( 2,-12), S( -7, 6),
S(-32,-43), S( 5,-20), S( -2,-22), S(-11, -4),
S(-49,-65), S(-22,-42), S(-29,-44), S(-38,-26)
},
{ // Rook
S(-22, 3), S(-17, 3), S(-12, 3), S(-8, 3), S(-8, 3), S(-12, 3), S(-17, 3), S(-22, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3), S( 2, 3), S( -2, 3), S( -7, 3), S(-22, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3), S( 2, 3), S( -2, 3), S( -7, 3), S(-22, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3), S( 2, 3), S( -2, 3), S( -7, 3), S(-22, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3), S( 2, 3), S( -2, 3), S( -7, 3), S(-22, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3), S( 2, 3), S( -2, 3), S( -7, 3), S(-22, 3),
S(-11, 3), S( 4, 3), S( 9, 3), S(13, 3), S(13, 3), S( 9, 3), S( 4, 3), S(-11, 3),
S(-22, 3), S(-17, 3), S(-12, 3), S(-8, 3), S(-8, 3), S(-12, 3), S(-17, 3), S(-22, 3)
S(-22, 3), S(-17, 3), S(-12, 3), S(-8, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
S(-22, 3), S( -7, 3), S( -2, 3), S( 2, 3),
S(-11, 3), S( 4, 3), S( 9, 3), S(13, 3),
S(-22, 3), S(-17, 3), S(-12, 3), S(-8, 3)
},
{ // Queen
S(-2,-80), S(-2,-54), S(-2,-42), S(-2,-30), S(-2,-30), S(-2,-42), S(-2,-54), S(-2,-80),
S(-2,-54), S( 8,-30), S( 8,-18), S( 8, -6), S( 8, -6), S( 8,-18), S( 8,-30), S(-2,-54),
S(-2,-42), S( 8,-18), S( 8, -6), S( 8, 6), S( 8, 6), S( 8, -6), S( 8,-18), S(-2,-42),
S(-2,-30), S( 8, -6), S( 8, 6), S( 8, 18), S( 8, 18), S( 8, 6), S( 8, -6), S(-2,-30),
S(-2,-30), S( 8, -6), S( 8, 6), S( 8, 18), S( 8, 18), S( 8, 6), S( 8, -6), S(-2,-30),
S(-2,-42), S( 8,-18), S( 8, -6), S( 8, 6), S( 8, 6), S( 8, -6), S( 8,-18), S(-2,-42),
S(-2,-54), S( 8,-30), S( 8,-18), S( 8, -6), S( 8, -6), S( 8,-18), S( 8,-30), S(-2,-54),
S(-2,-80), S(-2,-54), S(-2,-42), S(-2,-30), S(-2,-30), S(-2,-42), S(-2,-54), S(-2,-80)
S(-2,-80), S(-2,-54), S(-2,-42), S(-2,-30),
S(-2,-54), S( 8,-30), S( 8,-18), S( 8, -6),
S(-2,-42), S( 8,-18), S( 8, -6), S( 8, 6),
S(-2,-30), S( 8, -6), S( 8, 6), S( 8, 18),
S(-2,-30), S( 8, -6), S( 8, 6), S( 8, 18),
S(-2,-42), S( 8,-18), S( 8, -6), S( 8, 6),
S(-2,-54), S( 8,-30), S( 8,-18), S( 8, -6),
S(-2,-80), S(-2,-54), S(-2,-42), S(-2,-30)
},
{ // King
S(298, 27), S(332, 81), S(273,108), S(225,116), S(225,116), S(273,108), S(332, 81), S(298, 27),
S(287, 74), S(321,128), S(262,155), S(214,163), S(214,163), S(262,155), S(321,128), S(287, 74),
S(224,111), S(258,165), S(199,192), S(151,200), S(151,200), S(199,192), S(258,165), S(224,111),
S(196,135), S(230,189), S(171,216), S(123,224), S(123,224), S(171,216), S(230,189), S(196,135),
S(173,135), S(207,189), S(148,216), S(100,224), S(100,224), S(148,216), S(207,189), S(173,135),
S(146,111), S(180,165), S(121,192), S( 73,200), S( 73,200), S(121,192), S(180,165), S(146,111),
S(119, 74), S(153,128), S( 94,155), S( 46,163), S( 46,163), S( 94,155), S(153,128), S(119, 74),
S( 98, 27), S(132, 81), S( 73,108), S( 25,116), S( 25,116), S( 73,108), S(132, 81), S( 98, 27)
S(298, 27), S(332, 81), S(273,108), S(225,116),
S(287, 74), S(321,128), S(262,155), S(214,163),
S(224,111), S(258,165), S(199,192), S(151,200),
S(196,135), S(230,189), S(171,216), S(123,224),
S(173,135), S(207,189), S(148,216), S(100,224),
S(146,111), S(180,165), S(121,192), S( 73,200),
S(119, 74), S(153,128), S( 94,155), S( 46,163),
S( 98, 27), S(132, 81), S( 73,108), S( 25,116)
}
};

Expand All @@ -95,7 +96,7 @@ const Score BaseTable[][SQUARE_NB] = {
Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];

// init() initializes piece square tables: the white halves of the tables are
// copied from BaseTable[] adding the piece value, then the black halves of the
// copied from Bonus[] adding the piece value, then the black halves of the
// tables are initialized by flipping and changing the sign of the white scores.
void init() {

Expand All @@ -107,7 +108,11 @@ void init() {
Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]);

for (Square s = SQ_A1; s <= SQ_H8; ++s)
psq[BLACK][pt][~s] = -(psq[WHITE][pt][ s] = (v + BaseTable[pt][s]));
{
// Flip to the left half of the board and subtract 4 for each rank
int ss = (file_of(s) < FILE_E ? s : s ^ 7) - 4 * rank_of(s);
psq[BLACK][pt][~s] = -(psq[WHITE][pt][s] = v + Bonus[pt][ss]);
}
}
}

Expand Down

1 comment on commit 7231b18

@joergoster
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a minor issue, commit description is wrong, of course.
PSQT data is file-symmetric, and not rank-symmetric.
SQ_A4 != SQ_A5 but SQ_A4 == SQ_H4.

Please sign in to comment.