From f57dbcdee9e3309c9bcb2b6aa1a76d77d64e1a28 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Thu, 25 Jun 2020 01:17:58 +0200 Subject: [PATCH] extra analysis options --- README.md | 4 ++- katrain/__main__.py | 28 ++++++++++++------ katrain/core/game.py | 21 +++++++++++-- katrain/core/game_node.py | 5 ++-- katrain/gui.kv | 10 +++++++ katrain/gui/kivyutils.py | 7 ++--- katrain/gui/style.py | 2 +- katrain/gui/widgets/graph.py | 7 ++--- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 10517 -> 10707 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 12 ++++++++ .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 12341 -> 12531 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 12 ++++++++ .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 11433 -> 11681 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 13 ++++++++ .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 12239 -> 12429 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 12 ++++++++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 12952 -> 13142 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 12 ++++++++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 13183 -> 13373 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 12 ++++++++ .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 16548 -> 16738 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 12 ++++++++ katrain/img/analysis.png | Bin 0 -> 6733 bytes katrain/img/off.png | Bin 0 -> 5770 bytes 24 files changed, 145 insertions(+), 24 deletions(-) create mode 100644 katrain/img/analysis.png create mode 100644 katrain/img/off.png diff --git a/README.md b/README.md index c6db987..411ae17 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,8 @@ Keyboard shortcuts are shown with **[key]**. * **[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]**: Re-analyze game: ... + * **[spacebar]**: Turn continuous analysis on/off. * **[enter]** AI move. Makes the AI move for the current player regardless of current player selection. ## Keyboard and mouse shortcuts @@ -112,7 +114,7 @@ In addition to shortcuts mentioned above and those shown in the main menu: * **[Shift]**: Open the main menu. * **[~]** or **[ ` ]** or **[m]**: Cycles through more minimalistic UI modes. * **[p]**: Pass -* **[spacebar]**: Pause/Resume timer +* **[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 up/down]** Switch branch, as would be expected from the move tree. diff --git a/katrain/__main__.py b/katrain/__main__.py index 9437e37..1034003 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -89,6 +89,7 @@ class KaTrainGui(Screen, KaTrainBase): self.teacher_settings_popup = None self.timer_settings_popup = None + self.idle_analysis = False self.message_queue = Queue() self._keyboard = Window.request_keyboard(None, self, "") @@ -113,6 +114,10 @@ class KaTrainGui(Screen, KaTrainBase): def play_analyze_mode(self): return self.play_mode.mode + def toggle_continuous_analysis(self): + self.idle_analysis = not self.idle_analysis + self.update_state() + def start(self): if self.engine: return @@ -182,7 +187,9 @@ class KaTrainGui(Screen, KaTrainBase): 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) - Clock.schedule_once(lambda _dt: self.update_gui(cn, redraw_board=redraw_board), -1) + if len(self.engine.queries) == 0 and self.idle_analysis: + self("analyze-extra", "extra", continuous=True) + Clock.schedule_once(lambda _dt: self.update_gui(cn, redraw_board=redraw_board), -1) # trigger? def update_player(self, bw, **kwargs): super().update_player(bw, **kwargs) @@ -197,7 +204,7 @@ class KaTrainGui(Screen, KaTrainBase): def _message_loop_thread(self): while True: - game, msg, *args = self.message_queue.get() + game, msg, args, kwargs = self.message_queue.get() try: self.log(f"Message Loop Received {msg}: {args} for Game {game}", OUTPUT_EXTRA_DEBUG) if game != self.game.game_id: @@ -206,19 +213,19 @@ class KaTrainGui(Screen, KaTrainBase): ) continue fn = getattr(self, f"_do_{msg.replace('-','_')}") - fn(*args) + fn(*args, **kwargs) self.update_state() except Exception as exc: self.log(f"Exception in processing message {msg} {args}: {exc}", OUTPUT_ERROR) traceback.print_exc() - def __call__(self, message, *args): + def __call__(self, message, *args, **kwargs): if self.game: if message.endswith("popup"): # gui code needs to run in main kivy thread. fn = getattr(self, f"_do_{message.replace('-', '_')}") - Clock.schedule_once(lambda _dt: fn(*args), -1) + Clock.schedule_once(lambda _dt: fn(*args, **kwargs), -1) else: # game related actions - self.message_queue.put([self.game.game_id, message, *args]) + self.message_queue.put([self.game.game_id, message, args, kwargs]) def _do_new_game(self, move_tree=None, analyze_fast=False): mode = self.play_analyze_mode @@ -266,8 +273,8 @@ class KaTrainGui(Screen, KaTrainBase): except IllegalMoveException as e: self.controls.set_status(f"Illegal Move: {str(e)}") - def _do_analyze_extra(self, mode): - self.game.analyze_extra(mode) + def _do_analyze_extra(self, mode, **kwargs): + self.game.analyze_extra(mode, **kwargs) def _do_new_game_popup(self): self.controls.timer.paused = True @@ -397,6 +404,7 @@ class KaTrainGui(Screen, KaTrainBase): "a": ("analyze-extra", "extra"), "s": ("analyze-extra", "equalize"), "d": ("analyze-extra", "sweep"), + "f": ("analyze-extra", "game"), "p": ("play", None), "down": ("switch-branch", 1), "up": ("switch-branch", -1), @@ -429,8 +437,10 @@ class KaTrainGui(Screen, KaTrainBase): elif keycode[1] == "shift": self.nav_drawer.set_state("toggle") elif keycode[1] == "spacebar": + self.toggle_continuous_analysis() + elif keycode[1] == "b" and "ctrl" not in modifiers: self.controls.timer.paused = not self.controls.timer.paused - elif keycode[1] in ["`", "~", "m"]: + 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) diff --git a/katrain/core/game.py b/katrain/core/game.py index 95e2e5b..4e9f753 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -317,16 +317,29 @@ class Game: f.write(sgf) return i18n._("sgf written").format(file_name=file_name) - def analyze_extra(self, mode): + def analyze_extra(self, mode, **kwargs): stones = {s.coords for s in self.stones} cn = self.current_node engine = self.engines[cn.next_player] if mode == "extra": - visits = cn.analysis_visits_requested + engine.config["max_visits"] + if kwargs.get("continuous", False): + visits = max(engine.config["fast_visits"], math.ceil(cn.analysis_visits_requested * 1.1)) + else: + visits = cn.analysis_visits_requested + engine.config["fast_visits"] + self.katrain.controls.set_status(i18n._("extra analysis").format(visits=visits)) cn.analyze(engine, visits=visits, priority=-1_000, time_limit=False) return + if mode == "game": + nodes = self.root.nodes_in_tree + min_visits = min(node.analysis_visits_requested for node in nodes) + visits = min_visits + engine.config["max_visits"] + for node in nodes: + node.analyze(engine, visits=visits, priority=-1_000_000, time_limit=False) + self.katrain.controls.set_status(i18n._("game re-analysis").format(visits=visits)) + return + elif mode == "sweep": board_size_x, board_size_y = self.board_size if cn.analysis_ready: @@ -354,7 +367,7 @@ class Game: visits = engine.config["fast_visits"] self.katrain.controls.set_status(i18n._("sweep analysis").format(visits=visits)) priority = -1_000_000_000 - else: # mode=='equalize': + elif mode == "equalize": if not cn.analysis_ready: self.katrain.controls.set_status(i18n._("wait-before-equalize"), self.current_node) return @@ -363,6 +376,8 @@ class Game: visits = max(d["visits"] for d in cn.analysis["moves"].values()) self.katrain.controls.set_status(i18n._("equalizing analysis").format(visits=visits)) priority = -1_000 + else: + raise ValueError("Invalid analysis mode") for move in analyze_moves: cn.analyze( engine, priority, visits=visits, refine_move=move, time_limit=False diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index c0b3ef1..a0e31e3 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -69,8 +69,9 @@ class GameNode(SGFNode): # various analysis functions def analyze(self, engine, priority=0, visits=None, time_limit=True, refine_move=None, analyze_fast=False): - if visits and not refine_move: - self.analysis_visits_requested = max(visits, engine.config["max_visits"]) + if not refine_move: + req_visits = visits or (engine.config["fast_visits"] if analyze_fast else engine.config["max_visits"]) + self.analysis_visits_requested = max(req_visits, self.analysis_visits_requested) engine.request_analysis( self, lambda result: self.set_analysis(result, refine_move), diff --git a/katrain/gui.kv b/katrain/gui.kv index 2f76090..cd30c74 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -721,6 +721,16 @@ icon: 'img/Sweep.png' shortcut: 'd' on_action: root.katrain("analyze-extra", "sweep") + AnalysisMenuItem: + text: i18n._("analysis:game") + icon: 'img/analysis.png' + shortcut: 'f' + on_action: root.katrain("analyze-extra", "game") + AnalysisMenuItem: + text: i18n._("analysis:continuous") + icon: 'img/off.png' + shortcut: 'space' + on_action: root.katrain.toggle_continuous_analysis() AnalysisMenuItem: text: i18n._("analysis:aimove") icon: 'img/ai.png' diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 9d5b9a8..8eb4c03 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -383,15 +383,15 @@ class CollapsablePanel(MDBoxLayout): option_active=self.build_options, options_spacing=self.build_options, ) - self.bind(state=self._on_state,size_hint_y_open=self._on_size, height_open=self._on_size) + self.bind(state=self._on_state, size_hint_y_open=self._on_size, height_open=self._on_size) MDApp.get_running_app().bind(language=lambda *_: Clock.schedule_once(self.build_options, 0)) self.build_options() - def _on_state(self,*_args): + def _on_state(self, *_args): self.build() self.trigger_select(ix=None) - def _on_size(self,*_args): + def _on_size(self, *_args): height, size_hint_y = 1, None if self.state == "open" and self.contents: if self.height_open: @@ -402,7 +402,6 @@ class CollapsablePanel(MDBoxLayout): height = self.header.height self.height, self.size_hint_y = height, size_hint_y - @property def option_state(self): return {option: active for option, active in zip(self.options, self.option_active)} diff --git a/katrain/gui/style.py b/katrain/gui/style.py index e3523af..1d84822 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -59,4 +59,4 @@ ENGINE_BUSY_COL = EVAL_COLORS[2] ENGINE_READY_COL = EVAL_COLORS[-1] # info -INFO_PV_COLOR = to_hexcol(RED) +INFO_PV_COLOR = to_hexcol(YELLOW) diff --git a/katrain/gui/widgets/graph.py b/katrain/gui/widgets/graph.py index eff006d..691d5ff 100644 --- a/katrain/gui/widgets/graph.py +++ b/katrain/gui/widgets/graph.py @@ -222,13 +222,12 @@ class RankGraph(Graph): half_seg = self.segment_length // 2 ranks = {"B": [], "W": []} - dx = self.segment_length//4 + dx = self.segment_length // 4 for segment_mid in range(0, len(nodes), dx): - bounds = (max(0,segment_mid - half_seg), min(segment_mid + half_seg, len(nodes))) - for pl, rank in self.calculate_ranks(policy_stats[bounds[0] : bounds[1]+1], num_intersec).items(): + bounds = (max(0, segment_mid - half_seg), min(segment_mid + half_seg, len(nodes))) + for pl, rank in self.calculate_ranks(policy_stats[bounds[0] : bounds[1] + 1], num_intersec).items(): ranks[pl].append((segment_mid, rank)) self.rank_by_player = ranks - print(ranks) self.redraw_trigger() def update_value(self, node): diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 98569aa4d781ed8d7cae4eb2e7dc46eab0cce58d..837684882b0747d11e89cd065cf7682638d33f44 100644 GIT binary patch delta 2909 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 EADOfIM*si- diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index 2a9b66c..eaa954a 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -572,3 +572,15 @@ msgstr "All available models already downloaded" #. TODO msgid "tab:rank_est" msgstr "Rank Estimate" + +#. TODO +msgid "game re-analysis" +msgstr "Re-analyzing entire game using {visits} visits" + +#. TODO +msgid "analysis:game" +msgstr "Re-analyze entire game" + +#. TODO +msgid "analysis:continuous" +msgstr "Continuously analyze" diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index cfda43fa2f713ddc1f12163a13e8b3ee3d23a718..bcfc2c69e0debdfd40d42c42b1066839115b42ce 100644 GIT binary patch delta 2908 zcmYk-eN5F=9LMpmV1SngiFnXdyr!TiDh$+Ynr68c#vGb#F5INN;WfnoG11vCb!&;x zn#5vI;cTV|{v#4KjX+!JG9Na}hbe98dPEzgTe>-Vf4FCs`|*37bAIRdJ>T>2yLPPn zyV&bZ7+P=qYvFG+f2$r+&8*G$pGg!CQGXau;0XNQc?-u}cfvcCG zCa@8Q;oF#Kp4n~+;WX?=Vp*%}(1}W{2Q`z^sK6Io`*l>HTh4z_?}w4S`o*CpGKQP_ zO+mWY3>-`lqZ!`{C}<`t+=JJU%RFZ-YU!F#{aR5o>2lA{p_aTCmGGaa{`c?^^f4Mm zOGUkxiAvx}ZW_b#DJbxZs259-%ieJ9wWt^OpawdO8t4Ra*%?>AhMM88sFk>bQ8$Mcn(1}qvOaE# zcOP{q6B$+UGEiU7TvWe8&lO5g0X8|ep)#&Uo%%+Mz-Cn7Pu%k_PzipA8tAHP??vySB#Fx1##LgG#&+_1*zz z2Wo|mqY^%kigN{r>HGhKg7)wZ>P4leL}F2aQ&2CAN6j=B6)?}WFUP@zP+PXuJ+DQ@ z`vAGDh1;vxg%fcy!IJg;FQG6JgSZ-Z;9~5<890Xx*Yk4J3~F#3)?+4iVm98u9869L zo$@?Xy$Gk{yEq2BkdWn6$dJf)~Z^AWO0b_DfHb_rP|>qqT%3I{=3l!MRWGpNH^gY&TqXW;-c zj%TwtNz-U}9<^j!P#IU_Fl;~#v==q-QOv?0k#lD8Q$qDAsDz8qk5w3nji@+#Q4?!J z9r_;h>HGhhf&!gKeaC&MnG7IF+NjLXj25DgdLi;tVZ|7Ol^BKFF&cNFCh$ILCHA2v z@F{A7XHnzzVyeFXyA)z@#MDsWG}IE!Mg=HCorUcfhC5xo1~tPv)LCf4T|?Gn}>X0mN(tz***&EY0#1y;{T?T+)jQnw&PSh=i-j}-5_cqf4Ta9k;f)b zI6grPFuvuG&`JtiMG5lQ3THKH>uOQ$8c-`~b@d;hw)8X9guh0$Kke!VQ0;$54SWj~ zCxMKohFK(3k$9i~aA-|v|`Wq_# z2x`386!t%pL?)$EFpNyjmN_d?Gv0{Wfmcy0d<}W5nU@0XMP0rwRGjZnU&#RS*oZTh z*{FZIbDBqj$yg9|yTjU25LkN+=`m$UStS6gt`OA zQTyW5k^p3JM8kK7$RSAhuK|NjfAuY z)KRwKD%^uh@iKbXNi5*1F2gyDP7Hemsk0W$!w!4{&*EHsg5TR?_&VyBvy@LrU(pg? zyRZgziLav;GK$)v82-S>WYiI6WpVymK^_G{RX z#0$7(8n4^T9-VG>o@7NfM?yZxHl8A1JcBJK@1M!fGWo}5vHvY3N@qt0IENbeBI>eS z#W^^NI`bL1(K9bZO=uA^7h8^6NG)n1+firVjB3~A%Dd4|{xs@q==De_aK9_~1KDN! z+m#21qKRap0_CEPs0g)%OI`UIWO240wdGByiL{~O??djNeTtg!H>kVf4Uy0#NoJYs zip@s-a+M>CwspwySrck!4&cLh1a%q5umnR~j4-~08t7xx*YOov0UL1^zKI913$^8sbHfyG z3uMH=$z G{r>^F`~*k< diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index 63f6973..cbab7b4 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -615,3 +615,15 @@ msgstr "All available models already downloaded" #. TODO msgid "tab:rank_est" msgstr "Rank Estimate" + +#. TODO +msgid "game re-analysis" +msgstr "Re-analyzing entire game using {visits} visits" + +#. TODO +msgid "analysis:game" +msgstr "Re-analyze entire game" + +#. TODO +msgid "analysis:continuous" +msgstr "Continuously analyze" diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo index 27579736cbce6c6f0097fcc330e317396327662b..c6ca5caed7b04233d17b29435605f641c0701937 100644 GIT binary patch delta 2932 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 Ef6Kf7F#rGn diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index 1a7ac7a..518a233 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -98,6 +98,15 @@ msgstr "Equalize visits of potential moves" msgid "analysis:sweep" msgstr "Fast analysis of all moves" +msgid "analysis:sweep" +msgstr "Fast analysis of all moves" + +msgid "analysis:game" +msgstr "Re-analyze entire game" + +msgid "analysis:continuous" +msgstr "Continuously analyze" + msgid "analysis:aimove" msgstr "Force AI Move" @@ -113,6 +122,10 @@ msgstr "Analyzing entire board using {visits} visits/move" msgid "equalizing analysis" msgstr "Equalizing analysis of candidate moves to {visits} visits" +#. status message +msgid "game re-analysis" +msgstr "Re-analyzing entire game using {visits} visits" + #. right panel buttons and below board msgid "pass-button-text" msgstr "Pass" diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index 0e7f4e4e210576e4f816bb097ec0fdcaf3216582..74e83dfb6a04349f2bac509c30fcade708e02abe 100644 GIT binary patch delta 2909 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 F{{#8u0EGYm diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 9246ba7..0ee6641 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -610,3 +610,15 @@ msgstr "All available models already downloaded" #. TODO msgid "tab:rank_est" msgstr "Rank Estimate" + +#. TODO +msgid "game re-analysis" +msgstr "Re-analyzing entire game using {visits} visits" + +#. TODO +msgid "analysis:game" +msgstr "Re-analyze entire game" + +#. TODO +msgid "analysis:continuous" +msgstr "Continuously analyze" diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index 857c300f1918d753eb53fe2a3fd0b3112bf18ef2..145fba755fd584670ccc431b151308c39515b35e 100644 GIT binary patch delta 2908 zcmYk-4NO*59LMoLpec{Mh4_LAKBl6`OZk#vOZ#uX*HZ;jn-Ub-yhGJ<*xU0&b{aU&;R_-y$|mP zelGI5;)m23|62Gzp8uuF!EFPy~96o`=@Og~E zWf+SE?tXbl&)%Xz4BL$g(1_7^1V`gBjKcFc1aF`c`VBSy9*)C!1|?tyYQhDmaoMh4 zj9S1ZjKr;&V4m478WCJ*Mq*j38}Jz_v9D1pIfDv(&RxHb3Utf)7wY+Nve&p6)IyRt zXnd8h}=ki*_^*K1G@?ng~@1U1nKs6AWm`lYA|tDU=0rEGHd4-W2U z1VL!pXw*VdP>E*6QGZSFEGH$f0w2P4sM2jiWxm(hh8)((Nr|69RpJ6_rPqOkxKplw z2{q9T)WmmCi4Gt+dKOPz^fF9F1xQB?oP&CBfxEsG6*w1p)=FK!3N?NQD)D;Mb00Z7 zP!&3kO85s9dl46- z5^2C?*ox_R5A_qD&KpQ*dk#JALs3+6xxbslBmD-ehC-!cjqN%9%@VSQ4g#|ZAB0@ z-b3x>yQn>X51Viw7UP0sD#HQ}VIrQMz_Zxn=MNI*KFk*2fl1UqiN@K7R& zKUU%Z8>KzWOXWSl)u_FE6ScBBB(}An-hordZrEj1MgBllE_{0EcO@RRg_)@Fi#!^c zH1g1g+fgg3L#@0CwcGHl^jI9oFBXE9jMZNfmGFgL=GF^#I9KyLCDRrQSqucX<=>X!wyvZ zW2m?%2d}gLXK2K5;XJC8zaa02-NhN0^hoIXQd9{GQGwQ=_OKkI@g0oCTGYGJgsMa* zD)EyTg+f{#K~1n1r{SllM6V!U zvh`pJ{)4Q^rm!l0dTlv+T4@mtm1G<0Gu+|ajhe6?`55egvl-{mZ$UkG6*aEM_4`l> z_oEi}H!7}gW@u~UFpmDXnf8?Jqmjl1mE>Dg<`-T6nzPS&5A|-u%;HA`$Ifc6^p!;T z3fGryEGes4UlFXm7(I7LasIkM`|y}Rc$B|9kda@Ozjkx5B-p+>u48P%!uvzlZuSq} zstnYQPhB)B$BnEE_ya^M5BLewUXbcVWZu73Qda!Gn*o1CP*+~xR1z%N7_9P#Y`>cR H`Otp>Mc_P2 delta 2741 zcmYM#drXye9LMpmT%>c*(}|#vi+~tMkP~^_0w)@2VJ&A0|2UA@j6`(i%8WH-kK!NM zD!eeQG0_&;h0Tl|wqkA4RkGR=Gi}shwj~yoOE%C<*ZafyZMnzi^}Bw5*Yj|G{p(M8 zLn#Rdjel?RKa2m%6O}XD;s4(>lFj7rz&1?BW6qP9L;eD$-~_JVa7uEhd%)nnT6>p*jOrew7<)QMWs0CD_ z4_9NVd1mWK#8c3O^tJ7-!HcMg?MJQTFe=bnt~`ngbkg}1s{dJ3yCKv<{&e*>kjD}! zoSYygGrr}K&`QFtq5^sBac3QB>o%d?2-^-;dhC3#fL( zsG}VXu>U%vI9jP79W`KyvjVlnt6Y68^4PPyScJ8pCcMw(J6*mTdF%^bTF5!nL@%M@ zkDz zSAPYygWh%5Ac-gnl*&sDL#PRrp=P`YbySt8f!3hft#|n*)IhsX1Gl0k+KvoiCs23b zQ&j)cNITEIC!vnRuHp|=;Bn-!B=%GJ3{>E`sF|0d`aSHdLhaC6)P$c#^=m>6xCeEF z2T=VwCd)bhE)ojdgX-`JYNZ3HfFrJa949BlvUFq_sQMyQzy-)-mAp1#Erzfk>1tQ7 z0OJY14vX+f{r+DiQHFnGzA8BQ8Mp$K-+;OJ3NFCoxDrQD6DhmftQsG|Vmyrcl%GaI z+9lLc{)^2xg`2qrJ@l4NVP+(@Q81tHr~-u0?bC8c^Er!AvWMJ z=CXigGubiRkYlzLTXOjc<9HrNfJ@lMY}`1Tad6K)+y&fQ!2Z{fXy>4GhS%npu}hX% z7+X;`64U0P&VChY2kKEfwH5XK*o``}qo{VhcrSj7THp=T0;U$l7MhA$V5UbxE6jHl z#i%ozkJ{2l(T8=Yfg4a0eI9jbccTLB#ku$zs@>VGo3A8x6uB56A4cw>m81ICq9)LYtkIg0 zPk?oy#_K~rTL3-Q4!e!C1!shts(eQ_f F{{ca-1A71f diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 21e3d57..7e66bcf 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -649,3 +649,15 @@ msgstr "All available models already downloaded" #. TODO msgid "tab:rank_est" msgstr "Rank Estimate" + +#. TODO +msgid "game re-analysis" +msgstr "Re-analyzing entire game using {visits} visits" + +#. TODO +msgid "analysis:game" +msgstr "Re-analyze entire game" + +#. TODO +msgid "analysis:continuous" +msgstr "Continuously analyze" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index 473ea528d5d3b8ee043c614f7b1c504937fedc89..34593263bbff9aa18d762a16502e385c7ba073f1 100644 GIT binary patch delta 2908 zcmYk-3ry8z7{~DkAumTkB|g{@?%eKJWAX&*Ao> zBZa}m#;Zfd5w@7Wx7;@3{BR zp%%J=TDTRJ=q)72z>=wpUWS3F0NJRCV^9xH_3@dgz-kYvRp;{01=4 z@&Mmm`lC6ZjW{49me8lj$4+ul1=^6RS}4;ji~~^pX{Zv-?gs&!MqWaIE&b}B`iI0%evCojI+ga?2f8kKj$D55@xbMV)y%>MSQ<2&bctW|rU2 zN8UrLL~U#{D&8(kV|_bJLnUiOy)?h#Ec_c4=<(sPh4WAW3Q#*MM=iV(^#k-a>S#9k z{U1?B)QID;8K+=oPAu+X3}!I!It^w1t$P}K(m#*daWkr9H(eXS-v{~$s6_JJLbntZ zZ#nAuRo-9k{Vk~9g*_wqeXF5S&wxrYkFSDuRE(NXjta0IRqE}i9Ua6nJW*E}Dvl4m zQd&}8R8mn|5#7+3I4+?ee`%zyb5f*3w{TfxXnslllFDdNw63s6R_~N)ccw0>47cA} z5!vv5Ms8}Z&s-4+M~GGy3Acx7%BYPWcIRGENx}c`hAW~PS-HF@T2vmb3dgLg&c4?1 EU$F!}UH||9 delta 2740 zcmYM#drZ}39LMo*0wRY?gir*Co=mPHgiRzbBQ1)u5}lg^3u~kSTNkXc68n|^SOI4S z(-kVKuo_qy9fmds*hR70N{r0~1y)ry{9e!f`97EPv;UEQH+ka; z;k%4~Z}FGL->L}Z%o=_Fn?!OO`D?HZlkrXG0L~_V8WZpm#-lIVED}>O4(H<4Scs}$ z5z@1@B0i_s) z>oL(hvxi88QP6<&wXLqf4pd+-qgJvPHPC)n9z+c^;5>oqe+t!Z9JP?&T>an3V-XZi z1&GniZ+;S5NuH}HK_0u$c|U6F>QL>rqE-@c^{=6}^gUF-gQ)hOyZTX7`?IKt|3Zxu zMaEOZG!m+q&r20cP#x|?4ZIOG@Ds>mjV|AWTG4LQ$~$oe9z-5H%uC}Bp?2^zs@(+Y zXn&1k|8+*wXr+Q=)P(uY64Vx#yZTDxv3g!C!nUIV-s$q4F5iPZ_9-tdWCRuHPpI)P zqUH;aXa7@4q*6K)i;&>#Zf6B5;u_QrJcU}}bI4;a^3p)bGyIob&G{p@Dl*9gd<_I*c0dXIDOnQvtCo9a##hJ_j{mG4fa`uR5&6OdLW5d>(V~ z3N~RDlWfuNzn8>v6>#7gxEVD;0R7m3v+yV`!Er3ZlNRSr5V(i3b{0 z#%EBMco|XaC~iaT&^@Rfu0S@^>Sl5NQ@7Anw77;Hr~wb4B0r8gyOY?1W4IPu(#`(B z@6pdfMrNC>!O1yhmnkp1!E7D*m2*SwUcHg~LcVz(yF>k{4EBE)i9rrZ5v|MO7_f#H zyJxL92fJPV3)Bw%h-&{Q`Y|dy6kskY;6=C)OI-PrIJHn`3u=ePe+CPhIhI#F-U=VfIW2m!F z$_-t*9AtOxPK?IQn1@?Xm-cnM1J7UyX3Y-`T!Wf0fHAn&<-44RQ1{P{k>Ig$URpsk zqc1`~YU1_I2Gq)SJNIEM`TeL%_<<|$L*4#9o)zx<*_sou94344h!dX2!8Gdr$)&Mh)aty;pdMp_UB23|w#>NvV0B#OwBX73dC6_Q?DAlJ_JOeAs=N!+{{vCX3xfav diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index dce0fe4..9ce8469 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -587,3 +587,15 @@ msgstr "All available models already downloaded" #. TODO msgid "tab:rank_est" msgstr "Rank Estimate" + +#. TODO +msgid "game re-analysis" +msgstr "Re-analyzing entire game using {visits} visits" + +#. TODO +msgid "analysis:game" +msgstr "Re-analyze entire game" + +#. TODO +msgid "analysis:continuous" +msgstr "Continuously analyze" diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index 7ad03ae74a5e4fd29ba2e5bf58720656e69857a1..70212a2629aa6dc8da1e6482cf9ed2d041d00f8a 100644 GIT binary patch delta 2910 zcmYk-e@s?Y9LMo5_yc?tB?OdEeEboDzwihCz!a6rEN4zi8cVj&o)APV9+a@?rr9zJ zY)Z@2hFi@vWo?5(eME>mhE#LK1K!hDQYDrQ3IcK?UzskU3K0-y&p;R>em;w zkip#4Z#2@yCSzBC*qixn5e2QJz&&^dxy*Ccpi;L3)o&kaC5PPe)2NhRL6Y_UtiNFF{SX&bbAZ%JpB zcc3y6!A%*9cc!2MPeWzE%cP)4=C}^Is8lX-9ZHbPD!HlOCR9K>Pyz2kZP{MbM4zDg z9e4E$sEID4ChkB5dJBosvpDji!!QChz!+4=DX157T>C=Q!1>6#R^sZ_sQ$I6z_+8` z+v7Zd%Fq#1z-Lh7T)i)CgxNBFS6`uin%Pq^k3SGY zu^Mx*9)H7D9EPU`n>~qtpng#oG0QkyjFF7D0dMm z%F|g{B&i)`wt{-pSXO{x!q)_quGy)ZzLW z*JF>#{-NH8Vd{UO4sQvAvBjQ!L_vq-1nMl@#5jze>IamJY@dzB*|-pA;G3w4PvKll zoW|b~EI{V4&8QWAhRR$EYAb$p?Kd$_-+yG5zgG#!`LGG70rD^h-@pO*B`TG_pazbb z?!Om{+M+SoAG2^ME^yCRx%%rEPkRGu!ACHK`K^P3QXhM-SrCJmk8>~$cc9L~F;r&0 zKxOJ8>ht{_hv5y>VN51HdLF_gtU!`vwYV5RM=fL!KOWvv3Nt9^^Q(6@qgMPKYDIry zBt~WX25<%S7*r;zFcH_ICVmI?{vM3M!>E2OsPWDtG1!%C%eHn3X|w#plrY;*$fpk-HQrWhMJ=Lh9dg}%R^%e z%L+@Y!o}gH<+0aO;_tiDwX`bO^=NHqYko#uVy^4CHWUmoT6rkgHB5WP!k**qJS#3M b`v245>abd#UsD_|t_W8LeVe9FDGB@w4c$tQ delta 2742 zcmYM#drZ}39LMpmh#(knKoq%i#6$tbydeTfXcXae!5WHD$ed0LGOU$Jo$}UrZ+*~?g=_;p^TP_>5X73N@*>XS5>-jy`@AG}0b3ETZp=Z|w zZ#XXWCF9>a{H5@>dXnDE+9LmV8pX$XkHs#Wfp0sHVmj}qF%JJiA4X0w3&&)P#!QUC zg{bz@pq^DxV2o`-P4FN_VLML8eRvc0VkjO)1@tMZ|4B^3^B9l+q85x}kox&i@A;?= zlwky}!+7(|>M2a5q6Hait**nQVF zM$Hq!i>Hn$6x5K*hZ+h|1Ju0u`y5b{`?d*6fF(aWfvAH>Oc2zl%iJ~aO^R0dC@ z`i-ED_Hs1&*BOP-OBFLv3+6dXP$|CKwQoQkYvzMZSUW1*qroIfV-J zSJeF1Q0s;I$bT}0WNN2kJ`$W&IBQT5Z$)L`5!4Q!L>_yV4^7mKx_o`8dA>n?OU@vV zU2}#KjmA%Nrg;InCv#=SmX&-uScK@%TF4fq_j(?QgPzq$JBI35t&(vc;h+Ots;79fw6@v#LrU>1Ib zx(kmsQu$55y{KQ# z-*GJU1?z~m1y2&)t9ZvO{_w)h{9z8~(2Oy22`+@pX7g*xdrz*%4k-8tUjf9E zw|SV0tYtN*qj?PHU_a`JMp1!9EC{AL6Lr>AsJqjOI*LxzyyuYXV}GJD6LCxM&iFhE zJ}OdO#eCF&LL_*rLS4F@uKsz{CF(&1_>-$2L*};Fg~61UqB2>5F<6H>+U>X$4`4NV zCtStsMP`*$)FM^(0p5uhkZf5ltLidUV>>>Iy2WF-1Gg**Ue>dyBh6qHop~X~;a#Xe zYB3WVv4r)llR^;{L#PE~^7#tkI%HG!CNifDqP`X3%Yqs6p^m_hsxL$>vO$<9d7w=ioWi9SAEVVAi)N3QAQ5Mq(b$#O0{VSL@n)F_HI=k!08a-h-1#pYFna zSdUMjzGgo=Z=iOZS{&Ta5)9$J96c3QQ`m-UQJFY`)3F~F*jdyBmoN%LZVmSHp)!<+ ztYP!;3O1nbQ1yynCZ9vyp#!K({UzRp7gsR7&MdoxUp*`iyc^jtu`4S&FR&?kLr7r2 VH=5Qpl-Ct#Td*c9Ft&7S?c}%8UUL1O-GuMIp@~ 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 A00000 literal 0 HcmV?d00001