test1978's picture
update app.py
f1a347e verified
raw
history blame
2.66 kB
import gradio as gr
import numpy as np
from huggingface_hub import hf_hub_download
import os
TOKEN = os.environ.get("HF_TOKEN")
model_repo = "typical-cyber/breakthrough-model"
model_path = hf_hub_download(
model_repo,
"breakthrough_mcvs.py",
repo_type="model",
token=TOKEN
)
ns = {}
with open(model_path, "r", encoding="utf-8-sig") as f:
exec(f.read(), ns)
db_repo = "typical-cyber/breakthrough-data"
db_path = hf_hub_download(
db_repo,
"breakthrough_zone_db.npz",
repo_type="dataset",
token=TOKEN
)
zonedb_data = np.load(db_path, allow_pickle=True)
HilbertOrderedZoneDatabase = ns["HilbertOrderedZoneDatabase"]
Breakthrough = ns["Breakthrough"]
MCVSSearcher = ns["MCVSSearcher"]
zonedb = HilbertOrderedZoneDatabase("breakthroughzonedb.npz", maxsize=10000)
zonedb.winningmatrices = list(zonedb_data.get("winning", []))
zonedb.losingmatrices = list(zonedb_data.get("losing", []))
zonedb.drawmatrices = list(zonedb_data.get("draw", []))
def parse_board(board_text):
rows = [line.strip() for line in board_text.strip().splitlines() if line.strip()]
if len(rows) != 8:
raise ValueError("Board must have exactly 8 rows.")
board = np.zeros((8, 8), dtype=np.int32)
mapping = {".": 0, "1": 1, "2": 2}
for r, line in enumerate(rows):
parts = line.split()
if len(parts) != 8:
raise ValueError("Each row must have 8 space-separated cells.")
for c, cell in enumerate(parts):
if cell not in mapping:
raise ValueError("Use '.', '1', or '2' only.")
board[r, c] = mapping[cell]
return board
def get_move(board_text, player):
game = Breakthrough()
game.board = parse_board(board_text)
game.movecount = 0
game.cachedmatrix = None
searcher = MCVSSearcher(None, None, zonedb, lambda_zone=1.0, k_zone=5)
visits, _ = searcher.search_with_time_budget(game, 1.0)
if not visits:
return "No legal move"
best_move = max(visits, key=visits.get)
return str(best_move)
demo = gr.Interface(
fn=get_move,
inputs=[
gr.Textbox(
label="Board",
lines=8,
value=(
"1 1 1 1 1 1 1 1\n"
"1 1 1 1 1 1 1 1\n"
". . . . . . . .\n"
". . . . . . . .\n"
". . . . . . . .\n"
". . . . . . . .\n"
"2 2 2 2 2 2 2 2\n"
"2 2 2 2 2 2 2 2"
)
),
gr.Dropdown(choices=["1", "2"], value="1", label="Player")
],
outputs=gr.Textbox(label="Best Move"),
title="Breakthrough MCVS Secure"
)
demo.launch()