diff --git a/README.md b/README.md index 0cfde7861..de18d8cd6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # KataGo -KataGo is an implementation of AlphaZero-like training in Go with a lot of modifications and enhancements that greatly improve upon basic self-play learning. Many of these take advantage of game-specific features and training targets, but also a surprising number of them are non-specific and could easily be tried in other games. Due to these enhancements, early training is immensely faster than in other zero-style bots - with only a few strong GPUs for a few days, even a single person should be able to train a neural net from nothing to high amateur dan strength on the full 19x19 board. KataGo's latest run used about 29 GPUs, rather than thousands (like AlphaZero and ELF) first reached superhuman levels on that hardware in perhaps just three to six days, and reached strength similar to ELF in about 14 days. With minor adjustments and another 8 GPUs, at around 40 days it roughly reached or surpassed Leela Zero (but varies by hardware, time, playouts, settings) hopefully making KataGo one of the top open source Go engines available. It is continuing to train and improve further. +As of early/mid 2020, KataGo is one of the strongest open source Go bots available online, and on most common hardware should be moderately stronger than Leela Zero in most positions if tuned for performance. KataGo was trained using AlphaZero-like training with many modifications and enhancements that greatly improve the self-play learning, starting entirely from scratch with no outside data. Some of its enhancements take advantage of game-specific features and training targets, but also many of the techniques are general and could be applied in other games. Due to these enhancements, early training is immensely faster than in other zero-style bots - with only a few strong GPUs for a few days, even a single researcher/enthusiast should be able to train a neural net from nothing to high amateur dan strength on the full 19x19 board. + +KataGo's latest run used about 29 GPUs, rather than thousands (like AlphaZero and ELF), first reached superhuman levels on that hardware in perhaps just three to six days, and reached strength similar to ELF in about 14 days. With minor adjustments and a few more GPUs, starting around 40 days it roughly began to match or surpass Leela Zero in some tests with different configurations, time controls, and hardware. And finally after about four months of training time, the current run may be wrapping up fairly soon, but we hope to be able to continue it or begin another run in the future. Paper about the major new ideas and techniques used in KataGo: [Accelerating Self-Play Learning in Go (arXiv)](https://arxiv.org/abs/1902.10565). A few further improvements have been found and incorporated into the latest run that are not described in this paper - some post about this might happen eventually. @@ -12,58 +14,66 @@ Many thanks to [Jane Street](https://www.janestreet.com/) for providing the comp KataGo's engine also aims to be a useful tool for Go players and developers, and supports the following features: * Estimates territory and score, rather than only "winrate", helping analyze kyu and amateur dan games besides only on moves that actually would swing the game outcome at pro/superhuman-levels of play. * Cares about maximizing score, enabling strong play in handicap games when far behind, and reducing slack play in the endgame when winning. -* Supports board sizes ranging from 7x7 to 19x19, and alternative values of komi (including integer values). +* Supports alternative values of komi (including integer values) and good high-handicap game play. +* Supports board sizes ranging from 7x7 to 19x19, and as of May 2020 may be the strongest open-source bot on both 9x9 and 13x13 as well. * Supports a wide variety of [rules](https://lightvector.github.io/KataGo/rules.html), including rules that match Japanese rules in almost all common cases, and ancient stone-counting-like rules. * For tool/back-end developers - supports a JSON-based analysis engine that can batch multiple-game evaluations efficiently and be easier to use than GTP. ## Current Status and History -KataGo is on its third major official run! As of the end of March 2020 after training for about 2.5 months, it appears to be as strong or stronger than Leela Zero's final official 40-block nets at moderate numbers of playouts (thousands to low tens of thousands), including with only its 20-block net, except for one notable opening pattern that Leela Zero still handles much better. Earlier, it also surpassed the prior 19-day official run from June 2019 in only about 12-14 days, and at this point is almost 400 Elo stronger. This is due to various training improvements which were not present in prior runs. In addition to reaching stronger faster, this third run adds support for Japanese rules, stronger handicap play, and greatly more accurate score estimation. +KataGo is on its third major official run! As of May 2020 after about 4 months of actual training time, it appears to be overall moderately stronger than Leela Zero's final official 40-block nets at moderate numbers of playouts (thousands to low tens of thousands), including with only its 20-block net, except for one notable opening pattern that Leela Zero still handles much better. Earlier, it also surpassed the prior 19-day official run from June 2019 in only about 12-14 days, and at this point is more than 700 Elo stronger. This is due to various training improvements which were not present in prior runs. In addition to reaching stronger faster, this third run adds support for Japanese rules, stronger handicap play, and more accurate score estimation. Strong networks are available for download! See the [releases page](https://github.com/lightvector/KataGo/releases) for the latest release and these neural nets. A history of older and alternative neural nets can be found [here](https://d3dndmfyhecmj0.cloudfront.net/g170/index.html), including a few *very* strong smaller nets. These include a fast 10-block network that nearly matches the strength of many earlier 15 block nets, including KataGo best 15-block net from last year and Leela Zero's LZ150. This new run also features a very strong 15-block network that should be approximately the strength of ELFv2, a 20-block network, at least at low thousands of playouts. Hopefully they are useful for users with weaker hardware. -Here is a graph of the improvement so far as of about 80 days: +Here is a graph of the improvement so far as of about 120 days: - +
X axis is days of training, log scale. (note: hardware is about the same but not entirely identical). Y axis is relative Elo rating based on some 1200-visit test matches. The abrupt jump at the end of the June 2019 run is due to a LR drop in that run that the current run, gradually, still has only partially applied.
X axis is days of training, log scale. (note: hardware is about the same but not entirely identical). Y axis is relative Elo rating based on some 1200-visit test matches. The abrupt jump at the end of the June 2019 run is due to a LR drop in that run that the current run applied in a more gradual way.
-Currently the run is using about 47 GPUs and hopes to continue to improve further. (Only 29 GPUs were used to surpass last year's run in the first 14 days. After 14 days increased to 37 GPUs, then after 24 more days increased again to around 47 GPUs) +Currently the run is using about 47 GPUs (40 of which are for self-play data generation). Only 29 GPUs were used to surpass last year's run in the first 14 days. After 14 days this was increased to 37 GPUs, then after 24 more days increased again to the current 47 GPUs. Just for fun, here's a table of the Elo strength of selected versions, based on a few tens of thousands of games between these and other versions in a pool (1200 visits). These are based on fixed search tree size, NOT fixed computation time. Current run: | Neural Net | Note | Approx Days Selfplay | Elo | |-------------|-------|---------------|------| -| g170-b6c96-s175395328-d26788732 | (last selfplay 6 block) | 0.75 | -1176 | -| g170-b10c128-s197428736-d67404019 | (last selfplay 10 block) | 1.75 | -281 | -| g170e-b10c128-s1141046784-d204142634 | (extended training 10 block) | - | 307 | -| g170-b15c192-s497233664-d149638345 | (last selfplay 15 block) | 7.5 | 514 | -| g170e-b15c192-s1305382144-d335919935 | (extended training 15 block) | - | 875 | -| g170e-b15c192-s1672170752-d466197061 | (extended training 15 block) | - | 933 | -| g170-b20c256x2-s668214784-d222255714 | (20 block) | 15.5 | 955 | -| g170-b20c256x2-s1039565568-d285739972 | (20 block) | 21.5 | 1068 | -| g170-b20c256x2-s1420141824-d350969033 | (20 block) | 27.5 | 1170 | +| g170-b6c96-s175395328-d26788732 | (last selfplay 6 block) | 0.75 | -1184 | +| g170-b10c128-s197428736-d67404019 | (last selfplay 10 block) | 1.75 | -280 | +| g170e-b10c128-s1141046784-d204142634 | (extended training 10 block) | - | 300 | +| g170-b15c192-s497233664-d149638345 | (last selfplay 15 block) | 7.5 | 512 | +| g170e-b15c192-s1305382144-d335919935 | (extended training 15 block) | - | 876 | +| g170e-b15c192-s1672170752-d466197061 | (extended training 15 block) | - | 935 | +| g170-b20c256x2-s668214784-d222255714 | (20 block) | 15.5 | 959 | +| g170-b20c256x2-s1039565568-d285739972 | (20 block) | 21.5 | 1073 | +| g170-b20c256x2-s1420141824-d350969033 | (20 block) | 27.5 | 1176 | | g170-b20c256x2-s1913382912-d435450331 | (20 block) | 35.5 | 1269 | | g170-b20c256x2-s2107843328-d468617949 | (last selfplay 20 block) | 38.5 | 1293 | | g170e-b20c256x2-s2430231552-d525879064 | (extended training 20 block) | 47.5 | 1346 | -| g170-b30c320x2-s1287828224-d525929064 | (30 block more channels) | 47.5 | 1409 | -| g170-b40c256x2-s1349368064-d524332537 | (40 block less channels) | 47 | 1405 | -| g170e-b20c256x2-s2971705856-d633407024 | (extended training 20 block) | 64.5 | 1407 | -| g170-b30c320x2-s1840604672-d633482024 | (30 block more channels) | 64.5 | 1525 | -| g170-b40c256x2-s1929311744-d633132024 | (40 block less channels) | 64.5 | 1513 | -| g170e-b20c256x2-s3354994176-d716845198 | (extended training 20 block) | 78 | 1445 | -| g170-b30c320x2-s2271129088-d716970897 | (30 block more channels) | 78 | 1545 | +| g170-b30c320x2-s1287828224-d525929064 | (30 block more channels) | 47.5 | 1412 | +| g170-b40c256x2-s1349368064-d524332537 | (40 block less channels) | 47 | 1406 | +| g170e-b20c256x2-s2971705856-d633407024 | (extended training 20 block) | 64.5 | 1413 | +| g170-b30c320x2-s1840604672-d633482024 | (30 block more channels) | 64.5 | 1524 | +| g170-b40c256x2-s1929311744-d633132024 | (40 block less channels) | 64.5 | 1510 | +| g170e-b20c256x2-s3354994176-d716845198 | (extended training 20 block) | 78 | 1455 | +| g170-b30c320x2-s2271129088-d716970897 | (30 block more channels) | 78 | 1551 | | g170-b40c256x2-s2383550464-d716628997 | (40 block less channels) | 78 | 1554 | +| g170e-b20c256x2-s3761649408-d809581368 | (extended training 20 block) | 92 | 1513 | +| g170-b30c320x2-s2846858752-d829865719 | (30 block more channels) | 96 | 1619 | +| g170-b40c256x2-s2990766336-d830712531 | (40 block less channels) | 96 | 1613 | +| g170e-b20c256x2-s4384473088-d968438914 | (extended training 20 block) | 117 | 1529 | +| g170-b30c320x2-s3530176512-d968463914 | (30 block more channels) | 117 | 1643 | +| g170-b40c256x2-s3708042240-d967973220 | (40 block less channels) | 117 | 1687 | + And for comparison to the old 2019 June official run (Elos computed within the same pool): | Neural Net | Note | Approx Days Selfplay | Elo | |-------------|-------|---------------|------| -| g104-b6c96-s97778688-d23397744 | (last selfplay 6 block) | 0.75 | -1133 | -| g104-b10c128-s110887936-d54937276 | (last selfplay 10 block) | 1.75 | -482 | -| g104-b15c192-s297383936-d140330251 | (last selfplay 15 block) | 7.5 | 331 | -| g104-b20c256-s447913472-d241840887 | (last selfplay 20 block) | 19 | 904 | +| g104-b6c96-s97778688-d23397744 | (last selfplay 6 block) | 0.75 | -1146 | +| g104-b10c128-s110887936-d54937276 | (last selfplay 10 block) | 1.75 | -476 | +| g104-b15c192-s297383936-d140330251 | (last selfplay 15 block) | 7.5 | 327 | +| g104-b20c256-s447913472-d241840887 | (last selfplay 20 block) | 19 | 908 | ### Older Runs @@ -90,7 +100,9 @@ You can download a few selected neural nets from the [releases page](https://git **If using the OpenCL version, KataGo will need to tune itself the first time it starts - try running the `benchmark` command described below.** ## Setting Up and Running KataGo -KataGo implements just a GTP engine - GTP is a simple text protocol that Go software uses to communicate with engines. It does NOT have a graphical interface on its own. So generally, you will want to use KataGo along with a GUI or analysis program, such as [Lizzie](https://github.com/featurecat/lizzie) or [Sabaki](https://sabaki.yichuanshen.de/). Both of these programs also support KataGo's score estimates and visualization as well. NOTE: a version of KataGo is also packaged directly with Lizzie's latest Windows release, but this is a somewhat older version and doesn't support some recent features. +KataGo implements just a GTP engine - GTP is a simple text protocol that Go software uses to communicate with engines. It does NOT have a graphical interface on its own. So generally, you will want to use KataGo along with a GUI or analysis program, such as [Lizzie](https://github.com/featurecat/lizzie) or [Sabaki](https://sabaki.yichuanshen.de/). Both of these programs also support KataGo's score estimates and visualization as well. + +**Warning: the version of KataGo packaged directly with Lizzie is fairly OLD. The net is quite weak compared to the latest nets, and the executable may not support the latest models or features. Download a newer version of both the net and executable from the [releases page](https://github.com/lightvector/KataGo/releases).** ### Windows and Linux @@ -120,15 +132,15 @@ KataGo supports a few commands. All of these commands require a "model" file tha **For all of the commands that require a GTP config, you can omit the `-config` argument if you've put the GTP config file into the same directory as the katago executable as `default_gtp.cfg`.** -To run a benchmark to test performance and help you choose how many threads to use for best performance. You can then edit your GTP config to use this many threads: +To run a benchmark to test performance and help you choose how many threads to use for best performance. You can then manually edit your GTP config to use this many threads: - * `./katago benchmark -model .gz -config .cfg` + * `./katago benchmark -tune -model .gz -config .cfg` Or for example as noted above in bold, if you have a default config and model in the right place: - * `./katago benchmark` + * `./katago benchmark -tune` -To automatically tune threads and other settings for you based on an interactive prompt, and generate a GTP config for you: +To automatically tune threads and other settings for you based on asking simple questions, and generate a GTP config for you: * `./katago genconfig -model .gz -output .cfg` @@ -166,7 +178,32 @@ Or to do so automatically and generate a config appropriately: `./katago genconfig -model .gz -output .cfg` -### Features for Developers + +### Common Causes of Errors +This section summarizes a number of common issues that some users have encountered that caused KataGo to not be able to run. + +#### Issues with specific GPUs or GPU drivers +If you are observing any crashes in KataGo while attempting to run the benchmark or the program itself, and you have one of the below GPUs, then this is likely the reason. + +* **AMD Radeon RX 5700** - AMD's drivers for OpenCL for this GPU have been buggy ever since this GPU was released, and as of May 2020 AMD has still never released a fix. If you are using this GPU, you will just not be able to run KataGo (Leela Zero and other Go engines will probably fail too) and will probably also obtain incorrect calculations or crash if doing anything else scientific or mathematical that uses OpenCL. See for example these reddit threads: [[1]](https://www.reddit.com/r/Amd/comments/ebso1x/its_not_just_setihome_any_mathematic_or/) or [[2]](https://www.reddit.com/r/BOINC/comments/ebiz18/psa_please_remove_your_amd_rx5700xt_from_setihome/) or this [L19 thread](https://lifein19x19.com/viewtopic.php?f=18&t=17093). +* **OpenCL Mesa** - These drivers for OpenCL on AMD GPUs are buggy. If you are using an AMD GPU and on startup before crashing you see KataGo printing something like +`Found OpenCL Platform 0: ... (Mesa) (OpenCL 1.1 Mesa ...) ...` +then you are using the Mesa drivers. You will need to change your drivers, see for example this [KataGo issue](https://github.com/lightvector/KataGo/issues/182#issuecomment-607943405) which links to [this thread](https://bbs.archlinux.org/viewtopic.php?pid=1895516#p1895516). +* **Intel Integrated Graphics** - For weaker/older machines or laptops or devices that don't have a dedicated GPU, KataGo might end up using the weak "Intel Integrated Graphics" that is built in with the CPU. Often this will work fine (although KataGo will be slow and only get a tiny number of playouts compared to using a real GPU), but various versions of Intel Integrated Graphics can also be buggy and not work at all. If a driver update doesn't work for you, then the only solution is to upgrade to a better GPU. See for example this [issue](https://github.com/lightvector/KataGo/issues/54) or this [issue](https://github.com/lightvector/KataGo/issues/78), or this [other Github's issue](https://github.com/CNugteren/CLBlast/issues/280). + +#### General Issues +* **KataGo seems to hang or is "loading" forever on startup in Lizzie/Sabaki/q5go/GoReviewPartner/etc.** + * Likely either you have some misconfiguration, have specified file paths incorrectly, a bad GPU, etc. Almost all of these GUIs do a poor job of reporting errors and may completely swallow the error message from KataGo that would have told you what was wrong. Try running KataGo's `benchmark` or `gtp` directly on the command line, as described [above](https://github.com/lightvector/KataGo#how-to-use). + * Sometimes there is no error at all, it is merely that the *first* time KataGo runs on a given network size, it needs to do some expensive tuning, which may take a few minutes. Again this is clearer if you run the `benchmark` command directly in the command line. After tuning, then subsequent runs will be faster. + +* **KataGo works on the command line but having trouble specfying the right file paths for Lizzie/Sabaki/ZBaduk/etc.** + * As described [above](https://github.com/lightvector/KataGo#how-to-use), you can name your config `default_gtp.cfg` and name whichever network file you've downloaded to `default_model.bin.gz` (for newer `.bin.gz` models) or `default_model.txt.gz` (for older `.txt.gz` models). Stick those into the same directory as KataGo's executable, and then you don't need to specify `-config` or `-model` paths at all. + +* **KataGo gives an error like `Could not create file` when trying to run the initial tuning.** + * KataGo probably does not have access permissions to write files in the directory where you placed it. + * On Windows for example, the `Program Files` directory and its subdirectories are often restricted to only allow writes with admin-level permissions. Try placing KataGo somewhere else. + +## Features for Developers #### GTP Extensions: In addition to a basic set of [GTP commands](https://www.lysator.liu.se/~gunnar/gtp/), KataGo supports a few additional commands, for use with analysis tools and other programs. @@ -195,7 +232,7 @@ KataGo is written in C++. It should compile on Linux or OSX via g++ that support * `git clone https://github.com/lightvector/KataGo.git` * Compile using CMake and make in the cpp directory: * `cd KataGo/cpp` - * `cmake . -DBUILD_MCTS=1 -DUSE_BACKEND=OPENCL` or `cmake . -DBUILD_MCTS=1 -DUSE_BACKEND=CUDA` depending on which backend you want. Specify also `-DUSE_TCMALLOC=1` if using TCMalloc. Compiling will also call git commands to embed the git hash into the compiled executable, specify also `-DNO_GIT_REVISION=1` to disable it if this is causing issues for you. + * `cmake . -DUSE_BACKEND=OPENCL` or `cmake . -DUSE_BACKEND=CUDA` depending on which backend you want. Specify also `-DUSE_TCMALLOC=1` if using TCMalloc. Compiling will also call git commands to embed the git hash into the compiled executable, specify also `-DNO_GIT_REVISION=1` to disable it if this is causing issues for you. * `make` * Done! You should now have a compiled `katago` executable in your working directory. * Pre-trained neural nets are available on the [releases page](https://github.com/lightvector/KataGo/releases) or more from [here](https://d3dndmfyhecmj0.cloudfront.net/g170/index.html). @@ -226,68 +263,8 @@ KataGo is written in C++. It should compile on Linux or OSX via g++ that support * You will probably want to edit `configs/gtp_example.cfg` (see "Tuning for Performance" above). * If using OpenCL, you will want to verify that KataGo is picking up the correct device (e.g. some systems may have both an Intel CPU OpenCL and GPU OpenCL, if KataGo appears to pick the wrong one, you can correct this by specifying `openclGpuToUse` in `configs/gtp_example.cfg`). -## Selfplay training: -If you'd also like to run the full self-play loop and train your own neural nets you must have [Python3](https://www.python.org/) and [Tensorflow](https://www.tensorflow.org/install/) installed. The version of Tensorflow known to work with the current code and with which KataGo's main run was trained is 1.15. Earlier versions than 1.15 will probably not work, and KataGo has NOT been tested with TF2.0. You'll also probably need a decent amount of GPU power. - -There are 5 things that need to all run concurrently to form a closed self-play training loop. - * Selfplay engine (C++ - `cpp/katago selfplay`) - continuously plays games using the latest neural net in some directory of accepted models, writing the data to some directory. - * Shuffler (python - `python/shuffle.py`) - scans directories of data from selfplay and shuffles it to produce TFRecord files to write to some directory. - * Training (python - `python/train.py`) - continuously trains a neural net using TFRecord files from some directory, saving models periodically to some directory. - * Exporter (python - `python/export_model.py`) - scans a directory of saved models and converts from Tensorflow's format to the format that all the C++ uses, exporting to some directory. - * Gatekeeper (C++ - `cpp/katago gatekeeper`) - polls a directory of newly exported models, plays games against the latest model in an accepted models directory, and if the new model passes, moves it to the accepted models directory. OPTIONAL, it is also possible to train just accepting every new model. - -On the cloud, a reasonable small-scale setup for all these things might be: - * A machine with a decent amount of cores and memory to run the shuffler and exporter. - * A machine with one or two powerful GPUs and a lot of cpus and memory to run the selfplay engine. - * A machine with a medium GPU and a lot of cpus and memory to run the gatekeeper. - * A machine with a modest GPU to run the training. - * A well-performing shared filesystem accessible by all four of these machines. - -You may need to play with learning rates, batch sizes, and the balance between training and self-play. If the training GPU is too strong, you may overfit more since it will be on the same data over and over because self-play won't be generating new data fast enough, and it's possible you will want to adjust hyperparameters or even add an artificial delay for each loop of training. Overshooting the other way and having too much GPU power on self-play is harder since generally you need at least an order of magnitude more power on self-play than training. If you do though maybe you'll start seeing diminishing returns as the training becomes the limiting factor in improvement. - -Example instructions to start up these things (assuming you have appropriate machines set up), with some base directory $BASEDIR to hold the all the models and training data generated with a few hundred GB of disk space. The below commands assume you're running from the root of the repo and that you can run bash scripts. - * `cpp/katago selfplay -output-dir $BASEDIR/selfplay -models-dir $BASEDIR/models -config cpp/configs/SELFPLAYCONFIG.cfg >> log.txt 2>&1 & disown` - * Some example configs for different numbers of GPUs are: cpp/configs/selfplay{1,2,4,8a,8b,8c}.cfg. You may want to edit them depending on your specs - for example to change the sizes of various tables depending on how much memory you have, or to specify gpu indices if you're doing things like putting some mix of training, gatekeeper, and self-play on the same machines or GPUs instead of on separate ones. Note that the number of game threads in these configs is very large, probably far larger than the number of cores on your machine. This is intentional, as each thread only currently runs synchronously with respect to neural net queries, so a large number of parallel games is needed to take advantage of batching. - * Take a look at the generated `log.txt` for any errors and/or for running stats on started games and occasional neural net query stats. - * Edit the config to change the number of playouts used or other parameters, or to set a cap on the number of games generated after which selfplay should terminate. - * If `models-dir` is empty, selfplay will use a random number generator instead to produce data, so selfplay is the **starting point** of setting up the full closed loop. - * Multiple selfplays across many machines can coexist using the same output dirs on a shared filesystem. This is the intended way to run selfplay across a cluster. - * `cd python; ./selfplay/shuffle_and_export_loop.sh $NAMEOFRUN $BASEDIR/ $SCRATCH_DIRECTORY $NUM_THREADS $BATCH_SIZE $USE_GATING` - * `$NAMEOFRUN` should be a short alphanumeric string that ideally should be globally unique, to distinguish models from your run if you choose to share your results with others. It will get prefixed on to the internal names of exported models, which will appear in log messages when KataGo loads the model. - * This starts both the shuffler and exporter. The shuffler will use the scratch directory with the specified number of threads to shuffle in parallel. Make sure you have some disk space. You probably want as many threads as you have cores. If not using the gatekeeper, specify `0` for `$USE_GATING`, else specify `1`. - * KataGo uses a batch size of 256, but you might have to use a smaller batch size if your GPU has less memory or you are training a very big net. - * Also, if you're low on disk space, take a look also at the `./selfplay/shuffle.sh` script (which is called by `shuffle_and_export_loop.sh`). Right now it's *very* conservative about cleaning up old shuffles but you could tweak it to be a bit more aggressive. - * You can also edit `./selfplay/shuffle.sh` if you want to change any details about the lookback window for training data, see `shuffle.py` for more possible arguments. - * The loop script will output `$BASEDIR/logs/outshuffle.txt` and `$BASEDIR/logs/outexport.txt`, take a look at these to see the output of the shuffle program and/or any errors it encountered. - * `cd python; ./selfplay/train.sh $BASEDIR/ $TRAININGNAME b6c96 $BATCH_SIZE main -lr-scale 1.0 >> log.txt 2>&1 & disown` - * This starts the training. You may want to look at or edit the train.sh script, it also snapshots the state of the repo for logging, as well as contains some training parameters that can be tweaked. - * `$TRAININGNAME` is a name prefix for the neural net, whose name will follow the convention `$NAMEOFRUN-$TRAININGNAME-s(# of samples trained on)-d(# of data samples generated)`. - * The batch size specified here MUST match the batch size given to the shuffle script. - * The fourth argument controls some export behavior: - * `main` - this is the main net for selfplay, save it regularly to `$BASEDIR/tfsavedmodels_toexport` which the export loop will export regularly for gating. - * `extra` - save models to `$BASEDIR/tfsavedmodels_toexport_extra`, which the export loop will then export to `$BASEDIR/models_extra`, a directory that does not feed into gating or selfplay. - * `trainonly` - the neural net without exporting anything. This is useful for when you are trying to jointly train additional models of different sizes and there's no point to have them export anything yet (maybe they're too weak to bother testing). - * Any additional arguments, like "-lr-scale 1.0" to adjust learning rate will simply get forwarded on to train.py. The argument `-max-epochs-this-instance` can be used to make training terminate after a few epochs, instead of running forever. Run train.py with -help for other arguments. - * Take a look at the generated `log.txt` for any possible errors, as well as running stats on training and loss statistics. - * You can choose a different size than b6c96 if desired. Configuration is in `python/modelconfigs.py`, which you can also edit to add other sizes. - * `cpp/katago gatekeeper -rejected-models-dir $BASEDIR/rejectedmodels -accepted-models-dir $BASEDIR/models/ -sgf-output-dir $BASEDIR/gatekeepersgf/ -test-models-dir $BASEDIR/modelstobetested/ -config cpp/configs/GATEKEEPERCONFIG.cfg >> log.txt 2>&1 & disown` - * This starts the gatekeeper. Some example configs for different numbers of GPUs are: configs/gatekeeper{1,2a,2b,2c}.cfg. Again, you may want to edit these. The number of simultaneous game threads here is also large for the same reasons as for selfplay. No need to start this if specifying `0` for `$USE_GATING`. - * Take a look at the generated `log.txt` for any errors and/or for the game-by-game progress of each testing match that the gatekeeper runs. - * The argument `-quit-if-no-nets-to-test` can make gatekeeper terminate after testing all nets queued for testing, instead of running forever and waiting for more. Run with -help to see other arguments as well. - -To manually pause a run, sending `SIGINT` or `SIGKILL` to all the relevant processes is the recommended method. The selfplay and gatekeeper processes will terminate gracefully when receiving such a signal and finish writing all pending data (this may take a minute or two), and any python or bash scripts will be terminated abruptly but are all implemented to write to disk in a way that is safe if killed at any point. To resume the run, just restart everything again with the same `$BASEDIR` and everything will continue where it left off. - -### Synchronous vs Asynchronous -The normal pipeline, and the method that all scripts and configs are geared for by default, is to have all steps run simultaneously and _asynchronously_ without ever stopping. Selfplay continuously produces data and polls for new nets, shuffle repeatedly takes the data and shuffles it, training continuously uses the data to produce new nets, etc. This is by far the simplest and most efficient method if using more than one machine in the training loop, since different processes can simply just keep running on their own machine without waiting for steps on any other. To do so, simply just start up each separate process as described above, each one on an appropriate machine. - -It is also possible to run _synchronously_, with each step sequentially following the previous, which could be suitable for attempting to run on only one machine with only one GPU. An example script is provided in `python/selfplay/synchronous_loop.sh` for how to do this. In particular it: - * Provides a `-max-games-total` to the selfplay so it terminates after a certain number of games. - * Provides smaller values of `-keep-target-rows` for the shuffler to reduce the data per cycle and `-samples-per-epoch` and `-max-epochs-this-instance 1` for the training to terminate after training on a smaller number of samples instead of going forever. - * If using the gatekeeper at all, provides `-quit-if-no-nets-to-test` to it so that it terminates after gatekeeping any nets produced by training. Not using gating (passing in 0 for `USEGATING`) will be faster and will save compute power, and the whole loop works perfectly fine without it, but having it at first can be nice to help debugging and make sure that things are working and that the net is actually getting stronger. - -The default parameters in the example synchronous loop script are NOT heavily tested, and unlike the asynchronous setup, have NOT been used for KataGo's primary training runs, so it is quite possible that they are suboptimal, and will need some experimentation. The right parameters may also vary depending on what you're training - for example a 9x9-only run may prefer a different number of samples and windowing policy than 19x19, etc. - -With either a synchronous OR an asynchronous setup, it's recommended to be spending anywhere from 4x to 40x more GPU power on the selfplay than on the training. For the normal asynchronous setup, this is done by simply using more and/or stronger GPUs on the selfplay processes than on training. For synchronous, this can be done by playing around with the various parameters (number of games, visits per move, samples per epoch, etc) and seeing how long each step takes, to find a good balance for your hardware. Note however that very early in a run may be misleading for timing these steps though, since with early barely-better-than-random nets games will last a lot longer than a little further in to a run. +## Selfplay Training: +If you'd also like to run the full self-play loop and train your own neural nets using the code here, see [Selfplay Training](SelfplayTraining.md). ## Contributors diff --git a/SelfplayTraining.md b/SelfplayTraining.md new file mode 100644 index 000000000..cc7143cfa --- /dev/null +++ b/SelfplayTraining.md @@ -0,0 +1,62 @@ +## Selfplay Training: +If you'd also like to run the full self-play loop and train your own neural nets, in addition to probably wanting to [compile KataGo yourself](https://github.com/lightvector/KataGo#compiling-katago), you must have [Python3](https://www.python.org/) and [Tensorflow](https://www.tensorflow.org/install/) installed. The version of Tensorflow known to work with the current code and with which KataGo's main run was trained is 1.15. Earlier versions than 1.15 will probably not work, and KataGo has NOT been tested with TF2.0. You'll also probably need a decent amount of GPU power. + +There are 5 things that need to all run concurrently to form a closed self-play training loop. + * Selfplay engine (C++ - `cpp/katago selfplay`) - continuously plays games using the latest neural net in some directory of accepted models, writing the data to some directory. + * Shuffler (python - `python/shuffle.py`) - scans directories of data from selfplay and shuffles it to produce TFRecord files to write to some directory. + * Training (python - `python/train.py`) - continuously trains a neural net using TFRecord files from some directory, saving models periodically to some directory. + * Exporter (python - `python/export_model.py`) - scans a directory of saved models and converts from Tensorflow's format to the format that all the C++ uses, exporting to some directory. + * Gatekeeper (C++ - `cpp/katago gatekeeper`) - polls a directory of newly exported models, plays games against the latest model in an accepted models directory, and if the new model passes, moves it to the accepted models directory. OPTIONAL, it is also possible to train just accepting every new model. + +On the cloud, a reasonable small-scale setup for all these things might be: + * A machine with a decent amount of cores and memory to run the shuffler and exporter. + * A machine with one or two powerful GPUs and a lot of cpus and memory to run the selfplay engine. + * A machine with a medium GPU and a lot of cpus and memory to run the gatekeeper. + * A machine with a modest GPU to run the training. + * A well-performing shared filesystem accessible by all four of these machines. + +You may need to play with learning rates, batch sizes, and the balance between training and self-play. If the training GPU is too strong, you may overfit more since it will be on the same data over and over because self-play won't be generating new data fast enough, and it's possible you will want to adjust hyperparameters or even add an artificial delay for each loop of training. Overshooting the other way and having too much GPU power on self-play is harder since generally you need at least an order of magnitude more power on self-play than training. If you do though maybe you'll start seeing diminishing returns as the training becomes the limiting factor in improvement. + +Example instructions to start up these things (assuming you have appropriate machines set up), with some base directory $BASEDIR to hold the all the models and training data generated with a few hundred GB of disk space. The below commands assume you're running from the root of the repo and that you can run bash scripts. + * `cpp/katago selfplay -output-dir $BASEDIR/selfplay -models-dir $BASEDIR/models -config cpp/configs/training/SELFPLAYCONFIG.cfg >> log.txt 2>&1 & disown` + * Some example configs for different numbers of GPUs are: cpp/configs/training/selfplay{1,2,4,8a,8b,8c}.cfg. You may want to edit them depending on your specs - for example to change the sizes of various tables depending on how much memory you have, or to specify gpu indices if you're doing things like putting some mix of training, gatekeeper, and self-play on the same machines or GPUs instead of on separate ones. Note that the number of game threads in these configs is very large, probably far larger than the number of cores on your machine. This is intentional, as each thread only currently runs synchronously with respect to neural net queries, so a large number of parallel games is needed to take advantage of batching. + * Take a look at the generated `log.txt` for any errors and/or for running stats on started games and occasional neural net query stats. + * Edit the config to change the number of playouts used or other parameters, or to set a cap on the number of games generated after which selfplay should terminate. + * If `models-dir` is empty, selfplay will use a random number generator instead to produce data, so selfplay is the **starting point** of setting up the full closed loop. + * Multiple selfplays across many machines can coexist using the same output dirs on a shared filesystem. This is the intended way to run selfplay across a cluster. + * `cd python; ./selfplay/shuffle_and_export_loop.sh $NAMEOFRUN $BASEDIR/ $SCRATCH_DIRECTORY $NUM_THREADS $BATCH_SIZE $USE_GATING` + * `$NAMEOFRUN` should be a short alphanumeric string that ideally should be globally unique, to distinguish models from your run if you choose to share your results with others. It will get prefixed on to the internal names of exported models, which will appear in log messages when KataGo loads the model. + * This starts both the shuffler and exporter. The shuffler will use the scratch directory with the specified number of threads to shuffle in parallel. Make sure you have some disk space. You probably want as many threads as you have cores. If not using the gatekeeper, specify `0` for `$USE_GATING`, else specify `1`. + * KataGo uses a batch size of 256, but you might have to use a smaller batch size if your GPU has less memory or you are training a very big net. + * Also, if you're low on disk space, take a look also at the `./selfplay/shuffle.sh` script (which is called by `shuffle_and_export_loop.sh`). Right now it's *very* conservative about cleaning up old shuffles but you could tweak it to be a bit more aggressive. + * You can also edit `./selfplay/shuffle.sh` if you want to change any details about the lookback window for training data, see `shuffle.py` for more possible arguments. + * The loop script will output `$BASEDIR/logs/outshuffle.txt` and `$BASEDIR/logs/outexport.txt`, take a look at these to see the output of the shuffle program and/or any errors it encountered. + * `cd python; ./selfplay/train.sh $BASEDIR/ $TRAININGNAME b6c96 $BATCH_SIZE main -lr-scale 1.0 >> log.txt 2>&1 & disown` + * This starts the training. You may want to look at or edit the train.sh script, it also snapshots the state of the repo for logging, as well as contains some training parameters that can be tweaked. + * `$TRAININGNAME` is a name prefix for the neural net, whose name will follow the convention `$NAMEOFRUN-$TRAININGNAME-s(# of samples trained on)-d(# of data samples generated)`. + * The batch size specified here MUST match the batch size given to the shuffle script. + * The fourth argument controls some export behavior: + * `main` - this is the main net for selfplay, save it regularly to `$BASEDIR/tfsavedmodels_toexport` which the export loop will export regularly for gating. + * `extra` - save models to `$BASEDIR/tfsavedmodels_toexport_extra`, which the export loop will then export to `$BASEDIR/models_extra`, a directory that does not feed into gating or selfplay. + * `trainonly` - the neural net without exporting anything. This is useful for when you are trying to jointly train additional models of different sizes and there's no point to have them export anything yet (maybe they're too weak to bother testing). + * Any additional arguments, like "-lr-scale 1.0" to adjust learning rate will simply get forwarded on to train.py. The argument `-max-epochs-this-instance` can be used to make training terminate after a few epochs, instead of running forever. Run train.py with -help for other arguments. + * Take a look at the generated `log.txt` for any possible errors, as well as running stats on training and loss statistics. + * You can choose a different size than b6c96 if desired. Configuration is in `python/modelconfigs.py`, which you can also edit to add other sizes. + * `cpp/katago gatekeeper -rejected-models-dir $BASEDIR/rejectedmodels -accepted-models-dir $BASEDIR/models/ -sgf-output-dir $BASEDIR/gatekeepersgf/ -test-models-dir $BASEDIR/modelstobetested/ -config cpp/configs/training/GATEKEEPERCONFIG.cfg >> log.txt 2>&1 & disown` + * This starts the gatekeeper. Some example configs for different numbers of GPUs are: configs/training/gatekeeper{1,2a,2b,2c}.cfg. Again, you may want to edit these. The number of simultaneous game threads here is also large for the same reasons as for selfplay. No need to start this if specifying `0` for `$USE_GATING`. + * Take a look at the generated `log.txt` for any errors and/or for the game-by-game progress of each testing match that the gatekeeper runs. + * The argument `-quit-if-no-nets-to-test` can make gatekeeper terminate after testing all nets queued for testing, instead of running forever and waiting for more. Run with -help to see other arguments as well. + +To manually pause a run, sending `SIGINT` or `SIGKILL` to all the relevant processes is the recommended method. The selfplay and gatekeeper processes will terminate gracefully when receiving such a signal and finish writing all pending data (this may take a minute or two), and any python or bash scripts will be terminated abruptly but are all implemented to write to disk in a way that is safe if killed at any point. To resume the run, just restart everything again with the same `$BASEDIR` and everything will continue where it left off. + +### Synchronous vs Asynchronous +The normal pipeline, and the method that all scripts and configs are geared for by default, is to have all steps run simultaneously and _asynchronously_ without ever stopping. Selfplay continuously produces data and polls for new nets, shuffle repeatedly takes the data and shuffles it, training continuously uses the data to produce new nets, etc. This is by far the simplest and most efficient method if using more than one machine in the training loop, since different processes can simply just keep running on their own machine without waiting for steps on any other. To do so, simply just start up each separate process as described above, each one on an appropriate machine. + +It is also possible to run _synchronously_, with each step sequentially following the previous, which could be suitable for attempting to run on only one machine with only one GPU. An example script is provided in `python/selfplay/synchronous_loop.sh` for how to do this. In particular it: + * Provides a `-max-games-total` to the selfplay so it terminates after a certain number of games. + * Provides smaller values of `-keep-target-rows` for the shuffler to reduce the data per cycle and `-samples-per-epoch` and `-max-epochs-this-instance 1` for the training to terminate after training on a smaller number of samples instead of going forever. + * If using the gatekeeper at all, provides `-quit-if-no-nets-to-test` to it so that it terminates after gatekeeping any nets produced by training. Not using gating (passing in 0 for `USEGATING`) will be faster and will save compute power, and the whole loop works perfectly fine without it, but having it at first can be nice to help debugging and make sure that things are working and that the net is actually getting stronger. + +The default parameters in the example synchronous loop script are NOT heavily tested, and unlike the asynchronous setup, have NOT been used for KataGo's primary training runs, so it is quite possible that they are suboptimal, and will need some experimentation. The right parameters may also vary depending on what you're training - for example a 9x9-only run may prefer a different number of samples and windowing policy than 19x19, etc. + +With either a synchronous OR an asynchronous setup, it's recommended to be spending anywhere from 4x to 40x more GPU power on the selfplay than on the training. For the normal asynchronous setup, this is done by simply using more and/or stronger GPUs on the selfplay processes than on training. For synchronous, this can be done by playing around with the various parameters (number of games, visits per move, samples per epoch, etc) and seeing how long each step takes, to find a good balance for your hardware. Note however that very early in a run may be misleading for timing these steps though, since with early barely-better-than-random nets games will last a lot longer than a little further in to a run. diff --git a/cpp/README.md b/cpp/README.md index 787e62a55..e97025f4f 100644 --- a/cpp/README.md +++ b/cpp/README.md @@ -29,6 +29,7 @@ Summary of source folders, in approximate dependency order, from lowest level to * `playutils.{cpp,h}` - Miscellaneous: handicap placement, ownership and final stone status, computing high-level stats to report, benchmarking. * `play.{cpp,h}` - Running matches and self-play games. * `tests` - A variety of tests. + * `models` - A directory with a small number of small-sized (and not very strong) models for running tests. * `command` - Top-level subcommands callable by users. GTP, analysis commands, benchmarking, selfplay data generation, etc. * `commandline.{cpp,h}` - Common command line logic shared by all subcommands. * `gtp.cpp` - Main GTP engine. @@ -41,4 +42,3 @@ Summary of source folders, in approximate dependency order, from lowest level to Other folders: * `configs` - Default or example configs for many of the different subcommands. -* `models` - A small number of small-sized (and not very strong) models for running tests. \ No newline at end of file diff --git a/cpp/command/analysis.cpp b/cpp/command/analysis.cpp index 39bfd5691..696938228 100644 --- a/cpp/command/analysis.cpp +++ b/cpp/command/analysis.cpp @@ -1,6 +1,8 @@ #include "../core/global.h" #include "../core/config_parser.h" #include "../core/timer.h" +#include "../core/datetime.h" +#include "../core/makedir.h" #include "../search/asyncbot.h" #include "../program/setup.h" #include "../program/playutils.h" @@ -67,15 +69,24 @@ int MainCmds::analysis(int argc, const char* const* argv) { } Logger logger; - logger.addFile(cfg.getString("logFile")); + if(cfg.contains("logFile") && cfg.contains("logDir")) + throw StringError("Cannot specify both logFile and logDir in config"); + else if(cfg.contains("logFile")) + logger.addFile(cfg.getString("logFile")); + else { + MakeDir::make(cfg.getString("logDir")); + Rand rand; + logger.addFile(cfg.getString("logDir") + "/" + DateTime::getCompactDateTimeString() + "-" + Global::uint32ToHexString(rand.nextUInt()) + ".log"); + } + logger.setLogToStderr(true); logger.write("Analysis Engine starting..."); logger.write(Version::getKataGoVersionForHelp()); - auto loadParams = [](ConfigParser& config, SearchParams& params, Player& perspective) { + auto loadParams = [](ConfigParser& config, SearchParams& params, Player& perspective, Player defaultPerspective) { params = Setup::loadSingleParams(config); - perspective = Setup::parseReportAnalysisWinrates(config,C_EMPTY); + perspective = Setup::parseReportAnalysisWinrates(config,defaultPerspective); //Set a default for conservativePass that differs from matches or selfplay if(!config.contains("conservativePass") && !config.contains("conservativePass0")) params.conservativePass = true; @@ -83,7 +94,7 @@ int MainCmds::analysis(int argc, const char* const* argv) { SearchParams defaultParams; Player defaultPerspective; - loadParams(cfg, defaultParams, defaultPerspective); + loadParams(cfg, defaultParams, defaultPerspective, C_EMPTY); const int analysisPVLen = cfg.contains("analysisPVLen") ? cfg.getInt("analysisPVLen",1,100) : 15; const bool assumeMultipleStartingBlackMovesAreHandicap = @@ -102,6 +113,19 @@ int MainCmds::analysis(int argc, const char* const* argv) { ); } + int nnMaxBatchSizeTotal = nnEval->getNumGpus() * nnEval->getMaxBatchSize(); + int numThreadsTotal = defaultParams.numThreads * numAnalysisThreads; + if(nnMaxBatchSizeTotal * 1.5 <= numThreadsTotal) { + logger.write( + Global::strprintf( + "Note: nnMaxBatchSize * number of GPUs (%d) is smaller than numSearchThreads * numAnalysisThreads (%d)", + nnMaxBatchSizeTotal, numThreadsTotal + ) + ); + logger.write("The number of simultaneous threads that might query the GPU could be larger than the batch size that the GPU will handle at once."); + logger.write("It may improve performance to increase nnMaxBatchSize, unless you are constrained on GPU memory."); + } + //Check for unused config keys cfg.warnUnusedKeys(cerr,&logger); @@ -346,6 +370,7 @@ int MainCmds::analysis(int argc, const char* const* argv) { //Defaults rbase.params = defaultParams; + rbase.perspective = defaultPerspective; rbase.analysisPVLen = analysisPVLen; rbase.includeOwnership = false; rbase.includePolicy = false; @@ -597,7 +622,7 @@ int MainCmds::analysis(int argc, const char* const* argv) { } std::map overrideSettings; for(auto it = settings.begin(); it != settings.end(); ++it) { - overrideSettings[it.key()] = it.value().is_string() ? std::string(it.value()): it.value().dump(); // always convert to string + overrideSettings[it.key()] = it.value().is_string() ? it.value().get(): it.value().dump(); // always convert to string } // Reload settings to allow overrides @@ -607,7 +632,7 @@ int MainCmds::analysis(int argc, const char* const* argv) { //Ignore any unused keys in the ORIGINAL config localCfg.markAllKeysUsedWithPrefix(""); localCfg.overrideKeys(overrideSettings); - loadParams(localCfg, rbase.params, rbase.perspective); + loadParams(localCfg, rbase.params, rbase.perspective, defaultPerspective); SearchParams::failIfParamsDifferOnUnchangeableParameter(defaultParams,rbase.params); //Hard failure on unused override keys newly present in the config vector unusedKeys = localCfg.unusedKeys(); diff --git a/cpp/command/evalsgf.cpp b/cpp/command/evalsgf.cpp index c2b8fbe83..c2a03b51b 100644 --- a/cpp/command/evalsgf.cpp +++ b/cpp/command/evalsgf.cpp @@ -22,6 +22,7 @@ int MainCmds::evalsgf(int argc, const char* const* argv) { int moveNum; string printBranch; string extraMoves; + string hintLoc; int64_t maxVisits; int numThreads; float overrideKomi; @@ -44,6 +45,7 @@ int MainCmds::evalsgf(int argc, const char* const* argv) { TCLAP::ValueArg printArg("p","print","Alias for -print-branch",false,string(),"MOVE MOVE ..."); TCLAP::ValueArg extraMovesArg("","extra-moves","Extra moves to force-play before doing search",false,string(),"MOVE MOVE ..."); TCLAP::ValueArg extraArg("e","extra","Alias for -extra-moves",false,string(),"MOVE MOVE ..."); + TCLAP::ValueArg hintLocArg("","hint-loc","Hint loc",false,string(),"MOVE"); TCLAP::ValueArg visitsArg("v","visits","Set the number of visits",false,-1,"VISITS"); TCLAP::ValueArg threadsArg("t","threads","Set the number of threads",false,-1,"THREADS"); TCLAP::ValueArg overrideKomiArg("","override-komi","Artificially set komi",false,std::numeric_limits::quiet_NaN(),"KOMI"); @@ -65,6 +67,7 @@ int MainCmds::evalsgf(int argc, const char* const* argv) { cmd.add(printArg); cmd.add(extraMovesArg); cmd.add(extraArg); + cmd.add(hintLocArg); cmd.add(visitsArg); cmd.add(threadsArg); cmd.add(overrideKomiArg); @@ -84,6 +87,7 @@ int MainCmds::evalsgf(int argc, const char* const* argv) { string print = printArg.getValue(); extraMoves = extraMovesArg.getValue(); string extra = extraArg.getValue(); + hintLoc = hintLocArg.getValue(); maxVisits = (int64_t)visitsArg.getValue(); numThreads = threadsArg.getValue(); overrideKomi = overrideKomiArg.getValue(); @@ -244,6 +248,9 @@ int MainCmds::evalsgf(int argc, const char* const* argv) { AsyncBot* bot = new AsyncBot(params, nnEval, &logger, searchRandSeed); bot->setPosition(nextPla,board,hist); + if(hintLoc != "") { + bot->setRootHintLoc(Location::ofString(hintLoc,board)); + } //Print initial state---------------------------------------------------------------- const Search* search = bot->getSearchStopAndWait(); diff --git a/cpp/command/gtp.cpp b/cpp/command/gtp.cpp index 72d47c9a8..f9b1e7d72 100644 --- a/cpp/command/gtp.cpp +++ b/cpp/command/gtp.cpp @@ -1,6 +1,8 @@ #include "../core/global.h" #include "../core/config_parser.h" #include "../core/timer.h" +#include "../core/datetime.h" +#include "../core/makedir.h" #include "../dataio/sgf.h" #include "../search/asyncbot.h" #include "../program/setup.h" @@ -283,12 +285,13 @@ static void printGenmoveLog(ostream& out, const AsyncBot* bot, const NNEvaluator out << bot->getRootHist().rules << "\n"; out << "Time taken: " << timeTaken << "\n"; out << "Root visits: " << search->getRootVisits() << "\n"; + out << "New playouts: " << search->lastSearchNumPlayouts << "\n"; out << "NN rows: " << nnEval->numRowsProcessed() << endl; out << "NN batches: " << nnEval->numBatchesProcessed() << endl; out << "NN avg batch size: " << nnEval->averageProcessedBatchSize() << endl; if(search->searchParams.playoutDoublingAdvantage != 0) out << "PlayoutDoublingAdvantage: " << ( - search->getRootPla() == getOpp(search->searchParams.playoutDoublingAdvantagePla) ? + search->getRootPla() == getOpp(search->getPlayoutDoublingAdvantagePla()) ? -search->searchParams.playoutDoublingAdvantage : search->searchParams.playoutDoublingAdvantage) << endl; out << "PV: "; search->printPV(out, search->rootNode, 25); @@ -305,15 +308,20 @@ struct GTPEngine { const bool assumeMultipleStartingBlackMovesAreHandicap; const int analysisPVLen; const bool preventEncore; + const double dynamicPlayoutDoublingAdvantageCapPerOppLead; double staticPlayoutDoublingAdvantage; bool staticPDATakesPrecedence; + double genmoveWideRootNoise; + double analysisWideRootNoise; NNEvaluator* nnEval; AsyncBot* bot; Rules currentRules; //Should always be the same as the rules in bot, if bot is not NULL. + //Stores the params we want to be using during genmoves or analysis SearchParams params; + TimeControls bTimeControls; TimeControls wTimeControls; @@ -337,6 +345,7 @@ struct GTPEngine { bool assumeMultiBlackHandicap, bool prevtEncore, double dynamicPDACapPerOppLead, double staticPDA, bool staticPDAPrecedence, bool avoidDagger, + double genmoveWRN, double analysisWRN, Player persp, int pvLen ) :nnModelFile(modelFile), @@ -346,6 +355,8 @@ struct GTPEngine { dynamicPlayoutDoublingAdvantageCapPerOppLead(dynamicPDACapPerOppLead), staticPlayoutDoublingAdvantage(staticPDA), staticPDATakesPrecedence(staticPDAPrecedence), + genmoveWideRootNoise(genmoveWRN), + analysisWideRootNoise(analysisWRN), nnEval(NULL), bot(NULL), currentRules(initialRules), @@ -379,7 +390,7 @@ struct GTPEngine { } void clearStatsForNewGame() { - genmoveTimeSum = 0.0; + //Currently nothing } //Specify -1 for the sizes for a default @@ -480,6 +491,14 @@ struct GTPEngine { staticPlayoutDoublingAdvantage = d; staticPDATakesPrecedence = true; } + void setAnalysisWideRootNoise(double x) { + analysisWideRootNoise = x; + } + void setRootPolicyTemperature(double x) { + params.rootPolicyTemperature = x; + bot->setParams(params); + bot->clearSearch(); + } void updateDynamicPDA() { updateDynamicPDAHelper( @@ -739,6 +758,10 @@ struct GTPEngine { params.avoidMYTDaggerHackPla = avoidMYTDaggerHackPla; bot->setParams(params); } + if(params.wideRootNoise != genmoveWideRootNoise) { + params.wideRootNoise = genmoveWideRootNoise; + bot->setParams(params); + } //Play faster when winning double searchFactor = PlayUtils::getSearchFactor(searchFactorWhenWinningThreshold,searchFactorWhenWinning,params,recentWinLossValues,pla); @@ -976,6 +999,11 @@ struct GTPEngine { params.avoidMYTDaggerHackPla = C_EMPTY; bot->setParams(params); } + //Also wide root, if desired + if(params.wideRootNoise != analysisWideRootNoise) { + params.wideRootNoise = analysisWideRootNoise; + bot->setParams(params); + } std::function callback = getAnalyzeCallback(pla,args); if(args.showOwnership) @@ -1248,7 +1276,16 @@ int MainCmds::gtp(int argc, const char* const* argv) { } Logger logger; - logger.addFile(cfg.getString("logFile")); + if(cfg.contains("logFile") && cfg.contains("logDir")) + throw StringError("Cannot specify both logFile and logDir in config"); + else if(cfg.contains("logFile")) + logger.addFile(cfg.getString("logFile")); + else { + MakeDir::make(cfg.getString("logDir")); + Rand rand; + logger.addFile(cfg.getString("logDir") + "/" + DateTime::getCompactDateTimeString() + "-" + Global::uint32ToHexString(rand.nextUInt()) + ".log"); + } + bool logAllGTPCommunication = cfg.getBool("logAllGTPCommunication"); bool logSearchInfo = cfg.getBool("logSearchInfo"); bool loggingToStderr = false; @@ -1320,6 +1357,10 @@ int MainCmds::gtp(int argc, const char* const* argv) { if(forDeterministicTesting) seedRand.init("forDeterministicTesting"); + const double genmoveWideRootNoise = initialParams.wideRootNoise; + const double analysisWideRootNoise = + cfg.contains("analysisWideRootNoise") ? cfg.getDouble("analysisWideRootNoise",0.0,5.0) : genmoveWideRootNoise; + Player perspective = Setup::parseReportAnalysisWinrates(cfg,C_EMPTY); GTPEngine* engine = new GTPEngine( @@ -1328,6 +1369,7 @@ int MainCmds::gtp(int argc, const char* const* argv) { dynamicPlayoutDoublingAdvantageCapPerOppLead, staticPlayoutDoublingAdvantage,staticPDATakesPrecedence, avoidMYTDaggerHack, + genmoveWideRootNoise,analysisWideRootNoise, perspective,analysisPVLen ); engine->setOrResetBoardSize(cfg,logger,seedRand,defaultBoardXSize,defaultBoardYSize); @@ -1641,10 +1683,16 @@ int MainCmds::gtp(int argc, const char* const* argv) { response = "Expected one arguments for kata-get-param but got '" + Global::concat(pieces," ") + "'"; } else { - //SearchParams params = engine->getParams(); + SearchParams params = engine->getParams(); if(pieces[0] == "playoutDoublingAdvantage") { response = Global::doubleToString(engine->staticPlayoutDoublingAdvantage); } + else if(pieces[0] == "rootPolicyTemperature") { + response = Global::doubleToString(params.rootPolicyTemperature); + } + else if(pieces[0] == "analysisWideRootNoise") { + response = Global::doubleToString(engine->analysisWideRootNoise); + } else { responseIsError = true; response = "Invalid parameter"; @@ -1658,14 +1706,34 @@ int MainCmds::gtp(int argc, const char* const* argv) { response = "Expected two arguments for kata-set-param but got '" + Global::concat(pieces," ") + "'"; } else { - //SearchParams params = engine->getParams(); double d; - if(pieces[0] == "playoutDoublingAdvantage" && Global::tryStringToDouble(pieces[1],d) && d >= -3.0 && d <= 3.0) { - engine->setStaticPlayoutDoublingAdvantage(d); + if(pieces[0] == "playoutDoublingAdvantage") { + if(Global::tryStringToDouble(pieces[1],d) && d >= -3.0 && d <= 3.0) + engine->setStaticPlayoutDoublingAdvantage(d); + else { + responseIsError = true; + response = "Invalid value for " + pieces[0] + ", must be float from -3.0 to 3.0"; + } + } + else if(pieces[0] == "rootPolicyTemperature") { + if(Global::tryStringToDouble(pieces[1],d) && d >= 0.01 && d <= 100.0) + engine->setRootPolicyTemperature(d); + else { + responseIsError = true; + response = "Invalid value for " + pieces[0] + ", must be float from 0.01 to 100.0"; + } + } + else if(pieces[0] == "analysisWideRootNoise") { + if(Global::tryStringToDouble(pieces[1],d) && d >= 0.0 && d <= 5.0) + engine->setAnalysisWideRootNoise(d); + else { + responseIsError = true; + response = "Invalid value for " + pieces[0] + ", must be float from 0.0 to 2.0"; + } } else { responseIsError = true; - response = "Invalid parameter or parameter value"; + response = "Unknown or invalid parameter: " + pieces[0]; } } } diff --git a/cpp/command/match.cpp b/cpp/command/match.cpp index d550a8e29..30b5530db 100644 --- a/cpp/command/match.cpp +++ b/cpp/command/match.cpp @@ -224,6 +224,7 @@ int MainCmds::match(int argc, const char* const* argv) { sgfOut->close(); delete sgfOut; } + logger.write("Match loop thread terminating"); }; Rand hashRand; diff --git a/cpp/command/misc.cpp b/cpp/command/misc.cpp index 465230161..3371d5102 100644 --- a/cpp/command/misc.cpp +++ b/cpp/command/misc.cpp @@ -1,4 +1,5 @@ #include "../core/global.h" +#include "../core/makedir.h" #include "../core/config_parser.h" #include "../core/timer.h" #include "../core/test.h" @@ -11,9 +12,20 @@ #include "../main.h" #include +#include using namespace std; +static std::atomic sigReceived(false); +static std::atomic shouldStop(false); +static void signalHandler(int signal) +{ + if(signal == SIGINT || signal == SIGTERM) { + sigReceived.store(true); + shouldStop.store(true); + } +} + static void writeLine( const Search* search, const BoardHistory& baseHist, const vector& winLossHistory, const vector& scoreHistory, const vector& scoreStdevHistory @@ -556,7 +568,690 @@ int MainCmds::demoplay(int argc, const char* const* argv) { int MainCmds::printclockinfo(int argc, const char* const* argv) { (void)argc; (void)argv; +#ifdef OS_IS_WINDOWS + cout << "Does nothing on windows, disabled" << endl; +#endif +#ifdef OS_IS_UNIX_OR_APPLE cout << "Tick unit in seconds: " << std::chrono::steady_clock::period::num << " / " << std::chrono::steady_clock::period::den << endl; cout << "Ticks since epoch: " << std::chrono::steady_clock::now().time_since_epoch().count() << endl; +#endif + return 0; +} + + +static uint64_t parseHex64(const string& str) { + assert(str.length() == 16); + uint64_t x = 0; + for(int i = 0; i<16; i++) { + x *= 16; + if(str[i] >= '0' && str[i] <= '9') + x += str[i] - '0'; + else if(str[i] >= 'a' && str[i] <= 'f') + x += str[i] - 'a' + 10; + else if(str[i] >= 'A' && str[i] <= 'F') + x += str[i] - 'A' + 10; + else + assert(false); + } + return x; +} + +int MainCmds::dataminesgfs(int argc, const char* const* argv) { + Board::initHash(); + ScoreValue::initTables(); + Rand seedRand; + + ConfigParser cfg; + string nnModelFile; + vector sgfDirs; + string outDir; + int numSearchThreads; + vector excludeHashesFiles; + bool gameMode; + bool treeMode; + try { + KataGoCommandLine cmd("Search for suprising good moves in sgfs"); + cmd.addConfigFileArg("",""); + cmd.addModelFileArg(); + + TCLAP::MultiArg sgfDirArg("","sgfdir","Directory of sgf files",true,"DIR"); + TCLAP::ValueArg outDirArg("","outdir","Directory to write results",true,string(),"DIR"); + TCLAP::ValueArg numSearchThreadsArg("","threads","Number of threads",true,1,"THREADS"); + TCLAP::MultiArg excludeHashesArg("","exclude-hashes","Specify a list of hashes to filter out, one per line in a txt file",false,"FILEOF(HASH,HASH)"); + TCLAP::SwitchArg gameModeArg("","game-mode","Game mode"); + TCLAP::SwitchArg treeModeArg("","tree-mode","Tree mode"); + cmd.add(sgfDirArg); + cmd.add(outDirArg); + cmd.add(numSearchThreadsArg); + cmd.add(excludeHashesArg); + cmd.add(gameModeArg); + cmd.add(treeModeArg); + cmd.parse(argc,argv); + nnModelFile = cmd.getModelFile(); + sgfDirs = sgfDirArg.getValue(); + outDir = outDirArg.getValue(); + numSearchThreads = numSearchThreadsArg.getValue(); + excludeHashesFiles = excludeHashesArg.getValue(); + gameMode = gameModeArg.getValue(); + treeMode = treeModeArg.getValue(); + + if(gameMode == treeMode) + throw StringError("Must specify either -game-mode or -tree-mode"); + + cmd.getConfig(cfg); + } + catch (TCLAP::ArgException &e) { + cerr << "Error: " << e.error() << " for argument " << e.argId() << endl; + return 1; + } + + Logger logger; + logger.setLogToStdout(true); + + SearchParams params = Setup::loadSingleParams(cfg); + //Ignore temperature, noise + params.chosenMoveTemperature = 0; + params.chosenMoveTemperatureEarly = 0; + params.rootNoiseEnabled = false; + params.rootDesiredPerChildVisitsCoeff = 0; + params.rootPolicyTemperature = 1.0; + params.rootPolicyTemperatureEarly = 1.0; + params.rootFpuReductionMax = params.fpuReductionMax * 0.5; + params.rootNumSymmetriesToSample = 1; + + //Disable dynamic utility so that utilities are always comparable + params.staticScoreUtilityFactor += params.dynamicScoreUtilityFactor; + params.dynamicScoreUtilityFactor = 0; + + NNEvaluator* nnEval; + { + Setup::initializeSession(cfg); + int maxConcurrentEvals = params.numThreads * 2 + 16; // * 2 + 16 just to give plenty of headroom + int defaultMaxBatchSize = std::max(8,((params.numThreads+3)/4)*4); + nnEval = Setup::initializeNNEvaluator( + nnModelFile,nnModelFile,cfg,logger,seedRand,maxConcurrentEvals, + NNPos::MAX_BOARD_LEN,NNPos::MAX_BOARD_LEN,defaultMaxBatchSize, + Setup::SETUP_FOR_ANALYSIS + ); + } + logger.write("Loaded neural net"); + + GameInitializer* gameInit = new GameInitializer(cfg,logger); + cfg.warnUnusedKeys(cerr,&logger); + + const string sgfSuffix = ".sgf"; + auto sgfFilter = [&sgfSuffix](const string& name) { + return Global::isSuffix(name,sgfSuffix); + }; + vector sgfFiles; + for(int i = 0; i permutation(sgfFiles.size()); + for(int64_t i = 0; i excludeHashes; + for(int i = 0; i hashes = Global::readFileLines(excludeHashesFile,'\n'); + for(int64_t j = 0; j < hashes.size(); j++) { + const string& hash128 = Global::trim(Global::stripComments(hashes[j])); + if(hash128.length() <= 0) + continue; + if(hash128.length() != 32) + throw IOError("Could not parse hashpair in exclude hashes file: " + hash128); + + uint64_t hash0 = parseHex64(hash128.substr(0,16)); + uint64_t hash1 = parseHex64(hash128.substr(16,16)); + excludeHashes.insert(Hash128(hash0,hash1)); + } + } + + MakeDir::make(outDir); + + if(!std::atomic_is_lock_free(&shouldStop)) + throw StringError("shouldStop is not lock free, signal-quitting mechanism for terminating matches will NOT work!"); + std::signal(SIGINT, signalHandler); + std::signal(SIGTERM, signalHandler); + + ThreadSafeQueue toWriteQueue; + auto writeLoop = [&toWriteQueue,&outDir]() { + int fileCounter = 0; + int numWrittenThisFile = 0; + ofstream* out = NULL; + while(true) { + string* message; + bool suc = toWriteQueue.waitPop(message); + if(!suc) + break; + + if(out == NULL || numWrittenThisFile > 100000) { + if(out != NULL) { + out->close(); + delete out; + } + out = new ofstream(outDir + "/" + Global::intToString(fileCounter) + ".hintposes.txt"); + fileCounter += 1; + numWrittenThisFile = 0; + } + (*out) << *message << endl; + numWrittenThisFile += 1; + delete message; + } + + if(out != NULL) { + out->close(); + delete out; + } + }; + + static const int minMoveIdx = 4; + + //We want surprising moves that turned out not poorly + //The more surprising, the more times we will write it out. + auto numTimesToWriteOfPolicy = [](double policyProb, Rand& rand) { + if(policyProb < 0) + return 0; + double numTimesToWriteFloat = 0.15 / (policyProb + 0.03) - 0.5; + if(numTimesToWriteFloat <= 0) + return 0; + int numTimesToWrite = (int)floor(numTimesToWriteFloat); + if(rand.nextBool(numTimesToWriteFloat - numTimesToWrite)) + numTimesToWrite += 1; + return numTimesToWrite; + }; + + + auto expensiveEvaluateMove = [&toWriteQueue,&logger]( + Search* search, Loc missedLoc, + Player nextPla, const Board& board, const BoardHistory& hist, + const Sgf::PositionSample& sample, + Rand& rand, + int numTimesToWrite + ) { + //cout << "EXPENSIVE" << endl; + //Do a more expensive search before and after + search->setPosition(nextPla,board,hist); + search->runWholeSearch(nextPla,logger,shouldStop); + if(shouldStop.load(std::memory_order_acquire)) + return; + Loc moveLoc = search->getChosenMoveLoc(); + + // const Player perspective = P_WHITE; + // { + // ostringstream preOut; + // Board::printBoard(preOut, search->getRootBoard(), moveLoc, &(search->getRootHist().moveHistory)); + // search->printTree(preOut, search->rootNode, PrintTreeOptions().maxDepth(1).maxChildrenToShow(10),perspective); + // cout << preOut.str() << endl; + // cout << Location::toString(missedLoc,board) << endl; + // } + + //Bot DOES see the move? + if(moveLoc == missedLoc) { + //Still good to learn from given that policy was really low + for(int n = 0; n locs; + vector playSelectionValues; + search->getPlaySelectionValues(locs,playSelectionValues,1.0); + //Did the move not get much of the play selection value? + double psvSum = 0.0; + double psvForMove = 0.0; + for(int k = 0; kgetRootValuesRequireSuccess(); + + // ostringstream preOut; + // Board::printBoard(preOut, search->getRootBoard(), moveLoc, &(search->getRootHist().moveHistory)); + // search->printTree(preOut, search->rootNode, PrintTreeOptions().maxDepth(1).maxChildrenToShow(10),perspective); + + Board newBoard = board; + BoardHistory newHist = hist; + Player newNextPla = nextPla; + if(!hist.isLegal(newBoard,missedLoc,newNextPla)) + return; + newHist.makeBoardMoveAssumeLegal(newBoard,missedLoc,newNextPla,NULL); + newNextPla = getOpp(newNextPla); + + search->setPosition(newNextPla,newBoard,newHist); + search->runWholeSearch(newNextPla,logger,shouldStop); + if(shouldStop.load(std::memory_order_acquire)) + return; + + // { + // ostringstream postOut; + // Board::printBoard(postOut, search->getRootBoard(), Board::NULL_LOC, &(search->getRootHist().moveHistory)); + // search->printTree(postOut, search->rootNode, PrintTreeOptions().maxDepth(1).maxChildrenToShow(10),perspective); + // cout << postOut.str() << endl; + // } + + const double utilityThreshold = 0.005; + + ReportedSearchValues postValues = search->getRootValuesRequireSuccess(); + if((nextPla == P_WHITE && postValues.utility > preValues.utility + utilityThreshold) || + (nextPla == P_BLACK && postValues.utility < preValues.utility - utilityThreshold)) { + // ostringstream postOut; + // Board::printBoard(postOut, search->getRootBoard(), Board::NULL_LOC, &(search->getRootHist().moveHistory)); + // search->printTree(postOut, search->rootNode, PrintTreeOptions().maxDepth(1).maxChildrenToShow(10),perspective); + + // cout << "YAAAAAAY" << endl; + + //Moves that the bot didn't see get written out more + numTimesToWrite *= 2; + + for(int n = 0; nhash)) + return; + + //Don't use the SGF rules - randomize them for a bit more entropy + Rules rules = gameInit->createRules(); + + Board board; + Player nextPla; + BoardHistory hist; + sgf->setupInitialBoardAndHist(rules, board, nextPla, hist); + if(!gameInit->isAllowedBSize(board.x_size,board.y_size)) + return; + + const bool preventEncore = true; + const vector& sgfMoves = sgf->moves; + + vector boards; + vector hists; + vector nextPlas; + vector> nnOutputs; + vector winLossValues; + vector scoreLeads; + + vector moves; + vector policyPriors; + + bool quitEarly = false; + for(int m = 0; mevaluate(board,hist,nextPla,nnInputParams,buf,skipCache,includeOwnerMap); + + boards.push_back(board); + hists.push_back(hist); + nextPlas.push_back(nextPla); + nnOutputs.push_back(std::move(buf.result)); + + shared_ptr& nnOutput = nnOutputs[nnOutputs.size()-1]; + winLossValues.push_back(nnOutput->whiteWinProb - nnOutput->whiteLossProb); + scoreLeads.push_back(nnOutput->whiteLead); + + if(m < sgfMoves.size()) { + moves.push_back(sgfMoves[m]); + int pos = NNPos::locToPos(sgfMoves[m].loc,board.x_size,nnOutput->nnXLen,nnOutput->nnYLen); + policyPriors.push_back(nnOutput->policyProbs[pos]); + } + + if(m >= sgfMoves.size()) + break; + + //Quit out if according to our rules, we already finished the game, or we're somehow in a cleanup phase + if(hist.isGameFinished || hist.encorePhase > 0) + break; + + //Quit out if consecutive moves by the same player, to keep the history clean and "normal" + if(sgfMoves[m].pla != nextPla && m > 0) { + logger.write("Ending SGF " + fileName + " early due to non-alternating players on turn " + Global::intToString(m)); + quitEarly = true; + break; + } + + bool suc = hist.isLegal(board,sgfMoves[m].loc,sgfMoves[m].pla); + if(!suc) { + //Only log on errors that aren't simply due to ko rules, but quit out regardless + suc = hist.makeBoardMoveTolerant(board,sgfMoves[m].loc,sgfMoves[m].pla,preventEncore); + if(!suc) + logger.write("Illegal move in " + fileName + " turn " + Global::intToString(m) + " move " + Location::toString(sgfMoves[m].loc, board.x_size, board.y_size)); + quitEarly = true; + break; + } + hist.makeBoardMoveAssumeLegal(board,sgfMoves[m].loc,sgfMoves[m].pla,NULL,preventEncore); + nextPla = getOpp(sgfMoves[m].pla); + } + boards.push_back(board); + hists.push_back(hist); + nextPlas.push_back(nextPla); + + if(winLossValues.size() <= 0) + return; + if(shouldStop.load(std::memory_order_acquire)) + return; + + vector futureValue(winLossValues.size()+1); + vector futureLead(winLossValues.size()+1); + vector pastValue(winLossValues.size()); + vector pastLead(winLossValues.size()); + futureValue[winLossValues.size()] = ( + (!quitEarly && sgf->sgfWinner == P_WHITE) ? 1.0 : + (!quitEarly && sgf->sgfWinner == P_BLACK) ? -1.0 : + winLossValues[winLossValues.size()-1] + ); + futureLead[winLossValues.size()] = scoreLeads[winLossValues.size()]; + for(int i = winLossValues.size()-1; i >= 0; i--) { + futureValue[i] = 0.05 * winLossValues[i] + 0.95 * futureValue[i+1]; + futureLead[i] = 0.05 * scoreLeads[i] + 0.95 * futureLead[i+1]; + } + pastValue[0] = winLossValues[0]; + pastLead[0] = scoreLeads[0]; + for(int i = 1; i pastSum + sumThreshold) || + (nextPlas[m] == P_BLACK && futureSum < pastSum - sumThreshold)) { + //Good + } + else + continue; + + Sgf::PositionSample sample; + const int numMovesToRecord = 7; + int startIdx = std::max(0,m-numMovesToRecord); + sample.board = boards[startIdx]; + sample.nextPla = nextPlas[startIdx]; + for(int j = startIdx; j= moveHistorySize) + break; + //If a player played twice in a row, then instead snap so as not to have a move history + //with a double move by the same player. + if(turnsAgoToSnap > 0 && treeHist.moveHistory[moveHistorySize - turnsAgoToSnap - 1].pla == treeHist.moveHistory[moveHistorySize - turnsAgoToSnap].pla) + break; + turnsAgoToSnap++; + } + int startTurn = moveHistorySize - turnsAgoToSnap; + //If the start turn is past the end of the last move, we don't actually have a move we're judging if it's good, so we quit. + if(startTurn >= moveHistorySize) + return; + + //Play moves out until we get back to where we need to be. + //This is hacky and makes everything quadratic, but whatever + Board board = treeHist.initialBoard; + for(int i = 0; icreateRules(); + + //Now play the rest of the moves out, except the last, which we keep as the potential hintloc + int encorePhase = 0; + Player pla = sample.nextPla; + BoardHistory hist(board,pla,rules,encorePhase); + int numSampleMoves = sample.moves.size(); + for(int i = 0; ievaluate(board,hist,pla,nnInputParams,buf,skipCache,includeOwnerMap); + + shared_ptr& nnOutput = buf.result; + + int pos = NNPos::locToPos(sample.hintLoc,board.x_size,nnOutput->nnXLen,nnOutput->nnYLen); + double policyProb = nnOutput->policyProbs[pos]; + + int numTimesToWrite = numTimesToWriteOfPolicy(policyProb,rand); + if(numTimesToWrite <= 0) + return; + + expensiveEvaluateMove( + search, sample.hintLoc, pla, board, hist, + sample, rand, numTimesToWrite + ); + }; + + //Begin writing + std::thread writeLoopThread(writeLoop); + + //In game mode, iterate through sgf games, which are expected to be nonbranching, and see if there are unexpected good moves, + //requiring the outcome in the game to have been good. + if(gameMode) { + const int64_t maxSgfQueueSize = 1024; + ThreadSafeQueue sgfQueue(maxSgfQueueSize); + std::atomic numSgfsBegun(0); + std::atomic numSgfsDone(0); + + auto processSgfLoop = [&sgfFiles,&logger,&processSgfGame,&permutation,&sgfQueue,¶ms,&numSgfsBegun,&numSgfsDone,&nnEval]() { + Rand rand; + string searchRandSeed = Global::uint64ToString(rand.nextUInt64()); + Search* search = new Search(params,nnEval,searchRandSeed); + + while(true) { + if(shouldStop.load(std::memory_order_acquire)) + break; + + int64_t idx; + bool success = sgfQueue.waitPop(idx); + if(!success) + break; + int64_t numBegun = 1+numSgfsBegun.fetch_add(1); + if(numBegun % 20 == 0) + logger.write("Begun " + Global::int64ToString(numBegun) + " sgfs"); + + const string& fileName = sgfFiles[permutation[idx]]; + CompactSgf* sgf = NULL; + try { + sgf = CompactSgf::loadFile(fileName); + } + catch(const StringError& e) { + logger.write("Invalid SGF " + fileName + ": " + e.what()); + continue; + } + + logger.write("Starting " + fileName); + processSgfGame(search,rand,fileName,sgf); + int64_t numDone = 1+numSgfsDone.fetch_add(1); + if(numDone % 20 == 0) + logger.write("Done " + Global::int64ToString(numDone) + " sgfs"); + + delete sgf; + } + + delete search; + }; + + vector threads; + for(int i = 0; i posQueue(maxPosQueueSize); + std::atomic numPosesBegun(0); + std::atomic numPosesDone(0); + + auto processPosLoop = [&logger,&posQueue,¶ms,&numPosesBegun,&numPosesDone,&nnEval,&treePosHandler]() { + Rand rand; + string searchRandSeed = Global::uint64ToString(rand.nextUInt64()); + Search* search = new Search(params,nnEval,searchRandSeed); + + while(true) { + if(shouldStop.load(std::memory_order_acquire)) + break; + + BoardHistory* hist; + bool success = posQueue.waitPop(hist); + if(!success) + break; + int64_t numBegun = 1+numPosesBegun.fetch_add(1); + if(numBegun % 20 == 0) + logger.write("Begun " + Global::int64ToString(numBegun) + " poses"); + + treePosHandler(search, rand, *hist); + + int64_t numDone = 1+numPosesDone.fetch_add(1); + if(numDone % 20 == 0) + logger.write("Done " + Global::int64ToString(numDone) + " poses"); + + delete hist; + } + delete search; + posQueue.setReadOnly(); + }; + + vector threads; + for(int i = 0; i uniqueHashes; + for(int i = 0; ihash)) + continue; + + logger.write("Starting " + fileName); + sgf->iterAllUniquePositions( + uniqueHashes, [&](Sgf::PositionSample& unusedSample, const BoardHistory& hist) { + //Doesn't have enough history, doesn't have hintloc the way we want it + (void)unusedSample; + posQueue.waitPush(new BoardHistory(hist)); + } + ); + delete sgf; + } + + posQueue.setReadOnly(); + + for(int i = 0; iinfo.name)) { + cout << "Skipping tuning " << gpuIdx << " due to same name as an earlier tuned GPU: " << device->info.name << endl; continue; } - alreadyTunedNames.insert(device.info.name); - cout << "Tuning device " << gpuIdx << ": " << device.info.name << endl; + alreadyTunedNames.insert(device->info.name); + cout << "Tuning device " << gpuIdx << ": " << device->info.name << endl; if(outputFile == "") { string dir = OpenCLTuner::defaultDirectory(true); - outputFile = dir + "/" + OpenCLTuner::defaultFileName(device.info.name, nnXLen, nnYLen, &modelDesc); + outputFile = dir + "/" + OpenCLTuner::defaultFileName(device->info.name, nnXLen, nnYLen, &modelDesc); } OpenCLTuneParams initialParams; diff --git a/cpp/configs/analysis_example.cfg b/cpp/configs/analysis_example.cfg index 8aeaf541d..e4e3215e9 100644 --- a/cpp/configs/analysis_example.cfg +++ b/cpp/configs/analysis_example.cfg @@ -1,11 +1,15 @@ # Example config for C++ (non-python) gtp bot # SEE NOTES ABOUT PERFORMANCE AND MEMORY USAGE IN gtp_example.cfg +# SEE NOTES ABOUT numSearchThreads AND OTHER IMPORTANT PARAMS BELOW! # Logs------------------------------------------------------------------------------------ # Where to output log? -logFile = gtp.log +logDir = analysis_logs # Each run of KataGo will log to a separate file in this dir +# logFile = analysis.log # Use this instead of logDir to just specify a single file directly + +# Analysis------------------------------------------------------------------------------------ # Controls the number of moves after the first move in a variation. # analysisPVLen = 15 @@ -13,14 +17,20 @@ logFile = gtp.log # Report winrates for analysis as (BLACK|WHITE|SIDETOMOVE). reportAnalysisWinratesAs = BLACK +# Uncomment and and set to a positive value to make KataGo explore the top move(s) less deeply and accurately, +# but explore and give evaluations to a greater variety of moves, for analysis (does NOT affect play). +# A value like 0.03 or 0.06 will give various mildly but still noticeably wider searches. +# An extreme value like 1 will distribute many playouts across every move on the board, even very bad moves. +# wideRootNoise = 0.0 + # Bot behavior--------------------------------------------------------------------------------------- # Handicap ------------- # Assume that if black makes many moves in a row right at the start of the game, then the game is a handicap game. # This is necessary on some servers and for some GUIs and also when initializing from many SGF files, which may -# set up a handicap games using repeated GTP "play" commands for black rather than GTP "place_free_handicap" commands. -# However, it may also lead to incorrect undersanding of komi if whiteBonusPerHandicapStone = 1 and a server does NOT +# set up a handicap game using repeated GTP "play" commands for black rather than GTP "place_free_handicap" commands. +# However, it may also lead to incorrect understanding of komi if whiteHandicapBonus is used and a server does NOT # have such a practice. # Defaults to true! Uncomment and set to false to disable this behavior. # assumeMultipleStartingBlackMovesAreHandicap = true @@ -47,20 +57,58 @@ maxVisits = 500 # If provided, cap search time at this many seconds # maxTime = 60 -# Number of threads to use in each search in parallel for any SINGLE position. -# NOTE: Analysis engine can specify number of POSITIONS to be able to search in parallel via command line argument -# so this number does not necessarily need to be larger than 1, although you can still set it larger if you prefer -# to analyze fewer positions in parallel but spend more threads on each position. -# Generally, having more threads on a single position will worsen the quality of search slightly, holding fixed the -# number of visits, and thread contention will reduce efficiency, so cross-position parallelization is preferable -# to numSearchThreads, but numSearchThreads is preferable if you want to reduce latency, and have individual -# searches complete faster by doing fewer of them at a time. -numSearchThreads = 1 +# Search threads, batching, GPUs-------------------------------------------------------------------------- + +# numSearchThreads is the number of threads to use in each MCTS tree search in parallel for any individual position. +# But NOTE: Analysis engine also specifies max number of POSITIONS to be able to search in parallel via command line +# argument, -num-analysis-threads. + +# Parallelization across positions is more efficient since the threads on different positions operate +# on different MCTS trees so they don't have to synchronize with each other. Also, multiple threads on the same MCTS +# tree weakens the search (holding playouts fixed) due to out of date statistics on nodes and suboptimal exploration, +# although the loss is still quite small for only 2,4,8 threads. So you often want to keep numSearchThreads small, +# unlike in GTP. + +# But obviously you only get the benefit of parallelization across positions when you actually have lots of positions +# that you are querying at once. + +# Therefore: +# * If you plan to use the analysis engine only for batch processing large numbers of positions, +# it's preferable to set this to only a small number (e.g. 1,2,4) and use a higher -num-analysis-threads. +# * But if you sometimes plan to query the analysis engine for single positions, or otherwise in smaller quantities +# than -num-analysis-threads, or if you plan to be user-interactive such that the response time on some individual +# analysis requests is important to keep low, then set this to a larger number and use somewhat fewer analysis threads, +# That way, individual searches complete faster due to having more threads on each one and doing fewer other ones at a time. + +# For 19x19 boards, weaker GPUs probably want a TOTAL number of threads (numSearchThreads * num-analysis-threads) +# between 4 and 32. Mid-tier GPUs probably between 16 and 64. Strong GPUs probably between 32 and 256. +# But there's no substitute for experimenting and seeing what's best for your hardware and your usage case. +# Keep in mind that the number of threads you want doesn't necessarily have much to do with how many cores you +# have on your system, and could easily exceed the number of cores. GPU batching is (usually) the dominant consideration. +numSearchThreads = 10 + +# nnMaxBatchSize is the max number of positions to send to a single GPU at once. Generally, it should be the case that: +# (number of GPUs you will use * nnMaxBatchSize) >= (numSearchThreads * num-analysis-threads) +# That way, when each threads tries to request a GPU eval, your batch size summed across GPUs is large enough to handle them +# all at once. However, it can be sensible to set this a little smaller if you are limited on GPU memory, +# too large a number may fail if the GPU doesn't have enough memory. +nnMaxBatchSize = 64 + +# Uncomment and set these smaller if you ONLY are going to use the analysis engine for smaller boards (or plan to +# run multiple instances, with some instances only handling smaller boards). It should improve performance. +# It may also mean you can use more threads profitably. +# maxBoardXSizeForNNBuffer = 19 +# maxBoardYSizeForNNBuffer = 19 + +# TO USE MULTIPLE GPUS: +# Uncomment and set this to the number of GPUs you have and/or would like to use... +# AND if it is more than 1, uncomment the appropriate CUDA or OpenCL section below. +# numNNServerThreadsPerModel = 1 -# GPU Settings------------------------------------------------------------------------------- +# Other General GPU Settings------------------------------------------------------------------------------- # Maximum number of positions to send to GPU at once. -nnMaxBatchSize = 128 +nnMaxBatchSize = 64 # Cache up to 2 ** this many neural net evaluations in case of transpositions in the tree. nnCacheSizePowerOfTwo = 23 # Size of mutex pool for nnCache is 2 ** this @@ -69,13 +117,7 @@ nnMutexPoolSizePowerOfTwo = 17 nnRandomize = true -# TO USE MULTIPLE GPUS: -# Set this to the number of GPUs you have and/or would like to use... -# AND if it is more than 1, uncomment the appropriate CUDA or OpenCL section below. -# numNNServerThreadsPerModel = 1 - - -# CUDA GPU settings-------------------------------------- +# CUDA-specific GPU settings-------------------------------------- # These only apply when using the CUDA version of KataGo. # IF USING ONE GPU: optionally uncomment and change this if the GPU you want to use turns out to be not device 0 @@ -100,7 +142,7 @@ nnRandomize = true # cudaUseNHWC = auto -# OpenCL GPU settings-------------------------------------- +# OpenCL-specific GPU settings-------------------------------------- # These only apply when using the OpenCL version of KataGo. # Uncomment to tune OpenCL for every board size separately, rather than only the largest possible size diff --git a/cpp/configs/gtp_example.cfg b/cpp/configs/gtp_example.cfg index 4a24ece23..21759771d 100644 --- a/cpp/configs/gtp_example.cfg +++ b/cpp/configs/gtp_example.cfg @@ -45,7 +45,9 @@ # Logs------------------------------------------------------------------------------------ # Where to output log? -logFile = gtp.log +logDir = gtp_logs # Each run of KataGo will log to a separate file in this dir +# logFile = gtp.log # Use this instead of logDir to just specify a single file directly + # Logging options logAllGTPCommunication = true logSearchInfo = true @@ -58,14 +60,23 @@ logToStderr = false # Chat some stuff to stderr, for use in things like malkovich chat to OGS. # ogsChatToStderr = true +# Analysis------------------------------------------------------------------------------------ + # Configure the maximum length of analysis printed out by lz-analyze and other places. # Controls the number of moves after the first move in a variation. -# analysisPVLen = 13 +# analysisPVLen = 15 # Report winrates for chat and analysis as (BLACK|WHITE|SIDETOMOVE). # Default is SIDETOMOVE, which is what tools that use LZ probably also expect # reportAnalysisWinratesAs = SIDETOMOVE +# Uncomment and and set to a positive value to make KataGo explore the top move(s) less deeply and accurately, +# but explore and give evaluations to a greater variety of moves, for analysis (does NOT affect play). +# A value like 0.03 or 0.06 will give various mildly but still noticeably wider searches. +# An extreme value like 1 will distribute many playouts across every move on the board, even very bad moves. +# analysisWideRootNoise = 0.0 + + # Default rules------------------------------------------------------------------------------------ # See https://lightvector.github.io/KataGo/rules.html for a description of the rules. # These rules are defaults and can be changed mid-run by several custom GTP commands. @@ -116,20 +127,21 @@ resignConsecTurns = 3 # Assume that if black makes many moves in a row right at the start of the game, then the game is a handicap game. # This is necessary on some servers and for some GUIs and also when initializing from many SGF files, which may -# set up a handicap games using repeated GTP "play" commands for black rather than GTP "place_free_handicap" commands. +# set up a handicap game using repeated GTP "play" commands for black rather than GTP "place_free_handicap" commands. # However, it may also lead to incorrect understanding of komi if whiteHandicapBonus is used and a server does NOT # have such a practice. # Defaults to true! Uncomment and set to false to disable this behavior. # assumeMultipleStartingBlackMovesAreHandicap = true -# Makes katago dynamically adjust in handicap or altered-komi games to assume it is stronger or weaker than the opponent -# based on those game settings making sense, greatly improving handicap strength but biasing winrates and scores. +# Makes katago dynamically adjust in handicap or altered-komi games to assume based on those game settings that it +# must be stronger or weaker than the opponent and to play accordingly. Greatly improves handicap +# strength by biasing winrates and scores to favor appropriate safe/aggressive play. # Does NOT affect analysis (lz-analyze, kata-analyze, used by programs like Lizzie) so analysis remains unbiased. # Uncomment and set this to 0 to disable this and make KataGo play the same always. # dynamicPlayoutDoublingAdvantageCapPerOppLead = 0.045 # Instead of a dynamic level, you can uncomment this and set this to a value from -3.0 to 3.0 to set KataGo's aggression to a FIXED level. -# DOES affect analysis (lz-analyze, kata-analyze, used by programs like Lizzie). +# DOES affect analysis tools (lz-analyze, kata-analyze, used by programs like Lizzie). # Negative makes KataGo behave as if it is much weaker than the opponent, preferring to play defensively. # Positive makes KataGo behave as if it is much stronger than the opponent, prefering to play aggressively or even overplay slightly. # If this and "dynamicPlayoutDoublingAdvantageCapPerOppLead" are BOTH set then dynamic will be used for all games and this fixed @@ -164,22 +176,22 @@ resignConsecTurns = 3 # Search limits----------------------------------------------------------------------------------- +# For all of "maxVisits", "maxPlayouts", "maxTime", search will still try to follow GTP time controls and may make a move +# faster than the specified max if GTP tells it that it is playing under a clock as well in the current game. + # If provided, limit maximum number of root visits per search to this much. (With tree reuse, visits do count earlier search) maxVisits = 500 # If provided, limit maximum number of new playouts per search to this much. (With tree reuse, playouts do not count earlier search) # maxPlayouts = 300 -# If provided, cap search time at this many seconds (search will still try to follow GTP time controls) +# If provided, cap search time at this many seconds. # maxTime = 10 # Ponder on the opponent's turn? ponderingEnabled = false +maxTimePondering = 60 # Maximum time to ponder, in seconds. Comment out to make unlimited. +# Note: you can set "maxVisitsPondering" or "maxPlayoutsPondering" too. -# Same limits but for ponder searches if pondering is enabled -# maxVisitsPondering = 1000 -# maxPlayoutsPondering = 1000 -# maxTimePondering = 60 - -# Number of seconds to buffer for lag for GTP time controls +# Number of seconds to buffer for lag for GTP time controls - will move a bit faster assuming there is this much lag per move. lagBuffer = 1.0 # Number of threads to use in search diff --git a/cpp/configs/match_example.cfg b/cpp/configs/match_example.cfg index ca5df7d01..31681ee74 100644 --- a/cpp/configs/match_example.cfg +++ b/cpp/configs/match_example.cfg @@ -14,7 +14,7 @@ # and with numSearchThreads = 1, there should be no problem though, because then the compute time has # no influence on the result of the computation. # -# See gtp_example.cfg for descriptions of most of these params. +# See gtp config for descriptions of most of these params. # # For almost any parameter in this config that is related to a bot, rather than to the match as a whole # (so, visits, search parameters, model files, etc. but NOT the rules, max games, log info, etc) @@ -32,8 +32,8 @@ # # Or, if you were testing different neural nets, with different search configurations, you could do: # -# nnModelFile0 = path/to/first/model/file.txt.gz -# nnModelFile1 = path/to/second/model/file.txt.gz +# nnModelFile0 = path/to/first/model/file.bin.gz +# nnModelFile1 = path/to/second/model/file.bin.gz # # And specify different search parameters for them if you wanted: # cpuctExploration0 = 1.5 diff --git a/cpp/configs/misc/datamining1.cfg b/cpp/configs/misc/datamining1.cfg new file mode 100644 index 000000000..e2ed8219e --- /dev/null +++ b/cpp/configs/misc/datamining1.cfg @@ -0,0 +1,93 @@ + +# Rules------------------------------------------------------------------------------------ + +koRules = SIMPLE,POSITIONAL,SITUATIONAL +scoringRules = AREA,TERRITORY +taxRules = NONE,NONE,SEKI,SEKI,ALL +multiStoneSuicideLegals = false,true +hasButtons = false,false,true + +bSizes = 7,9,11,13,15,17,19, 8,10,12,14,16,18 +bSizeRelProbs = 1,4,3,10,7,9,60, 1,2,4,6,8,10 +allowRectangleProb = 0.00 + +komiAuto = True +komiStdev = 1.0 +handicapProb = 0.10 +handicapCompensateKomiProb = 0.50 +forkCompensateKomiProb = 0.80 +komiBigStdevProb = 0.06 +komiBigStdev = 12.0 + +drawRandRadius = 0.5 +noResultStdev = 0.166666666 + +# Search limits----------------------------------------------------------------------------------- + +maxVisits = 2000 +numSearchThreads = 1 + +# GPU Settings------------------------------------------------------------------------------- + +nnMaxBatchSize = 256 +nnCacheSizePowerOfTwo = 24 +nnMutexPoolSizePowerOfTwo = 18 +numNNServerThreadsPerModel = 1 +nnRandomize = true + +# CUDA GPU settings-------------------------------------- +# cudaDeviceToUse = 0 #use device 0 for all server threads (numNNServerThreadsPerModel) unless otherwise specified per-model or per-thread-per-model +# cudaDeviceToUseModel0 = 3 #use device 3 for model 0 for all threads unless otherwise specified per-thread for this model +# cudaDeviceToUseModel1 = 2 #use device 2 for model 1 for all threads unless otherwise specified per-thread for this model +# cudaDeviceToUseModel0Thread0 = 3 #use device 3 for model 0, server thread 0 +# cudaDeviceToUseModel0Thread1 = 2 #use device 2 for model 0, server thread 1 + +cudaDeviceToUseModel0Thread0 = 0 + +cudaUseFP16 = true +cudaUseNHWC = true + +# Root move selection and biases------------------------------------------------------------------------------ + +chosenMoveTemperatureEarly = 0.75 +chosenMoveTemperatureHalflife = 19 +chosenMoveTemperature = 0.15 +chosenMoveSubtract = 0 +chosenMovePrune = 1 + +rootNoiseEnabled = true +rootDirichletNoiseTotalConcentration = 10.83 +rootDirichletNoiseWeight = 0.25 + +rootDesiredPerChildVisitsCoeff = 2 +rootNumSymmetriesToSample = 4 + +useLcbForSelection = true +lcbStdevs = 5.0 +minVisitPropForLCB = 0.15 + +# Internal params------------------------------------------------------------------------------ + +winLossUtilityFactor = 1.0 +staticScoreUtilityFactor = 0.00 +dynamicScoreUtilityFactor = 0.30 +dynamicScoreCenterZeroWeight = 0.25 +dynamicScoreCenterScale = 0.50 +noResultUtilityForWhite = 0.0 +drawEquivalentWinsForWhite = 0.5 + +rootEndingBonusPoints = 0.5 +rootPruneUselessMoves = true + +rootPolicyTemperatureEarly = 1.25 +rootPolicyTemperature = 1.1 + +cpuctExploration = 1.1 +cpuctExplorationLog = 0.0 +fpuReductionMax = 0.2 +rootFpuReductionMax = 0.0 +fpuUseParentAverage = true +valueWeightExponent = 0.5 + +mutexPoolSize = 64 +numVirtualLossesPerThread = 1 diff --git a/cpp/configs/misc/datamining4.cfg b/cpp/configs/misc/datamining4.cfg new file mode 100644 index 000000000..bffd4ae67 --- /dev/null +++ b/cpp/configs/misc/datamining4.cfg @@ -0,0 +1,96 @@ + +# Rules------------------------------------------------------------------------------------ + +koRules = SIMPLE,POSITIONAL,SITUATIONAL +scoringRules = AREA,TERRITORY +taxRules = NONE,NONE,SEKI,SEKI,ALL +multiStoneSuicideLegals = false,true +hasButtons = false,false,true + +bSizes = 7,9,11,13,15,17,19, 8,10,12,14,16,18 +bSizeRelProbs = 1,4,3,10,7,9,60, 1,2,4,6,8,10 +allowRectangleProb = 0.00 + +komiAuto = True +komiStdev = 1.0 +handicapProb = 0.10 +handicapCompensateKomiProb = 0.50 +forkCompensateKomiProb = 0.80 +komiBigStdevProb = 0.06 +komiBigStdev = 12.0 + +drawRandRadius = 0.5 +noResultStdev = 0.166666666 + +# Search limits----------------------------------------------------------------------------------- + +maxVisits = 2000 +numSearchThreads = 1 + +# GPU Settings------------------------------------------------------------------------------- + +nnMaxBatchSize = 256 +nnCacheSizePowerOfTwo = 24 +nnMutexPoolSizePowerOfTwo = 18 +numNNServerThreadsPerModel = 4 +nnRandomize = true + +# CUDA GPU settings-------------------------------------- +# cudaDeviceToUse = 0 #use device 0 for all server threads (numNNServerThreadsPerModel) unless otherwise specified per-model or per-thread-per-model +# cudaDeviceToUseModel0 = 3 #use device 3 for model 0 for all threads unless otherwise specified per-thread for this model +# cudaDeviceToUseModel1 = 2 #use device 2 for model 1 for all threads unless otherwise specified per-thread for this model +# cudaDeviceToUseModel0Thread0 = 3 #use device 3 for model 0, server thread 0 +# cudaDeviceToUseModel0Thread1 = 2 #use device 2 for model 0, server thread 1 + +cudaDeviceToUseModel0Thread0 = 0 +cudaDeviceToUseModel0Thread1 = 1 +cudaDeviceToUseModel0Thread2 = 2 +cudaDeviceToUseModel0Thread3 = 3 + +cudaUseFP16 = true +cudaUseNHWC = true + +# Root move selection and biases------------------------------------------------------------------------------ + +chosenMoveTemperatureEarly = 0.75 +chosenMoveTemperatureHalflife = 19 +chosenMoveTemperature = 0.15 +chosenMoveSubtract = 0 +chosenMovePrune = 1 + +rootNoiseEnabled = true +rootDirichletNoiseTotalConcentration = 10.83 +rootDirichletNoiseWeight = 0.25 + +rootDesiredPerChildVisitsCoeff = 2 +rootNumSymmetriesToSample = 4 + +useLcbForSelection = true +lcbStdevs = 5.0 +minVisitPropForLCB = 0.15 + +# Internal params------------------------------------------------------------------------------ + +winLossUtilityFactor = 1.0 +staticScoreUtilityFactor = 0.00 +dynamicScoreUtilityFactor = 0.30 +dynamicScoreCenterZeroWeight = 0.25 +dynamicScoreCenterScale = 0.50 +noResultUtilityForWhite = 0.0 +drawEquivalentWinsForWhite = 0.5 + +rootEndingBonusPoints = 0.5 +rootPruneUselessMoves = true + +rootPolicyTemperatureEarly = 1.25 +rootPolicyTemperature = 1.1 + +cpuctExploration = 1.1 +cpuctExplorationLog = 0.0 +fpuReductionMax = 0.2 +rootFpuReductionMax = 0.0 +fpuUseParentAverage = true +valueWeightExponent = 0.5 + +mutexPoolSize = 64 +numVirtualLossesPerThread = 1 diff --git a/cpp/configs/gatekeeper1.cfg b/cpp/configs/training/gatekeeper1.cfg similarity index 100% rename from cpp/configs/gatekeeper1.cfg rename to cpp/configs/training/gatekeeper1.cfg diff --git a/cpp/configs/gatekeeper2a.cfg b/cpp/configs/training/gatekeeper2a.cfg similarity index 100% rename from cpp/configs/gatekeeper2a.cfg rename to cpp/configs/training/gatekeeper2a.cfg diff --git a/cpp/configs/gatekeeper2b.cfg b/cpp/configs/training/gatekeeper2b.cfg similarity index 100% rename from cpp/configs/gatekeeper2b.cfg rename to cpp/configs/training/gatekeeper2b.cfg diff --git a/cpp/configs/gatekeeper2bfaster.cfg b/cpp/configs/training/gatekeeper2bfaster.cfg similarity index 100% rename from cpp/configs/gatekeeper2bfaster.cfg rename to cpp/configs/training/gatekeeper2bfaster.cfg diff --git a/cpp/configs/gatekeeper2c.cfg b/cpp/configs/training/gatekeeper2c.cfg similarity index 100% rename from cpp/configs/gatekeeper2c.cfg rename to cpp/configs/training/gatekeeper2c.cfg diff --git a/cpp/configs/selfplay1.cfg b/cpp/configs/training/selfplay1.cfg similarity index 94% rename from cpp/configs/selfplay1.cfg rename to cpp/configs/training/selfplay1.cfg index b5f58e8bd..2bebdbe3e 100644 --- a/cpp/configs/selfplay1.cfg +++ b/cpp/configs/training/selfplay1.cfg @@ -18,7 +18,8 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true # Play the first few moves of a game high-temperaturely from policy -compensateAfterPolicyInitProb = 0.2 # Additionally make komi fair this often after high-temperature moves. +policyInitAreaProp = 0.04 # The avg number of moves to play +compensateAfterPolicyInitProb = 0.2 # Additionally make komi fair this often after the high-temperature moves. forkSidePositionProb = 0.020 # With this probability, train on refuting bad alternative moves. earlyForkGameProb = 0.05 # Fork to try alternative opening variety with this probability @@ -50,6 +51,7 @@ valueSurpriseDataWeight = 0.1 # This proportion of training weight should be c # startPosesFromSgfDir = DIRECTORYPATH # Load SGFs from this dir # startPosesLoadProb = 1.0 # Only load each position from each SGF with this chance (save memory) # startPosesTurnWeightLambda = 0 # 0 = equal weight 0.01 = decrease probability by 1% per turn -0.01 = increase probability by 1% per turn. +# startPosesPolicyInitAreaProp = 0.0 # Same as policyInitAreaProp but for SGF positions estimateLeadProb = 0.05 # Train lead, rather than just scoremean. Consumes a decent number of extra visits, can be quite slow using low visits to set too high. switchNetsMidGame = true # When a new neural net is loaded, switch to it immediately instead of waiting for new game @@ -78,7 +80,8 @@ komiAuto = True # Automatically adjust komi to what the neural nets think are f komiStdev = 1.0 # Standard deviation of random variation to komi. handicapProb = 0.10 # Probability of handicap game handicapCompensateKomiProb = 0.50 # In handicap games, adjust komi to fair with this probability -forkCompensateKomiProb = 0.80 # For forks and sgfs, adjust komi to fair with this probability +forkCompensateKomiProb = 0.80 # For forks, adjust komi to fair with this probability +sgfCompensateKomiProb = 0.90 # For sgfs, adjust komi to fair with this probability komiBigStdevProb = 0.06 # Probability of applying komiBigStdev komiBigStdev = 12.0 # Standard deviation of random big variation to komi diff --git a/cpp/configs/selfplay2.cfg b/cpp/configs/training/selfplay2.cfg similarity index 97% rename from cpp/configs/selfplay2.cfg rename to cpp/configs/training/selfplay2.cfg index 22446ab47..bbda0a7c0 100644 --- a/cpp/configs/selfplay2.cfg +++ b/cpp/configs/training/selfplay2.cfg @@ -18,6 +18,7 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true +policyInitAreaProp = 0.04 compensateAfterPolicyInitProb = 0.2 forkSidePositionProb = 0.020 @@ -47,6 +48,7 @@ minAsymmetricCompensateKomiProb = 0.4 # startPosesFromSgfDir = DIRECTORYPATH # startPosesLoadProb = 1.0 # startPosesTurnWeightLambda = 0 +# startPosesPolicyInitAreaProp = 0.0 policySurpriseDataWeight = 0.5 valueSurpriseDataWeight = 0.1 @@ -77,6 +79,7 @@ komiStdev = 1.0 handicapProb = 0.10 handicapCompensateKomiProb = 0.50 forkCompensateKomiProb = 0.80 +sgfCompensateKomiProb = 0.90 komiBigStdevProb = 0.06 komiBigStdev = 12.0 diff --git a/cpp/configs/selfplay4.cfg b/cpp/configs/training/selfplay4.cfg similarity index 97% rename from cpp/configs/selfplay4.cfg rename to cpp/configs/training/selfplay4.cfg index e1c2b4587..ec7823d57 100644 --- a/cpp/configs/selfplay4.cfg +++ b/cpp/configs/training/selfplay4.cfg @@ -18,6 +18,7 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true +policyInitAreaProp = 0.04 compensateAfterPolicyInitProb = 0.2 forkSidePositionProb = 0.020 @@ -47,6 +48,7 @@ minAsymmetricCompensateKomiProb = 0.4 # startPosesFromSgfDir = DIRECTORYPATH # startPosesLoadProb = 1.0 # startPosesTurnWeightLambda = 0 +# startPosesPolicyInitAreaProp = 0.0 policySurpriseDataWeight = 0.5 valueSurpriseDataWeight = 0.1 @@ -77,6 +79,7 @@ komiStdev = 1.0 handicapProb = 0.10 handicapCompensateKomiProb = 0.50 forkCompensateKomiProb = 0.80 +sgfCompensateKomiProb = 0.90 komiBigStdevProb = 0.06 komiBigStdev = 12.0 diff --git a/cpp/configs/selfplay8a.cfg b/cpp/configs/training/selfplay8a.cfg similarity index 98% rename from cpp/configs/selfplay8a.cfg rename to cpp/configs/training/selfplay8a.cfg index 4f0e2bd3d..6ad0ee2b8 100644 --- a/cpp/configs/selfplay8a.cfg +++ b/cpp/configs/training/selfplay8a.cfg @@ -18,6 +18,7 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true +policyInitAreaProp = 0.04 compensateAfterPolicyInitProb = 0.2 forkSidePositionProb = 0.020 @@ -47,6 +48,7 @@ minAsymmetricCompensateKomiProb = 0.4 # startPosesFromSgfDir = DIRECTORYPATH # startPosesLoadProb = 1.0 # startPosesTurnWeightLambda = 0 +# startPosesPolicyInitAreaProp = 0.0 policySurpriseDataWeight = 0.5 valueSurpriseDataWeight = 0.1 @@ -77,6 +79,7 @@ komiStdev = 1.0 handicapProb = 0.10 handicapCompensateKomiProb = 0.50 forkCompensateKomiProb = 0.80 +sgfCompensateKomiProb = 0.90 komiBigStdevProb = 0.06 komiBigStdev = 12.0 diff --git a/cpp/configs/selfplay8b.cfg b/cpp/configs/training/selfplay8b.cfg similarity index 98% rename from cpp/configs/selfplay8b.cfg rename to cpp/configs/training/selfplay8b.cfg index bb78acacb..a35172bdf 100644 --- a/cpp/configs/selfplay8b.cfg +++ b/cpp/configs/training/selfplay8b.cfg @@ -18,6 +18,7 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true +policyInitAreaProp = 0.04 compensateAfterPolicyInitProb = 0.2 forkSidePositionProb = 0.020 @@ -47,6 +48,7 @@ minAsymmetricCompensateKomiProb = 0.4 # startPosesFromSgfDir = DIRECTORYPATH # startPosesLoadProb = 1.0 # startPosesTurnWeightLambda = 0 +# startPosesPolicyInitAreaProp = 0.0 policySurpriseDataWeight = 0.5 valueSurpriseDataWeight = 0.1 @@ -77,6 +79,7 @@ komiStdev = 1.0 handicapProb = 0.10 handicapCompensateKomiProb = 0.50 forkCompensateKomiProb = 0.80 +sgfCompensateKomiProb = 0.90 komiBigStdevProb = 0.06 komiBigStdev = 12.0 diff --git a/cpp/configs/selfplay8b20.cfg b/cpp/configs/training/selfplay8b20.cfg similarity index 96% rename from cpp/configs/selfplay8b20.cfg rename to cpp/configs/training/selfplay8b20.cfg index 08aa6533b..e44d06087 100644 --- a/cpp/configs/selfplay8b20.cfg +++ b/cpp/configs/training/selfplay8b20.cfg @@ -18,6 +18,7 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true +policyInitAreaProp = 0.04 compensateAfterPolicyInitProb = 0.2 forkSidePositionProb = 0.020 @@ -45,8 +46,13 @@ minAsymmetricCompensateKomiProb = 0.4 # startPosesProb = 0.0 # startPosesFromSgfDir = DIRECTORYPATH +# startPosesSgfExcludes = DIRECTORYPATH # startPosesLoadProb = 1.0 # startPosesTurnWeightLambda = 0 +# startPosesPolicyInitAreaProp = 0.0 + +# hintPosesProb = 0.0 +# hintPosesDir = DIRECTORYPATH policySurpriseDataWeight = 0.5 valueSurpriseDataWeight = 0.1 @@ -77,6 +83,7 @@ komiStdev = 1.0 handicapProb = 0.10 handicapCompensateKomiProb = 0.50 forkCompensateKomiProb = 0.80 +sgfCompensateKomiProb = 0.90 komiBigStdevProb = 0.06 komiBigStdev = 12.0 diff --git a/cpp/configs/selfplay8c.cfg b/cpp/configs/training/selfplay8c.cfg similarity index 98% rename from cpp/configs/selfplay8c.cfg rename to cpp/configs/training/selfplay8c.cfg index f77b66151..60e73b4ff 100644 --- a/cpp/configs/selfplay8c.cfg +++ b/cpp/configs/training/selfplay8c.cfg @@ -18,6 +18,7 @@ validationProp = 0.00 # Fancy game selfplay settings-------------------------------------------------------------------- initGamesWithPolicy = true +policyInitAreaProp = 0.04 compensateAfterPolicyInitProb = 0.2 forkSidePositionProb = 0.020 @@ -47,6 +48,7 @@ minAsymmetricCompensateKomiProb = 0.4 # startPosesFromSgfDir = DIRECTORYPATH # startPosesLoadProb = 1.0 # startPosesTurnWeightLambda = 0 +# startPosesPolicyInitAreaProp = 0.0 policySurpriseDataWeight = 0.5 valueSurpriseDataWeight = 0.1 @@ -77,6 +79,7 @@ komiStdev = 1.0 handicapProb = 0.10 handicapCompensateKomiProb = 0.50 forkCompensateKomiProb = 0.80 +sgfCompensateKomiProb = 0.90 komiBigStdevProb = 0.06 komiBigStdev = 12.0 diff --git a/cpp/core/rand.h b/cpp/core/rand.h index 878e16e3c..091f3116a 100644 --- a/cpp/core/rand.h +++ b/cpp/core/rand.h @@ -279,7 +279,7 @@ inline double Rand::nextGaussian() inline double Rand::nextExponential() { double r = 0.0; - while(r <= 1e-16) + while(r <= 1e-17) r = nextDouble(); return -log(r); } diff --git a/cpp/dataio/sgf.cpp b/cpp/dataio/sgf.cpp index 93ec82e34..fb620570f 100644 --- a/cpp/dataio/sgf.cpp +++ b/cpp/dataio/sgf.cpp @@ -2,7 +2,10 @@ #include "../core/sha2.h" +#include "../external/nlohmann_json/json.hpp" + using namespace std; +using json = nlohmann::json; SgfNode::SgfNode() :props(NULL),move(0,0,C_EMPTY) @@ -250,6 +253,17 @@ Rules SgfNode::getRulesFromRUTagOrFail() const { return parsed; } +Player SgfNode::getSgfWinner() const { + if(!hasProperty("RE")) + return C_EMPTY; + string s = Global::toLower(getSingleProperty("RE")); + if(Global::isPrefix(s,"b+") || Global::isPrefix(s,"black+")) + return P_BLACK; + if(Global::isPrefix(s,"w+") || Global::isPrefix(s,"white+")) + return P_WHITE; + return C_EMPTY; +} + Sgf::Sgf() {} Sgf::~Sgf() { @@ -319,11 +333,32 @@ float Sgf::getKomi() const { bool suc = Global::tryStringToFloat(nodes[0]->getSingleProperty("KM"), komi); if(!suc) propertyFail("Could not parse komi in sgf"); - if(!Rules::komiIsIntOrHalfInt(komi)) - propertyFail("Komi in sgf is not integer or half-integer"); + + if(!Rules::komiIsIntOrHalfInt(komi)) { + //Hack - if the komi is a quarter integer and it looks like a Chines GoGoD file, then double komi and accept + if(Rules::komiIsIntOrHalfInt(komi*2.0f) && nodes[0]->hasProperty("US") && nodes[0]->hasProperty("RU") && + Global::isPrefix(nodes[0]->getSingleProperty("US"),"GoGoD") && + Global::toLower(nodes[0]->getSingleProperty("RU")) == "chinese") + komi *= 2.0f; + else + propertyFail("Komi in sgf is not integer or half-integer"); + } return komi; } +int Sgf::getHandicapValue() const { + checkNonEmpty(nodes); + //Default, if SGF doesn't specify + if(!nodes[0]->hasProperty("HA")) + return 0; + + int handicapValue = 0; + bool suc = Global::tryStringToInt(nodes[0]->getSingleProperty("HA"), handicapValue); + if(!suc) + propertyFail("Could not parse handicap value in sgf"); + return handicapValue; +} + bool Sgf::hasRules() const { checkNonEmpty(nodes); return nodes[0]->hasProperty("RU"); @@ -376,7 +411,8 @@ void Sgf::getMovesHelper(vector& moves, int xSize, int ySize) const { void Sgf::loadAllUniquePositions( std::set& uniqueHashes, vector& samples ) const { - std::function f = [&samples](PositionSample& sample) { + std::function f = [&samples](PositionSample& sample, const BoardHistory& hist) { + (void)hist; samples.push_back(sample); }; @@ -384,9 +420,13 @@ void Sgf::loadAllUniquePositions( } void Sgf::iterAllUniquePositions( - std::set& uniqueHashes, std::function f + std::set& uniqueHashes, std::function f ) const { - Board board; + XYSize size = getXYSize(); + int xSize = size.x; + int ySize = size.y; + + Board board(xSize,ySize); Player nextPla = nodes.size() > 0 ? nodes[0]->getPLSpecifiedColor() : C_EMPTY; if(nextPla == C_EMPTY) nextPla = C_BLACK; @@ -395,10 +435,6 @@ void Sgf::iterAllUniquePositions( rules.multiStoneSuicideLegal = true; BoardHistory hist(board,nextPla,rules,0); - XYSize size = getXYSize(); - int xSize = size.x; - int ySize = size.y; - PositionSample sampleBuf; iterAllUniquePositionsHelper(board,hist,nextPla,rules,xSize,ySize,sampleBuf,0,uniqueHashes,f); } @@ -409,7 +445,7 @@ void Sgf::iterAllUniquePositionsHelper( PositionSample& sampleBuf, int initialTurnNumber, std::set& uniqueHashes, - std::function f + std::function f ) const { vector buf; for(int i = 0; i& uniqueHashes, - std::function f + std::function f ) const { //If the game is over or there were two consecutive passes, skip if(hist.isGameFinished || ( @@ -522,7 +558,93 @@ void Sgf::samplePositionIfUniqueHelper( for(int i = startTurn; i= '0' && str[i] <= '9') + x += str[i] - '0'; + else if(str[i] >= 'a' && str[i] <= 'f') + x += str[i] - 'a' + 10; + else if(str[i] >= 'A' && str[i] <= 'F') + x += str[i] - 'A' + 10; + else + assert(false); + } + return x; +} + +set Sgf::readExcludes(const vector& files) { + set excludeHashes; + for(int i = 0; i hashes = Global::readFileLines(excludeHashesFile,'\n'); + for(int64_t j = 0; j < hashes.size(); j++) { + const string& hash128 = Global::trim(Global::stripComments(hashes[j])); + if(hash128.length() <= 0) + continue; + if(hash128.length() != 32) + throw IOError("Could not parse hashpair in exclude hashes file: " + hash128); + + uint64_t hash0 = parseHex64(hash128.substr(0,16)); + uint64_t hash1 = parseHex64(hash128.substr(16,16)); + excludeHashes.insert(Hash128(hash0,hash1)); + } + } + return excludeHashes; +} + +string Sgf::PositionSample::toJsonLine(const Sgf::PositionSample& sample) { + json data; + data["xSize"] = sample.board.x_size; + data["ySize"] = sample.board.y_size; + data["board"] = Board::toStringSimple(sample.board,'/'); + data["nextPla"] = PlayerIO::playerToStringShort(sample.nextPla); + vector moveLocs; + vector movePlas; + for(size_t i = 0; i(); + int ySize = data["ySize"].get(); + sample.board = Board::parseBoard(xSize,ySize,data["board"].get(),'/'); + sample.nextPla = PlayerIO::parsePlayer(data["nextPla"].get()); + vector moveLocs = data["moveLocs"].get>(); + vector movePlas = data["movePlas"].get>(); + if(moveLocs.size() != movePlas.size()) + throw StringError("moveLocs.size() != movePlas.size()"); + for(size_t i = 0; i(); + sample.hintLoc = Location::ofString(data["hintLoc"].get(),sample.board); + } + catch(nlohmann::detail::exception& e) { + throw StringError("Error parsing position sample json\n" + s + "\n" + e.what()); + } + return sample; } //PARSING--------------------------------------------------------------------- @@ -826,6 +948,8 @@ CompactSgf::CompactSgf(const Sgf* sgf) checkNonEmpty(sgf->nodes); rootNode = *(sgf->nodes[0]); + + sgfWinner = rootNode.getSgfWinner(); } CompactSgf::CompactSgf(Sgf&& sgf) @@ -858,6 +982,8 @@ CompactSgf::CompactSgf(Sgf&& sgf) delete sgf.children[i]; sgf.children[i] = NULL; } + + sgfWinner = rootNode.getSgfWinner(); } CompactSgf::~CompactSgf() { @@ -1117,6 +1243,8 @@ void WriteSgf::writeSgf( out << "," << "mode=handicap"; else if(gameData->mode == FinishedGameData::MODE_SGFPOS) out << "," << "mode=sgfpos"; + else if(gameData->mode == FinishedGameData::MODE_HINTPOS) + out << "," << "mode=hintpos"; else out << "," << "mode=other"; diff --git a/cpp/dataio/sgf.h b/cpp/dataio/sgf.h index 1c33f5d3a..9ba4f65ab 100644 --- a/cpp/dataio/sgf.h +++ b/cpp/dataio/sgf.h @@ -32,6 +32,7 @@ struct SgfNode { Color getPLSpecifiedColor() const; Rules getRulesFromRUTagOrFail() const; + Player getSgfWinner() const; }; struct Sgf { @@ -56,6 +57,7 @@ struct Sgf { float getKomi() const; bool hasRules() const; Rules getRulesOrFail() const; + int getHandicapValue() const; void getPlacements(std::vector& moves, int xSize, int ySize) const; void getMoves(std::vector& moves, int xSize, int ySize) const; @@ -70,6 +72,11 @@ struct Sgf { std::vector moves; //Turn number as of the start of board. int initialTurnNumber; + //Hinted move that may be good at the end of position sample, or Board::NULL_LOC + Loc hintLoc; + + static std::string toJsonLine(const PositionSample& sample); + static PositionSample ofJsonLine(const std::string& s); }; //Loads SGF all unique positions in ALL branches of that SGF. @@ -78,7 +85,9 @@ struct Sgf { //May raise an exception on illegal moves or other SGF issues, only partially appending things on to the boards and hists. void loadAllUniquePositions(std::set& uniqueHashes, std::vector& samples) const; //f is allowed to mutate and consume sample. - void iterAllUniquePositions(std::set& uniqueHashes, std::function f) const; + void iterAllUniquePositions(std::set& uniqueHashes, std::function f) const; + + static std::set readExcludes(const std::vector& files); private: void getMovesHelper(std::vector& moves, int xSize, int ySize) const; @@ -90,16 +99,15 @@ struct Sgf { PositionSample& sampleBuf, int initialTurnNumber, std::set& uniqueHashes, - std::function f + std::function f ) const; void samplePositionIfUniqueHelper( Board& board, BoardHistory& hist, Player nextPla, PositionSample& sampleBuf, int initialTurnNumber, std::set& uniqueHashes, - std::function f + std::function f ) const; - }; struct CompactSgf { @@ -111,6 +119,7 @@ struct CompactSgf { int ySize; int depth; float komi; + Player sgfWinner; Hash128 hash; CompactSgf(const Sgf* sgf); diff --git a/cpp/dataio/trainingwrite.h b/cpp/dataio/trainingwrite.h index c2576eede..4abe6e51d 100644 --- a/cpp/dataio/trainingwrite.h +++ b/cpp/dataio/trainingwrite.h @@ -74,6 +74,7 @@ struct FinishedGameData { std::vector sidePositions; std::vector changedNeuralNets; + static constexpr int MODE_HINTPOS = 5; static constexpr int MODE_NORMAL = 0; static constexpr int MODE_CLEANUP_TRAINING = 1; static constexpr int MODE_FORK = 2; diff --git a/cpp/game/board.cpp b/cpp/game/board.cpp index 5c05bbcd1..2c48f3116 100644 --- a/cpp/game/board.cpp +++ b/cpp/game/board.cpp @@ -2237,6 +2237,16 @@ string PlayerIO::playerToString(Color c) } } +string PlayerIO::playerToStringShort(Color c) +{ + switch(c) { + case C_BLACK: return "B"; + case C_WHITE: return "W"; + case C_EMPTY: return "E"; + default: return ""; + } +} + bool PlayerIO::tryParsePlayer(const string& s, Player& pla) { string str = Global::toLower(s); if(str == "black" || str == "b") { @@ -2250,6 +2260,14 @@ bool PlayerIO::tryParsePlayer(const string& s, Player& pla) { return false; } +Player PlayerIO::parsePlayer(const string& s) { + Player pla = C_EMPTY; + bool suc = tryParsePlayer(s,pla); + if(!suc) + throw StringError("Could not parse player: " + s); + return pla; +} + string Location::toStringMach(Loc loc, int x_size) { if(loc == Board::PASS_LOC) @@ -2446,9 +2464,25 @@ ostream& operator<<(ostream& out, const Board& board) { } +string Board::toStringSimple(const Board& board, char lineDelimiter) { + string s; + for(int y = 0; y < board.y_size; y++) { + for(int x = 0; x < board.x_size; x++) { + Loc loc = Location::getLoc(x,y,board.x_size); + s += PlayerIO::colorToChar(board.colors[loc]); + } + s += lineDelimiter; + } + return s; +} + Board Board::parseBoard(int xSize, int ySize, const string& s) { + return parseBoard(xSize,ySize,s,'\n'); +} + +Board Board::parseBoard(int xSize, int ySize, const string& s, char lineDelimiter) { Board board(xSize,ySize); - vector lines = Global::split(Global::trim(s),'\n'); + vector lines = Global::split(Global::trim(s),lineDelimiter); //Throw away coordinate labels line if it exists if(lines.size() == ySize+1 && Global::isPrefix(lines[0],"A")) diff --git a/cpp/game/board.h b/cpp/game/board.h index baf194014..3e44f773f 100644 --- a/cpp/game/board.h +++ b/cpp/game/board.h @@ -32,8 +32,10 @@ static inline Color getOpp(Color c) //Conversions for players and colors namespace PlayerIO { char colorToChar(Color c); + std::string playerToStringShort(Player p); std::string playerToString(Player p); bool tryParsePlayer(const std::string& s, Player& pla); + Player parsePlayer(const std::string& s); } //Location of a point on the board @@ -241,7 +243,9 @@ struct Board void checkConsistency() const; static Board parseBoard(int xSize, int ySize, const std::string& s); + static Board parseBoard(int xSize, int ySize, const std::string& s, char lineDelimiter); static void printBoard(std::ostream& out, const Board& board, Loc markLoc, const std::vector* hist); + static std::string toStringSimple(const Board& board, char lineDelimiter); //Data-------------------------------------------- diff --git a/cpp/main.cpp b/cpp/main.cpp index f730888ee..14d193524 100644 --- a/cpp/main.cpp +++ b/cpp/main.cpp @@ -56,7 +56,6 @@ runselfplayinittests : Run some tests involving selfplay training init using a n runsekitrainwritetests : Run some tests involving seki train output ---Dev/experimental subcommands------------- -nnerror demoplay lzcost matchauto @@ -109,6 +108,8 @@ static int handleSubcommand(const string& subcommand, int argc, const char* argv return MainCmds::runsekitrainwritetests(argc-1,&argv[1]); else if(subcommand == "runnnonmanyposestest") return MainCmds::runnnonmanyposestest(argc-1,&argv[1]); + else if(subcommand == "dataminesgfs") + return MainCmds::dataminesgfs(argc-1,&argv[1]); else if(subcommand == "lzcost") return MainCmds::lzcost(argc-1,&argv[1]); else if(subcommand == "demoplay") @@ -164,11 +165,11 @@ int main(int argc, const char* argv[]) { string Version::getKataGoVersion() { - return string("1.3.5"); + return string("1.4.2"); } string Version::getKataGoVersionForHelp() { - return string("KataGo v1.3.5"); + return string("KataGo v1.4.2"); } string Version::getKataGoVersionFullInfo() { diff --git a/cpp/main.h b/cpp/main.h index cbd16ac5a..9b9183c02 100644 --- a/cpp/main.h +++ b/cpp/main.h @@ -24,6 +24,7 @@ namespace MainCmds { int runnnonmanyposestest(int argc, const char* const* argv); int runownershiptests(int argc, const char* const* argv); + int dataminesgfs(int argc, const char* const* argv); int lzcost(int argc, const char* const* argv); int demoplay(int argc, const char* const* argv); int printclockinfo(int argc, const char* const* argv); diff --git a/cpp/neuralnet/desc.cpp b/cpp/neuralnet/desc.cpp index 5223a1f46..25800f8f0 100644 --- a/cpp/neuralnet/desc.cpp +++ b/cpp/neuralnet/desc.cpp @@ -1123,7 +1123,7 @@ void ModelDesc::loadFromFileMaybeGZipped(const string& fileName, ModelDesc& desc bool binaryFloats = true; descBuf = std::move(ModelDesc(in,binaryFloats)); } - else if(Global::isSuffix(lower,".txt.gz") || Global::isSuffix(lower,".bin.gz")) { + else if(Global::isSuffix(lower,".txt.gz") || Global::isSuffix(lower,".bin.gz") || Global::isSuffix(lower,".gz")) { string* compressed = new string(); readEntireFileIntoString(fileName,*compressed); @@ -1189,16 +1189,34 @@ void ModelDesc::loadFromFileMaybeGZipped(const string& fileName, ModelDesc& desc //Free up memory for compressed string delete compressed; - //Now, initialize an istream to read from the string - NonCopyingStreamBuf uncompressedStreamBuf(uncompressed); - std::istream uncompressedIn(&uncompressedStreamBuf); - - //And read in the model desc - bool binaryFloats = Global::isSuffix(lower,".bin.gz"); - descBuf = std::move(ModelDesc(uncompressedIn,binaryFloats)); + bool binaryFloats = !Global::isSuffix(lower,".txt.gz"); + try { + //Now, initialize an istream to read from the string + NonCopyingStreamBuf uncompressedStreamBuf(uncompressed); + std::istream uncompressedIn(&uncompressedStreamBuf); + //And read in the model desc + descBuf = std::move(ModelDesc(uncompressedIn,binaryFloats)); + } + catch(const StringError& e) { + //On failure, try again to read as a .txt.gz file if the extension was ambiguous + bool tryAgain = binaryFloats && !Global::isSuffix(lower,".bin.gz"); + if(!tryAgain) + throw; + else { + binaryFloats = false; + try { + NonCopyingStreamBuf uncompressedStreamBuf(uncompressed); + std::istream uncompressedIn(&uncompressedStreamBuf); + descBuf = std::move(ModelDesc(uncompressedIn,binaryFloats)); + } + catch(const StringError& e2) { + throw StringError(string("Could neither parse .gz model as .txt.gz model nor as .bin.gz model, errors were:\n") + e2.what() + "\n" + e.what()); + } + } + } } else { - throw StringError("Model file should end with .txt, .bin, .txt.gz, or .bin.gz. (Do NOT rename the file to have such an extension. If it doesn't have such an extension already, it's probably the wrong file, renaming will not help)."); + throw StringError("Model file should end with .txt, .bin, .txt.gz, .bin.gz, or possibly just .gz. (If it doesn't have one of these extensions already, it's probably the wrong file, renaming will probably NOT help)."); } } catch(const StringError& e) { diff --git a/cpp/neuralnet/dummybackend.cpp b/cpp/neuralnet/dummybackend.cpp index 87e90e22e..5f12d8c83 100644 --- a/cpp/neuralnet/dummybackend.cpp +++ b/cpp/neuralnet/dummybackend.cpp @@ -50,7 +50,7 @@ void NeuralNet::freeLoadedModel(LoadedModel* loadedModel) { throw StringError("Dummy neural net backend: NeuralNet::freeLoadedModel unimplemented"); } -string getModelName(const LoadedModel* loadedModel) { +string NeuralNet::getModelName(const LoadedModel* loadedModel) { (void)loadedModel; throw StringError("Dummy neural net backend: NeuralNet::getModelName unimplemented"); } diff --git a/cpp/neuralnet/nneval.cpp b/cpp/neuralnet/nneval.cpp index 549b21298..84727a5a1 100644 --- a/cpp/neuralnet/nneval.cpp +++ b/cpp/neuralnet/nneval.cpp @@ -198,6 +198,13 @@ bool NNEvaluator::isNeuralNetLess() const { int NNEvaluator::getMaxBatchSize() const { return maxNumRows; } +int NNEvaluator::getNumGpus() const { + std::set gpuIdxs; + for(int i = 0; iuniqueDeviceNamesToUse.size(); i++) { const string& name = devicesContext->uniqueDeviceNamesToUse[i]; - vector devicesForName = devicesContext->findDevicesToUseWithName(name); + vector devicesForName = devicesContext->findDevicesToUseWithName(name); vector deviceIdsForName = devicesContext->findDeviceIdsToUseWithName(name); assert(devicesForName.size() > 0); assert(deviceIdsForName.size() > 0); - + for(int j = 1; jinfo.platformId != devicesForName[0]->info.platformId) { + logger->write("WARNING: Two GPUs/devices in use have identical names but different platform ids... probably things will fail shortly"); + logger->write("Device " + Global::intToString(devicesForName[0]->info.gpuIdx) + " Platform " + devicesForName[0]->info.platformDesc); + logger->write("Device " + Global::intToString(devicesForName[j]->info.gpuIdx) + " Platform " + devicesForName[j]->info.platformDesc); + } + } //In case we need to autotune, use the 0th device with that name that the user wants us to use - OpenCLTuneParams tuneParams = getParamsForDeviceName(name, devicesForName[0].info.gpuIdx); - CompiledPrograms* compiledPrograms = new CompiledPrograms(devicesContext->context, deviceIdsForName, tuneParams); + //Assume that they all use the same opencl context too since if they have the same name they should be the same platform + OpenCLTuneParams tuneParams = getParamsForDeviceName(name, devicesForName[0]->info.gpuIdx); + CompiledPrograms* compiledPrograms = new CompiledPrograms(devicesForName[0]->context, deviceIdsForName, tuneParams); compiledProgramsByDeviceName[name] = compiledPrograms; } } @@ -341,10 +348,10 @@ struct ComputeHandleInternal { ComputeHandleInternal(ComputeContext* ctx, int gpuIdx, bool inputsUseNHWC) { computeContext = ctx; - clContext = computeContext->devicesContext->context; - const InitializedDevice& device = computeContext->devicesContext->findGpuExn(gpuIdx); - commandQueue = device.commandQueue; - CompiledPrograms* progs = computeContext->compiledProgramsByDeviceName[device.info.name]; + const InitializedDevice* device = computeContext->devicesContext->findGpuExn(gpuIdx); + clContext = device->context; + commandQueue = device->commandQueue; + CompiledPrograms* progs = computeContext->compiledProgramsByDeviceName[device->info.name]; assert(progs != NULL); tuneParams = progs->tuneParams; diff --git a/cpp/neuralnet/openclhelpers.cpp b/cpp/neuralnet/openclhelpers.cpp index f6e0f7c18..59a21b719 100644 --- a/cpp/neuralnet/openclhelpers.cpp +++ b/cpp/neuralnet/openclhelpers.cpp @@ -181,9 +181,14 @@ void OpenCLHelpers::blockingReadBuffer(cl_command_queue commandQueue, cl_mem src } vector DeviceInfo::getAllDeviceInfosOnSystem(Logger* logger) { + //Some opencl headers/implementations are buggy and have more platforms or more devices than they + //say their maximum is, so just add a buffer. + static constexpr size_t maxPlatforms = MAX_PLATFORMS + 128; + static constexpr size_t maxDevices = MAX_DEVICES + 1024; + cl_int err; cl_uint numPlatforms; - vector platformIds(MAX_PLATFORMS); + vector platformIds(maxPlatforms); err = clGetPlatformIDs(platformIds.size(), platformIds.data(), &numPlatforms); CHECK_ERR(err); assert(numPlatforms <= platformIds.size()); @@ -195,31 +200,35 @@ vector DeviceInfo::getAllDeviceInfosOnSystem(Logger* logger) { buf[i] = '\0'; int numDevicesTotal = 0; - vector deviceIds(MAX_DEVICES); + vector deviceIds(maxDevices); + vector platformIdsForDevices; + vector platformDescsForDevices; for(int platformIdx = 0; platformIdx < numPlatforms && numDevicesTotal < deviceIds.size(); platformIdx++) { size_t sizeRet; + cl_platform_id platformId = platformIds[platformIdx]; - err = clGetPlatformInfo(platformIds[platformIdx], CL_PLATFORM_NAME, bufLen, buf.data(), &sizeRet); + err = clGetPlatformInfo(platformId, CL_PLATFORM_NAME, bufLen, buf.data(), &sizeRet); assert(sizeRet < bufLen-1); CHECK_ERR(err); string name = string(buf.data()); - err = clGetPlatformInfo(platformIds[platformIdx], CL_PLATFORM_VENDOR, bufLen, buf.data(), &sizeRet); + err = clGetPlatformInfo(platformId, CL_PLATFORM_VENDOR, bufLen, buf.data(), &sizeRet); assert(sizeRet < bufLen-1); CHECK_ERR(err); string vendor = string(buf.data()); - err = clGetPlatformInfo(platformIds[platformIdx], CL_PLATFORM_VERSION, bufLen, buf.data(), &sizeRet); + err = clGetPlatformInfo(platformId, CL_PLATFORM_VERSION, bufLen, buf.data(), &sizeRet); assert(sizeRet < bufLen-1); CHECK_ERR(err); string version = string(buf.data()); + string desc = name + " (" + vendor + ") (" + version + ")"; if(logger != NULL) - logger->write("Found OpenCL Platform " + Global::intToString(platformIdx) + ": " + name + " (" + vendor + ") (" + version + ")"); + logger->write("Found OpenCL Platform " + Global::intToString(platformIdx) + ": " + desc); cl_uint numDevices; err = clGetDeviceIDs( - platformIds[platformIdx], CL_DEVICE_TYPE_CPU | CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_ACCELERATOR, deviceIds.size() - numDevicesTotal, + platformId, CL_DEVICE_TYPE_CPU | CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_ACCELERATOR, deviceIds.size() - numDevicesTotal, deviceIds.data() + numDevicesTotal, &numDevices); //Allow there to be 0 devices on this platform, just move on to the next if(err == CL_DEVICE_NOT_FOUND) { @@ -228,9 +237,14 @@ vector DeviceInfo::getAllDeviceInfosOnSystem(Logger* logger) { continue; } + for(size_t i = 0; i < numDevices; i++) { + platformIdsForDevices.push_back(platformId); + platformDescsForDevices.push_back(desc); + } + CHECK_ERR(err); - assert(numDevices <= deviceIds.size()); numDevicesTotal += numDevices; + assert(numDevicesTotal <= deviceIds.size()); if(logger != NULL) logger->write("Found " + Global::intToString(numDevices) + " device(s) on platform " + Global::intToString(platformIdx) + " with type CPU or GPU or Accelerator"); } @@ -299,11 +313,17 @@ vector DeviceInfo::getAllDeviceInfosOnSystem(Logger* logger) { } if(logger != NULL) - logger->write("Found OpenCL Device " + Global::intToString(gpuIdx) + ": " + name + " (" + vendor + ")" + " (score " + Global::intToString(defaultDesirability) + ")"); + logger->write( + "Found OpenCL Device " + Global::intToString(gpuIdx) + + ": " + name + " (" + vendor + ")" + " (score " + + Global::intToString(defaultDesirability) + ")" + ); DeviceInfo info; info.gpuIdx = gpuIdx; info.deviceId = deviceIds[gpuIdx]; + info.platformId = platformIdsForDevices[gpuIdx]; + info.platformDesc = platformDescsForDevices[gpuIdx]; info.name = name; info.vendor = vendor; info.deviceType = deviceType; @@ -320,7 +340,8 @@ vector DeviceInfo::getAllDeviceInfosOnSystem(Logger* logger) { DevicesContext::DevicesContext(const vector& allDeviceInfos, const vector& gIdxsToUse, Logger* logger, bool enableProfiling) - : devicesToUse(), + : initializedPlatforms(), + devicesToUse(), uniqueDeviceNamesToUse() { defaultGpuIdx = 0; @@ -360,30 +381,72 @@ DevicesContext::DevicesContext(const vector& allDeviceInfos, const v deviceIdsToUse.push_back(allDeviceInfos[gpuIdx].deviceId); } - cl_int err; - cl_context_properties* properties = NULL; - cl_uint numDevicesToUse = (cl_uint)deviceIdsToUse.size(); - context = clCreateContext(properties, numDevicesToUse, deviceIdsToUse.data(), NULL, NULL, &err); - CHECK_ERR(err); + for(size_t i = 0; iplatformId = platformId; + initializedPlatform->platformDesc = deviceInfo.platformDesc; + initializedPlatforms[platformId] = initializedPlatform; + } + InitializedPlatform* initializedPlatform = initializedPlatforms[platformId]; + initializedPlatform->deviceIdsToUseForThisPlatform.push_back(deviceId); + } + + for(auto iter = initializedPlatforms.begin(); iter != initializedPlatforms.end(); ++iter) { + InitializedPlatform* initializedPlatform = iter->second; + cl_platform_id platformId = initializedPlatform->platformId; + initializedPlatform->properties.push_back(CL_CONTEXT_PLATFORM); + initializedPlatform->properties.push_back((cl_context_properties)platformId); + initializedPlatform->properties.push_back(0); + + string message = + "Creating context for OpenCL Platform: " + initializedPlatform->platformDesc; + if(logger != NULL) { + logger->write(message); + if(!logger->isLoggingToStdout() && !logger->isLoggingToStderr()) + cerr << message << endl; + } + + cl_int err; + initializedPlatform->context = clCreateContext( + initializedPlatform->properties.data(), + initializedPlatform->deviceIdsToUseForThisPlatform.size(), + initializedPlatform->deviceIdsToUseForThisPlatform.data(), + NULL, + NULL, + &err + ); + CHECK_ERR(err); + } for(size_t i = 0; icontext; + //TODO - someday, maybe consider CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE + cl_int err; cl_command_queue commandQueue; if(enableProfiling) - commandQueue = clCreateCommandQueue(context, deviceIdsToUse[i], CL_QUEUE_PROFILING_ENABLE, &err); + commandQueue = clCreateCommandQueue(context, deviceId, CL_QUEUE_PROFILING_ENABLE, &err); else - commandQueue = clCreateCommandQueue(context, deviceIdsToUse[i], 0, &err); + commandQueue = clCreateCommandQueue(context, deviceId, 0, &err); CHECK_ERR(err); - InitializedDevice device; - device.info = allDeviceInfos[gpuIdxsToUse[i]]; - device.commandQueue = commandQueue; + InitializedDevice* device = new InitializedDevice(); + device->info = deviceInfo; + device->context = context; + device->commandQueue = commandQueue; devicesToUse.push_back(device); string message = - "Using OpenCL Device " + Global::intToString(gpuIdxsToUse[i]) + ": " + device.info.name + - " (" + device.info.vendor + ") " + - device.info.openCLVersion; + "Using OpenCL Device " + Global::intToString(gpuIdxsToUse[i]) + ": " + device->info.name + + " (" + device->info.vendor + ") " + + device->info.openCLVersion; if(logger != NULL) { logger->write(message); if(!logger->isLoggingToStdout() && !logger->isLoggingToStderr()) @@ -392,44 +455,52 @@ DevicesContext::DevicesContext(const vector& allDeviceInfos, const v } for(size_t i = 0; iinfo.name)) continue; - uniqueDeviceNamesToUse.push_back(devicesToUse[i].info.name); + uniqueDeviceNamesToUse.push_back(devicesToUse[i]->info.name); } } DevicesContext::~DevicesContext() { for(int i = 0; icommandQueue); + clFinish(device->commandQueue); + clReleaseCommandQueue(device->commandQueue); + delete device; + } + + for(auto iter = initializedPlatforms.begin(); iter != initializedPlatforms.end(); ++iter) { + InitializedPlatform* initializedPlatform = iter->second; + clReleaseContext(initializedPlatform->context); + delete initializedPlatform; } - clReleaseContext(context); } -const InitializedDevice& DevicesContext::findGpuExn(int gpuIdx) const { +const InitializedDevice* DevicesContext::findGpuExn(int gpuIdx) const { if(gpuIdx == -1) gpuIdx = defaultGpuIdx; for(int i = 0; iinfo.gpuIdx == gpuIdx) return devicesToUse[i]; } throw StringError("BUG? Attempted to create ComputeHandle for a gpuIdx that was not part of the DevicesContext: " + Global::intToString(gpuIdx)); } -vector DevicesContext::findDevicesToUseWithName(const string& name) const { - vector devices; +vector DevicesContext::findDevicesToUseWithName(const string& name) const { + vector devices; for(int i = 0; iinfo.name == name) { devices.push_back(devicesToUse[i]); + } } return devices; } vector DevicesContext::findDeviceIdsToUseWithName(const string& name) const { vector deviceIds; for(int i = 0; iinfo.name == name) + deviceIds.push_back(devicesToUse[i]->info.deviceId); } return deviceIds; } diff --git a/cpp/neuralnet/openclhelpers.h b/cpp/neuralnet/openclhelpers.h index ca83c4893..a0d1b153b 100644 --- a/cpp/neuralnet/openclhelpers.h +++ b/cpp/neuralnet/openclhelpers.h @@ -14,6 +14,8 @@ struct DeviceInfo { int gpuIdx; cl_device_id deviceId; + cl_platform_id platformId; + std::string platformDesc; std::string name; std::string vendor; cl_device_type deviceType; @@ -27,20 +29,29 @@ struct DeviceInfo { static std::vector getAllDeviceInfosOnSystem(Logger* logger); }; +struct InitializedPlatform { + cl_context context; + cl_platform_id platformId; + std::string platformDesc; + std::vector properties; + std::vector deviceIdsToUseForThisPlatform; +}; + struct InitializedDevice { DeviceInfo info; + cl_context context; cl_command_queue commandQueue; }; //Wrapper around cl_context for sharing initialization code struct DevicesContext { - cl_context context; - //Index of the default device to use if not specified (user-provided gpuIdx == -1) int defaultGpuIdx; + //All platforms with for which we made a context, for freeing each exactly once in destructor + std::map initializedPlatforms; //Filtered and initialized subset of allDeviceInfos - std::vector devicesToUse; + std::vector devicesToUse; //All unique names of devices being used std::vector uniqueDeviceNamesToUse; @@ -53,9 +64,9 @@ struct DevicesContext { //Given the gpuIdx, find the initialized device of that GPU. Fails if it was not a gpuIdx provided in //gpuIdxsToUse upon creation of this DevicesContext. - const InitializedDevice& findGpuExn(int gpuIdx) const; + const InitializedDevice* findGpuExn(int gpuIdx) const; //Find devices being used with a given name - std::vector findDevicesToUseWithName(const std::string& name) const; + std::vector findDevicesToUseWithName(const std::string& name) const; std::vector findDeviceIdsToUseWithName(const std::string& name) const; }; diff --git a/cpp/neuralnet/opencltuner.cpp b/cpp/neuralnet/opencltuner.cpp index 54340f752..9b900e7bb 100644 --- a/cpp/neuralnet/opencltuner.cpp +++ b/cpp/neuralnet/opencltuner.cpp @@ -660,10 +660,10 @@ void OpenCLTuner::tune( ostream& out, std::function handleBestSoFar ) { - const InitializedDevice& device = devicesContext.findGpuExn(gpuIdx); - const cl_context& context = devicesContext.context; - cl_command_queue commandQueue = device.commandQueue; - const vector& deviceIdsToUse = { device.info.deviceId }; + const InitializedDevice* device = devicesContext.findGpuExn(gpuIdx); + const cl_context& context = device->context; + cl_command_queue commandQueue = device->commandQueue; + const vector& deviceIdsToUse = { device->info.deviceId }; OpenCLTuneParams untunedConfig = OpenCLTuneParams(); OpenCLTuneParams currentConfig = initialConfig; @@ -1591,7 +1591,7 @@ OpenCLTuneParams OpenCLTuner::loadOrAutoTune( cerr << "No existing tuning parameters found or parseable or valid at: " << openCLTunerFile << endl; cerr << "Performing autotuning" << endl; } - + OpenCLTuneParams results; auto handleBestSoFar = [&results](const OpenCLTuneParams& bestSoFar) { results = bestSoFar; @@ -1630,7 +1630,7 @@ OpenCLTuneParams OpenCLTuner::loadOrAutoTune( logger->write("Done tuning, saved results to " + openCLTunerFile); if(logger == NULL || (!logger->isLoggingToStdout() && !logger->isLoggingToStderr())) cerr << "Done tuning, saved results to " << openCLTunerFile << endl; - + return results; } diff --git a/cpp/program/gtpconfig.cpp b/cpp/program/gtpconfig.cpp index 2d20d06e4..097fc7679 100644 --- a/cpp/program/gtpconfig.cpp +++ b/cpp/program/gtpconfig.cpp @@ -7,20 +7,31 @@ static const string gtpBase = R"%%( # Logs------------------------------------------------------------------------------------ # Where to output log? -logFile = gtp.log +logDir = gtp_logs # Each run of KataGo will log to a separate file in this dir +# logFile = gtp.log # Use this instead of logDir to just specify a single file directly + # Logging options logAllGTPCommunication = true logSearchInfo = true logToStderr = false +# Analysis------------------------------------------------------------------------------------ + # Configure the maximum length of analysis printed out by lz-analyze and other places. # Controls the number of moves after the first move in a variation. -# analysisPVLen = 13 +# analysisPVLen = 15 # Report winrates for chat and analysis as (BLACK|WHITE|SIDETOMOVE). # Default is SIDETOMOVE, which is what tools that use LZ probably also expect # reportAnalysisWinratesAs = SIDETOMOVE +# Uncomment and and set to a positive value to make KataGo explore the top move(s) less deeply and accurately, +# but explore and give evaluations to a greater variety of moves, for analysis (does NOT affect play). +# A value like 0.03 or 0.06 will give various mildly but still noticeably wider searches. +# An extreme value like 1 will distribute many playouts across every move on the board, even very bad moves. +# analysisWideRootNoise = 0.0 + + # Default rules------------------------------------------------------------------------------------ # See https://lightvector.github.io/KataGo/rules.html for a description of the rules. # These rules are defaults and can be changed mid-run by several custom GTP commands. @@ -87,17 +98,21 @@ resignConsecTurns = 3 # Search limits----------------------------------------------------------------------------------- +# For all of "maxVisits", "maxPlayouts", "maxTime", search will still try to follow GTP time controls and may make a move +# faster than the specified max if GTP tells it that it is playing under a clock as well in the current game. + # If provided, limit maximum number of root visits per search to this much. (With tree reuse, visits do count earlier search) $$MAX_VISITS # If provided, limit maximum number of new playouts per search to this much. (With tree reuse, playouts do not count earlier search) $$MAX_PLAYOUTS -# If provided, cap search time at this many seconds (search will still try to follow GTP time controls) +# If provided, cap search time at this many seconds. $$MAX_TIME # Ponder on the opponent's turn? $$PONDERING +# Note: you can also set "maxVisitsPondering" or "maxPlayoutsPondering" too. -# Number of seconds to buffer for lag for GTP time controls +# Number of seconds to buffer for lag for GTP time controls - will move a bit faster assuming there is this much lag per move. lagBuffer = 1.0 # Number of threads to use in search @@ -182,15 +197,15 @@ string GTPConfig::makeConfig( else { ASSERT_UNREACHABLE; } if(maxVisits < ((int64_t)1 << 50)) replace("$$MAX_VISITS", "maxVisits = " + Global::int64ToString(maxVisits)); - else replace("$$MAX_VISITS", "#maxVisits = 500"); + else replace("$$MAX_VISITS", "# maxVisits = 500"); if(maxPlayouts < ((int64_t)1 << 50)) replace("$$MAX_PLAYOUTS", "maxPlayouts = " + Global::int64ToString(maxPlayouts)); - else replace("$$MAX_PLAYOUTS", "#maxPlayouts = 300"); + else replace("$$MAX_PLAYOUTS", "# maxPlayouts = 300"); if(maxTime < 1e20) replace("$$MAX_TIME", "maxTime = " + Global::doubleToString(maxTime)); - else replace("$$MAX_TIME", "#maxTime = 10"); + else replace("$$MAX_TIME", "# maxTime = 10"); - if(maxPonderTime <= 0) replace("$$PONDERING", "ponderingEnabled = false\n#maxTimePondering = 60"); + if(maxPonderTime <= 0) replace("$$PONDERING", "ponderingEnabled = false\n# maxTimePondering = 60"); else if(maxPonderTime < 1e20) replace("$$PONDERING", "ponderingEnabled = true\nmaxTimePondering = " + Global::doubleToString(maxPonderTime)); - else replace("$$PONDERING", "ponderingEnabled = true\n#maxTimePondering = 60"); + else replace("$$PONDERING", "ponderingEnabled = true\n# maxTimePondering = 60"); replace("$$NUM_SEARCH_THREADS", Global::intToString(numSearchThreads)); replace("$$NN_CACHE_SIZE_POWER_OF_TWO", Global::intToString(nnCacheSizePowerOfTwo)); diff --git a/cpp/program/play.cpp b/cpp/program/play.cpp index d1604cc5e..72a1f369b 100644 --- a/cpp/program/play.cpp +++ b/cpp/program/play.cpp @@ -218,15 +218,39 @@ void GameInitializer::initShared(ConfigParser& cfg, Logger& logger) { komiAuto = cfg.contains("komiAuto") ? cfg.getBool("komiAuto") : false; forkCompensateKomiProb = cfg.contains("forkCompensateKomiProb") ? cfg.getDouble("forkCompensateKomiProb",0.0,1.0) : handicapCompensateKomiProb; + sgfCompensateKomiProb = cfg.contains("sgfCompensateKomiProb") ? cfg.getDouble("sgfCompensateKomiProb",0.0,1.0) : forkCompensateKomiProb; komiAllowIntegerProb = cfg.contains("komiAllowIntegerProb") ? cfg.getDouble("komiAllowIntegerProb",0.0,1.0) : 1.0; + auto generateCumProbs = [](const vector poses, double lambda) { + int minInitialTurnNumber = 0; + for(size_t i = 0; i cumProbs; + cumProbs.resize(poses.size()); + for(size_t i = 0; i -1e200 && cumProbs[i] < 1e200)) { + throw StringError("startPos found bad unnormalized probability: " + Global::doubleToString(cumProbs[i])); + } + } + for(size_t i = 1; i dirs = Global::split(cfg.getString("startPosesFromSgfDir"),','); + vector excludes = Global::split(cfg.contains("startPosesSgfExcludes") ? cfg.getString("startPosesSgfExcludes") : "",','); double startPosesLoadProb = cfg.getDouble("startPosesLoadProb",0.0,1.0); double startPosesTurnWeightLambda = cfg.getDouble("startPosesTurnWeightLambda",-10,10); @@ -234,36 +258,40 @@ void GameInitializer::initShared(ConfigParser& cfg, Logger& logger) { std::function fileFilter = [](const string& fileName) { return Global::isSuffix(fileName,".sgf"); }; - Global::collectFiles(dir, fileFilter, files); - logger.write("Found " + Global::uint64ToString(files.size()) + " sgf files in " + dir); + for(int i = 0; i 0) + Global::collectFiles(dir, fileFilter, files); + } + std::set excludeHashes = Sgf::readExcludes(excludes); + logger.write("Found " + Global::uint64ToString(files.size()) + " sgf files"); + logger.write("Loaded " + Global::uint64ToString(excludeHashes.size()) + " excludes"); std::set uniqueHashes; - std::function posHandler = [startPosesLoadProb,this](Sgf::PositionSample& posSample) { + std::function posHandler = [startPosesLoadProb,this](Sgf::PositionSample& posSample, const BoardHistory& hist) { + (void)hist; if(rand.nextBool(startPosesLoadProb)) startPoses.push_back(posSample); }; + int64_t numExcluded = 0; for(size_t i = 0; iiterAllUniquePositions(uniqueHashes, posHandler); - delete sgf; - } - logger.write("Loaded " + Global::uint64ToString(startPoses.size()) + " start positions from " + dir); - - int minInitialTurnNumber = 0; - for(size_t i = 0; i -1e200 && startPosCumProbs[i] < 1e200)) { - throw StringError("startPos found bad unnormalized probability: " + Global::doubleToString(startPosCumProbs[i])); + Sgf* sgf = NULL; + try { + sgf = Sgf::loadFile(files[i]); + if(contains(excludeHashes,sgf->hash)) + numExcluded += 1; + else + sgf->iterAllUniquePositions(uniqueHashes, posHandler); + } + catch(const StringError& e) { + logger.write("Invalid SGF " + files[i] + ": " + e.what()); } + if(sgf != NULL) + delete sgf; } - for(size_t i = 1; i dirs = Global::split(cfg.getString("hintPosesDir"),','); + + vector files; + std::function fileFilter = [](const string& fileName) { + return Global::isSuffix(fileName,".hintposes.txt"); + }; + for(int i = 0; i 0) + Global::collectFiles(dir, fileFilter, files); + } + + for(size_t i = 0; i lines = Global::readFileLines(files[i],'\n'); + for(size_t j = 0; j 0) { + try { + Sgf::PositionSample posSample = Sgf::PositionSample::ofJsonLine(line); + hintPoses.push_back(posSample); + } + catch(const StringError& err) { + logger.write(string("ERROR parsing hintpos: ") + err.what()); + } + } + } + } + logger.write("Loaded " + Global::uint64ToString(hintPoses.size()) + " hint positions"); + + hintPosCumProbs = generateCumProbs(hintPoses, 0.0); + + if(hintPoses.size() <= 0) { + logger.write("No hint positions loaded, disabling hint position logic"); + hintPosesProb = 0; + } + else { + logger.write("Cumulative unnormalized probability for hint poses: " + Global::doubleToString(hintPosCumProbs[hintPoses.size()-1])); + } + } + if(allowedBSizes.size() <= 0) throw IOError("bSizes must have at least one value in " + cfg.getFileName()); if(allowedBSizes.size() != allowedBSizeRelProbs.size()) @@ -341,6 +415,35 @@ Rules GameInitializer::randomizeScoringAndTaxRules(Rules rules, Rand& randToUse) return rules; } +bool GameInitializer::isAllowedBSize(int xSize, int ySize) { + if(!contains(allowedBSizes,xSize)) + return false; + if(!contains(allowedBSizes,ySize)) + return false; + if(allowRectangleProb <= 0.0 && xSize != ySize) + return false; + return true; +} + +Rules GameInitializer::createRules() { + lock_guard lock(createGameMutex); + return createRulesUnsynchronized(); +} + +Rules GameInitializer::createRulesUnsynchronized() { + Rules rules; + rules.koRule = allowedKoRules[rand.nextUInt(allowedKoRules.size())]; + rules.scoringRule = allowedScoringRules[rand.nextUInt(allowedScoringRules.size())]; + rules.taxRule = allowedTaxRules[rand.nextUInt(allowedTaxRules.size())]; + rules.multiStoneSuicideLegal = allowedMultiStoneSuicideLegals[rand.nextUInt(allowedMultiStoneSuicideLegals.size())]; + + if(rules.scoringRule == Rules::SCORING_AREA) + rules.hasButton = allowedButtons[rand.nextUInt(allowedButtons.size())]; + else + rules.hasButton = false; + return rules; +} + void GameInitializer::createGameSharedUnsynchronized( Board& board, Player& pla, BoardHistory& hist, ExtraBlackAndKomi& extraBlackAndKomi, @@ -363,8 +466,11 @@ void GameInitializer::createGameSharedUnsynchronized( assert(extraBlackAndKomi.extraBlack == 0); hist.setKomi(extraBlackAndKomi.komi); otherGameProps.isSgfPos = false; + otherGameProps.isHintPos = false; otherGameProps.allowPolicyInit = false; //On initial positions, don't play extra moves at start otherGameProps.isFork = true; + otherGameProps.hintLoc = Board::NULL_LOC; + otherGameProps.hintTurn = -1; extraBlackAndKomi.makeGameFair = rand.nextBool(forkCompensateKomiProb); extraBlackAndKomi.makeGameFairForEmptyBoard = false; return; @@ -377,30 +483,39 @@ void GameInitializer::createGameSharedUnsynchronized( if(allowRectangleProb > 0 && rand.nextBool(allowRectangleProb)) ySizeIdx = rand.nextUInt(allowedBSizeRelProbs.data(),allowedBSizeRelProbs.size()); - Rules rules; - rules.koRule = allowedKoRules[rand.nextUInt(allowedKoRules.size())]; - rules.scoringRule = allowedScoringRules[rand.nextUInt(allowedScoringRules.size())]; - rules.taxRule = allowedTaxRules[rand.nextUInt(allowedTaxRules.size())]; - rules.multiStoneSuicideLegal = allowedMultiStoneSuicideLegals[rand.nextUInt(allowedMultiStoneSuicideLegals.size())]; - - if(rules.scoringRule == Rules::SCORING_AREA) - rules.hasButton = allowedButtons[rand.nextUInt(allowedButtons.size())]; - else - rules.hasButton = false; + Rules rules = createRulesUnsynchronized(); + const Sgf::PositionSample* posSample = NULL; if(startPosesProb > 0 && rand.nextBool(startPosesProb)) { assert(startPoses.size() > 0); size_t r = rand.nextIndexCumulative(startPosCumProbs.data(),startPosCumProbs.size()); assert(r < startPosCumProbs.size()); - const Sgf::PositionSample& startPos = startPoses[r]; + posSample = &(startPoses[r]); + } + else if(hintPosesProb > 0 && rand.nextBool(hintPosesProb)) { + assert(hintPoses.size() > 0); + size_t r = rand.nextIndexCumulative(hintPosCumProbs.data(),hintPosCumProbs.size()); + assert(r < hintPosCumProbs.size()); + posSample = &(hintPoses[r]); + } + if(posSample != NULL) { + const Sgf::PositionSample& startPos = *posSample; board = startPos.board; pla = startPos.nextPla; hist.clear(board,pla,rules,0); hist.setInitialTurnNumber(startPos.initialTurnNumber); + Loc hintLoc = startPos.hintLoc; for(size_t i = 0; i 0 ? handicapCompensateKomiProb : 0.0; } @@ -943,13 +1065,15 @@ struct SearchLimitsThisMove { //game, they make the playouts *actually* vary instead of only making the neural net think they do. double playoutDoublingAdvantage; Player playoutDoublingAdvantagePla; + + Loc hintLoc; }; static SearchLimitsThisMove getSearchLimitsThisMove( const Search* toMoveBot, Player pla, const PlaySettings& playSettings, Rand& gameRand, const vector& historicalMctsWinLossValues, bool clearBotBeforeSearch, - OtherGameProperties otherGameProps + const OtherGameProperties& otherGameProps ) { bool doAlterVisitsPlayouts = false; int64_t numAlterVisits = toMoveBot->searchParams.maxVisits; @@ -959,8 +1083,21 @@ static SearchLimitsThisMove getSearchLimitsThisMove( float targetWeight = 1.0f; double playoutDoublingAdvantage = 0.0; Player playoutDoublingAdvantagePla = C_EMPTY; + Loc hintLoc = Board::NULL_LOC; + + if(otherGameProps.hintLoc != Board::NULL_LOC) { + const BoardHistory& hist = toMoveBot->getRootHist(); + if(otherGameProps.hintTurn == hist.moveHistory.size() && + otherGameProps.hintPosHash == toMoveBot->getRootBoard().pos_hash) { + hintLoc = otherGameProps.hintLoc; + doAlterVisitsPlayouts = true; + double cap = (double)((int64_t)1L << 50); + numAlterVisits = (int64_t)ceil(std::min(cap, numAlterVisits * 4.0)); + numAlterPlayouts = (int64_t)ceil(std::min(cap, numAlterPlayouts * 4.0)); + } + } - if(playSettings.cheapSearchProb > 0.0 && gameRand.nextBool(playSettings.cheapSearchProb)) { + if(hintLoc == Board::NULL_LOC && playSettings.cheapSearchProb > 0.0 && gameRand.nextBool(playSettings.cheapSearchProb)) { if(playSettings.cheapSearchVisits <= 0) throw StringError("playSettings.cheapSearchVisits <= 0"); if(playSettings.cheapSearchVisits > toMoveBot->searchParams.maxVisits || @@ -978,7 +1115,7 @@ static SearchLimitsThisMove getSearchLimitsThisMove( removeRootNoise = true; } } - else if(playSettings.reduceVisits) { + else if(hintLoc == Board::NULL_LOC && playSettings.reduceVisits) { if(playSettings.reducedVisitsMin <= 0) throw StringError("playSettings.reducedVisitsMin <= 0"); if(playSettings.reducedVisitsMin > toMoveBot->searchParams.maxVisits || @@ -1050,6 +1187,7 @@ static SearchLimitsThisMove getSearchLimitsThisMove( limits.targetWeight = targetWeight; limits.playoutDoublingAdvantage = playoutDoublingAdvantage; limits.playoutDoublingAdvantagePla = playoutDoublingAdvantagePla; + limits.hintLoc = hintLoc; return limits; } @@ -1102,8 +1240,15 @@ static Loc runBotWithLimits( toMoveBot->runWholeSearchAndGetMove(pla,logger); toMoveBot->searchParams.maxVisits = oldMaxVisits; } + + if(limits.hintLoc != Board::NULL_LOC) + toMoveBot->setRootHintLoc(limits.hintLoc); + loc = toMoveBot->runWholeSearchAndGetMove(pla,logger); + if(limits.hintLoc != Board::NULL_LOC) + toMoveBot->setRootHintLoc(Board::NULL_LOC); + toMoveBot->searchParams = oldParams; } else { @@ -1248,6 +1393,8 @@ FinishedGameData* Play::runGame( gameData->mode = FinishedGameData::MODE_HANDICAP; if(otherGameProps.isSgfPos) gameData->mode = FinishedGameData::MODE_SGFPOS; + if(otherGameProps.isHintPos) + gameData->mode = FinishedGameData::MODE_HINTPOS; if(otherGameProps.isFork) gameData->mode = FinishedGameData::MODE_FORK; @@ -1274,11 +1421,13 @@ FinishedGameData* Play::runGame( }; if(playSettings.initGamesWithPolicy && otherGameProps.allowPolicyInit) { - double proportionOfBoardArea = 1.0 / 25.0; - double temperature = 1.0; - initializeGameUsingPolicy(botB, botW, board, hist, pla, gameRand, doEndGameIfAllPassAlive, proportionOfBoardArea, temperature); - if(playSettings.compensateAfterPolicyInitProb > 0.0 && gameRand.nextBool(playSettings.compensateAfterPolicyInitProb)) { - PlayUtils::adjustKomiToEven(botB,botW,board,hist,pla,playSettings.compensateKomiVisits,logger,otherGameProps,gameRand); + double proportionOfBoardArea = otherGameProps.isSgfPos ? playSettings.startPosesPolicyInitAreaProp : playSettings.policyInitAreaProp; + if(proportionOfBoardArea > 0) { + double temperature = 1.0; + initializeGameUsingPolicy(botB, botW, board, hist, pla, gameRand, doEndGameIfAllPassAlive, proportionOfBoardArea, temperature); + if(playSettings.compensateAfterPolicyInitProb > 0.0 && gameRand.nextBool(playSettings.compensateAfterPolicyInitProb)) { + PlayUtils::adjustKomiToEven(botB,botW,board,hist,pla,playSettings.compensateKomiVisits,logger,otherGameProps,gameRand); + } } } @@ -1503,6 +1652,12 @@ FinishedGameData* Play::runGame( } gameData->whiteValueTargetsByTurn.push_back(finalValueTargets); + //If we had a hintloc, then don't trust the first value, it will be corrupted a bit by the forced playouts. + //Just copy the next turn's value. + if(otherGameProps.hintLoc != Board::NULL_LOC) { + gameData->whiteValueTargetsByTurn[0] = gameData->whiteValueTargetsByTurn[std::min((size_t)1,gameData->whiteValueTargetsByTurn.size()-1)]; + } + assert(gameData->finalWhiteScoring == NULL); gameData->finalWhiteScoring = new float[Board::MAX_ARR_SIZE]; NNInputs::fillScoring(board,gameData->finalOwnership,hist.rules.taxRule == Rules::TAX_ALL,gameData->finalWhiteScoring); @@ -1935,6 +2090,47 @@ void Play::maybeSekiForkGame( } } +void Play::maybeHintForkGame( + const FinishedGameData* finishedGameData, + ForkData* forkData, + const OtherGameProperties& otherGameProps +) { + if(forkData == NULL) + return; + //Just for conceptual simplicity, don't early fork games that started in the encore + if(finishedGameData->startHist.encorePhase != 0) + return; + bool hintFork = + otherGameProps.hintLoc != Board::NULL_LOC && + finishedGameData->startBoard.pos_hash == otherGameProps.hintPosHash && + finishedGameData->startHist.moveHistory.size() == otherGameProps.hintTurn && + finishedGameData->endHist.moveHistory.size() > finishedGameData->startHist.moveHistory.size() && + finishedGameData->endHist.moveHistory[finishedGameData->startHist.moveHistory.size()].loc != otherGameProps.hintLoc; + + if(!hintFork) + return; + + Board board; + Player pla; + BoardHistory hist; + replayGameUpToMove(finishedGameData, finishedGameData->startHist.moveHistory.size(), finishedGameData->startHist.rules, board, hist, pla); + //Just in case if somehow the game is over now, don't actually do anything + if(hist.isGameFinished) + return; + + if(!hist.isLegal(board,otherGameProps.hintLoc,pla)) + return; + + hist.makeBoardMoveAssumeLegal(board,otherGameProps.hintLoc,pla,NULL); + pla = getOpp(pla); + + //If the game is over now, don't actually do anything + if(hist.isGameFinished) + return; + forkData->add(new InitialPosition(board,hist,pla)); +} + + GameRunner::GameRunner(ConfigParser& cfg, PlaySettings pSettings, Logger& logger) :logSearchInfo(),logMoves(),maxMovesPerGame(),clearBotBeforeSearch(), playSettings(pSettings), @@ -2073,6 +2269,7 @@ FinishedGameData* GameRunner::runGame( if(!usedSekiForkHackPosition) { Play::maybeSekiForkGame(finishedGameData, forkData, playSettings, gameInit, gameRand); } + Play::maybeHintForkGame(finishedGameData, forkData, otherGameProps); if(botW != botB) delete botW; diff --git a/cpp/program/play.h b/cpp/program/play.h index 47a9afe9f..1800a2acb 100644 --- a/cpp/program/play.h +++ b/cpp/program/play.h @@ -49,9 +49,14 @@ struct ExtraBlackAndKomi { struct OtherGameProperties { bool isSgfPos = false; + bool isHintPos = false; bool allowPolicyInit = true; bool isFork = false; + int hintTurn = -1; + Hash128 hintPosHash; + Loc hintLoc = Board::NULL_LOC; + //Note: these two behave slightly differently than the ones in searchParams - as properties for the whole //game, they make the playouts *actually* vary instead of only making the neural net think they do. double playoutDoublingAdvantage = 0.0; @@ -93,6 +98,10 @@ class GameInitializer { Rules randomizeScoringAndTaxRules(Rules rules, Rand& randToUse) const; + //Only sample the space of possible rules + Rules createRules(); + bool isAllowedBSize(int xSize, int ySize); + private: void initShared(ConfigParser& cfg, Logger& logger); void createGameSharedUnsynchronized( @@ -102,6 +111,7 @@ class GameInitializer { const PlaySettings& playSettings, OtherGameProperties& otherGameProps ); + Rules createRulesUnsynchronized(); std::mutex createGameMutex; Rand rand; @@ -127,6 +137,7 @@ class GameInitializer { double handicapProb; double handicapCompensateKomiProb; double forkCompensateKomiProb; + double sgfCompensateKomiProb; double komiBigStdevProb; float komiBigStdev; bool komiAuto; @@ -138,6 +149,10 @@ class GameInitializer { std::vector startPoses; std::vector startPosCumProbs; double startPosesProb; + + std::vector hintPoses; + std::vector hintPosCumProbs; + double hintPosesProb; }; @@ -255,6 +270,13 @@ namespace Play { const GameInitializer* gameInit, Rand& gameRand ); + + void maybeHintForkGame( + const FinishedGameData* finishedGameData, + ForkData* forkData, + const OtherGameProperties& otherGameProps + ); + } diff --git a/cpp/program/playsettings.cpp b/cpp/program/playsettings.cpp index 7bbccc9a7..bd12cfefb 100644 --- a/cpp/program/playsettings.cpp +++ b/cpp/program/playsettings.cpp @@ -1,7 +1,8 @@ #include "../program/playsettings.h" PlaySettings::PlaySettings() - :initGamesWithPolicy(false),compensateAfterPolicyInitProb(0.0),forkSidePositionProb(0.0), + :initGamesWithPolicy(false),policyInitAreaProp(0.0),startPosesPolicyInitAreaProp(0.0), + compensateAfterPolicyInitProb(0.0),forkSidePositionProb(0.0), compensateKomiVisits(20),estimateLeadVisits(10),estimateLeadProb(0.0), earlyForkGameProb(0.0),earlyForkGameExpectedMoveProp(0.0),forkGameProb(0.0),forkGameMinChoices(1),earlyForkGameMaxChoices(1),forkGameMaxChoices(1), sekiForkHack(false),fancyKomiVarying(false), @@ -37,6 +38,8 @@ PlaySettings PlaySettings::loadForGatekeeper(ConfigParser& cfg) { PlaySettings PlaySettings::loadForSelfplay(ConfigParser& cfg) { PlaySettings playSettings; playSettings.initGamesWithPolicy = cfg.getBool("initGamesWithPolicy"); + playSettings.policyInitAreaProp = cfg.contains("policyInitAreaProp") ? cfg.getDouble("policyInitAreaProp",0.0,1.0) : 0.04; + playSettings.startPosesPolicyInitAreaProp = cfg.contains("startPosesPolicyInitAreaProp") ? cfg.getDouble("startPosesPolicyInitAreaProp",0.0,1.0) : 0.0; playSettings.compensateAfterPolicyInitProb = cfg.getDouble("compensateAfterPolicyInitProb",0.0,1.0); playSettings.forkSidePositionProb = cfg.getDouble("forkSidePositionProb",0.0,1.0); diff --git a/cpp/program/playsettings.h b/cpp/program/playsettings.h index bf91569cb..39e76cb50 100644 --- a/cpp/program/playsettings.h +++ b/cpp/program/playsettings.h @@ -6,6 +6,8 @@ struct PlaySettings { //Play a bunch of mostly policy-distributed moves at the start to initialize a game. bool initGamesWithPolicy; + double policyInitAreaProp; //Avg number of moves is this * board area + double startPosesPolicyInitAreaProp; //Avg number of moves when using a starting position from sgf double compensateAfterPolicyInitProb; //Chance to adjust komi to cancel the effect of imbalanced init //Occasionally try some alternative moves and search the responses to them. double forkSidePositionProb; diff --git a/cpp/program/setup.cpp b/cpp/program/setup.cpp index 4a00734e3..53c1195c4 100644 --- a/cpp/program/setup.cpp +++ b/cpp/program/setup.cpp @@ -312,13 +312,13 @@ vector Setup::loadParams( if(cfg.contains("maxPlayoutsPondering"+idxStr)) params.maxPlayoutsPondering = cfg.getInt64("maxPlayoutsPondering"+idxStr, (int64_t)1, (int64_t)1 << 50); else if(cfg.contains("maxPlayoutsPondering")) params.maxPlayoutsPondering = cfg.getInt64("maxPlayoutsPondering", (int64_t)1, (int64_t)1 << 50); - else params.maxPlayoutsPondering = params.maxPlayouts; + else params.maxPlayoutsPondering = (int64_t)1 << 50; if(cfg.contains("maxVisitsPondering"+idxStr)) params.maxVisitsPondering = cfg.getInt64("maxVisitsPondering"+idxStr, (int64_t)1, (int64_t)1 << 50); else if(cfg.contains("maxVisitsPondering")) params.maxVisitsPondering = cfg.getInt64("maxVisitsPondering", (int64_t)1, (int64_t)1 << 50); - else params.maxVisitsPondering = params.maxVisits; + else params.maxVisitsPondering = (int64_t)1 << 50; if(cfg.contains("maxTimePondering"+idxStr)) params.maxTimePondering = cfg.getDouble("maxTimePondering"+idxStr, 0.0, 1.0e20); else if(cfg.contains("maxTimePondering")) params.maxTimePondering = cfg.getDouble("maxTimePondering", 0.0, 1.0e20); - else params.maxTimePondering = params.maxTime; + else params.maxTimePondering = 1.0e20; if(cfg.contains("lagBuffer"+idxStr)) params.lagBuffer = cfg.getDouble("lagBuffer"+idxStr, 0.0, 3600.0); else if(cfg.contains("lagBuffer")) params.lagBuffer = cfg.getDouble("lagBuffer", 0.0, 3600.0); @@ -456,11 +456,11 @@ vector Setup::loadParams( if(cfg.contains("fillDameBeforePass"+idxStr)) params.fillDameBeforePass = cfg.getBool("fillDameBeforePass"+idxStr); else if(cfg.contains("fillDameBeforePass")) params.fillDameBeforePass = cfg.getBool("fillDameBeforePass"); else params.fillDameBeforePass = false; - if(cfg.contains("localExplore"+idxStr)) params.localExplore = cfg.getBool("localExplore"+idxStr); - else if(cfg.contains("localExplore")) params.localExplore = cfg.getBool("localExplore"); - else params.localExplore = false; //Controlled by GTP directly, not used in any other mode params.avoidMYTDaggerHackPla = C_EMPTY; + if(cfg.contains("wideRootNoise"+idxStr)) params.wideRootNoise = cfg.getDouble("wideRootNoise"+idxStr, 0.0, 5.0); + else if(cfg.contains("wideRootNoise")) params.wideRootNoise = cfg.getDouble("wideRootNoise", 0.0, 5.0); + else params.wideRootNoise = 0.0; if(cfg.contains("playoutDoublingAdvantage"+idxStr)) params.playoutDoublingAdvantage = cfg.getDouble("playoutDoublingAdvantage"+idxStr,-3.0,3.0); else if(cfg.contains("playoutDoublingAdvantage")) params.playoutDoublingAdvantage = cfg.getDouble("playoutDoublingAdvantage",-3.0,3.0); diff --git a/cpp/runcmdtests.sh b/cpp/runcmdtests.sh index cd7368628..bf1c98f87 100755 --- a/cpp/runcmdtests.sh +++ b/cpp/runcmdtests.sh @@ -6,7 +6,7 @@ for CMDFILE in tests/gtp/* do echo $CMDFILE BASENAME=$(basename "$CMDFILE") - ./katago gtp -config configs/gtp_example.cfg -model models/g170-b6c96-s175395328-d26788732.bin.gz -override-config "logFile=tests/results/gtp/$BASENAME.log, logTimeStamp=false, maxVisits=100, numSearchThreads=1, nnRandomize=false, nnRandSeed=forTesting, searchRandSeed=forTesting, forDeterministicTesting=true, cudaUseFP16 = false, cudaUseNHWC = false" < $CMDFILE 1> tests/results/gtp/$BASENAME.stdout 2> tests/results/gtp/$BASENAME.stderr + ./katago gtp -config configs/gtp_example.cfg -model tests/models/g170-b6c96-s175395328-d26788732.bin.gz -override-config "logFile=tests/results/gtp/$BASENAME.log, logDir=, logTimeStamp=false, maxVisits=100, maxPlayouts=10000, numSearchThreads=1, nnRandomize=false, nnRandSeed=forTesting, searchRandSeed=forTesting, forDeterministicTesting=true, cudaUseFP16 = false, cudaUseNHWC = false" < $CMDFILE 1> tests/results/gtp/$BASENAME.stdout 2> tests/results/gtp/$BASENAME.stderr done sed 's/^Time taken:.*/Time taken: ###/g' -i tests/results/gtp/* diff --git a/cpp/runsearchtests.sh b/cpp/runsearchtests.sh index 2a53a1a41..9152171b2 100755 --- a/cpp/runsearchtests.sh +++ b/cpp/runsearchtests.sh @@ -1,27 +1,27 @@ #!/bin/bash -eux { -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz false false 0 false | tee tests/results/runSearchTests-iNCHW-cNCHW.txt -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz true false 0 false | tee tests/results/runSearchTests-iNHWC-cNCHW.txt -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz true true 0 false | tee tests/results/runSearchTests-iNHWC-cNHWC.txt -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz true false 1 false | tee tests/results/runSearchTests-s1.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz false false 0 false | tee tests/results/runSearchTests-iNCHW-cNCHW.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz true false 0 false | tee tests/results/runSearchTests-iNHWC-cNCHW.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz true true 0 false | tee tests/results/runSearchTests-iNHWC-cNHWC.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz true false 1 false | tee tests/results/runSearchTests-s1.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz false false 0 false | tee tests/results/runSearchTests-r4-iNCHW-cNCHW.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz true false 0 false | tee tests/results/runSearchTests-r4-iNHWC-cNCHW.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz true true 0 false | tee tests/results/runSearchTests-r4-iNHWC-cNHWC.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz true false 1 false | tee tests/results/runSearchTests-r4-s1.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz false false 0 false | tee tests/results/runSearchTests-r4-iNCHW-cNCHW.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz true false 0 false | tee tests/results/runSearchTests-r4-iNHWC-cNCHW.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz true true 0 false | tee tests/results/runSearchTests-r4-iNHWC-cNHWC.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz true false 1 false | tee tests/results/runSearchTests-r4-s1.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz false false 0 false | tee tests/results/runSearchTestsV3-g2-iNCHW-cNCHW.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz true false 0 false | tee tests/results/runSearchTestsV3-g2-iNHWC-cNCHW.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz true true 0 false | tee tests/results/runSearchTestsV3-g2-iNHWC-cNHWC.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz true false 1 false | tee tests/results/runSearchTestsV3-g2-s1.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz false false 0 false | tee tests/results/runSearchTestsV3-g2-iNCHW-cNCHW.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz true false 0 false | tee tests/results/runSearchTestsV3-g2-iNHWC-cNCHW.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz true true 0 false | tee tests/results/runSearchTestsV3-g2-iNHWC-cNHWC.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz true false 1 false | tee tests/results/runSearchTestsV3-g2-s1.txt -./katago runnnontinyboardtest models/g170-b6c96-s175395328-d26788732.bin.gz false false 3 false | tee tests/results/runNNOnTinyBoardTest.txt -./katago runselfplayinittests models/grun50-b6c96-s156348160-d118286860.txt.gz | tee tests/results/runSelfplayInitTests.txt -./katago runsekitrainwritetests models/g103-b6c96-s103408384-d26419149.txt.gz | tee tests/results/runSekiTrainWriteTests.txt -./katago runnnsymmetriestest models/g103-b6c96-s103408384-d26419149.txt.gz false false false | tee tests/results/runNNSymmetriesTest.txt +./katago runnnontinyboardtest tests/models/g170-b6c96-s175395328-d26788732.bin.gz false false 3 false | tee tests/results/runNNOnTinyBoardTest.txt +./katago runselfplayinittests tests/models/grun50-b6c96-s156348160-d118286860.txt.gz | tee tests/results/runSelfplayInitTests.txt +./katago runsekitrainwritetests tests/models/g103-b6c96-s103408384-d26419149.txt.gz | tee tests/results/runSekiTrainWriteTests.txt +./katago runnnsymmetriestest tests/models/g103-b6c96-s103408384-d26419149.txt.gz false false false | tee tests/results/runNNSymmetriesTest.txt -./katago runsearchtestsv8 models/g170-b6c96-s175395328-d26788732.txt.gz false false false | tee tests/results/runSearchTestsV8.txt -./katago runsearchtestsv8 models/g170-b6c96-s175395328-d26788732.bin.gz false false false | tee tests/results/runSearchTestsV8Bin.txt +./katago runsearchtestsv8 tests/models/g170-b6c96-s175395328-d26788732.txt.gz false false false | tee tests/results/runSearchTestsV8.txt +./katago runsearchtestsv8 tests/models/g170-b6c96-s175395328-d26788732.bin.gz false false false | tee tests/results/runSearchTestsV8Bin.txt exit 0 } diff --git a/cpp/runsearchtestsfp16.sh b/cpp/runsearchtestsfp16.sh index 000b592b1..e7133e976 100755 --- a/cpp/runsearchtestsfp16.sh +++ b/cpp/runsearchtestsfp16.sh @@ -1,20 +1,20 @@ #!/bin/bash -eux { -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz true false 0 true | tee tests/results/runSearchTestsFP16-iNHWC-cNCHW.txt -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz true true 0 true | tee tests/results/runSearchTestsFP16-iNHWC-cNHWC.txt -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz true false 1 true | tee tests/results/runSearchTestsFP16-s1.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz true false 0 true | tee tests/results/runSearchTestsFP16-iNHWC-cNCHW.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz true true 0 true | tee tests/results/runSearchTestsFP16-iNHWC-cNHWC.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz true false 1 true | tee tests/results/runSearchTestsFP16-s1.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz true false 0 true | tee tests/results/runSearchTestsFP16-r4-iNHWC-cNCHW.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz true true 0 true | tee tests/results/runSearchTestsFP16-r4-iNHWC-cNHWC.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz true false 1 true | tee tests/results/runSearchTestsFP16-r4-s1.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz true false 0 true | tee tests/results/runSearchTestsFP16-r4-iNHWC-cNCHW.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz true true 0 true | tee tests/results/runSearchTestsFP16-r4-iNHWC-cNHWC.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz true false 1 true | tee tests/results/runSearchTestsFP16-r4-s1.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz true false 0 true | tee tests/results/runSearchTestsV3FP16-g2-iNHWC-cNCHW.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz true true 0 true | tee tests/results/runSearchTestsV3FP16-g2-iNHWC-cNHWC.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz true false 1 true | tee tests/results/runSearchTestsV3FP16-g2-s1.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz true false 0 true | tee tests/results/runSearchTestsV3FP16-g2-iNHWC-cNCHW.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz true true 0 true | tee tests/results/runSearchTestsV3FP16-g2-iNHWC-cNHWC.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz true false 1 true | tee tests/results/runSearchTestsV3FP16-g2-s1.txt -./katago runnnsymmetriestest models/g103-b6c96-s103408384-d26419149.txt.gz true true true | tee tests/results/runNNSymmetriesTestFP16.txt +./katago runnnsymmetriestest tests/models/g103-b6c96-s103408384-d26419149.txt.gz true true true | tee tests/results/runNNSymmetriesTestFP16.txt -./katago runsearchtestsv8 models/g170-b6c96-s175395328-d26788732.txt.gz true true true | tee tests/results/runSearchTestsV8FP16.txt +./katago runsearchtestsv8 tests/models/g170-b6c96-s175395328-d26788732.txt.gz true true true | tee tests/results/runSearchTestsV8FP16.txt exit 0 } diff --git a/cpp/runsearchtestslimited.sh b/cpp/runsearchtestslimited.sh index ba45b6ddb..2f67d241f 100755 --- a/cpp/runsearchtestslimited.sh +++ b/cpp/runsearchtestslimited.sh @@ -1,10 +1,10 @@ #!/bin/bash -eux { -./katago runsearchtests models/g103-b6c96-s103408384-d26419149.txt.gz false false 0 false | tee tests/results/runSearchTests-iNCHW-cNCHW.txt -./katago runsearchtests models/run4-s67105280-d24430742-b6c96.txt.gz false false 0 false | tee tests/results/runSearchTests-r4-iNCHW-cNCHW.txt -./katago runsearchtestsv3 models/grun2-b6c96-s128700160-d49811312.txt.gz false false 0 false | tee tests/results/runSearchTestsV3-g2-iNCHW-cNCHW.txt -./katago runnnsymmetriestest models/g103-b6c96-s103408384-d26419149.txt.gz false false false | tee tests/results/runNNSymmetriesTest.txt -./katago runsearchtestsv8 models/g170-b6c96-s175395328-d26788732.txt.gz false false false | tee tests/results/runSearchTestsV8.txt +./katago runsearchtests tests/models/g103-b6c96-s103408384-d26419149.txt.gz false false 0 false | tee tests/results/runSearchTests-iNCHW-cNCHW.txt +./katago runsearchtests tests/models/run4-s67105280-d24430742-b6c96.txt.gz false false 0 false | tee tests/results/runSearchTests-r4-iNCHW-cNCHW.txt +./katago runsearchtestsv3 tests/models/grun2-b6c96-s128700160-d49811312.txt.gz false false 0 false | tee tests/results/runSearchTestsV3-g2-iNCHW-cNCHW.txt +./katago runnnsymmetriestest tests/models/g103-b6c96-s103408384-d26419149.txt.gz false false false | tee tests/results/runNNSymmetriesTest.txt +./katago runsearchtestsv8 tests/models/g170-b6c96-s175395328-d26788732.txt.gz false false false | tee tests/results/runSearchTestsV8.txt exit 0 } diff --git a/cpp/search/asyncbot.cpp b/cpp/search/asyncbot.cpp index 4701caa98..f90481b67 100644 --- a/cpp/search/asyncbot.cpp +++ b/cpp/search/asyncbot.cpp @@ -52,6 +52,9 @@ const BoardHistory& AsyncBot::getRootHist() const { Player AsyncBot::getRootPla() const { return search->rootPla; } +Player AsyncBot::getPlayoutDoublingAdvantagePla() const { + return search->getPlayoutDoublingAdvantagePla(); +} Search* AsyncBot::getSearchStopAndWait() { stopAndWait(); @@ -76,6 +79,10 @@ void AsyncBot::setRootPassLegal(bool b) { stopAndWait(); search->setRootPassLegal(b); } +void AsyncBot::setRootHintLoc(Loc loc) { + stopAndWait(); + search->setRootHintLoc(loc); +} void AsyncBot::setAlwaysIncludeOwnerMap(bool b) { stopAndWait(); search->setAlwaysIncludeOwnerMap(b); @@ -172,9 +179,9 @@ void AsyncBot::ponder(double sf) { queuedSearchId = 0; queuedOnMove = std::function(ignoreMove); isRunning = true; - isPondering = true; + isPondering = true; //True - we are searching on the opponent's turn "for" the opponent's opponent shouldStopNow = false; - timeControls = TimeControls(); + timeControls = TimeControls(); //Blank time controls since opponent's clock is running, not ours, so no cap other than searchFactor searchFactor = sf; analyzeCallbackPeriod = -1; analyzeCallback = std::function(); @@ -195,9 +202,9 @@ void AsyncBot::analyze(Player movePla, double sf, double callbackPeriod, std::fu queuedSearchId = 0; queuedOnMove = std::function(ignoreMove); isRunning = true; - isPondering = true; + isPondering = false; //This should indeed be false because we are searching for the current player, not the last player we did a regular search for. shouldStopNow = false; - timeControls = TimeControls(); + timeControls = TimeControls(); //Blank time controls since no clock is not running, we don't cap search time other than through searchFactor. searchFactor = sf; analyzeCallbackPeriod = callbackPeriod; analyzeCallback = callback; diff --git a/cpp/search/asyncbot.h b/cpp/search/asyncbot.h index b03a6c5dc..fe7235a13 100644 --- a/cpp/search/asyncbot.h +++ b/cpp/search/asyncbot.h @@ -17,6 +17,7 @@ class AsyncBot { const Board& getRootBoard() const; const BoardHistory& getRootHist() const; Player getRootPla() const; + Player getPlayoutDoublingAdvantagePla() const; SearchParams getParams() const; //Get the search directly. If the asyncbot is doing anything asynchronous, the search MAY STILL BE RUNNING! @@ -30,6 +31,7 @@ class AsyncBot { void setPosition(Player pla, const Board& board, const BoardHistory& history); void setKomiIfNew(float newKomi); void setRootPassLegal(bool b); + void setRootHintLoc(Loc loc); void setAlwaysIncludeOwnerMap(bool b); void setParams(SearchParams params); void setPlayerIfNew(Player movePla); diff --git a/cpp/search/search.cpp b/cpp/search/search.cpp index da87b1bf0..5da8e416b 100644 --- a/cpp/search/search.cpp +++ b/cpp/search/search.cpp @@ -139,12 +139,14 @@ SearchThread::~SearchThread() { static const double VALUE_WEIGHT_DEGREES_OF_FREEDOM = 3.0; Search::Search(SearchParams params, NNEvaluator* nnEval, const string& rSeed) - :rootPla(P_BLACK),rootBoard(),rootHistory(),rootPassLegal(true), + :rootPla(P_BLACK), + rootBoard(),rootHistory(),rootPassLegal(true),rootHintLoc(Board::NULL_LOC), rootSafeArea(NULL), recentScoreCenter(0.0), alwaysIncludeOwnerMap(false), searchParams(params),numSearchesBegun(0),searchNodeAge(0), - rootPlaDuringLastSearch(C_EMPTY), + plaThatSearchIsFor(C_EMPTY),plaThatSearchIsForLastSearch(C_EMPTY), + lastSearchNumPlayouts(0), randSeed(rSeed), normToTApproxZ(0.0), nnEvaluator(nnEval), @@ -192,9 +194,14 @@ Player Search::getRootPla() const { return rootPla; } +Player Search::getPlayoutDoublingAdvantagePla() const { + return searchParams.playoutDoublingAdvantagePla == C_EMPTY ? plaThatSearchIsFor : searchParams.playoutDoublingAdvantagePla; +} + void Search::setPosition(Player pla, const Board& board, const BoardHistory& history) { clearSearch(); rootPla = pla; + plaThatSearchIsFor = C_EMPTY; rootBoard = board; rootHistory = history; rootKoHashTable->recompute(rootHistory); @@ -203,6 +210,7 @@ void Search::setPosition(Player pla, const Board& board, const BoardHistory& his void Search::setPlayerAndClearHistory(Player pla) { clearSearch(); rootPla = pla; + plaThatSearchIsFor = C_EMPTY; rootBoard.clearSimpleKoLoc(); Rules rules = rootHistory.rules; @@ -226,6 +234,10 @@ void Search::setRootPassLegal(bool b) { rootPassLegal = b; } +void Search::setRootHintLoc(Loc loc) { + rootHintLoc = loc; +} + void Search::setAlwaysIncludeOwnerMap(bool b) { if(!alwaysIncludeOwnerMap && b) clearSearch(); @@ -505,7 +517,7 @@ void Search::runWholeSearch( } } - beginSearch(); + beginSearch(pondering); searchBegun.store(true,std::memory_order_release); int64_t numNonPlayoutVisits = getRootVisits(); @@ -561,12 +573,15 @@ void Search::runWholeSearch( threads[i].join(); delete[] threads; } + + //Relaxed since should be synchronized already due to the joins + lastSearchNumPlayouts = numPlayoutsShared.load(std::memory_order_relaxed); } //If we're being asked to search from a position where the game is over, this is fine. Just keep going, the boardhistory //should reasonably tolerate just continuing. We do NOT want to clear history because we could inadvertently make a move //that an external ruleset COULD think violated superko. -void Search::beginSearch() { +void Search::beginSearch(bool pondering) { if(rootBoard.x_size > nnXLen || rootBoard.y_size > nnYLen) throw StringError("Search got from NNEval nnXLen = " + Global::intToString(nnXLen) + " nnYLen = " + Global::intToString(nnYLen) + " but was asked to search board with larger x or y size"); @@ -577,11 +592,21 @@ void Search::beginSearch() { searchNodeAge++; if(searchNodeAge == 0) //Just in case, as we roll over clearSearch(); + + if(!pondering) + plaThatSearchIsFor = rootPla; + //If we begin the game with a ponder, then assume that "we" are the opposing side until we see otherwise. + if(plaThatSearchIsFor == C_EMPTY) + plaThatSearchIsFor = getOpp(rootPla); + //In the case we are doing playoutDoublingAdvantage without a specific player (so, doing the root player) - //and the root player changes, we need to clear the tree since we need new evals for the new way around - if(rootPlaDuringLastSearch != rootPla && searchParams.playoutDoublingAdvantage != 0 && searchParams.playoutDoublingAdvantagePla == C_EMPTY) + //and the player that the search is for changes, we need to clear the tree since we need new evals for the new way around + if(plaThatSearchIsForLastSearch != plaThatSearchIsFor && + searchParams.playoutDoublingAdvantage != 0 && + searchParams.playoutDoublingAdvantagePla == C_EMPTY) clearSearch(); - rootPlaDuringLastSearch = rootPla; + plaThatSearchIsForLastSearch = plaThatSearchIsFor; + //cout << "BEGINSEARCH " << PlayerIO::playerToString(rootPla) << " " << PlayerIO::playerToString(plaThatSearchIsFor) << endl; computeRootValues(); maybeRecomputeNormToTApproxTable(); @@ -757,7 +782,7 @@ void Search::computeRootValues() { nnInputParams.nnPolicyTemperature = searchParams.nnPolicyTemperature; nnInputParams.avoidMYTDaggerHack = searchParams.avoidMYTDaggerHackPla == pla; if(searchParams.playoutDoublingAdvantage != 0) { - Player playoutDoublingAdvantagePla = searchParams.playoutDoublingAdvantagePla == C_EMPTY ? rootPla : searchParams.playoutDoublingAdvantagePla; + Player playoutDoublingAdvantagePla = getPlayoutDoublingAdvantagePla(); nnInputParams.playoutDoublingAdvantage = ( getOpp(pla) == playoutDoublingAdvantagePla ? -searchParams.playoutDoublingAdvantage : searchParams.playoutDoublingAdvantage ); @@ -862,7 +887,7 @@ void Search::addDirichletNoise(const SearchParams& searchParams, Rand& rand, int void Search::maybeAddPolicyNoiseAndTempAlreadyLocked(SearchThread& thread, SearchNode& node, bool isRoot) const { if(!isRoot) return; - if(!searchParams.rootNoiseEnabled && searchParams.rootPolicyTemperature == 1.0 && searchParams.rootPolicyTemperatureEarly == 1.0) + if(!searchParams.rootNoiseEnabled && searchParams.rootPolicyTemperature == 1.0 && searchParams.rootPolicyTemperatureEarly == 1.0 && rootHintLoc == Board::NULL_LOC) return; if(node.nnOutput->noisedPolicyProbs != NULL) return; @@ -915,6 +940,21 @@ void Search::maybeAddPolicyNoiseAndTempAlreadyLocked(SearchThread& thread, Searc addDirichletNoise(searchParams, thread.rand, policySize, noisedPolicyProbs); } + //Move a small amount of policy to the hint move, around the same level that noising it would achieve + if(rootHintLoc != Board::NULL_LOC) { + const float propToMove = 0.02f; + int pos = getPos(rootHintLoc); + if(noisedPolicyProbs[pos] >= 0) { + double amountToMove = 0.0; + for(int i = 0; i= 0) { + amountToMove += noisedPolicyProbs[i] * propToMove; + noisedPolicyProbs[i] *= (1.0f-propToMove); + } + } + noisedPolicyProbs[pos] += (float)amountToMove; + } + } } bool Search::isAllowedRootMove(Loc moveLoc) const { @@ -1144,70 +1184,36 @@ double Search::getEndingWhiteScoreBonus(const SearchNode& parent, const SearchNo return -extraRootPoints; } -static bool nearWeakStones(const Board& board, Loc loc, Player pla) { - Player opp = getOpp(pla); - for(int i = 0; i < 4; i++) { - Loc adj = loc + board.adj_offsets[i]; - if(board.colors[adj] == opp && board.getNumLiberties(adj) <= 4) - return true; - else if(board.colors[adj] == C_EMPTY) { - for(int j = 0; j < 4; j++) { - Loc adjadj = adj + board.adj_offsets[j]; - if(board.colors[adjadj] == opp) { - if(board.getNumLiberties(adjadj) <= 3) - return true; - } - } - } - } - return false; +int Search::getPos(Loc moveLoc) const { + return NNPos::locToPos(moveLoc,rootBoard.x_size,nnXLen,nnYLen); } -float Search::adjustExplorePolicyProb( - const SearchThread& thread, const SearchNode& parent, Loc moveLoc, float nnPolicyProb, - double parentUtility, double totalChildVisits, double childVisits, double& childUtility -) const { - (void)totalChildVisits; - //Near the tree root, explore local moves a bit more for root player - if(searchParams.localExplore && - parent.nextPla == rootPla && thread.history.moveHistory.size() > 0 && - thread.history.moveHistory.size() <= rootHistory.moveHistory.size() + 2 - ) { - Loc prevLoc = thread.history.moveHistory[thread.history.moveHistory.size()-1].loc; - if(moveLoc != Board::PASS_LOC && prevLoc != Board::PASS_LOC) { - //Within sqrt(5) of the opponent's move - //Within 2 of a group with <= 3 liberties, or touching opp stone with <= 4 liberties - //Not self atari - const Board& board = thread.board; - int distanceSq = Location::euclideanDistanceSquared(moveLoc,prevLoc,board.x_size); - if(distanceSq <= 5 && board.getNumLibertiesAfterPlay(moveLoc,parent.nextPla,2) >= 2) { - if(nearWeakStones(board, moveLoc, parent.nextPla)) { - float averageToward = distanceSq <= 2 ? 0.06f : distanceSq <= 4 ? 0.04f : 0.03f; - //Behave as if policy is a few points higher - if(nnPolicyProb < averageToward) - nnPolicyProb = 0.5f * (nnPolicyProb + averageToward); - if(childVisits > 0 && (parent.nextPla == P_WHITE ? (childUtility < parentUtility) : (childUtility > parentUtility))) { - //Also encourage a bit more exploration even if value is bad - double parentWeight = sqrt(childVisits); - childUtility = (parentUtility * parentWeight + childUtility * childVisits) / (parentWeight + childVisits); - } - } - } - } +static void maybeApplyWideRootNoise( + double& childUtility, + float& nnPolicyProb, + const SearchParams& searchParams, + SearchThread* thread, + const SearchNode& parent +) { + //For very large wideRootNoise, go ahead and also smooth out the policy + nnPolicyProb = (float)pow(nnPolicyProb, 1.0 / (4.0*searchParams.wideRootNoise + 1.0)); + if(thread->rand.nextBool(0.5)) { + double bonus = searchParams.wideRootNoise * abs(thread->rand.nextGaussian()); + if(parent.nextPla == P_WHITE) + childUtility += bonus; + else + childUtility -= bonus; } - return nnPolicyProb; } -int Search::getPos(Loc moveLoc) const { - return NNPos::locToPos(moveLoc,rootBoard.x_size,nnXLen,nnYLen); -} //Parent must be locked double Search::getExploreSelectionValue( const SearchNode& parent, const float* parentPolicyProbs, const SearchNode* child, int64_t totalChildVisits, double fpuValue, double parentUtility, - bool isDuringSearch, const SearchThread* thread + bool isDuringSearch, SearchThread* thread ) const { + (void)parentUtility; Loc moveLoc = child->prevMoveLoc; int movePos = getPos(moveLoc); float nnPolicyProb = parentPolicyProbs[movePos]; @@ -1250,22 +1256,41 @@ double Search::getExploreSelectionValue( childUtility = childUtility + (virtualLossUtility - childUtility) * virtualLossVisitFrac; } - if(isDuringSearch) - nnPolicyProb = adjustExplorePolicyProb(*thread,parent,moveLoc,nnPolicyProb,parentUtility,totalChildVisits,childVisits,childUtility); + if(isDuringSearch && (&parent == rootNode)) { + //Hack to get the root to funnel more visits down child branches + if(searchParams.rootDesiredPerChildVisitsCoeff > 0.0) { + if(childVisits < sqrt(nnPolicyProb * totalChildVisits * searchParams.rootDesiredPerChildVisitsCoeff)) { + return 1e20; + } + } + //Hack for hintloc - must search this move almost as often as the most searched move + if(rootHintLoc != Board::NULL_LOC && moveLoc == rootHintLoc) { + for(int i = 0; istatsLock.test_and_set(std::memory_order_acquire)); + int64_t cVisits = c->stats.visits; + c->statsLock.clear(std::memory_order_release); + if(childVisits+1 < cVisits * 0.8) + return 1e20; + } + } - //Hack to get the root to funnel more visits down child branches - if(isDuringSearch && (&parent == rootNode) && searchParams.rootDesiredPerChildVisitsCoeff > 0.0) { - if(childVisits < sqrt(nnPolicyProb * totalChildVisits * searchParams.rootDesiredPerChildVisitsCoeff)) { - return 1e20; + if(searchParams.wideRootNoise > 0.0) { + maybeApplyWideRootNoise(childUtility, nnPolicyProb, searchParams, thread, parent); } } return getExploreSelectionValue(nnPolicyProb,totalChildVisits,childVisits,childUtility,parent.nextPla); } -double Search::getNewExploreSelectionValue(const SearchNode& parent, float nnPolicyProb, int64_t totalChildVisits, double fpuValue) const { +double Search::getNewExploreSelectionValue(const SearchNode& parent, float nnPolicyProb, int64_t totalChildVisits, double fpuValue, SearchThread* thread) const { int64_t childVisits = 0; double childUtility = fpuValue; + + if((&parent == rootNode) && searchParams.wideRootNoise > 0.0) { + maybeApplyWideRootNoise(childUtility, nnPolicyProb, searchParams, thread, parent); + } + return getExploreSelectionValue(nnPolicyProb,totalChildVisits,childVisits,childUtility,parent.nextPla); } @@ -1338,7 +1363,7 @@ double Search::getFpuValueForChildrenAssumeVisited(const SearchNode& node, Playe //Assumes node is locked void Search::selectBestChildToDescend( - const SearchThread& thread, const SearchNode& node, int& bestChildIdx, Loc& bestChildMoveLoc, + SearchThread& thread, const SearchNode& node, int& bestChildIdx, Loc& bestChildMoveLoc, bool posesWithChildBuf[NNPos::MAX_NN_POLICY_SIZE], bool isRoot) const { @@ -1412,8 +1437,6 @@ void Search::selectBestChildToDescend( } float nnPolicyProb = policyProbs[movePos]; - double childUtility = 0.0; //dummy, we don't care - nnPolicyProb = adjustExplorePolicyProb(thread,node,moveLoc,nnPolicyProb,parentUtility,totalChildVisits,0,childUtility); if(nnPolicyProb > bestNewNNPolicyProb) { bestNewNNPolicyProb = nnPolicyProb; @@ -1421,7 +1444,7 @@ void Search::selectBestChildToDescend( } } if(bestNewMoveLoc != Board::NULL_LOC) { - double selectionValue = getNewExploreSelectionValue(node,bestNewNNPolicyProb,totalChildVisits,fpuValue); + double selectionValue = getNewExploreSelectionValue(node,bestNewNNPolicyProb,totalChildVisits,fpuValue,&thread); if(selectionValue > maxSelectionValue) { maxSelectionValue = selectionValue; bestChildIdx = numChildren; @@ -1669,7 +1692,7 @@ void Search::initNodeNNOutput( nnInputParams.nnPolicyTemperature = searchParams.nnPolicyTemperature; nnInputParams.avoidMYTDaggerHack = searchParams.avoidMYTDaggerHackPla == thread.pla; if(searchParams.playoutDoublingAdvantage != 0) { - Player playoutDoublingAdvantagePla = searchParams.playoutDoublingAdvantagePla == C_EMPTY ? rootPla : searchParams.playoutDoublingAdvantagePla; + Player playoutDoublingAdvantagePla = getPlayoutDoublingAdvantagePla(); nnInputParams.playoutDoublingAdvantage = ( getOpp(thread.pla) == playoutDoublingAdvantagePla ? -searchParams.playoutDoublingAdvantage : searchParams.playoutDoublingAdvantage ); diff --git a/cpp/search/search.h b/cpp/search/search.h index 7d758f1c9..7c7adf4c6 100644 --- a/cpp/search/search.h +++ b/cpp/search/search.h @@ -138,6 +138,7 @@ struct Search { Board rootBoard; BoardHistory rootHistory; bool rootPassLegal; + Loc rootHintLoc; //Precomputed values at the root Color* rootSafeArea; @@ -149,7 +150,9 @@ struct Search { SearchParams searchParams; int64_t numSearchesBegun; uint32_t searchNodeAge; - Player rootPlaDuringLastSearch; + Player plaThatSearchIsFor; + Player plaThatSearchIsForLastSearch; + int64_t lastSearchNumPlayouts; std::string randSeed; @@ -189,6 +192,7 @@ struct Search { const Board& getRootBoard() const; const BoardHistory& getRootHist() const; Player getRootPla() const; + Player getPlayoutDoublingAdvantagePla() const; //Clear all results of search and sets a new position or something else void setPosition(Player pla, const Board& board, const BoardHistory& history); @@ -196,6 +200,7 @@ struct Search { void setPlayerAndClearHistory(Player pla); void setKomiIfNew(float newKomi); //Does not clear history, does clear search unless komi is equal. void setRootPassLegal(bool b); + void setRootHintLoc(Loc hintLoc); void setAlwaysIncludeOwnerMap(bool b); void setParams(SearchParams params); void setParamsNoClearing(SearchParams params); //Does not clear search @@ -217,6 +222,7 @@ struct Search { void runWholeSearch(Player movePla, Logger& logger); void runWholeSearch(Logger& logger, std::atomic& shouldStopNow); + //Pondering indicates that we are searching "for" the last player that we did a non-ponder search for, and should use ponder search limits. Loc runWholeSearchAndGetMove(Player movePla, Logger& logger, bool pondering); void runWholeSearch(Player movePla, Logger& logger, bool pondering); void runWholeSearch(Logger& logger, std::atomic& shouldStopNow, bool pondering); @@ -298,7 +304,7 @@ struct Search { std::vector getAverageTreeOwnership(int64_t minVisits) const; //Expert manual playout-by-playout interface------------------------------------------------ - void beginSearch(); + void beginSearch(bool pondering); void runSinglePlayout(SearchThread& thread); //Helpers----------------------------------------------------------------------- @@ -334,11 +340,6 @@ struct Search { //Parent must be locked void getSelfUtilityLCBAndRadius(const SearchNode& parent, const SearchNode* child, double& lcbBuf, double& radiusBuf) const; - float adjustExplorePolicyProb( - const SearchThread& thread, const SearchNode& parent, Loc moveLoc, float nnPolicyProb, - double parentUtility, double totalChildVisits, double childVisits, double& childUtility - ) const; - double getExploreSelectionValue( double nnPolicyProb, int64_t totalChildVisits, int64_t childVisits, double childUtility, Player pla @@ -360,9 +361,9 @@ struct Search { double getExploreSelectionValue( const SearchNode& parent, const float* parentPolicyProbs, const SearchNode* child, int64_t totalChildVisits, double fpuValue, double parentUtility, - bool isDuringSearch, const SearchThread* thread + bool isDuringSearch, SearchThread* thread ) const; - double getNewExploreSelectionValue(const SearchNode& parent, float nnPolicyProb, int64_t totalChildVisits, double fpuValue) const; + double getNewExploreSelectionValue(const SearchNode& parent, float nnPolicyProb, int64_t totalChildVisits, double fpuValue, SearchThread* thread) const; //Parent must be locked int64_t getReducedPlaySelectionVisits( @@ -380,7 +381,7 @@ struct Search { double getNormToTApproxForLCB(int64_t numVisits) const; void selectBestChildToDescend( - const SearchThread& thread, const SearchNode& node, int& bestChildIdx, Loc& bestChildMoveLoc, + SearchThread& thread, const SearchNode& node, int& bestChildIdx, Loc& bestChildMoveLoc, bool posesWithChildBuf[NNPos::MAX_NN_POLICY_SIZE], bool isRoot ) const; diff --git a/cpp/search/searchparams.cpp b/cpp/search/searchparams.cpp index c92cabd66..1dd35cdce 100644 --- a/cpp/search/searchparams.cpp +++ b/cpp/search/searchparams.cpp @@ -41,8 +41,8 @@ SearchParams::SearchParams() rootPruneUselessMoves(false), conservativePass(false), fillDameBeforePass(false), - localExplore(false), avoidMYTDaggerHackPla(C_EMPTY), + wideRootNoise(0.0), playoutDoublingAdvantage(0.0), playoutDoublingAdvantagePla(C_EMPTY), nnPolicyTemperature(1.0f), diff --git a/cpp/search/searchparams.h b/cpp/search/searchparams.h index 1632843c5..820d10c9b 100644 --- a/cpp/search/searchparams.h +++ b/cpp/search/searchparams.h @@ -53,8 +53,8 @@ struct SearchParams { bool rootPruneUselessMoves; //Prune moves that are entirely useless moves that prolong the game. bool conservativePass; //Never assume one's own pass will end the game. bool fillDameBeforePass; //When territory scoring, heuristically discourage passing before filling the dame. - bool localExplore; //Explore local tacticy moves a little more, to try to find some blind spots. Player avoidMYTDaggerHackPla; //Hacky hack to avoid a particular pattern that gives some KG nets some trouble. Should become unnecessary in the future. + double wideRootNoise; //Explore at the root more widely double playoutDoublingAdvantage; //Play as if we have this many doublings of playouts vs the opponent Player playoutDoublingAdvantagePla; //Negate playoutDoublingAdvantage when making a move for the opponent of this player. If empty, opponent of the root player. diff --git a/cpp/tests/gtp/handicap.txt b/cpp/tests/gtp/handicap.txt index dfc3c58c8..3d658ccfa 100644 --- a/cpp/tests/gtp/handicap.txt +++ b/cpp/tests/gtp/handicap.txt @@ -21,3 +21,5 @@ fixed_handicap 3 showboard play w K4 genmove_debug b +genmove_debug w +genmove_debug b diff --git a/cpp/tests/models/README.txt b/cpp/tests/models/README.txt new file mode 100644 index 000000000..689eb83e5 --- /dev/null +++ b/cpp/tests/models/README.txt @@ -0,0 +1,9 @@ +These are small and weak neural net models for testing only. + +See: +https://github.com/lightvector/KataGo/releases +or +https://d3dndmfyhecmj0.cloudfront.net/ + +for the actual latest neural nets. + diff --git a/cpp/models/g103-b6c96-s103408384-d26419149-info.txt b/cpp/tests/models/g103-b6c96-s103408384-d26419149-info.txt similarity index 100% rename from cpp/models/g103-b6c96-s103408384-d26419149-info.txt rename to cpp/tests/models/g103-b6c96-s103408384-d26419149-info.txt diff --git a/cpp/models/g103-b6c96-s103408384-d26419149.txt.gz b/cpp/tests/models/g103-b6c96-s103408384-d26419149.txt.gz similarity index 100% rename from cpp/models/g103-b6c96-s103408384-d26419149.txt.gz rename to cpp/tests/models/g103-b6c96-s103408384-d26419149.txt.gz diff --git a/cpp/models/g170-b6c96-s175395328-d26788732-info.txt b/cpp/tests/models/g170-b6c96-s175395328-d26788732-info.txt similarity index 100% rename from cpp/models/g170-b6c96-s175395328-d26788732-info.txt rename to cpp/tests/models/g170-b6c96-s175395328-d26788732-info.txt diff --git a/cpp/models/g170-b6c96-s175395328-d26788732.bin.gz b/cpp/tests/models/g170-b6c96-s175395328-d26788732.bin.gz similarity index 100% rename from cpp/models/g170-b6c96-s175395328-d26788732.bin.gz rename to cpp/tests/models/g170-b6c96-s175395328-d26788732.bin.gz diff --git a/cpp/models/g170-b6c96-s175395328-d26788732.txt.gz b/cpp/tests/models/g170-b6c96-s175395328-d26788732.txt.gz similarity index 100% rename from cpp/models/g170-b6c96-s175395328-d26788732.txt.gz rename to cpp/tests/models/g170-b6c96-s175395328-d26788732.txt.gz diff --git a/cpp/models/grun2-b6c96-s128700160-d49811312-info.txt b/cpp/tests/models/grun2-b6c96-s128700160-d49811312-info.txt similarity index 100% rename from cpp/models/grun2-b6c96-s128700160-d49811312-info.txt rename to cpp/tests/models/grun2-b6c96-s128700160-d49811312-info.txt diff --git a/cpp/models/grun2-b6c96-s128700160-d49811312.txt.gz b/cpp/tests/models/grun2-b6c96-s128700160-d49811312.txt.gz similarity index 100% rename from cpp/models/grun2-b6c96-s128700160-d49811312.txt.gz rename to cpp/tests/models/grun2-b6c96-s128700160-d49811312.txt.gz diff --git a/cpp/models/grun50-b6c96-s156348160-d118286860.txt.gz b/cpp/tests/models/grun50-b6c96-s156348160-d118286860.txt.gz similarity index 100% rename from cpp/models/grun50-b6c96-s156348160-d118286860.txt.gz rename to cpp/tests/models/grun50-b6c96-s156348160-d118286860.txt.gz diff --git a/cpp/models/run4-s67105280-d24430742-b6c96-info.txt b/cpp/tests/models/run4-s67105280-d24430742-b6c96-info.txt similarity index 100% rename from cpp/models/run4-s67105280-d24430742-b6c96-info.txt rename to cpp/tests/models/run4-s67105280-d24430742-b6c96-info.txt diff --git a/cpp/models/run4-s67105280-d24430742-b6c96.txt.gz b/cpp/tests/models/run4-s67105280-d24430742-b6c96.txt.gz similarity index 100% rename from cpp/models/run4-s67105280-d24430742-b6c96.txt.gz rename to cpp/tests/models/run4-s67105280-d24430742-b6c96.txt.gz diff --git a/cpp/tests/results/gtp/basic.txt.log b/cpp/tests/results/gtp/basic.txt.log index 51ddd9601..d17693fdf 100644 --- a/cpp/tests/results/gtp/basic.txt.log +++ b/cpp/tests/results/gtp/basic.txt.log @@ -1,14 +1,14 @@ : GTP Engine starting... -: KataGo v1.3.5 +: KataGo v1.4.2 : Using 1 CPU thread(s) for search : nnRandSeed0 = forTesting -: After dedups: nnModelFile0 = models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false : Cuda backend: Found GPU Tesla V100-SXM2-16GB memory 16945512448 compute capability major 7 minor 0 : Cuda backend: Model version 8 useFP16 = false useNHWC = false : Cuda backend: Model name: g170-b6c96-s175395328-d26788732 : Loaded neural net with nnXLen 19 nnYLen 19 : Loaded config configs/gtp_example.cfg and/or command-line and query overrides -: Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +: Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz : Model name: g170-b6c96-s175395328-d26788732 : GTP ready, beginning main protocol loop : Controller: genmove_debug b @@ -37,6 +37,7 @@ koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 96 NN batches: 96 NN avg batch size: 1 @@ -82,6 +83,7 @@ D4 : T -1.22c W -1.33c S 0.11c ( -0.2 L -0.0) LCB -117.86c P 4.67% WF 6. koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 90 NN rows: 77 NN batches: 77 NN avg batch size: 1 @@ -129,6 +131,7 @@ Q4 : T -0.54c W -0.30c S -0.24c ( -0.3 L -0.3) LCB -45.88c P 4.97% WF 9. koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 0 NN batches: 0 NN avg batch size: -nan @@ -174,6 +177,7 @@ D4 : T -1.22c W -1.33c S 0.11c ( -0.2 L -0.0) LCB -117.86c P 4.67% WF 6. koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 91 NN rows: 72 NN batches: 72 NN avg batch size: 1 @@ -196,7 +200,7 @@ D16 : T -1.03c W -0.73c S -0.30c ( -0.3 L -0.4) LCB -42.05c P 5.61% WF 9. : Controller: boardsize 9 : Cleaned up old neural net and bot : nnRandSeed0 = forTesting -: After dedups: nnModelFile0 = models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false : Cuda backend: Found GPU Tesla V100-SXM2-16GB memory 16945512448 compute capability major 7 minor 0 : Cuda backend: Model version 8 useFP16 = false useNHWC = false : Cuda backend: Model name: g170-b6c96-s175395328-d26788732 @@ -218,6 +222,7 @@ D16 : T -1.03c W -0.73c S -0.30c ( -0.3 L -0.4) LCB -42.05c P 5.61% WF 9. koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 100 NN batches: 100 NN avg batch size: 1 diff --git a/cpp/tests/results/gtp/basic.txt.stderr b/cpp/tests/results/gtp/basic.txt.stderr index 4f156a364..6cef8d659 100644 --- a/cpp/tests/results/gtp/basic.txt.stderr +++ b/cpp/tests/results/gtp/basic.txt.stderr @@ -1,6 +1,6 @@ -KataGo v1.3.5 +KataGo v1.4.2 Loaded config configs/gtp_example.cfg and/or command-line and query overrides -Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz Model name: g170-b6c96-s175395328-d26788732 GTP ready, beginning main protocol loop MoveNum: 0 HASH: 7BF12F3F24903F0C225CD6C55BA8BA1F @@ -28,6 +28,7 @@ MoveNum: 0 HASH: 7BF12F3F24903F0C225CD6C55BA8BA1F koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 96 NN batches: 96 NN avg batch size: 1 @@ -70,6 +71,7 @@ MoveNum: 1 HASH: 1B4A47063949C09BE5F5B9661C676D55 koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 90 NN rows: 77 NN batches: 77 NN avg batch size: 1 @@ -112,6 +114,7 @@ MoveNum: 0 HASH: 7BF12F3F24903F0C225CD6C55BA8BA1F koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 0 NN batches: 0 NN avg batch size: -nan @@ -154,6 +157,7 @@ MoveNum: 1 HASH: 0CEAE8B4B0275F9498D45099084F186C koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 91 NN rows: 72 NN batches: 72 NN avg batch size: 1 @@ -186,6 +190,7 @@ MoveNum: 0 HASH: 17AD8355BCC635F80E2BB25E4F9F5690 koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 100 NN batches: 100 NN avg batch size: 1 diff --git a/cpp/tests/results/gtp/handicap.txt.stderr b/cpp/tests/results/gtp/handicap.txt.stderr index dc11c1503..ce3ffc173 100644 --- a/cpp/tests/results/gtp/handicap.txt.stderr +++ b/cpp/tests/results/gtp/handicap.txt.stderr @@ -1,6 +1,6 @@ -KataGo v1.3.5 +KataGo v1.4.2 Loaded config configs/gtp_example.cfg and/or command-line and query overrides -Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz Model name: g170-b6c96-s175395328-d26788732 GTP ready, beginning main protocol loop MoveNum: 0 HASH: E153F25F78076E50698FEB13372D62DB @@ -28,6 +28,7 @@ MoveNum: 0 HASH: E153F25F78076E50698FEB13372D62DB koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 100 NN batches: 100 NN avg batch size: 1 @@ -71,6 +72,7 @@ MoveNum: 0 HASH: C8C4A026AA6DCCB6DC2ABC84580943C4 koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 84 NN batches: 84 NN avg batch size: 1 @@ -111,6 +113,7 @@ MoveNum: 2 HASH: 1E9E1E18E3D2716A1BAFE3BC4B4B5E00 koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 97 NN batches: 97 NN avg batch size: 1 @@ -152,6 +155,7 @@ MoveNum: 4 HASH: D27ED7A3ADEA93E6137E228672EDEDEC koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 100 NN batches: 100 NN avg batch size: 1 @@ -193,6 +197,7 @@ MoveNum: 6 HASH: 5905DB49C2781D30069144878FEDCDBE koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 97 NN batches: 97 NN avg batch size: 1 @@ -228,6 +233,7 @@ MoveNum: 1 HASH: E438EA007391E7E2375DB017412B67BA koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 97 NN batches: 97 NN avg batch size: 1 @@ -261,6 +267,7 @@ MoveNum: 1 HASH: A740AFE552ECED2B189F1F197F8D0FB0 koPOSITIONALscoreAREAtaxNONEsui1komi7.5 Time taken: ### Root visits: 100 +New playouts: 100 NN rows: 98 NN batches: 98 NN avg batch size: 1 @@ -279,3 +286,67 @@ K3 : T 66.52c W 63.99c S 2.53c ( +9.8 L +10.1) LCB -36.73c P 4.02% WF 4. L6 : T 68.12c W 65.16c S 2.96c (+10.3 L +10.6) LCB -11.83c P 2.85% WF 4.43% PSV 5 N 5 -- L6 F3 D7 D7 : T 60.57c W 59.59c S 0.98c ( +8.4 L +9.2) LCB -51.43c P 5.69% WF 4.01% PSV 4 N 4 -- D7 D11 C11 G10 : T 61.30c W 59.51c S 1.79c ( +9.1 L +9.7) LCB -155.48c P 4.46% WF 4.05% PSV 3 N 4 -- G10 C6 F3 +MoveNum: 2 HASH: 882B03D22CFBA11DCBE488CA409ECCF2 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . X . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . @ . . + 4 . . . X . . . . . O X . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + +koPOSITIONALscoreAREAtaxNONEsui1komi7.5 +Time taken: ### +Root visits: 100 +New playouts: 100 +NN rows: 88 +NN batches: 88 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 2.125 +PV: L5 L3 K5 J2 H11 L8 H3 J3 +Tree: +: T -75.99c W -71.06c S -4.93c (-11.7 L -11.7) N 100 -- L5 L3 K5 J2 H11 L8 H3 +---White(^)--- +L5 : T -74.85c W -69.95c S -4.90c (-11.8 L -11.6) LCB -81.52c P 41.26% WF 26.11% PSV 58 N 58 -- L5 L3 K5 J2 H11 L8 H3 J3 +L3 : T -78.92c W -73.77c S -5.15c (-11.8 L -12.1) LCB -89.28c P 32.11% WF 23.85% PSV 28 N 28 -- L3 L5 M3 K5 J4 J5 H4 H5 +K5 : T -75.00c W -70.44c S -4.56c (-11.4 L -11.2) LCB -102.29c P 10.16% WF 25.78% PSV 11 N 11 -- K5 L5 L3 L6 +K3 : T -80.04c W -74.31c S -5.73c (-12.4 L -12.7) LCB -280.00c P 3.71% WF 24.25% PSV 2 N 2 -- K3 L5 +MoveNum: 3 HASH: AB8038BF9DCC5B2733ACAB86E6E9FE6D + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . X . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . O3. . + 4 . . . X . . . . . O1X2. . + 3 . . . . . . . . . . @ . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + +koPOSITIONALscoreAREAtaxNONEsui1komi7.5 +Time taken: ### +Root visits: 100 +New playouts: 100 +NN rows: 43 +NN batches: 43 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -2.125 +PV: L3 K5 J2 H11 L8 H3 J3 H4 H2 +Tree: +: T 74.82c W 69.48c S 5.34c (+11.7 L +11.5) N 100 -- L3 K5 J2 H11 L8 H3 J3 +---Black(^)--- +L3 : T 75.90c W 70.33c S 5.57c (+11.9 L +11.7) LCB 71.26c P 78.46% WF 28.53% PSV 92 N 92 -- L3 K5 J2 H11 L8 H3 J3 H4 +K3 : T 57.06c W 55.38c S 1.68c ( +8.0 L +8.5) LCB -61.59c P 13.65% WF 21.21% PSV 4 N 5 -- K3 L3 M4 M3 +K5 : T 61.89c W 59.27c S 2.62c ( +8.9 L +8.7) LCB -280.00c P 3.66% WF 24.45% PSV 1 N 1 -- K5 +M5 : T 67.41c W 63.09c S 4.32c (+10.8 L +10.4) LCB -280.00c P 2.09% WF 25.81% PSV 1 N 1 -- M5 diff --git a/cpp/tests/results/gtp/handicap.txt.stdout b/cpp/tests/results/gtp/handicap.txt.stdout index 43846fb5e..5bac74d73 100644 --- a/cpp/tests/results/gtp/handicap.txt.stdout +++ b/cpp/tests/results/gtp/handicap.txt.stdout @@ -134,3 +134,7 @@ W stones captured: 0 = L4 += L5 + += L3 + diff --git a/cpp/tests/results/gtp/printsgf.txt.stderr b/cpp/tests/results/gtp/printsgf.txt.stderr index 04bb26098..f38ff2399 100644 --- a/cpp/tests/results/gtp/printsgf.txt.stderr +++ b/cpp/tests/results/gtp/printsgf.txt.stderr @@ -1,5 +1,5 @@ -KataGo v1.3.5 +KataGo v1.4.2 Loaded config configs/gtp_example.cfg and/or command-line and query overrides -Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz Model name: g170-b6c96-s175395328-d26788732 GTP ready, beginning main protocol loop diff --git a/cpp/tests/results/gtp/rules.txt.log b/cpp/tests/results/gtp/rules.txt.log index f7e978728..ac07fc64d 100644 --- a/cpp/tests/results/gtp/rules.txt.log +++ b/cpp/tests/results/gtp/rules.txt.log @@ -1,14 +1,14 @@ : GTP Engine starting... -: KataGo v1.3.5 +: KataGo v1.4.2 : Using 1 CPU thread(s) for search : nnRandSeed0 = forTesting -: After dedups: nnModelFile0 = models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false : Cuda backend: Found GPU Tesla V100-SXM2-16GB memory 16945512448 compute capability major 7 minor 0 : Cuda backend: Model version 8 useFP16 = false useNHWC = false : Cuda backend: Model name: g170-b6c96-s175395328-d26788732 : Loaded neural net with nnXLen 19 nnYLen 19 : Loaded config configs/gtp_example.cfg and/or command-line and query overrides -: Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +: Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz : Model name: g170-b6c96-s175395328-d26788732 : GTP ready, beginning main protocol loop : Controller: kata-get-rules diff --git a/cpp/tests/results/gtp/rules.txt.stderr b/cpp/tests/results/gtp/rules.txt.stderr index 04bb26098..f38ff2399 100644 --- a/cpp/tests/results/gtp/rules.txt.stderr +++ b/cpp/tests/results/gtp/rules.txt.stderr @@ -1,5 +1,5 @@ -KataGo v1.3.5 +KataGo v1.4.2 Loaded config configs/gtp_example.cfg and/or command-line and query overrides -Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz Model name: g170-b6c96-s175395328-d26788732 GTP ready, beginning main protocol loop diff --git a/cpp/tests/results/gtp/time.txt.log b/cpp/tests/results/gtp/time.txt.log index 06315db56..d31beed5d 100644 --- a/cpp/tests/results/gtp/time.txt.log +++ b/cpp/tests/results/gtp/time.txt.log @@ -1,14 +1,14 @@ : GTP Engine starting... -: KataGo v1.3.5 +: KataGo v1.4.2 : Using 1 CPU thread(s) for search : nnRandSeed0 = forTesting -: After dedups: nnModelFile0 = models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false useNHWC false : Cuda backend: Found GPU Tesla V100-SXM2-16GB memory 16945512448 compute capability major 7 minor 0 : Cuda backend: Model version 8 useFP16 = false useNHWC = false : Cuda backend: Model name: g170-b6c96-s175395328-d26788732 : Loaded neural net with nnXLen 19 nnYLen 19 : Loaded config configs/gtp_example.cfg and/or command-line and query overrides -: Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +: Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz : Model name: g170-b6c96-s175395328-d26788732 : GTP ready, beginning main protocol loop : Controller: kata-debug-print-tc diff --git a/cpp/tests/results/gtp/time.txt.stderr b/cpp/tests/results/gtp/time.txt.stderr index 04bb26098..f38ff2399 100644 --- a/cpp/tests/results/gtp/time.txt.stderr +++ b/cpp/tests/results/gtp/time.txt.stderr @@ -1,5 +1,5 @@ -KataGo v1.3.5 +KataGo v1.4.2 Loaded config configs/gtp_example.cfg and/or command-line and query overrides -Loaded model models/g170-b6c96-s175395328-d26788732.bin.gz +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz Model name: g170-b6c96-s175395328-d26788732 GTP ready, beginning main protocol loop diff --git a/cpp/tests/results/runSearchTestsV8.txt b/cpp/tests/results/runSearchTestsV8.txt index 997b6c925..c78ad7c60 100644 --- a/cpp/tests/results/runSearchTestsV8.txt +++ b/cpp/tests/results/runSearchTestsV8.txt @@ -327,3 +327,1180 @@ O18 P16 : T -4.65c W -4.12c S -0.53c ( -1.2 L -1.2) LCB -23.28c P 13.67% WF P16 : T 7.04c W 5.76c S 1.28c ( +1.5 L +1.5) LCB 73.04c P 7.21% WF 29.81% PSV 5 N 6 -- P16 P17 S16 S15 S17 R14 +=================================================================== +Testing PDA + pondering, p200 v400 +=================================================================== +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 196 +NN batches: 196 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C5 D5 C6 +Tree: +: T 67.34c W 64.97c S 2.37c ( +8.8 L +8.9) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.48c W 65.86c S 2.62c ( +9.0 L +9.3) LCB 64.57c P 39.52% WF 8.91% PSV 115 N 115 -- D10 D4 D3 E3 C3 E4 D6 C5 +D11 : T 64.95c W 62.96c S 1.98c ( +8.4 L +8.5) LCB 56.68c P 20.40% WF 8.17% PSV 34 N 34 -- D11 D4 D3 E3 C3 D10 +C10 : T 64.45c W 62.61c S 1.84c ( +8.3 L +8.3) LCB 28.15c P 5.91% WF 8.23% PSV 9 N 9 -- C10 D10 D11 E11 C11 +L10 : T 68.31c W 65.76c S 2.55c ( +9.0 L +9.0) LCB 48.83c P 2.89% WF 8.74% PSV 8 N 8 -- L10 L11 L9 M11 D10 +L11 : T 66.06c W 64.24c S 1.82c ( +8.3 L +7.9) LCB 42.27c P 3.61% WF 8.45% PSV 7 N 7 -- L11 D10 L10 D4 +L3 : T 65.25c W 63.51c S 1.74c ( +8.2 L +7.9) LCB 23.33c P 3.64% WF 8.36% PSV 6 N 6 -- L3 D10 L4 +K3 : T 68.56c W 66.18c S 2.38c ( +8.8 L +8.8) LCB 35.42c P 2.29% WF 8.76% PSV 6 N 6 -- K3 L3 J3 J4 +K11 : T 67.59c W 65.32c S 2.27c ( +8.7 L +8.6) LCB 25.21c P 2.26% WF 8.64% PSV 5 N 6 -- K11 L11 J11 J10 G11 +L4 : T 67.83c W 65.57c S 2.26c ( +8.7 L +8.7) LCB -1.66c P 2.17% WF 8.67% PSV 5 N 5 -- L4 L3 L5 +E4 : T 51.77c W 52.21c S -0.44c ( +6.2 L +6.2) LCB -280.00c P 2.10% WF 7.42% PSV 1 N 1 -- E4 +C11 : T 59.61c W 58.88c S 0.72c ( +7.2 L +7.5) LCB -280.00c P 1.17% WF 8.01% PSV 1 N 1 -- C11 +E10 : T 54.50c W 54.42c S 0.08c ( +6.6 L +7.0) LCB -280.00c P 1.07% WF 7.62% PSV 0 N 1 -- E10 +Search next player - should clear tree and flip PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 395 +NN batches: 395 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 +Tree: +: T -61.25c W -58.10c S -3.15c ( -8.3 L -8.6) N 200 -- D4 D3 E3 C3 E4 D6 C8 +---Black(v)--- +D4 : T -62.20c W -58.90c S -3.30c ( -8.4 L -8.7) LCB -58.02c P 44.48% WF 13.53% PSV 123 N 123 -- D4 D3 E3 C3 E4 D6 C8 D8 +E3 : T -62.40c W -59.10c S -3.30c ( -8.4 L -8.9) LCB -55.06c P 14.06% WF 13.50% PSV 39 N 39 -- E3 L3 D5 K3 C5 J4 +E4 : T -57.70c W -55.04c S -2.66c ( -7.8 L -8.2) LCB -45.53c P 13.13% WF 12.27% PSV 19 N 20 -- E4 L3 L4 K3 J4 H2 +D3 : T -55.53c W -53.26c S -2.26c ( -7.5 L -7.6) LCB 31.59c P 3.70% WF 12.14% PSV 4 N 5 -- D3 D4 E3 E4 +D11 : T -56.94c W -54.48c S -2.45c ( -7.6 L -7.8) LCB 87.33c P 3.24% WF 12.39% PSV 4 N 5 -- D11 C11 E11 E10 F11 +C11 : T -55.99c W -53.98c S -2.01c ( -7.2 L -7.3) LCB 302.26c P 3.03% WF 12.33% PSV 3 N 3 -- C11 C10 D11 +C10 : T -56.40c W -54.19c S -2.21c ( -7.4 L -7.4) LCB 858.42c P 2.86% WF 12.40% PSV 3 N 3 -- C10 C11 C9 +C8 : T -46.78c W -45.82c S -0.97c ( -6.2 L -6.5) LCB 280.00c P 1.13% WF 11.45% PSV 0 N 1 -- C8 +Search next player - should clear tree and flip PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 527 +NN batches: 527 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 F12 +Tree: +: T 66.61c W 63.92c S 2.69c ( +8.6 L +8.8) N 200 -- D3 E3 C3 E4 D6 C11 C10 +---White(^)--- +D3 : T 66.96c W 64.18c S 2.78c ( +8.7 L +9.0) LCB 62.71c P 50.08% WF 21.53% PSV 116 N 116 -- D3 E3 C3 E4 D6 C11 C10 D11 +C3 : T 67.79c W 64.95c S 2.84c ( +8.7 L +8.8) LCB 62.45c P 23.52% WF 21.95% PSV 63 N 68 -- C3 D5 D3 F4 L4 L3 L5 M3 +D5 : T 58.25c W 56.84c S 1.41c ( +7.4 L +7.7) LCB 29.41c P 8.99% WF 18.61% PSV 8 N 8 -- D5 C3 C5 D3 F4 E5 +C5 : T 54.76c W 54.02c S 0.74c ( +6.7 L +7.0) LCB -7.91c P 7.31% WF 17.93% PSV 5 N 5 -- C5 D3 D5 F4 L3 +K3 : T 60.88c W 59.40c S 1.48c ( +7.4 L +7.2) LCB -280.00c P 1.23% WF 19.98% PSV 1 N 2 -- K3 L3 +Basic search with PDA 1.5, force black +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 194 +NN batches: 194 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 C7 D8 F6 +Tree: +: T -61.77c W -57.76c S -4.02c ( -8.2 L -8.6) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -60.62c W -56.76c S -3.85c ( -8.1 L -8.4) LCB -63.98c P 53.29% WF 14.31% PSV 153 N 153 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -64.52c W -60.17c S -4.35c ( -8.5 L -8.9) LCB -73.24c P 14.80% WF 13.05% PSV 23 N 23 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T -64.82c W -60.47c S -4.35c ( -8.5 L -8.8) LCB -76.95c P 10.00% WF 13.02% PSV 15 N 17 -- C10 D10 D11 E11 C11 D4 +C11 : T -70.20c W -64.56c S -5.64c ( -9.7 L -10.1) LCB -280.00c P 2.34% WF 12.54% PSV 2 N 2 -- C11 D4 +L11 : T -78.39c W -71.46c S -6.93c (-11.1 L -11.5) LCB -280.00c P 3.02% WF 11.74% PSV 1 N 1 -- L11 +L3 : T -78.67c W -71.83c S -6.84c (-11.1 L -11.7) LCB -280.00c P 2.66% WF 11.70% PSV 1 N 1 -- L3 +E4 : T -78.57c W -70.80c S -7.76c (-11.6 L -12.0) LCB -280.00c P 2.26% WF 11.71% PSV 1 N 1 -- E4 +L4 : T -76.83c W -70.45c S -6.38c (-10.6 L -11.1) LCB -280.00c P 1.08% WF 11.93% PSV 0 N 1 -- L4 +Search next player - should preserve tree +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 353 +Last search playouts: 200 +NN rows: 389 +NN batches: 389 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 L4 L3 L5 M3 L8 L9 K8 H10 +Tree: +: T -60.88c W -57.80c S -3.09c ( -8.3 L -8.6) N 353 -- E3 L4 L3 L5 M3 L8 L9 +---Black(v)--- +E3 : T -63.63c W -60.06c S -3.57c ( -8.7 L -9.1) LCB -59.30c P 14.06% WF 11.83% PSV 356 N 127 -- E3 L4 L3 L5 M3 L8 L9 K8 +D4 : T -60.54c W -57.55c S -2.99c ( -8.2 L -8.5) LCB -57.24c P 44.48% WF 10.81% PSV 171 N 171 -- D4 D3 E3 C3 E4 D6 C8 D8 +E4 : T -55.09c W -52.82c S -2.27c ( -7.5 L -7.8) LCB -41.51c P 13.13% WF 9.66% PSV 25 N 25 -- E4 L3 L4 K3 J4 J3 +D11 : T -58.01c W -55.51c S -2.50c ( -7.7 L -7.8) LCB -17.06c P 3.24% WF 10.44% PSV 8 N 8 -- D11 C11 E11 E10 F11 +D3 : T -56.07c W -53.84c S -2.22c ( -7.4 L -7.7) LCB -26.77c P 3.70% WF 10.15% PSV 7 N 7 -- D3 D4 E3 E4 F4 +C11 : T -56.78c W -54.48c S -2.30c ( -7.5 L -7.6) LCB -16.54c P 3.03% WF 10.28% PSV 6 N 6 -- C11 C10 D11 E10 D4 D3 +C10 : T -54.13c W -52.33c S -1.80c ( -7.0 L -7.1) LCB 14.96c P 2.86% WF 9.93% PSV 5 N 5 -- C10 C11 C9 B11 +C8 : T -42.29c W -41.94c S -0.35c ( -5.7 L -5.8) LCB 280.00c P 1.13% WF 9.11% PSV 1 N 1 -- C8 +F11 : T -48.46c W -47.12c S -1.34c ( -6.6 L -6.9) LCB 280.00c P 0.95% WF 9.70% PSV 1 N 1 -- F11 +D8 : T -31.50c W -32.22c S 0.72c ( -4.6 L -5.1) LCB 280.00c P 0.83% WF 8.11% PSV 0 N 1 -- D8 +Search next player - should preserve tree +HASH: E5EB22829EDFE41082611B3D0FFD7E8C + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 327 +Last search playouts: 200 +NN rows: 586 +NN batches: 586 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D5 D11 C11 E11 E10 F11 C10 +Tree: +: T -63.51c W -60.37c S -3.14c ( -8.8 L -9.1) N 327 -- D5 D11 C11 E11 E10 F11 C10 +---White(^)--- +D5 : T -61.80c W -58.99c S -2.81c ( -8.4 L -8.8) LCB -65.99c P 10.55% WF 6.07% PSV 196 N 65 -- D5 D11 C11 E11 E10 F11 C10 +L3 : T -62.29c W -59.36c S -2.93c ( -8.6 L -9.0) LCB -68.44c P 24.34% WF 6.03% PSV 117 N 117 -- L3 D5 C5 D6 C7 L4 K3 J3 +L4 : T -60.50c W -57.90c S -2.59c ( -8.3 L -8.6) LCB -68.18c P 3.10% WF 6.21% PSV 26 N 40 -- L4 L3 L5 M3 L8 D5 C5 D6 +L11 : T -69.26c W -65.17c S -4.09c ( -9.7 L -10.1) LCB -78.52c P 13.43% WF 5.16% PSV 23 N 23 -- L11 D5 L10 C5 K9 F11 E11 F10 +E4 : T -68.02c W -64.28c S -3.74c ( -9.3 L -9.7) LCB -77.62c P 8.47% WF 5.34% PSV 16 N 16 -- E4 D4 D5 D3 C3 C5 +D3 : T -65.38c W -61.85c S -3.53c ( -9.1 L -9.1) LCB -84.30c P 4.17% WF 5.63% PSV 11 N 12 -- D3 E4 D6 D4 C3 C8 +D7 : T -68.57c W -64.57c S -4.00c ( -9.5 L -9.5) LCB -87.95c P 5.67% WF 5.34% PSV 10 N 10 -- D7 D5 C5 D6 C6 +K11 : T -62.55c W -59.57c S -2.98c ( -8.6 L -9.0) LCB -85.97c P 1.76% WF 5.89% PSV 8 N 8 -- K11 L11 J11 L12 +L10 : T -61.69c W -58.87c S -2.82c ( -8.5 L -8.9) LCB -80.64c P 1.35% WF 5.98% PSV 7 N 10 -- L10 L11 L9 M11 L6 +E5 : T -71.80c W -66.78c S -5.02c (-10.5 L -10.6) LCB -150.64c P 4.66% WF 5.14% PSV 6 N 6 -- E5 C3 B3 D4 C5 +D6 : T -70.52c W -66.34c S -4.18c ( -9.7 L -9.7) LCB -125.19c P 2.91% WF 5.26% PSV 4 N 5 -- D6 C11 C10 D11 +G11 : T -68.15c W -63.95c S -4.20c ( -9.8 L -10.4) LCB -230.24c P 2.02% WF 5.47% PSV 4 N 4 -- G11 D5 C5 D6 +G10 : T -70.09c W -65.67c S -4.42c ( -9.9 L -10.5) LCB -598.78c P 2.20% WF 5.36% PSV 3 N 3 -- G10 D5 C5 +H11 : T -70.71c W -66.01c S -4.70c (-10.3 L -10.3) LCB -280.00c P 1.39% WF 5.36% PSV 2 N 2 -- H11 D5 +F11 : T -65.73c W -61.98c S -3.75c ( -9.3 L -9.8) LCB -280.00c P 1.10% WF 5.67% PSV 2 N 2 -- F11 D5 +C7 : T -73.37c W -67.96c S -5.41c (-10.7 L -11.4) LCB -280.00c P 1.31% WF 5.29% PSV 1 N 1 -- C7 +F10 : T -69.54c W -64.67c S -4.87c (-10.3 L -11.1) LCB -280.00c P 0.99% WF 5.49% PSV 1 N 1 -- F10 +D8 : T -73.04c W -67.39c S -5.65c (-11.0 L -11.6) LCB -280.00c P 0.88% WF 5.31% PSV 1 N 1 -- D8 +Search next player PONDERING - should preserve tree +HASH: 959D9A308086353FF0883EE1398AE052 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . O . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 365 +Last search playouts: 300 +NN rows: 872 +NN batches: 872 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D11 C11 E11 E10 F11 C10 F10 L3 +Tree: +: T -60.37c W -57.63c S -2.74c ( -8.2 L -8.5) N 365 -- D11 C11 E11 E10 F11 C10 F10 +---Black(v)--- +D11 : T -64.03c W -60.69c S -3.34c ( -8.7 L -9.0) LCB -57.31c P 4.39% WF 5.01% PSV 73 N 73 -- D11 C11 E11 E10 F11 C10 F10 L3 +C10 : T -62.67c W -59.48c S -3.20c ( -8.6 L -8.9) LCB -55.78c P 5.82% WF 4.82% PSV 47 N 51 -- C10 C11 C9 D11 E8 F4 C3 B3 +G4 : T -58.55c W -56.11c S -2.45c ( -7.9 L -8.4) LCB -46.39c P 8.50% WF 4.40% PSV 25 N 25 -- G4 L3 L4 K3 H3 M4 M5 M3 +F11 : T -62.16c W -59.12c S -3.03c ( -8.5 L -8.7) LCB -54.37c P 3.92% WF 4.73% PSV 25 N 25 -- F11 L3 L4 K3 H3 J3 J4 +H4 : T -58.22c W -55.90c S -2.32c ( -7.8 L -8.5) LCB -45.82c P 7.50% WF 4.38% PSV 22 N 23 -- H4 L4 L5 L3 M5 J2 +F10 : T -59.28c W -56.71c S -2.57c ( -8.0 L -8.5) LCB -51.37c P 6.47% WF 4.47% PSV 22 N 22 -- F10 D8 D11 C11 E11 C12 +C11 : T -58.17c W -55.91c S -2.26c ( -7.7 L -8.0) LCB -45.00c P 7.16% WF 4.38% PSV 20 N 20 -- C11 C10 D11 E10 F11 E11 E12 D12 +G11 : T -60.38c W -57.58c S -2.80c ( -8.3 L -8.5) LCB -48.89c P 3.99% WF 4.57% PSV 17 N 20 -- G11 L3 L4 K3 H3 J3 J4 +E10 : T -60.21c W -57.60c S -2.61c ( -8.0 L -8.4) LCB -47.33c P 3.89% WF 4.56% PSV 16 N 19 -- E10 D11 D9 E9 E11 E12 +D9 : T -62.36c W -59.47c S -2.89c ( -8.3 L -8.5) LCB -52.22c P 2.17% WF 4.73% PSV 15 N 16 -- D9 C10 E10 E9 E11 D8 +G10 : T -60.17c W -57.39c S -2.78c ( -8.2 L -8.8) LCB -48.89c P 3.67% WF 4.55% PSV 14 N 14 -- G10 L3 L4 K3 H3 +C3 : T -53.19c W -51.55c S -1.63c ( -7.1 L -7.5) LCB -28.25c P 6.89% WF 4.03% PSV 11 N 11 -- C3 B3 D4 C5 E5 E6 F5 +C8 : T -59.92c W -57.10c S -2.82c ( -8.3 L -8.5) LCB -36.91c P 3.15% WF 4.53% PSV 11 N 11 -- C8 F4 G3 G4 +F4 : T -56.60c W -54.69c S -1.91c ( -7.4 L -7.9) LCB -27.03c P 4.46% WF 4.29% PSV 10 N 10 -- F4 L3 L4 K3 J3 +F5 : T -52.78c W -51.19c S -1.59c ( -7.1 L -7.7) LCB -24.57c P 4.92% WF 4.05% PSV 8 N 8 -- F5 L3 L4 K3 H3 +E5 : T -55.07c W -53.24c S -1.83c ( -7.3 L -7.3) LCB 5.14c P 2.61% WF 4.23% PSV 5 N 6 -- E5 E6 F5 F6 +D8 : T -49.10c W -47.66c S -1.44c ( -7.0 L -7.2) LCB 1018.37c P 1.71% WF 3.96% PSV 2 N 3 -- D8 F4 F3 +H10 : T -52.74c W -51.23c S -1.51c ( -7.0 L -7.7) LCB 280.00c P 1.50% WF 4.19% PSV 2 N 2 -- H10 L3 +D7 : T -45.92c W -45.25c S -0.67c ( -6.2 L -6.7) LCB 280.00c P 1.23% WF 3.98% PSV 1 N 1 -- D7 +J3 : T -48.13c W -47.53c S -0.59c ( -6.1 L -6.9) LCB 280.00c P 1.04% WF 4.06% PSV 1 N 1 -- J3 +H11 : T -52.93c W -51.28c S -1.65c ( -7.1 L -7.8) LCB 280.00c P 0.91% WF 4.26% PSV 1 N 1 -- H11 +H3 : T -40.03c W -40.81c S 0.78c ( -4.9 L -5.7) LCB 280.00c P 1.12% WF 3.74% PSV 0 N 1 -- H3 +D4 : T -48.15c W -47.85c S -0.30c ( -5.9 L -5.9) LCB 280.00c P 0.68% WF 4.07% PSV 0 N 1 -- D4 +Search next player - should preserve tree +HASH: CA851C9514F1314793835A721542FBA2 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . X . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . O . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 273 +Last search playouts: 200 +NN rows: 1047 +NN batches: 1047 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: C11 E11 E10 F11 C10 F10 L3 L4 K3 H3 J3 +Tree: +: T -61.40c W -58.65c S -2.75c ( -8.4 L -8.7) N 273 -- C11 E11 E10 F11 C10 F10 L3 +---White(^)--- +C11 : T -59.30c W -56.93c S -2.37c ( -8.0 L -8.4) LCB -63.68c P 41.26% WF 17.40% PSV 205 N 205 -- C11 E11 E10 F11 C10 F10 L3 L4 +E11 : T -66.55c W -62.86c S -3.69c ( -9.3 L -9.6) LCB -76.61c P 16.57% WF 14.50% PSV 27 N 28 -- E11 C11 C10 E12 F12 F11 E10 G12 +E10 : T -67.85c W -64.01c S -3.84c ( -9.4 L -9.6) LCB -81.01c P 17.47% WF 14.13% PSV 25 N 25 -- E10 C10 C9 C11 B9 F11 L3 L4 +C10 : T -69.84c W -65.37c S -4.47c (-10.0 L -10.3) LCB -89.90c P 8.56% WF 14.03% PSV 10 N 10 -- C10 E11 E10 F10 C11 +L3 : T -82.59c W -75.94c S -6.65c (-12.2 L -12.1) LCB -280.00c P 2.69% WF 12.60% PSV 1 N 2 -- L3 C10 +L11 : T -77.04c W -71.39c S -5.65c (-11.2 L -11.9) LCB -280.00c P 1.79% WF 13.93% PSV 1 N 1 -- L11 +F4 : T -80.65c W -73.73c S -6.93c (-12.3 L -13.2) LCB -280.00c P 1.55% WF 13.42% PSV 1 N 1 -- F4 +Basic search with PDA 1.5, force white +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 194 +NN batches: 194 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 D11 C10 D9 +Tree: +: T 66.74c W 64.58c S 2.17c ( +8.8 L +8.9) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 67.85c W 65.43c S 2.42c ( +9.0 L +9.3) LCB 63.97c P 43.51% WF 10.67% PSV 125 N 125 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 64.80c W 63.06c S 1.74c ( +8.4 L +8.5) LCB 56.68c P 15.72% WF 9.91% PSV 27 N 27 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T 63.41c W 61.93c S 1.48c ( +8.1 L +8.3) LCB 53.68c P 10.31% WF 9.70% PSV 15 N 16 -- C10 D10 D11 E11 C11 D4 D3 +L10 : T 70.00c W 67.39c S 2.61c ( +9.2 L +9.0) LCB 41.03c P 1.67% WF 10.82% PSV 8 N 8 -- L10 L11 L9 M11 D10 +K3 : T 64.64c W 62.74c S 1.90c ( +8.5 L +8.6) LCB 39.51c P 3.57% WF 10.01% PSV 6 N 6 -- K3 L3 J3 J4 +K11 : T 65.90c W 64.01c S 1.89c ( +8.5 L +8.6) LCB -4.81c P 2.73% WF 10.20% PSV 5 N 5 -- K11 L11 J11 J10 H11 +L3 : T 61.44c W 60.34c S 1.10c ( +7.8 L +7.7) LCB -195.91c P 3.18% WF 9.62% PSV 4 N 4 -- L3 D10 L4 +L11 : T 63.03c W 61.85c S 1.18c ( +7.8 L +7.7) LCB -21.37c P 3.13% WF 9.83% PSV 4 N 4 -- L11 D10 K11 +L4 : T 63.00c W 61.53c S 1.47c ( +8.1 L +7.9) LCB -539.44c P 2.31% WF 9.86% PSV 3 N 3 -- L4 L3 L5 +C11 : T 56.72c W 56.59c S 0.14c ( +6.9 L +7.0) LCB -280.00c P 1.07% WF 9.38% PSV 0 N 1 -- C11 +Search next player - should preserve tree +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 325 +Last search playouts: 200 +NN rows: 393 +NN batches: 393 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 F12 +Tree: +: T 69.37c W 66.04c S 3.33c ( +9.1 L +9.4) N 325 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 67.16c W 64.30c S 2.87c ( +8.7 L +8.9) LCB 70.78c P 29.24% WF 6.73% PSV 187 N 187 -- D4 D3 E3 C3 E4 D6 C11 C10 +E3 : T 72.14c W 68.23c S 3.92c ( +9.7 L +9.9) LCB 77.38c P 21.38% WF 5.85% PSV 52 N 52 -- E3 L3 L4 K3 J3 J2 +E4 : T 71.48c W 67.37c S 4.10c ( +9.9 L +10.1) LCB 80.81c P 12.40% WF 5.98% PSV 33 N 35 -- E4 L3 L4 K3 H3 J3 +D3 : T 70.45c W 67.04c S 3.41c ( +9.2 L +9.6) LCB 83.80c P 4.35% WF 6.15% PSV 13 N 13 -- D3 D4 E3 C3 H4 L10 +C11 : T 72.67c W 68.79c S 3.88c ( +9.7 L +10.1) LCB 88.96c P 5.63% WF 5.92% PSV 12 N 12 -- C11 C10 D11 E10 F11 E11 E12 +G4 : T 75.50c W 71.33c S 4.17c ( +9.9 L +10.4) LCB 161.42c P 2.35% WF 5.77% PSV 4 N 4 -- G4 E4 C11 C10 +D11 : T 76.31c W 72.09c S 4.22c ( +9.9 L +10.3) LCB 558.10c P 2.31% WF 5.74% PSV 3 N 3 -- D11 C11 E11 +G10 : T 75.95c W 71.32c S 4.63c (+10.3 L +10.9) LCB 354.95c P 1.93% WF 5.77% PSV 3 N 3 -- G10 E4 G3 +F11 : T 77.28c W 72.74c S 4.53c (+10.2 L +10.8) LCB 280.00c P 1.55% WF 5.73% PSV 2 N 2 -- F11 E4 +C10 : T 73.55c W 69.75c S 3.80c ( +9.5 L +9.8) LCB 280.00c P 1.17% WF 5.98% PSV 2 N 2 -- C10 C11 +F10 : T 73.12c W 68.98c S 4.14c ( +9.8 L +10.4) LCB 280.00c P 0.98% WF 6.01% PSV 2 N 2 -- F10 E4 +F3 : T 78.54c W 73.39c S 5.15c (+10.8 L +10.7) LCB 280.00c P 1.38% WF 5.65% PSV 1 N 2 -- F3 L3 +H4 : T 77.38c W 72.52c S 4.87c (+10.4 L +10.9) LCB 280.00c P 1.32% WF 5.72% PSV 1 N 2 -- H4 E4 +F4 : T 77.97c W 73.22c S 4.75c (+10.5 L +10.3) LCB 280.00c P 1.25% WF 5.68% PSV 1 N 2 -- F4 L3 +E10 : T 79.65c W 75.03c S 4.62c (+10.3 L +10.9) LCB 280.00c P 1.08% WF 5.68% PSV 1 N 1 -- E10 +G11 : T 75.53c W 70.42c S 5.12c (+10.7 L +11.4) LCB 280.00c P 0.95% WF 5.91% PSV 1 N 1 -- G11 +G3 : T 78.34c W 73.04c S 5.30c (+10.9 L +11.4) LCB 280.00c P 0.91% WF 5.75% PSV 1 N 1 -- G3 +Search next player - should preserve tree +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 387 +Last search playouts: 200 +NN rows: 589 +NN batches: 589 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 F12 F11 E10 +Tree: +: T 66.68c W 63.65c S 3.03c ( +8.6 L +8.8) N 387 -- D3 E3 C3 E4 D6 C11 C10 +---White(^)--- +D3 : T 68.01c W 64.74c S 3.27c ( +8.9 L +9.1) LCB 64.96c P 50.58% WF 16.43% PSV 296 N 296 -- D3 E3 C3 E4 D6 C11 C10 D11 +C3 : T 64.78c W 62.14c S 2.64c ( +8.2 L +8.2) LCB 58.38c P 18.41% WF 14.90% PSV 58 N 59 -- C3 D5 D3 F4 G11 E3 C6 C11 +D5 : T 54.60c W 53.39c S 1.22c ( +6.9 L +7.2) LCB 35.17c P 13.50% WF 12.25% PSV 17 N 17 -- D5 C3 C5 D3 F5 G4 L3 +C5 : T 58.28c W 56.71c S 1.57c ( +7.2 L +7.4) LCB 45.01c P 7.29% WF 13.49% PSV 11 N 11 -- C5 D3 D5 F4 L3 L4 K3 +K11 : T 58.26c W 57.52c S 0.74c ( +6.4 L +5.6) LCB -280.00c P 1.14% WF 14.43% PSV 1 N 1 -- K11 +L10 : T 59.86c W 58.74c S 1.13c ( +6.8 L +6.0) LCB -280.00c P 1.08% WF 14.65% PSV 1 N 1 -- L10 +L4 : T 54.23c W 53.74c S 0.49c ( +6.2 L +5.1) LCB -280.00c P 0.71% WF 13.87% PSV 0 N 1 -- L4 +Search next player PONDERING - should preserve tree +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 596 +Last search playouts: 300 +NN rows: 881 +NN batches: 881 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: E3 C3 C11 C10 D11 E10 F11 E11 E12 F12 G12 D12 F13 C12 +Tree: +: T 68.00c W 64.86c S 3.14c ( +8.9 L +9.1) N 596 -- E3 C3 C11 C10 D11 E10 F11 +---Black(v)--- +E3 : T 66.38c W 63.48c S 2.89c ( +8.6 L +8.9) LCB 68.77c P 44.24% WF 9.85% PSV 471 N 471 -- E3 C3 C11 C10 D11 E10 F11 E11 +C5 : T 74.89c W 70.81c S 4.08c ( +9.8 L +9.8) LCB 79.58c P 29.27% WF 7.55% PSV 76 N 76 -- C5 C3 C10 C9 C11 D9 E12 E4 +C11 : T 73.73c W 69.58c S 4.15c ( +9.9 L +10.3) LCB 82.74c P 10.17% WF 8.10% PSV 29 N 29 -- C11 C10 D11 E10 E3 E4 D5 F3 +C3 : T 73.09c W 68.58c S 4.51c (+10.3 L +10.6) LCB 146.12c P 2.44% WF 8.50% PSV 7 N 7 -- C3 E3 C5 B4 E4 +D11 : T 78.75c W 74.03c S 4.72c (+10.4 L +10.9) LCB 677.52c P 1.76% WF 8.02% PSV 3 N 3 -- D11 C11 E11 +C10 : T 80.47c W 75.10c S 5.37c (+11.0 L +11.1) LCB 280.00c P 1.62% WF 7.97% PSV 2 N 2 -- C10 C11 +F11 : T 79.61c W 74.39c S 5.22c (+10.9 L +10.8) LCB 280.00c P 0.64% WF 8.05% PSV 1 N 2 -- F11 L11 +E4 : T 80.49c W 75.80c S 4.70c (+10.2 L +11.2) LCB 280.00c P 1.04% WF 8.15% PSV 1 N 1 -- E4 +E10 : T 75.58c W 71.19c S 4.39c (+10.0 L +10.6) LCB 280.00c P 0.60% WF 8.55% PSV 1 N 1 -- E10 +G11 : T 73.66c W 69.09c S 4.57c (+10.1 L +11.1) LCB 280.00c P 0.60% WF 8.71% PSV 1 N 1 -- G11 +G10 : T 72.02c W 67.99c S 4.02c ( +9.6 L +10.6) LCB 280.00c P 0.54% WF 8.85% PSV 1 N 1 -- G10 +D5 : T 86.15c W 79.99c S 6.16c (+11.6 L +12.1) LCB 280.00c P 0.57% WF 7.70% PSV 0 N 1 -- D5 +Search next player PONDERING - an extra time, should preserve tree +HASH: 3CE07EBDEC180D0C4D1F494DACE35DEF + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 600 +Last search playouts: 129 +NN rows: 1006 +NN batches: 1006 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: C3 C11 C10 D11 E10 F11 G3 F10 F9 G9 E11 +Tree: +: T 66.34c W 63.27c S 3.07c ( +8.7 L +8.9) N 600 -- C3 C11 C10 D11 E10 F11 G3 +---White(^)--- +C3 : T 67.47c W 64.32c S 3.15c ( +8.7 L +8.9) LCB 65.21c P 52.60% WF 16.56% PSV 457 N 457 -- C3 C11 C10 D11 E10 F11 G3 F10 +E4 : T 63.86c W 60.24c S 3.62c ( +9.3 L +9.9) LCB 54.26c P 17.10% WF 14.78% PSV 72 N 72 -- E4 D5 F3 E2 C3 F2 G3 G2 +D5 : T 62.58c W 60.49c S 2.10c ( +7.7 L +7.8) LCB 56.46c P 14.49% WF 14.37% PSV 51 N 52 -- D5 E4 C3 E5 D6 E6 D7 L5 +C5 : T 59.97c W 58.09c S 1.89c ( +7.5 L +7.6) LCB 26.02c P 3.15% WF 14.27% PSV 8 N 8 -- C5 D2 C3 C11 +D2 : T 51.12c W 50.42c S 0.70c ( +6.4 L +6.6) LCB -36.57c P 5.22% WF 12.34% PSV 7 N 7 -- D2 C5 D5 E4 C6 +E2 : T 55.77c W 54.43c S 1.34c ( +7.0 L +7.4) LCB -280.00c P 0.96% WF 14.01% PSV 1 N 2 -- E2 E4 +C2 : T 51.30c W 50.95c S 0.35c ( +6.1 L +6.8) LCB -280.00c P 1.01% WF 13.66% PSV 1 N 1 -- C2 +Search next player - should preserve tree +HASH: 8651A60659E1A9036654CB5DB57F2E27 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . O O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 457 +Last search playouts: 0 +NN rows: 1006 +NN batches: 1006 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: C11 C10 D11 E10 F11 G3 F10 F9 G9 E11 +Tree: +: T 67.42c W 64.32c S 3.09c ( +8.7 L +8.9) N 457 -- C11 C10 D11 E10 F11 G3 F10 +---Black(v)--- +C11 : T 64.89c W 62.20c S 2.69c ( +8.4 L +8.5) LCB 68.39c P 16.99% WF 8.40% PSV 418 N 193 -- C11 C10 D11 E10 F11 G3 F10 F9 +E4 : T 67.55c W 64.29c S 3.26c ( +8.9 L +9.2) LCB 71.18c P 35.29% WF 7.71% PSV 178 N 178 -- E4 D6 C11 C10 D11 E11 E12 F12 +D5 : T 74.59c W 70.87c S 3.72c ( +9.2 L +9.3) LCB 83.32c P 13.45% WF 6.59% PSV 28 N 29 -- D5 E2 F3 F2 G3 G11 C11 C10 +F4 : T 74.26c W 70.64c S 3.62c ( +9.2 L +9.1) LCB 95.63c P 4.53% WF 6.87% PSV 9 N 11 -- F4 D5 C11 C10 D11 E10 +H4 : T 71.79c W 68.45c S 3.34c ( +8.9 L +8.8) LCB 96.71c P 3.31% WF 7.20% PSV 9 N 9 -- H4 L11 L10 K11 J10 +D11 : T 70.80c W 67.34c S 3.46c ( +9.1 L +9.3) LCB 107.04c P 2.87% WF 7.33% PSV 8 N 8 -- D11 E11 C11 C10 +G10 : T 71.34c W 67.69c S 3.64c ( +9.1 L +9.3) LCB 108.52c P 2.75% WF 7.29% PSV 7 N 7 -- G10 D5 H3 +G11 : T 69.41c W 65.89c S 3.53c ( +9.1 L +9.4) LCB 108.95c P 1.81% WF 7.51% PSV 6 N 6 -- G11 L3 L4 K3 J4 +F11 : T 71.87c W 68.19c S 3.68c ( +9.3 L +9.2) LCB 178.34c P 2.02% WF 7.26% PSV 5 N 5 -- F11 L11 L10 K11 +C10 : T 77.16c W 72.65c S 4.50c (+10.1 L +10.4) LCB 318.75c P 2.11% WF 6.84% PSV 3 N 3 -- C10 C11 C9 +E10 : T 74.23c W 70.56c S 3.67c ( +9.2 L +9.3) LCB 280.00c P 1.39% WF 7.16% PSV 2 N 2 -- E10 D11 +E5 : T 79.72c W 74.62c S 5.09c (+10.6 L +10.2) LCB 280.00c P 1.22% WF 6.71% PSV 1 N 2 -- E5 E2 +H11 : T 80.51c W 75.05c S 5.45c (+10.9 L +10.5) LCB 280.00c P 0.97% WF 6.65% PSV 1 N 2 -- H11 L3 +G3 : T 85.59c W 79.37c S 6.22c (+11.6 L +11.7) LCB 280.00c P 1.11% WF 6.47% PSV 1 N 1 -- G3 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 199 +NN batches: 199 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 +Tree: +: T 67.83c W 65.53c S 2.30c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 C11 C10 +---White(^)--- +D10 : T 68.48c W 66.04c S 2.44c ( +9.0 L +9.2) LCB 64.33c P 42.40% WF 9.52% PSV 111 N 111 -- D10 D4 D3 E3 C3 C11 C10 D11 +D11 : T 66.61c W 64.50c S 2.11c ( +8.7 L +8.8) LCB 59.53c P 19.31% WF 9.09% PSV 38 N 38 -- D11 D4 D3 E3 C3 E4 +L11 : T 70.33c W 67.77c S 2.56c ( +9.2 L +8.8) LCB 55.96c P 3.18% WF 9.72% PSV 11 N 11 -- L11 D10 K11 E3 +C10 : T 63.57c W 61.94c S 1.63c ( +8.2 L +8.5) LCB 30.29c P 6.37% WF 8.72% PSV 8 N 9 -- C10 D4 D3 E3 C3 D10 +K11 : T 70.25c W 67.70c S 2.54c ( +9.1 L +9.0) LCB 49.54c P 2.08% WF 9.68% PSV 8 N 8 -- K11 L11 J11 J10 H11 +L4 : T 67.83c W 65.49c S 2.33c ( +8.9 L +9.0) LCB 30.08c P 3.27% WF 9.33% PSV 7 N 7 -- L4 L3 L5 M3 D10 +L3 : T 66.29c W 64.34c S 1.95c ( +8.6 L +8.3) LCB 18.77c P 3.49% WF 9.13% PSV 6 N 6 -- L3 D10 L4 K5 +K3 : T 65.93c W 63.91c S 2.02c ( +8.6 L +8.6) LCB 15.72c P 3.27% WF 9.10% PSV 5 N 5 -- K3 L3 J3 J4 +L10 : T 62.87c W 61.66c S 1.21c ( +7.8 L +7.8) LCB -280.00c P 1.90% WF 8.84% PSV 2 N 2 -- L10 L11 +E10 : T 56.04c W 56.03c S 0.01c ( +6.7 L +7.1) LCB -280.00c P 1.32% WF 8.35% PSV 1 N 1 -- E10 +J4 : T 58.22c W 57.84c S 0.37c ( +7.1 L +6.7) LCB -280.00c P 1.22% WF 8.53% PSV 1 N 1 -- J4 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 411 +Last search playouts: 300 +NN rows: 488 +NN batches: 488 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 +Tree: +: T 68.32c W 65.23c S 3.08c ( +8.9 L +9.1) N 411 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 65.95c W 63.33c S 2.63c ( +8.5 L +8.7) LCB 69.33c P 21.01% WF 7.23% PSV 278 N 197 -- D4 D3 E3 C3 E4 D6 C11 C10 +E3 : T 68.48c W 65.31c S 3.17c ( +9.0 L +9.2) LCB 72.60c P 25.36% WF 6.66% PSV 116 N 116 -- E3 L3 D5 C5 D6 C7 K3 +D3 : T 70.89c W 67.49c S 3.40c ( +9.1 L +9.5) LCB 77.58c P 10.78% WF 6.32% PSV 33 N 33 -- D3 D4 E3 C3 E4 E5 F5 E6 +C11 : T 73.93c W 69.86c S 4.07c ( +9.8 L +10.3) LCB 82.94c P 10.76% WF 5.95% PSV 23 N 24 -- C11 C10 D11 E10 F11 E11 E12 F12 +E4 : T 75.15c W 70.68c S 4.46c (+10.3 L +10.3) LCB 88.64c P 9.61% WF 5.85% PSV 18 N 18 -- E4 L3 K3 L4 L5 M5 +G4 : T 73.54c W 69.68c S 3.86c ( +9.6 L +10.1) LCB 129.28c P 1.95% WF 6.24% PSV 4 N 4 -- G4 E4 C11 C10 +D11 : T 72.71c W 68.97c S 3.73c ( +9.5 L +9.9) LCB 260.63c P 1.54% WF 6.34% PSV 3 N 3 -- D11 C11 E11 +G11 : T 74.06c W 69.61c S 4.44c (+10.1 L +10.8) LCB 392.10c P 1.25% WF 6.23% PSV 2 N 3 -- G11 E4 G3 +G10 : T 73.61c W 69.23c S 4.38c (+10.0 L +10.8) LCB 640.29c P 1.15% WF 6.26% PSV 2 N 3 -- G10 E4 H3 +F3 : T 78.44c W 73.42c S 5.02c (+10.7 L +10.6) LCB 280.00c P 1.79% WF 5.96% PSV 2 N 2 -- F3 L3 +C10 : T 78.90c W 74.10c S 4.79c (+10.5 L +10.6) LCB 280.00c P 1.38% WF 5.93% PSV 2 N 2 -- C10 C11 +F4 : T 76.72c W 71.55c S 5.17c (+10.8 L +11.1) LCB 280.00c P 1.11% WF 6.18% PSV 1 N 1 -- F4 +F11 : T 78.54c W 73.57c S 4.97c (+10.6 L +11.5) LCB 280.00c P 1.00% WF 6.07% PSV 1 N 1 -- F11 +G3 : T 75.02c W 70.23c S 4.79c (+10.4 L +10.9) LCB 280.00c P 0.92% WF 6.28% PSV 1 N 1 -- G3 +H4 : T 77.77c W 72.07c S 5.70c (+11.2 L +11.8) LCB 280.00c P 0.91% WF 6.11% PSV 1 N 1 -- H4 +H3 : T 73.03c W 68.64c S 4.39c (+10.0 L +11.1) LCB 280.00c P 0.71% WF 6.40% PSV 1 N 1 -- H3 +Search next player - should keep tree from ponder +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 397 +Last search playouts: 200 +NN rows: 683 +NN batches: 683 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 F12 G12 D12 +Tree: +: T 66.29c W 63.28c S 3.02c ( +8.5 L +8.6) N 397 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.48c W 64.28c S 3.21c ( +8.6 L +8.9) LCB 64.73c P 50.58% WF 16.01% PSV 290 N 290 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 65.42c W 62.57c S 2.85c ( +8.3 L +8.2) LCB 60.32c P 18.41% WF 14.97% PSV 69 N 69 -- C3 D5 D3 F4 L10 L11 L9 M11 +D5 : T 56.24c W 54.64c S 1.59c ( +7.1 L +7.4) LCB 37.30c P 13.50% WF 12.43% PSV 20 N 20 -- D5 C3 C5 D3 F5 G4 L3 L4 +C5 : T 58.39c W 56.64c S 1.75c ( +7.2 L +7.4) LCB 42.44c P 7.29% WF 13.30% PSV 12 N 12 -- C5 D3 D5 F4 L3 K3 L4 L5 +L10 : T 61.23c W 59.07c S 2.16c ( +7.6 L +7.2) LCB -280.00c P 1.08% WF 14.47% PSV 2 N 2 -- L10 L11 +L4 : T 62.17c W 60.07c S 2.10c ( +7.6 L +7.2) LCB -280.00c P 0.71% WF 14.62% PSV 1 N 2 -- L4 L3 +K11 : T 58.43c W 57.52c S 0.90c ( +6.4 L +5.6) LCB -280.00c P 1.14% WF 14.21% PSV 1 N 1 -- K11 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 197 +NN batches: 197 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 D11 C10 +Tree: +: T 68.19c W 65.85c S 2.34c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.98c W 66.47c S 2.51c ( +9.1 L +9.3) LCB 64.78c P 43.51% WF 10.39% PSV 115 N 115 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 66.71c W 64.61c S 2.11c ( +8.7 L +8.8) LCB 56.07c P 15.72% WF 9.84% PSV 29 N 29 -- D11 D10 C10 E11 C11 D4 +C10 : T 64.23c W 62.53c S 1.70c ( +8.3 L +8.5) LCB 50.97c P 10.31% WF 9.44% PSV 14 N 15 -- C10 D10 D11 E11 C11 +L11 : T 70.20c W 67.73c S 2.47c ( +9.1 L +8.7) LCB 54.84c P 3.13% WF 10.47% PSV 10 N 10 -- L11 D10 K11 E3 +K3 : T 67.53c W 65.46c S 2.08c ( +8.7 L +8.5) LCB 35.43c P 3.57% WF 10.05% PSV 7 N 8 -- K3 L3 J3 J4 H3 +L10 : T 70.88c W 68.14c S 2.74c ( +9.3 L +9.2) LCB 15.81c P 1.67% WF 10.53% PSV 6 N 6 -- L10 L11 L9 K11 D10 +L3 : T 65.27c W 63.46c S 1.81c ( +8.4 L +8.2) LCB 9.73c P 3.18% WF 9.75% PSV 5 N 5 -- L3 D10 L4 +L4 : T 67.91c W 65.61c S 2.29c ( +8.9 L +8.9) LCB -3.98c P 2.31% WF 10.11% PSV 5 N 5 -- L4 L3 L5 M3 D10 +K11 : T 66.48c W 64.59c S 1.90c ( +8.5 L +8.4) LCB -20.27c P 2.73% WF 9.92% PSV 4 N 5 -- K11 L11 J11 J10 H11 +C11 : T 61.06c W 60.51c S 0.56c ( +7.2 L +7.5) LCB -280.00c P 1.07% WF 9.50% PSV 1 N 1 -- C11 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 415 +Last search playouts: 300 +NN rows: 493 +NN batches: 493 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 H4 L11 L10 K11 J10 H12 +Tree: +: T 69.24c W 66.05c S 3.18c ( +9.0 L +9.2) N 415 -- D4 D3 E3 C3 E4 D6 H4 +---Black(v)--- +D4 : T 67.14c W 64.40c S 2.74c ( +8.6 L +8.8) LCB 70.13c P 29.24% WF 6.41% PSV 251 N 251 -- D4 D3 E3 C3 E4 D6 H4 L11 +E3 : T 71.30c W 67.63c S 3.67c ( +9.5 L +9.6) LCB 76.44c P 21.38% WF 5.64% PSV 71 N 71 -- E3 L3 D5 K3 C5 J4 C11 D11 +E4 : T 73.85c W 69.53c S 4.32c (+10.2 L +10.3) LCB 84.35c P 12.40% WF 5.38% PSV 30 N 30 -- E4 L3 K3 L4 K5 L5 C3 +D3 : T 70.03c W 66.68c S 3.35c ( +9.2 L +9.4) LCB 78.05c P 4.35% WF 5.87% PSV 17 N 17 -- D3 D4 E3 C3 E4 L3 K3 +C11 : T 72.62c W 68.86c S 3.76c ( +9.6 L +10.0) LCB 88.05c P 5.63% WF 5.60% PSV 15 N 15 -- C11 C10 D11 E10 E11 F10 D4 +G4 : T 74.33c W 70.43c S 3.90c ( +9.6 L +10.0) LCB 113.86c P 2.35% WF 5.54% PSV 5 N 5 -- G4 E4 C11 C10 +D11 : T 78.32c W 73.90c S 4.41c (+10.2 L +10.7) LCB 177.20c P 2.31% WF 5.27% PSV 3 N 4 -- D11 C11 E11 E10 +G10 : T 78.38c W 73.51c S 4.88c (+10.6 L +11.0) LCB 249.38c P 1.93% WF 5.26% PSV 3 N 4 -- G10 E4 G3 L10 +F11 : T 74.86c W 70.29c S 4.57c (+10.3 L +11.0) LCB 510.61c P 1.55% WF 5.56% PSV 3 N 3 -- F11 E4 G3 +C10 : T 75.52c W 71.38c S 4.14c ( +9.9 L +10.3) LCB 686.78c P 1.17% WF 5.51% PSV 2 N 3 -- C10 C11 C9 +F3 : T 78.25c W 73.22c S 5.04c (+10.8 L +10.7) LCB 280.00c P 1.38% WF 5.38% PSV 2 N 2 -- F3 L3 +H4 : T 76.26c W 71.51c S 4.75c (+10.4 L +10.8) LCB 280.00c P 1.32% WF 5.50% PSV 2 N 2 -- H4 E4 +F4 : T 78.81c W 73.83c S 4.98c (+10.7 L +10.3) LCB 280.00c P 1.25% WF 5.34% PSV 2 N 2 -- F4 L3 +E10 : T 77.03c W 72.91c S 4.12c ( +9.9 L +10.7) LCB 280.00c P 1.08% WF 5.53% PSV 1 N 1 -- E10 +F10 : T 77.00c W 72.17c S 4.82c (+10.6 L +11.1) LCB 280.00c P 0.98% WF 5.53% PSV 1 N 1 -- F10 +G11 : T 77.36c W 72.28c S 5.08c (+10.8 L +11.3) LCB 280.00c P 0.95% WF 5.51% PSV 1 N 1 -- G11 +G3 : T 78.29c W 73.04c S 5.25c (+10.9 L +11.4) LCB 280.00c P 0.91% WF 5.47% PSV 1 N 1 -- G3 +H3 : T 73.95c W 69.27c S 4.68c (+10.3 L +10.9) LCB 280.00c P 0.67% WF 5.70% PSV 1 N 1 -- H3 +Search next player PONDERING an extra time - should keep prior tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 551 +Last search playouts: 300 +NN rows: 785 +NN batches: 785 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 C11 C10 D11 E10 F11 E11 E12 +Tree: +: T 67.05c W 64.00c S 3.04c ( +8.6 L +8.8) N 551 -- D3 E3 C3 E4 D6 C11 C10 +---White(^)--- +D3 : T 68.26c W 65.03c S 3.23c ( +8.8 L +9.0) LCB 65.97c P 54.98% WF 11.51% PSV 459 N 459 -- D3 E3 C3 E4 D6 C11 C10 D11 +C3 : T 62.41c W 60.11c S 2.30c ( +7.9 L +7.9) LCB 54.35c P 14.16% WF 9.77% PSV 43 N 44 -- C3 D5 D3 F4 G11 E3 C6 C11 +D5 : T 56.14c W 54.64c S 1.51c ( +7.1 L +7.5) LCB 40.45c P 11.29% WF 8.68% PSV 20 N 21 -- D5 C3 C5 D3 F4 F3 G3 +C5 : T 60.45c W 58.35c S 2.10c ( +7.7 L +8.0) LCB 46.53c P 5.54% WF 9.69% PSV 13 N 14 -- C5 D3 D5 F4 L3 L4 K3 J4 +L10 : T 54.18c W 53.40c S 0.78c ( +6.4 L +6.5) LCB -280.00c P 1.58% WF 9.44% PSV 2 N 2 -- L10 L11 +K11 : T 60.60c W 58.66c S 1.94c ( +7.5 L +7.2) LCB -280.00c P 1.13% WF 10.18% PSV 2 N 2 -- K11 C3 +L3 : T 59.05c W 57.60c S 1.45c ( +7.1 L +6.5) LCB -280.00c P 1.06% WF 10.00% PSV 2 N 2 -- L3 C3 +K3 : T 60.56c W 58.83c S 1.73c ( +7.3 L +6.9) LCB -280.00c P 0.98% WF 10.17% PSV 2 N 2 -- K3 L3 +L11 : T 60.72c W 58.62c S 2.10c ( +7.7 L +7.3) LCB -280.00c P 0.98% WF 10.19% PSV 2 N 2 -- L11 C3 +L4 : T 62.24c W 60.07c S 2.17c ( +7.7 L +7.5) LCB -280.00c P 0.94% WF 10.37% PSV 2 N 2 -- L4 L3 +Search next player - now should lose the tree and PDA, because the player it is for is different +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 979 +NN batches: 979 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 C3 E4 D6 C8 D8 D9 E9 C9 C10 E10 +Tree: +: T -61.60c W -58.24c S -3.36c ( -8.4 L -8.6) N 200 -- E3 C3 E4 D6 C8 D8 D9 +---Black(v)--- +E3 : T -64.25c W -60.42c S -3.83c ( -8.8 L -9.1) LCB -59.72c P 31.59% WF 9.99% PSV 123 N 123 -- E3 C3 E4 D6 C8 D8 D9 E9 +C5 : T -58.64c W -55.80c S -2.85c ( -7.9 L -8.2) LCB -53.61c P 29.99% WF 8.61% PSV 46 N 47 -- C5 C3 E4 F3 F11 F4 C8 +C3 : T -58.64c W -55.59c S -3.06c ( -8.1 L -8.4) LCB 16.82c P 4.69% WF 8.83% PSV 7 N 8 -- C3 C5 E3 D2 +C11 : T -52.99c W -51.18c S -1.81c ( -6.9 L -7.0) LCB 78.71c P 4.39% WF 8.17% PSV 4 N 5 -- C11 C10 D11 E10 E11 +D11 : T -55.83c W -53.68c S -2.15c ( -7.2 L -7.4) LCB 158.00c P 3.58% WF 8.56% PSV 4 N 4 -- D11 C11 E11 E10 +F11 : T -59.74c W -56.67c S -3.07c ( -8.1 L -8.4) LCB 71.52c P 2.49% WF 9.02% PSV 4 N 4 -- F11 E3 C5 D5 +C10 : T -53.23c W -51.82c S -1.42c ( -6.5 L -6.5) LCB 704.55c P 3.91% WF 8.32% PSV 3 N 3 -- C10 C11 C9 +D5 : T -28.15c W -29.80c S 1.66c ( -3.6 L -4.1) LCB 280.00c P 2.78% WF 6.55% PSV 1 N 1 -- D5 +E4 : T -43.00c W -43.01c S 0.01c ( -5.2 L -5.4) LCB 280.00c P 2.44% WF 7.70% PSV 1 N 1 -- E4 +E10 : T -49.53c W -49.18c S -0.35c ( -5.5 L -5.5) LCB 280.00c P 1.70% WF 8.23% PSV 1 N 1 -- E10 +F10 : T -51.38c W -49.99c S -1.39c ( -6.5 L -6.9) LCB 280.00c P 1.41% WF 8.38% PSV 1 N 1 -- F10 +D9 : T -42.19c W -42.72c S 0.53c ( -4.7 L -4.6) LCB 280.00c P 1.55% WF 7.64% PSV 0 N 1 -- D9 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 195 +NN batches: 195 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 C10 D11 E10 +Tree: +: T 67.39c W 65.16c S 2.23c ( +8.8 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.06c W 65.68c S 2.39c ( +9.0 L +9.2) LCB 64.08c P 43.51% WF 10.42% PSV 114 N 114 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 66.00c W 64.02c S 1.98c ( +8.6 L +8.7) LCB 58.64c P 15.72% WF 9.91% PSV 29 N 29 -- D11 D4 D3 E3 C3 D10 +C10 : T 61.41c W 60.13c S 1.28c ( +7.9 L +8.1) LCB 47.95c P 10.31% WF 9.19% PSV 12 N 12 -- C10 D10 D11 E11 C11 D4 +L10 : T 70.96c W 68.32c S 2.64c ( +9.2 L +9.3) LCB 50.97c P 1.67% WF 10.80% PSV 9 N 11 -- L10 L11 L9 K11 D10 L6 +K11 : T 68.82c W 66.38c S 2.45c ( +9.0 L +9.1) LCB 46.09c P 2.73% WF 10.43% PSV 8 N 9 -- K11 L11 J11 J10 H11 +K3 : T 67.05c W 64.91c S 2.14c ( +8.8 L +8.8) LCB 26.82c P 3.57% WF 10.15% PSV 7 N 7 -- K3 L3 J3 J4 H3 H4 +L4 : T 68.40c W 66.07c S 2.33c ( +8.9 L +9.1) LCB 46.30c P 2.31% WF 10.35% PSV 6 N 7 -- L4 L3 L5 K3 D10 +L3 : T 65.83c W 64.13c S 1.70c ( +8.3 L +8.1) LCB -13.34c P 3.18% WF 9.99% PSV 5 N 5 -- L3 D10 L4 +L11 : T 63.19c W 62.00c S 1.19c ( +7.8 L +7.6) LCB -164.36c P 3.13% WF 9.66% PSV 4 N 4 -- L11 D10 K11 +C11 : T 55.36c W 55.54c S -0.17c ( +6.6 L +6.9) LCB -280.00c P 1.07% WF 9.10% PSV 0 N 1 -- C11 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 414 +Last search playouts: 300 +NN rows: 489 +NN batches: 489 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 D12 C12 F12 +Tree: +: T 69.38c W 66.08c S 3.30c ( +9.1 L +9.3) N 414 -- D4 D3 E3 C3 C11 C10 D11 +---Black(v)--- +D4 : T 67.34c W 64.48c S 2.85c ( +8.6 L +8.8) LCB 70.38c P 29.26% WF 8.14% PSV 238 N 238 -- D4 D3 E3 C3 C11 C10 D11 E10 +E3 : T 71.72c W 67.79c S 3.93c ( +9.7 L +9.8) LCB 78.02c P 20.04% WF 7.14% PSV 64 N 65 -- E3 L3 D5 K3 C5 J4 L8 +E4 : T 73.23c W 69.01c S 4.22c (+10.0 L +10.1) LCB 80.24c P 15.81% WF 6.92% PSV 41 N 43 -- E4 L3 L4 K3 J4 H2 +D3 : T 70.99c W 67.48c S 3.51c ( +9.2 L +9.6) LCB 79.38c P 7.27% WF 7.34% PSV 25 N 28 -- D3 D4 E3 C3 E4 E5 F5 +C11 : T 71.08c W 67.48c S 3.59c ( +9.4 L +9.8) LCB 80.85c P 5.98% WF 7.34% PSV 21 N 21 -- C11 C10 D11 E10 F11 E11 E12 D12 +D11 : T 76.53c W 72.38c S 4.16c ( +9.8 L +10.2) LCB 448.48c P 1.82% WF 6.94% PSV 3 N 3 -- D11 C11 E11 +C10 : T 79.09c W 74.41c S 4.69c (+10.4 L +10.6) LCB 369.16c P 1.67% WF 6.71% PSV 2 N 3 -- C10 C11 C9 +F4 : T 78.04c W 73.08c S 4.95c (+10.6 L +10.4) LCB 280.00c P 1.38% WF 6.88% PSV 2 N 2 -- F4 L3 +G10 : T 75.33c W 71.10c S 4.23c ( +9.8 L +10.4) LCB 280.00c P 1.25% WF 7.10% PSV 2 N 2 -- G10 E4 +G4 : T 75.03c W 70.84c S 4.19c ( +9.8 L +10.5) LCB 280.00c P 1.24% WF 7.12% PSV 2 N 2 -- G4 E4 +F3 : T 76.27c W 71.61c S 4.66c (+10.4 L +10.3) LCB 280.00c P 1.21% WF 7.02% PSV 2 N 2 -- F3 L3 +F11 : T 74.40c W 70.15c S 4.26c ( +9.9 L +10.4) LCB 280.00c P 1.20% WF 7.17% PSV 2 N 2 -- F11 E4 +G11 : T 75.56c W 70.42c S 5.14c (+10.7 L +11.4) LCB 280.00c P 0.93% WF 7.16% PSV 1 N 1 -- G11 +H4 : T 77.80c W 72.07c S 5.73c (+11.2 L +11.8) LCB 280.00c P 0.81% WF 7.01% PSV 1 N 1 -- H4 +Search next player PONDERING - should still keep prior tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 538 +Last search playouts: 300 +NN rows: 780 +NN batches: 780 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 D12 C12 F12 D13 +Tree: +: T 66.32c W 63.33c S 2.99c ( +8.6 L +8.8) N 538 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.27c W 64.12c S 3.15c ( +8.7 L +8.9) LCB 64.80c P 59.84% WF 11.30% PSV 446 N 446 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 64.08c W 61.56c S 2.53c ( +8.1 L +8.1) LCB 57.15c P 12.31% WF 10.29% PSV 49 N 49 -- C3 D5 D3 F4 G11 E3 C6 L5 +D5 : T 57.31c W 55.51c S 1.80c ( +7.4 L +7.6) LCB 41.82c P 11.62% WF 8.96% PSV 23 N 23 -- D5 C3 C5 D3 F5 G4 F4 F3 +C5 : T 54.29c W 53.21c S 1.07c ( +6.7 L +6.9) LCB 17.43c P 4.49% WF 8.97% PSV 7 N 7 -- C5 D3 D5 F4 L3 +L4 : T 62.63c W 60.41c S 2.21c ( +7.8 L +7.7) LCB -163.77c P 1.49% WF 10.34% PSV 4 N 4 -- L4 L3 D3 E3 +L10 : T 61.35c W 59.45c S 1.89c ( +7.5 L +7.3) LCB -445.90c P 0.96% WF 10.21% PSV 2 N 3 -- L10 L11 L9 +K3 : T 60.98c W 59.24c S 1.75c ( +7.4 L +6.9) LCB -280.00c P 0.96% WF 10.23% PSV 2 N 2 -- K3 L3 +L11 : T 58.13c W 56.61c S 1.52c ( +7.2 L +6.5) LCB -280.00c P 0.78% WF 10.05% PSV 1 N 1 -- L11 +K11 : T 58.30c W 57.52c S 0.77c ( +6.4 L +5.6) LCB -280.00c P 0.78% WF 10.07% PSV 1 N 1 -- K11 +L3 : T 53.15c W 52.40c S 0.75c ( +6.4 L +5.5) LCB -280.00c P 0.69% WF 9.57% PSV 1 N 1 -- L3 +Without making a move - convert ponder to regular search, should still keep tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 538 +Last search playouts: 0 +NN rows: 780 +NN batches: 780 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 D12 C12 F12 D13 +Tree: +: T 66.38c W 63.33c S 3.04c ( +8.6 L +8.8) N 538 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.32c W 64.12c S 3.20c ( +8.7 L +8.9) LCB 64.86c P 59.84% WF 11.30% PSV 446 N 446 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 64.14c W 61.56c S 2.58c ( +8.1 L +8.1) LCB 57.21c P 12.31% WF 10.29% PSV 49 N 49 -- C3 D5 D3 F4 G11 E3 C6 L5 +D5 : T 57.37c W 55.51c S 1.86c ( +7.4 L +7.6) LCB 41.87c P 11.62% WF 8.96% PSV 23 N 23 -- D5 C3 C5 D3 F5 G4 F4 F3 +C5 : T 54.34c W 53.21c S 1.13c ( +6.7 L +6.9) LCB 17.48c P 4.49% WF 8.97% PSV 7 N 7 -- C5 D3 D5 F4 L3 +L4 : T 62.69c W 60.41c S 2.27c ( +7.8 L +7.7) LCB -163.70c P 1.49% WF 10.34% PSV 4 N 4 -- L4 L3 D3 E3 +L10 : T 61.41c W 59.45c S 1.95c ( +7.5 L +7.3) LCB -445.88c P 0.96% WF 10.21% PSV 2 N 3 -- L10 L11 L9 +K3 : T 61.04c W 59.24c S 1.81c ( +7.4 L +6.9) LCB -280.00c P 0.96% WF 10.23% PSV 2 N 2 -- K3 L3 +L11 : T 58.19c W 56.61c S 1.58c ( +7.2 L +6.5) LCB -280.00c P 0.78% WF 10.05% PSV 1 N 1 -- L11 +K11 : T 58.35c W 57.52c S 0.83c ( +6.4 L +5.6) LCB -280.00c P 0.78% WF 10.07% PSV 1 N 1 -- K11 +L3 : T 53.21c W 52.40c S 0.81c ( +6.4 L +5.5) LCB -280.00c P 0.69% WF 9.57% PSV 1 N 1 -- L3 +Set position to original, search PONDERING +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 300 +Last search playouts: 300 +NN rows: 288 +NN batches: 288 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 C7 D8 F6 +Tree: +: T -64.38c W -59.84c S -4.53c ( -8.6 L -8.9) N 300 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -63.58c W -59.16c S -4.42c ( -8.5 L -8.9) LCB -66.50c P 56.26% WF 13.97% PSV 221 N 221 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -65.01c W -60.45c S -4.56c ( -8.6 L -8.9) LCB -71.52c P 13.32% WF 13.39% PSV 40 N 40 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T -67.04c W -62.13c S -4.92c ( -8.9 L -9.3) LCB -74.11c P 13.11% WF 12.82% PSV 29 N 30 -- C10 D10 D11 E11 C11 D4 D3 +L3 : T -78.80c W -72.02c S -6.78c (-10.9 L -10.8) LCB -280.00c P 2.62% WF 11.50% PSV 2 N 2 -- L3 D4 +L11 : T -75.73c W -69.41c S -6.32c (-10.5 L -10.5) LCB -280.00c P 2.45% WF 11.94% PSV 2 N 2 -- L11 D4 +C11 : T -71.78c W -65.85c S -5.93c ( -9.9 L -10.2) LCB -280.00c P 1.48% WF 12.50% PSV 2 N 2 -- C11 D4 +K11 : T -77.08c W -70.21c S -6.88c (-11.0 L -11.2) LCB -280.00c P 0.94% WF 12.03% PSV 0 N 1 -- K11 +E4 : T -78.69c W -70.80c S -7.88c (-11.6 L -12.0) LCB -280.00c P 0.91% WF 11.84% PSV 0 N 1 -- E4 +Without making a move, convert to regular search, should not keep tree +and should not benefit from cache, since search would guess the opponent as 'our' side +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 486 +NN batches: 486 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 H4 L11 L10 K11 +Tree: +: T 67.83c W 65.39c S 2.45c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 69.17c W 66.45c S 2.72c ( +9.1 L +9.3) LCB 65.61c P 39.52% WF 9.09% PSV 119 N 119 -- D10 D4 D3 E3 C3 E4 D6 H4 +D11 : T 65.05c W 63.12c S 1.93c ( +8.4 L +8.5) LCB 56.48c P 20.40% WF 8.22% PSV 33 N 33 -- D11 D10 C10 E11 C11 D4 D3 +L11 : T 68.43c W 66.14c S 2.29c ( +8.7 L +8.4) LCB 50.21c P 3.61% WF 8.82% PSV 9 N 9 -- L11 D10 K11 J10 +L10 : T 69.06c W 66.39c S 2.67c ( +9.1 L +9.1) LCB 50.55c P 2.89% WF 8.90% PSV 8 N 9 -- L10 L11 L9 M11 D10 D4 +C10 : T 63.82c W 62.04c S 1.78c ( +8.2 L +8.4) LCB 26.97c P 5.91% WF 8.20% PSV 8 N 8 -- C10 D10 D11 E11 +L3 : T 64.54c W 62.69c S 1.85c ( +8.3 L +8.1) LCB -0.48c P 3.64% WF 8.35% PSV 5 N 5 -- L3 D10 L4 K5 +K3 : T 68.14c W 65.72c S 2.42c ( +8.8 L +9.1) LCB -6.38c P 2.29% WF 8.77% PSV 5 N 5 -- K3 L3 J3 J4 +K11 : T 67.45c W 65.08c S 2.37c ( +8.8 L +8.6) LCB -6.15c P 2.26% WF 8.69% PSV 5 N 5 -- K11 L11 J11 J10 H11 +L4 : T 65.98c W 64.12c S 1.87c ( +8.3 L +8.1) LCB -257.11c P 2.17% WF 8.54% PSV 3 N 3 -- L4 L3 L5 +E4 : T 45.74c W 46.79c S -1.05c ( +5.6 L +5.4) LCB -280.00c P 2.10% WF 7.02% PSV 1 N 1 -- E4 +C11 : T 55.55c W 55.54c S 0.02c ( +6.6 L +6.9) LCB -280.00c P 1.17% WF 7.77% PSV 0 N 1 -- C11 +E10 : T 53.80c W 53.88c S -0.09c ( +6.5 L +6.9) LCB -280.00c P 1.07% WF 7.63% PSV 0 N 1 -- E10 +But should be fine thereafter. Make two moves and continue +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 259 +Last search playouts: 200 +NN rows: 682 +NN batches: 682 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 H4 L11 L10 K11 J10 +Tree: +: T 68.36c W 65.24c S 3.12c ( +8.8 L +8.9) N 259 -- D3 E3 C3 E4 D6 H4 L11 +---White(^)--- +D3 : T 69.87c W 66.50c S 3.37c ( +9.0 L +9.2) LCB 66.90c P 50.08% WF 23.17% PSV 198 N 198 -- D3 E3 C3 E4 D6 H4 L11 L10 +C3 : T 65.10c W 62.60c S 2.50c ( +8.2 L +8.2) LCB 58.07c P 23.52% WF 20.37% PSV 43 N 43 -- C3 D5 D3 F4 L4 L3 L5 M3 +D5 : T 57.81c W 56.27c S 1.54c ( +7.2 L +7.6) LCB 40.86c P 8.99% WF 18.42% PSV 9 N 9 -- D5 C3 C5 D3 F5 G4 +C5 : T 54.12c W 53.20c S 0.92c ( +6.7 L +6.8) LCB 4.66c P 7.31% WF 17.66% PSV 6 N 6 -- C5 D3 D5 F4 L3 +K3 : T 61.52c W 59.73c S 1.79c ( +7.5 L +7.2) LCB -280.00c P 1.23% WF 20.38% PSV 1 N 2 -- K3 L3 +Set position to original, search PONDERING +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 300 +Last search playouts: 300 +NN rows: 291 +NN batches: 291 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 C6 D11 C11 E11 C10 E10 +Tree: +: T -63.59c W -59.77c S -3.82c ( -8.6 L -8.9) N 300 -- D10 D4 D3 E3 C3 E4 C6 +---White(^)--- +D10 : T -62.87c W -59.13c S -3.73c ( -8.5 L -8.8) LCB -65.92c P 56.73% WF 13.94% PSV 219 N 219 -- D10 D4 D3 E3 C3 E4 C6 D11 +D11 : T -64.18c W -60.34c S -3.84c ( -8.6 L -8.9) LCB -69.13c P 16.56% WF 13.40% PSV 50 N 51 -- D11 D10 C10 E11 C11 D4 D3 E3 +C10 : T -66.78c W -62.58c S -4.20c ( -8.9 L -9.2) LCB -74.95c P 10.20% WF 12.74% PSV 21 N 23 -- C10 D4 D3 E3 C3 D10 D11 +C11 : T -69.71c W -64.68c S -5.03c ( -9.7 L -10.1) LCB -280.00c P 1.57% WF 12.70% PSV 2 N 2 -- C11 D4 +L11 : T -80.62c W -73.96c S -6.66c (-11.4 L -11.8) LCB -280.00c P 2.27% WF 11.52% PSV 1 N 1 -- L11 +L3 : T -78.08c W -71.57c S -6.51c (-11.2 L -12.0) LCB -280.00c P 1.66% WF 11.82% PSV 1 N 1 -- L3 +K11 : T -70.28c W -65.17c S -5.11c ( -9.9 L -10.3) LCB -280.00c P 0.83% WF 12.77% PSV 1 N 1 -- K11 +L10 : T -84.09c W -76.90c S -7.20c (-12.0 L -12.1) LCB -280.00c P 1.15% WF 11.11% PSV 0 N 1 -- L10 +Play that move and real search on the next position, should keep tree because correct guess of side +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 400 +Last search playouts: 181 +NN rows: 461 +NN batches: 461 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 D5 C11 C10 D11 E10 E11 F10 +Tree: +: T -62.25c W -59.21c S -3.04c ( -8.5 L -8.8) N 400 -- E3 D5 C11 C10 D11 E10 E11 +---Black(v)--- +E3 : T -64.52c W -61.14c S -3.38c ( -8.8 L -9.2) LCB -60.59c P 14.06% WF 8.54% PSV 301 N 118 -- E3 D5 C11 C10 D11 E10 E11 F10 +D4 : T -62.93c W -59.78c S -3.16c ( -8.6 L -8.9) LCB -60.06c P 44.48% WF 8.20% PSV 231 N 231 -- D4 D3 E3 C3 E4 C6 D11 C11 +E4 : T -51.58c W -50.16c S -1.42c ( -7.0 L -7.5) LCB -37.67c P 13.13% WF 6.42% PSV 18 N 19 -- E4 L3 L4 K3 H3 J3 +D3 : T -55.79c W -53.86c S -1.94c ( -7.5 L -7.6) LCB -12.75c P 3.70% WF 7.24% PSV 7 N 7 -- D3 D4 E3 E4 F4 +D11 : T -56.38c W -54.27c S -2.11c ( -7.6 L -7.8) LCB 2.92c P 3.24% WF 7.33% PSV 6 N 6 -- D11 C11 E11 E10 F11 +C10 : T -56.91c W -54.75c S -2.17c ( -7.7 L -8.0) LCB 17.25c P 2.86% WF 7.39% PSV 6 N 6 -- C10 C11 C9 B11 +C11 : T -54.37c W -52.59c S -1.77c ( -7.3 L -7.4) LCB 91.26c P 3.03% WF 7.15% PSV 5 N 5 -- C11 C10 D11 E10 E11 +C8 : T -46.47c W -45.82c S -0.65c ( -6.2 L -6.5) LCB 280.00c P 1.13% WF 6.86% PSV 1 N 1 -- C8 +F11 : T -51.12c W -49.79c S -1.33c ( -6.9 L -7.3) LCB 280.00c P 0.95% WF 7.19% PSV 1 N 1 -- F11 +E10 : T -53.27c W -52.25c S -1.02c ( -6.6 L -6.7) LCB 280.00c P 0.67% WF 7.34% PSV 1 N 1 -- E10 +D8 : T -38.09c W -38.20c S 0.12c ( -5.5 L -5.8) LCB 280.00c P 0.83% WF 6.28% PSV 0 N 1 -- D8 +D6 : T -37.66c W -38.31c S 0.65c ( -5.0 L -5.2) LCB 280.00c P 0.69% WF 6.26% PSV 0 N 1 -- D6 +F10 : T -43.40c W -42.77c S -0.62c ( -6.2 L -6.7) LCB 280.00c P 0.68% WF 6.65% PSV 0 N 1 -- F10 +D9 : T -50.46c W -49.73c S -0.73c ( -6.3 L -6.2) LCB 280.00c P 0.64% WF 7.14% PSV 0 N 1 -- D9 diff --git a/cpp/tests/results/runSearchTestsV8Bin.txt b/cpp/tests/results/runSearchTestsV8Bin.txt index 39fc5ef0d..35d0904c1 100644 --- a/cpp/tests/results/runSearchTestsV8Bin.txt +++ b/cpp/tests/results/runSearchTestsV8Bin.txt @@ -327,3 +327,1180 @@ O18 P16 : T -4.65c W -4.12c S -0.53c ( -1.2 L -1.2) LCB -23.28c P 13.67% WF P16 : T 7.04c W 5.76c S 1.28c ( +1.5 L +1.5) LCB 73.04c P 7.21% WF 29.81% PSV 5 N 6 -- P16 P17 S16 S15 S17 R14 +=================================================================== +Testing PDA + pondering, p200 v400 +=================================================================== +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 196 +NN batches: 196 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C5 D5 C6 +Tree: +: T 67.34c W 64.97c S 2.37c ( +8.8 L +8.9) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.48c W 65.86c S 2.62c ( +9.0 L +9.3) LCB 64.57c P 39.52% WF 8.91% PSV 115 N 115 -- D10 D4 D3 E3 C3 E4 D6 C5 +D11 : T 64.95c W 62.96c S 1.98c ( +8.4 L +8.5) LCB 56.68c P 20.40% WF 8.17% PSV 34 N 34 -- D11 D4 D3 E3 C3 D10 +C10 : T 64.45c W 62.61c S 1.84c ( +8.3 L +8.3) LCB 28.15c P 5.91% WF 8.23% PSV 9 N 9 -- C10 D10 D11 E11 C11 +L10 : T 68.31c W 65.76c S 2.55c ( +9.0 L +9.0) LCB 48.83c P 2.89% WF 8.74% PSV 8 N 8 -- L10 L11 L9 M11 D10 +L11 : T 66.06c W 64.24c S 1.82c ( +8.3 L +7.9) LCB 42.27c P 3.61% WF 8.45% PSV 7 N 7 -- L11 D10 L10 D4 +L3 : T 65.25c W 63.51c S 1.74c ( +8.2 L +7.9) LCB 23.33c P 3.64% WF 8.36% PSV 6 N 6 -- L3 D10 L4 +K3 : T 68.56c W 66.18c S 2.38c ( +8.8 L +8.8) LCB 35.42c P 2.29% WF 8.76% PSV 6 N 6 -- K3 L3 J3 J4 +K11 : T 67.59c W 65.32c S 2.27c ( +8.7 L +8.6) LCB 25.21c P 2.26% WF 8.64% PSV 5 N 6 -- K11 L11 J11 J10 G11 +L4 : T 67.83c W 65.57c S 2.26c ( +8.7 L +8.7) LCB -1.66c P 2.17% WF 8.67% PSV 5 N 5 -- L4 L3 L5 +E4 : T 51.77c W 52.21c S -0.44c ( +6.2 L +6.2) LCB -280.00c P 2.10% WF 7.42% PSV 1 N 1 -- E4 +C11 : T 59.61c W 58.88c S 0.72c ( +7.2 L +7.5) LCB -280.00c P 1.17% WF 8.01% PSV 1 N 1 -- C11 +E10 : T 54.50c W 54.42c S 0.08c ( +6.6 L +7.0) LCB -280.00c P 1.07% WF 7.62% PSV 0 N 1 -- E10 +Search next player - should clear tree and flip PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 395 +NN batches: 395 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 +Tree: +: T -61.25c W -58.10c S -3.15c ( -8.3 L -8.6) N 200 -- D4 D3 E3 C3 E4 D6 C8 +---Black(v)--- +D4 : T -62.20c W -58.90c S -3.30c ( -8.4 L -8.7) LCB -58.02c P 44.48% WF 13.53% PSV 123 N 123 -- D4 D3 E3 C3 E4 D6 C8 D8 +E3 : T -62.40c W -59.10c S -3.30c ( -8.4 L -8.9) LCB -55.06c P 14.06% WF 13.50% PSV 39 N 39 -- E3 L3 D5 K3 C5 J4 +E4 : T -57.70c W -55.04c S -2.66c ( -7.8 L -8.2) LCB -45.53c P 13.13% WF 12.27% PSV 19 N 20 -- E4 L3 L4 K3 J4 H2 +D3 : T -55.53c W -53.26c S -2.26c ( -7.5 L -7.6) LCB 31.59c P 3.70% WF 12.14% PSV 4 N 5 -- D3 D4 E3 E4 +D11 : T -56.94c W -54.48c S -2.45c ( -7.6 L -7.8) LCB 87.33c P 3.24% WF 12.39% PSV 4 N 5 -- D11 C11 E11 E10 F11 +C11 : T -55.99c W -53.98c S -2.01c ( -7.2 L -7.3) LCB 302.26c P 3.03% WF 12.33% PSV 3 N 3 -- C11 C10 D11 +C10 : T -56.40c W -54.19c S -2.21c ( -7.4 L -7.4) LCB 858.42c P 2.86% WF 12.40% PSV 3 N 3 -- C10 C11 C9 +C8 : T -46.78c W -45.82c S -0.97c ( -6.2 L -6.5) LCB 280.00c P 1.13% WF 11.45% PSV 0 N 1 -- C8 +Search next player - should clear tree and flip PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 527 +NN batches: 527 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 F12 +Tree: +: T 66.61c W 63.92c S 2.69c ( +8.6 L +8.8) N 200 -- D3 E3 C3 E4 D6 C11 C10 +---White(^)--- +D3 : T 66.96c W 64.18c S 2.78c ( +8.7 L +9.0) LCB 62.71c P 50.08% WF 21.53% PSV 116 N 116 -- D3 E3 C3 E4 D6 C11 C10 D11 +C3 : T 67.79c W 64.95c S 2.84c ( +8.7 L +8.8) LCB 62.45c P 23.52% WF 21.95% PSV 63 N 68 -- C3 D5 D3 F4 L4 L3 L5 M3 +D5 : T 58.25c W 56.84c S 1.41c ( +7.4 L +7.7) LCB 29.41c P 8.99% WF 18.61% PSV 8 N 8 -- D5 C3 C5 D3 F4 E5 +C5 : T 54.76c W 54.02c S 0.74c ( +6.7 L +7.0) LCB -7.91c P 7.31% WF 17.93% PSV 5 N 5 -- C5 D3 D5 F4 L3 +K3 : T 60.88c W 59.40c S 1.48c ( +7.4 L +7.2) LCB -280.00c P 1.23% WF 19.98% PSV 1 N 2 -- K3 L3 +Basic search with PDA 1.5, force black +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 194 +NN batches: 194 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 C7 D8 F6 +Tree: +: T -61.77c W -57.76c S -4.02c ( -8.2 L -8.6) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -60.62c W -56.76c S -3.85c ( -8.1 L -8.4) LCB -63.98c P 53.29% WF 14.31% PSV 153 N 153 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -64.52c W -60.17c S -4.35c ( -8.5 L -8.9) LCB -73.24c P 14.80% WF 13.05% PSV 23 N 23 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T -64.82c W -60.47c S -4.35c ( -8.5 L -8.8) LCB -76.95c P 10.00% WF 13.02% PSV 15 N 17 -- C10 D10 D11 E11 C11 D4 +C11 : T -70.20c W -64.56c S -5.64c ( -9.7 L -10.1) LCB -280.00c P 2.34% WF 12.54% PSV 2 N 2 -- C11 D4 +L11 : T -78.39c W -71.46c S -6.93c (-11.1 L -11.5) LCB -280.00c P 3.02% WF 11.74% PSV 1 N 1 -- L11 +L3 : T -78.67c W -71.83c S -6.84c (-11.1 L -11.7) LCB -280.00c P 2.66% WF 11.70% PSV 1 N 1 -- L3 +E4 : T -78.57c W -70.80c S -7.76c (-11.6 L -12.0) LCB -280.00c P 2.26% WF 11.71% PSV 1 N 1 -- E4 +L4 : T -76.83c W -70.45c S -6.38c (-10.6 L -11.1) LCB -280.00c P 1.08% WF 11.93% PSV 0 N 1 -- L4 +Search next player - should preserve tree +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 353 +Last search playouts: 200 +NN rows: 389 +NN batches: 389 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 L4 L3 L5 M3 L8 L9 K8 H10 +Tree: +: T -60.88c W -57.80c S -3.09c ( -8.3 L -8.6) N 353 -- E3 L4 L3 L5 M3 L8 L9 +---Black(v)--- +E3 : T -63.63c W -60.06c S -3.57c ( -8.7 L -9.1) LCB -59.30c P 14.06% WF 11.83% PSV 356 N 127 -- E3 L4 L3 L5 M3 L8 L9 K8 +D4 : T -60.54c W -57.55c S -2.99c ( -8.2 L -8.5) LCB -57.24c P 44.48% WF 10.81% PSV 171 N 171 -- D4 D3 E3 C3 E4 D6 C8 D8 +E4 : T -55.09c W -52.82c S -2.27c ( -7.5 L -7.8) LCB -41.51c P 13.13% WF 9.66% PSV 25 N 25 -- E4 L3 L4 K3 J4 J3 +D11 : T -58.01c W -55.51c S -2.50c ( -7.7 L -7.8) LCB -17.06c P 3.24% WF 10.44% PSV 8 N 8 -- D11 C11 E11 E10 F11 +D3 : T -56.07c W -53.84c S -2.22c ( -7.4 L -7.7) LCB -26.77c P 3.70% WF 10.15% PSV 7 N 7 -- D3 D4 E3 E4 F4 +C11 : T -56.78c W -54.48c S -2.30c ( -7.5 L -7.6) LCB -16.54c P 3.03% WF 10.28% PSV 6 N 6 -- C11 C10 D11 E10 D4 D3 +C10 : T -54.13c W -52.33c S -1.80c ( -7.0 L -7.1) LCB 14.96c P 2.86% WF 9.93% PSV 5 N 5 -- C10 C11 C9 B11 +C8 : T -42.29c W -41.94c S -0.35c ( -5.7 L -5.8) LCB 280.00c P 1.13% WF 9.11% PSV 1 N 1 -- C8 +F11 : T -48.46c W -47.12c S -1.34c ( -6.6 L -6.9) LCB 280.00c P 0.95% WF 9.70% PSV 1 N 1 -- F11 +D8 : T -31.50c W -32.22c S 0.72c ( -4.6 L -5.1) LCB 280.00c P 0.83% WF 8.11% PSV 0 N 1 -- D8 +Search next player - should preserve tree +HASH: E5EB22829EDFE41082611B3D0FFD7E8C + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 327 +Last search playouts: 200 +NN rows: 586 +NN batches: 586 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D5 D11 C11 E11 E10 F11 C10 +Tree: +: T -63.51c W -60.37c S -3.14c ( -8.8 L -9.1) N 327 -- D5 D11 C11 E11 E10 F11 C10 +---White(^)--- +D5 : T -61.80c W -58.99c S -2.81c ( -8.4 L -8.8) LCB -65.99c P 10.55% WF 6.07% PSV 196 N 65 -- D5 D11 C11 E11 E10 F11 C10 +L3 : T -62.29c W -59.36c S -2.93c ( -8.6 L -9.0) LCB -68.44c P 24.34% WF 6.03% PSV 117 N 117 -- L3 D5 C5 D6 C7 L4 K3 J3 +L4 : T -60.50c W -57.90c S -2.59c ( -8.3 L -8.6) LCB -68.18c P 3.10% WF 6.21% PSV 26 N 40 -- L4 L3 L5 M3 L8 D5 C5 D6 +L11 : T -69.26c W -65.17c S -4.09c ( -9.7 L -10.1) LCB -78.52c P 13.43% WF 5.16% PSV 23 N 23 -- L11 D5 L10 C5 K9 F11 E11 F10 +E4 : T -68.02c W -64.28c S -3.74c ( -9.3 L -9.7) LCB -77.62c P 8.47% WF 5.34% PSV 16 N 16 -- E4 D4 D5 D3 C3 C5 +D3 : T -65.38c W -61.85c S -3.53c ( -9.1 L -9.1) LCB -84.30c P 4.17% WF 5.63% PSV 11 N 12 -- D3 E4 D6 D4 C3 C8 +D7 : T -68.57c W -64.57c S -4.00c ( -9.5 L -9.5) LCB -87.95c P 5.67% WF 5.34% PSV 10 N 10 -- D7 D5 C5 D6 C6 +K11 : T -62.55c W -59.57c S -2.98c ( -8.6 L -9.0) LCB -85.97c P 1.76% WF 5.89% PSV 8 N 8 -- K11 L11 J11 L12 +L10 : T -61.69c W -58.87c S -2.82c ( -8.5 L -8.9) LCB -80.64c P 1.35% WF 5.98% PSV 7 N 10 -- L10 L11 L9 M11 L6 +E5 : T -71.80c W -66.78c S -5.02c (-10.5 L -10.6) LCB -150.64c P 4.66% WF 5.14% PSV 6 N 6 -- E5 C3 B3 D4 C5 +D6 : T -70.52c W -66.34c S -4.18c ( -9.7 L -9.7) LCB -125.19c P 2.91% WF 5.26% PSV 4 N 5 -- D6 C11 C10 D11 +G11 : T -68.15c W -63.95c S -4.20c ( -9.8 L -10.4) LCB -230.24c P 2.02% WF 5.47% PSV 4 N 4 -- G11 D5 C5 D6 +G10 : T -70.09c W -65.67c S -4.42c ( -9.9 L -10.5) LCB -598.78c P 2.20% WF 5.36% PSV 3 N 3 -- G10 D5 C5 +H11 : T -70.71c W -66.01c S -4.70c (-10.3 L -10.3) LCB -280.00c P 1.39% WF 5.36% PSV 2 N 2 -- H11 D5 +F11 : T -65.73c W -61.98c S -3.75c ( -9.3 L -9.8) LCB -280.00c P 1.10% WF 5.67% PSV 2 N 2 -- F11 D5 +C7 : T -73.37c W -67.96c S -5.41c (-10.7 L -11.4) LCB -280.00c P 1.31% WF 5.29% PSV 1 N 1 -- C7 +F10 : T -69.54c W -64.67c S -4.87c (-10.3 L -11.1) LCB -280.00c P 0.99% WF 5.49% PSV 1 N 1 -- F10 +D8 : T -73.04c W -67.39c S -5.65c (-11.0 L -11.6) LCB -280.00c P 0.88% WF 5.31% PSV 1 N 1 -- D8 +Search next player PONDERING - should preserve tree +HASH: 959D9A308086353FF0883EE1398AE052 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . O . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 365 +Last search playouts: 300 +NN rows: 872 +NN batches: 872 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D11 C11 E11 E10 F11 C10 F10 L3 +Tree: +: T -60.37c W -57.63c S -2.74c ( -8.2 L -8.5) N 365 -- D11 C11 E11 E10 F11 C10 F10 +---Black(v)--- +D11 : T -64.03c W -60.69c S -3.34c ( -8.7 L -9.0) LCB -57.31c P 4.39% WF 5.01% PSV 73 N 73 -- D11 C11 E11 E10 F11 C10 F10 L3 +C10 : T -62.67c W -59.48c S -3.20c ( -8.6 L -8.9) LCB -55.78c P 5.82% WF 4.82% PSV 47 N 51 -- C10 C11 C9 D11 E8 F4 C3 B3 +G4 : T -58.55c W -56.11c S -2.45c ( -7.9 L -8.4) LCB -46.39c P 8.50% WF 4.40% PSV 25 N 25 -- G4 L3 L4 K3 H3 M4 M5 M3 +F11 : T -62.16c W -59.12c S -3.03c ( -8.5 L -8.7) LCB -54.37c P 3.92% WF 4.73% PSV 25 N 25 -- F11 L3 L4 K3 H3 J3 J4 +H4 : T -58.22c W -55.90c S -2.32c ( -7.8 L -8.5) LCB -45.82c P 7.50% WF 4.38% PSV 22 N 23 -- H4 L4 L5 L3 M5 J2 +F10 : T -59.28c W -56.71c S -2.57c ( -8.0 L -8.5) LCB -51.37c P 6.47% WF 4.47% PSV 22 N 22 -- F10 D8 D11 C11 E11 C12 +C11 : T -58.17c W -55.91c S -2.26c ( -7.7 L -8.0) LCB -45.00c P 7.16% WF 4.38% PSV 20 N 20 -- C11 C10 D11 E10 F11 E11 E12 D12 +G11 : T -60.38c W -57.58c S -2.80c ( -8.3 L -8.5) LCB -48.89c P 3.99% WF 4.57% PSV 17 N 20 -- G11 L3 L4 K3 H3 J3 J4 +E10 : T -60.21c W -57.60c S -2.61c ( -8.0 L -8.4) LCB -47.33c P 3.89% WF 4.56% PSV 16 N 19 -- E10 D11 D9 E9 E11 E12 +D9 : T -62.36c W -59.47c S -2.89c ( -8.3 L -8.5) LCB -52.22c P 2.17% WF 4.73% PSV 15 N 16 -- D9 C10 E10 E9 E11 D8 +G10 : T -60.17c W -57.39c S -2.78c ( -8.2 L -8.8) LCB -48.89c P 3.67% WF 4.55% PSV 14 N 14 -- G10 L3 L4 K3 H3 +C3 : T -53.19c W -51.55c S -1.63c ( -7.1 L -7.5) LCB -28.25c P 6.89% WF 4.03% PSV 11 N 11 -- C3 B3 D4 C5 E5 E6 F5 +C8 : T -59.92c W -57.10c S -2.82c ( -8.3 L -8.5) LCB -36.91c P 3.15% WF 4.53% PSV 11 N 11 -- C8 F4 G3 G4 +F4 : T -56.60c W -54.69c S -1.91c ( -7.4 L -7.9) LCB -27.03c P 4.46% WF 4.29% PSV 10 N 10 -- F4 L3 L4 K3 J3 +F5 : T -52.78c W -51.19c S -1.59c ( -7.1 L -7.7) LCB -24.57c P 4.92% WF 4.05% PSV 8 N 8 -- F5 L3 L4 K3 H3 +E5 : T -55.07c W -53.24c S -1.83c ( -7.3 L -7.3) LCB 5.14c P 2.61% WF 4.23% PSV 5 N 6 -- E5 E6 F5 F6 +D8 : T -49.10c W -47.66c S -1.44c ( -7.0 L -7.2) LCB 1018.37c P 1.71% WF 3.96% PSV 2 N 3 -- D8 F4 F3 +H10 : T -52.74c W -51.23c S -1.51c ( -7.0 L -7.7) LCB 280.00c P 1.50% WF 4.19% PSV 2 N 2 -- H10 L3 +D7 : T -45.92c W -45.25c S -0.67c ( -6.2 L -6.7) LCB 280.00c P 1.23% WF 3.98% PSV 1 N 1 -- D7 +J3 : T -48.13c W -47.53c S -0.59c ( -6.1 L -6.9) LCB 280.00c P 1.04% WF 4.06% PSV 1 N 1 -- J3 +H11 : T -52.93c W -51.28c S -1.65c ( -7.1 L -7.8) LCB 280.00c P 0.91% WF 4.26% PSV 1 N 1 -- H11 +H3 : T -40.03c W -40.81c S 0.78c ( -4.9 L -5.7) LCB 280.00c P 1.12% WF 3.74% PSV 0 N 1 -- H3 +D4 : T -48.15c W -47.85c S -0.30c ( -5.9 L -5.9) LCB 280.00c P 0.68% WF 4.07% PSV 0 N 1 -- D4 +Search next player - should preserve tree +HASH: CA851C9514F1314793835A721542FBA2 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . X . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . O . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 273 +Last search playouts: 200 +NN rows: 1047 +NN batches: 1047 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: C11 E11 E10 F11 C10 F10 L3 L4 K3 H3 J3 +Tree: +: T -61.40c W -58.65c S -2.75c ( -8.4 L -8.7) N 273 -- C11 E11 E10 F11 C10 F10 L3 +---White(^)--- +C11 : T -59.30c W -56.93c S -2.37c ( -8.0 L -8.4) LCB -63.68c P 41.26% WF 17.40% PSV 205 N 205 -- C11 E11 E10 F11 C10 F10 L3 L4 +E11 : T -66.55c W -62.86c S -3.69c ( -9.3 L -9.6) LCB -76.61c P 16.57% WF 14.50% PSV 27 N 28 -- E11 C11 C10 E12 F12 F11 E10 G12 +E10 : T -67.85c W -64.01c S -3.84c ( -9.4 L -9.6) LCB -81.01c P 17.47% WF 14.13% PSV 25 N 25 -- E10 C10 C9 C11 B9 F11 L3 L4 +C10 : T -69.84c W -65.37c S -4.47c (-10.0 L -10.3) LCB -89.90c P 8.56% WF 14.03% PSV 10 N 10 -- C10 E11 E10 F10 C11 +L3 : T -82.59c W -75.94c S -6.65c (-12.2 L -12.1) LCB -280.00c P 2.69% WF 12.60% PSV 1 N 2 -- L3 C10 +L11 : T -77.04c W -71.39c S -5.65c (-11.2 L -11.9) LCB -280.00c P 1.79% WF 13.93% PSV 1 N 1 -- L11 +F4 : T -80.65c W -73.73c S -6.93c (-12.3 L -13.2) LCB -280.00c P 1.55% WF 13.42% PSV 1 N 1 -- F4 +Basic search with PDA 1.5, force white +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 194 +NN batches: 194 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 D11 C10 D9 +Tree: +: T 66.74c W 64.58c S 2.17c ( +8.8 L +8.9) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 67.85c W 65.43c S 2.42c ( +9.0 L +9.3) LCB 63.97c P 43.51% WF 10.67% PSV 125 N 125 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 64.80c W 63.06c S 1.74c ( +8.4 L +8.5) LCB 56.68c P 15.72% WF 9.91% PSV 27 N 27 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T 63.41c W 61.93c S 1.48c ( +8.1 L +8.3) LCB 53.68c P 10.31% WF 9.70% PSV 15 N 16 -- C10 D10 D11 E11 C11 D4 D3 +L10 : T 70.00c W 67.39c S 2.61c ( +9.2 L +9.0) LCB 41.03c P 1.67% WF 10.82% PSV 8 N 8 -- L10 L11 L9 M11 D10 +K3 : T 64.64c W 62.74c S 1.90c ( +8.5 L +8.6) LCB 39.51c P 3.57% WF 10.01% PSV 6 N 6 -- K3 L3 J3 J4 +K11 : T 65.90c W 64.01c S 1.89c ( +8.5 L +8.6) LCB -4.81c P 2.73% WF 10.20% PSV 5 N 5 -- K11 L11 J11 J10 H11 +L3 : T 61.44c W 60.34c S 1.10c ( +7.8 L +7.7) LCB -195.91c P 3.18% WF 9.62% PSV 4 N 4 -- L3 D10 L4 +L11 : T 63.03c W 61.85c S 1.18c ( +7.8 L +7.7) LCB -21.37c P 3.13% WF 9.83% PSV 4 N 4 -- L11 D10 K11 +L4 : T 63.00c W 61.53c S 1.47c ( +8.1 L +7.9) LCB -539.44c P 2.31% WF 9.86% PSV 3 N 3 -- L4 L3 L5 +C11 : T 56.72c W 56.59c S 0.14c ( +6.9 L +7.0) LCB -280.00c P 1.07% WF 9.38% PSV 0 N 1 -- C11 +Search next player - should preserve tree +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 325 +Last search playouts: 200 +NN rows: 393 +NN batches: 393 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 F12 +Tree: +: T 69.37c W 66.04c S 3.33c ( +9.1 L +9.4) N 325 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 67.16c W 64.30c S 2.87c ( +8.7 L +8.9) LCB 70.78c P 29.24% WF 6.73% PSV 187 N 187 -- D4 D3 E3 C3 E4 D6 C11 C10 +E3 : T 72.14c W 68.23c S 3.92c ( +9.7 L +9.9) LCB 77.38c P 21.38% WF 5.85% PSV 52 N 52 -- E3 L3 L4 K3 J3 J2 +E4 : T 71.48c W 67.37c S 4.10c ( +9.9 L +10.1) LCB 80.81c P 12.40% WF 5.98% PSV 33 N 35 -- E4 L3 L4 K3 H3 J3 +D3 : T 70.45c W 67.04c S 3.41c ( +9.2 L +9.6) LCB 83.80c P 4.35% WF 6.15% PSV 13 N 13 -- D3 D4 E3 C3 H4 L10 +C11 : T 72.67c W 68.79c S 3.88c ( +9.7 L +10.1) LCB 88.96c P 5.63% WF 5.92% PSV 12 N 12 -- C11 C10 D11 E10 F11 E11 E12 +G4 : T 75.50c W 71.33c S 4.17c ( +9.9 L +10.4) LCB 161.42c P 2.35% WF 5.77% PSV 4 N 4 -- G4 E4 C11 C10 +D11 : T 76.31c W 72.09c S 4.22c ( +9.9 L +10.3) LCB 558.10c P 2.31% WF 5.74% PSV 3 N 3 -- D11 C11 E11 +G10 : T 75.95c W 71.32c S 4.63c (+10.3 L +10.9) LCB 354.95c P 1.93% WF 5.77% PSV 3 N 3 -- G10 E4 G3 +F11 : T 77.28c W 72.74c S 4.53c (+10.2 L +10.8) LCB 280.00c P 1.55% WF 5.73% PSV 2 N 2 -- F11 E4 +C10 : T 73.55c W 69.75c S 3.80c ( +9.5 L +9.8) LCB 280.00c P 1.17% WF 5.98% PSV 2 N 2 -- C10 C11 +F10 : T 73.12c W 68.98c S 4.14c ( +9.8 L +10.4) LCB 280.00c P 0.98% WF 6.01% PSV 2 N 2 -- F10 E4 +F3 : T 78.54c W 73.39c S 5.15c (+10.8 L +10.7) LCB 280.00c P 1.38% WF 5.65% PSV 1 N 2 -- F3 L3 +H4 : T 77.38c W 72.52c S 4.87c (+10.4 L +10.9) LCB 280.00c P 1.32% WF 5.72% PSV 1 N 2 -- H4 E4 +F4 : T 77.97c W 73.22c S 4.75c (+10.5 L +10.3) LCB 280.00c P 1.25% WF 5.68% PSV 1 N 2 -- F4 L3 +E10 : T 79.65c W 75.03c S 4.62c (+10.3 L +10.9) LCB 280.00c P 1.08% WF 5.68% PSV 1 N 1 -- E10 +G11 : T 75.53c W 70.42c S 5.12c (+10.7 L +11.4) LCB 280.00c P 0.95% WF 5.91% PSV 1 N 1 -- G11 +G3 : T 78.34c W 73.04c S 5.30c (+10.9 L +11.4) LCB 280.00c P 0.91% WF 5.75% PSV 1 N 1 -- G3 +Search next player - should preserve tree +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 387 +Last search playouts: 200 +NN rows: 589 +NN batches: 589 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 F12 F11 E10 +Tree: +: T 66.68c W 63.65c S 3.03c ( +8.6 L +8.8) N 387 -- D3 E3 C3 E4 D6 C11 C10 +---White(^)--- +D3 : T 68.01c W 64.74c S 3.27c ( +8.9 L +9.1) LCB 64.96c P 50.58% WF 16.43% PSV 296 N 296 -- D3 E3 C3 E4 D6 C11 C10 D11 +C3 : T 64.78c W 62.14c S 2.64c ( +8.2 L +8.2) LCB 58.38c P 18.41% WF 14.90% PSV 58 N 59 -- C3 D5 D3 F4 G11 E3 C6 C11 +D5 : T 54.60c W 53.39c S 1.22c ( +6.9 L +7.2) LCB 35.17c P 13.50% WF 12.25% PSV 17 N 17 -- D5 C3 C5 D3 F5 G4 L3 +C5 : T 58.28c W 56.71c S 1.57c ( +7.2 L +7.4) LCB 45.01c P 7.29% WF 13.49% PSV 11 N 11 -- C5 D3 D5 F4 L3 L4 K3 +K11 : T 58.26c W 57.52c S 0.74c ( +6.4 L +5.6) LCB -280.00c P 1.14% WF 14.43% PSV 1 N 1 -- K11 +L10 : T 59.86c W 58.74c S 1.13c ( +6.8 L +6.0) LCB -280.00c P 1.08% WF 14.65% PSV 1 N 1 -- L10 +L4 : T 54.23c W 53.74c S 0.49c ( +6.2 L +5.1) LCB -280.00c P 0.71% WF 13.87% PSV 0 N 1 -- L4 +Search next player PONDERING - should preserve tree +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 596 +Last search playouts: 300 +NN rows: 881 +NN batches: 881 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: E3 C3 C11 C10 D11 E10 F11 E11 E12 F12 G12 D12 F13 C12 +Tree: +: T 68.00c W 64.86c S 3.14c ( +8.9 L +9.1) N 596 -- E3 C3 C11 C10 D11 E10 F11 +---Black(v)--- +E3 : T 66.38c W 63.48c S 2.89c ( +8.6 L +8.9) LCB 68.77c P 44.24% WF 9.85% PSV 471 N 471 -- E3 C3 C11 C10 D11 E10 F11 E11 +C5 : T 74.89c W 70.81c S 4.08c ( +9.8 L +9.8) LCB 79.58c P 29.27% WF 7.55% PSV 76 N 76 -- C5 C3 C10 C9 C11 D9 E12 E4 +C11 : T 73.73c W 69.58c S 4.15c ( +9.9 L +10.3) LCB 82.74c P 10.17% WF 8.10% PSV 29 N 29 -- C11 C10 D11 E10 E3 E4 D5 F3 +C3 : T 73.09c W 68.58c S 4.51c (+10.3 L +10.6) LCB 146.12c P 2.44% WF 8.50% PSV 7 N 7 -- C3 E3 C5 B4 E4 +D11 : T 78.75c W 74.03c S 4.72c (+10.4 L +10.9) LCB 677.52c P 1.76% WF 8.02% PSV 3 N 3 -- D11 C11 E11 +C10 : T 80.47c W 75.10c S 5.37c (+11.0 L +11.1) LCB 280.00c P 1.62% WF 7.97% PSV 2 N 2 -- C10 C11 +F11 : T 79.61c W 74.39c S 5.22c (+10.9 L +10.8) LCB 280.00c P 0.64% WF 8.05% PSV 1 N 2 -- F11 L11 +E4 : T 80.49c W 75.80c S 4.70c (+10.2 L +11.2) LCB 280.00c P 1.04% WF 8.15% PSV 1 N 1 -- E4 +E10 : T 75.58c W 71.19c S 4.39c (+10.0 L +10.6) LCB 280.00c P 0.60% WF 8.55% PSV 1 N 1 -- E10 +G11 : T 73.66c W 69.09c S 4.57c (+10.1 L +11.1) LCB 280.00c P 0.60% WF 8.71% PSV 1 N 1 -- G11 +G10 : T 72.02c W 67.99c S 4.02c ( +9.6 L +10.6) LCB 280.00c P 0.54% WF 8.85% PSV 1 N 1 -- G10 +D5 : T 86.15c W 79.99c S 6.16c (+11.6 L +12.1) LCB 280.00c P 0.57% WF 7.70% PSV 0 N 1 -- D5 +Search next player PONDERING - an extra time, should preserve tree +HASH: 3CE07EBDEC180D0C4D1F494DACE35DEF + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 600 +Last search playouts: 129 +NN rows: 1006 +NN batches: 1006 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: C3 C11 C10 D11 E10 F11 G3 F10 F9 G9 E11 +Tree: +: T 66.34c W 63.27c S 3.07c ( +8.7 L +8.9) N 600 -- C3 C11 C10 D11 E10 F11 G3 +---White(^)--- +C3 : T 67.47c W 64.32c S 3.15c ( +8.7 L +8.9) LCB 65.21c P 52.60% WF 16.56% PSV 457 N 457 -- C3 C11 C10 D11 E10 F11 G3 F10 +E4 : T 63.86c W 60.24c S 3.62c ( +9.3 L +9.9) LCB 54.26c P 17.10% WF 14.78% PSV 72 N 72 -- E4 D5 F3 E2 C3 F2 G3 G2 +D5 : T 62.58c W 60.49c S 2.10c ( +7.7 L +7.8) LCB 56.46c P 14.49% WF 14.37% PSV 51 N 52 -- D5 E4 C3 E5 D6 E6 D7 L5 +C5 : T 59.97c W 58.09c S 1.89c ( +7.5 L +7.6) LCB 26.02c P 3.15% WF 14.27% PSV 8 N 8 -- C5 D2 C3 C11 +D2 : T 51.12c W 50.42c S 0.70c ( +6.4 L +6.6) LCB -36.57c P 5.22% WF 12.34% PSV 7 N 7 -- D2 C5 D5 E4 C6 +E2 : T 55.77c W 54.43c S 1.34c ( +7.0 L +7.4) LCB -280.00c P 0.96% WF 14.01% PSV 1 N 2 -- E2 E4 +C2 : T 51.30c W 50.95c S 0.35c ( +6.1 L +6.8) LCB -280.00c P 1.01% WF 13.66% PSV 1 N 1 -- C2 +Search next player - should preserve tree +HASH: 8651A60659E1A9036654CB5DB57F2E27 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . O O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 457 +Last search playouts: 0 +NN rows: 1006 +NN batches: 1006 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: C11 C10 D11 E10 F11 G3 F10 F9 G9 E11 +Tree: +: T 67.42c W 64.32c S 3.09c ( +8.7 L +8.9) N 457 -- C11 C10 D11 E10 F11 G3 F10 +---Black(v)--- +C11 : T 64.89c W 62.20c S 2.69c ( +8.4 L +8.5) LCB 68.39c P 16.99% WF 8.40% PSV 418 N 193 -- C11 C10 D11 E10 F11 G3 F10 F9 +E4 : T 67.55c W 64.29c S 3.26c ( +8.9 L +9.2) LCB 71.18c P 35.29% WF 7.71% PSV 178 N 178 -- E4 D6 C11 C10 D11 E11 E12 F12 +D5 : T 74.59c W 70.87c S 3.72c ( +9.2 L +9.3) LCB 83.32c P 13.45% WF 6.59% PSV 28 N 29 -- D5 E2 F3 F2 G3 G11 C11 C10 +F4 : T 74.26c W 70.64c S 3.62c ( +9.2 L +9.1) LCB 95.63c P 4.53% WF 6.87% PSV 9 N 11 -- F4 D5 C11 C10 D11 E10 +H4 : T 71.79c W 68.45c S 3.34c ( +8.9 L +8.8) LCB 96.71c P 3.31% WF 7.20% PSV 9 N 9 -- H4 L11 L10 K11 J10 +D11 : T 70.80c W 67.34c S 3.46c ( +9.1 L +9.3) LCB 107.04c P 2.87% WF 7.33% PSV 8 N 8 -- D11 E11 C11 C10 +G10 : T 71.34c W 67.69c S 3.64c ( +9.1 L +9.3) LCB 108.52c P 2.75% WF 7.29% PSV 7 N 7 -- G10 D5 H3 +G11 : T 69.41c W 65.89c S 3.53c ( +9.1 L +9.4) LCB 108.95c P 1.81% WF 7.51% PSV 6 N 6 -- G11 L3 L4 K3 J4 +F11 : T 71.87c W 68.19c S 3.68c ( +9.3 L +9.2) LCB 178.34c P 2.02% WF 7.26% PSV 5 N 5 -- F11 L11 L10 K11 +C10 : T 77.16c W 72.65c S 4.50c (+10.1 L +10.4) LCB 318.75c P 2.11% WF 6.84% PSV 3 N 3 -- C10 C11 C9 +E10 : T 74.23c W 70.56c S 3.67c ( +9.2 L +9.3) LCB 280.00c P 1.39% WF 7.16% PSV 2 N 2 -- E10 D11 +E5 : T 79.72c W 74.62c S 5.09c (+10.6 L +10.2) LCB 280.00c P 1.22% WF 6.71% PSV 1 N 2 -- E5 E2 +H11 : T 80.51c W 75.05c S 5.45c (+10.9 L +10.5) LCB 280.00c P 0.97% WF 6.65% PSV 1 N 2 -- H11 L3 +G3 : T 85.59c W 79.37c S 6.22c (+11.6 L +11.7) LCB 280.00c P 1.11% WF 6.47% PSV 1 N 1 -- G3 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 199 +NN batches: 199 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 +Tree: +: T 67.83c W 65.53c S 2.30c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 C11 C10 +---White(^)--- +D10 : T 68.48c W 66.04c S 2.44c ( +9.0 L +9.2) LCB 64.33c P 42.40% WF 9.52% PSV 111 N 111 -- D10 D4 D3 E3 C3 C11 C10 D11 +D11 : T 66.61c W 64.50c S 2.11c ( +8.7 L +8.8) LCB 59.53c P 19.31% WF 9.09% PSV 38 N 38 -- D11 D4 D3 E3 C3 E4 +L11 : T 70.33c W 67.77c S 2.56c ( +9.2 L +8.8) LCB 55.96c P 3.18% WF 9.72% PSV 11 N 11 -- L11 D10 K11 E3 +C10 : T 63.57c W 61.94c S 1.63c ( +8.2 L +8.5) LCB 30.29c P 6.37% WF 8.72% PSV 8 N 9 -- C10 D4 D3 E3 C3 D10 +K11 : T 70.25c W 67.70c S 2.54c ( +9.1 L +9.0) LCB 49.54c P 2.08% WF 9.68% PSV 8 N 8 -- K11 L11 J11 J10 H11 +L4 : T 67.83c W 65.49c S 2.33c ( +8.9 L +9.0) LCB 30.08c P 3.27% WF 9.33% PSV 7 N 7 -- L4 L3 L5 M3 D10 +L3 : T 66.29c W 64.34c S 1.95c ( +8.6 L +8.3) LCB 18.77c P 3.49% WF 9.13% PSV 6 N 6 -- L3 D10 L4 K5 +K3 : T 65.93c W 63.91c S 2.02c ( +8.6 L +8.6) LCB 15.72c P 3.27% WF 9.10% PSV 5 N 5 -- K3 L3 J3 J4 +L10 : T 62.87c W 61.66c S 1.21c ( +7.8 L +7.8) LCB -280.00c P 1.90% WF 8.84% PSV 2 N 2 -- L10 L11 +E10 : T 56.04c W 56.03c S 0.01c ( +6.7 L +7.1) LCB -280.00c P 1.32% WF 8.35% PSV 1 N 1 -- E10 +J4 : T 58.22c W 57.84c S 0.37c ( +7.1 L +6.7) LCB -280.00c P 1.22% WF 8.53% PSV 1 N 1 -- J4 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 411 +Last search playouts: 300 +NN rows: 488 +NN batches: 488 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 +Tree: +: T 68.32c W 65.23c S 3.08c ( +8.9 L +9.1) N 411 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 65.95c W 63.33c S 2.63c ( +8.5 L +8.7) LCB 69.33c P 21.01% WF 7.23% PSV 278 N 197 -- D4 D3 E3 C3 E4 D6 C11 C10 +E3 : T 68.48c W 65.31c S 3.17c ( +9.0 L +9.2) LCB 72.60c P 25.36% WF 6.66% PSV 116 N 116 -- E3 L3 D5 C5 D6 C7 K3 +D3 : T 70.89c W 67.49c S 3.40c ( +9.1 L +9.5) LCB 77.58c P 10.78% WF 6.32% PSV 33 N 33 -- D3 D4 E3 C3 E4 E5 F5 E6 +C11 : T 73.93c W 69.86c S 4.07c ( +9.8 L +10.3) LCB 82.94c P 10.76% WF 5.95% PSV 23 N 24 -- C11 C10 D11 E10 F11 E11 E12 F12 +E4 : T 75.15c W 70.68c S 4.46c (+10.3 L +10.3) LCB 88.64c P 9.61% WF 5.85% PSV 18 N 18 -- E4 L3 K3 L4 L5 M5 +G4 : T 73.54c W 69.68c S 3.86c ( +9.6 L +10.1) LCB 129.28c P 1.95% WF 6.24% PSV 4 N 4 -- G4 E4 C11 C10 +D11 : T 72.71c W 68.97c S 3.73c ( +9.5 L +9.9) LCB 260.63c P 1.54% WF 6.34% PSV 3 N 3 -- D11 C11 E11 +G11 : T 74.06c W 69.61c S 4.44c (+10.1 L +10.8) LCB 392.10c P 1.25% WF 6.23% PSV 2 N 3 -- G11 E4 G3 +G10 : T 73.61c W 69.23c S 4.38c (+10.0 L +10.8) LCB 640.29c P 1.15% WF 6.26% PSV 2 N 3 -- G10 E4 H3 +F3 : T 78.44c W 73.42c S 5.02c (+10.7 L +10.6) LCB 280.00c P 1.79% WF 5.96% PSV 2 N 2 -- F3 L3 +C10 : T 78.90c W 74.10c S 4.79c (+10.5 L +10.6) LCB 280.00c P 1.38% WF 5.93% PSV 2 N 2 -- C10 C11 +F4 : T 76.72c W 71.55c S 5.17c (+10.8 L +11.1) LCB 280.00c P 1.11% WF 6.18% PSV 1 N 1 -- F4 +F11 : T 78.54c W 73.57c S 4.97c (+10.6 L +11.5) LCB 280.00c P 1.00% WF 6.07% PSV 1 N 1 -- F11 +G3 : T 75.02c W 70.23c S 4.79c (+10.4 L +10.9) LCB 280.00c P 0.92% WF 6.28% PSV 1 N 1 -- G3 +H4 : T 77.77c W 72.07c S 5.70c (+11.2 L +11.8) LCB 280.00c P 0.91% WF 6.11% PSV 1 N 1 -- H4 +H3 : T 73.03c W 68.64c S 4.39c (+10.0 L +11.1) LCB 280.00c P 0.71% WF 6.40% PSV 1 N 1 -- H3 +Search next player - should keep tree from ponder +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 397 +Last search playouts: 200 +NN rows: 683 +NN batches: 683 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 F12 G12 D12 +Tree: +: T 66.29c W 63.28c S 3.02c ( +8.5 L +8.6) N 397 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.48c W 64.28c S 3.21c ( +8.6 L +8.9) LCB 64.73c P 50.58% WF 16.01% PSV 290 N 290 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 65.42c W 62.57c S 2.85c ( +8.3 L +8.2) LCB 60.32c P 18.41% WF 14.97% PSV 69 N 69 -- C3 D5 D3 F4 L10 L11 L9 M11 +D5 : T 56.24c W 54.64c S 1.59c ( +7.1 L +7.4) LCB 37.30c P 13.50% WF 12.43% PSV 20 N 20 -- D5 C3 C5 D3 F5 G4 L3 L4 +C5 : T 58.39c W 56.64c S 1.75c ( +7.2 L +7.4) LCB 42.44c P 7.29% WF 13.30% PSV 12 N 12 -- C5 D3 D5 F4 L3 K3 L4 L5 +L10 : T 61.23c W 59.07c S 2.16c ( +7.6 L +7.2) LCB -280.00c P 1.08% WF 14.47% PSV 2 N 2 -- L10 L11 +L4 : T 62.17c W 60.07c S 2.10c ( +7.6 L +7.2) LCB -280.00c P 0.71% WF 14.62% PSV 1 N 2 -- L4 L3 +K11 : T 58.43c W 57.52c S 0.90c ( +6.4 L +5.6) LCB -280.00c P 1.14% WF 14.21% PSV 1 N 1 -- K11 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 197 +NN batches: 197 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 D11 C10 +Tree: +: T 68.19c W 65.85c S 2.34c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.98c W 66.47c S 2.51c ( +9.1 L +9.3) LCB 64.78c P 43.51% WF 10.39% PSV 115 N 115 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 66.71c W 64.61c S 2.11c ( +8.7 L +8.8) LCB 56.07c P 15.72% WF 9.84% PSV 29 N 29 -- D11 D10 C10 E11 C11 D4 +C10 : T 64.23c W 62.53c S 1.70c ( +8.3 L +8.5) LCB 50.97c P 10.31% WF 9.44% PSV 14 N 15 -- C10 D10 D11 E11 C11 +L11 : T 70.20c W 67.73c S 2.47c ( +9.1 L +8.7) LCB 54.84c P 3.13% WF 10.47% PSV 10 N 10 -- L11 D10 K11 E3 +K3 : T 67.53c W 65.46c S 2.08c ( +8.7 L +8.5) LCB 35.43c P 3.57% WF 10.05% PSV 7 N 8 -- K3 L3 J3 J4 H3 +L10 : T 70.88c W 68.14c S 2.74c ( +9.3 L +9.2) LCB 15.81c P 1.67% WF 10.53% PSV 6 N 6 -- L10 L11 L9 K11 D10 +L3 : T 65.27c W 63.46c S 1.81c ( +8.4 L +8.2) LCB 9.73c P 3.18% WF 9.75% PSV 5 N 5 -- L3 D10 L4 +L4 : T 67.91c W 65.61c S 2.29c ( +8.9 L +8.9) LCB -3.98c P 2.31% WF 10.11% PSV 5 N 5 -- L4 L3 L5 M3 D10 +K11 : T 66.48c W 64.59c S 1.90c ( +8.5 L +8.4) LCB -20.27c P 2.73% WF 9.92% PSV 4 N 5 -- K11 L11 J11 J10 H11 +C11 : T 61.06c W 60.51c S 0.56c ( +7.2 L +7.5) LCB -280.00c P 1.07% WF 9.50% PSV 1 N 1 -- C11 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 415 +Last search playouts: 300 +NN rows: 493 +NN batches: 493 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 H4 L11 L10 K11 J10 H12 +Tree: +: T 69.24c W 66.05c S 3.18c ( +9.0 L +9.2) N 415 -- D4 D3 E3 C3 E4 D6 H4 +---Black(v)--- +D4 : T 67.14c W 64.40c S 2.74c ( +8.6 L +8.8) LCB 70.13c P 29.24% WF 6.41% PSV 251 N 251 -- D4 D3 E3 C3 E4 D6 H4 L11 +E3 : T 71.30c W 67.63c S 3.67c ( +9.5 L +9.6) LCB 76.44c P 21.38% WF 5.64% PSV 71 N 71 -- E3 L3 D5 K3 C5 J4 C11 D11 +E4 : T 73.85c W 69.53c S 4.32c (+10.2 L +10.3) LCB 84.35c P 12.40% WF 5.38% PSV 30 N 30 -- E4 L3 K3 L4 K5 L5 C3 +D3 : T 70.03c W 66.68c S 3.35c ( +9.2 L +9.4) LCB 78.05c P 4.35% WF 5.87% PSV 17 N 17 -- D3 D4 E3 C3 E4 L3 K3 +C11 : T 72.62c W 68.86c S 3.76c ( +9.6 L +10.0) LCB 88.05c P 5.63% WF 5.60% PSV 15 N 15 -- C11 C10 D11 E10 E11 F10 D4 +G4 : T 74.33c W 70.43c S 3.90c ( +9.6 L +10.0) LCB 113.86c P 2.35% WF 5.54% PSV 5 N 5 -- G4 E4 C11 C10 +D11 : T 78.32c W 73.90c S 4.41c (+10.2 L +10.7) LCB 177.20c P 2.31% WF 5.27% PSV 3 N 4 -- D11 C11 E11 E10 +G10 : T 78.38c W 73.51c S 4.88c (+10.6 L +11.0) LCB 249.38c P 1.93% WF 5.26% PSV 3 N 4 -- G10 E4 G3 L10 +F11 : T 74.86c W 70.29c S 4.57c (+10.3 L +11.0) LCB 510.61c P 1.55% WF 5.56% PSV 3 N 3 -- F11 E4 G3 +C10 : T 75.52c W 71.38c S 4.14c ( +9.9 L +10.3) LCB 686.78c P 1.17% WF 5.51% PSV 2 N 3 -- C10 C11 C9 +F3 : T 78.25c W 73.22c S 5.04c (+10.8 L +10.7) LCB 280.00c P 1.38% WF 5.38% PSV 2 N 2 -- F3 L3 +H4 : T 76.26c W 71.51c S 4.75c (+10.4 L +10.8) LCB 280.00c P 1.32% WF 5.50% PSV 2 N 2 -- H4 E4 +F4 : T 78.81c W 73.83c S 4.98c (+10.7 L +10.3) LCB 280.00c P 1.25% WF 5.34% PSV 2 N 2 -- F4 L3 +E10 : T 77.03c W 72.91c S 4.12c ( +9.9 L +10.7) LCB 280.00c P 1.08% WF 5.53% PSV 1 N 1 -- E10 +F10 : T 77.00c W 72.17c S 4.82c (+10.6 L +11.1) LCB 280.00c P 0.98% WF 5.53% PSV 1 N 1 -- F10 +G11 : T 77.36c W 72.28c S 5.08c (+10.8 L +11.3) LCB 280.00c P 0.95% WF 5.51% PSV 1 N 1 -- G11 +G3 : T 78.29c W 73.04c S 5.25c (+10.9 L +11.4) LCB 280.00c P 0.91% WF 5.47% PSV 1 N 1 -- G3 +H3 : T 73.95c W 69.27c S 4.68c (+10.3 L +10.9) LCB 280.00c P 0.67% WF 5.70% PSV 1 N 1 -- H3 +Search next player PONDERING an extra time - should keep prior tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 551 +Last search playouts: 300 +NN rows: 785 +NN batches: 785 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 C11 C10 D11 E10 F11 E11 E12 +Tree: +: T 67.05c W 64.00c S 3.04c ( +8.6 L +8.8) N 551 -- D3 E3 C3 E4 D6 C11 C10 +---White(^)--- +D3 : T 68.26c W 65.03c S 3.23c ( +8.8 L +9.0) LCB 65.97c P 54.98% WF 11.51% PSV 459 N 459 -- D3 E3 C3 E4 D6 C11 C10 D11 +C3 : T 62.41c W 60.11c S 2.30c ( +7.9 L +7.9) LCB 54.35c P 14.16% WF 9.77% PSV 43 N 44 -- C3 D5 D3 F4 G11 E3 C6 C11 +D5 : T 56.14c W 54.64c S 1.51c ( +7.1 L +7.5) LCB 40.45c P 11.29% WF 8.68% PSV 20 N 21 -- D5 C3 C5 D3 F4 F3 G3 +C5 : T 60.45c W 58.35c S 2.10c ( +7.7 L +8.0) LCB 46.53c P 5.54% WF 9.69% PSV 13 N 14 -- C5 D3 D5 F4 L3 L4 K3 J4 +L10 : T 54.18c W 53.40c S 0.78c ( +6.4 L +6.5) LCB -280.00c P 1.58% WF 9.44% PSV 2 N 2 -- L10 L11 +K11 : T 60.60c W 58.66c S 1.94c ( +7.5 L +7.2) LCB -280.00c P 1.13% WF 10.18% PSV 2 N 2 -- K11 C3 +L3 : T 59.05c W 57.60c S 1.45c ( +7.1 L +6.5) LCB -280.00c P 1.06% WF 10.00% PSV 2 N 2 -- L3 C3 +K3 : T 60.56c W 58.83c S 1.73c ( +7.3 L +6.9) LCB -280.00c P 0.98% WF 10.17% PSV 2 N 2 -- K3 L3 +L11 : T 60.72c W 58.62c S 2.10c ( +7.7 L +7.3) LCB -280.00c P 0.98% WF 10.19% PSV 2 N 2 -- L11 C3 +L4 : T 62.24c W 60.07c S 2.17c ( +7.7 L +7.5) LCB -280.00c P 0.94% WF 10.37% PSV 2 N 2 -- L4 L3 +Search next player - now should lose the tree and PDA, because the player it is for is different +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 979 +NN batches: 979 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 C3 E4 D6 C8 D8 D9 E9 C9 C10 E10 +Tree: +: T -61.60c W -58.24c S -3.36c ( -8.4 L -8.6) N 200 -- E3 C3 E4 D6 C8 D8 D9 +---Black(v)--- +E3 : T -64.25c W -60.42c S -3.83c ( -8.8 L -9.1) LCB -59.72c P 31.59% WF 9.99% PSV 123 N 123 -- E3 C3 E4 D6 C8 D8 D9 E9 +C5 : T -58.64c W -55.80c S -2.85c ( -7.9 L -8.2) LCB -53.61c P 29.99% WF 8.61% PSV 46 N 47 -- C5 C3 E4 F3 F11 F4 C8 +C3 : T -58.64c W -55.59c S -3.06c ( -8.1 L -8.4) LCB 16.82c P 4.69% WF 8.83% PSV 7 N 8 -- C3 C5 E3 D2 +C11 : T -52.99c W -51.18c S -1.81c ( -6.9 L -7.0) LCB 78.71c P 4.39% WF 8.17% PSV 4 N 5 -- C11 C10 D11 E10 E11 +D11 : T -55.83c W -53.68c S -2.15c ( -7.2 L -7.4) LCB 158.00c P 3.58% WF 8.56% PSV 4 N 4 -- D11 C11 E11 E10 +F11 : T -59.74c W -56.67c S -3.07c ( -8.1 L -8.4) LCB 71.52c P 2.49% WF 9.02% PSV 4 N 4 -- F11 E3 C5 D5 +C10 : T -53.23c W -51.82c S -1.42c ( -6.5 L -6.5) LCB 704.55c P 3.91% WF 8.32% PSV 3 N 3 -- C10 C11 C9 +D5 : T -28.15c W -29.80c S 1.66c ( -3.6 L -4.1) LCB 280.00c P 2.78% WF 6.55% PSV 1 N 1 -- D5 +E4 : T -43.00c W -43.01c S 0.01c ( -5.2 L -5.4) LCB 280.00c P 2.44% WF 7.70% PSV 1 N 1 -- E4 +E10 : T -49.53c W -49.18c S -0.35c ( -5.5 L -5.5) LCB 280.00c P 1.70% WF 8.23% PSV 1 N 1 -- E10 +F10 : T -51.38c W -49.99c S -1.39c ( -6.5 L -6.9) LCB 280.00c P 1.41% WF 8.38% PSV 1 N 1 -- F10 +D9 : T -42.19c W -42.72c S 0.53c ( -4.7 L -4.6) LCB 280.00c P 1.55% WF 7.64% PSV 0 N 1 -- D9 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 195 +NN batches: 195 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 C10 D11 E10 +Tree: +: T 67.39c W 65.16c S 2.23c ( +8.8 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.06c W 65.68c S 2.39c ( +9.0 L +9.2) LCB 64.08c P 43.51% WF 10.42% PSV 114 N 114 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 66.00c W 64.02c S 1.98c ( +8.6 L +8.7) LCB 58.64c P 15.72% WF 9.91% PSV 29 N 29 -- D11 D4 D3 E3 C3 D10 +C10 : T 61.41c W 60.13c S 1.28c ( +7.9 L +8.1) LCB 47.95c P 10.31% WF 9.19% PSV 12 N 12 -- C10 D10 D11 E11 C11 D4 +L10 : T 70.96c W 68.32c S 2.64c ( +9.2 L +9.3) LCB 50.97c P 1.67% WF 10.80% PSV 9 N 11 -- L10 L11 L9 K11 D10 L6 +K11 : T 68.82c W 66.38c S 2.45c ( +9.0 L +9.1) LCB 46.09c P 2.73% WF 10.43% PSV 8 N 9 -- K11 L11 J11 J10 H11 +K3 : T 67.05c W 64.91c S 2.14c ( +8.8 L +8.8) LCB 26.82c P 3.57% WF 10.15% PSV 7 N 7 -- K3 L3 J3 J4 H3 H4 +L4 : T 68.40c W 66.07c S 2.33c ( +8.9 L +9.1) LCB 46.30c P 2.31% WF 10.35% PSV 6 N 7 -- L4 L3 L5 K3 D10 +L3 : T 65.83c W 64.13c S 1.70c ( +8.3 L +8.1) LCB -13.34c P 3.18% WF 9.99% PSV 5 N 5 -- L3 D10 L4 +L11 : T 63.19c W 62.00c S 1.19c ( +7.8 L +7.6) LCB -164.36c P 3.13% WF 9.66% PSV 4 N 4 -- L11 D10 K11 +C11 : T 55.36c W 55.54c S -0.17c ( +6.6 L +6.9) LCB -280.00c P 1.07% WF 9.10% PSV 0 N 1 -- C11 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 414 +Last search playouts: 300 +NN rows: 489 +NN batches: 489 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 D12 C12 F12 +Tree: +: T 69.38c W 66.08c S 3.30c ( +9.1 L +9.3) N 414 -- D4 D3 E3 C3 C11 C10 D11 +---Black(v)--- +D4 : T 67.34c W 64.48c S 2.85c ( +8.6 L +8.8) LCB 70.38c P 29.26% WF 8.14% PSV 238 N 238 -- D4 D3 E3 C3 C11 C10 D11 E10 +E3 : T 71.72c W 67.79c S 3.93c ( +9.7 L +9.8) LCB 78.02c P 20.04% WF 7.14% PSV 64 N 65 -- E3 L3 D5 K3 C5 J4 L8 +E4 : T 73.23c W 69.01c S 4.22c (+10.0 L +10.1) LCB 80.24c P 15.81% WF 6.92% PSV 41 N 43 -- E4 L3 L4 K3 J4 H2 +D3 : T 70.99c W 67.48c S 3.51c ( +9.2 L +9.6) LCB 79.38c P 7.27% WF 7.34% PSV 25 N 28 -- D3 D4 E3 C3 E4 E5 F5 +C11 : T 71.08c W 67.48c S 3.59c ( +9.4 L +9.8) LCB 80.85c P 5.98% WF 7.34% PSV 21 N 21 -- C11 C10 D11 E10 F11 E11 E12 D12 +D11 : T 76.53c W 72.38c S 4.16c ( +9.8 L +10.2) LCB 448.48c P 1.82% WF 6.94% PSV 3 N 3 -- D11 C11 E11 +C10 : T 79.09c W 74.41c S 4.69c (+10.4 L +10.6) LCB 369.16c P 1.67% WF 6.71% PSV 2 N 3 -- C10 C11 C9 +F4 : T 78.04c W 73.08c S 4.95c (+10.6 L +10.4) LCB 280.00c P 1.38% WF 6.88% PSV 2 N 2 -- F4 L3 +G10 : T 75.33c W 71.10c S 4.23c ( +9.8 L +10.4) LCB 280.00c P 1.25% WF 7.10% PSV 2 N 2 -- G10 E4 +G4 : T 75.03c W 70.84c S 4.19c ( +9.8 L +10.5) LCB 280.00c P 1.24% WF 7.12% PSV 2 N 2 -- G4 E4 +F3 : T 76.27c W 71.61c S 4.66c (+10.4 L +10.3) LCB 280.00c P 1.21% WF 7.02% PSV 2 N 2 -- F3 L3 +F11 : T 74.40c W 70.15c S 4.26c ( +9.9 L +10.4) LCB 280.00c P 1.20% WF 7.17% PSV 2 N 2 -- F11 E4 +G11 : T 75.56c W 70.42c S 5.14c (+10.7 L +11.4) LCB 280.00c P 0.93% WF 7.16% PSV 1 N 1 -- G11 +H4 : T 77.80c W 72.07c S 5.73c (+11.2 L +11.8) LCB 280.00c P 0.81% WF 7.01% PSV 1 N 1 -- H4 +Search next player PONDERING - should still keep prior tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 538 +Last search playouts: 300 +NN rows: 780 +NN batches: 780 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 D12 C12 F12 D13 +Tree: +: T 66.32c W 63.33c S 2.99c ( +8.6 L +8.8) N 538 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.27c W 64.12c S 3.15c ( +8.7 L +8.9) LCB 64.80c P 59.84% WF 11.30% PSV 446 N 446 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 64.08c W 61.56c S 2.53c ( +8.1 L +8.1) LCB 57.15c P 12.31% WF 10.29% PSV 49 N 49 -- C3 D5 D3 F4 G11 E3 C6 L5 +D5 : T 57.31c W 55.51c S 1.80c ( +7.4 L +7.6) LCB 41.82c P 11.62% WF 8.96% PSV 23 N 23 -- D5 C3 C5 D3 F5 G4 F4 F3 +C5 : T 54.29c W 53.21c S 1.07c ( +6.7 L +6.9) LCB 17.43c P 4.49% WF 8.97% PSV 7 N 7 -- C5 D3 D5 F4 L3 +L4 : T 62.63c W 60.41c S 2.21c ( +7.8 L +7.7) LCB -163.77c P 1.49% WF 10.34% PSV 4 N 4 -- L4 L3 D3 E3 +L10 : T 61.35c W 59.45c S 1.89c ( +7.5 L +7.3) LCB -445.90c P 0.96% WF 10.21% PSV 2 N 3 -- L10 L11 L9 +K3 : T 60.98c W 59.24c S 1.75c ( +7.4 L +6.9) LCB -280.00c P 0.96% WF 10.23% PSV 2 N 2 -- K3 L3 +L11 : T 58.13c W 56.61c S 1.52c ( +7.2 L +6.5) LCB -280.00c P 0.78% WF 10.05% PSV 1 N 1 -- L11 +K11 : T 58.30c W 57.52c S 0.77c ( +6.4 L +5.6) LCB -280.00c P 0.78% WF 10.07% PSV 1 N 1 -- K11 +L3 : T 53.15c W 52.40c S 0.75c ( +6.4 L +5.5) LCB -280.00c P 0.69% WF 9.57% PSV 1 N 1 -- L3 +Without making a move - convert ponder to regular search, should still keep tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 538 +Last search playouts: 0 +NN rows: 780 +NN batches: 780 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 E11 E12 D12 C12 F12 D13 +Tree: +: T 66.38c W 63.33c S 3.04c ( +8.6 L +8.8) N 538 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.32c W 64.12c S 3.20c ( +8.7 L +8.9) LCB 64.86c P 59.84% WF 11.30% PSV 446 N 446 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 64.14c W 61.56c S 2.58c ( +8.1 L +8.1) LCB 57.21c P 12.31% WF 10.29% PSV 49 N 49 -- C3 D5 D3 F4 G11 E3 C6 L5 +D5 : T 57.37c W 55.51c S 1.86c ( +7.4 L +7.6) LCB 41.87c P 11.62% WF 8.96% PSV 23 N 23 -- D5 C3 C5 D3 F5 G4 F4 F3 +C5 : T 54.34c W 53.21c S 1.13c ( +6.7 L +6.9) LCB 17.48c P 4.49% WF 8.97% PSV 7 N 7 -- C5 D3 D5 F4 L3 +L4 : T 62.69c W 60.41c S 2.27c ( +7.8 L +7.7) LCB -163.70c P 1.49% WF 10.34% PSV 4 N 4 -- L4 L3 D3 E3 +L10 : T 61.41c W 59.45c S 1.95c ( +7.5 L +7.3) LCB -445.88c P 0.96% WF 10.21% PSV 2 N 3 -- L10 L11 L9 +K3 : T 61.04c W 59.24c S 1.81c ( +7.4 L +6.9) LCB -280.00c P 0.96% WF 10.23% PSV 2 N 2 -- K3 L3 +L11 : T 58.19c W 56.61c S 1.58c ( +7.2 L +6.5) LCB -280.00c P 0.78% WF 10.05% PSV 1 N 1 -- L11 +K11 : T 58.35c W 57.52c S 0.83c ( +6.4 L +5.6) LCB -280.00c P 0.78% WF 10.07% PSV 1 N 1 -- K11 +L3 : T 53.21c W 52.40c S 0.81c ( +6.4 L +5.5) LCB -280.00c P 0.69% WF 9.57% PSV 1 N 1 -- L3 +Set position to original, search PONDERING +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 300 +Last search playouts: 300 +NN rows: 288 +NN batches: 288 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 C7 D8 F6 +Tree: +: T -64.38c W -59.84c S -4.53c ( -8.6 L -8.9) N 300 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -63.58c W -59.16c S -4.42c ( -8.5 L -8.9) LCB -66.50c P 56.26% WF 13.97% PSV 221 N 221 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -65.01c W -60.45c S -4.56c ( -8.6 L -8.9) LCB -71.52c P 13.32% WF 13.39% PSV 40 N 40 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T -67.04c W -62.13c S -4.92c ( -8.9 L -9.3) LCB -74.11c P 13.11% WF 12.82% PSV 29 N 30 -- C10 D10 D11 E11 C11 D4 D3 +L3 : T -78.80c W -72.02c S -6.78c (-10.9 L -10.8) LCB -280.00c P 2.62% WF 11.50% PSV 2 N 2 -- L3 D4 +L11 : T -75.73c W -69.41c S -6.32c (-10.5 L -10.5) LCB -280.00c P 2.45% WF 11.94% PSV 2 N 2 -- L11 D4 +C11 : T -71.78c W -65.85c S -5.93c ( -9.9 L -10.2) LCB -280.00c P 1.48% WF 12.50% PSV 2 N 2 -- C11 D4 +K11 : T -77.08c W -70.21c S -6.88c (-11.0 L -11.2) LCB -280.00c P 0.94% WF 12.03% PSV 0 N 1 -- K11 +E4 : T -78.69c W -70.80c S -7.88c (-11.6 L -12.0) LCB -280.00c P 0.91% WF 11.84% PSV 0 N 1 -- E4 +Without making a move, convert to regular search, should not keep tree +and should not benefit from cache, since search would guess the opponent as 'our' side +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 486 +NN batches: 486 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 H4 L11 L10 K11 +Tree: +: T 67.83c W 65.39c S 2.45c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 69.17c W 66.45c S 2.72c ( +9.1 L +9.3) LCB 65.61c P 39.52% WF 9.09% PSV 119 N 119 -- D10 D4 D3 E3 C3 E4 D6 H4 +D11 : T 65.05c W 63.12c S 1.93c ( +8.4 L +8.5) LCB 56.48c P 20.40% WF 8.22% PSV 33 N 33 -- D11 D10 C10 E11 C11 D4 D3 +L11 : T 68.43c W 66.14c S 2.29c ( +8.7 L +8.4) LCB 50.21c P 3.61% WF 8.82% PSV 9 N 9 -- L11 D10 K11 J10 +L10 : T 69.06c W 66.39c S 2.67c ( +9.1 L +9.1) LCB 50.55c P 2.89% WF 8.90% PSV 8 N 9 -- L10 L11 L9 M11 D10 D4 +C10 : T 63.82c W 62.04c S 1.78c ( +8.2 L +8.4) LCB 26.97c P 5.91% WF 8.20% PSV 8 N 8 -- C10 D10 D11 E11 +L3 : T 64.54c W 62.69c S 1.85c ( +8.3 L +8.1) LCB -0.48c P 3.64% WF 8.35% PSV 5 N 5 -- L3 D10 L4 K5 +K3 : T 68.14c W 65.72c S 2.42c ( +8.8 L +9.1) LCB -6.38c P 2.29% WF 8.77% PSV 5 N 5 -- K3 L3 J3 J4 +K11 : T 67.45c W 65.08c S 2.37c ( +8.8 L +8.6) LCB -6.15c P 2.26% WF 8.69% PSV 5 N 5 -- K11 L11 J11 J10 H11 +L4 : T 65.98c W 64.12c S 1.87c ( +8.3 L +8.1) LCB -257.11c P 2.17% WF 8.54% PSV 3 N 3 -- L4 L3 L5 +E4 : T 45.74c W 46.79c S -1.05c ( +5.6 L +5.4) LCB -280.00c P 2.10% WF 7.02% PSV 1 N 1 -- E4 +C11 : T 55.55c W 55.54c S 0.02c ( +6.6 L +6.9) LCB -280.00c P 1.17% WF 7.77% PSV 0 N 1 -- C11 +E10 : T 53.80c W 53.88c S -0.09c ( +6.5 L +6.9) LCB -280.00c P 1.07% WF 7.63% PSV 0 N 1 -- E10 +But should be fine thereafter. Make two moves and continue +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 259 +Last search playouts: 200 +NN rows: 682 +NN batches: 682 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 H4 L11 L10 K11 J10 +Tree: +: T 68.36c W 65.24c S 3.12c ( +8.8 L +8.9) N 259 -- D3 E3 C3 E4 D6 H4 L11 +---White(^)--- +D3 : T 69.87c W 66.50c S 3.37c ( +9.0 L +9.2) LCB 66.90c P 50.08% WF 23.17% PSV 198 N 198 -- D3 E3 C3 E4 D6 H4 L11 L10 +C3 : T 65.10c W 62.60c S 2.50c ( +8.2 L +8.2) LCB 58.07c P 23.52% WF 20.37% PSV 43 N 43 -- C3 D5 D3 F4 L4 L3 L5 M3 +D5 : T 57.81c W 56.27c S 1.54c ( +7.2 L +7.6) LCB 40.86c P 8.99% WF 18.42% PSV 9 N 9 -- D5 C3 C5 D3 F5 G4 +C5 : T 54.12c W 53.20c S 0.92c ( +6.7 L +6.8) LCB 4.66c P 7.31% WF 17.66% PSV 6 N 6 -- C5 D3 D5 F4 L3 +K3 : T 61.52c W 59.73c S 1.79c ( +7.5 L +7.2) LCB -280.00c P 1.23% WF 20.38% PSV 1 N 2 -- K3 L3 +Set position to original, search PONDERING +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 300 +Last search playouts: 300 +NN rows: 291 +NN batches: 291 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 C6 D11 C11 E11 C10 E10 +Tree: +: T -63.59c W -59.77c S -3.82c ( -8.6 L -8.9) N 300 -- D10 D4 D3 E3 C3 E4 C6 +---White(^)--- +D10 : T -62.87c W -59.13c S -3.73c ( -8.5 L -8.8) LCB -65.92c P 56.73% WF 13.94% PSV 219 N 219 -- D10 D4 D3 E3 C3 E4 C6 D11 +D11 : T -64.18c W -60.34c S -3.84c ( -8.6 L -8.9) LCB -69.13c P 16.56% WF 13.40% PSV 50 N 51 -- D11 D10 C10 E11 C11 D4 D3 E3 +C10 : T -66.78c W -62.58c S -4.20c ( -8.9 L -9.2) LCB -74.95c P 10.20% WF 12.74% PSV 21 N 23 -- C10 D4 D3 E3 C3 D10 D11 +C11 : T -69.71c W -64.68c S -5.03c ( -9.7 L -10.1) LCB -280.00c P 1.57% WF 12.70% PSV 2 N 2 -- C11 D4 +L11 : T -80.62c W -73.96c S -6.66c (-11.4 L -11.8) LCB -280.00c P 2.27% WF 11.52% PSV 1 N 1 -- L11 +L3 : T -78.08c W -71.57c S -6.51c (-11.2 L -12.0) LCB -280.00c P 1.66% WF 11.82% PSV 1 N 1 -- L3 +K11 : T -70.28c W -65.17c S -5.11c ( -9.9 L -10.3) LCB -280.00c P 0.83% WF 12.77% PSV 1 N 1 -- K11 +L10 : T -84.09c W -76.90c S -7.20c (-12.0 L -12.1) LCB -280.00c P 1.15% WF 11.11% PSV 0 N 1 -- L10 +Play that move and real search on the next position, should keep tree because correct guess of side +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 400 +Last search playouts: 181 +NN rows: 461 +NN batches: 461 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 D5 C11 C10 D11 E10 E11 F10 +Tree: +: T -62.25c W -59.21c S -3.04c ( -8.5 L -8.8) N 400 -- E3 D5 C11 C10 D11 E10 E11 +---Black(v)--- +E3 : T -64.52c W -61.14c S -3.38c ( -8.8 L -9.2) LCB -60.59c P 14.06% WF 8.54% PSV 301 N 118 -- E3 D5 C11 C10 D11 E10 E11 F10 +D4 : T -62.93c W -59.78c S -3.16c ( -8.6 L -8.9) LCB -60.06c P 44.48% WF 8.20% PSV 231 N 231 -- D4 D3 E3 C3 E4 C6 D11 C11 +E4 : T -51.58c W -50.16c S -1.42c ( -7.0 L -7.5) LCB -37.67c P 13.13% WF 6.42% PSV 18 N 19 -- E4 L3 L4 K3 H3 J3 +D3 : T -55.79c W -53.86c S -1.94c ( -7.5 L -7.6) LCB -12.75c P 3.70% WF 7.24% PSV 7 N 7 -- D3 D4 E3 E4 F4 +D11 : T -56.38c W -54.27c S -2.11c ( -7.6 L -7.8) LCB 2.92c P 3.24% WF 7.33% PSV 6 N 6 -- D11 C11 E11 E10 F11 +C10 : T -56.91c W -54.75c S -2.17c ( -7.7 L -8.0) LCB 17.25c P 2.86% WF 7.39% PSV 6 N 6 -- C10 C11 C9 B11 +C11 : T -54.37c W -52.59c S -1.77c ( -7.3 L -7.4) LCB 91.26c P 3.03% WF 7.15% PSV 5 N 5 -- C11 C10 D11 E10 E11 +C8 : T -46.47c W -45.82c S -0.65c ( -6.2 L -6.5) LCB 280.00c P 1.13% WF 6.86% PSV 1 N 1 -- C8 +F11 : T -51.12c W -49.79c S -1.33c ( -6.9 L -7.3) LCB 280.00c P 0.95% WF 7.19% PSV 1 N 1 -- F11 +E10 : T -53.27c W -52.25c S -1.02c ( -6.6 L -6.7) LCB 280.00c P 0.67% WF 7.34% PSV 1 N 1 -- E10 +D8 : T -38.09c W -38.20c S 0.12c ( -5.5 L -5.8) LCB 280.00c P 0.83% WF 6.28% PSV 0 N 1 -- D8 +D6 : T -37.66c W -38.31c S 0.65c ( -5.0 L -5.2) LCB 280.00c P 0.69% WF 6.26% PSV 0 N 1 -- D6 +F10 : T -43.40c W -42.77c S -0.62c ( -6.2 L -6.7) LCB 280.00c P 0.68% WF 6.65% PSV 0 N 1 -- F10 +D9 : T -50.46c W -49.73c S -0.73c ( -6.3 L -6.2) LCB 280.00c P 0.64% WF 7.14% PSV 0 N 1 -- D9 diff --git a/cpp/tests/results/runSearchTestsV8FP16.txt b/cpp/tests/results/runSearchTestsV8FP16.txt index c53358f2a..e5262e88c 100644 --- a/cpp/tests/results/runSearchTestsV8FP16.txt +++ b/cpp/tests/results/runSearchTestsV8FP16.txt @@ -327,3 +327,1168 @@ O18 N18 : T -1.58c W -1.40c S -0.18c ( -0.3 L -0.2) LCB -9.26c P 93.23% WF P16 : T 3.59c W 3.29c S 0.30c ( +0.4 L +0.1) LCB 108.81c P 4.98% WF 31.31% PSV 4 N 4 -- P16 P17 S16 S15 +=================================================================== +Testing PDA + pondering, p200 v400 +=================================================================== +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 196 +NN batches: 196 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 C10 D11 E10 +Tree: +: T 67.70c W 65.42c S 2.28c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.28c W 65.84c S 2.44c ( +9.0 L +9.2) LCB 64.33c P 44.26% WF 9.41% PSV 112 N 112 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 66.59c W 64.53c S 2.06c ( +8.6 L +8.7) LCB 56.37c P 12.93% WF 9.04% PSV 25 N 25 -- D11 D10 C10 E11 C11 D4 D3 +L10 : T 70.69c W 68.11c S 2.58c ( +9.1 L +9.1) LCB 55.14c P 2.59% WF 9.69% PSV 11 N 11 -- L10 L11 L9 K11 D10 +C10 : T 62.84c W 61.36c S 1.48c ( +8.1 L +8.3) LCB 42.47c P 8.18% WF 8.51% PSV 10 N 11 -- C10 D10 D11 E11 C11 D4 +L4 : T 66.93c W 64.61c S 2.32c ( +8.9 L +8.9) LCB 46.94c P 4.55% WF 9.13% PSV 9 N 9 -- L4 L3 L5 M3 D10 D4 +K3 : T 66.54c W 64.42c S 2.12c ( +8.7 L +8.7) LCB 36.90c P 4.44% WF 9.07% PSV 8 N 10 -- K3 L3 J3 J4 H3 H4 G4 +L11 : T 68.02c W 66.03c S 1.99c ( +8.6 L +8.1) LCB 48.79c P 3.15% WF 9.28% PSV 7 N 8 -- L11 D10 L10 D4 +K11 : T 68.75c W 66.56c S 2.18c ( +8.8 L +8.8) LCB 13.90c P 2.44% WF 9.37% PSV 6 N 6 -- K11 L11 J11 J10 H11 +J10 : T 68.91c W 66.90c S 2.01c ( +8.6 L +8.4) LCB -386.98c P 1.14% WF 9.37% PSV 3 N 3 -- J10 J11 D10 +L3 : T 62.99c W 61.61c S 1.38c ( +8.0 L +7.8) LCB -306.66c P 2.15% WF 8.72% PSV 2 N 3 -- L3 D10 L4 +C11 : T 57.72c W 57.42c S 0.30c ( +7.0 L +7.2) LCB -280.00c P 1.25% WF 8.41% PSV 1 N 1 -- C11 +Search next player - should clear tree and flip PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 393 +NN batches: 393 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 L3 D5 C5 D6 L4 C6 +Tree: +: T -62.03c W -58.75c S -3.29c ( -8.4 L -8.8) N 200 -- E3 L3 D5 C5 D6 L4 C6 +---Black(v)--- +E3 : T -64.73c W -60.96c S -3.78c ( -8.9 L -9.3) LCB -58.93c P 14.10% WF 14.45% PSV 124 N 53 -- E3 L3 D5 C5 D6 L4 C6 +D4 : T -62.74c W -59.37c S -3.38c ( -8.5 L -8.8) LCB -58.76c P 44.37% WF 13.85% PSV 116 N 116 -- D4 D3 E3 C3 E4 D6 C8 D8 +E4 : T -51.02c W -49.39c S -1.63c ( -6.9 L -7.4) LCB -27.61c P 13.15% WF 11.14% PSV 11 N 11 -- E4 L3 L4 K3 H3 J3 +C11 : T -60.96c W -58.07c S -2.89c ( -8.1 L -8.2) LCB -34.27c P 3.04% WF 13.34% PSV 6 N 6 -- C11 C10 D11 E10 D4 +D3 : T -55.34c W -53.26c S -2.08c ( -7.3 L -7.4) LCB 255.45c P 3.71% WF 12.40% PSV 4 N 4 -- D3 D4 E3 +D11 : T -54.88c W -52.83c S -2.05c ( -7.2 L -7.5) LCB 94.94c P 3.24% WF 12.25% PSV 3 N 5 -- D11 C11 E11 E10 F11 +C10 : T -51.80c W -50.17c S -1.63c ( -6.8 L -6.9) LCB 1211.58c P 2.86% WF 11.92% PSV 2 N 3 -- C10 C11 C9 +C8 : T -37.85c W -38.13c S 0.28c ( -5.0 L -5.3) LCB 280.00c P 1.14% WF 10.65% PSV 0 N 1 -- C8 +Search next player - should clear tree and flip PDA +HASH: E5EB22829EDFE41082611B3D0FFD7E8C + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 563 +NN batches: 563 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: L3 D5 C5 D6 K3 C6 D3 +Tree: +: T 69.43c W 65.85c S 3.58c ( +9.2 L +9.4) N 200 -- L3 D5 C5 D6 K3 C6 D3 +---White(^)--- +L3 : T 72.61c W 68.52c S 4.09c ( +9.7 L +9.7) LCB 67.33c P 16.30% WF 5.45% PSV 85 N 85 -- L3 D5 C5 D6 K3 C6 D3 +D3 : T 66.98c W 63.80c S 3.17c ( +8.8 L +9.1) LCB 56.76c P 10.84% WF 4.78% PSV 18 N 19 -- D3 E4 L3 K3 L4 K5 L5 +D5 : T 67.14c W 64.12c S 3.02c ( +8.6 L +9.1) LCB 60.39c P 8.31% WF 4.81% PSV 14 N 14 -- D5 H4 L11 L10 K11 J10 +L11 : T 67.18c W 63.96c S 3.22c ( +8.9 L +9.0) LCB 53.04c P 7.90% WF 4.82% PSV 13 N 13 -- L11 L10 K11 J10 J11 H10 +K11 : T 72.33c W 68.23c S 4.10c ( +9.7 L +10.0) LCB 55.28c P 3.22% WF 5.25% PSV 11 N 11 -- K11 L11 J11 J10 H11 L12 H10 +E4 : T 63.39c W 61.41c S 1.97c ( +7.6 L +8.0) LCB 37.12c P 6.66% WF 4.57% PSV 7 N 7 -- E4 D4 D5 D3 +L10 : T 70.58c W 66.71c S 3.87c ( +9.5 L +9.9) LCB 37.07c P 2.37% WF 5.09% PSV 7 N 7 -- L10 L11 L9 M11 +K3 : T 69.47c W 65.87c S 3.60c ( +9.2 L +9.6) LCB 42.94c P 2.82% WF 5.01% PSV 6 N 7 -- K3 L3 J3 L4 J4 +L4 : T 69.91c W 66.01c S 3.90c ( +9.5 L +9.6) LCB 24.59c P 2.66% WF 5.04% PSV 6 N 6 -- L4 L3 L5 M3 L8 +J4 : T 70.29c W 66.54c S 3.75c ( +9.4 L +9.8) LCB 10.48c P 2.01% WF 5.07% PSV 5 N 5 -- J4 K3 K5 J5 +H3 : T 61.07c W 58.35c S 2.72c ( +8.5 L +8.4) LCB -199.71c P 4.85% WF 4.48% PSV 4 N 4 -- H3 D5 C5 D6 +G11 : T 65.12c W 62.20c S 2.92c ( +8.6 L +8.9) LCB -825.27c P 2.40% WF 4.75% PSV 3 N 3 -- G11 D5 C5 +E5 : T 58.24c W 56.55c S 1.70c ( +7.4 L +7.8) LCB -496.85c P 3.39% WF 4.35% PSV 2 N 3 -- E5 C3 B3 +H11 : T 64.86c W 61.98c S 2.88c ( +8.6 L +8.6) LCB -1007.80c P 2.16% WF 4.74% PSV 2 N 3 -- H11 D5 C5 +L6 : T 66.76c W 63.29c S 3.47c ( +9.2 L +9.1) LCB -280.00c P 1.66% WF 4.86% PSV 2 N 2 -- L6 D5 +L8 : T 65.29c W 62.00c S 3.29c ( +9.0 L +8.8) LCB -280.00c P 1.63% WF 4.79% PSV 2 N 2 -- L8 D5 +F10 : T 69.05c W 65.64c S 3.40c ( +9.0 L +9.4) LCB -280.00c P 1.15% WF 4.99% PSV 2 N 2 -- F10 D5 +G10 : T 58.57c W 56.72c S 1.85c ( +7.6 L +7.9) LCB -1173.18c P 2.09% WF 4.37% PSV 1 N 3 -- G10 D5 C5 +G3 : T 63.02c W 60.46c S 2.56c ( +8.3 L +8.6) LCB -280.00c P 1.32% WF 4.72% PSV 1 N 1 -- G3 +D4 : T 42.71c W 43.46c S -0.75c ( +5.1 L +5.7) LCB -280.00c P 1.59% WF 3.83% PSV 0 N 1 -- D4 +H4 : T 52.12c W 50.97c S 1.16c ( +6.9 L +7.3) LCB -280.00c P 1.07% WF 4.23% PSV 0 N 1 -- H4 +Basic search with PDA 1.5, force black +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 191 +NN batches: 191 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 +Tree: +: T -63.80c W -59.77c S -4.03c ( -8.6 L -9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -63.38c W -59.37c S -4.01c ( -8.6 L -8.9) LCB -67.30c P 51.85% WF 15.38% PSV 127 N 127 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -63.96c W -59.99c S -3.96c ( -8.5 L -9.0) LCB -70.24c P 17.50% WF 15.12% PSV 39 N 40 -- D11 D10 C10 E11 C11 D4 D3 +C10 : T -63.90c W -59.99c S -3.92c ( -8.5 L -8.9) LCB -71.06c P 11.41% WF 15.14% PSV 25 N 27 -- C10 D10 D11 E11 C11 D4 D3 +L3 : T -74.31c W -68.61c S -5.69c (-10.4 L -10.3) LCB -280.00c P 2.85% WF 13.47% PSV 2 N 2 -- L3 D4 +L11 : T -79.38c W -72.79c S -6.59c (-11.2 L -11.8) LCB -280.00c P 2.62% WF 13.06% PSV 1 N 1 -- L11 +E4 : T -76.21c W -69.39c S -6.81c (-11.1 L -12.1) LCB -280.00c P 1.73% WF 13.48% PSV 1 N 1 -- E4 +C11 : T -69.81c W -64.10c S -5.71c (-10.1 L -11.0) LCB -280.00c P 1.57% WF 14.35% PSV 1 N 1 -- C11 +Search next player - should preserve tree +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 327 +Last search playouts: 200 +NN rows: 391 +NN batches: 391 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 +Tree: +: T -61.36c W -58.48c S -2.88c ( -8.4 L -8.8) N 327 -- D4 D3 E3 C3 E4 D6 C8 +---Black(v)--- +D4 : T -63.47c W -60.26c S -3.21c ( -8.8 L -9.1) LCB -60.35c P 35.71% WF 8.01% PSV 219 N 219 -- D4 D3 E3 C3 E4 D6 C8 D8 +E3 : T -60.73c W -57.97c S -2.77c ( -8.3 L -8.7) LCB -52.88c P 11.53% WF 7.35% PSV 38 N 38 -- E3 L3 D5 C5 D6 K3 +E4 : T -55.31c W -53.30c S -2.01c ( -7.6 L -8.0) LCB -46.10c P 20.79% WF 6.47% PSV 36 N 36 -- E4 L3 L4 K3 J3 J2 H2 H3 +D3 : T -55.52c W -53.60c S -1.92c ( -7.5 L -7.8) LCB -32.56c P 6.40% WF 6.72% PSV 11 N 12 -- D3 D4 E3 E4 F4 C3 +C11 : T -57.80c W -55.58c S -2.22c ( -7.8 L -7.9) LCB 33.73c P 2.42% WF 7.09% PSV 5 N 5 -- C11 C10 D11 E10 E11 +C10 : T -54.73c W -52.96c S -1.77c ( -7.4 L -7.7) LCB 240.88c P 2.41% WF 6.82% PSV 4 N 4 -- C10 C11 C9 D11 +D11 : T -57.34c W -55.23c S -2.11c ( -7.7 L -7.9) LCB 60.68c P 2.14% WF 7.06% PSV 4 N 4 -- D11 C11 E11 C10 +E10 : T -53.18c W -52.24c S -0.93c ( -6.6 L -6.7) LCB 280.00c P 1.31% WF 6.89% PSV 1 N 1 -- E10 +D9 : T -50.20c W -49.56c S -0.63c ( -6.3 L -6.2) LCB 280.00c P 1.22% WF 6.70% PSV 1 N 1 -- D9 +F11 : T -51.12c W -49.78c S -1.34c ( -7.0 L -7.2) LCB 280.00c P 0.81% WF 6.76% PSV 1 N 1 -- F11 +G11 : T -30.44c W -31.74c S 1.29c ( -4.5 L -5.3) LCB 280.00c P 1.10% WF 5.43% PSV 0 N 1 -- G11 +F10 : T -43.13c W -42.91c S -0.22c ( -5.9 L -6.5) LCB 280.00c P 1.01% WF 6.23% PSV 0 N 1 -- F10 +G10 : T -40.97c W -41.03c S 0.07c ( -5.6 L -6.5) LCB 280.00c P 0.92% WF 6.09% PSV 0 N 1 -- G10 +C8 : T -46.41c W -45.84c S -0.57c ( -6.2 L -6.5) LCB 280.00c P 0.84% WF 6.45% PSV 0 N 1 -- C8 +H10 : T -38.09c W -38.33c S 0.25c ( -5.5 L -6.3) LCB 280.00c P 0.83% WF 5.91% PSV 0 N 1 -- H10 +Search next player - should preserve tree +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 400 +Last search playouts: 181 +NN rows: 567 +NN batches: 567 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 +Tree: +: T -63.68c W -60.51c S -3.17c ( -8.8 L -9.1) N 400 -- D3 E3 C3 E4 D6 C8 D8 +---White(^)--- +D3 : T -62.94c W -59.90c S -3.04c ( -8.7 L -9.0) LCB -65.77c P 58.68% WF 22.19% PSV 297 N 297 -- D3 E3 C3 E4 D6 C8 D8 D9 +C3 : T -64.98c W -61.58c S -3.40c ( -9.0 L -9.4) LCB -69.41c P 23.89% WF 20.83% PSV 83 N 83 -- C3 D5 D3 F4 L11 L10 K11 J10 +D5 : T -68.84c W -64.81c S -4.03c ( -9.6 L -9.8) LCB -81.83c P 6.71% WF 19.62% PSV 14 N 15 -- D5 C3 C5 D3 F5 G4 L11 L10 +C5 : T -75.17c W -69.76c S -5.41c (-10.9 L -11.2) LCB -519.87c P 2.36% WF 18.66% PSV 3 N 3 -- C5 D3 D5 +L3 : T -78.61c W -72.67c S -5.94c (-11.5 L -12.1) LCB -280.00c P 1.28% WF 18.70% PSV 1 N 1 -- L3 +Search next player PONDERING - should preserve tree +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 597 +Last search playouts: 300 +NN rows: 848 +NN batches: 848 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 C3 E4 D6 C8 C7 D8 F6 H4 F10 C11 C10 B10 +Tree: +: T -62.09c W -59.14c S -2.95c ( -8.6 L -8.9) N 597 -- E3 C3 E4 D6 C8 C7 D8 +---Black(v)--- +E3 : T -63.75c W -60.52c S -3.23c ( -8.8 L -9.1) LCB -61.40c P 41.76% WF 7.63% PSV 418 N 418 -- E3 C3 E4 D6 C8 C7 D8 F6 +C5 : T -59.73c W -57.16c S -2.58c ( -8.2 L -8.5) LCB -56.14c P 28.65% WF 6.64% PSV 121 N 121 -- C5 C3 E4 F3 F11 F4 C8 E9 +D11 : T -54.59c W -53.16c S -1.43c ( -7.1 L -7.2) LCB -34.55c P 4.66% WF 6.24% PSV 11 N 12 -- D11 C11 E11 E10 F11 F10 +C3 : T -61.25c W -58.01c S -3.24c ( -8.9 L -9.0) LCB 0.96c P 1.75% WF 7.03% PSV 9 N 10 -- C3 C2 B3 E3 +C10 : T -55.93c W -54.25c S -1.67c ( -7.3 L -7.5) LCB -12.87c P 3.51% WF 6.45% PSV 9 N 9 -- C10 C11 C9 D11 C5 +C11 : T -54.03c W -52.63c S -1.40c ( -7.1 L -7.1) LCB -19.06c P 3.32% WF 6.27% PSV 7 N 8 -- C11 C10 D11 E10 E3 C3 +F11 : T -57.34c W -55.06c S -2.28c ( -7.9 L -8.1) LCB 97.72c P 1.09% WF 6.67% PSV 3 N 5 -- F11 E3 C5 D5 E4 +D5 : T -42.95c W -43.08c S 0.13c ( -5.6 L -5.9) LCB 587.09c P 3.01% WF 5.55% PSV 3 N 3 -- D5 E3 C5 +D9 : T -45.19c W -45.20c S 0.02c ( -5.8 L -6.1) LCB 280.00c P 1.66% WF 5.86% PSV 2 N 2 -- D9 C10 +E10 : T -48.61c W -48.23c S -0.38c ( -6.1 L -6.5) LCB 280.00c P 1.48% WF 6.11% PSV 2 N 2 -- E10 D11 +G11 : T -41.35c W -41.36c S 0.01c ( -5.7 L -6.3) LCB 280.00c P 0.98% WF 5.81% PSV 1 N 1 -- G11 +C8 : T -45.41c W -45.46c S 0.05c ( -5.7 L -5.8) LCB 280.00c P 0.84% WF 6.07% PSV 1 N 1 -- C8 +G10 : T -52.93c W -52.06c S -0.87c ( -6.6 L -7.0) LCB 280.00c P 0.63% WF 6.54% PSV 1 N 1 -- G10 +E4 : T -39.54c W -40.40c S 0.85c ( -5.0 L -5.3) LCB 280.00c P 0.85% WF 5.70% PSV 0 N 1 -- E4 +F10 : T -39.53c W -40.30c S 0.77c ( -5.0 L -5.5) LCB 280.00c P 0.75% WF 5.70% PSV 0 N 1 -- F10 +D8 : T -39.96c W -40.52c S 0.56c ( -5.2 L -5.5) LCB 280.00c P 0.50% WF 5.73% PSV 0 N 1 -- D8 +Search next player - should preserve tree +HASH: 3CE07EBDEC180D0C4D1F494DACE35DEF + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 418 +Last search playouts: 0 +NN rows: 848 +NN batches: 848 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: C3 E4 D6 C8 C7 D8 F6 H4 F10 C11 C10 B10 +Tree: +: T -63.64c W -60.52c S -3.12c ( -8.8 L -9.1) N 418 -- C3 E4 D6 C8 C7 D8 F6 +---White(^)--- +C3 : T -63.33c W -60.27c S -3.06c ( -8.8 L -9.1) LCB -65.94c P 73.82% WF 21.87% PSV 340 N 340 -- C3 E4 D6 C8 C7 D8 F6 H4 +D5 : T -62.79c W -59.79c S -3.00c ( -8.7 L -8.9) LCB -69.09c P 11.52% WF 22.06% PSV 59 N 60 -- D5 E4 C3 D11 C11 E11 C10 E10 +E4 : T -73.86c W -68.68c S -5.18c (-10.9 L -11.3) LCB -91.96c P 8.59% WF 17.87% PSV 12 N 13 -- E4 D5 F3 E2 D2 F2 C5 +C2 : T -77.43c W -71.85c S -5.58c (-11.1 L -11.2) LCB -280.00c P 2.16% WF 18.43% PSV 2 N 2 -- C2 D5 +C5 : T -71.52c W -67.35c S -4.17c ( -9.7 L -10.0) LCB -280.00c P 1.26% WF 19.77% PSV 2 N 2 -- C5 D2 +Basic search with PDA 1.5, force white +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 195 +NN batches: 195 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 D11 C10 D9 +Tree: +: T 67.10c W 64.90c S 2.19c ( +8.8 L +8.9) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 67.86c W 65.49c S 2.37c ( +8.9 L +9.2) LCB 64.15c P 43.54% WF 10.46% PSV 116 N 116 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 65.79c W 63.81c S 1.98c ( +8.6 L +8.6) LCB 56.95c P 15.73% WF 9.94% PSV 30 N 30 -- D11 D4 D3 C5 C3 C9 +C10 : T 62.40c W 61.02c S 1.38c ( +8.0 L +8.2) LCB 41.76c P 10.30% WF 9.40% PSV 13 N 13 -- C10 D4 D3 E3 C3 D10 +K3 : T 67.90c W 65.75c S 2.15c ( +8.7 L +8.8) LCB 45.44c P 3.56% WF 10.35% PSV 9 N 10 -- K3 L3 J3 J4 H3 +K11 : T 68.89c W 66.45c S 2.44c ( +9.0 L +9.0) LCB 44.34c P 2.73% WF 10.50% PSV 9 N 9 -- K11 L11 J11 J10 G11 +L11 : T 66.81c W 65.08c S 1.74c ( +8.4 L +8.0) LCB 16.90c P 3.12% WF 10.18% PSV 6 N 6 -- L11 D10 K11 +L4 : T 68.13c W 65.67c S 2.46c ( +9.1 L +9.0) LCB 43.10c P 2.31% WF 10.37% PSV 6 N 6 -- L4 L3 L5 M3 D10 +L3 : T 63.70c W 62.16c S 1.55c ( +8.2 L +7.9) LCB -58.79c P 3.18% WF 9.78% PSV 4 N 4 -- L3 D10 L4 +L10 : T 66.45c W 64.48c S 1.98c ( +8.6 L +8.5) LCB -196.62c P 1.67% WF 10.13% PSV 3 N 4 -- L10 L11 L9 K11 +C11 : T 52.49c W 53.05c S -0.57c ( +6.2 L +6.4) LCB -280.00c P 1.07% WF 8.88% PSV 0 N 1 -- C11 +Search next player - should preserve tree +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 316 +Last search playouts: 200 +NN rows: 394 +NN batches: 394 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 D11 C10 C9 B9 +Tree: +: T 68.86c W 65.62c S 3.24c ( +9.0 L +9.2) N 316 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 66.95c W 64.09c S 2.86c ( +8.6 L +8.9) LCB 70.24c P 32.60% WF 8.73% PSV 190 N 190 -- D4 D3 E3 C3 E4 D6 C11 D11 +E3 : T 70.25c W 66.68c S 3.57c ( +9.3 L +9.5) LCB 75.74c P 19.07% WF 7.92% PSV 55 N 55 -- E3 L3 D5 C5 D6 K3 J4 L4 +D3 : T 69.90c W 66.55c S 3.35c ( +9.0 L +9.4) LCB 79.34c P 6.84% WF 8.03% PSV 21 N 21 -- D3 D4 E3 C3 G4 L3 +E4 : T 74.65c W 70.08c S 4.58c (+10.3 L +10.4) LCB 88.48c P 11.23% WF 7.31% PSV 19 N 19 -- E4 L3 L4 K3 J4 H2 +C11 : T 73.97c W 69.92c S 4.05c ( +9.8 L +10.2) LCB 85.61c P 8.32% WF 7.46% PSV 15 N 15 -- C11 C10 D11 E10 F11 E11 E12 +D11 : T 73.24c W 69.72c S 3.52c ( +9.2 L +9.6) LCB 145.43c P 1.97% WF 7.73% PSV 3 N 4 -- D11 C11 E11 +C10 : T 76.88c W 72.61c S 4.27c (+10.0 L +10.2) LCB 280.00c P 1.81% WF 7.49% PSV 2 N 2 -- C10 C11 +G4 : T 77.21c W 72.68c S 4.53c (+10.1 L +10.8) LCB 280.00c P 1.49% WF 7.46% PSV 2 N 2 -- G4 E4 +F3 : T 78.83c W 73.65c S 5.18c (+10.8 L +10.7) LCB 280.00c P 1.50% WF 7.32% PSV 1 N 2 -- F3 L3 +F4 : T 78.09c W 73.11c S 4.98c (+10.6 L +10.4) LCB 280.00c P 1.19% WF 7.38% PSV 1 N 2 -- F4 L3 +G10 : T 76.39c W 71.68c S 4.71c (+10.3 L +11.1) LCB 280.00c P 1.04% WF 7.63% PSV 1 N 1 -- G10 +H4 : T 76.99c W 71.40c S 5.59c (+11.1 L +11.8) LCB 280.00c P 0.82% WF 7.59% PSV 1 N 1 -- H4 +F11 : T 72.02c W 67.54c S 4.48c (+10.1 L +10.6) LCB 280.00c P 0.76% WF 7.95% PSV 1 N 1 -- F11 +Search next player - should preserve tree +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 390 +Last search playouts: 200 +NN rows: 589 +NN batches: 589 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 E4 D6 H4 L11 L10 K11 J10 J11 +Tree: +: T 67.36c W 64.24c S 3.12c ( +8.7 L +8.9) N 390 -- D3 E3 C3 E4 D6 H4 L11 +---White(^)--- +D3 : T 68.87c W 65.52c S 3.36c ( +8.9 L +9.1) LCB 66.31c P 48.85% WF 19.38% PSV 305 N 305 -- D3 E3 C3 E4 D6 H4 L11 L10 +C3 : T 63.30c W 60.84c S 2.46c ( +8.0 L +8.0) LCB 55.27c P 15.87% WF 16.66% PSV 38 N 38 -- C3 D5 D3 F4 L3 L4 K3 J4 +D5 : T 58.80c W 56.84c S 1.96c ( +7.5 L +7.8) LCB 42.40c P 13.84% WF 15.29% PSV 22 N 22 -- D5 C3 C5 D3 F5 G4 L3 +C5 : T 60.97c W 58.92c S 2.05c ( +7.6 L +7.8) LCB 52.28c P 11.63% WF 16.04% PSV 22 N 22 -- C5 D3 D5 F4 L3 K3 L4 L5 +L10 : T 56.20c W 55.46c S 0.74c ( +6.4 L +5.6) LCB -280.00c P 0.74% WF 16.46% PSV 1 N 1 -- L10 +L4 : T 54.44c W 53.89c S 0.55c ( +6.2 L +5.2) LCB -280.00c P 0.74% WF 16.17% PSV 0 N 1 -- L4 +Search next player PONDERING - should preserve tree +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 600 +Last search playouts: 295 +NN rows: 876 +NN batches: 876 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: E3 C3 C11 C10 D11 E10 F12 L3 K3 L4 +Tree: +: T 68.34c W 65.18c S 3.16c ( +8.9 L +9.1) N 600 -- E3 C3 C11 C10 D11 E10 F12 +---Black(v)--- +E3 : T 67.08c W 64.11c S 2.97c ( +8.7 L +9.0) LCB 69.24c P 52.81% WF 12.00% PSV 502 N 502 -- E3 C3 C11 C10 D11 E10 F12 L3 +C5 : T 74.85c W 70.79c S 4.06c ( +9.8 L +9.9) LCB 79.25c P 24.56% WF 9.49% PSV 67 N 67 -- C5 C3 E4 F3 F4 G3 G4 H3 +C11 : T 74.45c W 70.20c S 4.26c (+10.0 L +10.4) LCB 85.89c P 6.88% WF 10.07% PSV 19 N 19 -- C11 C10 D11 E11 E12 F12 F11 +C10 : T 79.57c W 74.47c S 5.11c (+10.8 L +11.2) LCB 774.33c P 1.87% WF 9.86% PSV 3 N 3 -- C10 C11 C9 +C3 : T 83.44c W 77.44c S 6.00c (+11.6 L +11.6) LCB 280.00c P 1.81% WF 9.54% PSV 2 N 2 -- C3 C5 +D11 : T 82.10c W 76.79c S 5.31c (+10.9 L +11.2) LCB 280.00c P 1.59% WF 9.70% PSV 2 N 2 -- D11 C11 +E4 : T 85.00c W 79.35c S 5.65c (+11.1 L +11.7) LCB 280.00c P 1.19% WF 9.67% PSV 1 N 1 -- E4 +D5 : T 86.14c W 80.00c S 6.14c (+11.6 L +12.1) LCB 280.00c P 0.95% WF 9.55% PSV 1 N 1 -- D5 +E10 : T 84.08c W 78.66c S 5.42c (+11.0 L +11.5) LCB 280.00c P 0.82% WF 9.76% PSV 1 N 1 -- E10 +G10 : T 77.96c W 73.18c S 4.77c (+10.4 L +11.1) LCB 280.00c P 0.47% WF 10.37% PSV 1 N 1 -- G10 +Search next player PONDERING - an extra time, should preserve tree +HASH: 3CE07EBDEC180D0C4D1F494DACE35DEF + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 600 +Last search playouts: 98 +NN rows: 973 +NN batches: 973 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: C3 C11 C10 D11 E10 F12 J4 J3 H3 H4 J5 +Tree: +: T 66.88c W 63.81c S 3.07c ( +8.7 L +9.0) N 600 -- C3 C11 C10 D11 E10 F12 J4 +---White(^)--- +C3 : T 68.15c W 64.94c S 3.21c ( +8.8 L +9.1) LCB 66.11c P 53.85% WF 17.23% PSV 492 N 492 -- C3 C11 C10 D11 E10 F12 J4 J3 +E4 : T 62.71c W 59.51c S 3.19c ( +9.0 L +9.4) LCB 51.46c P 15.12% WF 14.68% PSV 51 N 52 -- E4 D5 F3 E2 C3 F2 G3 G2 +D5 : T 60.47c W 58.68c S 1.79c ( +7.4 L +7.6) LCB 52.23c P 14.40% WF 14.00% PSV 38 N 38 -- D5 E4 C3 E5 D6 E6 D7 L5 +D2 : T 48.41c W 48.20c S 0.21c ( +6.0 L +6.2) LCB -9.45c P 5.27% WF 11.88% PSV 6 N 8 -- D2 C5 E4 D5 F3 +C5 : T 56.86c W 55.28c S 1.58c ( +7.3 L +7.3) LCB 12.41c P 2.71% WF 14.01% PSV 5 N 6 -- C5 D2 C3 F4 +C2 : T 56.30c W 55.04c S 1.27c ( +7.0 L +7.2) LCB -280.00c P 1.40% WF 14.45% PSV 2 N 2 -- C2 C5 +E2 : T 49.48c W 49.09c S 0.39c ( +6.1 L +6.5) LCB -280.00c P 0.89% WF 13.76% PSV 1 N 1 -- E2 +Search next player - should preserve tree +HASH: 8651A60659E1A9036654CB5DB57F2E27 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . O O X . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 492 +Last search playouts: 0 +NN rows: 973 +NN batches: 973 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: C11 C10 D11 E10 F12 J4 J3 H3 H4 J5 +Tree: +: T 68.07c W 64.94c S 3.14c ( +8.8 L +9.1) N 492 -- C11 C10 D11 E10 F12 J4 J3 +---Black(v)--- +C11 : T 66.39c W 63.50c S 2.89c ( +8.6 L +8.8) LCB 69.80c P 22.55% WF 9.40% PSV 304 N 208 -- C11 C10 D11 E10 F12 J4 J3 H3 +E4 : T 67.75c W 64.53c S 3.22c ( +8.9 L +9.3) LCB 70.83c P 34.42% WF 8.99% PSV 194 N 194 -- E4 D6 C8 D8 D9 E9 C9 C10 +D5 : T 73.01c W 69.54c S 3.47c ( +9.1 L +9.0) LCB 80.56c P 13.38% WF 7.92% PSV 36 N 36 -- D5 E2 F3 F2 G3 G11 C11 D11 +F4 : T 70.65c W 67.66c S 3.00c ( +8.6 L +8.5) LCB 85.93c P 3.63% WF 8.48% PSV 13 N 14 -- F4 D5 C11 C10 D11 E10 +D11 : T 72.38c W 68.69c S 3.69c ( +9.3 L +9.6) LCB 104.14c P 3.09% WF 8.29% PSV 9 N 9 -- D11 C11 E11 E10 G11 +G11 : T 72.26c W 68.50c S 3.75c ( +9.4 L +9.7) LCB 88.93c P 2.34% WF 8.34% PSV 7 N 7 -- G11 L3 L4 K3 +G10 : T 77.03c W 72.53c S 4.51c (+10.1 L +10.1) LCB 170.08c P 2.21% WF 7.82% PSV 4 N 5 -- G10 L3 L4 K3 +H4 : T 73.86c W 70.54c S 3.32c ( +8.9 L +9.0) LCB 149.16c P 1.96% WF 8.23% PSV 4 N 4 -- H4 E4 C11 +F11 : T 74.98c W 70.66c S 4.33c (+10.0 L +9.9) LCB 267.77c P 1.92% WF 8.10% PSV 4 N 4 -- F11 L11 K11 L10 +E5 : T 76.39c W 72.29c S 4.10c ( +9.6 L +9.7) LCB 297.23c P 1.61% WF 7.94% PSV 3 N 4 -- E5 E2 F3 F2 +E10 : T 71.67c W 68.13c S 3.55c ( +9.2 L +9.3) LCB 625.79c P 1.15% WF 8.50% PSV 3 N 3 -- E10 D11 D9 +C10 : T 76.63c W 72.45c S 4.18c ( +9.8 L +10.1) LCB 328.87c P 1.38% WF 7.98% PSV 2 N 3 -- C10 C11 C9 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 196 +NN batches: 196 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 C10 D11 E10 +Tree: +: T 67.70c W 65.43c S 2.27c ( +8.8 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.28c W 65.90c S 2.39c ( +9.0 L +9.2) LCB 64.29c P 44.26% WF 9.53% PSV 116 N 116 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 66.96c W 64.89c S 2.07c ( +8.7 L +8.7) LCB 57.62c P 12.93% WF 9.23% PSV 27 N 27 -- D11 D4 D3 E3 C3 D10 +L10 : T 70.74c W 67.98c S 2.75c ( +9.3 L +9.3) LCB 58.36c P 2.59% WF 9.88% PSV 12 N 16 -- L10 L11 L9 M11 D10 D4 +C10 : T 64.65c W 62.93c S 1.72c ( +8.3 L +8.5) LCB 51.44c P 8.18% WF 8.89% PSV 12 N 12 -- C10 D10 D11 E11 C11 E3 +L4 : T 66.91c W 64.52c S 2.40c ( +9.0 L +8.9) LCB 50.43c P 4.55% WF 9.25% PSV 9 N 9 -- L4 L3 L5 K3 D10 D4 +K3 : T 66.52c W 64.39c S 2.13c ( +8.7 L +8.8) LCB 41.33c P 4.44% WF 9.20% PSV 8 N 8 -- K3 L3 J3 J4 H3 +L11 : T 62.89c W 61.87c S 1.02c ( +7.7 L +7.5) LCB -159.94c P 3.15% WF 8.79% PSV 4 N 4 -- L11 D10 L10 +K11 : T 64.65c W 63.00c S 1.65c ( +8.3 L +8.2) LCB -470.85c P 2.44% WF 9.03% PSV 3 N 3 -- K11 L11 J11 +L3 : T 62.71c W 61.08c S 1.63c ( +8.2 L +7.8) LCB -280.00c P 2.15% WF 8.86% PSV 2 N 2 -- L3 D10 +C11 : T 57.72c W 57.42c S 0.30c ( +7.0 L +7.2) LCB -280.00c P 1.25% WF 8.52% PSV 1 N 1 -- C11 +J10 : T 61.28c W 60.43c S 0.85c ( +7.5 L +6.8) LCB -280.00c P 1.14% WF 8.82% PSV 1 N 1 -- J10 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 416 +Last search playouts: 300 +NN rows: 493 +NN batches: 493 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 C10 D11 E10 F11 E11 +Tree: +: T 69.04c W 65.79c S 3.26c ( +9.0 L +9.2) N 416 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 67.04c W 64.18c S 2.86c ( +8.6 L +8.9) LCB 69.99c P 32.60% WF 7.22% PSV 269 N 269 -- D4 D3 E3 C3 E4 D6 C11 C10 +E3 : T 72.40c W 68.45c S 3.95c ( +9.7 L +9.9) LCB 77.93c P 19.07% WF 6.18% PSV 54 N 54 -- E3 L3 K3 L4 L5 M5 M6 L6 +D3 : T 70.07c W 66.61c S 3.45c ( +9.1 L +9.5) LCB 75.76c P 6.84% WF 6.58% PSV 27 N 28 -- D3 D4 E3 C3 H3 F4 C11 +E4 : T 74.71c W 70.14c S 4.57c (+10.3 L +10.4) LCB 84.14c P 11.23% WF 5.97% PSV 24 N 24 -- E4 L3 K3 L4 K5 M6 +C11 : T 73.43c W 69.44c S 3.99c ( +9.7 L +10.1) LCB 82.89c P 8.32% WF 6.16% PSV 21 N 21 -- C11 C10 D11 E10 F11 E11 E12 F12 +D11 : T 76.66c W 72.41c S 4.25c ( +9.9 L +10.3) LCB 600.65c P 1.97% WF 6.11% PSV 3 N 3 -- D11 C11 E11 +C10 : T 78.59c W 73.88c S 4.72c (+10.4 L +10.5) LCB 280.00c P 1.81% WF 6.03% PSV 2 N 2 -- C10 C11 +F3 : T 79.89c W 74.88c S 5.01c (+10.6 L +10.5) LCB 280.00c P 1.50% WF 5.94% PSV 2 N 2 -- F3 L3 +G4 : T 76.35c W 71.77c S 4.58c (+10.2 L +10.7) LCB 280.00c P 1.49% WF 6.19% PSV 2 N 2 -- G4 E4 +G10 : T 73.40c W 69.42c S 3.99c ( +9.6 L +10.2) LCB 280.00c P 1.04% WF 6.40% PSV 2 N 2 -- G10 E4 +F4 : T 78.39c W 73.50c S 4.89c (+10.5 L +10.3) LCB 280.00c P 1.19% WF 6.05% PSV 1 N 2 -- F4 L3 +E10 : T 73.28c W 69.44c S 3.84c ( +9.5 L +9.9) LCB 280.00c P 0.75% WF 6.41% PSV 1 N 2 -- E10 D11 +H4 : T 77.87c W 72.54c S 5.34c (+10.8 L +11.5) LCB 280.00c P 0.82% WF 6.18% PSV 1 N 1 -- H4 +F11 : T 78.57c W 73.56c S 5.01c (+10.6 L +11.5) LCB 280.00c P 0.76% WF 6.14% PSV 1 N 1 -- F11 +G11 : T 77.43c W 72.25c S 5.17c (+10.8 L +11.3) LCB 280.00c P 0.74% WF 6.21% PSV 1 N 1 -- G11 +H3 : T 77.17c W 71.60c S 5.57c (+11.0 L +11.8) LCB 280.00c P 0.63% WF 6.22% PSV 1 N 1 -- H3 +Search next player - should keep tree from ponder +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 400 +Last search playouts: 131 +NN rows: 621 +NN batches: 621 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F12 H4 D5 E2 +Tree: +: T 66.42c W 63.47c S 2.95c ( +8.5 L +8.7) N 400 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.78c W 64.61c S 3.17c ( +8.7 L +8.9) LCB 64.92c P 50.11% WF 16.41% PSV 302 N 302 -- D3 E3 C3 C11 C10 D11 E10 F12 +C3 : T 63.59c W 61.11c S 2.48c ( +8.1 L +8.1) LCB 58.61c P 23.55% WF 14.47% PSV 67 N 67 -- C3 D5 D3 F4 L10 L11 L9 M11 +D5 : T 58.56c W 56.78c S 1.78c ( +7.4 L +7.7) LCB 42.80c P 8.95% WF 13.44% PSV 15 N 15 -- D5 C3 C5 D3 F4 F3 +C5 : T 56.30c W 54.98c S 1.32c ( +6.9 L +7.2) LCB 29.79c P 7.28% WF 13.09% PSV 10 N 10 -- C5 D3 D5 F4 L3 K3 L4 L5 +K3 : T 55.29c W 54.30c S 0.98c ( +6.6 L +6.8) LCB -280.00c P 1.24% WF 13.73% PSV 1 N 2 -- K3 L3 +L4 : T 58.08c W 56.86c S 1.22c ( +6.9 L +6.8) LCB -280.00c P 0.80% WF 14.19% PSV 1 N 2 -- L4 L3 +L10 : T 60.04c W 58.87c S 1.17c ( +6.8 L +6.0) LCB -280.00c P 0.77% WF 14.68% PSV 1 N 1 -- L10 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 198 +NN batches: 198 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 +Tree: +: T 67.63c W 65.39c S 2.24c ( +8.8 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 68.86c W 66.37c S 2.49c ( +9.1 L +9.3) LCB 64.87c P 42.40% WF 9.72% PSV 117 N 117 -- D10 D4 D3 E3 C3 E4 D6 C11 +D11 : T 65.10c W 63.30c S 1.79c ( +8.4 L +8.6) LCB 55.91c P 19.28% WF 8.87% PSV 31 N 31 -- D11 E4 D6 C3 B3 D3 +C10 : T 65.00c W 63.18c S 1.81c ( +8.4 L +8.7) LCB 39.54c P 6.32% WF 8.97% PSV 10 N 10 -- C10 D4 D3 E3 +K3 : T 67.72c W 65.61c S 2.11c ( +8.7 L +8.7) LCB 41.58c P 3.28% WF 9.38% PSV 7 N 9 -- K3 L3 J3 J4 H3 +L3 : T 66.58c W 64.70c S 1.88c ( +8.5 L +8.2) LCB 23.95c P 3.48% WF 9.22% PSV 6 N 7 -- L3 D10 K3 J4 +L4 : T 66.41c W 64.12c S 2.29c ( +8.9 L +8.8) LCB 22.52c P 3.27% WF 9.20% PSV 6 N 6 -- L4 L3 L5 M3 D10 +L10 : T 68.42c W 66.14c S 2.28c ( +8.9 L +8.8) LCB 9.52c P 1.90% WF 9.47% PSV 4 N 6 -- L10 L11 L9 M11 D10 +L11 : T 63.02c W 61.80c S 1.22c ( +7.9 L +7.6) LCB -65.84c P 3.18% WF 8.79% PSV 4 N 5 -- L11 D10 L10 +K11 : T 67.67c W 65.65c S 2.03c ( +8.6 L +8.5) LCB -53.94c P 2.09% WF 9.37% PSV 4 N 5 -- K11 L11 J11 J10 H11 +J4 : T 62.25c W 60.99c S 1.26c ( +7.9 L +8.0) LCB -280.00c P 1.23% WF 8.82% PSV 1 N 2 -- J4 K3 +E10 : T 53.56c W 53.69c S -0.12c ( +6.6 L +7.0) LCB -280.00c P 1.32% WF 8.18% PSV 0 N 1 -- E10 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 417 +Last search playouts: 300 +NN rows: 496 +NN batches: 496 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 H4 L11 L10 K11 J10 J11 +Tree: +: T 69.20c W 65.98c S 3.22c ( +9.1 L +9.3) N 417 -- D4 D3 E3 C3 E4 D6 H4 +---Black(v)--- +D4 : T 67.24c W 64.46c S 2.78c ( +8.6 L +8.9) LCB 70.43c P 29.27% WF 8.09% PSV 231 N 231 -- D4 D3 E3 C3 E4 D6 H4 L11 +E3 : T 70.86c W 67.22c S 3.64c ( +9.5 L +9.6) LCB 76.03c P 20.02% WF 7.24% PSV 71 N 72 -- E3 L3 D5 C5 D6 K3 +E4 : T 73.21c W 68.95c S 4.27c (+10.1 L +10.2) LCB 81.16c P 15.78% WF 6.87% PSV 41 N 42 -- E4 L3 L4 K3 H3 J3 J4 +C11 : T 69.84c W 66.44c S 3.40c ( +9.2 L +9.7) LCB 79.80c P 6.01% WF 7.46% PSV 25 N 25 -- C11 C10 D11 E10 F11 E11 E12 +D3 : T 71.30c W 67.79c S 3.51c ( +9.3 L +9.7) LCB 78.13c P 7.26% WF 7.25% PSV 24 N 24 -- D3 D4 E3 C3 E4 E5 F5 +D11 : T 72.67c W 69.15c S 3.52c ( +9.3 L +9.8) LCB 116.72c P 1.82% WF 7.20% PSV 5 N 5 -- D11 C11 E11 E10 F11 +G10 : T 73.58c W 69.30c S 4.28c (+10.0 L +10.7) LCB 419.71c P 1.24% WF 7.16% PSV 3 N 3 -- G10 E4 G3 +C10 : T 78.94c W 74.32c S 4.62c (+10.4 L +10.5) LCB 280.00c P 1.67% WF 6.77% PSV 2 N 2 -- C10 C11 +F4 : T 79.49c W 74.53c S 4.96c (+10.7 L +10.4) LCB 280.00c P 1.39% WF 6.73% PSV 2 N 2 -- F4 L3 +G4 : T 75.06c W 70.49c S 4.57c (+10.2 L +10.7) LCB 280.00c P 1.25% WF 7.08% PSV 2 N 2 -- G4 E4 +F3 : T 76.67c W 72.24c S 4.43c (+10.2 L +10.1) LCB 280.00c P 1.21% WF 6.95% PSV 2 N 2 -- F3 L3 +F11 : T 75.97c W 71.48c S 4.48c (+10.1 L +10.5) LCB 280.00c P 1.19% WF 7.01% PSV 2 N 2 -- F11 E4 +G11 : T 73.76c W 69.57c S 4.19c ( +9.9 L +10.7) LCB 280.00c P 0.93% WF 7.19% PSV 2 N 2 -- G11 E4 +H4 : T 76.08c W 71.75c S 4.33c (+10.0 L +10.6) LCB 280.00c P 0.81% WF 7.00% PSV 1 N 2 -- H4 E3 +Search next player PONDERING an extra time - should keep prior tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 531 +Last search playouts: 300 +NN rows: 785 +NN batches: 785 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F12 H3 D5 E2 +Tree: +: T 67.79c W 64.62c S 3.17c ( +8.7 L +8.9) N 531 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 68.78c W 65.45c S 3.33c ( +8.9 L +9.1) LCB 66.27c P 53.82% WF 11.31% PSV 396 N 396 -- D3 E3 C3 C11 C10 D11 E10 F12 +C3 : T 67.13c W 64.12c S 3.01c ( +8.6 L +8.6) LCB 62.87c P 18.88% WF 10.66% PSV 96 N 96 -- C3 D5 D3 F4 L4 L3 L5 M3 +D5 : T 57.10c W 55.42c S 1.69c ( +7.3 L +7.6) LCB 42.03c P 13.50% WF 8.57% PSV 24 N 25 -- D5 C3 C5 D3 F5 G4 L3 L4 +C5 : T 54.40c W 53.31c S 1.08c ( +6.7 L +6.9) LCB -19.30c P 3.16% WF 9.02% PSV 4 N 4 -- C5 D3 D5 F4 +L3 : T 61.34c W 59.39c S 1.95c ( +7.5 L +7.2) LCB -280.00c P 0.83% WF 10.10% PSV 2 N 2 -- L3 C3 +L4 : T 65.34c W 62.80c S 2.53c ( +8.1 L +7.8) LCB -280.00c P 0.77% WF 10.56% PSV 2 N 2 -- L4 L3 +K3 : T 60.46c W 58.80c S 1.65c ( +7.3 L +7.2) LCB -280.00c P 0.70% WF 10.00% PSV 1 N 2 -- K3 L3 +L10 : T 57.17c W 56.38c S 0.79c ( +6.5 L +5.7) LCB -280.00c P 1.02% WF 9.81% PSV 1 N 1 -- L10 +K11 : T 59.90c W 58.71c S 1.19c ( +6.8 L +5.9) LCB -280.00c P 0.84% WF 10.07% PSV 1 N 1 -- K11 +L11 : T 58.24c W 56.69c S 1.55c ( +7.2 L +6.5) LCB -280.00c P 0.72% WF 9.91% PSV 1 N 1 -- L11 +Search next player - now should lose the tree and PDA, because the player it is for is different +HASH: 780A98D49418E944AFC3FAAA0D9B2919 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . O . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 985 +NN batches: 985 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: E3 C3 E4 D6 C8 D8 D9 E9 C9 +Tree: +: T -62.39c W -58.89c S -3.50c ( -8.5 L -8.8) N 200 -- E3 C3 E4 D6 C8 D8 D9 +---Black(v)--- +E3 : T -65.15c W -61.18c S -3.96c ( -8.9 L -9.2) LCB -60.43c P 27.86% WF 9.88% PSV 170 N 104 -- E3 C3 E4 D6 C8 D8 D9 E9 +C5 : T -60.54c W -57.30c S -3.23c ( -8.2 L -8.6) LCB -54.80c P 36.67% WF 8.73% PSV 62 N 62 -- C5 C3 F11 E4 D5 E5 +C3 : T -62.91c W -59.34c S -3.57c ( -8.6 L -8.6) LCB -38.41c P 4.30% WF 9.22% PSV 10 N 11 -- C3 C2 B3 B4 D11 +D11 : T -55.25c W -53.09c S -2.17c ( -7.1 L -7.3) LCB 39.09c P 3.98% WF 8.23% PSV 4 N 6 -- D11 C11 E11 E10 F11 +C11 : T -61.00c W -58.06c S -2.94c ( -7.9 L -7.9) LCB 25.05c P 2.70% WF 8.98% PSV 4 N 4 -- C11 C10 D11 E10 +C10 : T -48.30c W -47.28c S -1.02c ( -6.1 L -6.2) LCB 1633.79c P 4.58% WF 7.63% PSV 3 N 3 -- C10 C11 C9 +F11 : T -55.19c W -52.68c S -2.51c ( -7.5 L -8.0) LCB 346.00c P 2.41% WF 8.31% PSV 2 N 4 -- F11 E3 C5 +D5 : T -34.76c W -36.03c S 1.27c ( -4.0 L -4.3) LCB 280.00c P 3.17% WF 6.92% PSV 1 N 1 -- D5 +F10 : T -50.24c W -48.93c S -1.30c ( -6.4 L -6.7) LCB 280.00c P 1.59% WF 8.14% PSV 1 N 1 -- F10 +E10 : T -59.30c W -57.36c S -1.93c ( -6.9 L -6.8) LCB 280.00c P 1.26% WF 8.88% PSV 1 N 1 -- E10 +E4 : T -43.09c W -43.04c S -0.05c ( -5.2 L -5.4) LCB 280.00c P 1.31% WF 7.57% PSV 0 N 1 -- E4 +G11 : T -41.98c W -41.36c S -0.63c ( -5.7 L -6.3) LCB 280.00c P 1.11% WF 7.48% PSV 0 N 1 -- G11 +Basic search with PDA 1.5, no player +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 193 +NN batches: 193 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 E4 D6 H4 L10 L11 +Tree: +: T 68.22c W 65.90c S 2.31c ( +8.9 L +9.0) N 200 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T 69.14c W 66.64c S 2.50c ( +9.1 L +9.3) LCB 65.62c P 43.54% WF 10.53% PSV 120 N 120 -- D10 D4 D3 E3 C3 E4 D6 H4 +D11 : T 66.80c W 64.72c S 2.08c ( +8.7 L +8.7) LCB 58.28c P 15.73% WF 9.94% PSV 29 N 29 -- D11 D4 D3 E3 C3 E4 D6 +C10 : T 64.35c W 62.73c S 1.62c ( +8.2 L +8.3) LCB 49.97c P 10.30% WF 9.55% PSV 14 N 14 -- C10 D10 D11 E11 C11 D4 D3 +K11 : T 69.44c W 66.97c S 2.47c ( +9.1 L +9.0) LCB 27.05c P 2.73% WF 10.43% PSV 8 N 8 -- K11 L11 J11 J10 H11 +K3 : T 67.80c W 65.69c S 2.11c ( +8.7 L +8.8) LCB 41.45c P 3.56% WF 10.17% PSV 7 N 7 -- K3 L3 J3 J4 H3 +L11 : T 68.36c W 66.05c S 2.31c ( +8.9 L +8.5) LCB 32.98c P 3.12% WF 10.26% PSV 7 N 7 -- L11 D4 D3 +L3 : T 63.90c W 62.49c S 1.41c ( +8.0 L +7.9) LCB 4.72c P 3.18% WF 9.64% PSV 4 N 5 -- L3 D10 L4 +L4 : T 66.78c W 64.73c S 2.05c ( +8.7 L +8.5) LCB -39.35c P 2.31% WF 10.05% PSV 4 N 4 -- L4 L3 L5 M3 +L10 : T 69.27c W 67.08c S 2.19c ( +8.8 L +8.9) LCB -121.54c P 1.67% WF 10.37% PSV 4 N 4 -- L10 L11 L9 +C11 : T 55.41c W 55.57c S -0.16c ( +6.6 L +6.9) LCB -280.00c P 1.07% WF 9.06% PSV 0 N 1 -- C11 +Search next player PONDERING - should keep prior tree and PDA +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 420 +Last search playouts: 300 +NN rows: 485 +NN batches: 485 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D4 D3 E3 C3 E4 D6 C11 C10 D11 E11 E12 +Tree: +: T 69.87c W 66.54c S 3.33c ( +9.2 L +9.4) N 420 -- D4 D3 E3 C3 E4 D6 C11 +---Black(v)--- +D4 : T 67.85c W 64.96c S 2.89c ( +8.7 L +9.0) LCB 71.41c P 20.98% WF 7.06% PSV 245 N 169 -- D4 D3 E3 C3 E4 D6 C11 C10 +E3 : T 69.74c W 66.34c S 3.40c ( +9.2 L +9.4) LCB 73.57c P 25.31% WF 6.65% PSV 124 N 125 -- E3 L3 D5 C5 D6 K3 C6 +D3 : T 71.30c W 67.77c S 3.53c ( +9.3 L +9.6) LCB 77.43c P 10.76% WF 6.41% PSV 39 N 41 -- D3 D4 E3 C3 E4 E5 F5 +C11 : T 72.31c W 68.58c S 3.73c ( +9.6 L +9.9) LCB 80.44c P 10.83% WF 6.27% PSV 34 N 34 -- C11 C10 D11 E10 F11 E11 E12 F12 +E4 : T 73.35c W 69.12c S 4.23c (+10.1 L +10.2) LCB 82.63c P 9.58% WF 6.15% PSV 26 N 27 -- E4 L3 L4 K3 J4 H2 C11 +G4 : T 73.89c W 70.02c S 3.87c ( +9.6 L +10.3) LCB 106.21c P 1.96% WF 6.26% PSV 5 N 5 -- G4 E4 C11 C10 D11 +G10 : T 73.68c W 69.73c S 3.96c ( +9.7 L +10.5) LCB 388.93c P 1.16% WF 6.32% PSV 3 N 3 -- G10 E4 G3 +F3 : T 80.10c W 75.13c S 4.97c (+10.7 L +10.5) LCB 280.00c P 1.79% WF 5.90% PSV 2 N 2 -- F3 L3 +D11 : T 78.91c W 74.48c S 4.43c (+10.2 L +10.5) LCB 280.00c P 1.54% WF 5.98% PSV 2 N 2 -- D11 C11 +C10 : T 80.56c W 75.74c S 4.82c (+10.6 L +10.8) LCB 280.00c P 1.38% WF 5.86% PSV 2 N 2 -- C10 C11 +G11 : T 75.80c W 71.33c S 4.47c (+10.2 L +10.9) LCB 280.00c P 1.26% WF 6.20% PSV 2 N 2 -- G11 E4 +F4 : T 75.58c W 71.11c S 4.47c (+10.2 L +10.0) LCB 280.00c P 1.11% WF 6.21% PSV 2 N 2 -- F4 L3 +F11 : T 74.68c W 70.59c S 4.09c ( +9.8 L +10.5) LCB 280.00c P 1.01% WF 6.28% PSV 2 N 2 -- F11 E4 +G3 : T 78.34c W 73.08c S 5.26c (+10.9 L +11.4) LCB 280.00c P 0.92% WF 6.11% PSV 1 N 1 -- G3 +H4 : T 77.79c W 72.54c S 5.25c (+10.8 L +11.5) LCB 280.00c P 0.92% WF 6.15% PSV 1 N 1 -- H4 +H3 : T 77.05c W 71.46c S 5.59c (+11.1 L +11.9) LCB 280.00c P 0.71% WF 6.19% PSV 1 N 1 -- H3 +Search next player PONDERING - should still keep prior tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 469 +Last search playouts: 300 +NN rows: 775 +NN batches: 775 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 H3 F10 F9 +Tree: +: T 66.56c W 63.62c S 2.94c ( +8.6 L +8.8) N 469 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.59c W 64.47c S 3.12c ( +8.8 L +9.0) LCB 64.85c P 55.02% WF 11.41% PSV 370 N 370 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 65.76c W 63.04c S 2.72c ( +8.4 L +8.3) LCB 59.82c P 14.11% WF 10.73% PSV 63 N 63 -- C3 D5 D3 F4 L10 L11 L9 M11 +D5 : T 53.45c W 52.40c S 1.05c ( +6.8 L +7.1) LCB 31.25c P 11.30% WF 8.43% PSV 15 N 16 -- D5 C3 C5 D3 F5 G4 L3 +C5 : T 55.22c W 54.21c S 1.01c ( +6.7 L +6.9) LCB 18.34c P 5.51% WF 9.09% PSV 8 N 8 -- C5 D3 D5 F4 L3 K3 L4 +L10 : T 61.73c W 59.66c S 2.07c ( +7.7 L +7.8) LCB -106.78c P 1.59% WF 10.27% PSV 4 N 4 -- L10 L11 L9 +K3 : T 62.81c W 60.77c S 2.04c ( +7.7 L +7.5) LCB -280.00c P 0.98% WF 10.50% PSV 2 N 2 -- K3 L3 +L4 : T 62.72c W 60.78c S 1.94c ( +7.6 L +7.4) LCB -280.00c P 0.94% WF 10.49% PSV 2 N 2 -- L4 L3 +K11 : T 52.24c W 52.12c S 0.13c ( +5.9 L +5.6) LCB -280.00c P 1.13% WF 9.54% PSV 1 N 1 -- K11 +L3 : T 57.78c W 57.08c S 0.70c ( +6.5 L +5.4) LCB -280.00c P 1.06% WF 10.08% PSV 1 N 1 -- L3 +L11 : T 51.31c W 51.21c S 0.10c ( +5.9 L +5.4) LCB -280.00c P 0.98% WF 9.45% PSV 1 N 1 -- L11 +Without making a move - convert ponder to regular search, should still keep tree and PDA +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 469 +Last search playouts: 0 +NN rows: 775 +NN batches: 775 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 F11 H3 F10 F9 +Tree: +: T 66.68c W 63.62c S 3.06c ( +8.6 L +8.8) N 469 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 67.70c W 64.47c S 3.24c ( +8.8 L +9.0) LCB 64.97c P 55.02% WF 11.41% PSV 370 N 370 -- D3 E3 C3 C11 C10 D11 E10 F11 +C3 : T 65.88c W 63.04c S 2.84c ( +8.4 L +8.3) LCB 59.94c P 14.11% WF 10.73% PSV 63 N 63 -- C3 D5 D3 F4 L10 L11 L9 M11 +D5 : T 53.57c W 52.40c S 1.17c ( +6.8 L +7.1) LCB 31.36c P 11.30% WF 8.43% PSV 15 N 16 -- D5 C3 C5 D3 F5 G4 L3 +C5 : T 55.34c W 54.21c S 1.13c ( +6.7 L +6.9) LCB 18.46c P 5.51% WF 9.09% PSV 8 N 8 -- C5 D3 D5 F4 L3 K3 L4 +L10 : T 61.85c W 59.66c S 2.18c ( +7.7 L +7.8) LCB -106.70c P 1.59% WF 10.27% PSV 4 N 4 -- L10 L11 L9 +K3 : T 62.92c W 60.77c S 2.15c ( +7.7 L +7.5) LCB -280.00c P 0.98% WF 10.50% PSV 2 N 2 -- K3 L3 +L4 : T 62.84c W 60.78c S 2.06c ( +7.6 L +7.4) LCB -280.00c P 0.94% WF 10.49% PSV 2 N 2 -- L4 L3 +K11 : T 52.36c W 52.12c S 0.24c ( +5.9 L +5.6) LCB -280.00c P 1.13% WF 9.54% PSV 1 N 1 -- K11 +L3 : T 57.90c W 57.08c S 0.82c ( +6.5 L +5.4) LCB -280.00c P 1.06% WF 10.08% PSV 1 N 1 -- L3 +L11 : T 51.43c W 51.21c S 0.22c ( +5.9 L +5.4) LCB -280.00c P 0.98% WF 9.45% PSV 1 N 1 -- L11 +Set position to original, search PONDERING +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 300 +Last search playouts: 300 +NN rows: 286 +NN batches: 286 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 +Tree: +: T -64.38c W -59.79c S -4.60c ( -8.6 L -8.9) N 300 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -63.60c W -59.09c S -4.52c ( -8.5 L -8.9) LCB -66.79c P 53.40% WF 12.43% PSV 210 N 210 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -64.44c W -59.99c S -4.46c ( -8.4 L -8.8) LCB -69.14c P 12.86% WF 12.08% PSV 43 N 44 -- D11 D10 C10 E11 C11 D4 D3 E3 +C10 : T -66.39c W -61.60c S -4.78c ( -8.7 L -9.0) LCB -72.34c P 13.67% WF 11.56% PSV 34 N 35 -- C10 D4 D3 E3 C3 D10 D11 E11 +L11 : T -78.00c W -71.18c S -6.82c (-10.9 L -11.1) LCB -282.82c P 3.78% WF 10.16% PSV 3 N 3 -- L11 D4 D3 +L3 : T -77.06c W -70.56c S -6.50c (-10.6 L -10.7) LCB -280.00c P 2.41% WF 10.45% PSV 2 N 2 -- L3 D4 +C11 : T -69.38c W -63.85c S -5.53c ( -9.4 L -9.8) LCB -280.00c P 1.59% WF 11.44% PSV 2 N 2 -- C11 D4 +E4 : T -78.78c W -70.83c S -7.95c (-11.6 L -12.0) LCB -280.00c P 1.47% WF 10.53% PSV 1 N 1 -- E4 +E3 : T -78.50c W -70.52c S -7.98c (-11.6 L -12.3) LCB -280.00c P 0.86% WF 10.56% PSV 0 N 1 -- E3 +K3 : T -76.14c W -69.36c S -6.78c (-10.8 L -11.0) LCB -280.00c P 0.85% WF 10.81% PSV 0 N 1 -- K3 +Without making a move, convert to regular search, should not keep tree +and should not benefit from cache, since search would guess the opponent as 'our' side +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 200 +Last search playouts: 200 +NN rows: 483 +NN batches: 483 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D10 D4 D3 E3 C3 C11 C10 D11 E10 F11 E11 +Tree: +: T 68.55c W 65.97c S 2.58c ( +9.0 L +9.2) N 200 -- D10 D4 D3 E3 C3 C11 C10 +---White(^)--- +D10 : T 69.14c W 66.42c S 2.72c ( +9.1 L +9.4) LCB 65.46c P 47.61% WF 11.52% PSV 123 N 123 -- D10 D4 D3 E3 C3 C11 C10 D11 +D11 : T 66.41c W 64.25c S 2.16c ( +8.6 L +8.6) LCB 59.03c P 17.75% WF 10.80% PSV 30 N 30 -- D11 D4 D3 E3 C3 D10 C10 +L10 : T 71.75c W 68.70c S 3.05c ( +9.4 L +9.5) LCB 58.72c P 3.28% WF 11.95% PSV 15 N 15 -- L10 L11 L9 M11 D10 D4 +C10 : T 65.03c W 63.08c S 1.95c ( +8.4 L +8.6) LCB 48.78c P 7.10% WF 10.68% PSV 10 N 10 -- C10 D4 D3 E3 C3 +K11 : T 68.49c W 66.17c S 2.32c ( +8.7 L +8.8) LCB 1.78c P 2.51% WF 11.30% PSV 5 N 6 -- K11 L11 J11 J10 H11 +L3 : T 66.71c W 64.34c S 2.37c ( +8.8 L +8.6) LCB 10.59c P 2.95% WF 11.03% PSV 5 N 5 -- L3 D10 L4 +L4 : T 69.01c W 66.35c S 2.66c ( +9.1 L +9.0) LCB -46.26c P 1.58% WF 11.38% PSV 4 N 5 -- L4 L3 L5 M3 D10 +L11 : T 63.80c W 62.32c S 1.48c ( +7.9 L +7.6) LCB -717.17c P 1.60% WF 10.67% PSV 2 N 3 -- L11 D10 K11 +K3 : T 63.26c W 61.76c S 1.51c ( +8.0 L +8.1) LCB -280.00c P 1.91% WF 10.67% PSV 2 N 2 -- K3 L3 +But should be fine thereafter. Make two moves and continue +HASH: CC18578D1DC6086B2B457601206062C1 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O X . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 269 +Last search playouts: 200 +NN rows: 681 +NN batches: 681 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D3 E3 C3 C11 C10 D11 E10 E11 F10 F11 G10 E4 D6 +Tree: +: T 67.45c W 64.45c S 2.99c ( +8.7 L +8.9) N 269 -- D3 E3 C3 C11 C10 D11 E10 +---White(^)--- +D3 : T 68.47c W 65.31c S 3.16c ( +8.8 L +9.1) LCB 65.11c P 59.82% WF 16.09% PSV 218 N 218 -- D3 E3 C3 C11 C10 D11 E10 E11 +C3 : T 65.72c W 63.05c S 2.67c ( +8.3 L +8.3) LCB 56.09c P 12.30% WF 14.97% PSV 28 N 28 -- C3 D5 D3 F4 G11 E3 C6 C11 +D5 : T 59.30c W 57.38c S 1.92c ( +7.6 L +8.0) LCB 34.74c P 11.64% WF 13.34% PSV 14 N 14 -- D5 C3 C5 D3 F4 E5 E4 +C5 : T 50.96c W 50.60c S 0.36c ( +6.2 L +6.5) LCB -341.34c P 4.49% WF 12.53% PSV 3 N 3 -- C5 D3 D5 +L4 : T 57.97c W 56.86c S 1.11c ( +6.9 L +6.8) LCB -280.00c P 1.49% WF 13.94% PSV 1 N 2 -- L4 L3 +K3 : T 60.09c W 58.52c S 1.57c ( +7.3 L +7.1) LCB -280.00c P 0.96% WF 14.29% PSV 1 N 2 -- K3 L3 +L10 : T 62.80c W 61.43c S 1.36c ( +7.1 L +6.4) LCB -280.00c P 0.96% WF 14.85% PSV 1 N 1 -- L10 +Set position to original, search PONDERING +HASH: E09E17A6D6CAEF7B789E5ED56B8BA960 + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . . . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 300 +Last search playouts: 300 +NN rows: 284 +NN batches: 284 +NN avg batch size: 1 +PlayoutDoublingAdvantage: -1.5 +PV: D10 D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 C10 +Tree: +: T -63.72c W -59.32c S -4.40c ( -8.5 L -8.8) N 300 -- D10 D4 D3 E3 C3 E4 D6 +---White(^)--- +D10 : T -63.01c W -58.70c S -4.31c ( -8.4 L -8.7) LCB -66.21c P 56.26% WF 13.79% PSV 217 N 217 -- D10 D4 D3 E3 C3 E4 D6 C8 +D11 : T -64.38c W -59.94c S -4.44c ( -8.5 L -8.9) LCB -70.37c P 13.31% WF 13.25% PSV 40 N 41 -- D11 D4 D3 C5 C3 D10 C10 +C10 : T -65.60c W -60.99c S -4.61c ( -8.6 L -9.0) LCB -71.62c P 13.12% WF 12.91% PSV 33 N 33 -- C10 D10 D11 E11 C11 D4 D3 E3 +L3 : T -78.81c W -72.01c S -6.80c (-11.0 L -10.8) LCB -280.00c P 2.61% WF 11.30% PSV 2 N 2 -- L3 D4 +L11 : T -75.64c W -69.45c S -6.18c (-10.3 L -10.3) LCB -280.00c P 2.45% WF 11.74% PSV 2 N 2 -- L11 D4 +C11 : T -67.54c W -62.39c S -5.15c ( -9.2 L -9.4) LCB -280.00c P 1.48% WF 12.89% PSV 2 N 2 -- C11 D4 +K11 : T -73.44c W -67.15c S -6.28c (-10.4 L -10.9) LCB -280.00c P 0.94% WF 12.27% PSV 1 N 1 -- K11 +E4 : T -77.04c W -69.29c S -7.75c (-11.5 L -12.2) LCB -280.00c P 0.92% WF 11.84% PSV 0 N 1 -- E4 +Play that move and real search on the next position, should keep tree because correct guess of side +HASH: A101C4EBE6DF005860BDA8DAAE850A7A + A B C D E F G H J K L M N +13 . . . . . . . . . . . . . +12 . . . . . . . . . . . . . +11 . . . . . . . . . . . . . +10 . . . O . . . . . X . . . + 9 . . . . . . . . . . . . . + 8 . . . . . . . . . . . . . + 7 . . . . . . . . . . . . . + 6 . . . . . . . . . . . . . + 5 . . . . . . . . . . . . . + 4 . . O . . . . . . X . . . + 3 . . . . . . . . . . . . . + 2 . . . . . . . . . . . . . + 1 . . . . . . . . . . . . . + + +Root visits: 400 +Last search playouts: 183 +NN rows: 462 +NN batches: 462 +NN avg batch size: 1 +PlayoutDoublingAdvantage: 1.5 +PV: D4 D3 E3 C3 E4 D6 C8 D8 D9 E9 C9 C10 E10 +Tree: +: T -61.85c W -58.80c S -3.04c ( -8.5 L -8.8) N 400 -- D4 D3 E3 C3 E4 D6 C8 +---Black(v)--- +D4 : T -63.63c W -60.30c S -3.32c ( -8.7 L -9.0) LCB -60.82c P 41.66% WF 7.99% PSV 288 N 288 -- D4 D3 E3 C3 E4 D6 C8 D8 +E3 : T -62.17c W -59.11c S -3.06c ( -8.5 L -8.9) LCB -55.89c P 8.25% WF 7.54% PSV 39 N 39 -- E3 L3 D5 C5 D6 L4 +E4 : T -52.86c W -51.14c S -1.71c ( -7.2 L -7.6) LCB -43.10c P 18.32% WF 6.09% PSV 29 N 30 -- E4 L3 L4 K3 J3 J2 H2 +C10 : T -55.62c W -53.62c S -1.99c ( -7.4 L -7.6) LCB -32.01c P 6.97% WF 6.69% PSV 13 N 13 -- C10 C11 C9 D11 D4 C5 +D11 : T -57.38c W -55.19c S -2.19c ( -7.6 L -7.7) LCB -18.31c P 3.28% WF 6.97% PSV 7 N 8 -- D11 C11 E11 C10 D4 +D3 : T -57.72c W -55.22c S -2.50c ( -7.9 L -8.2) LCB -35.74c P 3.19% WF 7.02% PSV 7 N 7 -- D3 D4 E3 E4 F4 C3 +C11 : T -56.08c W -54.09c S -1.99c ( -7.5 L -7.5) LCB 22.06c P 1.99% WF 6.87% PSV 4 N 6 -- C11 C10 D11 E10 D4 +E10 : T -53.32c W -52.24c S -1.08c ( -6.6 L -6.7) LCB 280.00c P 1.00% WF 6.90% PSV 1 N 1 -- E10 +C8 : T -46.55c W -45.84c S -0.71c ( -6.2 L -6.5) LCB 280.00c P 0.91% WF 6.45% PSV 1 N 1 -- C8 +F11 : T -51.30c W -49.90c S -1.40c ( -6.9 L -7.3) LCB 280.00c P 0.90% WF 6.76% PSV 1 N 1 -- F11 +D5 : T -39.38c W -40.45c S 1.06c ( -4.6 L -4.8) LCB 280.00c P 1.05% WF 5.98% PSV 0 N 1 -- D5 +F10 : T -46.05c W -45.12c S -0.93c ( -6.5 L -6.8) LCB 280.00c P 0.85% WF 6.42% PSV 0 N 1 -- F10 +G11 : T -46.13c W -45.48c S -0.65c ( -6.2 L -6.8) LCB 280.00c P 0.78% WF 6.42% PSV 0 N 1 -- G11 +G10 : T -41.11c W -41.03c S -0.07c ( -5.6 L -6.5) LCB 280.00c P 0.76% WF 6.10% PSV 0 N 1 -- G10 +F4 : T -36.51c W -37.21c S 0.70c ( -4.9 L -5.7) LCB 280.00c P 0.69% WF 5.80% PSV 0 N 1 -- F4 diff --git a/cpp/tests/results/runSelfplayInitTests.txt b/cpp/tests/results/runSelfplayInitTests.txt index 6e24b0de5..1f167f6b4 100644 --- a/cpp/tests/results/runSelfplayInitTests.txt +++ b/cpp/tests/results/runSelfplayInitTests.txt @@ -7690,6 +7690,590 @@ whiteValueTargetsByTurn 30 1 0 0 7.5 7.5 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +==================================================================================================== +==================================================================================================== +==================================================================================================== +seedBase: test hint! +: MoveNum: 0 HASH: 1FF90C1B1F2FA28BCB79C15FC361B0A2 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . . O O . . + 3 . . . . . @ O X X . . + 2 . . . . . O X . . . . + 1 . . . . . . . . . . . + + +Root visits: 400 +Policy surprise 0.0982152 +Raw WL 0.0726679 +PV: F3 G4 E2 H2 F1 J2 D5 D3 E4 C5 C6 C4 +Tree: +: T 9.15c W 7.78c S 1.36c ( +2.4 L +2.4) N 400 -- F3 G4 E2 H2 F1 J2 D5 +---Black(v)--- +F3 : T -5.77c W -5.58c S -0.19c ( -0.3 L -0.3) LCB -2.22c P 86.25% WF 43.53% PSV 220 N 220 -- F3 G4 E2 H2 F1 J2 D5 D3 +G4 : T 20.55c W 18.17c S 2.38c ( +4.1 L +4.1) LCB 44.40c P 6.01% WF 27.98% PSV 3 N 3 -- G4 F3 K4 +K4 : T 23.17c W 20.42c S 2.74c ( +4.8 L +4.8) LCB 260.00c P 3.55% WF 26.35% PSV 1 N 1 -- K4 +A1 : T 92.86c W 82.78c S 10.08c (+17.4 L +17.4) LCB 94.52c P 2.00% WF 2.13% PSV 0 N 175 -- A1 G4 C4 D8 D9 E8 E9 F8 + +: MoveNum: 1 HASH: 8149B856D14D18AB3F4C9F5986465BD0 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . @ O O . . + 3 . . . . . X O X X . . + 2 . . . . . O X . . . . + 1 . . . . . . . . . . . + + +Root visits: 100 +Policy surprise 0.00809197 +Raw WL 0.0526078 +PV: G4 E2 H2 F1 J2 D5 D3 E4 C4 C5 B5 +Tree: +: T -5.97c W -5.77c S -0.20c ( -0.3 L -0.3) N 100 -- G4 E2 H2 F1 J2 D5 D3 +---White(^)--- +G4 : T -6.09c W -5.88c S -0.21c ( -0.3 L -0.3) LCB -10.84c P 99.19% WF 100.00% PSV 99 N 99 -- G4 E2 H2 F1 J2 D5 D3 E4 + +: MoveNum: 2 HASH: 6AD7C73E65E8378A8671427E5218618A + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . O O O . . + 3 . . . . . X O X X . . + 2 . . . . @ O X . . . . + 1 . . . . . . . . . . . + + +Root visits: 100 +Policy surprise 0.011541 +Raw WL -0.0810401 +PV: E2 H2 F1 J2 D5 D3 E4 C4 C5 B5 +Tree: +: T -6.04c W -5.84c S -0.20c ( -0.3 L -0.3) N 100 -- E2 H2 F1 J2 D5 D3 E4 +---Black(v)--- +E2 : T -6.02c W -5.82c S -0.20c ( -0.3 L -0.3) LCB -1.26c P 98.85% WF 100.00% PSV 99 N 99 -- E2 H2 F1 J2 D5 D3 E4 C4 + +: MoveNum: 3 HASH: 3BF4F0AD3EDD86F65AB1067C0BD1EBA4 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . O2O O . . + 3 . . . . . X1O X X . . + 2 . . . . X3O X @ . . . + 1 . . . . . . . . . . . + + +Root visits: 100 +Policy surprise 0.115936 +Raw WL 0.107647 +PV: H2 F1 J2 D5 D3 E4 C4 C5 B5 +Tree: +: T -6.00c W -5.80c S -0.20c ( -0.3 L -0.3) N 100 -- H2 F1 J2 D5 D3 E4 C4 +---White(^)--- +H2 : T -6.19c W -5.97c S -0.22c ( -0.4 L -0.4) LCB -10.88c P 89.05% WF 100.00% PSV 99 N 99 -- H2 F1 J2 D5 D3 E4 C4 C5 + +: MoveNum: 4 HASH: 250C1AF5587C74137CA1B607327C1146 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . O1O O . . + 3 . . . . . X O X X . . + 2 . . . . X2O X O3. . . + 1 . . . . . @ . . . . . + + +Root visits: 50 +Policy surprise 0.0104535 +Raw WL -0.115523 +PV: F1 J2 D5 D3 E4 C5 C6 +Tree: +: T -6.76c W -6.46c S -0.30c ( -0.5 L -0.5) N 50 -- F1 J2 D5 D3 E4 C5 C6 +---Black(v)--- +F1 : T -6.65c W -6.36c S -0.29c ( -0.5 L -0.5) LCB 0.56c P 98.96% WF 100.00% PSV 49 N 49 -- F1 J2 D5 D3 E4 C5 C6 + +: MoveNum: 5 HASH: A742C80F0C845DC176DF8B421AC97D97 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . O O O . . + 3 . . . . . X O X X . . + 2 . . . . X1. X O2@ . . + 1 . . . . . X3. . . . . + + +Root visits: 100 +Policy surprise 0.0367691 +Raw WL 0.0740316 +PV: J2 D5 D3 E4 C4 C5 B5 +Tree: +: T -5.96c W -5.76c S -0.20c ( -0.3 L -0.3) N 100 -- J2 D5 D3 E4 C4 C5 B5 +---White(^)--- +J2 : T -6.10c W -5.89c S -0.21c ( -0.3 L -0.3) LCB -10.77c P 96.39% WF 100.00% PSV 99 N 99 -- J2 D5 D3 E4 C4 C5 B5 + +: MoveNum: 6 HASH: BDC50823F47DD6F67697A8E5A69FB315 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . @ . . . . . . . + 4 . . . . . . O O O . . + 3 . . . . . X O X X . . + 2 . . . . X . X O1O3. . + 1 . . . . . X2. . . . . + + +Root visits: 50 +Policy surprise 0.335161 +Raw WL -0.0976073 +PV: D5 D3 E4 C5 C6 +Tree: +: T -7.50c W -7.13c S -0.36c ( -0.6 L -0.6) N 50 -- D5 D3 E4 C5 C6 +---Black(v)--- +D5 : T -10.64c W -9.99c S -0.64c ( -1.1 L -1.1) LCB -0.32c P 21.80% WF 16.54% PSV 22 N 22 -- D5 D3 E4 C5 C6 +K3 : T -7.23c W -6.83c S -0.40c ( -0.7 L -0.7) LCB 8.66c P 27.95% WF 15.51% PSV 17 N 17 -- K3 K2 D5 D3 F4 C5 C6 C4 +C4 : T -6.55c W -6.35c S -0.20c ( -0.3 L -0.3) LCB 32.98c P 10.64% WF 15.37% PSV 6 N 6 -- C4 D9 D8 +C5 : T 5.85c W 5.16c S 0.68c ( +1.1 L +1.1) LCB 260.00c P 6.34% WF 13.70% PSV 1 N 1 -- C5 +J9 : T 14.36c W 12.38c S 1.98c ( +3.3 L +3.3) LCB 260.00c P 5.70% WF 12.55% PSV 1 N 1 -- J9 +E5 : T 4.48c W 3.90c S 0.57c ( +1.0 L +1.0) LCB 260.00c P 5.48% WF 13.89% PSV 1 N 1 -- E5 +H8 : T 15.13c W 13.25c S 1.88c ( +3.1 L +3.1) LCB 260.00c P 4.74% WF 12.44% PSV 1 N 1 -- H8 + +: MoveNum: 7 HASH: 041EBB742424AC6276156DAE08602F1B + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . X3. . . . . . . + 4 . . . . . . O O O . . + 3 . . . @ . X O X X . . + 2 . . . . X . X O O2. . + 1 . . . . . X1. . . . . + + +Root visits: 100 +Policy surprise 0.321075 +Raw WL -0.00960252 +PV: D3 E4 C5 C6 C4 +Tree: +: T -7.36c W -7.01c S -0.35c ( -0.6 L -0.6) N 100 -- D3 E4 C5 C6 C4 +---White(^)--- +D3 : T -6.69c W -6.33c S -0.36c ( -0.6 L -0.6) LCB -16.72c P 13.73% WF 9.57% PSV 20 N 20 -- D3 E4 C5 C6 C4 +C7 : T 2.82c W 2.15c S 0.67c ( +1.1 L +1.1) LCB -13.36c P 4.50% WF 11.16% PSV 17 N 17 -- C7 D8 D7 E7 E6 +C3 : T -3.45c W -3.28c S -0.17c ( -0.3 L -0.3) LCB -23.63c P 4.82% WF 10.07% PSV 13 N 13 -- C3 C4 D3 F4 E5 D4 +D9 : T -13.32c W -12.52c S -0.81c ( -1.3 L -1.3) LCB -29.46c P 12.34% WF 8.57% PSV 9 N 9 -- D9 C8 D8 D7 E7 +E9 : T -9.55c W -9.00c S -0.55c ( -0.9 L -0.9) LCB -32.97c P 9.62% WF 9.12% PSV 9 N 9 -- E9 D7 G8 +D8 : T -12.63c W -11.78c S -0.85c ( -1.4 L -1.4) LCB -42.59c P 11.48% WF 8.69% PSV 8 N 8 -- D8 D9 E8 E9 +H9 : T -16.34c W -15.19c S -1.15c ( -1.9 L -1.9) LCB -74.43c P 11.31% WF 8.25% PSV 6 N 6 -- H9 G8 C8 D9 B5 +E8 : T -11.79c W -11.05c S -0.74c ( -1.3 L -1.3) LCB -46.40c P 7.50% WF 8.85% PSV 6 N 6 -- E8 D7 D9 D8 E9 +C8 : T -12.75c W -12.02c S -0.72c ( -1.2 L -1.2) LCB -96.14c P 4.46% WF 8.75% PSV 3 N 5 -- C8 D9 B5 +E4 : T -13.73c W -13.03c S -0.70c ( -1.1 L -1.1) LCB -168.05c P 5.25% WF 8.72% PSV 3 N 3 -- E4 D4 D9 + +: MoveNum: 8 HASH: 3DB9D5D1C34A64D317FAE22BB3CDFAAE + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . X2. . . . . . . + 4 . . . . @ . O O O . . + 3 . . . O3. X O X X . . + 2 . . . . X . X O O1. . + 1 . . . . . X . . . . . + + +Root visits: 100 +Policy surprise 0.150072 +Raw WL -0.0769724 +PV: E4 B5 C4 B4 C3 C8 D8 C7 B9 +Tree: +: T -11.52c W -10.71c S -0.80c ( -1.3 L -1.3) N 100 -- E4 B5 C4 B4 C3 C8 D8 +---Black(v)--- +E4 : T -13.91c W -12.85c S -1.06c ( -1.8 L -1.8) LCB -5.61c P 38.93% WF 22.53% PSV 60 N 60 -- E4 B5 C4 B4 C3 C8 D8 C7 +F4 : T -7.74c W -7.25c S -0.48c ( -0.8 L -0.8) LCB 2.41c P 32.48% WF 19.65% PSV 24 N 24 -- F4 C5 C6 C4 B6 E5 F5 D6 +C3 : T -11.34c W -10.79c S -0.55c ( -0.9 L -0.9) LCB 10.36c P 10.24% WF 21.18% PSV 10 N 10 -- C3 C4 D4 B3 +K3 : T -1.61c W -1.80c S 0.19c ( +0.3 L +0.3) LCB 126.56c P 5.96% WF 18.76% PSV 3 N 3 -- K3 K2 F4 +D2 : T 3.39c W 2.74c S 0.65c ( +1.1 L +1.1) LCB 260.00c P 7.07% WF 17.88% PSV 2 N 2 -- D2 C3 + +: MoveNum: 9 HASH: FDA17F48AEB458FF58B105AAEB35C52D + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . @ . X1. . . . . . . + 4 . . . . X3. O O O . . + 3 . . . O2. X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Root visits: 100 +Policy surprise 0.399403 +Raw WL 0.021892 +PV: B5 C4 B4 C3 C8 D8 C7 B9 +Tree: +: T -10.56c W -9.81c S -0.75c ( -1.3 L -1.3) N 100 -- B5 C4 B4 C3 C8 D8 C7 +---White(^)--- +B5 : T -8.18c W -7.64c S -0.53c ( -0.9 L -0.9) LCB -15.87c P 24.14% WF 15.96% PSV 50 N 50 -- B5 C4 B4 C3 C8 D8 C7 B9 +C5 : T -18.35c W -16.85c S -1.50c ( -2.5 L -2.5) LCB -39.88c P 26.51% WF 12.98% PSV 16 N 16 -- C5 C4 C6 B4 D9 +C8 : T -0.78c W -0.99c S 0.21c ( +0.3 L +0.3) LCB -18.82c P 3.32% WF 17.52% PSV 13 N 13 -- C8 D9 B5 C4 B4 C3 +C4 : T -19.58c W -17.92c S -1.66c ( -2.9 L -2.9) LCB -44.54c P 20.57% WF 12.82% PSV 12 N 12 -- C4 C5 B5 B6 B3 A5 B4 C2 +D8 : T -16.11c W -14.85c S -1.26c ( -2.1 L -2.1) LCB -75.91c P 4.65% WF 13.97% PSV 3 N 4 -- D8 C8 D7 +C7 : T -18.19c W -17.06c S -1.12c ( -1.9 L -1.9) LCB -120.00c P 3.95% WF 13.68% PSV 2 N 3 -- C7 B5 D9 +D9 : T -25.00c W -23.57c S -1.43c ( -2.4 L -2.4) LCB -260.00c P 3.12% WF 13.07% PSV 1 N 1 -- D9 + +: MoveNum: 10 HASH: 5EDFAF58C6500798F5E274045A51C1D5 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . O3. X . . . . . . . + 4 . . @ . X2. O O O . . + 3 . . . O1. X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Root visits: 50 +Policy surprise 0.0927718 +Raw WL -0.20839 +PV: C4 B4 C3 C8 D8 C7 B9 +Tree: +: T -8.18c W -7.64c S -0.53c ( -0.9 L -0.9) N 50 -- C4 B4 C3 C8 D8 C7 B9 +---Black(v)--- +C4 : T -10.21c W -9.41c S -0.80c ( -1.3 L -1.3) LCB 0.63c P 45.60% WF 21.90% PSV 30 N 30 -- C4 B4 C3 C8 D8 C7 B9 +B3 : T -6.58c W -6.28c S -0.30c ( -0.5 L -0.5) LCB 17.70c P 19.18% WF 20.44% PSV 9 N 9 -- B3 C8 D9 D8 +C7 : T -2.44c W -2.65c S 0.22c ( +0.4 L +0.4) LCB 65.85c P 12.77% WF 19.42% PSV 4 N 4 -- C7 C6 +C6 : T 7.56c W 6.39c S 1.18c ( +2.0 L +2.0) LCB 260.39c P 13.41% WF 17.10% PSV 3 N 3 -- C6 B6 B7 +K3 : T -9.06c W -8.23c S -0.83c ( -1.4 L -1.4) LCB 48.93c P 5.65% WF 21.15% PSV 3 N 3 -- K3 K2 C4 + +: MoveNum: 11 HASH: FD58E49030B59C361C92837BB2304571 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . @ . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . O2. X . . . . . . . + 4 . . X3. X1. O O O . . + 3 . . . O . X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Root visits: 100 +Policy surprise 0.150348 +Raw WL -0.159563 +PV: C8 D8 C7 B9 B4 C3 D7 +Tree: +: T -13.38c W -12.29c S -1.09c ( -1.8 L -1.8) N 100 -- C8 D8 C7 B9 B4 C3 D7 +---White(^)--- +C8 : T -11.92c W -11.01c S -0.91c ( -1.5 L -1.5) LCB -19.96c P 35.81% WF 27.03% PSV 48 N 48 -- C8 D8 C7 B9 B4 C3 D7 +B4 : T -14.22c W -12.97c S -1.25c ( -2.0 L -2.0) LCB -24.62c P 33.29% WF 25.65% PSV 34 N 34 -- B4 C3 C8 D8 C7 B9 B3 B2 +C7 : T -14.76c W -13.62c S -1.15c ( -1.9 L -1.9) LCB -32.22c P 15.69% WF 25.47% PSV 15 N 16 -- C7 B4 D9 D10 D8 E10 B9 +D8 : T -31.77c W -28.97c S -2.80c ( -4.7 L -4.7) LCB -260.00c P 3.85% WF 21.85% PSV 1 N 1 -- D8 + +: MoveNum: 12 HASH: 92502931B9C69317C8E9F17BDE09F771 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . O3@ . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . O1. X . . . . . . . + 4 . . X2. X . O O O . . + 3 . . . O . X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Root visits: 50 +Policy surprise 0.121869 +Raw WL -0.269578 +PV: D8 C7 B9 B4 C3 D7 +Tree: +: T -10.91c W -10.09c S -0.82c ( -1.3 L -1.3) N 50 -- D8 C7 B9 B4 C3 D7 +---Black(v)--- +D8 : T -13.88c W -12.77c S -1.12c ( -1.8 L -1.8) LCB -4.10c P 40.48% WF 54.30% PSV 29 N 29 -- D8 C7 B9 B4 C3 D7 +D9 : T -5.26c W -4.97c S -0.29c ( -0.5 L -0.5) LCB 11.15c P 52.52% WF 45.70% PSV 20 N 20 -- D9 B4 C3 B3 B2 B9 B10 + +: MoveNum: 13 HASH: 2C66C4A053974C58FC6ADCFDEE659971 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . @ X . . . X . . . . + 8 . . O2X3. . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . O . X . . . . . . . + 4 . . X1. X . O O O . . + 3 . . . O . X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Root visits: 100 +Policy surprise 0.236465 +Raw WL -0.202232 +PV: B9 B8 C7 B7 C6 B10 D9 C10 E8 D7 +Tree: +: T -12.82c W -11.75c S -1.07c ( -1.8 L -1.8) N 100 -- B9 B8 C7 B7 C6 B10 D9 +---White(^)--- +B9 : T -7.55c W -6.99c S -0.56c ( -1.0 L -1.0) LCB -18.48c P 24.51% WF 20.81% PSV 48 N 48 -- B9 B8 C7 B7 C6 B10 D9 C10 +C7 : T -19.13c W -17.38c S -1.74c ( -2.9 L -2.9) LCB -35.01c P 37.53% WF 16.19% PSV 22 N 25 -- C7 B9 B4 C3 D7 E8 B3 B2 +B4 : T -13.41c W -12.30c S -1.11c ( -1.8 L -1.8) LCB -26.56c P 17.91% WF 18.30% PSV 16 N 20 -- B4 C3 C7 B9 D7 E8 B3 +D9 : T -26.75c W -24.63c S -2.12c ( -3.4 L -3.4) LCB -151.02c P 7.71% WF 15.46% PSV 3 N 3 -- D9 E9 D10 +D7 : T -41.46c W -37.87c S -3.59c ( -5.9 L -5.9) LCB -260.00c P 6.23% WF 13.02% PSV 1 N 2 -- D7 C7 +B8 : T -26.33c W -24.58c S -1.75c ( -2.8 L -2.8) LCB -260.00c P 3.07% WF 16.23% PSV 1 N 1 -- B8 + +: MoveNum: 14 HASH: 9DEAA2284769B22EEBB11816E028A91F + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . O3X . . . X . . . . + 8 . @ O1X2. . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . O . X . . . . . . . + 4 . . X . X . O O O . . + 3 . . . O . X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Root visits: 100 +Policy surprise 0.205996 +Raw WL -0.221935 +PV: B8 C7 B7 C6 B10 D9 C10 E8 D7 D6 E7 E6 +Tree: +: T -10.65c W -9.76c S -0.89c ( -1.5 L -1.5) N 100 -- B8 C7 B7 C6 B10 D9 C10 +---Black(v)--- +B8 : T -12.58c W -11.56c S -1.02c ( -1.7 L -1.7) LCB -0.19c P 20.80% WF 22.19% PSV 45 N 45 -- B8 C7 B7 C6 B10 D9 C10 E8 +C7 : T -13.82c W -12.56c S -1.27c ( -2.1 L -2.1) LCB 10.00c P 40.40% WF 22.63% PSV 31 N 31 -- C7 B8 B7 D9 C10 D7 E8 C6 +D9 : T 5.52c W 4.95c S 0.57c ( +0.9 L +0.9) LCB 32.20c P 28.86% WF 15.53% PSV 12 N 13 -- D9 B7 B10 B4 +K3 : T -10.36c W -9.49c S -0.87c ( -1.4 L -1.4) LCB 22.20c P 5.04% WF 21.06% PSV 7 N 8 -- K3 K2 C7 B8 D9 +C10 : T 0.64c W 0.43c S 0.22c ( +0.4 L +0.4) LCB 260.00c P 3.77% WF 18.59% PSV 2 N 2 -- C10 C7 + + Forkstuff 1 0 +HASH: 056B55CC9CE2C51801A41E56E6305746 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . . O O . . + 3 . . . . . . O X X . . + 2 . . . . . O X . . . . + 1 X . . . . . . . . . . + + +bName test +wName test +bIdx 0 +wIdx 0 +startPla X +start +HASH: 1FF90C1B1F2FA28BCB79C15FC361B0A2 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . . X . . . X . . . . + 8 . . . . . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . . . . . . . . . . . + 4 . . . . . . . O O . . + 3 . . . . . . O X X . . + 2 . . . . . O X . . . . + 1 . . . . . . . . . . . + + +Initial pla Black +Encore phase 0 +Turns this phase 0 +Rules koPOSITIONALscoreAREAtaxNONEsui1komi7.5 +Ko recap block hash 00000000000000000000000000000000 +White bonus score 0 +White handicap bonus score 0 +Has button 0 +Presumed next pla Black +Past normal phase end 0 +Game result 0 Empty 0 0 0 0 +Last moves +end +HASH: FA9F2C528D0B8912B07E3B1A3CD349A9 + A B C D E F G H J K L +11 . . . . . . . . . . . +10 . . . . . . . . . . . + 9 . O X . . . X . . . . + 8 . X O X . . . . O . . + 7 . . . . . . . . . . . + 6 . . . . . . . . . . . + 5 . O . X . . . . . . . + 4 . . X . X . O O O . . + 3 . . . O . X O X X . . + 2 . . . . X . X O O . . + 1 . . . . . X . . . . . + + +Initial pla Black +Encore phase 0 +Turns this phase 15 +Rules koPOSITIONALscoreAREAtaxNONEsui1komi7.5 +Ko recap block hash 00000000000000000000000000000000 +White bonus score 0 +White handicap bonus score 0 +Has button 0 +Presumed next pla White +Past normal phase end 0 +Game result 0 Empty 0 0 0 0 +Last moves F3 G4 E2 H2 F1 J2 D5 D3 E4 B5 C4 C8 D8 B9 B8 +gameHash 75F978022E93CC282260C483B8D873A9 +hitTurnLimit 1 +numExtraBlack 0 +mode 5 +beganInEncorePhase 0 +usedInitialPosition 0 +hasFullData 1 +targetWeightByTurn 0 1 +targetWeightByTurn 1 1 +targetWeightByTurn 2 1 +targetWeightByTurn 3 1 +targetWeightByTurn 4 0 +targetWeightByTurn 5 1 +targetWeightByTurn 6 0 +targetWeightByTurn 7 1 +targetWeightByTurn 8 1 +targetWeightByTurn 9 1 +targetWeightByTurn 10 0 +targetWeightByTurn 11 1 +targetWeightByTurn 12 0 +targetWeightByTurn 13 1 +targetWeightByTurn 14 1 +policyTargetsByTurn 0 unreducedNumVisits 400 F3 220 G4 3 K4 1 A1 0 +policyTargetsByTurn 1 unreducedNumVisits 100 G4 99 +policyTargetsByTurn 2 unreducedNumVisits 100 E2 99 +policyTargetsByTurn 3 unreducedNumVisits 100 H2 99 +policyTargetsByTurn 4 unreducedNumVisits 50 F1 49 +policyTargetsByTurn 5 unreducedNumVisits 100 J2 99 +policyTargetsByTurn 6 unreducedNumVisits 50 K3 17 D5 22 C4 6 C5 1 J9 1 E5 1 H8 1 +policyTargetsByTurn 7 unreducedNumVisits 100 D3 20 D9 9 D8 8 H9 6 E9 9 E8 6 E4 3 C4 2 C3 13 C7 17 C8 3 +policyTargetsByTurn 8 unreducedNumVisits 100 E4 60 F4 24 C3 10 D2 2 K3 3 +policyTargetsByTurn 9 unreducedNumVisits 100 C5 16 B5 50 C4 12 D8 3 C7 2 C8 13 D9 1 +policyTargetsByTurn 10 unreducedNumVisits 50 C4 30 B3 9 C6 3 C7 4 K3 3 +policyTargetsByTurn 11 unreducedNumVisits 100 C8 48 B4 34 C7 15 D8 1 +policyTargetsByTurn 12 unreducedNumVisits 50 D9 20 D8 29 +policyTargetsByTurn 13 unreducedNumVisits 100 C7 22 B9 48 B4 16 D9 3 D7 1 B8 1 +policyTargetsByTurn 14 unreducedNumVisits 100 C7 31 D9 12 B8 45 K3 7 C10 2 +whiteValueTargetsByTurn 0 0.471167 0.528833 0 -0.330873 - +whiteValueTargetsByTurn 1 0.471167 0.528833 0 -0.330873 - +whiteValueTargetsByTurn 2 0.4708 0.5292 0 -0.336809 - +whiteValueTargetsByTurn 3 0.470999 0.529001 0 -0.337958 - +whiteValueTargetsByTurn 4 0.46769 0.53231 0 -0.506513 - +whiteValueTargetsByTurn 5 0.4712 0.5288 0 -0.328352 - +whiteValueTargetsByTurn 6 0.46433 0.53567 0 -0.613732 - +whiteValueTargetsByTurn 7 0.464941 0.535059 0 -0.586738 - +whiteValueTargetsByTurn 8 0.446426 0.553574 0 -1.33335 - +whiteValueTargetsByTurn 9 0.450951 0.549049 0 -1.25212 - +whiteValueTargetsByTurn 10 0.461795 0.538205 0 -0.887762 - +whiteValueTargetsByTurn 11 0.438531 0.561469 0 -1.78428 - +whiteValueTargetsByTurn 12 0.449558 0.550442 0 -1.3489 - +whiteValueTargetsByTurn 13 0.441251 0.558749 0 -1.77167 - +whiteValueTargetsByTurn 14 0.451211 0.548789 0 -1.50692 - +whiteValueTargetsByTurn 15 1 0 0 4.5 4.5 +........... +........... +.OX...X.... +.XOX....O.. +........... +........... +.O.X....... +..X.X.OOO.. +...O.XOXX.. +....XXXOO.. +.....X..... +........... +........... +.OX...X.... +.XOX....O.. +........... +........... +.O.X....... +..X.X.OOO.. +...O.XOXX.. +....XXXOO.. +.....X..... +00000000000 +00000000000 +01100010000 +01110000100 +00000000000 +00000000000 +01010000000 +00101011100 +00010111100 +00001111100 +00000100000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 1.000 -1.000 0.000 0.000 0.000 -1.000 0.000 0.000 0.000 0.000 + 0.000 -1.000 1.000 -1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 1.000 0.000 -1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -1.000 0.000 -1.000 0.000 1.000 1.000 1.000 0.000 0.000 + 0.000 0.000 0.000 1.000 0.000 -1.000 1.000 -1.000 -1.000 0.000 0.000 + 0.000 0.000 0.000 0.000 -1.000 -1.000 -1.000 1.000 1.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 -1.000 0.000 0.000 0.000 0.000 0.000 + HASH: 718CF87DDD7BB3C9003DC76AFC3C2A11 A B C D E F G H J 9 . . . . . . . . . diff --git a/cpp/tests/testsearch.cpp b/cpp/tests/testsearch.cpp index 417f03167..91b7cee8d 100644 --- a/cpp/tests/testsearch.cpp +++ b/cpp/tests/testsearch.cpp @@ -533,13 +533,13 @@ static void runOwnershipAndMisc(NNEvaluator* nnEval, NNEvaluator* nnEval11, NNEv PrintTreeOptions options; options = options.maxDepth(1); cout << "Beginning search again and then reprinting, should be same" << endl; - search->beginSearch(); + search->beginSearch(false); search->printTree(cout, search->rootNode, options, P_WHITE); cout << "Making a move O3, should still be same" << endl; bot->makeMove(Location::ofString("O3",19,19), P_WHITE); search->printTree(cout, search->rootNode, options, P_WHITE); cout << "Beginning search again and then reprinting, now score utils should change a little" << endl; - search->beginSearch(); + search->beginSearch(false); search->printTree(cout, search->rootNode, options, P_WHITE); delete bot; @@ -851,6 +851,268 @@ static void runV8Tests(NNEvaluator* nnEval, NNEvaluator* nnEval19Exact, Logger& delete sgf; } + + { + cout << "===================================================================" << endl; + cout << "Testing PDA + pondering, p200 v400" << endl; + cout << "===================================================================" << endl; + + Board board = Board::parseBoard(13,13,R"%%( +............. +............. +............. +.........x... +............. +............. +............. +............. +............. +..o......x... +............. +............. +............. +)%%"); + + const Player startPla = P_WHITE; + const Rules rules = Rules::getTrompTaylorish(); + const BoardHistory hist(board,startPla,rules,0); + SearchParams baseParams = SearchParams::forTestsV1(); + baseParams.maxVisits = 400; + baseParams.maxVisitsPondering = 600; + baseParams.maxPlayouts = 200; + baseParams.maxPlayoutsPondering = 300; + + nnEval->clearCache(); nnEval->clearStats(); + + auto printSearchResults = [](const Search* search) { + cout << search->rootBoard << endl; + cout << "Root visits: " << search->getRootVisits() << "\n"; + cout << "Last search playouts: " << search->lastSearchNumPlayouts << "\n"; + cout << "NN rows: " << search->nnEvaluator->numRowsProcessed() << endl; + cout << "NN batches: " << search->nnEvaluator->numBatchesProcessed() << endl; + cout << "NN avg batch size: " << search->nnEvaluator->averageProcessedBatchSize() << endl; + if(search->searchParams.playoutDoublingAdvantage != 0) + cout << "PlayoutDoublingAdvantage: " << ( + search->getRootPla() == getOpp(search->getPlayoutDoublingAdvantagePla()) ? + -search->searchParams.playoutDoublingAdvantage : search->searchParams.playoutDoublingAdvantage) << endl; + cout << "PV: "; + search->printPV(cout, search->rootNode, 25); + cout << "\n"; + cout << "Tree:\n"; + PrintTreeOptions options; + options = options.maxDepth(1); + search->printTree(cout, search->rootNode, options, P_WHITE); + }; + + { + SearchParams params = baseParams; + params.playoutDoublingAdvantage = 1.5; + cout << "Basic search with PDA 1.5, no player" << endl; + + Search* search = new Search(params, nnEval, "autoSearchRandSeed3"); + Player nextPla; + + search->setPosition(startPla,board,hist); nextPla = startPla; + + Loc moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player - should clear tree and flip PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player - should clear tree and flip PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + delete search; + nnEval->clearCache(); nnEval->clearStats(); + } + + { + SearchParams params = baseParams; + params.playoutDoublingAdvantage = 1.5; + params.playoutDoublingAdvantagePla = P_BLACK; + cout << "Basic search with PDA 1.5, force black" << endl; + + Search* search = new Search(params, nnEval, "autoSearchRandSeed3"); + Player nextPla; + + search->setPosition(startPla,board,hist); nextPla = startPla; + + Loc moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player PONDERING - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + bool pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + delete search; + nnEval->clearCache(); nnEval->clearStats(); + } + + { + SearchParams params = baseParams; + params.playoutDoublingAdvantage = 1.5; + params.playoutDoublingAdvantagePla = P_WHITE; + cout << "Basic search with PDA 1.5, force white" << endl; + + Search* search = new Search(params, nnEval, "autoSearchRandSeed3"); + Player nextPla; + + search->setPosition(startPla,board,hist); nextPla = startPla; + + Loc moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player PONDERING - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + bool pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player PONDERING - an extra time, should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player - should preserve tree" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + delete search; + nnEval->clearCache(); nnEval->clearStats(); + } + + { + SearchParams params = baseParams; + params.playoutDoublingAdvantage = 1.5; + cout << "Basic search with PDA 1.5, no player" << endl; + + Search* search = new Search(params, nnEval, "autoSearchRandSeed3"); + Player nextPla; + + search->setPosition(startPla,board,hist); nextPla = startPla; + + Loc moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player PONDERING - should keep prior tree and PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + bool pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player - should keep tree from ponder" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + delete search; + nnEval->clearCache(); nnEval->clearStats(); + } + + { + SearchParams params = baseParams; + params.playoutDoublingAdvantage = 1.5; + cout << "Basic search with PDA 1.5, no player" << endl; + + Search* search = new Search(params, nnEval, "autoSearchRandSeed3"); + Player nextPla; + + search->setPosition(startPla,board,hist); nextPla = startPla; + + Loc moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player PONDERING - should keep prior tree and PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + bool pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player PONDERING an extra time - should keep prior tree and PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player - now should lose the tree and PDA, because the player it is for is different" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + delete search; + nnEval->clearCache(); nnEval->clearStats(); + } + + { + SearchParams params = baseParams; + params.playoutDoublingAdvantage = 1.5; + cout << "Basic search with PDA 1.5, no player" << endl; + + Search* search = new Search(params, nnEval, "autoSearchRandSeed3"); + Player nextPla; + + search->setPosition(startPla,board,hist); nextPla = startPla; + + Loc moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "Search next player PONDERING - should keep prior tree and PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + bool pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Search next player PONDERING - should still keep prior tree and PDA" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + pondering = true; + search->runWholeSearch(nextPla,logger,pondering); printSearchResults(search); + + cout << "Without making a move - convert ponder to regular search, should still keep tree and PDA" << endl; + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + nnEval->clearCache(); nnEval->clearStats(); + + cout << "Set position to original, search PONDERING" << endl; + search->setPosition(startPla,board,hist); nextPla = startPla; + pondering = true; + search->runWholeSearch(nextPla,logger,pondering); printSearchResults(search); + + cout << "Without making a move, convert to regular search, should not keep tree" << endl; + cout << "and should not benefit from cache, since search would guess the opponent as 'our' side" << endl; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger); printSearchResults(search); + + cout << "But should be fine thereafter. Make two moves and continue" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->makeMove(Location::ofString("D4",board),nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + nnEval->clearCache(); nnEval->clearStats(); + + cout << "Set position to original, search PONDERING" << endl; + search->setPosition(startPla,board,hist); nextPla = startPla; + pondering = true; + moveLoc = search->runWholeSearchAndGetMove(nextPla,logger,pondering); printSearchResults(search); + + cout << "Play that move and real search on the next position, should keep tree because correct guess of side" << endl; + search->makeMove(moveLoc,nextPla); nextPla = getOpp(nextPla); + search->runWholeSearch(nextPla,logger); printSearchResults(search); + + delete search; + nnEval->clearCache(); nnEval->clearStats(); + } + + } } void Tests::runSearchTests(const string& modelFile, bool inputsNHWC, bool cudaNHWC, int symmetry, bool useFP16) { @@ -1210,7 +1472,7 @@ o..oo.x cout << endl; cout << "But the moment we begin a search, it should no longer." << endl; - search->beginSearch(); + search->beginSearch(false); testAssert(!hasSuicideRootMoves(search)); testAssert(!hasPassAliveRootMoves(search)); @@ -1272,11 +1534,11 @@ o..o.oo search->printTree(cout, search->rootNode, options, P_WHITE); cout << "Begin search is idempotent?" << endl; - search->beginSearch(); + search->beginSearch(false); search->printTree(cout, search->rootNode, options, P_WHITE); search->makeMove(Location::ofString("B1",board),nextPla); search->printTree(cout, search->rootNode, options, P_WHITE); - search->beginSearch(); + search->beginSearch(false); search->printTree(cout, search->rootNode, options, P_WHITE); delete search; diff --git a/cpp/tests/testtrainingwrite.cpp b/cpp/tests/testtrainingwrite.cpp index fc9fb3bb6..46e14907a 100644 --- a/cpp/tests/testtrainingwrite.cpp +++ b/cpp/tests/testtrainingwrite.cpp @@ -107,6 +107,7 @@ void Tests::runTrainingWriteTests() { vector*> stopConditions; PlaySettings playSettings; playSettings.initGamesWithPolicy = true; + playSettings.policyInitAreaProp = 0.04; playSettings.forkSidePositionProb = 0.10; playSettings.forSelfPlay = true; Rand rand(seedBase+"play"); @@ -230,6 +231,7 @@ void Tests::runSelfplayInitTestsWithNN(const string& modelFile) { vector*> stopConditions; PlaySettings playSettings; playSettings.initGamesWithPolicy = true; + playSettings.policyInitAreaProp = 0.04; playSettings.forkSidePositionProb = 0.40; playSettings.cheapSearchProb = 0.5; playSettings.cheapSearchVisits = 20; @@ -358,7 +360,8 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { bool testAsym, bool testLead, bool testPolicySurpriseWeight, - bool testValueSurpriseWeight + bool testValueSurpriseWeight, + bool testHint ) { nnEval->clearCache(); nnEval->clearStats(); @@ -380,7 +383,26 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { Board initialBoard(11,11); Player initialPla = P_BLACK; int initialEncorePhase = 0; + if(testHint) { + initialBoard = Board::parseBoard(11,11,R"%%( +........... +........... +..x...x.... +........o.. +........... +........... +........... +.......oo.. +......oxx.. +.....ox.... +........... +)%%"); + + } + BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase); + if(testHint) + initialHist.setInitialTurnNumber(10); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = 0; @@ -395,6 +417,7 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { vector*> stopConditions; PlaySettings playSettings; playSettings.initGamesWithPolicy = true; + playSettings.policyInitAreaProp = 0.04; playSettings.forkSidePositionProb = 0.0; playSettings.cheapSearchProb = 0.5; playSettings.cheapSearchVisits = 50; @@ -426,7 +449,14 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { otherGameProps.playoutDoublingAdvantage = log(3.0) / log(2.0); otherGameProps.playoutDoublingAdvantagePla = P_WHITE; } - bool logSearchInfo = testPolicySurpriseWeight; + if(testHint) { + otherGameProps.isHintPos = true; + otherGameProps.hintTurn = initialHist.moveHistory.size(); + otherGameProps.hintPosHash = initialBoard.pos_hash; + otherGameProps.hintLoc = Location::ofString("A1",initialBoard); + otherGameProps.allowPolicyInit = false; + } + bool logSearchInfo = testPolicySurpriseWeight || testHint; FinishedGameData* gameData = Play::runGame( initialBoard,initialPla,initialHist,extraBlackAndKomi, botSpec,botSpec, @@ -438,6 +468,13 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { rand, NULL ); + if(testHint) { + ForkData forkData; + Play::maybeHintForkGame(gameData, &forkData, otherGameProps); + cout << " Forkstuff " << forkData.forks.size() << " " << forkData.sekiForks.size() << endl; + for(int i = 0; iboard << endl; + } gameData->printDebug(cout); delete gameData; @@ -446,13 +483,14 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { }; - run("testasym!",Rules::getTrompTaylorish(),true,false,false,false); - run("test lead!",Rules::getTrompTaylorish(),false,true,false,false); + run("testasym!",Rules::getTrompTaylorish(),true,false,false,false,false); + run("test lead!",Rules::getTrompTaylorish(),false,true,false,false,false); Rules r = Rules::getTrompTaylorish(); r.hasButton = true; - run("test lead int button!",r,false,true,false,false); - run("test surprise!",Rules::getTrompTaylorish(),false,false,true,false); - run("test value surprise!",Rules::getTrompTaylorish(),false,false,false,true); + run("test lead int button!",r,false,true,false,false,false); + run("test surprise!",Rules::getTrompTaylorish(),false,false,true,false,false); + run("test value surprise!",Rules::getTrompTaylorish(),false,false,false,true,false); + run("test hint!",Rules::getTrompTaylorish(),false,false,false,false,true); //Test lead specifically on a final position diff --git a/docs/Analysis_Engine.md b/docs/Analysis_Engine.md index 17ead38e8..46752d8bb 100644 --- a/docs/Analysis_Engine.md +++ b/docs/Analysis_Engine.md @@ -21,8 +21,9 @@ The protocol is entirely asynchronous - new requests on stdin can be accepted at whenever those analyses finish, and possibly in a different order than the requests were provided. As described below, each query may specify *multiple* positions to be analyzed and therefore may generate *multiple* results. -If stdin is closed, the engine will attempt to stop all threads as soon as possible, clean up, and exit, without necessarily -finishing the analysis of whatever queries are open at the time. +If stdin is closed, then the engine will finish the analysis of all queued queries before exiting, unless `-quit-without-waiting` was +provided on the initial command line, in which case it will attempt to stop all threads and still exit cleanly but without +necessarily finishing the analysis of whatever queries are open at the time. #### Queries diff --git a/docs/GTP_Extensions.md b/docs/GTP_Extensions.md index 94e1cdace..12b1e6ab7 100644 --- a/docs/GTP_Extensions.md +++ b/docs/GTP_Extensions.md @@ -45,8 +45,8 @@ In addition to a basic set of [GTP commands](https://www.lysator.liu.se/~gunnar/ * `kgs-rules RULES` * This is an extension for playing on KGS, via kgsGtp. * As specified by kgsGtp docs, `RULES` should be one of `chinese | aga | japanese | new_zealand`. - * For this extension, `chinese` actually maps to `chinese-kgs` above. Otherwise, has the same effect as `kata-set-rules`. - * `kgs-time-settings KIND ...` + * Has the same behavior as `kata-set-rules` except that `chinese` maps to `chinese-kgs` above. + * `kgs-time_settings KIND ...` * This is an extension for playing on KGS, via kgsGtp. * As specified by kgsGtp docs, `KIND` should be one of `none | absolute | canadian | byoyomi`. * `none` indicates no time control @@ -73,7 +73,8 @@ In addition to a basic set of [GTP commands](https://www.lysator.liu.se/~gunnar/ * `order` - KataGo's ranking of the move. 0 is the best, 1 is the next best, and so on. * `pv` - The principal variation following this move. May be of variable length or even empty. * All output values are from the perspective of the current player, unless otherwise configured in KataGo's gtp config. - * This command will terminate upon any new GTP command being received, as well as upon a raw newline being received, including outputting the usual double-newline that signals a completed GTP response. + * This command is a bit unusual for GTP in that it will run forever on its own, but asynchronously if any new GTP command or a raw newline is received, then it will terminate. + * Upon termination, it will still output the usual double-newline that signals a completed GTP response. * `kata-analyze [player (optional)] [interval (optional)] KEYVALUEPAIR KEYVALUEPAIR ...` * Same as `lz-analyze` except a slightly different output format and some additional options and fields. @@ -100,8 +101,9 @@ In addition to a basic set of [GTP commands](https://www.lysator.liu.se/~gunnar/ * Following is BoardHeight*BoardWidth many consecutive floats in [-1,1] separated by spaces, predicting the final ownership of every board location from the perspective of the current player. Floats are in row-major order, starting at the top-left of the board (e.g. A19) and going to the bottom right (e.g. T1). * `lz-genmove_analyze [player (optional)] [interval (optional)] KEYVALUEPAIR KEYVALUEPAIR` * Same as `genmove` except will also produce `lz-analyze`-like output while the move is being searched. - * Behaves like a normal synchronous GTP command, unlike `lz-analyze`. Will NOT terminate prematurely due a newline or addiional GTP command. - * The final move made will be reported as a single line `play `, followed by the usual double-newline. + * Like `lz-analyze`, will immediately begin printing a partial GTP response, with a new line every `interval` centiseconds. + * Unlike `lz-analyze`, will teriminate on its own after the normal amount of time that a `genmove` would take and will NOT terminate prematurely or asynchronously upon recipt of a newline or an additional GTP command. + * The final move made will be reported as a single line `play `, followed by the usual double-newline that signals a complete GTP response. * `kata-genmove_analyze [player (optional)] [interval (optional)] KEYVALUEPAIR KEYVALUEPAIR` * Same as `lz-genmove_analyze` except with the options and fields of `kata-analyze` rather than `lz-analyze` * `analyze, genmove_analyze` @@ -128,5 +130,5 @@ In addition to a basic set of [GTP commands](https://www.lysator.liu.se/~gunnar/ * Get a parameter or set a parameter to a given value. * Currently, the only supported PARAM is `playoutDoublingAdvantage (float)`. Setting this affects the value used for analysis, and affects play only if the config is not already set to use dynamicPlayoutDoublingAdvantageCapPerOppLead. More params may be added later. * `cputime`, `gomill-cpu_time` - * Returns the approximate total wall-clock-time spent during the handling of `genmove` or the various flavors of `genmove_analyze` commands described above so far during a game, as a floating point number of seconds. Does NOT currently count time spent during pondering or during the various `lz-analyze`, `kata-analayze`, etc. + * Returns the approximate total wall-clock-time spent during the handling of `genmove` or the various flavors of `genmove_analyze` commands described above so far during the entire current instance of the engine, as a floating point number of seconds. Does NOT currently count time spent during pondering or during the various `lz-analyze`, `kata-analyze`, etc. * Note: Gomill specifies that its variant of the command should return the total time summed across CPUs. For KataGo, this time is both unuseful and hard to measure because much of the time is spent waiting on the GPU, not on the CPU, and with different threads sometimes blocking each other through the multitheading and often exceeding the number of cores on a user's system, time spent on CPUs is hard to make sense of. So instead we report wall-clock-time, which is far more useful to record and should correspond more closely to what users may want to know for actual practical benchmarking and performance. diff --git a/images/readme/jan2020vsjune2019.png b/images/readme/jan2020vsjune2019.png index e906aefe5..be8742cd8 100644 Binary files a/images/readme/jan2020vsjune2019.png and b/images/readme/jan2020vsjune2019.png differ diff --git a/python/selfplay/export_model_for_selfplay.sh b/python/selfplay/export_model_for_selfplay.sh index 9913a2f84..4fe45299d 100755 --- a/python/selfplay/export_model_for_selfplay.sh +++ b/python/selfplay/export_model_for_selfplay.sh @@ -8,7 +8,7 @@ set -o pipefail if [[ $# -ne 3 ]] then echo "Usage: $0 NAMEPREFIX BASEDIR USEGATING" - echo "Currently expects to be run from within the `python` directory of the KataGo repo, or otherwise in the same dir as export_model.py." + echo "Currently expects to be run from within the 'python' directory of the KataGo repo, or otherwise in the same dir as export_model.py." echo "NAMEPREFIX string prefix for this training run, try to pick something globally unique. Will be displayed to users when KataGo loads the model." echo "BASEDIR containing selfplay data and models and related directories" echo "USEGATING = 1 to use gatekeeper, 0 to not use gatekeeper and output directly to models/" diff --git a/python/selfplay/shuffle.sh b/python/selfplay/shuffle.sh index bb1b5e620..c914bda1a 100755 --- a/python/selfplay/shuffle.sh +++ b/python/selfplay/shuffle.sh @@ -7,7 +7,7 @@ set -o pipefail if [[ $# -lt 4 ]] then echo "Usage: $0 BASEDIR TMPDIR NTHREADS BATCHSIZE" - echo "Currently expects to be run from within the `python` directory of the KataGo repo, or otherwise in the same dir as shuffle.py." + echo "Currently expects to be run from within the 'python' directory of the KataGo repo, or otherwise in the same dir as shuffle.py." echo "BASEDIR containing selfplay data and models and related directories" echo "TMPDIR scratch space, ideally on fast local disk, unique to this loop" echo "NTHREADS number of parallel threads/processes to use in shuffle" diff --git a/python/selfplay/synchronous_loop.sh b/python/selfplay/synchronous_loop.sh index e55b6a142..ff424013b 100755 --- a/python/selfplay/synchronous_loop.sh +++ b/python/selfplay/synchronous_loop.sh @@ -12,7 +12,7 @@ set -o pipefail if [[ $# -lt 5 ]] then echo "Usage: $0 NAMEPREFIX BASEDIR TRAININGNAME MODELKIND USEGATING" - echo "Assumes katago is built in the `cpp` directory of the KataGo repo and the executable is present at cpp/katago." + echo "Assumes katago is built in the 'cpp' directory of the KataGo repo and the executable is present at cpp/katago." echo "NAMEPREFIX string prefix for this training run, try to pick something globally unique. Will be displayed to users when KataGo loads the model." echo "BASEDIR containing selfplay data and models and related directories" echo "TRANINGNAME name to prefix models with, specific to this training daemon"