Tianshou/AlphaGo/engine.py

211 lines
5.8 KiB
Python
Raw Normal View History

2017-11-20 12:44:29 +08:00
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
# $File: engine.py
2017-11-28 01:15:46 +08:00
# $Date: Tue Nov 28 00:0616 2017 +0800
2017-11-20 12:44:29 +08:00
# $Author: renyong15 © <mails.tsinghua.edu.cn>
#
2018-01-12 21:48:01 +08:00
import sys
2017-11-20 12:44:29 +08:00
from game import Game
2017-12-24 14:40:50 +08:00
import copy
import numpy as np
2017-11-28 15:04:00 +08:00
import utils
2017-11-20 12:44:29 +08:00
class GTPEngine():
def __init__(self, **kwargs):
try:
self._game = kwargs['game_obj']
self._game.clear()
except:
self._game = None
try:
self._name = kwargs['name']
except:
self._name = 'gtp engine'
try:
self._version = kwargs['version']
except:
self._version = 2
self.disconnect = False
self.known_commands = [
field[4:] for field in dir(self) if field.startswith("cmd_")]
def _vertex_point2string(self, vertex):
if vertex == utils.PASS:
return "pass"
elif vertex == utils.RESIGN:
return "resign"
else:
x, y = vertex
2017-11-28 01:15:46 +08:00
return "{}{}".format("ABCDEFGHIJKLMNOPQRSTYVWYZ"[x - 1], y)
2017-11-20 12:44:29 +08:00
def _vertex_string2point(self, s):
if s is None:
return False
elif s.lower() == "pass":
return utils.PASS
elif len(s) > 1:
2017-11-28 01:15:46 +08:00
x = "abcdefghijklmnopqrstuvwxyz".find(s[0].lower()) + 1
2017-11-20 12:44:29 +08:00
if x == 0:
return False
if s[1:].isdigit():
y = int(s[1:])
else:
return False
else:
return False
return (x, y)
def _parse_color(self, color):
if color.lower() in ["b", "black"]:
color = utils.BLACK
elif color.lower() in ["w", "white"]:
color = utils.WHITE
else:
color = None
return color
def _parse_move(self, move_string):
2017-11-28 15:04:00 +08:00
color, move = move_string.split(" ", 1)
2017-11-20 12:44:29 +08:00
color = self._parse_color(color)
point = self._vertex_string2point(move)
if point and color:
2017-11-28 15:04:00 +08:00
return color, point
2017-11-20 12:44:29 +08:00
else:
return False
2017-11-28 15:04:00 +08:00
def _parse_res(self, res, id_=None, success=True):
2017-11-20 12:44:29 +08:00
if success:
if id_:
return '={} {}\n\n'.format(id_, res)
else:
return '= {}\n\n'.format(res)
else:
if id_:
return '?{} {}\n\n'.format(id_, res)
else:
return '? {}\n\n'.format(res)
def _parse_cmd(self, message):
try:
2017-11-28 01:15:46 +08:00
m = (message.strip().split(" ", 1) + [None])[:2]
2017-11-20 12:44:29 +08:00
if m[0].isdigit():
id_ = int(m[0])
cmd, args = (m[1].split(" ", 1) + [None])[:2]
else:
id_ = None
2017-11-28 01:15:46 +08:00
cmd, args = (m[0], m[1])
2017-11-20 12:44:29 +08:00
except:
return "invaild command"
return id_, cmd, args
def run_cmd(self, message):
try:
id_, cmd, args = self._parse_cmd(message)
except:
return self._parse_res("invaild message", id_, False)
if cmd in self.known_commands:
2017-11-28 15:04:00 +08:00
# dispatch
# try:
2017-11-20 12:44:29 +08:00
if True:
res, flag = getattr(self, "cmd_" + cmd)(args)
return self._parse_res(res, id_, flag)
2017-11-28 15:04:00 +08:00
# except Exception as e:
# print(e)
# return self._parse_res("command excution failed", id_, False)
2017-11-20 12:44:29 +08:00
else:
return self._parse_res("unknown command", id_, False)
def cmd_protocol_version(self, args, **kwargs):
return 2, True
def cmd_name(self, args, **kwargs):
return self._name, True
def cmd_version(self, args, **kwargs):
return self._version, True
def cmd_known_command(self, args, **kwargs):
return 'true' if (args in self.known_commands) else 'false', True
def cmd_list_commands(self, args, **kwargs):
return self.known_commands, True
def cmd_quit(self, args, **kwargs):
2017-12-07 17:51:58 +08:00
self.disconnect = True
2017-11-28 15:04:00 +08:00
return None, True
2017-11-20 12:44:29 +08:00
2017-12-26 19:29:35 +08:00
def cmd_boardsize(self, board_size, **kwargs):
if board_size.isdigit():
self._game.set_size(int(board_size))
2017-11-28 15:04:00 +08:00
return None, True
2017-11-20 12:44:29 +08:00
else:
2017-11-28 15:04:00 +08:00
return 'non digit size', False
2017-11-20 12:44:29 +08:00
def cmd_clear_board(self, args, **kwargs):
self._game.clear()
2017-11-28 15:04:00 +08:00
return None, True
2017-11-20 12:44:29 +08:00
2017-12-26 19:29:35 +08:00
def cmd_komi(self, komi, **kwargs):
2017-11-20 12:44:29 +08:00
try:
2017-12-26 19:29:35 +08:00
self._game.set_komi(float(komi))
2017-11-28 15:04:00 +08:00
return None, True
2017-11-20 12:44:29 +08:00
except ValueError:
raise ValueError("syntax error")
def cmd_play(self, args, **kwargs):
move = self._parse_move(args)
if move:
color, vertex = move
res = self._game.play_move(color, vertex)
2017-11-20 12:44:29 +08:00
if res:
2017-11-28 15:04:00 +08:00
return None, True
2017-11-20 12:44:29 +08:00
else:
2017-11-28 15:04:00 +08:00
return None, False
return None, True
2017-11-20 12:44:29 +08:00
def cmd_genmove(self, args, **kwargs):
color = self._parse_color(args)
if color:
move = self._game.think_play_move(color)
2017-11-28 15:04:00 +08:00
return self._vertex_point2string(move), True
2017-11-20 12:44:29 +08:00
else:
2017-11-28 15:04:00 +08:00
return 'unknown player', False
2017-12-07 17:51:58 +08:00
2017-12-09 21:41:11 +08:00
def cmd_get_score(self, args, **kwargs):
2017-12-23 13:05:25 +08:00
return self._game.game_engine.executor_get_score(self._game.board), True
2017-12-09 21:41:11 +08:00
def cmd_show_board(self, args, **kwargs):
2017-12-24 14:40:50 +08:00
board = copy.deepcopy(self._game.board)
if isinstance(board, np.ndarray):
board = board.flatten().tolist()
return board, True
2017-12-09 21:41:11 +08:00
2018-01-12 21:48:01 +08:00
def cmd_print_board(self, args, **kwargs):
board = copy.deepcopy(self._game.board)
print(board)
return None, True
def cmd_get_prob(self, args, **kwargs):
return self._game.prob, True
2018-01-12 21:48:01 +08:00
if __name__ == "__main__":
print ("test engine.py")
2018-01-12 21:48:01 +08:00
game = Game(name='reversi')
engine = GTPEngine(game_obj=game)
print ("Engine initialized!")
cmd = raw_input
while not engine.disconnect:
command = cmd()
result = engine.run_cmd(command)
sys.stdout.write(result)
sys.stdout.flush()