From 7b9fa2474270482a7f380d3c1a683667897d13be Mon Sep 17 00:00:00 2001 From: Sander Land Date: Wed, 26 Aug 2020 22:39:43 +0200 Subject: [PATCH 01/47] de --- .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 13893 -> 13975 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 42 +++++++----------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index 49fc661d92ee4bd23117554a1b94595ef77f7e25..b0670b5ac0e6d112b8725a5df222436cda08a933 100644 GIT binary patch delta 2092 zcmYk+Yiv|S6u|LQDxfV;w3PC&Fo0B)?Sr@C6QvR?4GknlhzYsv&UV+{oo(*krP{=- z7~%slYMR(+3}}?ZYGO$$B~AFybR~isjfwSx4_+D*4bntStU!$a<6eX>`D=y)sHQGmgzn`D$v4D&4 zbBy5y)b;1j6Iq2Vcq8taC;9&ddKqY7;1jIDzpx6c=8Ig1%W*q4;={NXf5$Je8Aop} z20nwy#41bicDx7oVG?h{KX3$V7KoJMsRenWqH&Iam+&8)g8LVWOv7H(jNXd+{gFdB zo$&%{CSPGW{unuqGwEMKU2mExu2+el(Kq-5p3l>W)A*Enoxq00BH!Z#N{PtW5;mdv z%`GCc=)bX)Y@G=$~9B@**B3O%41(($@f5kr>3oGTei_D*I87Hh+W$ z)t2Kp1J9r?FpgAJE~92RcX=_x<;b404)wiV(YTMA=@U2=^Qap<7xnv)Yaj=s@nJ0E zH91K`7y26Y@|{I3?L;&_B_^W9s6;)AwYVDZ!^s#TrzSn9cjk4Rg#)Mwe2hErY}CK2 zu6WlT#VYof=V?%7Ie=Vj8AYlr-=W@(lKNsPYj6|&deqyz8}G;WQ0M)E>u?e`Sp!&) zD{(8%z-MqezKS>CL7c<>(oaJJ7{x~X8TCl2>1cl?KblE98hjeH#BZZ6)Q^jB5Ow1* z)UW1Oq{K3gy52>+39E=+6I+IP?u%@sF%uo?ggjQ_KAeUJP)q*-mg7gLnT(*$`vSEB zr%^MVK;3XE>Fd!gMqQ@~b=_^Kl}fCn{<^>c2K4d_;3OQ1`opN1j-Xzi6Ordo@4#i$ zc`Nu=(RJ=XPE9r=$1UBc0l$l!jvPil965~@IAt~U*T!sC(+q1-E6{*^U9vv%ZX_wW z7qzrqsDb5BH+Tv)!xvC1@EYoRhfvr15cz^-7!Tp8XngNx{y!@jcp3HfzJq!;!>AjL zq2BIqqw&8{?@HC$;=DU?GyRsegYTCgDPL&KZW|;D$2!`)z&g_!WI6&bowlYs7sRdW zJy<=r_u1<9ie{GydF~g6vh7L6|EzvI-<)wSw5Hh$y-gX@Z98}&VUxafaT}P8TecXN zYEOnH8+rkg>rLU!HXC#Wg<}a5Pg%3UB{FOh)@oNQmTz($ zgjDx{)k2uUF%qU=flaZLG-uLXz73gRq8A8PD^Z+vO(OMX1IZB-iL*}&1@Qe$mllI= zx7D*TsScM3QZ@+dr8VKjnH~&YitR3)AH{j~Ft48R;46*grL{Y4s)K5C-Z|G9S|0nk zY-qe(g21wz=}vBh9Xz@!U(%qd>zSuL*&Y&*7sTtX8QYc#>o#$ut}dZ9a=qS~pZ*2W Cm5iqV delta 2020 zcmYk+U2GLa6u|LQYDKtw3QEi8SQV6hfV5SV2PG}7*kaWZL1Lua?zCOIclWxxx1>mN zRn!=W0%<^!Mj{$D!Ox^>Dm-XXj8z|qMiXLGLV^+u_<o8EU+fsPRtWmv|n3z~O=sad|jEy+-jeevik?`6&`Pd_C3R z@s%4y=F;xEQRH*lk1yp2Xs=r)a)I{#n?!cwPSVtcW|F>cU?H-WRN++IfDDz*I1>v` z@<3H(AI`wHPy-x8swktV8UBQt;U#2EDXthFSAp8U8a2}foQ%z=3$&%}PUQHdH|>80 zr?S56=Rp^I8TInLjau5{Y5&)##W;m}6q72)FI@&pXs<=?p){f1nRc9ueW-U~H|k}5 z6*ZwhQSaKUDji=Cxr+y?EDxdv+KyCN22k(DN2sOz7Mt*A)Z1KL&0K6pop%^-!=tDh zxQMH8GONwNJ8(L#$0@i8OIcqW9&`iSaU~u?J(3e?`xn%mFW{xY)u<(Y2sMy{y5U~b zh4-O;HLoKjmN!x3eTY}%SEz}d!LjdO)0suba?}ZHa1J)&G~9w(`fki%4mFb$0A5r5JQ4Wne1GQ4+tEj&Q*g}V1o?e`UQQFR zC-R>p&!zoupx%`coP%d^JzlOGI+FPyv(z|!j^{fazBL_Q;6$E{jpIkwar=!MZVUX- zajiRWV4j<4u)a;Kxi@s}z?9NQ3yn;)u1P`@Cr*@@W+!o)LgVJG_GP^|_JVHH(9%+E z>U(TwuSt5WiR@!}FS1!1B(d>=vA&6kVP{_Zox}@+N)tvViTX{H4+4#&lgD=0Z#w#o zm&CKJ-(|WO<=TXu#MNe~yll~&jSXzFGch^eNqCzzPT-n+Y)vi-`#f?ntvMUiw@hqz zJf<`{QHPa=G~xcj)%2CyJN+cPhP9wL3HuJ0atI;0}GW zGE=;;ttZ@Oa-kO_#t-Azgp@PP5x&pHLnXC^qKf*^5A%`P*h9gk!FD-$KS^5;ShuPv OvNj+O9W*dhcjjM$L}SeW diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index 9941e6c..54deddb 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -636,55 +636,43 @@ msgstr "Geschätzte Spielstärke" msgid "reanalyze max visits" msgstr "Anzahl der Visits pro Zug" -#. TODO - on move tree editing msgid "Delete Node" -msgstr "Delete Node" +msgstr "Knoten löschen" -#. TODO - theme name msgid "theme:red-green-colourblind" -msgstr "Red-Green Colourblind" +msgstr "Rot-Grün-farbenblind" -#. TODO - theme name msgid "theme:normal" -msgstr "Default Theme" +msgstr "Standard-Farbschema" -#. TODO - theme label msgid "theme" -msgstr "Colour Theme" +msgstr "Farbschema" -#. TODO msgid "engine:altcommand:hint" msgstr "" -"Full command used to start the engine. All other model options will be " -"ignored." +"Kompletter Befehl um die Engine zu starten. Alle anderen Modelloptionen " +"werden ignoriert." -#. TODO msgid "engine:altcommand" -msgstr "Override Engine Command" +msgstr "Engine-Befehl überschreiben" -#. TODO - button in general settings for downloading katago executables msgid "download katago button" -msgstr "Download KataGo versions" +msgstr "KataGo-Versionen herunterladen" -#. TODO - shown on on the binaries select dropdown msgid "katago binaries available" -msgstr "{num} available katago versions found" +msgstr "{num} KataGo-Programme verfügbar" -#. TODO - shown on on the katago binary select dropdown msgid "default katago option" -msgstr "Detect platform and use provided OpenCL KataGo binary" +msgstr "Plattform erkennen und angebotenes Programm benutzen" -#. TODO - error message on trying to download models when already done msgid "All binaries downloaded" -msgstr "All available binaries already downloaded" +msgstr "Alle verfügbaren Programme wurden bereits heruntergeladen" -#. TODO msgid "Engine missing DLL" msgstr "" -"Failed to start KataGo due to missing DLL. Check the requirements in the " -"KataGo documentation, or try running the binary by itself for details. " +"Konnte KataGo wegen fehlender DLL nicht starten. Überprüf die Anforderungen " +"in der KataGo-Dokumentation oder versuch, KataGo alleine zu starten, um " +"Einzelheiten zu erfahren." -#. TODO - in addition to colour, show point loss as -0.1 etc on hints/top -#. moves msgid "show point loss as text" -msgstr "Show point loss on top moves" +msgstr "Zeig den Punkteverlust auf Beste Züge" From f4b38e7f8089a066ba28fcd6f0140bac37cab1c7 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Wed, 26 Aug 2020 22:42:44 +0200 Subject: [PATCH 02/47] contrib --- CONTRIBUTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 73d500b..9b314ca 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -59,7 +59,7 @@ Many thanks to the following contributors for translations. * French: "Dontbtme" with contributions from "wonderingabout" * Korean: "isty2e" -* German: "nimets123" +* German: "nimets123" with contributions from "trohde" * Spanish: Sergio Villegas ("serpiente") with contributions from the Spanish OGS community * Russian: Dmitry Ivankov and Alexander Kiselev * Simplified Chinese: Qing Mu with contributions from "Medwin" From fd67ea84912686c585ccfd86220797d4a21e6ce5 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 28 Aug 2020 14:50:07 +0200 Subject: [PATCH 03/47] foxwq workarounds --- katrain/config.json | 2 +- katrain/core/constants.py | 2 +- katrain/core/sgf_parser.py | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/katrain/config.json b/katrain/config.json index 6c51d8a..c4f103f 100644 --- a/katrain/config.json +++ b/katrain/config.json @@ -17,7 +17,7 @@ "anim_pv_time": 0.5, "debug_level": 0, "lang": "en", - "version": "1.4.0" + "version": "1.4.1" }, "timer": { "byo_length": 30, diff --git a/katrain/core/constants.py b/katrain/core/constants.py index d37d410..f0d880e 100644 --- a/katrain/core/constants.py +++ b/katrain/core/constants.py @@ -1,4 +1,4 @@ -VERSION = "1.4.0" +VERSION = "1.4.1" HOMEPAGE = "https://github.com/sanderland/katrain" CONFIG_MIN_VERSION = "1.4.0" # keep config files from this version diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index fd3ca01..000809e 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -332,7 +332,11 @@ class SGF: """Parse a string as SGF.""" match = re.search(cls.SGF_PAT, input_str) clipped_str = match.group() if match else input_str - return cls(clipped_str).root + root = cls(clipped_str).root + if "foxwq" in root.get_list_property("AP"): + fixed_komi = 0.5 if root.get_property("HA") == 1 else 7.5 + root.set_property("KM", fixed_komi) + return root @classmethod def parse_file(cls, filename, encoding=None) -> SGFNode: @@ -343,7 +347,7 @@ class SGF: with open(filename, "rb") as f: bin_contents = f.read() if not encoding: - if is_gib or is_ngf: + if is_gib or is_ngf or b"AP[foxwq]" in bin_contents: encoding = "utf8" else: # sgf match = re.search(rb"CA\[(.*?)\]", bin_contents) From 341d01634880e69f7c21f04f63ef1c8885a96780 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 28 Aug 2020 22:29:43 +0200 Subject: [PATCH 04/47] komi display, fix fox --- katrain/__main__.py | 1 + katrain/core/base_katrain.py | 4 ++-- katrain/core/engine.py | 5 +++-- katrain/core/game.py | 10 ++++++++-- katrain/core/sgf_parser.py | 10 ++++++++-- katrain/gui.kv | 15 ++++++++++++--- katrain/gui/kivyutils.py | 1 + 7 files changed, 35 insertions(+), 11 deletions(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index 5dd6f62..3b864a8 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -159,6 +159,7 @@ class KaTrainGui(Screen, KaTrainBase): self.board_controls.mid_circles_container.add_widget(top) self.board_controls.branch.disabled = not cn.parent or len(cn.parent.children) <= 1 self.controls.players["W"].captures = prisoners["W"] + self.controls.players["W"].komi = self.game.komi self.controls.players["B"].captures = prisoners["B"] # update engine status dot diff --git a/katrain/core/base_katrain.py b/katrain/core/base_katrain.py index 627a3de..e8604a8 100644 --- a/katrain/core/base_katrain.py +++ b/katrain/core/base_katrain.py @@ -61,8 +61,8 @@ class KaTrainBase: if self.debug_level >= OUTPUT_DEBUG: Config.set("kivy", "log_enable", 1) Config.set("kivy", "log_level", "debug") - if self.debug_level >= OUTPUT_EXTRA_DEBUG: - Config.set("kivy", "log_level", "trace") + # if self.debug_level >= OUTPUT_EXTRA_DEBUG: + # Config.set("kivy", "log_level", "trace") self.players_info = {"B": Player("B"), "W": Player("W")} self.reset_players() diff --git a/katrain/core/engine.py b/katrain/core/engine.py index 89714c8..e352561 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -226,8 +226,9 @@ class KataGoEngine: next_move: Optional[GameNode] = None, extra_settings: Optional[Dict] = None, ): - moves = [m for node in analysis_node.nodes_from_root for m in node.moves] - initial_stones = analysis_node.root.placements + nodes = analysis_node.nodes_from_root + moves = [m for node in nodes for m in node.moves] + initial_stones = [m for node in nodes for m in node.placements] if next_move: moves.append(next_move) if ownership is None: diff --git a/katrain/core/game.py b/katrain/core/game.py index 21ed7fd..daef7e8 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -55,7 +55,11 @@ class Game: self.root = move_tree self.komi = self.root.komi handicap = int(self.root.get_property("HA", 0)) - if handicap >= 2 and not self.root.placements: + if ( + handicap >= 2 + and not self.root.placements + and not (not self.root.move_with_placements and self.root.children and self.root.children[0].placements) + ): # not really according to sgf, and not sure if still needed, last clause for fox self.root.place_handicap_stones(handicap) else: board_size = katrain.config("game/size") @@ -310,7 +314,9 @@ class Game: if mode == "extra": if kwargs.get("continuous", False): - visits = max(engine.config["max_visits"], math.ceil(cn.analysis_visits_requested * 1.25)) + visits = min( + 1_000_000_000, max(engine.config["max_visits"], math.ceil(cn.analysis_visits_requested * 1.25)) + ) else: visits = cn.analysis_visits_requested + engine.config["max_visits"] self.katrain.controls.set_status(i18n._("extra analysis").format(visits=visits), STATUS_ANALYSIS) diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index 000809e..5256c04 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -333,9 +333,15 @@ class SGF: match = re.search(cls.SGF_PAT, input_str) clipped_str = match.group() if match else input_str root = cls(clipped_str).root + # Fix weird FoxGo server KM values if "foxwq" in root.get_list_property("AP"): - fixed_komi = 0.5 if root.get_property("HA") == 1 else 7.5 - root.set_property("KM", fixed_komi) + if int(root.get_property("HA", 0)) >= 1: + corrected_komi = 0.5 + elif root.get_property("RU").lower() in ["chinese", "cn"]: + corrected_komi = 7.5 + else: + corrected_komi = 6.5 + root.set_property("KM", corrected_komi) return root @classmethod diff --git a/katrain/gui.kv b/katrain/gui.kv index 407e970..40ade7f 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -277,16 +277,25 @@ : captures: 0 player: 'B' + komi: 0 player_type: 'player:human' player_subtype: 'game:normal' background_color: BOX_BACKGROUND_COLOR if self.active else BACKGROUND_COLOR outline_color: BOX_BACKGROUND_COLOR outline_width: 2 padding: [2*CP_PADDING,CP_PADDING,CP_PADDING,CP_PADDING] - CircleWithText: - player: root.player - text: str(root.captures) + BoxLayout: size_hint: 0.32, 1 + orientation: 'vertical' + CircleWithText: + player: root.player + text: str(root.captures) + Label: + size_hint: 1,0.25 + halign: 'center' + valign: 'middle' + font_size: self.height + text: "%s: %.1f" % (i18n._('komi'), root.komi) if root.player=='W' else '' BoxLayout: size_hint: 0.75, 1 pos_hint: {'x':0,'y':0} diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 5da0548..678759c 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -338,6 +338,7 @@ class PlayerInfo(MDBoxLayout, BackgroundMixin): captures = NumericProperty(0) player = OptionProperty("B", options=["B", "W"]) player_type = StringProperty("Player") + komi = NumericProperty(0) player_subtype = StringProperty("") name = StringProperty("", allownone=True) rank = StringProperty("", allownone=True) From ef24fd3bf2c633af2f8a359c58f93ce0f54f19c3 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 29 Aug 2020 19:01:12 +0200 Subject: [PATCH 05/47] non-fox fix --- katrain/core/sgf_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index 5256c04..b7400ba 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -334,7 +334,7 @@ class SGF: clipped_str = match.group() if match else input_str root = cls(clipped_str).root # Fix weird FoxGo server KM values - if "foxwq" in root.get_list_property("AP"): + if "foxwq" in root.get_list_property("AP",[]): if int(root.get_property("HA", 0)) >= 1: corrected_komi = 0.5 elif root.get_property("RU").lower() in ["chinese", "cn"]: From e813f97ddc1770ba501580d618e86aed9c7145bc Mon Sep 17 00:00:00 2001 From: Sander Land Date: Mon, 31 Aug 2020 19:09:31 +0200 Subject: [PATCH 06/47] no rank est, fix select katas bug --- katrain/__main__.py | 2 +- katrain/core/sgf_parser.py | 2 +- katrain/gui.kv | 14 +++----------- katrain/gui/controlspanel.py | 2 +- katrain/gui/popups.py | 5 +++-- 5 files changed, 9 insertions(+), 16 deletions(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index 3b864a8..0763dc4 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -267,7 +267,7 @@ class KaTrainGui(Screen, KaTrainBase): player_info.name = move_tree.root.get_property("P" + bw) self.update_player(bw) self.controls.graph.initialize_from_game(self.game.root) - self.controls.rank_graph.initialize_from_game(self.game.root) + # self.controls.rank_graph.initialize_from_game(self.game.root) self.update_state(redraw_board=True) def _do_ai_move(self, node=None): diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index b7400ba..2e9da2e 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -334,7 +334,7 @@ class SGF: clipped_str = match.group() if match else input_str root = cls(clipped_str).root # Fix weird FoxGo server KM values - if "foxwq" in root.get_list_property("AP",[]): + if "foxwq" in root.get_list_property("AP", []): if int(root.get_property("HA", 0)) >= 1: corrected_komi = 0.5 elif root.get_property("RU").lower() in ["chinese", "cn"]: diff --git a/katrain/gui.kv b/katrain/gui.kv index 40ade7f..cc86636 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -520,7 +520,6 @@ engine_status_pondering: -1 timer:timer graph: graph - rank_graph: rank_graph stats: stats info: info note: note @@ -574,27 +573,20 @@ opacity: 0 if self.parent.mode == MODE_PLAY else 1 CollapsablePanel: id: graph_panel - content_height: graph.height + rank_graph.height + content_height: graph.height # + rank_graph.height options_height: root.tab_option_height closed_label: 'closedlabel:scoregraph' - options: ['score','winrate','rank_est'] - option_colors: [SCORE_COLOR,WINRATE_COLOR,POINTLOSS_COLOR] + options: ['score','winrate'] + option_colors: [SCORE_COLOR,WINRATE_COLOR] option_active: [True,False,False] on_option_state: graph.show_graphs(args[1]) graph.hidden = not (args[1]['score'] or args[1]['winrate']) - rank_graph.hidden = not args[1]['rank_est'] - rank_graph.trigger_calculate() ScoreGraph: id: graph opacity: 0 if self.hidden else 1 size_hint_y: None height: EPSILON if self.hidden else root.graph_height - RankGraph: - id: rank_graph - opacity: 0 if self.hidden else 1 - size_hint_y: None - height: EPSILON if self.hidden else root.graph_height CollapsablePanel: id: stats_panel num_active: 3 diff --git a/katrain/gui/controlspanel.py b/katrain/gui/controlspanel.py index 37f1cf5..78bb6ab 100644 --- a/katrain/gui/controlspanel.py +++ b/katrain/gui/controlspanel.py @@ -144,7 +144,7 @@ class ControlsPanel(BoxLayout): self.stats.player = "" self.graph.update_value(current_node) - self.rank_graph.update_value(current_node) + # self.rank_graph.update_value(current_node) self.note.text = current_node.note self.info.text = info diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 1ba0c1d..8b776d0 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -378,6 +378,7 @@ class ConfigPopup(QuickConfigGui): super().__init__(katrain) self.paths = [self.katrain.config("engine/model"), "katrain/models", "~/.katrain"] self.katago_paths = [self.katrain.config("engine/katago"), "~/.katrain"] + Clock.schedule_once(self.check_katas) MDApp.get_running_app().bind(language=self.check_models) MDApp.get_running_app().bind(language=self.check_katas) @@ -448,14 +449,14 @@ class ConfigPopup(QuickConfigGui): KATAGOS = { "win": { "OpenCL v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-opencl-windows-x64.zip", - "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-windows-x64.zip", + # "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-windows-x64.zip", "Eigen AVX2 (Modern CPUs) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-avx2-windows-x64.zip", "Eigen (CPU, Non-optimized) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-windows-x64.zip", "OpenCL v1.6.1 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1%2Bbs29/katago-v1.6.1+bs29-gpu-opencl-windows-x64.zip", }, "linux": { "OpenCL v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-opencl-linux-x64.zip", - "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-linux-x64.zip", + # "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-linux-x64.zip", "Eigen AVX2 (Modern CPUs) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-avx2-linux-x64.zip", "Eigen (CPU, Non-optimized) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-linux-x64.zip", "OpenCL v1.6.1 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1%2Bbs29/katago-v1.6.1+bs29-gpu-opencl-linux-x64.zip", From 76a3b83ad4c4a6ac38c7fed2a360a1b3f7ebfc85 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Mon, 31 Aug 2020 22:44:11 +0200 Subject: [PATCH 07/47] install/cfg --- INSTALL.md | 2 ++ katrain/config.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 8c96098..ef7bbaf 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -25,6 +25,8 @@ These commands install [Homebrew](https://brew.sh), which simplifies installing To upgrade to a newer version, simply run `pip3 install -U katrain` +If you encounter an error about SDL being missing, try ` brew sdl sdl_image sdl_mixer sdl_ttf portmidi` + ### Troubleshooting and Installation from sources Installation from sources is essentially the same as for Linux, see [here](#LinuxSources), diff --git a/katrain/config.json b/katrain/config.json index c4f103f..390da62 100644 --- a/katrain/config.json +++ b/katrain/config.json @@ -66,7 +66,7 @@ true ], "eval_off_show_last": 3, - "text_point_loss": false, + "text_point_loss": true, "eval_show_ai": true, "lock_ai": false }, From be5a588d68eae8fa03178978219b2f363addf437 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Tue, 1 Sep 2020 10:15:50 +0200 Subject: [PATCH 08/47] komi in info --- katrain/__main__.py | 8 ++++--- katrain/core/game.py | 18 +++++++++++---- katrain/core/game_node.py | 8 +++++++ katrain/gui.kv | 23 ++++++------------- katrain/gui/badukpan.py | 6 ++--- katrain/gui/controlspanel.py | 2 +- .../i18n/locales/en/LC_MESSAGES/katrain.po | 4 ++++ 7 files changed, 41 insertions(+), 28 deletions(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index 3b864a8..40bb3e3 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -159,7 +159,6 @@ class KaTrainGui(Screen, KaTrainBase): self.board_controls.mid_circles_container.add_widget(top) self.board_controls.branch.disabled = not cn.parent or len(cn.parent.children) <= 1 self.controls.players["W"].captures = prisoners["W"] - self.controls.players["W"].komi = self.game.komi self.controls.players["B"].captures = prisoners["B"] # update engine status dot @@ -197,14 +196,14 @@ class KaTrainGui(Screen, KaTrainBase): and cn.analysis_ready and cn.parent.analysis_ready and not cn.children - and not self.game.ended + and not self.game.end_result ): self.game.analyze_undo(cn) # not via message loop if ( cn.analysis_ready and next_player.ai and not cn.children - and not self.game.ended + and not self.game.end_result and not (teaching_undo and cn.auto_undo is None) ): # cn mismatch stops this if undo fired. avoid message loop here or fires repeatedly. self._do_ai_move(cn) @@ -287,6 +286,9 @@ class KaTrainGui(Screen, KaTrainBase): self.board_gui.animating_pv = None self.game.undo(n_times) + def _do_resign(self): + self.game.current_node.end_state = f"{self.game.current_node.player}+R" + def _do_redo(self, n_times=1): self.board_gui.animating_pv = None self.game.redo(n_times) diff --git a/katrain/core/game.py b/katrain/core/game.py index daef7e8..359842e 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -207,8 +207,11 @@ class Game: return sum(self.chains, []) @property - def ended(self): - return self.current_node.parent and self.current_node.is_pass and self.current_node.parent.is_pass + def end_result(self): + if self.current_node.end_state: + return self.current_node.end_state + if self.current_node.parent and self.current_node.is_pass and self.current_node.parent.is_pass: + return self.manual_score or i18n._("board-game-end") @property def prisoner_count( @@ -283,13 +286,17 @@ class Game: def player_name(player_info): return f"{i18n._(player_info.player_type)} ({i18n._(player_info.player_subtype)})" + root_properties = self.root.properties + x_properties = {} if "KaTrain" in self.root.get_property("AP", ""): for bw in "BW": - self.root.set_property("P" + bw, player_name(self.katrain.players_info[bw])) + x_properties["P" + bw] = player_name(self.katrain.players_info[bw]) player_info = self.katrain.players_info[bw] if player_info.player_type == PLAYER_AI: - self.root.set_property(bw + "R", rank_label(player_info.calculated_rank)) - + x_properties[bw + "R"] = rank_label(player_info.calculated_rank) + if "+" in str(self.end_result): + x_properties["RE"] = self.end_result + self.root.properties = {**root_properties, **{k: [v] for k, v in x_properties.items()}} player_names = {bw: re.sub(r"['<>:\"/\\|?*]", "", self.root.get_property("P" + bw, bw)) for bw in "BW"} game_name = f"katrain_{player_names['B']} vs {player_names['W']} {self.game_id}" file_name = os.path.abspath(os.path.join(path, f"{game_name}.sgf")) @@ -303,6 +310,7 @@ class Game: ) with open(file_name, "w", encoding="utf-8") as f: f.write(sgf) + self.root.properties = root_properties return i18n._("sgf written").format(file_name=file_name) def analyze_extra(self, mode, **kwargs): diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index 6321f72..c4afc3b 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -23,6 +23,7 @@ class GameNode(SGFNode): self.time_used = 0 self.analysis_visits_requested = 0 self.undo_threshold = random.random() # for fractional undos + self.end_state = None def sgf_properties(self, save_comments_player=None, save_comments_class=None, eval_thresholds=None): properties = copy.copy(super().sgf_properties()) @@ -151,6 +152,8 @@ class GameNode(SGFNode): def comment(self, sgf=False, teach=False, details=False, interactive=True): single_move = self.move if not self.parent or not single_move: # root + if self.root: + return f"{i18n._('komi')}: {self.komi:.1f}\n{i18n._('ruleset')}: {i18n._(self.get_property('RU','Japanese').lower())}\n" return "" text = i18n._("move").format(number=self.depth) + f": {single_move.player} {single_move.gtp()}\n" @@ -193,8 +196,10 @@ class GameNode(SGFNode): text += "\n" + i18n._("Info:AI thoughts").format(thoughts=self.ai_thoughts) else: text = i18n._("No analysis available") if sgf else i18n._("Analyzing move...") + if "C" in self.properties: text += "\n[u]SGF Comments:[/u]\n" + "\n".join(self.properties["C"]) + return text @property @@ -258,3 +263,6 @@ class GameNode(SGFNode): moves = [(policy_grid[y][x], Move((x, y), player=self.next_player)) for x in range(szx) for y in range(szy)] moves.append((self.policy[-1], Move(None, player=self.next_player))) return sorted(moves, key=lambda mp: -mp[0]) + + + diff --git a/katrain/gui.kv b/katrain/gui.kv index 40ade7f..343bb09 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -277,25 +277,16 @@ : captures: 0 player: 'B' - komi: 0 player_type: 'player:human' player_subtype: 'game:normal' background_color: BOX_BACKGROUND_COLOR if self.active else BACKGROUND_COLOR outline_color: BOX_BACKGROUND_COLOR outline_width: 2 padding: [2*CP_PADDING,CP_PADDING,CP_PADDING,CP_PADDING] - BoxLayout: + CircleWithText: size_hint: 0.32, 1 - orientation: 'vertical' - CircleWithText: - player: root.player - text: str(root.captures) - Label: - size_hint: 1,0.25 - halign: 'center' - valign: 'middle' - font_size: self.height - text: "%s: %.1f" % (i18n._('komi'), root.komi) if root.player=='W' else '' + player: root.player + text: str(root.captures) BoxLayout: size_hint: 0.75, 1 pos_hint: {'x':0,'y':0} @@ -560,14 +551,14 @@ padding: 2*CP_PADDING,CP_PADDING spacing: CP_SPACING size_hint_x: 0.35 - SizedRoundedRectangleButton: - text: i18n._('pass-button-text') - size_hint: 1, 0.5 - on_left_release: root.katrain("play",None) SizedRoundedRectangleButton: text: i18n._('undo-button-text') size_hint: 1, 0.5 on_left_release: root.katrain("undo","smart") + SizedRoundedRectangleButton: + text: i18n._('resign') + size_hint: 1, 0.5 + on_left_release: root.katrain("resign") MoveTree: id: move_tree size_hint_x: EPSILON if self.parent.mode == MODE_PLAY else 1 diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 01ddf54..5699a19 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -254,7 +254,7 @@ class BadukPanWidget(Widget): self.canvas.clear() # stones current_node = katrain.game.current_node - game_ended = katrain.game.ended + game_ended = katrain.game.end_result full_eval_on = katrain.analysis_controls.eval.active has_stone = {} drawn_stone = {} @@ -379,7 +379,7 @@ class BadukPanWidget(Widget): passed = len(nodes) > 1 and current_node.is_pass if passed: if game_ended: - text = katrain.game.manual_score or i18n._("board-game-end") + text = game_ended katrain.controls.timer.paused = True else: text = i18n._("board-pass") @@ -397,7 +397,7 @@ class BadukPanWidget(Widget): def draw_hover_contents(self, *_args): ghost_alpha = GHOST_ALPHA katrain = self.katrain - game_ended = katrain.game.ended + game_ended = katrain.game.end_result current_node = katrain.game.current_node player, next_player = current_node.player, current_node.next_player diff --git a/katrain/gui/controlspanel.py b/katrain/gui/controlspanel.py index 37f1cf5..9044bcc 100644 --- a/katrain/gui/controlspanel.py +++ b/katrain/gui/controlspanel.py @@ -127,7 +127,7 @@ class ControlsPanel(BoxLayout): lock_ai = katrain.config("trainer/lock_ai") and katrain.play_analyze_mode == MODE_PLAY details = self.info.detailed and not lock_ai info = "" - if current_node.move and not current_node.is_root: + if current_node.move or current_node.is_root: info = self.active_comment_node.comment( teach=katrain.players_info[self.active_comment_node.player].being_taught, details=details ) diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index 2e84d25..31ea61c 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -129,6 +129,10 @@ msgstr "Re-analyzing entire game using {visits} visits" msgid "pass-button-text" msgstr "Pass" +#. resign the game +msgid "resign" +msgstr "Resign" + msgid "teaching undo message" msgstr "" "Undid move {move} as it lost {points_lost:.1f} points. Hover over the move " From 8eb82c06be300f6500b328c607c3f7a8895713ab Mon Sep 17 00:00:00 2001 From: Sander Land Date: Tue, 1 Sep 2020 17:24:33 +0200 Subject: [PATCH 09/47] pat --- .github/FUNDING.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index cb594a9..e23f350 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,12 +1,12 @@ # These are supported funding model platforms github: sanderland # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username +patreon: katrainbaduk # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: sanderbaduk +liberapay: # sanderbaduk issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 2d321471e1d0c99d8e46c59b31bacb7a1e462a57 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Wed, 2 Sep 2020 11:25:24 +0200 Subject: [PATCH 10/47] i18n --- katrain/__main__.py | 1 + katrain/gui/badukpan.py | 24 +++++++----------- katrain/gui/style.py | 1 + .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 11836 -> 11866 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 13975 -> 14005 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 12961 -> 12991 bytes .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 13772 -> 13802 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 14773 -> 14803 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 15063 -> 15093 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 14915 -> 14945 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 18860 -> 18890 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 4 +++ 18 files changed, 39 insertions(+), 15 deletions(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index 035846d..ee5d2c8 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -288,6 +288,7 @@ class KaTrainGui(Screen, KaTrainBase): def _do_resign(self): self.game.current_node.end_state = f"{self.game.current_node.player}+R" + self.log(self.game.current_node.end_state,OUTPUT_INFO) def _do_redo(self, n_times=1): self.board_gui.animating_pv = None diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 5699a19..b93f6ed 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -377,7 +377,7 @@ class BadukPanWidget(Widget): # pass circle passed = len(nodes) > 1 and current_node.is_pass - if passed: + if passed or game_ended: if game_ended: text = game_ended katrain.controls.timer.paused = True @@ -416,24 +416,18 @@ class BadukPanWidget(Widget): points_lost = child_node.points_lost move = child_node.move if move and move.coords is not None: - if points_lost is None: - evalcol = None - else: - evalcol = copy.copy(self.eval_color(points_lost)) - evalcol[3] = alpha if child_node.analysis_ready: self.active_pv_moves.append( (move.coords, [move.gtp()] + child_node.candidate_moves[0]["pv"], current_node) ) - scale = CHILD_SCALE - self.draw_stone( - move.coords[0], - move.coords[1], - move.player, - alpha=alpha, - evalcol=evalcol, - evalscale=scale, - scale=scale, + Color(*CHILDREN_BORDER_COLOR) + Line( + circle=( + self.gridpos_x[move.coords[0]], + self.gridpos_y[move.coords[1]], + self.stone_size - 1.2, + ), + width=dp(1.2), ) # hints or PV diff --git a/katrain/gui/style.py b/katrain/gui/style.py index dda7081..fdf9108 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -64,6 +64,7 @@ VISITS_FRAC_SMALL = 0.1 GHOST_ALPHA = 0.5 TOP_MOVE_ALPHA = 0.4 TOP_MOVE_BORDER_COLOR = [46 / 255, 65 / 255, 88 / 255, 0.9] +CHILDREN_BORDER_COLOR = [188 / 255, 65 / 255, 46 / 255, 0.9] CHILD_SCALE = 0.95 # ponder light diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 8db5b1561b58cb51633a57fe3edb75644e06a811..71c09be37c4ee6d2d14e2aed03833284f3fe0a06 100644 GIT binary patch delta 3055 zcmYM#drVe!9LMor+@H9LNQxjz`jCK5qLMBaGR907Aq&dVKQyvgifm?DnJ2oCmF6WG z%q~Nsi?)G^4Q!~yW}BLsW29LsAYGPJsIi%u>;2*RZn?vG{qEoM`~J>(Y@dI6zIQf0 zq{i{@3;vS%8wgd+x%SBay@}#}>Z7n5N8kkQxwy zTQJ5s&uya+OT!Kuu+Kb#H`4wCYQdi|8vn*b45vcTjl&SkL_Od%)c8V7!g-j0&maNa z8>n%0!*$QOCJNfoe)QpS)P(Ob82>=+@RIdkM?F{stEqh?YDcN40O{P+e+O#4ndThS z_)_F@3%NxT-&Io3z_q9ytwSzX!%dlKL`~d_+F1v3xh`%zi|aE7QRAG(4#wMV~ z<)DsWCh7r8(Bsc7;5HJMp$1l=CT>L5a@(za7i!@H$mLFOQ-80u52EG;6GeeWaZ?~a zYFxI}^H3X|6UX^$XOGYjf#o)E87jaURBG3w#%)ENeLd<7TdjT!xm>?Fgz69DX_VPy z)I7gA1GWA`Bgj8xS8g58qB5`nwbOU4-emQ5)WqY+<<4=_PA;Mz;5sT$ER)BgAC=jB z)Ouyyl!+zgYL9{@zK+^q9V%swsEjmQe;aDy!>E_D2et4J>NE6F(K=~n4r+dZ`2dcg zUWVF0CF-m3UZN02;Wbo%^)}!`)RVTL0(M&aNhGHG1(n*XW(b3{ff!Uql28wnjvAMX z%51*%7bEL+6qIUeMwb!Boeu~=BUex?f^EfJVKcY5r0kz&= zsKBA5Sw|d;QTqOqD5xVHwQx3S!VF}ND?eFxQzi zW`o&mwxiZNZ1r#PZR%&R7MFVDT{{XPPn)m+cVRak#p?0Sy@e&5(+iSvMXO&iL;b_^Jr^G+xKz~HXIVWTwcvxu3+v{g9<&lO@D-~! zA-_THOVk5(TYH~5gn6__@S^day8Dr2xJAQtkDp!&`U>h%0Xk7%L-+6izFTXL<_(=j z`*_U4xtNJ-QGs_Nr{Y>sFXL%cpx>-Nc5+}t$*A#uNqm<>K|9Yw1ujEgSho`6aI^I{ zm~9wF`!_heW7N+2P)GHT_4`PZ`s2(L)PrT1ccI5|xY-mUuo5-lIaGjZt8Xy3p^x@Y ztiIbkfZD)O)Vy9)pkGlNxnlJM(xvu^sLb4!$@i~-^Jvh*i!lf*Q46gwpGO@{6)MnH zYu|}Fy4|RCy38IVru!ZFqTT4MK>zK?X}Ek;rk~Ct|C;!w4X8y0ZZtnL_n7;THC>0* z2h7XnRg9wlhA9DKQ0t8~(@+_hjH~g^VhWnD$2^GI>DN|2hgx6&^+R>p+JmMBG7*a! iKM9qI+?E}Y5Bq|bJXz6lEul6stmKImDsRc$8T21A*CXQq delta 3028 zcmYM#drZ}39LMozauEdN7U#spgfP+$lwb=dg^Y}KW7g6c8#-proKeUhUTE0qYAUPY zz}dwRx+$qd&<$oVa>|szOfB=mq+qKynVK`KVZA?`@0L6KUeERWJkR&}o#UC(1Ev1K zxZv%Me;xd#@HZTynsfUi{?|)!KlKDWgt2%QZ^nzr$Av})>TwuH-G|dL-|EXShI%DV z#+PxbbAGp#LNpC;+kj@X6Q|JLhYI*3M&a-1!M~7?n@VFaCZjf(iW+|pCgDSP6RtoO zbXBNvnl)rq1}3wU{`KLZsn+ss47 zc>wvi$9Y7tzAK}kfzP2%v;q0J*LWy1^{9y-qE6O|eB41E?7{tDUOMUA_GI#?`? z8kdf`f^5_V3(?P?E9Mc8OHl(WQ4`fk47bhN8&QE+1aomEt1Dmw zDg!O3RQKRx*oVqg3jecJqYu@;2i4w|LjKoM=%GOi=1vRTZ9eL*9z|tliMhh8G+!`l z%(u*sQ1RNV-hppYKa4wYF=^LEGiH_bzm5vj zWbG}elpa8x_^|c&Tm6jHhs;s)pMZWBmJzu71XN%jD&Sn?MRkR!otEGoSZ?(l$Zw7N z1U0YA+WX8wETH`|@_xD;-Z+xr9zoUDV4A-FTPSFOy{K%dJAm1?S&3BPl?tQBdn5WEh7)k%H z<|S(%H-obR8HvCRj7vt1uQ!_tDCmSO*3g66$N=gW>Xfw)qcU(AHGcA)flMT|cSI}+ PZ}%qDdD=hoHBb5vFZCZJ diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index 9d1d6c3..959abdf 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -627,3 +627,7 @@ msgstr "所有可用的exe文件已下载" msgid "Engine missing DLL" msgstr "启动katago失败因缺失dll文件. 请检查运行要求, 或尝试让exe文件自行运行并检查细节. " + +#. TODO - resign the game +msgid "resign" +msgstr "Resign" diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index b0670b5ac0e6d112b8725a5df222436cda08a933..86b01ac29e9127c9b56346ad2036e890d68234d3 100644 GIT binary patch delta 3054 zcmYM$drX#99Ki8oC@Lt3h!;{6FHlORKx&ptnd!`V&G7z58)asgo6TIS-dx#5Gb{5_ zwo1{ZZmG>{O^bA6<-N6HsCmh>Hm#XuqN(fq?LAxU<@ucRJm>cNo%6h~ymDJ*;zY}a zO9MZj^V^=^3yrLWuq*w4+fdw1JqN$XEIf~G@dokg-mX&j}1PH?!z?hA43N`ht2USw#LR(D26<2h&|8+_Cnha!Cah(t?(&i z!tff}ZpDA~LrGqVQmxD}188u^6pxUiP+Q}iO*{wCTkgNlLW zqwPx2Ef|C@a4aVH4O6*fV?{7v2{sQ@gZ@KvVbi98N?U%wVPL#vN zi3-qmy<>eK8tCvA?7xvs;6@Xyhz%>z37$n$`#Re09dz$MLicb-tRF-^;pgaO^m!_) zF|+N_eg)A1==kHZ$Uo&!5g*J!Gq4DabY-k>jP+e;$HT}coaAC8f1nGviB6PB=UcG= z&1@MuUO5*tF+DmrLBWo%pb@S>Q?>@p$fo#wCpz#q=;1tt4tyDX4VzMNoX*h_wEy7f z2y92a91UO=`qm^~ppZ&oK03kcu|XBO(k-X#(1^C8{r5x2rP8|^Rv=@Ukx-^vx}M319~>uGeNC20HA=t8%kdt4Kr z|A6*8i)QE&&cMb*m*`JnHih1}5qTC)p@-!PI#3oT>@m#8O}GF@VSgIkWgTr_&Bch1 zVm_Y1B5cI>u;UkF309z6vLcuKdt(DP?!*(=0W%2C$cxZ3QHBrVP<#Ma;w3zX!?BLP zTrRvDomq3Z7rWy)T!0C@9n1`UL8G% z?)_0Tl3&rSyB1CDl-!b*=ppQaj@KRcV_*CcQxfEW_s6w|kaex9@ z5698NbOjwCwMX**fowFwUYL$$$edv$+HOv~{~{XcV)QjzhEDK7tZzim$o6>u2&Vb| zpQ7ME=g~c^M^l?wl)T>oNlNIBZp8>J#d7qmScvRicnduXcWhfaI}eQO%9 zN>UtB(ebj-?}s8Zu=_B23$+M7)_8*0g zSB~snn1*b7Sc)!u53*a~5b^?r8ztmFlR{Tcl$N5A4n{LE0(r~Agy@f+v@ zm!K1@L?ite&BRu8yuIjn2aq>8)Z$vaJ~}>F&G%?FH$Fj6@mJ^`)uI#qiJtQMc)v}b oexqSQ{3`T@%t(N0>^zV$^ZZW delta 3028 zcmYM$3rv<(9LMp$q8Jys1|)=nBvFW5Bq&H_g%&ktrLEkuXgSB0I9YjXxJMl=Lt8O4 zW*4xjOXdX@X}xX@f*6ubv%t1U1j?4Kpk+%mqP{=hv(;Xn&pGEg=YP)soacG$ctw4M zHxM;tkMW<6zuWoyX{u^wM?(HLj^a`3G1!HX*pIj2Z^+LAL;dwAjG~^7vv8rSKZ_C6 zD{&fb$1pR`YAA%$u-A2Ha-PIs+E1ebp2z8U8DsGp^0P1+r(gnVfk~+Tc^Ho+cq^_# zCbZ3{emic~J+lT1%IGKtVH;{d4+h`>D#KxSe+0F#G1neIRAm&7njnsg?x&*SWjhN| zaTX&#dz{O3=C?8m>bMq_(I(_)uX54O>_!bdfXb`|`B^6y)?nW_2T}b;Q2i!QiAB<= zekrIU$VM&j0rdE@QZCWB64kL1HBdK+VYRM(A1d%M>+}umzRrPFHVm^&_Z(ZOG5ga#1Ejs0ECmCi)i>FqRo0$)PChSyPXqG*&UsPVbZ z1vrEH5>x_ZsJF&jMLUxdW*tdxQ}mZ4TuiCXyv)ERoH0DDmV8eP2w73d^t;%?+;-#ULmPQm`c zo3AIq6ekYVKN&-r-!j~d0@MV>s4w1=s7xzd`&QJzT2vUHt#e7(@N&a}zc$#_=Ucg^*6@KZlU#BQ!&Nll2$IvF3^`$Tg#q)P? zcGTaQ!|_mWPUQ%wZ@!a%da3uMasK!TY3i&WBz-O5F=P$)JO<-7q^s>h9qn;sv(4+G zpoeJ?6<`$g{{iEu3}>YKGfYS3w0u;*=Un?5RHmCyubGFM;5ApTM;-%fbnQM2rrv|Z z@vN7E&Tt5|wPXGp7C6^Tn-PsViagB4MX0ypW#rWC71T4c7xk1kqZ0T6SKyGV7iO@_ z)SpK6-+?L2Zw(am3GG03+4@lr$E11wtxUv+sLw+^%^R=?5240g#(bPibSsI?469dSX~^SZ#pp#)SW7_z^fBP`Z8aE*4XCX@j3M|jDwB59xHG6sE}}9W zLrpl1^mTNzQE?Wd;y!`esnw|Q4LR(;9-d|zCgTZI-G|Dw9rf^>at@=OfpJv7Y`!WA zbT4vhR)QS2ZA2~j0CGCkf~j~B!!eK`GB%g}SB9xHXa_Qpx62Bg_ajN!Le$o-LoIAQ zYJx4O3|~j>z}u*J2T}2kA#bqx@E{Jj_G&(#(bV58qM)a7Kk96JsEPVePxtq({W|hV eu$Vmm!27U-dTFaKfuuy1+uT{cz02iI|0RkO{*p zXuDN+@`(^OlW<2>n2a@Ohaa&KUP5Y*SAM%7FyjV;4C3+cce+zAwM#hbGM%(p9 zk6;M8z$Y-lUzp6RCC)+{E==e{zApWF7X{?xwMqnAb)3;-ObIk8XJJujiILphOTtOFb3!NyP&h0Q4jqFf# zyb@kUVn%dcf`lCxqdQ!MhHN7mku970oU1=pc;r>{D9GNrxhKBavXk!|=fiyHC+314u(02XN z$PSJ5V~}wYVKNCDmZK|Lgs%K$^bD7y1AKtC+Ys_%-?uy0KIS@u;%U zyOfKL*Ar8iKlCTzK*M6iSahOE=$Eey-SLaD{4I3C578ZMNBi%O)}WC)g>K{mI^JLC z#7zjZN1Tq${rzW?up$o~xEI=C5Yi`%LchwT=tR$=m+LunqBqd?@1qN?M9=s@tUreK zJBLQ-DwbgqyGz_pVh)Ksd4|gF!2v>0cw&Ug+pA+vfEnP`OCpds&w))%5j zF&GneoJhhICNK?OLnl~+u5<%B&?m8cJ2od@73-_fg&oCacnRIWb#wz+1@$}cjcMeE zpx=ct1;pPK&7;5-FTsYm4E^G*Kqr0^J(Eerk2tHrADP??e VqZv=nuDp@8H~UUvN5T1q{{hl6C|dvk delta 3028 zcmYM#e~iy{9Ki9n{JeALxXWG6uS3pncPt5Y$*(Ccv&gK;wVn7w&8@oFt@YSEef%+42z_7YiVJko=@NRmVNH?_`Khr_m9{6^?rXp>St}8m7L9P zwm$H0KYyM0`?^M^7XZ1_C7qWQ=bmU1&Q>(Gwxp)1>sT;U6D#1M{0&!O!b(RR1dg|(y7 zc0JH77=#8m3KRZ9DYqP)fi|o_JNl9_!kSqB4m$A1$Q2H9^Zj?R{v6uxDmqbfZcdbo zw(Azl#ppsuv}ONY*?1~i;gr~L1~NvNi>7uV+U`|!?^mOHxFeS9kSm;wUPRyjjb=83 zsO*;;9e|EMrXBe=;wkaPvuFlhL07smmN&=pPPAh^a)o2uT*-MffJStpf3YLxGKiTS zjE*;so0*s%os;lj$CuF+E=N~{1zSfBKkADfsT_+rS?Gk-xqxd zJ5U~nE}#tk)g<$HXu-ov=mZO6gSBX++t3L=iS>t(xx#5QwO68lp$oW;W+a_X29k%i z>y2i1F#3KZGENdod9Yy_8c_urc_q4s2|B=fwB43i-i;1ai%xtPxx$I)Wn>q^Exhyd zWH86cL)&-54CW65;)~(v1Y^)I-c)p@&&B%1Xva0^N;aVZd=%Y>X6z8UfRpHWKcN#h zqFZ|%?bnoar}_JD%Yy^wqa6y7Heo3GH7-RvJb@mnGIXMaX#16Dpc~P>-4);0qy3Je znK^@V@ek~SGgxKPi-*^EFjc$I!*mc0=trD}mvA+f@NyC!!`|4H6V(OBqbr_`{vR?A z9rtxC!cTEHUPJ>g;Ja*nQ9k+a&%;bAco$Y7=O=7O&q6IehV?iK(^>vuEXC2-p4l95 zI-0RLScr>oKE97#u}kMv`x5k%UWI04S!eRUk%zab@K^8v%Q0mSqbr(-W@ajyk=f{k zFQBQeLfgNAw%Zcx_n_k)MECp%?!gmy7MBv$lUSYy}`S{#boki~~HI1HO{a?MZ)4#LUk;a!3Q@hxnP4d|8}$22^LX6Oob zWd3lI2d}aH z8-tk$)qupyDp9M89|o(1{atFPEVcZAQ0XAKLCbx`1C|{Z%Za+^IOVfYE6CQsh$* zD$#(}qW!iOlm9Fps;O}0b;z$PG(?Y}d;1j{=s)P`Z9=61q@gR%LI=)|^}W&Y2I8Gh zIr>2=MKjodwm&g4HaH)>hE9|@ICZ$P(Exj*dp86f;Bg#_Pu1*iJuR&!ul<4injeZT G-Sr<-Zyl!q diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index 06f7b0ec03ee73d0f10eecf93682bd25a76d359a..f5605655cef0df92062327f3032a779e40808469 100644 GIT binary patch delta 3053 zcmYM#dytM*9Ki9zE{nChF6*`~%c|XKk=^aGWhlmAh@m1|X;X_~5tETW}#eLM<;5XP3FJODThWtX?=E-^42mBc`@CvrYG%6HB7fi)Mbb-Cm_Jc47%P<>fArppI z&~|HX)Dt0WrC>z+uqhrzJA8{N_y-zceSCf$U04%F^L}eIqFi)>0xmwk3mvb2bQs!x zH1Z4MxnwYZm_fmY^U#PEA-_<~#msC(J8nlKJAnMc*IZajI2*l)w!ew8m*@!z#4na%8OVcD(;SI`GHHFMP$t=Rd^z7twwx%;H3CxHwTh z+O8sw=eFWT`a@(bT{F_J&g1zblb%A#{e%ttdj z03B}(7c((AIwwKFjxVDTu0d0_5zWZ9_S@aO2^JcAB=34INlQgNKTXbIYXV01Wk zpgsl-U0+zDS=i0{tpipc73&57%?(M6aXmH=qlxMfdoV`20B9 z? zQ@SrcI21jNp5l6RZyWYV4%`9nq~0AJxC}Xmp&XrH4mQKZXynzn0Jk8?4Mm*T+wmdn zx$BOfA40 z3&RZR)tJfrp@sqnIedsLG8{q9NB9Rhz@cOBZkeGWQ70-bmX-iQR9pa#=$4|=%j zkQXYP#4P+9-TSoS>Qfn&UYmH z<)Hx-#(EL9qJA$r-f(oh(P*Z|Yz{L?dzl delta 3028 zcmYM#3uu;A7{Ku}H!qu;&Z%2%YA(x5X1dK@+1l$I1UvQ-+TIRvFNQ2YP)9Z252zjMxe&U4Or-t&H*S@_k$ z#L1krO@V)n{Pp4QR7Yze?CAQxc@%e2?~Mns2e#mKcn-Njr_5wM2Xm+o#T#%;tUrp` z)N8OauEK61B*H5cy3_DR?C^1PFJ{nw6b<-2X5pWhi~k^3=tg527N864kM_R<^Kmlv z!pD&bLoM2GZF@ZtLLCKnv=h^@2_0|*Q}HCa!(Zd`HgsW^VtXo4-BEXRf;?_MABe^) zijGF(Ohm5mAh#^$4^QTS`SIA^ijKR0PSlZ` z6Xl})3S)f)y3x_uynlCAPD2;0j2&kqF+w$(+U01!HR!v44Sk0n#ri(v3MZnc(dU1o znayNXj?0Y>L*q~ALH=EFWqdFX&AfD2Dy+t zwBKMfv&HE1u}GXmsGwlSDs)9P=*pL%?=XP|*o5}0kM-SXpuOnChmk9M7yScy3*id3 zf1U(0P9EC75Hp!S42us&p%Y9%fAMCZJAEp)zkm+hfbL`qx`6G`FVKt~L^p5(jrS8e zaU1$-FQMa7Nq4&6e>MdJ=c5A#B7H(B`fFT)4w#M}sw#A%SjdTT{4{jOi(`ES z-bVdByc3UODQ56{?1Ia1G)~Va|94S%l?Eq1f-Ellj-G`pI0-wjZ39il6SxW;HxRY5PH}a#Ci=nehu!!&3G9r`-d z1D2BCeCoH~96~G49~j6xq+T>AghSNp29sudf*0ySy4;dnST6F`!XR|P_aZ~WRP<~u zK^K--Pr;SfML$J59zf5;U$H%fyt1~?3;D!DDH?bR`l@E3r+iLy0eW~Bp%c}j zu17MO2p`4=4bj8sDQ-dE?O8N%hg-=4W}<=1kaHNy(Fx{a1};K(z7kjCW+b^GpA$PA z??#SAsKydc$;%Wt7hxZ|^Aa5lRso7#pK_2IgN%6I0Ie4!)U-cvE!5I%2%VAco*$=08Qml zq>n0ZY+i%yNihHSN;R$SrSFkDmi~K_4ddYfg%%I*2b8uL!PsRq+%PaaLkR^t&O#%43;Bg5T+GY{^ug_DWc!g{IL?K&gbUGYX#Z-oUm6ty%SHQj zL${zGy1>UV!Cx55r4dd-JC>mjE=0x(>tg#S=)n7sUpU6a`{!f(HT1a@W^tk{E>4t( z_A7|>zG$F>8?gUIHkyXoSR6Y}LMNDsrglEsZ!x;}YtcR28S7sozi=sf1HE61)tK4l z=yQ3|KIr%(8W>Tfap+c zMtu|-KneQRBxX~nMPUv)!Ti`^J-X6zbixC%{UkDHs6-qj?Q}9MUI&cB{Kp*6pFbw@F7o!tBhaRr!=tS?M{Xaw(T8{4V!Fc~W z^tqqV3|+_PF_q{N?J1N}=!2_~?F`>z9$rNU%;JPSi|uhO&ckuoi4)Zm7hxMbgdVbA zVm+1bZ!78@@c|ry!*MRUz?0eJe*}d}8aiPw!ty_%325YV&@-_LU&XaJ1zXbTp*uo& z7pGGHrbTkVK`oQt{LxrQdnvw#ThL5(&LK1ASa0%_#pez4{Vh%dNRAhU@EaVu456}heLJoR3 zh$Z*~lAJKCAUWPEnCtt$k%AK*LNjp!$$q#VZE|1oes9d9eGq!;r{IIQ30+tvI>Dcq zi*33k->QLVW?n~M^LNlgz1Vi<4=X6R(zVF8hMm|M&m-F(((g~MxI3EqA~fl!UBCb|Q=<#XeRo=2lKHQ8{&L4Q)|$1_VpnDrs@<8zSn1?m(Yb=M&7D$BYG2= zE8Ie#>&ii}Uw5?L7Y$@!bO<``2z2kqpqUwmYw*S46ii7&zK^D|9cEzx+VK%IvQe@A mbaYa5COYsu^b@|Md~@9=>!eH^Ke_y$%rm*S3*Q!=zw{iWIeUL7Ljuqbn>!E3GI*Y)qq;vs#gx&2TO1{qZ?l>^}E(&bjC3_ndp_t$M%8 zyW$(uV*Ca8-OcZ(vC5fsMEq|8$xia|*o`qbfOq2W$Ymjs!MqQBapf75?a+51}SD?8-;et5y_^8X$q2o~NPu%W@W= z`dNfrwuIYw#) zda0-_$U;qU0ebwbgj+1GMpdjtHPl1;uqIdDhU)lTG?OVd=S;{25O+O+%%9M zRWHTmXQ38aFoFHo${wa*94>PeS0jDcdQ@m@Q1!N>_P!Cdhi|+5hsb3YoL5oLZ=xa_ z$*k1Q@615;zc7aQYsSmmgQrjts70-Gx68M>dTvd;I=+f}4R4|P@lhyKQSE0t z3-K=UMW_Xoq23yA6NwNKTTlbkxC+gvnYN<_JnG8NB4b%UDzv{k|3ocd1Qn5R8fhX4 zsCv^;k4SW{4tk?N7vJ3VP z-hMslO#LLF>Zf2N<6DM%@E~e{g{Uvya@0yUxbiww!zR>9_M;~7j`IUl#JW)nxPa>K zGHT!<)YcB8+KndMVS4{3kWj~os0L|B9m_*~jZ07smZA<-8ET*!RQ=tkiS9$~?P2%4 z3)Su`RAdJ5S-g(ZaTTld3Q07OVB738reQy-!x1dU7*1FlZpJ4uo|BZ1)tHJ$QHSfI z%U{Q2@^O5BAHW=3j2lrCJcUcKCz1HyOJXX^(m$UisFhcs&cb%A#hthjL#g!89lR~L zh5X4$!49(~2fy|6F_-dHSdY!9Ncoe@-oR<7Px@!51)onM{x6akq(E;$d2%ph>+tp= zL>(RvwH2>8_n`K&8P%>8wS{k?>c59-A3&XzPp}<(u#5$4PBB|czR#ONs3<5*C4^Wy z)vOA)O*4BGe`7z=F`o^agk>`r5MQ{531GuaKHJzx7`4|!8NtK*H`2AmW(HT9i>%R# zQCs^AD&k%(i6|1Uq4wqw5^W2h_OuVx;1A@oQTGK`o`qW398?5~Q7d19TKP&>UXI$* zb*PYgsJEdRqsZER5}J7jDue-4N8QNc>`SDg-NNNKZdP!BQe=B=EpndhWz>XTM-I3h z#!Ywz36AAu1^ZirDdZb5Lht`k5(>pfNc3&MY1zREO+$9UvQVdf1EBR^$?Y4fqlTTG1|4zQwr@{p8zGdwc?U z5v&h2;SuDUWFd@}hDn%?MHqt>s0h`e+P9%1bQ1MCpUNZtN}QoU6F85&P1f)H4jID+ zPz`+?0M$!C<)@$~obJp-^_PR%^8!>v7GWzcLq*~SDuSW&_&&yyh(%SLfm&I<%j>zy fA9I$XI^KXfWLu8~A|4MrmJoj_<=D;K%cK4SG#?a)kwcQoHaE(MaI7S6<F zhiO^nWo~Li7d0)j)r_H(m6SQ{X04%)R5r83zCZrYmOGr!d%ryId;WGbbT6I1Xy@>p_oD4&4|vXXyupWVD@IZNBWl3kF$Vv}WQ-s~(nerE%t9?N2i5*wOvNfp!uiOAwg%O1 zV{bk%+e1P-I)stfj_U9OhT%oj4lj9q4{Bip7)|Ags2!!DCK$s@^#!Q$CcCAm_A`;k z=J1MPeyb;;hD%X9dI@=K1208p8>-`e)XokgkA1_7wb(Ci7pi>^s$DD@Z7dztE+2IS zlTiztfdPLun^z*%p&BknbzF~(Wm~;`A8O!_k;lH~rTU+}ybIMYj9E0%U|yOi6V)!) z^LL{*S~`gH*Un~9FaWE)VI69M=TV_uhidma>g?Y}o#6+bKZZQ^o7;`5@6T!!*-oc|iCR$;cOZ}b>Rv@{EQUdJR7t42 zl!+QI8wWDK6_L6` ziNguAjyMjZ_5G)kP{kP3z`3Xn6OcYO9rdeRjhg5w)a6=$ny3-g{vFgpn^9-{h1Z`% z^*e`(&?T(H2zD1tBGEuX9zZqh#(eC{&C=y6;H3@^;4wUe&)`~aR5AA82prGvE!V-S zP#dblOk99PxCL*;4%C9fhZ6r163J|5BvzpYSd7}qE2uNvigR$M8^!-rIej=9e3XTMIGHt&)1^bHQ;Bs63^qbAe|deq9B6{$BtUC0+U9Wt-zYmTui(` z9Gfuj=1{w1WBDy0KQ_zk6#XxcGi$@+#8*4rlpVUfJCM_|Pf#KM9tooTiCSO~ep{$u zD8^7wh}!u*$QrEN%NyJkND%B*jKlX)5&P6V>b9dMIO+NG7)SoH8Y^Gh1MdQvn8nhyFK5ETKF|L;`UJcB<%hE zN0HE(JW#osWCaU%Fg>K;Gt1yB3M%4J* zG2njLaT5Bax`GyJY*+bs)DA~@KHKxfo-ajhU>0hE`8XI?<3!wyv3T0cJCXZm zeF}-cI^-0FCY*wO$=~n!GStKsr~#`{cV)5HH==$}notoridygq9EWF-xh$IV(mYd; z56mi2N4uzq^H+y06v*9f3n~Jiqb^yS`xO!#`_}8D?hLhyNA*u}N23;==k+D-G}K1Q zaUVXRgjP0We5k`MsDZ|#8s3N6*=&r*xu}5`dHovqEu2L8f#zKUABqgCnLDrf-=t+3 P{bxM>tkO#g9}W8t59lNU delta 3028 zcmYM#drVhl9LMpmp%4lpB>WOdKoE3-2@;?r8Z*;B*s`cr42IL0TWZoGtI>|;C8ulR z!nIgxu9jwMD&?&;V$58ttc+ykWm;Nf_M01-mqdDh_OL_xaoZkYP?gScs; z6jZxRFHb}TS~iURS7fuOxD%_qVGS~dEkdQX5!G%LYVVs+d$`@ppCOlZx))LJ|3PIo zj#a5&ikpube?}tt*NUtB#R60YUO`2=-pgCOybIN_4Y}-FZi?hQY5`%?M143CQy4^< zEkunslbbT}q`NTSK^>Q&B3z3~Su-jlTmAhG)WC;Phx0qsz!y=U;SJO{NmR-#RR1D( zDvqE$6BR%m>Z=Ks@(|5K18RasZ}0|crSGC9-0$_rkh!c2mD)@0->3j?qcSp>PFhF^ z)ov^*vxTVl(~)rktK>lq>rgAIN3Hw?)E)+?0XCu9ZT0eA)Idj26CXn^`@!u-cENhF z|MO%pjT1t(&%`+9w|svw1vSA8)Gyv+s7M!k{c=>tji^XAqZaU?dkB@Wqo@EnQRAIK zO&msT?R8YYDAFCP?|&E%8aNfzAqQz=C8%HHN>qnOQHQDyHBlp~{d&|w-$w22NB+JI z)$ceeGpBGdUcqTtOO$~gw(y{aXK@n#i8@s2+|;2IzrpwMIeeazREEFfD9qw_mTk8R zRHTn%4%T5QzJ~euIcmXStiZlh@}I#&1z~A`d8kO1p$_FboQoUX9-KIUt>G`#Q`E1y zCz7f2sD9V*ejLoI%J3mnW>=!xZ$SN|UqYRY@F?>C1rPdDr3sIr_UO3#6Dpz$s0qTT ztr?IJNp%R7xm;AcBGmhGFISqFQ4ksD6I8n{BzblVbM^g?EsRY3 zFmf(z0jl9@?2izODeps_=5FM&OgxRQ+6cq1Qi)Nz^x@#@~P(FFS~V zeyPszpq2iH8lcC^H&H8&A$+|Lp~~4_EOV!kCq@7O diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 81f5789..26cce38 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -666,3 +666,7 @@ msgstr "" #. moves msgid "show point loss as text" msgstr "損失目数を候補手上に表示" + +#. TODO - resign the game +msgid "resign" +msgstr "Resign" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index 1891a074ea499f526942061d498edcb8d53fe967..b637b58912b41421e721f51c7ce3203a70648690 100644 GIT binary patch delta 3055 zcmYM#drX#P7{~DoLD7(dfM{xR$iOlULh(SD7~;?(HPT$-p^;+w8Vf4dT2E|gHcuPH zWL8@y9jHVaPO~AYxf*WCTtjBM(n|Y7X68J_l=c1fUR&<*`P}Ejb>Gj+cQxl~f?pD& z>WzQj@P8Eld-^M9))w=>!$=+^KNP!g2wueDcpG^vWpFs3fr;evF%?TazZMh7*J3o* zVVqfDJ4nP+(BuscxX17g%1@&PynwOz52j!=8Im>{qi`H*f!V0`#W(^NV=~qt6WZIT zb`AgK1G8ol+R;HAgq^4kr!W#Pp>}x1>-$g(8^~xXPeSb|6*WN?FV*Lv#w&E^qS`-+ zJhp;YEc06x2{n8jwWE#5WA(fgnMPE{y{MfXLLU2x7i+QK+{>u;eW-SEWVEq#RJ&Z% z5fq{pxBvtGTRE>J451pf`M4!4MV62UPFa;GpgOYsI&hNb%y&r|0D9)AMQ0&{Qy>@$c{qw z%XAA+jT*QEbve(X2EK;+3roSI_6EC9D{Vzhc*M)QkvZ*8RA_tMC>m)4aj1xlKrJW>)ouzZ zvNOGY9x_f~hzKt*0LA2rd_s9(M{s2#uQ<=asceumo7UR3`hZYL^oXHXlth#K!I zYU2KcSw|d?gZ2H7AfbvZ)WA8Y4h2XbD@FY(SD+?(4t2R+K~3}ys{Kc(g|?#3_QlH&Han_E^VO^-mT*3;xi7T+2zf=<<%)Z5C zs%I9Rap~yr4wvIp@-N|L+=E)sL#bxRaVhGjeS8}6*Gh8II6r(8b!p;ht(~W!&M*rV z!fY=uKrX(Oq9XQ;msg?M)uP7TirPRE>dag5D{RLbSQTWLJwc-KZq5bUFg=15kKy+j zPu#;_Jj%yp@rQ%_=&|8;HTRm$BEO1r>Y;x3IR0MXj{Cz4%N}n=Q!7FpK?pfr+k|Pj z%k#le63k_1P$7(%5FQ{2)5&L{R$hYINg3+MmU?*|#*+WQ{Q?!i1D-$R`QxaFcDWbA z<$>MsfMMD6Sa)EPFQj^cgP-DyEB=m$*0E>wiCqsE() z9p3Ot)cvzfBy?FmMSULUP$9dH+#5^I34fNkNRaGdoQ@%!jbEZByoxih--F=^9>H1U zD^c~$sJqeT`3}ka)=fe?KaU)r^`Uk=jyUIGA!;G(-0i4H>~jyIzMi9~iEg7J6Eo2- zGb%DE$d_v4QAax)1MZEjCXs~or~#T#6YNJ_ns(ILpG4h-vzUMvz5W*RMOpHs@D3-U zZhs->;}VR)1{{KoI1l$tBK{gEnr&+0;iwR0q85;gns^!}Vi6|eBClVAI=X7l@Amq= zIF0fSEX1hE;RP3CiTWcSp6#4W{I#Q_6v$503V%i|s0S6wUbhdIkncylwZLWWN;iZW zrv}wO@cb6fH=rW(3D)7^dETImZK%UCR0Kk(BY71Sfvu>H4XAdlI1CS?B612}#7nJB cF^dL8u3oja^;YuY^Z^T=tya1$@2|*z0W1kF82|tP delta 3028 zcmYM#drVhl9LMo5!%JR}i^xwD10IpL2e;SDvg4 zF2?n$G5$63m&D)Y-l~}$8t}g%iVf6o{i=HEf!S^fil_nmVH0Y=X^g~+s0e@d=N+hxb$WXwvnrx!)B+)HdOjL8-y}B| zHP3A1vJ!4ltZ(HM)NvUqqUVvzHgQvCwxb5Vhl=bla@k34?7_Zs+fe;GQ2p+p0*j?l z{nAiJFbTE6`!V3pin$HO#i))eQ3LgmIc%%9??Fxc0dml0Cd=EiXTifj%Ici{r>xEPtkoUOee}-Jv>Rv%T{|A-X zf$U1-65I^b{Ig=ozjnO9A3TQ2z>BCztG&M4>xWPSn~=-Sa8o4hs10~O6_&`CMtkCsEqVykTw!R z^-D)(HWT$cADJhxVhZY5j@r>m)Xtwnone5Qpa#{i*6W8+6CFn_dG~OyHIEQp+9dz zjcY+=<~%-$H}C;mM3g}Rg?b8#r~}91ZPdhLc(bZ;D!z|j;VN9to0NyY;AkAl@2nOs z!c;875x5p}aVHkx56ET7L@^ns4=4XqDJ-LbO<6s%hMhpA>>Mt|cC5ex{)d_nVYVM1 z)pJ(S8Ry&`j<5))QD1_a@om(GMkSL4EJXdJC!~ZoGAxDse@R0Y4f+Z?QIU6}&M=12 zN?{`Q91ZeEKB-{O1u4}|(W&gl=H?-<9Ifg8t%H8u&b$*fVeEb3w>%m37388OEv8atyxa(1wsCDjBf_zcdg^F-Q zR`~57i@DTiqcXSwWASyIhqb7AZe)>vEgV6(njjjrfh5$zX&8qY7?1g=?|UJt-y7b( z1E*6zh%@mjYJv2e@DI;4x&cJ?U^+DHp3g+IA%xQO~?)Pgg~x18h7 zMNL?W8eie{Ev$RCNo`t=skH!p~ z?&{UplX@-2VFMEhmV~n@eb~PhZ^t~Ov1l04dbX#w1F6dd8h>rL-n7C z0i1`axDuJr)}#7uyIuFp4p2};M=&0vs0YqrH~bwH;dR%33$?HwjHdg2P!VOICdlEU z_CnNnCC)Nb|JlgTD!C*vztvDs$LCNHtwVmcg^Mz?8};BpRAjBl&(3gRE%vjs9o7F9 zs$Vh{1vUuPuK=|LC8z~fpvRvrkvNzrRX4Jr+B0oFLMeS|wemm;9 zZp@;I`f|}k*{FWQUA-6;XjxD8Uy(h^jUE_w9haddSc6LKMpVC7QG34wwTBeqW3N_JY zRR5i*g|?vf_?T<|2KC$}REDl&6~+;rH-o~{6pHaP)M3(P1oXq(3&3U6!`O*m;!2Ei zqNZRe-&rl_WmLrbuoPQxEZ)FMETq!{+=kkcjv)D;MgZ{fyPC62=!@C%Od~z6aut%Wxy$@ zLo;o#pR!q~h!&wz9YN-{)y}O*aCQ)NR-&jBUv}-CsMjuVm)|}DTc}UN@yuu55WZ?y z%JQqZaSm7EJ*gDi~5-!N&WaI98%$DOiRz0Yz*-g^5g!+K{i3ryh_!Dhn|L$en zJ;)mD43Z@K3$O#H$9)${Se1K%p;zyHy9D^FT4s{rt@db>c z-iC@XW-G82`{D?Wx=#I63}8K0;y%>bNgU_Do-^NiW#>L23whOg@^EeTQ zKEyWxYmnWrov6saMWwh6C*XC|))f`|?G;FhZ9WFE8aa2i0X0q&dLaszD5PUYqhco zp8q~?B7Xz8@eV2zCs2{LVOQ*M-oPc)Z=y0(#r~vW4Qc^vQO|F69zgXwh8i!5+Tsg% z4KvFp`72JE?5{8fwKtPchw)id>YGuA@dysVE2s#P311m2$0zaemd1p+@!cX-)h(T= R`}1Qfo>-ys-tjT9{{b|(If4KH delta 3030 zcmYM#4NO*59LMoLJV>D^FCkBX$cv#6VTz(AYJ?!5V=dAVTNbo3%cRg0O6!*8W|^ge zEmNVbwj^KD*cwodnKLFWQ*$|EGA-G{6|&5-&9v{2d$!!=e$Kh){eRAR>~09z+YsXQ z#)fS({b5E?kco6J8(GPzeRQUBaXy=jK{x`$42on3=>fkOhMJ3h6z}Targu> zpuLEyw_zynnKhBniuPdycA^>_!vOZ8R`|0kA3#m)n)@E0SFI=tH9(M;%EzPno9xU( z^;3jA_8_m3jBiyWRIvuNqI%@9^}H0BMpVO(Q7b!uJa&W^bFfp+^Qig*sCqY03ya~S z>WxEf!DQ3~3((`w%6Q#|i%}J8Q4Li{AGXDP{}9#je&n&kyi|VDeLs(CcLg=jFkTuc z9#t>Z{(Q3*P`mZf!h1cs6G6|8VIWH^m9 zkszvG1}d^SsPcTIAJ582sA3grMzyG!uSV^mhw5M(s$R3pA3$}~ff~3AdF%)0ugEUg zzc_R~=}i3uQT0A})TZCHaa`*jJRKqQ(mFz-IV2`s66|tkJ1)N6p zcMdi10BUQmq1puqcZBYLGzoQ_fNC%vsbkYozs6;#1`nYQRTXNWwW#_VQ4`&X+S|`u zc_*sfaa3e_@F^U`2k>E5>E)ByO+tsLAE#m{nV|{ba`I((9lyjEu#J;cirM_WYC?6W z6*piZ?!?)60jn{YN{`@cs4eNmN*qii{tHOV=YO7i@I4%h-=IR(hg)$FH{t6^{3e9Z z36<89e&Hg&*&frc;ltNhhm$kR zc3?}USuqx6nf-#B?lxP2wM;uTl>ep)*D~_qIShg;ruYM`X8*G3_#I>p_7xH&JCE8j z%jGJR-onjGOKs)|tq6?mr18XHTML`hj0y9XN^nDb!X3W^m#$5|w`w@4~I91sp|TB=1Twar#R`mO*~%})a^3%C5=7Ddz!FT)^E<9V9megr4%<+-A#ax1N^HT=n8Z;p z#3`77^;nG!sIzkwbv?u8_}4Rt+L{TN&-k{01bx}ts0kdyc^G>i=K(8`-LQ?Ql^;fh zxEqVG2eoyn`F?pGYQREF#0uoR*-BJD?_&WTM=wYs=6*l)nWzCuQ4Pycds>6q>ou5) z@1n{Ny8L$-NB%PET7}WOLOcbd@EJ_Om#`9dU(T@K`T6hp?Jpm z6D}iv4u>MczQmI+M@`^qR0Qjtn^E<4qxw6D+S;S|8-^D96TXa^U_^e2zbBcfL--gf n Date: Wed, 2 Sep 2020 16:16:45 +0200 Subject: [PATCH 11/47] child move --- katrain/gui/badukpan.py | 44 +++++++++++++++++++++-------------------- katrain/gui/style.py | 3 +-- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index b93f6ed..4c4221a 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -409,27 +409,6 @@ class BadukPanWidget(Widget): self.canvas.after.clear() self.active_pv_moves = [] - # children of current moves in undo / review - alpha = GHOST_ALPHA - if katrain.analysis_controls.show_children.active: - for child_node in current_node.children: - points_lost = child_node.points_lost - move = child_node.move - if move and move.coords is not None: - if child_node.analysis_ready: - self.active_pv_moves.append( - (move.coords, [move.gtp()] + child_node.candidate_moves[0]["pv"], current_node) - ) - Color(*CHILDREN_BORDER_COLOR) - Line( - circle=( - self.gridpos_x[move.coords[0]], - self.gridpos_y[move.coords[1]], - self.stone_size - 1.2, - ), - width=dp(1.2), - ) - # hints or PV if katrain.analysis_controls.hints.active and not game_ended: hint_moves = current_node.candidate_moves @@ -473,6 +452,29 @@ class BadukPanWidget(Widget): width=dp(1.2), ) + + # children of current moves in undo / review + alpha = GHOST_ALPHA + if katrain.analysis_controls.show_children.active: + for child_node in current_node.children: + points_lost = child_node.points_lost + move = child_node.move + if move and move.coords is not None: + if child_node.analysis_ready: + self.active_pv_moves.append( + (move.coords, [move.gtp()] + child_node.candidate_moves[0]["pv"], current_node) + ) + Color(*STONE_COLORS[child_node.player]) + for s in range(0,360,30): + Line( + circle=( + self.gridpos_x[move.coords[0]], + self.gridpos_y[move.coords[1]], + self.stone_size - 1.2,s,s+15 + ), + width=dp(1.2), + ) + # hover next move ghost stone if self.ghost_stone: self.draw_stone(*self.ghost_stone, next_player, alpha=ghost_alpha) diff --git a/katrain/gui/style.py b/katrain/gui/style.py index fdf9108..df3d8f9 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -63,8 +63,7 @@ VISITS_FRAC_SMALL = 0.1 GHOST_ALPHA = 0.5 TOP_MOVE_ALPHA = 0.4 -TOP_MOVE_BORDER_COLOR = [46 / 255, 65 / 255, 88 / 255, 0.9] -CHILDREN_BORDER_COLOR = [188 / 255, 65 / 255, 46 / 255, 0.9] +TOP_MOVE_BORDER_COLOR = [10 / 255, 200 / 255, 250 / 255, 1.0] CHILD_SCALE = 0.95 # ponder light From 1bf8485c3db6d3a95a440bbd5bd10cec2a5bb74c Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 4 Sep 2020 10:26:57 +0200 Subject: [PATCH 12/47] test actions --- .github/workflows/test.yaml | 6 ++++++ katrain/i18n/locales/de/LC_MESSAGES/katrain.po | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2fb049f..80b17a8 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -4,6 +4,12 @@ on: pull_request: branches: [ master ] +only: + refs: + - merge_requests + changes: + - katrain/core/constants.py + jobs: build: runs-on: ubuntu-latest diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index 81cd8c1..fb18d0b 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -637,7 +637,7 @@ msgid "reanalyze max visits" msgstr "Anzahl der Visits pro Zug" msgid "Delete Node" -msgstr "Knoten löschen" +msgstr "Node löschen" msgid "theme:red-green-colourblind" msgstr "Rot-Grün-farbenblind" From 16675ac2ff5502dee386d5e1472b734fdb5f6f28 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 4 Sep 2020 10:30:52 +0200 Subject: [PATCH 13/47] test actions --- .github/workflows/test.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 80b17a8..ffc4e72 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,12 +3,10 @@ name: test on: pull_request: branches: [ master ] + only: + changes: + - katrain/core/constants.py -only: - refs: - - merge_requests - changes: - - katrain/core/constants.py jobs: build: From 6a2ce7d9ca800b4eafbe93e051d566ace786320f Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 4 Sep 2020 10:33:29 +0200 Subject: [PATCH 14/47] test actions --- .github/workflows/test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ffc4e72..c1e6ae6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,15 +3,15 @@ name: test on: pull_request: branches: [ master ] - only: - changes: - - katrain/core/constants.py - jobs: build: runs-on: ubuntu-latest + only: + changes: + - katrain/core/constants.py + strategy: fail-fast: false matrix: From 3fd6057f548f06fc913e72efd46101d27bf7cb46 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 4 Sep 2020 10:34:44 +0200 Subject: [PATCH 15/47] test actions --- .github/workflows/test.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c1e6ae6..c86edc3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,16 +2,12 @@ name: test on: pull_request: - branches: [ master ] + branches: [ master-disabled ] jobs: build: runs-on: ubuntu-latest - only: - changes: - - katrain/core/constants.py - strategy: fail-fast: false matrix: From e9593b6bc6d85f0e0486668626ed5c7f9e2f36c2 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Sep 2020 10:57:07 +0200 Subject: [PATCH 16/47] spinner --- katrain/gui/badukpan.py | 13 +++++++------ katrain/gui/kivyutils.py | 29 ++++++++++++++++++++++------- katrain/gui/popups.py | 30 ++++++++++++++++++++++-------- katrain/popups.kv | 7 +++---- 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 4c4221a..535970b 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -452,7 +452,6 @@ class BadukPanWidget(Widget): width=dp(1.2), ) - # children of current moves in undo / review alpha = GHOST_ALPHA if katrain.analysis_controls.show_children.active: @@ -465,12 +464,14 @@ class BadukPanWidget(Widget): (move.coords, [move.gtp()] + child_node.candidate_moves[0]["pv"], current_node) ) Color(*STONE_COLORS[child_node.player]) - for s in range(0,360,30): + for s in range(0, 360, 30): Line( circle=( self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]], - self.stone_size - 1.2,s,s+15 + self.stone_size - 1.2, + s, + s + 12, ), width=dp(1.2), ) @@ -520,9 +521,9 @@ class BadukPanWidget(Widget): stone_size = self.stone_size * sizefac Color(1, 1, 1, 1) - Rectangle( - pos=(board_coords[0] - stone_size, board_coords[1] - stone_size), - size=(2 * stone_size, 2 * stone_size), + Rectangle( # not sure why the -1 here, but seems to center better + pos=(board_coords[0] - stone_size - 1, board_coords[1] - stone_size), + size=(2 * stone_size + 1, 2 * stone_size + 1), source=f"img/{move_player}_stone.png", ) Color(*STONE_TEXT_COLORS[move_player]) diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 678759c..f03b1b8 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -205,7 +205,7 @@ class IMETextField(MDTextField): self._imo_cursor = self.cursor -class I18NSpinner(Spinner): +class KeyValueSpinner(Spinner): __events__ = ["on_select"] sync_height_frac = NumericProperty(1.0) value_refs = ListProperty() @@ -214,9 +214,8 @@ class I18NSpinner(Spinner): def __init__(self, **kwargs): super().__init__(**kwargs) - self.bind(size=self.update_dropdown_props, pos=self.update_dropdown_props, value_refs=self.i18n_values) - self.i18n_values() - MDApp.get_running_app().bind(language=self.i18n_values) + self.build_values() + self.bind(size=self.update_dropdown_props, pos=self.update_dropdown_props, value_refs=self.build_values) @property def selected(self): @@ -245,9 +244,8 @@ class I18NSpinner(Spinner): except (ValueError, IndexError): pass - def i18n_values(self, *_args): - if self.value_refs: - self.values = [i18n._(ref) for ref in self.value_refs] + def build_values(self, *_args): + if self.value_refs and self.values: self.text = self.values[self.selected_index] self.font_name = i18n.font_name self.update_dropdown_props() @@ -269,6 +267,23 @@ class I18NSpinner(Spinner): item.font_name = self.font_name +class I18NSpinner(KeyValueSpinner): + __events__ = ["on_select"] + sync_height_frac = NumericProperty(1.0) + value_refs = ListProperty() + selected_index = NumericProperty(0) + font_name = StringProperty(DEFAULT_FONT) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + MDApp.get_running_app().bind(language=self.build_values) + + def build_values(self, *_args): + self.values = [i18n._(ref) for ref in self.value_refs] + super().build_values() + + + class PlayerSetup(MDBoxLayout): player = OptionProperty("B", options=["B", "W"]) mode = StringProperty("") diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 8b776d0..53f2009 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -412,8 +412,17 @@ class ConfigPopup(QuickConfigGui): self.model_files.text = models_available_msg def check_katas(self, *args): + def find_description(path): + file = os.path.split(path)[1].replace(".exe", "") + file_to_desc = {kg.replace(".zip", ""): desc for _, kgs in self.KATAGOS.items() for desc, kg in kgs.items()} + print(file_to_desc,file) + if file in file_to_desc: + return f"{file_to_desc[file]} ({path})" + else: + return f"unkn {path}" + done = set() - model_files = [] + kata_files = [] for path in self.katago_paths + [self.katago_path.text]: path = path.rstrip("/\\") if path.startswith("katrain"): @@ -433,11 +442,14 @@ class ConfigPopup(QuickConfigGui): ] if files and path not in self.paths: self.paths.append(path) # persistent on paths with models found - model_files += files - katas_available_msg = i18n._("katago binaries available").format(num=len(model_files)) - self.katago_files.values = [katas_available_msg, i18n._("default katago option")] + sorted( - model_files, key=lambda f: "bs29" in f - ) + kata_files += files + + kata_files = [(path, find_description(path)) for path in sorted(kata_files, key=lambda f: "bs29" in f)] + katas_available_msg = i18n._("katago binaries available").format(num=len(kata_files)) + self.katago_files.values = [katas_available_msg, i18n._("default katago option")] + [ + path for path, desc in kata_files + ] + self.katago_files.value_keys = ["", ""] + [desc for path, desc in kata_files] self.katago_files.text = katas_available_msg MODELS = { @@ -449,18 +461,20 @@ class ConfigPopup(QuickConfigGui): KATAGOS = { "win": { "OpenCL v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-opencl-windows-x64.zip", - # "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-windows-x64.zip", "Eigen AVX2 (Modern CPUs) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-avx2-windows-x64.zip", "Eigen (CPU, Non-optimized) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-windows-x64.zip", "OpenCL v1.6.1 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1%2Bbs29/katago-v1.6.1+bs29-gpu-opencl-windows-x64.zip", }, "linux": { "OpenCL v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-opencl-linux-x64.zip", - # "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-linux-x64.zip", "Eigen AVX2 (Modern CPUs) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-avx2-linux-x64.zip", "Eigen (CPU, Non-optimized) v1.6.1": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-cpu-eigen-linux-x64.zip", "OpenCL v1.6.1 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1%2Bbs29/katago-v1.6.1+bs29-gpu-opencl-linux-x64.zip", }, + "just-descriptions": { + "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-windows-x64.zip", + "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-linux-x64.zip", + }, } def download_models(self, *_largs): diff --git a/katrain/popups.kv b/katrain/popups.kv index 5522888..0dedc90 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -109,12 +109,11 @@ on_press: root.download_katas() size_hint_y: 0.7 AnchorLayout: - Spinner: + KeyValueSpinner: id: katago_files text: '' - on_text: - if self.text and self.text == self.values[1]: katago_path.text = '' - elif self.text and self.text != self.values[0]: katago_path.text = args[1] + on_select: + if self.selected_index != 0: katago_path.text = self.values[self.selected_index] size_hint_y: 0.7 sync_height_frac: 1.0 -font_size: self.height * 0.5 From e77f1ff5ea09b6f0d7a56ac149358f1b66870a1e Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Sep 2020 16:25:25 +0200 Subject: [PATCH 17/47] gradient top move --- katrain/gui/badukpan.py | 13 ++++++++----- katrain/gui/style.py | 2 +- katrain/img/topmove.png | Bin 0 -> 45826 bytes 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 katrain/img/topmove.png diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 4c4221a..6a818df 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -385,7 +385,7 @@ class BadukPanWidget(Widget): text = i18n._("board-pass") Color(0.45, 0.05, 0.45, 0.7) center = (self.gridpos_x[int(board_size_x / 2)], self.gridpos_y[int(board_size_y / 2)]) - size = min(self.width, self.height) * 0.22 + size = min(self.width, self.height) * 0.227 Ellipse(pos=(center[0] - size / 2, center[1] - size / 2), size=(size, size)) Color(0.85, 0.85, 0.85) draw_text( @@ -422,10 +422,13 @@ class BadukPanWidget(Widget): self.active_pv_moves.append((move.coords, move_dict["pv"], current_node)) else: katrain.log(f"PV missing for move_dict {move_dict}", OUTPUT_DEBUG) - draw_circle( - (self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]]), - col=[*self.eval_color(move_dict["pointsLost"])[:3], alpha], - r=self.stone_size * scale, + evalsize = self.stone_size * scale + evalcol = self.eval_color(move_dict["pointsLost"]) + Color(*evalcol) + Rectangle( + pos=(self.gridpos_x[move.coords[0]] - evalsize, self.gridpos_y[move.coords[1]] - evalsize), + size=(2 * evalsize, 2 * evalsize), + source="katrain/img/topmove.png", ) if self.trainer_config["text_point_loss"]: if move_dict["pointsLost"] < 0.05: diff --git a/katrain/gui/style.py b/katrain/gui/style.py index df3d8f9..cf08e4f 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -31,7 +31,7 @@ EVAL_COLORS = { [0.447, 0.129, 0.42, 1], [0.8, 0, 0, 1], [0.9, 0.4, 0.1, 1], - [0.85, 0.89, 0.3, 1], + [0.85, 0.89, 0.15, 1], [0.67, 0.9, 0.18, 1], [0.117, 0.588, 0, 1], ], diff --git a/katrain/img/topmove.png b/katrain/img/topmove.png new file mode 100644 index 0000000000000000000000000000000000000000..3b297839df5254edd99d99cb5e95aa9ee6f58c75 GIT binary patch literal 45826 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 F{|^}r1IGXW literal 0 HcmV?d00001 From f035627b1d626c45a90c5e1ed8477f26303b543a Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Sep 2020 16:35:57 +0200 Subject: [PATCH 18/47] fix kv spinner --- katrain/gui/popups.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 53f2009..024e71f 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -414,12 +414,12 @@ class ConfigPopup(QuickConfigGui): def check_katas(self, *args): def find_description(path): file = os.path.split(path)[1].replace(".exe", "") - file_to_desc = {kg.replace(".zip", ""): desc for _, kgs in self.KATAGOS.items() for desc, kg in kgs.items()} + file_to_desc = {re.match(r".*/([^/]+)",kg)[1].replace('.zip',''): desc for _, kgs in self.KATAGOS.items() for desc, kg in kgs.items()} print(file_to_desc,file) if file in file_to_desc: - return f"{file_to_desc[file]} ({path})" + return f"{file_to_desc[file]} - {path}" else: - return f"unkn {path}" + return path done = set() kata_files = [] @@ -447,9 +447,9 @@ class ConfigPopup(QuickConfigGui): kata_files = [(path, find_description(path)) for path in sorted(kata_files, key=lambda f: "bs29" in f)] katas_available_msg = i18n._("katago binaries available").format(num=len(kata_files)) self.katago_files.values = [katas_available_msg, i18n._("default katago option")] + [ - path for path, desc in kata_files + desc for path, desc in kata_files ] - self.katago_files.value_keys = ["", ""] + [desc for path, desc in kata_files] + self.katago_files.value_keys = ["", ""] + [path for path, desc in kata_files] self.katago_files.text = katas_available_msg MODELS = { From 316983831945272dc33841783e8ded6b54b70419 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Sep 2020 16:42:24 +0200 Subject: [PATCH 19/47] yellow! --- katrain/gui/style.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/katrain/gui/style.py b/katrain/gui/style.py index cf08e4f..d197ea6 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -31,7 +31,7 @@ EVAL_COLORS = { [0.447, 0.129, 0.42, 1], [0.8, 0, 0, 1], [0.9, 0.4, 0.1, 1], - [0.85, 0.89, 0.15, 1], + [0.95,0.95,0,1], [0.67, 0.9, 0.18, 1], [0.117, 0.588, 0, 1], ], From 163ca07d90e8d31a0677b78bdc9cd56dcd67dde4 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Sep 2020 16:43:00 +0200 Subject: [PATCH 20/47] yellower! --- katrain/__main__.py | 2 +- katrain/core/game_node.py | 3 --- katrain/gui/badukpan.py | 7 ++++--- katrain/gui/style.py | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index ee5d2c8..a667637 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -288,7 +288,7 @@ class KaTrainGui(Screen, KaTrainBase): def _do_resign(self): self.game.current_node.end_state = f"{self.game.current_node.player}+R" - self.log(self.game.current_node.end_state,OUTPUT_INFO) + self.log(self.game.current_node.end_state, OUTPUT_INFO) def _do_redo(self, n_times=1): self.board_gui.animating_pv = None diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index c4afc3b..502c8bb 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -263,6 +263,3 @@ class GameNode(SGFNode): moves = [(policy_grid[y][x], Move((x, y), player=self.next_player)) for x in range(szx) for y in range(szy)] moves.append((self.policy[-1], Move(None, player=self.next_player))) return sorted(moves, key=lambda mp: -mp[0]) - - - diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 6a818df..73f70f1 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -455,7 +455,6 @@ class BadukPanWidget(Widget): width=dp(1.2), ) - # children of current moves in undo / review alpha = GHOST_ALPHA if katrain.analysis_controls.show_children.active: @@ -468,12 +467,14 @@ class BadukPanWidget(Widget): (move.coords, [move.gtp()] + child_node.candidate_moves[0]["pv"], current_node) ) Color(*STONE_COLORS[child_node.player]) - for s in range(0,360,30): + for s in range(0, 360, 30): Line( circle=( self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]], - self.stone_size - 1.2,s,s+15 + self.stone_size - 1.2, + s, + s + 15, ), width=dp(1.2), ) diff --git a/katrain/gui/style.py b/katrain/gui/style.py index d197ea6..cf642ea 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -31,7 +31,7 @@ EVAL_COLORS = { [0.447, 0.129, 0.42, 1], [0.8, 0, 0, 1], [0.9, 0.4, 0.1, 1], - [0.95,0.95,0,1], + [0.95, 0.95, 0, 1], [0.67, 0.9, 0.18, 1], [0.117, 0.588, 0, 1], ], @@ -39,7 +39,7 @@ EVAL_COLORS = { [1, 0, 1, 1], [1, 0, 0, 1], [1, 0.5, 0, 1], - [0.85, 0.89, 0.3, 1], + [1, 1, 0, 1], [0, 1, 1, 1], [0, 0, 1, 1], ], From 58f91072ebaa54ed3a597467443a380e7e8740aa Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Sep 2020 17:01:44 +0200 Subject: [PATCH 21/47] hmm --- katrain/gui/kivyutils.py | 5 +++-- katrain/gui/popups.py | 10 +++++----- katrain/popups.kv | 9 ++++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index f03b1b8..0d00ca3 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -211,7 +211,7 @@ class KeyValueSpinner(Spinner): value_refs = ListProperty() selected_index = NumericProperty(0) font_name = StringProperty(DEFAULT_FONT) - + no_update = BooleanProperty(False) def __init__(self, **kwargs): super().__init__(**kwargs) self.build_values() @@ -230,9 +230,10 @@ class KeyValueSpinner(Spinner): new_index = self.values.index(text) if new_index != self.selected_index: self.selected_index = new_index - self.dispatch("on_select") + return self.dispatch("on_select") except (ValueError, IndexError): pass + return not self.no_update def on_select(self, *args): pass diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 024e71f..74651a6 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -453,9 +453,9 @@ class ConfigPopup(QuickConfigGui): self.katago_files.text = katas_available_msg MODELS = { - "latest 20b": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170e-b20c256x2-s5303129600-d1228401921.bin.gz", - "latest 30b": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b30c320x2-s4824661760-d1229536699.bin.gz", - "latest 40b": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b40c256x2-s5095420928-d1229425124.bin.gz", + "Latest 20 block model": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170e-b20c256x2-s5303129600-d1228401921.bin.gz", + "Latest 30 block model": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b30c320x2-s4824661760-d1229536699.bin.gz", + "Latest 40 block model": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b40c256x2-s5095420928-d1229425124.bin.gz", } KATAGOS = { @@ -472,8 +472,8 @@ class ConfigPopup(QuickConfigGui): "OpenCL v1.6.1 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1%2Bbs29/katago-v1.6.1+bs29-gpu-opencl-linux-x64.zip", }, "just-descriptions": { - "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-windows-x64.zip", - "CUDA v1.6.1 (New NVIDIA cards)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-linux-x64.zip", + "CUDA v1.6.1 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-windows-x64.zip", + "CUDA v1.6.1 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.6.1/katago-v1.6.1-gpu-cuda10.2-linux-x64.zip", }, } diff --git a/katrain/popups.kv b/katrain/popups.kv index 0dedc90..6bb7d5c 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -112,8 +112,9 @@ KeyValueSpinner: id: katago_files text: '' + no_update: True on_select: - if self.selected_index != 0: katago_path.text = self.values[self.selected_index] + if self.selected_index != 0: katago_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 sync_height_frac: 1.0 -font_size: self.height * 0.5 @@ -139,10 +140,12 @@ on_press: root.download_models() size_hint_y: 0.7 AnchorLayout: - Spinner: + KeyValueSpinner: id: model_files text: '' - on_text: if self.text and self.text != self.values[0]: model_path.text = args[1] + no_update: True + on_select: + if self.selected_index != 0: katago_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 sync_height_frac: 1.0 -font_size: self.height * 0.5 From 046e3a02d76e79ecace6eb7ab5fe817aa1d66ef8 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 13:00:40 +0200 Subject: [PATCH 22/47] alpha --- katrain/gui/badukpan.py | 12 ++++++------ katrain/gui/style.py | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 73f70f1..75420a0 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -362,7 +362,7 @@ class BadukPanWidget(Widget): polsize = 1.1 * math.sqrt(policy_grid[y][x]) policy_circle_color = ( *POLICY_COLOR, - GHOST_ALPHA + TOP_MOVE_ALPHA * (policy_grid[y][x] == best_move_policy), + POLICY_ALPHA + TOP_MOVE_ALPHA * (policy_grid[y][x] == best_move_policy), ) draw_circle( (self.gridpos_x[x], self.gridpos_y[y]), polsize * self.stone_size, policy_circle_color @@ -395,7 +395,7 @@ class BadukPanWidget(Widget): self.draw_hover_contents() def draw_hover_contents(self, *_args): - ghost_alpha = GHOST_ALPHA + ghost_alpha = POLICY_ALPHA katrain = self.katrain game_ended = katrain.game.end_result current_node = katrain.game.current_node @@ -415,16 +415,16 @@ class BadukPanWidget(Widget): for i, move_dict in enumerate(hint_moves): move = Move.from_gtp(move_dict["move"]) if move.coords is not None: - alpha, scale = GHOST_ALPHA, 1.0 + scale = 0.95 if move_dict["visits"] < VISITS_FRAC_SMALL * hint_moves[0]["visits"]: - scale = 0.8 + scale = 0.75 if "pv" in move_dict: self.active_pv_moves.append((move.coords, move_dict["pv"], current_node)) else: katrain.log(f"PV missing for move_dict {move_dict}", OUTPUT_DEBUG) evalsize = self.stone_size * scale evalcol = self.eval_color(move_dict["pointsLost"]) - Color(*evalcol) + Color(*evalcol[:3], HINTS_ALPHA) Rectangle( pos=(self.gridpos_x[move.coords[0]] - evalsize, self.gridpos_y[move.coords[1]] - evalsize), size=(2 * evalsize, 2 * evalsize), @@ -456,7 +456,7 @@ class BadukPanWidget(Widget): ) # children of current moves in undo / review - alpha = GHOST_ALPHA + alpha = POLICY_ALPHA if katrain.analysis_controls.show_children.active: for child_node in current_node.children: points_lost = child_node.points_lost diff --git a/katrain/gui/style.py b/katrain/gui/style.py index cf642ea..de037f4 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -61,7 +61,8 @@ BOARD_COLOR = [0.85, 0.68, 0.40, 1] STONE_SIZE = 0.505 # texture edge is transparent VISITS_FRAC_SMALL = 0.1 -GHOST_ALPHA = 0.5 +POLICY_ALPHA = 0.5 +HINTS_ALPHA = 0.75 TOP_MOVE_ALPHA = 0.4 TOP_MOVE_BORDER_COLOR = [10 / 255, 200 / 255, 250 / 255, 1.0] CHILD_SCALE = 0.95 From f947835e6468f3e01b8f9c6293ee47cc0d27afea Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 21:33:01 +0200 Subject: [PATCH 23/47] models --- katrain/__main__.py | 2 +- katrain/core/game_node.py | 3 --- katrain/gui/kivyutils.py | 2 +- katrain/gui/popups.py | 28 +++++++++++++++++++++++++--- katrain/popups.kv | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index ee5d2c8..a667637 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -288,7 +288,7 @@ class KaTrainGui(Screen, KaTrainBase): def _do_resign(self): self.game.current_node.end_state = f"{self.game.current_node.player}+R" - self.log(self.game.current_node.end_state,OUTPUT_INFO) + self.log(self.game.current_node.end_state, OUTPUT_INFO) def _do_redo(self, n_times=1): self.board_gui.animating_pv = None diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index c4afc3b..502c8bb 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -263,6 +263,3 @@ class GameNode(SGFNode): moves = [(policy_grid[y][x], Move((x, y), player=self.next_player)) for x in range(szx) for y in range(szy)] moves.append((self.policy[-1], Move(None, player=self.next_player))) return sorted(moves, key=lambda mp: -mp[0]) - - - diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 0d00ca3..1227ad7 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -212,6 +212,7 @@ class KeyValueSpinner(Spinner): selected_index = NumericProperty(0) font_name = StringProperty(DEFAULT_FONT) no_update = BooleanProperty(False) + def __init__(self, **kwargs): super().__init__(**kwargs) self.build_values() @@ -284,7 +285,6 @@ class I18NSpinner(KeyValueSpinner): super().build_values() - class PlayerSetup(MDBoxLayout): player = OptionProperty("B", options=["B", "W"]) mode = StringProperty("") diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 74651a6..43a108c 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -386,6 +386,18 @@ class ConfigPopup(QuickConfigGui): super().build_and_set_properties() def check_models(self, *args): + def find_description(path): + file = os.path.split(path)[1] + file_to_desc = { + re.match(r".*/([^/]+)", model)[1].replace(".zip", ".bin.gz"): desc + for mods in [self.MODELS, self.MODEL_DESC] + for desc, model in mods.items() + } + if file in file_to_desc: + return f"{file_to_desc[file]} - {path}" + else: + return path + done = set() model_files = [] for path in self.paths + [self.model_path.text]: @@ -407,15 +419,21 @@ class ConfigPopup(QuickConfigGui): if files and path not in self.paths: self.paths.append(path) # persistent on paths with models found model_files += files + + model_files = sorted([(find_description(path), path) for path in model_files]) models_available_msg = i18n._("models available").format(num=len(model_files)) - self.model_files.values = [models_available_msg] + model_files + self.model_files.values = [models_available_msg] + [desc for desc, path in model_files] + self.model_files.value_keys = [""] + [path for desc, path in model_files] self.model_files.text = models_available_msg def check_katas(self, *args): def find_description(path): file = os.path.split(path)[1].replace(".exe", "") - file_to_desc = {re.match(r".*/([^/]+)",kg)[1].replace('.zip',''): desc for _, kgs in self.KATAGOS.items() for desc, kg in kgs.items()} - print(file_to_desc,file) + file_to_desc = { + re.match(r".*/([^/]+)", kg)[1].replace(".zip", ""): desc + for _, kgs in self.KATAGOS.items() + for desc, kg in kgs.items() + } if file in file_to_desc: return f"{file_to_desc[file]} - {path}" else: @@ -457,6 +475,10 @@ class ConfigPopup(QuickConfigGui): "Latest 30 block model": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b30c320x2-s4824661760-d1229536699.bin.gz", "Latest 40 block model": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b40c256x2-s5095420928-d1229425124.bin.gz", } + MODEL_DESC = { + "Fat 40 block model": "https://d3dndmfyhecmj0.cloudfront.net/g170/neuralnets/g170e-b40c384x2-s2348692992-d1229892979.zip", + "Latest 15 block model": "https://d3dndmfyhecmj0.cloudfront.net/g170/neuralnets/g170e-b15c192-s1672170752-d466197061.bin.gz", + } KATAGOS = { "win": { diff --git a/katrain/popups.kv b/katrain/popups.kv index 6bb7d5c..b7b1363 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -145,7 +145,7 @@ text: '' no_update: True on_select: - if self.selected_index != 0: katago_path.text = self.value_keys[self.selected_index] + if self.selected_index != 0: model_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 sync_height_frac: 1.0 -font_size: self.height * 0.5 From c25ae5ae5e1cd35045f15e03c4dd931d2fec4b1c Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 21:40:25 +0200 Subject: [PATCH 24/47] hmm --- katrain/gui/kivyutils.py | 4 +--- katrain/popups.kv | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 1227ad7..1cd1521 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -211,7 +211,6 @@ class KeyValueSpinner(Spinner): value_refs = ListProperty() selected_index = NumericProperty(0) font_name = StringProperty(DEFAULT_FONT) - no_update = BooleanProperty(False) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -231,10 +230,9 @@ class KeyValueSpinner(Spinner): new_index = self.values.index(text) if new_index != self.selected_index: self.selected_index = new_index - return self.dispatch("on_select") + self.dispatch("on_select") except (ValueError, IndexError): pass - return not self.no_update def on_select(self, *args): pass diff --git a/katrain/popups.kv b/katrain/popups.kv index b7b1363..b497fc1 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -112,7 +112,6 @@ KeyValueSpinner: id: katago_files text: '' - no_update: True on_select: if self.selected_index != 0: katago_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 @@ -143,7 +142,6 @@ KeyValueSpinner: id: model_files text: '' - no_update: True on_select: if self.selected_index != 0: model_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 From d6083e6a60b340c8275b96ab1988df3db26d5c92 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 22:07:07 +0200 Subject: [PATCH 25/47] clip spinner --- katrain/popups.kv | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/katrain/popups.kv b/katrain/popups.kv index b497fc1..c9c5265 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -112,6 +112,11 @@ KeyValueSpinner: id: katago_files text: '' + text_autoupdate: True + -text_size: self.width, None + -halign: 'center' + -shorten: True + -shorten_from: 'right' on_select: if self.selected_index != 0: katago_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 @@ -142,6 +147,11 @@ KeyValueSpinner: id: model_files text: '' + text_autoupdate: True + -text_size: self.width, None + -halign: 'center' + -shorten: True + -shorten_from: 'right' on_select: if self.selected_index != 0: model_path.text = self.value_keys[self.selected_index] size_hint_y: 0.7 From 14dd5d58f4d2ceb73a3c3ff7e993e3e2fe205e38 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 22:35:25 +0200 Subject: [PATCH 26/47] PL[W] fix? --- katrain/core/sgf_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index 2e9da2e..7f284a4 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -275,7 +275,7 @@ class SGFNode: @property def next_player(self): """Returns player to move""" - if "B" in self.properties or "AB" in self.properties: # root or black moved + if "B" in self.properties or ("AB" in self.properties and not "W" in self.properties): # root or black moved return "W" else: return "B" @@ -283,7 +283,7 @@ class SGFNode: @property def player(self): """Returns player that moved last. nb root is considered white played if no handicap stones are placed""" - if "B" in self.properties or "AB" in self.properties: + if "B" in self.properties or ("AB" in self.properties and not "W" in self.properties): return "B" else: return "W" From f7eb7f1e638d72fa7e638f889ff259e165a827c6 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 22:59:13 +0200 Subject: [PATCH 27/47] kill kata? --- katrain/core/engine.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/katrain/core/engine.py b/katrain/core/engine.py index e352561..1fcadc2 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -41,10 +41,12 @@ class KataGoEngine: self._lock = threading.Lock() self.analysis_thread = None self.stderr_thread = None + self.shell = False exe = config.get("katago", "").strip() if config.get("altcommand", ""): self.command = config["altcommand"] + self.shell = True else: if not exe: if platform == "win": @@ -81,7 +83,7 @@ class KataGoEngine: try: self.katrain.log(f"Starting KataGo with {self.command}", OUTPUT_DEBUG) self.katago_process = subprocess.Popen( - self.command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True + self.command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=self.shell ) except (FileNotFoundError, PermissionError, OSError) as e: self.katrain.log( From aed7b52f00690a74838daf5e1cfd32257e0943ef Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 6 Sep 2020 23:08:03 +0200 Subject: [PATCH 28/47] no hints if policy moves on --- katrain/gui.kv | 4 +++- katrain/gui/badukpan.py | 3 +-- katrain/gui/kivyutils.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/katrain/gui.kv b/katrain/gui.kv index acfcd2a..fef7bf0 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -697,12 +697,13 @@ halign: 'center' font_size: root.height / 3 font_name: root.font_name - color: checkbox.selected_color if checkbox.active else checkbox.unselected_color + color: checkbox.disabled_color if root.disabled else (checkbox.selected_color if checkbox.active else checkbox.unselected_color) size_hint_x: None width: self.texture_size[0] + 4 on_left_press: checkbox.active = not checkbox.active MDCheckbox: id: checkbox + disabled: root.disabled size_hint: None,0.5 pos_hint: {'center_y': 0.5} width: self.height @@ -789,6 +790,7 @@ AnalysisToggle: id: hints text: i18n._("analysis:topmoves") + disabled: policy.checkbox.active AnalysisToggle: id: policy text: i18n._("analysis:policy") diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 7e38cfc..488d354 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -268,7 +268,6 @@ class BadukPanWidget(Widget): nodes = katrain.game.current_node.nodes_from_root realized_points_lost = None - katrain.config("trainer/show_dots") for i, node in enumerate(nodes[::-1]): # reverse order! points_lost = node.points_lost evalscale = 1 @@ -410,7 +409,7 @@ class BadukPanWidget(Widget): self.active_pv_moves = [] # hints or PV - if katrain.analysis_controls.hints.active and not game_ended: + if katrain.analysis_controls.hints.active and not katrain.analysis_controls.policy.active and not game_ended: hint_moves = current_node.candidate_moves for i, move_dict in enumerate(hint_moves): move = Move.from_gtp(move_dict["move"]) diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 1cd1521..40a3e43 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -372,7 +372,7 @@ class AnalysisToggle(MDBoxLayout): text = StringProperty("") default_active = BooleanProperty(False) font_name = StringProperty(DEFAULT_FONT) - + disabled = BooleanProperty(False) def trigger_action(self, *args, **kwargs): return self.checkbox.trigger_action(*args, **kwargs) From 2f40a6e569a2a079a2fc4fb62e983da779ca6b64 Mon Sep 17 00:00:00 2001 From: Hiraoka Date: Mon, 7 Sep 2020 20:24:09 +0900 Subject: [PATCH 29/47] update JP translations (resign etc.) --- .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 15093 -> 15090 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo index 8636d9904a37c578e4b4e3255fe0a5d3b668dec1..3d441077cb5dc22bb2c22c0fab6387ae1135c8d6 100644 GIT binary patch delta 850 zcmXZaO-NK>6vpuv4RuKFkTeku2#$(^PTKe}en1Ww8j?vw8*vjA2tm|hCW_!LieZ!j zK_&Xw6)3bwy0~bVl@SsV)+(enL71+Fgf>Hk|A%{4zkAL-bIy6+JAbnK*|nE-e%v{? z((PO|zQZQm#1`Dc2J}vaaT6{PkD=OdJ}cQ=Dt=n-ncbv%JTP<{XQ z`ZVJq-WP7xio?X6s6n%q&zkove;*rozknL>0$cGT*5Pl|?<=Si*K%CN9%|vZ#T~vS z1}t$Fb%IN%0k<%Q5AZZTMGv2P2MtBA)foaUJ318Bx1su^QFUif2b;ztcon0%>zozj&F45m!JFXi w;Yv%iTq;c6ymn*s+^@Mpxil99-FFTxzV1&3*ZbP5YIf$Ae-`t>lk`mW0jLaVcmMzZ delta 850 zcmXZaK}b|l6vpwBhN%q=Gir&FP>d9%Hcsl8K|(I1WFR8KMefo`1UD))iajtWf_9TG zq!dAn5JH#)TP6e&A|b6JXfXsqfq~yU=Y8+qbKjdk6Z;cu%jH4D%w8wW zO7R_@!3|8{SB&GK*YQ@f7u0D~ZX1=`!;4szGCPOeSc6$?z-d(OC6?g_?7*#*1=h*M zAq{@kdD$$ABX|j?Pz$Vj{RuVjfqSei%vYoO39QFfWM<2t26}`Va0Tmd7q#y1w!o}{ zi%5Go*-6Y$pGGY>;{Ati;Qc2U=YAfw!3s9w4wmCz)bsyPC$8kUs$-}FHhA3-;VV3W-@N||Td0qu!+a98VGowzO|LVkjqjk=yN|UPOnM-X%{1mw zZ)6KK@h&#ucVsV%@Vzux51z%lsBfD?jG-2) zbsJHWr~LkP_Xg@Dw{Q)IP=lT73iB6G>vW-Vy{Ll?U<|Vu)w|Al;F-IK-2~PP?~flO u3Y*E?(ddu2i$9m17az|SXO@aH%lS7Q$-;y7^Ce}s2gio9qlLNjz0&_HZ)#Bh diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 26cce38..62bf609 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -647,11 +647,11 @@ msgstr "別版KataGoをダウンロード" #. shown on on the binaries select dropdown msgid "katago binaries available" -msgstr "入手済KataGo実行ファイルの一覧({num}個みつかりました)" +msgstr "入手済KataGoの一覧({num}個みつかりました)" #. shown on on the katago binary select dropdown msgid "default katago option" -msgstr "内蔵KataGo" +msgstr "内蔵KataGo(OpenCL版)" #. error message on trying to download models when already done msgid "All binaries downloaded" @@ -667,6 +667,6 @@ msgstr "" msgid "show point loss as text" msgstr "損失目数を候補手上に表示" -#. TODO - resign the game +#. - resign the game msgid "resign" -msgstr "Resign" +msgstr "投了" From c7c2975c5315b0c9ccaec53e2b809ca9e02dd986 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Mon, 7 Sep 2020 14:12:17 +0200 Subject: [PATCH 30/47] shlex split --- katrain/core/engine.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/katrain/core/engine.py b/katrain/core/engine.py index 1fcadc2..c2a3f9e 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -1,6 +1,7 @@ import copy import json import os +import shlex import subprocess import threading import time @@ -76,7 +77,7 @@ class KataGoEngine: elif not os.path.isfile(cfg): self.katrain.log(i18n._("Kata config not found").format(config=cfg), OUTPUT_ERROR) return # don't start - self.command = f'"{exe}" analysis -model "{model}" -config "{cfg}" -analysis-threads {config["threads"]}' + self.command = shlex.split(f'"{exe}" analysis -model "{model}" -config "{cfg}" -analysis-threads {config["threads"]}') self.start() def start(self): From 4e2ee03db7c04838473294a998aaffc77dc9f674 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Tue, 8 Sep 2020 22:26:14 +0200 Subject: [PATCH 31/47] fewer hints, alternatives search --- README.md | 20 +++++---------- katrain/__main__.py | 1 + katrain/core/engine.py | 17 ++++++++++++- katrain/core/game.py | 18 ++++++++----- katrain/core/game_node.py | 22 +++++++++++++--- katrain/gui.kv | 5 ++++ katrain/gui/badukpan.py | 24 +++++++++++++----- katrain/gui/kivyutils.py | 1 + katrain/gui/style.py | 11 +++++--- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 11866 -> 11927 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 5 ++++ .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 14005 -> 14064 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 17 ++++++++----- .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 12991 -> 13156 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 10 ++++++-- .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 13802 -> 13863 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 5 ++++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 14803 -> 14864 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 5 ++++ .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 15090 -> 15151 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 13 +++++++--- .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 14945 -> 15009 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 5 ++++ .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 18890 -> 18951 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 5 ++++ katrain/img/Alternative.png | Bin 0 -> 4384 bytes 26 files changed, 137 insertions(+), 47 deletions(-) create mode 100644 katrain/img/Alternative.png diff --git a/README.md b/README.md index 508fb96..d45689b 100644 --- a/README.md +++ b/README.md @@ -154,23 +154,21 @@ Keyboard shortcuts are shown with **[key]**. wanting to guess the next move. * **[w]**: Show all dots: Show all evaluation dots instead of the last few. * You can configure how many are shown with this setting off, and whether they are shown for AIs under 'Configure Teacher'. - * **[e]**: Top moves: Show the next moves KataGo considered, colored by their expected point loss. Small dots indicate high uncertainty. Hover over any of them to see the principal variation. - * **[r]**: Policy moves: Show KataGo's policy network evaluation, i.e. where it thinks the best next move is purely from the position, and in the absence of any 'reading'. + * **[e]**: Top moves: Show the next moves KataGo considered, colored by their expected point loss. + Small/faint dots indicate high uncertainty and never show text (lower than your 'fast visits' setting). + Hover over any of them to see the principal variation. + * **[r]**: Policy moves: Show KataGo's policy network evaluation, i.e. where it thinks the best next move is purely from the position, + and in the absence of any 'reading'. This turns off the 'top moves' setting as the overlap is often not useful. * **[t]**: Expected territory: Show expected ownership of each intersection. * The analysis options available under the 'Analysis' button are used for deeper evaluation of the position: * **[a]**: Deeper analysis: Re-evaluate the position using more visits, usually resulting in a more accurate evaluation. * **[s]**: Equalize visits: Re-evaluate all currently shown next moves with the same visits as the current top move. Useful to increase confidence in the suggestions with high uncertainty. * **[d]**: Analyze all moves: Evaluate all possible next moves. This can take a bit of time even though 'fast_visits' is used, but can be useful to see how many reasonable next moves are available. + * **[f]**: Find alternatives: Increases analysis of current candidate moves to at least the 'fast visits' level, and request a new query that excludes all current candidate moves. * **[spacebar]**: Turn continuous analysis on/off. This will continuously improve analysis of the current position, similar to Lizzie's 'pondering', but only when there are no other queries going on. * **[enter]** AI move. Makes the AI move for the current player regardless of current player selection. -### Rank Estimation - -A new feature in v1.3 is the rank estimation panel. This adds an extra graph which uses a statistical model to estimate the playing strength -of both players for every 80 move segment. It can be used for determining which part of your game needs extra attention, -but keep in mind the estimation is based purely on how well moves correspond to the 'shape sense' of KataGo and can be very inaccurate at times. - ## Keyboard and mouse shortcuts In addition to shortcuts mentioned above and those shown in the main menu: @@ -197,15 +195,11 @@ In addition to shortcuts mentioned above and those shown in the main menu: * Try using a lower number for `nnMaxBatchSize` in `KataGo/analysis_config.cfg`, and avoid using versions compiled with large board sizes. * If still encountering problems, please start KataGo by itself to check for any errors it gives. * Note that if you don't have a GPU, or your GPU does not support OpenCL, you should use the 'eigen' binaries which run on CPU only. -* How can I play on larger boards? - * For windows, change the `katago` setting to `katrain\KataGo\katago-bs52.exe`. For other operating systems, you need to compile your own KataGo version with higher limits. - ## Support / Contribute [![GitHub issues](https://img.shields.io/github/issues/sanderland/katrain)](https://github.com/sanderland/katrain/issues) [![Contributors](https://img.shields.io/static/v1?label=contributors&message=19&color=dcb424)](CONTRIBUTIONS.md) -[![Liberapay patrons](https://img.shields.io/liberapay/patrons/sanderbaduk)](https://liberapay.com/sanderbaduk/) [![Github sponsors](https://img.shields.io/static/v1?label=sponsor&message=7&logo=GitHub&color=dcb424&link=https://github.com/sponsors/sanderland/)](https://github.com/sponsors/sanderland) * Ideas, feedback, and contributions to code or translations are all very welcome. @@ -213,7 +207,7 @@ In addition to shortcuts mentioned above and those shown in the main menu: * I am looking for contributors of more translations of both this manual and the program itself. The best way to help with this is to contact me on discord. * You can contact me on [discord](https://discord.gg/AjTPFpN) (Sander#3278), [KakaoTalk](https://open.kakao.com/o/gTsMJCac) or [Reddit](http://reddit.com/u/sanderbaduk) to get help, discuss improvements, or simply show your appreciation. -* You can also donate to the project through [Liberapay](https://liberapay.com/KaTrain/) or [Github Sponsors](https://github.com/sponsors/sanderland). +* You can also donate to the project through [Github Sponsors](https://github.com/sponsors/sanderland). diff --git a/katrain/__main__.py b/katrain/__main__.py index a667637..687e659 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -440,6 +440,7 @@ class KaTrainGui(Screen, KaTrainBase): "a": ("analyze-extra", "extra"), "s": ("analyze-extra", "equalize"), "d": ("analyze-extra", "sweep"), + "f": ("analyze-extra", "alternative"), "p": ("play", None), "down": ("switch-branch", 1), "up": ("switch-branch", -1), diff --git a/katrain/core/engine.py b/katrain/core/engine.py index c2a3f9e..542753d 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -77,7 +77,9 @@ class KataGoEngine: elif not os.path.isfile(cfg): self.katrain.log(i18n._("Kata config not found").format(config=cfg), OUTPUT_ERROR) return # don't start - self.command = shlex.split(f'"{exe}" analysis -model "{model}" -config "{cfg}" -analysis-threads {config["threads"]}') + self.command = shlex.split( + f'"{exe}" analysis -model "{model}" -config "{cfg}" -analysis-threads {config["threads"]}' + ) self.start() def start(self): @@ -224,6 +226,7 @@ class KataGoEngine: visits: int = None, analyze_fast: bool = False, time_limit=True, + find_alternatives: bool = False, priority: int = 0, ownership: Optional[bool] = None, next_move: Optional[GameNode] = None, @@ -241,6 +244,17 @@ class KataGoEngine: if analyze_fast and self.config.get("fast_visits"): visits = self.config["fast_visits"] + if find_alternatives: + avoid = [ + { + "moves": list(analysis_node.analysis["moves"].keys()), + "player": analysis_node.next_player, + "untilDepth": 1, + } + ] + else: + avoid = [] + size_x, size_y = analysis_node.board_size settings = copy.copy(self.override_settings) if time_limit: @@ -254,6 +268,7 @@ class KataGoEngine: "analyzeTurns": [len(moves)], "maxVisits": visits, "komi": analysis_node.komi, + "avoidMoves": avoid, "boardXSize": size_x, "boardYSize": size_y, "includeOwnership": ownership and not next_move, diff --git a/katrain/core/game.py b/katrain/core/game.py index 359842e..7af8ad3 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -369,21 +369,27 @@ class Game: visits = engine.config["fast_visits"] self.katrain.controls.set_status(i18n._("sweep analysis").format(visits=visits), STATUS_ANALYSIS) priority = -1_000_000_000 - elif mode == "equalize": + elif mode in ["equalize", "alternative"]: if not cn.analysis_ready: self.katrain.controls.set_status(i18n._("wait-before-equalize"), STATUS_INFO, self.current_node) return analyze_moves = [Move.from_gtp(gtp, player=cn.next_player) for gtp, _ in cn.analysis["moves"].items()] - visits = max(d["visits"] for d in cn.analysis["moves"].values()) - self.katrain.controls.set_status(i18n._("equalizing analysis").format(visits=visits), STATUS_ANALYSIS) priority = -1_000 + if mode == "alternative": # also do a quick update on current candidates so it doesn't look too weird + self.katrain.controls.set_status("Searching for alternatives", STATUS_ANALYSIS) + cn.analyze(engine, priority=-500, time_limit=False, find_alternatives=True) + visits = engine.config["fast_visits"] + else: + visits = max(d["visits"] for d in cn.analysis["moves"].values()) + self.katrain.controls.set_status(i18n._("equalizing analysis").format(visits=visits), STATUS_ANALYSIS) else: raise ValueError("Invalid analysis mode") for move in analyze_moves: - cn.analyze( - engine, priority, visits=visits, refine_move=move, time_limit=False - ) # explicitly requested so take as long as you need + if cn.analysis["moves"].get(move.gtp(), {"visits": 0})["visits"] < visits: + cn.analyze( + engine, priority, visits=visits, refine_move=move, time_limit=False + ) # explicitly requested so take as long as you need def analyze_undo(self, node): train_config = self.katrain.config("trainer") diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index 502c8bb..a9920c6 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -68,15 +68,25 @@ class GameNode(SGFNode): ) # analyzed/not undone main, non-teach second, undone last # various analysis functions - def analyze(self, engine, priority=0, visits=None, time_limit=True, refine_move=None, analyze_fast=False): + def analyze( + self, + engine, + priority=0, + visits=None, + time_limit=True, + refine_move=None, + analyze_fast=False, + find_alternatives=False, + ): engine.request_analysis( self, - lambda result: self.set_analysis(result, refine_move), + lambda result: self.set_analysis(result, refine_move, find_alternatives), priority=priority, visits=visits, analyze_fast=analyze_fast, time_limit=time_limit, next_move=refine_move, + find_alternatives=find_alternatives, ) def update_move_analysis(self, move_analysis, move_gtp): @@ -90,18 +100,22 @@ class GameNode(SGFNode): elif cur["visits"] < move_analysis["visits"]: cur.update(move_analysis) - def set_analysis(self, analysis_json, refine_move): + def set_analysis(self, analysis_json, refine_move, alternatives_mode): if refine_move: pvtail = analysis_json["moveInfos"][0]["pv"] if analysis_json["moveInfos"] else [] self.update_move_analysis( {"pv": [refine_move.gtp()] + pvtail, **analysis_json["rootInfo"]}, refine_move.gtp() ) else: + if alternatives_mode: + for m in analysis_json["moveInfos"]: + m["order"] += 10 # offset for not making this top for move_analysis in analysis_json["moveInfos"]: self.update_move_analysis(move_analysis, move_analysis["move"]) self.ownership = analysis_json.get("ownership") self.policy = analysis_json.get("policy") - self.analysis["root"] = analysis_json["rootInfo"] + if not alternatives_mode: + self.analysis["root"] = analysis_json["rootInfo"] if self.parent and self.move: analysis_json["rootInfo"]["pv"] = [self.move.gtp()] + ( analysis_json["moveInfos"][0]["pv"] if analysis_json["moveInfos"] else [] diff --git a/katrain/gui.kv b/katrain/gui.kv index fef7bf0..07219f9 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -744,6 +744,11 @@ icon: 'img/Sweep.png' shortcut: 'd' on_action: root.katrain("analyze-extra", "sweep") + AnalysisMenuItem: + text: i18n._("analysis:alternatives") + icon: 'img/Alternative.png' + shortcut: 'f' + on_action: root.katrain("analyze-extra", "alternative") AnalysisMenuItem: text: i18n._("analysis:game") icon: 'img/analysis.png' diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 488d354..90f849e 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -361,7 +361,7 @@ class BadukPanWidget(Widget): polsize = 1.1 * math.sqrt(policy_grid[y][x]) policy_circle_color = ( *POLICY_COLOR, - POLICY_ALPHA + TOP_MOVE_ALPHA * (policy_grid[y][x] == best_move_policy), + POLICY_ALPHA + TOP_POLICY_ALPHA * (policy_grid[y][x] == best_move_policy), ) draw_circle( (self.gridpos_x[x], self.gridpos_y[y]), polsize * self.stone_size, policy_circle_color @@ -409,27 +409,37 @@ class BadukPanWidget(Widget): self.active_pv_moves = [] # hints or PV - if katrain.analysis_controls.hints.active and not katrain.analysis_controls.policy.active and not game_ended: + if ( + katrain.analysis_controls.hints.active + and not katrain.analysis_controls.policy.active + and not game_ended + ): hint_moves = current_node.candidate_moves for i, move_dict in enumerate(hint_moves): move = Move.from_gtp(move_dict["move"]) if move.coords is not None: - scale = 0.95 - if move_dict["visits"] < VISITS_FRAC_SMALL * hint_moves[0]["visits"]: - scale = 0.75 + scale = HINT_SCALE + text_on = True + alpha = HINTS_ALPHA + if move_dict["visits"] < katrain.config("engine/fast_visits"): + scale = UNCERTAIN_HINT_SCALE + text_on = False + alpha = HINTS_MIN_ALPHA + (HINTS_ALPHA - HINTS_MIN_ALPHA) * ( + move_dict["visits"] / katrain.config("engine/fast_visits") + ) if "pv" in move_dict: self.active_pv_moves.append((move.coords, move_dict["pv"], current_node)) else: katrain.log(f"PV missing for move_dict {move_dict}", OUTPUT_DEBUG) evalsize = self.stone_size * scale evalcol = self.eval_color(move_dict["pointsLost"]) - Color(*evalcol[:3], HINTS_ALPHA) + Color(*evalcol[:3], alpha) Rectangle( pos=(self.gridpos_x[move.coords[0]] - evalsize, self.gridpos_y[move.coords[1]] - evalsize), size=(2 * evalsize, 2 * evalsize), source="katrain/img/topmove.png", ) - if self.trainer_config["text_point_loss"]: + if self.trainer_config["text_point_loss"] and text_on: if move_dict["pointsLost"] < 0.05: ptloss_text = "0.0" else: diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 40a3e43..a2b953b 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -373,6 +373,7 @@ class AnalysisToggle(MDBoxLayout): default_active = BooleanProperty(False) font_name = StringProperty(DEFAULT_FONT) disabled = BooleanProperty(False) + def trigger_action(self, *args, **kwargs): return self.checkbox.trigger_action(*args, **kwargs) diff --git a/katrain/gui/style.py b/katrain/gui/style.py index de037f4..6125534 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -59,13 +59,16 @@ POLICY_COLOR = [0.9, 0.2, 0.8] STARPOINT_SIZE = 0.1 BOARD_COLOR = [0.85, 0.68, 0.40, 1] STONE_SIZE = 0.505 # texture edge is transparent -VISITS_FRAC_SMALL = 0.1 -POLICY_ALPHA = 0.5 -HINTS_ALPHA = 0.75 -TOP_MOVE_ALPHA = 0.4 +HINTS_ALPHA = 0.8 +HINTS_MIN_ALPHA = 0.1 # single visit +POLICY_ALPHA = 0.6 +TOP_POLICY_ALPHA = 0.3 TOP_MOVE_BORDER_COLOR = [10 / 255, 200 / 255, 250 / 255, 1.0] CHILD_SCALE = 0.95 +HINT_SCALE = 0.975 +UNCERTAIN_HINT_SCALE = 0.7 + # ponder light ENGINE_DOWN_COL = EVAL_COLORS["theme:normal"][1] diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 71c09be37c4ee6d2d14e2aed03833284f3fe0a06..db2b7ee9427b52756373fe4a66045ca6a1b451b8 100644 GIT binary patch delta 3096 zcmYk-drVe!9LMqB0D*^_KygtK@E#WhET&~sW{b6aSh31milL$45JM4Np~qH>MGgrI zYqMH9#hEk*Su-cqY~m$dZBnU2mw9V8X({*zO1(ck->uy7yw30b`+k4tJe*&&eX(~j zKIDDJzr*}b;s2dsDmnK<Zz+{Y$a!y?*qRLY-9_L^hmRNZc#!`M4 z!*D0YIOn;2JPfDekaaj=p2rC4Z=xpb$7u9%OT;9k%1yx#oPpY40jmF89Elb9Aijw# z=sraC+dEYDoa^L45uHXKUP2A{1A}o86=4vg)gFV|STd@994ew5 zs^1f+BPd2~a4CBHcdNK5B^&Vp+=d#^ikjdcYQZk6{~5Kw736Yvxv4#j*;Sv28kd1u za0WLm=tuRNXXWLwoWCNjra}>J!f_nxw9o6q^)H`qtwecP+-$pJM!Rm4p zsy!Q(;n}EhesftI`PTxkQo-dKtYHT#10AS{zO(XKD_=&9>q9O#j7|z93AONe)I#|< z3jL_emLr#|5qVuTnH_Sd% z=7LD40*OP-Hxd;{7Dnj%&*xz%Rn}01ns^>+z%pbmSA+U>Zb0>KLcLrcp%yxX>VF)y z(Q~LX{?pp;p~giLjWUyr-g+J;^DqW?V=8u`I$lF9eA~)C-mu3hC*o>+4h!)pPQ(b_ zENv(c6>$-2{9H`KO3cG8I2}7jkbmv)E)|n7j34ZWFb6eoKI+V>P-nOqXJS3h!eh7t zLs@ki?n2FX0hNK9s8kQ)vlz}_IAv-9)?s-H`B#Ul*3gUVC=a3*tQj3R+t*N^AVR_@0}%E2D_-p)faDxysC)PyVX01n_O+@J2;JGg;!`V~XQ z2Kx2j9?DhY_|u9BFnm+ApBy>9hKviGj?LW?RP{gQ>rlF2%I;y?U+KbGEIP~{_1rOTcdgSjL z^DER5bfOme$?C78j_wv}p4jYwqmeziOytXUFIfGWZ1T_XIFAaYdapHfnP*W8|7PAW zd(D1iEqC9_8IuG3bIoZOMf*&1j@8dMm%PM-QnMU4U@dAuuXzs@sc%Z4J_WU*4Al3X zYxT2Gnee0fFGXcyUB{uwBf(Lnl{IB+s!D4rYRlGkR1R-SNGzuG delta 3044 zcmYM#3rtpJ9LMn|0fD%@h+v8!O7fC`4x$n(3mIdki_is&iZ+e8RbJT2v@%b0AuCNS z9n7pD+08alv4IVg*la^Ha*QNP1*FT83MDqOa(#ci|1EbopXdHR&;L2+wWj>+!`}JW z;GK?tpYxZ<-(ZMp&b37R?+p}NsmEhCPQXhz8UIBtHz_huPr+E~cVIFWS$#FeP_M#J zd<&zU^V}{9J{mr;0Y}Uecs=dkqZa%Lqwp`BgrQU@x@j1U8K?)$LX9uP1T4cidWrQuO$9<=iIXD%8L#)WogGT5gZEA3!a96uI1KZtCx|_94`~AfhNxJU0dM zqsC=hJrA|f#W9?}cJ=@bVOU`USD^xIK&5swYTORg+1H`Yu*vGDkjo92BdGrIJdHA& zh??g&=cCrYe**cZ>?*9|X;cQbpmzF>)%RPy1vRk~x!eVA+R0_q16)G|@-cZT`caw9 zN3B=NO__MiT<=lP#8*)}tVN}4FDfGq*58a;xC8Za_M#RZL4AhdRJ2ZtnS+{NVBU*U zsF$KPP>K3#ycZ~pr|=3Yz-AlpKI%yuQ32bn{R|S*{ftWORWq1D+CVfaBMGPnN<)py zMP)YM`iqfuJXcOZ11nKaRE2u-YSbBSMJ@0FYFvZW+fac{paP#kE_cx!MQtpKMRZhg zsCUVaT5k?U5Z~oe&_V^)u>=+9A=EG5O4N>Dw)PrSz>iToI*gj%Zg!$F_XBDpmr(2d zi3%J-nsvlJjMVp^KtUa8sD-mp6XqjxToLM5xdIjFan#GT4i)Ha)cAVTgEpeh_)F{m z7B%ljREDnLIt*oZ-V6#Jg=x44HLwj8_>|Qz;+@ooa1GApjVr`=(T@YD2a4bg(~i?n z^RqA+3o#p4U@q389`N)O@}EYbkA|BtoF8mWycu<73sGnIAl`+`@NTTb-PntB@p+}-E`Uk9j+3KTah<|Lp=VAi|myA05OsnUk7Q7F6VO<&OK`SvGU$Xjs ziDUe~g)gda!i!cJw$7w}?U*R-z_6g9=b>^)2Qu45$4g zs~d0>@z`YN031XHiE}g$lI8 z+V`Q3?jUNNF0&Vj>3&1LXg4`C(0?m(8ZIA|=_fMDzb3wJ18Pu#_nM!Yhs-0$ny$_2 zgXXY#6(i}tZg#+E)Ou6R6jTOg;d-1`OhFS4na5B&{mSYWPzwyAeyE16ecYTtCVZ&z Ysi;ikHg-g`1~u;XRmV5ZOMN8#KN&wCbpQYW diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index 959abdf..8a41685 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -521,6 +521,7 @@ msgstr "读秒声音开启" msgid "tab:info-details" msgstr "详细" +#. TODO: updated msgid "teaching undo message" msgstr "撤销第 {move} 手棋因为损失超过 {points_lost:.1f} 目. 悬停在该手棋 上方查看信息. 请再次尝试." @@ -631,3 +632,7 @@ msgstr "启动katago失败因缺失dll文件. 请检查运行要求, 或尝试 #. TODO - resign the game msgid "resign" msgstr "Resign" + +#. TODO - Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Find alternative moves" diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index 86b01ac29e9127c9b56346ad2036e890d68234d3..d8769577f13506b2b23aab69315a78fbd5e4a876 100644 GIT binary patch delta 3106 zcmYk;drX&A9LMo5$o1c?Ql@#C8)<@Z5tzxeIpwkCAB5f1 zskvEOl-lgJM7FFnTTR6a(-JpGZBuKQHBqy+5Z3#{?`+i`pVv9hb8g@7InR$;YkF$D z%l@$K#(!V&?>_$h8LpbyY2SaQP&`9@DE@*;*o&zc7i*@bS*Use`f)anz*1Llz(nd> zFcOa895Zr`J zXuDADJ{+ifW=AL}qB9tcKchNa$3fVSiZGPkdLNHkSSsrIC{#q_k;{s>>HTz6`?<~~ zsP^T^WvjTwF~4o3poVXtB6=ISY!5eO<{+x$_o&FuB9~p|#@g(*Q;pR=o}1cbpaRQB zwR;@31#?jgd>%diSq(R(WCISyZKw|WPy@80COqz*UqDT84Y}-ZZh9Zd=z5-v>Nf^8 z;S_F~uo%^Dp{uV*Wd9ZMDjq1p28_Zc*KiwZf@V~T51`t8i8=$vPz%50>UWUKVwhc~ zqu!50W%w~vzhdX|B=WBb*71PLn%s-ss0_5ABKp?V&%62+RKL5(W#KeZAStMcN24Yx z#B?l1WwrvjY&|z+;!V#L-bHo%1Qp>CRLV}GGScDRUq%gl6Lm-<7*zwObJOQH9yQLB z&c&$yRnFBojQV<10NxG?`h50c1b&2?;DBq;hFWPSYQk>!yboD}#qm(7&2;9V0+@ix z$W+vV=D7EzsLWOb-+Q)(f(Cj8)o=%DLHkfE{}{E0t*D7kq1tu0`md;odQcPhA(utd zNoJq|3!t`YGU_Z9V>IW_=2K9|Qq(|I124?hq9%G7^$WNawb1?U`C(MQc2q=NsQ%r~ zyQs{Cl1>GZgc>gm706hO(f40SVIWoR#T?YY3sD`GBV$=T>esmm)&4Ei;d%!((IHg( z6R3rDqW1WA_x>KLpO0vinN;+uDdbX^jJq%&&m(Ouf)k~~G8`3Q5mw+6_!)kRPhlyI z3ROq7zs5}w_v1*6VM*g)YU%LnGIG%baVGYLuROC;i&cq6wht)U> zzrouW!(Xo1*oRv9Oga;TEyWys37hbJ9D{ioW=C;R2Km=-{IC(hR1U}2sXvT5G{;dX zYez-&ldE5I-a=)j9~DS!W^n5=oH?j1nTQ&125P(#JcUa<3YREklczEazn}fXD!hn+ zQQSfpWVG3L6q6oc@2GcR8};9^*aGSYv(5gX9!7YZ@iuCr2Ex|@Hls4L8(FKhU<`Uc zQh1QUWlX@xvB5u^DX2qLfEs8T>i-W)P?1)n4>url+pDN{pS$NrP!XR*eQxJa<9E9H zb>w(>cFVo+jSH?Q9W_uEYQ+Imif6g!i;(14IciH9aRP2ZeI3V;?X}aWvvUJ=+Cy@K z0VLyM>Vbi}$9_}Lq1%t@(1pr+4|2e5NS+zlwp`@A**sKA>u?5cM4jprI2Hdv^_#+= zMK~X|fY-19-@|x3j{|@IuTqHS!7WtBUep4HJY>dYleqC=Sf#6PLTyDWX5tU16yHIO z(~Bc9oKb@Pd#Ek) zPYh0!hdSi})bnRhXQmd_Z!6Bky)B1)hX=(jTUlTJV(qf}$~EPyTUI9Qi3%&JD=TkF aNnPeoo?cm7mifO1nKgB4wKnI`*na_#Q88iw delta 3056 zcmYM$drZ}39LMpm0Y~L_gd>WiAYP!53_YZ#v6PX{7mP2EnSpLObFKR2$}Zlh z45et5w`Fdj?TA{_I^o9hg4kM}p{AH=ZCWGB1Q)FLr}J#F!|(Mxzu$BFexK)eprfj> z%Db2vTWkD$!S7IhZ^Wr)b~NFC2U9#oJq^Fd6uge<*n@m*P-3(`0#m6^!7MCy^=ceI zeI542w=vnwv-c?Yx$%i>@VWCO#&iEXYQSrlgxxp@`%Pzx+TwV#d|xBv&@ zYGgut1J$nXzq)7EKtT~5!~WQc>d=NU_&X}XPWQYQwXlASruzX@L|Lc_a=GaF1k`xb zoTaGtk0Kvi$|Z^UZ50JId=VAV>&VAyxhONcQ5_GWA`2rQ`;H51v7ekBsP?_6cF9x} zST?F%5VZx2DPO8~1-4cDPM)*xfq4tM_mYTz%CkA2HU&o8_C9jJaW%%X|X zxM-prRJ(DmJ{1*c=>Ya$kk4o((RJ(Ujd;bw?4-dO~3-Ym_oi|a> zeXK^A9g6Cg<19jrKQD#+Q?^R?U=1n*n^BS0yLyAGA4PR+MLu?kiz4|0wSZpKM1DHo zi8-ju7Nf?i;G#?{cdqp)sN-v>2`z7GjBo}~ z{Y#u>ID~oyDu7j}x5j&kf{(&_)C8McgI%bVhENkWx%&}hPWuIw+S|@p8YzHeR7NsT z3(7^cn}o`2v3oun8OO6F6x47PYDMc%D}NQWhc&1H_MqDBcl9u8qLZkJBgn_DIJ;1R zB{7J$Y9Q(?<)FqJiwVqclPGAQ68B&ZYNAD`Z@#Bd5x?T@Z%0kI7ZuS#RR1PtD=Kpr zP=Q=WjrSL7;yBW*E%sxg-v0~=dXS46cpR!j5z@!XQQyjysEM9J9j<3l6KzGc--%ji z2(`z}?)eX>epgW$>ckb;m*~976rQ0l4jYhX){Z(Xw@?G6aKfI%Y}}6Apg3tj~n;mMI467gr~^!QD>qUAHf;;FxF!y zUc*vs<1d#MKAO&~*&e_=oQE6G!@Ds)lSN`7>Z|=`Ci!O!>*mI0Ov{QMnq8=r?L$R$ z*ww?%7S!IKLq+l{YU^%0eZ!+$l8QQnBT?h!;VGPmKVpnWo+>F^#&2-?2o4VVM{?=I zpJO~u@wZXz9re#f^Bq9FIfpHv{$?)EsJGu`wh_+|rY2fQ_&O8IkTuy_jK?~psqI2- zt#_INS+@(Q!*mNZfNxCn|A7E1!U9adVq{J$N3~ny?!SzRvZ9`4)fvY#5&d4Em z|18Gq{coqBfv%(WunU!1e}44-FeE9KhuVrVEW`@bTd@(@J$nmvW)7fEc{A!Cn)A2- zyIg(lJ<+qa64Uhle@H>uZbW^Rwjo)zPSn{*9~(_&APiv zz#JTpPhc{>i%GZ_^|~Lzbmq4(1udWr3$O>ZC1a_mK9h?gc@Br;c2tUwpau$KHl9RH zd;|5?^kJ2x*nFt*Qc&Ly`KZ7iM33`gizp1h^{5WpFn~KS5gSpdZ^8sTg^DDC>UR~D zfxl6a`UzVTW}>$4e$+UNQR6O0W$K0T@1c_0`) z3mK^XvrywzAiHPFkZreG)WVyP-Lf;t3uHY(^6#fGiW4OZQIVFQGEs)SWj5cr5DC&2 zqf)#DwZN^Y3F=XievHb*LDYE1QRAIP-eim59{gvvd$5!5(Ev9-MV;cWQF|0YP4p+~ wly|xNgC|7KOc2%YF`S7jLMIZA#f0AX*Z1?4R`qI=;D6c5-UsTO5YybcN diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index fb18d0b..694e89b 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -105,12 +105,6 @@ msgstr "AI Zug erzwingen" msgid "pass-button-text" msgstr "Passen" -msgid "teaching undo message" -msgstr "" -"Zug {move} zurückgenommen, da er {points_lost:.1f} Punkte verliert. Bewege " -"Mauszeiger über den Zug,um die erwartete Widerlegung zu sehen. Bitte " -"versuche es erneut." - msgid "ai-ponder" msgstr "" "Zeigt den Enginestatus an von grün (Leerlauf) bis orange(Zugberechnung). Ist" @@ -680,3 +674,14 @@ msgstr "Zeig den Punkteverlust auf Beste Züge" #. TODO - resign the game msgid "resign" msgstr "Resign" + +#. TODO - Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Find alternative moves" + +#. TODO - updated +msgid "teaching undo message" +msgstr "" +"Zug {move} zurückgenommen, da er {points_lost:.1f} Punkte verliert. Bewege " +"Mauszeiger über den Zug,um die erwartete Widerlegung zu sehen. Bitte " +"versuche es erneut." diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo index 1a8577021adcda04e61d156bbdf138f59b3e40bc..394e52092271ec57c51cc1124e4a80e0b3263075 100644 GIT binary patch delta 3230 zcmYk-drZ}39LMp;3v$0{31Z?;Q4&QFFS*oZ(?zW?vYgZ;>j*zNN0FoF951DEXxbmJ zWd@6xGcD63%dI3gZ^R`Pe^Pne1~FdY*Uj8W5URDKwC#YeC=PP6$cOd8<)C)WXtHbr zQ&H_*9Yh{;nip#`m#k{6_DQ_dE)%t} zd{ny$s3Vw!THtgH^KWMJQb?9yH>^i>*oYcnD{8{Mw){KP1ZR-PT;-+uXhv6gcT~R| z)P!SrX~IHOyJDN4k;3_F$8#yr4y!N*Yi+}N)CB8LA>M*&w*z$tK1VJ5gw6kjJSL9W zWlvOnE-J#~QT+<7rK!YU6Fg4=kEyj4t5FeXLha~doB!74Poert$5rIucH8Bo#GY25KXNFixNUktEtfWh*A41};W*C`HCHA=I~XEvo$r)a7~| zHPLod`+cZ|9z~t;d0T%I)i0jiC^G37t{^d(L=LXPyKxUHROeBb>NaXYX=I8q3s>MG zEW!kC)Br5OOnecwLq%jgYQpzXp>9UC{|eRaxGlec8t*phV;#jRKERYPi8d0S;1qn* z;ad%_;cjg1W6Tk(>dWr{PRTOn0><~_obfu2>%hYMa}mjRBF@!#2(`c`I2T>cXOQDJ zvytGLWvELSUQ2?p%{!91;5I>6yY|2p^ zsM$QSpf2$d9D?UC9y11WG|X?ZNyOp^REX|FeXfg;wq_P8^ed73W14LK5Ng4{qe33d z=rRSl4yFfcq2o|TQG|-nWK_hbV&wOqghI9i)v*D!!d;kz`%nWPK`rzoYM|e2`Jb3T z{<^J?&WkK872_x$gxbJ8s0~cQM4XdnKmSz}aAD0$n2cLdEB*{SVhcuLD{A6zP-l4z z6@g2(JYi_$D7vBAk40@{ye)qeb+ijm8(A}y`0MN%Dd4-oe2rS!1yskIn2a$Tq#}@x zeA-MOYZmgD{=Br{V$>xrK`o#R6@i(kap&3crKs_0JS6l@Rfi|B5f#dsVUZ3EsQUHR z9jJ*8VplwjTHsmK5ne;}PaST|1DH9yX-E97P6?ihkQ=D2{54JpV6L~?)L=BoCRJt;5u{s4Cz$( QgF(j^{CA-GQ~4+U0efv_WB>pF delta 3074 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 NOnt^@1G;QX`xjmMI1c~- delta 3044 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 delta 3044 zcmYM#3uu;A7{Kup^V)QC(|K9CIWL=e%VkbO7iwC9mn=<`Fj@|@i#hU^WPYyFGBu@~ z_e9h1LTIstCTe0KO$ldWVw&cq25M%OnL(rfzwbcu?fso|-t(Swp68tRb@_}F(-Y@1 z>s18)?d7j6f7j|;3t?aC|F)vIpL!Oa#0tQ!^fxXcFk6<=Vz!o?I znJ_Fu`>p=3o(N$l1tZ#zjqw=zz-dgu>u7{GF6 zqI|SpVXO~C10CLs{Wr4lG&I7}*l{X4!CW-8OVEBR(7oS??&0oO{|5Pm%h6lt{RXVY z%(g|J%a0bL%yfF*Sz*02Qb+NuP*7u=o$gX&Q4?1u)dN_YX2fl^AhK;E>PKRi3^!Xvt zk=Ta%I5dDV^sPzEr_g}H0(62UvBPF`rIqM}hhqCFWX@2FruOe>Jvtdc8k&)8bU_7Z zzkXXq9f?Ur;uN`6#WYgtSN)I zRV~o7l#hyu`;I31h#{%2G0Mgcl-A^Jcu@=O?oew9nniJnIf*KBm6_tE|zq6@7=_xNzU z{~h|=PiTg2;tSZ2=n`EhOs7zc>yhmY-(x;rM+eN}gguL0a3e0pN!Xne)eo0rN32E< z*)Or)kneAM>fP``9D$>8A-cd*+2nr=g<2ZAV}HW(KcOjTtmw)DaD6vEAh2d&4~B7=;he1?@o& zdN_<__ydxhFsd*)-m94B`@fZf6IP>{IEiFG+>ExmKY4!u=F>h5J@wP@A>4*8tQMW% zPt3!Py_0X%P&6}dps)Em=%HR=JM)J%6kO>>WLv{-?12}M?GNb>Bv;%AO??R(`Eqm% z)}VX31)b-boiQ1kKd=BJ$sY!U7tca4j0qrdac82SDMA1M diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index b2aaf45..4ede1f0 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -522,6 +522,7 @@ msgstr "" "possiblement pour cause de \n" "mémoire insuffisante : {error}" +#. TODO: updated msgid "teaching undo message" msgstr "" "Le coup {move} a été annulé car il perdait {points_lost:.1f} points. Vous " @@ -715,3 +716,7 @@ msgstr "Indiquer les points perdus" #. TODO - resign the game msgid "resign" msgstr "Resign" + +#. TODO - Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Find alternative moves" diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo index 3d441077cb5dc22bb2c22c0fab6387ae1135c8d6..1617864e752194e0225cb7ec19d8635103313e9e 100644 GIT binary patch delta 3096 zcmYk-drVh#7{~D^#0ytN1QF^dl%j+pDu#loGe>RU%5+KT5WF;T-bLFAJejmMT3*XC z)0vyuv@7TuHJMDOVZ!=DGi+H)ZMIxC)chm0-XG4hl{=i*_kMZ4-}AF;?WgO4i~XbD zGX8zV-~IgE?5UjDnYjNPNV1)L3SPk^{2S9SA>K?)vr+jm*dI%AFjjbeJ@zBN6?@}8 zOf(DZAc?*dG<$Gzc2w~c%|Y%q{#9x8jDd2oPuiq45ni>4#0Y3LfeUI z_hENFFl!;99kpW&{)FoA8}`6^s2xVpTlI;kg{7g&A42VD6!KUhFV&Zz+Rt$3pxQ4& z9$UpLf%)xa5^A^!wWD{C$M*A5WDcV`o-k?${ca(T^`wzDG7vTK5Y$BDFayg_ zkzI^DR?AC~*c^Cb531wGs2#STLUtMzk#k;u5jF62)Fti3s2Vtfmp;EysBxZfpGEaw z;;z9#MS>VMU}g^FAh z;nYTwP~)YeHj<06`u@j}=nj=vOh*ko8`WU}GM3e#ew`ao?YE#V*KX8A&8YTYqZZnU zI^%0ze+Shsj@>9SX&5XcF_Oe&+~xj&YM8-|8jHhGmuoIBwO@eEB`)@ z2A`w+_yb|2BCJCF3UDGmj>TAyitI5|`!f;ZuiyA#gTu>_izmrHikdJwGyDwW+*H(# zvQQJ`qK;+~D%7)3kz0srw+dDNlIORg+U>&Qcqkxojl_y9E*j2#&}nNy^H0;!*(}v%-YC5nac&F{~+Re25+Kv+L{+$-ge~p?Fw>gb_W&tAZ1i| ziLy~Eo$C2=Odwx_`XPD+S&O~l<&Ew!Bv{sgeen-efjoQ*oFQqNc5o8&iQmcIYA zF=4|ZB#Jf7Y;lDb=k^M3!9I+?bWCV?f3FVx7o{& zq5l7|b`qN4XXKt)AGW1mtUS~Jg{Xn2dA=02;BwC|_WWAUzlz$xHq`i^U<$V4Bs`Ca zm|95uRWY=X$*>sJVF_x&I*h`4&%cJ6coVAM9@Jeq?Dg%aAC|MIh(vKN+CV&xz(L5| zR)U(RZanelOS3H$=xm!%9lm$3xLv3P{e!w>y(WalB0;l6?2eFIiW=u>cOGitOTE6< z-B?LNJ88hra4%|QGm63v3sD2rpxSLf?d)w#!uL@FH+lVWw-YB*e!ZzV?r4wrs--oH kRxhursb05eP1Dl8GY6-ZR4-qc`M=`KWh+$Il2;J_FZ|*zPyhe` delta 3044 zcmYM#e@xX?7{~EP;fg3+`~hfSB9xE=5xs>ZDd-F{C!whe%QhE(XhowI=$z}uQ2T|c zrPHCcOiNpvSjaLbWw?H55xJH`I?Kw+NewYJGiAL$+-J*OzOQr6_xyUEbMCdVrl&f5 zZbbApnQcJ$Z7W(O!Jq85zBcGQ4QjKaTA5%&1|KGenrGn?8+q9RH|Es(`S@AFaf&2;CX z`Y%R4wwy;i>su8Cb$kXD(eud1w((GA_M!$JLPd5A`PjES*o*z_cBA_Dq51`>D6n)? zzYyvOW}-H@5X1c0G9Dwb64kL5HESmVVwW!qAqxx+{o&6iAGyK5oZOF%db$e0o2eBJv zb_{AiyBl0HliZk>GcC%KZ+XIj(qG#9*X2LY6E?!g%TK?ikYa) z&O*(%goiS*(p?>*0kSIslDb#(@6mYQ5i`=Z72)X zuK<FzkH9QB3|e1+ffVdM@4i9HNMqtM`i9TDv(R4 z`Tj;N93ag);slJ-_dkV#USy#ro{SnW9T{V#s9)s@)IyJZi<8fS%T{t(K&W)##pTUJAqQkfd6K^%E!?{15{3_C&xsl7e4>>LS7?twxktEth)CR+W zNs)$BjHh8LD)PILJy@BySG#pc5^M`5;CrZyed2!Mwxbp}?e#89pnk=T%IhB&wviOH z!xZFLEQA`k5H(;0rsHZ_eU5aex0gYQq#AHYIm)-*Wn1> zZ${0(2gBSi`;vlwsV<`?xQ2>2hHzC6qIR6>^=z*fc>Nw!0EuI z|3L1a_2rX)4VXAJvS2X|q&~;%_o5bFfSPbQ>aMKv_nT2aDBDpP`4qL`cFe)E$XXW5 zd1;+uv)5jlbXE?!qG4-)}lGv?Z!(SHj%1 Krt7((xc>lQ;vb&? diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 62bf609..8e9e46d 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -129,10 +129,6 @@ msgstr "一局全体を再分析中(各{visits}手)" msgid "pass-button-text" msgstr "パス" -msgid "teaching undo message" -msgstr "" -"待った。{move}は{points_lost:.1f}目損です(マウスカーソルをこの手にかざせばとがめる手順が表示されます)。打ち直してください。" - msgid "ai-ponder" msgstr "この印はエンジンの状態をシンプルに表します(緑=空き、オレンジ=処理中)。エンジンが止まったり起動できなかったりすると赤くなります。" @@ -670,3 +666,12 @@ msgstr "損失目数を候補手上に表示" #. - resign the game msgid "resign" msgstr "投了" + +#. TODO - Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Find alternative moves" + +#. TODO - updated +msgid "teaching undo message" +msgstr "" +"待った。{move}は{points_lost:.1f}目損です(マウスカーソルをこの手にかざせばとがめる手順が表示されます)。打ち直してください。" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index b637b58912b41421e721f51c7ce3203a70648690..4bbfd006a57cde5a6e90d959f36e8f059d734fcb 100644 GIT binary patch delta 3111 zcmYk-3rv<(9LMqhtEjyoB1oW;T*S-^U|vxUlxY<+*cXDj#ke9k$~x&8m=d0sjy-&^Io z7#6VI`1djYAK?G30jimOAM~G*6i-vXAAiSC?8V_2JlITK$D-;}Fbto<7%Xu08XQV} z3l73vIK<3nO%y_CIOaN>a<*e2?blEf-oaq>a*M!7q{)&n05eb;5f8yk*lk4Hr`3At<WqY_OGe=MZzd}X!19I7K+}NA_=~QR+AHq%jqEUfO zM)i9Fbp*Mn4K79>|7{sJrQ~HChV`fc`%n|KpceebwVy{V(1~2u!%fczF}vC$P~*m< z7R=zL1#?jS@?HJ;p`5=WUP*%@tik)R&ULIuEwBrf;=`zZ$5HRV*QkyE?CRafWr3_N zqfpNiP#Kgc^4nxoiNP6i6g$;W4O% zQZWj1P?;@7F01CIOl$}hfoooK&9+kR7P6e^NXm7Z=zn(fy}Cjqqynwn}nKY zmh)NE_%de&j-XzR3c%MuL7&fF9Eb-{3mkSGPN8<%hFb8lYrlu=!GdX2YGa)fPywW% zGBO>tp}FpP0V=bl{^vehO+gc_Lv?IGZD=2A=Lb<|*n(QV#~TId+6 z|4GzF+fZkG-97&sH7bDr`azZ&C#w z#7vCk_jW8ULM>d2aoB*P@F-^Bd7O=5QRJVpEhLO&ting|0J2%@MAouiRLa8n3ssEK zScvN|$-^HdT%_mG{xhybMOcezxC1v}D{4cFV>mWkA4C528$UnR|HmR9zocG{dTCPW zt;iomo#9+m3iDih5%M8eB`RaDy7mTCzkR3xkDvlLi~6kF@I&nMQRt!2Fq%!^rg(nO z@e;;)*zp*%r?KZjv%9pdUergRK9@{Xg!3>Ci%}8Oq9WRY$+*L{pT%J6?as@n zOx|(zd#)ZdsV}oW3-cE&9@R0$)iY3MpM#pP1bGdt0`)a)M)lu=itr%nC|gk*ZbLWQ5)()4ZMYVX?js-KP=V% zE{wvV)W@Nory*aM<)XfVm8h?v1~ae`mBH3j@*hf}gNAw7jhZNnFtzXk)C5JS4Xi*d zT!mq{7Q=CyYkwbgbj_&#H{A1Em`>e0&Fpc^LakFfjr`B1@CFThf!2X~y93Cd3_)#h zBx*wms8psqGjSpH8K?z!I`=vcq2@V)8vmKApLX>Ng%p&UF5HS9wyy!(Py=?NGH?iW zB*#%1ID;B@0oAV?Bhf>c%E$;T$E5V;<3XSFA6&S!vZQ=@Vdaw5B^Av}Lp;$D*-Mre i$NsN5cG-(O+r2c=>%DsPgR38HxUqeIbNSSp{r?5*zdus| delta 3057 zcmYM#drX#P7{~ETIcbO}Aetw@3@pMR6i;blh*OJ{$ZC0Pq)=ikuv}|Bv8CBS-6$tB z+cNEd<)L1t*?`os8f?j2Lub0uO8Y}*=2Xlj_5Jl;Tki4s+~>n}-_Og=wdbpYpAsUs z8vnlL|49CKM=5949Q(gRNw$z5f?YTmFX1q}jXah-Ae)bMrGjy58XZRMrN>_&BLLhbAb^4Jf&Sd0DQUO~0*MYS79MjJ~*waY~v zK|X4M#TfA4mhei%3RJ@yRL3pIShmy451SSr{~melH}^WKKAP1ivLjLb z(%tE(@k<61f6`X!6)&SAunD!(_dLJP^UbJ^oycQ9^U_ZKL@l5fHBmgBM_@WCva?X* zE#jp}l)LK!66*LCYKIM|knKiAWWU#cg&MdWbve(W2ELB^4EvMOIAh#gRR03^QM{A< zBGd*dQD05)28n1A>roTbd4pZ3m4;9g9`o{3$ei{&DzvxUNE&Ga15ptfj#^L#s@-H% zWM_H(0%V-PmXJ`xO4N#KP%GbnI>Rlf0X{;t+wb`!sEImI6Q4pJ`_;XP+E^Te=%|uV zcPSk;-gt~-erU>=Do5{1}`+EElY>RwDl4Lk#D@iE+kXRr!4aHD46ElkHL{N8Hf z<(P(*I11}=8Xmy8*o{1vH-h-*l32)gCgXZ!an_2=VO^-mT*gwoi7Rjkf2qdzG5ZFW zsh(MM#zmvUJ6w)a$gjmZ+>ct&gDGamaVhGjJu8*?Yb80UoF6`dx-{{$*3OerXPAKs zVYZh~M=rhdZs<1-4=jRt96t9w$+D7w3Y_nAV3CkLC9n zPu$I4Jj%yr@P~u^=yBn8)%TdqCclbv>ZX2gCVww*`+ebsWoMbu)Cy2XP=TDT)nY2{ z@_f)ng1PK0DujK;hX+W+H1Zj!mCr@(qy%+jOTD}vQFkQS3n7odc)^eTS*og^KVE)Oho< z!y8_Sx_?$nLYL(e)aP*?6|x)1y|JX6@MoEe1j!!48CZdH@N?9J*Kj8GeIPu+!#JCK z8LECC>TWc9zFjiEog$%~UqFt}dQm&hB+hx5k6Oq&cN;1a2i+Fb*VBfY=r$@cu@n3< zqau@xe5sa&I@&oHaBr-fL?UiQ4bX_1;1KH4w4%=bB;Fc+C`+0c-r)q) z?a#+)xEN!x0SDu5T!05B5`PU8!!|YXFjR=rQ47dLO*|D7umF?rNv~gxI=U*)@Adj7 zoJx5+=40ff@PZ3*uKFV%p6#4O{I#Pt3S=j0g+HPe)Qt+|Ew>jJlkZEswZLWWO1Ah($ diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index a127532..fa63bf0 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -546,6 +546,7 @@ msgstr "" "`threshold`선 밑의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. `line_weight`을 증가시키면 바둑판 중앙에 있는" " 수를 더욱 꺼리게 됩니다. 판이 `endgame` 비율만큼 차면 평범하게 둡니다." +#. TODO: updated msgid "teaching undo message" msgstr "" "{points_lost:.1f}집 손해이므로 {move}을/를 물렀습니다. 커서를 올려 상대의 대응책을 보십시오. 다시 두어 주세요." @@ -648,3 +649,7 @@ msgstr "돌 위에 집 손해 표시하기" #. TODO - resign the game msgid "resign" msgstr "기권함" + +#. TODO - Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Find alternative moves" diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index 9133fed04b500a42e75bb5d660abd5a0c5002e5f..6c4daa3e7f0b9a85752879f61a4a769def029364 100644 GIT binary patch delta 3098 zcmYk;3rv+|9LMp$AQ}h=CZLi>Kp}5PBB*)EBPeR1WuwqiCn<`kIF)o3dP*%COEGV= znOd%}Y2+rlg%?)NW#T25*``fxnPjQiG|Eb)8u3D8b;$^*a;)T&D1mnl~2bGn2X(Tn#-@iDDrP& zTil6}W&ztxqCEw5uE7cCMGT|-25P|HFakq)#9|y$Wc{!;4n-}{k81x6cELH=5mzG< z+FPi0AGG8HX7wbrqth6QS5O^(#9;gzwZkBKt3DF7uuiD*?x-E5As-vWL-jeR_7k1Y zq1qQAA6v*Hg8A)b5^A^>wWBS_$KL0m$m~aTJcioYS>$6^d9XIS<5Xj{kL00tKGeqg zquOPoj$k5cfzM-rKby}(Az6+O;s#WQU8n&Lpe8)-%D+ZU@ICUe-+8FMEu*VE7S*p8 zYQmvBG+`d9U4hHbisJmWx zm+`3jzNiRiq59=HXG9Z!P4FTGe5}${yp4)LEow)fy8Krz{~fAd6Y{YT8fhbOsEK=^ zCd$Nk%tJ-C82MN^4@IIX;1b(W9cxfKtVe~c0Tq$+uKqG=;M=H6+J;dza6Avaerc$2 z#yTgX`jP!3oq#FQ6v8?#i2yHCP0N3T=Y3H);bJ zsEGJc3mWh0r=cQS?9~Ts2?-6f3e|8kYC*eDEB_F6h6hj+okX=e@A8ePiGD#%+>CrI zlupuz+SmZpQ4K-er92Gf{#iZ=b)1G8sHCOBY$ro5c?aGg!`kg`T=pw5B zb!QVQazTVs8;M4Z*9EnaJ{YF=Ka)gDs9eQ()W8L(4l|IktPJ(-T#0JG4t2S)u7DwR)9F9IJ3vmig!TNaOuQQ3~muE7jVlGx-8lFQR26y$|h9q3C zcDM#V!FjFBCeY|r@`t*yXdIbfmWaieg_Zadp2j5nn9Aw+O(OBvcls8ph$YQMyIad4Gl}8RXW3!fmI+6k` z$LTJA344=oL~S7YQSVNqB1M*uJ8%sS)cc>xb_*z&i7eg@<5PGSiKgWY+h2iQ$e+SO`~h``#y!S{ncpUn(0e);bv7@dA9o;Q z*|(?#bREHBa2EE*8swDh3MvvYelNs698EqAJL3ze`YKd}w_rT(LES$)PC^6S#4Jo2 z>78W}b|b$WHNZAh$79z~t?7nq1wQS~7VqI@ED#BAiA+9XtjD^MG*&m#T_B+gJU z8E<1x9GC50Kh%nsp+fcs>Q`|qCSf&l(d`84b!|pn=GLRU_7hMMn2KBljDA4RO~_eHeu4&P<$3elRLR?_n&~pcZ@#)&HFH2C7}~ z7;n7r=_GW<33wByqE`I)SZ{?hQAe{Hbr}z$LVpW&8UMs&OlI5KKrSj`Yj766Q(M>W rNN{-Jyt1N2rG;g4mJ}_no!5SLa%|3=(wPbWD^8fdKy_bc-0S!+nJ_|` delta 3046 zcmYM#drX&A9LMpmH;}lh2>CdTU@S+9F>~o3))OuAGR%dS zn6+hIDs8Ft({7VuZkf2b-^|KfH%U!P*NDZmFxLCybGF=%=XK6=&U4QBe$ROx*Kg}{ zYHJ_wr@{TV8~;A#Z#aL~2dHLtEb@O7DYjA{ir?TMyoPt;zsS!LqWpR~4yHa4Q*f@U zuf#a&4H%Bi7-QzyP71Ny*zY=g;yi_SaQ}PMfWKli{*4J3PKBb4!2XzxTHqK|{}~v- z3XI3q$b_~L)vx7t-7`B#K@qiL1cp!#oX39n2P(oY*WQa-*g!_p{UNA`Qcx3Qa#4F8 zYP_k=QdIwi$j_>|L^HqDQ&7j}P!VlFezu*9GP4);;1N`0ZOG5ga$zm@i?b8ezZcan zhKd49L-or=ZNXI30?X0k&nmeL!8%mO2GoOFkg@DdcmFVI;Lnhso#CSP4tKv3^;|z@ z(L_VJXrc^Mzp<`fhzhhcj{R3;k8)!m*0_#!s0r4gQrm>;w+*%TyHI=hk*l9Zes;;( zjcN~LHOlO8)N>imNvQE39z^~rTa9aY29<%$s7POP^@FZ{4E10L`Pt806v>~c1@xjO zisj)X%s^$f2sPd!F3Lo$bFD`~53WZ=*n&#gUQ|X7x%Q7y1Gl3N=LOWj-Kf_vf{MmT zcjls=FLpkJ!>BJp1yGNAYrN+vgi&ZjP0-{z>_M$Gh??-YyMGRu)2^UW`;W6fofJR} zDkA~Zf-+J4@==*Ba_wcvIG$BfP{(@IiW*QWe+jjRTTlb+L-jl4>TRfrPN60~hy3iK z^Cl{=Xa><%#iPzr25P( zsLcI<3gjAUyuVNr4f25}PJ#A?i=(-Le!ZAo_$`LCc5&i_26SdI7LdpH7rM5XE$He+}) zuO{xq6@ARI=+sDkdkXuCNvVA8un3E=27kx5F&&#}tiq$HPkTZ-`Ol#cptUap&O#lU zIV1g)EkH$7g-UfTGPkXD?m&XGBdD_yLZ$eMYrlnh?E-iC?c*>=eGX1zKJ!NLRl{PI zzmgm0aShJQ;^TvDqs>ZiNj4`N_ugZ+3OBIow7zCNq-#0#60H;YS>l6cZ(td+7VE@EFq5eB^!|Gk%DM3&l0}P{Ncyn=HE<*9FdoJiFob#= z$_vb%#x@*^<2dR%^|LX6Td*1rpw3RzWdHR{!dU7#IFk8oGKE51ii~A@Pz$(#GjQ}2 zz6n^5?1t?|MgAQs#T_^uyHHz~U+A}&BPq7Un1m~lb7z}S;~YY-h{9zGiI_FjPkkY3 zf-2O5wWvL9MD2Amrr}$t_LHuD3FE1UF{s|EBvi_0qatp=RD1<1@Pi`qpG6^Rntyo4 zqgGsiO4&Tr`~MiGV=Z#PtqFD5+EAzYOH}_s_1I0~<#B8VY;WvmRJz{i8_k*)oLug6x73dW7U G5&s`3I5o@w diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po index 82a6d39..112da9f 100644 --- a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po @@ -117,6 +117,7 @@ msgstr "Дополнительный анализ всех ходов-канди msgid "pass-button-text" msgstr "Пас" +#. TODO - updated msgid "teaching undo message" msgstr "" "Ход {move} отменён, т.к. это потеря {points_lost:.1f} очков. Наведите на " @@ -676,3 +677,7 @@ msgstr "Показывать потерянные очки текстом" #. TODO - resign the game msgid "resign" msgstr "Resign" + +#. TODO - Analyze again but exclude all currently considered moves +msgid "analysis:alternatives" +msgstr "Find alternative moves" diff --git a/katrain/img/Alternative.png b/katrain/img/Alternative.png new file mode 100644 index 0000000000000000000000000000000000000000..5f23ca22cec8ac3dd38368d220c1ea7990df68f6 GIT binary patch literal 4384 zcmeHL`BPKL7VcaEWWj`C7zB+hVkAHW6lD=4QPe0Zn=FY85)=r`phQ574w?W8Iw+tL z7EwW2MA-sS(E%YbBM}G$HxxyT0)|mk7D3kVE;IFhc=hIo`2*%w-MU}*`OdlB{nhE} z)2BS$X$vrmFaUrBTeocV1^|K~1W+3A=PT#w6#PNNc+)n3%67sZa0AI&zhgZB)#=!o zV0E~SW^ZA{0DzOszX)kmX$Sz?x3+Fv@59;s>2+(C4^0P2y%NKlo9khO-`JE;P-rxE z=dkUn*O6+w5-d!ee|!-Bbs-$*pFicjtz**SnV18!<})Mx@1}O@Z&nRu{V>Wp^+s@_ z_d5)NmO*jeb7Cf9dhyLz!d3%?;Yf<+yU2}^R zwI9?`MSXapWPbTls zgl*s0VOLK6e}fhQ(c<`n_4p`s)Xu;Bt0v5vW;r`cb-_eizk7V0Dzl9fFmWCN+^IKX zwDI13Z|yPQ$H@yEZjZjI5Qt7lG9&>KJO&ICjyv}dbisW`DFl5}=%lR4Ac zsn0LFF@<$Tw*L*#dKv)^F*KOuyL?v!YELdN{ozS6hN_Rn)o-%v^8yefR&i*R$$3b- z<-VGA$a*VvR*U0#$LtHs}9uiq6BF4j{lb0Zo z5fVArynplpL^UBXt>Z4#l0f}drpRz`)fX?o$yV@gbp^Xz1w$qX=;xZc_{|8#&O~JA z9@gCxkZ1=IQ!cKIwp8ckq4fsZ(xUO|ygHQrK=b}+YZ##y4LookL8y%qu+BI-dWb6;& zj|s4RnR5!n)=>*YyFBhnaPzxNLpYojS0atC%Z?FE<;CEljOU-2u{x~b+!^Igu-s;V zPhEC`Q5EuzfDtXzXwW%5*nZl-hHa?MT$&Vw-Vzsj+tR=x8?wn&FGUjTRzBem=6N8( zMN564^MN`2Ztuqm!0KQV3vu%Y8JqZV$`dTA*5`vz->}+q2kwzT8$H79B&%L7B*saK*?9?RNn$>_|6I&vOdN0I|`+uV}JO2BGXg2no6_F*;W z0%y$uRCMLgeG1jsG-eG_vZ$>_w?&SF58z4L`Gc**>TNu4Et+z$CAUMS4H z?lxZTfq22&RF1Txt=z_!btORpG?szhe>pVSf+57KGfnk`Itu5OL7!D&))-M3Ih^?L zZg%eVkXCqp3m8w`3SumU-p!fo%t2m_fX`Igh83M7PJ08pumhF|`7bh9zVQ+e*$(+9 zUVbjyNOT&%29Sb>e38;j=-GT)3qwU=1JTE1RH9`x39Ki_^@F~VasKItSHbaW1>ZG8 zn&)3*k`8GZH!2piZ`! zFw*VI2JNcMfo|f}XwS~K6&6ly0lJ`PnTTqhKbPLx|ZHJj=J!=-GClnCei1EC8KXF?(g(xabx zrdL=oXe`%vaW1p2P@lfYtdzA?%jls^F11tLr;qJ@1BORyhy1`$sl#J)$;}T-18z%EpIgYUrCPpW11rng9~*r6w0J&; zEi^yHxslBrd)&Q~(GP`|Y5mywsoJ~tqk zB!r)1EMHz!<8(Ui1Fxc{Pwxu{YFNdhU+@_IN9UmO~N^Ir48c(NQe@(p%pDQ$ddM$7XL z^iK%as>$>Sr5{Sw`h^t)ZXEMuSF)?`x?f7;OZdHVE3H)l2Lv~0_$+x%^i0>O;4mkg z|G_VBM-2SZD0M44BAXFq``0mD>frIwk}vFY40*;%k+J+7Rf8=|;Tp|~BVP(8%i-Z( zGT47xDe$er=gCXqK$j3^iE93{&TN;wmSM956SHJj=?VhZTR-+H2@(JMu-U0#vosx1 z0D=2hpR?2)G1ES5cJ_){mW~K3&G*sB4|k*5N%KRJ^EqzR<%%n!D5EI1$H_>hax0I}2?}~nr)QgW2>JK4^%zbH; zdU>?SER(m!Q8ly@3)y=@o$n?jN;0~83z`lSYpY3YO=5w))M!78p>TJjdZbahrT0Z@ znLIe)o&4eiO>@LL2i1^%s+xx<^gep#?SU-K%SA}p+X+bwS(`vbJ7o9b<-(0@ZK8sZ zMj=R+iW4$<)da3XT4-XDIbyGaicQ98csPzCa%7-HT%sBzB3V&}Bz76=ZB7Eo{E8sm- z>5HDvb>#n9Y-Zt7>HPsZgLcv{qgr{uiM_d*Glsdl2!@?-O8V d_{XY772fQsSHc7TVg9`9)=lmkD>pC`{{yVDYH|Po literal 0 HcmV?d00001 From 0d8f8828691a04c564173625253f1868b8dc5cd7 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Tue, 8 Sep 2020 22:29:37 +0200 Subject: [PATCH 32/47] alternative search --- katrain/core/game.py | 2 +- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 11927 -> 11996 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 14064 -> 14133 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 13156 -> 13225 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 13863 -> 13932 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 14864 -> 14933 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 15151 -> 15220 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 15009 -> 15078 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 4 ++++ .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 18951 -> 19020 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 4 ++++ 17 files changed, 33 insertions(+), 1 deletion(-) diff --git a/katrain/core/game.py b/katrain/core/game.py index 7af8ad3..ee4077d 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -377,7 +377,7 @@ class Game: analyze_moves = [Move.from_gtp(gtp, player=cn.next_player) for gtp, _ in cn.analysis["moves"].items()] priority = -1_000 if mode == "alternative": # also do a quick update on current candidates so it doesn't look too weird - self.katrain.controls.set_status("Searching for alternatives", STATUS_ANALYSIS) + self.katrain.controls.set_status(i18n._("alternative analysis"), STATUS_ANALYSIS) cn.analyze(engine, priority=-500, time_limit=False, find_alternatives=True) visits = engine.config["fast_visits"] else: diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index db2b7ee9427b52756373fe4a66045ca6a1b451b8..bfdc43a09489153a0101b370d2bbe70316c90d76 100644 GIT binary patch delta 3143 zcmYk-drZ}J7{~Evpx_ZuL^M#;Bi`kRmd*-IQ7hM4N_i{G?5Ibh@GuVIE%dC}mWwH( zrdeLX%50fdW?uivTsK)|wn5%<*_unu(z)hk*89VGwrW3rukZc)eV*^{(E4eorp3=> zwRqL|?-2j;_;;(NYG$X>{__rsr>S?qYuFCc(#>+P3u@?4uaCwo>Q7=fjCy?~W>T-m zRQwp*n8ob?g|;+&?E`*tf5+Ce-$X5#l3~VUxx6}JAEe7hU<-U0b-)tT_}SPA7hyK8 zMK-keP~-MB*W+g2Qcy&vF@Tp*6Ru-2wqcec%tG~dMIEfKw+}`|G!l7iEHCv>MvV`< z&!g6sc2hkE zX|jQCF{=MjRHo;k##OW<|0*n}K^tsA9^2&uK0{@o2^GVVof zAL+6}cMK}9$5B@`9aGugDkx~dMW~6(Pz%+1`$p78+faWA_o5E^owxsjns*iTt^9+U zpF#R$CsgM8paL0+T5lu<^!qQNpgW$5nh;S3#!w4aqb4jz*0v3(ztX!<Z;mtdi8fl%^QTxzyJFvETG{r?2g}HSG9eQ`bRMMX58Jgvf7{1Agdewug; zYj6|y)P()=6XTM4@PSfagLPQc(`*JdpduaEE0OvUs4ICI`7A6xhk{bH6cu3|>SSBo z9p1km6?p@4Th{39f1&2J=$$YN)gMHyQ{?SqQCBbtQ*b)cAGg`wP?>13#qP`QTDKnc zE$sCA5!8amP?4NO1#$)ZV@p0H)dwMevuq6NKvTSZRYKg3 z-Q9zV{4i?cCe+XCZ_LE@gsc9ZZV{$XFTv)BQ3sucx~e7KUxRTCSWQ80L7i-edkDE+ zYrs}`1vTy_YJ*mUr+QmA4+GTud3~^3j5^>WsChF{`#e{`{VS5i-muQyhPr}JQ5&2@ zEqor6@Cs_7Ywj)7)g*@!8+AnWhfr5H7}If*I|GTq%0uLzpT52B9ea^$vm>ZfU-I_! z0f_~2Q49BW2e?DrVaQo*wAZ6JOrSl`fa5P-D qsIs(jcUjvHI&_;53CCtWTN<4coLwFZhW|HiZu$I3=hQV5Ri1-!xCk?_(#mxhL-}0{ z!(ABdoagrOFo}vo*5R0W1|z7yhMI5~qtM4K0TYobmxm!Z54FJ(RR1NIf~)aPd=pvF zeTeF}cf9O5*TaJ%>O&u1Kn?g4gK-QMVGyI$9*x>q5~_YWDx!Ska>d-#UW)3!*nASz z|2gDxYq>?SzT3isIyRyr`T)6HD>r54bJW1^QIY+KT<#BU?9KgSsb5p-`RA7au zeh;9IU@>ZgE70S=dx4u$vKjBdX4HT-)C31n3-((5&!`11A(y+wP3>XKuKEPjxGdCy z^SEh2KdRqSE3b^<{1x$9DimQIhGTUY}8S5OQ6jaqmVxtxzdG94Az z-Ke9w5A`nj(Z~De9_K*=D^U~Gj5j#95w+0ks9(S))JFGN{nw~*Cs7fdL5&|UhftXd zBAp5(7BycADv%tE(Dz@&!+5H!p$s+gQq+JdWG=T3_3PY#>c1WJa(#qa=n$&^QPf8J zQD^*@wckdKizFIlCJDWbJj~`{Dz;)e_M$poK`ng4%0Aw(`za^ji})Cp;$h6h2;MAh zs1Ox#8EX6z%)sZd5Vzu7>`5m7+TkrKW?>jV*mq$*YTz=|nXN&c;TD{a^|%0!;7$x> z)neR@n(r(s1J_Wg9>Yg5oWF3&R5{jSbsG6shs)M5i0dhjp%z>>IdHbGp+3jAQJHzq z{M7u+>^6^@r_GC~`39{#jE$6oJ@UPShbB}++2me@jB8`|CIErNC_}w&AX6{A3w4R>_MYP;pWgXU`BCbbH$2D1f zJ8IxJW}mg6Ma?s0^+B0|%*LQ1PeHX$wQ^pd?71RqSZF?CK81P*R$JLa9o1G;BrT{& zIxri*wemIOx5%%zr_RDa-WP>@MjkFHJn2Y{1^3A#PMeG zqPs#={li#*6_|^Sn1kJ@g|8x~<8Go}%EYX|Ik`#+GqyqsOF;DORc@kT#n;^|5x##9d1O9&(&i%cAzHw0yV*5 zD<3z1K_B&(tbE-ZK?M*_Iy5dFHUCUhAVpSQoMYervsCB^)}j_{K~20HgRlcN(E;;I z)DiTc7W&ERucD6bI%=Mn+<=pjJ-KY;%XUv#{mZ%JpW|^J6-xD9Yv?skp%(t#954sX zVPq{gYUQlif&K+%F;1j?zPZTimzhsL!-G<@5;x%n)POwNzKNxvI# diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index 8a41685..07aea55 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -636,3 +636,7 @@ msgstr "Resign" #. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" msgstr "Find alternative moves" + +#. TODO - status message +msgid "alternative analysis" +msgstr "Searching for alternative moves" diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index d8769577f13506b2b23aab69315a78fbd5e4a876..6d9030024bb1e5b88c7f61b2c7ec7b7dbd46685f 100644 GIT binary patch delta 3143 zcmYk;3rv+|9LMp0;w9uRf`Z7kLIF`xsC7}qrBewhT8OyxR0k!G$8k`T1sxsBIh|oy zrj<6bnzafSxGY;2wH5PTP1Mk`nyu7uv07qT-=F8%%Dudw=Xu`e`hTAHJzie2+aEkT zr2liqzYqCK;qR{j%9(XX{O2%|XUHeu?-+*>k!HhjB&uqW%a`B~^3|AzewTj=W68JT zAbc02&4Ts;i5LnxU4>K5UvMzxS5X}fj56c0ByNeAjXbhR*dJ%1CRmQDUxUfmfJ5qjLSi>jZ>P4)6o z3!8#^UV+*I4{Cw|3~HrKB)IGuZVJsS7>|2U4G*C@I*l6mqAS0O8YrAzNm>f(c^<0# z4ph4`V1nk3l~rm@5gA$ z4@Zh@tg{&P{9aU~7ozIb#Swoc)>5DWUPdl!a}_>CMc^cAMdw}qipvk8Q0?Dp{Om)MRi=v zO|RwssD73>pFp*5ac;pR^1)UTTESk_Yjh9?;xW_!UGDj>sEJ-f4H(5u?J|)$Sph1v zcROdJ7EpzXh!-`XfP3DIL^fy}T!j}=9qmL_+>4sfA=J!|qxSGLYM{%gdVMY*!9xv{ zfEqXxd1U#{si=j`L2cE19K`rmM?xJopc*!#I%;v{FQEo{9rY!A4>i%FuKascyI#~; z`3KcLitx!~ROGTz3n@bNHyOkA{+E-`9?wNJ@ah2uP#rg-8mvY7wymhIbQ`MvZq(u0 zhZ^WCs{SR^M6aQ?DvsIfc?PQ8IK2M;-$i0E1^40Y_z{lBD@a?*Y;2}dq4KEu;e3C!;w;R-Jj}x~RR51B6aNV$-ljl%at@X6#j%*pvPNPhYURsO zXJS28;6|K@KjLpVmS3=0m`Ni|+>flmp2Qs7hU@SP9E}yJ#Qzf#O{t-8{iL)|C`)hy zZt{KDNj@fPH*6m2@H~d4xIQANSZ>jivzQHQSw)gUdOXka07(5(uIx&@GPXIoGq?ZD~y z8R~RL(Md5*Mzvdox8hdR1dd|?(U>$Yw6amC_rD0$uoyLgD&(>zZrYM}T)q>v z6@8eF!x&v5z75q+F=pUQ)WAN}TeKR33h^2e>hNjQ2jeZ&%05QUk$r=)IG`Z3C5gz- zfMsAL7NSC5f;t1UFbXSC?YyXktUxWa1vTFG0^+Z|d!GVz)Q#%+XH=;EMs-lgM?tU6 zH0+1>xO_QkrIo0&GvC?Zo^L{(g%@1@D5}2`$nM%t6No?O#1g2bnU^5jXJvQ`Hen3D z>g+(R^Z+Vyhmp6=PC8E`!Ln{th@<%&YJ%~o{zsq|nvIIY#2^WEI2F}lDe{V2CBBA@ zt~|3S6qzxYK=~BZ7FD7Ksz;sjm9G4G)R}3=cu7dP|nB@Yc7l%c+U{ E7h69z-v9sr delta 3060 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 delta 3060 zcmYM#drX&A9LMpmAacK2f{+NJB%uDhkxN}VT-FL=l!F>ZE=!Db%gStt{Ak)Auw@8~ znIkO+iI!VQY+edhSqe!RMFcZ)YDHW!&+h2TPjkhmm z?3>2lG5+u1|K9-R%ua>=Z!F0U^0(u!7>zeE4#UIDR5cZqpNld0AWp_2moLL8@;fjP z_hN*Z*A9?~q~M6F(B|yL5Xvv2I=qJA7|d+~#v(;F3&-Lj)C8BJ>gQuTK7+U6He^71 z3stXiH19QQA)ys@U@-oIYVZg8;|OYnezex}2-L*lP~|D86?u@$7I4$^<*533&O%iE zr;*Dxa0_RAD<`3f+fggpiCoseO_BK+)$llKWv7wL&U0gKHt1Ak)sNt&dWooo%|X>$ zhT4KW)C8YIFaNfln?kY$$72nu!9G+6&8PuSxbh!S16)8Z8{($tf%LBO38;2yr~wyo z(}3BidIc`OCW`&niZ@W86_#NTR=SEcr~&q(LVO5S?)&6tZ}oT%xz z5)<(?)Qam-zbOY%{kEeA2XP@zi6{P=`Qv=3^bUM98Si2{0VhvHnJRrtQ57P z3RGmOQ4y&}4fr7{)UBxc-=gZBapeQ3{zg!*bpW&Y2&23t`bd0^`S@-UUp2grE!diD z){SLT_#MFf6te*goytDr4O}vYiBIDolJ_Uh<=Bau;3Mpd4(Aid_S6?Y^k+~ry@p!R7!HUUMxYK?8mfcEn1stw^@}kGpGR%kW|uEV9nK0@z6&`% zUfV-Lp*oC#*p8Zcrz`J6b$r>C-$YF?Fx@v$GG>xbM}>G5(yO-m*|J>7=Rt9fxk!XWiKiMgRVSmwr?xOqv|h4 zEhNj8KZM%aO{j(Jo=yCL;*)(pNZ~^KN zuS8AYDO3bXQ2lOndg_>YLY74KU b+DFebyB8CidO{ogn`$Dj#5L7V4+#Aa2UsVs diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index d7d696e..c5b79e3 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -121,6 +121,10 @@ msgstr "Performing additional analysis to {visits} visits" msgid "sweep analysis" msgstr "Analyzing entire board using {visits} visits/move" +#. status message +msgid "alternative analysis" +msgstr "Searching for alternative moves" + #. status message msgid "equalizing analysis" msgstr "Equalizing analysis of candidate moves to {visits} visits" diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index 76a0044c942ca1519286d22e4b2451cb6aecf48b..75031f1b4c560f3c0f463a4464c32c12424ea927 100644 GIT binary patch delta 3143 zcmYk-3rv+|9LMp$AR_mR8bYXmkk`b((85GZQ_GaFv9dKi#=*!Vjsv-9+F7GEv&>d$ zUUPU!tr;azcxjcj%t>ip!n>GGyLid5HbJL-f1GD4_xgUG=Xsyo|NlPkVUzEYFK{}s z^HSsAF8-(T|7MtKW+$WmGl}9U>OJruOu(pUv!2)s)iux6AH+oJPh%e}clEb0o_Z~Y z<2H;n3)l_{aWw389gaEw#7Nq2peF1RW5#94-0r}B$Ritto$*oB1`ARBOECqju{*wp zENEL${Te&!0kfYeD56ssfmcxj+AtJj8KnplQO|p$HrC&@=b|DiKrS24P0x!_{XNdv zsCiyME_;Pr4C~w56x8tpR79JR%Nn>TGvA{I9!5phf?U?hjXhcjon$f z7}WErs8`@YZP1SaMY@0jm%YPHsac2Jun{$|2{qAi)WVls`wi4W5zI=_Qc=$bquTRP z<0d1Q&ETemD^UIB$MgQx@CFTvd>Jaz_1G2bT*pS#0((%YZbtPxgE|X;p*9}EYO41{ znk?Hn8uk2fRHkR4`c)*5e-#$epas?b6cy10S8sFma2ho(1!=N@s6a-d zHZT!2|1`W4D^QtTj9gY5;I34B?)(ll@E|I}bEphmMP;PjJr89TP23&z3J0Mk9?eak z*&mwG81=t{%lhEz|?G za0c?ohBzNW1@tLS$}Rf%=uML-lV!9j@J| zg-)aTUq)^87V1?cuzNjEM~xeb9pC>06nr!k;Q;&^Gw}~p3S&7@`rFVKwV~1I!AV$! zpWt*o=S1C&HK_5Qp(6g()z9D%>Ye#r9)YybrIT79K=+1Yr|U zXJR@&j3uavKE}g%9yM+|gVev(8QF_DsHdYc{unAVKlP%vn?ef>`mJBzJ9s!Y;Zo|` zQHN$qpJ3$0sEB5w4$*8>Di@$qy9gD?3e;Kn2(?fn>W6Ees~7ZE!g%LxC+6c+K_=DuScP9Ci_P*y6~WcAABXWVrJYRKI6XXXG{4z7pB1ZAE@6 z>;P)s^Qc$XiaOlag9a>QaPTxoqZUd;4a`KPegsBifoq@SoPj#kRj5c_MNPa4@5PO% zujB-BKJ6@O{&tMSXijR9PD2uf8XB^ZY+F5M;}O*13**S8$usLV9r z1pE<4VFHunVVw?gE&*aFlB z*Pu4O1C{!ds6%=im65LZFb5`L6plc>im@0_$B7h_!Xi{8WvEE!qdu>d7>9+w delta 3061 zcmYM$e~iy{9Ki9npV!^F;}otFN94!(artp0w_^Rk*7?K4skTGXF1v0iWh?nsltl{1 zr9$f}B-wIq4H0D>a@KS*8h5KS%BDz`{OI|-?|Z9#d>-%j`}6+wdVSuX?{&6peOcmU z`<5#M|Lx%4E&Thdm9-EKrvGmzignaG;3>?)e=!>~+Js=&UTA$Vw#WN17fWJ&9=4;t z3{$WQGeby(jTG9_uq}4jA3cs~wEvDy_%~)?Dz}c<326!gu_YFw8yto9pM*L1INpQ{ zkOjlrXul0j^+X7}C>T*4reXs+;0(6FYiNYc8SV2-bYt0Qdk-|CeB=tlxcPiE+JAiX zVYL4Y zq5bYbU%_~EgO6Z>f8hykrsM^@5i8IE>(L2n&;@H_`w!>>zaUq*#Led^%x-%}bX;F_ z!9s2>ScLW~j`hdd@&1i?77a!?4{yLlv10|gKoy$eEoi^(=o$D1-S~-EzkpmJjn%a? z`n*4y;k(gsMbYV5##L`f-bNncG!>Z^ccF}>DYc1*+a;n(bRT}=Ai)$MKdxA z-O#xByadf`Y4Uj@JWIie=A#`e(G9IfcfJXIhc)Oz-=h7F#QLx3LVutOUq!Bv${_8E z1~vqJRU^=|RD`LVzwiJB2bQ1{&1`xQ!W?v=m(X9p<>*E?#`c})xI<_}$IQ~TA_vw<%%m)05`i?HN`Wrv5Yw~csj4P?HKo3n`ZZh&gXhe6S zhiEjK%E@TzXP|-1M$f`4=qso|58Jv}-;9pmgFEs21ciSnEbGRfOkCWZG~rRajGx~c zLbGOkjy;kCwvyi*>QCJkLL<+Y^a`PjdU@k!gKM7$mI`MnxE8C2o_Uh

m))Q1qU{uDZhZG_Ht}b=^uaL(9@icMluqecoG)iRCMA>mA&aAHcT53o6YjBa2PI$<^1 zZwI>Zqw)DgG$U7HJ(u@rMtdP2MkqknDT(b%hVcIVC0b2`sjZI>{zOw1h9(zGMI+5Z zzP8XMnu}(vJDTE$&~a1H07_%M9NSZ$g9fk&op1Rx3Z`l;uE82K#S=KvrgAEpy7E|G pfG)5co$y_3i<_gnupRY7I0hREs*k6C*rK|k?WvsVReAO4{{g^nD^36a diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 3eeb01f..1124967 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -693,3 +693,7 @@ msgstr "Resign" #. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" msgstr "Find alternative moves" + +#. TODO - status message +msgid "alternative analysis" +msgstr "Searching for alternative moves" diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index e5a4e40d56ec95313557dda25e6823f8f82e228e..cd0a4f756dcafd53460b9ba89fb91594778b3746 100644 GIT binary patch delta 3143 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 Mg~Ma%g-eqE1FW?mjsO4v diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 8e9e46d..a29fd17 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -675,3 +675,7 @@ msgstr "Find alternative moves" msgid "teaching undo message" msgstr "" "待った。{move}は{points_lost:.1f}目損です(マウスカーソルをこの手にかざせばとがめる手順が表示されます)。打ち直してください。" + +#. TODO - status message +msgid "alternative analysis" +msgstr "Searching for alternative moves" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index 4bbfd006a57cde5a6e90d959f36e8f059d734fcb..ebb66c49578b5bdd3f94dc4ba39e1bcd320606d9 100644 GIT binary patch delta 3143 zcmYk-3rv+|9LMp$mn5R2+)O2bqZM9IG)#pkK%F>pGg8Y-O*`5V&qN#tbu!IYhnqSz z(*>!y8nrdlIhI7RaFyC+PG;I%ic@oCuBl0BEy0F;f4Ij`YEl;1@S*ehVhV*_|SfoG| zZy^)fK2*Er`+3joBnj>4BF17nszV3%z~1!I4ii!JX{dz_b>(AFJ1RgPo5D-=FQM9p zoJ&yStUw-H&nv+E_9h86d>6H&dgQStUW&|DsE%h)JG+cLcAFP#wC*&L@u>D`ywolW zwXq4P`WdJr2%#1jMNd0@odl2Vez}J=sarT8?O8=YNA+1C20du^&?Q_ zd8mHVkjGx-rHLz0?bgI|{wml)fp%Vt+UW=QAU3#$&8P{!MTPn-s@;#MyKo(~@b1i} ze1D|KMmY;n^)H|zU5aW~kwE;F*hGOQcn^83!8JI7ioiM4j;^|Vhs(!MsD3F(kqt*} zYf=5TJ9ps#@?ISY?Vttq8J)mhcnUSaSyz7(wa_lqgaKaaHyBxyWurnn z+4($b19MOj38NMib@kOqWIfyF8oYxVs2JQvj=tO|^x23~{eun8I4cB6i!8&K_=P?zf{ zYNAW1_P?PP+J!o*1Xi#5L8yMC@&5P!EQuu)OvmT&b1cGGZjyFXg2QnhYT(Vd1^3{7 z%-|+f;%Uss$^7nS;0Dyh2XGL!U@Bh3JiMDi{EJD9XZe)bdK`m$F$Yf}i?>+*GBKA0 zQIW~T*KiVsupYCz5k*Fyulh9qjCZ5%zyZv~FL5h&q879v+hiH}Ic4mSH6 zTW|(8K4x|cV;*Ov-B>YB$AQGPgYsoV%w8lP8S1zDVi;j3e~5FsLH(Ufvl{$mguk%W zBmFZ#aI22vDI8t63T(m424E?X&(q${dm5q^+Ie~uxzP3f! delta 3060 zcmYM#3rv<(9LMqhtEd4Ya!GE1C}t|R5QuaE1=bZDL+y8%_=Vfr)d)vGh zL;VgI|32maUHl)JqMF$cf&Uvpv4{Gd_y>mI7)D~ybTf6GkE$=mP<#|;W2vjx;!Ns$ zaT*@M8D?HQeOHlobF&dx6aI8ZX zw1cRAA57G}W+y2qq8{|eUr__D;AH$472zaC>-h}S#v)Pe38;utk;}5U>G^V0|03s; zsQw#~%PP4AvA%7mppLsx5xt3A*33JKLj{(G z>i00}2#Qb}+<;#G+wyV_@=#w|oG zn9EHI7NGi-xcW0QIe$f5NrNJ+#XGRUb!chxo0jw@# zP|uT48D5GSSKurQA^%$7MH;xQ!992zm4QxFL|?l4Iaj}o8g~P^YzmzeNCax(d8mal zF$N1zncak3R>Mu1*zI+NcTod7P!XO)rR+OYMta@zi>QhJM7^X_nN<_VaMS0PikfGI z^9j`W3TG8YQLjM-;BBIy&!+{a;!)HB$6SZgsGatq794WzRl>8f8IZPoPq|Hq9&@CcwknIT4)FA7jPeHqiwGJGt{^)e3qzX$bly@OilII90C z)JFSIXMD{)zl|CfNHoe!Bzm8tkW66}9>nE1fQl%QH);`Pqb4rLS8*G*p@%oA3fnOc zPubQHMmkpG{dg4FtPLP**%&Hi;rxXv$2fc% zcVdc%KT5b>&*OY&ycHE;J!az}d<}b18`?0NW5c@HYvO%>EK2Yz>RV7RO(wk+ z`2(mkEJUTS*tM4-AA)T~W$YE#-h}GciVCm`6~I~4XWfS%5 z8&OBmhMcl_Pf>`c@SAJ!r10xSJqq=?`ohg|zv45Hre971LC zrmK&;dSL2AX1x~bD_8=mV}`5eqRzemHQ`3&HLxnw*RUJazZn%_JL)KVQ5)_B#$IMX1knGma5pTl#uoktEZs$2vCWf8= zpuQqchHt(cRAyG7`W2uuvj)9i9!XIqE7Kh}a__!DYFgQ$TcsF!98b@pMIzIP!O zXHs8)dY+AZVOE6t3Mx@wK`rLuK~x5NGs%Alg-bN7#$nV%`Gl#3*Ph1O;e=-=g!D!Tm zl2ED4apvJV>Pt}z9(J}kJ5cjOHQ0;VBAA%^>bW58Ky({ip$lQ5on!9mxq) n2F{?yT|o64#t8HfrZN(RTQH@wFR*!XXJhc~*v^lVvx5Eu1jH&C diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index fa63bf0..147b422 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -653,3 +653,7 @@ msgstr "기권함" #. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" msgstr "Find alternative moves" + +#. TODO - status message +msgid "alternative analysis" +msgstr "Searching for alternative moves" diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index 6c4daa3e7f0b9a85752879f61a4a769def029364..467de795346a1e5c1a274bf5c86b6d68855b333a 100644 GIT binary patch delta 3145 zcmYk-2~3xD9LMo5U=kt<0v>p9B+0x*Q%ey96_qWova~k+OMehS9Dhhh)1H}Yu{ppg zYR+rgD$N`%G@UwE+SV*ORGP=aOw%o~bedZp!`>gC-&XGNdHwF=`};kA-fIYJZV2-( zb?dOv_;-x|efa|*BG5fWV~IOQ5#aNfX9ls`lb*fGY8$9nPVjsuV?n}8j#0JXrGsP;vegw>dU z4akJH7uD|Yle}m40}1V@6{GMLs>6MZz%KOC4!fc1`=J(=;mSv%c9e}gmd{J|b5ZRB z&QjDkZz7Ma<`u*IwvL1v?m+Em5AxVSUW&}usE#eDon1yAyUU9;S~!hlEUJA!UTQZK zwXun)`Z=g02%r`iLQgwgMS{oH^HOMbV>}*4b!4>252Ggd1{LaasCK`i?m`=C;o;1t zd{3mvhB9c$ZHO^A!+o=Ba&iAnwd2bg9?cgZtGx`oY;!mgv&bj)(Pz!BGO&G&V{nC&%Stcs9 zlbthA8<>ZRND#H4kgH#VMAoxf*I+AZpgpLDM^OuEMy>ob>I^TUCc2Gk_rT?&snkS? zsEN~%DjVv|Lv8F;)KM+KNanW+5*n}?)o~4Kpn6xn4K>k6s9(ZEsD=LM%CDgM-9_D% z$Ef}>gij`+A~yiFk|h`L-S zP!nB3wf_^f(00^O#j$$Tr=t1|$0y%^7KvgCX5$Pzf;rfUo21KBz-tt~fln5IOUXCl zBkapfs=_3GZ>M2BYC#uJJHCgLupP57kIDe9?oIq(CvlYmokW;)s;Jz`x4JM(>REOH}cGUO! z8R}@h#2ow`8Pn3U{RJ$-DdhLz2)u)wmi5o^BQYQKJ5Y#|u?lRW2jSc)k+ zo2lgzn`UmJTd1*eE&|cq%r`p{<7HHXA29^~L9H;D)_NX|nph&Lybo$cnaE|sx#{@?RQ+kr zr%?45AeWVMi(-6xg@h_@K&@ySa@ihkip*hD!;`3$okcFY!i~AvZKo=$el$1L^Pv_t z1XV8|wFT2q6MPy2{MjOI3dt(G7dN9C>_v5O1T|oTEB_ib!1u^yzjM>`&h)PGcvQRo zr~yZE(}0DjdPOc@62ty$#pM)eg{$!%taKGOqXyWG3h^OSy`!iz@HuMY7hV1ia#;kU z%OuqEL8u7lq1qKX=fx6#4e$~LTvq8Gyn~8BEow!dx%^iy{~fAb8**7Fm9&rq)WCgF z1La^67NR0sid?pmn<7yaaEYC$h6hk9tVe~c2^Ep^?)fED$G1?2G>l%=aS}JZewnC# zCOK!K+Lt+(Vh{2wQ40ucC85`+2E%YaYJfwoLL+LXEvNxoU3oh)2aBRmp-pxUKrJ8} z6%jvbLQ~xHIjG2%dd~y)A_;Z07FBU8YC?NaGyf2^heuEYokG<+@AB7B1O0*;xE;AH zoJP`zTG&w3R*gWNr9uqn{MmF8YB&egQCY_Wv*oCPUPXNYH=!oF&y|0IYIg>;q6?_@ ztMCSx+vz-xEYdC@!Lv40h@<*?^-@us0TTHPn4V@< zO+gvcUrhdAT#k$TnQg~w{mmxgnt^=xv1t&E@gruP63pKNW(&#ZXR#nWIMf@cmi^11 z-&4r;+n>nXEGEbMc@AWg(B4f)#1p+uE8#&ytkqXmy&NsMW%eTcls-^C;4Wai$9>wP{BhinDK1}3B9KaQG4?;`f(T1 zmwk(xK(8@O21{@V9zb@;R@7(>+^_zGKn)3 z%*0#R4-4|$>xY{03RKA6MExpm$5gCA4!Sj>Ue|WiVeT}}t3MSLf!WCMvE}$U9z-oH zbbNsS29Zc3UQFKJz+TwoY{dlfVZ>c4^!^Am z6TSYr6qC>%C*uvAjhgYple`(uM{UhI)L}e|3jIygVf+izFpXtv0h3V?TaP99Zf#5C Ro{-wjU1z7&#^j8O`wwo5Glu{G diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po index 112da9f..e911b3e 100644 --- a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po @@ -681,3 +681,7 @@ msgstr "Resign" #. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" msgstr "Find alternative moves" + +#. TODO - status message +msgid "alternative analysis" +msgstr "Searching for alternative moves" From a5b9951c1618bd6883cb17952e355395bd6fb73b Mon Sep 17 00:00:00 2001 From: Sander Land Date: Wed, 9 Sep 2020 10:03:22 +0200 Subject: [PATCH 33/47] engine init --- katrain/core/engine.py | 1 + 1 file changed, 1 insertion(+) diff --git a/katrain/core/engine.py b/katrain/core/engine.py index 542753d..63cffe5 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -274,6 +274,7 @@ class KataGoEngine: "includeOwnership": ownership and not next_move, "includePolicy": not next_move, "initialStones": [[m.player, m.gtp()] for m in initial_stones], + "initialPlayer": analysis_node.root.next_player, "moves": [[m.player, m.gtp()] for m in moves], "overrideSettings": {**settings, **(extra_settings or {})}, } From 71bf90c9927b67546de4a218dcc70a6204c6e94d Mon Sep 17 00:00:00 2001 From: Sander Land Date: Thu, 10 Sep 2020 23:06:49 +0200 Subject: [PATCH 34/47] low visits tweak --- katrain/config.json | 1 + katrain/gui/badukpan.py | 5 +++-- katrain/gui/style.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/katrain/config.json b/katrain/config.json index 390da62..4afee61 100644 --- a/katrain/config.json +++ b/katrain/config.json @@ -65,6 +65,7 @@ true, true ], + "low_visits": 25, "eval_off_show_last": 3, "text_point_loss": true, "eval_show_ai": true, diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 90f849e..b6bc19f 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -415,17 +415,18 @@ class BadukPanWidget(Widget): and not game_ended ): hint_moves = current_node.candidate_moves + low_visits_threshold = katrain.config("trainer/low_visits",25) for i, move_dict in enumerate(hint_moves): move = Move.from_gtp(move_dict["move"]) if move.coords is not None: scale = HINT_SCALE text_on = True alpha = HINTS_ALPHA - if move_dict["visits"] < katrain.config("engine/fast_visits"): + if move_dict["visits"] < low_visits_threshold: scale = UNCERTAIN_HINT_SCALE text_on = False alpha = HINTS_MIN_ALPHA + (HINTS_ALPHA - HINTS_MIN_ALPHA) * ( - move_dict["visits"] / katrain.config("engine/fast_visits") + move_dict["visits"] / low_visits_threshold ) if "pv" in move_dict: self.active_pv_moves.append((move.coords, move_dict["pv"], current_node)) diff --git a/katrain/gui/style.py b/katrain/gui/style.py index 6125534..c376a5f 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -60,8 +60,8 @@ STARPOINT_SIZE = 0.1 BOARD_COLOR = [0.85, 0.68, 0.40, 1] STONE_SIZE = 0.505 # texture edge is transparent +HINTS_MIN_ALPHA = 0.2 # single visit HINTS_ALPHA = 0.8 -HINTS_MIN_ALPHA = 0.1 # single visit POLICY_ALPHA = 0.6 TOP_POLICY_ALPHA = 0.3 TOP_MOVE_BORDER_COLOR = [10 / 255, 200 / 255, 250 / 255, 1.0] From 4f24e2e9b16058a95d2300b2ef072b390ba38265 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 11 Sep 2020 20:57:11 +0200 Subject: [PATCH 35/47] fix path --- katrain/gui/badukpan.py | 41 +++++++++++++++++++++++++++++++++-------- katrain/gui/style.py | 5 ++++- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index b6bc19f..a6ed5cd 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -409,14 +409,25 @@ class BadukPanWidget(Widget): self.active_pv_moves = [] # hints or PV + hint_moves = [] if ( katrain.analysis_controls.hints.active and not katrain.analysis_controls.policy.active and not game_ended ): hint_moves = current_node.candidate_moves - low_visits_threshold = katrain.config("trainer/low_visits",25) - for i, move_dict in enumerate(hint_moves): + elif katrain.controls.status_state[1] == STATUS_TEACHING: # show score hint for teaching undo + hint_moves = [ + m + for m in current_node.candidate_moves + for c in current_node.children + if c.move and c.auto_undo and c.move.gtp() == m["move"] + ] + + top_move_coords = None + if hint_moves: + low_visits_threshold = katrain.config("trainer/low_visits", 25) + for move_dict in hint_moves: move = Move.from_gtp(move_dict["move"]) if move.coords is not None: scale = HINT_SCALE @@ -438,7 +449,7 @@ class BadukPanWidget(Widget): Rectangle( pos=(self.gridpos_x[move.coords[0]] - evalsize, self.gridpos_y[move.coords[1]] - evalsize), size=(2 * evalsize, 2 * evalsize), - source="katrain/img/topmove.png", + source="img/topmove.png", ) if self.trainer_config["text_point_loss"] and text_on: if move_dict["pointsLost"] < 0.05: @@ -454,19 +465,19 @@ class BadukPanWidget(Widget): font_name="Roboto", ) - if i == 0: + if move_dict.get("order", 99) == 0: + top_move_coords = move.coords Color(*TOP_MOVE_BORDER_COLOR) Line( circle=( self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]], - self.stone_size * scale - 1.2, + self.stone_size - dp(1.2), ), width=dp(1.2), ) # children of current moves in undo / review - alpha = POLICY_ALPHA if katrain.analysis_controls.show_children.active: for child_node in current_node.children: points_lost = child_node.points_lost @@ -476,15 +487,29 @@ class BadukPanWidget(Widget): self.active_pv_moves.append( (move.coords, [move.gtp()] + child_node.candidate_moves[0]["pv"], current_node) ) + + if move.coords != top_move_coords: # for contrast + dashed_width = 18 + Color(*STONE_CONTRAST_COLORS[child_node.player]) + Line( + circle=( + self.gridpos_x[move.coords[0]], + self.gridpos_y[move.coords[1]], + self.stone_size - dp(1.2), + ), + width=dp(1.2), + ) + else: + dashed_width = 10 Color(*STONE_COLORS[child_node.player]) for s in range(0, 360, 30): Line( circle=( self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]], - self.stone_size - 1.2, + self.stone_size - dp(1.2), s, - s + 12, + s + dashed_width, ), width=dp(1.2), ) diff --git a/katrain/gui/style.py b/katrain/gui/style.py index c376a5f..2065e8f 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -8,6 +8,8 @@ DEFAULT_FONT = "fonts/NotoSansCJKsc-Regular.otf" WHITE = [0.95, 0.95, 0.95, 1] BLACK = [0.05, 0.05, 0.05, 1] LIGHTGREY = [0.7, 0.7, 0.7, 1] +GREY = [0.5, 0.5, 0.5, 1] +LIGHTERGREY = [0.85, 0.85, 0.85, 1] RED = [0.8, 0.1, 0.1, 1] GREEN = [0.1, 0.8, 0.1, 1] @@ -50,6 +52,7 @@ EVAL_DOT_MAX_SIZE = 0.5 EVAL_DOT_MIN_SIZE = 0.25 STONE_COLORS = {"B": BLACK, "W": WHITE} +STONE_CONTRAST_COLORS = {"B": LIGHTERGREY, "W": GREY} OUTLINE_COLORS = {"B": [0.3, 0.3, 0.3, 0.5], "W": [0.7, 0.7, 0.7, 0.5]} STONE_TEXT_COLORS = {"W": BLACK, "B": WHITE} @@ -60,7 +63,7 @@ STARPOINT_SIZE = 0.1 BOARD_COLOR = [0.85, 0.68, 0.40, 1] STONE_SIZE = 0.505 # texture edge is transparent -HINTS_MIN_ALPHA = 0.2 # single visit +HINTS_MIN_ALPHA = 0.2 # single visit HINTS_ALPHA = 0.8 POLICY_ALPHA = 0.6 TOP_POLICY_ALPHA = 0.3 From ae35c13681ad8e85e52264f4b0e8b8730510317a Mon Sep 17 00:00:00 2001 From: Hiraoka Date: Sat, 12 Sep 2020 20:43:19 +0900 Subject: [PATCH 36/47] update JP translations (alternative analysis etc.) --- .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 15220 -> 15348 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo index 3a4b3583412718f1846599314397bb27f96d85e9..9c28dd2b411bb90615a121c10a6ce6550c2867b6 100644 GIT binary patch delta 1270 zcmZ|NOGuPa6u|LY_R_{u!PGH|va+xmwX8JA9`qu@+GLWOHj&UKii)UazHcgL(gtzL z(h)=LZ9ZUxgobjHMo{!1B5)Je8D}SjT11Qf$GO{9zkAL-_dDl)-#2k?;(Xu8Tz9Tg z>gRf;vT%V*scc+jEXOqBqbPMXn2Fa+9KuxM=a_=8aRq)b`AK6^p;Al9r{h8_!a2C3 zP`RfU`%Iz&rNI#spF%ls#^^QqAj+UExCFx}=RTp-$8j0{Mh7~J5*NtFB;s8t`+JMr ziHU1SWRM7;+@KwA;gBgjR-DLR#scykn2+yK8c(4N;@FU=D?qv7A>4$OxCH}9sTxKZ z^pBf`i$%)D!~@Du;wqHM{l+Gg1Dz%gqkNJ<v5-b_voUG>Yw}5qpTT|_N`pLHi3e~Vo<=!;5#_*{Nl$*T6;u%V5l))D90i}Ko%K1{1x;-f0x*F5*1WMfnv+pyu z;p}oY`orJm=j7#%zG%``Pt?;K?`)0v>$Ke%^<9s(HH;2)2h&|S+5g)QZ+Cr7acGYn z^9QxnJ{IZ^wlB_fXm6wThPBr>9%%_W%PQSeXv@}iowlxOt5HX8EUdnNgt+XAyTQ>3!Bklmn delta 1138 zcmZY7OGs2<6u|M1WK3;zYQm|hNvDTImW`%0rD61@BEnqskb=Rcnye8Nw4AZl zxiRMZT4NTVJ7A0lD{&!i#kqJC7h@Zi;x&!aSWG;KMfe(5;0MjmsE%r5q|bbGVJ+t4 z_G)AOTkO?D6H0@_8b?tMoL8@E{wB(R_pl5HP|kfqsh`B9_zRurtFbSz3iF6}qU`Uf zvFwT4NVrKPQEqS_Z{V;N9$RPUEnH2$7gyqYl*T!fK}u@vx+;_#9>fiJ1UF(5DK#S~ zgZ{Qy1Xwuh><4T{iCa)6?^f@i9C)Dd0LmxHAeS`bCVE2AAPylz$_KQom%AZKWDS8E6N}Pqt4zfV@o8tosQyiB9^P z+p@r3l*ylI!Ao@*{lo z)b)Rv<6U0f91g`=Pe-Ds{3qLE{?OUZa4Z_?jKstKbM5hPN2)mB_3Vm7PyD~t-xwGz k%9|Rxp4wJ_$Tc;T$aY Date: Sat, 12 Sep 2020 19:29:50 +0200 Subject: [PATCH 37/47] 1.5 --- katrain/config.json | 2 +- katrain/core/constants.py | 2 +- katrain/gui/badukpan.py | 1 - .../i18n/locales/de/LC_MESSAGES/katrain.po | 14 +++++++------- .../i18n/locales/jp/LC_MESSAGES/katrain.po | 2 +- .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 15078 -> 15072 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 9 +++------ 7 files changed, 13 insertions(+), 17 deletions(-) diff --git a/katrain/config.json b/katrain/config.json index 4afee61..a8e5203 100644 --- a/katrain/config.json +++ b/katrain/config.json @@ -17,7 +17,7 @@ "anim_pv_time": 0.5, "debug_level": 0, "lang": "en", - "version": "1.4.1" + "version": "1.5.0" }, "timer": { "byo_length": 30, diff --git a/katrain/core/constants.py b/katrain/core/constants.py index f0d880e..2fc1fb6 100644 --- a/katrain/core/constants.py +++ b/katrain/core/constants.py @@ -1,4 +1,4 @@ -VERSION = "1.4.1" +VERSION = "1.5.0" HOMEPAGE = "https://github.com/sanderland/katrain" CONFIG_MIN_VERSION = "1.4.0" # keep config files from this version diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index a6ed5cd..5a33829 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -480,7 +480,6 @@ class BadukPanWidget(Widget): # children of current moves in undo / review if katrain.analysis_controls.show_children.active: for child_node in current_node.children: - points_lost = child_node.points_lost move = child_node.move if move and move.coords is not None: if child_node.analysis_ready: diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index fe88754..953620d 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -671,6 +671,13 @@ msgstr "" msgid "show point loss as text" msgstr "Zeig den Punkteverlust auf Beste Züge" +#. TODO - updated +msgid "teaching undo message" +msgstr "" +"Zug {move} zurückgenommen, da er {points_lost:.1f} Punkte verliert. Bewege " +"Mauszeiger über den Zug,um die erwartete Widerlegung zu sehen. Bitte " +"versuche es erneut." + #. TODO - resign the game msgid "resign" msgstr "Resign" @@ -679,13 +686,6 @@ msgstr "Resign" msgid "analysis:alternatives" msgstr "Find alternative moves" -#. TODO - updated -msgid "teaching undo message" -msgstr "" -"Zug {move} zurückgenommen, da er {points_lost:.1f} Punkte verliert. Bewege " -"Mauszeiger über den Zug,um die erwartete Widerlegung zu sehen. Bitte " -"versuche es erneut." - #. TODO - status message msgid "alternative analysis" msgstr "Searching for alternative moves" diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 5061478..705244c 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -671,7 +671,7 @@ msgstr "投了" msgid "analysis:alternatives" msgstr "他の候補手を分析" -#. TODO - updated +#. message shown when move is undone msgid "teaching undo message" msgstr "" "待った。{move}は{points_lost:.1f}目損です。打ち直してください。ヒント:マウスカーソルをこの手にかざせばとがめる手順が表示されます。あるいは、地合推定をオンに(tキー)すれば盤上どのあたりで損をしたかが見られます。" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index ebb66c49578b5bdd3f94dc4ba39e1bcd320606d9..c14eca3bdf0953d54635da7b378b1c9c9931c98d 100644 GIT binary patch delta 1108 zcmYMyPe@cz6vy!klHsV}lVyJq4M3w5Wd9jkCCf^+8m^2Uw3!aWTF}<()xYa2CtZX$=al zZ_OD~$3&b7CD@HF_TT}`pc1}A-FVu@p$*1tCSHdTJb~(123KMpD{%yAq8Y>O=;I!2 zZVS#kpJR|>q8D|*OWcJsc0-K5RS|ch3hc5TLf!l%wqO=@aWa~qf9Bh=fz!Djr9wHQeR-#4OKokaa3+fZ+R5cMw{#~M6s z*Dv8J&Nq1mx?u^I;W&2UCsYd^t`o-9xE~X!MAuP;-$8v}Kou~8I`}y*!dDoTrq4rPM^(j;beAJWtL3N;-+vqz7m8T6IOrbh* z7#EylaJKZJ@>w+M4GepQQP=Og>lI$OesRp}zvcSFH~o9pyn#Me^N(Xq;s3j|<;Q5T OG#e|gD9t5*mi+^@)t77l delta 1115 zcmZY7(Myw27{~DgE5l4sw_F-?GfJv8T~@Xwm<26H5Q2dPVJurZNTsR6Zh8fS@FK!O ziT(l$LSZOfbQ4k#b{Wz@!V8IT)X=NyroO-4bJx}9JmJsVHpKF+66318xVe2shY6Dsc}s=+PvV13jrxFPDe z9k;Tf1W62G4|d}?D&a>|$KPyRdEA&d@e%Z4A8KOb*nqQGfs4ox&0Fli5?;jSR`UO^Rj169yn)Fd72Bwidt67JCqvD;I#CF;Z6U N`93q3-)bv){sK;ajpP6T diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index 147b422..eaf984b 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -646,14 +646,11 @@ msgstr "" msgid "show point loss as text" msgstr "돌 위에 집 손해 표시하기" -#. TODO - resign the game msgid "resign" -msgstr "기권함" +msgstr "기권" -#. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" -msgstr "Find alternative moves" +msgstr "다른 수 찾기" -#. TODO - status message msgid "alternative analysis" -msgstr "Searching for alternative moves" +msgstr "다른 수를 찾는 중입니다" From 12bf5368c48a96f5ce2e4cf315a4c8cf17158a56 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 12 Sep 2020 22:58:21 +0200 Subject: [PATCH 38/47] fix shift-arrow to alt-arrow, fix bug where old top move not in any new analysis causes two moves with order=1 --- README.md | 4 ++-- katrain/__main__.py | 4 ++-- katrain/core/game_node.py | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d45689b..634cc85 100644 --- a/README.md +++ b/README.md @@ -177,8 +177,8 @@ In addition to shortcuts mentioned above and those shown in the main menu: * **[~]** or **[ ` ]** or **[m]**: Cycles through more minimalistic UI modes. * **[p]**: Pass * **[b]**: Pause/Resume timer -* **[arrow left]** or **[z]**: Undo move. Hold shift for 10 moves at a time, or ctrl to skip to the start. -* **[arrow right]** or **[x]**: Redo move. Hold shift for 10 moves at a time, or ctrl to skip to the start. +* **[arrow left]** or **[z]**: Undo move. Hold alt for 10 moves at a time, or ctrl to skip to the start. +* **[arrow right]** or **[x]**: Redo move. Hold alt for 10 moves at a time, or ctrl to skip to the start. * **[arrow up/down]** Switch branch, as would be expected from the move tree. * **[scroll up]**: Undo move. Only works when hovering the cursor over the board. * **[scroll down]**: Redo move. Only works when hovering the cursor over the board. diff --git a/katrain/__main__.py b/katrain/__main__.py index 687e659..4db50bf 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -480,9 +480,9 @@ class KaTrainGui(Screen, KaTrainBase): elif keycode[1] in ["`", "~", "m"] and "ctrl" not in modifiers: self.zen = (self.zen + 1) % 3 elif keycode[1] in ["left", "z"]: - self("undo", 1 + ("shift" in modifiers) * 9 + ("ctrl" in modifiers) * 999) + self("undo", 1 + ("alt" in modifiers) * 9 + ("ctrl" in modifiers) * 999) elif keycode[1] in ["right", "x"]: - self("redo", 1 + ("shift" in modifiers) * 9 + ("ctrl" in modifiers) * 999) + self("redo", 1 + ("alt" in modifiers) * 9 + ("ctrl" in modifiers) * 999) elif keycode[1] == "n" and "ctrl" in modifiers: self("new-game-popup") elif keycode[1] == "l" and "ctrl" in modifiers: diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index a9920c6..c925f5f 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -100,7 +100,7 @@ class GameNode(SGFNode): elif cur["visits"] < move_analysis["visits"]: cur.update(move_analysis) - def set_analysis(self, analysis_json, refine_move, alternatives_mode): + def set_analysis(self, analysis_json: Dict, refine_move: Optional[Move], alternatives_mode: bool): if refine_move: pvtail = analysis_json["moveInfos"][0]["pv"] if analysis_json["moveInfos"] else [] self.update_move_analysis( @@ -110,6 +110,10 @@ class GameNode(SGFNode): if alternatives_mode: for m in analysis_json["moveInfos"]: m["order"] += 10 # offset for not making this top + if refine_move is None and not alternatives_mode: + for move_dict in self.analysis["moves"].values(): + move_dict["order"] = 999 # old moves to end + print("overwriting blah blah") for move_analysis in analysis_json["moveInfos"]: self.update_move_analysis(move_analysis, move_analysis["move"]) self.ownership = analysis_json.get("ownership") From 8fe14a8a1aad41786aa22160f9a3b44c96b3a927 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 13 Sep 2020 14:06:01 +0200 Subject: [PATCH 39/47] remove debug print, always show top --- katrain/core/game_node.py | 1 - katrain/gui/badukpan.py | 12 +++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index c925f5f..d2b995d 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -113,7 +113,6 @@ class GameNode(SGFNode): if refine_move is None and not alternatives_mode: for move_dict in self.analysis["moves"].values(): move_dict["order"] = 999 # old moves to end - print("overwriting blah blah") for move_analysis in analysis_json["moveInfos"]: self.update_move_analysis(move_analysis, move_analysis["move"]) self.ownership = analysis_json.get("ownership") diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 5a33829..611e706 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -17,7 +17,7 @@ from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.floatlayout import MDFloatLayout -from katrain.core.constants import MODE_PLAY, OUTPUT_DEBUG, STATUS_TEACHING +from katrain.core.constants import MODE_PLAY, OUTPUT_DEBUG, STATUS_TEACHING, OUTPUT_EXTRA_DEBUG from katrain.core.game import Move from katrain.core.lang import i18n from katrain.core.utils import evaluation_class, var_to_grid @@ -120,8 +120,9 @@ class BadukPanWidget(Widget): katrain.game.set_current_node(nodes_here[-1].parent) katrain.update_state() else: # load comments & pv - 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"\nAnalysis:\n{nodes_here[-1].analysis}", OUTPUT_EXTRA_DEBUG) + katrain.log(f"\nParent Analysis:\n{nodes_here[-1].parent.analysis}", OUTPUT_EXTRA_DEBUG) + katrain.log(f"\nRoot Stats:\n{nodes_here[-1].analysis['root']}", OUTPUT_DEBUG) katrain.controls.info.text = nodes_here[-1].comment(sgf=True) katrain.controls.active_comment_node = nodes_here[-1] if nodes_here[-1].parent.analysis_ready: @@ -430,10 +431,11 @@ class BadukPanWidget(Widget): for move_dict in hint_moves: move = Move.from_gtp(move_dict["move"]) if move.coords is not None: + engine_best_move = move_dict.get("order", 99) == 0 scale = HINT_SCALE text_on = True alpha = HINTS_ALPHA - if move_dict["visits"] < low_visits_threshold: + if move_dict["visits"] < low_visits_threshold and not engine_best_move: scale = UNCERTAIN_HINT_SCALE text_on = False alpha = HINTS_MIN_ALPHA + (HINTS_ALPHA - HINTS_MIN_ALPHA) * ( @@ -465,7 +467,7 @@ class BadukPanWidget(Widget): font_name="Roboto", ) - if move_dict.get("order", 99) == 0: + if engine_best_move: top_move_coords = move.coords Color(*TOP_MOVE_BORDER_COLOR) Line( From 2d33849d0ce64b4ba3464b865ca7ccb82210348c Mon Sep 17 00:00:00 2001 From: Dontbtme <66470440+Dontbtme@users.noreply.github.com> Date: Sun, 13 Sep 2020 18:05:10 +0200 Subject: [PATCH 40/47] 1.4.1x French Translation --- .../i18n/locales/fr/LC_MESSAGES/katrain.po | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 85bac76..a2dafdf 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -684,8 +684,8 @@ msgstr "Palette de couleurs" msgid "engine:altcommand:hint" msgstr "" -"Commande complète exécutée par le moteur de jeu, outrepassant les " -"réseaux/fichiers sélectionnés plus haut." +"Commande personnelle outrepassant l'exécutable, la configuration " +"et le réseau sélectionnés plus haut." msgid "engine:altcommand" msgstr "Redéfinir la commande" @@ -706,21 +706,18 @@ msgstr "Pas de nouveaux exécutables disponibles" msgid "Engine missing DLL" msgstr "" -"Impossible de démarrer KataGo à cause d'un DLL manquant. Veuillez répondre " -"aux conditions requises, ou bien essayez l'exécutable seul pour plus de " -"détails." +"Impossible de démarrer KataGo à cause d'un DLL manquant. Veuillez vérifier " +"votre configuration système, ou bien essayez l'exécutable seul pour plus " +"de détails." msgid "show point loss as text" msgstr "Indiquer les points perdus" -#. TODO - resign the game msgid "resign" -msgstr "Resign" +msgstr "Abandon" -#. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" -msgstr "Find alternative moves" - -#. TODO - status message +msgstr "Proposer des coups différents" + msgid "alternative analysis" -msgstr "Searching for alternative moves" +msgstr "Recherche de coups différents." From 655b4f131f3d2fc87e641f6b86deb12b5992486b Mon Sep 17 00:00:00 2001 From: Sander Land Date: Tue, 15 Sep 2020 12:49:08 +0200 Subject: [PATCH 41/47] cn --- katrain/i18n/locales/cn/LC_MESSAGES/katrain.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index 07aea55..2622d3a 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -629,14 +629,14 @@ msgstr "所有可用的exe文件已下载" msgid "Engine missing DLL" msgstr "启动katago失败因缺失dll文件. 请检查运行要求, 或尝试让exe文件自行运行并检查细节. " -#. TODO - resign the game +#. resign the game msgid "resign" -msgstr "Resign" +msgstr "认输" -#. TODO - Analyze again but exclude all currently considered moves +#. Analyze again but exclude all currently considered moves msgid "analysis:alternatives" -msgstr "Find alternative moves" +msgstr "寻找其他走法" -#. TODO - status message +#. status message msgid "alternative analysis" -msgstr "Searching for alternative moves" +msgstr "正在搜索其他走法" From 9c27026b2e34be4e4fd50e3112067bd33c7226d8 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Wed, 16 Sep 2020 22:27:56 +0200 Subject: [PATCH 42/47] fix order bug --- katrain/core/game_node.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index d2b995d..0a73a3b 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -97,8 +97,10 @@ class GameNode(SGFNode): "order": 999, **move_analysis, } # some default values for keys missing in rootInfo - elif cur["visits"] < move_analysis["visits"]: - cur.update(move_analysis) + else: + cur["order"] = min(cur["order"], move_analysis.get("order", 999)) # parent arriving after child + if cur["visits"] < move_analysis["visits"]: + cur.update(move_analysis) def set_analysis(self, analysis_json: Dict, refine_move: Optional[Move], alternatives_mode: bool): if refine_move: From 7e3d5da95b3a5ce538c5f7c1aa59de7380a2f770 Mon Sep 17 00:00:00 2001 From: Satoshi-PC Date: Thu, 17 Sep 2020 16:22:25 +0300 Subject: [PATCH 43/47] 4 new additions in russian translation. --- .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 19020 -> 19262 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 17 ++++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index 467de795346a1e5c1a274bf5c86b6d68855b333a..5459d125c7625fd08e8a86b4bd30f4b5021ffdf6 100644 GIT binary patch delta 1331 zcmZ|OOGuPa6u|K_Jya^}VJa%=XFk%<%<|nsEz`+@=phzGQItjEs@y~|IzA|Tw3req z(jp{?7UF0Pj*bW|T1ee*RfLAns-Q?BYG?oBe9@}S{O-B;e)l`)+;67uxI%rdp_xd} zHWB$=Ad-t|g(5|G7}M}3rr>kjkJFfiacnBXa!kT&n1FqlheNmt=P(wdibW1!GREU& zj6rX)cqD>B9}}zaA+Et^P8`H|;@6mgbGQy8O2YFANbZu4nrMSF--%m^`!NdN;&puQ z#C4@2n~6`CdcqalVj`1?L1d3i;{YzFOp1^}tj8HAF4!S*gt!s4gCTU|JnF$^JE;~g zpcmV*2_tujT)}44&V2STsA8~yiCDE;_V`Wwdhz#^6Rw#_d>%y55ZXF}E+q9+5W;v;(uq_a(ou4)f@bR@Q;%a1bd{ zqUi4itaZGE+KEooO8apM4m*xwBXIz=L+LgAgD@APdB0RK&;yP-Hll89Lp`t?^^PCm z6Bmi1CfrIHn&1P}s|lihjPt0iPp=JsjQN;Bd#jRf+k>@NfRQSaelqz5zu@r zO~>NE7i{7nGit`|HoMmfC+lnrE!t~kUCq`r6H7SL&-TBMk1QTMrtu_OLo814`;vFG U*lkqp)#O<8wWi1Vd)$+*KZ{Q>ApigX delta 1138 zcmZY7Ur5tY6u|Mb1lON2Ep5xBwrs2Q$JD7!`=e&2n+Bm`|K8@>Y%?cJQHo?y4+((< zt3XHsp$7{=8Wco~=q*?enY~0o^bcYYB0X2%!*6drea^Y}{_gLdb8qIZDSO+r@WGsP zh{$rCNF^56i`cLUw__jb{6!4lG#_@bUiFWck=*D^6fN%5T-;uM+AJl`^HW=%Bv6_4kSK~drj1Tg8 zMWe`W@;!}7qk@wR>|h{)tdVKFkBi8mB|*8Ta1J#$9Te%o2K3?$^kW8fWAh=At?0$8 z*o{NDgd^B`*yzlYBtaVkS=@~4n?!=R7p*vjTJa1P;R5Q_yucRxitH)wX5#?;*iQZk zYj6d*EpfFNoj8ly;Se6fPd z+Oapd7C&JH=CBs6v{~1;qCVyTT6uqxBG3-ZBJW6^V;}xTt*nzi^uC9KGRSB6L0)A8cqBRyPhV?$T#!2Lccmu$$5URv KD}5!9G5rH^CZR6? diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po index e911b3e..bfed209 100644 --- a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po @@ -117,11 +117,13 @@ msgstr "Дополнительный анализ всех ходов-канди msgid "pass-button-text" msgstr "Пас" -#. TODO - updated +#. Shown when a move is undone in teaching mode. msgid "teaching undo message" msgstr "" -"Ход {move} отменён, т.к. это потеря {points_lost:.1f} очков. Наведите на " -"этот ход чтобы увидеть опровергающее продолжение. Попытайтесь снова." +"Ход {move} отменён, т.к. это потеря {points_lost:.1f} очков. Попытайтесь " +"снова. Наведите на этот ход, чтобы увидеть опровергающее продолжение, или " +"посмотрите на ожидаемую территорию (t), чтобы увидеть, где на доске " +"прогнозируется потеря очков." msgid "ai-ponder" msgstr "" @@ -674,14 +676,11 @@ msgstr "" msgid "show point loss as text" msgstr "Показывать потерянные очки текстом" -#. TODO - resign the game msgid "resign" -msgstr "Resign" +msgstr "Сдаться" -#. TODO - Analyze again but exclude all currently considered moves msgid "analysis:alternatives" -msgstr "Find alternative moves" +msgstr "Поискать альтернативные ходы" -#. TODO - status message msgid "alternative analysis" -msgstr "Searching for alternative moves" +msgstr "Поиск альтернативных ходов" From f2a5f67cd1c02a26827b281251a5b777fa18c0f7 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Thu, 17 Sep 2020 20:40:39 +0200 Subject: [PATCH 44/47] i18n --- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 11996 -> 11985 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 14933 -> 14940 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 10 +++++----- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index bfdc43a09489153a0101b370d2bbe70316c90d76..7254b38bf00fb6256a82b0670697c8305375abda 100644 GIT binary patch delta 1112 zcmYk)O-R#m9LMorQgh2?Pgo5@m^9sLsYH(u(E}ZlU4kejq{4!*K&p#D@$Zle@lfP4 z!UdTf!pbey10qOXqCOR_cKV@}OrN0hso>sK}olVYjAsX!z z0(eLRjw+v4?vm;z8h1XM4Rt5uEJTg1C?++{!)%LJGYX&z1gemC`G{rcFME3 zo9v<8&?{VrbIN}(N?skWe76G|$SJh(XH>t6ZRFdS#5cGBzoXqm)Jr(mNTUUp;z6{9 zPM{4)V+e5rm4T^z%#@7n)0`1_H~yOX#UudDtTc`i4J zcGVwMU$C*Vky^Bc>t&-%$TnmTZkuwq>@iv2oud)PKH0AUH{~6)o4JR5m`59*XsNgr z?WFsZ52J0U8*8yg^^0gXkwzPz#YJ`%xx!q{smNyk$yhP_(7%x_J-c7*fAMK*xcoft o7jC&d2mDOV9~^PT+>}2s{eNHKax51JlqVjPr-urglH*l>0d+c&7XSbN delta 1123 zcmZY7O-NKx6u|L=US#>f%T~KanyCXEq^E>zC=j$ zkqF@_D;To4Xz`eN&73eF;0C^XZt*PYdh@6USwKBV6}Mw;GKf2{fp~w?4|bHYiHvz3 zdnmY$8}TEy;5UmS+eEe!H={N?~&(~ISgYJb-_QV4Z<8x<2thmBgAbMcbYxO27NigKtCKrZFCm(Bx4reHXozj z%q!Fe3#bc!#~Q4nuJg-WMtzzUPH+>AsPhi$({*B${?hkvAaWWxgygXa?^ymd@@z7T zdeuKHA8ijd5<^`$VYZuH=5Ay!vd?1A998Kr7a2tHih0ut?wOBJZ)OTF;5*d%uAPCs zs3$#YaT;|)9OH_)xwOPY;i{1us34 qE4lG=`I1|d-or~1GfU%ls6A@vzot9JA^|3 diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index cd0a4f756dcafd53460b9ba89fb91594778b3746..83b7aa1a46f034f2270a3dc83d72d39c43b73cac 100644 GIT binary patch delta 1666 zcmZY9Pi$0G6vy$ypH`%lN};s_g}xTcP^@i{!hnE^Bz6G_NYjW50@LYh9UbO1@4fL4 z6b8CrBRfJc#Mne7X*Cj)i3v5aoAFOb)O6DtLlM$Mi4nC6V-rk-@6UNFT}(dr-gn=< z=bm%lOocPyC!OW_D`qxbXO_aDnAvu`jq5SCnjh{)^PvQ=I2M^*jR$+XNSvMxI z72m>oyoNP6g^Tf5JcV;>EN>o-EVK45F#8d6^qba|7JM67+eUF47I7Hw;c`6HVD=uK z$3@ugn61Pucow^`9IxXtoWvz~6Cc8#oxE8Yjo%rNf8tWShkCKB(X0ZOpM|Zds$nPo zmHLlF6TZL=JeWj%1@rhcc5EpH=Akw?jav94+>PI&GE>o6I&n4Xme-@k8&QF7M5=7h z;1ig}X7;yBG!*gYsMP<0I(gmJQVAMSHEl&LxF5Aacl7))Dsw4Zi9YI1oI{dfW6}5x zRO$Xetuv4LY8wC0P)b+uja6X->XNmiQrCsG*o~^;E2s@$#{`~3y+45p;2Tt?ZsRJf zWRf;)LfxsBsNb2O{(7*Jfm(bHRpXaXk%q_zVnb2?3i4lNAL9o63gh@2uD}}VrcA|A z>vW+q)rQS zUHluBk<0vDDw9{S20ug1o9v*WlirF3?nM3-S@u+E;Z>;1wyy9)#h%Iwo9dU=zvhL$ z>!iGFe|jM2C&RRtb%Hm8usC|$E$oan)ifM(Q!l$dKc`O|zux(=D^MkG*c-gF*$+(V}W7EN85G1pqlZm@;6vtAzFxi`N lTb)euKhd~MaUH)n7P!e=;nU6IW#xN%li5D65F}<7J^;J`>g50c delta 1665 zcmZY9Uu+ar6vy#Hu~aQ>LrWLdMLR9f+FBPVe_Dtdz(7n$3E9T@V5)4k(>i9^U1nxW z)sO`r)K_hcQ4{>rpf=&bxDVBs6v7&bm?%Ef@W%(V5raMuh(r^k@%wY;&8N@3ckbMK z?m2hnhj1bMc+0ZNyJq(NYO@?3NtzAe6pyxKx2SoG*osRxL?uXIGyTojg1eC_SS3S4H7=lD zcm;Xa-bQ8OJnEzisEjP4GVv=a6Sv~=zfd)<+ZYA18tL7bi8O1?HhPm_jXl5+BBMsLa%FiB7y6b;}c|@f0f1E~Lt~ z9UsITu4jLHm4+goL#2KZb@JA&Q3+D0ns%cW+>6>^IDVc%Wo{JPFps(u$B-o0Ogz4T zD&2L|IybS>O5;x&N@*kCSPLdmm#i06t6iADVN?yrP#Ye`K|F?f|5H=|U!pQ~8CPNh zleFO))SX%z_tS&aUk|o2kidsf-}^{Bp@4iKRz^jB0{K_j2iT3Lu?Mf=3T&os%9Mjz zXD2FCPoh5WgR$eNK=MQ6pRdf0Fd&~pg0>e>FMbkFoQwNsQ30Qe{RXx00_wJ3L1pG= zJb}NXGBVBYQknb^+p&t8_ti!kI@!f|;A-rR*ndz9H|>Zn+p6lN#$8RFer>i?ER6ZC zlPymU3)#?{be%)RNjI22 zo=&#!^$KJEdsLlE&({s-iib-1+DD=5xKp*+Tsf@Gx=tzUJ9#Y-x@F%PbDd}1a=%k7 rhrV0N20^wE@|Zwsvw=%+8^%2%aQ&eA`KHh6>oacPO;n#B{Hg9=mn`Z! diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index a2dafdf..bb070f0 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -684,8 +684,8 @@ msgstr "Palette de couleurs" msgid "engine:altcommand:hint" msgstr "" -"Commande personnelle outrepassant l'exécutable, la configuration " -"et le réseau sélectionnés plus haut." +"Commande personnelle outrepassant l'exécutable, la configuration et le " +"réseau sélectionnés plus haut." msgid "engine:altcommand" msgstr "Redéfinir la commande" @@ -707,8 +707,8 @@ msgstr "Pas de nouveaux exécutables disponibles" msgid "Engine missing DLL" msgstr "" "Impossible de démarrer KataGo à cause d'un DLL manquant. Veuillez vérifier " -"votre configuration système, ou bien essayez l'exécutable seul pour plus " -"de détails." +"votre configuration système, ou bien essayez l'exécutable seul pour plus de " +"détails." msgid "show point loss as text" msgstr "Indiquer les points perdus" @@ -718,6 +718,6 @@ msgstr "Abandon" msgid "analysis:alternatives" msgstr "Proposer des coups différents" - + msgid "alternative analysis" msgstr "Recherche de coups différents." From 5c6c1c242a4c7b3496cc0796307c36adf52abd77 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 18 Sep 2020 17:16:46 +0200 Subject: [PATCH 45/47] de --- .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 14133 -> 14135 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 12 ++++++------ spec/KaTrain.spec | 8 ++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index 6d9030024bb1e5b88c7f61b2c7ec7b7dbd46685f..5c942fcc45c050cdca84e9f5b79769d518e19c15 100644 GIT binary patch delta 391 zcmYk&ze@sP7{KwzicT_0kjo*IgCywa2cq5{)zA{HwO#V2LA*nF4GrBN;i6z;&cb0W zZ9(f1EgB-N4Gm4LeP6nv>GS-0p9kKde$<1BWfw(c;EH51#yoyR-`3kqm?msjM5@@s zd3;4PI>Igd#7)dIl)-)6#$#N^5SOu^_<&~b3oc-cDSS_yV3~Ycl~CpgvNaJ4Z8Qf8 zxQH9LgdUoO2WS=^VF^$09&eL+$rH(u@1Tu)xN7Fm+zHV9#Z6N0di=y1g&_s=aEyoe z6^%2aVj-wEm81Q7)A27`>Pq{qi)*Ew)90s#((Tw?$*KRHzee=q_R`jFaNba7D(Y13 GW`6;t;zhjx delta 389 zcmZY2Jxjw-6vpx6Yl@XBmDHgSgNj111!?SVI|<_8;vD2!1DZloii6S*(LpG>>0Y>s zU%=HD5VT4cCkH1dSN|8XIsNYQaPB#G(QVWpTK0m7^gWSTe8vKP>L2T6v@^-GTM_ZG zhbBLv8GXePe&HJ03}vx~W!%9PJi{5hO1;4h`5ve60Y`9<`hn}@p)Va7=aJhGv2YH} zfg(=hD(28fv#^e4;WjSg9$w>V+AmhwK`x<3c)$5BDNe;7s$_n;ZO!BI=aQP2w8$~|tjRnmR*3i Date: Fri, 18 Sep 2020 18:26:56 +0200 Subject: [PATCH 46/47] run tests --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c86edc3..2fb049f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,7 +2,7 @@ name: test on: pull_request: - branches: [ master-disabled ] + branches: [ master ] jobs: build: From bf76c38de7bfb8d7e3164774543ff99cecd73736 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 18 Sep 2020 18:28:23 +0200 Subject: [PATCH 47/47] no log resign --- katrain/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/katrain/__main__.py b/katrain/__main__.py index 4db50bf..502859e 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -288,7 +288,6 @@ class KaTrainGui(Screen, KaTrainBase): def _do_resign(self): self.game.current_node.end_state = f"{self.game.current_node.player}+R" - self.log(self.game.current_node.end_state, OUTPUT_INFO) def _do_redo(self, n_times=1): self.board_gui.animating_pv = None