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
351ef5c85b6d4b9c71e9da of 26/6/2011 (!)
although for some reason didn't show immediately, indeed the
bougous patch was a "No functional change" (!!)
bench:
4793754
// Early return if SEE cannot be negative because captured piece value
// is not less then capturing one. Note that king moves always return
// here because king midgame value is set to 0.
// Early return if SEE cannot be negative because captured piece value
// is not less then capturing one. Note that king moves always return
// here because king midgame value is set to 0.
- if (PieceValue[MG][piece_on(to_sq(m))] >= PieceValue[MG][piece_moved(m)])
+ if (PieceValue[MG][piece_moved(m)] <= PieceValue[MG][piece_on(to_sq(m))])
do {
assert(slIndex < 32);
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++;
// Add the new entry to the swap list
swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured];
slIndex++;
stm = ~stm;
stmAttackers = attackers & pieces(stm);
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
} while (stmAttackers);
// If we are doing asymmetric SEE evaluation and the same side does the first