From 1e08b488dd08b5b24422e6c0a80613b85beb1c3d Mon Sep 17 00:00:00 2001 From: Sotetsu KOYAMADA Date: Thu, 31 Oct 2024 20:57:50 +0900 Subject: [PATCH] [Shogi] Unuse assets (#1272) --- pgx/_src/assets/between.npy | Bin 2657333 -> 0 bytes pgx/_src/assets/can_move.npy | Bin 91982 -> 0 bytes pgx/_src/shogi_utils.py | 137 +++++++++++++++++++++++++++++++++-- setup.py | 2 +- 4 files changed, 132 insertions(+), 7 deletions(-) delete mode 100644 pgx/_src/assets/between.npy delete mode 100644 pgx/_src/assets/can_move.npy diff --git a/pgx/_src/assets/between.npy b/pgx/_src/assets/between.npy deleted file mode 100644 index a019a9860729f23ece1f1a073296cbaddbd9fc1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2657333 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

)^+Wh6Gv_ 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 reach from to ignoring pieces on board? -file_path = "assets/can_move.npy" -with open(os.path.join(os.path.dirname(__file__), file_path), "rb") as f: - CAN_MOVE = jnp.load(f) +def can_move_to(piece, from_, to): + """Can move from to ?""" + if from_ == to: + return False + x0, y0 = from_ // 9, from_ % 9 + x1, y1 = to // 9, to % 9 + dx = x1 - x0 + dy = y1 - y0 + if piece == PAWN: + if dx == 0 and dy == -1: + return True + else: + return False + elif piece == LANCE: + if dx == 0 and dy < 0: + return True + else: + return False + elif piece == KNIGHT: + if dx in (-1, 1) and dy == -2: + return True + else: + return False + elif piece == SILVER: + if dx in (-1, 0, 1) and dy == -1: + return True + elif dx in (-1, 1) and dy == 1: + return True + else: + return False + elif piece == BISHOP: + if dx == dy or dx == -dy: + return True + else: + return False + elif piece == ROOK: + if dx == 0 or dy == 0: + return True + else: + return False + if piece in (GOLD, PRO_PAWN, PRO_LANCE, PRO_KNIGHT, PRO_SILVER): + if dx in (-1, 0, 1) and dy in (0, -1): + return True + elif dx == 0 and dy == 1: + return True + else: + return False + elif piece == KING: + if abs(dx) <= 1 and abs(dy) <= 1: + return True + else: + return False + elif piece == HORSE: + if abs(dx) <= 1 and abs(dy) <= 1: + return True + elif dx == dy or dx == -dy: + return True + else: + return False + elif piece == DRAGON: + if abs(dx) <= 1 and abs(dy) <= 1: + return True + if dx == 0 or dy == 0: + return True + else: + return False + else: + assert False + + +def is_on_the_way(piece, from_, to, point): + if to == point: + return False + if piece not in (LANCE, BISHOP, ROOK, HORSE, DRAGON): + return False + if not can_move_to(piece, from_, to): + return False + if not can_move_to(piece, from_, point): + return False + + x0, y0 = from_ // 9, from_ % 9 + x1, y1 = to // 9, to % 9 + x2, y2 = point // 9, point % 9 + dx1, dy1 = x1 - x0, y1 - y0 + dx2, dy2 = x2 - x0, y2 - y0 + + def sign(d): + if d == 0: + return 0 + return d > 0 + + if (sign(dx1) != sign(dx2)) or (sign(dy1) != sign(dy2)): + return False + + return abs(dx2) <= abs(dx1) and abs(dy2) <= abs(dy1) + + +CAN_MOVE = np.zeros((14, 81, 81), dtype=jnp.bool_) +for piece in range(14): + for from_ in range(81): + for to in range(81): + CAN_MOVE[piece, from_, to] = can_move_to(piece, from_, to) + assert CAN_MOVE.sum() == 8228 +CAN_MOVE = jnp.array(CAN_MOVE) # When moves from to , # is on the way between two points? -file_path = "assets/between.npy" -with open(os.path.join(os.path.dirname(__file__), file_path), "rb") as f: - BETWEEN = jnp.load(f) +BETWEEN = np.zeros((5, 81, 81, 81), dtype=np.bool_) +for i, piece in enumerate((LANCE, BISHOP, ROOK, HORSE, DRAGON)): + for from_ in range(81): + for to in range(81): + for p in range(81): + BETWEEN[i, from_, to, p] = is_on_the_way(piece, from_, to, p) + +BETWEEN = jnp.array(BETWEEN) assert BETWEEN.sum() == 10564 + # Give and , return the legal idx # E.g. LEGAL_FROM_IDX[Up, to=19] = [20, 21, ..., -1] (filled by -1) # Used for computing dlshogi action diff --git a/setup.py b/setup.py index 60bc1947f..341d0a1bf 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ def _read_requirements(fname): keywords="", packages=find_packages(), package_data={ - "": ["LICENSE", "*.svg", "_src/assets/*.npy"] + "": ["LICENSE", "*.svg"] }, include_package_data=True, install_requires=_read_requirements("requirements.txt"),