chessXAI / board2planes.py
seredapj's picture
Upload 19 files
0c536cc verified
#Author: https://github.com/Arcturai
import chess
import numpy as np
import re
WPAWN = chess.Piece(chess.PAWN, chess.WHITE)
WKNIGHT = chess.Piece(chess.KNIGHT, chess.WHITE)
WBISHOP = chess.Piece(chess.BISHOP, chess.WHITE)
WROOK = chess.Piece(chess.ROOK, chess.WHITE)
WQUEEN = chess.Piece(chess.QUEEN, chess.WHITE)
WKING = chess.Piece(chess.KING, chess.WHITE)
BPAWN = chess.Piece(chess.PAWN, chess.BLACK)
BKNIGHT = chess.Piece(chess.KNIGHT, chess.BLACK)
BBISHOP = chess.Piece(chess.BISHOP, chess.BLACK)
BROOK = chess.Piece(chess.ROOK, chess.BLACK)
BQUEEN = chess.Piece(chess.QUEEN, chess.BLACK)
BKING = chess.Piece(chess.KING, chess.BLACK)
def assign_piece2(planes, piece_step, row, col):
planes[piece_step][row][col] = 1
DISPATCH2 = {}
DISPATCH2[str(WPAWN)] = lambda retval, row, col: assign_piece2(retval, 0, row, col)
DISPATCH2[str(WKNIGHT)] = lambda retval, row, col: assign_piece2(retval, 1, row, col)
DISPATCH2[str(WBISHOP)] = lambda retval, row, col: assign_piece2(retval, 2, row, col)
DISPATCH2[str(WROOK)] = lambda retval, row, col: assign_piece2(retval, 3, row, col)
DISPATCH2[str(WQUEEN)] = lambda retval, row, col: assign_piece2(retval, 4, row, col)
DISPATCH2[str(WKING)] = lambda retval, row, col: assign_piece2(retval, 5, row, col)
DISPATCH2[str(BPAWN)] = lambda retval, row, col: assign_piece2(retval, 6, row, col)
DISPATCH2[str(BKNIGHT)] = lambda retval, row, col: assign_piece2(retval, 7, row, col)
DISPATCH2[str(BBISHOP)] = lambda retval, row, col: assign_piece2(retval, 8, row, col)
DISPATCH2[str(BROOK)] = lambda retval, row, col: assign_piece2(retval, 9, row, col)
DISPATCH2[str(BQUEEN)] = lambda retval, row, col: assign_piece2(retval, 10, row, col)
DISPATCH2[str(BKING)] = lambda retval, row, col: assign_piece2(retval, 11, row, col)
def append_plane(planes, ones):
if ones:
return np.append(planes, np.ones((1, 8, 8), dtype=np.float), axis=0)
else:
return np.append(planes, np.zeros((1, 8, 8), dtype=np.float), axis=0)
def fill_planes(board):
planes = np.zeros((12, 8, 8), dtype=np.float)
for row in range(8):
for col in range(8):
piece = str(board.piece_at(chess.SQUARES[row * 8 + col]))
if piece != "None":
DISPATCH2[piece](planes, row, col)
planes = append_plane(planes, board.is_repetition(2))
return planes
def board2planes(board_):
if not board_.turn:
board = board_.mirror()
else:
board = board_
retval = fill_planes(board)
s_board = board_.copy()
for i in range(7):
if s_board.move_stack.__len__() > 0:
s_board.pop()
b = s_board.mirror() if not board_.turn else s_board.copy()
retval = np.append(retval, fill_planes(b), axis=0)
else:
retval = np.append(retval, np.zeros((13, 8, 8), dtype=np.float), axis=0)
retval = append_plane(retval, bool(board.castling_rights & chess.BB_H1))
retval = append_plane(retval, bool(board.castling_rights & chess.BB_A1))
retval = append_plane(retval, bool(board.castling_rights & chess.BB_H8))
retval = append_plane(retval, bool(board.castling_rights & chess.BB_A8))
retval = append_plane(retval, not board_.turn)
retval = np.append(retval, np.full((1, 8, 8), fill_value=board_.halfmove_clock/99., dtype=np.float), axis=0)
retval = append_plane(retval, False)
retval = append_plane(retval, True)
return np.expand_dims(retval, axis=0)
def bulk_board2planes(boards):
planes = []
for b in boards:
temp = board2planes(b)
planes.append(temp)
pl = tuple(planes)
retval = np.concatenate(pl, axis=0)
return retval