Esempio n. 1
0
def test_encoding(tc):
    g1 = sgf.Sgf_game(19)
    tc.assertEqual(g1.get_charset(), "UTF-8")
    root = g1.get_root()
    tc.assertEqual(root.get_encoding(), "UTF-8")
    root.set("C", "£")
    tc.assertEqual(root.get("C"), "£")
    tc.assertEqual(root.get_raw("C"), "£".encode("utf-8"))
    tc.assertEqual(
        g1.serialise(),
        dedent("""\
    (;FF[4]C[£]CA[UTF-8]GM[1]SZ[19])
    """.encode("utf-8")))

    g2 = sgf.Sgf_game(19, encoding="iso-8859-1")
    tc.assertEqual(g2.get_charset(), "ISO-8859-1")
    root = g2.get_root()
    tc.assertEqual(root.get_encoding(), "ISO-8859-1")
    root.set("C", "£")
    tc.assertEqual(root.get("C"), "£")
    tc.assertEqual(root.get_raw("C"), b"\xa3")
    tc.assertEqual(
        g2.serialise(),
        dedent(b"""\
    (;FF[4]C[\xa3]CA[ISO-8859-1]GM[1]SZ[19])
    """))

    tc.assertRaisesRegex(ValueError, "unknown encoding: unknownencoding",
                         sgf.Sgf_game, 19, "unknownencoding")

    tc.assertRaisesRegex(ValueError, "encoding names must be ascii",
                         sgf.Sgf_game, 19, "£")
Esempio n. 2
0
def save_game_sgf(model_name, game_n, game_data):
    game = sgf.Sgf_game(size=SIZE)

    modelB_name = game_data['modelB_name']
    modelW_name = game_data['modelW_name']
    result = game_data['result']

    game.root.set_raw("PB", modelB_name.encode('utf-8'))
    game.root.set_raw("PW", modelW_name.encode('utf-8'))
    game.root.set_raw("KM", str(conf['KOMI']).encode('utf-8'))

    game.root.set_raw("RE", result.encode('utf-8'))
    for move_data in game_data['moves']:
        node = game.extend_main_sequence()
        color = 'b' if move_data['player'] == 1 else 'w'
        x, y = move_data['move']

        move = (SIZE - 1 - y, x) if y != SIZE else None  # Different orienation

        move_n = move_data['move_n']
        next_board = game_data['moves'][(move_n + 1) % len(game_data['moves'])]['board']
        comment = "Value %s\nPlayer %s\nMove %s\nMove sgf %s, %s\n %s" % (move_data['value'], move_data['player'], move_data['move'], color, move, get_real_board(next_board))
        node.set("C", comment)
        node.set_move(color, move)


    filename = os.path.join(conf["GAMES_DIR"], model_name, "game_%03d.sgf" % game_n)
    with open(filename, "wb") as f:
        f.write(game.serialise())
Esempio n. 3
0
    def save_sgf(self, filename=None):
        """Saves recognition results to specified file (SGF)"""
        def _add_stone(game, bw, stone):
            node = game.extend_main_sequence()
            node.set_move(bw, (stone[GR_B] - 1, stone[GR_A] - 1))

        if self._res is None:
            raise Exception("Recognition results are not available")

        if filename is None:
            filename = str(Path(self._img_file).with_suffix('.sgf'))

        game = sgf.Sgf_game(size=self.board_size)
        bs = self.black_stones
        ws = self.white_stones

        for n in range(max(len(bs), len(ws))):
            if n < len(bs):
                _add_stone(game, STONE_BLACK.lower(), bs[n])
            if n < len(ws):
                _add_stone(game, STONE_WHITE.lower(), ws[n])

        with open(filename, "wb") as f:
            f.write(game.serialise())
            f.close()

        return filename
Esempio n. 4
0
def test_add_comment_text(tc):
    sgf_game = sgf.Sgf_game(9)
    root = sgf_game.get_root()
    root.add_comment_text("hello\nworld")
    tc.assertEqual(root.get('C'), "hello\nworld")
    root.add_comment_text("hello\naga]in")
    tc.assertEqual(root.get('C'), "hello\nworld\n\nhello\naga]in")
