* Shade estimated territory (#488)
* prune branch, icons
* Tsumego frame (#506)
* straighten quotes
* Bump pillow from 9.0.0 to 9.0.1 (#511)
* Bump pillow from 8.3.2 to 9.0.0 (#500)
* Add option to display higher precision point loss values (#514)
* fix mac build (#516)
* drop 3.6 support
* new katago

Co-authored-by: Miles Crawford <miles@milescrawford.com>
Co-authored-by: kaorahi <38910552+kaorahi@users.noreply.github.com>
Co-authored-by: Hiraoka <khi@users.osdn.me>
Co-authored-by: Zironic <Tony-Liou@users.noreply.github.com>
Co-authored-by: pdeblanc <peter@spaceandgames.com>
Co-authored-by: Dontbtme <66470440+Dontbtme@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2022-03-24 11:41:20 +01:00
1 parent dcc3b6f344
commit 2ffb79afa2
51 files changed
+2016 -271

No files matched your search

+21 -13
View File
@@ -4,11 +4,10 @@ on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
osx_app:
runs-on: macos-10.15
osx_app:
runs-on: macos-11
steps:
- uses: actions/checkout@v2
- name: Set up Python
@@ -32,17 +31,27 @@ jobs:
cmake . -DUSE_BACKEND=OPENCL -DBUILD_DISTRIBUTED=1
make
cp katago ../../katrain/katrain/KataGo/katago-osx
- name: Install platypus
run: |
curl -L --output "platypus.zip" https://github.com/sveinbjornt/Platypus/releases/download/5.3/platypus5.3.zip
unzip "platypus.zip"
gunzip Platypus.app/Contents/Resources/platypus_clt.gz
gunzip Platypus.app/Contents/Resources/ScriptExec.gz
mkdir -p /usr/local/bin
mkdir -p /usr/local/share/platypus
cp Platypus.app/Contents/Resources/platypus_clt /usr/local/bin/platypus
cp Platypus.app/Contents/Resources/ScriptExec /usr/local/share/platypus/ScriptExec
cp -a Platypus.app/Contents/Resources/MainMenu.nib /usr/local/share/platypus/MainMenu.nib
chmod -R 755 /usr/local/share/platypus
- name: Get Kivy dependencies
run: |
cd ..
git clone https://github.com/kivy/kivy-sdk-packager.git
cd kivy-sdk-packager/osx
curl -O -L https://kivy.org/downloads/ci/osx/app/Kivy.dmg
hdiutil attach Kivy.dmg -mountroot .
cp -R Kivy/Kivy.app KaTrain.app
./create-osx-bundle.sh -n "KaTrain" -a "Sander Land" -o "org.katrain.KaTrain" -i "../../katrain/katrain/img/icon.ico"
- name: Install KaTrain pip dependencies
run: |
pushd ../kivy-sdk-packager/osx/KaTrain.app/Contents/Resources/venv/bin
pushd ../kivy-sdk-packager/osx/build/KaTrain.app/Contents/Resources/venv/bin
source activate
popd
python -m pip install .
@@ -50,17 +59,17 @@ jobs:
run: |
export KATRAIN_VERSION=`python -c 'from katrain.core.constants import VERSION;print(VERSION)' `
echo "Setting version to ${KATRAIN_VERSION}"
cd ../kivy-sdk-packager/osx
cd ../kivy-sdk-packager/osx/build
pushd KaTrain.app/Contents/Resources/
ln -s ./venv/bin/KaTrain yourapp
popd
./fix-bundle-metadata.sh KaTrain.app -n KaTrain -v "${KATRAIN_VERSION}" -a "Sander Land" -o "org.katrain.KaTrain" -i "../../katrain/katrain/img/icon.ico"
./cleanup-app.sh KaTrain.app -g 1
./relocate.sh KaTrain.app
../fix-bundle-metadata.sh KaTrain.app -n KaTrain -v "${KATRAIN_VERSION}" -a "Sander Land" -o "org.katrain.KaTrain" -i "../../katrain/katrain/img/icon.ico"
../cleanup-app.sh KaTrain.app
../relocate.sh KaTrain.app
- name: Create dmg
run: |
pushd ../kivy-sdk-packager/osx
./create-osx-dmg.sh KaTrain.app KaTrain
./create-osx-dmg.sh build/KaTrain.app KaTrain
popd
mkdir osx_app
cp ../kivy-sdk-packager/osx/KaTrain.dmg osx_app/
@@ -69,4 +78,3 @@ jobs:
with:
name: KaTrainOSX
path: osx_app
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [3.6, 3.7, 3.8, 3.9]
python-version: [3.7, 3.8, 3.9]
steps:
- uses: actions/checkout@v2
+3 -2
View File
@@ -45,15 +45,16 @@ Many thanks to these additional authors:
* "nimets123" for the timer sound effects and board/stone graphics.
* Jordan Seaward for the stone sound effects.
* "fohristiwhirl" for the Gibo and NGF formats parsing code.
* "kaorahi" for bug fixes and SGF parser improvements.
* "kaorahi" for bug fixes, SGF parser improvements, and tsumego frame code.
* "ajkenny84" for the red-green colourblind theme.
* Lukasz Wierzbowski for the ability to paste urls for sgfs and helping fix alt-gr issues.
* Carton He for contributions to sgf parsing and handling.
* "blamarche" for adding the board coordinates toggle.
* "pdeblanc" for adding the ancient chinese scoring option, fixing a bug in query termination
* "pdeblanc" for adding the ancient chinese scoring option, fixing a bug in query termination, and high precision score display.
* "LiamHz" for adding the 'back to main branch' keyboard shortcut.
* "xiaoyifang" for adding the reset analysis option, feature to save options on the loading screen, and scrolling through variations.
* "electricRGB" for help with adding configurable keyboard shortcuts.
* "milescrawford" for work on restyling the territory estimate.
## Translators
+4 -7
View File
@@ -62,14 +62,11 @@ Run DebugKaTrain.exe, which is released in the .zip file distributable in releas
### libzip compatibility
The most common KataGo issue relates to different libzip versions in the provided executables,
leading to an "Error 127".
Although the provided executables should work on the latest versions of Ubuntu with libzip installed,
various other versions and distros differ in their libzip version.
The most common KataGo issue relates to incompatible library versions, leading to an "Error 127".
* A good alternative is to go [here](https://github.com/lightvector/KataGo) and compile KataGo yourself.
* Installing dependencies mentioned [here](INSTALL.md#LinuxTrouble) may also resolve certain issues with KataGo or the gui.
* First, try `****sudo apt-get install libzip-dev****` to get this library on recent systems.
* Next, try installing all packages mentioned [here](INSTALL.md#LinuxTrouble).
* A final alternative is to go [here](https://github.com/lightvector/KataGo) and compile KataGo yourself.
### Getting more information about errors
+1
View File
@@ -7,6 +7,7 @@ For on related licenses for these binaries and libraries see https://github.com/
- Equalize icon and Thrash Icon: derived from work by bqlqn from www.flaticon.com
- Other Menu icons, Finish, Collaboration, and Flag icons: derived from work by Freepik from www.flaticon.com
- Collapse branch icon: derived from work by Kirill Kazachek from www.flaticon.com
- Prune icon: derived from work by Pixelmeetup from www.flaticon.com
- Reset icon: derived from work by Pixel Perfect from www.flaticon.com
3. The True Type Font DIGITAL-7 version 1.02 by Sizenko Alexander, which is free for non-commercial use.
+18 -8
View File
@@ -38,6 +38,7 @@ KaTrain is a tool for analyzing games and playing go with AI feedback from KataG
<a href="http://translate.google.com/translate?sl=en&tl=de&u=https%3A%2F%2Fgithub.com%2Fsanderland%2Fkatrain%2Fblob%2Fmaster%2FREADME.md"><img alt="German" src="https://github.com/sanderland/katrain/blob/master/katrain/img/flags/flag-de.png" width=50></a>
<a href="http://translate.google.com/translate?sl=en&tl=fr&u=https%3A%2F%2Fgithub.com%2Fsanderland%2Fkatrain%2Fblob%2Fmaster%2FREADME.md"><img alt="French" src="https://github.com/sanderland/katrain/blob/master/katrain/img/flags/flag-fr.png" width=50></a>
<a href="http://translate.google.com/translate?sl=en&tl=ru&u=https%3A%2F%2Fgithub.com%2Fsanderland%2Fkatrain%2Fblob%2Fmaster%2FREADME.md"><img alt="Russian" src="https://github.com/sanderland/katrain/blob/master/katrain/img/flags/flag-ru.png" width=50></a>
<a href="http://translate.google.com/translate?sl=en&tl=tr&u=https%3A%2F%2Fgithub.com%2Fsanderland%2Fkatrain%2Fblob%2Fmaster%2FREADME.md"><img alt="Turkish" src="https://github.com/sanderland/katrain/blob/master/katrain/img/flags/flag-tr.png" width=50></a>
<br/>
<a href="http://translate.google.com/translate?sl=en&tl=zh-CN&u=https%3A%2F%2Fgithub.com%2Fsanderland%2Fkatrain%2Fblob%2Fmaster%2FREADME.md"><img alt="Simplified Chinese" src="https://github.com/sanderland/katrain/blob/master/katrain/img/flags/flag-cn.png" width=50></a>
@@ -111,12 +112,13 @@ This estimate should be reasonably accurate as long as you have not changed the
game from the opening to the endgame without making serious (DDK) blunders. Further discussion can be found
[here](http://github.com/sanderland/katrain/issues/44) and [here](http://github.com/sanderland/katrain/issues/74).
* **Simple Style** Prefers moves that solidify both player's territory, leading to relatively simpler moves.
* Legacy options which were developed earlier include:
* **ScoreLoss** is KataGo analyzing as usual, but
choosing from potential moves depending on the expected score loss, leading to a varied style with mostly small mistakes.
* **Policy** uses the top move from the policy network (it's 'shape sense' without reading).
* **Policy Weighted** picks a random move weighted by the policy, leading to a varied style with mostly small mistakes, and occasional blunders due to a lack of reading.
* **Blinded Policy** picks a number of moves at random and play the best move among them, being effectively 'blind' to part of the board each turn. Calibrated rank is based on the same idea, and recommended over this option.
* Options that are more on the 'fun and experimental' side include:
* Options that are more on the 'fun and experimental' side include:
* Variants of **Blinded Policy**, which use the same basic strategy, but with a twist:
* **Local Style** will consider mostly moves close to the last move.
* **Tenuki Style** will consider mostly moves away from the last move.
@@ -128,7 +130,7 @@ This estimate should be reasonably accurate as long as you have not changed the
The Engine based AIs (KataGo, ScoreLoss, KataJigo) are affected by both the model and choice of visits and maximum time,
while the policy net based AIs are affected by the choice of model file, but work identically with 1 visit.
Further technical details and discussion on these AIs can be found on [this](http://lifein19x19.com/viewtopic.php?f=10&t=17488&sid=b11e42c005bb6f4f48c83771e6a27eff) thread at the life in 19x19 forums.
Further technical details and discussion on some of these AIs can be found on [this](http://lifein19x19.com/viewtopic.php?f=10&t=17488&sid=b11e42c005bb6f4f48c83771e6a27eff) thread at the life in 19x19 forums.
## <a name="analysis"></a> Analysis
@@ -166,7 +168,11 @@ Keyboard shortcuts are shown with **[key]**.
* **[l]**: Play out the game until the end and add as a collapsed branch, to visualize the potential effect of mistakes. This is done in the background, and can be started at several nodes at once when comparing the results at different starting positions.
* **[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.
* **[F2]**: Deeper full game analysis. Analyze the entire game to a higher number of visits.
* **[F3]**: Performance report. Show an overview of performance statistics for both players.
* **[F10]**: Tsumego Frame. After placing a life and death problem in a corner/side, use this to fill up the rest of the board to improve AI's ability in solving life and death problems.
## <a name="keyboard"></a> Keyboard and mouse shortcuts
In addition to shortcuts mentioned above and those shown in the main menu:
@@ -202,12 +208,18 @@ Starting in December 2020, KataGo started [distributed training](https://katagot
This allows people to all help generate self-play games to increase KataGo's strength and train bigger models.
KaTrain 1.8.0+ makes it easy to contribute to distributed training: simply select the option from the main menu, register an account, and click run.
During this mode you can do little more than watch games. Toggling continuous analysis (spacebar) will allow you to switch between manually navigating the current game, and automatically advancing it.
During this mode you can do little more than watch games.
Keep in mind that partial games are not uploaded,
so it is best to plan to keep it running for at least an hour, if not several, for the most effective contribution.
A few keyboard shortcuts have special functions in this mode:
* **[Spacebar]** Switch between manually navigating the current game, and automatically advancing it.
* **[Escape]**: This sends the `quit` command to KataGo, which starts a slow shutdown, finishing partial games but not starting new ones. Only works on v1.11+.
* **[Pause]**: Pauses/resumes contributions via the `pause` and `resume` commands introduced in KataGo v1.11.
## <a name="themes"></a> Themes
See [these instructions](THEMES.md) for how to modify the look of any graphics or colours, and creating or install themes.
@@ -229,13 +241,11 @@ See [these instructions](THEMES.md) for how to modify the look of any graphics o
## <a name="support"></a> Support / Contribute
[![GitHub issues](http://img.shields.io/github/issues/sanderland/katrain)](http://github.com/sanderland/katrain/issues)
[![Contributors](http://img.shields.io/static/v1?label=contributors&message=26&color=dcb424)](CONTRIBUTIONS.md)
[![Github sponsors](http://img.shields.io/static/v1?label=sponsor&message=%E2%9D%A4&logo=GitHub&color=dcb424&link=http://github.com/sponsors/sanderland/)](http://github.com/sponsors/sanderland)
[![Contributors](http://img.shields.io/static/v1?label=contributors&message=<3&color=dcb424)](CONTRIBUTIONS.md)
* Ideas, feedback, and contributions to code or translations are all very welcome.
* For suggestions and planned improvements, see [open issues](http://github.com/sanderland/katrain/issues) on github to check if the functionality is already planned.
* You can contact me on the [Leela Zero & Friends Discord](http://discord.gg/AjTPFpN) (use the #gui channel) to get help, discuss improvements, or simply show your appreciation.
* You can also donate to the project through [Github Sponsors](http://github.com/sponsors/sanderland).
+5 -1
View File
@@ -16,7 +16,7 @@ strings_to_keys = defaultdict(dict)
lang_to_strings = defaultdict(set)
DEFAULT_LANG = "en"
INACTIVE_LANGS = ["es"]
errors = False
po = {}
@@ -24,6 +24,8 @@ pofile = {}
todos = defaultdict(list)
for lang in locales:
if lang in INACTIVE_LANGS:
continue
pofile[lang] = os.path.join(localedir, lang, "LC_MESSAGES", "katrain.po")
po[lang] = polib.pofile(pofile[lang])
for entry in po[lang].translated_entries():
@@ -44,6 +46,8 @@ for lang in locales:
for lang in locales:
if lang in INACTIVE_LANGS:
continue
if lang != DEFAULT_LANG:
for msgid in lang_to_strings[lang]:
if (
Binary file not shown.
Binary file not shown.
+37
View File
@@ -488,6 +488,30 @@ class KaTrainGui(Screen, KaTrainBase):
popup.content.popup = popup
popup.open()
def _do_tsumego_frame(self, ko, margin):
from katrain.core.tsumego_frame import tsumego_frame_from_katrain_game
if not self.game.stones:
return
black_to_play_p = self.next_player_info.player == "B"
node, analysis_region = tsumego_frame_from_katrain_game(
self.game, self.game.komi, black_to_play_p, ko_p=ko, margin=margin
)
self.game.set_current_node(node)
if self.play_mode.mode == MODE_PLAY:
self.play_mode.switch_ui_mode() # go to analysis mode
if analysis_region:
flattened_region = [
analysis_region[0][1],
analysis_region[0][0],
analysis_region[1][1],
analysis_region[1][0],
]
self.game.set_region_of_interest(flattened_region)
node.analyze(self.game.engines[node.next_player])
self.update_state(redraw_board=True)
def play_mistake_sound(self, node):
if self.config("timer/sound") and node.played_sound is None and Theme.MISTAKE_SOUNDS:
node.played_sound = True
@@ -665,9 +689,11 @@ class KaTrainGui(Screen, KaTrainBase):
Theme.KEY_TEACHER_POPUP,
Theme.KEY_AI_POPUP,
Theme.KEY_CONFIG_POPUP,
Theme.KEY_TSUMEGO_FRAME,
Theme.KEY_CONTRIBUTE_POPUP,
]: # switch between popups
popup.dismiss()
return
elif keycode[1] in Theme.KEY_SUBMIT_POPUP:
fn = getattr(popup.content, "on_submit", None)
@@ -676,6 +702,15 @@ class KaTrainGui(Screen, KaTrainBase):
return
else:
return
if self.contributing:
if keycode[1] == Theme.KEY_STOP_CONTRIBUTING:
self.engine.graceful_shutdown()
return
elif keycode[1] in Theme.KEY_PAUSE_CONTRIBUTE:
self.engine.pause()
return
if keycode[1] == Theme.KEY_TOGGLE_CONTINUOUS_ANALYSIS:
self.toggle_continuous_analysis()
elif keycode[1] == Theme.KEY_TOGGLE_COORDINATES:
@@ -717,6 +752,8 @@ class KaTrainGui(Screen, KaTrainBase):
self("undo", "main-branch")
elif keycode[1] == Theme.KEY_DEEPERANALYSIS_POPUP:
self.analysis_controls.dropdown.open_game_analysis_popup()
elif keycode[1] == Theme.KEY_TSUMEGO_FRAME:
self.analysis_controls.dropdown.open_tsumego_frame_popup()
elif keycode[1] == Theme.KEY_REPORT_POPUP:
self.analysis_controls.dropdown.open_report_popup()
elif keycode[1] == "f10" and self.debug_level >= OUTPUT_EXTRA_DEBUG:
+3 -2
View File
@@ -28,7 +28,7 @@
"anim_pv_time": 0.5,
"debug_level": 0,
"lang": "en",
"version": "1.10.0",
"version": "1.11.0",
"load_fast_analysis": false,
"load_sgf_rewind": true
},
@@ -82,6 +82,7 @@
true,
true
],
"extra_precision": false,
"save_analysis": false,
"save_marks": false,
"low_visits": 25,
@@ -231,4 +232,4 @@
}
}
}
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
PROGRAM_NAME = "KaTrain"
VERSION = "1.10.1"
VERSION = "1.11.0"
HOMEPAGE = "https://github.com/sanderland/katrain"
CONFIG_MIN_VERSION = "1.10.0" # keep config files from this version
CONFIG_MIN_VERSION = "1.11.0" # keep config files from this version
ANALYSIS_FORMAT_VERSION = "1.0"
DATA_FOLDER = "~/.katrain"
+26 -1
View File
@@ -3,6 +3,7 @@ import os
import random
import shlex
import shutil
import signal
import subprocess
import threading
import time
@@ -43,7 +44,7 @@ class KataGoContributeEngine(BaseEngine):
self.visits_count = 0
self.start_time = 0
self.server_error = None
self.paused = False
self.save_sgf = self.config.get("savesgf", False)
self.save_path = self.config.get("savepath", "./dist_sgf/")
self.move_speed = self.config.get("movespeed", 2.0)
@@ -136,6 +137,7 @@ class KataGoContributeEngine(BaseEngine):
def queries_remaining(self):
return 1
def start(self):
try:
self.katrain.log(f"Starting Distributed KataGo with {self.command}", OUTPUT_INFO)
@@ -157,6 +159,7 @@ class KataGoContributeEngine(BaseEngine):
OUTPUT_ERROR,
)
return # don't start
self.paused = False
self.stdout_thread = threading.Thread(target=self._read_stdout_thread, daemon=True)
self.stderr_thread = threading.Thread(target=self._read_stderr_thread, daemon=True)
self.stdout_thread.start()
@@ -180,6 +183,8 @@ class KataGoContributeEngine(BaseEngine):
def shutdown(self, finish=False):
process = self.katago_process
if process:
self.katago_process.stdin.write(b"forcequit\n")
self.katago_process.stdin.flush()
self.katago_process = None
process.terminate()
if finish is not None:
@@ -187,6 +192,26 @@ class KataGoContributeEngine(BaseEngine):
if t:
t.join()
def graceful_shutdown(self):
"""respond to esc"""
if self.katago_process:
self.katago_process.stdin.write(b"quit\n")
self.katago_process.stdin.flush()
self.katrain.log("Finishing games in progress and stopping contribution", OUTPUT_KATAGO_STDERR)
def pause(self):
"""respond to pause"""
if self.katago_process:
if not self.paused:
self.katago_process.stdin.write(b"pause\n")
self.katago_process.stdin.flush()
self.katrain.log("Pausing contribution", OUTPUT_KATAGO_STDERR)
else:
self.katago_process.stdin.write(b"resume\n")
self.katago_process.stdin.flush()
self.katrain.log("Resuming contribution", OUTPUT_KATAGO_STDERR)
self.paused = not self.paused
def _read_stderr_thread(self):
while self.katago_process is not None:
try:
+4 -2
View File
@@ -65,7 +65,6 @@ class BaseGame:
if move_tree:
self.root = move_tree
self.external_game = PROGRAM_NAME not in self.root.get_property("AP", "")
self.komi = self.root.komi
handicap = int(self.root.handicap)
num_starting_moves_black = 0
node = self.root
@@ -99,7 +98,6 @@ class BaseGame:
**(game_properties or {}),
}
)
self.komi = self.root.komi
handicap = katrain.config("game/handicap")
if not bypass_config and handicap:
self.root.place_handicap_stones(handicap)
@@ -291,6 +289,10 @@ class BaseGame:
if stop_on_mistake is None:
self.set_current_node(cn)
@property
def komi(self):
return self.root.komi
@property
def board_size(self):
return self.root.board_size
+1 -1
View File
@@ -11,7 +11,7 @@ from katrain.gui.theme import Theme
class Lang(Observable):
observers = []
callbacks = []
FONTS = {"jp": "NotoSansJP-Regular.otf"}
FONTS = {"jp": "NotoSansJP-Regular.otf", "tr": "NotoSans-Regular.ttf"}
def __init__(self, lang):
super(Lang, self).__init__()
+1 -1
View File
@@ -14,7 +14,7 @@ class ParseError(Exception):
class Move:
GTP_COORD = list("ABCDEFGHJKLMNOPQRSTUVWXYZ") + [
xa + c for xa in "AB" for c in "ABCDEFGHJKLMNOPQRSTUVWXYZ"
xa + c for xa in "ABCDEFGH" for c in "ABCDEFGHJKLMNOPQRSTUVWXYZ"
] # board size 52+ support
PLAYERS = "BW"
SGF_COORD = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ".lower()) + list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") # sgf goes to 52
+289
View File
@@ -0,0 +1,289 @@
from katrain.core.game_node import GameNode
from katrain.core.sgf_parser import Move
# tsumego frame ported from lizgoban by kaorahi
# note: coords = (j, i) in katrain
near_to_edge = 2
offence_to_win = 5
BLACK = "B"
WHITE = "W"
def tsumego_frame_from_katrain_game(game, komi, black_to_play_p, ko_p, margin):
current_node = game.current_node
bw_board = [[game.chains[c][0].player if c >= 0 else "-" for c in line] for line in game.board]
isize, jsize = ij_sizes(bw_board)
blacks, whites, analysis_region = tsumego_frame(bw_board, komi, black_to_play_p, ko_p, margin)
sgf_blacks = katrain_sgf_from_ijs(blacks, isize, jsize, "B")
sgf_whites = katrain_sgf_from_ijs(whites, isize, jsize, "W")
played_node = GameNode(parent=current_node, properties={"AB": sgf_blacks, "AW": sgf_whites}) # this inserts
katrain_region = analysis_region and (analysis_region[1], analysis_region[0])
return (played_node, katrain_region)
def katrain_sgf_from_ijs(ijs, isize, jsize, player):
return [Move((j, i)).sgf((jsize, isize)) for i, j in ijs]
def tsumego_frame(bw_board, komi, black_to_play_p, ko_p, margin):
stones = stones_from_bw_board(bw_board)
filled_stones = tsumego_frame_stones(stones, komi, black_to_play_p, ko_p, margin)
region_pos = pick_all(filled_stones, "tsumego_frame_region_mark")
bw = pick_all(filled_stones, "tsumego_frame")
blacks = [(i, j) for i, j, black in bw if black]
whites = [(i, j) for i, j, black in bw if not black]
return (blacks, whites, get_analysis_region(region_pos))
def pick_all(stones, key):
return [[i, j, s.get("black")] for i, row in enumerate(stones) for j, s in enumerate(row) if s.get(key)]
def get_analysis_region(region_pos):
if len(region_pos) == 0:
return None
ai, aj, dummy = tuple(zip(*region_pos))
ri = (min(ai), max(ai))
rj = (min(aj), max(aj))
return ri[0] < ri[1] and rj[0] < rj[1] and (ri, rj)
def tsumego_frame_stones(stones, komi, black_to_play_p, ko_p, margin):
sizes = ij_sizes(stones)
isize, jsize = sizes
ijs = [
{"i": i, "j": j, "black": h.get("black")}
for i, row in enumerate(stones)
for j, h in enumerate(row)
if h.get("stone")
]
if len(ijs) == 0:
return []
# find range of problem
top = min_by(ijs, "i", +1)
left = min_by(ijs, "j", +1)
bottom = min_by(ijs, "i", -1)
right = min_by(ijs, "j", -1)
imin = snap0(top["i"])
jmin = snap0(left["j"])
imax = snapS(bottom["i"], isize)
jmax = snapS(right["j"], jsize)
# flip/rotate for standard position
# don't mix flip and swap (FF = SS = identity, but SFSF != identity)
flip_spec = (
[False, False, True] if imin < jmin else [need_flip_p(imin, imax, isize), need_flip_p(jmin, jmax, jsize), False]
)
if True in flip_spec:
flipped = flip_stones(stones, flip_spec)
filled = tsumego_frame_stones(flipped, komi, black_to_play_p, ko_p, margin)
return flip_stones(filled, flip_spec)
# put outside stones
i0 = imin - margin
i1 = imax + margin
j0 = jmin - margin
j1 = jmax + margin
frame_range = [i0, i1, j0, j1]
black_to_attack_p = guess_black_to_attack([top, bottom, left, right], sizes)
put_border(stones, sizes, frame_range, black_to_attack_p)
put_outside(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, komi)
put_ko_threat(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, ko_p)
return stones
# detect corner/edge/center problems
# (avoid putting border stones on the first lines)
def snap(k, to):
return to if abs(k - to) <= near_to_edge else k
def snap0(k):
return snap(k, 0)
def snapS(k, size):
return snap(k, size - 1)
def min_by(ary, key, sign):
by = [sign * z[key] for z in ary]
return ary[by.index(min(by))]
def need_flip_p(kmin, kmax, size):
return kmin < size - kmax - 1
def guess_black_to_attack(extrema, sizes):
return sum([sign_of_color(z) * height2(z, sizes) for z in extrema]) > 0
def sign_of_color(z):
return 1 if z["black"] else -1
def height2(z, sizes):
isize, jsize = sizes
return height(z["i"], isize) + height(z["j"], jsize)
def height(k, size):
return size - abs(k - (size - 1) / 2)
######################################
# sub
def put_border(stones, sizes, frame_range, is_black):
i0, i1, j0, j1 = frame_range
put_twin(stones, sizes, i0, i1, j0, j1, is_black, False)
put_twin(stones, sizes, j0, j1, i0, i1, is_black, True)
def put_twin(stones, sizes, beg, end, at0, at1, is_black, reverse_p):
for at in (at0, at1):
for k in range(beg, end + 1):
i, j = (at, k) if reverse_p else (k, at)
put_stone(stones, sizes, i, j, is_black, False, True)
def put_outside(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, komi):
isize, jsize = sizes
count = 0
offense_komi = (+1 if black_to_attack_p else -1) * komi
defense_area = (isize * jsize - offense_komi - offence_to_win) / 2
for i in range(isize):
for j in range(jsize):
if inside_p(i, j, frame_range):
continue
count += 1
black_p = xor(black_to_attack_p, (count <= defense_area))
empty_p = (i + j) % 2 == 0 and abs(count - defense_area) > isize
put_stone(stones, sizes, i, j, black_p, empty_p)
# standard position:
# ? = problem, X = offense, O = defense
# OOOOOOOOOOOOO
# OOOOOOOOOOOOO
# OOOOOOOOOOOOO
# XXXXXXXXXXXXX
# XXXXXXXXXXXXX
# XXXX.........
# XXXX.XXXXXXXX
# XXXX.X???????
# XXXX.X???????
# (pattern, top_p, left_p)
offense_ko_threat = (
"""
....OOOX.
.....XXXX
""",
True,
False,
)
defense_ko_threat = (
"""
..
..
X.
XO
OO
.O
""",
False,
True,
)
def put_ko_threat(stones, sizes, frame_range, black_to_attack_p, black_to_play_p, ko_p):
isize, jsize = sizes
for_offense_p = xor(ko_p, xor(black_to_attack_p, black_to_play_p))
pattern, top_p, left_p = offense_ko_threat if for_offense_p else defense_ko_threat
aa = [list(line) for line in pattern.splitlines() if len(line) > 0]
height, width = ij_sizes(aa)
for i, row in enumerate(aa):
for j, ch in enumerate(row):
ai = i + (0 if top_p else isize - height)
aj = j + (0 if left_p else jsize - width)
if inside_p(ai, aj, frame_range):
return
black = xor(black_to_attack_p, ch == "O")
empty = ch == "."
put_stone(stones, sizes, ai, aj, black, empty)
def xor(a, b):
return bool(a) != bool(b)
######################################
# util
def flip_stones(stones, flip_spec):
swap_p = flip_spec[2]
sizes = ij_sizes(stones)
isize, jsize = sizes
new_isize, new_jsize = [jsize, isize] if swap_p else [isize, jsize]
new_stones = [[None for z in range(new_jsize)] for row in range(new_isize)]
for i, row in enumerate(stones):
for j, z in enumerate(row):
new_i, new_j = flip_ij((i, j), sizes, flip_spec)
new_stones[new_i][new_j] = z
return new_stones
def put_stone(stones, sizes, i, j, black, empty, tsumego_frame_region_mark=False):
isize, jsize = sizes
if i < 0 or isize <= i or j < 0 or jsize <= j:
return
stones[i][j] = (
{}
if empty
else {
"stone": True,
"tsumego_frame": True,
"black": black,
"tsumego_frame_region_mark": tsumego_frame_region_mark,
}
)
def inside_p(i, j, region):
i0, i1, j0, j1 = region
return i0 <= i and i <= i1 and j0 <= j and j <= j1
def stones_from_bw_board(bw_board):
return [[stone_from_str(s) for s in row] for row in bw_board]
def stone_from_str(s):
black = s == BLACK
white = s == WHITE
return {"stone": True, "black": black} if (black or white) else {}
def ij_sizes(stones):
return (len(stones), len(stones[0]))
def flip_ij(ij, sizes, flip_spec):
i, j = ij
isize, jsize = sizes
flip_i, flip_j, swap_ij = flip_spec
fi = flip1(i, isize, flip_i)
fj = flip1(j, jsize, flip_j)
return (fj, fi) if swap_ij else (fi, fj)
def flip1(k, size, flag):
return size - 1 - k if flag else k
Binary file not shown.
+11 -3
View File
@@ -814,14 +814,19 @@
on_action: root.katrain("selfplay-setup","end")
AnalysisMenuItem:
text: i18n._("analysis:game")
icon: 'analysis.png'
shortcut: ''
icon: 'Deeper all.png'
shortcut: 'F2'
on_action: root.open_game_analysis_popup()
AnalysisMenuItem:
text: i18n._("analysis:report")
icon: 'analysis.png'
shortcut: 'F3'
on_action: root.open_report_popup()
AnalysisMenuItem:
text: i18n._("analysis:tsumegoframe")
icon: 'New-Game.png'
shortcut: 'F10'
on_action: root.open_tsumego_frame_popup()
AnalysisMenuItem:
text: i18n._("analysis:continuous")
icon: 'play.png'
@@ -899,7 +904,7 @@
<LangButton@TransparentIconButton>
size_hint: 1,1
icon_size: self.height * 0.7, self.height * 0.7
icon_size: self.height * 0.6, self.height * 0.6
<MenuLabel@BackgroundMixin+Label>:
@@ -1078,6 +1083,9 @@
LangButton:
icon: 'flags/flag-jp.png'
on_press: app.language = 'jp'
LangButton:
icon: 'flags/flag-tr.png'
on_press: app.language = 'tr'
BoxLayout:
size_hint: 1,None
height: root.item_height
+66 -43
View File
@@ -33,7 +33,7 @@ from katrain.core.game import Move
from katrain.core.lang import i18n
from katrain.core.utils import evaluation_class, format_visits, var_to_grid, json_truncate_arrays
from katrain.gui.kivyutils import draw_circle, draw_text, cached_texture
from katrain.gui.popups import I18NPopup, ReAnalyzeGamePopup, GameReportPopup
from katrain.gui.popups import I18NPopup, ReAnalyzeGamePopup, GameReportPopup, TsumegoFramePopup
from katrain.gui.theme import Theme
@@ -269,7 +269,9 @@ class BadukPanWidget(Widget):
grid_spaces_margin_y = [0.75, 0.75] # bottom, top
x_grid_spaces = board_size_x - 1 + sum(grid_spaces_margin_x)
y_grid_spaces = board_size_y - 1 + sum(grid_spaces_margin_y)
self.grid_size = min(self.width / x_grid_spaces, self.height / y_grid_spaces)
# grid size is rounded to an integer to avoid rounding errors that
# produce tiny gaps between shaded grid squares
self.grid_size = math.floor(min(self.width / x_grid_spaces, self.height / y_grid_spaces) + 0.1)
board_width_with_margins = x_grid_spaces * self.grid_size
board_height_with_margins = y_grid_spaces * self.grid_size
extra_px_margin_x = (self.width - board_width_with_margins) / 2
@@ -348,8 +350,49 @@ class BadukPanWidget(Widget):
with self.canvas:
self.canvas.clear()
# stones
current_node = katrain.game.current_node
# ownership - allow one move out of date for smooth animation,
# drawn first so the board is shaded underneath all other elements.
ownership = current_node.ownership or (current_node.parent and current_node.parent.ownership)
if katrain.analysis_controls.ownership.active and ownership:
if (
current_node.children
and katrain.controls.status_state[1] == STATUS_TEACHING
and current_node.children[-1].auto_undo
and current_node.children[-1].ownership
): # loss
loss_grid = var_to_grid(
[a - b for a, b in zip(current_node.children[-1].ownership, ownership)],
(board_size_x, board_size_y),
)
for y in range(board_size_y - 1, -1, -1):
for x in range(board_size_x):
loss = max(0, (-1 if current_node.children[-1].move.player == "B" else 1) * loss_grid[y][x])
if loss > 0:
Color(*Theme.EVAL_COLORS[self.trainer_config["theme"]][1][:3], loss)
Rectangle(
pos=(
self.gridpos_x[x] - self.grid_size / 2,
self.gridpos_y[y] - self.grid_size / 2,
),
size=(self.grid_size, self.grid_size),
)
else:
ownership_grid = var_to_grid(ownership, (board_size_x, board_size_y))
for y in range(board_size_y - 1, -1, -1):
for x in range(board_size_x):
ix_owner = "B" if ownership_grid[y][x] > 0 else "W"
Color(
*Theme.STONE_COLORS[ix_owner][:3], abs(ownership_grid[y][x]) * Theme.OWNERSHIP_MAX_ALPHA
)
Rectangle(
pos=(self.gridpos_x[x] - self.grid_size / 2, self.gridpos_y[y] - self.grid_size / 2),
size=(self.grid_size, self.grid_size),
)
# stones
all_dots_off = not katrain.analysis_controls.eval.active
has_stone = {}
drawn_stone = {}
@@ -399,40 +442,6 @@ class BadukPanWidget(Widget):
self.draw_stone(2, y, "W", evalcol=evalcol, evalscale=y / (board_size_y - 1))
self.draw_stone(3, y, "W", innercol=Theme.STONE_COLORS["B"], evalcol=evalcol)
# ownership - allow one move out of date for smooth animation
ownership = current_node.ownership or (current_node.parent and current_node.parent.ownership)
if katrain.analysis_controls.ownership.active and ownership:
rsz = self.grid_size * 0.2
if (
current_node.children
and katrain.controls.status_state[1] == STATUS_TEACHING
and current_node.children[-1].auto_undo
and current_node.children[-1].ownership
): # loss
loss_grid = var_to_grid(
[a - b for a, b in zip(current_node.children[-1].ownership, ownership)],
(board_size_x, board_size_y),
)
for y in range(board_size_y - 1, -1, -1):
for x in range(board_size_x):
loss = max(0, (-1 if current_node.children[-1].move.player == "B" else 1) * loss_grid[y][x])
if loss > 0:
Color(*Theme.EVAL_COLORS[self.trainer_config["theme"]][1][:3], loss)
Rectangle(
pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz)
)
else:
ownership_grid = var_to_grid(ownership, (board_size_x, board_size_y))
for y in range(board_size_y - 1, -1, -1):
for x in range(board_size_x):
ix_owner = "B" if ownership_grid[y][x] > 0 else "W"
if ix_owner != (has_stone.get((x, y), -1)):
Color(*Theme.STONE_COLORS[ix_owner][:3], abs(ownership_grid[y][x]))
Rectangle(
pos=(self.gridpos_x[x] - rsz / 2, self.gridpos_y[y] - rsz / 2), size=(rsz, rsz)
)
policy = current_node.policy
if (
not policy
@@ -517,6 +526,16 @@ class BadukPanWidget(Widget):
width=width,
)
def format_loss(self, x: float) -> str:
if self.trainer_config.get("extra_precision"):
if abs(x) < 0.005:
return "0.0"
if 0 < x <= 0.995:
return "+" + f"{x:.2f}"[1:]
elif -0.995 <= x < 0:
return "-" + f"{x:.2f}"[2:]
return f"{x:+.1f}"
def draw_hover_contents(self, *_args):
ghost_alpha = Theme.GHOST_ALPHA
katrain = self.katrain
@@ -609,9 +628,7 @@ class BadukPanWidget(Widget):
+ "}[/size]"
)
keys[TOP_MOVE_DELTA_SCORE] = (
"0.0" if -0.05 < move_dict["pointsLost"] < 0.05 else f"{-move_dict['pointsLost']:+.1f}"
)
keys[TOP_MOVE_DELTA_SCORE] = self.format_loss(-move_dict["pointsLost"])
# def fmt_maybe_missing(arg,sign,digits=1):
# return str(round(sign*arg,digits)) if arg is not None else "N/A"
@@ -620,9 +637,7 @@ class BadukPanWidget(Widget):
keys[TOP_MOVE_WINRATE] = f"{winrate*100:.1f}"
keys[TOP_MOVE_DELTA_WINRATE] = f"{-move_dict['winrateLost']:+.1%}"
keys[TOP_MOVE_VISITS] = format_visits(move_dict["visits"])
# keys[TOP_MOVE_UTILITY] = fmt_maybe_missing( move_dict.get('utility'),player_sign,2)
# keys[TOP_MOVE_UTILITYLCB] = fmt_maybe_missing(move_dict.get('utilityLcb'),player_sign,2)
# keys[TOP_MOVE_SCORE_STDDEV] =fmt_maybe_missing(move_dict.get('scoreStdev'),1)
Color(*Theme.HINT_TEXT_COLOR)
draw_text(
pos=(self.gridpos_x[move.coords[0]], self.gridpos_y[move.coords[1]]),
@@ -798,6 +813,14 @@ class AnalysisDropDown(DropDown):
report_popup.content.popup = report_popup
report_popup.open()
def open_tsumego_frame_popup(self, *_args):
analysis_popup = I18NPopup(
title_key="analysis:tsumegoframe", size=[dp(500), dp(350)], content=TsumegoFramePopup()
)
analysis_popup.content.popup = analysis_popup
analysis_popup.content.katrain = MDApp.get_running_app().gui
analysis_popup.open()
class AnalysisControls(MDBoxLayout):
dropdown = ObjectProperty(None)
+6 -1
View File
@@ -399,7 +399,12 @@ class PlayerSetupBlock(MDBoxLayout):
self.players[bw].update_widget(**params)
def update_player_info(self, bw, player_info): # update sub widget based on gui state change
self.players[bw].update_widget(player_type=player_info.player_type, player_subtype=player_info.player_subtype)
Clock.schedule_once(
lambda _dt: self.players[bw].update_widget(
player_type=player_info.player_type, player_subtype=player_info.player_subtype
),
-1,
)
class PlayerInfo(MDBoxLayout, BackgroundMixin):
+22 -14
View File
@@ -479,22 +479,22 @@ class BaseConfigPopup(QuickConfigGui):
KATAGOS = {
"win": {
"OpenCL v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-windows-x64.zip",
"Eigen AVX2 (Modern CPUs) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigenavx2-windows-x64.zip",
"Eigen (CPU, Non-optimized) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigen-windows-x64.zip",
"OpenCL v1.10.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-windows-x64+bs29.zip",
"OpenCL v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-windows-x64.zip",
"Eigen AVX2 (Modern CPUs) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigenavx2-windows-x64.zip",
"Eigen (CPU, Non-optimized) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigen-windows-x64.zip",
"OpenCL v1.11.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-windows-x64+bs29.zip",
},
"linux": {
"OpenCL v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-linux-x64.zip",
"Eigen AVX2 (Modern CPUs) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigenavx2-linux-x64.zip",
"Eigen (CPU, Non-optimized) v1.10.0": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-eigen-linux-x64.zip",
"OpenCL v1.10.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-opencl-linux-x64+bs29.zip",
"OpenCL v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-linux-x64.zip",
"Eigen AVX2 (Modern CPUs) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigenavx2-linux-x64.zip",
"Eigen (CPU, Non-optimized) v1.11.0": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-eigen-linux-x64.zip",
"OpenCL v1.11.0 (bigger boards)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-opencl-linux-x64+bs29.zip",
},
"just-descriptions": {
"CUDA v1.10.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-cuda11.2-windows-x64.zip",
"CUDA v1.10.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-cuda11.1-linux-x64.zip",
"Cuda/TensorRT v1.10.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-trt8.2-cuda11.2-windows-x64.zip",
"Cuda/TensorRT v1.10.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.10.0/katago-v1.10.0-trt8.2-cuda11.1-linux-x64.zip",
"CUDA v1.11.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-cuda11.2-windows-x64.zip",
"CUDA v1.11.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-cuda11.1-linux-x64.zip",
"Cuda/TensorRT v1.11.0 (Windows)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-trt8.2-cuda11.2-windows-x64.zip",
"Cuda/TensorRT v1.11.0 (Linux)": "https://github.com/lightvector/KataGo/releases/download/v1.11.0/katago-v1.11.0-trt8.2-cuda11.1-linux-x64.zip",
},
}
@@ -810,7 +810,7 @@ class LoadSGFPopup(BaseConfigPopup):
(os.path.abspath(app.gui.config("general/sgf_save")), "Last Save Dir"),
]
self.filesel.path = os.path.abspath(os.path.expanduser(app.gui.config("general/sgf_load")))
self.filesel.select_string = i18n._("Load File")
self.filesel.select_string = "Load File"
def on_submit(self):
self.filesel.button_clicked()
@@ -832,7 +832,7 @@ class SaveSGFPopup(BoxLayout):
self.filesel.ids.list_view.bind(path=set_suggested)
self.filesel.path = os.path.abspath(save_path)
self.filesel.select_string = i18n._("Save File")
self.filesel.select_string = "Save File"
def on_submit(self):
self.filesel.button_clicked()
@@ -846,6 +846,14 @@ class ReAnalyzeGamePopup(BoxLayout):
self.button.trigger_action(duration=0)
class TsumegoFramePopup(BoxLayout):
katrain = ObjectProperty(None)
popup = ObjectProperty(None)
def on_submit(self):
self.button.trigger_action(duration=0)
class GameReportPopup(BoxLayout):
def __init__(self, katrain, **kwargs):
super().__init__(**kwargs)
+5
View File
@@ -119,6 +119,7 @@ class Theme:
GHOST_ALPHA = 0.6
POLICY_ALPHA = 0.5
OWNERSHIP_MAX_ALPHA = 0.7 # max ownership brightness
HINTS_LO_ALPHA = 0.6
HINTS_ALPHA = 0.8
@@ -162,6 +163,7 @@ class Theme:
KEY_AI_POPUP = "f7"
KEY_CONFIG_POPUP = "f8"
KEY_CONTRIBUTE_POPUP = "f9"
KEY_TSUMEGO_FRAME = "f10"
KEY_NEW_GAME = "n"
KEY_SAVE_GAME = "s"
@@ -204,3 +206,6 @@ class Theme:
KEY_PAUSE_TIMER = ["pause", "break", "f15"]
KEY_TOGGLE_COORDINATES = "k"
KEY_ZEN = ["`", "~", "f12"]
KEY_PAUSE_CONTRIBUTE = KEY_PAUSE_TIMER
KEY_STOP_CONTRIBUTING = KEY_STOP_ANALYSIS
+1 -1
View File
@@ -232,7 +232,7 @@ Builder.load_string(
padding_x: 15
height: '40dp'
size_hint_x: None
text: root.select_string
text: i18n._(root.select_string)
on_release: root.button_clicked()
"""
)
+21
View File
@@ -84,6 +84,16 @@ class MoveTreeCanvas(Widget):
self.set_game_node(parent)
self.is_open = False
def prune_branch(self):
selected_node = self.menu_selected_node
if selected_node and selected_node.parent:
node = selected_node
while node.parent is not None:
node.parent.children = [node]
node = node.parent
self.set_game_node(selected_node)
self.is_open = False
def make_selected_node_main_branch(self):
selected_node = self.menu_selected_node or self.scroll_view_widget.current_node
if selected_node and selected_node.parent:
@@ -229,6 +239,10 @@ class MoveTree(ScrollView, BackgroundMixin):
self.move_tree_canvas.delete_selected_node()
self.redraw_tree_trigger()
def prune_branch(self):
self.move_tree_canvas.prune_branch()
self.redraw_tree_trigger()
def make_selected_node_main_branch(self):
self.move_tree_canvas.make_selected_node_main_branch()
self.redraw_tree_trigger()
@@ -306,5 +320,12 @@ Builder.load_string(
-background_color: Theme.LIGHTER_BACKGROUND_COLOR
-height: dp(45)
-width_margin: 1.6
MoveTreeDropdownItem:
text: i18n._("Prune Branch")
icon: 'Prune.png'
on_action: root.katrain.controls.move_tree.prune_branch()
-background_color: Theme.LIGHTER_BACKGROUND_COLOR
-height: dp(45)
-width_margin: 1.6
"""
)
Binary file not shown.
+37 -11
View File
@@ -318,6 +318,10 @@ msgstr "显示最后几手棋的选点"
msgid "show ai dots"
msgstr "AI的显示选点/SGF评价"
#. TODO - point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
#. submit button
msgid "update teacher"
msgstr "更新指导棋设置"
@@ -429,7 +433,7 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"全功能的KataGo AI. 棋力由 `max visits` 和 `模型` 决定.在一般设置里 `引擎` 部分和引擎设置文件. 这里没有选项."
"全功能的KataGo AI. 棋力由 'max visits' 和 '模型' 决定.在一般设置里 '引擎' 部分和引擎设置文件. 这里没有选项."
msgid "ai:jigo"
msgstr "Kata控目"
@@ -447,14 +451,14 @@ msgid "ai:policy"
msgstr "直觉"
msgid "aihelp:policy"
msgstr "按最佳直觉行棋, 没有计算. 棋力 主要由引擎设置里的 `模型` 决定. 布局落点设置 影响布局中随机落点的数量."
msgstr "按最佳直觉行棋, 没有计算. 棋力 主要由引擎设置里的 '模型' 决定. 布局落点设置 影响布局中随机落点的数量."
msgid "ai:p:weighted"
msgstr "直觉权重"
msgid "aihelp:p:weighted"
msgstr ""
"按直觉概率行棋, `weaken_fac` 决定了 较弱选点的多少. 决定了在没有随机性的最佳选点, `lower_bound` 决定了允许的 "
"按直觉概率行棋, 'weaken_fac' 决定了 较弱选点的多少. 决定了在没有随机性的最佳选点, 'lower_bound' 决定了允许的 "
"直觉值的下限."
msgid "ai:p:pick"
@@ -462,31 +466,31 @@ msgstr "盲选直觉"
msgid "aihelp:p:pick"
msgstr ""
"随机选择 `pick_n + pick_frac * <number of legal moves>` 并采用最佳的 一手. "
"当`pick_frac=1` 就是直觉AI. 如果直觉值大于 `pick_override`则采用最佳的一手以避免明显错误."
"随机选择 'pick_n + pick_frac * <number of legal moves>' 并采用最佳的 一手. "
"当'pick_frac=1' 就是直觉AI. 如果直觉值大于 'pick_override'则采用最佳的一手以避免明显错误."
msgid "ai:p:local"
msgstr "局部模式"
msgid "aihelp:p:local"
msgstr ""
"使加权 `pick_n + pick_frac * <number of legal moves>` 接近 最后一手且选出最优. 如果直觉值大于 "
"`pick_override`则采用最佳的一手以避免明显错误."
"使加权 'pick_n + pick_frac * <number of legal moves>' 接近 最后一手且选出最优. 如果直觉值大于 "
"'pick_override'则采用最佳的一手以避免明显错误."
msgid "ai:p:tenuki"
msgstr "脱先模式"
msgid "aihelp:p:tenuki"
msgstr ""
"使加权`pick_n + pick_frac * <number of legal moves>` 偏离 最后一手且选出最优. 如果直觉值 "
"大于`pick_override` 则采用最佳的一手以避免明显错误. 更高的 `stddev` 使其 偏离更多."
"使加权'pick_n + pick_frac * <number of legal moves>' 偏离 最后一手且选出最优. 如果直觉值 "
"大于'pick_override' 则采用最佳的一手以避免明显错误. 更高的 'stddev' 使其 偏离更多."
msgid "ai:p:influence"
msgstr "取势模式"
msgid "aihelp:p:influence"
msgstr ""
"在高于 `threshold` 的点中选出最优. 加大 `line_weight` 以增加对靠近边缘的点的惩罚. 在 'endgame' "
"在高于 'threshold' 的点中选出最优. 加大 'line_weight' 以增加对靠近边缘的点的惩罚. 在 'endgame' "
"部分结束后停止."
msgid "ai:p:territory"
@@ -494,7 +498,7 @@ msgstr "取地模式"
msgid "aihelp:p:territory"
msgstr ""
"在低于 `threshold` 的点中选出最优. 加大 `line_weight` 以增加对靠近中心的点的惩罚. 在 'endgame' "
"在低于 'threshold' 的点中选出最优. 加大 'line_weight' 以增加对靠近中心的点的惩罚. 在 'endgame' "
"部分结束后停止."
msgid "katago settings"
@@ -919,3 +923,25 @@ msgstr "全局"
#. TODO
msgid "ai:antimirror"
msgstr "KataAntiMirror"
#. TODO - on move tree editing, deletes all other branches splitting off from
#. the
#. path UP TO this node
msgid "Prune Branch"
msgstr "Prune Branch"
#. TODO
msgid "aihelp:antimirror"
msgstr "Anti Mirror-go Mode of KataGo."
#. TODO - distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "Distance of wall"
#. TODO - tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "Ko allowed?"
#. TODO - Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "Tsumego Frame"
Binary file not shown.
+46 -20
View File
@@ -449,8 +449,8 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"Spielstärkste KataGo-AI. Spielstärke wird von `max visits` und `model` in "
"den allgemeinen Einstellungen im Bereich `engine` und dem Engine-"
"Spielstärkste KataGo-AI. Spielstärke wird von 'max visits' und 'model' in "
"den allgemeinen Einstellungen im Bereich 'engine' und dem Engine-"
"Konfigurationsfile bestimmt. Hier gibt es sonst keine Optionen."
msgid "ai:jigo"
@@ -475,8 +475,8 @@ msgstr "Policy"
msgid "aihelp:policy"
msgstr ""
"Wählt den besten Zug vom Policy-Netzwerk ohne Analyse. Die Stärke ist am "
"meisten von der `model` Einstellung in den Engine Einstellungen abhängig. "
"Die `opening_moves` Einstellung bestimmt wie viele Züge der Eröffnung "
"meisten von der 'model' Einstellung in den Engine Einstellungen abhängig. "
"Die 'opening_moves' Einstellung bestimmt wie viele Züge der Eröffnung "
"zufällig sind."
msgid "ai:p:weighted"
@@ -485,9 +485,9 @@ msgstr "Policy Gewichtet"
msgid "aihelp:p:weighted"
msgstr ""
"Wählt den Zug gemäß der Policy-Wahrscheinlichkeit, beeinflusst durch "
"`weaken_fac` wie wahrscheinlich schlechtere Züge gespielt werden. Mit einem "
"kleinen Wert spielt wie die AI `Policy`. `pick_override` legt fest, wann der"
" beste Zug gewählt wird ohne Zufall und `lower_bound` bestimmt die untere "
"'weaken_fac' wie wahrscheinlich schlechtere Züge gespielt werden. Mit einem "
"kleinen Wert spielt wie die AI 'Policy'. 'pick_override' legt fest, wann der"
" beste Zug gewählt wird ohne Zufall und 'lower_bound' bestimmt die untere "
"Grenze des erlaubten Policy-Wertes."
msgid "ai:p:pick"
@@ -495,9 +495,9 @@ msgstr "Blinde Policy"
msgid "aihelp:p:pick"
msgstr ""
"Wählt `pick_n + pick_frac * <number of legal moves>` gewichtete Züge "
"zufällig und spielt den besten. Spielt wie die AI `Policy`, wenn "
"`pick_frac=1`. Spielt besten Zug, wenn Policy-Wert höher als `pick_override`"
"Wählt 'pick_n + pick_frac * <number of legal moves>' gewichtete Züge "
"zufällig und spielt den besten. Spielt wie die AI 'Policy', wenn "
"'pick_frac=1'. Spielt besten Zug, wenn Policy-Wert höher als 'pick_override'"
" ist, um offensichtliche Fehler zu vermeiden."
msgid "ai:p:local"
@@ -505,19 +505,19 @@ msgstr "Lokaler Stil"
msgid "aihelp:p:local"
msgstr ""
"Wählt `pick_n + pick_frac * <number of legal moves>` gewichtete Züge nahe "
"Wählt 'pick_n + pick_frac * <number of legal moves>' gewichtete Züge nahe "
"dem letzten Zug und spielt den besten. Spielt besten Zug, wenn Policy-Wert "
"höher als`pick_override` ist, um offensichtliche Fehler zu vermeiden."
"höher als'pick_override' ist, um offensichtliche Fehler zu vermeiden."
msgid "ai:p:tenuki"
msgstr "Tenuki-Stil"
msgid "aihelp:p:tenuki"
msgstr ""
"Wählt `pick_n + pick_frac * <number of legal moves>` gewichtete Züge fern "
"Wählt 'pick_n + pick_frac * <number of legal moves>' gewichtete Züge fern "
"vom letzten Zug und spielt den besten. Spielt besten Zug, wenn Policy-Wert "
"höher als`pick_override` ist, um offensichtliche Fehler zu vermeiden. Eine "
"höhere `stddev` führt zu weiter entfernten Zügen."
"höher als'pick_override' ist, um offensichtliche Fehler zu vermeiden. Eine "
"höhere 'stddev' führt zu weiter entfernten Zügen."
msgid "ai:p:influence"
msgstr "Einflussstil"
@@ -525,7 +525,7 @@ msgstr "Einflussstil"
msgid "aihelp:p:influence"
msgstr ""
"Wählt Züge oberhalb des Grenzwertes und spielt den Besten. Erhöhe "
"`line_weight`, um Züge nahe der Ecken mehr zu bestrafen. Stoppt die "
"'line_weight', um Züge nahe der Ecken mehr zu bestrafen. Stoppt die "
"Strategie nachdem der 'endgame'-Anteil des Brettes gefüllt ist."
msgid "ai:p:territory"
@@ -534,7 +534,7 @@ msgstr "Gebietsstil"
msgid "aihelp:p:territory"
msgstr ""
"Wählt Züge unterhalb des Grenzwertes und spielt den besten. Erhöhe "
"`line_weight`, um Züge nahe der Mitte mehr zu bestrafen. Stoppt die "
"'line_weight', um Züge nahe der Mitte mehr zu bestrafen. Stoppt die "
"Strategie nachdem der 'endgame'-Anteil des Brettes gefüllt ist."
msgid "aihelp:p:rank"
@@ -606,9 +606,9 @@ msgstr "Kata-Vorgabesteine"
msgid "aihelp:handicap"
msgstr ""
"Optimiertes KataGo für höhere Vorgabe-Spiele. Die Einstellung `pda` "
"entspricht `playoutDoublingAdvantage` in KataGo, aus Sicht von Schwarz. Wenn"
" `automatic` eingestellt ist, wird KaTrain automatischeinen geeigneten Wert "
"Optimiertes KataGo für höhere Vorgabe-Spiele. Die Einstellung 'pda' "
"entspricht 'playoutDoublingAdvantage' in KataGo, aus Sicht von Schwarz. Wenn"
" 'automatic' eingestellt ist, wird KaTrain automatischeinen geeigneten Wert "
"finden."
msgid "estimated strength"
@@ -732,6 +732,10 @@ msgstr "Punktänderung"
msgid "show stats if"
msgstr "Zeige Bewertung wenn mehr als ... Visits"
#. TODO - point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
#. analysis option
msgid "cache analysis to sgf"
msgstr "Cache-Analyse in SGF"
@@ -988,3 +992,25 @@ msgstr "Gesamtes Spiel"
#. TODO
msgid "ai:antimirror"
msgstr "KataAntiMirror"
#. TODO - on move tree editing, deletes all other branches splitting off from
#. the
#. path UP TO this node
msgid "Prune Branch"
msgstr "Prune Branch"
#. TODO
msgid "aihelp:antimirror"
msgstr "Anti Mirror-go Mode of KataGo."
#. TODO - distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "Distance of wall"
#. TODO - tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "Ko allowed?"
#. TODO - Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "Tsumego Frame"
Binary file not shown.
+47 -23
View File
@@ -105,6 +105,10 @@ msgstr "Fast analysis of all moves"
msgid "analysis:game"
msgstr "Deeper full game analysis"
#. Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "Tsumego Frame"
#. View a player performance report
msgid "analysis:report"
msgstr "Performance Report"
@@ -503,6 +507,10 @@ msgstr "Show dots for the last <this many> moves"
msgid "show ai dots"
msgstr "Show dots/SGF comments for AI players"
#. point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
#. analysis option
msgid "cache analysis to sgf"
msgstr "Cache analysis in SGF"
@@ -677,7 +685,7 @@ msgstr "KataGo binary {exe} does not exist, please check general settings."
msgid "Kata exe not found in path"
msgstr ""
"KataGo binary `{exe}` not found in your PATH, check your environment "
"KataGo binary '{exe}' not found in your PATH, check your environment "
"variables or use the full path in general settings instead. If on MacOS, see"
" the manual on how to use brew to install katago first"
@@ -739,8 +747,8 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"Full strength KataGo AI. Strength is affected by `max visits` and `model` "
"in the general settings `engine` section and engine configuration file. No "
"Full strength KataGo AI. Strength is affected by 'max visits' and 'model' "
"in the general settings 'engine' section and engine configuration file. No "
"options are available here."
#. ai which handles handicap games better
@@ -749,9 +757,9 @@ msgstr "KataHandicap"
msgid "aihelp:handicap"
msgstr ""
"KataGo optimized for playing higher handicap games.The `pda` setting "
"corresponds to `playoutDoublingAdvantage` in KataGo, from black's "
"perspective. When `automatic` is set, KaTrain will find a suitable value "
"KataGo optimized for playing higher handicap games.The 'pda' setting "
"corresponds to 'playoutDoublingAdvantage' in KataGo, from black's "
"perspective. When 'automatic' is set, KaTrain will find a suitable value "
"automatically."
msgid "ai:simple"
@@ -766,8 +774,8 @@ msgstr ""
" * opponent_fac), avoid tenuki (more than 5 spaces, importance "
"tenuki_penalty), and avoid attachments (importance attachment_penalty). "
"Weights can be negative to make it complicate the game instead, and wide "
"root noise (in general settings) can be used to increase play according to "
"the style at the cost of strength. "
"root noise (in general settings) can be used to play more according to the "
"style at the cost of strength. "
msgid "ai:jigo"
msgstr "KataJigo"
@@ -775,6 +783,9 @@ msgstr "KataJigo"
msgid "ai:antimirror"
msgstr "KataAntiMirror"
msgid "aihelp:antimirror"
msgstr "Anti Mirror-go Mode of KataGo."
msgid "aihelp:jigo"
msgstr ""
"Will try to win by a set amount of points (default 0.5), without further "
@@ -794,7 +805,7 @@ msgstr "Policy"
msgid "aihelp:policy"
msgstr ""
"Plays the top move from the policy network, without any reading. Strength is"
" mainly affected by `model` in engine settings. The `opening_moves` setting "
" mainly affected by 'model' in engine settings. The 'opening_moves' setting "
"affects how many moves in the opening are more random."
msgid "ai:p:weighted"
@@ -802,10 +813,10 @@ msgstr "Policy Weighted"
msgid "aihelp:p:weighted"
msgstr ""
"Plays moves according to policy probability, with `weaken_fac` influencing "
"Plays moves according to policy probability, with 'weaken_fac' influencing "
"how much more likely weaker moves are played. With a very low value it plays"
" like the `Policy` AI. `pick_override` determines when top move is chosen "
"without randomness, and `lower_bound` determines the lower bound policy "
" like the 'Policy' AI. 'pick_override' determines when top move is chosen "
"without randomness, and 'lower_bound' determines the lower bound policy "
"value that is allowed."
msgid "ai:p:pick"
@@ -813,27 +824,27 @@ msgstr "Blinded Policy"
msgid "aihelp:p:pick"
msgstr ""
"Picks `pick_n + pick_frac * <number of legal moves>` at random and plays the"
" best one. For `pick_frac=1` plays like the `Policy` AI. Plays top move if "
"policy value is above `pick_override` to avoid obvious mistakes."
"Picks 'pick_n + pick_frac * <number of legal moves>' at random and plays the"
" best one. For 'pick_frac=1' plays like the 'Policy' AI. Plays top move if "
"policy value is above 'pick_override' to avoid obvious mistakes."
msgid "ai:p:local"
msgstr "Local Style"
msgid "aihelp:p:local"
msgstr ""
"Picks `pick_n + pick_frac * <number of legal moves>` weighted towards the "
"Picks 'pick_n + pick_frac * <number of legal moves>' weighted towards the "
"last move and plays the best one. Plays top move if policy value is above "
"`pick_override` to avoid obvious mistakes."
"'pick_override' to avoid obvious mistakes."
msgid "ai:p:tenuki"
msgstr "Tenuki Style"
msgid "aihelp:p:tenuki"
msgstr ""
"Picks `pick_n + pick_frac * <number of legal moves>` weighted away from the "
"Picks 'pick_n + pick_frac * <number of legal moves>' weighted away from the "
"last move and plays the best one. Plays top move if policy value is above "
"`pick_override` to avoid obvious mistakes. A higher `stddev` makes it play "
"'pick_override' to avoid obvious mistakes. A higher 'stddev' makes it play "
"further away."
msgid "ai:p:influence"
@@ -841,8 +852,8 @@ msgstr "Influential Style"
msgid "aihelp:p:influence"
msgstr ""
"Picks moves biased above the `threshold` line and plays the best one. "
"Increase `line_weight` to penalize moves near the edge more. Stops strategy "
"Picks moves biased above the 'threshold' line and plays the best one. "
"Increase 'line_weight' to penalize moves near the edge more. Stops strategy "
"after the 'endgame' fraction of the board is filled."
msgid "ai:p:territory"
@@ -850,8 +861,8 @@ msgstr "Territorial Style"
msgid "aihelp:p:territory"
msgstr ""
"Picks moves biased below the `threshold` line and plays the best one. "
"Increase `line_weight` to penalize moves near the center more. Stops "
"Picks moves biased below the 'threshold' line and plays the best one. "
"Increase 'line_weight' to penalize moves near the center more. Stops "
"strategy after the 'endgame' fraction of the board is filled."
msgid "ai:p:rank"
@@ -915,6 +926,11 @@ msgstr "Expand/Collapse"
msgid "Make Main Branch"
msgstr "Make Main Branch"
#. on move tree editing, deletes all other branches splitting off from the
#. path UP TO this node
msgid "Prune Branch"
msgstr "Prune Branch"
#. theme label
msgid "theme"
msgstr "Colour Theme"
@@ -1000,3 +1016,11 @@ msgstr "Target score for Black:"
#. Description for how many moves
msgid "setup position move number"
msgstr "Generate game until move:"
#. distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "Distance of wall"
#. tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "Ko allowed?"
Binary file not shown.
+48 -22
View File
@@ -455,8 +455,8 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"Fuerza máxima de KataGo IA. La fuerza es afectada por el número `máximo "
"visitas` y `modelo` en conf general del `motor` y el archivo de conf del "
"Fuerza máxima de KataGo IA. La fuerza es afectada por el número 'máximo "
"visitas' y 'modelo' en conf general del 'motor' y el archivo de conf del "
"motor. No hay opciones disponibles acá."
msgid "ai:jigo"
@@ -481,7 +481,7 @@ msgstr "Jugadas intuitivas"
msgid "aihelp:policy"
msgstr ""
"Juega la jugada que se considera la más intuitvda sin leer. La fuerza esta "
"dada por el `model` en la conf del motor. El parámetro `opening_moves` "
"dada por el 'model' en la conf del motor. El parámetro 'opening_moves' "
"afecta cuantas jugadas en la apertura son al azar."
msgid "ai:p:weighted"
@@ -490,19 +490,19 @@ msgstr "Parcial"
msgid "aihelp:p:weighted"
msgstr ""
"Hace jugadas deacuerdo a las jugadas más intuitivas y sus probabilidades, "
"con `weaken_fac` influenciando que tan probable es que jugadas debiles sean "
"con 'weaken_fac' influenciando que tan probable es que jugadas debiles sean "
"jugadas. Un valor más pequeño se acerca a jugadas más intuitivas según "
"IA.`pick_override` determina que tan frecuente una la mejor jugada es "
"ecogida sin azar, y `lower_bound` determina el rango bajopermitido."
"IA.'pick_override' determina que tan frecuente una la mejor jugada es "
"ecogida sin azar, y 'lower_bound' determina el rango bajopermitido."
msgid "ai:p:pick"
msgstr "Politica Ciega"
msgid "aihelp:p:pick"
msgstr ""
"Escoge `pick_n + pick_frac * <#jugadas legales>` al azar y juega la mejor.El"
" `pick_frac=1` juega como la politica intuitiva del IA. Juega la mejor "
"jugada si la probabilidad del IA es por encima de `pick_override`. Esto con "
"Escoge 'pick_n + pick_frac * <#jugadas legales>' al azar y juega la mejor.El"
" 'pick_frac=1' juega como la politica intuitiva del IA. Juega la mejor "
"jugada si la probabilidad del IA es por encima de 'pick_override'. Esto con "
"el fin de prevenir errores obvios."
msgid "ai:p:local"
@@ -510,9 +510,9 @@ msgstr "Estilo Local"
msgid "aihelp:p:local"
msgstr ""
"Escoge `pick_n + pick_frac * <#jugadas legales>` con un peso superior a "
"Escoge 'pick_n + pick_frac * <#jugadas legales>' con un peso superior a "
"jugadas alrededor de la última jugada y escoge la mejor. Juega la mejor "
"jugada si el valor de la politica está por encima `pick_override` con el fin"
"jugada si el valor de la politica está por encima 'pick_override' con el fin"
" de prevenir errores obvios."
msgid "ai:p:tenuki"
@@ -520,18 +520,18 @@ msgstr "Estilo Tenuki"
msgid "aihelp:p:tenuki"
msgstr ""
"Escoge `pick_n + pick_frac * <#jugadas legales>` con un peso en contra de la"
"Escoge 'pick_n + pick_frac * <#jugadas legales>' con un peso en contra de la"
" última jugada y escoge la mejor. Juega la mejor jugada si el valor de la "
"politica esta por encima `pick_override` con el fin de prevenir errores "
"obvios. Un `stddev` más grande hace que juegue más lejos."
"politica esta por encima 'pick_override' con el fin de prevenir errores "
"obvios. Un 'stddev' más grande hace que juegue más lejos."
msgid "ai:p:influence"
msgstr "Estilo Influencia"
msgid "aihelp:p:influence"
msgstr ""
"Escoje jugadas preferiendo aquellas por encima de la linea `threshold` y "
"juega la mejor. Incrementar `line_weight` para penalizar más jugadas cerca "
"Escoje jugadas preferiendo aquellas por encima de la linea 'threshold' y "
"juega la mejor. Incrementar 'line_weight' para penalizar más jugadas cerca "
"al borde. Para estrategia cuando la fase 'endgame' del tablero ha llegado."
msgid "ai:p:territory"
@@ -539,8 +539,8 @@ msgstr "Estilo Territorial"
msgid "aihelp:p:territory"
msgstr ""
"Escoje jugadas preferiendo aquellas por debajo de la linea `threshold` y "
"juega la mejor. Incrementar `line_weight` para penalizar más jugadas cerca "
"Escoje jugadas preferiendo aquellas por debajo de la linea 'threshold' y "
"juega la mejor. Incrementar 'line_weight' para penalizar más jugadas cerca "
"al centro. Para estrategia cuando la fase 'endgame' del tablero ha llegado."
msgid "aihelp:p:rank"
@@ -557,7 +557,7 @@ msgstr "Ecualizar análsis de jugadas candidatas a {visits} visitas"
msgid "Kata exe not found in path"
msgstr ""
"El binario de KataGo `{exe}` no se encuentra en la 'PATH', revisar variables"
"El binario de KataGo '{exe}' no se encuentra en la 'PATH', revisar variables"
" ambiente o usar la ruta completa en la conf general. Si estas en MacOS, ve "
"el manual de como usar homebrew para instalar KataGo primero"
@@ -609,9 +609,9 @@ msgstr "KataVentaja"
msgid "aihelp:handicap"
msgstr ""
"KataGo optimizado para jugar con ventaja al oponente. El parámetro `pda` "
"corresponde a `playoutDoublingAdvantage` en KataGo, desde la perspectiva de "
"negro.Cuando `automatic` está establecido, KaTrain encontrará un valor "
"KataGo optimizado para jugar con ventaja al oponente. El parámetro 'pda' "
"corresponde a 'playoutDoublingAdvantage' en KataGo, desde la perspectiva de "
"negro.Cuando 'automatic' está establecido, KaTrain encontrará un valor "
"adecuado automáticamente."
msgid "estimated strength"
@@ -740,6 +740,10 @@ msgstr "Change in score"
msgid "show stats if"
msgstr "Show stats if more than ... visits"
#. TODO - point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
#. TODO - analysis option
msgid "cache analysis to sgf"
msgstr "Cache analysis in SGF"
@@ -1003,3 +1007,25 @@ msgstr "Entire Game"
#. TODO
msgid "ai:antimirror"
msgstr "KataAntiMirror"
#. TODO - on move tree editing, deletes all other branches splitting off from
#. the
#. path UP TO this node
msgid "Prune Branch"
msgstr "Prune Branch"
#. TODO
msgid "aihelp:antimirror"
msgstr "Anti Mirror-go Mode of KataGo."
#. TODO - distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "Distance of wall"
#. TODO - tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "Ko allowed?"
#. TODO - Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "Tsumego Frame"
Binary file not shown.
+23 -3
View File
@@ -495,7 +495,7 @@ msgstr ""
msgid "Kata exe not found"
msgstr ""
"L'exécutable `{exe}` est introuvable. \n"
"L'exécutable '{exe}' est introuvable. \n"
"Veuillez vérifier son chemin d'accès dans les paramètres généraux."
msgid "Starting Kata failed"
@@ -757,6 +757,10 @@ msgstr "Variation du score"
msgid "show stats if"
msgstr "Nombre de visites minimum requis pour afficher les données :"
#. TODO - point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
msgid "cache analysis to sgf"
msgstr "Sauvegarder un cache SGF de l'analyse"
@@ -961,6 +965,22 @@ msgstr "Ce que jouerait KataGo"
msgid "Entire Game"
msgstr "Partie entière"
#. TODO
msgid "ai:antimirror"
msgstr "AntiMirrorGo"
msgstr "Anti-symétrique"
msgid "Prune Branch"
msgstr "Élaguer les autres branches"
msgid "aihelp:antimirror"
msgstr ""
"Mode dans lequel Katago cherche à déjouer la stratégie de Go symétrique \n"
"(en d'autres termes, quand l'adversaire imite systématiquement ses coups)."
msgid "tsumego:walldistance"
msgstr "Distance du mur :"
msgid "tsumego:ko"
msgstr "Permettre les kos"
msgid "analysis:tsumegoframe"
msgstr "Composer un problème"
Binary file not shown.
+46 -23
View File
@@ -459,7 +459,7 @@ msgstr "KataGoの実行ファイル {exe} がありません。一般設定を
msgid "Kata exe not found in path"
msgstr ""
"KataGoの実行ファイル `{exe}` "
"KataGoの実行ファイル '{exe}' "
"がPATH内にありません。環境変数を確認するか、もしくは一般設定でフルパスを記入してください。MacOSの場合は、まずbrewを使ってkatagoをインストールする方法について、マニュアルを参照ください。"
msgid "Kata model not found"
@@ -482,7 +482,7 @@ msgid "strength:dan"
msgstr "段"
msgid "ai:default"
msgstr "KataGo"
msgstr "手加減なし"
msgid "aihelp:default"
msgstr ""
@@ -496,7 +496,7 @@ msgstr "Kata置碁"
msgid "aihelp:handicap"
msgstr ""
"置き石が多い場合向けに最適化されたKataGo. "
"`pda`設定は黒側から見たKataGoの`playoutDoublingAdvantage`に対応します. `automatic`を設定しておけば, "
"'pda'設定は黒側から見たKataGoの'playoutDoublingAdvantage'に対応します. 'automatic'を設定しておけば, "
"適切な値をKaTrainが自動的にみつけます."
msgid "ai:jigo"
@@ -518,52 +518,52 @@ msgstr "第一感"
msgid "aihelp:policy"
msgstr ""
"一手も読まずに第一感での最有力手を打ちます. 強さは主にエンジン設定のモデルしだいです. "
"`opening_moves`は序盤の何手目までをよりランダムにするかの設定です."
"'opening_moves'は序盤の何手目までをよりランダムにするかの設定です."
msgid "ai:p:weighted"
msgstr "第一感(比重)"
msgid "aihelp:p:weighted"
msgstr ""
"第一感での確率にしたがって手を選びます. `weaken_fac`は弱そうな手を選ぶ度合を調整します. これを非常に小さな値にすれば, "
"第一感での確率にしたがって手を選びます. 'weaken_fac'は弱そうな手を選ぶ度合を調整します. これを非常に小さな値にすれば, "
"本来の「第一感」と似たような打ち方になります. なお, "
"最有力手の第一感での確率が`pick_override`より大きい場合はその手が無条件で選ばれます. 逆に, "
"第一感での確率が`lower_bound`より小さい手は決して選ばれません."
"最有力手の第一感での確率が'pick_override'より大きい場合はその手が無条件で選ばれます. 逆に, "
"第一感での確率が'lower_bound'より小さい手は決して選ばれません."
msgid "ai:p:pick"
msgstr "第一感(盲点)"
msgid "aihelp:p:pick"
msgstr ""
"`pick_n + pick_frac * <合法手の個数>`個の手をランダムに選んだ上で, その中での最善手を打ちます. "
"`pick_frac=1`にすれば, 本来の「第一感」と同じような打ち方になります. なお, 明らかなミスを避けるために, "
"最有力手の第一感での確率が`pick_override`より大きい場合は無条件でその手を打ちます."
"'pick_n + pick_frac * <合法手の個数>'個の手をランダムに選んだ上で, その中での最善手を打ちます. "
"'pick_frac=1'にすれば, 本来の「第一感」と同じような打ち方になります. なお, 明らかなミスを避けるために, "
"最有力手の第一感での確率が'pick_override'より大きい場合は無条件でその手を打ちます."
msgid "ai:p:local"
msgstr "おつきあい派"
msgid "aihelp:p:local"
msgstr ""
"直前の着手に近い位置ほど重みをつけて`pick_n + pick_frac * <合法手の個数>`個の手をランダムに選び, その中での最善手を打ちます."
" ただし, 明らかなミスを避けるために, 最有力手の第一感での確率が`pick_override`より大きい場合は無条件でその手を打ちます."
"直前の着手に近い位置ほど重みをつけて'pick_n + pick_frac * <合法手の個数>'個の手をランダムに選び, その中での最善手を打ちます."
" ただし, 明らかなミスを避けるために, 最有力手の第一感での確率が'pick_override'より大きい場合は無条件でその手を打ちます."
msgid "ai:p:tenuki"
msgstr "手抜き派"
msgid "aihelp:p:tenuki"
msgstr ""
"直前の着手から遠い位置ほど重みをつけて`pick_n + pick_frac * <合法手の個数>`個の手をランダムに選び, "
"直前の着手から遠い位置ほど重みをつけて'pick_n + pick_frac * <合法手の個数>'個の手をランダムに選び, "
"その中での最善手を打ちます. ただし, 明らかなミスを避けるために, "
"最有力手の第一感での確率が`pick_override`より大きい場合は無条件でその手を打ちます. "
"`stddev`を大きくするほどより遠くの手を打ちます."
"最有力手の第一感での確率が'pick_override'より大きい場合は無条件でその手を打ちます. "
"'stddev'を大きくするほどより遠くの手を打ちます."
msgid "ai:p:influence"
msgstr "勢力派"
msgid "aihelp:p:influence"
msgstr ""
"`threshold`線より高い(天元寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. "
"`line_weight`を大きくするほど, 盤端に近い手をより避けるようになります. なお, "
"'threshold'線より高い(天元寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. "
"'line_weight'を大きくするほど, 盤端に近い手をより避けるようになります. なお, "
"盤全体のうち'endgame'の割合が埋まったあとにはこの重みづけは適用しません."
msgid "ai:p:territory"
@@ -571,8 +571,8 @@ msgstr "実利派"
msgid "aihelp:p:territory"
msgstr ""
"`threshold`線より低い(盤端寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. "
"`line_weight`を大きくするほど, 天元に近い手をより避けるようになります. なお, "
"'threshold'線より低い(盤端寄りの)手に重みをつけて何個かの手を選び, その中での最善手を打ちます. "
"'line_weight'を大きくするほど, 天元に近い手をより避けるようになります. なお, "
"盤全体のうち'endgame'の割合が埋まったあとにはこの重みづけは適用しません."
msgid "ai:p:rank"
@@ -580,8 +580,8 @@ msgstr "段級位相応"
msgid "aihelp:p:rank"
msgstr ""
"すべての合法手の中からランダムに何個かの候補手を選んで, その中での再有力手を打ちます. "
"強い設定にするほどより多くの候補手の中から再有力手を選ぶようになります. なお, 3段は-2 kyuに対応します(0級/段はないので数字がずれる). "
"すべての合法手の中からランダムに何個かの候補手を選んで, その中での最有力手を打ちます. "
"強い設定にするほどより多くの候補手の中から最有力手を選ぶようになります. なお, 3段は-2 kyuに対応します(0級/段はないので数字がずれる). "
#. in AI settings
msgid "estimated strength"
@@ -726,6 +726,10 @@ msgstr "損失目数"
msgid "show stats if"
msgstr "表示候補の最低探索数"
#. point loss precision options
msgid "show two digits for point loss near zero"
msgstr "損失目数の高精度表示(絶対値1以下の場合)"
#. analysis option
msgid "cache analysis to sgf"
msgstr "分析結果をSGFに保存"
@@ -960,6 +964,25 @@ msgstr "AIの最善手との一致率"
msgid "Entire Game"
msgstr "全局"
#. TODO
msgid "ai:antimirror"
msgstr "KataAntiMirror"
msgstr "Kataマネ碁破り"
#. on move tree editing, deletes all other branches splitting off from
#. the path UP TO this node
msgid "Prune Branch"
msgstr "この枝だけ残して他を削除"
msgid "aihelp:antimirror"
msgstr "KataGoの「マネ碁破りモード」"
#. distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "壁までの距離"
#. tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "劫でもOK"
#. Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "詰碁用の外枠"
Binary file not shown.
+39 -22
View File
@@ -437,7 +437,7 @@ msgstr "KataGo 가중치 {model}이 존재하지 않습니다. 일반 설정을
msgid "Kata exe not found in path"
msgstr ""
"KataGo 실행 파일 `{exe}`이 PATH에 없습니다. 환경 변수를 확인해 보시거나, 혹은 일반 설정에서 실행 파일의 절대경로를 "
"KataGo 실행 파일 '{exe}'이 PATH에 없습니다. 환경 변수를 확인해 보시거나, 혹은 일반 설정에서 실행 파일의 절대경로를 "
"지정해 주십시오. MacOS를 사용하고 계시다면, 어떻게 brew를 이용해 KataGo를 설치하는지 설명서에서 확인하세요."
msgid "Starting Kata failed"
@@ -460,7 +460,7 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"최대 기력의 KataGo입니다. 기력은 일반 설정-엔진의 `max visits`와 `model` 및 엔진 설정 파일에 영향을 받습니다. "
"최대 기력의 KataGo입니다. 기력은 일반 설정-엔진의 'max visits'와 'model' 및 엔진 설정 파일에 영향을 받습니다. "
"별도의 설정은 없습니다."
msgid "ai:jigo"
@@ -480,16 +480,16 @@ msgstr "정책망"
msgid "aihelp:policy"
msgstr ""
"수읽기를 하지 않고 정책망에서 가장 높은 확률의 수를 둡니다. 엔진 설정의 `model`이 기력에 영향을 줍니다. "
"`opening_moves` 설정에 따라 초반에 무작위적으로 두는 수가 늘어납니다."
"수읽기를 하지 않고 정책망에서 가장 높은 확률의 수를 둡니다. 엔진 설정의 'model'이 기력에 영향을 줍니다. "
"'opening_moves' 설정에 따라 초반에 무작위적으로 두는 수가 늘어납니다."
msgid "ai:p:weighted"
msgstr "정책망 확률에 따라"
msgid "aihelp:p:weighted"
msgstr ""
"정책망 확률에 따라 착수합니다. `weaken_fac`은 약한 수를 둘 확률을 증가시키며, 낮은 값일수록 `정책망` 인공지능과 비슷하게 "
"둡니다. `pick_override`는 언제 무작위성 없이 가장 확률이 높은 수를 둘지, `lower_bound`는 정책 확률의 하한값을"
"정책망 확률에 따라 착수합니다. 'weaken_fac'은 약한 수를 둘 확률을 증가시키며, 낮은 값일수록 '정책망' 인공지능과 비슷하게 "
"둡니다. 'pick_override'는 언제 무작위성 없이 가장 확률이 높은 수를 둘지, 'lower_bound'는 정책 확률의 하한값을"
" 결정합니다."
msgid "ai:p:pick"
@@ -497,42 +497,42 @@ msgstr "구멍난 정책망"
msgid "aihelp:p:pick"
msgstr ""
"`pick_n + pick_frac * <착수 허용점>`개의 수를 무작위로 뽑아 그 중 최선의 수를 둡니다. `pick_frac=1`일 "
"때는 `정책망` 인공지능과 같이 둡니다. 지나치게 명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 "
"`pick_override`보다 높을 때는 그 수를 둡니다."
"'pick_n + pick_frac * <착수 허용점>'개의 수를 무작위로 뽑아 그 중 최선의 수를 둡니다. 'pick_frac=1'일 "
"때는 '정책망' 인공지능과 같이 둡니다. 지나치게 명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 "
"'pick_override'보다 높을 때는 그 수를 둡니다."
msgid "ai:p:local"
msgstr "손따라 두기"
msgid "aihelp:p:local"
msgstr ""
"마지막으로 둔 수 근처의 `pick_n + pick_frac * <착수 허용점>`개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 "
"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 `pick_override`보다 높을 때는 그 수를 둡니다."
"마지막으로 둔 수 근처의 'pick_n + pick_frac * <착수 허용점>'개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 "
"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 'pick_override'보다 높을 때는 그 수를 둡니다."
msgid "ai:p:tenuki"
msgstr "손빼며 두기"
msgid "aihelp:p:tenuki"
msgstr ""
"마지막으로 둔 수에서 먼 `pick_n + pick_frac * <착수 허용점>`개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 "
"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 `pick_override`보다 높을 때는 그 수를 둡니다. "
"`stddev` 값이 크면 더 멀리 두게 됩니다."
"마지막으로 둔 수에서 먼 'pick_n + pick_frac * <착수 허용점>'개의 수를 뽑아 그 중 최선의 수를 둡니다. 지나치게 "
"명백한 실수를 방지하기 위해 정책값이 가장 높은 수의 정책값이 'pick_override'보다 높을 때는 그 수를 둡니다. "
"'stddev' 값이 크면 더 멀리 두게 됩니다."
msgid "ai:p:influence"
msgstr "세력지향"
msgid "aihelp:p:influence"
msgstr ""
"`threshold`선 위의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. `line_weight`을 증가시키면 판 가장자리에 있는"
" 수를 더욱 꺼리게 됩니다. 판이 `endgame` 비율만큼 차면 평범하게 둡니다."
"'threshold'선 위의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. 'line_weight'을 증가시키면 판 가장자리에 있는"
" 수를 더욱 꺼리게 됩니다. 판이 'endgame' 비율만큼 차면 평범하게 둡니다."
msgid "ai:p:territory"
msgstr "실리지향"
msgid "aihelp:p:territory"
msgstr ""
"`threshold`선 밑의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. `line_weight`을 증가시키면 바둑판 중앙에 있는"
" 수를 더욱 꺼리게 됩니다. 판이 `endgame` 비율만큼 차면 평범하게 둡니다."
"'threshold'선 밑의 수를 더 많이 뽑은 후 그 중 최선의 수를 둡니다. 'line_weight'을 증가시키면 바둑판 중앙에 있는"
" 수를 더욱 꺼리게 됩니다. 판이 'endgame' 비율만큼 차면 평범하게 둡니다."
msgid "aihelp:p:rank"
msgstr ""
@@ -582,8 +582,8 @@ msgstr "접바둑 KataGo"
msgid "aihelp:handicap"
msgstr ""
"치석이 많은 접바둑에 더 적합한 KataGo입니다. `pda` 설정은 흑 시점에서 KataGo의 "
"`playoutDoublingAdvantage`에 해당합니다. `automatic`으로 설정하면, KaTrain이 알맞는 값을 자동으로 "
"치석이 많은 접바둑에 더 적합한 KataGo입니다. 'pda' 설정은 흑 시점에서 KataGo의 "
"'playoutDoublingAdvantage'에 해당합니다. 'automatic'으로 설정하면, KaTrain이 알맞는 값을 자동으로 "
"설정할 것입니다."
msgid "estimated strength"
@@ -697,6 +697,9 @@ msgstr "집 변동"
msgid "show stats if"
msgstr "... visit 이상일 때만 정보 보이기"
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
#. analysis option
msgid "cache analysis to sgf"
msgstr "분석 결과 SGF 파일에 캐싱"
@@ -899,6 +902,20 @@ msgstr "인공지능 최선수 일치율(%)"
msgid "Entire Game"
msgstr "모두"
#. TODO
msgid "Prune Branch"
msgstr "변화 잘라내기"
msgid "ai:antimirror"
msgstr "KataAntiMirror"
msgstr "흉내바둑 타파"
msgid "aihelp:antimirror"
msgstr "흉내바둑을 타파하는 KataGo 모드입니다."
msgid "tsumego:walldistance"
msgstr "벽까지의 거리"
msgid "tsumego:ko"
msgstr "패로 충분?"
msgid "analysis:tsumegoframe"
msgstr "묘수풀이 틀"
Binary file not shown.
+47 -21
View File
@@ -457,7 +457,7 @@ msgstr ""
msgid "Kata exe not found in path"
msgstr ""
"Исполняемый файл KataGo `{exe}` не найден в PATH, проверьте переменные "
"Исполняемый файл KataGo '{exe}' не найден в PATH, проверьте переменные "
"окружения или используйте полный путь в основных настройках. Для MacOS "
"посмотрите сначала инструкцию по установке katago с использованием brew"
@@ -489,7 +489,7 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"Полная сила ИИ KataGo. Сила зависит от настроек `max visits` и `model` в "
"Полная сила ИИ KataGo. Сила зависит от настроек 'max visits' и 'model' в "
"общих настройках и файле конфигурации."
msgid "ai:jigo"
@@ -514,7 +514,7 @@ msgstr "Политика сети"
msgid "aihelp:policy"
msgstr ""
"Играет лучший ход согласно политике сети, без просчёта вариантов. Сила в "
"основном зависит от `model` в настройках движка. Настройка `opening_moves` "
"основном зависит от 'model' в настройках движка. Настройка 'opening_moves' "
"влияет на то, сколько начальных ходов будут более случайными."
msgid "ai:p:weighted"
@@ -522,10 +522,10 @@ msgstr "Слабая политика"
msgid "aihelp:p:weighted"
msgstr ""
"Делает ходы согласно вероятности политики сети, при этом `weaken_fac` влияет"
"Делает ходы согласно вероятности политики сети, при этом 'weaken_fac' влияет"
" на то, как часто более слабые ходы будут сыграны. Малые значения играют "
"аналогично `Политика сети` ИИ. `pick_override` определяет когда лучший ход "
"будет выбран без случайности, и `lower_bound` определяет нижнюю границу "
"аналогично 'Политика сети' ИИ. 'pick_override' определяет когда лучший ход "
"будет выбран без случайности, и 'lower_bound' определяет нижнюю границу "
"допустимого значения."
msgid "ai:p:pick"
@@ -533,9 +533,9 @@ msgstr "Слепая политика"
msgid "aihelp:p:pick"
msgstr ""
"Выбирает `pick_n + pick_frac * <количество допустимых ходов>` случайных "
"ходов и играет лучший из них. При `pick_frac=1` играет как `Политика сети` "
"ИИ. Играет лучший ход, если значение политики сети выше `pick_override` для "
"Выбирает 'pick_n + pick_frac * <количество допустимых ходов>' случайных "
"ходов и играет лучший из них. При 'pick_frac=1' играет как 'Политика сети' "
"ИИ. Играет лучший ход, если значение политики сети выше 'pick_override' для "
"избежания очевидных ошибок."
msgid "ai:p:local"
@@ -543,27 +543,27 @@ msgstr "Локальный стиль"
msgid "aihelp:p:local"
msgstr ""
"Выбирает `pick_n + pick_frac * <количество допустимых ходов>` ходов в "
"Выбирает 'pick_n + pick_frac * <количество допустимых ходов>' ходов в "
"окрестностях последнего хода и играет лучший из них. Играет лучший ход, если"
" значение политики сети выше `pick_override` для избежания очевидных ошибок."
" значение политики сети выше 'pick_override' для избежания очевидных ошибок."
msgid "ai:p:tenuki"
msgstr "Стиль тэнуки"
msgid "aihelp:p:tenuki"
msgstr ""
"Выбирает `pick_n + pick_frac * <количество допустимых ходов>` ходов вдалеке "
"Выбирает 'pick_n + pick_frac * <количество допустимых ходов>' ходов вдалеке "
"от последнего хода и играет лучший из них. Играет лучший ход, если значение "
"политики сети выше `pick_override` для избежания очевидных ошибок. Более "
"высокое значение `stddev` заставляет ИИ играть более далеко."
"политики сети выше 'pick_override' для избежания очевидных ошибок. Более "
"высокое значение 'stddev' заставляет ИИ играть более далеко."
msgid "ai:p:influence"
msgstr "Влияние"
msgid "aihelp:p:influence"
msgstr ""
"Выбирает ходы с оценкой выше `threshold` и играет лучший из них. "
"Увеличивайте `line_weight` для штрафования ходов, близких к краю доски. "
"Выбирает ходы с оценкой выше 'threshold' и играет лучший из них. "
"Увеличивайте 'line_weight' для штрафования ходов, близких к краю доски. "
"Прекращает такую стратегию после того, как 'endgame' часть доски была "
"заполнена."
@@ -572,8 +572,8 @@ msgstr "Территория"
msgid "aihelp:p:territory"
msgstr ""
"Выбирает ходы с оценкой выше `threshold` и играет лучший из них. "
"Увеличивайте `line_weight` для штрафования ходов, близких к центру доски. "
"Выбирает ходы с оценкой выше 'threshold' и играет лучший из них. "
"Увеличивайте 'line_weight' для штрафования ходов, близких к центру доски. "
"Прекращает такую стратегию после того, как 'endgame' часть доски была "
"заполнена."
@@ -612,9 +612,9 @@ msgstr "KataHandicap"
msgid "aihelp:handicap"
msgstr ""
"KataGo оптимизированный под игры с большой форой. Настройка `pda` "
"соответствует `playoutDoublingAdvantage` в KataGo, с точки зрения чёрных. "
"При установке `automatic`, KaTrain выберет значение автоматически."
"KataGo оптимизированный под игры с большой форой. Настройка 'pda' "
"соответствует 'playoutDoublingAdvantage' в KataGo, с точки зрения чёрных. "
"При установке 'automatic', KaTrain выберет значение автоматически."
msgid "estimated strength"
msgstr "Оценка силы"
@@ -722,6 +722,10 @@ msgstr "Изменение счёта"
msgid "show stats if"
msgstr "Числа только если посещений больше чем"
#. TODO - point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
msgid "cache analysis to sgf"
msgstr "Кэшировать анализ в SGF"
@@ -928,3 +932,25 @@ msgstr "Полная игра"
#. TODO
msgid "ai:antimirror"
msgstr "KataAntiMirror"
#. TODO - on move tree editing, deletes all other branches splitting off from
#. the
#. path UP TO this node
msgid "Prune Branch"
msgstr "Prune Branch"
#. TODO
msgid "aihelp:antimirror"
msgstr "Anti Mirror-go Mode of KataGo."
#. TODO - distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "Distance of wall"
#. TODO - tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "Ko allowed?"
#. TODO - Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "Tsumego Frame"
Binary file not shown.
File diff suppressed because it is too large. Load diff
Binary file not shown.
+40 -17
View File
@@ -428,6 +428,10 @@ msgstr "顯示最後幾手棋的選點"
msgid "show ai dots"
msgstr "顯示AI的選點/SGF評論"
#. TODO - point loss precision options
msgid "show two digits for point loss near zero"
msgstr "Show two digits for point loss near zero"
#. analysis option
msgid "cache analysis to sgf"
msgstr "儲存分析到SGF中"
@@ -542,7 +546,7 @@ msgstr "KataGo執行檔 {exe} 不存在,請檢查一般設定。"
msgid "Kata exe not found in path"
msgstr ""
"在 PATH 中找不到KataGo執行檔 `{exe}`,請檢查環境變數或在一般設定中使用完整路徑代替。若是在 MacOS "
"在 PATH 中找不到KataGo執行檔 '{exe}',請檢查環境變數或在一般設定中使用完整路徑代替。若是在 MacOS "
"上,請先閱讀使用手冊中的如何使用brew安裝KataGo。"
msgid "Kata model not found"
@@ -572,7 +576,7 @@ msgstr "KataGo"
msgid "aihelp:default"
msgstr ""
"最強的KataGo AI。其棋力由在一般設定中 `引擎` 區塊中的 `最大走訪數` 和 `模型` 以及引擎組態文件決定。此處沒有可供調整的選項。"
"最強的KataGo AI。其棋力由在一般設定中 '引擎' 區塊中的 '最大走訪數' 和 '模型' 以及引擎組態文件決定。此處沒有可供調整的選項。"
#. ai which handles handicap games better
msgid "ai:handicap"
@@ -580,8 +584,8 @@ msgstr "Kata讓子棋"
msgid "aihelp:handicap"
msgstr ""
"KataGo 對讓子棋做了最佳化的對局版本。以黑棋的觀點來看,KataGo 中的 `pda` 設定對應到的是 "
"`playoutDoublingAdvantage`。當被設定為 `自動` 時,KaTrain 將會找自動找到適合的值。"
"KataGo 對讓子棋做了最佳化的對局版本。以黑棋的觀點來看,KataGo 中的 'pda' 設定對應到的是 "
"'playoutDoublingAdvantage'。當被設定為 '自動' 時,KaTrain 將會找自動找到適合的值。"
msgid "ai:simple"
msgstr "單純模式"
@@ -609,46 +613,46 @@ msgid "ai:policy"
msgstr "直覺"
msgid "aihelp:policy"
msgstr "按最佳直覺行棋,沒有任何計算。棋力主要由引擎設定中的 `模型` 決定。布局落點設定影響布局中隨機落點的數量。"
msgstr "按最佳直覺行棋,沒有任何計算。棋力主要由引擎設定中的 '模型' 決定。布局落點設定影響布局中隨機落點的數量。"
msgid "ai:p:weighted"
msgstr "直覺權重"
msgid "aihelp:p:weighted"
msgstr ""
"按直覺機率行棋, `weaken_fac` 影響較弱選點的多寡。當機率極低時,它的下棋風格變得很像直覺AI。 `pick_override` "
"決定在選擇最佳選點時的無隨機性;而 `lower_bound` 決定了允許的直覺值的下限。"
"按直覺機率行棋, 'weaken_fac' 影響較弱選點的多寡。當機率極低時,它的下棋風格變得很像直覺AI。 'pick_override' "
"決定在選擇最佳選點時的無隨機性;而 'lower_bound' 決定了允許的直覺值的下限。"
msgid "ai:p:pick"
msgstr "盲選直覺"
msgid "aihelp:p:pick"
msgstr ""
"隨機選擇 `pick_n + pick_frac * <number of legal moves>` 並採用最佳的一手。 當 "
"`pick_frac=1` 時,下棋風格像是直覺AI。 如果直覺值高於 `pick_override`,則採用最佳的一手以避免明顯錯誤。"
"隨機選擇 'pick_n + pick_frac * <number of legal moves>' 並採用最佳的一手。 當 "
"'pick_frac=1' 時,下棋風格像是直覺AI。 如果直覺值高於 'pick_override',則採用最佳的一手以避免明顯錯誤。"
msgid "ai:p:local"
msgstr "局部模式"
msgid "aihelp:p:local"
msgstr ""
"使加權 `pick_n + pick_frac * <number of legal moves>` 接近最後一手並選出最好的一手。如果直覺值大於 "
"`pick_override`則採用最佳的一手以避免明顯錯誤。"
"使加權 'pick_n + pick_frac * <number of legal moves>' 接近最後一手並選出最好的一手。如果直覺值大於 "
"'pick_override'則採用最佳的一手以避免明顯錯誤。"
msgid "ai:p:tenuki"
msgstr "脫先模式"
msgid "aihelp:p:tenuki"
msgstr ""
"使加權 `pick_n + pick_frac * <number of legal moves>` 遠離最後一手並選出最好的一手。如果直覺值大於 "
"`pick_override` 則採用最佳的一手以避免明顯錯誤。更高的 `stddev` 使其偏離更多。"
"使加權 'pick_n + pick_frac * <number of legal moves>' 遠離最後一手並選出最好的一手。如果直覺值大於 "
"'pick_override' 則採用最佳的一手以避免明顯錯誤。更高的 'stddev' 使其偏離更多。"
msgid "ai:p:influence"
msgstr "取勢模式"
msgid "aihelp:p:influence"
msgstr ""
"在偏移值高於 `threshold` 線的點中選出最好的一手。增加 `line_weight` 以加重對靠近邊緣選點的懲罰。在 '終局' "
"在偏移值高於 'threshold' 線的點中選出最好的一手。增加 'line_weight' 以加重對靠近邊緣選點的懲罰。在 '終局' "
"部分結束後停止。"
msgid "ai:p:territory"
@@ -656,7 +660,7 @@ msgstr "取地模式"
msgid "aihelp:p:territory"
msgstr ""
"在偏移值低於 `threshold` 線的點中選出最好的一手。增加 `line_weight` 以加重對靠近中央選點的懲罰。在 '終局' "
"在偏移值低於 'threshold' 線的點中選出最好的一手。增加 'line_weight' 以加重對靠近中央選點的懲罰。在 '終局' "
"部分結束後停止。"
msgid "ai:p:rank"
@@ -942,6 +946,25 @@ msgstr "AI最佳選點重合度 %"
msgid "Entire Game"
msgstr "全局"
#. TODO
msgid "ai:antimirror"
msgstr "KataAntiMirror"
msgstr "Kata反鏡射"
#. on move tree editing, deletes all other branches splitting off from
#. the path UP TO this node
msgid "Prune Branch"
msgstr "修剪分支"
msgid "aihelp:antimirror"
msgstr "KataGo的反鏡射模式。"
#. distance of wall to existing stones
msgid "tsumego:walldistance"
msgstr "邊界距離"
#. tsumego: ko is good enough?
msgid "tsumego:ko"
msgstr "允許打劫?"
#. Menu option for tsumego frame around position
msgid "analysis:tsumegoframe"
msgstr "詰碁框"
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+40 -1
View File
@@ -493,6 +493,12 @@
AnchorLayout:
LabelledCheckBox:
input_property: "trainer/eval_show_ai"
DescriptionLabel:
font_size: sp(Theme.DESC_FONT_SIZE) * 0.8
text: i18n._("show two digits for point loss near zero")
AnchorLayout:
LabelledCheckBox:
input_property: "trainer/extra_precision"
DescriptionLabel:
font_size: sp(Theme.DESC_FONT_SIZE) * 0.8
text: i18n._("cache analysis to sgf")
@@ -837,6 +843,39 @@
root.katrain("analyze-extra", "game", visits=visits.input_value, mistakes_only=mistakes.input_value)
root.popup.dismiss()
<TsumegoFramePopup>:
ko: ko
margin: margin
orientation: 'vertical'
button: button
BoxLayout:
size_hint: 1, 1.5
orientation: 'horizontal'
DescriptionLabel:
text: i18n._('tsumego:walldistance')
AnchorLayout:
LabelledIntInput:
id: margin
text: '4'
BoxLayout:
size_hint: 1, 1.5
orientation: 'horizontal'
DescriptionLabel:
text: i18n._('tsumego:ko')
AnchorLayout:
LabelledCheckBox:
id: ko
AnchorLayout:
size_hint: 1, 1
AutoSizedRoundedRectangleButton:
id: button
padding_x: 15
size_hint: None,0.66
text: i18n._("analysis:tsumegoframe") # re-use string
on_press:
root.katrain("tsumego-frame", ko=ko.input_value, margin=margin.input_value)
root.popup.dismiss()
<LoadSGFPopup>:
fast: fast
rewind: rewind
@@ -929,4 +968,4 @@
alignment: 'left'
BoxLayout:
id: stats
size_hint_y: 10
size_hint_y: 10
+2 -2
View File
@@ -3,10 +3,10 @@ chardet==3.0.4
docutils==0.16
ffpyplayer==4.3.2
idna==2.10
Kivy==2.0.0
Kivy==2.1.0
Kivy-Garden==0.1.4
kivymd==0.104.1
Pillow==9.0.0
Pillow==9.0.1
Pygments==2.7.4
requests==2.25.0
urllib3==1.26.5
+2 -3
View File
@@ -41,17 +41,16 @@ setup(
install_requires=[
"wheel",
"setuptools",
"kivy[full]>=2.0.0",
"kivy[full]>=2.1.0",
"kivymd==0.104.1", # 0.104.2 was breaking MRO
"ffpyplayer",
"importlib_resources ;python_version<'3.7'",
"urllib3",
"pygame;platform_system=='Darwin'", # some mac versions need this for kivy
"screeninfo;platform_system!='Darwin'", # for screen resolution, has problems on macos
"chardet", # for automatic encoding detection
],
dependency_links=["https://kivy.org/downloads/simple/"],
python_requires=">=3.6, <4",
python_requires=">=3.7, <3.10",
entry_points={"console_scripts": ["katrain=katrain.__main__:run_app"]},
classifiers=[
"Development Status :: 5 - Production/Stable",