From: Marco Costalba Date: Sun, 8 Sep 2013 12:49:04 +0000 (-0700) Subject: Move draw by material check X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=490f67a3f89449e243c3e85feb13679f388d9e22 Move draw by material check It is more natural to test this case among others material distributions. No functional change. --- diff --git a/src/endgame.h b/src/endgame.h index 49f39990..5ea40bbf 100644 --- a/src/endgame.h +++ b/src/endgame.h @@ -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 diff --git a/src/material.cpp b/src/material.cpp index 0f1e19b9..995a5b54 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -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))); @@ -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(WHITE) && npm_w - npm_b <= BishopValueMg) { e->factor[WHITE] = (uint8_t) diff --git a/src/position.cpp b/src/position.cpp index 615763cd..6885b135 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -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; @@ -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(*this).size()))