From 13698858ef350e3e9ae8f89129e9ae41ce292957 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 21 Jun 2020 20:06:15 +0200 Subject: [PATCH] model downloads --- katrain/core/engine.py | 2 +- katrain/gui/popups.py | 96 ++++++++++----- katrain/gui/widgets/progress_loader.py | 109 ++++++++++++++++++ .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 10277 -> 10396 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 8 ++ .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 12101 -> 12220 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 8 ++ .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 11193 -> 11312 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 6 + .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 12013 -> 12132 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 8 ++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 12712 -> 12831 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 8 ++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 12943 -> 13062 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 8 ++ .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 16308 -> 16427 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 8 ++ katrain/popups.kv | 53 +++++++-- 18 files changed, 274 insertions(+), 40 deletions(-) create mode 100644 katrain/gui/widgets/progress_loader.py diff --git a/katrain/core/engine.py b/katrain/core/engine.py index 7e7332c..6ffb786 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -37,7 +37,7 @@ class KataGoEngine: self.query_counter = 0 self.katago_process = None self.base_priority = 0 - self.override_settings = {} # mainly for bot scripts to hook into + self.override_settings = {'reportAnalysisWinratesAs':'BLACK'} # force these settings self._lock = threading.Lock() self.analysis_thread = None self.stderr_thread = None diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 48c6f46..e481ffb 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -24,9 +24,10 @@ from katrain.core.constants import ( ) from katrain.core.engine import KataGoEngine from katrain.core.lang import i18n -from katrain.core.utils import find_package_resource +from katrain.core.utils import find_package_resource, PATHS from katrain.gui.kivyutils import BackgroundMixin, I18NSpinner from katrain.gui.style import DEFAULT_FONT, EVAL_COLORS +from katrain.gui.widgets.progress_loader import ProgressLoader class I18NPopup(Popup): @@ -306,40 +307,79 @@ class AIPopup(QuickConfigGui): for _ in range((self.max_options - len(mode_settings)) * 2): self.options_grid.add_widget(Label()) - class ConfigPopup(QuickConfigGui): + def __init__(self, katrain): + super().__init__(katrain) + self.paths = [self.katrain.config("engine/model"), "katrain/models", "~/.katrain"] + + def build_and_set_properties(self, *_args): super().build_and_set_properties() # self.check_models() def check_models(self, *args): # WIP - try: - model = self.collect_properties(self)["engine/model"] - except InputParseError: - self.model_files.values = [] - return + done = set() + model_files = [] + for path in self.paths + [self.model_path.text]: + path = path.rstrip("/\\") + if path.startswith("katrain"): + path = path.replace("katrain", PATHS["PACKAGE"].rstrip("/\\"), 1) + path = os.path.expanduser(path) + if not os.path.isdir(path): + path, _file = os.path.split(path) + slashpath = path.replace("\\", "/") + if slashpath in done or not os.path.isdir(path): + continue + done.add(slashpath) + files = [ + f.replace("/", os.path.sep).replace(PATHS["PACKAGE"], "katrain") + for ftype in ["*.bin.gz", "*.txt.gz"] + for f in glob.glob(slashpath + "/" + ftype) + ] + print(path,files) + if files and path not in self.paths: + self.paths.append(path) # persistent on paths with models found + model_files += files + models_available_msg = i18n._("models available").format(num=len(model_files)) + self.model_files.values = [models_available_msg] + model_files + self.model_files.text = models_available_msg - if os.path.exists(model): - if os.path.isdir(model): - path = model.rstrip("\\/") - file = None - else: - if model.startswith("katrain"): - model = find_package_resource(model) - path, file = os.path.split(model) - files = sorted( - [ - os.path.split(f)[1] - for ftype in ["*.bin.gz", "*.txt.gz"] - for f in glob.glob(path + os.path.sep + ftype) - ] - ) - self.model_files.values = files - print(file, files, file in files) - if file in files: - self.model_files.text = file - else: - self.model_files.values = [] + MODELS = { +# "pure 20b": "https://github.com/lightvector/KataGo/releases/download/v1.4.0/g170-b20c256x2-s4384473088-d968438914.bin.gz", +# "pure 30b": "https://github.com/lightvector/KataGo/releases/download/v1.4.0/g170-b30c320x2-s3530176512-d968463914.bin.gz", +# "pure 40b": "https://github.com/lightvector/KataGo/releases/download/v1.4.0/g170-b40c256x2-s3708042240-d967973220.bin.gz", + "final 20b":"https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170e-b20c256x2-s5303129600-d1228401921.bin.gz", + "final 30b": "https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b30c320x2-s4824661760-d1229536699.bin.gz", + "final 40b":"https://github.com/lightvector/KataGo/releases/download/v1.4.5/g170-b40c256x2-s5095420928-d1229425124.bin.gz" + } + + def download_models(self, *_largs): + def download_complete(req, tmp_path, path, model): + try: + os.rename(tmp_path, path) + self.katrain.log(f"Download of {model} model complete -> {path}", OUTPUT_INFO) + except Exception as e: + self.katrain.log(f"Download of {model} model complete, but could not move file: {e}", OUTPUT_ERROR) + self.check_models() + + for name, url in self.MODELS.items(): + filename = os.path.split(url)[1] + if not any(os.path.split(f)[1] == filename for f in self.model_files.values): + savepath = os.path.expanduser(os.path.join("~/.katrain", filename)) + savepath_tmp = savepath + ".part" + self.katrain.log(f"Downloading {name} model from {url} to {savepath_tmp}", OUTPUT_INFO) + progress = ProgressLoader( + download_url=url, + path_to_file=savepath_tmp, + downloading_text=f"Downloading {name} model: " + "{}%", + download_complete=lambda req, tmp=savepath_tmp, path=savepath, model=name: download_complete( + req, tmp, path, model + ), + download_redirected=lambda req: self.katrain.log( + f"Download {name} redirected {req.resp_headers}", OUTPUT_DEBUG + ), + ) + progress.start(self.download_progress_box) def update_config(self, save_to_file=True): updated = super().update_config(save_to_file=save_to_file) diff --git a/katrain/gui/widgets/progress_loader.py b/katrain/gui/widgets/progress_loader.py new file mode 100644 index 0000000..fe2d6df --- /dev/null +++ b/katrain/gui/widgets/progress_loader.py @@ -0,0 +1,109 @@ +# From KivyMD which will remove it in their next version, with some fixes +from kivy.clock import Clock +from kivy.animation import Animation +from kivy.network.urlrequest import UrlRequest +from kivy.lang import Builder +from kivy.properties import StringProperty, ObjectProperty +from kivy.uix.boxlayout import BoxLayout + +Builder.load_string( + """ +#:import Window kivy.core.window.Window + + + + opacity: 0 + spacing: 10 + MDSpinner + id: spinner + size_hint: None, 0.8 + width: dp(32) + color: 0.95,0.95,0.95,1 + MDLabel: + id: label_download + shorten: True + max_lines: 1 + halign: 'left' + valign: 'center' + text_size: self.size + color: 0.95,0.95,0.95,1 + text: root.label_downloading_text +""" +) + + +class ProgressLoader(BoxLayout): + path_to_file = StringProperty() + """The path to which the uploaded file will be saved.""" + + download_url = StringProperty() + """Link to uploaded file.""" + + label_downloading_text = StringProperty("Downloading...") + """Default text before downloading.""" + + downloading_text = StringProperty("Downloading: {}%") + """Progress text of the downloaded file.""" + + download_complete = ObjectProperty() + """Function, called after a successful file upload.""" + download_redirected = ObjectProperty() + """Function, called after a redirect event.""" + + request = ObjectProperty() + """UrlRequest object.""" + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.root_instance = None + + def start(self, root_instance): + self.root_instance = root_instance + self.root_instance.add_widget(self) + self.request_download_file(self.download_url, self.path_to_file) + Clock.schedule_once(self.animation_show, 1) + + def animation_show(self, _dt): + animation = Animation(opacity=1, d=0.2, t="out_quad",) + animation.start(self) + + def request_download_file(self, url, path): + """ + :type url: str; + :param url: link to content; + + :type path: str; + :param path: path to save content; + """ + + self.request = UrlRequest( + url, + file_path=path, + chunk_size=102400, + on_progress=self.update_progress, + on_success=self.on_success, + on_redirect=self.redirected, + on_error=self.download_error, + ) + + def redirected(self, request, *_args): + new_url = request.resp_headers.get("location") + if new_url: + self.download_url = new_url + self.request_download_file(self.download_url, self.path_to_file) + if self.download_redirected: + self.download_redirected(request) + + def download_error(self, request, *_args): + pass + + def update_progress(self, request, current_size, total_size): + if total_size < 1e4: + current_size = 0 + percent = current_size * 100 // max(total_size, 1) + self.label_downloading_text = self.downloading_text.format(percent) + + def on_success(self, request, result): + self.root_instance.remove_widget(self) + if self.download_complete: + self.download_complete(request) diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 4e1041c768c8e3f8801503038fcff54969095026..b095193d049089650c4ec2514116b41c9bfd3717 100644 GIT binary patch delta 2802 zcmYM#3rv+|9LMqJ03wpY0Yf1b55xf#$10?BvKV>UN?OuoV@4O)0kq(p9HJoMX*!Lf z8C15I&}5N=mK${{qs?Z8Yb`bDz6RP_X3JW+5ZBgb-`_d^ioLv__y1h}&*gnycy(i6 zW%z7*!U4z6AioRwEuEprx$5NqP2=$a;!F&gow%5I0MqdU^x~H|6VGD`{)Vaex7E+S zCf05dQWSPYJSf2`oP!lO4>#d#+=>af3o~#Js(mkBhp*$c_%Uk02~@j_7JEpd1$c25 z=Azm!$9TqfC5(llk1C^-Ld=AyW57ll6wUDD$e*(GOXWXI_ zM76(&>5T8LSVc0u)G^B}Ky6(KYQ^hNE2*;jM^Ibdikk3KsP->d{UECSo2Y@uPsQf|!ERiIX~$>Ju9+mXxd=ca|cjGE{OD*rK5 zzSFn>&!@8gb9wMk%h)c%%tOt%7_|dss1@FUT<#ujN)$jHrgl`GZq!#Yh+OWNc^cLK zocS{{2X`sVgHE@H=_X<#D)AgtgFMv4R-gu2W93z-9oUT8sdjTOYU0nLR(=o}!VOvd zC~5~kvik5i4@z_v)$kH(LU9yo#xqgx%8ME(AJy&#i_1|1Z9olNg_>vpN#)v5XP^t! z|9MoqexzU64O_)KsKm#S%Z*$7BdWt?)XY8Xvj$8x7ov7(DQdziQF+Qy1Ky2#h1C`} zpz>`+ufG2d9<;*!s6>O&3g;rIiHxCM#Wz-e0X2bX)Jo&I?Z8Y_c{eIwKbB$y*W(|U zkGD{%!}lO2>HFWwgF5WtwitWyMjXYJcoCy#frC*%yaJbCHB#mFqPF@V>I@yhTk$O{ z!#}YPi{~>qoS9l_&)jXW)L!MXlfs?8Zwtg1gzjPqCQ)SY3D(zs0Uav37xM z=MEEJ#vbfrTWhh%7h6CN>Z}~{g=2?mm;w!a)Eq;tXdIcWn?UWJXhmt$Y$S z!Cx$%GChp0g`}Xy$wN(e4SMzcKV%IaGxwpktPhp=71WlGSo!-_e!~15HIZ}X@8~DK zih9R>0_7<}lQsC(Q|DO!q5lz_k2W z-fWB`UV_R~Xx@a;|NpCa&^xI>bqt#AxQw_HIp8j0%kY)2*Pu=r`S2etB-uoZ_;?Q)of`WK=8UX-B9*P?c=5_QNLPz&6N zt~^-N*tT;^u))_9+Flpgko;c4yg+D2urX8hws0Zv0O`So9o4pQq&!bsm+Q_bG%IcFe+zkj@25-!oQG}tM8BJ+G>x_=YGBJ`@ZhyP`u{Q z`d}m)*>C*!DgW~MS2jyEvx>C;ol9{Q_4)XOy9EoVw_+4O!Av}fsdx_4aS$``iuYf0 zZz4}%>9>Xfa`83>mf<{Hfpf41Be(%`@I};uJ8%K+!EEeAE%+^JT))?^q7E>Lw_p-M zHGU2zv%VElpwCKB1Im$|*-F$&s!)N~dHZvyaa-IsQ1e?*<94GC(&7DwkjIYkn%N*~ zd_P86-+uOvG1SCqHLk@T8|#tBUf`t#8c`W+MU87iUG09< z6&*<@|7z%^K@0xsj-gWgH!9F9UhK(oP$ww%`ckjQkjI|kr31W-+TadU++C=3Ixr8r zF$?=L$Uke?2n})qwbOr4C!fu1oh%C#D4&-C-H-Z+VyHm%s9(o6^=c`fk*P_PNqULS% z_ScZOfi+X$v9_?m;;0EnQ9C|`n)su836+_vs0~k|HaLx1Fpc}r)n%jV1*mxUpvEmh z9k2@Z{n@kL(SXFT7F4SD%?vO*h}u9m>ZE6II}UmK8X6U_7Avp;tMD+E;$NtbZXScQ z;fGM;SMn;*@4tpZIX2>Q{0y~$D|k0v!$p|Q2SU+Sp;G-6>f70bmG~+?j9+0K$8j0% zzCDchJ?el%sLYIFu%5yM1*No-Pq+oEQ3Lu=?U%3#M^Ovb=Y}bM9+jB}x7pq4wz~)2 zBkn0wob$QlUjYVb*o&7@C)mm#_7AWNkK+pR*N@})KKAf`s$X#R9pSkAJI%hJeiT2% zrwjNagnyt8@YupI^>wIkY9ngh*B1t1p@jy0G;PQp>?2gFx=|B;a4(|ze?tYBLiI-q z!;D2yC(B3m7khoN*O$35w>we%-y{{)>vA z!XK3s%))9F7EsWM3$Yo?Q3Jn3_4lBDMrXZ!5S6jZs1r`2PMDmiPaB9NDl&SK5|L<8 PW@2g4_T11y9{&1d({rJ6p&*k@hp6B~KKRCVi z_&VQkV%VF8A3wk8{4NSt$(S|K|2vh(Cn%?&*SZ_0Q{In>coGxvM~uV^7>AcI9 z*qC6y45Z3u=JKEb3vmjTVKT19SggY^+=WTlit7J1-hv4H^n^A*DSRi9zkYi9!ITYBPy`R*0-Pn?Y4HH-hT(xuM4%1BewlCa+&YA zO->Nie+&~D-(0l~(Y&P>Q>`;msat?r@lw=EDs1~!RLY-1P54Dr|2J&AAJzX8)WE%{ zI6t8Jji65rS8PK#1-+1h3OpMX_-^Df%WU~kWX@(iY9+Pk#3tl2&v4TKuc0!yAJy+5 zYHPbuTl8%l`B%lSRA|6!)@a^ViqlZ-*{FbvxG`5#hFZyLTduX`X5=z$+_aE)Q4>9c zir<5ZH-Kq)A)fqCq6WIp)>oi1uo;!9X6tjPiMOLx-iZuh zx@`MVR0dDkcHbZm3N(!Bco{XJ5Gpm}NYq{>pa#l8^_yqQ#i)TwQ3F??ChA5)nI_a3 zcp3Hn>!^PFkoSD%plvve3VZ^&%%Cm*j(Xv5)XW{^Sp&vf(@`19MNPN}6{i?A;7ZgM zuCe7!sCadlpzpth2d%IT705r?U`zltkzUkR{A}AVq9$+!wbD>-Phtvc>z>6_?8MF3 zjVmydK^C9~)$T{9zW>j8xE1>_A4hRMCKIgym!nd-)0W%tcFJF3296`In1q{yTbG07 zl=H9zeK?L^V=4AY z^=+ukyk+&Hw(Min0=__{e$aX@jr?n`MyXJs2~+?F|B1fAICSGL*pG`@?pbtZa&z$g z;!iw|OlK=7A9oq^73D$Fxq@=%4E_O89=nYLh(lSy_|@6LGg6;T{&hH7shEXrsJ%Xd zItzWM37tXaV17fb#N-55l87@YW}^Bnv-RZ|L3tfc{trRL_1N+*B)R5!pKW*#HIYN8 zK%b%Zs2`QW^S1sHvM4iwN_hsOE2TN80q#J~o4FS?;m1&Cr2%zD{75p)G1MO_-!Km> z%3MXVZ!$=OwqzkbfF-EI*nvy17w^Py4u}T22bHOnsEJl$6naquG@%CUz%AP=UHopXn*o0?r_@%{Xcy>3PBabC56A z6rnO)hE9F|t9Xc^q6)PF59-C8s1@u%t?&cXfZeF`_dP1mU#P&>QJG1|55B(~BPg%J z5L|D|8&C_}imCek>v<@|S8Ruqs0sAr92`O}6GO&{xc8tco$VXt_ zw;n)k<%g(D4xvvo8RkKOM=%!0QGsrt0y!CtFUL&716YJg^)M>X1S%spY<(stPJ4bA zDl=>GL99np?5V72dU}gzldIOdy*f}DeJm{5?cL$2@m9L2a#z=Eb5%7qG}jlRasAgb7;DzHT-Qc#qsJZC Ikv9MO3meiRH*jRmveI(hv|>=E z;l@~IIV_~PwCQUr&6ZXe!Ytc@YPq+lxr*sx))quo-yiR6xy${WbMCqSbI$*q>pS^C zZ@m}I@O2pf4)B-5UuddoW@Y~Wy_Vw5)MsI}vk7ylZ^sPm!gPEO6R;Ok@f@b%1^4`t z^D1(AmYN(3kcHRKF@!U*6jN|D`mi1Y_z-Hqt#}>o#2MIw8t^2l-+-$RqZTlVNf<{^ z^-sZg#?BMLoqTlTY*|h7!|n6wXa3>YjQq{dVd?LUn^=Mo$h%za@o7wCMSsM zKY$sGZ{N5FBd8b0oe5Nwx&Ug$d8n1#gj`n1O)0NMO?W-3|7PT}=eeo>9@M~Zq2feP z{m!7L2Se_`MbrypsK9<6DsVQcU%soCAak^G)JpEgL|lVh*1$~zY(iylJE~tBYHK@C zTl7vU`B%dyG-$x@oFk|dPoM%#<;I*WfLg(PS6}Ap706}xank}CQ4`#Xira!3rxUaB z2u{cTH1f|F7NtR6M$PnZ)XEciTPvH63Y5c5feKNFr~(ye4eIOIfLzw%>_ol)w(}?w z+D@Pjb-zbp8ig-Wfrng&%cu!m#mUpkvh-pQm4RYZhANy@sEOC2R=y5-)i$~3J5U+i z>7MUJ#qoM5XeK96GyNE~H+`r9qNqT>xcWG1fOy{4fa$0S<{*!(7`5lOquyVM>US^d zy$47&wou@*wpfGhL%nbqHRI!`7e9A?jmpe0YQm$a367%%^s^t@x*4c?E-Kz4 zRKF6`0>h~DXLasDGZMqLp;EnjvV+-v)C7*8R{9|}<9XDUmC=}mHQ0n3uo{Q31oIh9 z&+AYVegcE&VMyP97lmT{0&he`RVtUF>S4SApTgOA2g>0s`2oK^ZJdg3%&i}9aTsrV&Jc>H3x6-JUgi)EPcGjV` zY&~iLPoh%a=IlUiK^H2{v260M0LN(=3_FB|Lnmh^$^cZT7o<*gw z)3tXai?U;=ln{>6FLnJIXYp8_68C1s6sCyNM+Gs9n-L0;lh1w_=wQ&I|Q9lyOs!`8C1M2$S zsCBO+*M+RrO?-q3{5kTmv#$RO>VjcZ=3&%X8~U6xQ5DKSCA=6FCkwUVW2jrW+V$6> z;+0{X-v3$}I$aU553@Feb>Rw&PBltHyfk${*d(canPGB!yz{Xi- zomfmghcK0_PhosAuWXpv4|s%&|*F#dz0CTnjmC#XCB4461 z{uar_zDGS1!>H@LX=ce7k6OP7Rf%Qj!3SMG5A{&4bmPTHk!@p$hDuR~dQJABGCbhM z-$n)QbmJ$Hs@pl#MuVslkDwBdoHJ$uD&aYpf%l=V+km>&b*>+JhX&VLw;Sk31@f@! zE}V?%n1@TS0&l~^sE6)nRKmkJ`g-yNt1>>+iKn4{YBNy}?Q&FN<;YzNS)&_x50&95 z)X6S82T%!JM-O_)CJM))Di?>EPeGORcH|6}i%P5vRiRq+;!CIm_hOXZ|ATJgE!4d} z>=tyQ66!(Sf}fB#$_7yHZ#Z?;iEl=2un@`7mZ1_VMkQQ{;aG!_xCM29I-JV>)~#WxfElelaS6Le%;oYU3L8VgvFL*dFIT)UDf(O6+S4Mbqe| zq0BB|3|@5otEfOjsNabjsNaVPw~Y0-p#n9b-il^a0w17mMHi}~7cmF>(Xs-CCDqTa z53Eft4OSMl=f-^Enc@#_4wM87{S5hwO3IVhRBYN5477WEABV?|4ir`vt}iKEQ&QC4 uG0`*0_rSmF9~xcX-kCNOkyI0?D6LKYZ{=95^zw}4;$TI<-`<)Y7x52&03*f# delta 2667 zcmYM!e`wTo9LMpuyW0;hx0|=En)}^#>g-|-(wc1*wI)n93z>JLAEe2gmDW;H!}@AJ z%+;XSSc6zZ(y||OIWCx*)eLfSW`)M29}N5>kkw2m!eL_1*WCviw|jhkf8L+>=li{b z@xw81D&+4s{`T=-%6~LdHM9D_|IVk_K>d1Lbo(7?_oZEhS~TH=HV#};;*j% z59bx+<5}J{=>>{0mw{2d7MJ5Zd;tCU2o~XEs10}E0_?#;+>hGuC~DkES3ie3z(t&k z87!*t^U%lsRz-n6i=YP7B9Yl0sFO6I7H)Oz52MC)I-fz!--#Nx7j=*U*FS`O>{Gr{ z0iwpA#1Q-2S=TX*nmFssrlQmpp-vn@o#b}pW6gXi<#ANN8&Tu8A|HF1FOBa-ZTvoJ zodjy!arD$N={kNxO}KA$Fx=P+9*D?lw&%9j?p8TAk~q84gLy&ap7kL_^|pyq$* z97UG4BdCWu=~2j{@I7kbNjG2y70?w-J*^x|6RS`es6}O{(bX#8?)H`t%j^kp? zXSZ^!Lj@d1{nD<*MSA~VpiqM!;BuTqop3%6gxV`HiuYqNK9B5e1E{O}1e@_7-h-EM z0`I(zYrrg`(|XOw($2Vy#FY#6Kbrze-_$-g3foCXE*94g{h zkXWo2^-LT^P8sH?c@>i!$k4_hv(y&Orhg;ANPN4+Jj9tEXtjq6y4 zT6n8#S3g;|*HIe{p;A183j7OHpr^1J&!fhNBI!GhqUx)WF5Bely{P%#FooMF9L2@> zH`ZYpPe?7sP!C%-D$sXOujNOmjEtdPt7E92*3+nm^#Urel11sKe;KOYh6?Cu` z2i4C0wt)iKvNv%qj;RBWp#qpjO}K>G*uNxw!b0Ssw=!o1>dLB6fvv`DjH3d36a(1d z>Rs59L&G)-`eE3Gsow)v58jksD1v$mmY@P?KwUu#DwQ30A8tvs2fpVsn$34dr# PL82%!<4aUk2Yvqmi@xp{ diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index ebce081..2cf712e 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -592,3 +592,9 @@ msgstr "" "Picks moves at random from a limited selection of moves and plays the best " "one. Stronger settings select the best move from a larger selection. Since " "there is no 0 kyu/dan, 3 dan = -2 kyu." + +msgid "download models button" +msgstr "Download Models" + +msgid "models available" +msgstr "{num} available model(s) found" diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index 4747b030ae711bb8a627dfdcbb5804575a4a9b6a..6ceda6c3f52b20782e62b0308b139b6e4943ab83 100644 GIT binary patch delta 2802 zcmYM#eN5F=9LMo5Pl6zi2|_5M@*qCtrY@aiV}>@tHElFPu%L^EgUgJEB1U)1X)>FZ zf*TZ08WpB#byK6#O2t+=nDOD9EUIlhcOoaa{XhX z0^=qiw|q8>3k6t!(O8H{Sb}44J%-{7n1~xt<2&$P+=pZFOVorvqQ>2D?I40^0dY7Q zC!@yCz!2uQJT4e(`EI}pBr{uuTFDwzV6VI1f(o?RxgGWV>!@+PsD&JM{r$+tzU6Bq zLDcvgn85t@hwF&sDLt6t%tn=N9%{w;sFf7E{&lF5KZi=V6*a!i_4lC0e}J0!1S-yV zsByodPaU^iM;Hw~kc*gAv$-eC$QOG{LK=3U;H$?Llqr zLDUwVilP3x@iR9x;h)Y(o>qxdQT>^yfVq5;s}-VFQsUY*uHB4$Y%5<{$Szc(@1f!! zLB%_bsW=o%{qNx-h+gKlL}vyn<2k4bJcwH1GUQ{A@})o?)M08y#d!twmh>PWJK{Wz zdVbJ(4avc7`nb^P4kF!AI0_Xw8Z{sTmDpU=M2p@1VpIj5MpdfWxe=B4Hq^>rL#D7^ z*WZV#;BnXQJHv$nT|y1KiApG#o60yGwO4VdiLy}RX1jJCYN7(v#KovYJxC~PLY;vv zsONW}#&sdj`D~BtID`uPIr6bHu6+gdz%5kfLDX3j#yZENDwKmtcs?pl9%{mss4XmY z?X{?Q>oHF6e+w5{;Z{_jo{OTVO@SdNGB z2~1&`%We(yUyn`1eu(v^G z18HW5Xb(>0{{q@O)6IUO{r)7jg!cByX8pAPo?^Be`>DGUSd$q@s6LbBD#MN3n1*er zgg!%MIN-d7s?c3zJ1sja(4ULUVUHlk!Ja|I+l1PRcGMy4boO8v?fs}qedyyt51zzP zcmY+q%kKVf&fx68AxuJTSr#hr1E@etUH{{#(_V!X!Rqlo+=)6XCvgt`f)vqw|U9?Yd2A)TD%R(tP z3HdC83uT&zD&H6P6Rl<)-_-oXPE}~BTT@1&$?3)tGMJ2in zRpAvQZT5dP7g5}(L`}FJ^*}Rff>uz3hZebTjlT9@4MUC%6ZNV{AMFx-; z#fDJteH15fDUR1k%=4C4H$7kFU7KE0+gRx@i2OJ-$y58Rx4O36!!1u`bzOQzLw$X% z*B=`DQE<%2jq=9ws_OEJ>PmlKd~sszL;sFnJ~G}Pm;G31TC=yIrX~Hqk%3rK>vGc9 O)HZlM{>tf_L;eAb04Cf3 delta 2668 zcmYM#e@sTE`Eb~ zc-Hm*=A1$f&vLVq0gBMizz|-Gw_*;iMjy6fA-1C?+=er8FBae+YQj%Y<3?S347Gqu zI1N(>s_{9P%KTQ&1$`Do4G1HdSp>C`22|iCcYgzF+$Lua>iO-canGX`GT{0TBZs}m zDUl#*{3r&P-+pu*7f}yRIx}dfbcLuD2T?1jK@MBNNhM!{O1KL({t@J`U7R$&4>j>y zs5mjyxG&IC$7$Db0rkM&sK8ltDsVAs+-%ogjO1vyp;odAGqD9Z?0!y~U@NMEJ5l5I zptiOjwM9d@)L%C~rU6eiwQmZb;FQ56WIDpc=mLM6Tiwekm$M{TR? ze;QT6y{`W?R2*-R3uQ8b%JevDZ@xlJ5Jv_2#kD6<6QuIACd@}ASb}s}7`5kjqMmO= zjcZ0d*XHhbBXK=@oC^-yle}TCqaJt{mGLm@!7rVsP?Z@&C432$;3R6oEcQcNSAc4l zq2kR$ja!UbU<2y?v-PgyAtZ)vN0s{J!~nAcs05CnR{Ak+#_wFamYe$JjA9!;j2rQL zti&+0-Gm!a3GZ_4UaZphf0T=ivM8W4eaGLX1%3m zAJQHuqe`@!W|{p=yQ`cnp}pcp{^Oy2titRdK1JP?Kxr_UPzaS^EzZZ4L6)zK9^-~G z>~$VQl_-X6qn&s6|3v1njM>TWem*K-9cn99pI4baERG@!RZ~62&{3c)tF2p+2JJO9e^O4RIZo`hrOiz) z*em5?IXA*shfiPxhfx79qgEK4m&|w(YT^j0v<;~Kdy(C zW>f!6eg9QlOyfp1>N~w16QxWJuqdhm>rh+NgIdwESc7k32A)MFG>+-`JF2piuAR<) zD!v~zUlIEC{a0|I3BssA%Te#dJ*X|{K<(M1ScNa3RyvH@+aE9me?miUvkBi7k0q#JRz7bWCR^&slZq(=d3f_f>t72=j bMt!lRdB;*>zCd$ftZPoQFLrLhbE*FU;h6J7 diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 6dd4864..d97391f 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -594,3 +594,11 @@ msgstr "" msgid "extra analysis" msgstr "Realizar análisis adicional a {visits} visitas" + +#. TODO +msgid "models available" +msgstr "{num} available model(s) found" + +#. TODO +msgid "download models button" +msgstr "Download Models" diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index 3e56b1cd8d3eca5a4f8885d2fa8b924457d28878..d5c73b35430e840e625659be1bec133961fb4c35 100644 GIT binary patch delta 2801 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 SUvS&hX#3n+UvzkWLEL}#eDf0k diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 33d38be..282b0a2 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -633,3 +633,11 @@ msgstr "" "Plus kyu_rank (-3~18) est bas, plus l'échantillon sera large et le niveau de jeu élevé. \n" "Une valeur positive équivaudra à un niveau en kyu, 0 à 1er dan, -1 à 2e dan, etc. \n" "(Niveaux estimés sur OGS avec le réseau neuronal utilisé PAR DÉFAUT)" + +#. TODO +msgid "models available" +msgstr "{num} available model(s) found" + +#. TODO +msgid "download models button" +msgstr "Download Models" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index 04acd92276b4860ba76d5f4365e21b1f3ebaef64..e564fc03beb6e6e2a74c2b5a9e7f379d5a54bec7 100644 GIT binary patch delta 2798 zcmYM#4@{L+7{~F0TvQOafT*Ytmp_WAAxasffmCP&ZU(X#;_})BqTpT-A&KE#Sx&=g zU~aY2a-$8JE$lAKie)8htwtkj)+*dwSj${lYO^ux`@8p4?)84&^PclQ=Q+E~}Ue^*DSWlU|<|HgB>nRXKTta~t(_EAj04=@hD#A!Hzv3LocIBEN% zXN1P3AdmbehZ_Ybz!)sY*;s?o*oqF^iL-DQYW(v!507CYevF#%JJh&~wjD+gEg%jf zF&#C2DTXt@DdvW;ro;}o56R4ILan4871(Q^ccTLBvG$?fe-Slq0JV^}Z2t&yna}wN zCWsn;5fhl-{AoL)cuOzNwPvA8cPnbeC8(8D+x~}9CEtNccrR-Fv$nq%n;*Xu|8(DBf0y=cD=;paQPuhg?lLY9%$c-E7-k$Yu8PqlFwnB|3zP zKa7euit};8N&RPX6Gks{n_1RORK|Iz3KXGMcrS99N`4f`gE~xIs5sA{zLI|AGQ-wU z)cfbGKOs4o%YJTjy2D6!Do#ZOjzJB`L?w0$YNEUB^J-KD9zs>B%lZ^5@dK!pzkp0( z25kRHR0Th>{r)j-6lfeZ@G>f)DLhoh(@=XAhni?1YFw^u7o#RBLrq+bO4NgdGM%V1 z(1UvaAZpxUhiyLJ9qhi)i1-qW)CLWYKbA z5vsifb$WN8R`4`3hdF{u@DwWHPf=U)m3ba&7xI+b%&>qTFw9Hro!b zZMUQLbT_JWFCkSouOa8ge1Zym4s~cRpbqI()c6QapvKQcieZ-7_D0lJx1hG(|0*|B z*}RWb*L;uqJSOpGoW3MXohf#rVpeD>%8rsw4sCJ>X9JP=dl`XNZKm{y79l~|?c^T^TS0D%4G@`a>7m|~C1+{f!7=sh2xPPFw z_%Dpq_n(jx+S6pzo@Aj0it4g z0%aJ96&U>gzm^;AiO&ugMD5KG-i{+!j3ze}_)aXPS&312*gAkpB!F7+2&!UdtY@*7 z_P3}+@|RP8-4t;n*P;Thw^pM9J&5{DTd@!Kp(>HOBD9h`RR0~Q@ztmb)}t1(6Sv_( zG{s(bQ|Dui-Ue5*ucIzd7WIx}w#WCVx5?-B@W@lw)aKgSzJ0sT8*n(^o)Q~;;O=lY xHo3Pp)dfz*Uzy{)``_{FgX06ovU?r#x?TT`3dLE}mhGzdwR=5*{G9t8{{Vnv8!-R? delta 2667 zcmYM#e@si`ZekC@YD7i|sv_VEQWFyOh(7D>w+GKM(qaQ2^ zr@0ZEwOY)AKh$!UWujZtm6%Ypm`%9})9^E#gWZ^j-(w2?h^cth z)sH!+k;}7`+5P|vFqwvhcrUKTBzy(~xD7-2GHSv`yboJ(9(JN8Jd0}A=gLvk0w!=4 z#xbbcCt*DETMiG@SuUzU2@;vDL9Jv1YT!!u{&`fp9nL+d{`*nw-bF2>-PM1NT=pfm zSb(VZeVE4lcEwfPM0K2UCQ?x9LZ}tzqE@mBxoi_RrF<(Y;GL-UuOpYe%}wnOqb5Fz z8YhBkcL6ZAQ)0 zj+uA@)A3R&`DYFr<%PVBiu5jOg#wFxvbgQj_Tj# zJc$f#J*Y!{$>ZT39tKbY54r}oQ2|Y3?6k5hb<9C!pahkna%Uwf@U5to*CAbPx2t~> zmBCh5e*`s-*U5t-=|M&MEoyHrq9zzc4Rphmr%)5b(_0hHK?RtFR9OjX&)1>)KZR5* z8T^9M=mpg;@VDj%)B;AZ6erMYa*yzQ}An<)H`7#;DIG-))$**bk@!mr(v1Nsj%73-O=Di6!1$p+1 z|6s$Y38JXOH}2m5g?s>Z2RX1dmuR&$1<0IMf!eZ0OvVGKOnrpf+76tBJs8CAP+Kt& zt7rdz=YjKOlbD1V#r}Y~IGb`Q>TImX%~*{ZpbL}nG^$@OYU0bN2}e-BC)ZG0G3n}; zKjd#oDXwOItK{J^Y(Wj&ha2%KD&o9lz9pzY%1{$mqB2$Md=YCY*P#MA=e+0~K#e!( zjADfb8skCVU8t3uMb%$GwU44wJB~VBiObFQU{<6i*dK_LrJjn51k(PP PA4$kR6o_;eR|Wn97|R2+ diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index fdbdfe6..9a215c3 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -571,3 +571,11 @@ msgstr "모든 후보수를 균일하게 {visits} visits으로 분석합니다." msgid "extra analysis" msgstr "{visits} visits까지 추가적으로 분석하고 있습니다." + +#. TODO +msgid "models available" +msgstr "{num} available model(s) found" + +#. TODO +msgid "download models button" +msgstr "Download Models" diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index cbbdadefa4c65451e905be8b9c8ffb457b8159e8..bf7e5f2258b472c0e4093a53d0162e9faef1b85f 100644 GIT binary patch delta 2807 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 sL: configfile: configfile + model_path: model_path + model_files: model_files + download_progress_box: download_progress_box DescriptionLabel: text: i18n._('katago settings') font_size: DESC_FONT_SIZE * 1.5 @@ -87,6 +90,8 @@ cols: 2 rows: 3 size_hint: 1,3 + rows: 4 + size_hint: 1,4 spacing: CP_SPACING DescriptionLabel: text: i18n._("engine:katago") @@ -97,16 +102,37 @@ hint_text: i18n._("engine:katago:hint") DescriptionLabel: text: i18n._("engine:model") - size_hint: 0.33, 1 - AnchorLayout: - LabelledPathInput: - input_property: "engine/model" - DescriptionLabel: text: i18n._("engine:config") size_hint: 0.33, 1 AnchorLayout: LabelledPathInput: + input_property: "engine/model" input_property: "engine/config" + DescriptionLabel: + text: i18n._("engine:config") + text: i18n._("engine:model") + size_hint: 0.33, 1 + AnchorLayout: + LabelledPathInput: + input_property: "engine/config" + id: model_path + input_property: "engine/model" + on_text: root.check_models() + AnchorLayout: + size_hint: 0.33, 1 + AutoSizedRoundedRectangleButton: + text: i18n._("download models button") + on_press: root.download_models() + size_hint_y: 0.7 + AnchorLayout: + Spinner: + id: model_files + text: '' + on_text: if self.text and self.text != self.values[0]: model_path.text = args[1] + size_hint_y: 0.7 + sync_height_frac: 1.0 + -font_size: self.height * 0.5 + -background_color: [*[c*255/88 for c in BOX_BACKGROUND_COLOR[:3]], 1] # compensate for texture BoxLayout: size_hint: 1,1 orientation: 'horizontal' @@ -177,13 +203,18 @@ LabelledFloatInput: input_property: "engine/wide_root_noise" hint_text: i18n._("engine:wide_root_noise:hint") - AnchorLayout: + BoxLayout: size_hint: 1,1.5 - AutoSizedRoundedRectangleButton: - padding_x: 15 - size_hint: None,0.5 - text: i18n._("update settings") - on_press: root.update_config(True) + BoxLayout: + orientation: 'vertical' + id: download_progress_box + AnchorLayout: + AutoSizedRoundedRectangleButton: + padding_x: 15 + size_hint: None,0.5 + text: i18n._("update settings") + on_press: root.update_config(True) + Widget: # for centering options_grid: options_grid