Esempio n. 5
0
def test_get_setup_and_moves(tc):
    g1 = sgf.Sgf_game.from_string(SAMPLE_SGF)
    board1, plays1 = sgf_moves.get_setup_and_moves(g1)
    tc.assertBoardEqual(board1, DIAGRAM1)
    tc.assertEqual(plays1, [('b', (2, 3)), ('w', (3, 4)), ('b', None),
                            ('w', None)])

    g2 = sgf.Sgf_game(size=9)
    root = g2.get_root()
    root.set("AB", [(1, 2), (3, 4)])
    node = g2.extend_main_sequence()
    node.set("B", (5, 6))
    node = g2.extend_main_sequence()
    node.set("W", (5, 7))
    board2, plays2 = sgf_moves.get_setup_and_moves(g2)
    tc.assertBoardEqual(board2, DIAGRAM2)
    tc.assertEqual(plays2, [('b', (5, 6)), ('w', (5, 7))])

    g3 = sgf.Sgf_game.from_string("(;AB[ab][ba]AW[aa])")
    tc.assertRaisesRegex(ValueError, "setup position not legal",
                         sgf_moves.get_setup_and_moves, g3)

    g4 = sgf.Sgf_game.from_string("(;SZ[9];B[ab];AW[bc])")
    tc.assertRaisesRegex(ValueError, "setup properties after the root node",
                         sgf_moves.get_setup_and_moves, g4)

    g5 = sgf.Sgf_game.from_string("(;SZ[26];B[ab];W[bc])")
    board5, plays5 = sgf_moves.get_setup_and_moves(g5)
    tc.assertEqual(plays5, [('b', (24, 0)), ('w', (23, 1))])
Esempio n. 6
0
def test_get_winner(tc):
    def gw(raw_result):
        g = sgf.Sgf_game(19)
        g.get_root().set_raw('RE', raw_result)
        return g.get_winner()

    tc.assertIs(sgf.Sgf_game(19).get_winner(), None)
    tc.assertIs(gw(b'0'), None)
    tc.assertIs(gw(b''), None)
    tc.assertIs(gw(b'Void'), None)
    tc.assertIs(gw(b'Draw'), None)
    tc.assertIs(gw(b'Jigo'), None)
    tc.assertIs(gw(b'?'), None)
    tc.assertEqual(gw(b'B+'), 'b')
    tc.assertEqual(gw(b'W+'), 'w')
    tc.assertEqual(gw(b'B+0.5'), 'b')
    tc.assertEqual(gw(b'W+64'), 'w')
    tc.assertEqual(gw(b'B+R'), 'b')
    tc.assertEqual(gw(b'W+R'), 'w')
    tc.assertEqual(gw(b'B+Resign'), 'b')
    tc.assertEqual(gw(b'W+Resign'), 'w')
    tc.assertEqual(gw(b'B+T'), 'b')
    tc.assertEqual(gw(b'W+T'), 'w')
    tc.assertEqual(gw(b'B+Time'), 'b')
    tc.assertEqual(gw(b'W+Time'), 'w')
    tc.assertEqual(gw(b'B+F'), 'b')
    tc.assertEqual(gw(b'W+F'), 'w')
    tc.assertEqual(gw(b'B+Forfeit'), 'b')
    tc.assertEqual(gw(b'W+Forfeit'), 'w')
    # Not allowed by spec
    tc.assertEqual(gw(b'B'), 'b')
    tc.assertEqual(gw(b'W'), 'w')
Esempio n. 7
0
    def create_empty(self, played='w'):
        self.game = sgf.Sgf_game(size=self.board_size, encoding="UTF-8")

        self.game.set_date()
        root_node = self.game.get_root()
        root_node.set("KM", self.komi)
        self.curr_node = self.game.get_root()
Esempio n. 8
0
def mat_to_sgf(mat, pathname):
    """Saves matrix of game state as sgf file.

    Expects 19x19 numpy matrix with '0' for empty, '1' for black and '2' for
    white stones.
    """
    mat = np.flipud(mat)    # sgf editors start coordinates in lower left
    game = sgf.Sgf_game(size=19)
    game.set_date()
    board = boards.Board(19)
    # TODO: determine points from mat
    black_points = []
    white_points = []
    empty_points = []
    for row in range(19):
        for col in range(19):
            stone = mat.item((row, col))
            if stone == 1:
                black_points.append((row, col))
            if stone == 2:
                white_points.append((row, col))
            if stone == 0:
                empty_points.append((row, col))
    board.apply_setup(black_points, white_points, empty_points)
    sgf_moves.set_initial_position(game, board)
    with open(pathname, "wb") as f:
        f.write(game.serialise())
    print(f'Saved game position as {pathname}\n')
