From: Marco Costalba Date: Sat, 20 Jul 2013 12:24:23 +0000 (+0200) Subject: Fix critical SEE bug (take 2) X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=3e95800814d70587fb6b12efb33faea4c7228f88 Fix critical SEE bug (take 2) It is somewhat unbilievable but our SEE is broken ! If the first SEE move is a king capture and square is defended then SEE continues instead of breaking. The bug shows only on normal SEE, not see_sign() so probing with a: dbg_hit_on_c(slIndex==1, captured == KING); reports just a tiny: Total 3465656 Hits 6646 hit rate (%) 0 Bug was there since Retire seeValues[] and move PieceValue[] out of Position of 26/6/2011 (!) although for some reason didn't show immediately, indeed the bougous patch was a "No functional change" (!!) bench: 4699504 --- diff --git a/src/position.cpp b/src/position.cpp index 8ea3f00a..cecdcbf8 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1195,6 +1195,12 @@ int Position::see(Move m, int asymmThreshold) const { do { assert(slIndex < 32); + if (captured == KING) // Stop before processing a king capture + { + swapList[slIndex++] = QueenValueMg * 16; + break; + } + // Add the new entry to the swap list swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured]; slIndex++; @@ -1205,15 +1211,6 @@ int Position::see(Move m, int asymmThreshold) const { stm = ~stm; stmAttackers = attackers & pieces(stm); - if (captured == KING) - { - // Stop before processing a king capture - if (stmAttackers) - swapList[slIndex++] = QueenValueMg * 16; - - break; - } - } while (stmAttackers); // If we are doing asymmetric SEE evaluation and the same side does the first