def replay_sgf(sgf_contents): ''' Wrapper for sgf files, returning go.PositionWithContext instances. It does NOT return the very final position, as there is no follow up. To get the final position, call pwc.position.play_move(pwc.next_move) on the last PositionWithContext returned. Example usage: with open(filename) as f: for position_w_context in replay_sgf(f.read()): print(position_w_context.position) ''' collection = sgf.parse(sgf_contents) game = collection.children[0] props = game.root.properties assert int(sgf_prop(props.get('GM', ['1']))) == 1, "Not a Go SGF!" komi = 0 if props.get('KM') != None: komi = float(sgf_prop(props.get('KM'))) result = utils.parse_game_result(sgf_prop(props.get('RE'))) pos = Position(komi=komi) current_node = game.root while pos is not None and current_node.next is not None: pos = handle_node(pos, current_node) maybe_correct_next(pos, current_node.next) next_move = get_next_move(current_node) yield PositionWithContext(pos, next_move, result) current_node = current_node.next
def extract_game_data(gcs_path, root_node): props = root_node.properties komi = float(sgf_wrapper.sgf_prop(props.get('KM'))) result = sgf_wrapper.sgf_prop(props.get('RE', '')) board_size = int(sgf_wrapper.sgf_prop(props.get('SZ'))) value = utils.parse_game_result(result) was_resign = '+R' in result filename = os.path.basename(gcs_path) filename_no_ext, _ = os.path.splitext(filename) # BigQuery's TIMESTAMP() takes in unix millis. completion_millis = 1000 * int(filename_no_ext.split('-')[0]) worker_id = filename_no_ext.split('-')[-1] model_num = shipname.detect_model_num(props.get('PW')[0]) sgf_url = gcs_path first_comment_node_lines = root_node.next.properties['C'][0].split('\n') # in-place edit to comment node so that first move's comment looks # the same as all the other moves. root_node.next.properties['C'][0] = '\n'.join(first_comment_node_lines[1:]) resign_threshold = float(first_comment_node_lines[0].split()[-1]) return { 'worker_id': worker_id, 'completed_time': completion_millis, 'board_size': board_size, 'model_num': model_num, 'result_str': result, 'value': value, 'was_resign': was_resign, 'sgf_url': sgf_url, 'resign_threshold': resign_threshold, }
def parse_sgf(sgf_path): with open(sgf_path) as f: sgf_contents = f.read() collection = sgf.parse(sgf_contents) game = collection.children[0] props = game.root.properties assert int(sgf_prop(props.get('GM', ['1']))) == 1, "Not a Go SGF!" result = utils.parse_game_result(sgf_prop(props.get('RE'))) positions, moves = zip(*[(p.position, p.next_move) for p in sgf_wrapper.replay_sgf(sgf_contents)]) return positions, moves, result, props
def extract_moves(final_positions): winning_moves = [] losing_moves = [] for final_position in final_positions: positions_w_context = utils.take_n( strategies.POLICY_CUTOFF_DEPTH, sgf_wrapper.replay_position(final_position)) winner = utils.parse_game_result(final_position.result()) for pwc in positions_w_context: if pwc.position.to_play == winner: winning_moves.append(pwc) else: losing_moves.append(pwc) return (load_data_sets.DataSet.from_positions_w_context(winning_moves), load_data_sets.DataSet.from_positions_w_context(losing_moves))
def parse_sgf(sgf_path): # TODO(sethtroisi): Replace uses with call to sgf_wrapper. with open(sgf_path) as f: sgf_contents = f.read() collection = sgf.parse(sgf_contents) game = collection.children[0] props = game.root.properties assert int(sgf_prop_get(props, 'GM', '1')) == 1, "Not a Go SGF!" result = parse_game_result(sgf_prop_get(props, 'RE', '')) positions, moves = zip(*[(p.position, p.next_move) for p in replay_sgf(sgf_contents)]) return positions, moves, result, props
def test_parse_game_result(self): self.assertEqual(utils.parse_game_result('B+3.5'), go.BLACK) self.assertEqual(utils.parse_game_result('W+T'), go.WHITE) self.assertEqual(utils.parse_game_result('Void'), 0)
def get_winrate(final_positions): black_win = [ utils.parse_game_result(pos.result()) == go.BLACK for pos in final_positions ] return sum(black_win) / len(black_win)
def test_parse_game_result(self): self.assertEqual(go.BLACK, utils.parse_game_result('B+3.5')) self.assertEqual(go.WHITE, utils.parse_game_result('W+T')) self.assertEqual(0, utils.parse_game_result('Void'))
def test_parse_game_result(self): self.assertEqual(utils.parse_game_result('B+3.5'), go.BLACK) self.assertEqual(utils.parse_game_result('W+T'), go.WHITE) self.assertEqual(utils.parse_game_result('Void'), None)
def get_winrate(final_positions): black_win = [utils.parse_game_result(pos.result()) == go.BLACK for pos in final_positions] return sum(black_win) / len(black_win)