Esempio n. 9
0
def test_set_initial_position(tc):
    board = ascii_boards.interpret_diagram(DIAGRAM1, 9)
    sgf_game = sgf.Sgf_game(9)
    sgf_moves.set_initial_position(sgf_game, board)
    root = sgf_game.get_root()
    tc.assertEqual(root.get("AB"), {(0, 0), (1, 1), (4, 4)})
    tc.assertEqual(root.get("AW"), {(6, 5), (6, 6)})
    tc.assertRaises(KeyError, root.get, 'AE')
Esempio n. 10
0
def test_set_date(tc):
    g = sgf.Sgf_game(19)
    g.set_date(datetime.date(1846, 9, 11))
    tc.assertEqual(g.get_root().get_raw("DT"), b"1846-09-11")
    g.set_date(None)
    s = g.get_root().get_raw("DT").decode()
    tc.assertEqual(datetime.datetime.strptime(s, "%Y-%m-%d").date(),
                   datetime.date.today())
Esempio n. 11
0
    def save_sgf(self, path):
        game = sgf.Sgf_game(self.board.side)
        sgf_moves.set_initial_position(game, self.board)
        game_bytes = game.serialise()

        with open(path, "wb") as f:
            f.write(game_bytes)
            f.close()
Esempio n. 12
0
    def __init__(self, size):

        # numpy array of GridSquares
        self.board = self._init_board(size)
        self.board_sz = size
        self.sgf_game = sgf.Sgf_game(size=size)

        # keeps track of board history for 'ko' rule
        self.board_hist = [copy.deepcopy(self.board)]
Esempio n. 13
0
def test_get_handicap(tc):
    def gh(raw_handicap):
        g = sgf.Sgf_game(19)
        g.get_root().set_raw('HA', raw_handicap)
        return g.get_handicap()
    tc.assertIs(sgf.Sgf_game(19).get_handicap(), None)
    tc.assertEqual(gh(b'9'), 9)
    tc.assertEqual(gh(b'2'), 2)
    tc.assertRaises(ValueError, gh, b'1')
    # Not strictly allowed by spec
    tc.assertEqual(gh(b'0'), None)
Esempio n. 14
0
def test_get_setup_and_moves_move_in_root(tc):
    # A move in the root node is allowed (though deprecated) if there are no
    # setup stones.
    g1 = sgf.Sgf_game(size=9)
    root = g1.get_root()
    root.set("B", (1, 2))
    node = g1.extend_main_sequence()
    node.set("W", (3, 4))
    board1, plays1 = sgf_moves.get_setup_and_moves(g1)
    tc.assertTrue(board1.is_empty())
    tc.assertEqual(plays1, [('b', (1, 2)), ('w', (3, 4))])

    g2 = sgf.Sgf_game(size=9)
    root = g2.get_root()
    root.set("B", (1, 2))
    root.set("AW", [(3, 3)])
    node = g2.extend_main_sequence()
    node.set("W", (3, 4))
    tc.assertRaisesRegex(ValueError, "mixed setup and moves in root node",
                         sgf_moves.get_setup_and_moves, g2)
