summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
c23cd4d)
The idea is to reduce the score if we have many
pawns opposing an enemy pawn so that the draw
possibility increases.
Just introduced the logic, but no functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
+ // If we don't already have an unusual scale factor, use pawn
+ // evaluation ones.
+ if (factor[WHITE] == SCALE_FACTOR_NORMAL)
+ factor[WHITE] = ei.pi->scale_factor(WHITE);
+ if (factor[BLACK] == SCALE_FACTOR_NORMAL)
+ factor[BLACK] = ei.pi->scale_factor(BLACK);
+
// Interpolate between the middle game and the endgame score
Color stm = pos.side_to_move();
// Interpolate between the middle game and the endgame score
Color stm = pos.side_to_move();
{
if ( pos.non_pawn_material(c) == pos.non_pawn_material(opposite_color(c))
|| pos.non_pawn_material(c) < RookValueMidgame)
{
if ( pos.non_pawn_material(c) == pos.non_pawn_material(opposite_color(c))
|| pos.non_pawn_material(c) < RookValueMidgame)
+ mi->factor[c] = SCALE_FACTOR_ZERO;
else
{
switch (pos.piece_count(c, BISHOP)) {
else
{
switch (pos.piece_count(c, BISHOP)) {
S(34,68), S(83,166), S(0, 0), S( 0, 0)
};
S(34,68), S(83,166), S(0, 0), S( 0, 0)
};
+ // UnpairedPawnsTable[] gives a score according to the number
+ // of panws that do not have an enemy pawn in front of them.
+ const int UnpairedPawnsTable[8] = {
+ SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL,
+ SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL
+ };
+
// Pawn storm tables for positions with opposite castling
const int QStormTable[64] = {
0, 0, 0, 0, 0, 0, 0, 0,
// Pawn storm tables for positions with opposite castling
const int QStormTable[64] = {
0, 0, 0, 0, 0, 0, 0, 0,
int bonus;
Score value = make_score(0, 0);
const Square* ptr = pos.piece_list_begin(Us, PAWN);
int bonus;
Score value = make_score(0, 0);
const Square* ptr = pos.piece_list_begin(Us, PAWN);
+ int unpairedPawnsNum = pos.piece_count(Us, PAWN);
// Initialize pawn storm scores by giving bonuses for open files
for (f = FILE_A; f <= FILE_H; f++)
// Initialize pawn storm scores by giving bonuses for open files
for (f = FILE_A; f <= FILE_H; f++)
doubled = ourPawns & squares_behind(Us, s);
opposed = theirPawns & squares_in_front_of(Us, s);
doubled = ourPawns & squares_behind(Us, s);
opposed = theirPawns & squares_in_front_of(Us, s);
+ // Decrease number of unpaired pawns
+ if (opposed)
+ unpairedPawnsNum--;
+
// We calculate kingside and queenside pawn storm
// scores for both colors. These are used when evaluating
// middle game positions with opposite side castling.
// We calculate kingside and queenside pawn storm
// scores for both colors. These are used when evaluating
// middle game positions with opposite side castling.
value += CandidateBonus[relative_rank(Us, s)];
}
value += CandidateBonus[relative_rank(Us, s)];
}
+ // Calculate a scale factor to be used to evaluate if position is drawish
+ pi->factor[Us] = UnpairedPawnsTable[unpairedPawnsNum];
+
////
#include "bitboard.h"
////
#include "bitboard.h"
Value queenside_storm_value(Color c) const;
Bitboard pawn_attacks(Color c) const;
Bitboard passed_pawns() const;
Value queenside_storm_value(Color c) const;
Bitboard pawn_attacks(Color c) const;
Bitboard passed_pawns() const;
+ ScaleFactor scale_factor(Color c) const;
int file_is_half_open(Color c, File f) const;
int has_open_file_to_left(Color c, File f) const;
int has_open_file_to_right(Color c, File f) const;
int file_is_half_open(Color c, File f) const;
int has_open_file_to_left(Color c, File f) const;
int has_open_file_to_right(Color c, File f) const;
Square kingSquares[2];
Score value;
int16_t ksStormValue[2], qsStormValue[2];
Square kingSquares[2];
Score value;
int16_t ksStormValue[2], qsStormValue[2];
- uint8_t halfOpenFiles[2];
- uint8_t kingShelters[2];
+ uint8_t halfOpenFiles[2], kingShelters[2], factor[2];
};
/// The PawnInfoTable class represents a pawn hash table. It is basically
};
/// The PawnInfoTable class represents a pawn hash table. It is basically
return Value(qsStormValue[c]);
}
return Value(qsStormValue[c]);
}
+inline ScaleFactor PawnInfo::scale_factor(Color c) const {
+ return ScaleFactor(factor[c]);
+}
+
inline int PawnInfo::file_is_half_open(Color c, File f) const {
return (halfOpenFiles[c] & (1 << int(f)));
}
inline int PawnInfo::file_is_half_open(Color c, File f) const {
return (halfOpenFiles[c] & (1 << int(f)));
}
SCALE_FACTOR_NORMAL = 64,
SCALE_FACTOR_NORMAL = 64,
- SCALE_FACTOR_MAX = 128,
- SCALE_FACTOR_NONE = 255
+ SCALE_FACTOR_MAX = 128,
+ SCALE_FACTOR_NONE = 255