////
#include <cassert>
-#include <cstring>
+#include "bitcount.h"
#include "pawns.h"
#include "position.h"
// Doubled pawn penalty by file, middle game.
const Value DoubledPawnMidgamePenalty[8] = {
- Value(20), Value(30), Value(34), Value(34),
- Value(34), Value(34), Value(30), Value(20)
+ Value(13), Value(20), Value(23), Value(23),
+ Value(23), Value(23), Value(20), Value(13)
};
// Doubled pawn penalty by file, endgame.
const Value DoubledPawnEndgamePenalty[8] = {
- Value(35), Value(40), Value(40), Value(40),
- Value(40), Value(40), Value(40), Value(35)
+ Value(43), Value(48), Value(48), Value(48),
+ Value(48), Value(48), Value(48), Value(43)
};
// Isolated pawn penalty by file, middle game.
const Value IsolatedPawnMidgamePenalty[8] = {
- Value(20), Value(30), Value(34), Value(34),
- Value(34), Value(34), Value(30), Value(20)
+ Value(25), Value(36), Value(40), Value(40),
+ Value(40), Value(40), Value(36), Value(25)
};
// Isolated pawn penalty by file, endgame.
const Value IsolatedPawnEndgamePenalty[8] = {
- Value(35), Value(40), Value(40), Value(40),
- Value(40), Value(40), Value(40), Value(35)
+ Value(30), Value(35), Value(35), Value(35),
+ Value(35), Value(35), Value(35), Value(30)
};
// Backward pawn penalty by file, middle game.
const Value BackwardPawnMidgamePenalty[8] = {
- Value(16), Value(24), Value(27), Value(27),
- Value(27), Value(27), Value(24), Value(16)
+ Value(20), Value(29), Value(33), Value(33),
+ Value(33), Value(33), Value(29), Value(20)
};
// Backward pawn penalty by file, endgame.
const Value BackwardPawnEndgamePenalty[8] = {
- Value(28), Value(32), Value(32), Value(32),
- Value(32), Value(32), Value(32), Value(28)
+ Value(28), Value(31), Value(31), Value(31),
+ Value(31), Value(31), Value(31), Value(28)
};
// Pawn chain membership bonus by file, middle game.
const Value ChainMidgameBonus[8] = {
- Value(14), Value(16), Value(17), Value(18),
- Value(18), Value(17), Value(16), Value(14)
+ Value(11), Value(13), Value(13), Value(14),
+ Value(14), Value(13), Value(13), Value(11)
};
// Pawn chain membership bonus by file, endgame.
const Value ChainEndgameBonus[8] = {
- Value(16), Value(16), Value(16), Value(16),
- Value(16), Value(16), Value(16), Value(16)
+ Value(-1), Value(-1), Value(-1), Value(-1),
+ Value(-1), Value(-1), Value(-1), Value(-1)
};
// Candidate passed pawn bonus by rank, middle game.
const Value CandidateMidgameBonus[8] = {
- Value( 0), Value(12), Value(12), Value(20),
- Value(40), Value(90), Value( 0), Value( 0)
+ Value( 0), Value( 6), Value(6), Value(14),
+ Value(34), Value(83), Value(0), Value( 0)
};
// Candidate passed pawn bonus by rank, endgame.
const Value CandidateEndgameBonus[8] = {
- Value( 0), Value(24), Value(24), Value(40),
- Value(80), Value(180), Value(0), Value( 0)
+ Value( 0), Value( 13), Value(13), Value(29),
+ Value(68), Value(166), Value( 0), Value( 0)
};
// Pawn storm tables for positions with opposite castling:
const int QStormTable[64] = {
0, 0, 0, 0, 0, 0, 0, 0,
- -22,-22,-22,-13,-4, 0, 0, 0,
- -4, -9, -9, -9,-4, 0, 0, 0,
- 9, 18, 22, 18, 9, 0, 0, 0,
- 22, 31, 31, 22, 0, 0, 0, 0,
- 31, 40, 40, 31, 0, 0, 0, 0,
- 31, 40, 40, 31, 0, 0, 0, 0,
+ -22,-22,-22,-14,-6, 0, 0, 0,
+ -6,-10,-10,-10,-6, 0, 0, 0,
+ 4, 12, 16, 12, 4, 0, 0, 0,
+ 16, 23, 23, 16, 0, 0, 0, 0,
+ 23, 31, 31, 23, 0, 0, 0, 0,
+ 23, 31, 31, 23, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
const int KStormTable[64] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0,-4,-13,-22,-27,-27,
- 0, 0, 0,-4, -9,-13,-18,-18,
- 0, 0, 0, 0, 9, 9, 9, 9,
- 0, 0, 0, 0, 9, 18, 27, 27,
- 0, 0, 0, 0, 9, 27, 40, 36,
- 0, 0, 0, 0, 0, 31, 40, 31,
- 0, 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,-10,-19,-28,-33,-33,
+ 0, 0, 0,-10,-15,-19,-24,-24,
+ 0, 0, 0, 0, 1, 1, 1, 1,
+ 0, 0, 0, 0, 1, 10, 19, 19,
+ 0, 0, 0, 0, 1, 19, 31, 27,
+ 0, 0, 0, 0, 0, 22, 31, 22,
+ 0, 0, 0, 0, 0, 0, 0, 0
};
// Pawn storm open file bonuses by file
- const int16_t KStormOpenFileBonus[8] = { 45, 45, 30, 0, 0, 0, 0, 0 };
- const int16_t QStormOpenFileBonus[8] = { 0, 0, 0, 0, 0, 30, 45, 30 };
+ const int16_t KStormOpenFileBonus[8] = { 31, 31, 18, 0, 0, 0, 0, 0 };
+ const int16_t QStormOpenFileBonus[8] = { 0, 0, 0, 0, 0, 26, 42, 26 };
// Pawn storm lever bonuses by file
- const int StormLeverBonus[8] = { 20, 20, 10, 0, 0, 10, 20, 20 };
+ const int StormLeverBonus[8] = { -8, -8, -13, 0, 0, -13, -8, -8 };
}
<< " bytes for pawn hash table." << std::endl;
Application::exit_with_failure();
}
- clear();
}
}
-/// PawnInfoTable::clear() clears the pawn hash table by setting all
-/// entries to 0.
-
-void PawnInfoTable::clear() {
- memset(entries, 0, size * sizeof(PawnInfo));
-}
-
-
/// PawnInfoTable::get_pawn_info() takes a position object as input, computes
/// a PawnInfo object, and returns a pointer to it. The result is also
/// stored in a hash table, so we don't have to recompute everything when
// Initialize pawn storm scores by giving bonuses for open files
for (File f = FILE_A; f <= FILE_H; f++)
- if (pos.file_is_half_open(us, f))
+ if (Position::file_is_half_open(ourPawns, f))
{
pi->ksStormValue[us] += KStormOpenFileBonus[f];
pi->qsStormValue[us] += QStormOpenFileBonus[f];
pi->halfOpenFiles[us] &= ~(1 << f);
// Passed, isolated or doubled pawn?
- passed = pos.pawn_is_passed(us, s);
- isolated = pos.pawn_is_isolated(us, s);
- doubled = pos.pawn_is_doubled(us, s);
+ passed = Position::pawn_is_passed(theirPawns, us, s);
+ isolated = Position::pawn_is_isolated(ourPawns, s);
+ doubled = Position::pawn_is_doubled(ourPawns, us, s);
// We calculate kingside and queenside pawn storm
// scores for both colors. These are used when evaluating
// Test for candidate passed pawn
candidate = !passed
- && pos.file_is_half_open(them, f)
+ && Position::file_is_half_open(theirPawns, f)
&& ( count_1s_max_15(neighboring_files_bb(f) & (behind_bb(us, r) | rank_bb(r)) & ourPawns)
- count_1s_max_15(neighboring_files_bb(f) & in_front_bb(us, r) & theirPawns)
>= 0);
{
mv -= IsolatedPawnMidgamePenalty[f];
ev -= IsolatedPawnEndgamePenalty[f];
- if (pos.file_is_half_open(them, f))
+ if (Position::file_is_half_open(theirPawns, f))
{
mv -= IsolatedPawnMidgamePenalty[f] / 2;
ev -= IsolatedPawnEndgamePenalty[f] / 2;
{
mv -= BackwardPawnMidgamePenalty[f];
ev -= BackwardPawnEndgamePenalty[f];
- if (pos.file_is_half_open(them, f))
+ if (Position::file_is_half_open(theirPawns, f))
{
mv -= BackwardPawnMidgamePenalty[f] / 2;
ev -= BackwardPawnEndgamePenalty[f] / 2;