I am not sure what the current standard way to approach this is. In Winter I only use PSTs for knight and king position evaluations. I assume the board is completely symmetric with respect to rotation and reflection, which is not actually the case due to pawns as well as castling rules. Under this assumption you can take a look at the a1-d4 diagonal as well as the squares below that. Every other square on the board can be reached by some combination of rotations and reflections from these squares. This gives just 10 values per piece so you should be working with the much more manageable number of 50 for non pawn pieces.
Code: Select all
const int kPSTindex[64] = {
0, 1, 2, 3, 3, 2, 1, 0,
1, 4, 5, 6, 6, 5, 4, 1,
2, 5, 7, 8, 8, 7, 5, 2,
3, 6, 8, 9, 9, 8, 6, 3,
3, 6, 8, 9, 9, 8, 6, 3,
2, 5, 7, 8, 8, 7, 5, 2,
1, 4, 5, 6, 6, 5, 4, 1,
0, 1, 2, 3, 3, 2, 1, 0
};
For pawns you could have a bonus for each file (so 4 values utilizing symmetry) and for how advanced the pawn is (another 6 values) which should also give you 10 parameters for pawns. In total this would give you 60 parameters for PSTs of the pieces and pawns.
In Winter I don't do that for pawns at all, instead I just give pawns a constant base value (not dependent on where they are) and passed pawns a bonus based on how far advanced they are.