Esempio n. 15
0
def merge_sgf_collection(pathname, add_wc_c, clean_sgf, sort):
    if _sgf_merge_verbose:
        print("Asked for verbose output", file=sys.stderr)

    # read games collection file
    f = open(pathname, "rb")
    sgf_src = f.read()
    f.close()
    dirname, basename = os.path.split(pathname)
    root, ext = os.path.splitext(basename)
    dstname = os.path.join(dirname, root + "_merged" + ext)
    try:
        if clean_sgf:  # replace fake new lines "\\n" with true ones "\n"!
            sgf_src = sgf_src.replace(b"\\n", b"\n")

        coarse_games = sgf_grammar.parse_sgf_collection(sgf_src)

    except ValueError as e:
        raise Exception("error parsing file: %s" % e)

    print("Read %d games" % len(coarse_games))

    # create a dictionary of pair of players -> list of games
    all_pairings = defaultdict(list)
    for coarse_game in coarse_games:
        sgf_game = sgf.Sgf_game.from_coarse_game_tree(coarse_game)
        players_pair = sgf_game.get_player_name('b'), sgf_game.get_player_name(
            'w')
        all_pairings[players_pair].append(sgf_game)

    print("Games grouped in %d player pairs" % len(all_pairings))

    with open(dstname, "wb") as f:
        for games in all_pairings.values():
            print("Merging %d games for players: %s vs %s" %
                  (len(games), games[0].get_player_name('b'),
                   games[0].get_player_name('w')))
            merged_game = sgf.Sgf_game(games[0].get_size())

            for game in games:
                _merge_with(merged_game.get_root(), game.get_root(),
                            game.get_winner())

            print("Win counters for merged game: %s" %
                  merged_game.get_root().get(WC_id))

            if sort:
                _sort_children(merged_game.get_root())

            if add_wc_c:
                _add_wincounters_to_comments(merged_game.get_root())

            f.write(merged_game.serialise())
Esempio n. 16
0
def test_extend_main_sequence(tc):
    g1 = sgf.Sgf_game(9)
    for i in range(6):
        g1.extend_main_sequence().set("N", "e%d" % i)
    tc.assertEqual(
        g1.serialise(),
        b"(;FF[4]CA[UTF-8]GM[1]SZ[9];N[e0];N[e1];N[e2];N[e3];N[e4];N[e5])\n")
    g2 = sgf.Sgf_game.from_bytes(b"(;SZ[9](;N[n1];N[n3])(;N[n2]))")
    for i in range(6):
        g2.extend_main_sequence().set("N", "e%d" % i)
    tc.assertEqual(
        g2.serialise(),
        b"(;SZ[9](;N[n1];N[n3];N[e0];N[e1];N[e2];N[e3];N[e4];N[e5])(;N[n2]))\n")
Esempio n. 17
0
def test_new_sgf_game(tc):
    g1 = sgf.Sgf_game(9)
    tc.assertEqual(g1.get_size(), 9)
    root = g1.get_root()
    tc.assertEqual(root.get_raw('FF'), b'4')
    tc.assertEqual(root.get_raw('GM'), b'1')
    tc.assertEqual(root.get_raw('SZ'), b'9')
    tc.assertEqual(root.get_raw_property_map(), {
        'FF': [b'4'],
        'GM': [b'1'],
        'SZ': [b'9'],
        'CA': [b'UTF-8'],
    })
    tc.assertEqual(list(root), [])
    tc.assertEqual(root.parent, None)
    tc.assertIs(root.owner, g1)
Esempio n. 18
0
def test_reparent(tc):
    g1 = sgf.Sgf_game.from_bytes(b"(;SZ[9](;N[n1];N[n3])(;N[n2]))")
    root = g1.get_root()
    # Test with unexpanded root
    tc.assertRaisesRegex(ValueError, "would create a loop", root.reparent,
                         root)
    n1 = root[0]
    n2 = root[1]
    n3 = root[0][0]
    tc.assertEqual(n1.get("N"), "n1")
    tc.assertEqual(n2.get("N"), "n2")
    tc.assertEqual(n3.get("N"), "n3")
    n3.reparent(n2)
    tc.assertEqual(g1.serialise(), b"(;SZ[9](;N[n1])(;N[n2];N[n3]))\n")
    n3.reparent(n2)
    tc.assertEqual(g1.serialise(), b"(;SZ[9](;N[n1])(;N[n2];N[n3]))\n")
    tc.assertRaisesRegex(ValueError, "would create a loop", root.reparent, n3)
    tc.assertRaisesRegex(ValueError, "would create a loop", n3.reparent, n3)
    g2 = sgf.Sgf_game(9)
    tc.assertRaisesRegex(ValueError,
                         "new parent doesn't belong to the same game",
                         n3.reparent, g2.get_root())
