From 4f4c1c75e743b95ba4e5062d46fcd7af106ccec6 Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sun, 4 Mar 2012 19:00:09 +0000 Subject: [PATCH] CuckooChess: Don't use LMP when alpha or beta is a mate score. --- CuckooChessEngine/src/chess/Evaluate.java | 1 + CuckooChessEngine/src/chess/Player.java | 2 +- CuckooChessEngine/src/chess/Search.java | 18 ++++++++++-------- CuckooChessEngine/src/chess/TextIO.java | 2 +- CuckooChessEngine/test/chess/SearchTest.java | 15 +++++++++++++-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/CuckooChessEngine/src/chess/Evaluate.java b/CuckooChessEngine/src/chess/Evaluate.java index eec2bcd..c553021 100644 --- a/CuckooChessEngine/src/chess/Evaluate.java +++ b/CuckooChessEngine/src/chess/Evaluate.java @@ -756,6 +756,7 @@ public class Evaluate { } private int threatBonus(Position pos) { + // FIXME!! Try higher weight for attacks on more valuable pieces. int score = 0; // Sum values for all black pieces under attack diff --git a/CuckooChessEngine/src/chess/Player.java b/CuckooChessEngine/src/chess/Player.java index 4b24aee..0530f51 100644 --- a/CuckooChessEngine/src/chess/Player.java +++ b/CuckooChessEngine/src/chess/Player.java @@ -53,7 +53,7 @@ public interface Player { /** * Inform player that the transposition table should be cleared. - * Of coarse, a human player has a hard time implementing this. + * Of course, a human player has a hard time implementing this. */ public void clearTT(); } diff --git a/CuckooChessEngine/src/chess/Search.java b/CuckooChessEngine/src/chess/Search.java index 62f4eaf..9770cb9 100644 --- a/CuckooChessEngine/src/chess/Search.java +++ b/CuckooChessEngine/src/chess/Search.java @@ -734,14 +734,16 @@ public class Search { boolean givesCheck = MoveGen.givesCheck(pos, m); boolean doFutility = false; if (mayReduce && haveLegalMoves && !givesCheck && !passedPawnPush(pos, m)) { - int moveCountLimit; - if (depth <= plyScale) moveCountLimit = 3; - else if (depth <= 2 * plyScale) moveCountLimit = 6; - else if (depth <= 3 * plyScale) moveCountLimit = 12; - else if (depth <= 4 * plyScale) moveCountLimit = 24; - else moveCountLimit = 256; - if (mi >= moveCountLimit) - continue; // Late move pruning + if ((Math.abs(alpha) <= MATE0 / 2) && (Math.abs(beta) <= MATE0 / 2)) { + int moveCountLimit; + if (depth <= plyScale) moveCountLimit = 3; + else if (depth <= 2 * plyScale) moveCountLimit = 6; + else if (depth <= 3 * plyScale) moveCountLimit = 12; + else if (depth <= 4 * plyScale) moveCountLimit = 24; + else moveCountLimit = 256; + if (mi >= moveCountLimit) + continue; // Late move pruning + } if (futilityPrune) doFutility = true; } diff --git a/CuckooChessEngine/src/chess/TextIO.java b/CuckooChessEngine/src/chess/TextIO.java index 402856d..9283314 100644 --- a/CuckooChessEngine/src/chess/TextIO.java +++ b/CuckooChessEngine/src/chess/TextIO.java @@ -290,7 +290,7 @@ public class TextIO { ret.append("O-O-O"); } } else if (move.from == bKingOrigPos && pos.getPiece(bKingOrigPos) == Piece.BKING) { - // Check white castle + // Check black castle if (move.to == Position.getSquare(6, 7)) { ret.append("O-O"); } else if (move.to == Position.getSquare(2, 7)) { diff --git a/CuckooChessEngine/test/chess/SearchTest.java b/CuckooChessEngine/test/chess/SearchTest.java index 244776b..45bbf96 100644 --- a/CuckooChessEngine/test/chess/SearchTest.java +++ b/CuckooChessEngine/test/chess/SearchTest.java @@ -204,7 +204,18 @@ public class SearchTest { Move bestM = idSearch(sc, 28); assertEquals(TextIO.stringToMove(pos, "Kb1"), new Move(bestM)); } - + + /** + * Late move pruning must not be used in mate search. + */ + @Test + public void testLMP() throws ChessParseError { + Position pos = TextIO.readFEN("2r2rk1/6p1/p3pq1p/1p1b1p2/3P1n2/PP3N2/3N1PPP/1Q2RR1K b"); // WAC 174 + Search sc = new Search(pos, nullHist, 0, tt); + Move bestM = idSearch(sc, 2); + assertTrue(bestM.score < Search.MATE0 / 2); + } + @Test public void testCheckEvasion() throws ChessParseError { System.out.println("check evasion"); @@ -234,7 +245,7 @@ public class SearchTest { System.out.println("kqkrNullMove"); Position pos = TextIO.readFEN("7K/6R1/5k2/3q4/8/8/8/8 b - - 0 1"); Search sc = new Search(pos, nullHist, 0, tt); - Move bestM = idSearch(sc, 9); + Move bestM = idSearch(sc, 10); assertEquals(Search.MATE0-18, bestM.score); }