-bool Position::pos_is_ok(int* failedStep) const {
-
- // What features of the position should be verified?
- const bool debugAll = false;
-
- const bool debugBitboards = debugAll || false;
- const bool debugKingCount = debugAll || false;
- const bool debugKingCapture = debugAll || false;
- const bool debugCheckerCount = debugAll || false;
- const bool debugKey = debugAll || false;
- const bool debugMaterialKey = debugAll || false;
- const bool debugPawnKey = debugAll || false;
- const bool debugIncrementalEval = debugAll || false;
- const bool debugNonPawnMaterial = debugAll || false;
- const bool debugPieceCounts = debugAll || false;
- const bool debugPieceList = debugAll || false;
- const bool debugCastleSquares = debugAll || false;
-
- if (failedStep) *failedStep = 1;
-
- // Side to move OK?
- if (sideToMove != WHITE && sideToMove != BLACK)
- return false;
-
- // Are the king squares in the position correct?
- if (failedStep) (*failedStep)++;
- if (piece_on(king_square(WHITE)) != W_KING)
- return false;
-
- if (failedStep) (*failedStep)++;
- if (piece_on(king_square(BLACK)) != B_KING)
- return false;
-
- // Do both sides have exactly one king?
- if (failedStep) (*failedStep)++;
- if (debugKingCount)
- {
- int kingCount[2] = {0, 0};
- for (Square s = SQ_A1; s <= SQ_H8; s++)
- if (type_of(piece_on(s)) == KING)
- kingCount[color_of(piece_on(s))]++;
-
- if (kingCount[0] != 1 || kingCount[1] != 1)
- return false;
- }
-
- // Can the side to move capture the opponent's king?
- if (failedStep) (*failedStep)++;
- if (debugKingCapture)
- {
- Color us = sideToMove;
- Color them = ~us;
- Square ksq = king_square(them);
- if (attackers_to(ksq) & pieces(us))
- return false;
- }
-
- // Is there more than 2 checkers?
- if (failedStep) (*failedStep)++;
- if (debugCheckerCount && popcount<Full>(st->checkersBB) > 2)
- return false;
-
- // Bitboards OK?
- if (failedStep) (*failedStep)++;
- if (debugBitboards)
- {
- // The intersection of the white and black pieces must be empty
- if (pieces(WHITE) & pieces(BLACK))
- return false;
-
- // The union of the white and black pieces must be equal to all
- // occupied squares
- if ((pieces(WHITE) | pieces(BLACK)) != pieces())
- return false;
-
- // Separate piece type bitboards must have empty intersections
- for (PieceType p1 = PAWN; p1 <= KING; p1++)
- for (PieceType p2 = PAWN; p2 <= KING; p2++)
- if (p1 != p2 && (pieces(p1) & pieces(p2)))
- return false;
- }