Esempio n. 19
0
    def __init__(self,
                 playerBlack=Player.Player(),
                 playerWhite=Player.Player(),
                 currentBoard=Board.Board(),
                 moveCounter=0,
                 sgfHist=None,
                 koHashTable={}):
        self.playerBlack = playerBlack
        self.playerWhite = playerWhite
        self.currentBoard = currentBoard
        self.moveCounter = moveCounter
        self.setKo = None
        #  Initialize hash table and add starting position
        self.koHashTable = koHashTable
        self.koHashTable[self.currentBoard.boardHash()] = [self.currentBoard]
        #  consecutivePa.extend_main_sequence()sses always 0 for new board
        self.consecutivePasses = 0

        # create empty sgf_game on default
        self.sgfHist = sgfHist
        if sgfHist is None:
            self.sgfHist = sgf.Sgf_game(self.currentBoard.size)
Esempio n. 20
0
def test_tree_mutation(tc):
    sgf_game = sgf.Sgf_game(9)
    root = sgf_game.get_root()
    n1 = root.new_child()
    n1.set("N", "n1")
    n2 = root.new_child()
    n2.set("N", "n2")
    n3 = n1.new_child()
    n3.set("N", "n3")
    n4 = root.new_child(1)
    n4.set("N", "n4")
    tc.assertEqual(
        sgf_game.serialise(),
        b"(;FF[4]CA[UTF-8]GM[1]SZ[9](;N[n1];N[n3])(;N[n4])(;N[n2]))\n")
    tc.assertEqual([
        node.get_raw_property_map() for node in sgf_game.main_sequence_iter()
    ], [node.get_raw_property_map() for node in (root, root[0], n3)])
    tc.assertIs(sgf_game.get_last_node(), n3)

    n1.delete()
    tc.assertEqual(sgf_game.serialise(),
                   b"(;FF[4]CA[UTF-8]GM[1]SZ[9](;N[n4])(;N[n2]))\n")
    tc.assertRaises(ValueError, root.delete)
