Skip to content

Commit

Permalink
Move draw by material check
Browse files Browse the repository at this point in the history
It is more natural to test this case among
others material distributions.

No functional change.
  • Loading branch information
mcostalba committed Sep 8, 2013
1 parent 0515ad0 commit 490f67a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/endgame.h
Expand Up @@ -43,7 +43,7 @@ enum EndgameType {
KQKP, // KQ vs KP
KQKR, // KQ vs KR
KBBKN, // KBB vs KN
KmmKm, // K and two minors vs K and one or two minors
KmmKm, // K and one or two minors vs K and zero or one minor


// Scaling functions
Expand Down
15 changes: 11 additions & 4 deletions src/material.cpp
Expand Up @@ -173,10 +173,18 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
return e;
}

// Draw by insufficient material (trivial draws like KK, KBK and KNK)
if ( !pos.pieces(PAWN)
&& pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) <= BishopValueMg)
{
e->evaluationFunction = &EvaluateKmmKm[pos.side_to_move()];
return e;
}

// Minor piece endgame with at least one minor piece per side and
// no pawns. Note that the case KmmK is already handled by KXK.
if (!pos.pieces(PAWN) && !pos.pieces(ROOK) && !pos.pieces(QUEEN))
{
// Minor piece endgame with at least one minor piece per side and
// no pawns. Note that the case KmmK is already handled by KXK.
assert((pos.pieces(WHITE, KNIGHT) | pos.pieces(WHITE, BISHOP)));
assert((pos.pieces(BLACK, KNIGHT) | pos.pieces(BLACK, BISHOP)));

Expand Down Expand Up @@ -240,8 +248,7 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
}
}

// No pawns makes it difficult to win, even with a material advantage. This
// catches some trivial draws like KK, KBK and KNK
// No pawns makes it difficult to win, even with a material advantage
if (!pos.count<PAWN>(WHITE) && npm_w - npm_b <= BishopValueMg)
{
e->factor[WHITE] = (uint8_t)
Expand Down
13 changes: 5 additions & 8 deletions src/position.cpp
Expand Up @@ -1223,6 +1223,7 @@ Key Position::compute_material_key() const {
/// game and the endgame. These functions are used to initialize the incremental
/// scores when a new position is set up, and to verify that the scores are correctly
/// updated by do_move and undo_move when the program is running in debug mode.

Score Position::compute_psq_score() const {

Score score = SCORE_ZERO;
Expand Down Expand Up @@ -1254,15 +1255,11 @@ Value Position::compute_non_pawn_material(Color c) const {
}


/// Position::is_draw() tests whether the position is drawn by material,
/// repetition, or the 50 moves rule. It does not detect stalemates, this
/// must be done by the search.
bool Position::is_draw() const {
/// Position::is_draw() tests whether the position is drawn by repetition
/// or the 50 moves rule. It does not detect stalemates, this must be done
/// by the search.

// Draw by material?
if ( !pieces(PAWN)
&& (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMg))
return true;
bool Position::is_draw() const {

// Draw by the 50 moves rule?
if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
Expand Down

0 comments on commit 490f67a

Please sign in to comment.