prioritized analysis

This commit is contained in:
Sander Land committed 2020-03-30 18:27:45 +02:00
1 parent 0a331cf294
commit 8bcd80e569
1 file changed
+12 -6
+12 -6
View File
@@ -48,6 +48,7 @@ class EngineControls(GridLayout):
self.outstanding_analysis_queries = [] # allows faster interaction while kata is starting self.outstanding_analysis_queries = [] # allows faster interaction while kata is starting
self.kata = None self.kata = None
self.query_time = {} self.query_time = {}
self.game_counter = 0
def show_error(self, msg): def show_error(self, msg):
print(f"ERROR: {msg}") print(f"ERROR: {msg}")
@@ -92,7 +93,7 @@ class EngineControls(GridLayout):
raise raise
msg, *args = self.message_queue.get() msg, *args = self.message_queue.get()
def play(self, move, faster=False): def play(self, move, faster=False, analysis_priority=None):
try: try:
mr = self.board.play(move) mr = self.board.play(move)
except IllegalMoveException as e: except IllegalMoveException as e:
@@ -100,7 +101,7 @@ class EngineControls(GridLayout):
return return
self.update_evaluation() self.update_evaluation()
if not mr.analysis_ready: # replayed old move if not mr.analysis_ready: # replayed old move
self._request_analysis(mr, faster=faster) self._request_analysis(mr, faster=faster, priority=self.game_counter if analysis_priority is None else analysis_priority)
return mr return mr
def show_evaluation_stats(self, move): def show_evaluation_stats(self, move):
@@ -211,10 +212,11 @@ class EngineControls(GridLayout):
self.update_evaluation() self.update_evaluation()
def _do_init(self, board_size, komi=None): def _do_init(self, board_size, komi=None):
self.game_counter += 1 # prioritize newer games
self.board_size = board_size self.board_size = board_size
self.komi = float(komi or Config.get("board").get(f"komi_{board_size}", 6.5)) self.komi = float(komi or Config.get("board").get(f"komi_{board_size}", 6.5))
self.board = Board(board_size) self.board = Board(board_size)
self._request_analysis(self.board.root) self._request_analysis(self.board.root, priority=self.game_counter)
self.redraw(include_board=True) self.redraw(include_board=True)
self.ready = True self.ready = True
if self.ai_lock.active: if self.ai_lock.active:
@@ -263,16 +265,18 @@ class EngineControls(GridLayout):
if handicap and not "AB" in sgfprops: if handicap and not "AB" in sgfprops:
self.board.place_handicap_stones(handicap) self.board.place_handicap_stones(handicap)
analysis_priority = self.game_counter - 1_000_000_000
placements = [Move(player=pl, sgfcoords=(mv, self.board_size)) for pl, player in enumerate(Move.PLAYERS) for mv in sgfprops.get("A" + player, [])] placements = [Move(player=pl, sgfcoords=(mv, self.board_size)) for pl, player in enumerate(Move.PLAYERS) for mv in sgfprops.get("A" + player, [])]
for placement in placements: # free handicaps for placement in placements: # free handicaps
self.board.play(placement) # bypass analysis self.board.play(placement) # bypass analysis
if handicap or placements: if handicap or placements:
self._request_analysis(self.board.current_move) # ensure next move analysis works self._request_analysis(self.board.current_move, priority=analysis_priority) # ensure next move analysis works
moves = [Move(player=Move.PLAYERS.index(p.upper()), sgfcoords=(mv, self.board_size)) for p, mv in sgfmoves] moves = [Move(player=Move.PLAYERS.index(p.upper()), sgfcoords=(mv, self.board_size)) for p, mv in sgfmoves]
for move in moves: for move in moves:
self.play(move, faster=faster and move != moves[-1]) self.play(move, faster=faster and move != moves[-1], analysis_priority=analysis_priority)
if rewind: if rewind:
self.board.rewind() self.board.rewind()
@@ -300,13 +304,14 @@ class EngineControls(GridLayout):
def _send_analysis_query(self, query): def _send_analysis_query(self, query):
self.query_time[query["id"]] = time.time() self.query_time[query["id"]] = time.time()
print(query)
if self.kata: if self.kata:
self.kata.stdin.write((json.dumps(query) + "\n").encode()) self.kata.stdin.write((json.dumps(query) + "\n").encode())
self.kata.stdin.flush() self.kata.stdin.flush()
else: # early on / root / etc else: # early on / root / etc
self.outstanding_analysis_queries.append(copy.copy(query)) self.outstanding_analysis_queries.append(copy.copy(query))
def _request_analysis(self, move, faster=False): def _request_analysis(self, move, faster=False, priority=0):
faster_fac = 5 if faster else 1 faster_fac = 5 if faster else 1
move_id = move.id move_id = move.id
moves = self.board.moves moves = self.board.moves
@@ -321,6 +326,7 @@ class EngineControls(GridLayout):
"analyzeTurns": [len(moves)], "analyzeTurns": [len(moves)],
"includeOwnership": True, "includeOwnership": True,
"maxVisits": self.visits[fast][1] // faster_fac, "maxVisits": self.visits[fast][1] // faster_fac,
"priority": priority,
} }
if self.debug: if self.debug:
print(f"sending query for move {move_id}: {str(query)[:80]}") print(f"sending query for move {move_id}: {str(query)[:80]}")