Esempio n. 21
0
def startPK(num,spendTime):
    pbscmd = autopk_config.get("engines", "blackdir") \
             +autopk_config.get("engines", "blackengine")+' -w' \
             +autopk_config.get("engines", "blackweightdir") \
             +autopk_config.get("engines", "blackweight")+' -p 9990000'
    pbscmd = pbscmd.replace('\\','\\\\')
    pbcwdstr = autopk_config.get("engines", "blackdir")
    pbcwdstr = pbcwdstr.replace('\\','\\\\')
    #print(pbscmd,pbcwdstr)
    pbcommand = pbscmd.split(' ')
    try:
        pb = goEngin(pbcommand, pbcwdstr)
    except (Exception) as e:
        print("Error found:",e)
        return None
    
    processTest = True
    while processTest:
        #print 'test pb alive',pb.process.poll()
        if pb.process.poll() is None:
            pass
        else:
            gotStdStr = pb.readAns_nowait()
            while gotStdStr != None:
                print(gotStdStr)
                gotStdStr = pb.readAns_nowait()
            print("process start failed")
            return None
        sleep(0.001)
        gotErrStr = pb.readErr_nowait()
        if gotErrStr!=None:
            while gotErrStr!=None:
                if gotErrStr[:24] == 'Setting max tree size to':
                    print('pb.1',gotErrStr[:-2])
                    print('Black is ready.')
                    processTest = False
                else:
                    #print 'pb.1',gotErrStr[:-2]
                    pass
                if pb.process.poll() is None:
                    pass
                else:
                    print("process start failed")
                    return None
                gotErrStr = pb.readErr_nowait()

    pwscmd = autopk_config.get("engines", "whitedir") \
             +autopk_config.get("engines", "whiteengine")+' -w' \
             +autopk_config.get("engines", "whiteweightdir") \
             +autopk_config.get("engines", "whiteweight")+' -p 9990000'
    pwscmd = pwscmd.replace('\\','\\\\')
    pwcwdstr = autopk_config.get("engines", "whitedir")
    pwcwdstr = pwcwdstr.replace('\\','\\\\')
    #print(pwscmd,pwcwdstr)
    pwcommand = pwscmd.split(' ')
    try:
        pw = goEngin(pwcommand, pwcwdstr)
    except (Exception) as e:
        print("Error found:",e)
        return None

    #初始化待存储棋谱
    weightb = autopk_config.get("engines", "blackweight")
    weightw = autopk_config.get("engines", "whiteweight")
    g = sgf.Sgf_game(size=19)
    g.root.set("KM",'7.5')
    g.root.set("PB",weightb)
    g.root.set("PW",weightw)
    
    processTest = True
    while processTest:
        #print 'test pw alive',pw.process.poll()
        if pw.process.poll() is None:
            pass
        else:
            gotStdStr = pw.readAns_nowait()
            while gotStdStr != None:
                print(gotStdStr)
                gotStdStr = pw.readAns_nowait()
            print("process start failed")
            return None
        sleep(0.001)
        gotErrStr = pw.readErr_nowait()
        if gotErrStr!=None:
            while gotErrStr!=None:
                if gotErrStr[:24] == 'Setting max tree size to':
                    print('pw.1',gotErrStr[:-2])
                    print('White is ready.')
                    processTest = False
                else:
                    #print 'pw.1',gotErrStr[:-2]
                    pass
                if pw.process.poll() is None:
                    pass
                else:
                    print("process start failed")
                    return None
                gotErrStr = pw.readErr_nowait()

    initCmds = ['version','boardsize 19','komi 7.5','time_settings 0 '+str(spendTime+1)+' 1']

    for cmd in initCmds:
        print('Sending pb[',cmd,']',end=' ')
        try:
            pb.write(cmd)
        except (Exception) as e:
            print("Error found:",e)
            return None
        gotAns = pb.readAns()
        print('pb Answer is :', gotAns[:-2])
        pb.clearErrQ()

    for cmd in initCmds:
        print('Sending pw[',cmd,']',end=' ')
        try:
            pw.write(cmd)
        except (Exception) as e:
            print("Error found:",e)
            return None            
        gotAns = pw.readAns()
        print('pw Answer is :', gotAns[:-2])
        pw.clearErrQ()

    #开始对战
    stepTime1 = datetime.datetime.now()
    startTime = stepTime1
    resigned = False
    black_po = 0    #黑棋po总值
    white_po = 0    #白棋po总值
    cmdStr = 'genmove b'
    pb.write(cmdStr)
    gotAns = pb.readAns()
    #print 'Black First Move is :', gotAns
    sleep(0.01)
    #取得对局下一手相关信息:落子点、胜率、预测后几步走法、playouts
    errQTime1 = datetime.datetime.now() #记录读取errQ的时长
    strInfo = pb.clearErrQ()
    errQTime2 = datetime.datetime.now() #记录读取errQ的时长
    firstStep,stepWinrate,lcbrate,mightMoves,povalue = getStepInfo(strInfo,gotAns[2:-2])
    if (stepWinrate == None or povalue == None) and gotAns[2:-2]!='resign':
        print(repr(strInfo))

    cmdStr = 'play b ' + gotAns[2:-2]
    sgfStr=gotAns[2:-2]    #去除末尾的\r\n
    node = g.extend_main_sequence()
    node.set_move('b', a2num(sgfStr))
    if stepWinrate!=None and povalue!=None:
        if lcbrate!=None:
            node.set("C",stepWinrate+'% lcb:'+lcbrate+'% po:'+povalue)
        else:
            node.set("C",stepWinrate+'% po:'+povalue)
        black_po += int(povalue)

    steps = 1
    whowins = ''

    while not resigned:
        pw.write(cmdStr)
        stepTime2 = datetime.datetime.now()
        print(steps,cmdStr,'WinRate:(',stepWinrate,'%)(lcb:',lcbrate,'%)(po:',povalue,')', \
              "{:.2f}".format((stepTime2-stepTime1).total_seconds()),'s', \
              "{:.2f}".format((errQTime2-errQTime1).total_seconds()),'s')
        steps += 1
        gotAns = pw.readAns()
        #print 'White answer is :', gotAns
        cmdStr = 'genmove w'
        pw.write(cmdStr)
        gotAns = pw.readAns()
        #print 'White answer is :', gotAns
        sleep(0.01)
        #取得对局下一手相关信息:落子点、胜率、预测后几步走法
        errQTime1 = datetime.datetime.now() #记录读取errQ的时长
        strInfo = pw.clearErrQ()
        errQTime2 = datetime.datetime.now() #记录读取errQ的时长
        firstStep,stepWinrate,lcbrate,mightMoves,povalue = getStepInfo(strInfo,gotAns[2:-2])
        if (stepWinrate == None or povalue == None) and gotAns[2:-2]!='resign':
            print(repr(strInfo))
            
        if gotAns[2:] == u'pass\r\n':
            sgfStr += ','+gotAns[2:-2]
            node = g.extend_main_sequence()
            node.set_move('w', None)
            cmdStr = 'play w ' + gotAns[2:-2]
        elif gotAns[2:] != u'resign\r\n':
            sgfStr += ','+gotAns[2:-2]
            node = g.extend_main_sequence()
            node.set_move('w', a2num(gotAns[2:-2]))
            if stepWinrate!=None and povalue!=None:
                if lcbrate!=None:
                    node.set("C",stepWinrate+'% lcb:'+lcbrate+'% po:'+povalue)
                else:
                    node.set("C",stepWinrate+'% po:'+povalue)
                white_po += int(povalue)
            cmdStr = 'play w ' + gotAns[2:-2]
        else:
            print('White resigned!')
            node = g.extend_main_sequence()
            node.set_move('w', None)
            node.set("C", "White resigned!")
            g.root.set('RE','B+')
            resigned = True
            whowins = 'b'
            endTime = datetime.datetime.now()
            continue

        pb.write(cmdStr)
        stepTime1 = datetime.datetime.now()
        print(steps,cmdStr,'WinRate:(',stepWinrate,'%)(lcb:',lcbrate,'%)(po:',povalue,')', \
              "{:.2f}".format((stepTime1-stepTime2).total_seconds()),'s', \
              "{:.2f}".format((errQTime2-errQTime1).total_seconds()),'s')
        steps += 1
        gotAns = pb.readAns()
        #print 'Black answer is :', gotAns
        cmdStr = 'genmove b'
        pb.write(cmdStr)
        gotAns = pb.readAns()
        #print 'Black answer is :', gotAns
        sleep(0.01)
        #取得对局下一手相关信息:落子点、胜率、预测后几步走法
        errQTime1 = datetime.datetime.now() #记录读取errQ的时长
        strInfo = pb.clearErrQ()
        errQTime2 = datetime.datetime.now() #记录读取errQ的时长
        firstStep,stepWinrate,lcbrate,mightMoves,povalue = getStepInfo(strInfo,gotAns[2:-2])
        if (stepWinrate == None or povalue == None) and gotAns[2:-2]!='resign':
            print(repr(strInfo))
            
        if gotAns[2:] == u'pass\r\n':
            sgfStr += ','+gotAns[2:-2]
            node = g.extend_main_sequence()
            node.set_move('b', None)
            cmdStr = 'play b ' + gotAns[2:-2]
        elif gotAns[2:] != u'resign\r\n':
            sgfStr += ','+gotAns[2:-2]
            node = g.extend_main_sequence()
            node.set_move('b', a2num(gotAns[2:-2]))
            if stepWinrate!=None and povalue!=None:
                if lcbrate!=None:
                    node.set("C",stepWinrate+'% lcb:'+lcbrate+'% po:'+povalue)
                else:
                    node.set("C",stepWinrate+'% po:'+povalue)
                black_po += int(povalue)
            cmdStr = 'play b ' + gotAns[2:-2]
        else:
            print('Black resigned!')
            node = g.extend_main_sequence()
            node.set_move('b', None)
            node.set("C", "Black resigned!")
            g.root.set('RE','W+')
            resigned = True
            whowins = 'w'
            endTime = datetime.datetime.now()
            continue

        if steps >= 500:
            print('Too many Moves!')
            node.set("C", "Too many Moves!")
            resigned = True
            whowins = 'x'
            endTime = datetime.datetime.now()
            continue            

    #计算黑白平均po值
    if steps % 2 == 0:  #偶数说明是白投降了
        avgBlackPo = int(black_po/(steps/2))
        avgWhitePo = int(white_po/(steps/2-1))
    else:
        avgBlackPo = int(black_po/((steps-1)/2))
        avgWhitePo = int(white_po/((steps-1)/2))

    print('本局共耗时:',"{:.2f}".format((endTime-startTime).total_seconds()),'s','avgBpo:',avgBlackPo,'avgWpo:',avgWhitePo)
    #print sgfStr
    sgffile = open(weightb+' B'+"{:.0f}".format(avgBlackPo)+'po vs '+weightw+' W'+"{:.0f}".format(avgWhitePo)+ \
                'po-'+str(spendTime)+'s-'+str(num)+'-'+whowins+'+.sgf','w',encoding='utf-8') #python 3
    sgffile.write(g.serialise().decode())
    sgffile.close()        
    pb.close()
    pw.close()
    return whowins
