stuff
This commit is contained in:
1 parent
2c4c2a2693
commit
6ae2ac162a
8 files changed
+38
-33
No files matched your search
@@ -12,10 +12,11 @@
|
|||||||
[] more AI modes (noisy policy? heavy balance? jigo?)
|
[] more AI modes (noisy policy? heavy balance? jigo?)
|
||||||
[] split feedback in box vs top moves
|
[] split feedback in box vs top moves
|
||||||
[] box to label ? split in status and comment?
|
[] box to label ? split in status and comment?
|
||||||
|
[] limit below board buttons somehow to not be too big
|
||||||
|
|
||||||
wont do
|
wont do
|
||||||
[] Self-play tournaments?
|
[] Self-play tournaments?
|
||||||
[] Multi engine (detect all req. analysis in analysis[engine] fn)
|
[] Multi engine (detect all req. analysis in analysis[engine] fn)
|
||||||
|
|
||||||
|
[] graph wonky on branch switch -> check in children &c.
|
||||||
|
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
"balance_randomize_score": 1,
|
"balance_randomize_score": 1,
|
||||||
"balance_max_lost": 5,
|
"balance_max_lost": 5,
|
||||||
"balance_min_visits": 20,
|
"balance_min_visits": 20,
|
||||||
|
"noise_strength": 0.05,
|
||||||
"eval_off_show_last": 3
|
"eval_off_show_last": 3
|
||||||
},
|
},
|
||||||
"board_ui": {
|
"board_ui": {
|
||||||
|
|||||||
@@ -219,6 +219,10 @@ class Game:
|
|||||||
policy_moves = cn.policy_ranking
|
policy_moves = cn.policy_ranking
|
||||||
self.katrain.log(f"Top 5 policy moves are: {policy_moves[:5]}", OUTPUT_DEBUG)
|
self.katrain.log(f"Top 5 policy moves are: {policy_moves[:5]}", OUTPUT_DEBUG)
|
||||||
aimove = policy_moves[0][0]
|
aimove = policy_moves[0][0]
|
||||||
|
elif "noise" in ai_mode and cn.policy:
|
||||||
|
noise = train_settings["noise_strength"]
|
||||||
|
policy_moves = [(mv, pol + random.gauss(0, noise)) for mv, pol in cn.policy_ranking]
|
||||||
|
aimove = max(policy_moves, key=lambda mp: mp[1])[0]
|
||||||
elif "balance" in ai_mode and candidate_ai_moves[0]["move"] != "pass": # don't play suicidal to balance score - pass when it's best
|
elif "balance" in ai_mode and candidate_ai_moves[0]["move"] != "pass": # don't play suicidal to balance score - pass when it's best
|
||||||
sign = cn.player_sign(cn.next_player) # TODO check
|
sign = cn.player_sign(cn.next_player) # TODO check
|
||||||
sel_moves = [ # top move, or anything not too bad, or anything that makes you still ahead
|
sel_moves = [ # top move, or anything not too bad, or anything that makes you still ahead
|
||||||
@@ -233,9 +237,14 @@ class Game:
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
aimove = Move.from_gtp(random.choice(sel_moves)["move"], player=cn.next_player) # TODO: could be weighted towards worse
|
aimove = Move.from_gtp(random.choice(sel_moves)["move"], player=cn.next_player) # TODO: could be weighted towards worse
|
||||||
|
elif "jigo" in ai_mode and candidate_ai_moves[0]["move"] != "pass":
|
||||||
|
sign = cn.player_sign(cn.next_player) # TODO check
|
||||||
|
jigo_move = min(candidate_ai_moves, key=lambda move: abs(sign * move["scoreLead"] - 0.5))
|
||||||
|
print("NP sign",sign,"JIGO MOVE",jigo_move)
|
||||||
|
aimove = Move.from_gtp(jigo_move["move"], player=cn.next_player)
|
||||||
else:
|
else:
|
||||||
if "default" not in ai_mode:
|
if "default" not in ai_mode:
|
||||||
self.katrain.log(f"Unknown AI mode {ai_mode}, using default.", OUTPUT_INFO)
|
self.katrain.log(f"Unknown AI mode {ai_mode} or policy missing, using default.", OUTPUT_INFO)
|
||||||
aimove = Move.from_gtp(candidate_ai_moves[0]["move"], player=cn.next_player)
|
aimove = Move.from_gtp(candidate_ai_moves[0]["move"], player=cn.next_player)
|
||||||
self.play(aimove)
|
self.play(aimove)
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -12,8 +12,6 @@ from game import Move
|
|||||||
|
|
||||||
|
|
||||||
class BadukPanWidget(Widget):
|
class BadukPanWidget(Widget):
|
||||||
board_color = ListProperty([0.85, 0.68, 0.40])
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(BadukPanWidget, self).__init__(**kwargs)
|
super(BadukPanWidget, self).__init__(**kwargs)
|
||||||
self.ui_config = {}
|
self.ui_config = {}
|
||||||
@@ -60,7 +58,6 @@ class BadukPanWidget(Widget):
|
|||||||
katrain.log(f"\nAnalysis:\n{nodes_here[-1].analysis}", OUTPUT_DEBUG)
|
katrain.log(f"\nAnalysis:\n{nodes_here[-1].analysis}", OUTPUT_DEBUG)
|
||||||
katrain.log(f"\nParent Analysis:\n{nodes_here[-1].parent.analysis}", OUTPUT_DEBUG)
|
katrain.log(f"\nParent Analysis:\n{nodes_here[-1].parent.analysis}", OUTPUT_DEBUG)
|
||||||
katrain.controls.info.text = nodes_here[-1].comment(sgf=True)
|
katrain.controls.info.text = nodes_here[-1].comment(sgf=True)
|
||||||
katrain.controls.show_evaluation_stats(nodes_here[-1])
|
|
||||||
|
|
||||||
self.ghost_stone = None
|
self.ghost_stone = None
|
||||||
self.draw_board_contents() # remove ghost
|
self.draw_board_contents() # remove ghost
|
||||||
@@ -82,7 +79,7 @@ class BadukPanWidget(Widget):
|
|||||||
|
|
||||||
if innercol:
|
if innercol:
|
||||||
Color(*innercol)
|
Color(*innercol)
|
||||||
Line(circle=(self.gridpos_x[x], self.gridpos_y[y], stone_size * 0.45 / 0.85), width=0.125 * stone_size) # 1.75
|
Line(circle=(self.gridpos_x[x], self.gridpos_y[y], stone_size * 0.475 / 0.85), width=0.1 * stone_size)
|
||||||
|
|
||||||
def eval_color(self, points_lost):
|
def eval_color(self, points_lost):
|
||||||
colors = self.ui_config["eval_colors"]
|
colors = self.ui_config["eval_colors"]
|
||||||
|
|||||||
+11
-19
@@ -27,23 +27,6 @@ class Controls(BoxLayout):
|
|||||||
else:
|
else:
|
||||||
self.select_mode("play")
|
self.select_mode("play")
|
||||||
|
|
||||||
def show_evaluation_stats(self, node):
|
|
||||||
if node.analysis_ready:
|
|
||||||
self.score.text = node.format_score().replace("-", "\u2013")
|
|
||||||
self.win_rate.text = node.format_win_rate()
|
|
||||||
move = node.single_move
|
|
||||||
if move:
|
|
||||||
self.points_lost.label = f"Point loss {move.player}{move.gtp()}"
|
|
||||||
else:
|
|
||||||
self.points_lost.label = f"Point loss"
|
|
||||||
self.points_lost.text = ""
|
|
||||||
return
|
|
||||||
|
|
||||||
if node.points_lost is not None:
|
|
||||||
self.points_lost.text = f"{node.points_lost:.1f}"
|
|
||||||
else:
|
|
||||||
self.points_lost.text = f"..."
|
|
||||||
|
|
||||||
def player_mode(self, player):
|
def player_mode(self, player):
|
||||||
return self.player_mode_groups[player].value
|
return self.player_mode_groups[player].value
|
||||||
|
|
||||||
@@ -71,8 +54,17 @@ class Controls(BoxLayout):
|
|||||||
)
|
)
|
||||||
if current_player_is_human_or_both_robots and not current_node.is_root and move:
|
if current_player_is_human_or_both_robots and not current_node.is_root and move:
|
||||||
info += current_node.comment(eval=True, hints=self.hints.active)
|
info += current_node.comment(eval=True, hints=self.hints.active)
|
||||||
if current_player_is_human_or_both_robots:
|
|
||||||
self.show_evaluation_stats(current_node)
|
if current_node.analysis_ready:
|
||||||
|
self.score.text = current_node.format_score()
|
||||||
|
self.win_rate.text = current_node.format_win_rate()
|
||||||
|
if move and current_player_is_human_or_both_robots: # don't immediately hide this when an ai moves comes in
|
||||||
|
self.points_lost.label = f"Point loss {move.player}{move.gtp()}"
|
||||||
|
points_lost = current_node.points_lost
|
||||||
|
self.points_lost.text = f"{current_node.points_lost:.1f}" if points_lost else "..."
|
||||||
|
else:
|
||||||
|
self.points_lost.label = f"Point loss"
|
||||||
|
self.points_lost.text = ""
|
||||||
|
|
||||||
self.graph.update_value(current_node)
|
self.graph.update_value(current_node)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -117,7 +117,7 @@ class ConfigPopup(QuickConfigGui):
|
|||||||
self.info_label = Label()
|
self.info_label = Label()
|
||||||
self.apply_button = StyledButton(text="Apply", on_press=lambda _: self.update_config())
|
self.apply_button = StyledButton(text="Apply", on_press=lambda _: self.update_config())
|
||||||
self.save_button = StyledButton(text="Apply and Save", on_press=lambda _: self.update_config(save_to_file=True))
|
self.save_button = StyledButton(text="Apply and Save", on_press=lambda _: self.update_config(save_to_file=True))
|
||||||
btn_container = BoxLayout(orientation="horizontal", size_hint=(1, 0.1))
|
btn_container = BoxLayout(orientation="horizontal", size_hint=(1, 0.1), spacing=1, padding=1)
|
||||||
btn_container.add_widget(self.info_label)
|
btn_container.add_widget(self.info_label)
|
||||||
btn_container.add_widget(self.apply_button)
|
btn_container.add_widget(self.apply_button)
|
||||||
btn_container.add_widget(self.save_button)
|
btn_container.add_widget(self.save_button)
|
||||||
|
|||||||
+9
-7
@@ -2,10 +2,12 @@
|
|||||||
#:import ew kivy.uix.effectwidget
|
#:import ew kivy.uix.effectwidget
|
||||||
|
|
||||||
|
|
||||||
#:set AI_MODES ['Default','Balance','Policy']
|
#:set AI_MODES ['Default','Balance','Jigo','Policy','P+Noise']
|
||||||
#:set PLAYER_MODES ['Human', 'Teach','AI:']
|
#:set PLAYER_MODES ['Human', 'Teach','AI:']
|
||||||
#:set BUTTON_COLOR [0.23, 0.30, 0.35, 1]
|
#:set BUTTON_COLOR [0.23, 0.30, 0.35, 1]
|
||||||
#:set ICON_BUTTON_COLOR [0.71, 0.78, 0.81, 1]
|
#:set ICON_BUTTON_COLOR [0.71, 0.78, 0.81, 1]
|
||||||
|
#:set BOARD_COLOR [0.85, 0.68, 0.40,1]
|
||||||
|
#:set GRAPH_DOT_COLOR [0.85, 0.3, 0.3,1]
|
||||||
#:set BLACK [0.05,0.05,0.05,1]
|
#:set BLACK [0.05,0.05,0.05,1]
|
||||||
#:set WHITE [0.95,0.95,0.95,1]
|
#:set WHITE [0.95,0.95,0.95,1]
|
||||||
#:set GREY [0.5,0.5,0.5,1]
|
#:set GREY [0.5,0.5,0.5,1]
|
||||||
@@ -180,7 +182,7 @@
|
|||||||
points: root.line_points
|
points: root.line_points
|
||||||
width: 1.1
|
width: 1.1
|
||||||
Color:
|
Color:
|
||||||
rgba: BUTTON_COLOR
|
rgba: GRAPH_DOT_COLOR
|
||||||
Ellipse:
|
Ellipse:
|
||||||
id: dot
|
id: dot
|
||||||
pos: root.dot_pos
|
pos: root.dot_pos
|
||||||
@@ -218,8 +220,8 @@
|
|||||||
Label:
|
Label:
|
||||||
size_hint: 0.05, 1
|
size_hint: 0.05, 1
|
||||||
BoxLayout:
|
BoxLayout:
|
||||||
size_hint: 0.15, 1
|
size_hint: 0.2, 1
|
||||||
padding: self.size[1]/5
|
padding: [0.325*self.size[1],0.2*self.size[1]]
|
||||||
StyledButton:
|
StyledButton:
|
||||||
text: 'Pass'
|
text: 'Pass'
|
||||||
font_size: 0.6*self.size[1]
|
font_size: 0.6*self.size[1]
|
||||||
@@ -270,10 +272,10 @@
|
|||||||
size_hint: 0.1, 1
|
size_hint: 0.1, 1
|
||||||
on_press: root.katrain('redo',999)
|
on_press: root.katrain('redo',999)
|
||||||
Label:
|
Label:
|
||||||
size_hint: 0.07, 1
|
size_hint: 0.05, 1
|
||||||
BoxLayout:
|
BoxLayout:
|
||||||
size_hint: 0.2, 1
|
size_hint: 0.2, 1
|
||||||
padding: self.size[1]/5
|
padding: 0.2 * self.size[1]
|
||||||
StyledButton:
|
StyledButton:
|
||||||
text: 'AI Move'
|
text: 'AI Move'
|
||||||
font_size: 0.6*self.size[1]
|
font_size: 0.6*self.size[1]
|
||||||
@@ -493,7 +495,7 @@
|
|||||||
size_hint: 1,1
|
size_hint: 1,1
|
||||||
canvas.before:
|
canvas.before:
|
||||||
Color:
|
Color:
|
||||||
rgb: root.board_gui.board_color if root.board_gui else (0,0,0)
|
rgb: BOARD_COLOR
|
||||||
Rectangle:
|
Rectangle:
|
||||||
pos: self.pos
|
pos: self.pos
|
||||||
size: self.size
|
size: self.size
|
||||||
|
|||||||
@@ -212,6 +212,7 @@ class KaTrainGui(BoxLayout):
|
|||||||
"right": ("switch-branch", 1),
|
"right": ("switch-branch", 1),
|
||||||
"left": ("switch-branch", -1),
|
"left": ("switch-branch", -1),
|
||||||
}
|
}
|
||||||
|
print(keycode)
|
||||||
if keycode[1] in shortcuts.keys():
|
if keycode[1] in shortcuts.keys():
|
||||||
shortcut = shortcuts[keycode[1]]
|
shortcut = shortcuts[keycode[1]]
|
||||||
if isinstance(shortcut, Widget):
|
if isinstance(shortcut, Widget):
|
||||||
@@ -220,6 +221,8 @@ class KaTrainGui(BoxLayout):
|
|||||||
self(*shortcut)
|
self(*shortcut)
|
||||||
elif keycode[1] == "tab":
|
elif keycode[1] == "tab":
|
||||||
self.controls.switch_mode()
|
self.controls.switch_mode()
|
||||||
|
elif keycode[1] == "spacebar":
|
||||||
|
self("play", None) # pass
|
||||||
elif keycode[1] in ["`", "~", "p"]:
|
elif keycode[1] in ["`", "~", "p"]:
|
||||||
self.controls_box.hidden = not self.controls_box.hidden
|
self.controls_box.hidden = not self.controls_box.hidden
|
||||||
elif keycode[1] in ["up", "z"]:
|
elif keycode[1] in ["up", "z"]:
|
||||||
|
|||||||
Reference in new issue
Block a user