+ Result KPKPosition::classify_leaf(int idx) {
+
+ decode_index(idx);
+
+ // Check if two pieces are on the same square or if a king can be captured
+ if ( wksq == psq || wksq == bksq || bksq == psq
+ || (k_attacks<WHITE>() & bksq)
+ || (stm == WHITE && (p_attacks() & bksq)))
+ return INVALID;
+
+ // The position is an immediate win if it is white to move and the white
+ // pawn can be promoted without getting captured.
+ if ( rank_of(psq) == RANK_7
+ && stm == WHITE
+ && wksq != psq + DELTA_N
+ && ( square_distance(bksq, psq + DELTA_N) > 1
+ ||(k_attacks<WHITE>() & (psq + DELTA_N))))
+ return WIN;
+
+ // Check for known draw positions
+ //
+ // Case 1: Stalemate
+ if ( stm == BLACK
+ && !(k_attacks<BLACK>() & ~(k_attacks<WHITE>() | p_attacks())))
+ return DRAW;
+
+ // Case 2: King can capture undefended pawn
+ if ( stm == BLACK
+ && (k_attacks<BLACK>() & psq & ~k_attacks<WHITE>()))
+ return DRAW;
+
+ // Case 3: Black king in front of white pawn
+ if ( bksq == psq + DELTA_N
+ && rank_of(psq) < RANK_7)
+ return DRAW;
+
+ // Case 4: White king in front of pawn and black has opposition
+ if ( stm == WHITE
+ && wksq == psq + DELTA_N
+ && bksq == wksq + DELTA_N + DELTA_N
+ && rank_of(psq) < RANK_5)
+ return DRAW;
+
+ // Case 5: Stalemate with rook pawn
+ if ( bksq == SQ_A8
+ && file_of(psq) == FILE_A)
+ return DRAW;
+
+ return UNKNOWN;
+ }
+
+ template<Color Us>
+ Result KPKPosition::classify(const Result db[]) const {