Esempio n. 22
0
 def gw(raw_result):
     g = sgf.Sgf_game(19)
     g.get_root().set_raw('RE', raw_result)
     return g.get_winner()
Esempio n. 23
0
 def gh(raw_handicap):
     g = sgf.Sgf_game(19)
     g.get_root().set_raw('HA', raw_handicap)
     return g.get_handicap()
Esempio n. 24
0
async def on_message(message):

    global game

    if message.author == client.user:
        return

    if len(message.attachments) > 0 and \
       message.attachments[0].filename.endswith('.sgf') and \
       message.content.startswith(':set sgf'):
        bytes = await message.attachments[0].read()
        game = sgf.Sgf_game.from_string(bytes.decode('utf-8'))
        await message.channel.send('sgf set!')

    if message.content.startswith(':play from move'):
        # note: from move 0 doesn't work
        board_size = game.get_size()
        msg = message.content.split(' ')
        stop_at_move_no = int(msg[3][:-1])

        unparsed_appended_moves = msg[4:]

        # unparsed_appended_moves looks like
        # unparsed_appended_moves = [
        #   'e8',
        #   'd7',
        #   'd8',
        # ]

        appended_moves = []

        # note: uses 'j' instead of 'i' for the x-axis column name

        for ind, x in enumerate(unparsed_appended_moves):
            xaxisnumber = ord(x[0]) - 97 if ord(
                x[0]) <= 104 else ord(x[0]) - 98  # the j instead of i thingy
            appended_moves.append(
                ('b' if ((stop_at_move_no % 2) + ind) % 2 == 0 else 'w',
                 (int(x[1:]) - 1, xaxisnumber)))

        # appended_moves should look like
        # appended_moves = [
        #   ('b', (0,0)),
        #   ('w', (1,0)),
        #   ('b', (2,0)), # note that first number represents y-axis, grows from bottom-left from 0,0
        # ]

        copied_game = sgf.Sgf_game(size=board_size)

        count = 0

        # now we copy moves up till given stop_at_move_no
        for node in game.get_main_sequence():
            if count > stop_at_move_no:
                break

            move = node.get_move()
            # print(count, move)
            # print(move[0], move[1])

            if count == 0:
                count = count + 1
                continue

            new_node = copied_game.extend_main_sequence()
            new_node.set_move(move[0], move[1])

            count = count + 1

        # now we copy over appended moves
        for move in appended_moves:
            new_node = copied_game.extend_main_sequence()
            new_node.set_move(move[0], move[1])

        # render to gif
        with open('output.sgf', "wb") as f:
            f.write(copied_game.serialise())
        subprocess.run([
            './sgf_to_gif', '-d', '100', '-t',
            str(stop_at_move_no), 'output.sgf'
        ])
        output_gif_filename = 'output.' + str(stop_at_move_no +
                                              len(appended_moves)) + '.gif'
        await message.channel.send(file=discord.File(output_gif_filename))
        subprocess.run('rm output*', shell=True)

    if message.content.startswith(':play all moves'):
        with open('output.sgf', "wb") as f:
            f.write(game.serialise())
        subprocess.run(['./sgf_to_gif', '-d', '100', 'output.sgf'])
        await message.channel.send(file=discord.File('output.gif'))
        subprocess.run('rm output*', shell=True)

    if message.content.startswith(':play moves') and 'to' in message.content:
        msg = message.content.split(' ')
        starting_move = str(int(msg[2]) - 1)
        ending_move = msg[4]
        with open('output.sgf', "wb") as f:
            f.write(game.serialise())
        subprocess.run(
            f'./sgf_to_gif -d 100 -t "{starting_move} {ending_move}" output.sgf',
            shell=True)
        await message.channel.send(file=discord.File('output.' + ending_move +
                                                     '.gif'))
        subprocess.run('rm output*', shell=True)
Esempio n. 25
0
 def create_empty(self, size, komi):
     self.game = sgf.Sgf_game(size=size, encoding="UTF-8")
     self.board_size = size
     self.komi = komi
     root_node = self.game.get_root()
     root_node.set("KM", komi)