def ReplaySGF()

in pachi_py/extra_unused.pyx [0:0]


def ReplaySGF(const char* filename):
    # Adapted from sgf2gtp.py in pachi

    with open(filename, 'r') as f:
        sgfdata = f.read()
    col = SGFParser(sgfdata).parse()
    assert len(col) == 1

    gametree = col[0]

    class UnknownNode(Exception):
        pass

    def get_atr(node, atr):
        try:
            return node.data[atr].data[0]
        except KeyError:
            return None

    def get_setup(node, atr):
        try:
            return node.data[atr].data[:]
        except KeyError:
            return None

    def col2num(column, board_size):
        a, o, z = map(ord, ['a', column, 'z'])
        if a <= o <= z:
            return a + board_size - o
        raise Exception( "Wrong column character: '%s'"%(column,) )

    def is_pass_move(coord, board_size):
        # the pass move is represented either by [] ( = empty coord )
        # OR by [tt] (for boards <= 19 only)
        return len(coord) == 0 or ( board_size <= 19 and coord == 'tt' )

    def record_step(PyPachiBoard b, object coord):
        cdef move m
        if is_pass_move(coord, bsize):
            m = move_from_gtp(b._b.pachiboard(), player_next, 'pass')
        else:
            x, y = coord
            # The reason for this incredibly weird thing is that
            # the GTP protocol excludes `i` in the coordinates
            # (do you see any purpose in this??)
            if x >= 'i':
                x = chr(ord(x)+1)
            y = str(col2num(y, bsize))
            m = move_from_gtp(b._b.pachiboard(), player_next, x+y)

        cdef PyPachiBoard next_b = play_move(b, m)
        return Transition(
            m.color,
            b,
            m.coord,
            next_b
        )

    # cursor for tree traversal
    c = gametree.cursor()
    # first node is the header
    header = c.node

    handicap = get_atr(header, 'HA')
    bsize = int(get_atr(header, 'SZ') or 19)
    # assert bsize == 19

    komi = get_atr(header, 'KM')
    player_next, player_other = 'B', 'W'
    setup_black = get_setup(header, 'AB')
    setup_white = get_setup(header, 'AW')
    ruleset = get_atr(header, 'RU')

    cdef PyPachiBoard b = CreateBoard(bsize)

    # if komi:
    #     b._pachi_board.komi = float(komi)
    if handicap and handicap != '0':
        #board_handicap(b._pachi_board, int(handicap), NULL)
        # The dataset seems to have explicit AB/AW for handicap stones
        # so don't use Pachi's add-handicap method here
        player_next, player_other = player_other, player_next
    if setup_black:
        for item in setup_black:
            x, y = item
            if x >= 'i':
                x = chr(ord(x)+1)
            y = str(col2num(y, bsize))
            b = play_gtp(b, 'B', x+y)
    if setup_white:
        for item in setup_white:
            x, y = item
            if x >= 'i':
                x = chr(ord(x)+1)
            y = str(col2num(y, bsize))
            b = play_gtp(b, 'W', x+y)
    if ruleset:
        if ruleset.lower() == 'nz':
            # board_set_rules only takes new_zealand
            ruleset = 'new_zealand'
        if not board_set_rules(b._b.pachiboard(), ruleset):
            print 'Unrecognized ruleset %s for %s, defaulting to Pachi default' % (ruleset, filename)

    # walk the game tree forward
    game_transitions = []
    while True:
        # sgf2gtp.pl ignores n = 0
        if c.atEnd:
            break
        c.next()

        coord = get_atr(c.node, player_next)
        if coord != None:
            game_transitions.append(record_step(b, coord))
            b = game_transitions[-1].next_state
        else:
            # MAYBE white started?
            # or one of the players plays two time in a row
            player_next, player_other = player_other, player_next
            coord = get_atr(c.node, player_next)
            if coord != None:
                game_transitions.append(record_step(b, coord))
                b = game_transitions[-1].next_state
            elif len(c.node) != 0:
                # TODO handle weird sgf files better
                raise UnknownNode

        player_next, player_other = player_other, player_next
    return game_transitions