diff --git a/.github/actions/onnx-build-katago/action.yml b/.github/actions/onnx-build-katago/action.yml new file mode 100644 index 0000000000..ce73d9b093 --- /dev/null +++ b/.github/actions/onnx-build-katago/action.yml @@ -0,0 +1,166 @@ +name: Build and test KataGo (ONNX backend) +description: > + Configure, build, run `katago runtests`, verify the ORT backend is wired up, and stage a + self-contained runnable directory under release/ (katago binary + ORT runtime + + execution-provider runtimes + example config). Expects onnx-prepare-ort to have populated + deps/install/{ort,protobuf,zlib} and the MSVC environment to be ready on Windows. +inputs: + ort_root: + description: Path to the ORT install tree (deps/install/ort) + required: true + ep: + description: Execution provider, used for EP-specific runtime staging + required: true + +runs: + using: composite + steps: + - name: Configure KataGo (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + cmake -S cpp -B cpp\build -G Ninja -DCMAKE_BUILD_TYPE=Release -DUSE_BACKEND=ONNX ` + -DONNXRUNTIME_ROOT=${{ inputs.ort_root }} ` + -DProtobuf_PROTOC_EXECUTABLE=${{ github.workspace }}\deps\install\protobuf\bin\protoc.exe ` + -DProtobuf_INCLUDE_DIR=${{ github.workspace }}\deps\install\protobuf\include ` + -DProtobuf_LIBRARY=${{ github.workspace }}\deps\install\protobuf\lib\libprotobuf.lib ` + -DZLIB_INCLUDE_DIR=${{ github.workspace }}\deps\install\zlib\include ` + -DZLIB_LIBRARY=${{ github.workspace }}\deps\install\zlib\lib\zlibstatic.lib + + - name: Configure KataGo (Linux) + if: runner.os == 'Linux' + shell: bash + run: | + # Use $GITHUB_WORKSPACE (not the github.workspace context): it resolves correctly + # both on plain runners (/home/runner/...) and inside a container job (/__w/...). + cmake -S cpp -B cpp/build -G Ninja -DCMAKE_BUILD_TYPE=Release -DUSE_BACKEND=ONNX \ + -DONNXRUNTIME_ROOT="$GITHUB_WORKSPACE/deps/install/ort" \ + -DProtobuf_PROTOC_EXECUTABLE="$GITHUB_WORKSPACE/deps/install/protobuf/bin/protoc" \ + -DProtobuf_INCLUDE_DIR="$GITHUB_WORKSPACE/deps/install/protobuf/include" \ + -DProtobuf_LIBRARY="$GITHUB_WORKSPACE/deps/install/protobuf/lib/libprotobuf.a" \ + -DZLIB_INCLUDE_DIR="$GITHUB_WORKSPACE/deps/install/zlib/include" \ + -DZLIB_LIBRARY="$GITHUB_WORKSPACE/deps/install/zlib/lib/libz.a" + + - name: Build KataGo + shell: bash + run: cmake --build cpp/build + + - name: Run tests + shell: bash + run: | + if [ "${{ runner.os }}" = "Windows" ]; then ./cpp/build/katago.exe runtests; else ./cpp/build/katago runtests; fi + + - name: Run tiny neural net tests (real inference, CPU EP) + shell: bash + run: | + # runtests never creates an Ort::Session (it uses debugSkipNeuralNet), so this is + # the step that actually exercises ORT session creation + inference through the + # emitted graph, using the embedded tiny model. It runs on the CPU execution + # provider, which is present in every ORT build regardless of the EP row. + mkdir -p tinynn-scratch + if [ "${{ runner.os }}" = "Windows" ]; then ./cpp/build/katago.exe runtinynntests tinynn-scratch 1.0; else ./cpp/build/katago runtinynntests tinynn-scratch 1.0; fi + + - name: Run onnx model file unit tests + shell: bash + run: | + # Unit tests for the .onnx model file reader: metadata validation, graph IO signature + # checks, and a dump/load round trip of a real model's metadata through the emitter. + if [ "${{ runner.os }}" = "Windows" ]; then KATAGO=./cpp/build/katago.exe; else KATAGO=./cpp/build/katago; fi + mkdir -p onnx-scratch + $KATAGO runonnxmodelfiletests onnx-scratch cpp/tests/models/g170-b6c96-s175395328-d26788732.bin.gz + + - name: Dump ONNX model files and run them (CPU EP) + shell: bash + run: | + # Round-trip check for `dumponnx` and for loading a .onnx as a model file: the same net + # loaded as .bin.gz, where the graph is emitted at startup, and as .onnx, where it is read + # from the file, must evaluate identically. Covers a convnet and a transformer, since the + # emitter's transformer path is separate code. runnnsymmetriestest uses a 13x13 buffer and + # the board size is baked into the graph, so dump at that size. + if [ "${{ runner.os }}" = "Windows" ]; then KATAGO=./cpp/build/katago.exe; else KATAGO=./cpp/build/katago; fi + mkdir -p onnx-scratch + FAILED=0 + for MODEL in g170-b6c96-s175395328-d26788732 b7c96h6kv3qk32v16tflrs-fson-bnh; do + echo "=== $MODEL" + BINGZ=cpp/tests/models/$MODEL.bin.gz + $KATAGO dumponnx -model $BINGZ -out onnx-scratch/$MODEL.onnx -nn-x-len 13 -nn-y-len 13 + $KATAGO runnnsymmetriestest $BINGZ false false false > onnx-scratch/${MODEL}_bingz.txt + $KATAGO runnnsymmetriestest onnx-scratch/$MODEL.onnx false false false > onnx-scratch/${MODEL}_onnx.txt + # Drop the log lines that legitimately differ (rand seed, model path, graph source). + FILTER='nnModelFile|nnRandSeed|ONNX backend|Building internal onnx' + grep -Ev "$FILTER" onnx-scratch/${MODEL}_bingz.txt > onnx-scratch/a.txt + grep -Ev "$FILTER" onnx-scratch/${MODEL}_onnx.txt > onnx-scratch/b.txt + if diff onnx-scratch/a.txt onnx-scratch/b.txt; then + echo "$MODEL: dumped .onnx reproduces the .bin.gz evaluations exactly" + else + echo "$MODEL: evaluations from the dumped .onnx do not match the .bin.gz" + FAILED=1 + fi + done + exit $FAILED + + - name: Verify backend wiring + shell: bash + run: | + # Command substitution flattens multi-line output: testing the raw array for a + # substring is unreliable, so check the flattened string with grep. + if [ "${{ runner.os }}" = "Windows" ]; then OUT=$(cpp/build/katago.exe version 2>&1); else OUT=$(cpp/build/katago version 2>&1); fi + if ! echo "$OUT" | grep -q "ONNX Runtime"; then + echo "unexpected backend version output: $OUT" + exit 1 + fi + echo "$OUT" | head -8 + + - name: Stage release directory (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path "release" | Out-Null + Copy-Item "cpp\build\katago.exe" "release\" + Get-ChildItem "deps\install\ort\bin\*.dll" -ErrorAction SilentlyContinue | Copy-Item -Destination "release\" -Force + # EP-specific runtime DLLs + if ("${{ inputs.ep }}" -eq "openvino") { + Get-ChildItem "deps\install\ort\lib\onnxruntime_providers_openvino.dll" -ErrorAction SilentlyContinue | Copy-Item -Destination "release\" -Force + $ovBin = "deps\openvino\runtime\bin\intel64\Release" + if (Test-Path $ovBin) { + Copy-Item "$ovBin\*.dll" "release\" + Copy-Item "$ovBin\*.json" "release\" + } else { + Write-Warning "OpenVINO runtime bin dir not found at $ovBin" + } + $tbb = Get-ChildItem "deps\openvino" -Recurse -Filter "tbb12.dll" -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($tbb) { Copy-Item $tbb.FullName "release\" } + } + # DirectML.dll is delay-loaded by ORT and is NOT inside onnxruntime.dll, so it must be + # shipped next to it or the DirectML provider cannot initialize (Windows 10's inbox + # DirectML is too old; the app-local copy from Microsoft.AI.DirectML overrides it). + if ("${{ inputs.ep }}" -eq "directml") { + if (Test-Path "deps\directml\DirectML.dll") { + Copy-Item "deps\directml\DirectML.dll" "release\" + } else { + throw "DirectML.dll not found at deps\directml\DirectML.dll - the artifact would fail DirectML init on Windows 10" + } + } + Copy-Item "cpp\configs\gtp_example.cfg" "release\" + Write-Output "--- release contents ---" + Get-ChildItem "release" | Select-Object Name, Length + + - name: Stage release directory (Linux) + if: runner.os == 'Linux' + shell: bash + run: | + mkdir -p release + cp cpp/build/katago release/ + cp deps/install/ort/lib/libonnxruntime*.so* release/ 2>/dev/null || true + # EP-specific runtime libs (TensorRT/CUDA/ROCm, etc.) go here once wired up. + cp cpp/configs/gtp_example.cfg release/ + # katago's build-time DT_RUNPATH points at the CI workspace + # (deps/install/ort/lib), which no longer exists once the artifact is downloaded + # elsewhere. Rewrite it to $ORIGIN so the binary finds the sibling + # libonnxruntime.so* in the release dir, matching the Windows DLL convention. + if ! command -v patchelf >/dev/null 2>&1; then + # Ubuntu runners have sudo; the NGC TensorRT container runs as root without it. + if command -v sudo >/dev/null 2>&1; then sudo apt-get install -y patchelf >/dev/null; else apt-get install -y patchelf >/dev/null; fi + fi + patchelf --set-rpath '$ORIGIN' release/katago + ls -la release diff --git a/.github/actions/onnx-prepare-ort/action.yml b/.github/actions/onnx-prepare-ort/action.yml new file mode 100644 index 0000000000..70fc3fde62 --- /dev/null +++ b/.github/actions/onnx-prepare-ort/action.yml @@ -0,0 +1,297 @@ +name: Prepare ONNX Runtime +description: > + Fetch or build an ONNX Runtime install tree carrying the requested execution provider (EP), + plus KataGo's own zlib/protobuf deps. Everything lands under deps/install/ and is + cached, so only the first run pays for ORT acquisition (from-source ORT builds are the + expensive case, 1-3h; prebuilt/nuget are minutes). +inputs: + ep: + description: Execution provider to wire up (cpu, directml, openvino, ...) + required: true + mode: + description: > + How to obtain ORT. 'prebuilt' = official release zip (CPU EP ships inside it), + 'nuget' = Microsoft.ML.OnnxRuntime.DirectML package, 'from-source' = build ORT + ourselves with the EP. + required: true + ort_version: + description: ORT release version for prebuilt/nuget modes + required: false + default: "1.28.0" + ort_ref: + description: ORT git ref (tag/SHA) for from-source mode + required: false + default: "" + ov_version: + description: OpenVINO toolkit version (from-source/openvino only) + required: false + default: "" + ov_url: + description: OpenVINO toolkit download URL (from-source/openvino only) + required: false + default: "" + dml_version: + description: >- + Microsoft.AI.DirectML redistributable version providing DirectML.dll (directml only). + Must satisfy the DirectML dependency declared by the Microsoft.ML.OnnxRuntime.DirectML + package for ort_version, so check it when bumping ort_version. + required: false + default: "1.15.4" + pb_version: + description: protobuf version built for KataGo (3.x, no abseil dependency) + required: false + default: "3.21.12" + pb_tag: + description: > + protobuf release tag for pb_version. protobuf 3.x tags drop the major (3.21.12 + -> v21.12), so this cannot be derived from pb_version. + required: false + default: "21.12" + zlib_version: + description: zlib version built for KataGo + required: false + default: "1.3.1" + +outputs: + ort_root: + description: Path to the prepared ORT install tree + value: ${{ github.workspace }}/deps/install/ort + +runs: + using: composite + steps: + # --------------------------------------------------------------------------- + # Common deps: zlib + protobuf, always built from source and cached separately + # from the ORT tree so a from-source ORT cache miss does not rebuild them. + # --------------------------------------------------------------------------- + - name: Restore common-dep cache + id: cache-common + uses: actions/cache@v4 + with: + path: | + deps/install/zlib + deps/install/protobuf + key: onnx-common-${{ runner.os }}-pb-${{ inputs.pb_version }}-zl-${{ inputs.zlib_version }} + + - name: Build zlib (static, Windows) + if: steps.cache-common.outputs.cache-hit != 'true' && runner.os == 'Windows' + shell: pwsh + run: | + curl.exe -L -o "$env:RUNNER_TEMP\zlib.tar.gz" "https://github.com/madler/zlib/releases/download/v${{ inputs.zlib_version }}/zlib-${{ inputs.zlib_version }}.tar.gz" + tar -xzf "$env:RUNNER_TEMP\zlib.tar.gz" -C "$env:RUNNER_TEMP" + cmake -S "$env:RUNNER_TEMP\zlib-${{ inputs.zlib_version }}" -B "$env:RUNNER_TEMP\zlib-build" -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\deps\install\zlib + cmake --build "$env:RUNNER_TEMP\zlib-build" + cmake --install "$env:RUNNER_TEMP\zlib-build" + + - name: Build zlib (static, Linux) + if: steps.cache-common.outputs.cache-hit != 'true' && runner.os == 'Linux' + shell: bash + run: | + curl -L -o "$RUNNER_TEMP/zlib.tar.gz" "https://github.com/madler/zlib/releases/download/v${{ inputs.zlib_version }}/zlib-${{ inputs.zlib_version }}.tar.gz" + tar -xzf "$RUNNER_TEMP/zlib.tar.gz" -C "$RUNNER_TEMP" + cmake -S "$RUNNER_TEMP/zlib-${{ inputs.zlib_version }}" -B "$RUNNER_TEMP/zlib-build" -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$GITHUB_WORKSPACE/deps/install/zlib" + cmake --build "$RUNNER_TEMP/zlib-build" + cmake --install "$RUNNER_TEMP/zlib-build" + + - name: Build protobuf (static, /MD, Windows) + if: steps.cache-common.outputs.cache-hit != 'true' && runner.os == 'Windows' + shell: pwsh + run: | + curl.exe -L -o "$env:RUNNER_TEMP\pb.tar.gz" "https://github.com/protocolbuffers/protobuf/releases/download/v${{ inputs.pb_tag }}/protobuf-cpp-${{ inputs.pb_version }}.tar.gz" + tar -xzf "$env:RUNNER_TEMP\pb.tar.gz" -C "$env:RUNNER_TEMP" + # protobuf_MSVC_STATIC_RUNTIME=OFF is REQUIRED: the protobuf default (/MT) would + # clash with KataGo's /MD Release build (LNK2038) when linking libprotobuf statically. + cmake -S "$env:RUNNER_TEMP\protobuf-${{ inputs.pb_version }}" -B "$env:RUNNER_TEMP\pb-build" -G Ninja ` + -DCMAKE_BUILD_TYPE=Release ` + -Dprotobuf_BUILD_TESTS=OFF ` + -Dprotobuf_BUILD_SHARED_LIBS=OFF ` + -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ` + -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\deps\install\protobuf + cmake --build "$env:RUNNER_TEMP\pb-build" + cmake --install "$env:RUNNER_TEMP\pb-build" + + - name: Build protobuf (static, Linux) + if: steps.cache-common.outputs.cache-hit != 'true' && runner.os == 'Linux' + shell: bash + run: | + curl -L -o "$RUNNER_TEMP/pb.tar.gz" "https://github.com/protocolbuffers/protobuf/releases/download/v${{ inputs.pb_tag }}/protobuf-cpp-${{ inputs.pb_version }}.tar.gz" + tar -xzf "$RUNNER_TEMP/pb.tar.gz" -C "$RUNNER_TEMP" + cmake -S "$RUNNER_TEMP/protobuf-${{ inputs.pb_version }}" -B "$RUNNER_TEMP/pb-build" -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -Dprotobuf_BUILD_TESTS=OFF \ + -Dprotobuf_BUILD_SHARED_LIBS=OFF \ + -DCMAKE_INSTALL_PREFIX="$GITHUB_WORKSPACE/deps/install/protobuf" + cmake --build "$RUNNER_TEMP/pb-build" + cmake --install "$RUNNER_TEMP/pb-build" + + # --------------------------------------------------------------------------- + # ONNX Runtime install tree, cached per (os, ep, version/ref). + # --------------------------------------------------------------------------- + - name: Restore ORT cache + id: cache-ort + uses: actions/cache@v4 + with: + path: deps/install/ort + # ov_version is part of the key: an ORT built against one OpenVINO toolkit must + # not be restored when the toolkit version is bumped (empty for non-OpenVINO rows). + key: onnx-ort-${{ runner.os }}-${{ inputs.ep }}-${{ inputs.ort_version }}-${{ inputs.ort_ref }}-ov-${{ inputs.ov_version }} + + # --- prebuilt: official ORT release package (CPU EP ships inside it): zip on Windows, tgz on Linux --- + - name: Fetch prebuilt ORT (Windows) + if: inputs.mode == 'prebuilt' && runner.os == 'Windows' && steps.cache-ort.outputs.cache-hit != 'true' + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path "deps\install\ort" | Out-Null + curl.exe -sfL -o "$env:RUNNER_TEMP\ort.zip" "https://github.com/microsoft/onnxruntime/releases/download/v${{ inputs.ort_version }}/onnxruntime-win-x64-${{ inputs.ort_version }}.zip" + Expand-Archive -Path "$env:RUNNER_TEMP\ort.zip" -DestinationPath "$env:RUNNER_TEMP\ort" -Force + $inner = Get-ChildItem "$env:RUNNER_TEMP\ort" -Directory | Select-Object -First 1 + if ($inner) { + Get-ChildItem $inner.FullName | Move-Item -Destination "deps\install\ort" -Force + Remove-Item $inner.FullName -Recurse -Force + } + Remove-Item "$env:RUNNER_TEMP\ort.zip" -Force + # Hoist lib/*.dll into bin/ too: the release-staging step globs bin/. + New-Item -ItemType Directory -Force -Path "deps\install\ort\bin" | Out-Null + Get-ChildItem "deps\install\ort\lib\*.dll" -ErrorAction SilentlyContinue | Copy-Item -Destination "deps\install\ort\bin" -Force + + - name: Fetch prebuilt ORT (Linux) + if: inputs.mode == 'prebuilt' && runner.os == 'Linux' && steps.cache-ort.outputs.cache-hit != 'true' + shell: bash + run: | + mkdir -p deps/install/ort + curl -sfL -o "$RUNNER_TEMP/ort.tgz" "https://github.com/microsoft/onnxruntime/releases/download/v${{ inputs.ort_version }}/onnxruntime-linux-x64-${{ inputs.ort_version }}.tgz" + tar -xzf "$RUNNER_TEMP/ort.tgz" -C deps/install/ort --strip-components=1 + # No lib/*.dll hoist is needed here: Linux resolves libonnxruntime.so through the + # binary's DT_RUNPATH, which onnx-build-katago rewrites to $ORIGIN at staging time. + ls deps/install/ort + + # --- nuget: Microsoft.ML.OnnxRuntime.DirectML package (DirectML EP) --- + - name: Fetch DirectML NuGet package (Windows) + if: inputs.mode == 'nuget' && runner.os == 'Windows' && steps.cache-ort.outputs.cache-hit != 'true' + shell: pwsh + run: | + $src = "$env:RUNNER_TEMP\dml" + New-Item -ItemType Directory -Force -Path "$src" | Out-Null + curl.exe -sfL -o "$src\dml.nupkg" "https://api.nuget.org/v3-flatcontainer/microsoft.ml.onnxruntime.directml/${{ inputs.ort_version }}/microsoft.ml.onnxruntime.directml.${{ inputs.ort_version }}.nupkg" + tar -xzf "$src\dml.nupkg" -C "$src" + $root = "deps\install\ort" + New-Item -ItemType Directory -Force -Path "$root\include","$root\lib","$root\bin" | Out-Null + Copy-Item "$src\build\native\include\*" "$root\include" -Force + Copy-Item "$src\runtimes\win-x64\native\onnxruntime.lib" "$root\lib" -Force + Get-ChildItem "$src\runtimes\win-x64\native\*.dll" | Copy-Item -Destination "$root\lib" -Force + Get-ChildItem "$root\lib\*.dll" | Copy-Item -Destination "$root\bin" -Force + + # NOTE: like the OpenVINO fetch below, this runs even on an ORT cache hit. DirectML.dll + # comes from the Microsoft.AI.DirectML redistributable (a dependency of the ORT DirectML + # package), not from deps/install/ort, so a cache-hit run would otherwise stage an artifact + # with no DirectML.dll in it - exactly the Windows 10 failure that orphaned DirectML.dll + # causes. DirectML.dll is delay-loaded by ORT, so it must sit next to onnxruntime.dll. + - name: Fetch DirectML runtime (Windows) + if: inputs.ep == 'directml' && runner.os == 'Windows' + shell: pwsh + run: | + $src = "$env:RUNNER_TEMP\dmlrt" + New-Item -ItemType Directory -Force -Path "$src" | Out-Null + curl.exe -sfSL -o "$src\dml.nupkg" "https://api.nuget.org/v3-flatcontainer/microsoft.ai.directml/${{ inputs.dml_version }}/microsoft.ai.directml.${{ inputs.dml_version }}.nupkg" + if ($LASTEXITCODE -ne 0) { throw "Download of Microsoft.AI.DirectML ${{ inputs.dml_version }} failed (curl exit $LASTEXITCODE)" } + tar -xzf "$src\dml.nupkg" -C "$src" + if ($LASTEXITCODE -ne 0) { throw "Extraction of Microsoft.AI.DirectML ${{ inputs.dml_version }} failed (tar exit $LASTEXITCODE)" } + $dll = "$src\bin\x64-win\DirectML.dll" + if (-not (Test-Path $dll)) { throw "bin/x64-win/DirectML.dll not found in Microsoft.AI.DirectML ${{ inputs.dml_version }}" } + New-Item -ItemType Directory -Force -Path "deps\directml" | Out-Null + Copy-Item $dll "deps\directml\DirectML.dll" -Force + + # --- from-source: build ORT ourselves with the requested EP --- + - name: Checkout ONNX Runtime source + if: inputs.mode == 'from-source' && steps.cache-ort.outputs.cache-hit != 'true' + uses: actions/checkout@v4 + with: + repository: microsoft/onnxruntime + ref: ${{ inputs.ort_ref }} + path: deps/onnxruntime + submodules: recursive + + # NOTE: unlike the ORT build steps, this fetch runs even on an ORT cache hit. The + # OpenVINO runtime DLLs under deps/openvino are staged into the release artifact by + # onnx-build-katago, so skipping the fetch on cache-hit runs would silently ship an + # artifact with no OpenVINO runtime in it. + - name: Fetch OpenVINO toolkit (Windows) + if: inputs.mode == 'from-source' && inputs.ep == 'openvino' && runner.os == 'Windows' + shell: pwsh + run: | + $zip = "$env:RUNNER_TEMP\openvino.zip" + $dest = "deps\openvino" + Invoke-WebRequest -Uri "${{ inputs.ov_url }}" -OutFile $zip + Expand-Archive -Path $zip -DestinationPath $dest + # The zip contains a single top-level directory of the same name; hoist its contents up. + $inner = Get-ChildItem -Path $dest -Directory | Select-Object -First 1 + if ($inner) { + Get-ChildItem -Path $inner.FullName | Move-Item -Destination $dest -Force + Remove-Item -Path $inner.FullName -Recurse -Force + } + Remove-Item -Path $zip -Force + $sv = Get-ChildItem "deps\openvino" -Recurse -Filter "setupvars.bat" | Select-Object -First 1 + if (-not $sv) { throw "setupvars.bat not found under deps\openvino" } + echo "OV_SETUPVARS=$($sv.FullName)" >> $env:GITHUB_ENV + + - name: Build ONNX Runtime with OpenVINO EP + if: inputs.mode == 'from-source' && inputs.ep == 'openvino' && steps.cache-ort.outputs.cache-hit != 'true' + shell: cmd + working-directory: deps/onnxruntime + run: | + call "%OV_SETUPVARS%" + python tools\ci_build\build.py --build_dir build --config Release --use_openvino GPU --build_shared_lib --skip_tests --parallel --compile_no_warning_as_error --cmake_generator Ninja --cmake_extra_defines CMAKE_INSTALL_PREFIX=%CD%\..\install\ort + if errorlevel 1 exit /b 1 + cmake --install build\Release --config Release + if errorlevel 1 exit /b 1 + + - name: Build ONNX Runtime with TensorRT EP (Linux container) + if: inputs.mode == 'from-source' && inputs.ep == 'tensorrt' && runner.os == 'Linux' && steps.cache-ort.outputs.cache-hit != 'true' + shell: bash + working-directory: deps/onnxruntime + run: | + # Runs inside the official NGC TensorRT container + # (nvcr.io/nvidia/tensorrt:25.03-py3 = CUDA 12.8 + TensorRT 10.9, the combo ORT is + # tested against), which preinstalls CUDA/cuDNN/TensorRT under /usr/local/cuda and + # /usr/lib/x86_64-linux-gnu. The container ships cmake + python3; the workflow's + # bootstrap step adds ninja. github-hosted runners have no GPU, so this verifies + # build + EP wiring only - real GPU inference is validated on a GPU machine. + # Build only for sm_89 (RTX 4090): ORT's default 10-arch matrix is huge and slow + # on a no-GPU CI runner. Tune per the GPU you validate on. + python3 tools/ci_build/build.py --build_dir build --config Release \ + --use_tensorrt --use_cuda \ + --cuda_home /usr/local/cuda \ + --cudnn_home /usr/lib/x86_64-linux-gnu \ + --tensorrt_home /usr/lib/x86_64-linux-gnu \ + --build_shared_lib --skip_tests --parallel \ + --cmake_generator Ninja --allow_running_as_root --skip_submodule_sync \ + --cmake_extra_defines "CMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/deps/install/ort" "CMAKE_CUDA_ARCHITECTURES=89" + cmake --install build/Release --config Release + + # NOTE: MIGraphX from-source build slots in here once validated (needs ROCm; deferred). + + # Save caches explicitly: actions/cache@v4's post-save does not reliably run inside + # composite actions, so without these every run would rebuild zlib/protobuf and ORT. + # Only save when this run actually built the dep (restore cache-missed); the key must + # match the restore key above. + - name: Save common-dep cache + if: steps.cache-common.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: | + deps/install/zlib + deps/install/protobuf + key: onnx-common-${{ runner.os }}-pb-${{ inputs.pb_version }}-zl-${{ inputs.zlib_version }} + + - name: Save ORT cache + if: steps.cache-ort.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: deps/install/ort + key: onnx-ort-${{ runner.os }}-${{ inputs.ep }}-${{ inputs.ort_version }}-${{ inputs.ort_ref }}-ov-${{ inputs.ov_version }} + + - name: Report ORT install tree + shell: bash + run: | + ls -la deps/install/ort + ls deps/install/ort/bin 2>/dev/null || ls deps/install/ort/lib 2>/dev/null || true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45c69c4bbe..301e79e9fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,6 +54,139 @@ jobs: name: katago-linux-opencl path: cpp/katago + # Compile-only ROCm check: GitHub runners have no AMD GPU, but the ROCm backend builds + # fine without one and runtests exercises no GPU code. Pinned to ROCm 6.4 (the documented + # minimum supported version) so this also catches changes that compile on newer ROCm but + # break the oldest supported one's headers/APIs. + # Three things this does not cover. The Composable Kernel fused attention glue is skipped, + # because ck_tile's headers come from the composablekernel-dev package and nothing installed + # below depends on it, so the configure takes its "ck_tile headers not found" branch and builds + # only the built-in attention kernels. The newer ROCm versions that the Windows and TheRock + # paths are developed against are not built here either. Nor is anything run on a GPU. + build-linux-rocm: + # Pinned rather than ubuntu-latest: the apt source line below is release-specific ("noble"). + runs-on: ubuntu-24.04 + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Free disk space + # The ROCm dev packages unpack to ~11 GB (mostly rocBLAS/MIOpen kernel libraries), so + # clear unrelated preinstalled toolchains to make room on the runner's root disk. + run: | + sudo rm -rf /usr/local/lib/android /usr/share/dotnet + + - name: Install ROCm 6.4 and build dependencies + run: | + sudo apt-get update + sudo apt-get install -y cmake build-essential zlib1g-dev libzip-dev wget gnupg + sudo mkdir -p /etc/apt/keyrings + wget -q https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null + echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.4.3 noble main" | sudo tee /etc/apt/sources.list.d/rocm.list + # AMD's documented apt pin. Without it, Ubuntu's own ancient standalone "hipcc" + # package (which installs to /usr/bin) outversions repo.radeon.com's, and the HIP + # cmake config then fails on the missing /opt/rocm/bin/hipcc. + printf 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600\n' | sudo tee /etc/apt/preferences.d/rocm-pin-600 + sudo apt-get update + sudo apt-get install -y hip-dev hipcc hipblas-dev miopen-hip-dev + + - name: Configure CMake + working-directory: cpp + run: | + # One CDNA/wave64 arch (gfx942) and one RDNA3/wave32 arch (gfx1100): with no GPU + # present, the arch list only determines which device code gets compiled, so this + # covers both wavefront-size compile paths. + cmake . -DUSE_BACKEND=ROCM -DCMAKE_HIP_ARCHITECTURES="gfx942;gfx1100" -DCMAKE_BUILD_TYPE=Release + + - name: Build + working-directory: cpp + run: | + make -j$(nproc) + + - name: Run tests + working-directory: cpp + run: | + ./katago version + ./katago runtests + + # Compile-only Windows ROCm check via AMD TheRock (the toolchain Compiling.md documents for + # Windows). No AMD GPU on the runner, so this covers configure+compile+link and the GPU-less + # runtests only - not GPU execution. Uses a pinned TheRock nightly dist tarball. Bump the + # version below deliberately, since toolchain drift is exactly what this job is meant to catch. + # The Composable Kernel fused attention path is not covered at the version pinned below, whose + # ck_tile the configure-time probe rejects on Windows (see + # external/composable_kernel_fmha/README.md). This is specific to that ck_tile rather than to + # Windows or MSVC in general, and earlier TheRock versions do build the CK kernels here, so on a + # version where the probe accepts them this job covers them too. + build-windows-rocm: + # windows-2022: KataGo's CMake requires a v143 MSVC toolset (14.3x/14.4x) for HIP clang + # compatibility, which this image ships. + runs-on: windows-2022 + timeout-minutes: 90 + permissions: + contents: read + env: + THEROCK_VERSION: 7.14.0a20260612 + THEROCK_FAMILY: gfx110X-all + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Cache TheRock tarball + id: cache-therock + uses: actions/cache@v4 + with: + path: C:\TheRock\therock-dist.tar.gz + key: therock-windows-${{ env.THEROCK_FAMILY }}-${{ env.THEROCK_VERSION }} + + - name: Download TheRock dist tarball + if: steps.cache-therock.outputs.cache-hit != 'true' + run: | + New-Item -ItemType Directory -Force -Path C:\TheRock | Out-Null + curl.exe -fsSL --retry 3 -o C:\TheRock\therock-dist.tar.gz ` + "https://therock-nightly-tarball.s3.amazonaws.com/therock-dist-windows-$env:THEROCK_FAMILY-$env:THEROCK_VERSION.tar.gz" + + - name: Extract TheRock + run: | + New-Item -ItemType Directory -Force -Path C:\TheRock\build | Out-Null + tar -xzf C:\TheRock\therock-dist.tar.gz -C C:\TheRock\build + + - name: Set ROCm environment (per Compiling.md) + run: | + Add-Content $env:GITHUB_ENV "HIP_PATH=C:/TheRock/build" + Add-Content $env:GITHUB_ENV "HIP_PLATFORM=amd" + Add-Content $env:GITHUB_ENV "HIP_DEVICE_LIB_PATH=C:/TheRock/build/lib/llvm/amdgcn/bitcode" + Add-Content $env:GITHUB_ENV "LLVM_PATH=C:/TheRock/build/lib/llvm" + Add-Content $env:GITHUB_PATH "C:\TheRock\build\bin" + Add-Content $env:GITHUB_PATH "C:\TheRock\build\lib\llvm\bin" + + - name: Install Ninja + run: choco install ninja -y --no-progress + + - name: Configure CMake + working-directory: cpp + # Single arch matching the tarball's gfx family - with no GPU present the arch list only + # determines which device code gets compiled. zlib is auto-fetched at configure time via + # the KATAGO_AUTO_FETCH_DEPS vcpkg mechanism (needs network + git, both present here). + # libzip is optional and auto-disables. + run: | + cmake . -G Ninja -DUSE_BACKEND=ROCM -DCMAKE_HIP_ARCHITECTURES=gfx1100 -DCMAKE_BUILD_TYPE=Release + + - name: Build + working-directory: cpp + run: | + ninja + + - name: Run tests + working-directory: cpp + run: | + .\katago.exe version + .\katago.exe runtests + build-macos: runs-on: macos-latest permissions: diff --git a/.github/workflows/onnx-backend.yml b/.github/workflows/onnx-backend.yml new file mode 100644 index 0000000000..1646b19ecf --- /dev/null +++ b/.github/workflows/onnx-backend.yml @@ -0,0 +1,204 @@ +# ONNX backend CI. Builds KataGo (USE_BACKEND=ONNX) against an ONNX Runtime carrying the +# requested execution provider, or EP, runs `katago runtests`, and uploads a self-contained +# runnable directory as an artifact for easy download. +# +# Execution providers differ only in how ONNX Runtime is obtained, and that difference lives +# in .github/actions/onnx-prepare-ort/action.yml (one row in the matrix below per EP): +# - prebuilt : official ORT release package, zip on Windows and tgz on Linux, with the +# CPU EP shipping inside it +# - nuget : Microsoft.ML.OnnxRuntime.DirectML package (DirectML EP) +# - from-source : ORT built from source with the EP (OpenVINO on Windows, TensorRT in an +# NGC container) +# +# Trigger policy by tier: +# - fast EPs (prebuilt/nuget, a few minutes) run on PR + master push + manual dispatch, +# so the ONNX backend keeps a cheap always-on regression guard. +# - slow EPs (from-source ORT builds, 1-3h) run only on manual dispatch, so they never +# burn CI minutes on every PR/commit. +# GitHub-hosted runners have no GPU, so from-source jobs only verify build and EP wiring. +# Real GPU inference must be validated on a GPU machine. +# +# Adding a backend takes one more matrix row plus teaching onnx-prepare-ort to fetch or build +# its ORT, and extending the release-staging step in onnx-build-katago if it ships extra +# runtimes. + +name: ONNX backend build & test + +on: + pull_request: + branches: [ master ] + paths: + - 'cpp/**' + - '.github/workflows/onnx-backend.yml' + - '.github/actions/**' + push: + branches: [ master ] + paths: + - 'cpp/**' + - '.github/workflows/onnx-backend.yml' + - '.github/actions/**' + workflow_dispatch: + +concurrency: + group: onnx-backend-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +env: + # from-source ORT pin. 1.29.0 has no release tag (VERSION_NUMBER is 1.29.0 but no + # v1.29.0 tag exists), so pin an exact commit rather than a branch, which would drift. + # Update it to build against a newer ORT snapshot. + ORT_REF: 7e76a52398ebf966bcbe4a10e552f438059edfce + OV_URL: https://storage.openvinotoolkit.org/repositories/openvino/packages/2026.2.1/windows/openvino_toolkit_windows_2026.2.1.21919.ede283a88e3_x86_64.zip + OV_VERSION: 2026.2.1 + +jobs: + build-fast: + name: ${{ matrix.ep }} (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 45 + strategy: + fail-fast: false + matrix: + include: + - { ep: cpu, os: windows-latest, mode: prebuilt, ort_version: "1.28.0" } + - { ep: cpu, os: ubuntu-latest, mode: prebuilt, ort_version: "1.28.0" } + - { ep: directml, os: windows-latest, mode: nuget, ort_version: "1.24.4" } + steps: + - uses: actions/checkout@v4 + + - name: Setup MSVC environment + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: x64 + + - name: Install Ninja (Windows) + if: runner.os == 'Windows' + run: choco install ninja -y --no-progress + + - name: Install Ninja (Linux) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Prepare ONNX Runtime (${{ matrix.ep }}) + uses: ./.github/actions/onnx-prepare-ort + with: + ep: ${{ matrix.ep }} + mode: ${{ matrix.mode }} + ort_version: ${{ matrix.ort_version }} + + - name: Build & test KataGo + uses: ./.github/actions/onnx-build-katago + with: + ort_root: ${{ github.workspace }}/deps/install/ort + ep: ${{ matrix.ep }} + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: katago-${{ runner.os }}-onnx-${{ matrix.ep }} + path: release/ + + build-slow: + # from-source ORT builds (1-3h) only on manual dispatch. + if: github.event_name == 'workflow_dispatch' + name: ${{ matrix.ep }} (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 300 + strategy: + fail-fast: false + matrix: + include: + - { ep: openvino, os: windows-latest, mode: from-source } + # - { ep: migraphx, os: ubuntu-latest, mode: from-source } # needs ROCm; deferred (no ROCm on hosted runners) + steps: + - uses: actions/checkout@v4 + + - name: Setup MSVC environment + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: x64 + + - name: Install Ninja (Windows) + if: runner.os == 'Windows' + run: choco install ninja -y --no-progress + + - name: Install Ninja (Linux) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Prepare ONNX Runtime (${{ matrix.ep }}) + uses: ./.github/actions/onnx-prepare-ort + with: + ep: ${{ matrix.ep }} + mode: ${{ matrix.mode }} + ort_ref: ${{ env.ORT_REF }} + ov_version: ${{ env.OV_VERSION }} + ov_url: ${{ env.OV_URL }} + + - name: Build & test KataGo + uses: ./.github/actions/onnx-build-katago + with: + ort_root: ${{ github.workspace }}/deps/install/ort + ep: ${{ matrix.ep }} + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: katago-${{ runner.os }}-onnx-${{ matrix.ep }} + path: release/ + + build-tensorrt: + # ORT from-source TensorRT build (1-2h), dispatch-only. Runs inside the official NGC + # TensorRT container (nvcr.io/nvidia/tensorrt:25.03-py3 = CUDA 12.8 + TensorRT 10.9, the + # combo ORT is built/tested against), so the CUDA/cuDNN/TensorRT SDKs are preinstalled + # and no SDK install step is needed. github-hosted runners have no GPU, so this job + # verifies build + EP wiring only; real GPU inference is validated on a GPU machine. + if: github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + timeout-minutes: 300 + container: + image: nvcr.io/nvidia/tensorrt:25.03-py3 + options: --user root + steps: + # The NGC image ships neither git nor node, and later steps are GitHub JS actions + # (cache, checkout, upload-artifact) that need node. Bootstrap both plus ninja first, + # then clone the repo by hand (checkout@v4 would run before node existed). + - name: Bootstrap container (git, node20, ninja) and checkout + run: | + apt-get update -qq + apt-get install -y -qq git ninja-build curl >/dev/null + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y -qq nodejs >/dev/null + node --version + # ORT 1.28 needs CMake >= 3.28; the NGC image ships 3.27. pip cmake lands in + # /usr/local/bin ahead of the bundled one. + pip3 install cmake >/dev/null + cmake --version | head -1 + # The workspace is a docker mount owned by a different uid, so git refuses it + # ("dubious ownership") when KataGo regenerates gitinfo.h during the build. + git config --global --add safe.directory '*' + git clone --depth 1 --branch "${GITHUB_REF_NAME}" "https://github.com/${GITHUB_REPOSITORY}.git" . + + - name: Prepare ONNX Runtime (tensorrt) + uses: ./.github/actions/onnx-prepare-ort + with: + ep: tensorrt + mode: from-source + ort_ref: ${{ env.ORT_REF }} + + - name: Build & test KataGo + uses: ./.github/actions/onnx-build-katago + with: + ort_root: ${{ github.workspace }}/deps/install/ort + ep: tensorrt + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: katago-Linux-onnx-tensorrt + path: release/ diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 0f5f442095..fecfca63ec 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -55,6 +55,8 @@ awei-mj - CUDA 13.0 support. Cheng Chang ("changcheng967") - Python script bugfix. Evgeny Kurnevsky ("kurnevsky") - Out-of-bounds write fix. Suqin Zhang ("zsqdx") - Testing and optimizations to TensorRT and other gpu performance, various other collaboration on model training. +"seniorfish" - For implementing the ONNX backend, including OpenVINO and DirectML support +"Looong01" - For implementing the ROCm backend for AMD GPUs. Separately from the authors of the content in this repo, additional special thanks to: Junyan Xu ("alreadydone") - for much testing and troubleshooting for Windows support diff --git a/Compiling.md b/Compiling.md index abe7de36fc..c601ceff07 100644 --- a/Compiling.md +++ b/Compiling.md @@ -33,6 +33,7 @@ As also mentioned in the instructions below but repeated here for visibility, if * If using the OpenCL backend, a modern GPU that supports OpenCL 1.2 or greater, or else something like [this](https://software.intel.com/en-us/opencl-sdk) for CPU. But if using CPU, Eigen should be better. * If using the CUDA backend, CUDA 11 or later and a compatible version of CUDNN based on your CUDA version (https://developer.nvidia.com/cuda-toolkit) (https://developer.nvidia.com/cudnn) and a GPU capable of supporting them. * If using the TensorRT backend, in addition to a compatible CUDA Toolkit (https://developer.nvidia.com/cuda-toolkit), you also need TensorRT (https://developer.nvidia.com/tensorrt) that is at least version 8.5. + * If using the ROCm backend, ROCm 6.4 or later (https://rocm.docs.amd.com/projects/install-on-linux/en/latest/) and a GPU capable of supporting it. Install the ROCm developer packages, not just the ROCm runtime packages. * If using the Eigen backend, Eigen3. With Debian packages, (i.e. apt or apt-get), this should be `libeigen3-dev`. * zlib, libzip. With Debian packages (i.e. apt or apt-get), these should be `zlib1g-dev`, `libzip-dev`. * If you want to do self-play training and research, probably Google perftools `libgoogle-perftools-dev` for TCMalloc or some other better malloc implementation. For unknown reasons, the allocation pattern in self-play with large numbers of threads and parallel games causes a lot of memory fragmentation under glibc malloc that will eventually run your machine out of memory, but better mallocs handle it fine. @@ -41,7 +42,7 @@ As also mentioned in the instructions below but repeated here for visibility, if * `git clone https://github.com/lightvector/KataGo.git` * Compile using CMake and make in the cpp directory: * `cd KataGo/cpp` - * `cmake . -DUSE_BACKEND=OPENCL` or `cmake . -DUSE_BACKEND=CUDA` or `cmake . -DUSE_BACKEND=TENSORRT` or `cmake . -DUSE_BACKEND=EIGEN` depending on which backend you want. + * `cmake . -DUSE_BACKEND=OPENCL` or `cmake . -DUSE_BACKEND=CUDA` or `cmake . -DUSE_BACKEND=TENSORRT` or `cmake . -DUSE_BACKEND=EIGEN` or `cmake . -DUSE_BACKEND=ROCM` 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. * Specify `-DUSE_AVX2=1` to also compile Eigen with AVX2 and FMA support, which will make it incompatible with old CPUs but much faster. (If you want to go further, you can also add `-DCMAKE_CXX_FLAGS='-march=native'` which will specialize to precisely your machine's CPU, but the exe might not run on other machines at all). @@ -54,6 +55,42 @@ As also mentioned in the instructions below but repeated here for visibility, if * 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 when you run it (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`). + * **ROCm backend (Linux) - additional notes:** + * Install ROCm following the [official guide](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/). Install the full developer stack (not just runtime): `sudo apt install rocm-dev miopen-hip-dev hipblas-dev rocblas-dev`. + * Build: + ``` + cd KataGo/cpp + mkdir build && cd build + cmake .. -DUSE_BACKEND=ROCM -DCMAKE_BUILD_TYPE=Release + make -j$(nproc) + ``` + No `-DCMAKE_PREFIX_PATH` is needed in the common case: the build auto-detects the ROCm + install location, preferring the newer `/opt/rocm/core-/` layout used since + ROCm ~7.9 (picking the highest version present) and falling back to the older flat + `/opt/rocm/` layout. Pass `-DCMAKE_PREFIX_PATH=...` explicitly to override - this is what to + use if your ROCm lives somewhere else entirely. It should name the install **prefix**, i.e. + the directory containing `include/hip/hip_runtime.h`, not a subdirectory of it. + * Always configure in a clean build directory. A `CMakeCache.txt` left over from an earlier + configure (especially one for a different backend) suppresses the automatic selection of + `hipcc` and of the GPU architecture list, which otherwise shows up as strange compile errors + like `unrecognized command-line option '-Xarch_host'`. + * GPU architecture: by default the build targets a broad set of AMD GPU architectures + (Vega 20, CDNA, and all RDNA generations) in a single "fat" binary, probing the installed compiler for + which ones it actually supports, so the resulting `katago` runs on more than just the + machine it was built on. Pass `-DCMAKE_HIP_ARCHITECTURES=gfx1100` (replace with your GPU's + gfx target) to build for only your own GPU instead, which is faster to compile. + * The build bakes the resolved ROCm lib directory into the binary's RPATH, so the built + `katago` doesn't depend on `/opt/rocm` still pointing at the same install later (e.g. after + installing a different ROCm version) or on `LD_LIBRARY_PATH` being set when run. + * On first run, MIOpen will search for optimal convolution algorithms for your specific GPU and network size. This may take up to a minute and results are cached (compiled kernels in `~/.cache/miopen/`, the tuning find-db in `~/.config/miopen/`) for subsequent runs. + * **Transformer/attention models (model version 17+):** supported on all architectures via a + built-in kernel. If a matching version of AMD's Composable Kernel (CK, packaged as + `composablekernel-dev` / `amdrocm-ck*`) is also installed, the build additionally enables a fused-attention fast path + (measured ~2x faster on a gfx1100/RX 7900 XTX) for CDNA and RDNA3/RDNA3.5/RDNA4 GPUs - + RDNA1/RDNA2 always use the built-in kernel, as does any GPU if the fused path isn't + available or is explicitly disabled with `rocmDisableFusedAttention = true` in the config. + See `cpp/external/composable_kernel_fmha/README.md` for details. + ## Windows * TLDR: * Building from source on Windows is actually a bit tricky, depending on what version you're building, there's not necessarily a super-fast way. @@ -117,6 +154,57 @@ As also mentioned in the instructions below but repeated here for visibility, if * 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`). + * **ROCm backend (Windows) - building via AMD TheRock:** + * The ROCm (MIOpen) backend supports Windows via [AMD TheRock](https://github.com/ROCm/TheRock) (tested with TheRock 7.13 / ROCm 7.13, RX 7900 XTX / gfx1100), including transformer/attention models (model version 17+) and the optional Composable Kernel (CK) fused-attention fast path. + * **Prerequisites:** + * Download [AMD TheRock](https://github.com/ROCm/TheRock) and extract it to e.g. `C:\TheRock\build`, adjusting the paths below if you extract elsewhere. + * Install **Visual Studio Build Tools or Community** with the "Desktop development with C++" workload, for the MSVC toolchain and Windows SDK the HIP compiler needs. A **v143 toolset (MSVC 14.3x or 14.4x)** must be among the installed toolsets - newer toolsets alone (14.5x+) are not accepted by the HIP clang compatibility check. If more than one is installed side by side, `CMakeLists.txt` automatically probes them at configure time and picks a compatible one itself (see "Fully automatic" below), no manual toolset selection needed. + * Install [Ninja](https://ninja-build.org) build tool: `winget install Ninja-build.Ninja`. + * Set the following **system environment variables** (via System Properties -> Advanced -> Environment Variables): + ``` + HIP_PATH=C:/TheRock/build + HIP_PLATFORM=amd + HIP_DEVICE_LIB_PATH=C:/TheRock/build/lib/llvm/amdgcn/bitcode + LLVM_PATH=C:/TheRock/build/lib/llvm + ``` + * Add to system `PATH`: + ``` + C:\TheRock\build\bin + C:\TheRock\build\lib\llvm\bin + ``` + * Reboot after setting environment variables so they take effect system-wide. + * **Build - fully automatic**, just like Linux: + ``` + cd KataGo/cpp + mkdir build + cd build + cmake .. -G Ninja -DUSE_BACKEND=ROCM -DCMAKE_BUILD_TYPE=Release + ninja + ``` + No manual environment setup, no `-D` flags, no `vcvarsall`, and no external package manager + install are needed beyond the prerequisites above. `CMakeLists.txt` handles the rest of the + Windows-specific setup automatically at configure/build time: + * **MSVC toolset selection:** if more than one MSVC toolset is installed side by side, a + newer one can conflict with TheRock's bundled clang (newer MSVC STL headers are not yet + compatible with it). `CMakeLists.txt` finds the installed v143-family toolsets via + `vswhere` and probes each with a real compile until one works, with no user action + needed. + * **zlib:** TheRock's Windows package ships `zlib.h` but (as of 7.13) no longer ships a + linkable `.lib`. `CMakeLists.txt` automatically bootstraps a local + [vcpkg](https://github.com/microsoft/vcpkg) clone under `/deps/vcpkg` (this + needs internet access and `git` on `PATH` the first time; subsequent reconfigures reuse + the same local install) and builds zlib through it, via the + `KATAGO_AUTO_FETCH_DEPS` mechanism (`KATAGO_DEPS_DIR` overrides the location, e.g. to + share fetched deps across multiple build directories). + * **Runtime DLLs:** all the ROCm/HIP DLLs (`amdhip64_7.dll`, `MIOpen.dll`, `hipblas.dll`, + `rocblas.dll` + its `library/` subfolder, `libhipblaslt.dll` + its `library/` subfolder, + `amdocl64.dll`, `hiprtc*.dll`, `amd_comgr*.dll`) and the vcpkg zlib runtime DLL are + automatically copied next to `katago.exe` as a post-build step - nothing to copy by hand. + `ck_tile` headers for the optional fused-attention path are still auto-detected from + `HIP_PATH` the same way as on Linux. + * **First-run note:** MIOpen will search for optimal convolution algorithms on the first run. This may take 45+ seconds per network configuration and results are cached in `%USERPROFILE%\.miopen\` for subsequent runs. Do not terminate the process during this initial tuning. + * **Performance note:** GPU utilization on Windows may be somewhat lower than on Linux due to the Windows Driver Model (WDDM) adding overhead to GPU kernel submissions. This is a known limitation of ROCm on Windows. For example, the CK fused-attention path measured ~2x faster than the built-in kernel on Linux (gfx1100), but only ~1.3x faster on Windows on the same GPU. + ## MacOS * TLDR (Metal backend - recommended for most users, hybrid CPU+GPU+Neural Engine for maximum throughput): ``` @@ -152,3 +240,49 @@ As also mentioned in the instructions below but repeated here for visibility, if * Pre-trained neural nets are available at [the main training website](https://katagotraining.org/). * 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 when you run it (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`). + +## ONNX Runtime backend (optional) +The `ONNX` backend loads the usual KataGo neural net files, but runs them using [ONNX Runtime](https://onnxruntime.ai/), which supports many kinds of hardware through its "execution providers". This is mainly useful for hardware that has no native KataGo backend, such as Intel GPUs and NPUs (via the OpenVINO provider). If you have an NVIDIA GPU, use KataGo's native CUDA or TensorRT backends instead - they will almost certainly be faster. + +### Execution providers + +Set `onnxProvider` in your config to choose the execution provider: + +| Provider | Status | Platform | ONNX Runtime needed | Also needs at runtime | +|---|---|---|---|---| +| `openvino` | Tested (Windows, Intel GPU and NPU) | Windows / Linux | built from source with `--use_openvino GPU` | OpenVINO runtime, TBB | +| `cpu` | Tested | All | official prebuilt package | - | +| `cuda` | Lightly tested (Linux) | Windows / Linux | official prebuilt GPU package (`gpu_cuda12`), or built with `--use_cuda` | CUDA, cuDNN 9 | +| `tensorrt` | Lightly tested (Linux) | Windows / Linux | official prebuilt GPU package (`gpu_cuda12`), or built with `--use_tensorrt` | CUDA, TensorRT 10 | +| `migraphx` | Untested | Linux (AMD) | built from source with `--use_migraphx` | MIGraphX | +| `directml` | Tested (Windows) | Windows | Microsoft.ML.OnnxRuntime.DirectML package | DirectML | +| `coreml` | Not working yet | macOS | built from source with `--use_coreml` | CoreML | + +"Tested" means KataGo's neural net tests give correct results with this provider. "Lightly tested" means correctness was checked but performance was not. "Untested" providers are implemented but have never been run - if you try one, sanity-check its results, for example against the `cpu` provider. The `directml` provider may also be slow, because it prefers fixed tensor sizes while KataGo's search varies its batch size. + +> **Note**: This backend is more involved to set up than KataGo's other backends. Most execution providers are not included in the official prebuilt ONNX Runtime packages - in particular, using the OpenVINO provider requires building ONNX Runtime from source with that provider enabled. + +### Requirements + * Everything KataGo normally needs (CMake, a C++17 compiler, zlib). + * ONNX Runtime including the execution provider you want - either an official prebuilt package, or built from source with the provider enabled (see the table above and https://onnxruntime.ai/docs/install/). + * Protobuf 3.x, such that CMake's `find_package(Protobuf)` succeeds. On Linux the usual system packages work. If you build ONNX Runtime from source, the protobuf inside its build tree also works. + * For the OpenVINO provider, the OpenVINO toolkit. + +### Compile + * Point CMake at your ONNX Runtime install and select the backend: + ``` + cmake -S KataGo/cpp -B KataGo/cpp/build -DUSE_BACKEND=ONNX -DONNXRUNTIME_ROOT= + cmake --build KataGo/cpp/build -j + ``` + * `ONNXRUNTIME_ROOT` is the directory containing ONNX Runtime's `include/` and `lib/`. + * If CMake does not find protobuf on its own, also pass `-DProtobuf_PROTOC_EXECUTABLE=`, `-DProtobuf_INCLUDE_DIR=`, and `-DProtobuf_LIBRARY=`. + * As with other backends, `-DNO_GIT_REVISION=1` avoids embedding the git hash, and `-DBUILD_DISTRIBUTED=1` enables contributing to distributed training. + +### Runtime + * The `onnxruntime` shared library must be next to the executable or on your library path. + * For the OpenVINO provider, the OpenVINO runtime DLLs (`openvino.dll`, `openvino_intel_gpu_plugin.dll`, `tbb12.dll`, `cache.json`, etc.) must also be next to the executable or on the system path. + * For the DirectML provider, `DirectML.dll` 1.8.0 or newer (from the Microsoft.AI.DirectML package) must be next to `onnxruntime.dll`. Without it, Windows 10 falls back to its much older inbox DirectML and the provider fails at startup. + * Choose the provider and its options with the `onnx*` keys in your config, e.g. `onnxProvider = openvino` and `onnxOpenVINODeviceType = GPU`. The ONNX section of `configs/gtp_example.cfg` documents all the options. + +### Working with .onnx files +This backend and the TensorRT backend can also write out the ONNX graph they build (`katago dumponnx`) and load a `.onnx` file as a model in place of the `.bin.gz`, including one produced by other tooling. See **[ONNX_Model_Files.md](docs/ONNX_Model_Files.md)** for the commands and the model file format. diff --git a/LICENSE b/LICENSE index 72026504e5..9dcc7c75e1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,10 +1,11 @@ The code in this repository currently relies on several other libraries, parts of libraries, -or external files: clblast, filesystem-1.5.8, half-2.1.0, httplib, katagocoreml (which itself -vendors components from Apple's coremltools and the FP16 library), macos (Swift CMake modules), -mozilla-cacerts, nlohmann_json, sgfmill, onnx, and tclap-1.2.5. For the licenses for those libraries -and/or files, see the individual readmes and/or license files for each one within their respective -subdirectories within cpp/external. Additionally, cpp/core/sha2.cpp derives from another piece of -external code and embeds its own license within that file. +or external files: clblast, composable_kernel_fmha, cudnn-frontend, filesystem-1.5.8, half-2.2.0, +httplib, katagocoreml (which itself vendors components from Apple's coremltools and the FP16 +library), macos (Swift CMake modules), mozilla-cacerts, nlohmann_json, sgfmill, onnx, and +tclap-1.2.5. For the licenses for those libraries and/or files, see the individual readmes and/or +license files for each one within their respective subdirectories within cpp/external. +Additionally, cpp/core/sha2.cpp derives from another piece of external code and embeds its own +license within that file. Some parts of python/katago/model_pytorch.py and a few other files, where noted, are modifications of code from other open source authors. diff --git a/README.md b/README.md index 4ea665e7f5..f34a1628c7 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,30 @@ # KataGo -* [Overview](#overview) -* [Training History and Research](#training-history-and-research) -* [Where To Download Stuff](#where-to-download-stuff) -* [Setting Up and Running KataGo](#setting-up-and-running-katago) - * [GUIs](#guis) - * [Windows and Linux](#windows-and-linux) - * [MacOS](#macos) - * [OpenCL vs CUDA vs TensorRT vs Eigen](#opencl-vs-cuda-vs-tensorrt-vs-eigen) - * [How To Use](#how-to-use) - * [Tuning for Performance](#tuning-for-performance) - * [Common Questions and Issues](#common-questions-and-issues) - * [Issues with specific GPUs or GPU drivers](#issues-with-specific-gpus-or-gpu-drivers) - * [Common Problems](#common-problems) - * [Other Questions](#other-questions) -* [Features for Developers](#features-for-developers) - * [GTP Extensions](#gtp-extensions) - * [Analysis Engine](#analysis-engine) -* [Compiling KataGo](#compiling-katago) -* [Source Code Overview](#source-code-overview) -* [Selfplay Training](#selfplay-training) -* [Contributors](#contributors) -* [License](#license) +- [KataGo](#katago) + - [Overview](#overview) + - [Training History and Research and Docs](#training-history-and-research-and-docs) + - [Where To Download Stuff](#where-to-download-stuff) + - [Setting Up and Running KataGo](#setting-up-and-running-katago) + - [GUIs](#guis) + - [Windows and Linux](#windows-and-linux) + - [MacOS](#macos) + - [OpenCL vs CUDA vs TensorRT vs ROCm vs Eigen](#opencl-vs-cuda-vs-tensorrt-vs-rocm-vs-eigen) + - [How To Use](#how-to-use) + - [Human-style Play and Analysis](#human-style-play-and-analysis) + - [Other Commands:](#other-commands) + - [Tuning for Performance](#tuning-for-performance) + - [Common Questions and Issues](#common-questions-and-issues) + - [Issues with specific GPUs or GPU drivers](#issues-with-specific-gpus-or-gpu-drivers) + - [Common Problems](#common-problems) + - [Other Questions](#other-questions) + - [Features for Developers](#features-for-developers) + - [GTP Extensions:](#gtp-extensions) + - [Analysis Engine:](#analysis-engine) + - [Compiling KataGo](#compiling-katago) + - [Source Code Overview:](#source-code-overview) + - [Selfplay Training:](#selfplay-training) + - [Contributors](#contributors) + - [License](#license) ## Overview @@ -85,8 +88,8 @@ The community also provides KataGo packages for [Homebrew](https://brew.sh) on M Use `brew install katago`. The latest config files and networks are installed in KataGo's `share` directory. Find them via `brew list --verbose katago`. A basic way to run katago will be `katago gtp -config $(brew list --verbose katago | grep 'gtp.*\.cfg') -model $(brew list --verbose katago | grep .gz | head -1)`. You should choose the Network according to the release notes here and customize the provided example config as with every other way of installing KataGo. -### OpenCL vs CUDA vs TensorRT vs Eigen -KataGo has four backends, OpenCL (GPU), CUDA (GPU), TensorRT (GPU), and Eigen (CPU). (On macOS there is also a Metal backend, most easily obtained via homebrew - see above.) +### OpenCL vs CUDA vs TensorRT vs ROCm vs Eigen +KataGo has five backends, OpenCL (GPU), CUDA (GPU), TensorRT (GPU), ROCm (GPU), and Eigen (CPU). (On macOS there is also a Metal backend, most easily obtained via homebrew - see above.) As of v1.17, KataGo supports transformer neural nets, which are generally much stronger for the same compute cost and which the main training run is switching to. Transformer models are more demanding on the GPU backend than the older convolutional nets, so the backend recommendations below matter more for them - in particular OpenCL is noticeably slower on transformers, and on NVIDIA the CUDNN and TensorRT versions make a large difference. @@ -96,11 +99,13 @@ The quick summary is: * Use Eigen with AVX2 if you don't have a GPU or if your GPU is too old/weak to work with OpenCL, and you just want a plain CPU KataGo. * Use Eigen without AVX2 if your CPU is old or on a low-end device that doesn't support AVX2. * The CUDA+CUDNN backend can also work well for NVIDIA GPUs. It has faster startup than TensorRT and is competitive on transformers if using CUDNN >= 9.8.0, though TensorRT 10.16 is often still slightly faster. + * The ROCm backend can work for AMD GPUs with ROCm+MIOpen installed, and is much faster than OpenCL on AMD datacenter (CDNA) GPUs. More in detail: * OpenCL is a general GPU backend should be able to run with any GPUs or accelerators that support [OpenCL](https://en.wikipedia.org/wiki/OpenCL), including NVIDIA GPUs, AMD GPUs, as well CPU-based OpenCL implementations or things like Intel Integrated Graphics. This is the most general GPU version of KataGo and doesn't require a complicated install like CUDA does, so is most likely to work out of the box as long as you have a fairly modern GPU. **However, it also need to take some time when run for the very first time to tune itself.** For many systems, this will take 5-30 seconds, but on a few older/slower systems, may take many minutes or longer. Also, the quality of OpenCL implementations is sometimes inconsistent, particularly for Intel Integrated Graphics and for AMD GPUs that are older than several years, so it might not work for very old machines, as well as specific buggy newer AMD GPUs, see also [Issues with specific GPUs or GPU drivers](#issues-with-specific-gpus-or-gpu-drivers). OpenCL is not as optimized as the NVIDIA-specific backends and will generally be slower, particularly for transformer models. * CUDA is a GPU backend specific to NVIDIA GPUs (it will not work with AMD or Intel or any other GPUs) and requires installing [CUDA](https://developer.nvidia.com/cuda-zone) and [CUDNN](https://developer.nvidia.com/cudnn) and a modern NVIDIA GPU. For older convolutional nets, on many GPUs the OpenCL implementation can match or beat NVIDIA's own CUDA/CUDNN, with the exception of top-end NVIDIA GPUs that support FP16 and tensor cores. For transformer nets, CUDA+CUDNN clearly outperforms OpenCL, but you should use CUDNN >= 9.8.0 if at all possible - the older CUDNN 8.9.7 is a LOT slower on transformer models. Compared to TensorRT, CUDA+CUDNN has faster startup times and is often only slightly slower (and occasionally faster) on transformers. * TensorRT is similar to CUDA, but uses NVIDIA's TensorRT framework to run the neural network with more optimized kernels. For modern NVIDIA GPUs it should work whenever CUDA does, and will usually be the fastest backend, though it has much longer startup times on every launch. As of v1.17.0, TensorRT versions older than 10 are no longer supported. For transformer models, recent versions like CUDA 13 + TensorRT 10.16 are best, while older TensorRT versions can be outperformed by CUDA+CUDNN. + * ROCm is a GPU backend specific to AMD GPUs (it will not work with NVIDIA or Intel or any other GPUs) and requires installing [ROCm](https://rocm.docs.amd.com) and [MIOpen](https://rocm.docs.amd.com/projects/MIOpen) and a modern AMD GPU. It supports both **Linux** (via official ROCm packages, ROCm 6.4+) and **Windows** (via [AMD TheRock](https://github.com/ROCm/TheRock) builds). Performance relative to OpenCL depends on the GPU. On AMD's datacenter accelerators (CDNA), ROCm is much faster than OpenCL: measured on an MI300X at roughly 2.5x for convolutional nets and 6-12x for transformers. On consumer (RDNA) GPUs the two are closer and either may win depending on the GPU and driver, so if you want the best choice, run KataGo's benchmark with both. Transformer/attention-based neural nets (model version 17+) are supported on all AMD GPUs, and get an additional fused-attention speedup on CDNA and RDNA3/RDNA3.5/RDNA4 GPUs when AMD's Composable Kernel library is also installed (see [Compiling.md](Compiling.md)). * Eigen is a *CPU* backend that should work widely *without* needing a GPU or fancy drivers. Use this if you don't have a good GPU or really any GPU at all. It will be quite significantly slower than OpenCL or CUDA, but on a good CPU can still often get 10 to 20 playouts per second if using the smaller (15 or 20) block neural nets. Eigen can also be compiled with AVX2 and FMA support, which can provide a big performance boost for Intel and AMD CPUs from the last few years. However, it will not run at all on older CPUs (and possibly even some recent but low-power modern CPUs) that don't support these fancy vector instructions. For **any** implementation, it's recommended that you also tune the number of threads used if you care about optimal performance, as it can make a factor of 2-3 difference in the speed. See "Tuning for Performance" below. However, if you mostly just want to get it working, then the default untuned settings should also be still reasonable. @@ -160,6 +165,10 @@ Force OpenCL tuner to re-tune: * `./katago tuner -config .cfg` +On the TensorRT and ONNX backends, write out the [ONNX graph](docs/ONNX_Model_Files.md) that KataGo builds for a model, which can then be run as a model file in its own right: + + * `./katago dumponnx -model .bin.gz -out .onnx` + Print version: * `./katago version` @@ -178,6 +187,7 @@ This section summarizes a number of common questions and issues when running Kat #### 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 GPUs** - The ROCm backend's builds include GPU code for gfx906 (Vega 20), CDNA (gfx908/90a/942/950), and RDNA1 through RDNA4 (as supported by the installed ROCm toolchain). If your GPU is not among these or is outside AMD's official [ROCm support list](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/reference/system-requirements.html), KataGo may fail at startup with a GPU initialization error - use the OpenCL backend instead. See [Compiling.md](Compiling.md) for ROCm build instructions. * **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 are buggy. Particularly if on startup before crashing you see KataGo printing something like `Found OpenCL Platform 0: ... (Mesa) (OpenCL 1.1 Mesa ...) ...` diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index fb8bb130fa..3cc803444d 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -1,6 +1,515 @@ cmake_minimum_required(VERSION 3.18.2) + +# Helper: produce the default broad list of AMD GPU architectures the ROCm +# backend should target when the user has not passed -DCMAKE_HIP_ARCHITECTURES=... +# Required archs are always included, being well-established across many ROCm releases. Optional +# archs are probed via an actual compile test and only included if the installed toolchain accepts +# them, which covers newer or rarer archs without hard-failing the whole build on an older +# toolchain that doesn't know about them yet. Keep this list in sync with whatever +# `apt-cache search '^amdrocm-core-sdk-gfx'` shows as AMD adds new chips, and with the CK +# codegen's own supported archs in cpp/external/composable_kernel_fmha/README.md. +function(katago_default_hip_archs out_var) + set(_required_archs + gfx906 gfx908 gfx90a gfx942 gfx950 + gfx1030 gfx1100 gfx1101) + set(_optional_archs + gfx1010 gfx1011 gfx1012 + gfx1031 gfx1032 gfx1033 gfx1034 gfx1035 gfx1036 + gfx1102 gfx1103 + gfx1150 gfx1151 gfx1152 gfx1153 + gfx1200 gfx1201) + set(_result "${_required_archs}") + + if(CMAKE_HIP_COMPILER) + set(_probe_dir "${CMAKE_BINARY_DIR}/_katago_hip_arch_probe") + file(MAKE_DIRECTORY "${_probe_dir}") + set(_probe_src "${_probe_dir}/probe.cpp") + if(NOT EXISTS "${_probe_src}") + file(WRITE "${_probe_src}" "int main(){return 0;}\n") + endif() + foreach(_arch IN LISTS _optional_archs) + execute_process( + COMMAND "${CMAKE_HIP_COMPILER}" --offload-arch=${_arch} -x hip -c + "${_probe_src}" -o "${_probe_dir}/probe_${_arch}.o" + RESULT_VARIABLE _rc + OUTPUT_QUIET ERROR_QUIET) + if(_rc EQUAL 0) + list(APPEND _result ${_arch}) + message(STATUS "HIP arch ${_arch} accepted by compiler - including") + else() + message(STATUS "HIP arch ${_arch} not accepted by compiler - skipping") + endif() + endforeach() + else() + message(STATUS "CMAKE_HIP_COMPILER not yet known; optional archs not probed") + endif() + + set(${out_var} "${_result}" PARENT_SCOPE) +endfunction() + +# Helper: resolve the actual ROCm install prefix on Linux. Since ROCm ~7.9, AMD's TheRock-style +# packaging puts real per-version installs under /opt/rocm/core-/ (e.g. +# /opt/rocm/core-7.13), with /opt/rocm itself just a distro-managed symlink/alternatives entry that +# can point anywhere (or get silently repointed by installing another package) - relying on it +# directly risks intermittently picking up a stale/mismatched ROCm install. +# Prefer the highest-versioned /opt/rocm/core-* directory that is actually a COMPLETE install, +# meaning it contains the hip-lang CMake package. AMD's other packaging generation also creates +# core- dirs that are partial overlays with just runtime components and no headers or CMake +# packages, and preferring one of those breaks the build. Otherwise fall back to the flat +# /opt/rocm layout. +function(katago_find_rocm_prefix out_var) + set(_result "") + if(EXISTS "/opt/rocm") + file(GLOB _core_dirs "/opt/rocm/core-*") + set(_best_ver "") + foreach(_dir ${_core_dirs}) + if(IS_DIRECTORY "${_dir}" + AND (EXISTS "${_dir}/lib/cmake/hip-lang/hip-lang-config.cmake" + OR EXISTS "${_dir}/lib64/cmake/hip-lang/hip-lang-config.cmake")) + get_filename_component(_name "${_dir}" NAME) + string(REGEX REPLACE "^core-" "" _ver "${_name}") + # Compare versions directly rather than list(SORT)ing combined "|" strings - + # string sorting mis-orders e.g. "7" vs "7.14" because of the characters after the version. + if(_best_ver STREQUAL "" OR _ver VERSION_GREATER _best_ver) + set(_best_ver "${_ver}") + set(_result "${_dir}") + endif() + endif() + endforeach() + endif() + if(_result STREQUAL "" AND EXISTS "/opt/rocm") + set(_result "/opt/rocm") + endif() + set(${out_var} "${_result}" PARENT_SCOPE) +endfunction() + +# Helper: locate vswhere.exe via the well-known Program Files env vars (Microsoft's own documented, +# stable install location for it: "/Microsoft Visual Studio/Installer/"), so we +# never hardcode a user- or edition-specific path. +function(katago_win_find_vswhere out_var) + foreach(_pf_var "ProgramFiles(x86)" "ProgramFiles") + if(DEFINED ENV{${_pf_var}}) + file(TO_CMAKE_PATH "$ENV{${_pf_var}}" _pf) + set(_candidate "${_pf}/Microsoft Visual Studio/Installer/vswhere.exe") + if(EXISTS "${_candidate}") + set(${out_var} "${_candidate}" PARENT_SCOPE) + return() + endif() + endif() + endforeach() + set(${out_var} "" PARENT_SCOPE) +endfunction() + +# Helper: fallback Windows Kits (SDK) install root candidates, used only when the registry lookup +# ("Installed Roots" key) doesn't resolve. Built from the ProgramFiles env vars rather than a +# hardcoded drive letter, so this still works on a system with Windows installed to a non-C: drive. +function(katago_win_winsdk_fallback_dirs out_var) + set(_dirs) + foreach(_pf_var "ProgramFiles(x86)" "ProgramFiles") + if(DEFINED ENV{${_pf_var}}) + file(TO_CMAKE_PATH "$ENV{${_pf_var}}" _pf) + list(APPEND _dirs "${_pf}/Windows Kits/10") + endif() + endforeach() + list(REMOVE_DUPLICATES _dirs) + set(${out_var} "${_dirs}" PARENT_SCOPE) +endfunction() + +# Helper: apply the environment vcvarsall.bat would set for a given MSVC toolset version into the +# CURRENT cmake process's environment (equivalent to the user running vcvarsall.bat before invoking +# cmake, but automatic). This is enough for every check that happens during THIS SAME configure run +# (probing below, and the actual project()-triggered HIP compiler ABI test), since execute_process +# children inherit it - but it does NOT persist into a later, separate `ninja` invocation (a sibling +# process, not a child of cmake.exe), which is why katago_win_autoselect_msvc_toolset (below) also +# bakes the resulting INCLUDE/LIB paths into cached compiler/linker flags for that to keep working. +function(katago_win_apply_vcvarsall vcvarsall_bat vcvars_ver) + # Generate a tiny .bat wrapper instead of trying to pass the whole "call ... && set" pipeline as + # one execute_process COMMAND argument - CMake's own argument quoting mangles a string that + # complex (embedded quotes plus '&&'), even though the identical command works fine typed + # directly into a shell. + set(_bat_file "${CMAKE_BINARY_DIR}/_katago_vcvars_dump.bat") + set(_out_file "${CMAKE_BINARY_DIR}/_katago_vcvars_env.txt") + file(WRITE "${_bat_file}" "@echo off\r\ncall \"${vcvarsall_bat}\" x64 -vcvars_ver=${vcvars_ver} >NUL 2>NUL\r\nset\r\n") + execute_process( + COMMAND cmd /c "${_bat_file}" + OUTPUT_FILE "${_out_file}" + RESULT_VARIABLE _rc) + if(NOT _rc EQUAL 0 OR NOT EXISTS "${_out_file}") + return() + endif() + # Read line-by-line via file(STRINGS) rather than splitting the raw output ourselves - INCLUDE/ + # LIB/PATH are themselves semicolon-separated, which would corrupt a naive string(REPLACE "\n" ";" + # ...) split. file(STRINGS) keeps each real line, with its embedded semicolons, as one entry. + file(STRINGS "${_out_file}" _env_lines) + foreach(_line IN LISTS _env_lines) + if(_line MATCHES "^([A-Za-z_][A-Za-z0-9_().]*)=(.*)$") + set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") + endif() + endforeach() +endfunction() + +# Helper: with the given HIP compiler and whatever environment is currently active, try compiling a +# tiny HIP program that includes , to check whether the active MSVC toolset's STL conflicts +# with clang's own CUDA/HIP math forward declarations (see katago_win_autoselect_msvc_toolset below). +function(katago_win_probe_hip_cmath hip_compiler out_var) + set(_probe_dir "${CMAKE_BINARY_DIR}/_katago_msvc_toolset_probe") + file(MAKE_DIRECTORY "${_probe_dir}") + set(_probe_src "${_probe_dir}/probe.cpp") + if(NOT EXISTS "${_probe_src}") + file(WRITE "${_probe_src}" "#include \nint main(){ return 0; }\n") + endif() + # gfx900 just gives --offload-arch a valid value so the HIP compile path runs at all. What is + # actually under test is the host-side resolution, so the arch need not match any + # installed GPU. This is unrelated to katago_default_hip_archs()'s per-arch probing for the + # final build's architecture list. + execute_process( + COMMAND "${hip_compiler}" --offload-arch=gfx900 -x hip -c "${_probe_src}" -o "${_probe_dir}/probe.o" + RESULT_VARIABLE _rc + OUTPUT_QUIET ERROR_QUIET) + set(${out_var} ${_rc} PARENT_SCOPE) +endfunction() + +# Helper: turn a semicolon-separated path list (like the env var INCLUDE or LIB) into a single +# string of "-Iflagprefix" (or "-Lflagprefix") tokens, skipping empty entries. +function(katago_win_pathlist_to_flags pathlist flagprefix out_var) + set(_flags "") + # CMake's own ';' list-splitting would fight with the semicolons already in the pathlist - split + # it as a plain string via regex instead of list(...). + string(REGEX MATCHALL "[^;]+" _dirs "${pathlist}") + foreach(_dir IN LISTS _dirs) + if(NOT _dir STREQUAL "") + set(_flags "${_flags} ${flagprefix}\"${_dir}\"") + endif() + endforeach() + set(${out_var} "${_flags}" PARENT_SCOPE) +endfunction() + +# Helper: find an MSVC "v143" toolset (possibly one of several 14.3x/14.4x versions installed +# side-by-side under one or more VS installs) whose STL doesn't conflict with the HIP compiler's +# own CUDA/HIP math forward-declare headers, apply the vcvarsall.bat environment for it (so the +# rest of THIS configure run - the HIP arch probing below, and project()'s own HIP compiler ABI +# test - see it), and also bake the resulting INCLUDE/LIB paths into cached compiler/linker flags +# so a later, separate `ninja` invocation (which does NOT inherit this configure run's environment +# - see katago_win_apply_vcvarsall's comment) keeps working too. +# +# Deliberately pinned to the v143 toolset family (MSVC 14.3x/14.4x) rather than probing every +# installed toolset regardless of version: a newer MSVC STL (seen with a VS "18" preview-channel +# toolset, MSVC 14.51+, i.e. the next "v144" family) declares math functions like isgreater/isless +# in a way that conflicts with clang's forward declarations for CUDA/HIP device overloads ("device +# function cannot overload host device function"), because that clang version predates the STL's +# newly-added declarations. v143 is the toolset known to work with TheRock's clang. Probe within +# the v143 family (oldest first) rather than hardcoding one exact version, since multiple v143 +# point releases can be installed side by side and this needs one that's actually present. +function(katago_win_autoselect_msvc_toolset hip_compiler) + katago_win_find_vswhere(_vswhere) + if(NOT _vswhere) + message(FATAL_ERROR "vswhere.exe not found (expected under \"/Microsoft Visual Studio/Installer/\") - install Visual Studio Build Tools or Community with the \"Desktop development with C++\" workload.") + endif() + execute_process( + COMMAND "${_vswhere}" -all -products * -property installationPath + OUTPUT_VARIABLE _install_paths_raw + RESULT_VARIABLE _rc + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT _rc EQUAL 0 OR _install_paths_raw STREQUAL "") + message(FATAL_ERROR "vswhere found no Visual Studio installation - install Visual Studio Build Tools or Community with the \"Desktop development with C++\" workload.") + endif() + string(REPLACE "\r\n" "\n" _install_paths_raw "${_install_paths_raw}") + string(REPLACE "\n" ";" _install_paths "${_install_paths_raw}") + + set(_toolsets) + foreach(_install_path IN LISTS _install_paths) + if(_install_path STREQUAL "") + continue() + endif() + file(TO_CMAKE_PATH "${_install_path}" _install_path) + file(GLOB _tool_dirs "${_install_path}/VC/Tools/MSVC/*") + foreach(_t IN LISTS _tool_dirs) + if(IS_DIRECTORY "${_t}" AND EXISTS "${_t}/include/cmath") + get_filename_component(_ver "${_t}" NAME) + # v143 toolset versions are 14.3x/14.4x (the next-generation "v144" toolset, seen with + # VS 18 preview builds, starts at 14.5x and is the one known to conflict - see above). + if(NOT _ver MATCHES "^14\\.[34][0-9]\\.") + continue() + endif() + set(_vcvarsall "${_install_path}/VC/Auxiliary/Build/vcvarsall.bat") + if(EXISTS "${_vcvarsall}") + list(APPEND _toolsets "${_ver}|${_vcvarsall}") + endif() + endif() + endforeach() + endforeach() + + if(NOT _toolsets) + message(FATAL_ERROR "No installed MSVC v143 toolset (14.3x/14.4x) found. Open the Visual Studio Installer, choose \"Modify\" on your VS installation, go to \"Individual Components\", and install \"MSVC v143 - VS 2022 C++ x64/x86 build tools\" (a newer toolset alone, e.g. a VS 18 preview's v144, is not compatible with TheRock's bundled clang).") + endif() + list(REMOVE_DUPLICATES _toolsets) + list(SORT _toolsets COMPARE NATURAL ORDER ASCENDING) + + foreach(_entry IN LISTS _toolsets) + string(REPLACE "|" ";" _entry_list "${_entry}") + list(GET _entry_list 0 _ver) + list(GET _entry_list 1 _vcvarsall) + message(STATUS "Trying MSVC toolset ${_ver} for HIP compiler compatibility...") + katago_win_apply_vcvarsall("${_vcvarsall}" "${_ver}") + katago_win_probe_hip_cmath("${hip_compiler}" _probe_rc) + if(_probe_rc EQUAL 0) + message(STATUS "MSVC toolset ${_ver} is compatible with the HIP compiler; using it") + # Bake this toolset's resolved INCLUDE/LIB (now sitting in ENV{} courtesy of + # katago_win_apply_vcvarsall) into cached flags, so a later separate `ninja` invocation - + # which won't have this environment - still finds the same headers/libs. + # + # Clang's own resource-dir/include (containing its clang-compatible emmintrin.h/immintrin.h + # etc) must come FIRST, ahead of the MSVC toolset's own include dir: pulls in + # , and MSVC's own / declare SSE/AVX intrinsics using + # __declspec(intrin_type), a cl.exe-only mechanism clang doesn't understand - it just sees an + # ordinary extern function declaration with no body, so any code that ends up calling one + # (e.g. the MSVC STL's wmemcmp) links with an "undefined symbol: _mm_loadu_si128"-style error. + # Explicitly preferring clang's own compatible headers for those specific filenames avoids + # most of this, while still falling through to the MSVC/SDK -I entries below for headers + # clang has no equivalent for (the actual MSVC STL, ucrt, etc). This needs a plain -I (not + # -isystem/-idirafter): the earlier __clang_hip_runtime_wrapper.h force-included in every HIP + # compilation uses #include_next to reach the "real" starting from wherever clang's + # own cuda_wrappers/cmath shim was found, and that continuation only walks through the same + # -I search list, not -isystem/-idirafter entries. + # + # This ordering is not sufficient on its own, and does not by itself decide which + # a given HIP SDK ends up using. On SDKs that resolve it to MSVC's, objects still reference + # the bodyless declarations, and core/win_rocm_sse_shim.cpp supplies the definitions that let + # them link. Do not drop that file on the assumption that this ordering replaces it. + execute_process(COMMAND "${hip_compiler}" -print-resource-dir + OUTPUT_VARIABLE _clang_resource_dir OUTPUT_STRIP_TRAILING_WHITESPACE) + file(TO_CMAKE_PATH "${_clang_resource_dir}" _clang_resource_dir) + set(_inc_flags "-I\"${_clang_resource_dir}/include\"") + katago_win_pathlist_to_flags("$ENV{INCLUDE}" "-I" _msvc_inc_flags) + katago_win_pathlist_to_flags("$ENV{LIB}" "-L" _lib_flags) + set(_inc_flags "${_inc_flags} ${_msvc_inc_flags}") + set(CMAKE_HIP_FLAGS "${CMAKE_HIP_FLAGS} ${_inc_flags}" CACHE STRING "" FORCE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_inc_flags}" CACHE STRING "" FORCE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_inc_flags}" CACHE STRING "" FORCE) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_lib_flags}" CACHE STRING "" FORCE) + return() + else() + message(STATUS "MSVC toolset ${_ver} conflicts with the HIP compiler's CUDA/HIP math headers; trying another") + endif() + endforeach() + message(FATAL_ERROR "None of the installed MSVC v143 toolset(s) (14.3x/14.4x) compiled cleanly against TheRock's HIP compiler. This indicates a problem beyond the usual v143-vs-newer-toolset conflict this check is meant to catch - please report this along with the MSVC/TheRock versions involved.") +endfunction() + +# Normalize case here too (it is normalized again later next to the cache definition): the +# pre-project blocks below dispatch on USE_BACKEND before that later normalization runs, and +# e.g. -DUSE_BACKEND=rocm would otherwise silently skip all the ROCm pre-project setup. +string(TOUPPER "${USE_BACKEND}" USE_BACKEND) + if(USE_BACKEND STREQUAL "METAL") project(katago LANGUAGES CXX Swift) +elseif(USE_BACKEND STREQUAL "ROCM") + if(CMAKE_VERSION VERSION_LESS 3.21) + message(FATAL_ERROR "USE_BACKEND=ROCM requires CMake >= 3.21 for HIP language support (found ${CMAKE_VERSION}).") + endif() + if(WIN32) + # Everything in the Windows ROCm build is located through HIP_PATH: the clang++ compiler + # selection below, the MSVC toolset probing, the bundled zlib, and the runtime DLL copying. + # Without it, configure fails later inside project()'s own HIP compiler detection with no + # useful message, so require it here with a clear one. ROCM_PATH or -DCMAKE_PREFIX_PATH + # alone is not a substitute. + if(NOT DEFINED ENV{HIP_PATH}) + message(FATAL_ERROR "USE_BACKEND=ROCM on Windows requires the HIP_PATH environment variable, pointing at an installed AMD HIP SDK / extracted TheRock distribution (see Compiling.md).") + endif() + # Normalize HIP_PATH to forward slashes. + # cmake's HIP detection calls `hipconfig --rocmpath` which returns + # backslash paths on Windows, and writes the result into the generated + # CMakeHIPCompiler.cmake without normalizing, causing "Invalid character + # escape '\T'" errors. Pre-setting CMAKE_HIP_COMPILER_ROCM_ROOT (and + # CMAKE_PREFIX_PATH) before project() bypasses that detection entirely. + if(DEFINED ENV{HIP_PATH}) + file(TO_CMAKE_PATH "$ENV{HIP_PATH}" _hip_path_fwd) + set(ENV{HIP_PATH} "${_hip_path_fwd}") + list(APPEND CMAKE_PREFIX_PATH "${_hip_path_fwd}") + if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT) + set(CMAKE_HIP_COMPILER_ROCM_ROOT "${_hip_path_fwd}" CACHE PATH "" FORCE) + endif() + endif() + # ---------- C/C++ compiler (clang++ from HIP SDK) ---------- + # Unlike on Linux (where CMAKE_CXX_COMPILER=hipcc transparently treats every .cpp as HIP + # source), hipcc.exe cannot be used as CMAKE_CXX_COMPILER on Windows: it mis-tokenizes quoted + # paths containing spaces (e.g. "C:/Program Files (x86)/Windows Kits/..."), breaking the + # compiler-detection step entirely. Use clang++ directly instead. The rocmbackend.cpp / CK + # generated sources that need real HIP compilation get it via an explicit LANGUAGE HIP source + # property (see below and the CK FMHA section further down). + if(NOT CMAKE_CXX_COMPILER) + if(DEFINED ENV{HIP_PATH}) + if(EXISTS "$ENV{HIP_PATH}/lib/llvm/bin/clang++.exe") + set(CMAKE_CXX_COMPILER "$ENV{HIP_PATH}/lib/llvm/bin/clang++.exe" CACHE FILEPATH "" FORCE) + set(CMAKE_C_COMPILER "$ENV{HIP_PATH}/lib/llvm/bin/clang.exe" CACHE FILEPATH "" FORCE) + elseif(EXISTS "$ENV{HIP_PATH}/bin/clang++.exe") + set(CMAKE_CXX_COMPILER "$ENV{HIP_PATH}/bin/clang++.exe" CACHE FILEPATH "" FORCE) + set(CMAKE_C_COMPILER "$ENV{HIP_PATH}/bin/clang.exe" CACHE FILEPATH "" FORCE) + endif() + endif() + endif() + if(NOT CMAKE_HIP_COMPILER AND CMAKE_CXX_COMPILER) + set(CMAKE_HIP_COMPILER "${CMAKE_CXX_COMPILER}" CACHE FILEPATH "" FORCE) + endif() + # ---------- MSVC toolset auto-selection (avoid newer-STL / clang HIP header conflicts) ---------- + # Automatically finds and applies (via vcvarsall.bat) a locally-installed MSVC toolset that's + # compatible with this HIP compiler - see katago_win_autoselect_msvc_toolset()'s comment above + # for why this is needed. Runs once per fresh CMakeCache (cached so a plain re-run of cmake + # doesn't redo the probing every time). + if(CMAKE_HIP_COMPILER AND NOT KATAGO_WIN_MSVC_TOOLSET_CHECKED) + katago_win_autoselect_msvc_toolset("${CMAKE_HIP_COMPILER}") + set(KATAGO_WIN_MSVC_TOOLSET_CHECKED TRUE CACHE INTERNAL "") + endif() + # ---------- HIP architectures (must be set before project() / enable_language(HIP)) ---------- + # Default to the broad set of AMD GPU architectures KataGo supports unless + # the user explicitly passed -DCMAKE_HIP_ARCHITECTURES=... on the command line. + if(NOT DEFINED CMAKE_HIP_ARCHITECTURES) + katago_default_hip_archs(_default_archs) + set(CMAKE_HIP_ARCHITECTURES "${_default_archs}" CACHE STRING "Default broad set of AMD GPU targets") + message(STATUS "Pre-project default CMAKE_HIP_ARCHITECTURES=${CMAKE_HIP_ARCHITECTURES}") + else() + message(STATUS "Pre-project user-specified CMAKE_HIP_ARCHITECTURES=${CMAKE_HIP_ARCHITECTURES}") + endif() + # ---------- Windows SDK includes (needed by HIP compiler test during project()) ---------- + # The HIP runtime wrapper includes MSVC headers that require Windows SDK ucrt/shared/um. + # These flags must be set before project() so cmake's HIP compiler test can compile. + if(NOT KATAGO_WINSDK_ROOT) + get_filename_component(_pre_winsdk_root + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" + ABSOLUTE) + if(NOT EXISTS "${_pre_winsdk_root}") + katago_win_winsdk_fallback_dirs(_pre_winsdk_candidates) + foreach(_p IN LISTS _pre_winsdk_candidates) + if(EXISTS "${_p}") + set(_pre_winsdk_root "${_p}") + break() + endif() + endforeach() + endif() + if(EXISTS "${_pre_winsdk_root}") + set(KATAGO_WINSDK_ROOT "${_pre_winsdk_root}" CACHE INTERNAL "") + endif() + endif() + # Guarded to run once per fresh CMakeCache: these set(... CACHE ... FORCE) calls append to the + # already-cached flag values, so re-running them on every cmake invocation would duplicate the + # flags without bound (and the changed command lines would force full rebuilds each time). + if(KATAGO_WINSDK_ROOT AND NOT KATAGO_WINSDK_FLAGS_ADDED) + file(GLOB _pre_sdk_ver_dirs "${KATAGO_WINSDK_ROOT}/Include/*/ucrt") + if(_pre_sdk_ver_dirs) + list(SORT _pre_sdk_ver_dirs COMPARE NATURAL ORDER DESCENDING) + list(GET _pre_sdk_ver_dirs 0 _pre_ucrt_dir) + get_filename_component(_pre_sdk_ver_dir "${_pre_ucrt_dir}" DIRECTORY) + set(_winsdk_cflags + "-I\"${_pre_sdk_ver_dir}/ucrt\" -I\"${_pre_sdk_ver_dir}/shared\" -I\"${_pre_sdk_ver_dir}/um\"") + set(CMAKE_HIP_FLAGS "${CMAKE_HIP_FLAGS} ${_winsdk_cflags}" CACHE STRING "" FORCE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_winsdk_cflags}" CACHE STRING "" FORCE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_winsdk_cflags}" CACHE STRING "" FORCE) + set(KATAGO_WINSDK_FLAGS_ADDED TRUE CACHE INTERNAL "") + message(STATUS "Pre-project: injected Windows SDK includes from ${_pre_sdk_ver_dir}") + endif() + endif() + # ---------- RC compiler (Windows resource compiler, highest SDK version) ---------- + if(NOT CMAKE_RC_COMPILER) + get_filename_component(_winsdk_root + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" + ABSOLUTE) + if(NOT EXISTS "${_winsdk_root}") + katago_win_winsdk_fallback_dirs(_winsdk_candidates) + foreach(_p IN LISTS _winsdk_candidates) + if(EXISTS "${_p}") + set(_winsdk_root "${_p}") + break() + endif() + endforeach() + endif() + if(EXISTS "${_winsdk_root}") + file(GLOB _rc_candidates "${_winsdk_root}/bin/*/x64/rc.exe") + if(_rc_candidates) + list(SORT _rc_candidates COMPARE NATURAL ORDER DESCENDING) + list(GET _rc_candidates 0 _rc_exe) + set(CMAKE_RC_COMPILER "${_rc_exe}" CACHE FILEPATH "" FORCE) + endif() + # Persist for use in compiler flags section below + set(KATAGO_WINSDK_ROOT "${_winsdk_root}" CACHE INTERNAL "") + endif() + endif() + else() + # Linux: resolve the real ROCm install prefix first (see katago_find_rocm_prefix - handles the + # /opt/rocm/core- layout used since ROCm ~7.9, preferring the highest version found, + # falling back to the old flat /opt/rocm layout). Respect a user-provided CMAKE_PREFIX_PATH. + if(NOT DEFINED CMAKE_PREFIX_PATH OR CMAKE_PREFIX_PATH STREQUAL "") + katago_find_rocm_prefix(KATAGO_ROCM_PREFIX) + if(KATAGO_ROCM_PREFIX) + list(APPEND CMAKE_PREFIX_PATH "${KATAGO_ROCM_PREFIX}") + message(STATUS "Pre-project: resolved ROCm install prefix to ${KATAGO_ROCM_PREFIX}") + endif() + endif() + + # Pin CMake's own HIP-language ROCm root to the same install we resolved above. Without this, + # CMakeDetermineHIPCompiler derives the root from whatever `hipconfig` is first in PATH - which + # on a machine with multiple ROCm installs (or a partial runtime-only overlay install) can point + # somewhere that lacks the hip-lang CMake package, failing project() below with a confusing + # error even when CMAKE_PREFIX_PATH was set correctly. + if(NOT DEFINED CMAKE_HIP_COMPILER_ROCM_ROOT AND CMAKE_PREFIX_PATH) + foreach(_katago_hip_rocm_root ${CMAKE_PREFIX_PATH}) + if(EXISTS "${_katago_hip_rocm_root}/lib/cmake/hip-lang/hip-lang-config.cmake" + OR EXISTS "${_katago_hip_rocm_root}/lib64/cmake/hip-lang/hip-lang-config.cmake") + set(CMAKE_HIP_COMPILER_ROCM_ROOT "${_katago_hip_rocm_root}" CACHE PATH "" FORCE) + message(STATUS "Pre-project: set CMAKE_HIP_COMPILER_ROCM_ROOT=${_katago_hip_rocm_root}") + break() + endif() + endforeach() + endif() + + # Use hipcc. Its location varies across ROCm packaging generations (a classic apt "hipcc" + # package at /usr/bin, one bundled under the ROCm prefix's bin/, or newer installs that only + # ship amdclang++ with no hipcc wrapper at all) - probe candidates instead of hardcoding one + # path, since a missing hardcoded path fails project() below with a confusing compiler-not- + # found error rather than falling back. + find_program(KATAGO_HIPCC_EXECUTABLE NAMES hipcc + HINTS ${CMAKE_PREFIX_PATH} + PATH_SUFFIXES bin) + if(NOT KATAGO_HIPCC_EXECUTABLE AND EXISTS "/usr/bin/hipcc") + set(KATAGO_HIPCC_EXECUTABLE "/usr/bin/hipcc") + endif() + # Search for clang++ unconditionally (not just as a hipcc-missing fallback): CMAKE_HIP_COMPILER + # always needs the clang++ binary directly below, even when hipcc is used for C/CXX, since CMake + # rejects the hipcc wrapper script for CMAKE_HIP_COMPILER ("...not supported"). + find_program(KATAGO_CLANGXX_EXECUTABLE NAMES clang++ + HINTS ${CMAKE_PREFIX_PATH} + PATH_SUFFIXES lib/llvm/bin bin) + # Respect an explicitly user-specified compiler, mirroring the Windows branch above: only + # auto-select when the user didn't pass -DCMAKE_CXX_COMPILER themselves. + if(CMAKE_CXX_COMPILER) + # User's choice stands. + elseif(KATAGO_HIPCC_EXECUTABLE) + set(CMAKE_C_COMPILER "${KATAGO_HIPCC_EXECUTABLE}" CACHE FILEPATH "" FORCE) + set(CMAKE_CXX_COMPILER "${KATAGO_HIPCC_EXECUTABLE}" CACHE FILEPATH "" FORCE) + elseif(KATAGO_CLANGXX_EXECUTABLE) + message(STATUS "hipcc not found; falling back to ${KATAGO_CLANGXX_EXECUTABLE}") + get_filename_component(_clang_dir "${KATAGO_CLANGXX_EXECUTABLE}" DIRECTORY) + set(CMAKE_CXX_COMPILER "${KATAGO_CLANGXX_EXECUTABLE}" CACHE FILEPATH "" FORCE) + set(CMAKE_C_COMPILER "${_clang_dir}/clang" CACHE FILEPATH "" FORCE) + endif() + # ---------- HIP architectures (must be set before project()/enable_language(HIP)) ---------- + # project(... HIP) below triggers CMake's own HIP language detection, which auto-populates + # CMAKE_HIP_ARCHITECTURES with just the native/current GPU's arch if it isn't already set by + # then. That makes the broad-default-arch logic further down (before enable_language(HIP)) + # a no-op, since by that point CMAKE_HIP_ARCHITECTURES already looks "user-specified". Set the + # broad default here instead, before project(), mirroring the Windows pre-project block above. + # Note: CMAKE_HIP_COMPILER must be the clang++ binary directly - CMake rejects the hipcc + # wrapper script here ("CMAKE_HIP_COMPILER is set to the hipcc wrapper... not supported"). + if(NOT CMAKE_HIP_COMPILER AND KATAGO_CLANGXX_EXECUTABLE) + set(CMAKE_HIP_COMPILER "${KATAGO_CLANGXX_EXECUTABLE}" CACHE FILEPATH "" FORCE) + endif() + if(NOT DEFINED CMAKE_HIP_ARCHITECTURES) + katago_default_hip_archs(_default_archs) + set(CMAKE_HIP_ARCHITECTURES "${_default_archs}" CACHE STRING "Default broad set of AMD GPU targets") + message(STATUS "Pre-project default CMAKE_HIP_ARCHITECTURES=${CMAKE_HIP_ARCHITECTURES}") + else() + message(STATUS "Pre-project user-specified CMAKE_HIP_ARCHITECTURES=${CMAKE_HIP_ARCHITECTURES}") + endif() + endif() + project(katago LANGUAGES C CXX HIP) else() project(katago) endif() @@ -44,7 +553,7 @@ endif() set(BUILD_DISTRIBUTED 0 CACHE BOOL "Build with http support for contributing to distributed training") set(USE_BACKEND CACHE STRING "Neural net backend") string(TOUPPER "${USE_BACKEND}" USE_BACKEND) -set_property(CACHE USE_BACKEND PROPERTY STRINGS "" CUDA TENSORRT OPENCL EIGEN METAL) +set_property(CACHE USE_BACKEND PROPERTY STRINGS "" CUDA TENSORRT OPENCL EIGEN METAL ONNX ROCM) set(USE_TCMALLOC 0 CACHE BOOL "Use TCMalloc") set(NO_GIT_REVISION 0 CACHE BOOL "Disable embedding the git revision into the compiled exe") @@ -54,6 +563,117 @@ set(USE_BIGGER_BOARDS_EXPENSIVE 0 CACHE BOOL "Allow boards up to size 50. Compil set(USE_CACHE_TENSORRT_PLAN 0 CACHE BOOL "Use TENSORRT plan cache. May use a lot of disk space. Only applies when USE_BACKEND is TENSORRT.") mark_as_advanced(USE_CACHE_TENSORRT_PLAN) +# ---------- Auto-fetch missing third-party deps (e.g. zlib on a Windows ROCm/TheRock install that +# doesn't ship a linkable zlib) via a local vcpkg clone in the build tree. +# Defaults ON only on Windows ROCm builds, where the ROCm/TheRock toolchain genuinely may have no +# other way to get a linkable zlib. Everywhere else it defaults OFF: pre-existing build setups +# (system packages on Linux, vcpkg/manual paths on Windows CUDA/OpenCL per Compiling.md) are the +# expected path, and cloning vcpkg from the network as a side effect of a plain configure would be +# a surprising new behavior there. Users can still opt in with -DKATAGO_AUTO_FETCH_DEPS=ON. +if(WIN32 AND USE_BACKEND STREQUAL "ROCM") + set(_katago_auto_fetch_default ON) +else() + set(_katago_auto_fetch_default OFF) +endif() +option(KATAGO_AUTO_FETCH_DEPS "Automatically fetch missing dependencies into /deps (Windows/Linux use vcpkg)." ${_katago_auto_fetch_default}) +# Inside the build directory (NOT the source tree), so configure never writes into a checkout and +# separate build directories can't race on a shared vcpkg clone. Override to a common location if +# you want fetched deps shared across build dirs. +set(KATAGO_DEPS_DIR "${CMAKE_BINARY_DIR}/deps" CACHE PATH "Directory for auto-fetched third-party dependencies") +if(WIN32) + set(_katago_vcpkg_triplet_default "x64-windows") +elseif(UNIX AND NOT APPLE) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") + set(_katago_vcpkg_triplet_default "arm64-linux") + else() + set(_katago_vcpkg_triplet_default "x64-linux") + endif() +else() + set(_katago_vcpkg_triplet_default "x64-windows") +endif() +set(KATAGO_VCPKG_TRIPLET "${_katago_vcpkg_triplet_default}" CACHE STRING "vcpkg triplet used by KATAGO_AUTO_FETCH_DEPS") +set(KATAGO_VCPKG_ROOT "${KATAGO_DEPS_DIR}/vcpkg" CACHE PATH "Path to local vcpkg clone used by KATAGO_AUTO_FETCH_DEPS") +mark_as_advanced(KATAGO_VCPKG_TRIPLET KATAGO_VCPKG_ROOT) + +function(katago_vcpkg_bootstrap_if_needed) + if(NOT WIN32 AND NOT (UNIX AND NOT APPLE)) + message(FATAL_ERROR "katago_vcpkg_bootstrap_if_needed is only supported on Windows and Linux") + endif() + + if(NOT KATAGO_AUTO_FETCH_DEPS) + message(FATAL_ERROR "KATAGO_AUTO_FETCH_DEPS is OFF, cannot auto-fetch missing dependency") + endif() + + file(MAKE_DIRECTORY "${KATAGO_DEPS_DIR}") + + if(WIN32) + set(_katago_vcpkg_exe "${KATAGO_VCPKG_ROOT}/vcpkg.exe") + else() + set(_katago_vcpkg_exe "${KATAGO_VCPKG_ROOT}/vcpkg") + endif() + + if(NOT EXISTS "${_katago_vcpkg_exe}") + if(NOT EXISTS "${KATAGO_VCPKG_ROOT}/.git") + find_package(Git QUIET) + if(NOT GIT_FOUND) + message(FATAL_ERROR "KATAGO_AUTO_FETCH_DEPS requires git to clone vcpkg") + endif() + message(STATUS "Auto-fetch deps: cloning vcpkg into ${KATAGO_VCPKG_ROOT}") + execute_process( + COMMAND "${GIT_EXECUTABLE}" clone --depth=1 https://github.com/microsoft/vcpkg.git "${KATAGO_VCPKG_ROOT}" + RESULT_VARIABLE _clone_result + OUTPUT_VARIABLE _clone_out + ERROR_VARIABLE _clone_err + ) + if(NOT _clone_result EQUAL 0) + message(FATAL_ERROR "Failed to clone vcpkg.\n${_clone_out}\n${_clone_err}") + endif() + endif() + + message(STATUS "Auto-fetch deps: bootstrapping vcpkg") + if(WIN32) + execute_process( + COMMAND "${KATAGO_VCPKG_ROOT}/bootstrap-vcpkg.bat" -disableMetrics + WORKING_DIRECTORY "${KATAGO_VCPKG_ROOT}" + RESULT_VARIABLE _bootstrap_result + ) + else() + execute_process( + COMMAND sh "${KATAGO_VCPKG_ROOT}/bootstrap-vcpkg.sh" -disableMetrics + WORKING_DIRECTORY "${KATAGO_VCPKG_ROOT}" + RESULT_VARIABLE _bootstrap_result + ) + endif() + if(NOT _bootstrap_result EQUAL 0) + message(FATAL_ERROR "Failed to bootstrap vcpkg") + endif() + endif() +endfunction() + +function(katago_vcpkg_install_if_needed package_name) + katago_vcpkg_bootstrap_if_needed() + + if(WIN32) + set(_katago_vcpkg_exe "${KATAGO_VCPKG_ROOT}/vcpkg.exe") + else() + set(_katago_vcpkg_exe "${KATAGO_VCPKG_ROOT}/vcpkg") + endif() + if(NOT EXISTS "${_katago_vcpkg_exe}") + message(FATAL_ERROR "vcpkg executable not found after bootstrap: ${_katago_vcpkg_exe}") + endif() + + set(_spec "${package_name}:${KATAGO_VCPKG_TRIPLET}") + message(STATUS "Auto-fetch deps: ensuring ${_spec} via vcpkg") + execute_process( + COMMAND "${_katago_vcpkg_exe}" install "${_spec}" --disable-metrics + WORKING_DIRECTORY "${KATAGO_VCPKG_ROOT}" + RESULT_VARIABLE _install_result + ) + if(NOT _install_result EQUAL 0) + message(FATAL_ERROR "Failed to install ${_spec} via vcpkg") + endif() +endfunction() + #--------------------------- NEURAL NET BACKEND ------------------------------------------------------------------------ message(STATUS "Building 'katago' executable for GTP engine and other tools.") @@ -63,6 +683,9 @@ if(USE_BACKEND STREQUAL "CUDA") enable_language(CUDA) set(CUDA_STANDARD 11) + # cudabackend.cpp, cudautils.cpp, and cudahelpers.cu are thin wrappers around + # cudaandrocmbackend.inc, cudaandrocmutils.inc, and cudaandrocmhelpers.inc, which are shared + # with the ROCm backend (tracked via compiler depfiles, so they do not appear here). set(NEURALNET_BACKEND_SOURCES neuralnet/cudabackend.cpp neuralnet/cudautils.cpp @@ -164,8 +787,70 @@ elseif(USE_BACKEND STREQUAL "EIGEN") set(NEURALNET_BACKEND_SOURCES neuralnet/eigenbackend.cpp ) +elseif(USE_BACKEND STREQUAL "ONNX") + message(STATUS "-DUSE_BACKEND=ONNX, using ONNX Runtime backend.") + set(NEURALNET_BACKEND_SOURCES + neuralnet/onnxbackend.cpp + ) +# --------------------------- ROCM backend (AMD GPU / HIP + MIOpen) --------------------------- +elseif(USE_BACKEND STREQUAL "ROCM") + message(STATUS "-DUSE_BACKEND=ROCM, using AMD ROCm backend.") + + if(CMAKE_PREFIX_PATH STREQUAL "" OR NOT DEFINED CMAKE_PREFIX_PATH) + # On Windows the pre-project block already required HIP_PATH and appended it to + # CMAKE_PREFIX_PATH, so only Linux needs handling here. + if(NOT WIN32) + # Linux: resolve the real ROCm install prefix, using the same core- vs flat + # /opt/rocm resolution as the pre-project block above. This block re-runs it standalone in + # case USE_BACKEND wasn't ROCM early enough for that block to have fired. + katago_find_rocm_prefix(KATAGO_ROCM_PREFIX) + if(KATAGO_ROCM_PREFIX) + list(APPEND CMAKE_PREFIX_PATH "${KATAGO_ROCM_PREFIX}") + message(STATUS "CMAKE_PREFIX_PATH not given; defaulting to ${KATAGO_ROCM_PREFIX}") + endif() + endif() + endif() + + # Ensure CMAKE_HIP_COMPILER is set BEFORE we run the optional-arch probe and before + # enable_language(HIP). The pre-project block normally sets it on both Windows and Linux, so + # this is a safety net for a Linux configure where it did not find clang++ then. Must be the + # clang++ binary directly, not the hipcc wrapper (CMake rejects hipcc for CMAKE_HIP_COMPILER). + if(NOT WIN32 AND NOT CMAKE_HIP_COMPILER) + if(NOT KATAGO_CLANGXX_EXECUTABLE) + find_program(KATAGO_CLANGXX_EXECUTABLE NAMES clang++ HINTS ${CMAKE_PREFIX_PATH} PATH_SUFFIXES lib/llvm/bin bin) + endif() + if(KATAGO_CLANGXX_EXECUTABLE) + set(CMAKE_HIP_COMPILER "${KATAGO_CLANGXX_EXECUTABLE}" CACHE FILEPATH "" FORCE) + endif() + endif() + + # Default GPU architectures must be set BEFORE enable_language(HIP). + # Users who pass -DCMAKE_HIP_ARCHITECTURES=... on the command line get + # exactly that list. Otherwise we default to the broad set KataGo supports: + # katago_default_hip_archs()'s required list plus whichever of its optional + # (newer/less common) archs this compiler accepts. + if(NOT DEFINED CMAKE_HIP_ARCHITECTURES) + katago_default_hip_archs(_default_archs) + set(CMAKE_HIP_ARCHITECTURES "${_default_archs}" CACHE STRING "Default broad set of AMD GPU targets") + message(STATUS "Default CMAKE_HIP_ARCHITECTURES=${CMAKE_HIP_ARCHITECTURES}") + else() + message(STATUS "User-specified CMAKE_HIP_ARCHITECTURES=${CMAKE_HIP_ARCHITECTURES}") + endif() + + enable_language(HIP) + set(CMAKE_HIP_STANDARD 17) + + # rocmbackend.cpp, rocmutils.cpp, and rocmhelpers.hip are thin wrappers around + # cudaandrocmbackend.inc, cudaandrocmutils.inc, and cudaandrocmhelpers.inc, which are shared + # with the CUDA backend (tracked via compiler depfiles, so they do not appear here). + set(NEURALNET_BACKEND_SOURCES + neuralnet/rocmbackend.cpp + neuralnet/rocmutils.cpp + neuralnet/rocmhelpers.hip + ) + elseif(USE_BACKEND STREQUAL "") - message(WARNING "${ColorBoldRed}WARNING: Using dummy neural net backend, intended for non-neural-net testing only, will fail on any code path requiring a neural net. To use neural net, specify -DUSE_BACKEND=CUDA or -DUSE_BACKEND=TENSORRT or -DUSE_BACKEND=OPENCL or -DUSE_BACKEND=EIGEN to compile with the respective backend.${ColorReset}") + message(WARNING "${ColorBoldRed}WARNING: Using dummy neural net backend, intended for non-neural-net testing only, will fail on any code path requiring a neural net. To use neural net, specify -DUSE_BACKEND=CUDA or -DUSE_BACKEND=TENSORRT or -DUSE_BACKEND=OPENCL or -DUSE_BACKEND=EIGEN or -DUSE_BACKEND=ONNX or -DUSE_BACKEND=ROCM to compile with the respective backend.${ColorReset}") set(NEURALNET_BACKEND_SOURCES neuralnet/dummybackend.cpp) else() message(FATAL_ERROR "Unrecognized backend: " ${USE_BACKEND}) @@ -330,7 +1015,10 @@ add_executable(katago tests/testconfig.cpp tests/testmisc.cpp tests/testnnevalcanary.cpp + tests/testbackendreference.cpp + tests/backendreferencedata.cpp tests/testpassalivesuicide.cpp + tests/testexcludeterritoryatari.cpp tests/testrules.cpp tests/testscore.cpp tests/testsgf.cpp @@ -347,6 +1035,7 @@ add_executable(katago tests/testtime.cpp tests/testtrainingwrite.cpp tests/testnn.cpp + tests/testonnxmodelfile.cpp tests/tinymodel.cpp tests/tinymodeldata.cpp distributed/client.cpp @@ -354,6 +1043,7 @@ add_executable(katago command/analysis.cpp command/benchmark.cpp command/contribute.cpp + command/dumponnx.cpp command/evalsgf.cpp command/gatekeeper.cpp command/genbook.cpp @@ -449,20 +1139,8 @@ elseif(USE_BACKEND STREQUAL "TENSORRT") include_directories(SYSTEM ${CUDAToolkit_INCLUDE_DIRS} ${TENSORRT_INCLUDE_DIR}) #SYSTEM is for suppressing some compiler warnings in thrust libraries target_link_libraries(katago CUDA::cudart_static ${TENSORRT_LIBRARY}) - # The TensorRT backend builds networks by emitting an ONNX ModelProto and handing the - # serialized bytes to TensorRT's nvonnxparser. We compile the vendored ONNX schema - # (cpp/external/onnx/onnx.proto) with protoc and link against our own protobuf; this is - # symbol-isolated from the protobuf that TensorRT statically links into nvonnxparser, so - # there is no ABI contact between the two (the handoff is serialized bytes). - find_package(Protobuf REQUIRED) - message(STATUS "Found Protobuf version: ${Protobuf_VERSION}") - set(ONNX_PROTO_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/onnx") - protobuf_generate_cpp(ONNX_PROTO_SRCS ONNX_PROTO_HDRS "${ONNX_PROTO_DIR}/onnx.proto") - # protoc-generated code is not ours to lint; silence its warnings to keep build output readable. - set_source_files_properties(${ONNX_PROTO_SRCS} PROPERTIES COMPILE_OPTIONS "-w") - target_sources(katago PRIVATE ${ONNX_PROTO_SRCS} neuralnet/onnxmodelbuilder.cpp) - # Generated onnx.pb.h lands in the build dir; let backend code include it. - target_include_directories(katago SYSTEM PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${Protobuf_INCLUDE_DIRS}) + # The ONNX emitter this backend feeds nvonnxparser with, and the protobuf it needs, are set up + # in the shared block after this backend chain. # nvonnxparser ships alongside nvinfer in the TensorRT lib dir. Derive that dir from the # already-resolved TENSORRT_LIBRARY so this works both with TENSORRT_ROOT_DIR and with a @@ -472,10 +1150,7 @@ elseif(USE_BACKEND STREQUAL "TENSORRT") if(NOT TENSORRT_ONNXPARSER_LIBRARY) message(FATAL_ERROR "${ColorBoldRed} libnvonnxparser was NOT found in the TensorRT lib dir. ${ColorReset}") endif() - # Link the imported target rather than ${Protobuf_LIBRARIES}: when protobuf comes from a - # CMake package config (e.g. vcpkg), the variable can resolve to the DLL itself rather - # than the import lib, and it also omits protobuf's own dependencies such as abseil. - target_link_libraries(katago ${TENSORRT_ONNXPARSER_LIBRARY} protobuf::libprotobuf) + target_link_libraries(katago ${TENSORRT_ONNXPARSER_LIBRARY}) elseif(USE_BACKEND STREQUAL "METAL") target_compile_definitions(katago PRIVATE USE_METAL_BACKEND) target_link_libraries(katago KataGoSwift katagocoreml @@ -504,6 +1179,383 @@ elseif(USE_BACKEND STREQUAL "OPENCL") link_directories(${OpenCL_LIBRARY}) target_link_libraries(katago ${OpenCL_LIBRARY}) endif() +# --------------------------- ROCM linking stage --------------------------- +elseif(USE_BACKEND STREQUAL "ROCM") + target_compile_definitions(katago PRIVATE USE_ROCM_BACKEND) + + string(TOLOWER "${CMAKE_HIP_ARCHITECTURES}" _gfxlist) # e.g. "gfx90a;gfx942" + # Every architecture in katago_default_hip_archs()'s full candidate list (Vega20/CDNA gfx906/908/90a/942/ + # 950, RDNA1 gfx101x, RDNA2 gfx103x, RDNA3 gfx110x, RDNA3.5 gfx115x, RDNA4 gfx120x) supports packed + # FP16 ops. The regex below matches each of them so user-specified subset lists still work. + # It also matches several Vega-class and RDNA1 architectures outside that default list, namely + # gfx900, gfx902, gfx909, gfx90c and gfx1013, which are packed-FP16 capable too, so that a user + # who names one of them explicitly still gets FP16 support. + if(_gfxlist MATCHES "(gfx)?(90[0269ac]|908|94[0-2]|950|101[0-3]|103[0-6]|110[0-3]|115[0-3]|120[01])") + target_compile_definitions(katago PRIVATE HIP_SUPPORTS_FP16) + message(STATUS "Detected FP16-capable GFX arch (${CMAKE_HIP_ARCHITECTURES}); defining HIP_SUPPORTS_FP16") + endif() + + # Since ROCm 6.x, CMake config-mode packages are included. If not found, add -DCMAKE_PREFIX_PATH=/opt/rocm (Linux) or HIP SDK path (Windows) + find_package(hip QUIET CONFIG) # Export hip::device / hip::host + find_package(hipblas QUIET CONFIG) # Export roc::hipblas + find_package(miopen QUIET CONFIG) # Export roc::miopen or MIOpen + + # Explicitly (re-)add the resolved HIP include dir via a raw -isystem compile option (not + # target_include_directories(... SYSTEM ...)): hip::device's own INTERFACE_INCLUDE_DIRECTORIES + # already carries this same path as a plain -I, and CMake's include-directory de-duplication + # drops our SYSTEM entry as "already covered" rather than upgrading it - so the plain -I from + # hip::device wins, which matters here because some systems have a stale hip_runtime.h under + # /usr/include (e.g. from an old standalone "hipcc"/"libamdhip64-dev" apt package) that's + # incompatible with a newer compiler's builtins (__AMDGCN_WAVEFRONT_SIZE etc). A plain -I loses to + # that stale /usr/include, whereas a raw -isystem, bypassing the dedup, wins. + find_path(KATAGO_HIP_SYSTEM_INCLUDE_DIR hip/hip_runtime.h + HINTS ${CMAKE_PREFIX_PATH} ENV HIP_PATH ENV ROCM_PATH + PATH_SUFFIXES include) + # Never -isystem /usr/include itself: that is exactly the stale-header location this override + # exists to beat, and /usr/include as -isystem also breaks #include_next chains. + if(KATAGO_HIP_SYSTEM_INCLUDE_DIR STREQUAL "/usr/include") + set(KATAGO_HIP_SYSTEM_INCLUDE_DIR "") + endif() + if(KATAGO_HIP_SYSTEM_INCLUDE_DIR) + target_compile_options(katago PRIVATE "-isystem${KATAGO_HIP_SYSTEM_INCLUDE_DIR}") + endif() + + # ---------- fallback: HIP Runtime ---------- + if(NOT hip_FOUND) + if(WIN32) + # Windows: Search in HIP SDK installation + find_path(HIP_INCLUDE_DIR hip/hip_runtime.h + HINTS ${CMAKE_PREFIX_PATH} ENV HIP_PATH ENV ROCM_PATH + PATH_SUFFIXES include) + find_library(HIP_RUNTIME_LIB + NAMES amdhip64 amdhip64_7 amdhip64_6 + HINTS ${CMAKE_PREFIX_PATH} ENV HIP_PATH ENV ROCM_PATH + PATH_SUFFIXES lib bin) + else() + # Linux: search the resolved prefix, then the ROCm env vars, then /opt/rocm. The env vars + # are only a last-resort hint here. A ROCm fully outside /opt/rocm generally still needs + # CMAKE_PREFIX_PATH, since the compiler and package resolution earlier in the configure + # does not consult these env vars. + find_path(HIP_INCLUDE_DIR hip/hip_runtime.h + HINTS ${CMAKE_PREFIX_PATH} ENV ROCM_PATH ENV HIP_PATH /opt/rocm + PATH_SUFFIXES include) + find_library(HIP_RUNTIME_LIB amdhip64 + HINTS ${CMAKE_PREFIX_PATH} ENV ROCM_PATH ENV HIP_PATH /opt/rocm + PATH_SUFFIXES lib lib64) + endif() + + if(NOT HIP_INCLUDE_DIR OR NOT HIP_RUNTIME_LIB) + if(WIN32) + message(FATAL_ERROR "HIP headers or runtime NOT found; install HIP SDK for Windows or set CMAKE_PREFIX_PATH to HIP SDK installation path.") + else() + message(FATAL_ERROR "HIP headers or runtime NOT found; install ROCm or set CMAKE_PREFIX_PATH.") + endif() + endif() + add_library(hip::device UNKNOWN IMPORTED) + # The real hip-config.cmake also propagates __HIP_PLATFORM_AMD__; without it any TU compiled + # by a non-hipcc host compiler that includes the HIP headers selects no platform and fails. + set_target_properties(hip::device PROPERTIES + IMPORTED_LOCATION "${HIP_RUNTIME_LIB}" + INTERFACE_INCLUDE_DIRECTORIES "${HIP_INCLUDE_DIR}" + INTERFACE_COMPILE_DEFINITIONS "__HIP_PLATFORM_AMD__=1") + target_include_directories(katago SYSTEM PRIVATE ${HIP_INCLUDE_DIR}) + endif() + + # ---------- fallback: hipBLAS / MIOpen ---------- + foreach(_pkg hipblas miopen) + if(NOT ${_pkg}_FOUND) + if(WIN32) + if(_pkg STREQUAL "hipblas") + set(_lib_names hipblas) + else() + set(_lib_names MIOpen) + endif() + find_library(${_pkg}_LIB + NAMES ${_lib_names} + HINTS ${CMAKE_PREFIX_PATH} ENV HIP_PATH ENV ROCM_PATH + PATH_SUFFIXES lib bin) + else() + # NAMES covers both spellings: ROCm ships libMIOpen.so (capitalized), which a plain + # lowercase search misses on a case-sensitive filesystem. + if(_pkg STREQUAL "miopen") + set(_lib_names MIOpen miopen) + else() + set(_lib_names ${_pkg}) + endif() + find_library(${_pkg}_LIB + NAMES ${_lib_names} + HINTS ${CMAKE_PREFIX_PATH} ENV ROCM_PATH ENV HIP_PATH /opt/rocm + PATH_SUFFIXES lib lib64) + endif() + + if(${_pkg}_LIB) + add_library(roc::${_pkg} UNKNOWN IMPORTED) + set_target_properties(roc::${_pkg} PROPERTIES + IMPORTED_LOCATION "${${_pkg}_LIB}") + target_include_directories(katago SYSTEM PRIVATE ${HIP_INCLUDE_DIR}) + message(STATUS "Found ${_pkg} at ${${_pkg}_LIB}") + else() + if(WIN32) + message(FATAL_ERROR "Required ROCm component ${_pkg} not found - install HIP SDK for Windows or set CMAKE_PREFIX_PATH.") + else() + message(FATAL_ERROR "Required ROCm component ${_pkg} not found - install it or set CMAKE_PREFIX_PATH.") + endif() + endif() + endif() + endforeach() + + # MIOpen's CMake package exports either 'MIOpen' or 'roc::miopen' depending on version, so + # accept whichever exists. + if(TARGET MIOpen) + set(_miopen_target MIOpen) + elseif(TARGET roc::miopen) + set(_miopen_target roc::miopen) + else() + message(FATAL_ERROR "Neither 'MIOpen' nor 'roc::miopen' imported target exists after find_package + fallback. This is a bug in the ROCM backend detection logic in cpp/CMakeLists.txt.") + endif() + + target_link_libraries(katago + hip::device # HIP runtime & kernel offload + roc::hipblas # BLAS + ${_miopen_target} # DNN primitives + ) + + # See the comment in core/win_rocm_sse_shim.cpp: on Windows, ucrt's own ends up calling + # SSE2 intrinsics that resolve to bodyless declarations under this toolchain, causing "undefined + # symbol" link errors. + if(WIN32) + target_sources(katago PRIVATE core/win_rocm_sse_shim.cpp) + endif() + + # KATAGO_ROCM_PREFIX may not be set if the user passed an explicit -DCMAKE_PREFIX_PATH (which + # skips the auto-detect branches that populate it) - fall back to CMAKE_PREFIX_PATH's first entry + # in that case, so RPATH still gets set below regardless of how the prefix was determined. + if(NOT KATAGO_ROCM_PREFIX) + if(CMAKE_PREFIX_PATH) + list(GET CMAKE_PREFIX_PATH 0 KATAGO_ROCM_PREFIX) + else() + katago_find_rocm_prefix(KATAGO_ROCM_PREFIX) + endif() + endif() + + # Bake the resolved ROCm lib dir into the binary's RPATH. Without this, the built katago relies + # on /opt/rocm (a distro-managed symlink that can get silently repointed by installing another + # ROCm package, or a subsequent /opt/rocm/core- release) resolving to the same + # install this was actually built and tested against - which is not guaranteed, especially for a + # binary meant to be copied to another machine. CMAKE_SKIP_BUILD_RPATH/INSTALL_RPATH aren't set by + # this project, so this also takes effect for the build-tree binary, not just `make install`. + if(KATAGO_ROCM_PREFIX) + set_target_properties(katago PROPERTIES + BUILD_RPATH "${KATAGO_ROCM_PREFIX}/lib" + INSTALL_RPATH "${KATAGO_ROCM_PREFIX}/lib" + ) + message(STATUS "Set katago RPATH to ${KATAGO_ROCM_PREFIX}/lib") + endif() + + # ---------- Optional: Composable Kernel FMHA (fused attention) ---------- + # Mirrors the CUDA backend's optional cudnn-frontend SDPA path: KataGo vendors a small set of + # glue headers + pre-generated ck_tile FMHA kernel instantiations under + # external/composable_kernel_fmha, but these only compile against a matching version of CK's own + # core ck_tile headers (system dependency, not vendored - part of a "composablekernel-dev" / + # "amdrocm-ck*" package). If a compatible version isn't installed, we just skip this and the + # backend always uses its own plain (non-fused) attention kernel - this is a pure performance + # optimization, not required for correctness. + find_path(KATAGO_CK_TILE_INCLUDE_DIR + NAMES ck_tile/ops/fmha_fwd.hpp + HINTS ${CMAKE_PREFIX_PATH} ENV HIP_PATH ENV ROCM_PATH + PATH_SUFFIXES include + ) + # find_path leaves a user-provided cache value untouched, so validate that whatever we ended up + # with actually contains the ck_tile FMHA header rather than trusting it blindly. + if(KATAGO_CK_TILE_INCLUDE_DIR AND NOT EXISTS "${KATAGO_CK_TILE_INCLUDE_DIR}/ck_tile/ops/fmha_fwd.hpp") + message(WARNING "KATAGO_CK_TILE_INCLUDE_DIR=${KATAGO_CK_TILE_INCLUDE_DIR} does not contain ck_tile/ops/fmha_fwd.hpp; ignoring it") + set(KATAGO_CK_TILE_INCLUDE_DIR "KATAGO_CK_TILE_INCLUDE_DIR-NOTFOUND") + endif() + + # ck_tile's FMHA kernels were never ported to GCN/Vega (gfx90x) or RDNA1 (gfx101x) - no + # MFMA/WMMA on those architectures. In the ck_tile version this glue targets (TheRock 7.13), + # arch.hpp's get_compiler_target() has no branch for them, so its constexpr dispatch function + # silently falls through to nothing on a device-compile pass for one of them, and merely + # including ck_tile headers then hard-fails ("member reference base type 'void' is not a + # structure or union"). These generated files exist solely to provide CK kernel instantiations, + # so simply exclude them from those particular archs' compilation entirely via a dedicated + # object library with a narrowed HIP_ARCHITECTURES - the plain (non-fused) attention kernel + # already covers those archs regardless. + # Matched on the base arch name so feature-suffixed spellings like "gfx906:xnack-" are also + # excluded. This list must stay in sync with the corresponding #if in rocmbackend.cpp. It covers + # more architectures than katago_default_hip_archs() builds by default, so that a user who names + # an older one explicitly still gets a working build. + set(_ck_fmha_excluded_archs gfx900 gfx902 gfx906 gfx909 gfx90c gfx1010 gfx1011 gfx1012 gfx1013) + set(KATAGO_CK_FMHA_SUPPORTED_ARCHS "") + foreach(_arch ${CMAKE_HIP_ARCHITECTURES}) + string(REGEX REPLACE ":.*$" "" _arch_base "${_arch}") + if(NOT _arch_base IN_LIST _ck_fmha_excluded_archs) + list(APPEND KATAGO_CK_FMHA_SUPPORTED_ARCHS "${_arch}") + endif() + endforeach() + + # The vendored kernels only compile against an API-compatible version of the installed ck_tile + # core headers (see external/composable_kernel_fmha/README.md), and ck_tile's API moves between + # ROCm releases. Probe-compile against the headers we found before committing: if they are + # incompatible we skip the fused path with a clear message instead of hard-failing the whole + # build partway through with hundreds of template errors. The probe result is cached per ck_tile + # directory so a plain re-run of cmake doesn't redo it. + # + # The probe compiles a real generated kernel file rather than a translation unit that merely + # includes the glue headers, because some incompatibilities only appear once ck_tile's kernel + # templates are instantiated for a target arch. ck_tile 7.14's cast_to_amdgpu_buffer_rsrc_t, for + # instance, calls std::memcpy from device code, which compiles only where the standard library's + # memcpy is host+device. It is with libstdc++, which gets that from HIP's headers, but not with + # MSVC's, whose is already included by the time those headers are reached. A probe that + # only includes headers accepts that and the build then dies in the middle of the kernels. + set(_katago_ck_fmha_enabled FALSE) + # Each generated kernel file targets one CK codegen family and produces code only for archs in + # that family, so probe one file per distinct family among the target archs. Families are matched + # most-specific-first, so gfx950 and gfx115x do not fall into the broader gfx9 and gfx11 buckets, + # mirroring the dispatch order in generated/fmha_fwd_api.cpp. Archs matching no family (RDNA2 + # gfx103x) have no CK kernels at all, so a build targeting only those gets nothing from CK. + set(_ck_probe_families "") + set(_ck_probe_archs "") + foreach(_arch ${KATAGO_CK_FMHA_SUPPORTED_ARCHS}) + string(REGEX REPLACE ":.*$" "" _arch_base "${_arch}") + set(_ck_fam "") + if(_arch_base MATCHES "^gfx950") + set(_ck_fam "gfx950") + elseif(_arch_base MATCHES "^gfx9") + set(_ck_fam "gfx9") + elseif(_arch_base MATCHES "^gfx115") + set(_ck_fam "gfx115") + elseif(_arch_base MATCHES "^gfx11") + set(_ck_fam "gfx11") + elseif(_arch_base MATCHES "^gfx12") + set(_ck_fam "gfx12") + endif() + if(_ck_fam AND NOT _ck_fam IN_LIST _ck_probe_families) + list(APPEND _ck_probe_families "${_ck_fam}") + list(APPEND _ck_probe_archs "${_arch}") + endif() + endforeach() + if(KATAGO_CK_TILE_INCLUDE_DIR AND NOT _ck_probe_families) + message(STATUS "ck_tile headers found, but no targeted GPU arch has CK FMHA kernels; ROCm backend will only use its built-in (non-fused) attention kernel") + elseif(KATAGO_CK_TILE_INCLUDE_DIR) + # The cache signature includes the compiler, the probed archs, a content hash of ck_tile's own + # fmha_fwd.hpp (a good proxy for the installed ck_tile API version), and a tag for the probe + # scheme itself, so an in-place ROCm or header upgrade, a changed toolchain or arch list, or a + # future change to what the probe compiles all re-probe instead of trusting a stale verdict. + file(SHA1 "${KATAGO_CK_TILE_INCLUDE_DIR}/ck_tile/ops/fmha_fwd.hpp" _ck_header_hash) + set(_ck_probe_sig "kernels-v2|${KATAGO_CK_TILE_INCLUDE_DIR}|${CMAKE_HIP_COMPILER}|${CMAKE_HIP_COMPILER_VERSION}|${CMAKE_BUILD_TYPE}|${_ck_probe_archs}|${_ck_header_hash}") + if(NOT DEFINED KATAGO_CK_FMHA_COMPILE_OK OR NOT "${KATAGO_CK_FMHA_PROBED_SIG}" STREQUAL "${_ck_probe_sig}") + set(_ck_probe_dir "${CMAKE_BINARY_DIR}/_katago_ck_fmha_probe") + file(MAKE_DIRECTORY "${_ck_probe_dir}") + # Probe with the same HIP flags the real build will use (on Windows these carry the baked + # MSVC/WinSDK include paths without which any HIP compile fails outside the vcvars env). + separate_arguments(_ck_probe_extra_flags NATIVE_COMMAND "${CMAKE_HIP_FLAGS}") + # The per-configuration flags have to be included too, not just the base ones. ck_tile's + # gfx11 and gfx12 kernels use inline asm with "n" (immediate) operand constraints that only + # fold to constants once optimized, so those kernels genuinely do not compile at -O0. Probing + # with the flags the build will really use keeps the verdict honest in both directions: no + # false negative for a normal optimized build, and a correct one for a debug build that would + # in fact fail to compile them. + string(TOUPPER "${CMAKE_BUILD_TYPE}" _ck_probe_build_type) + if(NOT _ck_probe_build_type) + # Multi-config generators choose the configuration at build time rather than now, so probe + # the optimized one. + set(_ck_probe_build_type "RELEASE") + endif() + if(CMAKE_HIP_FLAGS_${_ck_probe_build_type}) + separate_arguments(_ck_probe_config_flags NATIVE_COMMAND "${CMAKE_HIP_FLAGS_${_ck_probe_build_type}}") + list(APPEND _ck_probe_extra_flags ${_ck_probe_config_flags}) + else() + list(APPEND _ck_probe_extra_flags "-O3") + endif() + if(KATAGO_HIP_SYSTEM_INCLUDE_DIR) + list(APPEND _ck_probe_extra_flags "-isystem${KATAGO_HIP_SYSTEM_INCLUDE_DIR}") + endif() + message(STATUS "Probing whether the vendored CK FMHA kernels compile against ${KATAGO_CK_TILE_INCLUDE_DIR} for ${_ck_probe_archs} (may take a little while)...") + set(_ck_probe_ok TRUE) + set(KATAGO_CK_FMHA_FAILED_ARCH "" CACHE INTERNAL "") + foreach(_ck_fam _arch IN ZIP_LISTS _ck_probe_families _ck_probe_archs) + # One d32 file stands in for its whole family: the files share their traits and pipeline + # machinery, so a single instantiation catches API drift and device-code errors without + # paying to compile all fifty-odd of them. An incompatibility confined to the d64 shapes + # would still reach the build. + file(GLOB _ck_fam_srcs "${CMAKE_SOURCE_DIR}/external/composable_kernel_fmha/generated/fmha_fwd_d32_${_ck_fam}_*.cpp") + list(SORT _ck_fam_srcs) + if(NOT _ck_fam_srcs) + continue() + endif() + list(GET _ck_fam_srcs 0 _ck_fam_src) + # A full object compile rather than -fsyntax-only, so that code generation for the arch is + # covered too and the probe tests exactly what the build will do. + execute_process( + COMMAND "${CMAKE_HIP_COMPILER}" -x hip --offload-arch=${_arch} -std=c++17 -c + "-I${CMAKE_SOURCE_DIR}/external/composable_kernel_fmha" + "-isystem${KATAGO_CK_TILE_INCLUDE_DIR}" + ${_ck_probe_extra_flags} + "${_ck_fam_src}" -o "${_ck_probe_dir}/probe_${_ck_fam}.o" + RESULT_VARIABLE _ck_probe_rc + ERROR_VARIABLE _ck_probe_err + OUTPUT_QUIET) + if(NOT _ck_probe_rc EQUAL 0) + file(WRITE "${_ck_probe_dir}/probe_error.log" + "Arch ${_arch} (CK kernel family ${_ck_fam})\nSource: ${_ck_fam_src}\n\n${_ck_probe_err}") + set(KATAGO_CK_FMHA_FAILED_ARCH "${_arch}" CACHE INTERNAL "") + set(_ck_probe_ok FALSE) + break() + endif() + endforeach() + if(_ck_probe_ok) + set(KATAGO_CK_FMHA_COMPILE_OK TRUE CACHE INTERNAL "") + else() + set(KATAGO_CK_FMHA_COMPILE_OK FALSE CACHE INTERNAL "") + endif() + set(KATAGO_CK_FMHA_PROBED_SIG "${_ck_probe_sig}" CACHE INTERNAL "") + endif() + if(KATAGO_CK_FMHA_COMPILE_OK) + set(_katago_ck_fmha_enabled TRUE) + else() + message(STATUS "The vendored CK FMHA kernels failed to compile against the ck_tile headers at ${KATAGO_CK_TILE_INCLUDE_DIR} for arch ${KATAGO_CK_FMHA_FAILED_ARCH} - that ck_tile version may be API-incompatible with the glue, or unable to compile its own kernels for that arch under this toolchain, or the probe hit a toolchain/environment issue (see ${CMAKE_BINARY_DIR}/_katago_ck_fmha_probe/probe_error.log). ROCm backend will only use its built-in (non-fused) attention kernel. For the fused path, install the CK version noted in external/composable_kernel_fmha/README.md or point KATAGO_CK_TILE_INCLUDE_DIR at a compatible copy of the ck_tile headers, and check that it builds for every targeted GPU arch.") + endif() + endif() + + if(_katago_ck_fmha_enabled) + message(STATUS "Found compatible ck_tile headers at ${KATAGO_CK_TILE_INCLUDE_DIR}; enabling optional CK FMHA fused attention path") + file(GLOB KATAGO_CK_FMHA_GENERATED_SOURCES external/composable_kernel_fmha/generated/*.cpp) + set_source_files_properties(${KATAGO_CK_FMHA_GENERATED_SOURCES} PROPERTIES LANGUAGE HIP) + add_library(katago_ck_fmha_kernels OBJECT ${KATAGO_CK_FMHA_GENERATED_SOURCES}) + set_target_properties(katago_ck_fmha_kernels PROPERTIES HIP_ARCHITECTURES "${KATAGO_CK_FMHA_SUPPORTED_ARCHS}") + # SYSTEM/-isystem is required, not just for warning suppression: ck_tile's own headers + # #include , and on systems with a stale libamdhip64-dev under /usr/include, + # a plain -I here still loses to /usr/include for angle-bracket resolution. -isystem does not. + target_include_directories(katago_ck_fmha_kernels SYSTEM PRIVATE ${KATAGO_CK_TILE_INCLUDE_DIR} external/composable_kernel_fmha) + # As above (see the KATAGO_HIP_SYSTEM_INCLUDE_DIR block for `katago` itself): the SYSTEM + # keyword alone isn't enough here either - CMake's include-directory de-duplication drops it as + # "already covered" against hip::device's own plain -I of the same path, so the stale + # /usr/include/hip still wins for this target too unless we force a raw -isystem. This is a + # separate target from `katago`, so it needs its own copy of the same compile option - compile + # options aren't inherited across targets, only via target_link_libraries propagating usage + # requirements, which compile options set via target_compile_options(PRIVATE) are not. + if(KATAGO_HIP_SYSTEM_INCLUDE_DIR) + target_compile_options(katago_ck_fmha_kernels PRIVATE "-isystem${KATAGO_HIP_SYSTEM_INCLUDE_DIR}") + endif() + target_link_libraries(katago katago_ck_fmha_kernels) + target_include_directories(katago SYSTEM PRIVATE ${KATAGO_CK_TILE_INCLUDE_DIR} external/composable_kernel_fmha) + target_compile_definitions(katago PRIVATE KATAGO_ROCM_HAS_CK_FMHA=1) + else() + if(NOT KATAGO_CK_TILE_INCLUDE_DIR) + message(STATUS "ck_tile headers not found; ROCm backend will only use its built-in (non-fused) attention kernel") + endif() + target_compile_definitions(katago PRIVATE KATAGO_ROCM_HAS_CK_FMHA=0) + endif() + # On Windows plain clang++ (not hipcc) is the CXX compiler, so rocmbackend.cpp - which contains + # the device-code-including shared backend - must get real HIP compilation via a source property, + # CK or no CK. (The CK generated files get the same property inside the CK branch above.) + # rocmbackend.cpp still compiles for every arch, since it also holds the non-CK ROCm backend + # logic - it guards its own CK usage per-arch internally (see KATAGO_ROCM_CK_FMHA_ARCH_OK in + # rocmbackend.cpp) rather than being arch-excluded here. + if(WIN32) + set_source_files_properties(neuralnet/rocmbackend.cpp PROPERTIES LANGUAGE HIP) + endif() elseif(USE_BACKEND STREQUAL "EIGEN") target_compile_definitions(katago PRIVATE USE_EIGEN_BACKEND) # Allow EIGEN3_INCLUDE_DIRS as a manual override (for users who downloaded @@ -535,6 +1587,89 @@ elseif(USE_BACKEND STREQUAL "EIGEN") message(STATUS "Found Eigen3 at ${EIGEN3_INCLUDE_DIRS}") endif() endif() +elseif(USE_BACKEND STREQUAL "ONNX") + target_compile_definitions(katago PRIVATE USE_ONNX_BACKEND) + + # ONNX Runtime install tree (include/ lib/ bin/). The official prebuilt ORT packages do + # NOT ship the OpenVINO execution provider, so for Intel GPU acceleration ORT must be + # built from source with --use_openvino GPU (see Compiling.md). + set(ONNXRUNTIME_ROOT "" CACHE PATH "Path to ONNX Runtime package root (containing include/, lib/, bin/)") + if(NOT IS_DIRECTORY "${ONNXRUNTIME_ROOT}") + message(FATAL_ERROR "ONNXRUNTIME_ROOT does not exist: ${ONNXRUNTIME_ROOT}. Set -DONNXRUNTIME_ROOT=.") + endif() + set(ONNXRUNTIME_INCLUDE_DIR "${ONNXRUNTIME_ROOT}/include/onnxruntime") + if(NOT IS_DIRECTORY "${ONNXRUNTIME_INCLUDE_DIR}") + # Official prebuilt ORT packages (e.g. onnxruntime-win-x64-*.zip / -linux-x64-*.tgz) lay + # the headers flat under include/ (include/onnxruntime_cxx_api.h, ...), while an ORT + # built from source installs them under include/onnxruntime/. Support both layouts. + set(ONNXRUNTIME_INCLUDE_DIR "${ONNXRUNTIME_ROOT}/include") + endif() + if(NOT IS_DIRECTORY "${ONNXRUNTIME_INCLUDE_DIR}") + message(FATAL_ERROR "ONNX Runtime include directory not found under ${ONNXRUNTIME_ROOT}. Looked for both include/ and include/onnxruntime/.") + endif() + target_include_directories(katago SYSTEM PRIVATE "${ONNXRUNTIME_INCLUDE_DIR}") + if(WIN32) + set(ONNXRUNTIME_LIB "${ONNXRUNTIME_ROOT}/lib/onnxruntime.lib") + file(GLOB ONNXRUNTIME_DLLS "${ONNXRUNTIME_ROOT}/lib/*.dll" "${ONNXRUNTIME_ROOT}/bin/*.dll") + else() + find_library(ONNXRUNTIME_LIB onnxruntime HINTS "${ONNXRUNTIME_ROOT}/lib" "${ONNXRUNTIME_ROOT}/bin" "${ONNXRUNTIME_ROOT}") + endif() + if(NOT ONNXRUNTIME_LIB OR ONNXRUNTIME_LIB STREQUAL "ONNXRUNTIME_LIB-NOTFOUND" OR NOT EXISTS "${ONNXRUNTIME_LIB}") + message(FATAL_ERROR "Could not find onnxruntime library under ${ONNXRUNTIME_ROOT}. Looked for: ${ONNXRUNTIME_LIB}") + endif() + target_link_libraries(katago ${ONNXRUNTIME_LIB}) + + # The ONNX emitter whose bytes go to Ort::Session, and the protobuf it needs, are set up in the + # shared block after this backend chain. Protobuf and protoc must be findable by + # find_package(Protobuf); for an ORT built from source they live under its _deps/protobuf-build. + + # Deploy the ORT runtime DLLs next to katago.exe so the build dir is self-contained. + # NOTE: OpenVINO's own runtime DLLs are not shipped by ORT and must be copied + # separately (see Compiling.md). + if(WIN32 AND ONNXRUNTIME_DLLS) + foreach(_onnxruntime_dll IN LISTS ONNXRUNTIME_DLLS) + add_custom_command(TARGET katago POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${_onnxruntime_dll}" + $) + endforeach() + endif() +endif() + +# The TensorRT and ONNX backends both build their network by emitting an ONNX ModelProto with +# OnnxModelBuilder and handing the serialized bytes to nvonnxparser or to Ort::Session, so both +# compile the vendored schema external/onnx/onnx.proto with protoc and link our own protobuf. +# Serialized bytes are not ABI contact, so our protobuf never meets the one TensorRT links into +# nvonnxparser, or whichever one lives inside the ONNX Runtime library. +if(USE_BACKEND STREQUAL "TENSORRT" OR USE_BACKEND STREQUAL "ONNX") + # Static by default for ONNX only, and deliberately so - do not unify this with the TensorRT + # case, which would change how Windows TensorRT builds resolve protobuf. A from-source ONNX + # Runtime bundles a static protobuf, which module-mode FindProtobuf would otherwise take for a + # shared import lib, injecting PROTOBUF_USE_DLLS into the imported target and breaking the link. + # Linking ours statically also keeps it out of the global symbol namespace, where it could merge + # with the protobuf inside ONNX Runtime: both embed onnx.proto, and one descriptor pool holding + # two registrations of the same file aborts at startup. That second point is a precaution rather + # than a diagnosed bug, since the shared-protobuf configuration has never been tried against a + # real ONNX Runtime, so whether it actually clashes is unknown. + # Override with -DProtobuf_USE_STATIC_LIBS=FALSE. Only module-mode FindProtobuf honors it: a + # config-mode protobuf, as from a vcpkg toolchain or protobuf 22 and up with its abseil + # dependencies, ignores the variable entirely. + if(USE_BACKEND STREQUAL "ONNX" AND NOT DEFINED Protobuf_USE_STATIC_LIBS) + set(Protobuf_USE_STATIC_LIBS TRUE) + endif() + find_package(Protobuf REQUIRED) + message(STATUS "Found Protobuf version: ${Protobuf_VERSION}") + set(ONNX_PROTO_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/onnx") + protobuf_generate_cpp(ONNX_PROTO_SRCS ONNX_PROTO_HDRS "${ONNX_PROTO_DIR}/onnx.proto") + # protoc-generated code is not ours to lint; silence its warnings to keep build output readable. + set_source_files_properties(${ONNX_PROTO_SRCS} PROPERTIES COMPILE_OPTIONS "-w") + target_sources(katago PRIVATE ${ONNX_PROTO_SRCS} neuralnet/onnxmodelbuilder.cpp) + # Generated onnx.pb.h lands in the build dir; let backend code include it. + target_include_directories(katago SYSTEM PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${Protobuf_INCLUDE_DIRS}) + # Link the imported target rather than ${Protobuf_LIBRARIES}: when protobuf comes from a CMake + # package config (e.g. vcpkg), the variable can resolve to the DLL itself rather than the import + # lib, and it also omits protobuf's own dependencies such as abseil. + target_link_libraries(katago protobuf::libprotobuf) endif() if(USE_BIGGER_BOARDS_EXPENSIVE) @@ -545,6 +1680,69 @@ if(NO_GIT_REVISION AND (NOT BUILD_DISTRIBUTED)) target_compile_definitions(katago PRIVATE NO_GIT_REVISION) endif() +# On Windows ROCm builds, zlib is bundled inside the HIP SDK (TheRock layout) - try that first. +# The bundled header is only taken together with the bundled library: mixing zlib.h from one +# distribution with a .lib/.dll from another (e.g. vcpkg's, below) risks a version skew that +# zlib's inflateInit_ header-vs-library check would reject at runtime, at first .gz model load. +if(WIN32 AND USE_BACKEND STREQUAL "ROCM" AND DEFINED ENV{HIP_PATH}) + if(NOT ZLIB_LIBRARY AND NOT ZLIB_INCLUDE_DIR AND EXISTS "$ENV{HIP_PATH}/lib/rocm_sysdeps/include/zlib.h") + foreach(_zlib_name "zlibstatic.lib" "zlib.lib" "zlibstaticd.lib") + if(EXISTS "$ENV{HIP_PATH}/lib/rocm_sysdeps/lib/${_zlib_name}") + set(ZLIB_LIBRARY "$ENV{HIP_PATH}/lib/rocm_sysdeps/lib/${_zlib_name}" CACHE FILEPATH "" FORCE) + set(ZLIB_INCLUDE_DIR "$ENV{HIP_PATH}/lib/rocm_sysdeps/include" CACHE PATH "" FORCE) + break() + endif() + endforeach() + endif() +endif() + +# TheRock's Windows package (as of ~7.13) ships zlib.h under rocm_sysdeps/include but no linkable +# .lib anymore (the block above then takes neither, keeping header and library paired) - auto-fetch +# zlib via vcpkg instead of requiring the user to separately install a package manager (see +# KATAGO_AUTO_FETCH_DEPS above). +# +# Probe for a normal system zlib first (quiet - the "real", error-emitting find_package(ZLIB) call +# is further below): on a fresh Linux configure, ZLIB_INCLUDE_DIR/ZLIB_LIBRARY are never set by +# anything above this point regardless of whether the system already has zlib1g-dev installed (as +# Compiling.md's Linux instructions require), so without this probe the check below would always +# be true and vcpkg would fire unconditionally on every Linux build - needlessly cloning vcpkg, +# downloading its own CMake, and building zlib from source even when the system package is right +# there. When the probe finds the system zlib, the later find_package call reuses the cached +# result at no extra cost. On Windows this probe typically finds nothing and the vcpkg path +# still fires. +if(KATAGO_AUTO_FETCH_DEPS AND (NOT ZLIB_INCLUDE_DIR OR NOT ZLIB_LIBRARY)) + find_package(ZLIB QUIET) +endif() + +if(KATAGO_AUTO_FETCH_DEPS AND (NOT ZLIB_INCLUDE_DIR OR NOT ZLIB_LIBRARY)) + katago_vcpkg_install_if_needed("zlib") + set(_katago_vcpkg_installed_root "${KATAGO_VCPKG_ROOT}/installed/${KATAGO_VCPKG_TRIPLET}") + if(NOT ZLIB_INCLUDE_DIR AND EXISTS "${_katago_vcpkg_installed_root}/include/zlib.h") + set(ZLIB_INCLUDE_DIR "${_katago_vcpkg_installed_root}/include" CACHE PATH "Path to directory with zlib.h and other header files" FORCE) + endif() + if(NOT ZLIB_LIBRARY) + find_library(_katago_zlib_lib NAMES zlib z zlibstatic HINTS "${_katago_vcpkg_installed_root}/lib" NO_DEFAULT_PATH) + if(_katago_zlib_lib) + set(ZLIB_LIBRARY "${_katago_zlib_lib}" CACHE FILEPATH "Path to 'libz.so' on Linux or 'libz.lib' on Windows" FORCE) + endif() + endif() +endif() + +# vcpkg's default triplets (e.g. x64-windows) build zlib as a DLL, not a static lib - the .lib is +# just an import lib, so the matching runtime DLL must be copied next to katago.exe at build time +# (the POST_BUILD step further below). Derived from the cached library path rather than set inside +# the install flow above: on a reconfigure ZLIB_LIBRARY is already cached and that flow is skipped +# entirely, so a flow-scoped flag would silently drop the DLL-copy step from the regenerated build. +set(KATAGO_ZLIB_IS_VCPKG_DLL FALSE) +if(WIN32 AND ZLIB_LIBRARY) + file(TO_CMAKE_PATH "${ZLIB_LIBRARY}" _katago_zlib_norm) + file(TO_CMAKE_PATH "${KATAGO_VCPKG_ROOT}" _katago_vcpkg_norm) + string(FIND "${_katago_zlib_norm}" "${_katago_vcpkg_norm}/" _katago_zlib_in_vcpkg) + if(_katago_zlib_in_vcpkg EQUAL 0) + set(KATAGO_ZLIB_IS_VCPKG_DLL TRUE) + endif() +endif() + find_package(ZLIB) if(ZLIB_FOUND) include_directories(${ZLIB_INCLUDE_DIRS}) @@ -556,6 +1754,56 @@ else() message(SEND_ERROR "${ColorBoldRed}zlib was not found, if zlib is actually installed but not being found you can set ZLIB_INCLUDE_DIR to the directory with zlib.h and other headers, and ZLIB_LIBRARY to the compiled library 'libz.so' on Linux or 'libz.lib' on Windows. On the command line, this is -DZLIB_INCLUDE_DIR=... and -DZLIB_LIBRARY=... ${ColorReset}") endif(ZLIB_FOUND) +if(KATAGO_ZLIB_IS_VCPKG_DLL) + get_filename_component(_katago_zlib_lib_dir "${ZLIB_LIBRARY}" DIRECTORY) + get_filename_component(_katago_vcpkg_pkg_root "${_katago_zlib_lib_dir}" DIRECTORY) + file(GLOB _katago_zlib_dlls "${_katago_vcpkg_pkg_root}/bin/*.dll") + foreach(_katago_zlib_dll IN LISTS _katago_zlib_dlls) + add_custom_command(TARGET katago POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_katago_zlib_dll}" "$" + VERBATIM) + endforeach() +endif() + +# On Windows ROCm builds, copy the HIP/MIOpen/rocBLAS runtime DLLs next to katago.exe so it runs +# without the user needing to manually copy anything or add HIP_PATH/bin to PATH themselves. +# amdhip64_*.dll in particular must be copied (not just PATH-resolved): AMD's GPU driver installs +# its own, potentially older/incompatible copy into System32, which would otherwise take priority. +if(WIN32 AND USE_BACKEND STREQUAL "ROCM" AND DEFINED ENV{HIP_PATH}) + file(TO_CMAKE_PATH "$ENV{HIP_PATH}" _katago_hip_path) + file(GLOB _katago_rocm_runtime_dlls + "${_katago_hip_path}/bin/amdhip64_*.dll" + "${_katago_hip_path}/bin/hipblas.dll" + "${_katago_hip_path}/bin/MIOpen.dll" + "${_katago_hip_path}/bin/rocblas.dll" + "${_katago_hip_path}/bin/libhipblaslt.dll" + "${_katago_hip_path}/bin/amdocl64.dll" + "${_katago_hip_path}/bin/hiprtc*.dll" + "${_katago_hip_path}/bin/amd_comgr*.dll" + # Transitive dependencies that katago does not link against directly. hipblas imports + # rocsolver, and amdhip64 imports rocm_kpack in TheRock's multi-arch distributions, where + # rocm_kpack loads the per-architecture device code. Without these, katago.exe fails to start + # and prints nothing at all unless HIP_PATH/bin is on PATH. + "${_katago_hip_path}/bin/rocsolver.dll" + "${_katago_hip_path}/bin/rocm_kpack.dll" + ) + foreach(_katago_rocm_dll IN LISTS _katago_rocm_runtime_dlls) + add_custom_command(TARGET katago POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_katago_rocm_dll}" "$" + VERBATIM) + endforeach() + # rocBLAS/hipBLASLt look for their kernel library files relative to their own DLL's location. + foreach(_katago_rocm_lib_subdir IN ITEMS rocblas hipblaslt) + if(IS_DIRECTORY "${_katago_hip_path}/bin/${_katago_rocm_lib_subdir}/library") + add_custom_command(TARGET katago POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${_katago_hip_path}/bin/${_katago_rocm_lib_subdir}/library" + "$/${_katago_rocm_lib_subdir}/library" + VERBATIM) + endif() + endforeach() +endif() + find_library(LIBZIP_LIBRARY NAMES zip) find_path(LIBZIP_INCLUDE_DIR_ZIP NAMES zip.h) find_path(LIBZIP_INCLUDE_DIR_ZIPCONF NAMES zipconf.h) @@ -651,12 +1899,26 @@ if(MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:8388608") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") message(STATUS "Setting up build for GNU, Clang or MinGW.") - if(NOT (${CMAKE_SYSTEM_PROCESSOR} MATCHES "(arm|aarch32|aarch64)")) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse") - else() + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "(arm|aarch32|aarch64)") # For ARM architecture, as a hack, ensure that char is signed message(STATUS "ARM architecture detected: adding -fsigned-char flag") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsigned-char") + else() + # KataGo wants IEEE-compliant float math. + # On x86-64 SSE-based IEEE float math is already the ABI default (x87 excess precision cannot occur), + # but mandate it explicitly anyway. + if(USE_BACKEND STREQUAL "ROCM") + if(NOT WIN32) + # hipcc/hip-clang treats every source as an offload compilation, and the AMDGPU device + # pass hard-errors on a bare -mfpmath=sse ("unknown FP unit 'sse'"). -Xarch_host applies + # the flag to the host-side half of the compilation only. Device float math is IEEE + # arithmetic in its own right, so no equivalent flag exists or is needed there. + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xarch_host -mfpmath=sse") + set(CMAKE_HIP_FLAGS "${CMAKE_HIP_FLAGS} -Xarch_host -mfpmath=sse") + endif() + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse") + endif() endif() if(USE_AVX2) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mfma") @@ -688,7 +1950,14 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "C else() message(STATUS "Enabling Clang-specific build options.") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnull-dereference -Wdangling-else") - target_link_libraries(katago "atomic") + if(NOT WIN32) + # libatomic is a Linux GCC/Clang runtime, not needed or available on Windows + target_link_libraries(katago "atomic") + else() + # Match the 8 MB stack every MSVC-built KataGo requests in the if(MSVC) branch above. + # Without this a Windows clang/lld-link build gets the 1 MB default. + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,/STACK:8388608") + endif() endif() if(USE_TCMALLOC) @@ -700,3 +1969,40 @@ endif() target_include_directories(katago PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) +# On Windows ROCm builds, clang compiles host code against MSVC-compatibility headers +# that require Windows SDK ucrt/shared/um headers. +if(WIN32 AND USE_BACKEND STREQUAL "ROCM") + # Prefer the KATAGO_WINSDK_ROOT detected earlier in the pre-project() block + if(NOT KATAGO_WINSDK_ROOT) + get_filename_component(_winsdk_root2 + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" + ABSOLUTE) + if(EXISTS "${_winsdk_root2}") + set(KATAGO_WINSDK_ROOT "${_winsdk_root2}" CACHE INTERNAL "") + else() + katago_win_winsdk_fallback_dirs(_winsdk_candidates2) + foreach(_p IN LISTS _winsdk_candidates2) + if(EXISTS "${_p}") + set(KATAGO_WINSDK_ROOT "${_p}" CACHE INTERNAL "") + break() + endif() + endforeach() + endif() + endif() + if(KATAGO_WINSDK_ROOT) + file(GLOB _sdk_ver_dirs "${KATAGO_WINSDK_ROOT}/Include/*/ucrt") + if(_sdk_ver_dirs) + list(SORT _sdk_ver_dirs COMPARE NATURAL ORDER DESCENDING) + list(GET _sdk_ver_dirs 0 _ucrt_dir) + get_filename_component(_sdk_ver_dir "${_ucrt_dir}" DIRECTORY) + set(_winsdk_include "${_sdk_ver_dir}") + message(STATUS "Auto-detected Windows SDK include root: ${_winsdk_include}") + target_include_directories(katago PRIVATE + "${_winsdk_include}/ucrt" + "${_winsdk_include}/shared" + "${_winsdk_include}/um" + ) + endif() + endif() +endif() + diff --git a/cpp/README.md b/cpp/README.md index 1f5d8d21fc..a68e313949 100644 --- a/cpp/README.md +++ b/cpp/README.md @@ -9,13 +9,13 @@ Summary of source folders, in approximate dependency order, from lowest level to * `board.{cpp,h}` - Raw board implementation, without move history. Helper functions for Benson's algorithm and ladder search. * `boardhistory.{cpp,h}` - Datastructure that does include move history - handles superko, passing, game end, final scoring, komi, handicap detection, etc. * `graphhash.{cpp,h}` - History-sensitive hash used for [monte-carlo graph search](https://github.com/lightvector/KataGo/blob/master/docs/GraphSearch.md). -* `neuralnet` - Neural net GPU implementation and interface. Contains OpenCL, CUDA, Eigen, TensorRT backends along with common interfaces and model data structures. +* `neuralnet` - Neural net GPU implementation and interface. Contains OpenCL, CUDA, Eigen, TensorRT, ROCm, ONNX, Metal backends along with common interfaces and model data structures. * `desc.{cpp,h}` - Data structure holding neural net structure and weights. * `modelversion.{cpp,h}` - Enumerates the various versions of neural net features and models. * `nninputs.{cpp,h}` - Implements the input features for the neural net. * `sgfmetadata.{cpp,h}` - Implements the input features for the [HumanSL neural net](https://github.com/lightvector/KataGo/blob/master/docs/Analysis_Engine.md#human-sl-analysis-guide), for conditioning on various SGF metadata about human players from training data. * `nninterface.h` - Common interface that is implemented by every low-level neural net backend. - * `{cuda,opencl,eigen,trt,dummy}backend.cpp` - Various backends. + * `{cuda,opencl,eigen,trt,rocm,onnx,metal,dummy}backend.cpp` - Various backends. * `nneval.{cpp,h}` - Top-level handle to the neural net used by the rest of the engine, implements thread-safe batching of queries. * `search` - The main search engine. * `timecontrols.cpp` - Basic handling of a few possible time controls. diff --git a/cpp/book/book.cpp b/cpp/book/book.cpp index 298509cb92..2723742c66 100644 --- a/cpp/book/book.cpp +++ b/cpp/book/book.cpp @@ -145,8 +145,8 @@ void BookHash::getHashAndSymmetry(const BoardHistory& hist, int repBound, BookHa for(int symmetry = 0; symmetry < numSymmetries; symmetry++) { boardsBySym[symmetry] = SymmetryHelpers::getSymBoard(hist.initialBoard,symmetry); - //Replay and hash under the same pass-alive computation mode as the history we're hashing. - histsBySym[symmetry] = BoardHistory(boardsBySym[symmetry], hist.initialPla, hist.rules, hist.initialEncorePhase, hist.alwaysComputePassAliveUnderSuicideRules); + //Replay and hash under the same BoardHistoryModes as the history we're hashing. + histsBySym[symmetry] = BoardHistory(boardsBySym[symmetry], hist.initialPla, hist.rules, hist.initialEncorePhase, hist.modes); accums[symmetry] = Hash128(); } @@ -861,14 +861,14 @@ Book::Book( const Rules& r, Player p, int rb, - bool alwaysPassAliveSuicide, + const BoardHistoryModes& hModes, BookParams bp ) : bookVersion(bversion), initialBoard(b), initialRules(r), initialPla(p), repBound(rb), - alwaysComputePassAliveUnderSuicideRules(alwaysPassAliveSuicide), + historyModes(hModes), params(bp), initialSymmetry(0), root(nullptr), @@ -876,13 +876,19 @@ Book::Book( nodeIdxMapsByHash(nullptr), nextVisitedDoneValue(1) { - //Older binaries silently mis-hash flagged books rather than erroring, so flagged books must use - //a version those binaries reject. See comment on LATEST_BOOK_VERSION. - if(alwaysComputePassAliveUnderSuicideRules && bookVersion < 3) + //Older binaries silently mis-hash flagged books rather than erroring, so a book flagged with a + //mode must use at least the version that introduced that mode, which those binaries reject. + //See comment on LATEST_BOOK_VERSION. + if(historyModes.alwaysComputePassAliveUnderSuicideRules && bookVersion < 3) throw StringError( "Books with alwaysComputePassAliveUnderSuicideRules=true require book version >= 3, got version " + Global::intToString(bookVersion) ); + if(historyModes.excludeTerritoryAdjacentToAtari && bookVersion < 4) + throw StringError( + "Books with excludeTerritoryAdjacentToAtari=true require book version >= 4, got version " + + Global::intToString(bookVersion) + ); nodeIdxMapsByHash = new std::map[NUM_HASH_BUCKETS]; @@ -891,7 +897,7 @@ Book::Book( vector rootSymmetries; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard, initialPla, initialRules, initialEncorePhase, alwaysComputePassAliveUnderSuicideRules); + BoardHistory initialHist(initialBoard, initialPla, initialRules, initialEncorePhase, historyModes); BookHash::getHashAndSymmetry(initialHist, repBound, rootHash, symmetryToAlign, rootSymmetries, bookVersion); initialSymmetry = symmetryToAlign; @@ -911,7 +917,7 @@ BoardHistory Book::getInitialHist() const { } BoardHistory Book::getInitialHist(int symmetry) const { int initialEncorePhase = 0; - return BoardHistory(SymmetryHelpers::getSymBoard(initialBoard,symmetry), initialPla, initialRules, initialEncorePhase, alwaysComputePassAliveUnderSuicideRules); + return BoardHistory(SymmetryHelpers::getSymBoard(initialBoard,symmetry), initialPla, initialRules, initialEncorePhase, historyModes); } size_t Book::size() const { @@ -3017,7 +3023,8 @@ void Book::saveToStream(std::ostream& out) const { paramsDump["initialRules"] = initialRules.toJson(); paramsDump["initialPla"] = PlayerIO::playerToString(initialPla); paramsDump["repBound"] = repBound; - paramsDump["alwaysComputePassAliveUnderSuicideRules"] = alwaysComputePassAliveUnderSuicideRules; + paramsDump["alwaysComputePassAliveUnderSuicideRules"] = historyModes.alwaysComputePassAliveUnderSuicideRules; + paramsDump["excludeTerritoryAdjacentToAtari"] = historyModes.excludeTerritoryAdjacentToAtari; paramsDump["errorFactor"] = params.errorFactor; paramsDump["costPerMove"] = params.costPerMove; paramsDump["costPerUCBWinLossLoss"] = params.costPerUCBWinLossLoss; @@ -3147,26 +3154,29 @@ void Book::saveToStream(std::ostream& out) const { out << std::flush; } -bool Book::readAlwaysComputePassAliveUnderSuicideRulesOfFileHeader(const std::string& fileName) { +BoardHistoryModes Book::readHistoryModesOfFileHeader(const std::string& fileName) { std::ifstream in; FileUtils::open(in, fileName); try { - return readAlwaysComputePassAliveUnderSuicideRulesOfHeader(in); + return readHistoryModesOfHeader(in); } catch(const std::exception& e) { throw IOError("When parsing book file " + fileName + ": " + e.what()); } } -bool Book::readAlwaysComputePassAliveUnderSuicideRulesOfHeader(std::istream& in) { +BoardHistoryModes Book::readHistoryModesOfHeader(std::istream& in) { std::string line; getline(in,line); if(!in) throw IOError("Could not load initial metadata line from book data"); json params = json::parse(line); + BoardHistoryModes modes; if(params.contains("alwaysComputePassAliveUnderSuicideRules")) - return params["alwaysComputePassAliveUnderSuicideRules"].get(); - return false; + modes.alwaysComputePassAliveUnderSuicideRules = params["alwaysComputePassAliveUnderSuicideRules"].get(); + if(params.contains("excludeTerritoryAdjacentToAtari")) + modes.excludeTerritoryAdjacentToAtari = params["excludeTerritoryAdjacentToAtari"].get(); + return modes; } Book* Book::loadFromFile(const std::string& fileName, int numThreadsForRecompute) { @@ -3196,7 +3206,7 @@ Book* Book::loadFromStreamHelper(std::istream& in, int numThreadsForRecompute, c json params = json::parse(line); assertContains(params,"version"); int bookVersion = params["version"].get(); - if(bookVersion != 1 && bookVersion != 2 && bookVersion != 3) + if(bookVersion != 1 && bookVersion != 2 && bookVersion != 3 && bookVersion != 4) throw IOError("Unsupported book version: " + Global::intToString(bookVersion)); assertContains(params,"initialBoard"); @@ -3239,9 +3249,12 @@ Book* Book::loadFromStreamHelper(std::istream& in, int numThreadsForRecompute, c bookParams.visitsScaleLeaves = params.contains("visitsScaleLeaves") ? params["visitsScaleLeaves"].get() : 1.0; bookParams.sharpScoreOutlierCap = params.contains("sharpScoreOutlierCap") ? params["sharpScoreOutlierCap"].get() : 10000.0; - //Absent in older book files = false - bool alwaysComputePassAliveUnderSuicideRules = + //Absent flags in older book files = false + BoardHistoryModes historyModes; + historyModes.alwaysComputePassAliveUnderSuicideRules = params.contains("alwaysComputePassAliveUnderSuicideRules") ? params["alwaysComputePassAliveUnderSuicideRules"].get() : false; + historyModes.excludeTerritoryAdjacentToAtari = + params.contains("excludeTerritoryAdjacentToAtari") ? params["excludeTerritoryAdjacentToAtari"].get() : false; book = std::make_unique( bookVersion, @@ -3249,7 +3262,7 @@ Book* Book::loadFromStreamHelper(std::istream& in, int numThreadsForRecompute, c initialRules, initialPla, repBound, - alwaysComputePassAliveUnderSuicideRules, + historyModes, bookParams ); diff --git a/cpp/book/book.h b/cpp/book/book.h index d4d0633684..595d6a2384 100644 --- a/cpp/book/book.h +++ b/cpp/book/book.h @@ -363,9 +363,9 @@ class Book { const Rules initialRules; const Player initialPla; const int repBound; - //Whether all histories and hashes of this book compute pass-alive area as if multi-stone suicide - //were legal regardless of the actual suicide rule. Recorded in the book file (absent = false). - const bool alwaysComputePassAliveUnderSuicideRules; + //The BoardHistoryModes under which all histories and hashes of this book are computed. + //Recorded in the book file per-flag (absent flags = false). + const BoardHistoryModes historyModes; private: BookParams params; @@ -387,22 +387,25 @@ class Book { const Rules& rules, Player initialPla, int repBound, - bool alwaysComputePassAliveUnderSuicideRules, + const BoardHistoryModes& historyModes, BookParams params ); ~Book(); - //Reads just the metadata header of a saved book file to get its recorded pass-alive computation - //mode without loading the whole book. Absent key (older book files) = false. - static bool readAlwaysComputePassAliveUnderSuicideRulesOfFileHeader(const std::string& fileName); - static bool readAlwaysComputePassAliveUnderSuicideRulesOfHeader(std::istream& in); - - //Version 3 is identical to version 2 in format and hashing, except that it may record - //alwaysComputePassAliveUnderSuicideRules=true. Flagged books require version >= 3 so that older - //binaries reject them cleanly ("Unsupported book version") instead of silently mis-hashing them - //into a disconnected mess. All new books are written as version 3, so new book files require - //this version of KataGo or later to load, whether flagged or not. - static constexpr int LATEST_BOOK_VERSION = 3; + //Reads just the metadata header of a saved book file to get its recorded BoardHistoryModes + //without loading the whole book. Absent keys (older book files) = false. + static BoardHistoryModes readHistoryModesOfFileHeader(const std::string& fileName); + static BoardHistoryModes readHistoryModesOfHeader(std::istream& in); + + //Versions 3 and 4 are identical to version 2 in format and hashing, except that version 3 may + //record alwaysComputePassAliveUnderSuicideRules=true and version 4 may additionally record + //excludeTerritoryAdjacentToAtari=true. A book flagged with a mode requires at least the version + //that introduced that mode, so that older binaries reject it cleanly ("Unsupported book version") + //instead of ignoring the unrecognized flag in the header and silently mis-hashing the book into a + //disconnected mess. Each new mode therefore needs its own version bump. + //All new books are written as the latest version, so new book files require this version of + //KataGo or later to load, whether flagged or not. + static constexpr int LATEST_BOOK_VERSION = 4; Book(const Book&) = delete; Book& operator=(const Book&) = delete; diff --git a/cpp/command/analysis.cpp b/cpp/command/analysis.cpp index 9a6e1f035f..12c8bb76b7 100644 --- a/cpp/command/analysis.cpp +++ b/cpp/command/analysis.cpp @@ -1158,10 +1158,10 @@ int MainCmds::analysis(const vector& args) { } Player nextPla = initialPlayer; - //Keep this request's history consistent with the pass-alive computation mode that the search + //Keep this request's history consistent with the BoardHistoryModes that the search //for this request will resolve to. (The search would re-stamp its own copy anyway, but this keeps - //any adjudication done during request setup/replay consistent with it.) - BoardHistory hist(board,nextPla,rules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(rbase.params, nnEval)); + //any adjudication done during request setup/replay consistent with them.) + BoardHistory hist(board,nextPla,rules,0,Search::resolveHistoryModes(rbase.params, nnEval)); hist.setAssumeMultipleStartingBlackMovesAreHandicap(assumeMultipleStartingBlackMovesAreHandicap); if(warnUnusedFields) { diff --git a/cpp/command/benchmark.cpp b/cpp/command/benchmark.cpp index 89ecd1bb19..06b22d670d 100644 --- a/cpp/command/benchmark.cpp +++ b/cpp/command/benchmark.cpp @@ -264,6 +264,12 @@ int MainCmds::benchmark(const vector& args) { cout << "If you have a strong GPU capable of FP16 tensor cores (e.g. RTX2080), " << "using the Cuda version of KataGo instead may give a mild performance boost." << endl; #endif +#ifdef USE_ROCM_BACKEND + cout << "You are currently using the ROCm version of KataGo." << endl; + cout << "Your GTP config is currently set to rocmUseFP16 = " << nnEval->getUsingFP16Mode().toString() << endl; + if(nnEval->getUsingFP16Mode() == enabled_t::False) + cout << "If you have a strong GPU capable of FP16 setting this to true may give a large performance boost." << endl; +#endif #ifdef USE_EIGEN_BACKEND cout << "You are currently using the Eigen (CPU) version of KataGo. Due to having no GPU, it may be slow." << endl; #endif @@ -307,7 +313,7 @@ int MainCmds::benchmark(const vector& args) { static void warmStartNNEval(const CompactSgf& sgf, Logger& logger, const SearchParams& params, NNEvaluator* nnEval, Rand& seedRand) { Board board(sgf.xSize,sgf.ySize); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,Rules(),0,false); + BoardHistory hist(board,nextPla,Rules(),0,BoardHistoryModes()); SearchParams thisParams = params; thisParams.numThreads = 1; thisParams.maxVisits = 5; diff --git a/cpp/command/contribute.cpp b/cpp/command/contribute.cpp index e6809f0685..1f61399c2e 100644 --- a/cpp/command/contribute.cpp +++ b/cpp/command/contribute.cpp @@ -11,6 +11,7 @@ #include "../dataio/homedata.h" #include "../external/nlohmann_json/json.hpp" #include "../neuralnet/modelversion.h" +#include "../neuralnet/nninterface.h" #include "../search/asyncbot.h" #include "../program/play.h" #include "../program/setup.h" @@ -143,6 +144,9 @@ static void runAndUploadSingleGame( istringstream taskCfgIn(gameTask.task.config); ConfigParser taskCfg(taskCfgIn); + //Consumed at model load time by the backend reference output check rather than here, so just + //suppress the unused key warning. + taskCfg.markKeyUsed("backendRefTestLenienceFactor"); const std::string overrides = gameTask.repIdx < gameTask.task.overrides.size() ? gameTask.task.overrides[gameTask.repIdx] : std::string(); try { if(overrides.size() > 0) { @@ -610,11 +614,14 @@ int MainCmds::contribute(const vector& args) { watchOngoingGameInFileName = "watchgame.txt"; //Connect to server and get global parameters for the run. + //Report any runtime backend detail (e.g. which ONNX execution provider the config + //selects) along with the compile-time backend, so the server can distinguish them. Client::Connection* connection = new Client::Connection( serverUrl,username,password,caCertsFile, proxyUrl, modelDownloadMirrorBaseUrl, mirrorUseProxy, + NeuralNet::getRuntimeBackendDetail(*userCfg), &logger ); connection->testConnection(); @@ -844,7 +851,8 @@ int MainCmds::contribute(const vector& args) { auto loadNeuralNetIntoManager = [&runParams,&tdataDir,&sgfsDir,&logger,&userCfg,maxSimultaneousGames,maxSimultaneousRatingGamesPossible,&userCfgWarnedYet, &invalidModelErrorTimer,&invalidModelErrorEwms,&lastInvalidModelErrorTime,&invalidModelErrorMutex,&shouldPause]( - SelfplayManager* manager, const Client::ModelInfo modelInfo, const string& modelFile, bool isRatingManager + SelfplayManager* manager, const Client::ModelInfo modelInfo, const string& modelFile, bool isRatingManager, + double backendRefLenienceFactor ) { const string& modelName = modelInfo.name; if(manager->hasModel(modelName)) @@ -932,7 +940,7 @@ int MainCmds::contribute(const vector& args) { const bool verbose = false; const bool quickTest = true; // Cap test to avoid spawning too many threads when many selfplay games are running - const int maxBatchSizeCap = std::min(4, 1 + nnEval->getMaxBatchSize()/2); + const int maxBatchSizeCap = std::min(7, 1 + nnEval->getMaxBatchSize()/2); bool fp32BatchSuccessBuf = true; bool fp32BatchSuccessBufRect = true; const string referenceFileName = ""; @@ -955,7 +963,7 @@ int MainCmds::contribute(const vector& args) { success = success && successRect; if(!fp32BatchSuccessBuf) { - logger.write("Error: large GPU numerical errors, unable to continue"); + logger.write("Error: large GPU numerical errors testing model " + modelName + ", unable to continue"); shouldStop.store(true); shouldStopGracefully.store(true); shouldPause->setPermanently(false); @@ -965,16 +973,46 @@ int MainCmds::contribute(const vector& args) { return false; } if(!success) { - logger.write("Warning: large FP16 errors, using FP32 instead"); + logger.write("Warning: large FP16 errors on model " + modelName + ", using FP32 instead"); testAssert(nnEval32 != nnEval); delete nnEval; nnEval = nnEval32; } else { - logger.write("Testing loaded net okay"); + logger.write("Testing loaded net okay"); if(nnEval32 != nnEval) delete nnEval32; } + + { + //Absolute-output check against compiled-in reference data blended across nets from the run, + //run on the final nnEval that will actually be used (post any fp32 fallback). + try { + const bool refVerbose = false; + const string referenceDataFileOverride = ""; + const string dumpCandidateFileName = ""; + //Product of the task-config factor and the per-network factor from the server. + const double refLenienceFactor = backendRefLenienceFactor * modelInfo.backendRefTestLenienceFactor; + bool refSuccess = Tests::runBackendReferenceTest( + nnEval,logger,refVerbose, + policyOptimismForTest,pdaForTest,nnPolicyTemperatureForTest, + refLenienceFactor, + referenceDataFileOverride,dumpCandidateFileName + ); + if(!refSuccess) { + logger.write("Error: model " + modelName + " outputs deviate from expected reference outputs beyond calibrated bounds, likely a GPU/backend numerical problem, unable to continue"); + shouldStop.store(true); + shouldStopGracefully.store(true); + shouldPause->setPermanently(false); + delete nnEval; + return false; + } + } + catch(const StringError& e) { + //Errors running the test itself (as opposed to failed checks) do not stop the client. + logger.write(string("Warning: backend reference test failed to run: ") + e.what()); + } + } } if(!userCfgWarnedYet) { @@ -1233,10 +1271,24 @@ int MainCmds::contribute(const vector& args) { whiteManager = selfplayManager; } - suc = loadNeuralNetIntoManager(blackManager,task.modelBlack,modelFileBlack,task.isRatingGame); + //Optional lenience factor for the backend reference output check, carried on the task + //config the server distributes. Default 1.0 when absent or unparseable, since a bad + //value here should not stop the client from playing the game. + double backendRefLenienceFactor = 1.0; + try { + istringstream taskCfgIn(task.config); + ConfigParser taskCfg(taskCfgIn); + if(taskCfg.contains("backendRefTestLenienceFactor")) + backendRefLenienceFactor = taskCfg.getDouble("backendRefTestLenienceFactor", 0.01, 10000.0); + } + catch(const StringError& e) { + (void)e; + } + + suc = loadNeuralNetIntoManager(blackManager,task.modelBlack,modelFileBlack,task.isRatingGame,backendRefLenienceFactor); if(!suc) continue; - suc = loadNeuralNetIntoManager(whiteManager,task.modelWhite,modelFileWhite,task.isRatingGame); + suc = loadNeuralNetIntoManager(whiteManager,task.modelWhite,modelFileWhite,task.isRatingGame,backendRefLenienceFactor); if(!suc) continue; if(shouldStopGracefullyFunc()) diff --git a/cpp/command/dumponnx.cpp b/cpp/command/dumponnx.cpp new file mode 100644 index 0000000000..b20d9ab2d8 --- /dev/null +++ b/cpp/command/dumponnx.cpp @@ -0,0 +1,156 @@ +#include "../core/global.h" +#include "../core/fileutils.h" +#include "../core/logger.h" +#include "../command/commandline.h" +#include "../main.h" + +#if defined(USE_TENSORRT_BACKEND) || defined(USE_ONNX_BACKEND) +#include "../neuralnet/desc.h" +#include "../neuralnet/nninputs.h" +#include "../neuralnet/onnxmodelbuilder.h" + +#include +#endif + +using namespace std; + +// Writes out the ONNX graph that the TensorRT and ONNX backends build internally from a .bin.gz +// model, for inspection with external ONNX tooling and for feeding back to those backends as a model +// file in its own right. See docs/ONNX_Model_Files.md. +// +// The board size and the masking mode are baked into the graph and checked when it is loaded, so a +// dump is only usable at the settings it was made with. The defaults here match a normal 19x19 run. +int MainCmds::dumponnx(const vector& args) { +#if !defined(USE_TENSORRT_BACKEND) && !defined(USE_ONNX_BACKEND) + (void)args; + cerr << "dumponnx is only available in builds with the TensorRT or ONNX backend, since those are " + << "the backends that build ONNX graphs. Compile with -DUSE_BACKEND=TENSORRT or -DUSE_BACKEND=ONNX." + << endl; + return 1; +#else + string modelFile; + string outputFile; + int nnXLen; + int nnYLen; + bool requireExactNNLen; + bool transformerNHWC; + bool skipScale8; + try { + KataGoCommandLine cmd("Dump the ONNX graph that KataGo builds for a model."); + cmd.addModelFileArg(); + + TCLAP::ValueArg outputFileArg( + "", "out", "Path of the .onnx file to write.", true, string(), "FILE"); + TCLAP::ValueArg nnXLenArg( + "", "nn-x-len", "Board width the graph is built for (default 19).", false, 19, "LEN"); + TCLAP::ValueArg nnYLenArg( + "", "nn-y-len", "Board height the graph is built for (default 19).", false, 19, "LEN"); + TCLAP::SwitchArg requireExactNNLenArg( + "", "require-exact-nnlen", + "Build a graph with no board masking, only correct if every position fills the whole buffer. " + "Matches requireMaxBoardSize = true in a config."); + // A string arg rather than ValueArg: TCLAP's bool parsing accepts only 0/1, not the + // true/false used everywhere in KataGo configs. + TCLAP::ValueArg transformerNHWCArg( + "", "transformer-nhwc", + "Run transformer trunk blocks channel-last (default true). No effect on models without " + "transformer blocks.", false, "true", "BOOL"); + TCLAP::SwitchArg skipScale8Arg( + "", "skip-scale8", + "Skip the 1/8 activation rescaling that keeps convnet activations inside the FP16 range. " + "Matches onnxSkipScale8 = true in a config; the TensorRT backend always applies it."); + cmd.add(outputFileArg); + cmd.add(nnXLenArg); + cmd.add(nnYLenArg); + cmd.add(requireExactNNLenArg); + cmd.add(transformerNHWCArg); + cmd.add(skipScale8Arg); + cmd.parseArgs(args); + + modelFile = cmd.getModelFile(); + outputFile = outputFileArg.getValue(); + nnXLen = nnXLenArg.getValue(); + nnYLen = nnYLenArg.getValue(); + requireExactNNLen = requireExactNNLenArg.getValue(); + skipScale8 = skipScale8Arg.getValue(); + + const string& nhwcStr = transformerNHWCArg.getValue(); + if(nhwcStr == "0") + transformerNHWC = false; + else if(nhwcStr == "1") + transformerNHWC = true; + else if(!Global::tryStringToBool(nhwcStr, transformerNHWC)) { + cerr << "-transformer-nhwc must be true or false, got: " << nhwcStr << endl; + return 1; + } + } + catch(TCLAP::ArgException& e) { + cerr << "Error: " << e.error() << " for argument " << e.argId() << endl; + return 1; + } + + if(nnXLen < 2 || nnXLen > NNPos::MAX_BOARD_LEN || nnYLen < 2 || nnYLen > NNPos::MAX_BOARD_LEN) { + cerr << "Board size must be between 2 and " << NNPos::MAX_BOARD_LEN << endl; + return 1; + } + if(OnnxModelBuilder::isOnnxFileName(modelFile)) { + cerr << "-model must be a KataGo model file (.bin.gz), not an .onnx file. There is nothing to " + << "build from an .onnx file - it already is the graph." << endl; + return 1; + } + if(!Global::isSuffix(Global::toLower(outputFile), ".onnx")) { + cerr << "-out must end in .onnx (the backends identify ONNX model files by that suffix; .onnx.gz " + << "also works, but gzip the file yourself after dumping)." << endl; + return 1; + } + + const bool logToStdout = true; + const bool logToStderr = false; + const bool logTime = false; + Logger logger(nullptr, logToStdout, logToStderr, logTime); + + ModelDesc modelDesc; + ModelDesc::loadFromFileMaybeGZipped(modelFile, modelDesc, ""); + logger.write( + "Loaded model " + modelDesc.name + " (" + modelDesc.getShortInfoString() + ") from " + modelFile); + + OnnxModelBuilder::BuildParams buildParams; + buildParams.nnXLen = nnXLen; + buildParams.nnYLen = nnYLen; + buildParams.requireExactNNLen = requireExactNNLen; + buildParams.transformerNHWC = transformerNHWC; + // The backends apply this to the weights before emitting, so do the same here. + buildParams.scale8Applied = skipScale8 ? false : modelDesc.applyScale8ToReduceActivations(); + if(skipScale8) + logger.write("Skipping the scale8 activation rescaling (-skip-scale8)"); + else if(!buildParams.scale8Applied) + logger.write("Model is not eligible for the scale8 activation rescaling; emitting without it"); + + OnnxModelBuilder::Result result = OnnxModelBuilder::build(modelDesc, buildParams, &logger); + + { + ofstream out; + FileUtils::open(out, outputFile, ios::out | ios::binary); + out.write(result.serializedModel.data(), (streamsize)result.serializedModel.size()); + out.close(); + if(out.fail()) { + cerr << "Failed writing " << outputFile << endl; + return 1; + } + } + + logger.write(Global::strprintf( + "Wrote %s (%s bytes) for a %dx%d board buffer, requireExactNNLen=%s, transformerNHWC=%s, scale8Applied=%s", + outputFile.c_str(), + Global::uint64ToString(result.serializedModel.size()).c_str(), + nnXLen, nnYLen, + Global::boolToString(requireExactNNLen).c_str(), + // build() ignores this for models with no transformer blocks; report what it actually used. + Global::boolToString(transformerNHWC && modelDesc.hasAnyTransformerBlocks()).c_str(), + Global::boolToString(buildParams.scale8Applied).c_str())); + logger.write( + "This file can be given to -model in place of the .bin.gz on the TensorRT and ONNX backends, at " + "these same settings."); + return 0; +#endif +} diff --git a/cpp/command/evalsgf.cpp b/cpp/command/evalsgf.cpp index d7d019b88e..48308160db 100644 --- a/cpp/command/evalsgf.cpp +++ b/cpp/command/evalsgf.cpp @@ -185,10 +185,10 @@ int MainCmds::evalsgf(const vector& args) { BoardHistory hist; //Set for real after the neural net is loaded, from the params and the model's declaration. - bool alwaysComputePassAliveUnderSuicideRules = false; - auto setUpBoardUsingRules = [&board,&nextPla,&hist,overrideKomi,&sgf,&extraMoves,&alwaysComputePassAliveUnderSuicideRules](const Rules& initialRules, int moveNum) { + BoardHistoryModes historyModes; + auto setUpBoardUsingRules = [&board,&nextPla,&hist,overrideKomi,&sgf,&extraMoves,&historyModes](const Rules& initialRules, int moveNum) { //Set up before replaying moves so any adjudication during replay is consistent with the searches. - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, alwaysComputePassAliveUnderSuicideRules); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, historyModes); vector& moves = sgf->moves; if(!isnan(overrideKomi)) { @@ -290,7 +290,7 @@ int MainCmds::evalsgf(const vector& args) { } logger.write("Loaded neural net"); - alwaysComputePassAliveUnderSuicideRules = Search::resolveAlwaysComputePassAliveUnderSuicideRules(params, nnEval); + historyModes = Search::resolveHistoryModes(params, nnEval); { bool rulesWereSupported; @@ -382,6 +382,8 @@ int MainCmds::evalsgf(const vector& args) { MiscNNInputParams humanNNInputParams = nnInputParams; humanNNInputParams.passAliveSuicideRulesOverride = Search::resolveAlwaysComputePassAliveUnderSuicideRules(params, humanEval) ? 1 : 0; + humanNNInputParams.excludeTerritoryAdjAtariOverride = + Search::resolveExcludeTerritoryAdjacentToAtari(params, humanEval) ? 1 : 0; humanEval->evaluate(board,hist,nextPla,humanNNInputParams,buf,skipCache,includeOwnerMap); buf.result->debugPrint(cout,board); } @@ -403,6 +405,10 @@ int MainCmds::evalsgf(const vector& args) { bot->setAvoidMoveUntilByLoc(avoidMoveUntilByLoc,avoidMoveUntilByLoc); } + //Tree-averaged ownership is only accumulated if requested before the search runs. + if(printJson && printOwnership) + bot->setAlwaysIncludeOwnerMap(true); + //Print initial state---------------------------------------------------------------- const Search* search = bot->getSearchStopAndWait(); ostringstream sout; @@ -610,22 +616,13 @@ int MainCmds::evalsgf(const vector& args) { search->printTree(sout, search->rootNode, options, perspective); logger.write(sout.str()); - if(printLead) { - BoardHistory hist2(hist); - double lead = PlayUtils::computeLead( - bot->getSearchStopAndWait(), NULL, board, hist2, nextPla, - 20, OtherGameProperties() - ); - cout << "LEAD: " << lead << endl; - } - if(printGraph) { std::reverse(nodes.begin(),nodes.end()); std::map idxOfNode; for(size_t nodeIdx = 0; nodeIdx& args) { } } + //Must come after everything that reads the search tree - computeLead reuses this same search + //object and clears the tree, invalidating "nodes" and search->rootNode. + if(printLead) { + BoardHistory hist2(hist); + double lead = PlayUtils::computeLead( + bot->getSearchStopAndWait(), NULL, board, hist2, nextPla, + 20, OtherGameProperties() + ); + cout << "LEAD: " << lead << endl; + } + if(dumpNpzInputTo != "") { bool inputsUseNHWC = false; int nnXLen = nnEval->getNNXLen(); diff --git a/cpp/command/genbook.cpp b/cpp/command/genbook.cpp index 213eb3f1d4..7c80c633b6 100644 --- a/cpp/command/genbook.cpp +++ b/cpp/command/genbook.cpp @@ -181,7 +181,7 @@ static void maybeParseBonusFile( int boardSizeY, const Rules& rules, int repBound, - bool alwaysComputePassAliveUnderSuicideRules, + const BoardHistoryModes& bookHistoryModes, double bonusFileScale, Logger& logger, std::map& bonusByHash, @@ -206,8 +206,8 @@ static void maybeParseBonusFile( comments.find("BRANCH") != string::npos ) ) { - //Replay and hash under the book's pass-alive computation mode so hashes match book nodes. - BoardHistory hist(sgfHist.initialBoard, sgfHist.initialPla, rules, sgfHist.initialEncorePhase, alwaysComputePassAliveUnderSuicideRules); + //Replay and hash under the book's BoardHistoryModes so hashes match book nodes. + BoardHistory hist(sgfHist.initialBoard, sgfHist.initialPla, rules, sgfHist.initialEncorePhase, bookHistoryModes); Board board = hist.initialBoard; for(size_t i = 0; i& args) { Rules rules = Setup::loadSingleRules(cfg,loadKomiFromCfg); const bool hasHumanModel = humanModelFile != ""; - //Not const - alwaysComputePassAliveUnderSuicideRules is forced below to match the book. + //Not const - the history mode params are forced below to match the book. SearchParams params = Setup::loadSingleParams(cfg,Setup::SETUP_FOR_GTP,hasHumanModel); const int boardSizeX = cfg.getInt("boardSizeX",2,Board::MAX_LEN); @@ -435,8 +435,8 @@ int MainCmds::genbook(const vector& args) { bonusInitialBoard = Board(boardSizeX,boardSizeY); bonusInitialPla = P_BLACK; - //Bonus sgf files are parsed further below, after the pass-alive computation mode for this run is - //known, since the book hashes they produce depend on it. + //Bonus sgf files are parsed further below, after the BoardHistoryModes for this run are + //known, since the book hashes they produce depend on them. for(const std::string& hashBonusFile: hashBonusFiles) { maybeParseHashBonusFile( hashBonusFile, @@ -479,24 +479,28 @@ int MainCmds::genbook(const vector& args) { if(humanEval != NULL) policyEvaluator = humanEval; - //Determine the pass-alive computation mode governing this run. A preexisting book's recorded value - //takes precedence; a new book records the resolution of the config param against the model. All - //searches, evals, and book hashes in this run are then forced to be consistent with it. + //Determine the BoardHistoryModes governing this run. A preexisting book's recorded values + //take precedence; a new book records the resolution of the config params against the model. All + //searches, evals, and book hashes in this run are then forced to be consistent with them. bool bookFileExists; { std::ifstream infile; bookFileExists = FileUtils::tryOpen(infile,bookFile); } - const bool bookPassAliveUnderSuicideRules = + const BoardHistoryModes bookHistoryModes = bookFileExists ? - Book::readAlwaysComputePassAliveUnderSuicideRulesOfFileHeader(bookFile) : - Search::resolveAlwaysComputePassAliveUnderSuicideRules(params, nnEval); - if(Search::resolveAlwaysComputePassAliveUnderSuicideRules(params, nnEval) != bookPassAliveUnderSuicideRules) + Book::readHistoryModesOfFileHeader(bookFile) : + Search::resolveHistoryModes(params, nnEval); + if(Search::resolveHistoryModes(params, nnEval) != bookHistoryModes) logger.write( "Note: preexisting book was made with alwaysComputePassAliveUnderSuicideRules=" + - Global::boolToString(bookPassAliveUnderSuicideRules) + ", forcing that value for all searches in this run" + Global::boolToString(bookHistoryModes.alwaysComputePassAliveUnderSuicideRules) + + " excludeTerritoryAdjacentToAtari=" + + Global::boolToString(bookHistoryModes.excludeTerritoryAdjacentToAtari) + + ", forcing those values for all searches in this run" ); - params.alwaysComputePassAliveUnderSuicideRules = bookPassAliveUnderSuicideRules ? enabled_t::True : enabled_t::False; + params.alwaysComputePassAliveUnderSuicideRules = bookHistoryModes.alwaysComputePassAliveUnderSuicideRules ? enabled_t::True : enabled_t::False; + params.excludeTerritoryAdjacentToAtari = bookHistoryModes.excludeTerritoryAdjacentToAtari ? enabled_t::True : enabled_t::False; for(const std::string& bonusFile: bonusFiles) { maybeParseBonusFile( @@ -505,7 +509,7 @@ int MainCmds::genbook(const vector& args) { boardSizeY, rules, repBound, - bookPassAliveUnderSuicideRules, + bookHistoryModes, bonusFileScale, logger, bonusByHash, @@ -534,7 +538,7 @@ int MainCmds::genbook(const vector& args) { Book* book; if(bookFileExists) { book = Book::loadFromFile(bookFile,numBookThreads); - testAssert(book->alwaysComputePassAliveUnderSuicideRules == bookPassAliveUnderSuicideRules); + testAssert(book->historyModes == bookHistoryModes); if( boardSizeX != book->getInitialHist().getRecentBoard(0).x_size || boardSizeY != book->getInitialHist().getRecentBoard(0).y_size || @@ -614,7 +618,7 @@ int MainCmds::genbook(const vector& args) { rules, bonusInitialPla, repBound, - bookPassAliveUnderSuicideRules, + bookHistoryModes, cfgParams ); logger.write("Creating new book at " + bookFile); @@ -1652,8 +1656,8 @@ int MainCmds::writebook(const vector& args) { boardSizeY, rules, repBound, - //Bonus hashes must be computed under the book's recorded pass-alive computation mode. - Book::readAlwaysComputePassAliveUnderSuicideRulesOfFileHeader(bookFile), + //Bonus hashes must be computed under the book's recorded BoardHistoryModes. + Book::readHistoryModesOfFileHeader(bookFile), bonusFileScale, logger, bonusByHash, @@ -2169,9 +2173,9 @@ int MainCmds::comparebooks(const vector& args) { book1->initialBoard.y_size != book2->initialBoard.y_size || book1->repBound != book2->repBound || book1->initialRules != book2->initialRules || - book1->alwaysComputePassAliveUnderSuicideRules != book2->alwaysComputePassAliveUnderSuicideRules + book1->historyModes != book2->historyModes ) { - logger.write("ERROR: Books have different board sizes, rep bounds, rules, or pass-alive computation modes"); + logger.write("ERROR: Books have different board sizes, rep bounds, rules, or BoardHistoryModes"); delete book1; delete book2; return 1; diff --git a/cpp/command/gputest.cpp b/cpp/command/gputest.cpp index aa7c2d73c4..fdfd1c7ee4 100644 --- a/cpp/command/gputest.cpp +++ b/cpp/command/gputest.cpp @@ -161,3 +161,90 @@ int MainCmds::testgpuerror(const vector& args) { return success ? 0 : 1; } + +int MainCmds::testbackendreference(const vector& args) { + Board::initHash(); + ScoreValue::initTables(); + Rand seedRand; + + ConfigParser cfg; + string modelFile; + string referenceDataFileOverride; + string dumpCandidateFileName; + double lenienceFactor; + try { + KataGoCommandLine cmd( + "Test a backend's absolute neural net outputs against compiled-in reference data blended across nets from " + "KataGo's main distributed run. Only nets from that run are expected to pass - human-imitation nets and other " + "specially-trained nets can deviate far enough to fail regardless of the backend." + ); + cmd.addConfigFileArg(KataGoCommandLine::defaultGtpConfigFileName(),"gtp_example.cfg"); + cmd.addModelFileArg(); + TCLAP::ValueArg referenceDataFileArg("", "reference-data-file", "Load reference data from this file (same JSON-lines schema as backendreferencedata.cpp) instead of the compiled-in data", false, "", "FILE"); + TCLAP::ValueArg dumpCandidateArg("", "dump-candidate", "Dump this net's raw outputs on the reference positions to this file, for reference calibration", false, "", "FILE"); + TCLAP::ValueArg lenienceFactorArg("", "lenience-factor", "Scale all check limits by this factor, 0.01 to 10000 (default 1.0)", false, 1.0, "FACTOR"); + cmd.add(referenceDataFileArg); + cmd.add(dumpCandidateArg); + cmd.add(lenienceFactorArg); + + cmd.setShortUsageArgLimit(); + cmd.addOverrideConfigArg(); + + cmd.parseArgs(args); + + modelFile = cmd.getModelFile(); + referenceDataFileOverride = referenceDataFileArg.getValue(); + dumpCandidateFileName = dumpCandidateArg.getValue(); + lenienceFactor = lenienceFactorArg.getValue(); + if(!(lenienceFactor >= 0.01 && lenienceFactor <= 10000.0)) + throw StringError("Lenience factor must be in the range 0.01 to 10000"); + cmd.getConfig(cfg); + } + catch (TCLAP::ArgException &e) { + cerr << "Error: " << e.error() << " for argument " << e.argId() << endl; + return 1; + } + + const bool logToStdoutDefault = true; + const bool logToStderrDefault = false; + const bool logTimeDefault = false; + Logger logger(NULL, logToStdoutDefault, logToStderrDefault, logTimeDefault); + logger.write("Version " + Version::getGitRevisionWithBackend()); + logger.write("Testing " + modelFile); + + const string expectedSha256 = ""; + const int maxBatchSize = 16; + const int expectedConcurrentEvals = maxBatchSize; + const bool defaultRequireExactNNLen = false; + + NNEvaluator* nnEval; + { + logger.write("Initializing nneval using current config..."); + const bool disableFP16 = false; + nnEval = Setup::initializeNNEvaluator( + modelFile,modelFile,expectedSha256,cfg,logger,seedRand,expectedConcurrentEvals, + NNPos::MAX_BOARD_LEN,NNPos::MAX_BOARD_LEN,maxBatchSize,defaultRequireExactNNLen,disableFP16, + Setup::SETUP_FOR_BENCHMARK + ); + } + + //Match contribute.cpp's values so that reference data calibrated from this command's dumps + //matches what contribute measures at runtime. + const double policyOptimismForTest = 0.25; + const double pdaForTest = 0.0; + const double nnPolicyTemperatureForTest = 1.0; + + const bool verbose = true; + bool success = Tests::runBackendReferenceTest( + nnEval,logger,verbose, + policyOptimismForTest,pdaForTest,nnPolicyTemperatureForTest, + lenienceFactor, + referenceDataFileOverride,dumpCandidateFileName + ); + + delete nnEval; + NeuralNet::globalCleanup(); + ScoreValue::freeTables(); + + return success ? 0 : 1; +} diff --git a/cpp/command/gtp.cpp b/cpp/command/gtp.cpp index 934de87087..934f002839 100644 --- a/cpp/command/gtp.cpp +++ b/cpp/command/gtp.cpp @@ -556,7 +556,7 @@ struct GTPEngine { Board board(boardXSize,boardYSize); Player pla = P_BLACK; - BoardHistory hist(board,pla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,pla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); vector newMoveHistory; setPositionAndRules(pla,board,hist,board,pla,newMoveHistory); clearStatsForNewGame(); @@ -589,7 +589,7 @@ struct GTPEngine { int newYSize = bot->getRootBoard().y_size; Board board(newXSize,newYSize); Player pla = P_BLACK; - BoardHistory hist(board,pla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,pla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); vector newMoveHistory; setPositionAndRules(pla,board,hist,board,pla,newMoveHistory); clearStatsForNewGame(); @@ -611,7 +611,7 @@ struct GTPEngine { } } Player pla = P_BLACK; - BoardHistory hist(board,pla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,pla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); hist.setInitialTurnNumber(board.numStonesOnBoard()); //Heuristic to guess at what turn this is vector newMoveHistory; setPositionAndRules(pla,board,hist,board,pla,newMoveHistory); @@ -649,7 +649,7 @@ struct GTPEngine { vector moveHistoryCopy = moveHistory; Board undoneBoard = initialBoard; - BoardHistory undoneHist(undoneBoard,initialPla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory undoneHist(undoneBoard,initialPla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); undoneHist.setInitialTurnNumber(bot->getRootHist().initialTurnNumber); vector emptyMoveHistory; setPositionAndRules(initialPla,undoneBoard,undoneHist,initialBoard,initialPla,emptyMoveHistory); @@ -678,7 +678,7 @@ struct GTPEngine { vector moveHistoryCopy = moveHistory; Board board = initialBoard; - BoardHistory hist(board,initialPla,newRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,initialPla,newRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); hist.setInitialTurnNumber(bot->getRootHist().initialTurnNumber); vector emptyMoveHistory; setPositionAndRules(initialPla,board,hist,initialBoard,initialPla,emptyMoveHistory); @@ -700,18 +700,18 @@ struct GTPEngine { } //Re-replay the current game from the beginning under the currently resolved - //alwaysComputePassAliveUnderSuicideRules mode. Used when a runtime params change (kata-set-param) - //flips that mode - the bot's own rootHistory gets re-stamped by setParams, but re-stamping - //deliberately does not re-adjudicate game state recorded under the old mode (e.g. an + //BoardHistoryModes. Used when a runtime params change (kata-set-param) + //flips a mode - the bot's own rootHistory gets re-stamped by setParams, but re-stamping + //deliberately does not re-adjudicate game state recorded under the old modes (e.g. an //automatically detected game end), whereas replaying recomputes everything as if the engine had - //been using the new mode all along. This also keeps the state consistent with what a later + //been using the new modes all along. This also keeps the state consistent with what a later //rebuild-and-replay (undo, kata-set-rules) would produce. - void rereplayGameForPassAliveModeChange() { + void rereplayGameForHistoryModesChange() { testAssert(bot->getRootHist().rules == currentRules); vector moveHistoryCopy = moveHistory; Board board = initialBoard; - BoardHistory hist(board,initialPla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,initialPla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); hist.setInitialTurnNumber(bot->getRootHist().initialTurnNumber); vector emptyMoveHistory; setPositionAndRules(initialPla,board,hist,initialBoard,initialPla,emptyMoveHistory); @@ -1349,7 +1349,7 @@ struct GTPEngine { testAssert(bot->getRootHist().rules == currentRules); Player pla = P_BLACK; - BoardHistory hist(board,pla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,pla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); //Also switch the initial player, expecting white should be next. hist.clear(board,P_WHITE,currentRules,0); @@ -1390,7 +1390,7 @@ struct GTPEngine { Board board(xSize,ySize); Player pla = P_BLACK; - BoardHistory hist(board,pla,currentRules,0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(genmoveParams,nnEval)); + BoardHistory hist(board,pla,currentRules,0,Search::resolveHistoryModes(genmoveParams,nnEval)); double extraBlackTemperature = 0.25; PlayUtils::playExtraBlack(bot->getSearchStopAndWait(), n, board, hist, extraBlackTemperature, rand); //Also switch the initial player, expecting white should be next. @@ -1642,10 +1642,13 @@ struct GTPEngine { nnInputParams.symmetry = symmetry; nnInputParams.policyOptimism = policyOptimism; //When evaluating the human model, featurize per its own resolution (which may differ from the - //main search's mode carried by the history), matching how in-search human evals featurize. - if(useHumanModel) + //main search's modes carried by the history), matching how in-search human evals featurize. + if(useHumanModel) { nnInputParams.passAliveSuicideRulesOverride = Search::resolveAlwaysComputePassAliveUnderSuicideRules(analysisParams, humanEval) ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = + Search::resolveExcludeTerritoryAdjacentToAtari(analysisParams, humanEval) ? 1 : 0; + } NNResultBuf buf; bool skipCache = true; bool includeOwnerMap = true; @@ -2749,15 +2752,15 @@ int MainCmds::gtp(const vector& args) { SearchParams::failIfParamsDifferOnUnchangeableParameter(initialGenmoveParams,genmoveParams); SearchParams::failIfParamsDifferOnUnchangeableParameter(initialAnalysisParams,analysisParams); - bool oldPassAliveMode = Search::resolveAlwaysComputePassAliveUnderSuicideRules(engine->getGenmoveParams(),engine->nnEval); + BoardHistoryModes oldHistoryModes = Search::resolveHistoryModes(engine->getGenmoveParams(),engine->nnEval); engine->setGenmoveParamsIfChanged(genmoveParams); engine->setAnalysisParamsIfChanged(analysisParams); - //If the params change flipped the resolved pass-alive computation mode, re-replay the game - //so all recorded game state is recomputed under the new mode (re-stamping alone does not - //re-adjudicate). Done after both param sets are updated so the replay runs under the new mode. - bool newPassAliveMode = Search::resolveAlwaysComputePassAliveUnderSuicideRules(engine->getGenmoveParams(),engine->nnEval); - if(newPassAliveMode != oldPassAliveMode) - engine->rereplayGameForPassAliveModeChange(); + //If the params change flipped any resolved BoardHistoryModes flag, re-replay the game + //so all recorded game state is recomputed under the new modes (re-stamping alone does not + //re-adjudicate). Done after both param sets are updated so the replay runs under the new modes. + BoardHistoryModes newHistoryModes = Search::resolveHistoryModes(engine->getGenmoveParams(),engine->nnEval); + if(newHistoryModes != oldHistoryModes) + engine->rereplayGameForHistoryModesChange(); staticPDATakesPrecedence = cfg.contains("playoutDoublingAdvantage") && !cfg.contains("dynamicPlayoutDoublingAdvantageCapPerOppLead"); engine->staticPDATakesPrecedence = staticPDATakesPrecedence; allowResignation = desiredAllowResignation; @@ -3311,7 +3314,7 @@ int MainCmds::gtp(const vector& args) { else { maybeSaveAvoidPatterns(false); Player pla = P_WHITE; - BoardHistory hist(board,pla,engine->getCurrentRules(),0,Search::resolveAlwaysComputePassAliveUnderSuicideRules(engine->getGenmoveParams(),engine->nnEval)); + BoardHistory hist(board,pla,engine->getCurrentRules(),0,Search::resolveHistoryModes(engine->getGenmoveParams(),engine->nnEval)); hist.setInitialTurnNumber(board.numStonesOnBoard()); //Should give more accurate temperaure and time control behavior vector newMoveHistory; engine->setPositionAndRules(pla,board,hist,board,pla,newMoveHistory); @@ -3466,12 +3469,12 @@ int MainCmds::gtp(const vector& args) { } } - //Set up with the pass-alive computation mode the bot will be using BEFORE replaying the + //Set up with the BoardHistoryModes the bot will be using BEFORE replaying the //moves, so that any game-end adjudication happening during the replay matches what the //same moves would give if entered via play commands on the bot's own history. sgf->setupInitialBoardAndHist( sgfRules, sgfInitialBoard, sgfInitialNextPla, sgfInitialHist, - Search::resolveAlwaysComputePassAliveUnderSuicideRules(engine->getGenmoveParams(), engine->nnEval) + Search::resolveHistoryModes(engine->getGenmoveParams(), engine->nnEval) ); sgfInitialHist.setInitialTurnNumber(sgfInitialBoard.numStonesOnBoard()); //Should give more accurate temperaure and time control behavior sgfBoard = sgfInitialBoard; diff --git a/cpp/command/misc.cpp b/cpp/command/misc.cpp index 49a2b72e18..1862d66d28 100644 --- a/cpp/command/misc.cpp +++ b/cpp/command/misc.cpp @@ -224,7 +224,7 @@ int MainCmds::evalrandominits(const vector& args) { Rules rules = Rules::parseRules("japanese"); //Keep pass-alive computations (e.g. endGameIfAllPassAlive below) consistent with how the bot's //own searches are performing them. - BoardHistory hist(board,pla,rules,0,evalBot->getRootHist().alwaysComputePassAliveUnderSuicideRules); + BoardHistory hist(board,pla,rules,0,evalBot->getRootHist().modes); int numInitialMovesToPlay = (int)gameRand.nextUInt(200); double temperature = 1.0; for(int i = 0; i& args) { Player pla; BoardHistory hist; Rules initialRules; - sgfObj->setupInitialBoardAndHist(initialRules, board, pla, hist, bot->getRootHist().alwaysComputePassAliveUnderSuicideRules); + sgfObj->setupInitialBoardAndHist(initialRules, board, pla, hist, bot->getRootHist().modes); for(int i = 0; i < turnIdx; i++) { Loc moveLoc = sgfObj->moves[i].loc; diff --git a/cpp/command/runtests.cpp b/cpp/command/runtests.cpp index bed319be1f..b9c49cc9a7 100644 --- a/cpp/command/runtests.cpp +++ b/cpp/command/runtests.cpp @@ -45,6 +45,7 @@ int MainCmds::runtests(const vector& args) { Tests::runRulesTests(); Tests::runPassAliveSuicideModeTests(); + Tests::runExcludeTerritoryAtariModeTests(); Tests::runBoardUndoTest(); Tests::runBoardHandicapTest(); @@ -77,6 +78,7 @@ int MainCmds::runoutputtests(const vector& args) { ScoreValue::initTables(); Tests::runNNInputsV3V4Tests(); + Tests::runExcludeTerritoryAtariNNInputsTests(); Tests::runNNLessSearchTests(); Tests::runTrainingWriteTests(); Tests::runPassAliveSuicideGameTests(); @@ -260,6 +262,15 @@ int MainCmds::runnnontinyboardtest(const vector& args) { return 0; } +int MainCmds::runonnxmodelfiletests(const vector& args) { + if(args.size() != 2 && args.size() != 3) { + cerr << "Must supply one or two arguments: SCRATCHDIR [MODELFILE]" << endl; + return 1; + } + Tests::runOnnxModelFileTests(args[1], args.size() >= 3 ? args[2] : ""); + return 0; +} + int MainCmds::runnnsymmetriestest(const vector& args) { if(args.size() != 5) { cerr << "Must supply exactly four arguments: MODEL_FILE INPUTSNHWC CUDANHWC FP16" << endl; @@ -545,7 +556,7 @@ int MainCmds::runbeginsearchspeedtest(const vector& args) { Player nextPla = P_BLACK; rules.komi = 6.5; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes()); bot->setPosition(nextPla,board,hist); @@ -669,7 +680,7 @@ int MainCmds::runownershipspeedtest(const vector& args) { Player nextPla = P_BLACK; rules.komi = 7.0; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes()); bot->setPosition(nextPla,board,hist); bot->setAlwaysIncludeOwnerMap(true); diff --git a/cpp/command/startposes.cpp b/cpp/command/startposes.cpp index d79a323ecd..e1cf379beb 100644 --- a/cpp/command/startposes.cpp +++ b/cpp/command/startposes.cpp @@ -441,7 +441,7 @@ int MainCmds::samplesgfs(const vector& args) { BoardHistory hist; Rules rules = compactSgf.getRulesOrFailAllowUnspecified(Rules::getSimpleTerritory()); //Featurize per the model's own declaration (no user-level search params in this mode). - compactSgf.setupInitialBoardAndHist(rules, board, nextPla, hist, valueFluctuationNNEval->modelPreferPassAliveUnderSuicideRules()); + compactSgf.setupInitialBoardAndHist(rules, board, nextPla, hist, BoardHistoryModes(valueFluctuationNNEval->modelPreferPassAliveUnderSuicideRules(), valueFluctuationNNEval->modelPreferExcludeTerritoryAdjacentToAtari())); if(valueFluctuationMakeKomiFair) { Rand rand; @@ -1395,7 +1395,7 @@ int MainCmds::dataminesgfs(const vector& args) { Player nextPla; BoardHistory hist; //Keep pass-alive computations and featurization consistent with how the search performs them. - sgf.setupInitialBoardAndHist(rules, board, nextPla, hist, search->getRootHist().alwaysComputePassAliveUnderSuicideRules); + sgf.setupInitialBoardAndHist(rules, board, nextPla, hist, search->getRootHist().modes); if(!gameInit->isAllowedBSize(board.x_size,board.y_size)) { numFilteredSgfs.fetch_add(1); return; @@ -1690,7 +1690,7 @@ int MainCmds::dataminesgfs(const vector& args) { int encorePhase = 0; Player pla = sample.nextPla; //Keep pass-alive computations and featurization consistent with how the search performs them. - BoardHistory hist(board,pla,rules,encorePhase,search->getRootHist().alwaysComputePassAliveUnderSuicideRules); + BoardHistory hist(board,pla,rules,encorePhase,search->getRootHist().modes); int numSampleMoves = (int)sample.moves.size(); for(int i = 0; i& args) { Player nextPla; BoardHistory histBefore; //Featurize per the model's own declaration (this command has no search params to consult). - bool suc = priorPosSample.tryGetCurrentBoardHistory(rules,nextPla,histBefore,nnEval->modelPreferPassAliveUnderSuicideRules()); + bool suc = priorPosSample.tryGetCurrentBoardHistory(rules,nextPla,histBefore,BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); if(!suc) { logger.write("WARNING: unable to get current history for pos, skipping: " + Sgf::PositionSample::toJsonLine(priorPosSample)); continue; diff --git a/cpp/command/writetrainingdata.cpp b/cpp/command/writetrainingdata.cpp index cfca0b31ac..3b817f6f29 100644 --- a/cpp/command/writetrainingdata.cpp +++ b/cpp/command/writetrainingdata.cpp @@ -721,11 +721,13 @@ int MainCmds::writetrainingdata(const vector& args) { string searchRandSeed = Global::uint64ToString(seedRand.nextUInt64()); SearchParams params = SearchParams::basicDecentParams(); - //Pass-alive computation mode, applied uniformly to game replay/adjudication, featurization, - //training targets, and the searches below. Auto resolves to the model's declared preference. + //BoardHistoryModes, applied uniformly to game replay/adjudication, featurization, + //training targets, and the searches below. Auto resolves to the model's declared preferences. if(cfg.contains("alwaysComputePassAliveUnderSuicideRules")) params.alwaysComputePassAliveUnderSuicideRules = cfg.getEnabled("alwaysComputePassAliveUnderSuicideRules"); - const bool alwaysComputePassAliveUnderSuicideRules = Search::resolveAlwaysComputePassAliveUnderSuicideRules(params, nnEval); + if(cfg.contains("excludeTerritoryAdjacentToAtari")) + params.excludeTerritoryAdjacentToAtari = cfg.getEnabled("excludeTerritoryAdjacentToAtari"); + const BoardHistoryModes historyModes = Search::resolveHistoryModes(params, nnEval); params.maxVisits = maxVisits; params.chosenMoveTemperatureEarly = 0.1; params.chosenMoveTemperature = 0.1; @@ -1384,7 +1386,7 @@ int MainCmds::writetrainingdata(const vector& args) { try { //Set up before replaying so game replay/adjudication, featurization, and targets are all uniform //with each other and with the searches (whose setPosition resolves to the same value from params). - sgf->setupInitialBoardAndHist(rules, board, nextPla, hist, alwaysComputePassAliveUnderSuicideRules); + sgf->setupInitialBoardAndHist(rules, board, nextPla, hist, historyModes); } catch(const StringError& e) { logger.write("Bad initial setup in sgf " + fileName + " " + e.what()); diff --git a/cpp/configs/analysis_example.cfg b/cpp/configs/analysis_example.cfg index 4aed2f4f85..1b18627421 100644 --- a/cpp/configs/analysis_example.cfg +++ b/cpp/configs/analysis_example.cfg @@ -223,9 +223,7 @@ nnRandomize = true # cudaUseNHWC = auto -# ------------------------------ -# Metal GPU settings -# ------------------------------ +# Metal GPU settings-------------------------------------- # These only apply when using the METAL version of KataGo. # Metal backend dispatch is configured via numNNServerThreadsPerModel and metalDeviceToUseThread. @@ -261,6 +259,31 @@ nnRandomize = true # metalUseFP16 = true +# ROCm GPU settings-------------------------------------- +# These only apply when using the ROCm 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 +# rocmDeviceToUse = 0 + +# IF USING TWO GPUS: Uncomment these two lines (AND set numNNServerThreadsPerModel above): +# rocmDeviceToUseThread0 = 0 # change this if the first GPU you want to use turns out to be not device 0 +# rocmDeviceToUseThread1 = 1 # change this if the second GPU you want to use turns out to be not device 1 + +# IF USING THREE GPUS: Uncomment these three lines (AND set numNNServerThreadsPerModel above): +# rocmDeviceToUseThread0 = 0 # change this if the first GPU you want to use turns out to be not device 0 +# rocmDeviceToUseThread1 = 1 # change this if the second GPU you want to use turns out to be not device 1 +# rocmDeviceToUseThread2 = 2 # change this if the third GPU you want to use turns out to be not device 2 + +# You can probably guess the pattern if you have four, five, etc. GPUs. + +# KataGo uses FP16 by default (all AMD GPU architectures this backend supports handle FP16; it is +# only auto-disabled if the build itself was compiled without FP16 kernel support). If you want to +# force a particular behavior you can uncomment these lines and change them to "true" or "false", +# e.g. if FP16 is giving an error or too much numerical inaccuracy on your card. +# rocmUseFP16 = auto +# rocmUseNHWC = auto # Uses NHWC tensor layout. Default: auto - NHWC with FP16 on GPUs where NHWC convolutions are faster (CDNA), else NCHW; transformers always NHWC. + + # OpenCL-specific GPU settings-------------------------------------- # These only apply when using the OpenCL version of KataGo. diff --git a/cpp/configs/contribute_example.cfg b/cpp/configs/contribute_example.cfg index 6ca039f112..9d538c53eb 100644 --- a/cpp/configs/contribute_example.cfg +++ b/cpp/configs/contribute_example.cfg @@ -83,9 +83,7 @@ watchOngoingGameInFileName = watchgame.txt # cudaUseNHWC = auto -# ------------------------------ -# Metal GPU settings -# ------------------------------ +# Metal GPU settings-------------------------------------- # These only apply when using the METAL version of KataGo. # For one Metal instance: KataGo will automatically use the default device. @@ -99,6 +97,31 @@ watchOngoingGameInFileName = watchgame.txt # The pattern continues for additional Metal instances. +# ROCm GPU settings-------------------------------------- +# These only apply when using the ROCm 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 +# rocmDeviceToUse = 0 + +# IF USING TWO GPUS: Uncomment these two lines (AND set numNNServerThreadsPerModel above): +# rocmDeviceToUseThread0 = 0 # change this if the first GPU you want to use turns out to be not device 0 +# rocmDeviceToUseThread1 = 1 # change this if the second GPU you want to use turns out to be not device 1 + +# IF USING THREE GPUS: Uncomment these three lines (AND set numNNServerThreadsPerModel above): +# rocmDeviceToUseThread0 = 0 # change this if the first GPU you want to use turns out to be not device 0 +# rocmDeviceToUseThread1 = 1 # change this if the second GPU you want to use turns out to be not device 1 +# rocmDeviceToUseThread2 = 2 # change this if the third GPU you want to use turns out to be not device 2 + +# You can probably guess the pattern if you have four, five, etc. GPUs. + +# KataGo uses FP16 by default (all AMD GPU architectures this backend supports handle FP16; it is +# only auto-disabled if the build itself was compiled without FP16 kernel support). If you want to +# force a particular behavior you can uncomment these lines and change them to "true" or "false", +# e.g. if FP16 is giving an error or too much numerical inaccuracy on your card. +# rocmUseFP16 = auto +# rocmUseNHWC = auto # Uses NHWC tensor layout. Default: auto - NHWC with FP16 on GPUs where NHWC convolutions are faster (CDNA), else NCHW; transformers always NHWC. + + # OpenCL GPU settings-------------------------------------- # These only apply when using the OpenCL version of KataGo. diff --git a/cpp/configs/gtp_example.cfg b/cpp/configs/gtp_example.cfg index 7c3a8f8341..1b89821387 100644 --- a/cpp/configs/gtp_example.cfg +++ b/cpp/configs/gtp_example.cfg @@ -462,6 +462,93 @@ searchFactorWhenWinningThreshold = 0.95 # "auto" (default) uses the GEMM only in FP16, where it is slightly faster. # cudaUse1x1Matmul = auto +# ------------------------------ +# ONNX Runtime backend settings +# ------------------------------ +# These only apply when using the ONNX version of KataGo (USE_BACKEND=ONNX). +# The official prebuilt ONNX Runtime packages do NOT include the OpenVINO execution +# provider. For Intel GPU/NPU acceleration, build ORT from source with --use_openvino GPU. + +# Execution provider. One of (see Compiling.md "Execution providers" for how well each +# one is tested and what it requires): +# cpu (default) - tested, and works with the official prebuilt ONNX Runtime +# openvino - tested on Windows with Intel GPU and NPU. Use this for Intel Arc/iGPU/NPU. +# cuda - lightly tested on Linux +# tensorrt - lightly tested on Linux +# migraphx - untested, Linux and AMD only +# directml - tested on Windows. Needs the Microsoft.ML.OnnxRuntime.DirectML +# package, and may be slow, since the DirectML provider prefers fixed +# tensor shapes while KataGo's search varies its batch size. +# coreml - macOS only, not working yet +# Every provider except cpu needs an ONNX Runtime package or build that includes it. +# onnxProvider = cpu + +# Provider-specific device selection (mostly for cuda / tensorrt / migraphx). +# For the OpenVINO provider, a nonzero device index is appended to device_type as an OpenVINO +# device suffix (e.g. onnxDeviceToUse = 1 with device_type GPU selects "GPU.1"). Prefer +# the per-thread device_type overrides below for mixed GPU/NPU setups. +# +# NOTE: the index suffix is only appended when device_type is a simple bare device name. +# It is ignored (with a logged warning) when device_type already selects a specific +# device ("GPU.1"-style suffix) or is a composite/qualified device string such as +# AUTO:GPU,CPU or MULTI:GPU.0,GPU.1 - pick the device explicitly there via the +# onnxOpenVINODeviceTypeThread overrides instead. Use only one of the two mechanisms +# per thread: onnxDeviceToUse* selects by numeric index, onnxOpenVINODeviceTypeThread +# selects by full device string. +# onnxDeviceToUse = 0 +# onnxDeviceToUseThread0 = 0 +# onnxDeviceToUseThread1 = 1 + +# OpenVINO provider options (only used when onnxProvider = openvino): +# Target device: GPU (default), NPU, GPU.0, GPU.1, or an OpenVINO multi-device string +# such as AUTO:GPU,CPU. Only GPU/NPU acceleration is supported here, use onnxProvider = cpu for CPU inference +# NOTE: NPU inference currently recompiles the whole graph for each new NN batch size, causing long stalls when numSearchThreads > 1 - a fix is in progress. +# onnxOpenVINODeviceType = GPU + +# Per-thread device type assignment (optional). +# Overrides onnxOpenVINODeviceType for the specified thread. +# This allows mixing GPU and NPU inference within the same process. Set +# numNNServerThreadsPerModel (see the "Multiple GPUs" section) to the number of +# threads you assign; assignments above that many threads are ignored. +# onnxOpenVINODeviceTypeThread0 = GPU +# onnxOpenVINODeviceTypeThread1 = NPU + +# OpenVINO provider: cache compiled graphs under cwd to skip recompiling on restart. +# If unset, the graph is recompiled at every startup. +# onnxOpenVINOCacheDir = katago_ov_cache + +# Optional inference precision override for the GPU: FP16 (default), FP32, ACCURACY. +# The NPU is FP16-only, and requesting FP32 for an NPU-only device is an error. +# onnxOpenVINOPrecision = FP16 +# +# NOTE: the ONNX backend cannot force FP16 via the global useFP16 flag used by other backends. +# Setting "useFP16 = true" fails with an error, since ONNX Runtime execution providers decide +# inference precision themselves. Use onnxOpenVINOPrecision above to control precision instead, +# or leave useFP16 unset/auto. Setting "useFP16 = false" forces full FP32 (for the OpenVINO +# provider it acts as onnxOpenVINOPrecision = FP32, unless that key is set explicitly, and is +# an error for an NPU-only device). + +# Optional OpenVINO GPU execution streams. More streams let one session process several +# requests in parallel; with many search threads (large NN batches) on a strong GPU this +# can roughly double throughput (measured ~2x on an Arc B580 at 10 search threads). Weak +# iGPUs at low thread counts gain little, and the NPU is a single-stream device where +# this option is ignored. +# onnxOpenVINONumStreams = 1 + +# The scale8 FP16-range workaround is applied by default (onnxSkipScale8 = false). +# scale8 keeps convnet activations 8x smaller so they stay inside the FP16 range OpenVINO +# infers in. The cost is MISH_SCALE8 subgraphs that block OpenVINO's fused-Mish: measured +# roughly 2x slower on the GPU and 4x on the NPU (b18 convnet). Leave it applied unless +# you are running FP32 precision, or small-board or transformer workloads where FP16 +# overflow is not a practical risk. Contributing to distributed training forces it on +# regardless, so that an FP16 overflow cannot put NaN rows into uploaded training data. +# onnxSkipScale8 = false + +# Run the trunk block stack channel-last (NHWC) for transformer models. +# Default true (NHWC, matching the TensorRT backend). Only takes effect for +# models with transformer blocks, and convnets ignore it. +# onnxTransformerNHWC = true + # ------------------------------ # Metal GPU settings # ------------------------------ @@ -499,6 +586,38 @@ searchFactorWhenWinningThreshold = 0.95 # inference but much slower than the GPU path. # metalUseFP16 = true +# ------------------------------ +# ROCm GPU settings +# ------------------------------ +# These only apply when using the ROCm version of KataGo. + +# For one GPU: optionally uncomment and change this if the GPU you want to +# use is not device 0 +# rocmDeviceToUse = 0 + +# For two GPUs: Uncomment these options, AND set numNNServerThreadsPerModel above. +# Also, change their values if the devices you want to use are not 0 and 1. +# rocmDeviceToUseThread0 = 0 +# rocmDeviceToUseThread1 = 1 + +# For three GPUs: Uncomment these options, AND set numNNServerThreadsPerModel above. +# Also, change their values if the devices you want to use are not 0 and 1 and 2. +# rocmDeviceToUseThread0 = 0 +# rocmDeviceToUseThread1 = 1 +# rocmDeviceToUseThread2 = 2 + +# The pattern continues for additional GPUs. + +# KataGo uses FP16 by default (all AMD GPU architectures this backend +# supports handle FP16; it is only auto-disabled if the build itself was +# compiled without FP16 kernel support). If you want to force a particular +# behavior you can uncomment these lines and change them to "true" or "false". +# rocmUseFP16 = auto +# Uses NHWC tensor layout. Default: auto - NHWC when using FP16 on GPUs whose matrix +# instructions make NHWC convolutions faster (CDNA), otherwise NCHW; transformer models +# always use NHWC. +# rocmUseNHWC = auto + # ------------------------------ # OpenCL GPU settings # ------------------------------ diff --git a/cpp/configs/match_example.cfg b/cpp/configs/match_example.cfg index 7e5b4fc09f..a1160184b1 100644 --- a/cpp/configs/match_example.cfg +++ b/cpp/configs/match_example.cfg @@ -156,9 +156,7 @@ numNNServerThreadsPerModel = 1 # cudaUseNHWC = auto -# ------------------------------ -# Metal GPU settings -# ------------------------------ +# Metal GPU settings-------------------------------------- # These only apply when using the METAL version of KataGo. # For one Metal instance: KataGo will automatically use the default device. @@ -172,6 +170,31 @@ numNNServerThreadsPerModel = 1 # The pattern continues for additional Metal instances. +# ROCm GPU settings-------------------------------------- +# These only apply when using the ROCm 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 +# rocmDeviceToUse = 0 + +# IF USING TWO GPUS: Uncomment these two lines (AND set numNNServerThreadsPerModel above): +# rocmDeviceToUseThread0 = 0 # change this if the first GPU you want to use turns out to be not device 0 +# rocmDeviceToUseThread1 = 1 # change this if the second GPU you want to use turns out to be not device 1 + +# IF USING THREE GPUS: Uncomment these three lines (AND set numNNServerThreadsPerModel above): +# rocmDeviceToUseThread0 = 0 # change this if the first GPU you want to use turns out to be not device 0 +# rocmDeviceToUseThread1 = 1 # change this if the second GPU you want to use turns out to be not device 1 +# rocmDeviceToUseThread2 = 2 # change this if the third GPU you want to use turns out to be not device 2 + +# You can probably guess the pattern if you have four, five, etc. GPUs. + +# KataGo uses FP16 by default (all AMD GPU architectures this backend supports handle FP16; it is +# only auto-disabled if the build itself was compiled without FP16 kernel support). If you want to +# force a particular behavior you can uncomment these lines and change them to "true" or "false", +# e.g. if FP16 is giving an error or too much numerical inaccuracy on your card. +# rocmUseFP16 = auto +# rocmUseNHWC = auto # Uses NHWC tensor layout. Default: auto - NHWC with FP16 on GPUs where NHWC convolutions are faster (CDNA), else NCHW; transformers always NHWC. + + # OpenCL GPU settings-------------------------------------- # These only apply when using OpenCL as the backend for inference. # (For GTP, we only ever have one model, when playing matches, we might have more than one, see match_example.cfg) diff --git a/cpp/core/win_rocm_sse_shim.cpp b/cpp/core/win_rocm_sse_shim.cpp new file mode 100644 index 0000000000..4ea422853a --- /dev/null +++ b/cpp/core/win_rocm_sse_shim.cpp @@ -0,0 +1,62 @@ +#ifdef USE_ROCM_BACKEND +#ifdef _WIN32 +// These are x86-64 SSE2 intrinsics, so only compile the shim bodies on x86-64. +#if defined(_M_X64) || defined(__x86_64__) + +// On Windows ROCm builds every katago source is compiled with -x hip, since TheRock's hip-config +// adds that as an interface compile flag on hip::device and katago links that target. clang +// therefore force-includes __clang_hip_runtime_wrapper.h ahead of user code, and whether the +// resulting header chain reaches clang's own or MSVC's differs between +// HIP SDK versions. Both cases occur in practice, so this file handles each. +// +// Where MSVC's chain wins, the SSE2 intrinsics arrive as bodyless extern declarations, since +// cl.exe recognizes them specially and clang does not replicate that for headers reached this way. +// Code calling one of them then fails to link with "undefined symbol: _mm_loadu_si128". That +// happens via ucrt's SSE2-optimized wmemcmp/wmemchr in , reached transitively from the +// std::filesystem and std::wstring paths in fileutils.cpp, makedir.cpp, dataio/files.cpp and +// loadmodel.cpp. The definitions below supply the three intrinsics ucrt actually uses. Including +// first makes MSVC's __m128i and its declarations visible so these signatures match, +// while the bodies use GNU vector extensions and so need no SSE header of their own. +// +// Where clang's chain wins, it already defines all three as static __inline__ __host__ __device__ +// functions, and defining them again is a compile error rather than a fix. __EMMINTRIN_H is that +// header's include guard and MSVC's chain does not define it, so testing for it selects between +// the two cases directly instead of assuming either. This file is deliberately empty in that case. +// +// Note that the clang-resource-dir-first include ordering set up in CMakeLists.txt's +// katago_win_autoselect_msvc_toolset does not by itself decide which chain wins, and does not +// remove the need for this file. Before concluding it can be dropped, check that no object still +// has undefined references to these three symbols, which "llvm-nm -u" will show. +#include + +#if !defined(__EMMINTRIN_H) + +extern "C" __m128i _mm_loadu_si128(__m128i const* p) { + __m128i r; + __builtin_memcpy(&r, p, sizeof(r)); + return r; +} + +extern "C" __m128i _mm_cmpeq_epi16(__m128i a, __m128i b) { + typedef short katago_v8hi __attribute__((__vector_size__(16))); + katago_v8hi va, vb; + __builtin_memcpy(&va, &a, sizeof(va)); + __builtin_memcpy(&vb, &b, sizeof(vb)); + katago_v8hi vr = (va == vb); + __m128i r; + __builtin_memcpy(&r, &vr, sizeof(r)); + return r; +} + +extern "C" int _mm_movemask_epi8(__m128i a) { + typedef char katago_v16qi __attribute__((__vector_size__(16))); + katago_v16qi va; + __builtin_memcpy(&va, &a, sizeof(va)); + return __builtin_ia32_pmovmskb128(va); +} + +#endif + +#endif +#endif +#endif diff --git a/cpp/dataio/loadmodel.cpp b/cpp/dataio/loadmodel.cpp index 7a78b44460..e868bd9c15 100644 --- a/cpp/dataio/loadmodel.cpp +++ b/cpp/dataio/loadmodel.cpp @@ -27,23 +27,23 @@ static const vector GENERIC_MODEL_NAMES { "model.bin.gz", "model.bin", "model.txt.gz", - "model.txt" + "model.txt", "Model.bin.gz", "Model.bin", "Model.txt.gz", - "Model.txt" + "Model.txt", "MODEL.bin.gz", "MODEL.bin", "MODEL.txt.gz", - "MODEL.txt" + "MODEL.txt", "model.ckpt", - "Model.ckpt" + "Model.ckpt", "MODEL.ckpt", "model.checkpoint", - "Model.checkpoint" + "Model.checkpoint", "MODEL.checkpoint", "model", - "Model" + "Model", "MODEL", }; diff --git a/cpp/dataio/sgf.cpp b/cpp/dataio/sgf.cpp index 8f36432cfb..5c75b92013 100644 --- a/cpp/dataio/sgf.cpp +++ b/cpp/dataio/sgf.cpp @@ -786,7 +786,7 @@ void Sgf::iterAllUniquePositions( Rules rules = Rules::getTrompTaylorish(); rules.koRule = Rules::KO_SITUATIONAL; rules.multiStoneSuicideLegal = true; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes()); PositionSample sampleBuf; std::vector> variationTraceNodesBranch; @@ -814,7 +814,7 @@ void Sgf::iterAllPositions( Rules rules = Rules::getTrompTaylorish(); rules.koRule = Rules::KO_SITUATIONAL; rules.multiStoneSuicideLegal = true; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes()); PositionSample sampleBuf; std::vector> variationTraceNodesBranch; @@ -1276,11 +1276,11 @@ Sgf::PositionSample Sgf::PositionSample::previousPosition(double newWeight) cons return other; } -bool Sgf::PositionSample::tryGetCurrentBoardHistory(const Rules& rules, Player& nextPlaToMove, BoardHistory& hist, bool alwaysComputePassAliveUnderSuicideRules) const { +bool Sgf::PositionSample::tryGetCurrentBoardHistory(const Rules& rules, Player& nextPlaToMove, BoardHistory& hist, const BoardHistoryModes& modes) const { int encorePhase = 0; Player pla = nextPla; Board boardCopy = board; - hist.setAlwaysComputePassAliveUnderSuicideRules(alwaysComputePassAliveUnderSuicideRules); + hist.setModes(modes); hist.clear(boardCopy,pla,rules,encorePhase); int numSampleMoves = (int)moves.size(); for(int i = 0; i& f) const; - void setupInitialBoardAndHist(const Rules& initialRules, Board& board, Player& nextPla, BoardHistory& hist, bool alwaysComputePassAliveUnderSuicideRules) const; + void setupInitialBoardAndHist(const Rules& initialRules, Board& board, Player& nextPla, BoardHistory& hist, const BoardHistoryModes& modes) const; void playMovesAssumeLegal(Board& board, Player& nextPla, BoardHistory& hist, int64_t turnIdx) const; - void setupBoardAndHistAssumeLegal(const Rules& initialRules, Board& board, Player& nextPla, BoardHistory& hist, int64_t turnIdx, bool alwaysComputePassAliveUnderSuicideRules) const; + void setupBoardAndHistAssumeLegal(const Rules& initialRules, Board& board, Player& nextPla, BoardHistory& hist, int64_t turnIdx, const BoardHistoryModes& modes) const; //These throw a StringError upon illegal move. void playMovesTolerant(Board& board, Player& nextPla, BoardHistory& hist, int64_t turnIdx, bool preventEncore) const; - void setupBoardAndHistTolerant(const Rules& initialRules, Board& board, Player& nextPla, BoardHistory& hist, int64_t turnIdx, bool preventEncore, bool alwaysComputePassAliveUnderSuicideRules) const; + void setupBoardAndHistTolerant(const Rules& initialRules, Board& board, Player& nextPla, BoardHistory& hist, int64_t turnIdx, bool preventEncore, const BoardHistoryModes& modes) const; }; namespace WriteSgf { diff --git a/cpp/dataio/trainingwrite.cpp b/cpp/dataio/trainingwrite.cpp index 56e55d6ee1..312779e891 100644 --- a/cpp/dataio/trainingwrite.cpp +++ b/cpp/dataio/trainingwrite.cpp @@ -699,10 +699,14 @@ void TrainingWriteBuffers::addRow( //Whether pass-alive areas for this game's adjudication and featurization were being computed as if //multi-stone suicide were always legal regardless of the actual suicide rule. - rowGlobal[68] = hist.alwaysComputePassAliveUnderSuicideRules ? 1.0f : 0.0f; + rowGlobal[68] = hist.modes.alwaysComputePassAliveUnderSuicideRules ? 1.0f : 0.0f; + + //Whether territory scoring with TaxRule NONE for this game's adjudication and featurization was + //excluding empty points adjacent to chains in atari (rules version 3). + rowGlobal[69] = hist.modes.excludeTerritoryAdjacentToAtari ? 1.0f : 0.0f; //Unused - for(int i = 69; i<80; i++) + for(int i = 70; i<80; i++) rowGlobal[i] = 0.0f; testAssert(80 == GLOBAL_TARGET_NUM_CHANNELS); diff --git a/cpp/distributed/client.cpp b/cpp/distributed/client.cpp index dd8ae5b5c8..d6aad928aa 100644 --- a/cpp/distributed/client.cpp +++ b/cpp/distributed/client.cpp @@ -258,6 +258,7 @@ Connection::Connection( const Url& pUrl, const string& mdmbu, const bool mup, + const string& runtimeBackendDetail, Logger* lg ) :httpClient(), @@ -271,6 +272,10 @@ Connection::Connection( proxyUrl(pUrl), modelDownloadMirrorBaseUrl(mdmbu), mirrorUseProxy(mup), + gitRevisionWithBackendForServer( + Version::getGitRevisionWithBackend() + + (runtimeBackendDetail.empty() ? "" : ("-" + runtimeBackendDetail)) + ), clientInstanceId(), logger(lg), rand(), @@ -698,6 +703,15 @@ static Client::ModelInfo parseModelInfo(const json& networkProperties) { model.bytes = parse(networkProperties,"model_file_bytes"); model.sha256 = parseString(networkProperties,"model_file_sha256",64); model.isRandom = parse(networkProperties,"is_random"); + //Optional. Ignore bad values rather than failing, so that server-side experimentation with + //this field can never break clients. + model.backendRefTestLenienceFactor = 1.0; + if(networkProperties.find("backend_ref_test_lenience_factor") != networkProperties.end() && + networkProperties["backend_ref_test_lenience_factor"].is_number()) { + double x = networkProperties["backend_ref_test_lenience_factor"].get(); + if(isfinite(x) && x >= 0.01 && x <= 10000.0) + model.backendRefTestLenienceFactor = x; + } return model; } @@ -810,7 +824,7 @@ bool Connection::getNextTask( while(true) { httplib::MultipartFormDataItems items = { - { "git_revision", Version::getGitRevisionWithBackend(), "", "" }, + { "git_revision", gitRevisionWithBackendForServer, "", "" }, { "client_instance_id", clientInstanceId, "", "" }, { "task_rep_factor", Global::intToString(taskRepFactor), "", ""}, { "allow_selfplay_task", (allowSelfplayTask ? "true" : "false"), "", ""}, diff --git a/cpp/distributed/client.h b/cpp/distributed/client.h index 3f5d9cb081..d64d420615 100644 --- a/cpp/distributed/client.h +++ b/cpp/distributed/client.h @@ -44,6 +44,9 @@ namespace Client { size_t bytes; std::string sha256; bool isRandom; + //Optional per-network lenience factor for the backend reference output check, from the + //server's network properties. 1.0 when the server does not provide it. + double backendRefTestLenienceFactor = 1.0; void failIfSha256Mismatch(const std::string& modelPath) const; }; @@ -81,6 +84,9 @@ namespace Client { const Url& proxyUrl, const std::string& modelDownloadMirrorBaseUrl, bool mirrorUseProxy, + // Short runtime detail distinguishing configurations of the same compiled backend (NeuralNet::getRuntimeBackendDetail) + // Appended to the git revision reported to the server. Empty for most backends. + const std::string& runtimeBackendDetail, Logger* logger ); ~Connection(); @@ -165,6 +171,9 @@ namespace Client { std::string modelDownloadMirrorBaseUrl; bool mirrorUseProxy; + //Git revision + compile-time backend + runtime backend detail, as reported to the server + std::string gitRevisionWithBackendForServer; + //Fixed string different on every startup but shared across all requests for this run of the client std::string clientInstanceId; diff --git a/cpp/external/composable_kernel_fmha/LICENSE b/cpp/external/composable_kernel_fmha/LICENSE new file mode 100644 index 0000000000..68f6ae5746 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2018- , Advanced Micro Devices, Inc. (Chao Liu, Jing Zhang) +Copyright (c) 2019- , Advanced Micro Devices, Inc. (Letao Qin, Qianfeng Zhang, Liang Huang, Shaojie Wang) +Copyright (c) 2022- , Advanced Micro Devices, Inc. (Anthony Chang, Chunyu Lai, Illia Silin, Adam Osewski, Poyen Chen, Jehandad Khan) +Copyright (c) 2019-2021, Advanced Micro Devices, Inc. (Hanwen Chang) +Copyright (c) 2019-2020, Advanced Micro Devices, Inc. (Tejash Shah) +Copyright (c) 2020 , Advanced Micro Devices, Inc. (Xiaoyan Zhou) +Copyright (c) 2021-2022, Advanced Micro Devices, Inc. (Jianfeng Yan) + +SPDX-License-Identifier: MIT +Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cpp/external/composable_kernel_fmha/README.md b/cpp/external/composable_kernel_fmha/README.md new file mode 100644 index 0000000000..e622daf2c6 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/README.md @@ -0,0 +1,89 @@ +# Composable Kernel FMHA (fused multi-head attention) + +Vendored glue headers + pre-generated kernel instantiations from AMD's Composable Kernel (CK) +`ck_tile` FMHA implementation, used by the ROCm backend as an optional fused attention path +(mirrors the CUDA backend's optional cudnn-frontend SDPA graph path). Requires the ck_tile base +headers from a `composablekernel-dev`/`amdrocm-ck*` system package (not vendored here). If not +found at configure time (see `KATAGO_CK_TILE_INCLUDE_DIR` in `cpp/CMakeLists.txt`), the ROCm +backend just always uses its own plain (non-fused) attention kernel instead - this is a pure +performance optimization, not required for correctness. Measured ~2x speedup in nnEvals/s on a gfx1100 +(RX 7900 XTX) with a small transformer test model, FP16. + +Runtime opt-out: set `rocmDisableFusedAttention = true` in the KataGo config to force the plain +kernel even when the fused path is compiled in and available. + +Known unavailable on Windows as of TheRock 7.14: ck_tile's `cast_to_amdgpu_buffer_rsrc_t` calls +`std::memcpy` from device code, which requires a standard library whose `memcpy` is host+device. +libstdc++ gets that from HIP's own headers, but MSVC's `` is already included by the time +those are reached, leaving `memcpy` host-only and the kernels uncompilable. The configure-time +probe detects this and falls back to the built-in attention kernels, so it costs speed rather than +breaking the build. TheRock 7.13's ck_tile does compile these kernels on Windows, so this is a +regression in the newer ck_tile rather than a general Windows or MSVC limitation. + +Source: https://github.com/ROCm/rocm-libraries, tag `therock-7.13`, +`projects/composablekernel/example/ck_tile/01_fmha/`. Must be API-compatible with the ck_tile core +headers from the installed system package (`fmha_fwd.hpp` etc. reference internal ck_tile core APIs +that can change between releases) - if they aren't compatible, the CMake configure-time compile +probe disables the fused path and the backend falls back to its plain attention kernel. When +regenerating from a different tag, verify against the installed +`.../include/ck_tile/ops/fmha_fwd.hpp`. + +## What's here + +- `fmha_fwd.hpp`, `mask.hpp`, `bias.hpp`, `rotary.hpp`, `quant.hpp`: the example's glue headers + declaring `fmha_fwd()`/`fmha_fwd_traits`/`fmha_fwd_args` and friends. Copied unmodified. +- `generated/`: kernel instantiations produced by CK's `generate.py` codegen script, narrowed to + exactly what KataGo needs (see regeneration command below). `fmha_fwd_api.cpp` is the dispatcher + (`fmha_fwd()`); the rest are individual `fmha_fwd_` template instantiations it calls into. + The filenames are shortened relative to what `generate.py` emits, to + `fmha_fwd___<10-hex>.cpp` where the hex is a sha1 prefix of the original + `generate.py` filename (see the rename step under Regenerating). `generate.py`'s own names are up + to 173 characters of tile/pipeline configuration - long enough that object-file paths in a + Windows build tree exceed the default 260-character `MAX_PATH`, and `git clone` breaks in all but + very shallow directories unless long paths are enabled system-wide. The names are not + load-bearing: nothing references them (the build globs this directory), each file's contents + still contain its full original trait string as the template instantiation it defines (grep for + it to map a file back to its configuration), and the contents are byte-for-byte `generate.py` + output. Hashing the original name (rather than e.g. numbering the files) keeps each name stable + if the generated set changes shape in a future regeneration. + +## Scope (matches what the CUDA backend's cudnn-frontend SDPA path actually uses) + +- fp16 only (CUDA's fused SDPA path is FP16-only too; FP32 always uses the plain kernel fallback) +- batch mode only (no group/variable-length mode) +- bias: no-bias or elementwise (matches the [B,1,S,S] additive mask-derived bias KataGo builds); + no alibi +- mask: none (KataGo has no causal masking; padding is handled via the elementwise bias instead) +- no LSE output, no dropout, no quantization scaling, no attention sink +- hdim buckets: 32, 64 (covers KataGo's (qHeadDim, vHeadDim) combos of 32/32, 32/16, 64/64, 64/32, + 32/64 - smaller actual head dims like 16 are handled via CK's own padding within the 32 bucket) +- targets: gfx9, gfx950, gfx11, gfx115, gfx12 (as of `therock-7.13`; CK has no FMHA codegen support + for gfx10/RDNA2 - gfx1030/1031/1032 always use the plain kernel fallback. gfx125 doesn't exist as + a target in this codegen version either.) + +## Regenerating + +From a checkout of `projects/composablekernel/example/ck_tile/01_fmha/` at tag `therock-7.13` in the +CK source repo: + +``` +python3 generate.py --output_dir --targets gfx9,gfx950,gfx11,gfx115,gfx12 -a fwd \ + -f "*_fp16_batch_*_nlogits_*bias_nmask_nlse_ndropout_nskip_nqscale_*nsink" \ + --optdim 32,64 --receipt 0 -m simplified +``` + +Then shorten the filenames (see "What's here" above for the scheme and why): + +``` +python3 - <<'EOF' +import os, hashlib +d = "" +for f in os.listdir(d): + if not f.endswith(".cpp") or f == "fmha_fwd_api.cpp": + continue + parts = f[:-4].split("_") + assert parts[0] == "fmha" and parts[1] == "fwd" and parts[2] in ("d32", "d64"), f + g = f"fmha_fwd_{parts[2]}_{parts[-1]}_{hashlib.sha1(f.encode()).hexdigest()[:10]}.cpp" + os.rename(os.path.join(d, f), os.path.join(d, g)) +EOF +``` diff --git a/cpp/external/composable_kernel_fmha/bias.hpp b/cpp/external/composable_kernel_fmha/bias.hpp new file mode 100644 index 0000000000..b526204384 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/bias.hpp @@ -0,0 +1,114 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include +#include "ck_tile/core.hpp" +#include "ck_tile/ops/fmha.hpp" + +// keep sync with BlockAttentionBiasEnum +enum class bias_enum +{ + no_bias = 0, + elementwise_bias = 1, + alibi = 2, +}; + +struct bias_info +{ + bias_enum type; + /* + * simple dispatch logic + * + * if type == elementwise_bias: + * if rank_info == 0: + * bias is 1*1*s*s + * elif rank_info == 1: + * bias is 1*h*s*s + * elif rank_info == 2: + * bias is b*h*s*s + * + * elif type == alibi: + * if rank_info == 0: + * alibi in 1*h + * elif rank_info == 1: + * alibi in b*h + */ + int rank_info; + + void serialize(std::ostream& os) const + { + if(type == bias_enum::no_bias) + os << "n"; + else if(type == bias_enum::elementwise_bias) + { + os << "e"; + if(rank_info != 0) + { + os << "[" << rank_info << "]"; + } + } + else if(type == bias_enum::alibi) + { + os << "alibi"; + if(rank_info != 0) + { + os << "[" << rank_info << "]"; + } + } + } + + static bias_info decode(std::string str) + { + bias_info info{bias_enum::no_bias, 0}; + auto found_0 = str.find(':'); + if(found_0 != std::string::npos) + { + std::string t = str.substr(0, found_0); + std::string v = str.substr(found_0 + 1); + if(t == "e" || t == "elementwise") + { + info.type = bias_enum::elementwise_bias; + info.rank_info = std::stoi(v); + if(info.rank_info < 0 || info.rank_info > 2) + throw std::invalid_argument("invalid bias rank: " + str); + } + else if(t == "a" || t == "alibi") + { + info.type = bias_enum::alibi; + info.rank_info = std::stoi(v); + if(info.rank_info < 0 || info.rank_info > 1) + throw std::invalid_argument("invalid bias rank: " + str); + } + else + { + throw std::invalid_argument("invalid bias value: " + str); + } + } + else if(str == "0" || str == "n") + { + info.type = bias_enum::no_bias; + } + else if(str == "1" || str == "e" || str == "elementwise") + { + info.type = bias_enum::elementwise_bias; + } + else if(str == "2" || str == "a" || str == "alibi") + { + info.type = bias_enum::alibi; + } + else + { + throw std::invalid_argument("invalid bias value: " + str); + } + return info; + } + + friend std::ostream& operator<<([[clang::lifetimebound]] std::ostream& os, const bias_info& bi) + { + bi.serialize(os); + return os; + } +}; diff --git a/cpp/external/composable_kernel_fmha/fmha_fwd.hpp b/cpp/external/composable_kernel_fmha/fmha_fwd.hpp new file mode 100644 index 0000000000..98e2df2e1e --- /dev/null +++ b/cpp/external/composable_kernel_fmha/fmha_fwd.hpp @@ -0,0 +1,1779 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +#include "ck_tile/core.hpp" +#include "ck_tile/host/device_prop.hpp" +#include "ck_tile/host/kernel_launch.hpp" +#include "ck_tile/ops/epilogue.hpp" +#include "ck_tile/ops/fmha.hpp" + +#include "bias.hpp" +#include "mask.hpp" +#include "quant.hpp" +#include "rotary.hpp" + +#include +#include +#include + +struct FmhaFwdFp32 +{ +}; + +struct FmhaFwdFp16 +{ +}; + +struct FmhaFwdBf16 +{ +}; + +struct FmhaFwdFp8 +{ +}; + +struct FmhaFwdBf8 +{ +}; + +struct FmhaFwdFp8Fp16 +{ +}; + +struct FmhaFwdFp8Bf16 +{ +}; + +struct FmhaFwdFp8Fp32 +{ +}; + +struct FmhaFwdMxFp8 +{ +}; + +struct FmhaFwdMxFp4 +{ +}; + +template +struct FmhaFwdTypeConfig; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = float; + using KDataType = float; + using VDataType = float; + using BiasDataType = float; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = float; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = float; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::half_t; + using KDataType = ck_tile::half_t; + using VDataType = ck_tile::half_t; + using BiasDataType = ck_tile::half_t; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::half_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = ck_tile::half_t; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::bf16_t; + using KDataType = ck_tile::bf16_t; + using VDataType = ck_tile::bf16_t; + using BiasDataType = ck_tile::bf16_t; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::bf16_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = ck_tile::bf16_t; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::fp8_t; + using KDataType = ck_tile::fp8_t; + using VDataType = ck_tile::fp8_t; + using BiasDataType = float; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::fp8_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = ck_tile::fp8_t; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::bf8_t; + using KDataType = ck_tile::bf8_t; + using VDataType = ck_tile::bf8_t; + using BiasDataType = ck_tile::bf8_t; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::bf8_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = ck_tile::bf8_t; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::fp8_t; + using KDataType = ck_tile::fp8_t; + using VDataType = ck_tile::fp8_t; + using BiasDataType = float; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::fp8_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = ck_tile::bf16_t; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::fp8_t; + using KDataType = ck_tile::fp8_t; + using VDataType = ck_tile::fp8_t; + using BiasDataType = float; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::fp8_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = float; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::fp8_t; + using KDataType = ck_tile::fp8_t; + using VDataType = ck_tile::fp8_t; + using BiasDataType = float; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::fp8_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = float; + + using QScaleDataType = ck_tile::e8m0_t; + using KScaleDataType = ck_tile::e8m0_t; + using VScaleDataType = ck_tile::e8m0_t; + using PScaleDataType = ck_tile::e8m0_t; + + static constexpr ck_tile::index_t kQKScaleGranularity = 32; + static constexpr ck_tile::index_t kVScaleGranularity = 32; +}; + +template <> +struct FmhaFwdTypeConfig +{ + using QDataType = ck_tile::pk_fp4_t; + using KDataType = ck_tile::pk_fp4_t; + using VDataType = ck_tile::pk_fp4_t; + using BiasDataType = float; + using RandValOutputDataType = uint8_t; + using LSEDataType = float; // data type for lse(logsumexp L_j = max_j + log(l_j)) + using SaccDataType = float; // data type for first gemm accumulation + using SMPLComputeDataType = float; // data type for reduction, softmax + using PDataType = ck_tile::pk_fp4_t; // data type for A matrix of second gemm + using OaccDataType = float; // data type for second gemm accumulation + using ODataType = float; + + using QScaleDataType = ck_tile::e8m0_t; + using KScaleDataType = ck_tile::e8m0_t; + using VScaleDataType = ck_tile::e8m0_t; + using PScaleDataType = ck_tile::e8m0_t; + + static constexpr ck_tile::index_t kQKScaleGranularity = 32; + static constexpr ck_tile::index_t kVScaleGranularity = 32; +}; + +struct FmhaMasks +{ + using NoMask = ck_tile::GenericAttentionMask; + using GenericMask = ck_tile::GenericAttentionMask; + using CausalMask = ck_tile::GenericAttentionMask; +}; + +// runtime args, some will passed to karg, some will used to compute grids/blocks +struct fmha_fwd_args +{ + const void* q_ptr; + const void* k_ptr; + const void* v_ptr; + const void* bias_ptr; // bias or alibi_slope pointer + const void* q_descale_ptr; + const void* k_descale_ptr; + const void* v_descale_ptr; + void* rand_val_ptr; + void* lse_ptr; + void* o_ptr; + + // Usage notes for sequence length pointer parameters: + // + // [Note: Define "Group mode" vs "Batch mode" here if possible, e.g., "Group mode handles + // MQA/GQA..."] + // + // With padding: + // Group mode: + // - seqstart_q_ptr, seqstart_k_ptr: Record cumulative physical (including padding) sequence + // lengths. [array size: batch + 1] + // - seqlen_q_ptr/seqlen_k_ptr: Records logical (excluding padding) length for each + // sequence. [array size: batch] + // - cu_seqlen_q_ptr/cu_seqlen_k_ptr: Records cumulative logical (excluding padding) + // sequence lengths. [array size: batch + 1] + // - seqlen_q_ptr (per-sequence) and cu_seqlen_q_ptr (cumulative logical) are mutually + // exclusive. Use one set, not both. + // + // Batch mode: + // - cu_seqlen_q_ptr/cu_seqlen_k_ptr: Records cumulative logical (excluding padding) + // sequence lengths. [array size: batch + 1] + // - seqstart_* and seqlen_* pointers must be nullptr. + // + // Without padding: + // (Note: Physical length equals logical length) + // + // Group mode: + // - seqstart_q_ptr, seqstart_k_ptr: Record cumulative physical sequence lengths. [array + // size: batch + 1] + // - seqlen_q_ptr/seqlen_k_ptr and cu_seqlen_q_ptr/cu_seqlen_k_ptr must be nullptr. + // + // Batch mode: + // - All sequence length pointers (seqstart_*, seqlen_*, cu_seqlen_*) must be nullptr. + // + const void* seqstart_q_ptr = + nullptr; // Cumulative physical sequence length array [batch + 1]. (Used in Group mode) + const void* seqstart_k_ptr = + nullptr; // Cumulative physical sequence length array [batch + 1]. (Used in Group mode) + const void* seqlen_q_ptr = nullptr; // Per-sequence logical (excluding padding) length array + // [batch]. (Used in Group mode with padding) + const void* seqlen_k_ptr = nullptr; // Per-sequence logical (excluding padding) length array + // [batch]. (Used in Group mode with padding) + const void* cu_seqlen_q_ptr = nullptr; // Cumulative logical (excluding padding) sequence length + // array [batch + 1]. (Used with padding) + const void* cu_seqlen_k_ptr = nullptr; // Cumulative logical (excluding padding) sequence length + // array [batch + 1]. (Used with padding) + const void* block_scale_seqstart_q_ptr; + const void* block_scale_seqstart_k_ptr; + const void* seqstart_v_scale_ptr; + const void* sink_ptr; + + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_k; + ck_tile::index_t batch; + ck_tile::index_t max_seqlen_q; + ck_tile::index_t hdim_q; + ck_tile::index_t hdim_v; + ck_tile::index_t nhead_q; + ck_tile::index_t nhead_k; + ck_tile::index_t num_head_q_total = 0; + ck_tile::index_t head_start = 0; + + float scale_s; + float logits_soft_cap; + + ck_tile::index_t stride_q; + ck_tile::index_t stride_k; + ck_tile::index_t stride_v; + ck_tile::index_t stride_bias; // if alibi, b*h need set this to h, 1*h need set this to 0 + ck_tile::index_t stride_randval; + ck_tile::index_t stride_o; + ck_tile::index_t stride_q_descale; + ck_tile::index_t stride_k_descale; + ck_tile::index_t stride_v_descale; + ck_tile::index_t nhead_stride_q; + ck_tile::index_t nhead_stride_k; + ck_tile::index_t nhead_stride_v; + ck_tile::index_t nhead_stride_bias; + ck_tile::index_t nhead_stride_randval; + ck_tile::index_t nhead_stride_lse; + ck_tile::index_t nhead_stride_o; + ck_tile::index_t nhead_stride_q_descale; + ck_tile::index_t nhead_stride_k_descale; + ck_tile::index_t nhead_stride_v_descale; + ck_tile::index_t batch_stride_q; + ck_tile::index_t batch_stride_k; + ck_tile::index_t batch_stride_v; + ck_tile::index_t batch_stride_bias; + ck_tile::index_t batch_stride_randval; + ck_tile::index_t batch_stride_lse; + ck_tile::index_t batch_stride_o; + ck_tile::index_t batch_stride_q_descale; + ck_tile::index_t batch_stride_k_descale; + ck_tile::index_t batch_stride_v_descale; + + ck_tile::index_t window_size_left; + ck_tile::index_t window_size_right; + ck_tile::index_t sink_size; + ck_tile::index_t mask_type; + ck_tile::index_t min_seqlen_q; + + float p_drop; + bool s_randval; + + std::variant, std::pair> + drop_seed_offset; + + ck_tile::index_t block_scale_size_q; + ck_tile::index_t block_scale_size_kv; +}; + +struct fmha_fwd_pagedkv_args +{ + const void* q_ptr; + const void* k_ptr; + const void* v_ptr; + const void* bias_ptr; // bias or alibi_slope pointer + void* lse_ptr; + void* o_ptr; + + void* block_table_ptr; + ck_tile::index_t batch_stride_block_table; // only used if 'block_table_ptr' is not nullptr + ck_tile::index_t page_block_size; // only used if 'block_table_ptr' is not nullptr + bool is_gappy; // differentiate seqstart_k_ptr usage. only used if 'block_table_ptr' is not + // nullptr. + + const void* cache_batch_idx; + + // the real seqlen_q & seqlen_k are decided by following: + // batch mode: seqlen_q = kargs.seqlen_q + // seqlen_k = kargs.seqlen_k + // group mode: seqlen_q = kargs.seqstart_q_ptr[b + 1] - kargs.seqstart_q_ptr[b] + // seqlen_k = kargs.seqstart_k_ptr[b + 1] - kargs.seqstart_k_ptr[b] + // or kargs.seqlen_k_ptr[b] + // + // batch mode (kvcache): + // seqlen_q = kargs.seqlen_q + // seqlen_k = kargs.seqlen_k_ptr[b] + // group mode (kvcache): + // seqlen_q = kargs.seqstart_q_ptr[b + 1] - kargs.seqstart_q_ptr[b] + // + // when is_gappy=true: + // seqlen_k = kargs.seqlen_k_ptr[b] + // seqstart_k_ptr[b] now store local offset of each batch + // + // when is_gappy=false: + // seqlen_k = kargs.seqstart_k_ptr[b + 1] - kargs.seqstart_k_ptr[b] + // or kargs.seqlen_k_ptr[b] + const void* seqstart_q_ptr; + const void* seqstart_k_ptr; + const void* seqlen_k_ptr; + const void* sink_ptr; + + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_k; + ck_tile::index_t batch; + ck_tile::index_t max_seqlen_q; + ck_tile::index_t hdim_q; + ck_tile::index_t hdim_v; + ck_tile::index_t nhead_q; + ck_tile::index_t nhead_k; + + float scale_s; + float scale_p; + float scale_o; + + float logits_soft_cap; + + ck_tile::index_t stride_q; + ck_tile::index_t stride_k; + ck_tile::index_t stride_v; + ck_tile::index_t stride_bias; // if alibi, b*h need set this to h, 1*h need set this to 0 + ck_tile::index_t stride_o; + ck_tile::index_t nhead_stride_q; + ck_tile::index_t nhead_stride_k; + ck_tile::index_t nhead_stride_v; + ck_tile::index_t nhead_stride_bias; + ck_tile::index_t nhead_stride_lse; + ck_tile::index_t nhead_stride_o; + ck_tile::index_t batch_stride_q; + ck_tile::index_t batch_stride_k; + ck_tile::index_t batch_stride_v; + ck_tile::index_t batch_stride_bias; + ck_tile::index_t batch_stride_lse; + ck_tile::index_t batch_stride_o; + + ck_tile::index_t window_size_left; + ck_tile::index_t window_size_right; + ck_tile::index_t sink_size; + ck_tile::index_t mask_type; + ck_tile::index_t min_seqlen_q; +}; + +struct fmha_fwd_splitkv_args +{ + const void* q_ptr; + const void* k_ptr; + const void* v_ptr; + const void* bias_ptr; // bias or alibi_slope pointer + void* lse_acc_ptr; + void* o_acc_ptr; + void* lse_ptr; + void* o_ptr; + + void* block_table_ptr; + ck_tile::index_t batch_stride_block_table; // only used if 'block_table_ptr' is not nullptr + ck_tile::index_t page_block_size; // only used if 'block_table_ptr' is not nullptr + bool is_gappy; // differentiate seqstart_k_ptr usage. only used if 'block_table_ptr' is not + // nullptr. + + const void* cache_batch_idx; + + // the real seqlen_q & seqlen_k are decided by following: + // batch mode: seqlen_q = kargs.seqlen_q + // seqlen_k = kargs.seqlen_k + // group mode: seqlen_q = kargs.seqstart_q_ptr[b + 1] - kargs.seqstart_q_ptr[b] + // seqlen_k = kargs.seqstart_k_ptr[b + 1] - kargs.seqstart_k_ptr[b] + // or kargs.seqlen_k_ptr[b] + // + // batch mode (kvcache): + // seqlen_q = kargs.seqlen_q + // seqlen_k = kargs.seqlen_k_ptr[b] + // group mode (kvcache): + // seqlen_q = kargs.seqstart_q_ptr[b + 1] - kargs.seqstart_q_ptr[b] + // + // when is_gappy=true: + // seqlen_k = kargs.seqlen_k_ptr[b] + // seqstart_k_ptr[b] now store local offset of each batch + // + // when is_gappy=false: + // seqlen_k = kargs.seqstart_k_ptr[b + 1] - kargs.seqstart_k_ptr[b] + // or kargs.seqlen_k_ptr[b] + const void* seqstart_q_ptr; + const void* seqstart_k_ptr; + const void* seqlen_k_ptr; + const void* sink_ptr; + + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_k; + ck_tile::index_t batch; + ck_tile::index_t max_seqlen_q; + ck_tile::index_t hdim_q; + ck_tile::index_t hdim_v; + ck_tile::index_t nhead_q; + ck_tile::index_t nhead_k; + ck_tile::index_t num_splits; + + float scale_s; + float scale_p; + float scale_o; + + float logits_soft_cap; + + ck_tile::index_t stride_q; + ck_tile::index_t stride_k; + ck_tile::index_t stride_v; + ck_tile::index_t stride_bias; // if alibi, b*h need set this to h, 1*h need set this to 0 + ck_tile::index_t stride_o_acc; + ck_tile::index_t stride_o; + ck_tile::index_t nhead_stride_q; + ck_tile::index_t nhead_stride_k; + ck_tile::index_t nhead_stride_v; + ck_tile::index_t nhead_stride_bias; + ck_tile::index_t nhead_stride_lse; + ck_tile::index_t nhead_stride_lse_acc; + ck_tile::index_t nhead_stride_o_acc; + ck_tile::index_t nhead_stride_o; + ck_tile::index_t batch_stride_q; + ck_tile::index_t batch_stride_k; + ck_tile::index_t batch_stride_v; + ck_tile::index_t batch_stride_bias; + ck_tile::index_t batch_stride_lse; + ck_tile::index_t batch_stride_lse_acc; + ck_tile::index_t batch_stride_o_acc; + ck_tile::index_t batch_stride_o; + ck_tile::index_t split_stride_lse_acc; + ck_tile::index_t split_stride_o_acc; + + ck_tile::index_t window_size_left; + ck_tile::index_t window_size_right; + ck_tile::index_t sink_size; + ck_tile::index_t mask_type; +}; + +struct fmha_fwd_appendkv_args +{ + void* q_ptr; + void* k_ptr; + const void* knew_ptr; + void* v_ptr; + const void* vnew_ptr; + + const void* seqlen_k_ptr; + + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_knew; + ck_tile::index_t batch; + ck_tile::index_t hdim_q; + ck_tile::index_t hdim_v; + ck_tile::index_t nhead_q; + ck_tile::index_t nhead_k; + + const void* rotary_cos_ptr; // only used if 'rotary_dim' > 0 + const void* rotary_sin_ptr; // only used if 'rotary_dim' > 0 + ck_tile::index_t rotary_dim; + bool has_mask; + + void* block_table_ptr; + ck_tile::index_t batch_stride_block_table; // only used if 'block_table_ptr' is not nullptr + ck_tile::index_t page_block_size; // only used if 'block_table_ptr' is not nullptr + + const void* cache_batch_idx; // only used if block_table_ptr is nullptr -> batch mode (kvcache) + const void* sink_ptr; + + ck_tile::index_t stride_q; + ck_tile::index_t stride_k; + ck_tile::index_t stride_knew; + ck_tile::index_t stride_v; + ck_tile::index_t stride_vnew; + ck_tile::index_t nhead_stride_q; + ck_tile::index_t nhead_stride_k; + ck_tile::index_t nhead_stride_knew; + ck_tile::index_t nhead_stride_v; + ck_tile::index_t nhead_stride_vnew; + ck_tile::index_t batch_stride_q; + ck_tile::index_t batch_stride_k; + ck_tile::index_t batch_stride_knew; + ck_tile::index_t batch_stride_v; + ck_tile::index_t batch_stride_vnew; +}; + +struct fmha_batch_prefill_args +{ + const void* q_ptr; + const void* k_ptr; + const void* v_ptr; + const void* bias_ptr; // bias or alibi_slope pointer + const void* q_descale_ptr; + const void* k_descale_ptr; + const void* v_descale_ptr; + void* rand_val_ptr; + void* lse_ptr; + void* o_ptr; + + // the real seqlen_q & seqlen_k are decided by following: + // batch mode (kvcache): + // seqlen_q = kargs.seqlen_q + // seqlen_k = kargs.page_block_size * (kargs.kv_indptr[b + 1] - kargs.kv_indptr[b] - + // 1) + + // kargs.kv_last_page_lens[b] + // group mode (kvcache): + // seqlen_q = kargs.seqstart_q_ptr[b + 1] - kargs.seqstart_q_ptr[b] + // seqlen_k = kargs.page_block_size * (kargs.kv_indptr[b + 1] - kargs.kv_indptr[b] - + // 1) + + // kargs.kv_last_page_lens[b] + const void* seqstart_q_ptr; + const void* sink_ptr; + + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_k; + ck_tile::index_t batch; + ck_tile::index_t max_seqlen_q; + ck_tile::index_t hdim_q; + ck_tile::index_t hdim_v; + ck_tile::index_t nhead_q; + ck_tile::index_t nhead_k; + + // KV cache page table fields (kv_lookup_table selects interpretation): + // - SGLANG_PAGE_TABLE_1D: + // kv_indptr: prefix-sum [batch+1] into kv_page_indices + // kv_page_indices: 1D list of physical page ids, length = num_total_pages + // kv_last_page_lens: per-batch last page lengths [batch] + // - VLLM_BLOCK_TABLE_2D: + // kv_page_indices: block_table [batch, max_blocks_per_seq] (2D) + // batch_stride_block_table: row stride for block_table + // seqlen_k_ptr: per-batch seqlen_k [batch] + int32_t num_total_pages; // total physical pages in KV cache (SGLang/vLLM) + ck_tile::index_t page_block_size; // tokens per page (SGLang/vLLM) + ck_tile::BlockAttentionKVCacheMemoryLayoutEnum + kv_memory_layout; // KV memory layout (SGLang/vLLM) + ck_tile::BlockAttentionKVCacheLookupTableEnum kv_lookup_table; // lookup table layout selector + void* kv_indptr; // SGLang: prefix-sum; vLLM: unused + void* kv_page_indices; // SGLang: 1D page list; vLLM: block_table 2D + void* kv_last_page_lens; // SGLang: last page lengths; vLLM: unused + void* seqlen_k_ptr; // vLLM: per-batch seqlen_k; SGLang: unused + ck_tile::index_t batch_stride_block_table; // vLLM: row stride; SGLang: unused + + float scale_s; + float scale_p; + float scale_o; + + float logits_soft_cap; + + ck_tile::index_t stride_q; + ck_tile::index_t stride_k; + ck_tile::index_t stride_v; + ck_tile::index_t stride_bias; // if alibi, b*h need set this to h, 1*h need set this to 0 + ck_tile::index_t stride_randval; + ck_tile::index_t stride_o; + ck_tile::index_t nhead_stride_q; + ck_tile::index_t nhead_stride_k; + ck_tile::index_t nhead_stride_v; + ck_tile::index_t nhead_stride_bias; + ck_tile::index_t nhead_stride_randval; + ck_tile::index_t nhead_stride_lse; + ck_tile::index_t nhead_stride_o; + ck_tile::index_t batch_stride_q; + ck_tile::index_t batch_stride_k; + ck_tile::index_t batch_stride_v; + ck_tile::index_t batch_stride_bias; + ck_tile::index_t batch_stride_randval; + ck_tile::index_t batch_stride_lse; + ck_tile::index_t batch_stride_o; + + ck_tile::index_t window_size_left; + ck_tile::index_t window_size_right; + ck_tile::index_t sink_size; + ck_tile::index_t mask_type; + + float p_drop; + bool s_randval; + + std::variant, std::pair> + drop_seed_offset; + + // KV_BLOCKSCALE: per-page K/V descales (Q per-tensor, K/V per-page) + // k_descale_ptr/v_descale_ptr are reused for KV_BLOCKSCALE mode: + // k_descale_ptr: [num_block, num_kv_head] - points to k block descale + // v_descale_ptr: [num_block, num_kv_head] - points to v block descale + ck_tile::index_t nblock_stride_kv_block_descale = 0; // Stride along num_block dimension + ck_tile::index_t nhead_stride_kv_block_descale = 0; // Stride along num_kv_head dimension +}; + +// Selects the KV-cache load mode for a batch-prefill dispatch arm. +// GLOBAL_LOAD_LDS: required when (a) the page is smaller than one K/V tile +// so per-page SRD is impossible, AND (b) the total KV-pool byte size +// exceeds INT32_MAX so SRD's 32-bit byte offset cannot address it. +// BUFFER_LOAD: every other case — the SGPR-resident SRD path is fastest. +// Inputs are taken as plain integers so the helper has no template parameter +// and can be called from each codegen-emitted dispatcher arm with the arm's +// compile-time kN0 / element_bytes substituted as constants. +inline ck_tile::BlockAttentionKVCacheLoadModeEnum +fmha_batch_prefill_select_kv_load_mode(ck_tile::index_t page_block_size, + ck_tile::index_t kN0, + ck_tile::index_t num_total_pages, + ck_tile::index_t batch_stride_k, + ck_tile::index_t element_bytes) +{ + // Promote every operand to long_index_t so overflow is impossible regardless + // of multiplication order. A bare `static_cast(num_total_pages) + // * batch_stride_k * element_bytes` only works because of left-to-right + // associativity — a future reorder of the operands would silently truncate. + const auto kv_pool_bytes = static_cast(num_total_pages) * + static_cast(batch_stride_k) * + static_cast(element_bytes); + return (page_block_size < kN0 && kv_pool_bytes > INT32_MAX) + ? ck_tile::BlockAttentionKVCacheLoadModeEnum::GLOBAL_LOAD_LDS + : ck_tile::BlockAttentionKVCacheLoadModeEnum::BUFFER_LOAD; +} + +template +auto fmha_fwd_create_kargs_and_grids(fmha_fwd_args args) +{ + assert(args.nhead_q % args.nhead_k == 0); + auto kargs = [&] { + // create group mode kernel arguments + if constexpr(FmhaKernel::kIsGroupMode) + { + return FmhaKernel::MakeKargsImpl(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.q_descale_ptr, + args.k_descale_ptr, + args.v_descale_ptr, + args.rand_val_ptr, + args.lse_ptr, + args.o_ptr, + args.seqstart_q_ptr, + args.seqstart_k_ptr, + args.seqlen_q_ptr, + args.seqlen_k_ptr, + args.block_scale_seqstart_q_ptr, + args.block_scale_seqstart_k_ptr, + args.seqstart_v_scale_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.scale_s, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_randval, + args.stride_o, + args.stride_q_descale, + args.stride_k_descale, + args.stride_v_descale, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_randval, + args.nhead_stride_lse, + args.nhead_stride_o, + args.nhead_stride_q_descale, + args.nhead_stride_k_descale, + args.nhead_stride_v_descale, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.min_seqlen_q, + args.p_drop, + args.s_randval, + args.drop_seed_offset, + args.block_scale_size_q, + args.block_scale_size_kv, + args.cu_seqlen_q_ptr, + args.cu_seqlen_k_ptr, + args.sink_ptr, + args.num_head_q_total, + args.head_start); + } + else + { // create batch mode kernel arguments + return FmhaKernel::MakeKargsImpl(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.q_descale_ptr, + args.k_descale_ptr, + args.v_descale_ptr, + args.rand_val_ptr, + args.lse_ptr, + args.o_ptr, + args.seqlen_q, + args.seqlen_k, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.scale_s, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_randval, + args.stride_o, + args.stride_q_descale, + args.stride_k_descale, + args.stride_v_descale, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_randval, + args.nhead_stride_lse, + args.nhead_stride_o, + args.nhead_stride_q_descale, + args.nhead_stride_k_descale, + args.nhead_stride_v_descale, + args.batch_stride_q, + args.batch_stride_k, + args.batch_stride_v, + args.batch_stride_bias, + args.batch_stride_randval, + args.batch_stride_lse, + args.batch_stride_o, + args.batch_stride_q_descale, + args.batch_stride_k_descale, + args.batch_stride_v_descale, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.p_drop, + args.s_randval, + args.drop_seed_offset, + args.block_scale_size_q, + args.block_scale_size_kv, + args.cu_seqlen_q_ptr, + args.cu_seqlen_k_ptr, + args.sink_ptr, + args.num_head_q_total, + args.head_start); + } + }(); + + if constexpr(FmhaKernel::kIsGroupMode) + { + dim3 grids = FmhaKernel::GridSize( + args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v, args.seqlen_k_ptr != nullptr); + return ck_tile::make_tuple(kargs, grids); + } + else + { + dim3 grids = + FmhaKernel::GridSize(args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v, false); + return ck_tile::make_tuple(kargs, grids); + } +} + +template +auto fmha_fwd_v3_create_kargs_and_grids(fmha_fwd_args args) +{ + /// NOTICE: This was borrowed from Aiter. Make sure the selected remap_opt setting truly + /// maximizes the kernel's performance. + int remap_opt = 2; + if(args.mask_type != static_cast(mask_enum::no_mask) && + ((args.nhead_q % 8 != 0) || (16384 < args.seqlen_q))) + { + if(65536 <= args.seqlen_q) + { + remap_opt = 0; + } + else + { + remap_opt = 1; + } + } + + auto kargs = [&] { + if constexpr(FmhaKernel::kIsGroupMode) + { + return FmhaKernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.q_descale_ptr, + args.k_descale_ptr, + args.v_descale_ptr, + nullptr, // lse_ptr + args.o_ptr, + args.seqstart_q_ptr, + args.seqstart_k_ptr, + args.seqlen_q_ptr, + args.seqlen_k_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.scale_s, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_o, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + 0, // nhead_stride_lse + args.nhead_stride_o, + args.window_size_left, + args.window_size_right, + args.mask_type, + remap_opt, + args.cu_seqlen_q_ptr, + args.cu_seqlen_k_ptr); + } + else + { + return FmhaKernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.q_descale_ptr, + args.k_descale_ptr, + args.v_descale_ptr, + nullptr, // lse_ptr + args.o_ptr, + args.seqlen_q, + args.seqlen_k, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.scale_s, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_o, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + 0, // nhead_stride_lse + args.nhead_stride_o, + args.batch_stride_q, + args.batch_stride_k, + args.batch_stride_v, + 0, // batch_stride_lse + args.batch_stride_o, + args.window_size_left, + args.window_size_right, + args.mask_type, + remap_opt, + args.cu_seqlen_q_ptr, + args.cu_seqlen_k_ptr); + } + }(); + + dim3 grids = FmhaKernel::GridSize(args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v); + + return ck_tile::make_tuple(kargs, grids); +} + +template +auto fmha_fwd_pagedkv_create_kargs_and_grids(fmha_fwd_pagedkv_args args) +{ + assert(args.nhead_q % args.nhead_k == 0); + auto kargs = [&] { + // create group mode kernel arguments + if constexpr(FmhaKernel::kIsGroupMode) + { + return FmhaKernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.lse_ptr, + args.o_ptr, + args.seqstart_q_ptr, + args.seqstart_k_ptr, + args.seqlen_k_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.block_table_ptr, + args.batch_stride_block_table, + args.page_block_size, + args.is_gappy, + args.scale_s, + args.scale_p, + args.scale_o, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_o, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_lse, + args.nhead_stride_o, + args.batch_stride_k, + args.batch_stride_v, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.min_seqlen_q, + args.sink_ptr); + } + else + { // create batch mode kernel arguments + return FmhaKernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.lse_ptr, + args.o_ptr, + args.seqlen_q, + args.seqlen_k, + args.seqlen_k_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.block_table_ptr, + args.batch_stride_block_table, + args.page_block_size, + args.cache_batch_idx, + args.scale_s, + args.scale_p, + args.scale_o, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_o, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_lse, + args.nhead_stride_o, + args.batch_stride_q, + args.batch_stride_k, + args.batch_stride_v, + args.batch_stride_bias, + args.batch_stride_lse, + args.batch_stride_o, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.sink_ptr); + } + }(); + + // FmhaKernel::PrintParameters(kargs, args.batch); + if constexpr(FmhaKernel::kIsGroupMode) + { + dim3 grids = FmhaKernel::GridSize( + args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v, args.seqlen_k_ptr != nullptr); + return ck_tile::make_tuple(kargs, grids); + } + else + { + dim3 grids = + FmhaKernel::GridSize(args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v, false); + return ck_tile::make_tuple(kargs, grids); + } +} + +template +auto fmha_fwd_splitkv_create_kargs_and_grids(fmha_fwd_splitkv_args args) +{ + assert(args.nhead_q % args.nhead_k == 0); + auto kargs = [&] { + // create group mode kernel arguments + if constexpr(Kernel::kIsGroupMode) + { + return Kernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.lse_acc_ptr, + args.o_acc_ptr, + args.batch, + args.seqstart_q_ptr, + args.seqstart_k_ptr, + args.seqlen_k_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.num_splits, + args.block_table_ptr, + args.batch_stride_block_table, + args.page_block_size, + args.is_gappy, + args.scale_s, + args.scale_p, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_o_acc, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_lse_acc, + args.nhead_stride_o_acc, + args.batch_stride_k, // only used for paged-kvcache + args.batch_stride_v, // only used for paged-kvcache + args.split_stride_lse_acc, + args.split_stride_o_acc, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.sink_ptr); + } + else + { // create batch mode kernel arguments + return Kernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.lse_acc_ptr, + args.o_acc_ptr, + args.batch, + args.seqlen_q, + args.seqlen_k, + args.seqlen_k_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.num_splits, + args.block_table_ptr, + args.batch_stride_block_table, + args.page_block_size, + args.cache_batch_idx, + args.scale_s, + args.scale_p, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_o_acc, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_lse_acc, + args.nhead_stride_o_acc, + args.batch_stride_q, + args.batch_stride_k, + args.batch_stride_v, + args.batch_stride_bias, + args.batch_stride_lse_acc, + args.batch_stride_o_acc, + args.split_stride_lse_acc, + args.split_stride_o_acc, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.sink_ptr); + } + }(); + + dim3 grids = Kernel::GridSize( + args.batch, args.nhead_q, args.nhead_k, args.max_seqlen_q, args.hdim_v, args.num_splits); + + return ck_tile::make_tuple(kargs, grids); +} + +template +auto fmha_fwd_splitkv_combine_create_kargs_and_grids(fmha_fwd_splitkv_args args) +{ + assert(args.nhead_q % args.nhead_k == 0); + auto kargs = [&] { + // create group mode kernel argumentszs + if constexpr(Kernel::kIsGroupMode) + { + return Kernel::MakeKargs(args.lse_acc_ptr, + args.o_acc_ptr, + args.lse_ptr, + args.o_ptr, + args.batch, + args.seqstart_q_ptr, + args.hdim_v, + args.num_splits, + args.scale_o, + args.stride_o_acc, + args.stride_o, + args.nhead_stride_lse_acc, + args.nhead_stride_o_acc, + args.nhead_stride_lse, + args.nhead_stride_o, + args.split_stride_lse_acc, + args.split_stride_o_acc); + } + else + { // create batch mode kernel arguments + return Kernel::MakeKargs(args.lse_acc_ptr, + args.o_acc_ptr, + args.lse_ptr, + args.o_ptr, + args.batch, + args.seqlen_q, + args.hdim_v, + args.num_splits, + args.scale_o, + args.stride_o_acc, + args.stride_o, + args.nhead_stride_lse_acc, + args.nhead_stride_o_acc, + args.nhead_stride_lse, + args.nhead_stride_o, + args.batch_stride_lse_acc, + args.batch_stride_o_acc, + args.batch_stride_lse, + args.batch_stride_o, + args.split_stride_lse_acc, + args.split_stride_o_acc); + } + }(); + + dim3 grids = Kernel::GridSize(args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v); + + return ck_tile::make_tuple(kargs, grids); +} + +template +auto fmha_fwd_appendkv_create_kargs_and_grids(fmha_fwd_appendkv_args args) +{ + assert(args.nhead_q % args.nhead_k == 0); + auto kargs = Kernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.knew_ptr, + args.v_ptr, + args.vnew_ptr, + args.seqlen_q, + args.seqlen_k_ptr, + args.seqlen_knew, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.rotary_cos_ptr, + args.rotary_sin_ptr, + args.rotary_dim, + args.has_mask, + args.block_table_ptr, + args.batch_stride_block_table, + args.page_block_size, + args.cache_batch_idx, + args.stride_q, + args.stride_k, + args.stride_knew, + args.stride_v, + args.stride_vnew, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_knew, + args.nhead_stride_v, + args.nhead_stride_vnew, + args.batch_stride_q, + args.batch_stride_k, + args.batch_stride_knew, + args.batch_stride_v, + args.batch_stride_vnew); + + dim3 grids = Kernel::GridSize(args.batch, args.nhead_q, args.seqlen_q, args.seqlen_knew); + + return ck_tile::make_tuple(kargs, grids); +} + +template +auto fmha_batch_prefill_create_kargs_and_grids(fmha_batch_prefill_args args) +{ + assert(args.nhead_q % args.nhead_k == 0); + using PageTableKargs = typename FmhaKernel::PageBlockTableKargs; + const PageTableKargs page_table = [&]() { + if constexpr(FmhaKernel::kKVLookupTable == + ck_tile::BlockAttentionKVCacheLookupTableEnum::SGLANG_PAGE_TABLE_1D) + { + return PageTableKargs{reinterpret_cast(args.kv_indptr), + reinterpret_cast(args.kv_page_indices), + reinterpret_cast(args.kv_last_page_lens)}; + } + else + { + return PageTableKargs{reinterpret_cast(args.kv_page_indices), + args.batch_stride_block_table, + reinterpret_cast(args.seqlen_k_ptr)}; + } + }(); + auto kargs = [&] { + // create group mode kernel arguments + if constexpr(FmhaKernel::kIsGroupMode) + { + return FmhaKernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.q_descale_ptr, + args.k_descale_ptr, + args.v_descale_ptr, + args.rand_val_ptr, + args.lse_ptr, + args.o_ptr, + args.seqstart_q_ptr, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.num_total_pages, + args.page_block_size, + page_table, + args.scale_s, + args.scale_p, + args.scale_o, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_randval, + args.stride_o, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_randval, + args.nhead_stride_lse, + args.nhead_stride_o, + args.batch_stride_k, + args.batch_stride_v, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.p_drop, + args.s_randval, + args.drop_seed_offset, + args.sink_ptr, + args.nblock_stride_kv_block_descale, + args.nhead_stride_kv_block_descale); + } + else + { // create batch mode kernel arguments + return FmhaKernel::MakeKargs(args.q_ptr, + args.k_ptr, + args.v_ptr, + args.bias_ptr, + args.q_descale_ptr, + args.k_descale_ptr, + args.v_descale_ptr, + args.rand_val_ptr, + args.lse_ptr, + args.o_ptr, + args.seqlen_q, + args.hdim_q, + args.hdim_v, + args.nhead_q, + args.nhead_q / args.nhead_k, + args.num_total_pages, + args.page_block_size, + page_table, + args.scale_s, + args.scale_p, + args.scale_o, + args.logits_soft_cap, + args.stride_q, + args.stride_k, + args.stride_v, + args.stride_bias, + args.stride_randval, + args.stride_o, + args.nhead_stride_q, + args.nhead_stride_k, + args.nhead_stride_v, + args.nhead_stride_bias, + args.nhead_stride_randval, + args.nhead_stride_lse, + args.nhead_stride_o, + args.batch_stride_q, + args.batch_stride_k, + args.batch_stride_v, + args.batch_stride_bias, + args.batch_stride_randval, + args.batch_stride_lse, + args.batch_stride_o, + args.window_size_left, + args.window_size_right, + args.sink_size, + args.mask_type, + args.p_drop, + args.s_randval, + args.drop_seed_offset, + args.sink_ptr, + args.nblock_stride_kv_block_descale, + args.nhead_stride_kv_block_descale); + } + }(); + + dim3 grids = FmhaKernel::GridSize(args.batch, args.nhead_q, args.max_seqlen_q, args.hdim_v); + return ck_tile::make_tuple(kargs, grids); +} + +// this is used to pattern-match internl kernel implementation, not to instantiate kernel +template +struct fmha_fwd_traits_ +{ + static constexpr ck_tile::index_t HDim = HDim_; + using DataType = ck_tile::remove_cvref_t; + static constexpr bool kIsGroupMode = kIsGroupMode_; + static constexpr ck_tile::index_t kM0 = kM0_; + static constexpr ck_tile::index_t kN0 = kN0_; + static constexpr ck_tile::index_t kK0 = kK0_; + static constexpr ck_tile::index_t kN1 = kN1_; + static constexpr ck_tile::index_t kK1 = kK1_; + static constexpr ck_tile::index_t kK0BlockLength = kK0BlockLength_; + static constexpr bool kIsVLayoutRowMajor = kIsVLayoutRowMajor_; + static constexpr auto FmhaPipelineEnum = FmhaPipelineEnum_; + static constexpr bool kHasLogitsSoftCap = kHasLogitsSoftCap_; + using FmhaMask = ck_tile::remove_cvref_t; + static constexpr auto BiasEnum = BiasEnum_; + static constexpr bool kStoreLse = kStoreLse_; + static constexpr bool kHasDropout = kHasDropout_; + static constexpr auto QScaleEnum = QScaleEnum_; + static constexpr bool kPadS = kPadS_; + static constexpr bool kPadSK = kPadSK_; + static constexpr bool kPadD = kPadD_; + static constexpr bool kPadDv = kPadDv_; + static constexpr bool kUseTrLoad = kUseTrLoad_; + static constexpr bool kSkipMinSeqlenQ = kSkipMinSeqlenQ_; + static constexpr bool kHasSink = kHasSink_; +}; + +template +struct fmha_fwd_batch_prefill_traits_ : public fmha_fwd_traits_ +{ + static constexpr auto kKVMemoryLayout = kKVMemoryLayout_; + static constexpr auto kKVLookupTable = kKVLookupTable_; + static constexpr ck_tile::index_t kPageBlockSize = kPageBlockSize_; + static constexpr auto kKVLoadMode = kKVLoadMode_; + static_assert(kIsVLayoutRowMajor_, "Batch prefill only supports row-major V layout"); +}; + +template +float fmha_fwd_(const ck_tile::stream_config&, fmha_fwd_args); + +template +struct fmha_fwd_pagedkv_traits_ +{ + static constexpr ck_tile::index_t HDim = HDim_; + using DataType = ck_tile::remove_cvref_t; + static constexpr bool kIsGroupMode = kIsGroupMode_; + static constexpr ck_tile::index_t kM0 = kM0_; + static constexpr ck_tile::index_t kN0 = kN0_; + static constexpr ck_tile::index_t kK0 = kK0_; + static constexpr ck_tile::index_t kN1 = kN1_; + static constexpr ck_tile::index_t kK1 = kK1_; + static constexpr ck_tile::index_t kK0BlockLength = kK0BlockLength_; + static constexpr bool kIsVLayoutRowMajor = kIsVLayoutRowMajor_; + static constexpr auto FmhaPipelineEnum = FmhaPipelineEnum_; + static constexpr bool kHasLogitsSoftCap = kHasLogitsSoftCap_; + using FmhaMask = ck_tile::remove_cvref_t; + static constexpr auto BiasEnum = BiasEnum_; + static constexpr bool kStoreLse = kStoreLse_; + static constexpr bool kIsPagedKV = kIsPagedKV_; + static constexpr bool kDoFp8StaticQuant = kDoFp8StaticQuant_; + static constexpr bool kPadS = kPadS_; + static constexpr bool kPadSK = kPadSK_; + static constexpr bool kPadD = kPadD_; + static constexpr bool kPadDv = kPadDv_; + static constexpr bool kSkipMinSeqlenQ = kSkipMinSeqlenQ_; + static constexpr bool kHasSink = kHasSink_; +}; + +template +float fmha_fwd_pagedkv_(const ck_tile::stream_config&, fmha_fwd_pagedkv_args); + +template +struct fmha_fwd_splitkv_traits_ +{ + static constexpr ck_tile::index_t HDim = HDim_; + using DataType = ck_tile::remove_cvref_t; + static constexpr bool kIsGroupMode = kIsGroupMode_; + static constexpr ck_tile::index_t kM0 = kM0_; + static constexpr ck_tile::index_t kN0 = kN0_; + static constexpr ck_tile::index_t kK0 = kK0_; + static constexpr ck_tile::index_t kN1 = kN1_; + static constexpr ck_tile::index_t kK1 = kK1_; + static constexpr ck_tile::index_t kK0BlockLength = kK0BlockLength_; + static constexpr bool kIsVLayoutRowMajor = kIsVLayoutRowMajor_; + static constexpr auto FmhaPipelineEnum = FmhaPipelineEnum_; + static constexpr bool kHasLogitsSoftCap = kHasLogitsSoftCap_; + using FmhaMask = ck_tile::remove_cvref_t; + static constexpr auto BiasEnum = BiasEnum_; + static constexpr bool kStoreLse = kStoreLse_; + static constexpr bool kDoFp8StaticQuant = kDoFp8StaticQuant_; + static constexpr bool kPadS = kPadS_; + static constexpr bool kPadSK = kPadSK_; + static constexpr bool kPadD = kPadD_; + static constexpr bool kPadDv = kPadDv_; + static constexpr bool kIsPagedKV = kIsPagedKV_; + static constexpr bool kHasSink = kHasSink_; +}; + +template +void fmha_fwd_splitkv_oneshot_(const ck_tile::stream_config&, fmha_fwd_splitkv_args); + +template +std::string fmha_fwd_splitkv_get_name_(); + +template +struct fmha_fwd_splitkv_combine_traits_ +{ + static constexpr ck_tile::index_t HDim = HDim_; + using DataType = ck_tile::remove_cvref_t; + static constexpr bool kIsGroupMode = kIsGroupMode_; + static constexpr ck_tile::index_t kN1 = kN1_; + static constexpr bool kStoreLse = kStoreLse_; + static constexpr bool kDoFp8StaticQuant = kDoFp8StaticQuant_; + static constexpr bool kPadS = kPadS_; + static constexpr bool kPadDv = kPadDv_; +}; + +template +void fmha_fwd_splitkv_combine_oneshot_(const ck_tile::stream_config&, fmha_fwd_splitkv_args); + +template +std::string fmha_fwd_splitkv_combine_get_name_(); + +// this is used to pattern-match internl kernel implementation, not to instantiate kernel +template +struct fmha_fwd_appendkv_traits_ +{ + static constexpr ck_tile::index_t HDim = HDim_; + using DataType = ck_tile::remove_cvref_t; + static constexpr ck_tile::index_t kTileSizeS = kTileSizeS_; + static constexpr ck_tile::index_t kTileSizeSk = kTileSizeSk_; + static constexpr ck_tile::index_t kTileSizeD = kTileSizeD_; + static constexpr ck_tile::index_t kTileSizeDv = kTileSizeDv_; + static constexpr bool kIsVLayoutRowMajor = kIsVLayoutRowMajor_; + static constexpr bool kPadS = kPadS_; + static constexpr bool kPadSk = kPadSk_; + static constexpr bool kPadD = kPadD_; + static constexpr bool kPadDv = kPadDv_; + static constexpr auto RotaryEnum = RotaryEnum_; + static constexpr bool kIsPagedKV = kIsPagedKV_; +}; + +template +float fmha_fwd_appendkv_(const ck_tile::stream_config&, fmha_fwd_appendkv_args); + +template +float fmha_batch_prefill_(const ck_tile::stream_config&, fmha_batch_prefill_args); + +// This is the public API, will be generated by script +struct fmha_fwd_traits +{ + int hdim_q; + int hdim_v; + std::string data_type; + bool is_group_mode; + bool is_v_rowmajor; + bool has_logits_soft_cap; + mask_enum mask_type; + bias_enum bias_type; // 0:no bias, 1:elementwise bias, 2:alibi. sync with BlockAttentionBiasEnum + bool has_lse; + bool has_dropout; + quant_scale_enum qscale_type; + bool skip_min_seqlen_q = false; + bool has_sink = false; + // TODO: padding check is inside this api +}; +float fmha_fwd(fmha_fwd_traits, fmha_fwd_args, const ck_tile::stream_config&); + +struct fmha_fwd_pagedkv_traits +{ + int hdim_q; + int hdim_v; + std::string data_type; + bool is_group_mode; + bool is_v_rowmajor; + bool has_logits_soft_cap; + mask_enum mask_type; + bias_enum bias_type; // 0:no bias, 1:elementwise bias, 2:alibi. sync with BlockAttentionBiasEnum + bool has_lse = false; + bool use_pagedkv = true; + bool do_fp8_static_quant = false; + bool skip_min_seqlen_q = false; + bool has_sink = false; + // TODO: padding check is inside this api +}; + +float fmha_fwd_pagedkv(fmha_fwd_pagedkv_traits&, + fmha_fwd_pagedkv_args&, + const ck_tile::stream_config&); + +struct fmha_fwd_splitkv_traits +{ + int hdim_q; + int hdim_v; + std::string data_type; + bool is_group_mode; + bool is_v_rowmajor; + bool has_logits_soft_cap; + mask_enum mask_type; + bias_enum bias_type; // 0:no bias, 1:elementwise bias, 2:alibi. sync with BlockAttentionBiasEnum + bool has_lse; + bool do_fp8_static_quant = false; + bool has_sink = false; + // TODO: padding check is inside this api +}; +float fmha_fwd_splitkv(fmha_fwd_splitkv_traits, + fmha_fwd_splitkv_args, + const ck_tile::stream_config&); + +struct fmha_fwd_appendkv_traits +{ + int hdim_q; + int hdim_v; + std::string data_type; + bool is_v_rowmajor; + rope_enum rope_type; +}; +float fmha_fwd_appendkv(fmha_fwd_appendkv_traits, + fmha_fwd_appendkv_args, + const ck_tile::stream_config&); + +struct fmha_batch_prefill_traits : public fmha_fwd_traits +{ + ck_tile::BlockAttentionKVCacheMemoryLayoutEnum kv_memory_layout = + ck_tile::BlockAttentionKVCacheMemoryLayoutEnum::VECTORIZED_LAYOUT; + ck_tile::BlockAttentionKVCacheLookupTableEnum kv_lookup_table = + ck_tile::BlockAttentionKVCacheLookupTableEnum::SGLANG_PAGE_TABLE_1D; + int page_size = 1; +}; + +float fmha_batch_prefill(fmha_batch_prefill_traits, + fmha_batch_prefill_args, + const ck_tile::stream_config&); diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_api.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_api.cpp new file mode 100644 index 0000000000..180d4df9ab --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_api.cpp @@ -0,0 +1,418 @@ + +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include + +#include + +#include "fmha_fwd.hpp" + +namespace { +bool get_num_cus(unsigned& num_cus) { + int device; + auto status = hipGetDevice(&device); + if(status != hipSuccess) { + fprintf(stderr, "failed to get device"); + return false; + } + + hipDeviceProp_t props{}; + status = hipGetDeviceProperties(&props, device); + if(status != hipSuccess) { + fprintf(stderr, "failed to get device properties"); + return false; + } + + num_cus = props.multiProcessorCount; + return true; +} + +unsigned get_num_thread_blocks(unsigned batch, unsigned nheads, unsigned max_seqlen_q, unsigned kM0) { + const unsigned num_m_blocks = (max_seqlen_q + kM0 - 1) / kM0; + const unsigned num_n_blocks = 1; // we assume that num_n_blocks is always 1 + + return batch * nheads * num_m_blocks * num_n_blocks; +} +} // namespace + +namespace { +float fmha_fwd_v2([[maybe_unused]] fmha_fwd_traits t, [[maybe_unused]] fmha_fwd_args a, [[maybe_unused]] const ck_tile::stream_config& s) { + float r = -1; + + [[maybe_unused]] const float min_cu_util_rate = 0.8; // minimum CU utilization rate + + unsigned num_cus; + if(!get_num_cus(num_cus)) { + return r; + } + + [[maybe_unused]] auto get_num_blocks = [&](unsigned kM0) { + return get_num_thread_blocks(a.batch, a.nhead_q, a.max_seqlen_q, kM0); + }; + + [[maybe_unused]] const std::string device_name = ck_tile::get_device_name(); + + if(device_name.compare(0, 6, "gfx950") == 0) { + if(t.data_type.compare("fp16") == 0) { + if(t.hdim_q <= 32 && t.hdim_v <= 32) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr != nullptr) || (a.seqlen_k == 0 || a.seqlen_k % 64 != 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (a.seqlen_q % 128 == 0) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (true /*a.hdim_q % 32 != 0*/) && (true /*a.hdim_v % 32 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + else if(t.hdim_q <= 64 && t.hdim_v <= 64) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (a.seqlen_q <= 16) && (true) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 16, 32, 64, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (a.seqlen_q <= 16) && (true) && (true /*a.hdim_q % 64 != 0*/) && (true /*a.hdim_v % 64 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 16, 32, 64, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, true, true, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (a.seqlen_q <= 16) && (true) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 16, 32, 64, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (a.seqlen_q <= 32) && (true) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 32, 32, 64, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (a.seqlen_q <= 32) && (true) && (true /*a.hdim_q % 64 != 0*/) && (true /*a.hdim_v % 64 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 32, 32, 64, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, true, true, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (a.seqlen_q <= 32) && (true) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 32, 32, 64, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr != nullptr) || (a.seqlen_k == 0 || a.seqlen_k % 64 != 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (a.seqlen_q % 128 == 0) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (true /*a.hdim_q % 64 != 0*/) && (true /*a.hdim_v % 64 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && (true) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && (true) && (true /*a.hdim_q % 64 != 0*/) && (true /*a.hdim_v % 64 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, true, true, true, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && (true) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, true, false, false>; + return fmha_fwd_(s, a); + } + + } + + } + + } + else if(device_name.compare(0, 6, "gfx115") == 0) { + if(t.data_type.compare("fp16") == 0) { + if(t.hdim_q <= 32 && t.hdim_v <= 32) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + else if(t.hdim_q <= 64 && t.hdim_v <= 64) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + + } + + } + else if(device_name.compare(0, 5, "gfx11") == 0) { + if(t.data_type.compare("fp16") == 0) { + if(t.hdim_q <= 32 && t.hdim_v <= 32) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + else if(t.hdim_q <= 64 && t.hdim_v <= 64) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((a.max_seqlen_q < 4096) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((a.max_seqlen_q < 4096) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((a.max_seqlen_q < 4096) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((a.max_seqlen_q < 4096) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + + } + + } + else if(device_name.compare(0, 5, "gfx12") == 0) { + if(t.data_type.compare("fp16") == 0) { + if(t.hdim_q <= 32 && t.hdim_v <= 32) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 64, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + else if(t.hdim_q <= 64 && t.hdim_v <= 64) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 64 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 64, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + + } + + } + else if(device_name.compare(0, 4, "gfx9") == 0) { + if(t.data_type.compare("fp16") == 0) { + if(t.hdim_q <= 32 && t.hdim_v <= 32) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr != nullptr) || (a.seqlen_k == 0 || a.seqlen_k % 64 != 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (a.seqlen_q % 128 == 0) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 32 == 0) && (a.hdim_v % 32 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (true /*a.hdim_q % 32 != 0*/) && (true /*a.hdim_v % 32 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<32, FmhaFwdFp16, false, 128, 64, 16, 32, 32, 32, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + else if(t.hdim_q <= 64 && t.hdim_v <= 64) { + if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::no_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr != nullptr) || (a.seqlen_k == 0 || a.seqlen_k % 64 != 0)) && (a.hdim_q % 8 == 0) && (a.hdim_v % 8 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (a.seqlen_q % 128 == 0) && (true/*fall back to largest tile*/) && ((a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % 64 == 0)) && (a.hdim_q % 64 == 0) && (a.hdim_v % 64 == 0) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + return fmha_fwd_(s, a); + } + else if((t.is_group_mode == false) && (t.is_v_rowmajor == true) && (t.has_logits_soft_cap == false) && (t.mask_type == mask_enum::no_mask) && (t.bias_type == bias_enum::elementwise_bias) && (t.has_lse == false) && (t.has_dropout == false) && (t.qscale_type == quant_scale_enum::no_scale) && (t.skip_min_seqlen_q == false) &&(t.has_sink == false) && + (true /*a.seqlen_q % 128 != 0*/) && (true/*fall back to largest tile*/) && (true /*a.seqlen_k % 64 != 0*/) && (true /*a.hdim_q % 64 != 0*/) && (true /*a.hdim_v % 64 != 0*/) && ((true) && (true))) { + using trait_ = fmha_fwd_traits_<64, FmhaFwdFp16, false, 128, 64, 32, 64, 32, 64, true, ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, ck_tile::SimplifiedGenericAttentionMask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + return fmha_fwd_(s, a); + } + + } + + } + + } + + return r; +} +} // namespace + +namespace { +float fmha_fwd_v3([[maybe_unused]] fmha_fwd_traits t, [[maybe_unused]] fmha_fwd_args a, [[maybe_unused]] const ck_tile::stream_config& s) { + float r = -1; + + [[maybe_unused]] const float min_cu_util_rate = 0.8; // minimum CU utilization rate + + unsigned num_cus; + if(!get_num_cus(num_cus)) { + return r; + } + + [[maybe_unused]] auto get_num_blocks = [&](unsigned kM0) { + return get_num_thread_blocks(a.batch, a.nhead_q, a.max_seqlen_q, kM0); + }; + + [[maybe_unused]] const std::string device_name = ck_tile::get_device_name(); + + + return r; +} +} // namespace + +float fmha_fwd(fmha_fwd_traits traits, fmha_fwd_args args, const ck_tile::stream_config& config) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + if (false) { + float r = fmha_fwd_v3(traits, args, config); + if (r >= 0) return r; + } +#pragma clang diagnostic pop + return fmha_fwd_v2(traits, args, config); +} diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_6886099b77.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_6886099b77.cpp new file mode 100644 index 0000000000..e657bd3940 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_6886099b77.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_74ab6576aa.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_74ab6576aa.cpp new file mode 100644 index 0000000000..6dd03008aa --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_74ab6576aa.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_f477009f2e.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_f477009f2e.cpp new file mode 100644 index 0000000000..ef19ce1ccf --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_f477009f2e.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_f71389be9e.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_f71389be9e.cpp new file mode 100644 index 0000000000..ba81fe1c7a --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx115_f71389be9e.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_5795e853f4.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_5795e853f4.cpp new file mode 100644 index 0000000000..dd5507699f --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_5795e853f4.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_8cdf5467d8.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_8cdf5467d8.cpp new file mode 100644 index 0000000000..c3e3b23905 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_8cdf5467d8.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_99bb7e4d23.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_99bb7e4d23.cpp new file mode 100644 index 0000000000..ec2daba92c --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_99bb7e4d23.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_bf4fb25d59.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_bf4fb25d59.cpp new file mode 100644 index 0000000000..644fefa301 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx11_bf4fb25d59.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_13775543e7.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_13775543e7.cpp new file mode 100644 index 0000000000..55e45fd07b --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_13775543e7.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_1c977eca26.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_1c977eca26.cpp new file mode 100644 index 0000000000..744e724cc4 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_1c977eca26.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_66f951529e.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_66f951529e.cpp new file mode 100644 index 0000000000..e91d1c66d6 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_66f951529e.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_da4e49597f.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_da4e49597f.cpp new file mode 100644 index 0000000000..fb96d2ae9c --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx12_da4e49597f.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,64, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b64x64x16x32x32x32_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_c5b2d2a464.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_c5b2d2a464.cpp new file mode 100644 index 0000000000..502d6bd32b --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_c5b2d2a464.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_npad_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_e51c0fa271.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_e51c0fa271.cpp new file mode 100644 index 0000000000..4dd9e29e33 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_e51c0fa271.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_eb1b13fc0d.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_eb1b13fc0d.cpp new file mode 100644 index 0000000000..60eea2125f --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_eb1b13fc0d.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_f207f48585.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_f207f48585.cpp new file mode 100644 index 0000000000..e7620f684a --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx950_f207f48585.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_0428e4661a.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_0428e4661a.cpp new file mode 100644 index 0000000000..024742cd4b --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_0428e4661a.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_npad_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_95265d2aa4.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_95265d2aa4.cpp new file mode 100644 index 0000000000..a9979075eb --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_95265d2aa4.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_e26ef9fee4.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_e26ef9fee4.cpp new file mode 100644 index 0000000000..188923a1e5 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_e26ef9fee4.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_fea3d8477c.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_fea3d8477c.cpp new file mode 100644 index 0000000000..269e07e526 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d32_gfx9_fea3d8477c.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 16, 32, 32, 32>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<32, FmhaFwdFp16, false,128, 64, 16, 32, 32, 32, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d32_fp16_batch_b128x64x16x32x32x32_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_6295407e8c.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_6295407e8c.cpp new file mode 100644 index 0000000000..e5688428ec --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_6295407e8c.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_abe17f7ca9.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_abe17f7ca9.cpp new file mode 100644 index 0000000000..d2a009bb92 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_abe17f7ca9.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_b06e286044.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_b06e286044.cpp new file mode 100644 index 0000000000..94b45a9586 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_b06e286044.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_d8823996f7.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_d8823996f7.cpp new file mode 100644 index 0000000000..7c25621fe3 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx115_d8823996f7.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_305b5f56c6.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_305b5f56c6.cpp new file mode 100644 index 0000000000..62f809583c --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_305b5f56c6.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_37160c9bdb.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_37160c9bdb.cpp new file mode 100644 index 0000000000..1f6073a0c4 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_37160c9bdb.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<8, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r8x1x1_r8x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_413a3dbfe4.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_413a3dbfe4.cpp new file mode 100644 index 0000000000..bc7ea0bb3b --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_413a3dbfe4.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<8, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r8x1x1_r8x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_4ecf767fbf.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_4ecf767fbf.cpp new file mode 100644 index 0000000000..7d4725a52d --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_4ecf767fbf.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<8, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r8x1x1_r8x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_509f657116.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_509f657116.cpp new file mode 100644 index 0000000000..422de5ae49 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_509f657116.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_5361e79b81.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_5361e79b81.cpp new file mode 100644 index 0000000000..10d6844a3c --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_5361e79b81.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_b9b062e555.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_b9b062e555.cpp new file mode 100644 index 0000000000..ec28c1943f --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_b9b062e555.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_e46f18c045.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_e46f18c045.cpp new file mode 100644 index 0000000000..5f932d4de0 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx11_e46f18c045.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<8, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r8x1x1_r8x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx11__) && !defined(__gfx115__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_561f3f9e85.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_561f3f9e85.cpp new file mode 100644 index 0000000000..f4826603a7 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_561f3f9e85.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_5c07164305.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_5c07164305.cpp new file mode 100644 index 0000000000..49eceb7408 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_5c07164305.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_6ce6db9ead.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_6ce6db9ead.cpp new file mode 100644 index 0000000000..026b1e2881 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_6ce6db9ead.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_vr_pssk_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_d66b00a475.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_d66b00a475.cpp new file mode 100644 index 0000000000..337a75ad90 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx12_d66b00a475.cpp @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__) || defined(__gfx1200__) || defined(__gfx1201__) || defined(__gfx12_generic__)) +#if !defined(CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK) +#define CK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK 1 +#endif +#endif +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<64, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<16, 16, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSHpad< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,64, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_HPAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b64x64x32x64x32x64_r4x1x1_r4x1x1_w16x16x16_w16x16x16_qr_hpad_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx12__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_07d2563866.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_07d2563866.cpp new file mode 100644 index 0000000000..6aaaf5f59e --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_07d2563866.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_trload_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_40d62aaf45.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_40d62aaf45.cpp new file mode 100644 index 0000000000..f2a603573d --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_40d62aaf45.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_5451282c99.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_5451282c99.cpp new file mode 100644 index 0000000000..f028a8cc38 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_5451282c99.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_589785d5d7.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_589785d5d7.cpp new file mode 100644 index 0000000000..a36118b62d --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_589785d5d7.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<16, 32, 64, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 32>, + ck_tile::sequence<1, 1, 1>, + ck_tile::sequence<16, 16, 32>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,16, 32, 64, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, true, true, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b16x32x64x64x32x64_r1x1x1_r1x1x1_w16x16x32_w16x16x32_qr_async_trload_vr_pddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_64a3502508.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_64a3502508.cpp new file mode 100644 index 0000000000..648f8c4388 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_64a3502508.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<32, 32, 64, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<1, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,32, 32, 64, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, true, true, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b32x32x64x64x32x64_r1x1x1_r1x1x1_w32x32x16_w32x32x16_qr_async_trload_vr_pddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_6ba5d33510.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_6ba5d33510.cpp new file mode 100644 index 0000000000..ac337f5e78 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_6ba5d33510.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_npad_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_7ac96b78bb.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_7ac96b78bb.cpp new file mode 100644 index 0000000000..a975c1619c --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_7ac96b78bb.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<32, 32, 64, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<1, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,32, 32, 64, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b32x32x64x64x32x64_r1x1x1_r1x1x1_w32x32x16_w32x32x16_qr_async_trload_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_7c538aff89.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_7c538aff89.cpp new file mode 100644 index 0000000000..e1f69416f0 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_7c538aff89.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, true, true, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_trload_vr_pddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_95409b01cd.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_95409b01cd.cpp new file mode 100644 index 0000000000..75d5376d4b --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_95409b01cd.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_trload_vr_npad_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_9e339e38b0.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_9e339e38b0.cpp new file mode 100644 index 0000000000..953b19e1b1 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_9e339e38b0.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<16, 32, 64, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 32>, + ck_tile::sequence<1, 1, 1>, + ck_tile::sequence<16, 16, 32>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,16, 32, 64, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, false, false, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b16x32x64x64x32x64_r1x1x1_r1x1x1_w16x16x32_w16x16x32_qr_async_trload_vr_pssk_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_c74f188948.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_c74f188948.cpp new file mode 100644 index 0000000000..2da6e8bcd6 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_c74f188948.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<32, 32, 64, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<1, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,32, 32, 64, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b32x32x64x64x32x64_r1x1x1_r1x1x1_w32x32x16_w32x32x16_qr_async_trload_vr_npad_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_d451f6f50b.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_d451f6f50b.cpp new file mode 100644 index 0000000000..ad7c3fba0c --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_d451f6f50b.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_fb9df4c557.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_fb9df4c557.cpp new file mode 100644 index 0000000000..7e6954dd21 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx950_fb9df4c557.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<16, 32, 64, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<16, 16, 32>, + ck_tile::sequence<1, 1, 1>, + ck_tile::sequence<16, 16, 32>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + true, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,16, 32, 64, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, true, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b16x32x64x64x32x64_r1x1x1_r1x1x1_w16x16x32_w16x16x32_qr_async_trload_vr_npad_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_trload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_2fc73af37c.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_2fc73af37c.cpp new file mode 100644 index 0000000000..b1327c1d74 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_2fc73af37c.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_psskddv_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_52475dc060.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_52475dc060.cpp new file mode 100644 index 0000000000..05d662a73e --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_52475dc060.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, false, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_76e438e7f0.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_76e438e7f0.cpp new file mode 100644 index 0000000000..11c03f42fe --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_76e438e7f0.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVS< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + false, false>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::ELEMENTWISE_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, false, false, false, false, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_vr_npad_nlogits_bias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_ab4cbe5ea0.cpp b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_ab4cbe5ea0.cpp new file mode 100644 index 0000000000..344abe80d0 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/generated/fmha_fwd_d64_gfx9_ab4cbe5ea0.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved. + +// auto generated by generate.py +#include "ck_tile/ops/fmha/block/variants.hpp" +#include "fmha_fwd.hpp" + +#include + +#if !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) + +using fmha_dtype = FmhaFwdFp16; + +using fmha_block_tile = ck_tile::sequence<128, 64, 32, 64, 32, 64>; + +using fmha_shape = ck_tile::TileFmhaShape, + ck_tile::sequence<32, 32, 16>, + ck_tile::sequence<4, 1, 1>, + ck_tile::sequence<32, 32, 16>, + true>; + +using fmha_traits = ck_tile::TileFmhaTraits; + +using fmha_variant = ck_tile::ComposedAttention; + +using fmha_mask = ck_tile::SimplifiedGenericAttentionMask; + +using fmha_pipeline_problem = ck_tile::BlockFmhaPipelineProblem< + typename FmhaFwdTypeConfig::QDataType, + typename FmhaFwdTypeConfig::KDataType, + typename FmhaFwdTypeConfig::VDataType, + typename FmhaFwdTypeConfig::SaccDataType, + typename FmhaFwdTypeConfig::SMPLComputeDataType, + typename FmhaFwdTypeConfig::BiasDataType, + typename FmhaFwdTypeConfig::RandValOutputDataType, + typename FmhaFwdTypeConfig::LSEDataType, + typename FmhaFwdTypeConfig::PDataType, + typename FmhaFwdTypeConfig::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + fmha_shape, + false, + fmha_variant, + fmha_mask, + false, + fmha_traits>; + +using fmha_pipeline = ck_tile::BlockFmhaPipelineQRKSVSAsync< + fmha_pipeline_problem>; + +using fmha_epilogue = + ck_tile::Default2DEpilogue::OaccDataType, + typename FmhaFwdTypeConfig::ODataType, + true, true>>; + +using fmha_kernel = ck_tile::FmhaFwdKernel; + + +using trait = fmha_fwd_traits_<64, FmhaFwdFp16, false,128, 64, 32, 64, 32, 64, true, + ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC, false, fmha_mask, ck_tile::BlockAttentionBiasEnum::NO_BIAS, false, false, ck_tile::BlockAttentionQuantScaleEnum::NO_SCALE, true, true, true, true, false, false, false>; + +template<> +float fmha_fwd_(const ck_tile::stream_config& s, fmha_fwd_args a) +{ + using k_ = fmha_kernel; + if(s.log_level_ > 0) + std::cout << ", fmha_fwd_d64_fp16_batch_b128x64x32x64x32x64_r4x1x1_r4x1x1_w32x32x16_w32x32x16_qr_async_vr_psskddv_nlogits_nbias_nmask_nlse_ndropout_nskip_nqscale_ntrload_nsink" << std::flush; + auto [kargs, grids] = fmha_fwd_create_kargs_and_grids(a); + const dim3 blocks = k_::BlockSize(); + constexpr ck_tile::index_t kBlockPerCu = k_::kBlockPerCu; + return ck_tile::launch_kernel(s, ck_tile::make_kernel(k_{}, grids, blocks, 0, kargs)); +} + +#endif // !defined(__HIP_DEVICE_COMPILE__) || (defined(__gfx9__) && !defined(__gfx950__)) diff --git a/cpp/external/composable_kernel_fmha/mask.hpp b/cpp/external/composable_kernel_fmha/mask.hpp new file mode 100644 index 0000000000..03e1537c5d --- /dev/null +++ b/cpp/external/composable_kernel_fmha/mask.hpp @@ -0,0 +1,203 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/ops/fmha.hpp" + +// keep this in sync with ck_tile::GenericAttentionMaskEnum +enum class mask_enum +{ + no_mask = 0, + mask_top_left, + mask_bottom_right, + window_generic, +}; + +struct mask_info +{ + mask_enum type; + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_k; + ck_tile::index_t y, x; + ck_tile::index_t left, right; // FA style SWA left/right + ck_tile::index_t sink; + + void serialize(std::ostream& os) const + { + if(type == mask_enum::no_mask) + os << "n"; + else if(type == mask_enum::mask_top_left) + os << "t(" << left << ":" << right << ")"; + else if(type == mask_enum::mask_bottom_right) + os << "b(" << left << ":" << right << ")"; + else + { + os << "g(" << y << ":" << x << ")"; + } + } + + static mask_info decode(std::string str, ck_tile::index_t seqlen_q, ck_tile::index_t seqlen_k) + { + ck_tile::index_t x_total = seqlen_k; + ck_tile::index_t y_total = seqlen_q; + mask_info tmp; + tmp.seqlen_q = seqlen_q; + tmp.seqlen_k = seqlen_k; + auto found_0 = str.find(':'); + if(found_0 != std::string::npos) + { + std::string t = str.substr(0, found_0); + std::string v = str.substr(found_0 + 1); + if(t == "xt" || t == "xb") + { + // xformer style sliding window attn from top-left + ck_tile::index_t window_size = std::stoi(v); + ck_tile::index_t left_size = -1; + ck_tile::index_t right_size = 0; + ck_tile::index_t sink_size = 0; + if(window_size > 0) + { + left_size = window_size / 2; + right_size = window_size - 1 - left_size; + } + auto r = ck_tile::make_generic_attention_mask_coordinates_from_lr_window( + left_size, right_size, sink_size, y_total, x_total, t == "xt"); + + tmp.type = t == "xt" ? mask_enum::mask_top_left : mask_enum::mask_bottom_right; + tmp.y = r.at(ck_tile::number<0>{}); + tmp.x = r.at(ck_tile::number<1>{}); + tmp.left = left_size; + tmp.right = right_size; + tmp.sink = 0; + } + else if(t == "t" || t == "b" || t == "g") + { + auto found_1 = v.find(","); + if(found_1 == std::string::npos) + { + throw std::invalid_argument("invalid mask value: " + str); + } + tmp.type = mask_enum::window_generic; + ck_tile::index_t v0 = atoi(v.substr(0, found_1).c_str()); + auto found_2 = v.find(',', found_1 + 1); + ck_tile::index_t v1 = 0; + ck_tile::index_t sink = 0; + // ck_tile::index_t v1 = atoi(v.substr(found_1 + 1).c_str()); + // TODO: some validation + if(t == "t") + { + if(found_2 != std::string::npos) + { + v1 = atoi(v.substr(found_1 + 1, found_2 - found_1 - 1).c_str()); + sink = atoi(v.substr(found_2 + 1).c_str()); + } + else + { + v1 = atoi(v.substr(found_1 + 1).c_str()); + sink = 0; + } + tmp.type = mask_enum::mask_top_left; + auto r = ck_tile::make_generic_attention_mask_coordinates_from_lr_window( + v0, v1, sink, y_total, x_total, true); + tmp.y = r.at(ck_tile::number<0>{}); + tmp.x = r.at(ck_tile::number<1>{}); + tmp.left = v0; + tmp.right = v1; + tmp.sink = sink; + } + else if(t == "b") + { + if(found_2 != std::string::npos) + { + v1 = atoi(v.substr(found_1 + 1, found_2 - found_1 - 1).c_str()); + sink = atoi(v.substr(found_2 + 1).c_str()); + } + else + { + v1 = atoi(v.substr(found_1 + 1).c_str()); + sink = 0; + } + tmp.type = mask_enum::mask_bottom_right; + auto r = ck_tile::make_generic_attention_mask_coordinates_from_lr_window( + v0, v1, sink, y_total, x_total, false); + tmp.y = r.at(ck_tile::number<0>{}); + tmp.x = r.at(ck_tile::number<1>{}); + tmp.left = v0; + tmp.right = v1; + tmp.sink = sink; + } + else if(t == "g") + { + tmp.type = mask_enum::window_generic; + tmp.y = v0; + tmp.x = v1; + tmp.left = v0; // TODO: don't use this? + tmp.right = v1; + tmp.sink = 0; + } + } + else + { + throw std::invalid_argument("invalid mask value: " + str); + } + } + else if(str == "0") + { + tmp.type = mask_enum::no_mask; + tmp.left = -1; + tmp.right = -1; + tmp.sink = 0; + } + else if(str == "1" || str == "t") + { + tmp.type = mask_enum::mask_top_left; + tmp.y = seqlen_q; + tmp.x = 1; + tmp.left = -1; + tmp.right = 0; + tmp.sink = 0; + } + else if(str == "2" || str == "b") + { + tmp.type = mask_enum::mask_bottom_right; + tmp.y = seqlen_q; + tmp.x = seqlen_k - seqlen_q + 1; + tmp.left = -1; + tmp.right = 0; + tmp.sink = 0; + } + else + { + throw std::invalid_argument("invalid mask value: " + str); + } + return tmp; + } + + std::size_t get_unmaskarea() const + { + if(type == mask_enum::no_mask) + return static_cast(seqlen_q) * seqlen_k; + std::size_t area = 0; + for(ck_tile::index_t i_y = 0; i_y < seqlen_q; ++i_y) + { + ck_tile::index_t x_start = std::max(-y + i_y + 1, static_cast(0)); + ck_tile::index_t x_end = std::min(i_y + x, seqlen_k); + if(x_end > x_start) + { + area += (x_end - x_start); + } + } + return area; + } + + friend std::ostream& operator<<([[clang::lifetimebound]] std::ostream& os, const mask_info& mi) + { + mi.serialize(os); + return os; + } +}; diff --git a/cpp/external/composable_kernel_fmha/quant.hpp b/cpp/external/composable_kernel_fmha/quant.hpp new file mode 100644 index 0000000000..4b8cd2e9a4 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/quant.hpp @@ -0,0 +1,78 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include +#include "ck_tile/core.hpp" +#include "ck_tile/ops/fmha.hpp" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wlifetime-safety-intra-tu-suggestions" + +// keep sync with BlockAttentionQuantScaleEnum +enum class quant_scale_enum +{ + no_scale = 0, + pertensor = 1, + blockscale = 2, + kv_blockscale = 3, // Q per-tensor, K/V per-page block scale + mx = 4, // Microscaling (MX) +}; + +struct quant_scale_info +{ + quant_scale_enum type; + + void serialize(std::ostream& os) const + { + if(type == quant_scale_enum::no_scale) + os << "n"; + else if(type == quant_scale_enum::pertensor) + os << "pt"; + else if(type == quant_scale_enum::blockscale) + os << "bs"; + else if(type == quant_scale_enum::kv_blockscale) + os << "kvbs"; + else if(type == quant_scale_enum::mx) + os << "mx"; + } + + static quant_scale_info decode(std::string str) + { + quant_scale_info info{quant_scale_enum::no_scale}; + if(str == "n" || str == "0") + { + info.type = quant_scale_enum::no_scale; + } + else if(str == "pt" || str == "1") + { + info.type = quant_scale_enum::pertensor; + } + else if(str == "bs" || str == "2") + { + info.type = quant_scale_enum::blockscale; + } + else if(str == "kvbs" || str == "3") + { + info.type = quant_scale_enum::kv_blockscale; + } + else if(str == "mx" || str == "4") + { + info.type = quant_scale_enum::mx; + } + else + { + throw std::invalid_argument("invalid quant scale value: " + str); + } + return info; + } + + friend std::ostream& operator<<(std::ostream& os, const quant_scale_info& qsi) + { + qsi.serialize(os); + return os; + } +}; +#pragma clang diagnostic pop diff --git a/cpp/external/composable_kernel_fmha/rotary.hpp b/cpp/external/composable_kernel_fmha/rotary.hpp new file mode 100644 index 0000000000..a6458c2173 --- /dev/null +++ b/cpp/external/composable_kernel_fmha/rotary.hpp @@ -0,0 +1,89 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +#include "ck_tile/core.hpp" +#include "ck_tile/host/host_tensor.hpp" + +#include +#include + +#ifndef M_PI // Not there on windows... +#define M_PI 3.141592653589793238462643383279502884 +#endif + +#include +#include +#include +#include +#include + +// keep sync with RotaryEmbeddingEnum +enum class rope_enum +{ + none = 0, + interleaved = 1, + half_rotated = 2, +}; + +template +std::tuple, ck_tile::HostTensor> +generate_rotary_cos_sin(ck_tile::index_t seqlen, + ck_tile::index_t rotary_dim, + std::optional seed = std::nullopt) +{ + // return dummy tensors if we won't apply RoPE at all + if(rotary_dim <= 0) + { + ck_tile::HostTensor dummy({1, 1}); + return std::make_tuple(dummy, dummy); + } + + std::mt19937 random_engine(seed.has_value() ? *seed : std::random_device{}()); + std::uniform_real_distribution generator(0.0f, 1.0f); + + const ck_tile::index_t num_rows = seqlen * 2; + const ck_tile::index_t num_cols = rotary_dim / 2; + + using std::begin, std::end; + + ck_tile::HostTensor angle({num_rows, num_cols}); + std::generate(begin(angle), end(angle), [&] { return generator(random_engine) * 2 * M_PI; }); + + ck_tile::HostTensor cos({num_rows, num_cols}); + std::transform(begin(angle), end(angle), begin(cos), [](float origin_value) { + return ck_tile::type_convert(std::cos(origin_value)); + }); + + ck_tile::HostTensor sin({num_rows, num_cols}); + std::transform(begin(angle), end(angle), begin(sin), [](float origin_value) { + return ck_tile::type_convert(std::sin(origin_value)); + }); + + return std::make_tuple(cos, sin); +} + +template +std::tuple, ck_tile::HostTensor> +slice_rotary_cos_sin(const ck_tile::HostTensor& cos, + const ck_tile::HostTensor& sin, + ck_tile::index_t seqlen_offset, + ck_tile::index_t seqlen) +{ + assert(cos.get_num_of_dimension() == 2 && sin.get_num_of_dimension() == 2); + assert(cos.get_length(0) == sin.get_length(0) && cos.get_length(1) == sin.get_length(1)); + + assert(static_cast(seqlen_offset + seqlen) <= cos.get_length(0)); + + const ck_tile::index_t num_rows = seqlen; + const ck_tile::index_t num_cols = cos.get_length(1); + + ck_tile::HostTensor cos_pt({num_rows, num_cols}); + cos_pt.ForEach([&](auto& self, auto i) { self(i) = cos(i[0] + seqlen_offset, i[1]); }); + + ck_tile::HostTensor sin_pt({num_rows, num_cols}); + sin_pt.ForEach([&](auto& self, auto i) { self(i) = sin(i[0] + seqlen_offset, i[1]); }); + + return std::make_tuple(cos_pt, sin_pt); +} diff --git a/cpp/game/board.cpp b/cpp/game/board.cpp index 29b85305e7..ae27c64c2e 100644 --- a/cpp/game/board.cpp +++ b/cpp/game/board.cpp @@ -1878,6 +1878,7 @@ void Board::calculateIndependentLifeArea( int& whiteMinusBlackIndependentLifeRegionCount, bool keepTerritories, bool keepStones, + bool excludeTerritoryAdjacentToAtari, bool isMultiStoneSuicideLegal ) const { //First, just compute basic area. @@ -1902,8 +1903,24 @@ void Board::calculateIndependentLifeArea( for(int y = 0; y < y_size; y++) { for(int x = 0; x < x_size; x++) { Loc loc = Location::getLoc(x,y,x_size); - if(basicArea[loc] != C_EMPTY && basicArea[loc] != colors[loc]) - result[loc] = basicArea[loc]; + if(basicArea[loc] != C_EMPTY && basicArea[loc] != colors[loc]) { + //If excludeTerritoryAdjacentToAtari (rules version 3), empty points adjacent to a chain of + //the territory owner's own color in atari (e.g. unfilled ko mouths in seki, or the eye of + //a group whose eye is its last liberty) don't count. Otherwise, under territory scoring + //with TaxRule NONE, possession of an unfillable ko mouth in a seki would be worth a point, + //resulting in pass fights over such kos. Chains of the opposing color in atari (e.g. dead + //throw-in stones within pass-alive territory) deliberately do NOT block the territory. + bool adjChainInAtari = false; + if(excludeTerritoryAdjacentToAtari && colors[loc] == C_EMPTY) { + FOREACHADJ( + Loc adj = loc + ADJOFFSET; + if(colors[adj] == basicArea[loc] && getNumLiberties(adj) == 1) + adjChainInAtari = true; + ); + } + if(!adjChainInAtari) + result[loc] = basicArea[loc]; + } } } } diff --git a/cpp/game/board.h b/cpp/game/board.h index 8f705694cb..a9e0799960 100644 --- a/cpp/game/board.h +++ b/cpp/game/board.h @@ -294,7 +294,9 @@ struct Board //Calculates the area (including non pass alive stones, safe and unsafe big territories) //However, strips out any "seki" regions. //Seki regions are that are adjacent to any remaining empty regions. - //If keepTerritories, then keeps the surrounded territories in seki regions, only strips points for stones. + //If keepTerritories, then keeps the surrounded territories in seki regions, only strips points for stones, + //except that if excludeTerritoryAdjacentToAtari, empty points adjacent to a chain in atari + //(e.g. unfilled ko mouths in seki) are also stripped (rules version 3 scoring behavior). //If keepStones, then keeps the stones, only strips points for surrounded territories. //whiteMinusBlackIndependentLifeRegionCount - multiply this by two for a group tax. void calculateIndependentLifeArea( @@ -302,6 +304,7 @@ struct Board int& whiteMinusBlackIndependentLifeRegionCount, bool keepTerritories, bool keepStones, + bool excludeTerritoryAdjacentToAtari, bool isMultiStoneSuicideLegal ) const; diff --git a/cpp/game/boardhistory.cpp b/cpp/game/boardhistory.cpp index 44b64871c9..c3ac7908db 100644 --- a/cpp/game/boardhistory.cpp +++ b/cpp/game/boardhistory.cpp @@ -25,6 +25,24 @@ static Hash128 getKoHashAfterMoveNonEncore(const Rules& rules, Hash128 posHashAf // } +BoardHistoryModes::BoardHistoryModes() + :alwaysComputePassAliveUnderSuicideRules(false), + excludeTerritoryAdjacentToAtari(false) +{} + +BoardHistoryModes::BoardHistoryModes(bool alwaysPassAliveSuicide, bool excludeTerritoryAdjAtari) + :alwaysComputePassAliveUnderSuicideRules(alwaysPassAliveSuicide), + excludeTerritoryAdjacentToAtari(excludeTerritoryAdjAtari) +{} + +bool BoardHistoryModes::operator==(const BoardHistoryModes& other) const { + return alwaysComputePassAliveUnderSuicideRules == other.alwaysComputePassAliveUnderSuicideRules + && excludeTerritoryAdjacentToAtari == other.excludeTerritoryAdjacentToAtari; +} +bool BoardHistoryModes::operator!=(const BoardHistoryModes& other) const { + return !(*this == other); +} + BoardHistory::BoardHistory() :rules(), moveHistory(), @@ -38,7 +56,7 @@ BoardHistory::BoardHistory() assumeMultipleStartingBlackMovesAreHandicap(false), whiteHasMoved(false), overrideNumHandicapStones(-1), - alwaysComputePassAliveUnderSuicideRules(false), + modes(), recentBoards(), currentRecentBoardIdx(0), presumedNextMovePla(P_BLACK), @@ -66,7 +84,7 @@ BoardHistory::BoardHistory() BoardHistory::~BoardHistory() {} -BoardHistory::BoardHistory(const Board& board, Player pla, const Rules& r, int ePhase, bool alwaysPassAliveSuicide) +BoardHistory::BoardHistory(const Board& board, Player pla, const Rules& r, int ePhase, const BoardHistoryModes& modes_) :rules(r), moveHistory(), preventEncoreHistory(), @@ -79,7 +97,7 @@ BoardHistory::BoardHistory(const Board& board, Player pla, const Rules& r, int e assumeMultipleStartingBlackMovesAreHandicap(false), whiteHasMoved(false), overrideNumHandicapStones(-1), - alwaysComputePassAliveUnderSuicideRules(alwaysPassAliveSuicide), + modes(modes_), recentBoards(), currentRecentBoardIdx(0), presumedNextMovePla(pla), @@ -119,7 +137,7 @@ BoardHistory::BoardHistory(const BoardHistory& other) assumeMultipleStartingBlackMovesAreHandicap(other.assumeMultipleStartingBlackMovesAreHandicap), whiteHasMoved(other.whiteHasMoved), overrideNumHandicapStones(other.overrideNumHandicapStones), - alwaysComputePassAliveUnderSuicideRules(other.alwaysComputePassAliveUnderSuicideRules), + modes(other.modes), recentBoards(), currentRecentBoardIdx(other.currentRecentBoardIdx), presumedNextMovePla(other.presumedNextMovePla), @@ -162,7 +180,7 @@ BoardHistory& BoardHistory::operator=(const BoardHistory& other) assumeMultipleStartingBlackMovesAreHandicap = other.assumeMultipleStartingBlackMovesAreHandicap; whiteHasMoved = other.whiteHasMoved; overrideNumHandicapStones = other.overrideNumHandicapStones; - alwaysComputePassAliveUnderSuicideRules = other.alwaysComputePassAliveUnderSuicideRules; + modes = other.modes; std::copy(other.recentBoards, other.recentBoards+NUM_RECENT_BOARDS, recentBoards); currentRecentBoardIdx = other.currentRecentBoardIdx; presumedNextMovePla = other.presumedNextMovePla; @@ -206,7 +224,7 @@ BoardHistory::BoardHistory(BoardHistory&& other) noexcept assumeMultipleStartingBlackMovesAreHandicap(other.assumeMultipleStartingBlackMovesAreHandicap), whiteHasMoved(other.whiteHasMoved), overrideNumHandicapStones(other.overrideNumHandicapStones), - alwaysComputePassAliveUnderSuicideRules(other.alwaysComputePassAliveUnderSuicideRules), + modes(other.modes), recentBoards(), currentRecentBoardIdx(other.currentRecentBoardIdx), presumedNextMovePla(other.presumedNextMovePla), @@ -246,7 +264,7 @@ BoardHistory& BoardHistory::operator=(BoardHistory&& other) noexcept assumeMultipleStartingBlackMovesAreHandicap = other.assumeMultipleStartingBlackMovesAreHandicap; whiteHasMoved = other.whiteHasMoved; overrideNumHandicapStones = other.overrideNumHandicapStones; - alwaysComputePassAliveUnderSuicideRules = other.alwaysComputePassAliveUnderSuicideRules; + modes = other.modes; std::copy(other.recentBoards, other.recentBoards+NUM_RECENT_BOARDS, recentBoards); currentRecentBoardIdx = other.currentRecentBoardIdx; presumedNextMovePla = other.presumedNextMovePla; @@ -291,7 +309,7 @@ void BoardHistory::clear(const Board& board, Player pla, const Rules& r, int ePh assumeMultipleStartingBlackMovesAreHandicap = false; whiteHasMoved = false; overrideNumHandicapStones = -1; - //Deliberately does NOT reset alwaysComputePassAliveUnderSuicideRules - see boardhistory.h. + //Deliberately does NOT reset modes - see boardhistory.h. //This makes it so that if we ask for recent boards with a lookback beyond what we have a history for, //we simply return copies of the starting board. @@ -363,7 +381,7 @@ void BoardHistory::clear(const Board& board, Player pla, const Rules& r, int ePh } BoardHistory BoardHistory::copyToInitial() const { - BoardHistory hist(initialBoard, initialPla, rules, initialEncorePhase, alwaysComputePassAliveUnderSuicideRules); + BoardHistory hist(initialBoard, initialPla, rules, initialEncorePhase, modes); hist.setInitialTurnNumber(initialTurnNumber); hist.setAssumeMultipleStartingBlackMovesAreHandicap(assumeMultipleStartingBlackMovesAreHandicap); hist.setOverrideNumHandicapStones(overrideNumHandicapStones); @@ -384,12 +402,12 @@ void BoardHistory::setOverrideNumHandicapStones(int n) { whiteHandicapBonusScore = (float)computeWhiteHandicapBonus(); } -void BoardHistory::setAlwaysComputePassAliveUnderSuicideRules(bool b) { - alwaysComputePassAliveUnderSuicideRules = b; +void BoardHistory::setModes(const BoardHistoryModes& modes_) { + modes = modes_; } bool BoardHistory::suicideLegalForPassAlive() const { - return rules.multiStoneSuicideLegal || alwaysComputePassAliveUnderSuicideRules; + return rules.multiStoneSuicideLegal || modes.alwaysComputePassAliveUnderSuicideRules; } static int numHandicapStonesOnBoardHelper(const Board& board, int blackNonPassTurnsToStart) { @@ -607,6 +625,7 @@ int BoardHistory::countAreaScoreWhiteMinusBlack(const Board& board, Color area[B area,whiteMinusBlackIndependentLifeRegionCount, keepTerritories, keepStones, + modes.excludeTerritoryAdjacentToAtari, suicideLegalForPassAlive() ); if(rules.taxRule == Rules::TAX_ALL) @@ -649,6 +668,7 @@ int BoardHistory::countTerritoryAreaScoreWhiteMinusBlack(const Board& board, Col area,whiteMinusBlackIndependentLifeRegionCount, keepTerritories, keepStones, + modes.excludeTerritoryAdjacentToAtari, suicideLegalForPassAlive() ); @@ -1215,12 +1235,12 @@ Hash128 BoardHistory::getSituationAndSimpleKoAndPrevPosHash(const Board& board, } Hash128 BoardHistory::getSituationRulesAndKoHash(const Board& board, const BoardHistory& hist, Player nextPlayer, double drawEquivalentWinsForWhite) { - return getSituationRulesAndKoHash(board, hist, nextPlayer, drawEquivalentWinsForWhite, hist.alwaysComputePassAliveUnderSuicideRules); + return getSituationRulesAndKoHash(board, hist, nextPlayer, drawEquivalentWinsForWhite, hist.modes); } Hash128 BoardHistory::getSituationRulesAndKoHash( const Board& board, const BoardHistory& hist, Player nextPlayer, double drawEquivalentWinsForWhite, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& modes ) { int xSize = board.x_size; int ySize = board.y_size; @@ -1287,9 +1307,15 @@ Hash128 BoardHistory::getSituationRulesAndKoHash( //Fold in whether pass-alive computations are being performed as if suicide were legal, when that //differs from what the suicide rule alone would give. When the rules already have suicide legal //the flag is a no-op, and we deliberately don't fold it then, so that caches can be shared. - if(alwaysComputePassAliveUnderSuicideRules && !hist.rules.multiStoneSuicideLegal) + if(modes.alwaysComputePassAliveUnderSuicideRules && !hist.rules.multiStoneSuicideLegal) hash ^= Rules::ZOBRIST_PASS_ALIVE_UNDER_SUICIDE_HASH; + //Fold in whether territory scoring excludes points adjacent to atari, but only under the rules + //where the flag has any effect (territory scoring with no seki tax), so that caches can be shared + //between the modes under all other rules. + if(modes.excludeTerritoryAdjacentToAtari && hist.rules.scoringRule == Rules::SCORING_TERRITORY && hist.rules.taxRule == Rules::TAX_NONE) + hash ^= Rules::ZOBRIST_EXCLUDE_TERRITORY_ADJ_ATARI_HASH; + return hash; } diff --git a/cpp/game/boardhistory.h b/cpp/game/boardhistory.h index f8403b93d9..fdf7edf333 100644 --- a/cpp/game/boardhistory.h +++ b/cpp/game/boardhistory.h @@ -8,6 +8,33 @@ struct KoHashTable; +//Bundles the flags that control how certain computations are performed. +//These exist to support migrations of KataGo's rules implementation - each mode selects between a +//legacy behavior (false) and a new behavior (true), with neural nets declaring which behavior they +//were trained with. +//They are PRESERVED by BoardHistory::clear() - they apply to the whole session of usage of a history +//object rather than being per-game state. +//Use BoardHistoryModes() for plain all-legacy behavior, or an appropriately resolved value +//(e.g. from Search::resolveHistoryModes or a governing history/book/game). +struct BoardHistoryModes { + //If true, all computations of pass-alive area (for game-ending, final scoring, and nn features) + //are performed as if multi-stone suicide were legal, regardless of rules.multiStoneSuicideLegal. + //Actual move legality is NOT affected. + bool alwaysComputePassAliveUnderSuicideRules; + + //If true, under territory scoring with TaxRule NONE, empty points adjacent to any chain in atari + //(e.g. unfilled ko mouths in seki) do not count as territory, per rules version 3, avoiding pass + //fights over kos in seki. If false, such points count as under rules version 2. Also applies to + //nn featurization of the territory. No effect under any other scoring/tax rules combination. + bool excludeTerritoryAdjacentToAtari; + + BoardHistoryModes(); + BoardHistoryModes(bool alwaysComputePassAliveUnderSuicideRules, bool excludeTerritoryAdjacentToAtari); + + bool operator==(const BoardHistoryModes& other) const; + bool operator!=(const BoardHistoryModes& other) const; +}; + //A data structure enabling checking of move legality, including optionally superko, //and implements scoring and support for various rulesets (see rules.h) struct BoardHistory { @@ -38,12 +65,10 @@ struct BoardHistory { bool whiteHasMoved; int overrideNumHandicapStones; - //If true, all computations of pass-alive area (for game-ending, final scoring, and nn featurization) - //are performed as if multi-stone suicide were legal, regardless of rules.multiStoneSuicideLegal. - //Actual move legality is NOT affected. Deliberately preserved by clear() - this is a mode applying to - //the whole session of usage of this history object rather than per-game state, set only via - //setAlwaysComputePassAliveUnderSuicideRules. Default false. - bool alwaysComputePassAliveUnderSuicideRules; + //Modes controlling how derived computations are performed (see BoardHistoryModes). + //Deliberately preserved by clear() - these are modes applying to the whole session of usage of + //this history object rather than per-game state, set only via setModes. + BoardHistoryModes modes; static const int NUM_RECENT_BOARDS = 6; Board recentBoards[NUM_RECENT_BOARDS]; @@ -111,11 +136,10 @@ struct BoardHistory { BoardHistory(); ~BoardHistory(); - //The alwaysComputePassAliveUnderSuicideRules argument is deliberately required, so that every - //construction site makes an explicit choice of the pass-alive computation mode (see field comment). - //Pass false for plain legacy behavior, or an appropriately resolved value (e.g. from - //Search::resolveAlwaysComputePassAliveUnderSuicideRules or a governing history/book/game). - BoardHistory(const Board& board, Player pla, const Rules& rules, int encorePhase, bool alwaysComputePassAliveUnderSuicideRules); + //The modes argument is deliberately required, so that every construction site makes an explicit + //choice of the BoardHistoryModes. Pass BoardHistoryModes() for plain all-legacy behavior, + //or an appropriately resolved value (e.g. from Search::resolveHistoryModes or a governing history/book/game). + BoardHistory(const Board& board, Player pla, const Rules& rules, int encorePhase, const BoardHistoryModes& modes); BoardHistory(const BoardHistory& other); BoardHistory& operator=(const BoardHistory& other); @@ -133,12 +157,12 @@ struct BoardHistory { void setAssumeMultipleStartingBlackMovesAreHandicap(bool b); //Set overrideNumHandicapStones and update bonus points accordingly void setOverrideNumHandicapStones(int n); - //Set alwaysComputePassAliveUnderSuicideRules. Does not re-adjudicate a game that is already ended - //and scored. Changes the result of getSituationRulesAndKoHash - callers responsible for invalidating + //Set the BoardHistoryModes. Does not re-adjudicate a game that is already ended and scored. + //Changes the result of getSituationRulesAndKoHash - callers responsible for invalidating //anything cached based on that hash (e.g. clearing search). - void setAlwaysComputePassAliveUnderSuicideRules(bool b); + void setModes(const BoardHistoryModes& modes); //The suicide legality that should be passed to Board::calculateArea and calculateIndependentLifeArea - //for all pass-alive area computations, taking alwaysComputePassAliveUnderSuicideRules into account. + //for all pass-alive area computations, taking modes.alwaysComputePassAliveUnderSuicideRules into account. bool suicideLegalForPassAlive() const; //Returns a copy of this board history rewound to the initial board, pla, etc, with other fields @@ -213,9 +237,9 @@ struct BoardHistory { static Hash128 getSituationAndSimpleKoAndPrevPosHash(const Board& board, const BoardHistory& hist, Player nextPlayer); //Compute a hash that takes into account the full situation, the rules, discretized komi, and any immediate ko prohibitions. static Hash128 getSituationRulesAndKoHash(const Board& board, const BoardHistory& hist, Player nextPlayer, double drawEquivalentWinsForWhite); - //Same, but hashing as if hist.alwaysComputePassAliveUnderSuicideRules had the given value, for callers + //Same, but hashing as if hist.modes had the given value, for callers //(e.g. nn featurization with a per-query override) that use a different value than the history's own. - static Hash128 getSituationRulesAndKoHash(const Board& board, const BoardHistory& hist, Player nextPlayer, double drawEquivalentWinsForWhite, bool alwaysComputePassAliveUnderSuicideRules); + static Hash128 getSituationRulesAndKoHash(const Board& board, const BoardHistory& hist, Player nextPlayer, double drawEquivalentWinsForWhite, const BoardHistoryModes& modes); private: bool koHashOccursInHistory(Hash128 koHash, const KoHashTable* rootKoHashTable) const; diff --git a/cpp/game/rules.cpp b/cpp/game/rules.cpp index 5c3ae03d9e..a1d38622d6 100644 --- a/cpp/game/rules.cpp +++ b/cpp/game/rules.cpp @@ -620,3 +620,6 @@ const Hash128 Rules::ZOBRIST_FRIENDLY_PASS_OK_HASH = //Based on sha256 hash of const Hash128 Rules::ZOBRIST_PASS_ALIVE_UNDER_SUICIDE_HASH = //Based on sha256 hash of Rules::ZOBRIST_PASS_ALIVE_UNDER_SUICIDE_HASH Hash128(0x3094018861134017ULL, 0x706330a293e266aaULL); + +const Hash128 Rules::ZOBRIST_EXCLUDE_TERRITORY_ADJ_ATARI_HASH = //Based on sha256 hash of Rules::ZOBRIST_EXCLUDE_TERRITORY_ADJ_ATARI_HASH + Hash128(0x02755c10129903ceULL, 0x786bb096ee2f483dULL); diff --git a/cpp/game/rules.h b/cpp/game/rules.h index bfb6da52cc..59e75427e5 100644 --- a/cpp/game/rules.h +++ b/cpp/game/rules.h @@ -103,6 +103,7 @@ struct Rules { static const Hash128 ZOBRIST_BUTTON_HASH; static const Hash128 ZOBRIST_FRIENDLY_PASS_OK_HASH; static const Hash128 ZOBRIST_PASS_ALIVE_UNDER_SUICIDE_HASH; + static const Hash128 ZOBRIST_EXCLUDE_TERRITORY_ADJ_ATARI_HASH; private: nlohmann::json toJsonHelper(bool omitKomi, bool omitDefaults) const; diff --git a/cpp/main.cpp b/cpp/main.cpp index f9c95e09a6..a843f991db 100644 --- a/cpp/main.cpp +++ b/cpp/main.cpp @@ -13,6 +13,10 @@ #include #endif +#ifdef USE_ROCM_BACKEND +#include +#endif + #include //------------------------ @@ -53,9 +57,12 @@ searchentropyanalysis : Analyze search entropy across test datasets. selfplaysurprisedump : Run selfplay games with a fixed model and dump per-position policy/value surprise stats to csv. testgpuerror : Print the average error of the neural net between current config and fp32 config. +testbackendreference : Test backend absolute outputs against compiled-in blended reference data. +dumponnx : (TensorRT/ONNX only) Write out the ONNX graph KataGo builds for a model. runtests : Test important board algorithms and datastructures runnnlayertests : Test a few subcomponents of the current neural net backend +runonnxmodelfiletests : (TensorRT/ONNX only) Test the .onnx model file reader runnnontinyboardtest : Run neural net on a tiny board and dump result to stdout runnnsymmetriestest : Run neural net on a hardcoded rectangle board and dump symmetries result @@ -96,6 +103,10 @@ static int handleSubcommand(const string& subcommand, const vector& args return MainCmds::selfplay(subArgs); else if(subcommand == "testgpuerror") return MainCmds::testgpuerror(subArgs); + else if(subcommand == "testbackendreference") + return MainCmds::testbackendreference(subArgs); + else if(subcommand == "dumponnx") + return MainCmds::dumponnx(subArgs); else if(subcommand == "runtests") return MainCmds::runtests(subArgs); else if(subcommand == "runnnlayertests") @@ -130,6 +141,8 @@ static int handleSubcommand(const string& subcommand, const vector& args return MainCmds::runtinynntests(subArgs); else if(subcommand == "runnnevalcanarytests") return MainCmds::runnnevalcanarytests(subArgs); + else if(subcommand == "runonnxmodelfiletests") + return MainCmds::runonnxmodelfiletests(subArgs); else if(subcommand == "runconfigtests") return MainCmds::runconfigtests(subArgs); else if(subcommand == "samplesgfs") @@ -251,8 +264,15 @@ string Version::getKataGoVersionFullInfo() { out << "Using Metal backend" << endl; #elif defined(USE_OPENCL_BACKEND) out << "Using OpenCL backend" << endl; +#elif defined(USE_ROCM_BACKEND) + out << "Using ROCm backend" << endl; +#if defined(HIP_VERSION_MAJOR) && defined(HIP_VERSION_MINOR) && defined(HIP_VERSION_PATCH) + out << "Compiled with HIP version " << HIP_VERSION_MAJOR << "." << HIP_VERSION_MINOR << "." << HIP_VERSION_PATCH << endl; +#endif #elif defined(USE_EIGEN_BACKEND) out << "Using Eigen(CPU) backend" << endl; +#elif defined(USE_ONNX_BACKEND) + out << "Using ONNX Runtime backend" << endl; #else out << "Using dummy backend" << endl; #endif @@ -283,12 +303,16 @@ string Version::getGitRevisionWithBackend() { s += "-cuda"; #elif defined(USE_TENSORRT_BACKEND) s += "-trt"; +#elif defined(USE_ROCM_BACKEND) + s += "-rocm"; #elif defined(USE_METAL_BACKEND) s += "-metal"; #elif defined(USE_OPENCL_BACKEND) s += "-opencl"; #elif defined(USE_EIGEN_BACKEND) s += "-eigen"; +#elif defined(USE_ONNX_BACKEND) + s += "-onnx"; #else s += "-dummy"; #endif diff --git a/cpp/main.h b/cpp/main.h index f7e3f86249..d94a1a211c 100644 --- a/cpp/main.h +++ b/cpp/main.h @@ -13,6 +13,8 @@ namespace MainCmds { int selfplay(const std::vector& args); int testgpuerror(const std::vector& args); + int testbackendreference(const std::vector& args); + int dumponnx(const std::vector& args); int runtests(const std::vector& args); int runnnlayertests(const std::vector& args); @@ -31,6 +33,7 @@ namespace MainCmds { int runownershiptests(const std::vector& args); int runtinynntests(const std::vector& args); int runnnevalcanarytests(const std::vector& args); + int runonnxmodelfiletests(const std::vector& args); int runbeginsearchspeedtest(const std::vector& args); int runownershipspeedtest(const std::vector& args); int runsleeptest(const std::vector& args); diff --git a/cpp/neuralnet/cudaandrocmbackend.inc b/cpp/neuralnet/cudaandrocmbackend.inc new file mode 100644 index 0000000000..dd56dbc65b --- /dev/null +++ b/cpp/neuralnet/cudaandrocmbackend.inc @@ -0,0 +1,4910 @@ +// KataGo GPU neural net backend implementation shared between the CUDA backend +// (cudabackend.cpp, compiled as host C++ against cuDNN/cuBLAS) and the ROCm backend +// (rocmbackend.cpp, compiled by hip clang against MIOpen/hipBLAS). This file is never compiled +// directly. It is #included by exactly one of those two wrapper files per build. The GPU kernels +// the code below launches and the CudaUtils helper functions are shared the same way, in +// cudaandrocmhelpers.inc and cudaandrocmutils.inc. +// +// The wrapper must, before including this file: +// - Include the backend's vendor headers and error-check header (cudaerrorcheck.h or +// rocmerrorcheck.h, which define the same macro names CUDA_ERR, CUBLAS_ERR and CUDNN_ERR), +// plus the backend's kernel-launcher header (cudahelpers.h / rocmhelpers.h) and utils header +// (cudautils.h / rocmutils.h). +// - Define exactly one of KATAGO_GPU_CUDA or KATAGO_GPU_HIP (to 1). These gate the regions +// where the two backends genuinely differ. +// - Define KATAGO_GPU_BACKEND_NAME to a short string literal ("CUDA" / "ROCm") used in error +// messages and debug labels that are otherwise identical across the backends. +// - Provide `using cublas_half_t = ...;`, the element type cublasHgemm/hipblasHgemm expects +// buffers to be cast to (half / hipblasHalf). +// - (ROCm only) Include rocmcudanames.h, which maps the CUDA spellings used in shared code +// (cudaMalloc, cublasSgemm, cudnnTensorDescriptor_t, ...) to their HIP/hipBLAS/MIOpen +// equivalents. Shared code is written with CUDA spellings, while code inside KATAGO_GPU_HIP +// regions uses native HIP/MIOpen spellings. +// - Optionally define KATAGO_CUDA_HAS_SDPA (CUDA) or KATAGO_ROCM_HAS_CK_FMHA / +// KATAGO_ROCM_CK_FMHA_ARCH_OK (ROCm) to 1 to enable that backend's fused attention path. +// All safely evaluate as 0 where left undefined. +// +// Editing rules: code outside the KATAGO_GPU_* gates must be valid for both backends. In +// particular it may only use CUDA API spellings that rocmcudanames.h maps (extend that shim +// when adding a new API use - a HIP build error is the reminder), and may only touch fields of +// cudaDeviceProp/hipDeviceProp_t that exist in both (major, minor, name, totalGlobalMem). +// Struct names (CudaHandles, CudnnManager, ...) and the customCuda* kernel names keep their +// historical CUDA-flavored spellings on both platforms, which is unambiguous because only one +// backend is ever compiled into a build. +// +// A call whose error return is deliberately ignored, such as a cleanup-path free, must be written +// as (void)cudaFoo(...). The HIP entry points these map to are declared [[nodiscard]] while their +// CUDA counterparts are not, so a bare call warns on the ROCm build only. Use the cast only where +// ignoring the error is genuinely intended, and CUDA_ERR everywhere else. + +#ifdef KATAGO_BACKEND_INC_INCLUDED +#error "cudaandrocmbackend.inc may only be included once" +#endif +#define KATAGO_BACKEND_INC_INCLUDED 1 +#if !defined(KATAGO_GPU_CUDA) && !defined(KATAGO_GPU_HIP) +#error "Define KATAGO_GPU_CUDA or KATAGO_GPU_HIP before including cudaandrocmbackend.inc" +#endif +#if defined(KATAGO_GPU_CUDA) && defined(KATAGO_GPU_HIP) +#error "Define only one of KATAGO_GPU_CUDA and KATAGO_GPU_HIP (the gates below are if/else)" +#endif + +#include "../neuralnet/modelversion.h" +#include "../neuralnet/nninterface.h" +#include "../neuralnet/nninputs.h" +#include "../neuralnet/sgfmetadata.h" +#include "../neuralnet/nneval.h" +#include "../neuralnet/desc.h" + +#include "../core/simpleallocator.h" +#include "../core/test.h" +#ifdef KATAGO_GPU_CUDA +#include "../core/hash.h" +#endif + +#include "../external/half-2.2.0/include/half.hpp" + +//------------------------ +#include "../core/using.h" +//------------------------ + +using half_t = half_float::half; + +//Define this to print out some of the intermediate values of the neural net +//#define DEBUG_INTERMEDIATE_VALUES + +void NeuralNet::globalInitialize() { + //Empty in this backend +} + +void NeuralNet::globalCleanup() { + (void)cudaDeviceReset(); +} + +#ifdef KATAGO_GPU_CUDA +//--------------------------------------------------------------------------------- +// cudnn SDPA support. Graphs + execution plans cached lazily per SDPAGraphKey (batch size, head +// geometry, seqLen, hasMask, dtype - see SDPAGraphKey below). +// Used only when useFP16=true and cudnn supports SDPA at runtime. Otherwise falls back to +// customCudaFlashAttention (see cudaandrocmhelpers.inc). +// +// Tensor layout: BSHD physical, with strides chosen so that the (B,H,S,D)-dim graph view matches +// the existing CUDA backend's Q/K/V/output buffers from MatMulLayer: +// element at (n, xy, h, d) lives at offset (h*headDim + d) + (n*seqLen + xy) * (numHeads*headDim). +// +// Masking: when a mask is present, we build a fully-materialized additive attention bias of shape +// [B, 1, S, S] from the [B, S] mask: bias[b,q,k] = (mask[b,k] != 0 ? 0 : -3e4). cudnn does not have +// plans for the [B,1,1,S] broadcast pattern that would let us avoid this materialization, but the +// full bias is correct for arbitrary (non-prefix) masks, which we need to support sub-board games. +// The mask is the same across all attention blocks, but the bias is rebuilt per block for +// simplicity (the mask kernel itself is cheap). +// +// The bias tensor dtype MUST match the io dtype (fp16). An fp32 bias with fp16 Q/K/V passes +// validate/check_support/build_plans on cudnn 9.x but silently misexecutes (nonfinite outputs - +// the fused kernel evidently reinterprets the buffer). Since cudnn adds the (converted) bias to the +// fp32 scores and computes the softmax in fp32, the fp16-range-limited -3e4 constant still masks +// exactly (exp underflow) for any model whose genuine logit spread is below ~3e4. +// See the customCudaMaskToAttnBiasFull kernel comment in cudaandrocmhelpers.inc for details. +// +// When mask is NULL (full-board, requireExactNNLen case), we build a no-bias graph instead, which +// avoids both the extra memory and the bias build kernel. + +#if KATAGO_CUDA_HAS_SDPA +struct SDPAPlanForBatchSize { + std::shared_ptr graph; + int64_t workspaceBytes; + bool hasMask; // true if the graph expects a bias variant-pack entry + + // UIDs for the variant pack, fixed at graph build time. + static constexpr int64_t Q_UID = 1; + static constexpr int64_t K_UID = 2; + static constexpr int64_t V_UID = 3; + static constexpr int64_t O_UID = 4; + static constexpr int64_t BIAS_UID = 5; +}; + +// Full discriminating key for an SDPA execution plan. Every field that changes the cudnn graph shape +// must be here: if any attention layer in a future model differs in head count/dim/seqLen, it gets its +// own plan rather than incorrectly reusing another layer's. (batchSize and hasMask vary at runtime.) +struct SDPAGraphKey { + int numHeads; + int numKVHeads; + int qHeadDim; + int vHeadDim; + int seqLen; + int batchSize; + bool hasMask; + bool usingFP16; + + bool operator==(const SDPAGraphKey& o) const { + return + numHeads == o.numHeads && + numKVHeads == o.numKVHeads && + qHeadDim == o.qHeadDim && + vHeadDim == o.vHeadDim && + seqLen == o.seqLen && + batchSize == o.batchSize && + hasMask == o.hasMask && + usingFP16 == o.usingFP16; + } +}; +struct SDPAGraphKeyHash { + uint64_t operator()(const SDPAGraphKey& k) const noexcept { + uint64_t acc = (uint64_t)123456789; + auto mix = [&acc](uint64_t x) { + acc += x; + acc += acc << 13; + acc ^= acc >> 6; + }; + mix((uint64_t)k.numHeads); + mix((uint64_t)k.numKVHeads); + mix((uint64_t)k.qHeadDim); + mix((uint64_t)k.vHeadDim); + mix((uint64_t)k.seqLen); + mix((uint64_t)k.batchSize); + mix(k.hasMask ? 1 : 0); + mix(k.usingFP16 ? 1 : 0); + acc = Hash::basicLCong(acc); + return (size_t)(acc ^ (acc >> 32)); + } +}; + +struct SDPAGraphCache { + std::unordered_map, SDPAGraphKeyHash> plansByKey; + bool sdpaSupported; + string disableReason; + + SDPAGraphCache() : + plansByKey(), + sdpaSupported(true), + disableReason() + {} + + // Build (or fetch from cache) an execution plan for the given attention shape + batchSize + hasMask. + // Returns nullptr if SDPA is not supported for this configuration; caller should use fallback. + // On a build failure during warmup, SDPA is disabled going forward and nullptr is returned (the + // caller falls back to the custom kernel); outside of warmup such a failure is fatal. logger (if + // non-NULL) is used to report a disable. + std::shared_ptr getOrBuildPlan(cudnnHandle_t cudnn, const SDPAGraphKey& key, Logger* logger, bool isWarmup) { + if(!sdpaSupported) + return nullptr; + + // Cuda graphs for SDPA path only well-tested for FP16/BF16; FP32 uses fallback + if(!key.usingFP16) + return nullptr; + + auto it = plansByKey.find(key); + if(it != plansByKey.end()) + return it->second; + + namespace fe = cudnn_frontend; + + // Disable SDPA and report the reason. Outside of warmup a build failure is fatal; during warmup + // we tolerate it and fall back to the custom kernel (returning nullptr to the caller). + auto disable = [&](const string& reason) -> std::shared_ptr { + if(!isWarmup) + throw StringError(reason); + sdpaSupported = false; + disableReason = reason; + if(logger != NULL) + logger->write("Cuda backend: disabling cudnn SDPA and falling back to custom attention kernel: " + reason); + return nullptr; + }; + auto plan = std::make_shared(); + plan->hasMask = key.hasMask; + auto graph = std::make_shared(); + + bool useFP16 = key.usingFP16; + + fe::DataType_t ioType = useFP16 ? fe::DataType_t::HALF : fe::DataType_t::FLOAT; + graph->set_io_data_type(ioType) + .set_intermediate_data_type(fe::DataType_t::FLOAT) + .set_compute_data_type(fe::DataType_t::FLOAT); + + int64_t B = key.batchSize; + int64_t Hq = key.numHeads; + int64_t Hkv = key.numKVHeads; + int64_t S = key.seqLen; + int64_t Dq = key.qHeadDim; + int64_t Dv = key.vHeadDim; + + // BSHD physical layout, with logical dim ordering (B, H, S, D): + // stride for B = S * H_inner * D + // stride for H = D + // stride for S = H_inner * D + // stride for D = 1 + // where H_inner is the number of heads packed for this tensor (numHeads or numKVHeads). + int64_t qHinner = key.numHeads; + int64_t kHinner = key.numKVHeads; + int64_t vHinner = key.numKVHeads; + + auto Q = graph->tensor( + fe::graph::Tensor_attributes() + .set_name("Q") + .set_uid(SDPAPlanForBatchSize::Q_UID) + .set_dim({B, Hq, S, Dq}) + .set_stride({S * qHinner * Dq, Dq, qHinner * Dq, 1}) + ); + auto K = graph->tensor( + fe::graph::Tensor_attributes() + .set_name("K") + .set_uid(SDPAPlanForBatchSize::K_UID) + .set_dim({B, Hkv, S, Dq}) + .set_stride({S * kHinner * Dq, Dq, kHinner * Dq, 1}) + ); + auto V = graph->tensor( + fe::graph::Tensor_attributes() + .set_name("V") + .set_uid(SDPAPlanForBatchSize::V_UID) + .set_dim({B, Hkv, S, Dv}) + .set_stride({S * vHinner * Dv, Dv, vHinner * Dv, 1}) + ); + + float scale = 1.0f / std::sqrt((float)key.qHeadDim); + auto sdpa_options = ( + fe::graph::SDPA_attributes() + .set_name("sdpa_fwd") + .set_generate_stats(false) + .set_attn_scale(scale) + ); + + if(key.hasMask) { + // Full [B, 1, S, S] additive bias, broadcast over heads only. Per cudnn 9.8 empirical + // testing the broadcast-over-q variant ([B,1,1,S]) has no supported plans for our shape. + auto bias = graph->tensor( + fe::graph::Tensor_attributes() + .set_name("bias") + .set_uid(SDPAPlanForBatchSize::BIAS_UID) + .set_dim({B, 1, S, S}) + .set_stride({S * S, S * S, S, 1}) + ); + sdpa_options.set_bias(bias); + } + + auto [O, Stats] = graph->sdpa(Q, K, V, sdpa_options); + (void)Stats; + + // Output O also uses BSHD physical layout (matches what outProj expects). + int64_t oHinner = key.numHeads; + O->set_output(true) + .set_dim({B, Hq, S, Dv}) + .set_stride({S * oHinner * Dv, Dv, oHinner * Dv, 1}) + .set_uid(SDPAPlanForBatchSize::O_UID); + + auto status = graph->validate(); + if(status.is_bad()) + return disable(string("cudnn SDPA graph validate failed: ") + status.get_message()); + status = graph->build_operation_graph(cudnn); + if(status.is_bad()) + return disable(string("cudnn SDPA build_operation_graph failed: ") + status.get_message()); + status = graph->create_execution_plans({fe::HeurMode_t::A}); + if(status.is_bad()) + return disable(string("cudnn SDPA create_execution_plans failed: ") + status.get_message()); + status = graph->check_support(cudnn); + if(status.is_bad()) + return disable(string("cudnn SDPA check_support failed: ") + status.get_message()); + status = graph->build_plans(cudnn); + if(status.is_bad()) + return disable(string("cudnn SDPA build_plans failed: ") + status.get_message()); + + int64_t ws = 0; + status = graph->get_workspace_size(ws); + if(status.is_bad()) + return disable(string("cudnn SDPA get_workspace_size failed: ") + status.get_message()); + + plan->graph = graph; + plan->workspaceBytes = ws; + plansByKey[key] = plan; + return plan; + } +}; +#else +struct SDPAGraphCache { + SDPAGraphCache() {} +}; +#endif +#else // KATAGO_GPU_HIP +// Whether the CK (Composable Kernel) FMHA fused attention kernels can run on this device at all. +// This must stay in sync with two things: the arch families CK's generated dispatcher +// (fmha_fwd_api.cpp) matches by device-name prefix, and the archs CMakeLists.txt actually +// compiles the CK kernels for (CMAKE_HIP_ARCHITECTURES minus the pre-MFMA gfx9 and RDNA1 archs +// its CK section excludes). The dispatcher matches "gfx9" +// as a bare prefix, so without this check a gfx906 or gfx900 device would dispatch to kernels +// whose code objects were never compiled for it and fail (throw) at launch instead of falling +// back to the plain attention kernel. Archs the dispatcher has no branch for at all (e.g. RDNA2 +// gfx103x) safely return -1 from fmha_fwd, but we exclude them here too so we don't pay for a +// doomed attempt (and its attention-bias materialization) before the runtime-disable kicks in. +static bool isCkFmhaSupportedArch(const hipDeviceProp_t& prop) { + std::string arch(prop.gcnArchName); + size_t colonPos = arch.find(':'); // e.g. "gfx942:sramecc+:xnack-" + if(colonPos != std::string::npos) + arch = arch.substr(0, colonPos); + return + arch == "gfx908" || arch == "gfx90a" || + arch.compare(0, 5, "gfx94") == 0 || arch.compare(0, 5, "gfx95") == 0 || + arch.compare(0, 5, "gfx11") == 0 || arch.compare(0, 5, "gfx12") == 0; +} + +// Archs where MIOpen's NHWC FP16 convolutions (MFMA implicit GEMM) are known faster than NCHW, +// so NHWC mode "Auto" should enable NHWC when using FP16 - the analog of the CUDA backend +// enabling NHWC on tensor-core (Volta+) GPUs. Currently the CDNA/MFMA family only, where NHWC +// measured substantially faster on convnets. RDNA (WMMA) is unmeasured rather than known +// slower. Extend this list if NHWC measures faster there too, testable via rocmUseNHWC=true. +static bool isNhwcFp16PreferredArch(const hipDeviceProp_t& prop) { + std::string arch(prop.gcnArchName); + size_t colonPos = arch.find(':'); + if(colonPos != std::string::npos) + arch = arch.substr(0, colonPos); + return + arch == "gfx908" || arch == "gfx90a" || + arch.compare(0, 5, "gfx94") == 0 || arch.compare(0, 5, "gfx95") == 0; +} +#endif + + +//--------------------------------------------------------------------------------- +//RAII owners so that when a constructor throws partway through (model load can fail at many +//points - bad weights, failed algo queries, out of memory), whatever was already created is +//destroyed instead of leaked. + +//Owners for the cublas/hipblas and cudnn/miopen library handles held by CudaHandles. +struct OwnedCublasHandle { + cublasHandle_t handle; + OwnedCublasHandle() { CUBLAS_ERR("CudaHandles",cublasCreate(&handle)); } + ~OwnedCublasHandle() { (void)cublasDestroy(handle); } + operator cublasHandle_t() const { return handle; } + OwnedCublasHandle(const OwnedCublasHandle&) = delete; + OwnedCublasHandle& operator=(const OwnedCublasHandle&) = delete; +}; +struct OwnedCudnnHandle { + cudnnHandle_t handle; + OwnedCudnnHandle() { CUDNN_ERR("CudaHandles",cudnnCreate(&handle)); } + ~OwnedCudnnHandle() { (void)cudnnDestroy(handle); } + operator cudnnHandle_t() const { return handle; } + OwnedCudnnHandle(const OwnedCudnnHandle&) = delete; + OwnedCudnnHandle& operator=(const OwnedCudnnHandle&) = delete; +}; + +//Owner for a vendor descriptor object (ConvLayer's filter/convolution descriptors). Starts +//null, and the owning code creates it by passing &desc to the vendor create call. +template +struct OwnedDesc { + T desc = nullptr; + OwnedDesc() {} + ~OwnedDesc() { if(desc != nullptr) (void)DestroyFn(desc); } + operator T() const { return desc; } + OwnedDesc(const OwnedDesc&) = delete; + OwnedDesc& operator=(const OwnedDesc&) = delete; +}; + +//Owner for a raw device buffer (filled via CudaUtils::mallocAndCopyToDevice and the like). +struct OwnedDeviceBuf { + void* buf = nullptr; + OwnedDeviceBuf() {} + ~OwnedDeviceBuf() { if(buf != nullptr) (void)cudaFree(buf); } + OwnedDeviceBuf(const OwnedDeviceBuf&) = delete; + OwnedDeviceBuf& operator=(const OwnedDeviceBuf&) = delete; +}; + +#ifdef KATAGO_GPU_CUDA +struct CudaHandles { + OwnedCublasHandle cublas; + OwnedCudnnHandle cudnn; + const int majorComputeCapability; + const int minorComputeCapability; + std::unique_ptr sdpaCache; + // Logger for this handle's server thread; may be NULL. Used to report cudnn SDPA falling back. + Logger* logger; + // Set while warming up (see NNEvaluator::maybeWarmupComputeHandle). When true, a failed cudnn SDPA + // execution is tolerated (fall back to the custom kernel); when false such a failure is fatal. + bool isWarmup; + // If true, the cudnn graph SDPA path is skipped entirely and the custom attention kernel is always used. + bool cudaDisableGraphSDPA; + // Set once we have logged that cudaDisableGraphSDPA actually suppressed an otherwise-usable SDPA path, + // so the message is emitted only a single time per handle rather than on every attention block. + bool loggedGraphSDPADisabled; + // Controls whether 1x1 NHWC convs run as a cuBLAS GEMM (vs cuDNN). Auto = matmul iff FP16. + // True/False force the choice regardless of precision. + enabled_t use1x1MatmulMode; + + CudaHandles(int major, int minor) + : majorComputeCapability(major), + minorComputeCapability(minor), + sdpaCache(std::make_unique()), + logger(NULL), + isWarmup(false), + cudaDisableGraphSDPA(false), + loggedGraphSDPADisabled(false), + use1x1MatmulMode(enabled_t::Auto) + { + } + + static CudaHandles* cudaHandlesTesting() { + const int gpuIdxForThisThread = 0; + cudaDeviceProp prop; + CUDA_ERR("cudaHandlesTesting",cudaGetDeviceProperties(&prop,gpuIdxForThisThread)); + return new CudaHandles(prop.major, prop.minor); + } + + CudaHandles(const CudaHandles&) = delete; + CudaHandles& operator=(const CudaHandles&) = delete; +}; +#else // KATAGO_GPU_HIP +struct CudaHandles { + OwnedCublasHandle cublas; + OwnedCudnnHandle cudnn; + const int majorComputeCapability; + const int minorComputeCapability; + // May be NULL. Not owned. Used for one-time notices (e.g. disabling the fused attention path). + Logger* logger; + // Whether this device's architecture can run the CK FMHA fused attention kernels. See + // isCkFmhaSupportedArch above. + const bool ckFmhaArchSupported; + // Disables the optional CK FMHA fused attention path (see KATAGO_ROCM_HAS_CK_FMHA), falling back + // to the plain attention kernel unconditionally. Off by default. + const bool disableFusedAttention; + // Set once if a CK FMHA call fails or reports unsupported at runtime, so subsequent calls skip + // the attempt (and its attention-bias materialization) entirely. Only touched by the single + // server thread that owns this handle, hence no synchronization. + bool fusedAttentionRuntimeDisabled; + + CudaHandles(int major, int minor, Logger* logger_, bool ckFmhaArchSupported_, bool disableFusedAttention_) + : majorComputeCapability(major), + minorComputeCapability(minor), + logger(logger_), + ckFmhaArchSupported(ckFmhaArchSupported_), + disableFusedAttention(disableFusedAttention_), + fusedAttentionRuntimeDisabled(false) + { + } + + static CudaHandles* cudaHandlesTesting() { + const int gpuIdxForThisThread = 0; + hipDeviceProp_t prop; + CUDA_ERR("cudaHandlesTesting",hipGetDeviceProperties(&prop,gpuIdxForThisThread)); + return new CudaHandles(prop.major, prop.minor, NULL, isCkFmhaSupportedArch(prop), false); + } + + CudaHandles(const CudaHandles&) = delete; + CudaHandles& operator=(const CudaHandles&) = delete; +}; +#endif + +//--------------------------------------------------------------------------------- + +//Destructor helpers for ByBatchSize. Descriptor-style entries are opaque pointers and may be +//null if construction threw partway, while non-pointer entries (algo/solution structs) never +//have a destroyFunc, but both overloads must compile for every instantiation. +template static bool byBatchSizeEntryNonNull(U* p) { return p != nullptr; } +template static bool byBatchSizeEntryNonNull(const U&) { return true; } + +template +struct ByBatchSize { + const int maxBatchSize; + T* data; + cudnnStatus_t (*destroyFunc)(T); + + ByBatchSize() + : maxBatchSize(0), data(nullptr), destroyFunc(nullptr) + {} + + ByBatchSize( + int maxBatchSize_ + ) : maxBatchSize(maxBatchSize_), data(nullptr), destroyFunc(nullptr) { + data = new T[maxBatchSize](); //value-init: descriptor entries start null + } + + ByBatchSize(const ByBatchSize&) = delete; + ByBatchSize& operator=(const ByBatchSize&) = delete; + + ~ByBatchSize() { + if(destroyFunc != nullptr && data != nullptr) { + for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { + if(byBatchSizeEntryNonNull(data[batchSize-1])) + (*destroyFunc)(data[batchSize-1]); + } + } + if(data != nullptr) { + delete[] data; + data = nullptr; + } + } + T& operator[](int batchSize) { + return data[batchSize-1]; + } + const T& operator[](int batchSize) const { + return data[batchSize-1]; + } +}; + +template +struct ByBatchSizeView { + int maxBatchSize; + T* data; + + ByBatchSizeView() + : maxBatchSize(0), data(nullptr) + {} + + ByBatchSizeView(const ByBatchSize& toView) + : maxBatchSize(toView.maxBatchSize), data(toView.data) + {} + ByBatchSizeView& operator=(const ByBatchSize& toView) { + maxBatchSize = toView.maxBatchSize; + data = toView.data; + return *this; + } + + ~ByBatchSizeView() { + } + T& operator[](int batchSize) { + return data[batchSize-1]; + } + const T& operator[](int batchSize) const { + return data[batchSize-1]; + } +}; + +//--------------------------------------------------------------------------------- + + +//channels, useFP16, useNHWC +typedef std::tuple CudnnTensorDesc4DKey; + +struct CudnnManager { + const string name; + const int maxBatchSize; + const int nnXLen; + const int nnYLen; + std::map*> tensorDesc4DByBatchSizeByKey; + + CudnnManager(string name_, int maxBatchSize_, int nnXLen_, int nnYLen_) + :name(name_), + maxBatchSize(maxBatchSize_), + nnXLen(nnXLen_), + nnYLen(nnYLen_), + tensorDesc4DByBatchSizeByKey() + { + } + + ~CudnnManager() { + for(auto& iter: tensorDesc4DByBatchSizeByKey) { + delete iter.second; + } + } + + ByBatchSizeView getTensorDesc4DByBatchSize( + int channels, bool useFP16, bool useNHWC + ) { + auto iter = tensorDesc4DByBatchSizeByKey.find({channels, useFP16, useNHWC}); + if(iter != tensorDesc4DByBatchSizeByKey.end()) { + return ByBatchSizeView(*(iter->second)); + } + //Hold in a unique_ptr with destroyFunc set before creating anything, so that if descriptor + //creation throws partway through, the already-created descriptors are destroyed with it. + auto descs = std::make_unique>(maxBatchSize); + descs->destroyFunc = cudnnDestroyTensorDescriptor; + for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { + cudnnTensorDescriptor_t& desc = (*descs)[batchSize]; + CUDNN_ERR(name.c_str(),cudnnCreateTensorDescriptor(&desc)); +#ifdef KATAGO_GPU_CUDA + CUDNN_ERR(name.c_str(),cudnnSetTensor4dDescriptor( + desc, + (useNHWC ? CUDNN_TENSOR_NHWC : CUDNN_TENSOR_NCHW), + (useFP16 ? CUDNN_DATA_HALF : CUDNN_DATA_FLOAT), + batchSize, + channels, + nnYLen, + nnXLen + )); +#else // KATAGO_GPU_HIP + if(useNHWC) { + int lens[4] = {batchSize, channels, nnYLen, nnXLen}; + CUDNN_ERR(name.c_str(),miopenSetNdTensorDescriptorWithLayout( + desc, + (useFP16 ? miopenHalf : miopenFloat), + miopenTensorNHWC, + lens, + 4 + )); + } + else { + CUDNN_ERR(name.c_str(),miopenSet4dTensorDescriptor( + desc, + (useFP16 ? miopenHalf : miopenFloat), + batchSize, + channels, + nnYLen, + nnXLen + )); + } +#endif + } + tensorDesc4DByBatchSizeByKey[{channels, useFP16, useNHWC}] = descs.get(); + return ByBatchSizeView(*descs.release()); + } +}; + +//--------------------------------------------------------------------------------- + +struct ScratchBuffers { + + const size_t batchXYFloatBytes; + const size_t batchFloatBytes; + const size_t batchXYBytes; + const size_t batchBytes; + + SimpleAllocator* allocator; + + // Not scratch, but convenient to have here + void* zeroBuf; + void* oneBuf; + + ScratchBuffers() = delete; + ScratchBuffers(const ScratchBuffers&) = delete; + ScratchBuffers& operator=(const ScratchBuffers&) = delete; + + ScratchBuffers(int maxBatchSize, int nnXLen, int nnYLen, bool useFP16) + : batchXYFloatBytes((size_t)maxBatchSize * nnXLen * nnYLen * sizeof(float)), + batchFloatBytes((size_t)maxBatchSize * sizeof(float)), + batchXYBytes((size_t)maxBatchSize * nnXLen * nnYLen * (useFP16 ? sizeof(half_t) : sizeof(float))), + batchBytes((size_t)maxBatchSize * (useFP16 ? sizeof(half_t) : sizeof(float))) + { + std::function allocateFunc = [](size_t size) { + void* buf; + CUDA_ERR("ScratchBuffers",cudaMalloc(&buf, size)); + return buf; + }; + std::function releaseFunc = [](void* buf) { + (void)cudaFree(buf); + }; + + //Build into a unique_ptr first (same pattern as ByBatchSize) so that if + //hostMallocZeroOneBufs throws, the allocator is not leaked. + auto allocatorOwned = std::make_unique>(allocateFunc, releaseFunc); + + CudaUtils::hostMallocZeroOneBufs(zeroBuf, oneBuf, useFP16); + allocator = allocatorOwned.release(); + } + ~ScratchBuffers() { + delete allocator; + free(zeroBuf); + free(oneBuf); + } + + size_t getBufSizeXY(int channels) const { + return channels * batchXYBytes; + } + size_t getBufSizeXYFloat(int channels) const { + return channels * batchXYFloatBytes; + } + size_t getBufSizeFloat(int channels) const { + return channels * batchFloatBytes; + } + size_t getBufSize(int channels) const { + return channels * batchBytes; + } + +}; + + +//--------------------------------------------------------------------------------- + +#ifdef KATAGO_GPU_CUDA +struct ConvLayer { + const string name; + const int inChannels; + const int outChannels; + ByBatchSizeView inputDescriptors; + ByBatchSizeView outputDescriptors; + OwnedDesc filterDescriptor; + OwnedDesc convolutionDescriptor; +#if CUDNN_MAJOR >= 8 + std::unique_ptr> convolutionAlgorithms; //array of one for each batch size +#else + std::unique_ptr> convolutionAlgorithms; //array of one for each batch size +#endif + OwnedDeviceBuf filterBuf; + // A 1x1 conv is equivalent to a matmul. When use1x1Matmul is set we run it as a cuBLAS GEMM over + // batch*spatial tokens and build NO cuDNN objects. This is the default for 1x1 NHWC FP16 convs. + // matmulWeightBuf is [inC, outC] column-major (cuBLAS order); matmulSpatialSize is the spatial length. + bool use1x1Matmul; + int matmulSpatialSize; + OwnedDeviceBuf matmulWeightBuf; + bool usingFP16; + + ConvLayer() = delete; + ConvLayer(const ConvLayer&) = delete; + ConvLayer& operator=(const ConvLayer&) = delete; + + ConvLayer( + CudaHandles* cudaHandles, + CudnnManager* manager, + const ConvLayerDesc* desc, + bool useFP16, + bool useNHWC + ) : ConvLayer(cudaHandles, manager, desc, useFP16, useNHWC, useNHWC) + {} + + ConvLayer( + CudaHandles* cudaHandles, + CudnnManager* manager, + const ConvLayerDesc* desc, + bool useFP16, + bool useNHWCIn, + bool useNHWCOut + ) : + name(desc->name), + inChannels(desc->inChannels), + outChannels(desc->outChannels) + { + int convYSize = desc->convYSize; + int convXSize = desc->convXSize; + int dilationY = desc->dilationY; + int dilationX = desc->dilationX; + int paddingX = (convXSize / 2) * dilationX; + int paddingY = (convYSize / 2) * dilationY; + + testAssert(convXSize % 2 == 1); + testAssert(convYSize % 2 == 1); + + usingFP16 = useFP16; + + // A 1x1 conv is a matmul, and cuBLAS is faster than cuDNN's conv in FP16 (tensor cores). + // Benchmarked as slightly faster on convnets and neutral on transformers. + // In FP32 there wasn't an improvement, so the default (cudaUse1x1Matmul=Auto) only uses GEMM in FP16. + // The config flag can force it either way regardless of precision. Supports NHWC only (the GEMM assumes + // channel-contiguous-per-position layout). + use1x1Matmul = false; + if(convXSize == 1 && convYSize == 1 && useNHWCIn && useNHWCOut) { + enabled_t mode = cudaHandles->use1x1MatmulMode; + use1x1Matmul = (mode == enabled_t::True) || (mode == enabled_t::Auto && useFP16); + } + matmulSpatialSize = use1x1Matmul ? (manager->nnYLen * manager->nnXLen) : 0; + + if(use1x1Matmul) { + // 1x1 conv weights are [outC, inC]. cuBLAS GEMM wants column-major, i.e. [inC, outC] in row-major notation. + // So transpose. No cuDNN objects are built. + vector wT((size_t)inChannels * outChannels); + for(int oc = 0; oc < outChannels; oc++) + for(int ic = 0; ic < inChannels; ic++) + wT[(size_t)oc + (size_t)ic * outChannels] = desc->weights[(size_t)oc * inChannels + ic]; + CudaUtils::mallocAndCopyToDevice(name + ":matmulW", wT, matmulWeightBuf.buf, useFP16); + return; + } + + inputDescriptors = manager->getTensorDesc4DByBatchSize(inChannels,useFP16,useNHWCIn); + outputDescriptors = manager->getTensorDesc4DByBatchSize(outChannels,useFP16,useNHWCOut); + int maxBatchSize = manager->maxBatchSize; + + bool filterNHWC = useNHWCOut && dilationY == 1 && dilationX == 1; + + CUDNN_ERR(name.c_str(),cudnnCreateFilterDescriptor(&filterDescriptor.desc)); + CUDNN_ERR(name.c_str(),cudnnSetFilter4dDescriptor( + filterDescriptor, + (useFP16 ? CUDNN_DATA_HALF : CUDNN_DATA_FLOAT), + (filterNHWC ? CUDNN_TENSOR_NHWC : CUDNN_TENSOR_NCHW), + outChannels, + inChannels, + convYSize, + convXSize + )); + + int yStride = 1; + int xStride = 1; + + //NVIDIA compute capability 7 is when we first hit Volta architecture, with tensor cores + //See https://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications + bool tensorCoresSupported = cudaHandles->majorComputeCapability >= 7; + + CUDNN_ERR(name.c_str(),cudnnCreateConvolutionDescriptor(&convolutionDescriptor.desc)); + CUDNN_ERR(name.c_str(),cudnnSetConvolution2dDescriptor( + convolutionDescriptor, + paddingY, + paddingX, + yStride, + xStride, + dilationY, + dilationX, + CUDNN_CROSS_CORRELATION, + (useFP16 && !tensorCoresSupported) ? CUDNN_DATA_HALF : CUDNN_DATA_FLOAT + )); + if(useFP16 && tensorCoresSupported) + CUDNN_ERR(name.c_str(),cudnnSetConvolutionMathType(convolutionDescriptor, CUDNN_TENSOR_OP_MATH)); + +#if CUDNN_MAJOR >= 8 + convolutionAlgorithms = std::make_unique>(maxBatchSize); +#else + convolutionAlgorithms = std::make_unique>(maxBatchSize); +#endif + + for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { + if(useFP16 && dilationX <= 1 && dilationY <= 1) { +#if CUDNN_MAJOR >= 8 + (*convolutionAlgorithms)[batchSize].algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM; +#else + (*convolutionAlgorithms)[batchSize] = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM; +#endif + } + else { + const cudnnTensorDescriptor_t& inputDescriptor = inputDescriptors[batchSize]; + const cudnnTensorDescriptor_t& outputDescriptor = outputDescriptors[batchSize]; + +#if CUDNN_MAJOR >= 8 + int requestedAlgoCount = CUDNN_CONVOLUTION_FWD_ALGO_COUNT; + int returnedAlgoCount = -1; + cudnnConvolutionFwdAlgoPerf_t results[2 * CUDNN_CONVOLUTION_FWD_ALGO_COUNT]; + CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardAlgorithm_v7( + cudaHandles->cudnn, + inputDescriptor, + filterDescriptor, + convolutionDescriptor, + outputDescriptor, + requestedAlgoCount, + &returnedAlgoCount, + results + )); + if(returnedAlgoCount <= 0) + throw StringError("cudnnGetConvolutionForwardAlgorithm_v7 returned no algorithms?"); + (*convolutionAlgorithms)[batchSize] = results[0]; +#else + size_t bytesMemoryLimit = 0; + CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardAlgorithm( + cudaHandles->cudnn, + inputDescriptor, + filterDescriptor, + convolutionDescriptor, + outputDescriptor, + CUDNN_CONVOLUTION_FWD_PREFER_FASTEST, + bytesMemoryLimit, + &((*convolutionAlgorithms)[batchSize]) + )); +#endif + } + } + + testAssert(desc->weights.size() == convYSize * convXSize * inChannels * outChannels); + + if(filterNHWC) { + vector weightsTransposed(desc->weights.size()); + for(int y = 0; y < convYSize; y++) { + for(int x = 0; x < convXSize; x++) { + for(int ic = 0; ic < inChannels; ic++) { + for(int oc = 0; oc < outChannels; oc++) { + weightsTransposed[((oc*convYSize + y)*convXSize + x)*inChannels + ic] = + desc->weights[((oc*inChannels + ic)*convYSize + y)*convXSize + x]; + } + } + } + } + CudaUtils::mallocAndCopyToDevice(name,weightsTransposed,filterBuf.buf,useFP16); + (void)cudaDeviceSynchronize(); + } + else + CudaUtils::mallocAndCopyToDevice(name,desc->weights,filterBuf.buf,useFP16); + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + if(use1x1Matmul) + return 0; + size_t workspaceBytes = 0; +#if CUDNN_MAJOR >= 8 + CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardWorkspaceSize( + cudaHandles->cudnn, + inputDescriptors[batchSize], + filterDescriptor, + convolutionDescriptor, + outputDescriptors[batchSize], + (*convolutionAlgorithms)[batchSize].algo, + &workspaceBytes + )); +#else + CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardWorkspaceSize( + cudaHandles->cudnn, + inputDescriptors[batchSize], + filterDescriptor, + convolutionDescriptor, + outputDescriptors[batchSize], + (*convolutionAlgorithms)[batchSize], + &workspaceBytes + )); +#endif + return workspaceBytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + bool accumulate, + void* inputBuf, + void* outputBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + //Unused here, but the ROCm backend's version of this function needs it to emulate accumulate. + (void)scratch; + if(use1x1Matmul) { + // out[outC, tokens] = W[outC, inC] x in[inC, tokens] + // where tokens = batchSize * spatial. NHWC buffers are [tokens, C] row-major = [C, tokens] column-major + // matching cuBLAS's expectation. Same as MatMulLayer. + int tokens = batchSize * matmulSpatialSize; + if(!usingFP16) { + const float alpha = 1.0f; + const float beta = accumulate ? 1.0f : 0.0f; + CUBLAS_ERR(name.c_str(),cublasSgemm( + cudaHandles->cublas, CUBLAS_OP_N, CUBLAS_OP_N, + outChannels, tokens, inChannels, + &alpha, (const float*)matmulWeightBuf.buf, outChannels, + (const float*)inputBuf, inChannels, + &beta, (float*)outputBuf, outChannels)); + } + else { + const half alpha = __float2half(1.0f); + const half beta = __float2half(accumulate ? 1.0f : 0.0f); + CUBLAS_ERR(name.c_str(),cublasHgemm( + cudaHandles->cublas, CUBLAS_OP_N, CUBLAS_OP_N, + outChannels, tokens, inChannels, + &alpha, (const half*)matmulWeightBuf.buf, outChannels, + (const half*)inputBuf, inChannels, + &beta, (half*)outputBuf, outChannels)); + } + return; + } + const float alpha = 1.0f; + const float beta = accumulate ? 1.0f : 0.0f; +#if CUDNN_MAJOR >= 8 + CUDNN_ERR(name.c_str(),cudnnConvolutionForward( + cudaHandles->cudnn, + &alpha, + inputDescriptors[batchSize], + inputBuf, + filterDescriptor, + filterBuf.buf, + convolutionDescriptor, + (*convolutionAlgorithms)[batchSize].algo, + workspaceBuf, + workspaceBytes, + &beta, + outputDescriptors[batchSize], + outputBuf + )); +#else + CUDNN_ERR(name.c_str(),cudnnConvolutionForward( + cudaHandles->cudnn, + &alpha, + inputDescriptors[batchSize], + inputBuf, + filterDescriptor, + filterBuf.buf, + convolutionDescriptor, + (*convolutionAlgorithms)[batchSize], + workspaceBuf, + workspaceBytes, + &beta, + outputDescriptors[batchSize], + outputBuf + )); +#endif + } + +}; +#else // KATAGO_GPU_HIP +struct ConvLayer { + const string name; + const int inChannels; + const int outChannels; + const int nnXLen; + const int nnYLen; + const int maxBatchSize; + const bool usingFP16; + ByBatchSizeView inputDescriptors; + ByBatchSizeView outputDescriptors; + OwnedDesc filterDescriptor; + OwnedDesc convolutionDescriptor; + std::unique_ptr> convolutionAlgorithms; //array of one for each batch size + OwnedDeviceBuf filterBuf; + + ConvLayer() = delete; + ConvLayer(const ConvLayer&) = delete; + ConvLayer& operator=(const ConvLayer&) = delete; + + ConvLayer( + CudaHandles* cudaHandles, + CudnnManager* manager, + const ConvLayerDesc* desc, + bool useFP16, + bool useNHWC + ) : ConvLayer(cudaHandles, manager, desc, useFP16, useNHWC, useNHWC) + {} + + ConvLayer( + CudaHandles* cudaHandles, + CudnnManager* manager, + const ConvLayerDesc* desc, + bool useFP16, + bool useNHWCIn, + bool useNHWCOut + ) : + name(desc->name), + inChannels(desc->inChannels), + outChannels(desc->outChannels), + nnXLen(manager->nnXLen), + nnYLen(manager->nnYLen), + maxBatchSize(manager->maxBatchSize), + usingFP16(useFP16) + { + int convYSize = desc->convYSize; + int convXSize = desc->convXSize; + int dilationY = desc->dilationY; + int dilationX = desc->dilationX; + int paddingX = (convXSize / 2) * dilationX; + int paddingY = (convYSize / 2) * dilationY; + + testAssert(convXSize % 2 == 1); + testAssert(convYSize % 2 == 1); + + inputDescriptors = manager->getTensorDesc4DByBatchSize(inChannels,useFP16,useNHWCIn); + outputDescriptors = manager->getTensorDesc4DByBatchSize(outChannels,useFP16,useNHWCOut); + + bool filterNHWC = useNHWCOut && dilationY == 1 && dilationX == 1; + + CUDNN_ERR(name.c_str(),miopenCreateTensorDescriptor(&filterDescriptor.desc)); + if(filterNHWC) { + int lens[4] = {outChannels, inChannels, convYSize, convXSize}; + CUDNN_ERR(name.c_str(),miopenSetNdTensorDescriptorWithLayout( + filterDescriptor, + (useFP16 ? miopenHalf : miopenFloat), + miopenTensorNHWC, + lens, + 4 + )); + } + else { + CUDNN_ERR(name.c_str(),miopenSet4dTensorDescriptor( + filterDescriptor, + (useFP16 ? miopenHalf : miopenFloat), + outChannels, + inChannels, + convYSize, + convXSize + )); + } + + int yStride = 1; + int xStride = 1; + + + CUDNN_ERR(name.c_str(),miopenCreateConvolutionDescriptor(&convolutionDescriptor.desc)); + CUDNN_ERR(name.c_str(),miopenInitConvolutionDescriptor( + convolutionDescriptor, + miopenConvolution, + paddingY, + paddingX, + yStride, + xStride, + dilationY, + dilationX + )); + if(useFP16) { + int alt = 1; // Nonzero enables MIOpen's alternate FP16 implementation on MI200-series and newer GPUs. + CUDNN_ERR(name.c_str(),miopenSetConvolutionAttribute(convolutionDescriptor,MIOPEN_CONVOLUTION_ATTRIB_FP16_ALT_IMPL,alt)); + } + + convolutionAlgorithms = std::make_unique>(maxBatchSize); + + for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { + const miopenTensorDescriptor_t& inputDescriptor = inputDescriptors[batchSize]; + const miopenTensorDescriptor_t& outputDescriptor = outputDescriptors[batchSize]; + size_t availableAlgoCount = 0; + CUDNN_ERR(name.c_str(),miopenConvolutionForwardGetSolutionCount( + cudaHandles->cudnn, + filterDescriptor, + inputDescriptor, + convolutionDescriptor, + outputDescriptor, + &availableAlgoCount + )); + if(availableAlgoCount <= 0) + throw StringError("miopenConvolutionForwardGetSolutionCount returned 0 algorithms?"); + std::vector solutions(availableAlgoCount); + size_t returnedAlgoCount = 0; + CUDNN_ERR(name.c_str(),miopenConvolutionForwardGetSolution( + cudaHandles->cudnn, + filterDescriptor, + inputDescriptor, + convolutionDescriptor, + outputDescriptor, + availableAlgoCount, + &returnedAlgoCount, + solutions.data() + )); + if(returnedAlgoCount <= 0) + throw StringError("miopenConvolutionForwardGetSolution returned no algorithms?"); + (*convolutionAlgorithms)[batchSize] = solutions[0]; + CUDNN_ERR(name.c_str(),miopenConvolutionForwardCompileSolution( + cudaHandles->cudnn, + filterDescriptor, + inputDescriptor, + convolutionDescriptor, + outputDescriptor, + (*convolutionAlgorithms)[batchSize].solution_id + )); + } + + testAssert(desc->weights.size() == convYSize * convXSize * inChannels * outChannels); + + if(filterNHWC) { + vector weightsTransposed(desc->weights.size()); + for(int y = 0; y < convYSize; y++) { + for(int x = 0; x < convXSize; x++) { + for(int ic = 0; ic < inChannels; ic++) { + for(int oc = 0; oc < outChannels; oc++) { + weightsTransposed[((oc*convYSize + y)*convXSize + x)*inChannels + ic] = + desc->weights[((oc*inChannels + ic)*convYSize + y)*convXSize + x]; + } + } + } + } + CudaUtils::mallocAndCopyToDevice(name,weightsTransposed,filterBuf.buf,useFP16); + (void)hipDeviceSynchronize(); + } + else + CudaUtils::mallocAndCopyToDevice(name,desc->weights,filterBuf.buf,useFP16); + + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t workspaceBytes = 0; + CUDNN_ERR(name.c_str(),miopenConvolutionForwardGetSolutionWorkspaceSize( + cudaHandles->cudnn, + filterDescriptor, + inputDescriptors[batchSize], + convolutionDescriptor, + outputDescriptors[batchSize], + (*convolutionAlgorithms)[batchSize].solution_id, + &workspaceBytes + )); + return workspaceBytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + bool accumulate, + void* inputBuf, + void* outputBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + // miopenConvolutionForwardImmediate does NOT support alpha/beta (unlike cuDNN). + // When accumulate=true, we need: outputBuf = conv(inputBuf) + outputBuf (residual skip + // connection). Save outputBuf's contents to a scratch buffer, run the conv, then add back. + // The SizedBuf may be handed back to the allocator's pool before the async ops complete, but + // any later user of the same allocation enqueues on the same stream, so this is safe - the + // same pattern every other transient buffer in this file relies on. + // scratch may be NULL if accumulate is false (see testEvaluateConv). + // The buffer is sized by maxBatchSize (getBufSizeXY), NOT the actual batch size: the allocator + // pools buffers by exact byte size and retains them for the handle's lifetime, so sizing by + // actual batch size would mint (and keep) a separate allocation for every distinct batch size + // that ever runs. + size_t outputElts = (size_t)batchSize * outChannels * nnXLen * nnYLen; + if(outputElts >= (size_t)2147483647) + throw StringError(name + ": conv output element count exceeds the 32-bit index limit used by the accumulate kernel"); + size_t elemSize = usingFP16 ? sizeof(half) : sizeof(float); + std::unique_ptr> accumBuf; + if(accumulate) { + accumBuf = std::make_unique>(scratch->allocator, scratch->getBufSizeXY(outChannels)); + CUDA_ERR(name.c_str(), hipMemcpyAsync(accumBuf->buf, outputBuf, outputElts * elemSize, hipMemcpyDeviceToDevice)); + } + + CUDNN_ERR(name.c_str(), miopenConvolutionForwardImmediate( + cudaHandles->cudnn, + filterDescriptor, + filterBuf.buf, + inputDescriptors[batchSize], + inputBuf, + convolutionDescriptor, + outputDescriptors[batchSize], + outputBuf, + workspaceBuf, + workspaceBytes, + (*convolutionAlgorithms)[batchSize].solution_id + )); + + if(accumulate) { + if(usingFP16) + customCudaAddTensorInplace((half*)outputBuf, (const half*)accumBuf->buf, (int)outputElts); + else + customCudaAddTensorInplace((float*)outputBuf, (const float*)accumBuf->buf, (int)outputElts); + CUDA_ERR(name.c_str(), hipPeekAtLastError()); + } + } + +}; +#endif + + +//--------------------------------------------------------------------------------- + +struct BatchNormLayer { + const string name; + const int numChannels; + const float epsilon; + const int activation; + const int nnXLen; + const int nnYLen; + + const bool usingFP16; + const bool usingNHWC; + + OwnedDeviceBuf mergedScaleBuf; + OwnedDeviceBuf mergedBiasBuf; + + BatchNormLayer() = delete; + BatchNormLayer(const BatchNormLayer&) = delete; + BatchNormLayer& operator=(const BatchNormLayer&) = delete; + + BatchNormLayer( + CudaHandles* cudaHandles, + const BatchNormLayerDesc* desc, + const ActivationLayerDesc* actDesc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + numChannels(desc->numChannels), + epsilon(desc->epsilon), + activation(actDesc->activation), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC) + { + (void)cudaHandles; + + testAssert(desc->mean.size() == numChannels); + testAssert(desc->variance.size() == numChannels); + testAssert(desc->scale.size() == numChannels); + testAssert(desc->bias.size() == numChannels); + testAssert(desc->mergedScale.size() == numChannels); + testAssert(desc->mergedBias.size() == numChannels); + CudaUtils::mallocAndCopyToDevice(name,desc->mergedScale,mergedScaleBuf.buf,useFP16); + CudaUtils::mallocAndCopyToDevice(name,desc->mergedBias,mergedBiasBuf.buf,useFP16); + } + void apply( + CudaHandles* cudaHandles, + int batchSize, + void* inputBuf, + const void* maskBuf, //ok to be null + void* outputBuf + ) const { + (void)cudaHandles; + if(!usingFP16) { + if(!usingNHWC) + customCudaApplyCScaleBiasNCHW((const float*)inputBuf,(float*)outputBuf,(const float*)mergedScaleBuf.buf,(const float*)mergedBiasBuf.buf, + (const float*)maskBuf, + batchSize,numChannels,nnXLen*nnYLen,activation); + else + customCudaApplyCScaleBiasNHWC((const float*)inputBuf,(float*)outputBuf,(const float*)mergedScaleBuf.buf,(const float*)mergedBiasBuf.buf, + (const float*)maskBuf, + batchSize,nnXLen*nnYLen,numChannels,activation); + } + else { + if(!usingNHWC) + customCudaApplyCScaleBiasNCHW((const half*)inputBuf,(half*)outputBuf,(const half*)mergedScaleBuf.buf,(const half*)mergedBiasBuf.buf, + (const half*)maskBuf, + batchSize,numChannels,nnXLen*nnYLen,activation); + else + customCudaApplyCScaleBiasNHWC((const half*)inputBuf,(half*)outputBuf,(const half*)mergedScaleBuf.buf,(const half*)mergedBiasBuf.buf, + (const half*)maskBuf, + batchSize,nnXLen*nnYLen,numChannels,activation); + } + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + } + +}; + + +//--------------------------------------------------------------------------------- + +struct MatMulLayer { + const string name; + const int inChannels; + const int outChannels; + const bool usingFP16; + OwnedDeviceBuf matBuf; + + MatMulLayer() = delete; + MatMulLayer(const MatMulLayer&) = delete; + MatMulLayer& operator=(const MatMulLayer&) = delete; + + MatMulLayer( + CudaHandles* cudaHandles, + const MatMulLayerDesc* desc, + bool useFP16 + ) : + name(desc->name), + inChannels(desc->inChannels), + outChannels(desc->outChannels), + usingFP16(useFP16) + { + (void)cudaHandles; + + if(inChannels > 0 && outChannels > 0) { + testAssert(desc->weights.size() == inChannels * outChannels); + CudaUtils::mallocAndCopyToDevice(name,desc->weights,matBuf.buf,useFP16); + } + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles + ) const { + (void)cudaHandles; + size_t workspaceBytes = 0; + return workspaceBytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* inputBuf, + void* outputBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + (void)workspaceBuf; + (void)workspaceBytes; + assert(inChannels > 0 && outChannels > 0); + + if(!usingFP16) { + const float alpha = 1.0f; + const float beta = 0.0f; + CUBLAS_ERR(name.c_str(),cublasSgemm( + cudaHandles->cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + outChannels, + batchSize, + inChannels, + &alpha, + (const float*)matBuf.buf,outChannels, + (const float*)inputBuf,inChannels, + &beta, + (float*)outputBuf,outChannels + )); + } + else { +#if defined(KATAGO_GPU_HIP) && defined(hipblasVersionMajor) && hipblasVersionMajor >= 2 + //hipblasHgemm computes in FP16, which costs real accuracy - enough that on transformer nets + //the ROCm backend's FP16 error exceeded the backend accuracy test limits. hipblasGemmEx with + //FP16 in/out and FP32 compute fixes that and costs nothing in speed. alpha/beta must match + //the compute type, so they are plain host floats here rather than the half zeroBuf/oneBuf + //the CUDA path uses. + const float alpha = 1.0f; + const float beta = 0.0f; + CUBLAS_ERR(name.c_str(),hipblasGemmEx( + cudaHandles->cublas, + HIPBLAS_OP_N, + HIPBLAS_OP_N, + outChannels, + batchSize, + inChannels, + &alpha, + matBuf.buf, HIP_R_16F, outChannels, + inputBuf, HIP_R_16F, inChannels, + &beta, + outputBuf, HIP_R_16F, outChannels, + HIPBLAS_COMPUTE_32F, + HIPBLAS_GEMM_DEFAULT + )); +#else + //CUDA, or hipBLAS older than 2.0 (below ROCm 6.0, itself below the minimum Compiling.md + //documents). There hipblasGemmEx has no spelling that takes hipblasComputeType_t at all, so + //keep the FP16-compute path: correct, just less accurate and slower. + const cublas_half_t* alpha = (const cublas_half_t*)scratch->oneBuf; + const cublas_half_t* beta = (const cublas_half_t*)scratch->zeroBuf; + CUBLAS_ERR(name.c_str(),cublasHgemm( + cudaHandles->cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + outChannels, + batchSize, + inChannels, + alpha, + (const cublas_half_t*)matBuf.buf,outChannels, + (const cublas_half_t*)inputBuf,inChannels, + beta, + (cublas_half_t*)outputBuf,outChannels + )); +#endif + } + + } + +}; + +//--------------------------------------------------------------------------------- + +struct MatBiasLayer { + const string name; + const int numChannels; + const bool usingFP16; + const int activation; + + OwnedDeviceBuf biasBuf; + + MatBiasLayer() = delete; + MatBiasLayer(const MatBiasLayer&) = delete; + MatBiasLayer& operator=(const MatBiasLayer&) = delete; + + MatBiasLayer( + CudaHandles* cudaHandles, + const MatBiasLayerDesc* desc, + bool useFP16, + int activation_ + ) : + name(desc->name), + numChannels(desc->numChannels), + usingFP16(useFP16), + activation(activation_) + { + (void)cudaHandles; + if(numChannels > 0) { + testAssert(desc->weights.size() == numChannels); + CudaUtils::mallocAndCopyToDevice(name,desc->weights,biasBuf.buf,useFP16); + } + } + + void apply( + CudaHandles* cudaHandles, + int batchSize, + void* matBuf + ) const { + (void)cudaHandles; + assert(numChannels > 0); + if(!usingFP16) { + customCudaAddCBiasInplaceNC((float*)matBuf,(const float*)biasBuf.buf,batchSize,numChannels,activation); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + } + else { + customCudaAddCBiasInplaceNC((half*)matBuf,(const half*)biasBuf.buf,batchSize,numChannels,activation); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + } + } + +}; + +//--------------------------------------------------------------------------------- + +struct NormActConv { + const BatchNormLayer norm; + const ConvLayer conv; + + const int inChannels; + const int outChannels; + const int nnXLen; + const int nnYLen; + const bool usingFP16; + const bool usingNHWC; + + NormActConv() = delete; + NormActConv(const NormActConv&) = delete; + NormActConv& operator=(const NormActConv&) = delete; + + NormActConv( + CudaHandles* cudaHandles, + CudnnManager* manager, + const BatchNormLayerDesc* normDesc, + const ActivationLayerDesc* actDesc, + const ConvLayerDesc* convDesc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ): norm(cudaHandles,normDesc,actDesc,nnX,nnY,useFP16,useNHWC), + conv(cudaHandles,manager,convDesc,useFP16,useNHWC), + inChannels(norm.numChannels), + outChannels(conv.outChannels), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC) + { + testAssert(norm.numChannels == conv.inChannels); + } + + ~NormActConv() + {} + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + b = conv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + bool accumulate, + void* inBuf, + void* inScratchBuf, + void* outBuf, + void* maskBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + norm.apply(cudaHandles,batchSize,inBuf,maskBuf,inScratchBuf); +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("AFTER NORM "), inScratchBuf, batchSize, inChannels, nnXLen*nnYLen, usingNHWC, usingFP16); +#endif + conv.apply(cudaHandles,scratch,batchSize,accumulate,inScratchBuf,outBuf,workspaceBuf,workspaceBytes); + } + +}; + + +//--------------------------------------------------------------------------------- + +struct ResidualBlock { + const string name; + const NormActConv normActConv1; + const NormActConv normActConv2; + + ResidualBlock() = delete; + ResidualBlock(const ResidualBlock&) = delete; + ResidualBlock& operator=(const ResidualBlock&) = delete; + + ResidualBlock( + CudaHandles* cudaHandles, + CudnnManager* manager, + const ResidualBlockDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ): name(desc->name), + normActConv1(cudaHandles,manager,&desc->preBN,&desc->preActivation,&desc->regularConv,nnX,nnY,useFP16,useNHWC), + normActConv2(cudaHandles,manager,&desc->midBN,&desc->midActivation,&desc->finalConv,nnX,nnY,useFP16,useNHWC) + { + } + + ~ResidualBlock() + {} + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + b = normActConv1.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = normActConv2.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* trunkBuf, + void* trunkScratchBuf, + void* maskBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + SizedBuf midIn(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); + SizedBuf midScratch(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); + normActConv1.apply(cudaHandles,scratch,batchSize,false,trunkBuf,trunkScratchBuf,midIn.buf,maskBuf,workspaceBuf,workspaceBytes); + normActConv2.apply(cudaHandles,scratch,batchSize,true,midIn.buf,midScratch.buf,trunkBuf,maskBuf,workspaceBuf,workspaceBytes); + } + +}; + + +//---------------------------------------------------------------------------- + + +struct GlobalPoolingResidualBlock { + const string name; + const BatchNormLayer preBN; + const ConvLayer regularConv; + const ConvLayer gpoolConv; + const BatchNormLayer gpoolBN; + const MatMulLayer gpoolToBiasMul; + const NormActConv normActConv2; + + const int nnXLen; + const int nnYLen; + const int regularChannels; + const int gpoolChannels; + const bool usingFP16; + const bool usingNHWC; + + GlobalPoolingResidualBlock() = delete; + GlobalPoolingResidualBlock(const GlobalPoolingResidualBlock&) = delete; + GlobalPoolingResidualBlock& operator=(const GlobalPoolingResidualBlock&) = delete; + + GlobalPoolingResidualBlock( + CudaHandles* cudaHandles, + CudnnManager* manager, + const GlobalPoolingResidualBlockDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ): name(desc->name), + preBN(cudaHandles,&desc->preBN,&desc->preActivation,nnX,nnY,useFP16,useNHWC), + regularConv(cudaHandles,manager,&desc->regularConv,useFP16,useNHWC), + gpoolConv(cudaHandles,manager,&desc->gpoolConv,useFP16,useNHWC), + gpoolBN(cudaHandles,&desc->gpoolBN,&desc->gpoolActivation,nnX,nnY,useFP16,useNHWC), + gpoolToBiasMul(cudaHandles,&desc->gpoolToBiasMul,useFP16), + normActConv2(cudaHandles,manager,&desc->midBN,&desc->midActivation,&desc->finalConv,nnX,nnY,useFP16,useNHWC), + nnXLen(nnX), + nnYLen(nnY), + regularChannels(desc->regularConv.outChannels), + gpoolChannels(desc->gpoolConv.outChannels), + usingFP16(useFP16), + usingNHWC(useNHWC) + { + } + + ~GlobalPoolingResidualBlock() { + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + b = regularConv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = gpoolConv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = gpoolToBiasMul.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = normActConv2.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = sizeof(float)*batchSize*gpoolChannels*nnXLen*nnYLen; + bytes = std::max(bytes,b); + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* trunkBuf, + void* trunkScratchBuf, + void* maskBuf, + float* maskSumBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + SizedBuf regularOut(scratch->allocator, scratch->getBufSizeXY(regularChannels)); + SizedBuf regularScratch(scratch->allocator, scratch->getBufSizeXY(regularChannels)); + SizedBuf gpoolOut(scratch->allocator, scratch->getBufSizeXY(gpoolChannels)); + SizedBuf gpoolOut2(scratch->allocator, scratch->getBufSizeXY(gpoolChannels)); + SizedBuf gpoolConcat(scratch->allocator, scratch->getBufSize(gpoolChannels*3)); + SizedBuf gpoolBias(scratch->allocator, scratch->getBufSize(regularChannels)); + + preBN.apply(cudaHandles,batchSize,trunkBuf,maskBuf,trunkScratchBuf); + regularConv.apply(cudaHandles,scratch,batchSize,false,trunkScratchBuf,regularOut.buf,workspaceBuf,workspaceBytes); + gpoolConv.apply(cudaHandles,scratch,batchSize,false,trunkScratchBuf,gpoolOut.buf,workspaceBuf,workspaceBytes); + gpoolBN.apply(cudaHandles,batchSize,gpoolOut.buf,maskBuf,gpoolOut2.buf); + + if(!usingFP16) { + if(!usingNHWC) + customCudaPoolRowsGPoolNCHW((const float*)gpoolOut2.buf,(float*)gpoolConcat.buf,batchSize,gpoolChannels,nnXLen*nnYLen,(const float*)maskBuf,maskSumBuf); + else + customCudaPoolRowsGPoolNHWC((const float*)gpoolOut2.buf,(float*)gpoolConcat.buf,batchSize,nnXLen*nnYLen,gpoolChannels,(const float*)maskBuf,maskSumBuf); + } + else { + if(!usingNHWC) + customCudaPoolRowsGPoolNCHW((const half*)gpoolOut2.buf,(half*)gpoolConcat.buf,batchSize,gpoolChannels,nnXLen*nnYLen,(const half*)maskBuf,maskSumBuf); + else + customCudaPoolRowsGPoolNHWC((const half*)gpoolOut2.buf,(half*)gpoolConcat.buf,batchSize,nnXLen*nnYLen,gpoolChannels,(const half*)maskBuf,maskSumBuf); + } + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + + gpoolToBiasMul.apply(cudaHandles,scratch,batchSize,gpoolConcat.buf,gpoolBias.buf,workspaceBuf,workspaceBytes); + + if(!usingFP16) { + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW((float*)regularOut.buf,(const float*)gpoolBias.buf,batchSize,regularChannels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC((float*)regularOut.buf,(const float*)gpoolBias.buf,batchSize,nnXLen*nnYLen,regularChannels); + } + else { + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW((half*)regularOut.buf,(const half*)gpoolBias.buf,batchSize,regularChannels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC((half*)regularOut.buf,(const half*)gpoolBias.buf,batchSize,nnXLen*nnYLen,regularChannels); + } + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + + normActConv2.apply(cudaHandles,scratch,batchSize,true,regularOut.buf,regularScratch.buf,trunkBuf,maskBuf,workspaceBuf,workspaceBytes); + } + +}; + +//------------------------------------------------------------------------------ + +struct BlockStack { + const int numBlocks; + const int trunkNumChannels; + const int nnXLen; + const int nnYLen; + const bool usingFP16; + const bool usingNHWC; + vector> blocks; + + BlockStack() = delete; + BlockStack(const BlockStack&) = delete; + BlockStack& operator=(const BlockStack&) = delete; + + BlockStack( + CudaHandles* cudaHandles, + CudnnManager* manager, + int nBlocks, + int trunkChannels, + const std::vector>& descBlocks, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ); + ~BlockStack(); + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const; + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* maskBuf, + float* maskSumBuf, + void* trunkBuf, + void* trunkScratchBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const; + +}; + +//------------------------------------------------------------------------------ + +struct NestedBottleneckResidualBlock { + const string name; + const NormActConv normActConv1; + const BlockStack blocks; + const NormActConv normActConv2; + + NestedBottleneckResidualBlock() = delete; + NestedBottleneckResidualBlock(const NestedBottleneckResidualBlock&) = delete; + NestedBottleneckResidualBlock& operator=(const NestedBottleneckResidualBlock&) = delete; + + NestedBottleneckResidualBlock( + CudaHandles* cudaHandles, + CudnnManager* manager, + const NestedBottleneckResidualBlockDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ): name(desc->name), + normActConv1(cudaHandles,manager,&desc->preBN,&desc->preActivation,&desc->preConv,nnX,nnY,useFP16,useNHWC), + blocks(cudaHandles,manager,desc->numBlocks,desc->preConv.outChannels,desc->blocks,nnX,nnY,useFP16,useNHWC), + normActConv2(cudaHandles,manager,&desc->postBN,&desc->postActivation,&desc->postConv,nnX,nnY,useFP16,useNHWC) + { + } + + ~NestedBottleneckResidualBlock() + {} + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + b = normActConv1.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = blocks.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = normActConv2.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* trunkBuf, + void* trunkScratchBuf, + void* maskBuf, + float* maskSumBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + SizedBuf mid(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); + SizedBuf midScratch(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); + assert(normActConv1.outChannels == normActConv2.inChannels); + normActConv1.apply(cudaHandles,scratch,batchSize,false,trunkBuf,trunkScratchBuf,mid.buf,maskBuf,workspaceBuf,workspaceBytes); + blocks.apply( + cudaHandles, + scratch, + batchSize, + maskBuf, + maskSumBuf, + mid.buf, + midScratch.buf, + workspaceBuf, + workspaceBytes + ); + normActConv2.apply(cudaHandles,scratch,batchSize,true,mid.buf,midScratch.buf,trunkBuf,maskBuf,workspaceBuf,workspaceBytes); + } + +}; + +//------------------------------------------------------------------------------ + +// Lightweight RMSNorm used inside transformer blocks (weight only, no bias, no spatial modes) +struct TransformerRMSNormLayer { + const string name; + const int numChannels; + const float epsilon; + const bool usingFP16; + OwnedDeviceBuf weightBuf; + OwnedDeviceBuf zeroBetaBuf; + + TransformerRMSNormLayer() = delete; + TransformerRMSNormLayer(const TransformerRMSNormLayer&) = delete; + TransformerRMSNormLayer& operator=(const TransformerRMSNormLayer&) = delete; + + TransformerRMSNormLayer( + CudaHandles* cudaHandles, + const TransformerRMSNormDesc* desc, + bool useFP16 + ) : + name(desc->name), + numChannels(desc->numChannels), + epsilon(desc->epsilon), + usingFP16(useFP16) + { + (void)cudaHandles; + testAssert((int)desc->weight.size() == numChannels); + CudaUtils::mallocAndCopyToDevice(name, desc->weight, weightBuf.buf, useFP16); + // Allocate a zero buffer for beta (TransformerRMSNorm has no bias) + vector zeros(numChannels, 0.0f); + CudaUtils::mallocAndCopyToDevice(name + ":zeroBeta", zeros, zeroBetaBuf.buf, useFP16); + } + + // Apply RMSNorm on NHWC data [N, XY, C], applying mask [N, XY] to zero padded positions. + // Uses the RMSNormGammaBeta kernel with gamma=weight, beta=0, no activation. + void apply( + CudaHandles* cudaHandles, + int batchSize, + int xySize, + void* inputBuf, + void* outputBuf, + const void* maskBuf + ) const { + (void)cudaHandles; + // RMSNormGammaBetaNHWC with gamma=weight, beta=zero, mask, identity activation. + if(!usingFP16) { + customCudaRMSNormGammaBetaNHWC( + (const float*)inputBuf, (float*)outputBuf, + (const float*)weightBuf.buf, (const float*)zeroBetaBuf.buf, + (const float*)maskBuf, + batchSize, xySize, numChannels, epsilon, ACTIVATION_IDENTITY); + } + else { + customCudaRMSNormGammaBetaNHWC( + (const half*)inputBuf, (half*)outputBuf, + (const half*)weightBuf.buf, (const half*)zeroBetaBuf.buf, + (const half*)maskBuf, + batchSize, xySize, numChannels, epsilon, ACTIVATION_IDENTITY); + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + } +}; + +//------------------------------------------------------------------------------ + +struct RMSNormLayer { + const string name; + const int numChannels; + const bool spatial; + const int activation; + const float epsilon; + const int nnXLen; + const int nnYLen; + const bool usingFP16; + const bool usingNHWC; + + OwnedDeviceBuf gammaBuf; + OwnedDeviceBuf betaBuf; + + RMSNormLayer() = delete; + RMSNormLayer(const RMSNormLayer&) = delete; + RMSNormLayer& operator=(const RMSNormLayer&) = delete; + + RMSNormLayer( + CudaHandles* cudaHandles, + const RMSNormLayerDesc* desc, + int act, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + numChannels(desc->numChannels), + spatial(desc->spatial), + activation(act), + epsilon(desc->epsilon), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC) + { + (void)cudaHandles; + testAssert((int)desc->gamma.size() == numChannels); + testAssert((int)desc->beta.size() == numChannels); + // The device kernels apply only RELU/MISH/SILU explicitly and treat anything else as + // identity; guard here so an unsupported kind (e.g. MISH_SCALE8, which applyScale8 can + // produce for non-transformer nets) fails loudly instead of silently skipping activation. + if(activation != ACTIVATION_IDENTITY && activation != ACTIVATION_RELU && + activation != ACTIVATION_MISH && activation != ACTIVATION_SILU) + throw StringError(name + ": RMSNorm layer unsupported activation: " + Global::intToString(activation)); + CudaUtils::mallocAndCopyToDevice(name, desc->gamma, gammaBuf.buf, useFP16); + CudaUtils::mallocAndCopyToDevice(name, desc->beta, betaBuf.buf, useFP16); + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* inputBuf, + void* outputBuf, + const void* maskBuf, + const float* maskSumBuf + ) const { + (void)cudaHandles; + int xySize = nnXLen * nnYLen; + if(!spatial) { + if(!usingFP16) { + if(!usingNHWC) + customCudaRMSNormGammaBetaNCHW( + (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf.buf, (const float*)betaBuf.buf, + (const float*)maskBuf, batchSize, numChannels, xySize, epsilon, activation); + else + customCudaRMSNormGammaBetaNHWC( + (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf.buf, (const float*)betaBuf.buf, + (const float*)maskBuf, batchSize, xySize, numChannels, epsilon, activation); + } + else { + if(!usingNHWC) + customCudaRMSNormGammaBetaNCHW( + (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf.buf, (const half*)betaBuf.buf, + (const half*)maskBuf, batchSize, numChannels, xySize, epsilon, activation); + else + customCudaRMSNormGammaBetaNHWC( + (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf.buf, (const half*)betaBuf.buf, + (const half*)maskBuf, batchSize, xySize, numChannels, epsilon, activation); + } + } + else { + // Allocate temp buffer for spatial reduction from scratch (float regardless of FP16 mode). + // Holds per-block partial sums plus the final reduced value per batch element; see + // SPATIAL_RMSNORM_BLOCKS_PER_BATCH in cudaandrocmhelpers.inc (partialStride = that + 1). + SizedBuf sumSqBuf(scratch->allocator, scratch->getBufSizeFloat(CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE)); + if(!usingFP16) { + if(!usingNHWC) + customCudaSpatialRMSNormNCHW( + (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf.buf, (const float*)betaBuf.buf, + (const float*)maskBuf, maskSumBuf, batchSize, numChannels, xySize, epsilon, activation, (float*)sumSqBuf.buf); + else + customCudaSpatialRMSNormNHWC( + (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf.buf, (const float*)betaBuf.buf, + (const float*)maskBuf, maskSumBuf, batchSize, xySize, numChannels, epsilon, activation, (float*)sumSqBuf.buf); + } + else { + if(!usingNHWC) + customCudaSpatialRMSNormNCHW( + (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf.buf, (const half*)betaBuf.buf, + (const half*)maskBuf, maskSumBuf, batchSize, numChannels, xySize, epsilon, activation, (float*)sumSqBuf.buf); + else + customCudaSpatialRMSNormNHWC( + (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf.buf, (const half*)betaBuf.buf, + (const half*)maskBuf, maskSumBuf, batchSize, xySize, numChannels, epsilon, activation, (float*)sumSqBuf.buf); + } + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + } +}; + +//------------------------------------------------------------------------------ + +struct TransformerAttentionBlock { + const string name; + const int numHeads; + const int numKVHeads; + const int qHeadDim; + const int vHeadDim; + const bool useRope; + const bool learnableRope; + const int inChannels; + + const int nnXLen; + const int nnYLen; + const bool usingFP16; + const bool usingNHWC; + + const TransformerRMSNormLayer preLN; + const MatMulLayer qProj; + const MatMulLayer kProj; + const MatMulLayer vProj; + const MatMulLayer outProj; + + // Fixed RoPE: precomputed cos/sin tables on device (NULL for learnable RoPE). + // Learnable RoPE: per-head frequencies on device (ropeFreqsBuf, FP32), cos/sin recomputed in-kernel. + OwnedDeviceBuf ropeCosTable; + OwnedDeviceBuf ropeSinTable; + OwnedDeviceBuf ropeFreqsBuf; + int ropeNumPairs; + int ropeNumKVHeads; + + TransformerAttentionBlock() = delete; + TransformerAttentionBlock(const TransformerAttentionBlock&) = delete; + TransformerAttentionBlock& operator=(const TransformerAttentionBlock&) = delete; + + TransformerAttentionBlock( + CudaHandles* cudaHandles, + const TransformerAttentionDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + numHeads(desc->numHeads), + numKVHeads(desc->numKVHeads), + qHeadDim(desc->qHeadDim), + vHeadDim(desc->vHeadDim), + useRope(desc->useRope), + learnableRope(desc->learnableRope), + inChannels(desc->qProj.inChannels), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC), + preLN(cudaHandles, &desc->preLN, useFP16), + qProj(cudaHandles, &desc->qProj, useFP16), + kProj(cudaHandles, &desc->kProj, useFP16), + vProj(cudaHandles, &desc->vProj, useFP16), + outProj(cudaHandles, &desc->outProj, useFP16), + ropeNumPairs(0), + ropeNumKVHeads(0) + { + if(!useNHWC) { + throw StringError("Transformer blocks with NCHW layout are not yet supported by the " KATAGO_GPU_BACKEND_NAME " backend"); + } + if(useRope) { + ropeNumPairs = qHeadDim / 2; + ropeNumKVHeads = numKVHeads; + if(learnableRope) { + // Table-free: upload the tiny per-head frequencies (FP32) and recompute cos/sin in-kernel. + // Avoids the numKVHeads-times-larger cos/sin table that otherwise spills L2 (see kernel comment). + testAssert(desc->ropeFreqs.size() == (size_t)(numKVHeads * ropeNumPairs * 2)); + CudaUtils::mallocAndCopyToDevice(name + ":ropeFreqs", desc->ropeFreqs.data(), (int)desc->ropeFreqs.size(), ropeFreqsBuf.buf, false); + } + else { + int seqLen = nnXLen * nnYLen; + vector cosTableData; + vector sinTableData; + desc->computeRopeCosSin(nnXLen, nnYLen, seqLen, cosTableData, sinTableData); + CudaUtils::mallocAndCopyToDevice(name + ":ropeCos", cosTableData.data(), (int)cosTableData.size(), ropeCosTable.buf, useFP16); + CudaUtils::mallocAndCopyToDevice(name + ":ropeSin", sinTableData.data(), (int)sinTableData.size(), ropeSinTable.buf, useFP16); + } + } + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + (void)cudaHandles; + (void)batchSize; + return 0; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* trunkBuf, + void* trunkScratchBuf, + void* maskBuf, + float* maskSumBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + (void)maskSumBuf; + + int seqLen = nnXLen * nnYLen; + int qTotalDim = numHeads * qHeadDim; + int kTotalDim = numKVHeads * qHeadDim; + int vTotalDim = numKVHeads * vHeadDim; + + // NHWC: trunk is [N, XY, C]. RMSNorm + mask zeroing. + preLN.apply(cudaHandles, batchSize, seqLen, trunkBuf, trunkScratchBuf, maskBuf); + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(KATAGO_GPU_BACKEND_NAME " Attn RMSNorm out", trunkScratchBuf, batchSize, inChannels, seqLen, usingNHWC, usingFP16, maskBuf); +#endif + + // Step 2: Q/K/V projections + // trunkScratchBuf is [N, XY, C] NHWC = [C, N*seqLen] column-major. + // MatMulLayer expects input as [inChannels, batchSize], which matches. + int matBatchSize = batchSize * seqLen; + + //Every transient buffer here is sized by max batch size rather than the actual batch size. + //SimpleAllocator pools by exact byte size and never frees, so sizing by the actual batch size + //would retain a separate allocation for every distinct batch size ever seen, which costs + //O(maxBatchSize) times more memory than reusing one max-sized allocation. + SizedBuf qBuf(scratch->allocator, scratch->getBufSizeXY(qTotalDim)); + SizedBuf kBuf(scratch->allocator, scratch->getBufSizeXY(kTotalDim)); + SizedBuf vBuf(scratch->allocator, scratch->getBufSizeXY(vTotalDim)); + + qProj.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, qBuf.buf, workspaceBuf, workspaceBytes); + kProj.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, kBuf.buf, workspaceBuf, workspaceBytes); + vProj.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, vBuf.buf, workspaceBuf, workspaceBytes); + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint2D(KATAGO_GPU_BACKEND_NAME " Attn Q", qBuf.buf, matBatchSize, qTotalDim, usingFP16); +#endif + + // Step 3: Apply RoPE to Q and K + // Q is [qTotalDim, seqLen*batchSize] column-major = [batchSize*seqLen, qTotalDim] row-major + if(useRope) { + if(learnableRope) { + // Table-free recompute path (cos/sin computed in-kernel from ropeFreqsBuf). + if(!usingFP16) { + customCudaApplyRoPELearnableRecompute((float*)qBuf.buf, (const float*)ropeFreqsBuf.buf, + batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); + customCudaApplyRoPELearnableRecompute((float*)kBuf.buf, (const float*)ropeFreqsBuf.buf, + batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); + } + else { + customCudaApplyRoPELearnableRecompute((half*)qBuf.buf, (const float*)ropeFreqsBuf.buf, + batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); + customCudaApplyRoPELearnableRecompute((half*)kBuf.buf, (const float*)ropeFreqsBuf.buf, + batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); + } + } + else { + if(!usingFP16) { + customCudaApplyRoPE((float*)qBuf.buf, (const float*)ropeCosTable.buf, (const float*)ropeSinTable.buf, + batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); + customCudaApplyRoPE((float*)kBuf.buf, (const float*)ropeCosTable.buf, (const float*)ropeSinTable.buf, + batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); + } + else { + customCudaApplyRoPE((half*)qBuf.buf, (const half*)ropeCosTable.buf, (const half*)ropeSinTable.buf, + batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); + customCudaApplyRoPE((half*)kBuf.buf, (const half*)ropeCosTable.buf, (const half*)ropeSinTable.buf, + batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); + } + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + } + +#ifdef KATAGO_GPU_CUDA + // Step 4: Scaled dot-product attention. + // We use cudnn SDPA (FlashAttention-style, fused, no score-matrix materialization) when available + // (FP16 + cudnn >= 8.9.3 + supported GPU). Otherwise fall back to a custom online-softmax CUDA kernel. + // Both paths consume Q/K/V in BSHD layout and produce attnOut in the same layout as expected by outProj: + // attnOut: [numHeads*vHeadDim, seqLen*batchSize] col-major = [batchSize*seqLen, numHeads*vHeadDim] row-major. + + SizedBuf attnOutBuf(scratch->allocator, scratch->getBufSizeXY(numHeads * vHeadDim)); + + bool usedSDPA = false; +#if KATAGO_CUDA_HAS_SDPA + SDPAGraphCache* sdpaCache = cudaHandles->sdpaCache.get(); + // Report once if cudaDisableGraphSDPA is the only reason we are not taking the cudnn graph SDPA path, + // i.e. FP16 and a still-enabled cache are available so SDPA would otherwise have been used. + if(usingFP16 && sdpaCache != NULL && sdpaCache->sdpaSupported && cudaHandles->cudaDisableGraphSDPA && !cudaHandles->loggedGraphSDPADisabled) { + cudaHandles->loggedGraphSDPADisabled = true; + if(cudaHandles->logger != NULL) + cudaHandles->logger->write( + "Cuda backend: cudaDisableGraphSDPA is set, using the custom attention kernel instead of the cudnn graph SDPA path that would otherwise have been used"); + } + if(usingFP16 && sdpaCache != NULL && !cudaHandles->cudaDisableGraphSDPA) { + bool hasMask = (maskBuf != NULL); + SDPAGraphKey sdpaKey = {numHeads, numKVHeads, qHeadDim, vHeadDim, seqLen, batchSize, hasMask, usingFP16}; + auto plan = sdpaCache->getOrBuildPlan(cudaHandles->cudnn, sdpaKey, cudaHandles->logger, cudaHandles->isWarmup); + if(plan != nullptr) { + std::unordered_map variant_pack = { + {SDPAPlanForBatchSize::Q_UID, qBuf.buf}, + {SDPAPlanForBatchSize::K_UID, kBuf.buf}, + {SDPAPlanForBatchSize::V_UID, vBuf.buf}, + {SDPAPlanForBatchSize::O_UID, attnOutBuf.buf}, + }; + + // When a mask is present, materialize a [B, 1, S, S] additive bias: bias[b,q,k] = (mask[b,k] != 0 ? 0 : -3e4). + // For our test model (B=16, S=361) this is ~4 MB; the bias only depends on the mask, but + // we rebuild it per attention block for simplicity (the mask kernel itself is cheap). + SizedBuf biasBuf(scratch->allocator, hasMask ? scratch->getBufSizeXY(seqLen) : 1); + if(hasMask) { + customCudaMaskToAttnBiasFull((const half*)maskBuf, (half*)biasBuf.buf, batchSize, seqLen); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + variant_pack[SDPAPlanForBatchSize::BIAS_UID] = biasBuf.buf; + } + + // Workspace from cudnn (separate from the conv workspace - different shape and lifetime). + SizedBuf sdpaWs(scratch->allocator, (size_t)plan->workspaceBytes); + + auto status = plan->graph->execute(cudaHandles->cudnn, variant_pack, sdpaWs.buf); + if(status.is_bad()) { + string reason = string("cudnn SDPA execute failed: ") + status.get_message(); + // During warmup we tolerate this: disable SDPA from here on and fall through to the custom + // kernel. Outside of warmup a failure here is fatal - the plan was already validated and + // built, so an execute failure means something is genuinely wrong. + if(!cudaHandles->isWarmup) + throw StringError(reason); + sdpaCache->sdpaSupported = false; + sdpaCache->disableReason = reason; + if(cudaHandles->logger != NULL) + cudaHandles->logger->write("Cuda backend: disabling cudnn SDPA and falling back to custom attention kernel: " + reason); + } + else { + usedSDPA = true; + } + } + } +#endif +#else // KATAGO_GPU_HIP + // Step 4: Scaled dot-product attention. When enabled and available, try the CK FMHA fused path + // first (only supports FP16, matching the CUDA backend's cudnn-frontend SDPA path, which is + // also FP16-only). Otherwise, or if CK reports the shape/traits as unsupported at runtime, + // fall back to the plain online-softmax kernel, which is fully adequate at KataGo's sequence + // lengths. + SizedBuf attnOutBuf(scratch->allocator, scratch->getBufSizeXY(numHeads * vHeadDim)); + + bool usedSDPA = false; +#if KATAGO_ROCM_HAS_CK_FMHA && KATAGO_ROCM_CK_FMHA_ARCH_OK + if(usingFP16 && !cudaHandles->disableFusedAttention && + cudaHandles->ckFmhaArchSupported && !cudaHandles->fusedAttentionRuntimeDisabled) { + bool hasMask = (maskBuf != NULL); + + // CK's fused path takes a pre-materialized additive bias rather than a raw per-position + // mask, so build a [B, S, S] bias broadcast over heads, matching what the CUDA backend does + // for its cudnn-frontend graph SDPA path. + SizedBuf biasBuf(scratch->allocator, hasMask ? scratch->getBufSizeXY(seqLen) : 1); + if(hasMask) { + customCudaMaskToAttnBiasFull((const half*)maskBuf, (half*)biasBuf.buf, batchSize, seqLen); + CUDA_ERR(name.c_str(), hipPeekAtLastError()); + } + + fmha_fwd_traits traits; + traits.hdim_q = qHeadDim; + traits.hdim_v = vHeadDim; + traits.data_type = "fp16"; + traits.is_group_mode = false; + traits.is_v_rowmajor = true; + traits.has_logits_soft_cap = false; + traits.mask_type = mask_enum::no_mask; + traits.bias_type = hasMask ? bias_enum::elementwise_bias : bias_enum::no_bias; + traits.has_lse = false; + traits.has_dropout = false; + traits.qscale_type = quant_scale_enum::no_scale; + traits.skip_min_seqlen_q = false; + traits.has_sink = false; + + // Physical layout for Q/K/V/O is [N, S, H, D] (i_perm=false, o_perm=false), V is row-major + // ([N, S, H, Dv], is_v_rowmajor=true) - all matching the BSHD buffers MatMulLayer produces. + // Value-initialized so the fields not assigned below (e.g. the batch-mode cu_seqlen + // pointers) are null/zero. Not memset: args contains a std::variant member, which raw + // byte-zeroing may not legally overwrite. + fmha_fwd_args args{}; + args.q_ptr = qBuf.buf; + args.k_ptr = kBuf.buf; + args.v_ptr = vBuf.buf; + args.bias_ptr = hasMask ? biasBuf.buf : nullptr; + args.o_ptr = attnOutBuf.buf; + args.seqlen_q = seqLen; + args.seqlen_k = seqLen; + args.batch = batchSize; + args.max_seqlen_q = seqLen; + args.hdim_q = qHeadDim; + args.hdim_v = vHeadDim; + args.nhead_q = numHeads; + args.nhead_k = numKVHeads; + args.scale_s = 1.0f / sqrtf((float)qHeadDim); + args.logits_soft_cap = 0.0f; + args.stride_q = (ck_tile::index_t)numHeads * qHeadDim; + args.stride_k = (ck_tile::index_t)numKVHeads * qHeadDim; + args.stride_v = (ck_tile::index_t)numKVHeads * vHeadDim; + args.stride_bias = hasMask ? seqLen : 0; + args.stride_o = (ck_tile::index_t)numHeads * vHeadDim; + args.nhead_stride_q = qHeadDim; + args.nhead_stride_k = qHeadDim; + args.nhead_stride_v = vHeadDim; + args.nhead_stride_bias = 0; // broadcast the bias over heads + args.nhead_stride_o = vHeadDim; + args.batch_stride_q = (ck_tile::index_t)numHeads * seqLen * qHeadDim; + args.batch_stride_k = (ck_tile::index_t)numKVHeads * seqLen * qHeadDim; + args.batch_stride_v = (ck_tile::index_t)numKVHeads * seqLen * vHeadDim; + args.batch_stride_bias = hasMask ? (ck_tile::index_t)seqLen * seqLen : 0; + args.batch_stride_o = (ck_tile::index_t)numHeads * seqLen * vHeadDim; + args.window_size_left = -1; + args.window_size_right = -1; + args.mask_type = static_cast(mask_enum::no_mask); + args.min_seqlen_q = 0; + args.p_drop = 0.0f; + args.s_randval = false; + args.drop_seed_offset = std::pair{0, 0}; + + // fmha_fwd returns a negative value if no generated kernel supports this shape/config. + // ck_tile can also throw (std::runtime_error) if a kernel launch itself fails - e.g. a + // device that slipped past the arch gating with no compiled code object. Either way, + // permanently fall back to the plain attention kernel for this handle so we don't pay for + // the attempt (or the bias materialization above) again on every batch. + float ckResult = -1.0f; + string ckFailure; + try { + ckResult = fmha_fwd(traits, args, ck_tile::stream_config{}); + } + catch(const std::exception& e) { + ckFailure = e.what(); + } + if(ckResult >= 0.0f) { + usedSDPA = true; + } + else { + cudaHandles->fusedAttentionRuntimeDisabled = true; + if(cudaHandles->logger != NULL) { + cudaHandles->logger->write( + "ROCm backend: CK fused attention unavailable" + + (ckFailure.empty() ? string(" (unsupported shape/config)") : (": " + ckFailure)) + + "; using the plain attention kernel instead"); + } + } + } +#endif +#endif + + if(!usedSDPA) { + if(!usingFP16) { + customCudaFlashAttention( + (const float*)qBuf.buf, (const float*)kBuf.buf, (const float*)vBuf.buf, + (const float*)maskBuf, (float*)attnOutBuf.buf, + batchSize, seqLen, numHeads, numKVHeads, qHeadDim, vHeadDim); + } + else { + customCudaFlashAttention( + (const half*)qBuf.buf, (const half*)kBuf.buf, (const half*)vBuf.buf, + (const half*)maskBuf, (half*)attnOutBuf.buf, + batchSize, seqLen, numHeads, numKVHeads, qHeadDim, vHeadDim); + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + } + + // Step 5: Output projection + // attnOutBuf is [numHeads*vHeadDim, seqLen*batchSize] col-major + // outProj maps to [inChannels, seqLen*batchSize] + outProj.apply(cudaHandles, scratch, matBatchSize, attnOutBuf.buf, trunkScratchBuf, workspaceBuf, workspaceBytes); + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(KATAGO_GPU_BACKEND_NAME " Attn outProj", trunkScratchBuf, batchSize, inChannels, seqLen, usingNHWC, usingFP16, maskBuf); +#endif + + // Step 6: Residual addition: trunk += trunkScratch * mask + // NHWC: trunk is [N, XY, C], mask is [N, XY] + if(!usingFP16) { + customCudaMaskedResidualAddNHWC((float*)trunkBuf, (const float*)trunkScratchBuf, (const float*)maskBuf, batchSize, seqLen, inChannels); + } + else { + customCudaMaskedResidualAddNHWC((half*)trunkBuf, (const half*)trunkScratchBuf, (const half*)maskBuf, batchSize, seqLen, inChannels); + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(KATAGO_GPU_BACKEND_NAME " Attn residual", trunkBuf, batchSize, inChannels, seqLen, usingNHWC, usingFP16, maskBuf); +#endif + } +}; + +//------------------------------------------------------------------------------ + +struct TransformerFFNBlock { + const string name; + const int numChannels; + const int ffnChannels; + const bool useSwiGLU; + + const int nnXLen; + const int nnYLen; + const bool usingFP16; + const bool usingNHWC; + + const TransformerRMSNormLayer preLN; + const MatMulLayer linear1; + std::unique_ptr linearGate; + const MatMulLayer linear2; + + TransformerFFNBlock() = delete; + TransformerFFNBlock(const TransformerFFNBlock&) = delete; + TransformerFFNBlock& operator=(const TransformerFFNBlock&) = delete; + + TransformerFFNBlock( + CudaHandles* cudaHandles, + const TransformerFFNDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + numChannels(desc->numChannels), + ffnChannels(desc->ffnChannels), + useSwiGLU(desc->useSwiGLU), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC), + preLN(cudaHandles, &desc->preLN, useFP16), + linear1(cudaHandles, &desc->linear1, useFP16), + linear2(cudaHandles, &desc->linear2, useFP16) + { + if(!useSwiGLU) { + throw StringError("Non-SwiGLU transformer FFN is not yet supported in " KATAGO_GPU_BACKEND_NAME " backend"); + } + linearGate = std::make_unique(cudaHandles, &desc->linearGate, useFP16); + if(!useNHWC) { + throw StringError("Transformer blocks with NCHW layout are not yet supported by the " KATAGO_GPU_BACKEND_NAME " backend"); + } + } + + ~TransformerFFNBlock() + {} + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + (void)cudaHandles; + (void)batchSize; + return 0; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* trunkBuf, + void* trunkScratchBuf, + void* maskBuf, + float* maskSumBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + (void)maskSumBuf; + + int seqLen = nnXLen * nnYLen; + int matBatchSize = batchSize * seqLen; + + // Step 1: RMSNorm + preLN.apply(cudaHandles, batchSize, seqLen, trunkBuf, trunkScratchBuf, maskBuf); + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(KATAGO_GPU_BACKEND_NAME " FFN RMSNorm out", trunkScratchBuf, batchSize, numChannels, seqLen, usingNHWC, usingFP16, maskBuf); +#endif + + // Step 2: linear1 projection + //Max-batch-sized. See the scratch-sizing note at the attention q/k/v buffers. + SizedBuf ffnBuf(scratch->allocator, scratch->getBufSizeXY(ffnChannels)); + linear1.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, ffnBuf.buf, workspaceBuf, workspaceBytes); + + // Step 3: SwiGLU + { + //Max-batch-sized. See the scratch-sizing note at the attention q/k/v buffers. + SizedBuf gateBuf(scratch->allocator, scratch->getBufSizeXY(ffnChannels)); + linearGate->apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, gateBuf.buf, workspaceBuf, workspaceBytes); + + if((size_t)ffnChannels * (size_t)matBatchSize >= (size_t)2147483647) + throw StringError(KATAGO_GPU_BACKEND_NAME " SwiGLU element count exceeds the 32-bit index limit used by the kernel"); + int totalSize = (int)((size_t)ffnChannels * matBatchSize); + if(!usingFP16) { + customCudaSwiGLU((const float*)ffnBuf.buf, (const float*)gateBuf.buf, (float*)ffnBuf.buf, totalSize); + } + else { + customCudaSwiGLU((const half*)ffnBuf.buf, (const half*)gateBuf.buf, (half*)ffnBuf.buf, totalSize); + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + } + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint2D(KATAGO_GPU_BACKEND_NAME " FFN SwiGLU", ffnBuf.buf, matBatchSize, ffnChannels, usingFP16); +#endif + + // Step 4: linear2 projection back to trunk channels + linear2.apply(cudaHandles, scratch, matBatchSize, ffnBuf.buf, trunkScratchBuf, workspaceBuf, workspaceBytes); + + // Step 5: Residual addition: trunk += trunkScratch * mask + if(!usingFP16) { + customCudaMaskedResidualAddNHWC((float*)trunkBuf, (const float*)trunkScratchBuf, (const float*)maskBuf, batchSize, seqLen, numChannels); + } + else { + customCudaMaskedResidualAddNHWC((half*)trunkBuf, (const half*)trunkScratchBuf, (const half*)maskBuf, batchSize, seqLen, numChannels); + } + CUDA_ERR(name.c_str(), cudaPeekAtLastError()); + +#ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(KATAGO_GPU_BACKEND_NAME " FFN residual", trunkBuf, batchSize, numChannels, seqLen, usingNHWC, usingFP16, maskBuf); +#endif + } +}; + +//------------------------------------------------------------------------------ + +BlockStack::BlockStack( + CudaHandles* cudaHandles, + CudnnManager* manager, + int nBlocks, + int trunkChannels, + const std::vector>& descBlocks, + int nnX, + int nnY, + bool useFP16, + bool useNHWC +) : + numBlocks(nBlocks), + trunkNumChannels(trunkChannels), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC) +{ + testAssert(numBlocks == descBlocks.size()); + for(int i = 0; irequiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + } + else if(blocks[i].first == GLOBAL_POOLING_BLOCK_KIND) { + GlobalPoolingResidualBlock* block = (GlobalPoolingResidualBlock*)blocks[i].second.get(); + b = block->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + } + else if(blocks[i].first == NESTED_BOTTLENECK_BLOCK_KIND) { + NestedBottleneckResidualBlock* block = (NestedBottleneckResidualBlock*)blocks[i].second.get(); + b = block->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + } + else if(blocks[i].first == TRANSFORMER_ATTENTION_BLOCK_KIND) { + TransformerAttentionBlock* block = (TransformerAttentionBlock*)blocks[i].second.get(); + b = block->requiredWorkspaceBytes(cudaHandles, batchSize); + bytes = std::max(bytes, b); + } + else if(blocks[i].first == TRANSFORMER_FFN_BLOCK_KIND) { + TransformerFFNBlock* block = (TransformerFFNBlock*)blocks[i].second.get(); + b = block->requiredWorkspaceBytes(cudaHandles, batchSize); + bytes = std::max(bytes, b); + } + else { + ASSERT_UNREACHABLE; + } + } + return bytes; +} + +void BlockStack::apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* maskBuf, + float* maskSumBuf, + void* trunkBuf, + void* trunkScratchBuf, + void* workspaceBuf, + size_t workspaceBytes +) const { + + for(int i = 0; iapply( + cudaHandles, + scratch, + batchSize, + trunkBuf, + trunkScratchBuf, + maskBuf, + workspaceBuf, + workspaceBytes + ); + } + else if(blocks[i].first == GLOBAL_POOLING_BLOCK_KIND) { + GlobalPoolingResidualBlock* block = (GlobalPoolingResidualBlock*)blocks[i].second.get(); + block->apply( + cudaHandles, + scratch, + batchSize, + trunkBuf, + trunkScratchBuf, + maskBuf, + maskSumBuf, + workspaceBuf, + workspaceBytes + ); + } + else if(blocks[i].first == NESTED_BOTTLENECK_BLOCK_KIND) { + NestedBottleneckResidualBlock* block = (NestedBottleneckResidualBlock*)blocks[i].second.get(); + block->apply( + cudaHandles, + scratch, + batchSize, + trunkBuf, + trunkScratchBuf, + maskBuf, + maskSumBuf, + workspaceBuf, + workspaceBytes + ); + } + else if(blocks[i].first == TRANSFORMER_ATTENTION_BLOCK_KIND) { + TransformerAttentionBlock* block = (TransformerAttentionBlock*)blocks[i].second.get(); + block->apply( + cudaHandles, + scratch, + batchSize, + trunkBuf, + trunkScratchBuf, + maskBuf, + maskSumBuf, + workspaceBuf, + workspaceBytes + ); + } + else if(blocks[i].first == TRANSFORMER_FFN_BLOCK_KIND) { + TransformerFFNBlock* block = (TransformerFFNBlock*)blocks[i].second.get(); + block->apply( + cudaHandles, + scratch, + batchSize, + trunkBuf, + trunkScratchBuf, + maskBuf, + maskSumBuf, + workspaceBuf, + workspaceBytes + ); + } + else { + ASSERT_UNREACHABLE; + } + } +} +//------------------------------------------------------------------------------ + +struct SGFMetadataEncoder { + const string name; + + const bool usingFP16; + + const MatMulLayer mul1; + const MatBiasLayer bias1; + const MatMulLayer mul2; + const MatBiasLayer bias2; + const MatMulLayer mul3; + + SGFMetadataEncoder() = delete; + SGFMetadataEncoder(const SGFMetadataEncoder&) = delete; + SGFMetadataEncoder& operator=(const SGFMetadataEncoder&) = delete; + + SGFMetadataEncoder( + CudaHandles* cudaHandles, + const SGFMetadataEncoderDesc* desc, + bool useFP16 + ) : + name(desc->name), + usingFP16(useFP16), + mul1(cudaHandles,&desc->mul1,useFP16), + bias1(cudaHandles,&desc->bias1,useFP16,desc->act1.activation), + mul2(cudaHandles,&desc->mul2,useFP16), + bias2(cudaHandles,&desc->bias2,useFP16,desc->act2.activation), + mul3(cudaHandles,&desc->mul3,useFP16) + { + } + + ~SGFMetadataEncoder() + { + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + (void)batchSize; + size_t bytes = 0; + size_t b; + + b = mul1.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = mul2.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = mul3.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* inputBuf, + void* outputBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + SizedBuf internalBuf1(scratch->allocator, scratch->getBufSizeFloat(std::max(mul1.outChannels,mul2.outChannels))); + SizedBuf internalBuf2(scratch->allocator, scratch->getBufSizeFloat(std::max(mul1.outChannels,mul2.outChannels))); + + mul1.apply(cudaHandles,scratch,batchSize,inputBuf,internalBuf1.buf,workspaceBuf,workspaceBytes); + bias1.apply(cudaHandles,batchSize,internalBuf1.buf); + mul2.apply(cudaHandles,scratch,batchSize,internalBuf1.buf,internalBuf2.buf,workspaceBuf,workspaceBytes); + bias2.apply(cudaHandles,batchSize,internalBuf2.buf); + mul3.apply(cudaHandles,scratch,batchSize,internalBuf2.buf,outputBuf,workspaceBuf,workspaceBytes); + } + +}; + + +//---------------------------------------------------------------------------- + +struct Trunk { + const string name; + const int modelVersion; + const int numBlocks; + const int trunkNumChannels; + + const int nnXLen; + const int nnYLen; + const bool usingFP16; + const bool usingNHWC; +#ifdef KATAGO_GPU_HIP + // MIOpen (unlike cuDNN) requires the input and output tensors of a convolution to share one + // layout, so when the layout the CPU wrote the input in differs from the layout the model runs + // in, the input is converted on-device before the initial convolution (see apply). + const bool inputsRequireLayoutConversion; +#endif + + std::unique_ptr initialConv; + std::unique_ptr initialMatMul; + std::unique_ptr sgfMetadataEncoder; + const BlockStack blocks; + const int trunkNormKind; + std::unique_ptr trunkTipBN; + std::unique_ptr trunkTipRMSNorm; + + Trunk() = delete; + Trunk(const Trunk&) = delete; + Trunk& operator=(const Trunk&) = delete; + + Trunk( + CudaHandles* cudaHandles, + CudnnManager* manager, + const TrunkDesc* desc, + int nnX, + int nnY, + bool inputsUseNHWC, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + modelVersion(desc->modelVersion), + numBlocks(desc->numBlocks), + trunkNumChannels(desc->trunkNumChannels), + nnXLen(nnX), + nnYLen(nnY), + usingFP16(useFP16), + usingNHWC(useNHWC), +#ifdef KATAGO_GPU_HIP + inputsRequireLayoutConversion(inputsUseNHWC != useNHWC), +#endif + blocks(cudaHandles,manager,desc->numBlocks,desc->trunkNumChannels,desc->blocks,nnX,nnY,useFP16,useNHWC), + trunkNormKind(desc->trunkNormKind) + { + int midNumChannels = desc->midNumChannels; + int regularNumChannels = desc->regularNumChannels; + int gpoolNumChannels = desc->gpoolNumChannels; + + int maxBatchSize = manager->maxBatchSize; + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,trunkNumChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,midNumChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,regularNumChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,gpoolNumChannels); + +#ifdef KATAGO_GPU_CUDA + initialConv = std::make_unique(cudaHandles,manager,&desc->initialConv,useFP16,inputsUseNHWC,useNHWC); +#else // KATAGO_GPU_HIP + // The initial conv's input descriptor uses the model's layout, not the CPU-side input layout: + // if the two differ, apply() converts the input on-device first (MIOpen cannot do the + // conversion inside the convolution the way cuDNN does with mixed input/output descriptors). + initialConv = std::make_unique(cudaHandles,manager,&desc->initialConv,useFP16,useNHWC,useNHWC); +#endif + initialMatMul = std::make_unique(cudaHandles,&desc->initialMatMul,useFP16); + if(desc->metaEncoderVersion > 0) { + sgfMetadataEncoder = std::make_unique(cudaHandles,&desc->sgfMetadataEncoder,useFP16); + testAssert(sgfMetadataEncoder->mul3.outChannels == initialMatMul->outChannels); + } + + if(desc->trunkNormKind == TRUNK_NORM_KIND_STANDARD) { + trunkTipBN = std::make_unique(cudaHandles,&desc->trunkTipBN,&desc->trunkTipActivation,nnXLen,nnYLen,useFP16,useNHWC); + } + else if(desc->trunkNormKind == TRUNK_NORM_KIND_RMSNORM) { + trunkTipRMSNorm = std::make_unique(cudaHandles,&desc->trunkTipRMSNorm,desc->trunkTipActivation.activation,nnXLen,nnYLen,useFP16,useNHWC); + } + else { + throw StringError("Unsupported trunk norm kind: " + Global::intToString(desc->trunkNormKind)); + } + testAssert(desc->blocks.size() == numBlocks); + } + + ~Trunk() + { + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + + b = initialConv->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + + b = initialMatMul->requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + + if(sgfMetadataEncoder != nullptr) { + b = sgfMetadataEncoder->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + } + + b = blocks.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* inputBuf, + void* inputGlobalBuf, + void* inputMetaBuf, + void* maskBuf, + float* maskSumBuf, + void* trunkBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + + SizedBuf trunkScratch(scratch->allocator, scratch->getBufSizeXY(trunkNumChannels)); + +#ifdef KATAGO_GPU_CUDA + //Feed the conv into trunkScratch.buf, not trunkBuf + initialConv->apply(cudaHandles,scratch,batchSize,false,inputBuf,trunkScratch.buf,workspaceBuf,workspaceBytes); +#else // KATAGO_GPU_HIP + // Convert the input tensor to the model's layout if the CPU wrote it in the other one. + // Every other consumer of inputBuf (mask extraction) is layout-independent, so only the + // initial conv's input needs this. See inputsRequireLayoutConversion. + SizedBuf inputConverted( + scratch->allocator, + inputsRequireLayoutConversion ? scratch->getBufSizeXY(initialConv->inChannels) : 1); + void* initialConvInput = inputBuf; + if(inputsRequireLayoutConversion) { + int inChannels = initialConv->inChannels; + int xySize = nnXLen * nnYLen; + if(usingNHWC) { + if(!usingFP16) + customCudaCopyNCHWtoNHWC((const float*)inputBuf,(float*)inputConverted.buf,batchSize,inChannels,xySize); + else + customCudaCopyNCHWtoNHWC((const half*)inputBuf,(half*)inputConverted.buf,batchSize,inChannels,xySize); + } + else { + if(!usingFP16) + customCudaCopyNHWCtoNCHW((const float*)inputBuf,(float*)inputConverted.buf,batchSize,inChannels,xySize); + else + customCudaCopyNHWCtoNCHW((const half*)inputBuf,(half*)inputConverted.buf,batchSize,inChannels,xySize); + } + CUDA_ERR(name.c_str(),hipPeekAtLastError()); + initialConvInput = inputConverted.buf; + } + + //Feed the conv into trunkScratch.buf, not trunkBuf + initialConv->apply(cudaHandles,scratch,batchSize,false,initialConvInput,trunkScratch.buf,workspaceBuf,workspaceBytes); +#endif + + #ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("After initial conv"), trunkScratch.buf, batchSize, trunkNumChannels, nnXLen*nnYLen, usingNHWC, usingFP16); + #endif + + //Feed the matmul into trunkBuf + initialMatMul->apply(cudaHandles,scratch,batchSize,inputGlobalBuf,trunkBuf,workspaceBuf,workspaceBytes); + //Then accumulate it into trunkScratch.buf, broadcasting during the process + if(!usingFP16) { + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); + } + else { + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); + } + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + + if(sgfMetadataEncoder != nullptr) { + testAssert(inputMetaBuf != NULL); + //Feed the result into trunkBuf + sgfMetadataEncoder->apply(cudaHandles,scratch,batchSize,inputMetaBuf,trunkBuf,workspaceBuf,workspaceBytes); + //Then accumulate it into trunkScratch.buf, broadcasting during the process + if(!usingFP16) { + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); + } + else { + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); + } + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + } + else { + testAssert(inputMetaBuf == NULL); + } + + //Flip trunkBuf and trunkScratch.buf so that the result gets accumulated in trunkScratch.buf + blocks.apply( + cudaHandles, + scratch, + batchSize, + maskBuf, + maskSumBuf, + trunkScratch.buf, + trunkBuf, + workspaceBuf, + workspaceBytes + ); + + //And now with the final norm port it from trunkScratch.buf to trunkBuf. + if(trunkNormKind == TRUNK_NORM_KIND_STANDARD) { + trunkTipBN->apply(cudaHandles,batchSize,trunkScratch.buf,maskBuf,trunkBuf); + } + else { + trunkTipRMSNorm->apply(cudaHandles,scratch,batchSize,trunkScratch.buf,trunkBuf,maskBuf,maskSumBuf); + } + + #ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("Trunk tip"), trunkBuf, batchSize, trunkNumChannels, nnXLen*nnYLen, usingNHWC, usingFP16); + #endif + } + +}; + +//------------------------------------------------------------------------------ + +static void fillMaskFloatBufAndMaskSumBuf(void* maskBuf, float*& maskFloatBuf, float*& maskSumBuf, bool usingFP16, int batchSize, int nnXLen, int nnYLen) { + if(!usingFP16) { + maskFloatBuf = (float*)maskBuf; + customCudaPoolRowsSumNCHW((const float*)maskFloatBuf,maskSumBuf,batchSize,1,nnXLen*nnYLen,1.0); + CUDA_ERR("sumMask",cudaPeekAtLastError()); + } + else { + customCudaCopyFromHalf((const half*)maskBuf,maskFloatBuf,batchSize*nnXLen*nnYLen); + CUDA_ERR("copyMaskFromHalf",cudaPeekAtLastError()); + customCudaPoolRowsSumNCHW((const float*)maskFloatBuf,maskSumBuf,batchSize,1,nnXLen*nnYLen,1.0); + CUDA_ERR("sumMask",cudaPeekAtLastError()); + } +} + + +//------------------------------------------------------------------------------ + +struct PolicyHead { + const string name; + const int modelVersion; + const int nnXLen; + const int nnYLen; + const int p1Channels; + const int g1Channels; + const int p2Channels; + const bool usingFP16; + const bool usingNHWC; + + const ConvLayer p1Conv; + const ConvLayer g1Conv; + const BatchNormLayer g1BN; + const MatMulLayer gpoolToBiasMul; + const BatchNormLayer p1BN; + const ConvLayer p2Conv; + const MatMulLayer gpoolToPassMul; + const MatBiasLayer gpoolToPassBias; + const MatMulLayer gpoolToPassMul2; + + PolicyHead() = delete; + PolicyHead(const PolicyHead&) = delete; + PolicyHead& operator=(const PolicyHead&) = delete; + + PolicyHead( + CudaHandles* cudaHandles, + CudnnManager* manager, + const PolicyHeadDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + modelVersion(desc->modelVersion), + nnXLen(nnX), + nnYLen(nnY), + p1Channels(desc->p1Conv.outChannels), + g1Channels(desc->g1Conv.outChannels), + p2Channels(desc->p2Conv.outChannels), + usingFP16(useFP16), + usingNHWC(useNHWC), + p1Conv(cudaHandles,manager,&desc->p1Conv,useFP16,useNHWC), + g1Conv(cudaHandles,manager,&desc->g1Conv,useFP16,useNHWC), + g1BN(cudaHandles,&desc->g1BN,&desc->g1Activation,nnX,nnY,useFP16,useNHWC), + gpoolToBiasMul(cudaHandles,&desc->gpoolToBiasMul,false), + p1BN(cudaHandles,&desc->p1BN,&desc->p1Activation,nnX,nnY,false,useNHWC), + p2Conv(cudaHandles,manager,&desc->p2Conv,false,useNHWC), + gpoolToPassMul(cudaHandles,&desc->gpoolToPassMul,false), + gpoolToPassBias(cudaHandles,&desc->gpoolToPassBias,false,desc->passActivation.activation), + gpoolToPassMul2(cudaHandles,&desc->gpoolToPassMul2,false) + { + } + + ~PolicyHead() + { + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + + b = p1Conv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = g1Conv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = gpoolToBiasMul.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = p2Conv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = gpoolToPassMul.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = gpoolToPassMul2.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = sizeof(float)*batchSize*g1Channels*nnXLen*nnYLen; + bytes = std::max(bytes,b); + + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* maskBuf, + float* maskFloatBuf, + float* maskSumBuf, + void* trunkBuf, + float* policyPassBuf, + float* policyBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + + SizedBuf p1Out(scratch->allocator, scratch->getBufSizeXYFloat(p1Channels)); //Need to hold floats, not just halfs + SizedBuf p1Out2(scratch->allocator, scratch->getBufSizeXYFloat(p1Channels)); //Need to hold floats, not just halfs + SizedBuf g1Out(scratch->allocator, scratch->getBufSizeXY(g1Channels)); + SizedBuf g1Out2(scratch->allocator, scratch->getBufSizeXY(g1Channels)); + SizedBuf g1Concat(scratch->allocator, scratch->getBufSizeFloat(g1Channels*3)); + SizedBuf g1Bias(scratch->allocator, scratch->getBufSizeFloat(p1Channels)); + SizedBuf p1Pass(scratch->allocator, scratch->getBufSizeFloat(p1Channels)); + + p1Conv.apply(cudaHandles,scratch,batchSize,false,trunkBuf,p1Out.buf,workspaceBuf,workspaceBytes); + g1Conv.apply(cudaHandles,scratch,batchSize,false,trunkBuf,g1Out.buf,workspaceBuf,workspaceBytes); + g1BN.apply(cudaHandles,batchSize,g1Out.buf,maskBuf,g1Out2.buf); + + if(!usingFP16) { + if(!usingNHWC) + customCudaPoolRowsGPoolNCHW((const float*)g1Out2.buf,(float*)g1Concat.buf,batchSize,g1Channels,nnXLen*nnYLen,maskFloatBuf,maskSumBuf); + else + customCudaPoolRowsGPoolNHWC((const float*)g1Out2.buf,(float*)g1Concat.buf,batchSize,nnXLen*nnYLen,g1Channels,maskFloatBuf,maskSumBuf); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + } + else { + customCudaCopyFromHalf((const half*)g1Out2.buf,(float*)workspaceBuf,batchSize*g1Channels*nnXLen*nnYLen); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + if(!usingNHWC) + customCudaPoolRowsGPoolNCHW((const float*)workspaceBuf,(float*)g1Concat.buf,batchSize,g1Channels,nnXLen*nnYLen,maskFloatBuf,maskSumBuf); + else + customCudaPoolRowsGPoolNHWC((const float*)workspaceBuf,(float*)g1Concat.buf,batchSize,nnXLen*nnYLen,g1Channels,maskFloatBuf,maskSumBuf); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + } + + gpoolToBiasMul.apply(cudaHandles,scratch,batchSize,g1Concat.buf,g1Bias.buf,workspaceBuf,workspaceBytes); + + #ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("p1 pre-gpool-sum"), p1Out.buf, batchSize, p1Channels, nnXLen*nnYLen, usingNHWC, usingFP16); + CudaUtils::debugPrint3D(string("g1 pre-gpool"), g1Out.buf, batchSize, g1Channels, nnXLen*nnYLen, usingNHWC, usingFP16); + CudaUtils::debugPrint2D(string("g1 pooled"), g1Concat.buf, batchSize, g1Channels*3, false); + CudaUtils::debugPrint2D(string("g1 biases"), g1Bias.buf, batchSize, p1Channels, false); + #endif + + float* p1OutBufA; + float* p1OutBufB; + if(!usingFP16) { + p1OutBufA = (float*)p1Out.buf; + p1OutBufB = (float*)p1Out2.buf; + } + else { + customCudaCopyFromHalf((const half*)p1Out.buf,(float*)p1Out2.buf,batchSize*p1Channels*nnXLen*nnYLen); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + p1OutBufA = (float*)p1Out2.buf; + p1OutBufB = (float*)p1Out.buf; + } + + if(!usingNHWC) + customCudaAddNCBiasInplaceNCHW(p1OutBufA,(float*)g1Bias.buf,batchSize,p1Channels,nnXLen*nnYLen); + else + customCudaAddNCBiasInplaceNHWC(p1OutBufA,(float*)g1Bias.buf,batchSize,nnXLen*nnYLen,p1Channels); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + + p1BN.apply(cudaHandles,batchSize,p1OutBufA,maskFloatBuf,p1OutBufB); + p2Conv.apply(cudaHandles,scratch,batchSize,false,p1OutBufB,(float*)policyBuf,workspaceBuf,workspaceBytes); + + if(modelVersion >= 15) { + gpoolToPassMul.apply(cudaHandles,scratch,batchSize,g1Concat.buf,p1Pass.buf,workspaceBuf,workspaceBytes); + gpoolToPassBias.apply(cudaHandles,batchSize,p1Pass.buf); + gpoolToPassMul2.apply(cudaHandles,scratch,batchSize,p1Pass.buf,policyPassBuf,workspaceBuf,workspaceBytes); + } + else { + gpoolToPassMul.apply(cudaHandles,scratch,batchSize,g1Concat.buf,policyPassBuf,workspaceBuf,workspaceBytes); + } + + #ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("p1 after-gpool-sum"), p1OutBufA, batchSize, p1Channels, nnXLen*nnYLen, usingNHWC, false); + CudaUtils::debugPrint2D(string("policypass"), policyPassBuf, batchSize, 1, false); + CudaUtils::debugPrint3D(string("policy"), policyBuf, batchSize, p2Channels, nnXLen*nnYLen, usingNHWC, false); + #endif + + } + +}; + +//------------------------------------------------------------------------------ + +struct ValueHead { + const string name; + const int modelVersion; + const int nnXLen; + const int nnYLen; + const int v1Channels; + const int v2Channels; + const int valueChannels; + const int scoreValueChannels; + const int ownershipChannels; + const bool usingFP16; + const bool usingNHWC; + + const ConvLayer v1Conv; + const BatchNormLayer v1BN; + const MatMulLayer v2Mul; + const MatBiasLayer v2Bias; + const MatMulLayer v3Mul; + const MatBiasLayer v3Bias; + const MatMulLayer sv3Mul; + const MatBiasLayer sv3Bias; + const ConvLayer vOwnershipConv; + + ValueHead() = delete; + ValueHead(const ValueHead&) = delete; + ValueHead& operator=(const ValueHead&) = delete; + + ValueHead( + CudaHandles* cudaHandles, + CudnnManager* manager, + const ValueHeadDesc* desc, + int nnX, + int nnY, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + modelVersion(desc->modelVersion), + nnXLen(nnX), + nnYLen(nnY), + v1Channels(desc->v1Conv.outChannels), + v2Channels(desc->v2Mul.outChannels), + valueChannels(desc->v3Mul.outChannels), + scoreValueChannels(desc->sv3Mul.outChannels), + ownershipChannels(desc->vOwnershipConv.outChannels), + usingFP16(useFP16), + usingNHWC(useNHWC), + v1Conv(cudaHandles,manager,&desc->v1Conv,useFP16,useNHWC), + v1BN(cudaHandles,&desc->v1BN,&desc->v1Activation,nnX,nnY,useFP16,useNHWC), + v2Mul(cudaHandles,&desc->v2Mul,false), + v2Bias(cudaHandles,&desc->v2Bias,false,desc->v2Activation.activation), + v3Mul(cudaHandles,&desc->v3Mul,false), + v3Bias(cudaHandles,&desc->v3Bias,false,ACTIVATION_IDENTITY), + sv3Mul(cudaHandles,&desc->sv3Mul,false), + sv3Bias(cudaHandles,&desc->sv3Bias,false,ACTIVATION_IDENTITY), + vOwnershipConv(cudaHandles,manager,&desc->vOwnershipConv,useFP16,useNHWC) + { + } + + ~ValueHead() + { + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + + b = v1Conv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = v2Mul.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = v3Mul.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = sizeof(float)*batchSize*v1Channels*nnXLen*nnYLen; + bytes = std::max(bytes,b); + + b = sv3Mul.requiredWorkspaceBytes(cudaHandles); + bytes = std::max(bytes,b); + b = vOwnershipConv.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = sizeof(float)*batchSize*ownershipChannels*nnXLen*nnYLen; + bytes = std::max(bytes,b); + + return bytes; + } + + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + void* maskBuf, + float* maskSumBuf, + void* trunkBuf, + float* valueBuf, + float* scoreValueBuf, + void* ownershipBuf, + void* workspaceBuf, + size_t workspaceBytes + ) const { + SizedBuf v1Out(scratch->allocator, scratch->getBufSizeXY(v1Channels)); + SizedBuf v1Out2(scratch->allocator, scratch->getBufSizeXY(v1Channels)); + SizedBuf v1Mean(scratch->allocator, scratch->getBufSizeFloat(v1Channels*3)); + SizedBuf v2Out(scratch->allocator, scratch->getBufSizeFloat(v2Channels)); + SizedBuf ownershipScratch(scratch->allocator, scratch->getBufSizeXYFloat(ownershipChannels)); + + v1Conv.apply(cudaHandles,scratch,batchSize,false,trunkBuf,v1Out.buf,workspaceBuf,workspaceBytes); + v1BN.apply(cudaHandles,batchSize,v1Out.buf,maskBuf,v1Out2.buf); + + void* bufToBePooled = v1Out2.buf; + if(usingFP16) { + customCudaCopyFromHalf((const half*)v1Out2.buf,(float*)workspaceBuf,batchSize*v1Channels*nnXLen*nnYLen); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + bufToBePooled = workspaceBuf; + } + + if(!usingNHWC) + customCudaValueHeadPoolNCHW((float*)bufToBePooled,(float*)v1Mean.buf,batchSize,v1Channels,nnXLen*nnYLen,maskSumBuf); + else + customCudaValueHeadPoolNHWC((const float*)bufToBePooled,(float*)v1Mean.buf,batchSize,nnXLen*nnYLen,v1Channels,maskSumBuf); + CUDA_ERR(name.c_str(),cudaPeekAtLastError()); + + v2Mul.apply(cudaHandles,scratch,batchSize,v1Mean.buf,v2Out.buf,workspaceBuf,workspaceBytes); + v2Bias.apply(cudaHandles,batchSize,v2Out.buf); + v3Mul.apply(cudaHandles,scratch,batchSize,v2Out.buf,valueBuf,workspaceBuf,workspaceBytes); + v3Bias.apply(cudaHandles,batchSize,valueBuf); + + sv3Mul.apply(cudaHandles,scratch,batchSize,v2Out.buf,scoreValueBuf,workspaceBuf,workspaceBytes); + sv3Bias.apply(cudaHandles,batchSize,scoreValueBuf); + + #ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("v1"), v1Out.buf, batchSize, v1Channels, nnXLen*nnYLen, usingNHWC, usingFP16); + CudaUtils::debugPrint2D(string("v1 pooled"), v1Mean.buf, batchSize, v1Channels, false); + CudaUtils::debugPrint2D(string("v2"), v2Out.buf, batchSize, v2Channels, false); + #endif + + if(!usingFP16) { + vOwnershipConv.apply(cudaHandles,scratch,batchSize,false,v1Out2.buf,ownershipBuf,workspaceBuf,workspaceBytes); + } + else { + vOwnershipConv.apply(cudaHandles,scratch,batchSize,false,v1Out2.buf,ownershipScratch.buf,workspaceBuf,workspaceBytes); + customCudaCopyFromHalf((const half*)ownershipScratch.buf,(float*)ownershipBuf,batchSize*ownershipChannels*nnXLen*nnYLen); + CUDA_ERR("vOwnership copy",cudaPeekAtLastError()); + } + + } + +}; + +//------------------------------------------------------------------------------ + +struct Model { + const string name; + const int modelVersion; + const int maxBatchSize; + const int nnXLen; + const int nnYLen; + const int numInputChannels; + const int numInputGlobalChannels; + const int numInputMetaChannels; + const int numPolicyChannels; + const int numValueChannels; + const int numScoreValueChannels; + const int numOwnershipChannels; + const bool usingFP16; + const bool usingNHWC; + const bool inputsUsingNHWC; + + std::unique_ptr trunk; + std::unique_ptr policyHead; + std::unique_ptr valueHead; + std::unique_ptr manager; + + Model() = delete; + Model(const Model&) = delete; + Model& operator=(const Model&) = delete; + + Model( + CudaHandles* cudaHandles, + const ModelDesc* desc, + int maxBatchSz, + int nnX, + int nnY, + bool inputsUseNHWC, + bool useFP16, + bool useNHWC + ) : + name(desc->name), + modelVersion(desc->modelVersion), + maxBatchSize(maxBatchSz), + nnXLen(nnX), + nnYLen(nnY), + numInputChannels(desc->numInputChannels), + numInputGlobalChannels(desc->numInputGlobalChannels), + numInputMetaChannels(desc->numInputMetaChannels), + numPolicyChannels(desc->numPolicyChannels), + numValueChannels(desc->numValueChannels), + numScoreValueChannels(desc->numScoreValueChannels), + numOwnershipChannels(desc->numOwnershipChannels), + usingFP16(useFP16), + usingNHWC(useNHWC), + inputsUsingNHWC(inputsUseNHWC) + { + if(nnXLen > NNPos::MAX_BOARD_LEN) + throw StringError(Global::strprintf("nnXLen (%d) is greater than NNPos::MAX_BOARD_LEN (%d)", + nnXLen, NNPos::MAX_BOARD_LEN + )); + if(nnYLen > NNPos::MAX_BOARD_LEN) + throw StringError(Global::strprintf("nnYLen (%d) is greater than NNPos::MAX_BOARD_LEN (%d)", + nnYLen, NNPos::MAX_BOARD_LEN + )); + + int numFeatures = NNModelVersion::getNumSpatialFeatures(modelVersion); + if(numInputChannels != numFeatures) + throw StringError(Global::strprintf("Neural net numInputChannels (%d) was not the expected number based on version (%d)", + numInputChannels, numFeatures + )); + int numGlobalFeatures = NNModelVersion::getNumGlobalFeatures(modelVersion); + if(numInputGlobalChannels != numGlobalFeatures) + throw StringError(Global::strprintf("Neural net numInputGlobalChannels (%d) was not the expected number based on version (%d)", + numInputGlobalChannels, numGlobalFeatures + )); + if(numInputMetaChannels > 0) { + if(numInputMetaChannels != SGFMetadata::METADATA_INPUT_NUM_CHANNELS) + throw StringError(Global::strprintf("Neural net numInputMetaChannels (%d) was not the expected number (%d)", + numInputMetaChannels, SGFMetadata::METADATA_INPUT_NUM_CHANNELS + )); + } + + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numInputChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numInputGlobalChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numInputMetaChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numPolicyChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numValueChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numScoreValueChannels); + CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numOwnershipChannels); + + manager = std::make_unique(name, maxBatchSize, nnXLen, nnYLen); + trunk = std::make_unique(cudaHandles,manager.get(),&desc->trunk,nnXLen,nnYLen,inputsUseNHWC,useFP16,useNHWC); + policyHead = std::make_unique(cudaHandles,manager.get(),&desc->policyHead,nnXLen,nnYLen,useFP16,useNHWC); + valueHead = std::make_unique(cudaHandles,manager.get(),&desc->valueHead,nnXLen,nnYLen,useFP16,useNHWC); + } + + ~Model() + { + } + + size_t requiredWorkspaceBytes( + CudaHandles* cudaHandles, + int batchSize + ) const { + size_t bytes = 0; + size_t b; + + b = trunk->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = policyHead->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + b = valueHead->requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + + return bytes; + } + + void apply( + CudaHandles* cudaHandles, + ScratchBuffers* scratch, + int batchSize, + bool requireExactNNLen, + + void* inputBuf, + void* inputGlobalBuf, + void* inputMetaBuf, + + float* policyPassBuf, + float* policyBuf, + + float* valueBuf, + float* scoreValueBuf, + void* ownershipBuf, + + void* workspaceBuf, + size_t workspaceBytes + ) const { + SizedBuf mask(scratch->allocator, scratch->getBufSizeXY(1)); + SizedBuf maskFloat(scratch->allocator, scratch->getBufSizeXYFloat(1)); + SizedBuf maskSum(scratch->allocator, scratch->getBufSizeFloat(1)); + + void* maskBuf = mask.buf; + float* maskFloatBuf = (float*)maskFloat.buf; + float* maskSumBuf = (float*)maskSum.buf; + + if(!usingFP16) { + if(inputsUsingNHWC) + customCudaChannel0ExtractNHWC((const float*)inputBuf, (float*)maskBuf, batchSize, nnXLen*nnYLen, numInputChannels); + else + customCudaChannel0ExtractNCHW((const float*)inputBuf, (float*)maskBuf, batchSize, numInputChannels, nnXLen*nnYLen); + CUDA_ERR("modelExtractMask",cudaPeekAtLastError()); + } + else { + if(inputsUsingNHWC) + customCudaChannel0ExtractNHWC((const half*)inputBuf, (half*)maskBuf, batchSize, nnXLen*nnYLen, numInputChannels); + else + customCudaChannel0ExtractNCHW((const half*)inputBuf, (half*)maskBuf, batchSize, numInputChannels, nnXLen*nnYLen); + CUDA_ERR("modelExtractMask",cudaPeekAtLastError()); + } + + fillMaskFloatBufAndMaskSumBuf(maskBuf,maskFloatBuf,maskSumBuf,usingFP16,batchSize,nnXLen,nnYLen); + + //Don't do any masking if we know the board is exactly the desired size + if(requireExactNNLen) { + //Set to NULL to signal downstream that this buf doesn't need to be used + maskBuf = NULL; + maskFloatBuf = NULL; + //The global pooling structures need this no matter what, for normalizing based on this and its sqrt. + //maskSumBuf = NULL; + } + + #ifdef DEBUG_INTERMEDIATE_VALUES + CudaUtils::debugPrint3D(string("Initial bin features"), inputBuf, batchSize, trunk->initialConv->inChannels, nnXLen*nnYLen, inputsUsingNHWC, usingFP16); + CudaUtils::debugPrint2D(string("Initial global features"), inputGlobalBuf, batchSize, trunk->initialMatMul->inChannels, usingFP16); + if(trunk->sgfMetadataEncoder != nullptr) { + assert(inputMetaBuf != NULL); + CudaUtils::debugPrint2D(string("Initial meta features"), inputMetaBuf, batchSize, trunk->sgfMetadataEncoder->mul1.inChannels, usingFP16); + } + #endif + + SizedBuf trunkBuf(scratch->allocator, scratch->getBufSizeXY(trunk->trunkNumChannels)); + + trunk->apply( + cudaHandles, + scratch, + batchSize, + inputBuf, + inputGlobalBuf, + inputMetaBuf, + maskBuf, + maskSumBuf, + trunkBuf.buf, + workspaceBuf, + workspaceBytes + ); + policyHead->apply( + cudaHandles, + scratch, + batchSize, + maskBuf, + maskFloatBuf, + maskSumBuf, + trunkBuf.buf, + policyPassBuf, + policyBuf, + workspaceBuf, + workspaceBytes + ); + valueHead->apply( + cudaHandles, + scratch, + batchSize, + maskBuf, + maskSumBuf, + trunkBuf.buf, + valueBuf, + scoreValueBuf, + ownershipBuf, + workspaceBuf, + workspaceBytes + ); + } + +}; + + +//------------------------------------------------------------------------------ + +struct LoadedModel { + ModelDesc modelDesc; + + LoadedModel(const string& fileName, const string& expectedSha256) { + ModelDesc::loadFromFileMaybeGZipped(fileName,modelDesc,expectedSha256); + modelDesc.applyScale8ToReduceActivations(); + } + + LoadedModel() = delete; + LoadedModel(const LoadedModel&) = delete; + LoadedModel& operator=(const LoadedModel&) = delete; +}; + +LoadedModel* NeuralNet::loadModelFile(const string& file, const string& expectedSha256) { + LoadedModel* loadedModel = new LoadedModel(file,expectedSha256); + return loadedModel; +} + +void NeuralNet::freeLoadedModel(LoadedModel* loadedModel) { + delete loadedModel; +} + +const ModelDesc& NeuralNet::getModelDesc(const LoadedModel* loadedModel) { + return loadedModel->modelDesc; +} + +//------------------------------------------------------------------------------ + +struct Buffers { + //All of these are device pointers + + float* inputBufFloat; + void* inputBuf; + float* inputGlobalBufFloat; + void* inputGlobalBuf; + float* inputMetaBufFloat; + void* inputMetaBuf; + size_t inputBufBytesFloat; + size_t inputBufBytes; + size_t inputGlobalBufBytesFloat; + size_t inputGlobalBufBytes; + size_t inputMetaBufBytesFloat; + size_t inputMetaBufBytes; + + float* policyPassBuf; + size_t policyPassBufBytes; + float* policyBuf; + size_t policyBufBytes; + + float* valueBuf; + size_t valueBufBytes; + float* scoreValueBuf; + size_t scoreValueBufBytes; + void* ownershipBuf; + size_t ownershipBufBytes; + + void* workspaceBuf; + size_t workspaceBytes; + + Buffers() = delete; + Buffers(const Buffers&) = delete; + Buffers& operator=(const Buffers&) = delete; + + Buffers(CudaHandles* cudaHandles, const Model& m, const ScratchBuffers& scratch) { + size_t batchXYFloatBytes = (size_t)scratch.batchXYFloatBytes; + size_t batchFloatBytes = (size_t)scratch.batchFloatBytes; + size_t batchXYBytes = (size_t)scratch.batchXYBytes; + size_t batchBytes = (size_t)scratch.batchBytes; + + inputBufBytesFloat = m.numInputChannels * batchXYFloatBytes; + inputBufBytes = m.numInputChannels * batchXYBytes; + inputGlobalBufBytesFloat = m.numInputGlobalChannels * batchFloatBytes; + inputGlobalBufBytes = m.numInputGlobalChannels * batchBytes; + inputMetaBufBytesFloat = m.numInputMetaChannels * batchFloatBytes; + inputMetaBufBytes = m.numInputMetaChannels * batchBytes; + + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&inputBufFloat), inputBufBytesFloat)); + CUDA_ERR("Buffers",cudaMalloc(&inputBuf, inputBufBytes)); + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&inputGlobalBufFloat), inputGlobalBufBytesFloat)); + CUDA_ERR("Buffers",cudaMalloc(&inputGlobalBuf, inputGlobalBufBytes)); + if(m.numInputMetaChannels > 0) { + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&inputMetaBufFloat), inputMetaBufBytesFloat)); + CUDA_ERR("Buffers",cudaMalloc(&inputMetaBuf, inputMetaBufBytes)); + } + else { + inputMetaBufFloat = NULL; + inputMetaBuf = NULL; + } + + if(m.modelVersion >= 17) + testAssert(m.policyHead->p2Channels == 2 || m.policyHead->p2Channels == 4); + else if(m.modelVersion >= 16) + testAssert(m.policyHead->p2Channels == 4); + else if(m.modelVersion >= 12) + testAssert(m.policyHead->p2Channels == 2); + else + testAssert(m.policyHead->p2Channels == 1); + + policyPassBufBytes = m.policyHead->p2Channels * batchFloatBytes; + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&policyPassBuf), policyPassBufBytes)); + policyBufBytes = m.policyHead->p2Channels * batchXYFloatBytes; + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&policyBuf), policyBufBytes)); + + valueBufBytes = m.valueHead->valueChannels * batchFloatBytes; + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&valueBuf), valueBufBytes)); + + scoreValueBufBytes = m.valueHead->scoreValueChannels * batchFloatBytes; + CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&scoreValueBuf), scoreValueBufBytes)); + + //This buf is used for both an intermdiate fp16 result in fp16 mode, and ALSO the final fp32 output, so always must be fp32-sized + ownershipBufBytes = m.valueHead->ownershipChannels * batchXYFloatBytes; + CUDA_ERR("Buffers",cudaMalloc(&ownershipBuf, ownershipBufBytes)); + + //In theory the requiredWorkspaceBytes calls could give us values non-monotone in batch size + //such as if the convolution algorithm changes between batch size 1 and larger. + //So we call it for all the batch sizes. + size_t bytes = 0; + size_t b; + for(int batchSize = 1; batchSize <= m.maxBatchSize; batchSize++) { + b = m.requiredWorkspaceBytes(cudaHandles,batchSize); + bytes = std::max(bytes,b); + } + + CUDA_ERR("Buffers",cudaMalloc(&workspaceBuf, bytes)); + workspaceBytes = bytes; + } + + ~Buffers() { + (void)cudaFree(inputBufFloat); + (void)cudaFree(inputBuf); + (void)cudaFree(inputGlobalBufFloat); + (void)cudaFree(inputGlobalBuf); + if(inputMetaBufFloat != NULL) + (void)cudaFree(inputMetaBufFloat); + if(inputMetaBuf != NULL) + (void)cudaFree(inputMetaBuf); + + (void)cudaFree(policyPassBuf); + (void)cudaFree(policyBuf); + + (void)cudaFree(valueBuf); + (void)cudaFree(scoreValueBuf); + (void)cudaFree(ownershipBuf); + + (void)cudaFree(workspaceBuf); + } + +}; + +//------------------------------------------------------------------------------ + +#ifdef KATAGO_GPU_CUDA +struct ComputeContext { + int nnXLen; + int nnYLen; + enabled_t useFP16Mode; + enabled_t useNHWCMode; + // If true, skip the cudnn graph SDPA path entirely and always use the custom attention kernel. + bool cudaDisableGraphSDPA; + // Whether 1x1 NHWC convs use the cuBLAS GEMM path. Auto = matmul iff FP16. + enabled_t use1x1MatmulMode; +}; +#else // KATAGO_GPU_HIP +struct ComputeContext { + int nnXLen; + int nnYLen; + enabled_t useFP16Mode; + enabled_t useNHWCMode; + bool disableFusedAttention; +}; +#endif + +#ifdef KATAGO_GPU_CUDA +ComputeContext* NeuralNet::createComputeContext( + const std::vector& gpuIdxs, + Logger* logger, + int nnXLen, + int nnYLen, + const string& homeDataDirOverride, + enabled_t useFP16Mode, + const LoadedModel* loadedModel, + ConfigParser& cfg +) { + (void)gpuIdxs; + (void)logger; + (void)homeDataDirOverride; + (void)loadedModel; + + ComputeContext* context = new ComputeContext(); + context->nnXLen = nnXLen; + context->nnYLen = nnYLen; + context->useFP16Mode = useFP16Mode; + + // NHWC layout is a CUDA-specific option read directly off of cfg. Auto means "NHWC if FP16" (see below). + context->useNHWCMode = + cfg.contains("cudaUseNHWC") ? cfg.getEnabled("cudaUseNHWC") : enabled_t::Auto; + context->cudaDisableGraphSDPA = + cfg.contains("cudaDisableGraphSDPA") ? cfg.getBool("cudaDisableGraphSDPA") : false; + context->use1x1MatmulMode = + cfg.contains("cudaUse1x1Matmul") ? cfg.getEnabled("cudaUse1x1Matmul") : enabled_t::Auto; + return context; +} +#else // KATAGO_GPU_HIP +ComputeContext* NeuralNet::createComputeContext( + const std::vector& gpuIdxs, + Logger* logger, + int nnXLen, + int nnYLen, + const string& homeDataDirOverride, + enabled_t useFP16Mode, + const LoadedModel* loadedModel, + ConfigParser& cfg +) { + (void)gpuIdxs; + (void)logger; + (void)homeDataDirOverride; + (void)loadedModel; + + // ROCm-specific NHWC override, read directly off cfg (mirrors cudaUseNHWC in the CUDA backend). + enabled_t useNHWCMode = + cfg.contains("rocmUseNHWC") ? cfg.getEnabled("rocmUseNHWC") : enabled_t::Auto; + // Disables the optional CK FMHA fused attention path (see KATAGO_ROCM_HAS_CK_FMHA), mirroring + // the CUDA backend's cudaDisableGraphSDPA. Only meaningful for transformer models. + bool disableFusedAttention = + cfg.contains("rocmDisableFusedAttention") ? cfg.getBool("rocmDisableFusedAttention") : false; + + ComputeContext* context = new ComputeContext(); + context->nnXLen = nnXLen; + context->nnYLen = nnYLen; + context->useFP16Mode = useFP16Mode; + context->useNHWCMode = useNHWCMode; + context->disableFusedAttention = disableFusedAttention; + return context; +} +#endif + +void NeuralNet::freeComputeContext(ComputeContext* computeContext) { + delete computeContext; +} + +//------------------------------------------------------------------------------ + +struct ComputeHandle { + std::unique_ptr cudaHandles; + std::unique_ptr model; + std::unique_ptr scratch; + std::unique_ptr buffers; + const bool usingFP16; + const int nnXLen; + const int nnYLen; + const bool requireExactNNLen; + const bool inputsUseNHWC; + const bool usingNHWC; + +#ifdef KATAGO_GPU_CUDA + ComputeHandle( + const ComputeContext* context, + const LoadedModel* loadedModel, + int majorComputeCapability, + int minorComputeCapability, + int maxBatchSize, + bool requireExactNNLen_, + bool inputsUseNHWC_, + bool useFP16, + bool useNHWC + ) : + usingFP16(useFP16), + nnXLen(context->nnXLen), + nnYLen(context->nnYLen), + requireExactNNLen(requireExactNNLen_), + inputsUseNHWC(inputsUseNHWC_), + usingNHWC(useNHWC) + { + cudaHandles = std::make_unique(majorComputeCapability,minorComputeCapability); + // Must be set before building the model: ConvLayer reads it at construction to pick the 1x1 conv path. + cudaHandles->use1x1MatmulMode = context->use1x1MatmulMode; + model = std::make_unique( + cudaHandles.get(), &(loadedModel->modelDesc), maxBatchSize, + nnXLen, nnYLen, inputsUseNHWC, useFP16, useNHWC + ); + scratch = std::make_unique(maxBatchSize, nnXLen, nnYLen, useFP16); + buffers = std::make_unique(cudaHandles.get(), *model, *scratch); + + //Synchronize after creating buffers and copying all the weights, just in case + CUDA_ERR("ComputeHandle", cudaDeviceSynchronize()); + } +#else // KATAGO_GPU_HIP + ComputeHandle( + const ComputeContext* context, + const LoadedModel* loadedModel, + Logger* logger, + int majorComputeCapability, + int minorComputeCapability, + bool ckFmhaArchSupported, + int maxBatchSize, + bool requireExactNNLen_, + bool inputsUseNHWC_, + bool useFP16, + bool useNHWC + ) : + usingFP16(useFP16), + nnXLen(context->nnXLen), + nnYLen(context->nnYLen), + requireExactNNLen(requireExactNNLen_), + inputsUseNHWC(inputsUseNHWC_), + usingNHWC(useNHWC) + { + cudaHandles = std::make_unique( + majorComputeCapability,minorComputeCapability,logger,ckFmhaArchSupported,context->disableFusedAttention); + model = std::make_unique( + cudaHandles.get(), &(loadedModel->modelDesc), maxBatchSize, + nnXLen, nnYLen, inputsUseNHWC, useFP16, useNHWC + ); + scratch = std::make_unique(maxBatchSize, nnXLen, nnYLen, useFP16); + buffers = std::make_unique(cudaHandles.get(), *model, *scratch); + + //Synchronize after creating buffers and copying all the weights, just in case + CUDA_ERR("ComputeHandle", hipDeviceSynchronize()); + } +#endif + ~ComputeHandle() { + } + + ComputeHandle() = delete; + ComputeHandle(const ComputeHandle&) = delete; + ComputeHandle& operator=(const ComputeHandle&) = delete; +}; + +#ifdef KATAGO_GPU_CUDA +ComputeHandle* NeuralNet::createComputeHandle( + ComputeContext* context, + const LoadedModel* loadedModel, + Logger* logger, + int maxBatchSize, + bool requireExactNNLen, + bool inputsUseNHWC, + int gpuIdxForThisThread, + int serverThreadIdx +) { + //Use whatever CUDA believes GPU 0 to be. + if(gpuIdxForThisThread == -1) + gpuIdxForThisThread = 0; + + CUDA_ERR("createComputeHandle",cudaSetDevice(gpuIdxForThisThread)); + + cudaDeviceProp prop; + CUDA_ERR("createComputeHandle",cudaGetDeviceProperties(&prop,gpuIdxForThisThread)); + + bool useFP16 = false; + bool useNHWC = false; + //Old GPUs - use FP32 and explicitly fail if FP16 enabled + if(prop.major < 5 || (prop.major == 5 && prop.minor < 3)) { + if(context->useFP16Mode == enabled_t::True) + throw StringError("Cuda device versions below 5.3 do not support useFP16=true"); + if(context->useNHWCMode == enabled_t::True) + useNHWC = true; + } + //In theory these GPUs support FP16, so allow if the user wants. + else if(prop.major < 6) { + if(context->useFP16Mode == enabled_t::True) + useFP16 = true; + if(context->useNHWCMode == enabled_t::True) + useNHWC = true; + } + //On Pascal architecture, default to using FP16 operations + //Actually, just use FP32 - there's a risk that on certain cards this might just be a lot worse. + //A user manually fine-tuning for performance can just enable it themselves if they know how. + else if(prop.major < 7) { + if(context->useFP16Mode == enabled_t::True) + useFP16 = true; + if(context->useNHWCMode == enabled_t::True) + useNHWC = true; + } + //On Volta and higher, use FP16 and NHWC together because we have tensor cores. + else { + if(context->useFP16Mode == enabled_t::True || context->useFP16Mode == enabled_t::Auto) + useFP16 = true; + if(context->useNHWCMode == enabled_t::True || (context->useNHWCMode == enabled_t::Auto && useFP16)) + useNHWC = true; + } + + //The CUDA transformer block implementation only supports NHWC (its channel projections, RoPE, and + //attention all assume the channel dim is contiguous per position). Unlike convnets, NHWC here is not + //tied to FP16/tensor-cores - the transformer kernels have FP32 paths too. So for transformer models + //force NHWC regardless of the FP16/NHWC-mode decision above, otherwise FP32 (or NHWC=false) would hit + //the "NCHW layout not supported" throw. No effect on convnets. + if(!useNHWC && loadedModel->modelDesc.trunk.hasAnyTransformerBlocks()) { + if(context->useNHWCMode == enabled_t::False) + throw StringError("CUDA backend: transformer models require NHWC, but cudaUseNHWC=false was set"); + useNHWC = true; + } + + if(logger != NULL) { + logger->write( + "Cuda backend thread " + Global::intToString(serverThreadIdx) + ": Found GPU " + string(prop.name) + + " memory " + Global::uint64ToString(prop.totalGlobalMem) + + " compute capability major " + Global::intToString(prop.major) + + " minor " + Global::intToString(prop.minor) + ); + logger->write( + "Cuda backend thread " + Global::intToString(serverThreadIdx) + ": Model version " + Global::intToString(loadedModel->modelDesc.modelVersion) + + " useFP16 = " + Global::boolToString(useFP16) + + " useNHWC = " + Global::boolToString(useNHWC) + ); + logger->write( + "Cuda backend thread " + Global::intToString(serverThreadIdx) + ": Model name: " + loadedModel->modelDesc.name + + " (" + loadedModel->modelDesc.getShortInfoString() + ")" + ); + } + + ComputeHandle* gpuHandle = new ComputeHandle( + context,loadedModel,prop.major,prop.minor,maxBatchSize,requireExactNNLen,inputsUseNHWC,useFP16,useNHWC + ); + gpuHandle->cudaHandles->logger = logger; + gpuHandle->cudaHandles->cudaDisableGraphSDPA = context->cudaDisableGraphSDPA; + return gpuHandle; +} +#else // KATAGO_GPU_HIP +ComputeHandle* NeuralNet::createComputeHandle( + ComputeContext* context, + const LoadedModel* loadedModel, + Logger* logger, + int maxBatchSize, + bool requireExactNNLen, + bool inputsUseNHWC, + int gpuIdxForThisThread, + int serverThreadIdx +) { + //Use whatever HIP believes GPU 0 to be. + if(gpuIdxForThisThread == -1) + gpuIdxForThisThread = 0; + + CUDA_ERR("createComputeHandle",hipSetDevice(gpuIdxForThisThread)); + + hipDeviceProp_t prop; + CUDA_ERR("createComputeHandle",hipGetDeviceProperties(&prop,gpuIdxForThisThread)); + + bool useFP16 = false; + bool useNHWC = false; + if(context->useFP16Mode == enabled_t::True || context->useFP16Mode == enabled_t::Auto) + useFP16 = true; + if(context->useNHWCMode == enabled_t::True) + useNHWC = true; + + // Every arch in the default CMAKE_HIP_ARCHITECTURES list supports packed FP16, so FP16 "Auto" + // enables it unconditionally. But if this build's arch list wasn't recognized by the CMake + // HIP_SUPPORTS_FP16 check, the half-precision kernels compiled to empty stubs - detect that and + // refuse (or auto-disable) FP16 loudly rather than silently computing garbage. + if(useFP16 && !customCudaFp16KernelsCompiled()) { + if(context->useFP16Mode == enabled_t::True) + throw StringError("rocmUseFP16 = true, but this build was compiled without FP16 kernel support (HIP_SUPPORTS_FP16 was not defined; check the GPU architecture list the build used)"); + useFP16 = false; + if(logger != NULL) + logger->write("ROCm backend: this build was compiled without FP16 kernel support; using FP32"); + } + + // Mirror the CUDA backend's tensor-core rule: on archs whose matrix instructions make NHWC + // convolutions the fast path, NHWC "Auto" turns NHWC on together with FP16. Decided after the + // FP16-kernel check above so a build that just downgraded to FP32 does not also switch layouts. + if(context->useNHWCMode == enabled_t::Auto && useFP16 && isNhwcFp16PreferredArch(prop)) + useNHWC = true; + + // The transformer block implementation (attention/RoPE/FFN) only supports NHWC, since its channel + // projections assume the channel dim is contiguous per spatial position. Force NHWC for transformer + // models regardless of the useNHWCMode decision above, matching the CUDA backend's behavior. + if(!useNHWC && loadedModel->modelDesc.trunk.hasAnyTransformerBlocks()) { + if(context->useNHWCMode == enabled_t::False) + throw StringError("ROCm backend: transformer models require NHWC, but rocmUseNHWC=false was set"); + useNHWC = true; + } + + if(logger != NULL) { + logger->write( + "ROCm backend thread " + Global::intToString(serverThreadIdx) + ": Found GPU " + string(prop.name) + + " memory " + Global::uint64ToString(prop.totalGlobalMem) + + " compute capability major " + Global::intToString(prop.major) + + " minor " + Global::intToString(prop.minor) + ); + logger->write( + "ROCm backend thread " + Global::intToString(serverThreadIdx) + ": Model version " + Global::intToString(loadedModel->modelDesc.modelVersion) + + " useFP16 = " + Global::boolToString(useFP16) + + " useNHWC = " + Global::boolToString(useNHWC) + ); + logger->write( + "ROCm backend thread " + Global::intToString(serverThreadIdx) + ": Model name: " + loadedModel->modelDesc.name + + " (" + loadedModel->modelDesc.getShortInfoString() + ")" + ); + logger->write( + "MIOpen finding convolution algorithms for GPU " + string(prop.name) + ". This may take a while, please wait......" + ); + } + + ComputeHandle* gpuHandle = new ComputeHandle( + context,loadedModel,logger,prop.major,prop.minor,isCkFmhaSupportedArch(prop), + maxBatchSize,requireExactNNLen,inputsUseNHWC,useFP16,useNHWC + ); + return gpuHandle; +} +#endif + +void NeuralNet::freeComputeHandle(ComputeHandle* gpuHandle) { + delete gpuHandle; +} + +bool NeuralNet::isUsingFP16(const ComputeHandle* handle) { + return handle->usingFP16; +} + +#ifdef KATAGO_GPU_CUDA +bool NeuralNet::setIsWarmup(const ComputeHandle* handle, bool isWarmup) { + CudaHandles* cudaHandles = handle->cudaHandles.get(); + bool prev = cudaHandles->isWarmup; + cudaHandles->isWarmup = isWarmup; + return prev; +} +#else // KATAGO_GPU_HIP +bool NeuralNet::setIsWarmup(const ComputeHandle* handle, bool isWarmup) { + (void)handle; + (void)isWarmup; + return false; +} +#endif + +//------------------------------------------------------------------------------ + +void NeuralNet::printDevices() { + int numDevices = 0; + //Best-effort listing, so a failure here prints nothing rather than aborting. The errors are + //checked rather than discarded because prop is left uninitialized on failure, and printing + //prop.name would then read uninitialized memory. + if(cudaGetDeviceCount(&numDevices) != cudaSuccess) + return; + for(int i = 0; imodelDesc; + + maxBatchSize = maxBatchSz; + singleInputElts = (size_t)m.numInputChannels * nnXLen * nnYLen; + singleInputBytes = (size_t)m.numInputChannels * nnXLen * nnYLen * sizeof(float); + singleInputGlobalElts = (size_t)m.numInputGlobalChannels; + singleInputGlobalBytes = (size_t)m.numInputGlobalChannels * sizeof(float); + singleInputMetaElts = (size_t)m.numInputMetaChannels; + singleInputMetaBytes = (size_t)m.numInputMetaChannels * sizeof(float); + singlePolicyPassResultElts = (size_t)(m.numPolicyChannels); + singlePolicyPassResultBytes = (size_t)(m.numPolicyChannels) * sizeof(float); + singlePolicyResultElts = (size_t)(m.numPolicyChannels * nnXLen * nnYLen); + singlePolicyResultBytes = (size_t)(m.numPolicyChannels * nnXLen * nnYLen) * sizeof(float); + singleValueResultElts = (size_t)m.numValueChannels; + singleValueResultBytes = (size_t)m.numValueChannels * sizeof(float); + singleScoreValueResultElts = (size_t)m.numScoreValueChannels; + singleScoreValueResultBytes = (size_t)m.numScoreValueChannels * sizeof(float); + singleOwnershipResultElts = (size_t)m.numOwnershipChannels * nnXLen * nnYLen; + singleOwnershipResultBytes = (size_t)m.numOwnershipChannels * nnXLen * nnYLen * sizeof(float); + + testAssert(NNModelVersion::getNumSpatialFeatures(m.modelVersion) == m.numInputChannels); + testAssert(NNModelVersion::getNumGlobalFeatures(m.modelVersion) == m.numInputGlobalChannels); + if(m.numInputMetaChannels > 0) { + testAssert(SGFMetadata::METADATA_INPUT_NUM_CHANNELS == m.numInputMetaChannels); + } + + userInputBufferBytes = (size_t)m.numInputChannels * maxBatchSize * nnXLen * nnYLen * sizeof(float); + userInputGlobalBufferBytes = (size_t)m.numInputGlobalChannels * maxBatchSize * sizeof(float); + userInputMetaBufferBytes = (size_t)m.numInputMetaChannels * maxBatchSize * sizeof(float); + policyPassResultBufferBytes = (size_t)maxBatchSize * m.numPolicyChannels * sizeof(float); + policyResultBufferBytes = (size_t)maxBatchSize * m.numPolicyChannels * nnXLen * nnYLen * sizeof(float); + valueResultBufferBytes = (size_t)maxBatchSize * m.numValueChannels * sizeof(float); + scoreValueResultBufferBytes = (size_t)maxBatchSize * m.numScoreValueChannels * sizeof(float); + ownershipResultBufferBytes = (size_t)maxBatchSize * nnXLen * nnYLen * m.numOwnershipChannels * sizeof(float); + + userInputBuffer = new float[(size_t)m.numInputChannels * maxBatchSize * nnXLen * nnYLen]; + userInputGlobalBuffer = new float[(size_t)m.numInputGlobalChannels * maxBatchSize]; + if(m.numInputMetaChannels > 0) + userInputMetaBuffer = new float[(size_t)m.numInputMetaChannels * maxBatchSize]; + else + userInputMetaBuffer = NULL; + + policyPassResults = new float[(size_t)maxBatchSize * m.numPolicyChannels]; + policyResults = new float[(size_t)maxBatchSize * m.numPolicyChannels * nnXLen * nnYLen]; + valueResults = new float[(size_t)maxBatchSize * m.numValueChannels]; + + scoreValueResults = new float[(size_t)maxBatchSize * m.numScoreValueChannels]; + ownershipResults = new float[(size_t)maxBatchSize * nnXLen * nnYLen * m.numOwnershipChannels]; + } + + ~InputBuffers() { + delete[] userInputBuffer; + delete[] userInputGlobalBuffer; + if(userInputMetaBuffer != NULL) + delete[] userInputMetaBuffer; + delete[] policyPassResults; + delete[] policyResults; + delete[] valueResults; + delete[] scoreValueResults; + delete[] ownershipResults; + } + + InputBuffers() = delete; + InputBuffers(const InputBuffers&) = delete; + InputBuffers& operator=(const InputBuffers&) = delete; + +}; + +InputBuffers* NeuralNet::createInputBuffers(const LoadedModel* loadedModel, int maxBatchSize, int nnXLen, int nnYLen) { + return new InputBuffers(loadedModel,maxBatchSize,nnXLen,nnYLen); +} +void NeuralNet::freeInputBuffers(InputBuffers* inputBuffers) { + delete inputBuffers; +} + +//--------------------------------------------------------------------------------------- + + +void NeuralNet::getOutput( + ComputeHandle* gpuHandle, + InputBuffers* inputBuffers, + int numBatchEltsFilled, + NNResultBuf** inputBufs, + vector& outputs +) { + //testAssert rather than assert: these guard the sizes of every device memcpy below, so an + //oversized batch must fail loudly in release builds too rather than overflow GPU buffers. + testAssert(numBatchEltsFilled <= inputBuffers->maxBatchSize); + testAssert(numBatchEltsFilled > 0); + const int batchSize = numBatchEltsFilled; + const int nnXLen = gpuHandle->nnXLen; + const int nnYLen = gpuHandle->nnYLen; + const int modelVersion = gpuHandle->model->modelVersion; + + const int numSpatialFeatures = NNModelVersion::getNumSpatialFeatures(modelVersion); + const int numGlobalFeatures = NNModelVersion::getNumGlobalFeatures(modelVersion); + const int numMetaFeatures = inputBuffers->singleInputMetaElts; + assert(numSpatialFeatures == gpuHandle->model->numInputChannels); + assert(numSpatialFeatures * nnXLen * nnYLen == inputBuffers->singleInputElts); + assert(numGlobalFeatures == inputBuffers->singleInputGlobalElts); + const int numPolicyChannels = gpuHandle->model->numPolicyChannels; + + for(int nIdx = 0; nIdxuserInputBuffer + (inputBuffers->singleInputElts * nIdx); + float* rowGlobalInput = inputBuffers->userInputGlobalBuffer + (inputBuffers->singleInputGlobalElts * nIdx); + float* rowMetaInput = inputBuffers->userInputMetaBuffer + (inputBuffers->singleInputMetaElts * nIdx); + + const float* rowGlobal = inputBufs[nIdx]->rowGlobalBuf.data(); + const float* rowSpatial = inputBufs[nIdx]->rowSpatialBuf.data(); + const float* rowMeta = inputBufs[nIdx]->rowMetaBuf.data(); + bool hasRowMeta = inputBufs[nIdx]->hasRowMeta; + std::copy(rowGlobal,rowGlobal+numGlobalFeatures,rowGlobalInput); + if(numMetaFeatures > 0) { + testAssert(rowMeta != NULL); + testAssert(hasRowMeta); + std::copy(rowMeta,rowMeta+numMetaFeatures,rowMetaInput); + } + else { + testAssert(!hasRowMeta); + } + SymmetryHelpers::copyInputsWithSymmetry(rowSpatial, rowSpatialInput, 1, nnYLen, nnXLen, numSpatialFeatures, gpuHandle->inputsUseNHWC, inputBufs[nIdx]->symmetry); + } + + Buffers* buffers = gpuHandle->buffers.get(); + ScratchBuffers* scratch = gpuHandle->scratch.get(); + + if(!gpuHandle->usingFP16) { + assert(inputBuffers->userInputBufferBytes == buffers->inputBufBytes); + assert(inputBuffers->userInputGlobalBufferBytes == buffers->inputGlobalBufBytes); + assert(inputBuffers->userInputMetaBufferBytes == buffers->inputMetaBufBytes); + assert(inputBuffers->policyPassResultBufferBytes == buffers->policyPassBufBytes); + assert(inputBuffers->policyResultBufferBytes == buffers->policyBufBytes); + assert(inputBuffers->valueResultBufferBytes == buffers->valueBufBytes); + assert(inputBuffers->singleInputBytes == inputBuffers->singleInputElts*4); + assert(inputBuffers->singleInputGlobalBytes == inputBuffers->singleInputGlobalElts*4); + assert(inputBuffers->singleInputMetaBytes == inputBuffers->singleInputMetaElts*4); + assert(inputBuffers->singlePolicyPassResultElts == numPolicyChannels); + assert(inputBuffers->singlePolicyPassResultBytes == numPolicyChannels * sizeof(float)); + assert(inputBuffers->singlePolicyResultElts == numPolicyChannels*nnXLen*nnYLen); + assert(inputBuffers->singlePolicyResultBytes == numPolicyChannels*nnXLen*nnYLen * sizeof(float)); + assert(inputBuffers->scoreValueResultBufferBytes == buffers->scoreValueBufBytes); + assert(inputBuffers->ownershipResultBufferBytes == buffers->ownershipBufBytes); + assert(inputBuffers->singleOwnershipResultElts == nnXLen*nnYLen); + assert(inputBuffers->singleOwnershipResultBytes == nnXLen*nnYLen * sizeof(float)); + + CUDA_ERR("getOutput",cudaMemcpy(buffers->inputBuf, inputBuffers->userInputBuffer, inputBuffers->singleInputBytes*batchSize, cudaMemcpyHostToDevice)); + CUDA_ERR("getOutput",cudaMemcpy(buffers->inputGlobalBuf, inputBuffers->userInputGlobalBuffer, inputBuffers->singleInputGlobalBytes*batchSize, cudaMemcpyHostToDevice)); + if(numMetaFeatures > 0) { + CUDA_ERR("getOutput",cudaMemcpy(buffers->inputMetaBuf, inputBuffers->userInputMetaBuffer, inputBuffers->singleInputMetaBytes*batchSize, cudaMemcpyHostToDevice)); + } + } + else { + assert(inputBuffers->userInputBufferBytes == buffers->inputBufBytesFloat); + assert(inputBuffers->userInputGlobalBufferBytes == buffers->inputGlobalBufBytesFloat); + assert(inputBuffers->userInputMetaBufferBytes == buffers->inputMetaBufBytesFloat); + assert(inputBuffers->policyResultBufferBytes == buffers->policyBufBytes); + assert(inputBuffers->valueResultBufferBytes == buffers->valueBufBytes); + assert(inputBuffers->userInputBufferBytes == buffers->inputBufBytes*2); + assert(inputBuffers->userInputGlobalBufferBytes == buffers->inputGlobalBufBytes*2); + assert(inputBuffers->userInputMetaBufferBytes == buffers->inputMetaBufBytes*2); + assert(inputBuffers->singleInputBytes == inputBuffers->singleInputElts*4); + assert(inputBuffers->singleInputGlobalBytes == inputBuffers->singleInputGlobalElts*4); + assert(inputBuffers->singleInputMetaBytes == inputBuffers->singleInputMetaElts*4); + assert(inputBuffers->singlePolicyPassResultElts == numPolicyChannels); + assert(inputBuffers->singlePolicyPassResultBytes == numPolicyChannels * sizeof(float)); + assert(inputBuffers->singlePolicyResultElts == numPolicyChannels*nnXLen*nnYLen); + assert(inputBuffers->singlePolicyResultBytes == numPolicyChannels*nnXLen*nnYLen * sizeof(float)); + assert(inputBuffers->scoreValueResultBufferBytes == buffers->scoreValueBufBytes); + assert(inputBuffers->ownershipResultBufferBytes == buffers->ownershipBufBytes); + assert(inputBuffers->singleOwnershipResultElts == nnXLen*nnYLen); + assert(inputBuffers->singleOwnershipResultBytes == nnXLen*nnYLen * sizeof(float)); + + CUDA_ERR("getOutput",cudaMemcpy(buffers->inputBufFloat, inputBuffers->userInputBuffer, inputBuffers->singleInputBytes*batchSize, cudaMemcpyHostToDevice)); + CUDA_ERR("getOutput",cudaMemcpy(buffers->inputGlobalBufFloat, inputBuffers->userInputGlobalBuffer, inputBuffers->singleInputGlobalBytes*batchSize, cudaMemcpyHostToDevice)); + if(numMetaFeatures > 0) { + CUDA_ERR("getOutput",cudaMemcpy(buffers->inputMetaBufFloat, inputBuffers->userInputMetaBuffer, inputBuffers->singleInputMetaBytes*batchSize, cudaMemcpyHostToDevice)); + } + + customCudaCopyToHalf((const float*)buffers->inputBufFloat,(half*)buffers->inputBuf,inputBuffers->singleInputElts*batchSize); + CUDA_ERR("getOutput",cudaPeekAtLastError()); + customCudaCopyToHalf((const float*)buffers->inputGlobalBufFloat,(half*)buffers->inputGlobalBuf,inputBuffers->singleInputGlobalElts*batchSize); + CUDA_ERR("getOutput",cudaPeekAtLastError()); + if(numMetaFeatures > 0) { + customCudaCopyToHalf((const float*)buffers->inputMetaBufFloat,(half*)buffers->inputMetaBuf,inputBuffers->singleInputMetaElts*batchSize); + CUDA_ERR("getOutput",cudaPeekAtLastError()); + } + } + + gpuHandle->model->apply( + gpuHandle->cudaHandles.get(), + scratch, + batchSize, + gpuHandle->requireExactNNLen, + + buffers->inputBuf, + buffers->inputGlobalBuf, + buffers->inputMetaBuf, + + buffers->policyPassBuf, + buffers->policyBuf, + + buffers->valueBuf, + buffers->scoreValueBuf, + buffers->ownershipBuf, + + buffers->workspaceBuf, + buffers->workspaceBytes + ); + + CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->policyPassResults, buffers->policyPassBuf, inputBuffers->singlePolicyPassResultBytes*batchSize, cudaMemcpyDeviceToHost)); + CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->policyResults, buffers->policyBuf, inputBuffers->singlePolicyResultBytes*batchSize, cudaMemcpyDeviceToHost)); + CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->valueResults, buffers->valueBuf, inputBuffers->singleValueResultBytes*batchSize, cudaMemcpyDeviceToHost)); + CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->scoreValueResults, buffers->scoreValueBuf, inputBuffers->singleScoreValueResultBytes*batchSize, cudaMemcpyDeviceToHost)); + CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->ownershipResults, buffers->ownershipBuf, inputBuffers->singleOwnershipResultBytes*batchSize, cudaMemcpyDeviceToHost)); + + assert(outputs.size() == batchSize); + + float policyProbsTmp[NNPos::MAX_NN_POLICY_SIZE]; + + for(int row = 0; row < batchSize; row++) { + NNOutput* output = outputs[row]; + assert(output->nnXLen == nnXLen); + assert(output->nnYLen == nnYLen); + float policyOptimism = (float)inputBufs[row]->policyOptimism; + + const float* policyPassSrcBuf = inputBuffers->policyPassResults + row * numPolicyChannels; + const float* policySrcBuf = inputBuffers->policyResults + row * numPolicyChannels * nnXLen * nnYLen; + float* policyProbs = output->policyProbs; + + // These are in logits, the client does the postprocessing to turn them into + // policy probabilities and white game outcome probabilities + // Also we don't fill in the nnHash here either + // Handle version >= 12 policy optimism + if(numPolicyChannels == 2 || (numPolicyChannels == 4 && modelVersion >= 16)) { + if(gpuHandle->usingNHWC) { + for(int i = 0; isymmetry); + policyProbs[nnXLen*nnYLen] = policyPassSrcBuf[0] + (policyPassSrcBuf[1] - policyPassSrcBuf[0]) * policyOptimism; + } + else { + for(int i = 0; isymmetry); + policyProbs[nnXLen*nnYLen] = policyPassSrcBuf[0] + (policyPassSrcBuf[1] - policyPassSrcBuf[0]) * policyOptimism; + } + } + else { + assert(numPolicyChannels == 1); + SymmetryHelpers::copyOutputsWithSymmetry(policySrcBuf, policyProbs, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); + policyProbs[nnXLen*nnYLen] = policyPassSrcBuf[0]; + } + + int numValueChannels = gpuHandle->model->numValueChannels; + assert(numValueChannels == 3); + output->whiteWinProb = inputBuffers->valueResults[row * numValueChannels]; + output->whiteLossProb = inputBuffers->valueResults[row * numValueChannels + 1]; + output->whiteNoResultProb = inputBuffers->valueResults[row * numValueChannels + 2]; + + //As above, these are NOT actually from white's perspective, but rather the player to move. + //As usual the client does the postprocessing. + if(output->whiteOwnerMap != NULL) { + const float* ownershipSrcBuf = inputBuffers->ownershipResults + row * nnXLen * nnYLen; + assert(gpuHandle->model->numOwnershipChannels == 1); + SymmetryHelpers::copyOutputsWithSymmetry(ownershipSrcBuf, output->whiteOwnerMap, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); + } + + if(modelVersion >= 9) { + int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; + assert(numScoreValueChannels == 6); + output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; + output->whiteScoreMeanSq = inputBuffers->scoreValueResults[row * numScoreValueChannels + 1]; + output->whiteLead = inputBuffers->scoreValueResults[row * numScoreValueChannels + 2]; + output->varTimeLeft = inputBuffers->scoreValueResults[row * numScoreValueChannels + 3]; + output->shorttermWinlossError = inputBuffers->scoreValueResults[row * numScoreValueChannels + 4]; + output->shorttermScoreError = inputBuffers->scoreValueResults[row * numScoreValueChannels + 5]; + } + else if(modelVersion >= 8) { + int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; + assert(numScoreValueChannels == 4); + output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; + output->whiteScoreMeanSq = inputBuffers->scoreValueResults[row * numScoreValueChannels + 1]; + output->whiteLead = inputBuffers->scoreValueResults[row * numScoreValueChannels + 2]; + output->varTimeLeft = inputBuffers->scoreValueResults[row * numScoreValueChannels + 3]; + output->shorttermWinlossError = 0; + output->shorttermScoreError = 0; + } + else if(modelVersion >= 4) { + int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; + assert(numScoreValueChannels == 2); + output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; + output->whiteScoreMeanSq = inputBuffers->scoreValueResults[row * numScoreValueChannels + 1]; + output->whiteLead = output->whiteScoreMean; + output->varTimeLeft = 0; + output->shorttermWinlossError = 0; + output->shorttermScoreError = 0; + } + else if(modelVersion >= 3) { + int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; + assert(numScoreValueChannels == 1); + output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; + //Version 3 neural nets don't have any second moment output, implicitly already folding it in, so we just use the mean squared + output->whiteScoreMeanSq = output->whiteScoreMean * output->whiteScoreMean; + output->whiteLead = output->whiteScoreMean; + output->varTimeLeft = 0; + output->shorttermWinlossError = 0; + output->shorttermScoreError = 0; + } + else { + ASSERT_UNREACHABLE; + } + } + +} + +//TESTING ---------------------------------------------------------------------------------- + + +bool NeuralNet::testEvaluateConv( + const ConvLayerDesc* desc, + int desiredBatchSize, + int nnXLen, + int nnYLen, + bool useFP16, + bool useNHWC, + const vector& inputBuffer, + vector& outputBuffer +) { + //If this build was compiled without FP16 kernel support, the half kernels are empty stubs. + testAssert(!useFP16 || customCudaFp16KernelsCompiled()); + (void)cudaDeviceSynchronize(); + CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); + + size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->inChannels; + size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->outChannels; + if(numInputFloats != inputBuffer.size()) + throw StringError("testEvaluateConv: unexpected input buffer size"); + + void* deviceInput; + void* deviceOutput; + CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); + CudaUtils::mallocOnDevice("deviceOutput", numOutputFloats, deviceOutput, useFP16); + + int maxBatchSize = desiredBatchSize; + + CudnnManager* manager = new CudnnManager("manager",maxBatchSize,nnXLen,nnYLen); + ConvLayer* convLayer = new ConvLayer(cudaHandles,manager,desc,useFP16,useNHWC); + + size_t workspaceBytes = + convLayer->requiredWorkspaceBytes(cudaHandles,desiredBatchSize); + void* deviceWorkspace; + CUDA_ERR("deviceWorkspace",cudaMalloc(&deviceWorkspace, workspaceBytes)); + + + bool accumulate = false; + convLayer->apply( + cudaHandles, + NULL, //scratch, not needed since accumulate is false + desiredBatchSize, + accumulate, + deviceInput, + deviceOutput, + deviceWorkspace, + workspaceBytes + ); + + outputBuffer.resize(numOutputFloats); + CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceOutput, useFP16); + + (void)cudaFree(deviceWorkspace); + + delete convLayer; + delete manager; + (void)cudaFree(deviceInput); + (void)cudaFree(deviceOutput); + delete cudaHandles; + + return true; +} + + +bool NeuralNet::testEvaluateBatchNorm( + const BatchNormLayerDesc* desc, + int desiredBatchSize, + int nnXLen, + int nnYLen, + bool useFP16, + bool useNHWC, + const vector& inputBuffer, + const vector& maskBuffer, + vector& outputBuffer +) { + //If this build was compiled without FP16 kernel support, the half kernels are empty stubs. + testAssert(!useFP16 || customCudaFp16KernelsCompiled()); + (void)cudaDeviceSynchronize(); + CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); + + size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->numChannels; + size_t numMaskFloats = (size_t)desiredBatchSize * nnXLen * nnYLen; + size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->numChannels; + if(numInputFloats != inputBuffer.size()) + throw StringError("testEvaluateBatchNorm: unexpected input buffer size"); + if(numMaskFloats != maskBuffer.size()) + throw StringError("testEvaluateBatchNorm: unexpected mask buffer size"); + + ActivationLayerDesc actDesc; + actDesc.activation = ACTIVATION_IDENTITY; + + void* deviceInput; + void* deviceMask; + void* deviceOutput; + CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); + CudaUtils::mallocAndCopyToDevice("deviceMask", maskBuffer.data(), numMaskFloats, deviceMask, useFP16); + CudaUtils::mallocOnDevice("deviceOutput", numOutputFloats, deviceOutput, useFP16); + + BatchNormLayer* batchNormLayer = new BatchNormLayer(cudaHandles,desc,&actDesc,nnXLen,nnYLen,useFP16,useNHWC); + + batchNormLayer->apply( + cudaHandles, + desiredBatchSize, + deviceInput, + deviceMask, + deviceOutput + ); + + outputBuffer.resize(numOutputFloats); + CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceOutput, useFP16); + + delete batchNormLayer; + + (void)cudaFree(deviceInput); + (void)cudaFree(deviceMask); + (void)cudaFree(deviceOutput); + delete cudaHandles; + + return true; +} + + +bool NeuralNet::testEvaluateResidualBlock( + const ResidualBlockDesc* desc, + int desiredBatchSize, + int nnXLen, + int nnYLen, + bool useFP16, + bool useNHWC, + const vector& inputBuffer, + const vector& maskBuffer, + vector& outputBuffer +) { + //If this build was compiled without FP16 kernel support, the half kernels are empty stubs. + testAssert(!useFP16 || customCudaFp16KernelsCompiled()); + (void)cudaDeviceSynchronize(); + CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); + + size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->preBN.numChannels; + size_t numMaskFloats = (size_t)desiredBatchSize * nnXLen * nnYLen; + size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->finalConv.outChannels; + if(numInputFloats != inputBuffer.size()) + throw StringError("testEvaluateResidualBlock: unexpected input buffer size"); + if(numMaskFloats != maskBuffer.size()) + throw StringError("testEvaluateResidualBlock: unexpected mask buffer size"); + + ScratchBuffers* scratch = new ScratchBuffers(desiredBatchSize, nnXLen, nnYLen, useFP16); + + void* deviceInput; + void* deviceMask; + void* deviceScratch; + CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); + CudaUtils::mallocAndCopyToDevice("deviceMask", maskBuffer.data(), numMaskFloats, deviceMask, useFP16); + CudaUtils::mallocOnDevice("deviceScratch", numInputFloats, deviceScratch, useFP16); + + int maxBatchSize = desiredBatchSize; + + CudnnManager* manager = new CudnnManager("manager",maxBatchSize,nnXLen,nnYLen); + ResidualBlock* residualBlock = new ResidualBlock(cudaHandles,manager,desc,nnXLen,nnYLen,useFP16,useNHWC); + + size_t workspaceBytes = + residualBlock->requiredWorkspaceBytes(cudaHandles,desiredBatchSize); + void* deviceWorkspace; + CUDA_ERR("deviceWorkspace",cudaMalloc(&deviceWorkspace, workspaceBytes)); + + residualBlock->apply( + cudaHandles, + scratch, + desiredBatchSize, + deviceInput, + deviceScratch, + deviceMask, + deviceWorkspace, + workspaceBytes + ); + + outputBuffer.resize(numOutputFloats); + CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceInput, useFP16); + + (void)cudaFree(deviceWorkspace); + + delete residualBlock; + delete manager; + (void)cudaFree(deviceInput); + (void)cudaFree(deviceMask); + (void)cudaFree(deviceScratch); + delete scratch; + delete cudaHandles; + + return true; +} + +bool NeuralNet::testEvaluateGlobalPoolingResidualBlock( + const GlobalPoolingResidualBlockDesc* desc, + int desiredBatchSize, + int nnXLen, + int nnYLen, + bool useFP16, + bool useNHWC, + const vector& inputBuffer, + const vector& maskBuffer, + vector& outputBuffer +) { + //If this build was compiled without FP16 kernel support, the half kernels are empty stubs. + testAssert(!useFP16 || customCudaFp16KernelsCompiled()); + (void)cudaDeviceSynchronize(); + CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); + + size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->preBN.numChannels; + size_t numMaskFloats = (size_t)desiredBatchSize * nnXLen * nnYLen; + size_t numMaskSumFloats = (size_t)desiredBatchSize; + size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->finalConv.outChannels; + + if(numInputFloats != inputBuffer.size()) + throw StringError("testEvaluateGlobalPoolingResidualBlock: unexpected input buffer size"); + if(numMaskFloats != maskBuffer.size()) + throw StringError("testEvaluateGlobalPoolingResidualBlock: unexpected mask buffer size"); + + ScratchBuffers* scratch = new ScratchBuffers(desiredBatchSize, nnXLen, nnYLen, useFP16); + + void* deviceInput; + void* deviceMask; + float* deviceMaskFloatOrig; + float* deviceMaskFloat; + float* deviceMaskSum; + void* deviceScratch; + + CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); + CudaUtils::mallocAndCopyToDevice("deviceMask", maskBuffer.data(), numMaskFloats, deviceMask, useFP16); + CUDA_ERR("deviceMaskFloat",cudaMalloc(reinterpret_cast(&deviceMaskFloat), numMaskFloats * sizeof(float))); + CUDA_ERR("deviceMaskSum",cudaMalloc(reinterpret_cast(&deviceMaskSum), numMaskSumFloats * sizeof(float))); + deviceMaskFloatOrig = deviceMaskFloat; + CudaUtils::mallocOnDevice("deviceScratch", numInputFloats, deviceScratch, useFP16); + + fillMaskFloatBufAndMaskSumBuf(deviceMask, deviceMaskFloat, deviceMaskSum, useFP16, desiredBatchSize, nnXLen, nnYLen); + + int maxBatchSize = desiredBatchSize; + + CudnnManager* manager = new CudnnManager("manager",maxBatchSize,nnXLen,nnYLen); + GlobalPoolingResidualBlock* residualBlock = new GlobalPoolingResidualBlock( + cudaHandles,manager,desc,nnXLen,nnYLen,useFP16,useNHWC + ); + + size_t workspaceBytes = + residualBlock->requiredWorkspaceBytes( + cudaHandles,desiredBatchSize + ); + + void* deviceWorkspace; + CUDA_ERR("deviceWorkspace",cudaMalloc(&deviceWorkspace, workspaceBytes)); + + residualBlock->apply( + cudaHandles, + scratch, + desiredBatchSize, + deviceInput, + deviceScratch, + deviceMask, + deviceMaskSum, + deviceWorkspace, + workspaceBytes + ); + + outputBuffer.resize(numOutputFloats); + CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceInput, useFP16); + + (void)cudaFree(deviceWorkspace); + + delete residualBlock; + delete manager; + + (void)cudaFree(deviceInput); + (void)cudaFree(deviceMask); + (void)cudaFree(deviceMaskFloatOrig); + (void)cudaFree(deviceMaskSum); + (void)cudaFree(deviceScratch); + delete scratch; + delete cudaHandles; + + return true; +} diff --git a/cpp/neuralnet/cudaandrocmhelpers.h b/cpp/neuralnet/cudaandrocmhelpers.h new file mode 100644 index 0000000000..e937ace159 --- /dev/null +++ b/cpp/neuralnet/cudaandrocmhelpers.h @@ -0,0 +1,172 @@ +// Declarations for the GPU kernel launchers shared between the CUDA backend (cudahelpers.cu) +// and the ROCm backend (rocmhelpers.hip), whose implementations live in cudaandrocmhelpers.inc. +// Never included directly. It is reached via cudahelpers.h or rocmhelpers.h, which provide the +// vendor headers (for the half type) and activations.h first. + +#ifndef NEURALNET_CUDAANDROCMHELPERS_H_ +#define NEURALNET_CUDAANDROCMHELPERS_H_ + +//Given two tensors with shapes inA: [n,cA,h,w] and inB: [n,cB,h,w], that are on the GPU +//Copy them into a single tensor out: [n,cA+cB,h,w] that is also allocated on the gpu +void customCudaChannelConcat(const float* inA, const float* inB, float* out, int chwA, int chwB, int n); +void customCudaChannelConcat(const half* inA, const half* inB, half* out, int chwA, int chwB, int n); + +//Given a tensor [n,c,hw], extract out channel 0 to [n,hw] +void customCudaChannel0ExtractNCHW(const float* in, float* out, int n, int c, int hw); +void customCudaChannel0ExtractNCHW(const half* in, half* out, int n, int c, int hw); +//Given a tensor [n,hw,c], extract out channel 0 to [n,hw] +void customCudaChannel0ExtractNHWC(const float* in, float* out, int n, int hw, int c); +void customCudaChannel0ExtractNHWC(const half* in, half* out, int n, int hw, int c); + +//Given an input tensor and an output buffer of shape [n,c], fill output buffer with sum or max over c. +void customCudaPoolRowsSumNCHW(const float* in, float* out, int nSize, int cSize, int xySize, float scaleSum); +void customCudaPoolRowsSumNHWC(const float* in, float* out, int nSize, int xySize, int cSize, float scaleSum); + +//Specialized operations for value head and general global pooling. Same as the other pooling, but fusedly fills +//an output buffer of shape [n,c*3]. +void customCudaValueHeadPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* maskSum); +void customCudaValueHeadPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* maskSum); +void customCudaPoolRowsGPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* mask, const float* maskSum); +void customCudaPoolRowsGPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* mask, const float* maskSum); +void customCudaPoolRowsGPoolNCHW(const half* in, half* out, int nSize, int cSize, int xySize, const half* mask, const float* maskSum); +void customCudaPoolRowsGPoolNHWC(const half* in, half* out, int nSize, int xySize, int cSize, const half* mask, const float* maskSum); + +void customCudaCopyToHalf(const float* in, half* out, int n); +void customCudaCopyFromHalf(const half* in, float* out, int n); + +//Given a tensor, add another tensor element-wise to it (same shape). +void customCudaAddTensorInplace(float* buf, const float* biases, int n); +void customCudaAddTensorInplace(half* buf, const half* biases, int n); + +//Batched transpose between NCHW [n,c,xy] and NHWC [n,xy,c] layouts. Used by the ROCm backend to +//convert the uploaded input tensor to the model's layout before the initial convolution when the +//two differ, since MIOpen (unlike cuDNN) requires all tensors of a convolution to share one +//layout. The kernel bodies are only compiled on ROCm, but the declarations are harmless on CUDA. +void customCudaCopyNCHWtoNHWC(const float* in, float* out, int nSize, int cSize, int xySize); +void customCudaCopyNCHWtoNHWC(const half* in, half* out, int nSize, int cSize, int xySize); +void customCudaCopyNHWCtoNCHW(const float* in, float* out, int nSize, int cSize, int xySize); +void customCudaCopyNHWCtoNCHW(const half* in, half* out, int nSize, int cSize, int xySize); + +//Whether the half-precision kernels in this compilation unit have real bodies. Always true for +//CUDA, where half kernel bodies are gated per-arch on __CUDA_ARCH__ and the backend refuses FP16 +//at runtime on archs below compute capability 5.3. On ROCm it is false if the build system did +//not define HIP_SUPPORTS_FP16, in which case the backend must not run FP16. +bool customCudaFp16KernelsCompiled(); +//Given an input with shape [n,c] and biases of shape [c], add the biases in-place. +void customCudaAddCBiasInplaceNC(float* buf, const float* biases, int n, int c, int activation); +void customCudaAddCBiasInplaceNC(half* buf, const half* biases, int n, int c, int activation); +//Given an input with shape [n,c,xy] and biases of shape [n,c], add the biases in-place. +void customCudaAddNCBiasInplaceNCHW(float *buf, const float* biases, int nSize, int cSize, int xySize); +void customCudaAddNCBiasInplaceNCHW(half *buf, const half* biases, int nSize, int cSize, int xySize); +//Given an input with shape [n,xy,c] and biases of shape [n,c], add the biases in-place. +void customCudaAddNCBiasInplaceNHWC(float *buf, const float* biases, int nSize, int xySize, int cSize); +void customCudaAddNCBiasInplaceNHWC(half *buf, const half* biases, int nSize, int xySize, int cSize); + +//Given an input with shape [n,c,xy] and scale and biases of shape [c], multiply by scale and add the biases +//Optionally also apply an activation. +//Optionally also multiply by mask (can be null), with shape [n,xy] +void customCudaApplyCScaleBiasNCHW(const float* in, float* out, const float* scale, const float* biases, const float* mask, int n, int c, int xy, int activation); +void customCudaApplyCScaleBiasNCHW(const half* in, half* out, const half* scale, const half* biases, const half* mask, int n, int c, int xy, int activation); +//Given an input with shape [n,xy,c] and scale and biases of shape [c], multiply by scale and add the biases +//Optionally also apply relu. +//Optionally also multiply by mask (can be null), with shape [n,xy] +void customCudaApplyCScaleBiasNHWC(const float* in, float* out, const float* scale, const float* biases, const float* mask, int n, int xy, int c, int activation); +void customCudaApplyCScaleBiasNHWC(const half* in, half* out, const half* scale, const half* biases, const half* mask, int n, int xy, int c, int activation); + +//============================================================================================== +// Transformer support kernels +//============================================================================================== + +//Apply rotary position embeddings in-place to a BSHD-laid-out Q or K buffer. +//buf: [totalDim, seqLen*batchSize] column-major (totalDim = numBufHeads*qHeadDim). +//cosTable/sinTable: (numPairs, seqLen) if !learnableRope, else (numKVHeads, numPairs, seqLen). +void customCudaApplyRoPE( + float* buf, const float* cosTable, const float* sinTable, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope +); +void customCudaApplyRoPE( + half* buf, const half* cosTable, const half* sinTable, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope +); +//Table-free learnable RoPE: recomputes cos/sin in-kernel from per-head frequencies (numKVHeads, numPairs, 2) flattened. +void customCudaApplyRoPELearnableRecompute( + float* buf, const float* freqs, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen +); +void customCudaApplyRoPELearnableRecompute( + half* buf, const float* freqs, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen +); + +//Scaled dot product attention (online-softmax, tiled). Q/K/V/output are BSHD row-major. +//mask (can be null) is [batchSize, seqLen]. +void customCudaFlashAttention( + const float* Q, const float* K, const float* V, const float* mask, float* output, + int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim +); +void customCudaFlashAttention( + const half* Q, const half* K, const half* V, const half* mask, half* output, + int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim +); + +//SwiGLU: out[i] = SiLU(a[i]) * b[i] +void customCudaSwiGLU(const float* a, const float* b, float* out, int size); +void customCudaSwiGLU(const half* a, const half* b, half* out, int size); + +//Convert mask [batchSize, seqLen] (0/1) into a fully-materialized additive attention bias of shape +//[batchSize, seqLen, seqLen]: bias[b,q,k] = (mask[b,k] != 0 ? 0 : -3e4). Used to feed KataGo's +//mask into the fused attention paths - cudnn-frontend graph SDPA on CUDA (as a [B,1,S,S] bias) +//and Composable Kernel (CK) FMHA on ROCm - which (unlike the plain kernel) need the bias pre-materialized rather +//than taking the raw per-position mask. See the kernel comment in cudaandrocmhelpers.inc for +//why -3e4 masks exactly even in FP16. +void customCudaMaskToAttnBiasFull(const float* mask, float* outBias, int batchSize, int seqLen); +void customCudaMaskToAttnBiasFull(const half* mask, half* outBias, int batchSize, int seqLen); + +//Masked residual add: trunk[i] += residual[i] * mask[spatial_idx]. mask can be null (treated as all ones). +//NCHW: trunk/residual [n,c,xy], mask [n,xy]. NHWC: trunk/residual [n,xy,c], mask [n,xy]. +void customCudaMaskedResidualAddNCHW(float* trunk, const float* residual, const float* mask, int nSize, int cSize, int xySize); +void customCudaMaskedResidualAddNCHW(half* trunk, const half* residual, const half* mask, int nSize, int cSize, int xySize); +void customCudaMaskedResidualAddNHWC(float* trunk, const float* residual, const float* mask, int nSize, int xySize, int cSize); +void customCudaMaskedResidualAddNHWC(half* trunk, const half* residual, const half* mask, int nSize, int xySize, int cSize); + +//RMSNorm with gamma/beta/activation, non-spatial mode (for transformer pre-norm and trunk tip). +//NHWC: input/output [n,xy,c], gamma/beta [c], mask [n,xy] (can be null). +void customCudaRMSNormGammaBetaNHWC( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +); +void customCudaRMSNormGammaBetaNHWC( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +); +//NCHW: input/output [n,c,xy], gamma/beta [c], mask [n,xy] (can be null). +void customCudaRMSNormGammaBetaNCHW( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + int nSize, int cSize, int xySize, float epsilon, int activation +); +void customCudaRMSNormGammaBetaNCHW( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int cSize, int xySize, float epsilon, int activation +); + +//Spatial RMSNorm: normalizes over all C*H*W per batch element (rather than per-position over C). +//sumSqBuf must be a scratch buffer of size nSize * CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE floats. +#define CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE 9 // SPATIAL_RMSNORM_BLOCKS_PER_BATCH (8) partials + 1 final +void customCudaSpatialRMSNormNHWC( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, + int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf +); +void customCudaSpatialRMSNormNHWC( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, + int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf +); +void customCudaSpatialRMSNormNCHW( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, + int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf +); +void customCudaSpatialRMSNormNCHW( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, + int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf +); + +#endif // NEURALNET_CUDAANDROCMHELPERS_H_ diff --git a/cpp/neuralnet/cudaandrocmhelpers.inc b/cpp/neuralnet/cudaandrocmhelpers.inc new file mode 100644 index 0000000000..b43ea1f23a --- /dev/null +++ b/cpp/neuralnet/cudaandrocmhelpers.inc @@ -0,0 +1,3685 @@ +// Shared GPU kernel implementations for the CUDA and ROCm backends. +// +// This file is not compiled directly. It is #included by exactly one of +// cudahelpers.cu (CUDA backend, compiled by nvcc) +// rocmhelpers.hip (ROCm backend, compiled by hip clang) +// HIP is deliberately CUDA-syntax-compatible, so nearly everything here (chevron kernel launches, +// dim3, __half/half2 intrinsics, shared memory, libm device functions) compiles identically for +// both. The wrapper that includes this file must define: +// KATAGO_GPU_CUDA or KATAGO_GPU_HIP - which platform is being compiled, used to gate the few +// kernels that cannot be shared. +// KATAGO_GPU_SUPPORTS_FP16 - defined iff the half-precision kernel bodies should be compiled. +// On CUDA it is defined per-device-arch from __CUDA_ARCH__. On ROCm it comes from the build +// system's HIP_SUPPORTS_FP16 for all archs at once, and its absence is queryable at runtime +// via customCudaFp16KernelsCompiled() so the backend can refuse FP16 loudly instead of +// silently running the empty kernel bodies. +// KATAGO_GPU_SINCOSF - device sincosf used by the RoPE kernels. CUDA maps it to the fast +// approximate __sincosf and ROCm to the precise sincosf, a deliberate precision/speed +// divergence that preserves each backend's existing numerics even though HIP also provides +// __sincosf. __expf exists on both platforms and is used directly below without a macro. +// The function names retain the historical customCuda* prefix on both platforms, which is +// unambiguous because only one backend is ever compiled into a build. +// +// When editing: anything outside a KATAGO_GPU_* ifdef must remain valid for BOTH compilers - in +// particular avoid warp-size assumptions (__shfl*_sync with 32-bit masks, hardcoded 32-lane +// reductions) outside KATAGO_GPU_CUDA regions, since AMD wavefronts are 64 lanes wide on CDNA. + +#ifdef KATAGO_HELPERS_INC_INCLUDED +#error "cudaandrocmhelpers.inc may only be included once" +#endif +#define KATAGO_HELPERS_INC_INCLUDED 1 + +#include +#include + + +//TODO maybe tune this number, it varies by GPU +static const int targetNumThreads = 512; + +// The custom kernels below compute flattened element indices in 32-bit int (e.g. +// (n*cSize+c)*xySize+xy). For every board/batch/channel size KataGo actually runs this stays well +// under INT_MAX, but an extreme size would silently overflow into out-of-bounds memory access rather +// than fail cleanly. Guard the launchers: throw loudly if the total element count (the largest index +// any kernel here forms) does not fit in a positive int. Takes the dimensions as int64 so the +// product itself can't overflow during the check. +static void checkBufferIndexFitsInt(int64_t a, int64_t b, int64_t c, const char* whatKernel) { + int64_t total = a * b * c; + if(total >= (int64_t)2147483647) // INT_MAX; indices range over [0,total) so total itself must fit + throw std::runtime_error( + std::string(whatKernel) + ": total element count " + std::to_string(total) + + " exceeds the 32-bit index limit used by this kernel"); +} + +static void splitThreadsAcrossDim01(int dim0Size, int dim1Size, int& threads0, int& blocks0, int& threads1, int& blocks1) { + if(dim0Size > targetNumThreads) { + threads0 = targetNumThreads/2; + blocks0 = (dim0Size + threads0 - 1) / threads0; + threads1 = 1; + blocks1 = dim1Size; + } + else if(dim0Size > targetNumThreads/2) { + threads0 = dim0Size; + blocks0 = 1; + threads1 = 1; + blocks1 = dim1Size; + } + else { + threads0 = dim0Size; + blocks0 = 1; + threads1 = targetNumThreads / dim0Size; + blocks1 = (dim1Size + threads1 - 1) / threads1; + } +} + +__forceinline__ __device__ float mishf(float a) { + return a * tanhf(a < 20.0f ? log1pf(expf(a)) : a); +} +__forceinline__ __device__ float mishf_scale8(float a) { + return a < 2.5f ? a * tanhf(log1pf(expf(a*8.0f))) : a; +} + +#ifdef KATAGO_GPU_SUPPORTS_FP16 +__forceinline__ __device__ half mishh(half h) { + float a = __half2float(h); + return __float2half(a * tanhf(a < 20.0f ? log1pf(expf(a)) : a)); +} +__forceinline__ __device__ half mishh_scale8(half h) { + float a = __half2float(h); + return __float2half(a < 2.5f ? a * tanhf(log1pf(expf(a*8.0f))) : a); +} +__forceinline__ __device__ half siluh(half h) { + float a = __half2float(h); + return __float2half(a / (1.0f + expf(-a))); +} +#endif + +__forceinline__ __device__ float siluf(float x) { + return x / (1.0f + expf(-x)); +} + +//-------------------------------------------------------------------------------------------------------------- + +template +__global__ +void channelConcatKernel( + const T* inA, + const T* inB, + T* out, + int chwA, + int chwB, + int numBlocksA, + int numBlocksB, + int n +) { + if(blockIdx.x < numBlocksA) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if(index < chwA) { + int nchwA = n*chwA; + int chwOut = (chwA+chwB); + + int aIdx = index; + int outIdx = index; + while(aIdx < nchwA) { + out[outIdx] = inA[aIdx]; + aIdx += chwA; + outIdx += chwOut; + } + } + } + else { + int index = (blockIdx.x - numBlocksA) * blockDim.x + threadIdx.x; + if(index < chwB) { + int nchwB = n*chwB; + int chwOut = (chwA+chwB); + + int bIdx = index; + int outIdx = chwA+index; + while(bIdx < nchwB) { + out[outIdx] = inB[bIdx]; + bIdx += chwB; + outIdx += chwOut; + } + } + } +} + +template +void customCudaChannelConcatTemplate(const T* inA, const T* inB, T* out, int chwA, int chwB, int n) { + //The kernel forms indices up to n*(chwA+chwB) in 32-bit int. + checkBufferIndexFitsInt(n, (int64_t)chwA + chwB, 1, "customCudaChannelConcat"); + int blockSize = targetNumThreads; + int numBlocksA = (chwA + blockSize-1) / blockSize; + int numBlocksB = (chwB + blockSize-1) / blockSize; + int numBlocks = numBlocksA + numBlocksB; + channelConcatKernel<<>>(inA,inB,out,chwA,chwB,numBlocksA,numBlocksB,n); +} +template void customCudaChannelConcatTemplate(const float* inA, const float* inB, float* out, int chwA, int chwB, int n); +template void customCudaChannelConcatTemplate(const half* inA, const half* inB, half* out, int chwA, int chwB, int n); + +void customCudaChannelConcat(const float* inA, const float* inB, float* out, int chwA, int chwB, int n) { + customCudaChannelConcatTemplate(inA,inB,out,chwA,chwB,n); +} +void customCudaChannelConcat(const half* inA, const half* inB, half* out, int chwA, int chwB, int n) { + customCudaChannelConcatTemplate(inA,inB,out,chwA,chwB,n); +} + +//-------------------------------------------------------------------------------------------------------------- + +template +__global__ +void extractChannel0KernelNHWC(const T *in, T* out, int nhwSize, int cSize) +{ + int nhwIdx = blockIdx.x * blockDim.x + threadIdx.x; + if(nhwIdx < nhwSize) { + out[nhwIdx] = in[nhwIdx*cSize]; + } +} +template +void customCudaChannel0ExtractNHWCTemplate(const T *in, T* out, int n, int hw, int c) { + int nhw = n*hw; + int blockSize = targetNumThreads; + int numBlocks = (nhw+blockSize-1)/blockSize; + extractChannel0KernelNHWC<<>>(in,out,nhw,c); +} + +template +__global__ +void extractChannel0KernelNCHW(const T *in, T* out, int nSize, int cSize, int hwSize) +{ + int hwIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(hwIdx < hwSize && nIdx < nSize) { + out[nIdx * hwSize + hwIdx] = in[nIdx * cSize * hwSize + hwIdx]; + } +} +template +void customCudaChannel0ExtractNCHWTemplate(const T *in, T* out, int nSize, int cSize, int hwSize) { + int hwThreads; + int hwBlocks; + int nThreads; + int nBlocks; + splitThreadsAcrossDim01(hwSize, nSize, hwThreads, hwBlocks, nThreads, nBlocks); + + if(nBlocks > 65535) + throw std::runtime_error("customCudaChannel0ExtractNCHW: nSize too large given hwSize"); + + dim3 grid(hwBlocks,nBlocks,1); + dim3 threads(hwThreads,nThreads,1); + extractChannel0KernelNCHW<<>>(in,out,nSize,cSize,hwSize); +} + +void customCudaChannel0ExtractNCHW(const float* in, float* out, int n, int c, int hw) { + customCudaChannel0ExtractNCHWTemplate(in,out,n,c,hw); +} +void customCudaChannel0ExtractNCHW(const half* in, half* out, int n, int c, int hw) { + customCudaChannel0ExtractNCHWTemplate(in,out,n,c,hw); +} +void customCudaChannel0ExtractNHWC(const float* in, float* out, int n, int hw, int c) { + customCudaChannel0ExtractNHWCTemplate(in,out,n,hw,c); +} +void customCudaChannel0ExtractNHWC(const half* in, half* out, int n, int hw, int c) { + customCudaChannel0ExtractNHWCTemplate(in,out,n,hw,c); +} + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void sumChannelsNCHWKernel(const float* in, float* out, int cSize, int xySize, float scaleSum) +{ + extern __shared__ float sumPoolNCHWShared[]; + int xyId = threadIdx.x; + int xyBlockDim = blockDim.x; + int cId = threadIdx.y; + int cBlockDim = blockDim.y; + int cIdx = blockIdx.y * cBlockDim + cId; + int nIdx = blockIdx.z; + + int xycSize = xySize*cSize; + int sharedIdx = xyId + cId * xyBlockDim; + + float acc = 0.0f; + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + acc += in[xyIdx + cIdx * xySize + nIdx * xycSize]; + xyIdx += xyBlockDim; + } + } + //Store unconditionally (like the NHWC variants) so the reduction below never reads + //uninitialized shared memory in rows where cIdx >= cSize. + sumPoolNCHWShared[sharedIdx] = acc; + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumPoolNCHWShared[sharedIdx] += sumPoolNCHWShared[sharedIdx + s]; + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) + out[cIdx + nIdx * cSize] = sumPoolNCHWShared[sharedIdx] * scaleSum; +} +__global__ +void valueHeadPoolChannelsNCHWKernel(const float* in, float* out, int nSize, int cSize, int xySize, const float* maskSum) +{ + extern __shared__ float sumPoolNCHWShared[]; + int xyId = threadIdx.x; + int xyBlockDim = blockDim.x; + int cId = threadIdx.y; + int cBlockDim = blockDim.y; + int cIdx = blockIdx.y * cBlockDim + cId; + int nIdx = blockIdx.z; + + int xycSize = xySize*cSize; + int sharedIdx = xyId + cId * xyBlockDim; + + float acc = 0.0f; + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + acc += in[xyIdx + cIdx * xySize + nIdx * xycSize]; + xyIdx += xyBlockDim; + } + } + sumPoolNCHWShared[sharedIdx] = acc; + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumPoolNCHWShared[sharedIdx] += sumPoolNCHWShared[sharedIdx + s]; + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumPoolNCHWShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + out[cIdx + nIdx * cSize*3] = mean; + out[cIdx + nIdx * cSize*3 + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; + out[cIdx + nIdx * cSize*3 + cSize*2] = mean * ((sqrtdiv - 14.0f) * (sqrtdiv - 14.0f) * 0.01f - 0.1f); + } +} +__global__ +void gPoolChannelsNCHWKernel(const float* in, float* out, int cSize, int xySize, const float* maskSum, int sharedMemElts) +{ + extern __shared__ float poolNCHWShared[]; + float* sumShared = (float*)poolNCHWShared; + float* maxShared = (float*)poolNCHWShared + sharedMemElts; + + int xyId = threadIdx.x; + int xyBlockDim = blockDim.x; + int cId = threadIdx.y; + int cBlockDim = blockDim.y; + int cIdx = blockIdx.y * cBlockDim + cId; + int nIdx = blockIdx.z; + + int xycSize = xySize*cSize; + int sharedIdx = xyId + cId * xyBlockDim; + + if(cIdx < cSize) { + float accSum = 0.0f; + float accMax = -1.0f; + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = in[xyIdx + cIdx * xySize + nIdx * xycSize]; + accSum += a; + accMax = fmaxf(accMax, a); + xyIdx += xyBlockDim; + } + sumShared[sharedIdx] = accSum; + maxShared[sharedIdx] = accMax; + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = mean; + out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; + out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; + } +} +__global__ +void gPoolChannelsNCHWMaskKernel(const float* in, float* out, int cSize, int xySize, const float* mask, const float* maskSum, int sharedMemElts) +{ + extern __shared__ float poolNCHWShared[]; + float* sumShared = (float*)poolNCHWShared; + float* maxShared = (float*)poolNCHWShared + sharedMemElts; + + int xyId = threadIdx.x; + int xyBlockDim = blockDim.x; + int cId = threadIdx.y; + int cBlockDim = blockDim.y; + int cIdx = blockIdx.y * cBlockDim + cId; + int nIdx = blockIdx.z; + + int xycSize = xySize*cSize; + int sharedIdx = xyId + cId * xyBlockDim; + + if(cIdx < cSize) { + float accSum = 0.0f; + float accMax = -1.0f; + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = in[xyIdx + cIdx * xySize + nIdx * xycSize]; + accSum += a; + // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 + // which is lower than the lowest value that any current activation function will produce. + // so the max over all valid spaces will the same as the mask over all spaces including padding + // We're relying on all padded space being equal to 0 because this gpool only ever follows a BN+Activate with a mask. + accMax = fmaxf(accMax, a + (mask[xyIdx + nIdx * xySize] - 1.0f)); + xyIdx += xyBlockDim; + } + sumShared[sharedIdx] = accSum; + maxShared[sharedIdx] = accMax; + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = mean; + out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; + out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; + } +} + +void customCudaPoolRowsSumNCHW(const float* in, float* out, int nSize, int cSize, int xySize, float scaleSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaPoolRowsSumNCHW: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaPoolRowsSumNCHW: cSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaPoolRowsSumNCHW"); + + //Use up as many threads as possible along the xy dimension. + int xyThreads = 1; + while(xyThreads < targetNumThreads && xyThreads < xySize/2) + xyThreads *= 2; + + //Distribute the extra threads along the c dimension. + int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //We need one shared memory spot per thread + int sharedMemSize = sizeof(float) * cThreads * xyThreads; + + dim3 grid(1,cBlocks,nSize); + dim3 threads(xyThreads,cThreads,1); + sumChannelsNCHWKernel<<>>(in,out,cSize,xySize,scaleSum); +} +void customCudaValueHeadPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* maskSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaValueHeadPoolNCHW: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaValueHeadPoolNCHW: cSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaValueHeadPoolNCHW"); + + //Use up as many threads as possible along the xy dimension. + int xyThreads = 1; + while(xyThreads < targetNumThreads && xyThreads < xySize/2) + xyThreads *= 2; + + //Distribute the extra threads along the c dimension. + int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //We need one shared memory spot per thread + int sharedMemSize = sizeof(float) * cThreads * xyThreads; + + dim3 grid(1,cBlocks,nSize); + dim3 threads(xyThreads,cThreads,1); + valueHeadPoolChannelsNCHWKernel<<>>(in,out,nSize,cSize,xySize,maskSum); +} +void customCudaPoolRowsGPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* mask, const float* maskSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNCHW: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNCHW: cSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaPoolRowsGPoolNCHW"); + + //Use up as many threads as possible along the xy dimension. + int xyThreads = 1; + while(xyThreads < targetNumThreads && xyThreads < xySize/2) + xyThreads *= 2; + + //Distribute the extra threads along the c dimension. + int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //We need one shared memory spot per thread, and then we double it because we need both sum and max. + //We also make sure it's a power of two to address any alignment concerns. + int sharedMemElts = 128; + while(sharedMemElts < cThreads * xyThreads) + sharedMemElts *= 2; + int sharedMemSize = sizeof(float) * sharedMemElts * 2; + + dim3 grid(1,cBlocks,nSize); + dim3 threads(xyThreads,cThreads,1); + if(mask != NULL) + gPoolChannelsNCHWMaskKernel<<>>(in,out,cSize,xySize,mask,maskSum,sharedMemElts); + else + gPoolChannelsNCHWKernel<<>>(in,out,cSize,xySize,maskSum,sharedMemElts); +} + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void gPoolChannelsNCHWHalfKernel(const half* in, half* out, int cSize, int xySize, const float* maskSum, int sharedMemElts) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float poolNCHWShared[]; + float* sumShared = (float*)poolNCHWShared; + float* maxShared = (float*)poolNCHWShared + sharedMemElts; + + int xyId = threadIdx.x; + int xyBlockDim = blockDim.x; + int cId = threadIdx.y; + int cBlockDim = blockDim.y; + int cIdx = blockIdx.y * cBlockDim + cId; + int nIdx = blockIdx.z; + + int xycSize = xySize*cSize; + int sharedIdx = xyId + cId * xyBlockDim; + + if(cIdx < cSize) { + float accSum = 0.0f; + float accMax = -1.0f; + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = __half2float(in[xyIdx + cIdx * xySize + nIdx * xycSize]); + accSum += a; + accMax = fmaxf(accMax, a); + xyIdx += xyBlockDim; + } + sumShared[sharedIdx] = accSum; + maxShared[sharedIdx] = accMax; + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = __float2half(mean); + out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); + out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void gPoolChannelsNCHWHalfMaskKernel(const half* in, half* out, int cSize, int xySize, const half* mask, const float* maskSum, int sharedMemElts) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float poolNCHWShared[]; + float* sumShared = (float*)poolNCHWShared; + float* maxShared = (float*)poolNCHWShared + sharedMemElts; + + int xyId = threadIdx.x; + int xyBlockDim = blockDim.x; + int cId = threadIdx.y; + int cBlockDim = blockDim.y; + int cIdx = blockIdx.y * cBlockDim + cId; + int nIdx = blockIdx.z; + + int xycSize = xySize*cSize; + int sharedIdx = xyId + cId * xyBlockDim; + + if(cIdx < cSize) { + float accSum = 0.0f; + float accMax = -1.0f; + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = __half2float(in[xyIdx + cIdx * xySize + nIdx * xycSize]); + accSum += a; + // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 + // which is lower than the lowest value that any current activation function will produce. + // so the max over all valid spaces will the same as the mask over all spaces including padding + accMax = fmaxf(accMax, a + (__half2float(mask[xyIdx + nIdx * xySize]) - 1.0f)); + xyIdx += xyBlockDim; + } + sumShared[sharedIdx] = accSum; + maxShared[sharedIdx] = accMax; + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = __float2half(mean); + out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); + out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} + +void customCudaPoolRowsGPoolNCHW(const half* in, half* out, int nSize, int cSize, int xySize, const half* mask, const float* maskSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNCHW: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNCHW: cSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaPoolRowsGPoolNCHW"); + + //Use up as many threads as possible along the xy dimension. + int xyThreads = 1; + while(xyThreads < targetNumThreads && xyThreads < xySize/2) + xyThreads *= 2; + + //Distribute the extra threads along the c dimension. + int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //We need one shared memory spot per thread, and then we double it because we need both sum and max. + //We also make sure it's a power of two to address any alignment concerns. + int sharedMemElts = 128; + while(sharedMemElts < cThreads * xyThreads) + sharedMemElts *= 2; + int sharedMemSize = sizeof(float) * sharedMemElts * 2; + + dim3 grid(1,cBlocks,nSize); + dim3 threads(xyThreads,cThreads,1); + if(mask != NULL) + gPoolChannelsNCHWHalfMaskKernel<<>>(in,out,cSize,xySize,mask,maskSum,sharedMemElts); + else + gPoolChannelsNCHWHalfKernel<<>>(in,out,cSize,xySize,maskSum,sharedMemElts); +} + + + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void sumChannelsNHWCKernel(const float* in, float* out, int xySize, int cSize, float scaleSum) +{ + extern __shared__ float sumPoolNHWCShared[]; + int cId = threadIdx.x; + int cBlockDim = blockDim.x; + int xyId = threadIdx.y; + int xyBlockDim = blockDim.y; + + int cIdx = blockIdx.x * cBlockDim + cId; + int nIdx = blockIdx.z; + int sharedIdx = cId + cBlockDim * xyId; + int xycSize = xySize*cSize; + + sumPoolNHWCShared[sharedIdx] = 0; + + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + sumPoolNHWCShared[sharedIdx] += in[cIdx + xyIdx * cSize + nIdx * xycSize]; + xyIdx += xyBlockDim; + } + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumPoolNHWCShared[sharedIdx] += sumPoolNHWCShared[sharedIdx + cBlockDim * s]; + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) + out[cIdx + nIdx * cSize] = sumPoolNHWCShared[sharedIdx] * scaleSum; +} +__global__ +void valueHeadPoolChannelsNHWCKernel(const float* in, float* out, int nSize, int xySize, int cSize, const float* maskSum) +{ + extern __shared__ float sumPoolNHWCShared[]; + int cId = threadIdx.x; + int cBlockDim = blockDim.x; + int xyId = threadIdx.y; + int xyBlockDim = blockDim.y; + + int cIdx = blockIdx.x * cBlockDim + cId; + int nIdx = blockIdx.z; + int sharedIdx = cId + cBlockDim * xyId; + int xycSize = xySize*cSize; + + sumPoolNHWCShared[sharedIdx] = 0; + + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + sumPoolNHWCShared[sharedIdx] += in[cIdx + xyIdx * cSize + nIdx * xycSize]; + xyIdx += xyBlockDim; + } + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumPoolNHWCShared[sharedIdx] += sumPoolNHWCShared[sharedIdx + cBlockDim * s]; + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumPoolNHWCShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + out[cIdx + nIdx * cSize*3] = mean; + out[cIdx + nIdx * cSize*3 + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; + out[cIdx + nIdx * cSize*3 + cSize*2] = mean * ((sqrtdiv - 14.0f) * (sqrtdiv - 14.0f) * 0.01f - 0.1f); + } +} +__global__ +void gPoolChannelsNHWCKernel(const float* in, float* out, int xySize, int cSize, const float* maskSum, int sharedMemElts) +{ + extern __shared__ float poolNHWCShared[]; + float* sumShared = (float*)poolNHWCShared; + float* maxShared = (float*)poolNHWCShared + sharedMemElts; + + int cId = threadIdx.x; + int cBlockDim = blockDim.x; + int xyId = threadIdx.y; + int xyBlockDim = blockDim.y; + + int cIdx = blockIdx.x * cBlockDim + cId; + int nIdx = blockIdx.z; + int sharedIdx = cId + cBlockDim * xyId; + int xycSize = xySize*cSize; + + sumShared[sharedIdx] = 0; + maxShared[sharedIdx] = -1.0f; + + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = in[cIdx + xyIdx * cSize + nIdx * xycSize]; + sumShared[sharedIdx] += a; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a); + xyIdx += xyBlockDim; + } + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = mean; + out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; + out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; + } +} +__global__ +void gPoolChannelsNHWCMaskKernel(const float* in, float* out, int xySize, int cSize, const float* mask, const float* maskSum, int sharedMemElts) +{ + extern __shared__ float poolNHWCShared[]; + float* sumShared = (float*)poolNHWCShared; + float* maxShared = (float*)poolNHWCShared + sharedMemElts; + + int cId = threadIdx.x; + int cBlockDim = blockDim.x; + int xyId = threadIdx.y; + int xyBlockDim = blockDim.y; + + int cIdx = blockIdx.x * cBlockDim + cId; + int nIdx = blockIdx.z; + int sharedIdx = cId + cBlockDim * xyId; + int xycSize = xySize*cSize; + + sumShared[sharedIdx] = 0; + maxShared[sharedIdx] = -1.0f; + + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = in[cIdx + xyIdx * cSize + nIdx * xycSize]; + sumShared[sharedIdx] += a; + // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 + // which is lower than the lowest value that any current activation function will produce. + // so the max over all valid spaces will the same as the mask over all spaces including padding + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a + (mask[xyIdx + nIdx * xySize] - 1.0f)); + xyIdx += xyBlockDim; + } + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = mean; + out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; + out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; + } +} + + +void customCudaPoolRowsSumNHWC(const float* in, float* out, int nSize, int xySize, int cSize, float scaleSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaPoolRowsSumNHWC: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaPoolRowsSumNHWC: cSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaPoolRowsSumNHWC"); + + //Use up to two warps worth of threads along the channel dimension, which is the + //most compact + int cThreads = 1; + while(cThreads < 64 && cThreads < cSize/2) + cThreads *= 2; + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //Distribute the extra threads to perform parallel reduction along the xy dimension. + int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); + + //We need one shared memory spot per thread + int sharedMemSize = sizeof(float) * cThreads * xyThreads; + + dim3 grid(cBlocks,1,nSize); + dim3 threads(cThreads,xyThreads,1); + sumChannelsNHWCKernel<<>>(in,out,xySize,cSize,scaleSum); +} + +void customCudaValueHeadPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* maskSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaValueHeadPoolNHWC: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaValueHeadPoolNHWC: cSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaValueHeadPoolNHWC"); + + //Use up to two warps worth of threads along the channel dimension, which is the + //most compact + int cThreads = 1; + while(cThreads < 64 && cThreads < cSize/2) + cThreads *= 2; + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //Distribute the extra threads to perform parallel reduction along the xy dimension. + int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); + + //We need one shared memory spot per thread + int sharedMemSize = sizeof(float) * cThreads * xyThreads; + + dim3 grid(cBlocks,1,nSize); + dim3 threads(cThreads,xyThreads,1); + valueHeadPoolChannelsNHWCKernel<<>>(in,out,nSize,xySize,cSize,maskSum); +} + +void customCudaPoolRowsGPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* mask, const float* maskSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNHWC: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNHWC: cSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaPoolRowsGPoolNHWC"); + + //Use up to two warps worth of threads along the channel dimension, which is the + //most compact + int cThreads = 1; + while(cThreads < 64 && cThreads < cSize/2) + cThreads *= 2; + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //Distribute the extra threads to perform parallel reduction along the xy dimension. + int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); + + //We need one shared memory spot per thread, and then we double it because we need both sum and max. + //We also make sure it's a power of two to address any alignment concerns. + int sharedMemElts = 128; + while(sharedMemElts < cThreads * xyThreads) + sharedMemElts *= 2; + int sharedMemSize = sizeof(float) * sharedMemElts * 2; + + dim3 grid(cBlocks,1,nSize); + dim3 threads(cThreads,xyThreads,1); + if(mask != NULL) + gPoolChannelsNHWCMaskKernel<<>>(in,out,xySize,cSize,mask,maskSum,sharedMemElts); + else + gPoolChannelsNHWCKernel<<>>(in,out,xySize,cSize,maskSum,sharedMemElts); +} + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void gPoolChannelsNHWCHalfKernel(const half* in, half* out, int xySize, int cSize, const float* maskSum, int sharedMemElts) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float poolNHWCShared[]; + float* sumShared = (float*)poolNHWCShared; + float* maxShared = (float*)poolNHWCShared + sharedMemElts; + + int cId = threadIdx.x; + int cBlockDim = blockDim.x; + int xyId = threadIdx.y; + int xyBlockDim = blockDim.y; + + int cIdx = blockIdx.x * cBlockDim + cId; + int nIdx = blockIdx.z; + int sharedIdx = cId + cBlockDim * xyId; + int xycSize = xySize*cSize; + + sumShared[sharedIdx] = 0; + maxShared[sharedIdx] = -1.0f; + + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = __half2float(in[cIdx + xyIdx * cSize + nIdx * xycSize]); + sumShared[sharedIdx] += a; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a); + xyIdx += xyBlockDim; + } + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = __float2half(mean); + out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); + out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void gPoolChannelsNHWCHalfMaskKernel(const half* in, half* out, int xySize, int cSize, const half* mask, const float* maskSum, int sharedMemElts) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float poolNHWCShared[]; + float* sumShared = (float*)poolNHWCShared; + float* maxShared = (float*)poolNHWCShared + sharedMemElts; + + int cId = threadIdx.x; + int cBlockDim = blockDim.x; + int xyId = threadIdx.y; + int xyBlockDim = blockDim.y; + + int cIdx = blockIdx.x * cBlockDim + cId; + int nIdx = blockIdx.z; + int sharedIdx = cId + cBlockDim * xyId; + int xycSize = xySize*cSize; + + sumShared[sharedIdx] = 0; + maxShared[sharedIdx] = -1.0f; + + if(cIdx < cSize) { + int xyIdx = xyId; + while(xyIdx < xySize) { + float a = __half2float(in[cIdx + xyIdx * cSize + nIdx * xycSize]); + sumShared[sharedIdx] += a; + // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 + // which is lower than the lowest value that any current activation function will produce. + // so the max over all valid spaces will the same as the mask over all spaces including padding + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a + (__half2float(mask[xyIdx + nIdx * xySize]) - 1.0f)); + xyIdx += xyBlockDim; + } + } + __syncthreads(); + + for(int s = xyBlockDim>>1; s > 0; s >>= 1) { + if(xyId < s) { + sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; + maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); + } + __syncthreads(); + } + if(xyId == 0 && cIdx < cSize) { + float sum = sumShared[sharedIdx]; + float div = maskSum[nIdx]; + float sqrtdiv = sqrt(div); + float mean = sum/div; + + out[cIdx + nIdx * (cSize*3)] = __float2half(mean); + out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); + out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} + +void customCudaPoolRowsGPoolNHWC(const half* in, half* out, int nSize, int xySize, int cSize, const half* mask, const float* maskSum) { + if(nSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNHWC: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaPoolRowsGPoolNHWC: cSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaPoolRowsGPoolNHWC"); + + //Use up to two warps worth of threads along the channel dimension, which is the + //most compact + int cThreads = 1; + while(cThreads < 64 && cThreads < cSize/2) + cThreads *= 2; + int cBlocks = (cSize + cThreads - 1) / cThreads; + + //Distribute the extra threads to perform parallel reduction along the xy dimension. + int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); + + //We need one shared memory spot per thread, and then we double it because we need both sum and max. + //We also make sure it's a power of two to address any alignment concerns. + int sharedMemElts = 128; + while(sharedMemElts < cThreads * xyThreads) + sharedMemElts *= 2; + int sharedMemSize = sizeof(float) * sharedMemElts * 2; + + dim3 grid(cBlocks,1,nSize); + dim3 threads(cThreads,xyThreads,1); + if(mask != NULL) + gPoolChannelsNHWCHalfMaskKernel<<>>(in,out,xySize,cSize,mask,maskSum,sharedMemElts); + else + gPoolChannelsNHWCHalfKernel<<>>(in,out,xySize,cSize,maskSum,sharedMemElts); +} + + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void copyToHalfKernel(const float *in, half* out, int n) +{ + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if(idx < n) { + out[idx] = __float2half(in[idx]); + } +} +__global__ +void copyFromHalfKernel(const half *in, float* out, int n) +{ + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if(idx < n) { + out[idx] = __half2float(in[idx]); + } +} + +void customCudaCopyToHalf(const float* in, half* out, int n) { + int blockSize = targetNumThreads; + int numBlocks = (n+blockSize-1)/blockSize; + copyToHalfKernel<<>>(in,out,n); +} +void customCudaCopyFromHalf(const half* in, float* out, int n) { + int blockSize = targetNumThreads; + int numBlocks = (n+blockSize-1)/blockSize; + copyFromHalfKernel<<>>(in,out,n); +} + +//-------------------------------------------------------------------------------------------------------------- + + +__global__ +void addTensorInplaceHalfKernel(half *buf, const half* biases, int nSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if(idx < nSize) { + buf[idx] = __hadd(buf[idx],biases[idx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +void customCudaAddTensorInplace(half* buf, const half* biases, int nSize) { + int blockSize = targetNumThreads; + int numBlocks = (nSize+blockSize-1)/blockSize; + addTensorInplaceHalfKernel<<>>(buf,biases,nSize); +} + +__global__ +void addTensorInplaceKernel(float *buf, const float* biases, int nSize) +{ + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if(idx < nSize) { + buf[idx] += biases[idx]; + } +} +void customCudaAddTensorInplace(float* buf, const float* biases, int nSize) { + int blockSize = targetNumThreads; + int numBlocks = (nSize+blockSize-1)/blockSize; + addTensorInplaceKernel<<>>(buf,biases,nSize); +} + +#ifdef KATAGO_GPU_HIP +//-------------------------------------------------------------------------------------------------------------- +// ROCm-only: batched 2D transpose between NCHW and NHWC layouts. +// +// cuDNN convolutions accept different layouts for the input and output tensors, so the CUDA +// backend can feed its NCHW-laid-out input buffer directly to an NHWC-mode initial convolution. +// MIOpen requires all tensors of a convolution to share one layout, so the ROCm backend instead +// converts the uploaded input tensor on-device to the model's layout before the initial +// convolution when the two differ. Only the initial convolution's input ever needs this. +// +// out[n][b][a] = in[n][a][b]. For NCHW->NHWC call with (a=C, b=HW), for NHWC->NCHW with (a=HW, b=C). +// Reads are coalesced over b, in's contiguous axis. The tensor is small, being the raw input +// planes, so the strided writes are not worth tiling for. + +template +__global__ +void batchedTranspose2DKernel(const T* in, T* out, int aSize, int bSize) +{ + int b = blockIdx.x * blockDim.x + threadIdx.x; + int a = blockIdx.y; + int n = blockIdx.z; + if(b < bSize) + out[((size_t)n * bSize + b) * aSize + a] = in[((size_t)n * aSize + a) * bSize + b]; +} + +template +static void applyBatchedTranspose2D(const T* in, T* out, int nSize, int aSize, int bSize, const char* name) { + checkBufferIndexFitsInt(nSize, aSize, bSize, name); + if(nSize > 65535 || aSize > 65535) + throw std::runtime_error(std::string(name) + ": dimension exceeds the grid y/z size limit"); + int blockSize = targetNumThreads; + dim3 grid((bSize + blockSize - 1) / blockSize, aSize, nSize); + batchedTranspose2DKernel<<>>(in, out, aSize, bSize); +} + +void customCudaCopyNCHWtoNHWC(const float* in, float* out, int nSize, int cSize, int xySize) { + applyBatchedTranspose2D(in, out, nSize, cSize, xySize, "customCudaCopyNCHWtoNHWC"); +} +void customCudaCopyNCHWtoNHWC(const half* in, half* out, int nSize, int cSize, int xySize) { + applyBatchedTranspose2D(in, out, nSize, cSize, xySize, "customCudaCopyNCHWtoNHWC"); +} +void customCudaCopyNHWCtoNCHW(const float* in, float* out, int nSize, int cSize, int xySize) { + applyBatchedTranspose2D(in, out, nSize, xySize, cSize, "customCudaCopyNHWCtoNCHW"); +} +void customCudaCopyNHWCtoNCHW(const half* in, half* out, int nSize, int cSize, int xySize) { + applyBatchedTranspose2D(in, out, nSize, xySize, cSize, "customCudaCopyNHWCtoNCHW"); +} + +#endif // KATAGO_GPU_HIP + +//-------------------------------------------------------------------------------------------------------------- +// Whether the half-precision kernel bodies in this file were compiled with real implementations. +// On ROCm, KATAGO_GPU_SUPPORTS_FP16 comes from the build system uniformly for all target archs +// (see the file header comment), so if it is absent every half kernel above is an empty stub. +// On CUDA this is always true: KATAGO_GPU_SUPPORTS_FP16 is evaluated per-arch from __CUDA_ARCH__ +// during nvcc's device compilation passes (and is undefined during the host pass, so it cannot +// be tested here), and the backend separately refuses FP16 at runtime on pre-5.3 compute +// capability devices before any half kernel could run. + +bool customCudaFp16KernelsCompiled() { +#ifdef KATAGO_GPU_CUDA + return true; +#elif defined(KATAGO_GPU_SUPPORTS_FP16) + return true; +#else + return false; +#endif +} + +//-------------------------------------------------------------------------------------------------------------- + + +__global__ +void addCBiasInplaceNCKernel(float *buf, const float* biases, int nSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + buf[idx] = buf[idx] + biases[cIdx]; + } +} +__global__ +void addCBiasInplaceNCHalfKernel(half *buf, const half* biases, int nSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + buf[idx] = __hadd(buf[idx],biases[cIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} + +__global__ +void addCBiasInplaceNCKernelRelu(float *buf, const float* biases, int nSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + buf[idx] = fmaxf(buf[idx] + biases[cIdx],0.0f); + } +} +__global__ +void addCBiasInplaceNCHalfKernelRelu(half *buf, const half* biases, int nSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + const half halfzero = __float2half(0.0f); + half a = __hadd(buf[idx],biases[cIdx]); + buf[idx] = __hgt(a,halfzero) ? a : halfzero; + } +#else + //Do nothing, FP16 not supported +#endif +} + +__global__ +void addCBiasInplaceNCKernelMish(float *buf, const float* biases, int nSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + buf[idx] = mishf(buf[idx] + biases[cIdx]); + } +} +__global__ +void addCBiasInplaceNCHalfKernelMish(half *buf, const half* biases, int nSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + half a = __hadd(buf[idx],biases[cIdx]); + buf[idx] = mishh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void addCBiasInplaceNCKernelMishScale8(float *buf, const float* biases, int nSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + buf[idx] = mishf_scale8(buf[idx] + biases[cIdx]); + } +} +__global__ +void addCBiasInplaceNCHalfKernelMishScale8(half *buf, const half* biases, int nSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + half a = __hadd(buf[idx],biases[cIdx]); + buf[idx] = mishh_scale8(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void addCBiasInplaceNCKernelSilu(float *buf, const float* biases, int nSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + buf[idx] = siluf(buf[idx] + biases[cIdx]); + } +} +__global__ +void addCBiasInplaceNCHalfKernelSilu(half *buf, const half* biases, int nSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int nIdx = blockIdx.y * blockDim.y + threadIdx.y; + if(cIdx < cSize && nIdx < nSize) { + int idx = nIdx * cSize + cIdx; + half a = __hadd(buf[idx],biases[cIdx]); + buf[idx] = siluh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} + +static void sharedAddCBiasInplaceNC(void* buf, const void* biases, int nSize, int cSize, bool isHalf, int activation) { + int cThreads; + int cBlocks; + int nThreads; + int nBlocks; + splitThreadsAcrossDim01(cSize, nSize, cThreads, cBlocks, nThreads, nBlocks); + + if(nBlocks > 65535) + throw std::runtime_error("customCudaAddCBiasInplaceNC: nSize too large given cSize"); + + dim3 grid(cBlocks,nBlocks,1); + dim3 threads(cThreads,nThreads,1); + + if(activation == ACTIVATION_IDENTITY) { + if(isHalf) + addCBiasInplaceNCHalfKernel<<>>((half*)buf,(const half*)biases,nSize,cSize); + else + addCBiasInplaceNCKernel<<>>((float*)buf,(const float*)biases,nSize,cSize); + } + else if(activation == ACTIVATION_RELU) { + if(isHalf) + addCBiasInplaceNCHalfKernelRelu<<>>((half*)buf,(const half*)biases,nSize,cSize); + else + addCBiasInplaceNCKernelRelu<<>>((float*)buf,(const float*)biases,nSize,cSize); + } + else if(activation == ACTIVATION_MISH) { + if(isHalf) + addCBiasInplaceNCHalfKernelMish<<>>((half*)buf,(const half*)biases,nSize,cSize); + else + addCBiasInplaceNCKernelMish<<>>((float*)buf,(const float*)biases,nSize,cSize); + } + else if(activation == ACTIVATION_SILU) { + if(isHalf) + addCBiasInplaceNCHalfKernelSilu<<>>((half*)buf,(const half*)biases,nSize,cSize); + else + addCBiasInplaceNCKernelSilu<<>>((float*)buf,(const float*)biases,nSize,cSize); + } + else if(activation == ACTIVATION_MISH_SCALE8) { + if(isHalf) + addCBiasInplaceNCHalfKernelMishScale8<<>>((half*)buf,(const half*)biases,nSize,cSize); + else + addCBiasInplaceNCKernelMishScale8<<>>((float*)buf,(const float*)biases,nSize,cSize); + } + else { + throw std::runtime_error("customCudaAddCBiasInplaceNC: unsupported activation"); + } +} + +void customCudaAddCBiasInplaceNC(float* buf, const float* biases, int nSize, int cSize, int activation) { + sharedAddCBiasInplaceNC(buf,biases,nSize,cSize,false,activation); +} +void customCudaAddCBiasInplaceNC(half* buf, const half* biases, int nSize, int cSize, int activation) { + sharedAddCBiasInplaceNC(buf,biases,nSize,cSize,true,activation); +} + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void addNCBiasInplaceNCHWKernel(float *buf, const float* biases, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int ncIdx = nIdx * cSize + cIdx; + int idx = ncIdx * sSize + sIdx; + buf[idx] = buf[idx] + biases[ncIdx]; + } +} +__global__ +void addNCBiasInplaceNCHWHalfKernel(half *buf, const half* biases, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int ncIdx = nIdx * cSize + cIdx; + int idx = ncIdx * sSize + sIdx; + buf[idx] = __hadd(buf[idx],biases[ncIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} + +static void sharedAddNCBiasInplaceNCHW(void *buf, const void* biases, int nSize, int cSize, int xySize, bool isHalf) { + if(nSize > 65535) + throw std::runtime_error("customCudaAddNCBiasInplaceNCHW: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaAddNCBiasInplaceNCHW: cSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaAddNCBiasInplaceNCHW"); + + int sSize = xySize; + int sThreads; + int sBlocks; + int cThreads; + int cBlocks; + splitThreadsAcrossDim01(sSize, cSize, sThreads, sBlocks, cThreads, cBlocks); + + dim3 grid(sBlocks,cBlocks,nSize); + dim3 threads(sThreads,cThreads,1); + if(isHalf) + addNCBiasInplaceNCHWHalfKernel<<>>((half*)buf,(const half*)biases,cSize,sSize); + else + addNCBiasInplaceNCHWKernel<<>>((float*)buf,(const float*)biases,cSize,sSize); +} + +void customCudaAddNCBiasInplaceNCHW(float *buf, const float* biases, int nSize, int cSize, int xySize) { + sharedAddNCBiasInplaceNCHW(buf,biases,nSize,cSize,xySize,false); +} +void customCudaAddNCBiasInplaceNCHW(half *buf, const half* biases, int nSize, int cSize, int xySize) { + sharedAddNCBiasInplaceNCHW(buf,biases,nSize,cSize,xySize,true); +} + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void addNCBiasInplaceNHWCKernel(float *buf, const float* biases, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int ncIdx = nIdx * cSize + cIdx; + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + buf[idx] = buf[idx] + biases[ncIdx]; + } +} +__global__ +void addNCBiasInplaceNHWCHalfKernel(half *buf, const half* biases, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int ncIdx = nIdx * cSize + cIdx; + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + buf[idx] = __hadd(buf[idx],biases[ncIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} + +static void sharedAddNCBiasInplaceNHWC(void *buf, const void* biases, int nSize, int xySize, int cSize, bool isHalf) { + if(nSize > 65535) + throw std::runtime_error("customCudaAddNCBiasInplaceNHWC: nSize too large"); + if(xySize > 65535) + throw std::runtime_error("customCudaAddNCBiasInplaceNHWC: xySize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaAddNCBiasInplaceNHWC"); + + int sSize = xySize; + int cThreads; + int cBlocks; + int sThreads; + int sBlocks; + splitThreadsAcrossDim01(cSize, sSize, cThreads, cBlocks, sThreads, sBlocks); + + dim3 grid(cBlocks,sBlocks,nSize); + dim3 threads(cThreads,sThreads,1); + if(isHalf) + addNCBiasInplaceNHWCHalfKernel<<>>((half*)buf,(const half*)biases,sSize,cSize); + else + addNCBiasInplaceNHWCKernel<<>>((float*)buf,(const float*)biases,sSize,cSize); +} + +void customCudaAddNCBiasInplaceNHWC(float *buf, const float* biases, int nSize, int xySize, int cSize) { + sharedAddNCBiasInplaceNHWC(buf,biases,nSize,xySize,cSize,false); +} +void customCudaAddNCBiasInplaceNHWC(half *buf, const half* biases, int nSize, int xySize, int cSize) { + sharedAddNCBiasInplaceNHWC(buf,biases,nSize,xySize,cSize,true); +} + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void applyCScaleBiasNCHWKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = in[idx] * scale[cIdx] + biases[cIdx]; + } +} +__global__ +void applyCScaleBiasNCHWReluKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f); + } +} +__global__ +void applyCScaleBiasNCHWMishKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]); + } +} +__global__ +void applyCScaleBiasNCHWMishScale8Kernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]); + } +} +__global__ +void applyCScaleBiasNCHWSiluKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]); + } +} +__global__ +void applyCScaleBiasNCHWMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = (in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNCHWReluMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNCHWMishMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNCHWMishScale8MaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNCHWSiluMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) +{ + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNCHWHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = __hfma(in[idx],scale[cIdx],biases[cIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWReluHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + const half halfzero = __float2half(0.0f); + out[idx] = __hgt(a,halfzero) ? a : halfzero; + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWMishHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + out[idx] = mishh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWMishScale8HalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + out[idx] = mishh_scale8(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWSiluHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + out[idx] = siluh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + out[idx] = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWReluMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + const half halfzero = __float2half(0.0f); + out[idx] = __hgt(a,halfzero) ? a : halfzero; + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWMishMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + out[idx] = mishh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWMishScale8MaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + out[idx] = mishh_scale8(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNCHWSiluMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int sIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * cSize + cIdx) * sSize + sIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + out[idx] = siluh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} + +static void sharedApplyCScaleBiasNCHW(const void* in, void* out, const void* scale, const void* biases, const void* mask, int nSize, int cSize, int xySize, bool isHalf, int activation) { + if(nSize > 65535) + throw std::runtime_error("customCudaApplyCScaleBiasNCHW: nSize too large"); + if(cSize > 65535) + throw std::runtime_error("customCudaApplyCScaleBiasNCHW: cSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaApplyCScaleBiasNCHW"); + + int sSize = xySize; + int sThreads; + int sBlocks; + int cThreads; + int cBlocks; + splitThreadsAcrossDim01(sSize, cSize, sThreads, sBlocks, cThreads, cBlocks); + + dim3 grid(sBlocks,cBlocks,nSize); + dim3 threads(sThreads,cThreads,1); + if(mask == NULL) { + if(activation == ACTIVATION_IDENTITY) { + if(isHalf) + applyCScaleBiasNCHWHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); + else + applyCScaleBiasNCHWKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); + } + else if(activation == ACTIVATION_RELU) { + if(isHalf) + applyCScaleBiasNCHWReluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); + else + applyCScaleBiasNCHWReluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); + } + else if(activation == ACTIVATION_MISH) { + if(isHalf) + applyCScaleBiasNCHWMishHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); + else + applyCScaleBiasNCHWMishKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); + } + else if(activation == ACTIVATION_SILU) { + if(isHalf) + applyCScaleBiasNCHWSiluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); + else + applyCScaleBiasNCHWSiluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); + } + else if(activation == ACTIVATION_MISH_SCALE8) { + if(isHalf) + applyCScaleBiasNCHWMishScale8HalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); + else + applyCScaleBiasNCHWMishScale8Kernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); + } + else { + throw std::runtime_error("customCudaApplyCScaleBiasNCHW: unsupported activation"); + } + } + else { + if(activation == ACTIVATION_IDENTITY) { + if(isHalf) + applyCScaleBiasNCHWMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); + else + applyCScaleBiasNCHWMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); + } + else if(activation == ACTIVATION_RELU) { + if(isHalf) + applyCScaleBiasNCHWReluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); + else + applyCScaleBiasNCHWReluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); + } + else if(activation == ACTIVATION_MISH) { + if(isHalf) + applyCScaleBiasNCHWMishMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); + else + applyCScaleBiasNCHWMishMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); + } + else if(activation == ACTIVATION_SILU) { + if(isHalf) + applyCScaleBiasNCHWSiluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); + else + applyCScaleBiasNCHWSiluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); + } + else if(activation == ACTIVATION_MISH_SCALE8) { + if(isHalf) + applyCScaleBiasNCHWMishScale8MaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); + else + applyCScaleBiasNCHWMishScale8MaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); + } + else { + throw std::runtime_error("customCudaApplyCScaleBiasNCHW: unsupported activation"); + } + } +} + +void customCudaApplyCScaleBiasNCHW(const float* in, float* out, const float* scale, const float* biases, const float* mask, int nSize, int cSize, int xySize, int activation) { + sharedApplyCScaleBiasNCHW(in,out,scale,biases,mask,nSize,cSize,xySize,false,activation); +} +void customCudaApplyCScaleBiasNCHW(const half* in, half* out, const half* scale, const half* biases, const half* mask, int nSize, int cSize, int xySize, int activation) { + sharedApplyCScaleBiasNCHW(in,out,scale,biases,mask,nSize,cSize,xySize,true,activation); +} + + +//-------------------------------------------------------------------------------------------------------------- + +__global__ +void applyCScaleBiasNHWCKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = in[idx] * scale[cIdx] + biases[cIdx]; + } +} +__global__ +void applyCScaleBiasNHWCReluKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f); + } +} +__global__ +void applyCScaleBiasNHWCMishKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]); + } +} +__global__ +void applyCScaleBiasNHWCMishScale8Kernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]); + } +} +__global__ +void applyCScaleBiasNHWCSiluKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]); + } +} +__global__ +void applyCScaleBiasNHWCMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = (in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNHWCReluMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNHWCMishMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNHWCMishScale8MaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNHWCSiluMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; + } +} +__global__ +void applyCScaleBiasNHWCHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = __hfma(in[idx],scale[cIdx],biases[cIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCReluHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + const half halfzero = __float2half(0.0f); + out[idx] = __hgt(a,halfzero) ? a : halfzero; + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCMishHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + out[idx] = mishh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCMishScale8HalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + out[idx] = mishh_scale8(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCSiluHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); + out[idx] = siluh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + out[idx] = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCReluMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + const half halfzero = __float2half(0.0f); + out[idx] = __hgt(a,halfzero) ? a : halfzero; + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCMishMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + out[idx] = mishh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCMishScale8MaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + out[idx] = mishh_scale8(a); + } +#else + //Do nothing, FP16 not supported +#endif +} +__global__ +void applyCScaleBiasNHWCSiluMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int sIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx < cSize && sIdx < sSize) { + int idx = (nIdx * sSize + sIdx) * cSize + cIdx; + half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); + out[idx] = siluh(a); + } +#else + //Do nothing, FP16 not supported +#endif +} + +static void sharedApplyCScaleBiasNHWC(const void* in, void* out, const void* scale, const void* biases, const void* mask, int nSize, int xySize, int cSize, bool isHalf, int activation) { + if(nSize > 65535) + throw std::runtime_error("customCudaApplyCScaleBiasNHWC: nSize too large"); + if(xySize > 65535) + throw std::runtime_error("customCudaApplyCScaleBiasNHWC: xySize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaApplyCScaleBiasNHWC"); + + int sSize = xySize; + int cThreads; + int cBlocks; + int sThreads; + int sBlocks; + splitThreadsAcrossDim01(cSize, sSize, cThreads, cBlocks, sThreads, sBlocks); + + dim3 grid(cBlocks,sBlocks,nSize); + dim3 threads(cThreads,sThreads,1); + if(mask == NULL) { + if(activation == ACTIVATION_IDENTITY) { + if(isHalf) + applyCScaleBiasNHWCHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); + else + applyCScaleBiasNHWCKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); + } + else if(activation == ACTIVATION_RELU) { + if(isHalf) + applyCScaleBiasNHWCReluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); + else + applyCScaleBiasNHWCReluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); + } + else if(activation == ACTIVATION_MISH) { + if(isHalf) + applyCScaleBiasNHWCMishHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); + else + applyCScaleBiasNHWCMishKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); + } + else if(activation == ACTIVATION_SILU) { + if(isHalf) + applyCScaleBiasNHWCSiluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); + else + applyCScaleBiasNHWCSiluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); + } + else if(activation == ACTIVATION_MISH_SCALE8) { + if(isHalf) + applyCScaleBiasNHWCMishScale8HalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); + else + applyCScaleBiasNHWCMishScale8Kernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); + } + else { + throw std::runtime_error("customCudaApplyCScaleBiasNHWC: unsupported activation"); + } + } + else { + if(activation == ACTIVATION_IDENTITY) { + if(isHalf) + applyCScaleBiasNHWCMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); + else + applyCScaleBiasNHWCMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); + } + else if(activation == ACTIVATION_RELU) { + if(isHalf) + applyCScaleBiasNHWCReluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); + else + applyCScaleBiasNHWCReluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); + } + else if(activation == ACTIVATION_MISH) { + if(isHalf) + applyCScaleBiasNHWCMishMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); + else + applyCScaleBiasNHWCMishMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); + } + else if(activation == ACTIVATION_SILU) { + if(isHalf) + applyCScaleBiasNHWCSiluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); + else + applyCScaleBiasNHWCSiluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); + } + else if(activation == ACTIVATION_MISH_SCALE8) { + if(isHalf) + applyCScaleBiasNHWCMishScale8MaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); + else + applyCScaleBiasNHWCMishScale8MaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); + } + else { + throw std::runtime_error("customCudaApplyCScaleBiasNHWC: unsupported activation"); + } + } +} + +void customCudaApplyCScaleBiasNHWC(const float* in, float* out, const float* scale, const float* biases, const float* mask, int nSize, int xySize, int cSize, int activation) { + sharedApplyCScaleBiasNHWC(in,out,scale,biases,mask,nSize,xySize,cSize,false,activation); +} +void customCudaApplyCScaleBiasNHWC(const half* in, half* out, const half* scale, const half* biases, const half* mask, int nSize, int xySize, int cSize, int activation) { + sharedApplyCScaleBiasNHWC(in,out,scale,biases,mask,nSize,xySize,cSize,true,activation); +} + +//============================================================================================== +// Transformer support kernels +//============================================================================================== + +//-------------------------------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------------------------------- +// RoPE: Apply rotary position embeddings in-place. +// buf: [totalDim, seqLen*batchSize] column-major (totalDim = numBufHeads*qHeadDim, fast-moving). +// Each thread handles one (pair, xy, n, h) combination. + +// See coalescing comment on applyRoPEHalfKernel below for the layout reasoning. +__global__ +void applyRoPEKernel( + float* buf, const float* cosTable, const float* sinTable, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int learnableRope +) { + int xy = blockIdx.x; + int n = blockIdx.y; + int hp = threadIdx.x; + int totalHP = numBufHeads * numPairs; + if(xy >= seqLen || n >= batchSize || hp >= totalHP) + return; + + int h = hp / numPairs; + int pairIdx = hp % numPairs; + int c0 = h * qHeadDim + 2 * pairIdx; + int c1 = c0 + 1; + size_t col = (size_t)n * seqLen + xy; + size_t idx0 = c0 + col * totalDim; + size_t idx1 = c1 + col * totalDim; + + int tableIdx; + if(learnableRope) { + int kvh = h * numKVHeads / numBufHeads; + tableIdx = (kvh * numPairs + pairIdx) * seqLen + xy; + } else { + tableIdx = pairIdx * seqLen + xy; + } + + float cosVal = cosTable[tableIdx]; + float sinVal = sinTable[tableIdx]; + float x0 = buf[idx0]; + float x1 = buf[idx1]; + buf[idx0] = x0 * cosVal - x1 * sinVal; + buf[idx1] = x0 * sinVal + x1 * cosVal; +} + +// RoPE for BSHD-laid-out Q or K buffer. Buffer linear index is: +// buf[h*qHeadDim + d + (n*seqLen + xy) * totalDim] where totalDim = numBufHeads*qHeadDim. +// For a warp to coalesce, consecutive threads must access consecutive memory addresses. +// The contiguous axis is "channel within position": (h, d) jointly varying with d innermost. +// So threadIdx.x walks over channel pairs within a single (n, xy) row, and grid.x walks over xy. +// +// Each thread processes one pair (d=2*pairIdx, d=2*pairIdx+1) for one head: c0 = h*qHeadDim + 2*p. +// We pack the (h, p) pair index into threadIdx.x: hp = h*numPairs + p, range 0..numBufHeads*numPairs. +// +// Memory access pattern: for fixed (n, xy), consecutive hp threads read consecutive (c0, c1) +// halfs, which are 2 halfs = 4 bytes apart. 32 threads = 128 bytes = 2 cache lines, fully +// coalesced. + +__global__ +void applyRoPEHalfKernel( + half* buf, const half* cosTable, const half* sinTable, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int learnableRope +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int xy = blockIdx.x; + int n = blockIdx.y; + int hp = threadIdx.x; // hp = h * numPairs + pairIdx + int totalHP = numBufHeads * numPairs; + if(xy >= seqLen || n >= batchSize || hp >= totalHP) + return; + + int h = hp / numPairs; + int pairIdx = hp % numPairs; + int c0 = h * qHeadDim + 2 * pairIdx; + int c1 = c0 + 1; + size_t col = (size_t)n * seqLen + xy; + size_t idx0 = c0 + col * totalDim; + size_t idx1 = c1 + col * totalDim; + + int tableIdx; + if(learnableRope) { + int kvh = h * numKVHeads / numBufHeads; + tableIdx = (kvh * numPairs + pairIdx) * seqLen + xy; + } else { + tableIdx = pairIdx * seqLen + xy; + } + + float cosVal = __half2float(cosTable[tableIdx]); + float sinVal = __half2float(sinTable[tableIdx]); + float x0 = __half2float(buf[idx0]); + float x1 = __half2float(buf[idx1]); + buf[idx0] = __float2half(x0 * cosVal - x1 * sinVal); + buf[idx1] = __float2half(x0 * sinVal + x1 * cosVal); +#else + //Do nothing, FP16 not supported +#endif +} + +// Learnable RoPE, table-free variant: recompute cos/sin in-kernel from the per-head frequencies +// instead of reading a precomputed [numKVHeads, numPairs, seqLen] cos/sin table. +// +// The precomputed table is numKVHeads-times larger than the fixed-RoPE table (per-head rather than +// shared), and for many heads its aggregate footprint across all transformer blocks exceeds L2, so +// the (non-coalesced, stride-seqLen) table reads spill to DRAM and dominate the kernel. The +// frequencies are tiny (numKVHeads*numPairs*2 floats, ~KB) and stay resident in cache, so we read +// those and compute angle = x*freqX + y*freqY with __sincosf. The (x,y) decode is uniform across the +// block (one block == one xy), and buf access is unchanged (still coalesced over channel pairs). +// +// freqs layout: (numKVHeads, numPairs, 2) flattened; [...,0]=freqX (width/x), [...,1]=freqY (height/y). +__global__ +void applyRoPELearnableRecomputeKernel( + float* buf, const float* freqs, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int nnXLen +) { + int xy = blockIdx.x; + int n = blockIdx.y; + int hp = threadIdx.x; + int totalHP = numBufHeads * numPairs; + if(xy >= seqLen || n >= batchSize || hp >= totalHP) + return; + + int h = hp / numPairs; + int pairIdx = hp % numPairs; + int c0 = h * qHeadDim + 2 * pairIdx; + int c1 = c0 + 1; + size_t col = (size_t)n * seqLen + xy; + size_t idx0 = c0 + col * totalDim; + size_t idx1 = c1 + col * totalDim; + + int kvh = h * numKVHeads / numBufHeads; + int x = xy % nnXLen; + int y = xy / nnXLen; + float freqX = freqs[(kvh * numPairs + pairIdx) * 2 + 0]; + float freqY = freqs[(kvh * numPairs + pairIdx) * 2 + 1]; + float angle = (float)x * freqX + (float)y * freqY; + float cosVal, sinVal; + KATAGO_GPU_SINCOSF(angle, &sinVal, &cosVal); + + float x0 = buf[idx0]; + float x1 = buf[idx1]; + buf[idx0] = x0 * cosVal - x1 * sinVal; + buf[idx1] = x0 * sinVal + x1 * cosVal; +} + +__global__ +void applyRoPELearnableRecomputeHalfKernel( + half* buf, const float* freqs, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int nnXLen +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int xy = blockIdx.x; + int n = blockIdx.y; + int hp = threadIdx.x; + int totalHP = numBufHeads * numPairs; + if(xy >= seqLen || n >= batchSize || hp >= totalHP) + return; + + int h = hp / numPairs; + int pairIdx = hp % numPairs; + int c0 = h * qHeadDim + 2 * pairIdx; + int c1 = c0 + 1; + size_t col = (size_t)n * seqLen + xy; + size_t idx0 = c0 + col * totalDim; + size_t idx1 = c1 + col * totalDim; + + int kvh = h * numKVHeads / numBufHeads; + int x = xy % nnXLen; + int y = xy / nnXLen; + float freqX = freqs[(kvh * numPairs + pairIdx) * 2 + 0]; + float freqY = freqs[(kvh * numPairs + pairIdx) * 2 + 1]; + float angle = (float)x * freqX + (float)y * freqY; + float cosVal, sinVal; + KATAGO_GPU_SINCOSF(angle, &sinVal, &cosVal); + + float x0 = __half2float(buf[idx0]); + float x1 = __half2float(buf[idx1]); + buf[idx0] = __float2half(x0 * cosVal - x1 * sinVal); + buf[idx1] = __float2half(x0 * sinVal + x1 * cosVal); +#else + //Do nothing, FP16 not supported +#endif +} + +// One block per (xy, n). threadIdx.x = h*numPairs + pairIdx covers all channel pairs for the +// position. Block dim is rounded up to a multiple of 32 for warp alignment; out-of-range threads +// short-circuit. +void customCudaApplyRoPE( + float* buf, const float* cosTable, const float* sinTable, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope +) { + int totalDim = numBufHeads * qHeadDim; + int totalHP = numBufHeads * numPairs; + // The kernel maps one thread per (head,pair) within a single block (no grid-stride loop), so + // totalHP must fit in one block. Fail loudly rather than silently clamping and skipping rotations. + if(totalHP > 1024) + throw std::runtime_error("customCudaApplyRoPE: numBufHeads*numPairs (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); + int threads = ((totalHP + 31) / 32) * 32; // round up to warp size + dim3 blocks(seqLen, batchSize, 1); + applyRoPEKernel<<>>( + buf, cosTable, sinTable, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, learnableRope ? 1 : 0 + ); +} +void customCudaApplyRoPE( + half* buf, const half* cosTable, const half* sinTable, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope +) { + int totalDim = numBufHeads * qHeadDim; + int totalHP = numBufHeads * numPairs; + if(totalHP > 1024) + throw std::runtime_error("customCudaApplyRoPE: numBufHeads*numPairs (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); + int threads = ((totalHP + 31) / 32) * 32; + dim3 blocks(seqLen, batchSize, 1); + applyRoPEHalfKernel<<>>( + buf, cosTable, sinTable, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, learnableRope ? 1 : 0 + ); +} + +// Table-free learnable RoPE: same block/thread mapping as customCudaApplyRoPE, but recomputes cos/sin +// in-kernel from the per-head frequencies (numKVHeads, numPairs, 2) flattened. See kernel comment. +void customCudaApplyRoPELearnableRecompute( + float* buf, const float* freqs, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen +) { + int totalDim = numBufHeads * qHeadDim; + int totalHP = numBufHeads * numPairs; + if(totalHP > 1024) + throw std::runtime_error("customCudaApplyRoPELearnableRecompute: numBufHeads*numPairs (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); + int threads = ((totalHP + 31) / 32) * 32; + dim3 blocks(seqLen, batchSize, 1); + applyRoPELearnableRecomputeKernel<<>>( + buf, freqs, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, nnXLen + ); +} +void customCudaApplyRoPELearnableRecompute( + half* buf, const float* freqs, + int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen +) { + int totalDim = numBufHeads * qHeadDim; + int totalHP = numBufHeads * numPairs; + if(totalHP > 1024) + throw std::runtime_error("customCudaApplyRoPELearnableRecompute: numBufHeads*numPairs (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); + int threads = ((totalHP + 31) / 32) * 32; + dim3 blocks(seqLen, batchSize, 1); + applyRoPELearnableRecomputeHalfKernel<<>>( + buf, freqs, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, nnXLen + ); +} + +//-------------------------------------------------------------------------------------------------------------- +// FlashAttention-style scaled dot product attention with online softmax (tiled). +// Grid: (numQGroups, batchSize * numHeads), block: BLOCK_Q threads. +// Each thread handles Q_PER_THREAD query positions, separated by BLOCK_Q within a workgroup. +// BLOCK_KV K/V rows are loaded into shared memory and reused across BLOCK_Q*Q_PER_THREAD queries. +// Layout: BSHD row-major (see header). Templated on qHeadDim/vHeadDim so inner loops unroll. +// +// Coalescing notes: K/V row stride in memory is qHeadDim/vHeadDim (== inner D dim of BSHD), so the +// cooperative tile-load loop reads consecutive D values across the warp -> fully coalesced if +// qHeadDim is a multiple of 32 (or BLOCK_Q divides qHeadDim cleanly). + +template +__device__ __forceinline__ +void flashAttentionTiledImpl( + const T* Q, const T* K, const T* V, const T* mask, T* output, + int seqLen, int numHeads, int numKVHeads, float scale +) { + const int tid = threadIdx.x; + const int qBlockStart = blockIdx.x * (BLOCK_Q * Q_PER_THREAD); + const int bh = blockIdx.y; + const int n = bh / numHeads; + const int h = bh % numHeads; + const int kvh = h * numKVHeads / numHeads; + + const int qTotalDim = numHeads * qHeadDim; + const int kTotalDim = numKVHeads * qHeadDim; + const int vTotalDim = numKVHeads * vHeadDim; + const int oTotalDim = numHeads * vHeadDim; + + constexpr int K_TILE_STRIDE = qHeadDim; + constexpr int V_TILE_STRIDE = vHeadDim; + __shared__ float kTile[BLOCK_KV * K_TILE_STRIDE]; + __shared__ float vTile[BLOCK_KV * V_TILE_STRIDE]; + __shared__ float kMaskTile[BLOCK_KV]; + + float qReg[Q_PER_THREAD * qHeadDim]; + float qMask[Q_PER_THREAD]; + float runningMax[Q_PER_THREAD]; + float runningSum[Q_PER_THREAD]; + float acc[Q_PER_THREAD * vHeadDim]; + + // Load Q for the Q_PER_THREAD positions this thread owns. + #pragma unroll + for(int qi = 0; qi < Q_PER_THREAD; qi++) { + int qPos = qBlockStart + qi * BLOCK_Q + tid; + qMask[qi] = 0.0f; + if(qPos < seqLen) { + if(mask != NULL) { + qMask[qi] = (float)mask[n * seqLen + qPos]; + } else { + qMask[qi] = 1.0f; + } + if(qMask[qi] != 0.0f) { + const T* qPtr = Q + ((size_t)n * seqLen + qPos) * qTotalDim + h * qHeadDim; + #pragma unroll + for(int d = 0; d < qHeadDim; d++) qReg[qi * qHeadDim + d] = (float)qPtr[d]; + } + } + runningMax[qi] = -1e30f; + runningSum[qi] = 0.0f; + #pragma unroll + for(int d = 0; d < vHeadDim; d++) acc[qi * vHeadDim + d] = 0.0f; + } + + // Iterate over K/V in BLOCK_KV-row tiles. + for(int kvStart = 0; kvStart < seqLen; kvStart += BLOCK_KV) { + // Cooperatively load K tile: BLOCK_KV rows of qHeadDim values (stride K_TILE_STRIDE). + #pragma unroll + for(int t = tid; t < BLOCK_KV * qHeadDim; t += BLOCK_Q) { + int tileKPos = t / qHeadDim; + int tileD = t % qHeadDim; + int globalKPos = kvStart + tileKPos; + float v = 0.0f; + if(globalKPos < seqLen) { + const T* kPtr = K + ((size_t)n * seqLen + globalKPos) * kTotalDim + kvh * qHeadDim; + v = (float)kPtr[tileD]; + } + kTile[tileKPos * K_TILE_STRIDE + tileD] = v; + } + // Cooperatively load V tile: BLOCK_KV rows of vHeadDim values (stride V_TILE_STRIDE). + #pragma unroll + for(int t = tid; t < BLOCK_KV * vHeadDim; t += BLOCK_Q) { + int tileKPos = t / vHeadDim; + int tileD = t % vHeadDim; + int globalKPos = kvStart + tileKPos; + float v = 0.0f; + if(globalKPos < seqLen) { + const T* vPtr = V + ((size_t)n * seqLen + globalKPos) * vTotalDim + kvh * vHeadDim; + v = (float)vPtr[tileD]; + } + vTile[tileKPos * V_TILE_STRIDE + tileD] = v; + } + // Cooperatively load mask tile. + for(int t = tid; t < BLOCK_KV; t += BLOCK_Q) { + int globalKPos = kvStart + t; + float m = 0.0f; + if(globalKPos < seqLen) { + m = (mask != NULL) ? (float)mask[n * seqLen + globalKPos] : 1.0f; + } + kMaskTile[t] = m; + } + __syncthreads(); + + int kvEnd = min(BLOCK_KV, seqLen - kvStart); + + // Each thread updates its Q_PER_THREAD queries against the shared K/V tile. + #pragma unroll + for(int qi = 0; qi < Q_PER_THREAD; qi++) { + int qPos = qBlockStart + qi * BLOCK_Q + tid; + if(qPos >= seqLen || qMask[qi] == 0.0f) continue; + + for(int tk = 0; tk < kvEnd; tk++) { + if(kMaskTile[tk] == 0.0f) continue; + + float dot = 0.0f; + #pragma unroll + for(int d = 0; d < qHeadDim; d++) { + dot += qReg[qi * qHeadDim + d] * kTile[tk * K_TILE_STRIDE + d]; + } + dot *= scale; + + float newMax = fmaxf(runningMax[qi], dot); + float expOldMax = __expf(runningMax[qi] - newMax); + float expCur = __expf(dot - newMax); + + #pragma unroll + for(int d = 0; d < vHeadDim; d++) { + acc[qi * vHeadDim + d] = acc[qi * vHeadDim + d] * expOldMax + expCur * vTile[tk * V_TILE_STRIDE + d]; + } + runningSum[qi] = runningSum[qi] * expOldMax + expCur; + runningMax[qi] = newMax; + } + } + __syncthreads(); + } + + // Write outputs. + #pragma unroll + for(int qi = 0; qi < Q_PER_THREAD; qi++) { + int qPos = qBlockStart + qi * BLOCK_Q + tid; + if(qPos >= seqLen) continue; + T* outRow = output + ((size_t)n * seqLen + qPos) * oTotalDim + h * vHeadDim; + if(qMask[qi] == 0.0f) { + #pragma unroll + for(int d = 0; d < vHeadDim; d++) outRow[d] = (T)0.0f; + } else { + float invSum = (runningSum[qi] > 0.0f) ? (1.0f / runningSum[qi]) : 0.0f; + #pragma unroll + for(int d = 0; d < vHeadDim; d++) outRow[d] = (T)(acc[qi * vHeadDim + d] * invSum); + } + } +} + +template +__global__ +void flashAttentionKernelFloat( + const float* Q, const float* K, const float* V, const float* mask, float* output, + int seqLen, int numHeads, int numKVHeads, float scale +) { + flashAttentionTiledImpl( + Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); +} + +template +__global__ +void flashAttentionKernelHalf( + const half* Q, const half* K, const half* V, const half* mask, half* output, + int seqLen, int numHeads, int numKVHeads, float scale +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + flashAttentionTiledImpl( + Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); +#endif +} + +// Dispatch: pick template instantiation by (qHeadDim, vHeadDim). Add more shapes as needed. + +#define FA_LAUNCH_FLOAT(QD, VD, BQ, BKV, QPT) \ + do { \ + int totalQPerBlock = (BQ) * (QPT); \ + dim3 grid((seqLen + totalQPerBlock - 1) / totalQPerBlock, batchSize * numHeads); \ + flashAttentionKernelFloat<(QD), (VD), (BQ), (BKV), (QPT)><<>>( \ + Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); \ + } while(0) + +#define FA_LAUNCH_HALF(QD, VD, BQ, BKV, QPT) \ + do { \ + int totalQPerBlock = (BQ) * (QPT); \ + dim3 grid((seqLen + totalQPerBlock - 1) / totalQPerBlock, batchSize * numHeads); \ + flashAttentionKernelHalf<(QD), (VD), (BQ), (BKV), (QPT)><<>>( \ + Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); \ + } while(0) + +void customCudaFlashAttention( + const float* Q, const float* K, const float* V, const float* mask, float* output, + int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim +) { + if(batchSize * numHeads > 65535) + throw std::runtime_error("customCudaFlashAttention: batchSize * numHeads too large"); + float scale = 1.0f / sqrtf((float)qHeadDim); + // Only (qHeadDim,vHeadDim) pairs that stay comfortably under the 255-register-per-thread cap on + // EVERY target arch are instantiated. The per-thread qReg[qHeadDim]+acc[vHeadDim] arrays (at + // Q_PER_THREAD=1) dominate register use, and ptxas allocation varies by arch: pairs with a head dim + // >= 96 measure ~226-254 regs on sm_80 (clean) but spill on sm_120 (Blackwell), a perf cliff. So + // 96/64, 64/96, 96/96, 128/64, 64/128 and 128/128 are deliberately left unsupported until the + // kernel is restructured (e.g. accumulator/Q tiles in shared memory) to fit large dims under the + // cap on all archs. BLOCK_Q/BLOCK_KV tuning can't fix this (the spill is from the per-thread arrays). + if(qHeadDim == 32 && vHeadDim == 32) FA_LAUNCH_FLOAT(32, 32, 128, 32, 1); + else if(qHeadDim == 32 && vHeadDim == 16) FA_LAUNCH_FLOAT(32, 16, 128, 32, 1); + else if(qHeadDim == 64 && vHeadDim == 64) FA_LAUNCH_FLOAT(64, 64, 128, 32, 1); + else if(qHeadDim == 64 && vHeadDim == 32) FA_LAUNCH_FLOAT(64, 32, 128, 32, 1); + else if(qHeadDim == 32 && vHeadDim == 64) FA_LAUNCH_FLOAT(32, 64, 128, 32, 1); + else throw std::runtime_error("customCudaFlashAttention: unsupported (qHeadDim,vHeadDim) combination"); +} +void customCudaFlashAttention( + const half* Q, const half* K, const half* V, const half* mask, half* output, + int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim +) { + if(batchSize * numHeads > 65535) + throw std::runtime_error("customCudaFlashAttention: batchSize * numHeads too large"); + float scale = 1.0f / sqrtf((float)qHeadDim); + // See the float overload above for why only these small pairs are instantiated (255-register cap, + // arch-dependent spills for head dims >= 96). + if(qHeadDim == 32 && vHeadDim == 32) FA_LAUNCH_HALF(32, 32, 128, 32, 1); + else if(qHeadDim == 32 && vHeadDim == 16) FA_LAUNCH_HALF(32, 16, 128, 32, 1); + else if(qHeadDim == 64 && vHeadDim == 64) FA_LAUNCH_HALF(64, 64, 128, 32, 1); + else if(qHeadDim == 64 && vHeadDim == 32) FA_LAUNCH_HALF(64, 32, 128, 32, 1); + else if(qHeadDim == 32 && vHeadDim == 64) FA_LAUNCH_HALF(32, 64, 128, 32, 1); + else throw std::runtime_error("customCudaFlashAttention: unsupported (qHeadDim,vHeadDim) combination"); +} + +#undef FA_LAUNCH_FLOAT +#undef FA_LAUNCH_HALF + +//-------------------------------------------------------------------------------------------------------------- +// Convert mask [batchSize, seqLen] (0/1) into a fully-materialized additive attention bias of shape +// [batchSize, seqLen, seqLen] suitable for cuDNN SDPA's `[B, 1, S, S]` bias input. +// bias[b, q, k] = (mask[b, k] != 0 ? 0 : -3e4). +// Note: the q dim is fully replicated since the mask only depends on k. +// +// The constant must be a large finite negative to avoid any chance of misbehavior in +// cuDNN's softmax, and it must fit in fp16 (max ~65504) since the bias tensor's dtype must match +// Q/K/V's. We use -3e4, the largest round value that leaves fp16 headroom for the model's own +// logits on top. Measured logit magnitudes on real models as of mid-2026 are < ~500. +// +// Threading: one thread per (b, q, k). Inner-most (warp) axis = k so we write contiguous bytes per +// (b, q) row. Each thread broadcast-reads mask[b, k], so within a warp all 32 lanes read consecutive +// halfs from mask[b, k..k+32) - fully coalesced. + +__global__ +void maskToAttnBiasFullKernel(const float* mask, float* outBias, int seqLen) { + int k = blockIdx.x * blockDim.x + threadIdx.x; + int q = blockIdx.y; + int b = blockIdx.z; + if(k >= seqLen) + return; + float m = mask[b * seqLen + k]; + outBias[((size_t)b * seqLen + q) * seqLen + k] = (m != 0.0f) ? 0.0f : -3e4f; +} + +__global__ +void maskToAttnBiasFullHalfKernel(const half* mask, half* outBias, int seqLen) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int k = blockIdx.x * blockDim.x + threadIdx.x; + int q = blockIdx.y; + int b = blockIdx.z; + if(k >= seqLen) + return; + float m = __half2float(mask[b * seqLen + k]); + outBias[((size_t)b * seqLen + q) * seqLen + k] = __float2half((m != 0.0f) ? 0.0f : -3e4f); +#endif +} + +void customCudaMaskToAttnBiasFull(const float* mask, float* outBias, int batchSize, int seqLen) { + if(batchSize <= 0 || seqLen <= 0) + return; + int threads = 128; + dim3 blocks((seqLen + threads - 1) / threads, seqLen, batchSize); + maskToAttnBiasFullKernel<<>>(mask, outBias, seqLen); +} +void customCudaMaskToAttnBiasFull(const half* mask, half* outBias, int batchSize, int seqLen) { + if(batchSize <= 0 || seqLen <= 0) + return; + int threads = 128; + dim3 blocks((seqLen + threads - 1) / threads, seqLen, batchSize); + maskToAttnBiasFullHalfKernel<<>>(mask, outBias, seqLen); +} + +//-------------------------------------------------------------------------------------------------------------- +// SwiGLU: out[i] = SiLU(a[i]) * b[i] + +__global__ +void swiGLUKernel(const float* a, const float* b, float* out, int size) +{ + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if(idx < size) { + out[idx] = siluf(a[idx]) * b[idx]; + } +} + +// Grid-stride pattern (mirrors OpenCL transformerSwiGLU): each thread handles ELTS_PER_THREAD +// half2 pairs separated by blockDim.x. swiGLU is purely memory-bound, so the win is issuing wide +// (32-bit half2) loads/stores instead of scalar 16-bit ones to better use memory bandwidth. +// Operates on pairCount = size/2 half2 elements; a scalar tail handles an odd final element. +template +__global__ +void swiGLUHalfStrideKernel(const half* a, const half* b, half* out, int size) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + const half2* a2 = reinterpret_cast(a); + const half2* b2 = reinterpret_cast(b); + half2* out2 = reinterpret_cast(out); + int pairCount = size >> 1; + int tileStart = blockIdx.x * blockDim.x * ELTS_PER_THREAD; + int lid = threadIdx.x; + #pragma unroll + for(int d = 0; d < ELTS_PER_THREAD; d++) { + int p = tileStart + d * blockDim.x + lid; + if(p < pairCount) { + half2 av = a2[p]; + half2 bv = b2[p]; + float a0 = __half2float(__low2half(av)); + float a1 = __half2float(__high2half(av)); + float b0 = __half2float(__low2half(bv)); + float b1 = __half2float(__high2half(bv)); + out2[p] = __halves2half2(__float2half(siluf(a0) * b0), __float2half(siluf(a1) * b1)); + } + } + // Tail: if size is odd, the last element isn't covered by any half2 pair. Handle it once. + if((size & 1) != 0) { + int last = size - 1; + if(blockIdx.x == 0 && lid == 0) { + float av = __half2float(a[last]); + float bv = __half2float(b[last]); + out[last] = __float2half(siluf(av) * bv); + } + } +#else + (void)a; (void)b; (void)out; (void)size; +#endif +} + +void customCudaSwiGLU(const float* a, const float* b, float* out, int size) { + if(size <= 0) + return; + int threads = targetNumThreads; + int blocks = (size + threads - 1) / threads; + swiGLUKernel<<>>(a, b, out, size); +} +void customCudaSwiGLU(const half* a, const half* b, half* out, int size) { + if(size <= 0) + return; + constexpr int ELTS_PER_THREAD = 4; // half2 pairs per thread + int threads = 256; + int pairCount = size >> 1; + int blocks = (pairCount + threads * ELTS_PER_THREAD - 1) / (threads * ELTS_PER_THREAD); + if(blocks < 1) blocks = 1; // ensure the odd-size tail still gets a block + swiGLUHalfStrideKernel<<>>(a, b, out, size); +} + +//-------------------------------------------------------------------------------------------------------------- +// Masked residual add: trunk[i] += residual[i] * mask[spatial_idx] +// NCHW: trunk/residual [n, c, xy], mask [n, xy] +// NHWC: trunk/residual [n, xy, c], mask [n, xy] + +__global__ +void maskedResidualAddNCHWKernel(float* trunk, const float* residual, const float* mask, int cSize, int xySize) +{ + int xyIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(xyIdx >= xySize || cIdx >= cSize) + return; + int idx = (nIdx * cSize + cIdx) * xySize + xyIdx; + float m = (mask != NULL) ? mask[nIdx * xySize + xyIdx] : 1.0f; + trunk[idx] += residual[idx] * m; +} + +__global__ +void maskedResidualAddNCHWHalfKernel(half* trunk, const half* residual, const half* mask, int cSize, int xySize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int xyIdx = blockIdx.x * blockDim.x + threadIdx.x; + int cIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(xyIdx >= xySize || cIdx >= cSize) + return; + int idx = (nIdx * cSize + cIdx) * xySize + xyIdx; + float m = (mask != NULL) ? __half2float(mask[nIdx * xySize + xyIdx]) : 1.0f; + trunk[idx] = __float2half(__half2float(trunk[idx]) + __half2float(residual[idx]) * m); +#else + //Do nothing, FP16 not supported +#endif +} + +void customCudaMaskedResidualAddNCHW(float* trunk, const float* residual, const float* mask, int nSize, int cSize, int xySize) { + if(nSize > 65535) + throw std::runtime_error("customCudaMaskedResidualAddNCHW: nSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaMaskedResidualAddNCHW"); + int xyThreads, xyBlocks, cThreads, cBlocks; + splitThreadsAcrossDim01(xySize, cSize, xyThreads, xyBlocks, cThreads, cBlocks); + dim3 grid(xyBlocks, cBlocks, nSize); + dim3 threads(xyThreads, cThreads, 1); + maskedResidualAddNCHWKernel<<>>(trunk, residual, mask, cSize, xySize); +} +void customCudaMaskedResidualAddNCHW(half* trunk, const half* residual, const half* mask, int nSize, int cSize, int xySize) { + if(nSize > 65535) + throw std::runtime_error("customCudaMaskedResidualAddNCHW: nSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaMaskedResidualAddNCHW"); + int xyThreads, xyBlocks, cThreads, cBlocks; + splitThreadsAcrossDim01(xySize, cSize, xyThreads, xyBlocks, cThreads, cBlocks); + dim3 grid(xyBlocks, cBlocks, nSize); + dim3 threads(xyThreads, cThreads, 1); + maskedResidualAddNCHWHalfKernel<<>>(trunk, residual, mask, cSize, xySize); +} + +__global__ +void maskedResidualAddNHWCKernel(float* trunk, const float* residual, const float* mask, int xySize, int cSize) +{ + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int xyIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx >= cSize || xyIdx >= xySize) + return; + int idx = (nIdx * xySize + xyIdx) * cSize + cIdx; + float m = (mask != NULL) ? mask[nIdx * xySize + xyIdx] : 1.0f; + trunk[idx] += residual[idx] * m; +} + +__global__ +void maskedResidualAddNHWCHalfKernel(half* trunk, const half* residual, const half* mask, int xySize, int cSize) +{ +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int cIdx = blockIdx.x * blockDim.x + threadIdx.x; + int xyIdx = blockIdx.y * blockDim.y + threadIdx.y; + int nIdx = blockIdx.z; + if(cIdx >= cSize || xyIdx >= xySize) + return; + int idx = (nIdx * xySize + xyIdx) * cSize + cIdx; + float m = (mask != NULL) ? __half2float(mask[nIdx * xySize + xyIdx]) : 1.0f; + trunk[idx] = __float2half(__half2float(trunk[idx]) + __half2float(residual[idx]) * m); +#else + //Do nothing, FP16 not supported +#endif +} + +void customCudaMaskedResidualAddNHWC(float* trunk, const float* residual, const float* mask, int nSize, int xySize, int cSize) { + if(nSize > 65535) + throw std::runtime_error("customCudaMaskedResidualAddNHWC: nSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaMaskedResidualAddNHWC"); + int cThreads, cBlocks, xyThreads, xyBlocks; + splitThreadsAcrossDim01(cSize, xySize, cThreads, cBlocks, xyThreads, xyBlocks); + dim3 grid(cBlocks, xyBlocks, nSize); + dim3 threads(cThreads, xyThreads, 1); + maskedResidualAddNHWCKernel<<>>(trunk, residual, mask, xySize, cSize); +} +void customCudaMaskedResidualAddNHWC(half* trunk, const half* residual, const half* mask, int nSize, int xySize, int cSize) { + if(nSize > 65535) + throw std::runtime_error("customCudaMaskedResidualAddNHWC: nSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaMaskedResidualAddNHWC"); + int cThreads, cBlocks, xyThreads, xyBlocks; + splitThreadsAcrossDim01(cSize, xySize, cThreads, cBlocks, xyThreads, xyBlocks); + dim3 grid(cBlocks, xyBlocks, nSize); + dim3 threads(cThreads, xyThreads, 1); + maskedResidualAddNHWCHalfKernel<<>>(trunk, residual, mask, xySize, cSize); +} + +//-------------------------------------------------------------------------------------------------------------- +// RMSNorm with gamma/beta/activation (for trunk tip, non-spatial mode). +// NHWC: input/output [n, xy, c], gamma/beta [c], mask [n, xy] +// Each block handles one (n, xy) position. + +__global__ +void rmsNormGammaBetaNHWCKernel( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +) { + extern __shared__ float rmsShared[]; + int pos = blockIdx.x; // n * xySize + xy + int tid = threadIdx.x; + int n = pos / xySize; + int xy = pos % xySize; + if(n >= nSize) + return; + + float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; + + const float* inRow = in + (size_t)pos * cSize; + + float acc = 0.0f; + for(int c = tid; c < cSize; c += blockDim.x) { + float val = inRow[c] * maskVal; + acc += val * val; + } + rmsShared[tid] = acc; + __syncthreads(); + for(int s = blockDim.x / 2; s > 0; s >>= 1) { + if(tid < s) rmsShared[tid] += rmsShared[tid + s]; + __syncthreads(); + } + float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); + + float* outRow = out + (size_t)pos * cSize; + for(int c = tid; c < cSize; c += blockDim.x) { + float val = inRow[c] * maskVal * rms * gamma[c] + beta[c]; + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + outRow[c] = val; + } +} + +#ifdef KATAGO_GPU_CUDA +// Vectorized half2 path: each thread loads ELTS_PER_THREAD half2 values (= 2*ELTS_PER_THREAD halfs). +// Block size = cSize / (2 * ELTS_PER_THREAD), rounded up to a warp multiple. +// In-row values are kept in registers across the two passes so the kernel reads `in` only once. +// Per-warp reduction via __shfl_xor_sync, then a single inter-warp reduction in shared memory. +// CUDA-only: the reduction hardcodes 32-lane warps and 32-bit shuffle masks, which is wrong on +// AMD CDNA's 64-lane wavefronts, so ROCm always uses the scalar fallback kernel below. +// +// Requires cSize % (2 * ELTS_PER_THREAD) == 0. + +template +__global__ +void rmsNormGammaBetaNHWCHalfVecKernel( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int pos = blockIdx.x; + int tid = threadIdx.x; + int n = pos / xySize; + int xy = pos % xySize; + if(n >= nSize) + return; + + constexpr int VALS_PER_THREAD = 2 * ELTS_PER_THREAD; + float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + + const half2* inRow2 = reinterpret_cast(in + (size_t)pos * cSize); + const half2* gamma2 = reinterpret_cast(gamma); + const half2* beta2 = reinterpret_cast(beta); + half2* outRow2 = reinterpret_cast(out + (size_t)pos * cSize); + + // Stage 1: load all of this thread's values into registers, compute sum of squares. + float vals[VALS_PER_THREAD]; + float acc = 0.0f; + #pragma unroll + for(int e = 0; e < ELTS_PER_THREAD; e++) { + int idx2 = tid + e * blockDim.x; // half2-pair index + half2 v2 = inRow2[idx2]; + float v0 = __half2float(__low2half(v2)) * maskVal; + float v1 = __half2float(__high2half(v2)) * maskVal; + vals[2*e] = v0; + vals[2*e + 1] = v1; + acc += v0 * v0 + v1 * v1; + } + + // Stage 2: warp reduce, then inter-warp reduce via shared memory. + for(int off = 16; off > 0; off >>= 1) acc += __shfl_xor_sync(0xffffffff, acc, off); + __shared__ float warpSums[32]; // max 32 warps per block (1024 threads); we use far fewer. + int warpId = tid >> 5; + int laneId = tid & 31; + if(laneId == 0) warpSums[warpId] = acc; + __syncthreads(); + + // First warp combines per-warp sums. + int numWarps = (blockDim.x + 31) >> 5; + float total = 0.0f; + if(tid < numWarps) total = warpSums[tid]; + if(tid < 32) { + for(int off = 16; off > 0; off >>= 1) total += __shfl_xor_sync(0xffffffff, total, off); + if(tid == 0) warpSums[0] = total; + } + __syncthreads(); + float rms = rsqrtf(warpSums[0] / (float)cSize + epsilon); + + // Stage 3: compute output, reusing `vals` from registers. + #pragma unroll + for(int e = 0; e < ELTS_PER_THREAD; e++) { + int idx2 = tid + e * blockDim.x; + half2 g2 = gamma2[idx2]; + half2 b2 = beta2[idx2]; + float g0 = __half2float(__low2half(g2)); + float g1 = __half2float(__high2half(g2)); + float b0 = __half2float(__low2half(b2)); + float b1 = __half2float(__high2half(b2)); + float o0 = vals[2*e] * rms * g0 + b0; + float o1 = vals[2*e + 1] * rms * g1 + b1; + if(activation == ACTIVATION_RELU) { + o0 = fmaxf(o0, 0.0f); + o1 = fmaxf(o1, 0.0f); + } else if(activation == ACTIVATION_MISH) { + o0 = mishf(o0); + o1 = mishf(o1); + } else if(activation == ACTIVATION_SILU) { + o0 = siluf(o0); + o1 = siluf(o1); + } + o0 *= maskVal; + o1 *= maskVal; + outRow2[idx2] = __halves2half2(__float2half(o0), __float2half(o1)); + } +#else + (void)in; (void)out; (void)gamma; (void)beta; (void)mask; + (void)nSize; (void)xySize; (void)cSize; (void)epsilon; (void)activation; +#endif +} +#endif // KATAGO_GPU_CUDA + +// Generic (scalar) fallback for shapes the vectorized path can't handle (and the only +// half kernel used on ROCm - no warp-size assumptions). +__global__ +void rmsNormGammaBetaNHWCHalfKernel( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float rmsShared[]; + int pos = blockIdx.x; + int tid = threadIdx.x; + int n = pos / xySize; + int xy = pos % xySize; + if(n >= nSize) + return; + + float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + + const half* inRow = in + (size_t)pos * cSize; + + float acc = 0.0f; + for(int c = tid; c < cSize; c += blockDim.x) { + float val = __half2float(inRow[c]) * maskVal; + acc += val * val; + } + rmsShared[tid] = acc; + __syncthreads(); + for(int s = blockDim.x / 2; s > 0; s >>= 1) { + if(tid < s) rmsShared[tid] += rmsShared[tid + s]; + __syncthreads(); + } + float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); + + half* outRow = out + (size_t)pos * cSize; + for(int c = tid; c < cSize; c += blockDim.x) { + float val = __half2float(inRow[c]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + outRow[c] = __float2half(val); + } +#else + //Do nothing, FP16 not supported +#endif +} + +void customCudaRMSNormGammaBetaNHWC( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +) { + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaRMSNormGammaBetaNHWC"); + int totalPositions = nSize * xySize; + if(totalPositions <= 0) + return; + int threads = 1; + while(threads < cSize && threads < targetNumThreads) threads *= 2; + int sharedMem = threads * sizeof(float); + rmsNormGammaBetaNHWCKernel<<>>( + in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); +} +void customCudaRMSNormGammaBetaNHWC( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int xySize, int cSize, float epsilon, int activation +) { + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaRMSNormGammaBetaNHWC"); + int totalPositions = nSize * xySize; + if(totalPositions <= 0) + return; +#ifdef KATAGO_GPU_CUDA + // Vectorized path: cSize must be even (use half2). Pick ELTS_PER_THREAD so we end up with a + // power-of-two thread count that's a multiple of 32 (warp size) and <= 512. + // For cSize=384 -> 192 half2 pairs -> 192 threads, 1 elt/thread. + // For cSize=768 -> 384 half2 pairs -> 384 threads, 1 elt/thread. + // For cSize=1024 -> 512 half2 pairs -> 512 threads, 1 elt/thread. + // Larger cSize -> 2 or more pairs per thread. + if(cSize % 2 == 0) { + int halfPairs = cSize / 2; + if(halfPairs <= 512 && halfPairs % 32 == 0) { + rmsNormGammaBetaNHWCHalfVecKernel<1><<>>( + in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); + return; + } + if(halfPairs % (2 * 32) == 0 && halfPairs / 2 <= 512) { + rmsNormGammaBetaNHWCHalfVecKernel<2><<>>( + in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); + return; + } + if(halfPairs % (4 * 32) == 0 && halfPairs / 4 <= 512) { + rmsNormGammaBetaNHWCHalfVecKernel<4><<>>( + in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); + return; + } + } +#endif // KATAGO_GPU_CUDA + // Fallback to scalar kernel (always used on ROCm). + int threads = 1; + while(threads < cSize && threads < targetNumThreads) threads *= 2; + int sharedMem = threads * sizeof(float); + rmsNormGammaBetaNHWCHalfKernel<<>>( + in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); +} + +// NCHW variant: input/output [n, c, xy], gamma/beta [c], mask [n, xy] +// Each block handles one (n, xy) position. Need to stride over channels. +__global__ +void rmsNormGammaBetaNCHWKernel( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + int nSize, int cSize, int xySize, float epsilon, int activation +) { + extern __shared__ float rmsShared[]; + int pos = blockIdx.x; // n * xySize + xy + int tid = threadIdx.x; + int n = pos / xySize; + int xy = pos % xySize; + if(n >= nSize) + return; + + float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; + + float acc = 0.0f; + for(int c = tid; c < cSize; c += blockDim.x) { + float val = in[(n * cSize + c) * xySize + xy] * maskVal; + acc += val * val; + } + rmsShared[tid] = acc; + __syncthreads(); + for(int s = blockDim.x / 2; s > 0; s >>= 1) { + if(tid < s) rmsShared[tid] += rmsShared[tid + s]; + __syncthreads(); + } + float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); + + for(int c = tid; c < cSize; c += blockDim.x) { + float val = in[(n * cSize + c) * xySize + xy] * maskVal * rms * gamma[c] + beta[c]; + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + out[(n * cSize + c) * xySize + xy] = val; + } +} + +__global__ +void rmsNormGammaBetaNCHWHalfKernel( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int cSize, int xySize, float epsilon, int activation +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float rmsShared[]; + int pos = blockIdx.x; + int tid = threadIdx.x; + int n = pos / xySize; + int xy = pos % xySize; + if(n >= nSize) + return; + + float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + + float acc = 0.0f; + for(int c = tid; c < cSize; c += blockDim.x) { + float val = __half2float(in[(n * cSize + c) * xySize + xy]) * maskVal; + acc += val * val; + } + rmsShared[tid] = acc; + __syncthreads(); + for(int s = blockDim.x / 2; s > 0; s >>= 1) { + if(tid < s) rmsShared[tid] += rmsShared[tid + s]; + __syncthreads(); + } + float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); + + for(int c = tid; c < cSize; c += blockDim.x) { + float val = __half2float(in[(n * cSize + c) * xySize + xy]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + out[(n * cSize + c) * xySize + xy] = __float2half(val); + } +#else + //Do nothing, FP16 not supported +#endif +} + +void customCudaRMSNormGammaBetaNCHW( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + int nSize, int cSize, int xySize, float epsilon, int activation +) { + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaRMSNormGammaBetaNCHW"); + int totalPositions = nSize * xySize; + if(totalPositions <= 0) + return; + int threads = 1; + while(threads < cSize && threads < targetNumThreads) threads *= 2; + int sharedMem = threads * sizeof(float); + rmsNormGammaBetaNCHWKernel<<>>( + in, out, gamma, beta, mask, nSize, cSize, xySize, epsilon, activation); +} +void customCudaRMSNormGammaBetaNCHW( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + int nSize, int cSize, int xySize, float epsilon, int activation +) { + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaRMSNormGammaBetaNCHW"); + int totalPositions = nSize * xySize; + if(totalPositions <= 0) + return; + int threads = 1; + while(threads < cSize && threads < targetNumThreads) threads *= 2; + int sharedMem = threads * sizeof(float); + rmsNormGammaBetaNCHWHalfKernel<<>>( + in, out, gamma, beta, mask, nSize, cSize, xySize, epsilon, activation); +} + +//-------------------------------------------------------------------------------------------------------------- +// Spatial RMSNorm: normalize over all C*H*W per batch element. +// NHWC: input/output [n, xy, c], gamma/beta [c], mask [n, xy], maskSum [n] +// NCHW: input/output [n, c, xy], gamma/beta [c], mask [n, xy], maskSum [n] +// +// Three-pass, deterministic: +// Pass 1 (SumSq): grid (numBlocksPerBatch, nSize). Many blocks per batch element grid-stride over +// the flat C*xy range, reduce in-block, write one partial per block into partialBuf. +// Pass 2 (Reduce): grid (nSize). One block per batch element sums its numBlocksPerBatch partials +// (fixed order) into sumSqBuf[n]. +// Pass 3 (Apply): grid (numApplyBlocks, nSize). Normalize + activation + remask, vectorized. +// +// The reduction in pass 1 is layout-agnostic: the value array is flat [n, C*xy] in both NHWC and NCHW, +// so we load it flat (half2-vectorized). Only the mask's xy derivation differs by layout. +// +// sumSqBuf layout: [nSize * (SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1)] floats. +// [n * stride + 0 .. + numBlocksPerBatch-1] = pass-1 partials, written by pass 1, read by pass 2. +// [n * stride + numBlocksPerBatch] = final sum of squares, written by pass 2, read by pass 3. + +static const int SPATIAL_RMSNORM_BLOCKS_PER_BATCH = 8; +// partialStride is always CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE; keep them in sync with the backend's alloc. +static_assert(CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE == SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1, + "CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE must equal SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1"); + +// Choose how many blocks per batch element to launch for pass 1. Capped so each block gets enough +// work to amortize launch/reduction, and so pass 2 can reduce the partials within a single block. +static int spatialRMSNormBlocksPerBatch(int totalElems) { + int maxUseful = (totalElems + targetNumThreads - 1) / targetNumThreads; + if(maxUseful < 1) maxUseful = 1; + int b = SPATIAL_RMSNORM_BLOCKS_PER_BATCH; + if(b > maxUseful) b = maxUseful; + return b; +} + +// Pass 1: partial sum of squares. One block computes one partial over a strided slice of the flat range. +template +__global__ +void spatialRMSNormSumSqKernel( + const float* in, const float* mask, float* partialBuf, + int totalElems, int cSize, int xySize, int numBlocksPerBatch, int partialStride +) { + extern __shared__ float srmsShared[]; + int n = blockIdx.y; + int blk = blockIdx.x; + int tid = threadIdx.x; + + const float* inRow = in + (size_t)n * totalElems; + + float acc = 0.0f; + // Grid-stride over the flat range, this block covers indices blk, blk+numBlocksPerBatch, ... in tiles. + for(int i = blk * blockDim.x + tid; i < totalElems; i += blockDim.x * numBlocksPerBatch) { + int xy = IS_NHWC ? (i / cSize) : (i % xySize); + float m = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; + float val = inRow[i] * m; + acc += val * val; + } + srmsShared[tid] = acc; + __syncthreads(); + for(int s = blockDim.x / 2; s > 0; s >>= 1) { + if(tid < s) srmsShared[tid] += srmsShared[tid + s]; + __syncthreads(); + } + if(tid == 0) partialBuf[n * partialStride + blk] = srmsShared[0]; +} + +template +__global__ +void spatialRMSNormSumSqHalfKernel( + const half* in, const half* mask, float* partialBuf, + int totalElems, int cSize, int xySize, int numBlocksPerBatch, int partialStride +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + extern __shared__ float srmsShared[]; + int n = blockIdx.y; + int blk = blockIdx.x; + int tid = threadIdx.x; + + const half* inRow = in + (size_t)n * totalElems; + + float acc = 0.0f; + // For NHWC, two consecutive flat elements share the same xy (same mask), so vectorize with half2. + if(IS_NHWC && (cSize & 1) == 0) { + int totalPairs = totalElems >> 1; + const half2* inRow2 = reinterpret_cast(inRow); + int cPairs = cSize >> 1; + for(int p = blk * blockDim.x + tid; p < totalPairs; p += blockDim.x * numBlocksPerBatch) { + int xy = p / cPairs; + float m = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + half2 v2 = inRow2[p]; + float v0 = __half2float(__low2half(v2)) * m; + float v1 = __half2float(__high2half(v2)) * m; + acc += v0 * v0 + v1 * v1; + } + } + else { + for(int i = blk * blockDim.x + tid; i < totalElems; i += blockDim.x * numBlocksPerBatch) { + int xy = IS_NHWC ? (i / cSize) : (i % xySize); + float m = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + float val = __half2float(inRow[i]) * m; + acc += val * val; + } + } + srmsShared[tid] = acc; + __syncthreads(); + for(int s = blockDim.x / 2; s > 0; s >>= 1) { + if(tid < s) srmsShared[tid] += srmsShared[tid + s]; + __syncthreads(); + } + if(tid == 0) partialBuf[n * partialStride + blk] = srmsShared[0]; +#else + //Do nothing, FP16 not supported +#endif +} + +// Pass 2: reduce numBlocksPerBatch partials per batch element to a single value, in fixed order. +__global__ +void spatialRMSNormReduceKernel( + const float* partialBuf, float* sumSqBuf, int numBlocksPerBatch, int partialStride +) { + int n = blockIdx.x; + // numBlocksPerBatch is small (<= SPATIAL_RMSNORM_BLOCKS_PER_BATCH); a single thread sums in fixed order. + if(threadIdx.x != 0) + return; + float total = 0.0f; + const float* row = partialBuf + (size_t)n * partialStride; + for(int b = 0; b < numBlocksPerBatch; b++) + total += row[b]; + sumSqBuf[n * partialStride + numBlocksPerBatch] = total; +} + +// Pass 3 (apply): NHWC. grid (numApplyBlocks, nSize). Flat over C*xy; recover c = i % cSize, xy = i / cSize. +__global__ +void spatialRMSNormApplyNHWCKernel( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + const float* maskSum, const float* sumSqBuf, + int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride +) { + int n = blockIdx.y; + float mSum = maskSum[n]; + float totalSize = mSum * (float)cSize; + float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); + + const float* inRow = in + (size_t)n * totalElems; + float* outRow = out + (size_t)n * totalElems; + + for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { + int xy = i / cSize; + int c = i - xy * cSize; + float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; + float val = inRow[i] * maskVal * rms * gamma[c] + beta[c]; + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + outRow[i] = val; + } +} + +__global__ +void spatialRMSNormApplyNHWCHalfKernel( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + const float* maskSum, const float* sumSqBuf, + int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int n = blockIdx.y; + float mSum = maskSum[n]; + float totalSize = mSum * (float)cSize; + float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); + + const half* inRow = in + (size_t)n * totalElems; + half* outRow = out + (size_t)n * totalElems; + + // half2 path: a pair (i, i+1) shares xy/mask; gamma/beta indexed at c, c+1. + if((cSize & 1) == 0) { + int totalPairs = totalElems >> 1; + int cPairs = cSize >> 1; + const half2* inRow2 = reinterpret_cast(inRow); + const half2* gamma2 = reinterpret_cast(gamma); + const half2* beta2 = reinterpret_cast(beta); + half2* outRow2 = reinterpret_cast(outRow); + for(int p = blockIdx.x * blockDim.x + threadIdx.x; p < totalPairs; p += blockDim.x * gridDim.x) { + int xy = p / cPairs; + int cp = p - xy * cPairs; + float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + half2 v2 = inRow2[p]; + half2 g2 = gamma2[cp]; + half2 b2 = beta2[cp]; + float o0 = __half2float(__low2half(v2)) * maskVal * rms * __half2float(__low2half(g2)) + __half2float(__low2half(b2)); + float o1 = __half2float(__high2half(v2)) * maskVal * rms * __half2float(__high2half(g2)) + __half2float(__high2half(b2)); + if(activation == ACTIVATION_RELU) { o0 = fmaxf(o0, 0.0f); o1 = fmaxf(o1, 0.0f); } + else if(activation == ACTIVATION_MISH) { o0 = mishf(o0); o1 = mishf(o1); } + else if(activation == ACTIVATION_SILU) { o0 = siluf(o0); o1 = siluf(o1); } + o0 *= maskVal; o1 *= maskVal; + outRow2[p] = __halves2half2(__float2half(o0), __float2half(o1)); + } + } + else { + for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { + int xy = i / cSize; + int c = i - xy * cSize; + float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + float val = __half2float(inRow[i]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + outRow[i] = __float2half(val); + } + } +#else + //Do nothing, FP16 not supported +#endif +} + +// Pass 3 (apply): NCHW. Flat over C*xy; recover c = i / xySize, xy = i % xySize. +__global__ +void spatialRMSNormApplyNCHWKernel( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, + const float* maskSum, const float* sumSqBuf, + int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride +) { + int n = blockIdx.y; + float mSum = maskSum[n]; + float totalSize = mSum * (float)cSize; + float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); + + const float* inRow = in + (size_t)n * totalElems; + float* outRow = out + (size_t)n * totalElems; + + for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { + int c = i / xySize; + int xy = i - c * xySize; + float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; + float val = inRow[i] * maskVal * rms * gamma[c] + beta[c]; + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + outRow[i] = val; + } +} + +__global__ +void spatialRMSNormApplyNCHWHalfKernel( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, + const float* maskSum, const float* sumSqBuf, + int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride +) { +#ifdef KATAGO_GPU_SUPPORTS_FP16 + int n = blockIdx.y; + float mSum = maskSum[n]; + float totalSize = mSum * (float)cSize; + float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); + + const half* inRow = in + (size_t)n * totalElems; + half* outRow = out + (size_t)n * totalElems; + + for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { + int c = i / xySize; + int xy = i - c * xySize; + float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; + float val = __half2float(inRow[i]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); + if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); + else if(activation == ACTIVATION_MISH) val = mishf(val); + else if(activation == ACTIVATION_SILU) val = siluf(val); + val *= maskVal; + outRow[i] = __float2half(val); + } +#else + //Do nothing, FP16 not supported +#endif +} + +//-- Host launchers ---------------------------------------------------------------------------------- + +static int spatialRMSNormApplyBlocks(int totalElems, int threads) { + int blocks = (totalElems + threads - 1) / threads; + if(blocks < 1) blocks = 1; + if(blocks > 256) blocks = 256; // grid-stride caps the block count; this saturates the GPU + return blocks; +} + +void customCudaSpatialRMSNormNHWC( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, + int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf +) { + if(nSize <= 0) + return; + if(nSize > 65535) + throw std::runtime_error("customCudaSpatialRMSNormNHWC: nSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaSpatialRMSNormNHWC"); + int totalElems = xySize * cSize; + int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); + int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; + + int threads1 = targetNumThreads; + int sharedMem1 = threads1 * sizeof(float); + dim3 grid1(numBlocksPerBatch, nSize); + spatialRMSNormSumSqKernel<<>>( + in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); + + spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); + + int threads2 = targetNumThreads; + int applyBlocks = spatialRMSNormApplyBlocks(totalElems, threads2); + dim3 grid2(applyBlocks, nSize); + spatialRMSNormApplyNHWCKernel<<>>( + in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); +} +void customCudaSpatialRMSNormNHWC( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, + int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf +) { + if(nSize <= 0) + return; + if(nSize > 65535) + throw std::runtime_error("customCudaSpatialRMSNormNHWC: nSize too large"); + checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaSpatialRMSNormNHWC"); + int totalElems = xySize * cSize; + int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); + int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; + + int threads1 = targetNumThreads; + int sharedMem1 = threads1 * sizeof(float); + dim3 grid1(numBlocksPerBatch, nSize); + spatialRMSNormSumSqHalfKernel<<>>( + in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); + + spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); + + int threads2 = targetNumThreads; + //totalElems/2: the half kernel processes half2 pairs when cSize is even, the common case. + //For odd cSize it falls back to a scalar loop and this undercounts blocks, which + //grid-striding keeps correct. + int applyBlocks = spatialRMSNormApplyBlocks(totalElems / 2, threads2); + dim3 grid2(applyBlocks, nSize); + spatialRMSNormApplyNHWCHalfKernel<<>>( + in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); +} + +void customCudaSpatialRMSNormNCHW( + const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, + int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf +) { + if(nSize <= 0) + return; + if(nSize > 65535) + throw std::runtime_error("customCudaSpatialRMSNormNCHW: nSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaSpatialRMSNormNCHW"); + int totalElems = cSize * xySize; + int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); + int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; + + int threads1 = targetNumThreads; + int sharedMem1 = threads1 * sizeof(float); + dim3 grid1(numBlocksPerBatch, nSize); + spatialRMSNormSumSqKernel<<>>( + in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); + + spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); + + int threads2 = targetNumThreads; + int applyBlocks = spatialRMSNormApplyBlocks(totalElems, threads2); + dim3 grid2(applyBlocks, nSize); + spatialRMSNormApplyNCHWKernel<<>>( + in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); +} +void customCudaSpatialRMSNormNCHW( + const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, + int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf +) { + if(nSize <= 0) + return; + if(nSize > 65535) + throw std::runtime_error("customCudaSpatialRMSNormNCHW: nSize too large"); + checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaSpatialRMSNormNCHW"); + int totalElems = cSize * xySize; + int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); + int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; + + int threads1 = targetNumThreads; + int sharedMem1 = threads1 * sizeof(float); + dim3 grid1(numBlocksPerBatch, nSize); + spatialRMSNormSumSqHalfKernel<<>>( + in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); + + spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); + + int threads2 = targetNumThreads; + int applyBlocks = spatialRMSNormApplyBlocks(totalElems, threads2); + dim3 grid2(applyBlocks, nSize); + spatialRMSNormApplyNCHWHalfKernel<<>>( + in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); +} diff --git a/cpp/neuralnet/cudaandrocmutils.inc b/cpp/neuralnet/cudaandrocmutils.inc new file mode 100644 index 0000000000..93b0bc9c2b --- /dev/null +++ b/cpp/neuralnet/cudaandrocmutils.inc @@ -0,0 +1,168 @@ +// GPU utility functions (namespace CudaUtils) shared between the CUDA backend (cudautils.cpp) +// and the ROCm backend (rocmutils.cpp). Never compiled directly. It is #included by exactly one +// of those wrappers per build. The wrapper includes the backend's utils/errorcheck/vendor/helpers +// headers first, and on ROCm also rocmcudanames.h, which maps the CUDA API spellings used below +// (cudaMalloc, cudaMemcpy, ...) to HIP. See cudaandrocmbackend.inc for the full contract of this +// sharing pattern. + +#ifdef KATAGO_UTILS_INC_INCLUDED +#error "cudaandrocmutils.inc may only be included once" +#endif +#define KATAGO_UTILS_INC_INCLUDED 1 + +#include +#include "../neuralnet/debugprint.h" + +#include "../external/half-2.2.0/include/half.hpp" + +//------------------------ +#include "../core/using.h" +//------------------------ + +using half_t = half_float::half; + +void CudaUtils::mallocOnDevice(const string& name, int numWeights, void*& deviceBuf, bool useFP16) { + if(useFP16) { + size_t halfBytes = numWeights * sizeof(half_t); + CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, halfBytes)); + } + else { + size_t floatBytes = numWeights * sizeof(float); + CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, floatBytes)); + } +} + +void CudaUtils::mallocAndCopyToDevice(const string& name, const vector& weights, void*& deviceBuf, bool useFP16) { + size_t numWeights = weights.size(); + if(useFP16) { + size_t halfBytes = numWeights * sizeof(half_t); + vector weightsHalf(weights.size()); + for(size_t i = 0; i(weights[i]); + CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, halfBytes)); + CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weightsHalf.data(), halfBytes, cudaMemcpyHostToDevice)); + } + else { + size_t floatBytes = numWeights * sizeof(float); + CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, floatBytes)); + CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weights.data(), floatBytes, cudaMemcpyHostToDevice)); + } +} + +void CudaUtils::mallocAndCopyToDevice(const string& name, const float* weights, int numWeights, void*& deviceBuf, bool useFP16) { + if(useFP16) { + size_t halfBytes = numWeights * sizeof(half_t); + vector weightsHalf(numWeights); + for(int i = 0; i(weights[i]); + CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, halfBytes)); + CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weightsHalf.data(), halfBytes, cudaMemcpyHostToDevice)); + } + else { + size_t floatBytes = numWeights * sizeof(float); + CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, floatBytes)); + CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weights, floatBytes, cudaMemcpyHostToDevice)); + } +} + +//Only use in testing, allocates an intermediate buffer in the case of FP16 which will be very slow. +void CudaUtils::expensiveCopyFromDevice(const string& name, float* weights, int numWeights, const void* deviceBuf, bool useFP16) { + if(useFP16) { + vector weightsHalf(numWeights); + size_t halfBytes = numWeights * sizeof(half_t); + CUDA_ERR(name.c_str(),cudaMemcpy(weightsHalf.data(), deviceBuf, halfBytes, cudaMemcpyDeviceToHost)); + for(int i = 0; i values(totalSize); + expensiveCopyFromDevice(name, values.data(), totalSize, deviceBuf, useFP16); + + vector maskValues; + float* maskPtr = nullptr; + if(maskBuf != nullptr) { + maskValues.resize(batchSize * spatialSize); + expensiveCopyFromDevice(name + ":mask", maskValues.data(), batchSize * spatialSize, maskBuf, useFP16); + maskPtr = maskValues.data(); + } + + if(useNHWC) { + DebugPrint::print3DSummary(name, values.data(), batchSize, spatialSize, cSize, "NSC", batchSize, spatialSize, maskPtr); +#ifdef DEBUG_INTERMEDIATE_VALUES_VERBOSE + DebugPrint::print3DVerbose(name, values.data(), batchSize, spatialSize, cSize, "NSC"); +#endif + } + else { + DebugPrint::print3DSummary(name, values.data(), batchSize, cSize, spatialSize, "NCS", batchSize, spatialSize, maskPtr); +#ifdef DEBUG_INTERMEDIATE_VALUES_VERBOSE + DebugPrint::print3DVerbose(name, values.data(), batchSize, cSize, spatialSize, "NCS"); +#endif + } +} + +void CudaUtils::debugPrint2D(const string& name, const void* deviceBuf, int batchSize, int cSize, bool useFP16) { + vector values(batchSize * cSize); + expensiveCopyFromDevice(name, values.data(), values.size(), deviceBuf, useFP16); + DebugPrint::print2DSummary(name, values.data(), batchSize, cSize); +#ifdef DEBUG_INTERMEDIATE_VALUES_VERBOSE + DebugPrint::print2DVerbose(name, values.data(), batchSize, cSize); +#endif +} + +void CudaUtils::checkBufferSize(int batchSize, int xSize, int ySize, int channels) { + if((int64_t)batchSize * xSize * ySize * channels >= (int64_t)1 << 31) + throw StringError("Batch size too large, resulting GPU buffers might exceed 2^31 entries which is not currently supported"); +} + +void CudaUtils::hostMallocZeroOneBufs(void*& zeroBuf, void*& oneBuf, bool useFP16) { + if(!useFP16) { + zeroBuf = malloc(sizeof(float)); + oneBuf = malloc(sizeof(float)); + if(zeroBuf == NULL || oneBuf == NULL) + throw StringError("Buffers: out of host memory allocating zero/one constants"); + *((float*)zeroBuf) = 0.0f; + *((float*)oneBuf) = 1.0f; + } + else { + //Convert to FP16 on the device, then copy back so we have it in host memory + float zero = 0.0f; + float one = 1.0f; + void* zeroTmp = NULL; + void* oneTmp = NULL; + zeroBuf = NULL; + oneBuf = NULL; + try { + mallocAndCopyToDevice("Buffers",&zero,1,zeroTmp,useFP16); + mallocAndCopyToDevice("Buffers",&one,1,oneTmp,useFP16); + zeroBuf = malloc(sizeof(half_t)); + oneBuf = malloc(sizeof(half_t)); + if(zeroBuf == NULL || oneBuf == NULL) + throw StringError("Buffers: out of host memory allocating zero/one constants"); + CUDA_ERR("Buffers",cudaMemcpy(zeroBuf,zeroTmp,sizeof(half_t),cudaMemcpyDeviceToHost)); + CUDA_ERR("Buffers",cudaMemcpy(oneBuf,oneTmp,sizeof(half_t),cudaMemcpyDeviceToHost)); + } + catch(...) { + //Free everything so a throwing caller (whose destructor will not run) leaks nothing. + if(zeroTmp != NULL) (void)cudaFree(zeroTmp); + if(oneTmp != NULL) (void)cudaFree(oneTmp); + free(zeroBuf); + free(oneBuf); + zeroBuf = NULL; + oneBuf = NULL; + throw; + } + (void)cudaFree(zeroTmp); + (void)cudaFree(oneTmp); + } +} diff --git a/cpp/neuralnet/cudabackend.cpp b/cpp/neuralnet/cudabackend.cpp index d9f3f9ee73..caf4d215a7 100644 --- a/cpp/neuralnet/cudabackend.cpp +++ b/cpp/neuralnet/cudabackend.cpp @@ -2,9 +2,9 @@ #include "../neuralnet/cudaerrorcheck.h" #include "../neuralnet/cudaincludes.h" -// cuDNN frontend SDPA support. The header is vendored under external/cudnn-frontend. -// Requires cuDNN >= 8.5 (header-only library declares this); the SDPA path additionally -// requires cuDNN backend support which is present in cuDNN 8.9.3+ for our use case. +// cuDNN frontend SDPA support. The header is vendored under external/cudnn-frontend and +// requires cuDNN >= 8.5. The SDPA path this backend uses additionally requires cuDNN 8.9.3+, +// hence the version gate below. // IMPORTANT: cudnn_frontend bundles nlohmann/json 3.11.3 which uses the same include guard // (INCLUDE_NLOHMANN_JSON_HPP_) as KataGo's older nlohmann/json 3.8.0. Including cudnn_frontend.h // first ensures the 3.11.3 version wins and that the template signatures cudnn_frontend expects @@ -23,4144 +23,18 @@ #include "../neuralnet/cudahelpers.h" #include "../neuralnet/cudautils.h" -#include "../neuralnet/modelversion.h" -#include "../neuralnet/nninterface.h" -#include "../neuralnet/nninputs.h" -#include "../neuralnet/sgfmetadata.h" -#include "../neuralnet/nneval.h" -#include "../neuralnet/desc.h" -#include "../core/simpleallocator.h" -#include "../core/test.h" -#include "../core/hash.h" +// Backend selector for the shared implementation file included below. See the comment at the +// top of that file for the full contract. +#define KATAGO_GPU_CUDA 1 -#include "../external/half-2.2.0/include/half.hpp" +// Short backend name used in error messages and debug-output labels that are otherwise +// identical between the CUDA and ROCm backends. +#define KATAGO_GPU_BACKEND_NAME "CUDA" -//------------------------ -#include "../core/using.h" -//------------------------ - -using half_t = half_float::half; - -//Define this to print out some of the intermediate values of the neural net -//#define DEBUG_INTERMEDIATE_VALUES - -void NeuralNet::globalInitialize() { - //Empty for cudnn backend -} - -void NeuralNet::globalCleanup() { - cudaDeviceReset(); -} - -//--------------------------------------------------------------------------------- -// cudnn SDPA support. Graphs + execution plans cached lazily per (batchSize, hasMask). -// Used only when useFP16=true and cudnn supports SDPA at runtime. Otherwise falls back to -// customCudaFlashAttention (see cudahelpers). -// -// Tensor layout: BSHD physical, with strides chosen so that the (B,H,S,D)-dim graph view matches -// the existing CUDA backend's Q/K/V/output buffers from MatMulLayer: -// element at (n, xy, h, d) lives at offset (h*headDim + d) + (n*seqLen + xy) * (numHeads*headDim). -// -// Masking: when a mask is present, we build a fully-materialized additive attention bias of shape -// [B, 1, S, S] from the [B, S] mask: bias[b,q,k] = (mask[b,k] != 0 ? 0 : -3e4). cudnn does not have -// plans for the [B,1,1,S] broadcast pattern that would let us avoid this materialization, but the -// full bias is correct for arbitrary (non-prefix) masks, which we need to support sub-board games. -// The bias is built once per inference (the mask is the same across all 20 attention blocks). -// -// The bias tensor dtype MUST match the io dtype (fp16). An fp32 bias with fp16 Q/K/V passes -// validate/check_support/build_plans on cudnn 9.x but silently misexecutes (nonfinite outputs - -// the fused kernel evidently reinterprets the buffer). Since cudnn adds the (converted) bias to the -// fp32 scores and computes the softmax in fp32, the fp16-range-limited -3e4 constant still masks -// exactly (exp underflow) for any model whose genuine logit spread is below ~3e4. -// See cudahelpers.cu for details. -// -// When mask is NULL (full-board, requireExactNNLen case), we build a no-bias graph instead, which -// avoids both the extra memory and the bias build kernel. - -#if KATAGO_CUDA_HAS_SDPA -struct SDPAPlanForBatchSize { - std::shared_ptr graph; - int64_t workspaceBytes; - bool hasMask; // true if the graph expects a bias variant-pack entry - - // UIDs for the variant pack, fixed at graph build time. - static constexpr int64_t Q_UID = 1; - static constexpr int64_t K_UID = 2; - static constexpr int64_t V_UID = 3; - static constexpr int64_t O_UID = 4; - static constexpr int64_t BIAS_UID = 5; -}; - -// Full discriminating key for an SDPA execution plan. Every field that changes the cudnn graph shape -// must be here: if any attention layer in a future model differs in head count/dim/seqLen, it gets its -// own plan rather than incorrectly reusing another layer's. (batchSize and hasMask vary at runtime.) -struct SDPAGraphKey { - int numHeads; - int numKVHeads; - int qHeadDim; - int vHeadDim; - int seqLen; - int batchSize; - bool hasMask; - bool usingFP16; - - bool operator==(const SDPAGraphKey& o) const { - return - numHeads == o.numHeads && - numKVHeads == o.numKVHeads && - qHeadDim == o.qHeadDim && - vHeadDim == o.vHeadDim && - seqLen == o.seqLen && - batchSize == o.batchSize && - hasMask == o.hasMask && - usingFP16 == o.usingFP16; - } -}; -struct SDPAGraphKeyHash { - uint64_t operator()(const SDPAGraphKey& k) const noexcept { - uint64_t acc = (uint64_t)123456789; - auto mix = [&acc](uint64_t x) { - acc += x; - acc += acc << 13; - acc ^= acc >> 6; - }; - mix((uint64_t)k.numHeads); - mix((uint64_t)k.numKVHeads); - mix((uint64_t)k.qHeadDim); - mix((uint64_t)k.vHeadDim); - mix((uint64_t)k.seqLen); - mix((uint64_t)k.batchSize); - mix(k.hasMask ? 1 : 0); - mix(k.usingFP16 ? 1 : 0); - acc = Hash::basicLCong(acc); - return (size_t)(acc ^ (acc >> 32)); - } -}; - -struct SDPAGraphCache { - std::unordered_map, SDPAGraphKeyHash> plansByKey; - bool sdpaSupported; - string disableReason; - - SDPAGraphCache() : - plansByKey(), - sdpaSupported(true), - disableReason() - {} - - // Build (or fetch from cache) an execution plan for the given attention shape + batchSize + hasMask. - // Returns nullptr if SDPA is not supported for this configuration; caller should use fallback. - // On a build failure during warmup, SDPA is disabled going forward and nullptr is returned (the - // caller falls back to the custom kernel); outside of warmup such a failure is fatal. logger (if - // non-NULL) is used to report a disable. - std::shared_ptr getOrBuildPlan(cudnnHandle_t cudnn, const SDPAGraphKey& key, Logger* logger, bool isWarmup) { - if(!sdpaSupported) - return nullptr; - - // Cuda graphs for SDPA path only well-tested for FP16/BF16; FP32 uses fallback - if(!key.usingFP16) - return nullptr; - - auto it = plansByKey.find(key); - if(it != plansByKey.end()) - return it->second; - - namespace fe = cudnn_frontend; - - // Disable SDPA and report the reason. Outside of warmup a build failure is fatal; during warmup - // we tolerate it and fall back to the custom kernel (returning nullptr to the caller). - auto disable = [&](const string& reason) -> std::shared_ptr { - if(!isWarmup) - throw StringError(reason); - sdpaSupported = false; - disableReason = reason; - if(logger != NULL) - logger->write("Cuda backend: disabling cudnn SDPA and falling back to custom attention kernel: " + reason); - return nullptr; - }; - auto plan = std::make_shared(); - plan->hasMask = key.hasMask; - auto graph = std::make_shared(); - - bool useFP16 = key.usingFP16; - - fe::DataType_t ioType = useFP16 ? fe::DataType_t::HALF : fe::DataType_t::FLOAT; - graph->set_io_data_type(ioType) - .set_intermediate_data_type(fe::DataType_t::FLOAT) - .set_compute_data_type(fe::DataType_t::FLOAT); - - int64_t B = key.batchSize; - int64_t Hq = key.numHeads; - int64_t Hkv = key.numKVHeads; - int64_t S = key.seqLen; - int64_t Dq = key.qHeadDim; - int64_t Dv = key.vHeadDim; - - // BSHD physical layout, with logical dim ordering (B, H, S, D): - // stride for B = S * H_inner * D - // stride for H = D - // stride for S = H_inner * D - // stride for D = 1 - // where H_inner is the number of heads packed for this tensor (numHeads or numKVHeads). - int64_t qHinner = key.numHeads; - int64_t kHinner = key.numKVHeads; - int64_t vHinner = key.numKVHeads; - - auto Q = graph->tensor( - fe::graph::Tensor_attributes() - .set_name("Q") - .set_uid(SDPAPlanForBatchSize::Q_UID) - .set_dim({B, Hq, S, Dq}) - .set_stride({S * qHinner * Dq, Dq, qHinner * Dq, 1}) - ); - auto K = graph->tensor( - fe::graph::Tensor_attributes() - .set_name("K") - .set_uid(SDPAPlanForBatchSize::K_UID) - .set_dim({B, Hkv, S, Dq}) - .set_stride({S * kHinner * Dq, Dq, kHinner * Dq, 1}) - ); - auto V = graph->tensor( - fe::graph::Tensor_attributes() - .set_name("V") - .set_uid(SDPAPlanForBatchSize::V_UID) - .set_dim({B, Hkv, S, Dv}) - .set_stride({S * vHinner * Dv, Dv, vHinner * Dv, 1}) - ); - - float scale = 1.0f / std::sqrt((float)key.qHeadDim); - auto sdpa_options = ( - fe::graph::SDPA_attributes() - .set_name("sdpa_fwd") - .set_generate_stats(false) - .set_attn_scale(scale) - ); - - if(key.hasMask) { - // Full [B, 1, S, S] additive bias, broadcast over heads only. Per cudnn 9.8 empirical - // testing the broadcast-over-q variant ([B,1,1,S]) has no supported plans for our shape. - auto bias = graph->tensor( - fe::graph::Tensor_attributes() - .set_name("bias") - .set_uid(SDPAPlanForBatchSize::BIAS_UID) - .set_dim({B, 1, S, S}) - .set_stride({S * S, S * S, S, 1}) - ); - sdpa_options.set_bias(bias); - } - - auto [O, Stats] = graph->sdpa(Q, K, V, sdpa_options); - (void)Stats; - - // Output O also uses BSHD physical layout (matches what outProj expects). - int64_t oHinner = key.numHeads; - O->set_output(true) - .set_dim({B, Hq, S, Dv}) - .set_stride({S * oHinner * Dv, Dv, oHinner * Dv, 1}) - .set_uid(SDPAPlanForBatchSize::O_UID); - - auto status = graph->validate(); - if(status.is_bad()) - return disable(string("cudnn SDPA graph validate failed: ") + status.get_message()); - status = graph->build_operation_graph(cudnn); - if(status.is_bad()) - return disable(string("cudnn SDPA build_operation_graph failed: ") + status.get_message()); - status = graph->create_execution_plans({fe::HeurMode_t::A}); - if(status.is_bad()) - return disable(string("cudnn SDPA create_execution_plans failed: ") + status.get_message()); - status = graph->check_support(cudnn); - if(status.is_bad()) - return disable(string("cudnn SDPA check_support failed: ") + status.get_message()); - status = graph->build_plans(cudnn); - if(status.is_bad()) - return disable(string("cudnn SDPA build_plans failed: ") + status.get_message()); - - int64_t ws = 0; - status = graph->get_workspace_size(ws); - if(status.is_bad()) - return disable(string("cudnn SDPA get_workspace_size failed: ") + status.get_message()); - - plan->graph = graph; - plan->workspaceBytes = ws; - plansByKey[key] = plan; - return plan; - } -}; -#else -struct SDPAGraphCache { - SDPAGraphCache() {} -}; -#endif - - -struct CudaHandles { - cublasHandle_t cublas; - cudnnHandle_t cudnn; - const int majorComputeCapability; - const int minorComputeCapability; - std::unique_ptr sdpaCache; - // Logger for this handle's server thread; may be NULL. Used to report cudnn SDPA falling back. - Logger* logger; - // Set while warming up (see NNEvaluator::maybeWarmupComputeHandle). When true, a failed cudnn SDPA - // execution is tolerated (fall back to the custom kernel); when false such a failure is fatal. - bool isWarmup; - // If true, the cudnn graph SDPA path is skipped entirely and the custom attention kernel is always used. - bool cudaDisableGraphSDPA; - // Set once we have logged that cudaDisableGraphSDPA actually suppressed an otherwise-usable SDPA path, - // so the message is emitted only a single time per handle rather than on every attention block. - bool loggedGraphSDPADisabled; - // Controls whether 1x1 NHWC convs run as a cuBLAS GEMM (vs cuDNN). Auto = matmul iff FP16. - // True/False force the choice regardless of precision. - enabled_t use1x1MatmulMode; - - CudaHandles(int major, int minor) - : majorComputeCapability(major), - minorComputeCapability(minor), - sdpaCache(std::make_unique()), - logger(NULL), - isWarmup(false), - cudaDisableGraphSDPA(false), - loggedGraphSDPADisabled(false), - use1x1MatmulMode(enabled_t::Auto) - { - CUBLAS_ERR("CudaHandles",cublasCreate(&cublas)); - CUDNN_ERR("CudaHandles",cudnnCreate(&cudnn)); - } - - ~CudaHandles() { - cublasDestroy(cublas); - cudnnDestroy(cudnn); - } - - static CudaHandles* cudaHandlesTesting() { - const int gpuIdxForThisThread = 0; - cudaDeviceProp prop; - cudaGetDeviceProperties(&prop,gpuIdxForThisThread); - return new CudaHandles(prop.major, prop.minor); - } - - CudaHandles(const CudaHandles&) = delete; - CudaHandles& operator=(const CudaHandles&) = delete; -}; - -//--------------------------------------------------------------------------------- - -template -struct ByBatchSize { - const int maxBatchSize; - T* data; - cudnnStatus_t (*destroyFunc)(T); - - ByBatchSize() - : maxBatchSize(0), data(nullptr), destroyFunc(nullptr) - {} - - ByBatchSize( - int maxBatchSize_ - ) : maxBatchSize(maxBatchSize_), data(nullptr), destroyFunc(nullptr) { - data = new T[maxBatchSize]; - } - - ByBatchSize(const ByBatchSize&) = delete; - ByBatchSize& operator=(const ByBatchSize&) = delete; - - ~ByBatchSize() { - if(destroyFunc != nullptr && data != nullptr) { - for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { - (*destroyFunc)(data[batchSize-1]); - } - } - if(data != nullptr) { - delete[] data; - data = nullptr; - } - } - T& operator[](int batchSize) { - return data[batchSize-1]; - } - const T& operator[](int batchSize) const { - return data[batchSize-1]; - } -}; - -template -struct ByBatchSizeView { - int maxBatchSize; - T* data; - - ByBatchSizeView() - : maxBatchSize(0), data(nullptr) - {} - - ByBatchSizeView(const ByBatchSize& toView) - : maxBatchSize(toView.maxBatchSize), data(toView.data) - {} - ByBatchSizeView& operator=(const ByBatchSize& toView) { - maxBatchSize = toView.maxBatchSize; - data = toView.data; - } - - ~ByBatchSizeView() { - } - T& operator[](int batchSize) { - return data[batchSize-1]; - } - const T& operator[](int batchSize) const { - return data[batchSize-1]; - } -}; - -//--------------------------------------------------------------------------------- - - -//channels, useFP16, useNHWC -typedef std::tuple CudnnTensorDesc4DKey; - -struct CudnnManager { - const string name; - const int maxBatchSize; - const int nnXLen; - const int nnYLen; - std::map*> tensorDesc4DByBatchSizeByKey; - - CudnnManager(string name_, int maxBatchSize_, int nnXLen_, int nnYLen_) - :name(name_), - maxBatchSize(maxBatchSize_), - nnXLen(nnXLen_), - nnYLen(nnYLen_), - tensorDesc4DByBatchSizeByKey() - { - } - - ~CudnnManager() { - for(auto& iter: tensorDesc4DByBatchSizeByKey) { - delete iter.second; - } - } - - ByBatchSizeView getTensorDesc4DByBatchSize( - int channels, bool useFP16, bool useNHWC - ) { - auto iter = tensorDesc4DByBatchSizeByKey.find({channels, useFP16, useNHWC}); - if(iter != tensorDesc4DByBatchSizeByKey.end()) { - return ByBatchSizeView(*(iter->second)); - } - ByBatchSize* descs = new ByBatchSize(maxBatchSize); - for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { - cudnnTensorDescriptor_t& desc = (*descs)[batchSize]; - CUDNN_ERR(name.c_str(),cudnnCreateTensorDescriptor(&desc)); - CUDNN_ERR(name.c_str(),cudnnSetTensor4dDescriptor( - desc, - (useNHWC ? CUDNN_TENSOR_NHWC : CUDNN_TENSOR_NCHW), - (useFP16 ? CUDNN_DATA_HALF : CUDNN_DATA_FLOAT), - batchSize, - channels, - nnYLen, - nnXLen - )); - } - descs->destroyFunc = cudnnDestroyTensorDescriptor; - tensorDesc4DByBatchSizeByKey[{channels, useFP16, useNHWC}] = descs; - return ByBatchSizeView(*descs); - } -}; - -//--------------------------------------------------------------------------------- - -struct ScratchBuffers { - - const size_t batchXYFloatBytes; - const size_t batchFloatBytes; - const size_t batchXYBytes; - const size_t batchBytes; - - SimpleAllocator* allocator; - - // Not scratch, but convenient to have here - void* zeroBuf; - void* oneBuf; - - ScratchBuffers() = delete; - ScratchBuffers(const ScratchBuffers&) = delete; - ScratchBuffers& operator=(const ScratchBuffers&) = delete; - - ScratchBuffers(int maxBatchSize, int nnXLen, int nnYLen, bool useFP16) - : batchXYFloatBytes((size_t)maxBatchSize * nnXLen * nnYLen * sizeof(float)), - batchFloatBytes((size_t)maxBatchSize * sizeof(float)), - batchXYBytes((size_t)maxBatchSize * nnXLen * nnYLen * (useFP16 ? sizeof(half_t) : sizeof(float))), - batchBytes((size_t)maxBatchSize * (useFP16 ? sizeof(half_t) : sizeof(float))) - { - std::function allocateFunc = [](size_t size) { - void* buf; - CUDA_ERR("ScratchBuffers",cudaMalloc(&buf, size)); - return buf; - }; - std::function releaseFunc = [](void* buf) { - cudaFree(buf); - }; - - allocator = new SimpleAllocator(allocateFunc, releaseFunc); - - CudaUtils::hostMallocZeroOneBufs(zeroBuf, oneBuf, useFP16); - } - ~ScratchBuffers() { - delete allocator; - free(zeroBuf); - free(oneBuf); - } - - size_t getBufSizeXY(int channels) const { - return channels * batchXYBytes; - } - size_t getBufSizeXYFloat(int channels) const { - return channels * batchXYFloatBytes; - } - size_t getBufSizeFloat(int channels) const { - return channels * batchFloatBytes; - } - size_t getBufSize(int channels) const { - return channels * batchBytes; - } - -}; - - -//--------------------------------------------------------------------------------- - -struct ConvLayer { - const string name; - const int inChannels; - const int outChannels; - ByBatchSizeView inputDescriptors; - ByBatchSizeView outputDescriptors; - cudnnFilterDescriptor_t filterDescriptor; - cudnnConvolutionDescriptor_t convolutionDescriptor; -#if CUDNN_MAJOR >= 8 - ByBatchSize* convolutionAlgorithms; //array of one for each batch size -#else - ByBatchSize* convolutionAlgorithms; //array of one for each batch size -#endif - void* filterBuf; - // A 1x1 conv is equivalent to a matmul. When use1x1Matmul is set we run it as a cuBLAS GEMM over - // batch*spatial tokens and build NO cuDNN objects. This is the default for 1x1 NHWC FP16 convs. - // matmulWeightBuf is [inC, outC] column-major (cuBLAS order); matmulSpatialSize is the spatial length. - bool use1x1Matmul; - int matmulSpatialSize; - void* matmulWeightBuf; - bool usingFP16; - - ConvLayer() = delete; - ConvLayer(const ConvLayer&) = delete; - ConvLayer& operator=(const ConvLayer&) = delete; - - ConvLayer( - CudaHandles* cudaHandles, - CudnnManager* manager, - const ConvLayerDesc* desc, - bool useFP16, - bool useNHWC - ) : ConvLayer(cudaHandles, manager, desc, useFP16, useNHWC, useNHWC) - {} - - ConvLayer( - CudaHandles* cudaHandles, - CudnnManager* manager, - const ConvLayerDesc* desc, - bool useFP16, - bool useNHWCIn, - bool useNHWCOut - ) : - name(desc->name), - inChannels(desc->inChannels), - outChannels(desc->outChannels) - { - int convYSize = desc->convYSize; - int convXSize = desc->convXSize; - int dilationY = desc->dilationY; - int dilationX = desc->dilationX; - int paddingX = (convXSize / 2) * dilationX; - int paddingY = (convYSize / 2) * dilationY; - - testAssert(convXSize % 2 == 1); - testAssert(convYSize % 2 == 1); - - usingFP16 = useFP16; - filterBuf = NULL; - matmulWeightBuf = NULL; - filterDescriptor = NULL; - convolutionDescriptor = NULL; - convolutionAlgorithms = NULL; - - // A 1x1 conv is a matmul, and cuBLAS is faster than cuDNN's conv in FP16 (tensor cores). - // Benchmarked as slightly faster on convnets and neutral on transformers. - // In FP32 there wasn't an improvement, so the default (cudaUse1x1Matmul=Auto) only uses GEMM in FP16. - // The config flag can force it either way regardless of precision. Supports NHWC only (the GEMM assumes - // channel-contiguous-per-position layout). - use1x1Matmul = false; - if(convXSize == 1 && convYSize == 1 && useNHWCIn && useNHWCOut) { - enabled_t mode = cudaHandles->use1x1MatmulMode; - use1x1Matmul = (mode == enabled_t::True) || (mode == enabled_t::Auto && useFP16); - } - matmulSpatialSize = use1x1Matmul ? (manager->nnYLen * manager->nnXLen) : 0; - - if(use1x1Matmul) { - // 1x1 conv weights are [outC, inC]. cuBLAS GEMM wants column-major, i.e. [inC, outC] in row-major notation. - // So transpose. No cuDNN objects are built. - vector wT((size_t)inChannels * outChannels); - for(int oc = 0; oc < outChannels; oc++) - for(int ic = 0; ic < inChannels; ic++) - wT[(size_t)oc + (size_t)ic * outChannels] = desc->weights[(size_t)oc * inChannels + ic]; - CudaUtils::mallocAndCopyToDevice(name + ":matmulW", wT, matmulWeightBuf, useFP16); - return; - } - - inputDescriptors = manager->getTensorDesc4DByBatchSize(inChannels,useFP16,useNHWCIn); - outputDescriptors = manager->getTensorDesc4DByBatchSize(outChannels,useFP16,useNHWCOut); - int maxBatchSize = manager->maxBatchSize; - - bool filterNHWC = useNHWCOut && dilationY == 1 && dilationX == 1; - - CUDNN_ERR(name.c_str(),cudnnCreateFilterDescriptor(&filterDescriptor)); - CUDNN_ERR(name.c_str(),cudnnSetFilter4dDescriptor( - filterDescriptor, - (useFP16 ? CUDNN_DATA_HALF : CUDNN_DATA_FLOAT), - (filterNHWC ? CUDNN_TENSOR_NHWC : CUDNN_TENSOR_NCHW), - outChannels, - inChannels, - convYSize, - convXSize - )); - - int yStride = 1; - int xStride = 1; - - //NVIDIA compute capability 7 is when we first hit Volta architecture, with tensor cores - //See https://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications - bool tensorCoresSupported = cudaHandles->majorComputeCapability >= 7; - - CUDNN_ERR(name.c_str(),cudnnCreateConvolutionDescriptor(&convolutionDescriptor)); - CUDNN_ERR(name.c_str(),cudnnSetConvolution2dDescriptor( - convolutionDescriptor, - paddingY, - paddingX, - yStride, - xStride, - dilationY, - dilationX, - CUDNN_CROSS_CORRELATION, - (useFP16 && !tensorCoresSupported) ? CUDNN_DATA_HALF : CUDNN_DATA_FLOAT - )); - if(useFP16 && tensorCoresSupported) - CUDNN_ERR(name.c_str(),cudnnSetConvolutionMathType(convolutionDescriptor, CUDNN_TENSOR_OP_MATH)); - -#if CUDNN_MAJOR >= 8 - convolutionAlgorithms = new ByBatchSize(maxBatchSize); -#else - convolutionAlgorithms = new ByBatchSize(maxBatchSize); -#endif - - for(int batchSize = 1; batchSize <= maxBatchSize; batchSize++) { - if(useFP16 && dilationX <= 1 && dilationY <= 1) { -#if CUDNN_MAJOR >= 8 - (*convolutionAlgorithms)[batchSize].algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM; -#else - (*convolutionAlgorithms)[batchSize] = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM; -#endif - } - else { - const cudnnTensorDescriptor_t& inputDescriptor = inputDescriptors[batchSize]; - const cudnnTensorDescriptor_t& outputDescriptor = outputDescriptors[batchSize]; - -#if CUDNN_MAJOR >= 8 - int requestedAlgoCount = CUDNN_CONVOLUTION_FWD_ALGO_COUNT; - int returnedAlgoCount = -1; - cudnnConvolutionFwdAlgoPerf_t results[2 * CUDNN_CONVOLUTION_FWD_ALGO_COUNT]; - CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardAlgorithm_v7( - cudaHandles->cudnn, - inputDescriptor, - filterDescriptor, - convolutionDescriptor, - outputDescriptor, - requestedAlgoCount, - &returnedAlgoCount, - results - )); - if(returnedAlgoCount <= 0) - throw StringError("cudnnGetConvolutionForwardAlgorithm_v7 returned no algorithms?"); - (*convolutionAlgorithms)[batchSize] = results[0]; -#else - size_t bytesMemoryLimit = 0; - CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardAlgorithm( - cudaHandles->cudnn, - inputDescriptor, - filterDescriptor, - convolutionDescriptor, - outputDescriptor, - CUDNN_CONVOLUTION_FWD_PREFER_FASTEST, - bytesMemoryLimit, - &((*convolutionAlgorithms)[batchSize]) - )); -#endif - } - } - - testAssert(desc->weights.size() == convYSize * convXSize * inChannels * outChannels); - - if(filterNHWC) { - vector weightsTransposed(desc->weights.size()); - for(int y = 0; y < convYSize; y++) { - for(int x = 0; x < convXSize; x++) { - for(int ic = 0; ic < inChannels; ic++) { - for(int oc = 0; oc < outChannels; oc++) { - weightsTransposed[((oc*convYSize + y)*convXSize + x)*inChannels + ic] = - desc->weights[((oc*inChannels + ic)*convYSize + y)*convXSize + x]; - } - } - } - } - CudaUtils::mallocAndCopyToDevice(name,weightsTransposed,filterBuf,useFP16); - cudaDeviceSynchronize(); - } - else - CudaUtils::mallocAndCopyToDevice(name,desc->weights,filterBuf,useFP16); - } - - ~ConvLayer() { - if(matmulWeightBuf != NULL) - cudaFree(matmulWeightBuf); - if(!use1x1Matmul) { - cudaFree(filterBuf); - cudnnDestroyFilterDescriptor(filterDescriptor); - cudnnDestroyConvolutionDescriptor(convolutionDescriptor); - delete convolutionAlgorithms; - } - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - if(use1x1Matmul) - return 0; - size_t workspaceBytes = 0; -#if CUDNN_MAJOR >= 8 - CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardWorkspaceSize( - cudaHandles->cudnn, - inputDescriptors[batchSize], - filterDescriptor, - convolutionDescriptor, - outputDescriptors[batchSize], - (*convolutionAlgorithms)[batchSize].algo, - &workspaceBytes - )); -#else - CUDNN_ERR(name.c_str(),cudnnGetConvolutionForwardWorkspaceSize( - cudaHandles->cudnn, - inputDescriptors[batchSize], - filterDescriptor, - convolutionDescriptor, - outputDescriptors[batchSize], - (*convolutionAlgorithms)[batchSize], - &workspaceBytes - )); -#endif - return workspaceBytes; - } - - void apply( - CudaHandles* cudaHandles, - int batchSize, - bool accumulate, - void* inputBuf, - void* outputBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - if(use1x1Matmul) { - // out[outC, tokens] = W[outC, inC] x in[inC, tokens] - // where tokens = batchSize * spatial. NHWC buffers are [tokens, C] row-major = [C, tokens] column-major - // matching cuBLAS's expectation. Same as MatMulLayer. - int tokens = batchSize * matmulSpatialSize; - if(!usingFP16) { - const float alpha = 1.0f; - const float beta = accumulate ? 1.0f : 0.0f; - CUBLAS_ERR(name.c_str(),cublasSgemm( - cudaHandles->cublas, CUBLAS_OP_N, CUBLAS_OP_N, - outChannels, tokens, inChannels, - &alpha, (const float*)matmulWeightBuf, outChannels, - (const float*)inputBuf, inChannels, - &beta, (float*)outputBuf, outChannels)); - } - else { - const half alpha = __float2half(1.0f); - const half beta = __float2half(accumulate ? 1.0f : 0.0f); - CUBLAS_ERR(name.c_str(),cublasHgemm( - cudaHandles->cublas, CUBLAS_OP_N, CUBLAS_OP_N, - outChannels, tokens, inChannels, - &alpha, (const half*)matmulWeightBuf, outChannels, - (const half*)inputBuf, inChannels, - &beta, (half*)outputBuf, outChannels)); - } - return; - } - const float alpha = 1.0f; - const float beta = accumulate ? 1.0f : 0.0f; -#if CUDNN_MAJOR >= 8 - CUDNN_ERR(name.c_str(),cudnnConvolutionForward( - cudaHandles->cudnn, - &alpha, - inputDescriptors[batchSize], - inputBuf, - filterDescriptor, - filterBuf, - convolutionDescriptor, - (*convolutionAlgorithms)[batchSize].algo, - workspaceBuf, - workspaceBytes, - &beta, - outputDescriptors[batchSize], - outputBuf - )); -#else - CUDNN_ERR(name.c_str(),cudnnConvolutionForward( - cudaHandles->cudnn, - &alpha, - inputDescriptors[batchSize], - inputBuf, - filterDescriptor, - filterBuf, - convolutionDescriptor, - (*convolutionAlgorithms)[batchSize], - workspaceBuf, - workspaceBytes, - &beta, - outputDescriptors[batchSize], - outputBuf - )); -#endif - } - -}; - - -//--------------------------------------------------------------------------------- - -struct BatchNormLayer { - const string name; - const int numChannels; - const float epsilon; - const int activation; - const int nnXLen; - const int nnYLen; - - const bool usingFP16; - const bool usingNHWC; - - void* mergedScaleBuf; - void* mergedBiasBuf; - - BatchNormLayer() = delete; - BatchNormLayer(const BatchNormLayer&) = delete; - BatchNormLayer& operator=(const BatchNormLayer&) = delete; - - BatchNormLayer( - CudaHandles* cudaHandles, - const BatchNormLayerDesc* desc, - const ActivationLayerDesc* actDesc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - numChannels(desc->numChannels), - epsilon(desc->epsilon), - activation(actDesc->activation), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC) - { - (void)cudaHandles; - - testAssert(desc->mean.size() == numChannels); - testAssert(desc->variance.size() == numChannels); - testAssert(desc->scale.size() == numChannels); - testAssert(desc->bias.size() == numChannels); - testAssert(desc->mergedScale.size() == numChannels); - testAssert(desc->mergedBias.size() == numChannels); - CudaUtils::mallocAndCopyToDevice(name,desc->mergedScale,mergedScaleBuf,useFP16); - CudaUtils::mallocAndCopyToDevice(name,desc->mergedBias,mergedBiasBuf,useFP16); - } - ~BatchNormLayer() { - cudaFree(mergedScaleBuf); - cudaFree(mergedBiasBuf); - } - - void apply( - CudaHandles* cudaHandles, - int batchSize, - void* inputBuf, - const void* maskBuf, //ok to be null - void* outputBuf - ) const { - (void)cudaHandles; - if(!usingFP16) { - if(!usingNHWC) - customCudaApplyCScaleBiasNCHW((const float*)inputBuf,(float*)outputBuf,(const float*)mergedScaleBuf,(const float*)mergedBiasBuf, - (const float*)maskBuf, - batchSize,numChannels,nnXLen*nnYLen,activation); - else - customCudaApplyCScaleBiasNHWC((const float*)inputBuf,(float*)outputBuf,(const float*)mergedScaleBuf,(const float*)mergedBiasBuf, - (const float*)maskBuf, - batchSize,nnXLen*nnYLen,numChannels,activation); - } - else { - if(!usingNHWC) - customCudaApplyCScaleBiasNCHW((const half*)inputBuf,(half*)outputBuf,(const half*)mergedScaleBuf,(const half*)mergedBiasBuf, - (const half*)maskBuf, - batchSize,numChannels,nnXLen*nnYLen,activation); - else - customCudaApplyCScaleBiasNHWC((const half*)inputBuf,(half*)outputBuf,(const half*)mergedScaleBuf,(const half*)mergedBiasBuf, - (const half*)maskBuf, - batchSize,nnXLen*nnYLen,numChannels,activation); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - } - - } - -}; - - -//--------------------------------------------------------------------------------- - -struct MatMulLayer { - const string name; - const int inChannels; - const int outChannels; - const bool usingFP16; - void* matBuf; - - MatMulLayer() = delete; - MatMulLayer(const MatMulLayer&) = delete; - MatMulLayer& operator=(const MatMulLayer&) = delete; - - MatMulLayer( - CudaHandles* cudaHandles, - const MatMulLayerDesc* desc, - bool useFP16 - ) : - name(desc->name), - inChannels(desc->inChannels), - outChannels(desc->outChannels), - usingFP16(useFP16) - { - (void)cudaHandles; - - if(inChannels > 0 && outChannels > 0) { - testAssert(desc->weights.size() == inChannels * outChannels); - CudaUtils::mallocAndCopyToDevice(name,desc->weights,matBuf,useFP16); - } - else { - matBuf = NULL; - } - } - - ~MatMulLayer() { - if(inChannels > 0 && outChannels > 0) - cudaFree(matBuf); - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles - ) const { - (void)cudaHandles; - size_t workspaceBytes = 0; - return workspaceBytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* inputBuf, - void* outputBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - (void)workspaceBuf; - (void)workspaceBytes; - assert(inChannels > 0 && outChannels > 0); - - if(!usingFP16) { - const float alpha = 1.0f; - const float beta = 0.0f; - CUBLAS_ERR(name.c_str(),cublasSgemm( - cudaHandles->cublas, - CUBLAS_OP_N, - CUBLAS_OP_N, - outChannels, - batchSize, - inChannels, - &alpha, - (const float*)matBuf,outChannels, - (const float*)inputBuf,inChannels, - &beta, - (float*)outputBuf,outChannels - )); - } - else { - const half* alpha = (const half*)scratch->oneBuf; - const half* beta = (const half*)scratch->zeroBuf; - CUBLAS_ERR(name.c_str(),cublasHgemm( - cudaHandles->cublas, - CUBLAS_OP_N, - CUBLAS_OP_N, - outChannels, - batchSize, - inChannels, - alpha, - (const half*)matBuf,outChannels, - (const half*)inputBuf,inChannels, - beta, - (half*)outputBuf,outChannels - )); - } - - } - -}; - -//--------------------------------------------------------------------------------- - -struct MatBiasLayer { - const string name; - const int numChannels; - const bool usingFP16; - const int activation; - - void* biasBuf; - - MatBiasLayer() = delete; - MatBiasLayer(const MatBiasLayer&) = delete; - MatBiasLayer& operator=(const MatBiasLayer&) = delete; - - MatBiasLayer( - CudaHandles* cudaHandles, - const MatBiasLayerDesc* desc, - bool useFP16, - int activation_ - ) : - name(desc->name), - numChannels(desc->numChannels), - usingFP16(useFP16), - activation(activation_) - { - (void)cudaHandles; - if(numChannels > 0) { - testAssert(desc->weights.size() == numChannels); - CudaUtils::mallocAndCopyToDevice(name,desc->weights,biasBuf,useFP16); - } - else - biasBuf = NULL; - } - - ~MatBiasLayer() { - if(numChannels > 0) - cudaFree(biasBuf); - } - - void apply( - CudaHandles* cudaHandles, - int batchSize, - void* matBuf - ) const { - (void)cudaHandles; - assert(numChannels > 0); - if(!usingFP16) { - customCudaAddCBiasInplaceNC((float*)matBuf,(const float*)biasBuf,batchSize,numChannels,activation); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - } - else { - customCudaAddCBiasInplaceNC((half*)matBuf,(const half*)biasBuf,batchSize,numChannels,activation); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - } - } - -}; - -//--------------------------------------------------------------------------------- - -struct NormActConv { - const BatchNormLayer norm; - const ConvLayer conv; - - const int inChannels; - const int outChannels; - const int nnXLen; - const int nnYLen; - const bool usingFP16; - const bool usingNHWC; - - NormActConv() = delete; - NormActConv(const NormActConv&) = delete; - NormActConv& operator=(const NormActConv&) = delete; - - NormActConv( - CudaHandles* cudaHandles, - CudnnManager* manager, - const BatchNormLayerDesc* normDesc, - const ActivationLayerDesc* actDesc, - const ConvLayerDesc* convDesc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ): norm(cudaHandles,normDesc,actDesc,nnX,nnY,useFP16,useNHWC), - conv(cudaHandles,manager,convDesc,useFP16,useNHWC), - inChannels(norm.numChannels), - outChannels(conv.outChannels), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC) - { - testAssert(norm.numChannels == conv.inChannels); - } - - ~NormActConv() - {} - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - b = conv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - int batchSize, - bool accumulate, - void* inBuf, - void* inScratchBuf, - void* outBuf, - void* maskBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - norm.apply(cudaHandles,batchSize,inBuf,maskBuf,inScratchBuf); -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("AFTER NORM "), inScratchBuf, batchSize, inChannels, nnXLen*nnYLen, usingNHWC, usingFP16); -#endif - conv.apply(cudaHandles,batchSize,accumulate,inScratchBuf,outBuf,workspaceBuf,workspaceBytes); - } - -}; - - -//--------------------------------------------------------------------------------- - -struct ResidualBlock { - const string name; - const NormActConv normActConv1; - const NormActConv normActConv2; - - ResidualBlock() = delete; - ResidualBlock(const ResidualBlock&) = delete; - ResidualBlock& operator=(const ResidualBlock&) = delete; - - ResidualBlock( - CudaHandles* cudaHandles, - CudnnManager* manager, - const ResidualBlockDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ): name(desc->name), - normActConv1(cudaHandles,manager,&desc->preBN,&desc->preActivation,&desc->regularConv,nnX,nnY,useFP16,useNHWC), - normActConv2(cudaHandles,manager,&desc->midBN,&desc->midActivation,&desc->finalConv,nnX,nnY,useFP16,useNHWC) - { - } - - ~ResidualBlock() - {} - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - b = normActConv1.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = normActConv2.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* trunkBuf, - void* trunkScratchBuf, - void* maskBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - SizedBuf midIn(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); - SizedBuf midScratch(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); - normActConv1.apply(cudaHandles,batchSize,false,trunkBuf,trunkScratchBuf,midIn.buf,maskBuf,workspaceBuf,workspaceBytes); - normActConv2.apply(cudaHandles,batchSize,true,midIn.buf,midScratch.buf,trunkBuf,maskBuf,workspaceBuf,workspaceBytes); - } - -}; - - -//---------------------------------------------------------------------------- - - -struct GlobalPoolingResidualBlock { - const string name; - const BatchNormLayer preBN; - const ConvLayer regularConv; - const ConvLayer gpoolConv; - const BatchNormLayer gpoolBN; - const MatMulLayer gpoolToBiasMul; - const NormActConv normActConv2; - - const int nnXLen; - const int nnYLen; - const int regularChannels; - const int gpoolChannels; - const bool usingFP16; - const bool usingNHWC; - - GlobalPoolingResidualBlock() = delete; - GlobalPoolingResidualBlock(const GlobalPoolingResidualBlock&) = delete; - GlobalPoolingResidualBlock& operator=(const GlobalPoolingResidualBlock&) = delete; - - GlobalPoolingResidualBlock( - CudaHandles* cudaHandles, - CudnnManager* manager, - const GlobalPoolingResidualBlockDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ): name(desc->name), - preBN(cudaHandles,&desc->preBN,&desc->preActivation,nnX,nnY,useFP16,useNHWC), - regularConv(cudaHandles,manager,&desc->regularConv,useFP16,useNHWC), - gpoolConv(cudaHandles,manager,&desc->gpoolConv,useFP16,useNHWC), - gpoolBN(cudaHandles,&desc->gpoolBN,&desc->gpoolActivation,nnX,nnY,useFP16,useNHWC), - gpoolToBiasMul(cudaHandles,&desc->gpoolToBiasMul,useFP16), - normActConv2(cudaHandles,manager,&desc->midBN,&desc->midActivation,&desc->finalConv,nnX,nnY,useFP16,useNHWC), - nnXLen(nnX), - nnYLen(nnY), - regularChannels(desc->regularConv.outChannels), - gpoolChannels(desc->gpoolConv.outChannels), - usingFP16(useFP16), - usingNHWC(useNHWC) - { - } - - ~GlobalPoolingResidualBlock() { - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - b = regularConv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = gpoolConv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = gpoolToBiasMul.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = normActConv2.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = sizeof(float)*batchSize*gpoolChannels*nnXLen*nnYLen; - bytes = std::max(bytes,b); - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* trunkBuf, - void* trunkScratchBuf, - void* maskBuf, - float* maskSumBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - SizedBuf regularOut(scratch->allocator, scratch->getBufSizeXY(regularChannels)); - SizedBuf regularScratch(scratch->allocator, scratch->getBufSizeXY(regularChannels)); - SizedBuf gpoolOut(scratch->allocator, scratch->getBufSizeXY(gpoolChannels)); - SizedBuf gpoolOut2(scratch->allocator, scratch->getBufSizeXY(gpoolChannels)); - SizedBuf gpoolConcat(scratch->allocator, scratch->getBufSize(gpoolChannels*3)); - SizedBuf gpoolBias(scratch->allocator, scratch->getBufSize(regularChannels)); - - preBN.apply(cudaHandles,batchSize,trunkBuf,maskBuf,trunkScratchBuf); - regularConv.apply(cudaHandles,batchSize,false,trunkScratchBuf,regularOut.buf,workspaceBuf,workspaceBytes); - gpoolConv.apply(cudaHandles,batchSize,false,trunkScratchBuf,gpoolOut.buf,workspaceBuf,workspaceBytes); - gpoolBN.apply(cudaHandles,batchSize,gpoolOut.buf,maskBuf,gpoolOut2.buf); - - if(!usingFP16) { - if(!usingNHWC) - customCudaPoolRowsGPoolNCHW((const float*)gpoolOut2.buf,(float*)gpoolConcat.buf,batchSize,gpoolChannels,nnXLen*nnYLen,(const float*)maskBuf,maskSumBuf); - else - customCudaPoolRowsGPoolNHWC((const float*)gpoolOut2.buf,(float*)gpoolConcat.buf,batchSize,nnXLen*nnYLen,gpoolChannels,(const float*)maskBuf,maskSumBuf); - } - else { - if(!usingNHWC) - customCudaPoolRowsGPoolNCHW((const half*)gpoolOut2.buf,(half*)gpoolConcat.buf,batchSize,gpoolChannels,nnXLen*nnYLen,(const half*)maskBuf,maskSumBuf); - else - customCudaPoolRowsGPoolNHWC((const half*)gpoolOut2.buf,(half*)gpoolConcat.buf,batchSize,nnXLen*nnYLen,gpoolChannels,(const half*)maskBuf,maskSumBuf); - } - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - - gpoolToBiasMul.apply(cudaHandles,scratch,batchSize,gpoolConcat.buf,gpoolBias.buf,workspaceBuf,workspaceBytes); - - if(!usingFP16) { - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW((float*)regularOut.buf,(const float*)gpoolBias.buf,batchSize,regularChannels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC((float*)regularOut.buf,(const float*)gpoolBias.buf,batchSize,nnXLen*nnYLen,regularChannels); - } - else { - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW((half*)regularOut.buf,(const half*)gpoolBias.buf,batchSize,regularChannels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC((half*)regularOut.buf,(const half*)gpoolBias.buf,batchSize,nnXLen*nnYLen,regularChannels); - } - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - - normActConv2.apply(cudaHandles,batchSize,true,regularOut.buf,regularScratch.buf,trunkBuf,maskBuf,workspaceBuf,workspaceBytes); - } - -}; - -//------------------------------------------------------------------------------ - -struct BlockStack { - const int numBlocks; - const int trunkNumChannels; - const int nnXLen; - const int nnYLen; - const bool usingFP16; - const bool usingNHWC; - vector> blocks; - - BlockStack() = delete; - BlockStack(const BlockStack&) = delete; - BlockStack& operator=(const BlockStack&) = delete; - - BlockStack( - CudaHandles* cudaHandles, - CudnnManager* manager, - int nBlocks, - int trunkChannels, - const std::vector>& descBlocks, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ); - ~BlockStack(); - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const; - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* maskBuf, - float* maskSumBuf, - void* trunkBuf, - void* trunkScratchBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const; - -}; - -//------------------------------------------------------------------------------ - -struct NestedBottleneckResidualBlock { - const string name; - const NormActConv normActConv1; - const BlockStack blocks; - const NormActConv normActConv2; - - NestedBottleneckResidualBlock() = delete; - NestedBottleneckResidualBlock(const NestedBottleneckResidualBlock&) = delete; - NestedBottleneckResidualBlock& operator=(const NestedBottleneckResidualBlock&) = delete; - - NestedBottleneckResidualBlock( - CudaHandles* cudaHandles, - CudnnManager* manager, - const NestedBottleneckResidualBlockDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ): name(desc->name), - normActConv1(cudaHandles,manager,&desc->preBN,&desc->preActivation,&desc->preConv,nnX,nnY,useFP16,useNHWC), - blocks(cudaHandles,manager,desc->numBlocks,desc->preConv.outChannels,desc->blocks,nnX,nnY,useFP16,useNHWC), - normActConv2(cudaHandles,manager,&desc->postBN,&desc->postActivation,&desc->postConv,nnX,nnY,useFP16,useNHWC) - { - } - - ~NestedBottleneckResidualBlock() - {} - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - b = normActConv1.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = blocks.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = normActConv2.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* trunkBuf, - void* trunkScratchBuf, - void* maskBuf, - float* maskSumBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - SizedBuf mid(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); - SizedBuf midScratch(scratch->allocator, scratch->getBufSizeXY(normActConv1.outChannels)); - assert(normActConv1.outChannels == normActConv2.inChannels); - normActConv1.apply(cudaHandles,batchSize,false,trunkBuf,trunkScratchBuf,mid.buf,maskBuf,workspaceBuf,workspaceBytes); - blocks.apply( - cudaHandles, - scratch, - batchSize, - maskBuf, - maskSumBuf, - mid.buf, - midScratch.buf, - workspaceBuf, - workspaceBytes - ); - normActConv2.apply(cudaHandles,batchSize,true,mid.buf,midScratch.buf,trunkBuf,maskBuf,workspaceBuf,workspaceBytes); - } - -}; - -//------------------------------------------------------------------------------ - -struct TransformerRMSNormLayer { - const string name; - const int numChannels; - const float epsilon; - const bool usingFP16; - void* weightBuf; - void* zeroBetaBuf; - - TransformerRMSNormLayer() = delete; - TransformerRMSNormLayer(const TransformerRMSNormLayer&) = delete; - TransformerRMSNormLayer& operator=(const TransformerRMSNormLayer&) = delete; - - TransformerRMSNormLayer( - CudaHandles* cudaHandles, - const TransformerRMSNormDesc* desc, - bool useFP16 - ) : - name(desc->name), - numChannels(desc->numChannels), - epsilon(desc->epsilon), - usingFP16(useFP16) - { - (void)cudaHandles; - testAssert((int)desc->weight.size() == numChannels); - CudaUtils::mallocAndCopyToDevice(name, desc->weight, weightBuf, useFP16); - // Allocate a zero buffer for beta (TransformerRMSNorm has no bias) - vector zeros(numChannels, 0.0f); - CudaUtils::mallocAndCopyToDevice(name + ":zeroBeta", zeros, zeroBetaBuf, useFP16); - } - - ~TransformerRMSNormLayer() { - cudaFree(weightBuf); - cudaFree(zeroBetaBuf); - } - - // Apply RMSNorm on NHWC data [N, XY, C], applying mask [N, XY] to zero padded positions. - // Uses the RMSNormGammaBeta kernel with gamma=weight, beta=0, no activation. - void apply( - CudaHandles* cudaHandles, - int batchSize, - int xySize, - void* inputBuf, - void* outputBuf, - const void* maskBuf - ) const { - (void)cudaHandles; - // RMSNormGammaBetaNHWC with gamma=weight, beta=zero, mask, identity activation. - if(!usingFP16) { - customCudaRMSNormGammaBetaNHWC( - (const float*)inputBuf, (float*)outputBuf, - (const float*)weightBuf, (const float*)zeroBetaBuf, - (const float*)maskBuf, - batchSize, xySize, numChannels, epsilon, ACTIVATION_IDENTITY); - } - else { - customCudaRMSNormGammaBetaNHWC( - (const half*)inputBuf, (half*)outputBuf, - (const half*)weightBuf, (const half*)zeroBetaBuf, - (const half*)maskBuf, - batchSize, xySize, numChannels, epsilon, ACTIVATION_IDENTITY); - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - } -}; - -//------------------------------------------------------------------------------ - -struct RMSNormLayer { - const string name; - const int numChannels; - const bool spatial; - const int activation; - const float epsilon; - const int nnXLen; - const int nnYLen; - const bool usingFP16; - const bool usingNHWC; - - void* gammaBuf; - void* betaBuf; - - RMSNormLayer() = delete; - RMSNormLayer(const RMSNormLayer&) = delete; - RMSNormLayer& operator=(const RMSNormLayer&) = delete; - - RMSNormLayer( - CudaHandles* cudaHandles, - const RMSNormLayerDesc* desc, - int act, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - numChannels(desc->numChannels), - spatial(desc->spatial), - activation(act), - epsilon(desc->epsilon), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC) - { - (void)cudaHandles; - testAssert((int)desc->gamma.size() == numChannels); - testAssert((int)desc->beta.size() == numChannels); - // The device kernels apply only RELU/MISH/SILU explicitly and treat anything else as - // identity; guard here so an unsupported kind (e.g. MISH_SCALE8, which applyScale8 can - // produce for non-transformer nets) fails loudly instead of silently skipping activation. - if(activation != ACTIVATION_IDENTITY && activation != ACTIVATION_RELU && - activation != ACTIVATION_MISH && activation != ACTIVATION_SILU) - throw StringError(name + ": RMSNorm layer unsupported activation: " + Global::intToString(activation)); - CudaUtils::mallocAndCopyToDevice(name, desc->gamma, gammaBuf, useFP16); - CudaUtils::mallocAndCopyToDevice(name, desc->beta, betaBuf, useFP16); - } - - ~RMSNormLayer() { - cudaFree(gammaBuf); - cudaFree(betaBuf); - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* inputBuf, - void* outputBuf, - const void* maskBuf, - const float* maskSumBuf - ) const { - (void)cudaHandles; - int xySize = nnXLen * nnYLen; - if(!spatial) { - if(!usingFP16) { - if(!usingNHWC) - customCudaRMSNormGammaBetaNCHW( - (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf, (const float*)betaBuf, - (const float*)maskBuf, batchSize, numChannels, xySize, epsilon, activation); - else - customCudaRMSNormGammaBetaNHWC( - (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf, (const float*)betaBuf, - (const float*)maskBuf, batchSize, xySize, numChannels, epsilon, activation); - } - else { - if(!usingNHWC) - customCudaRMSNormGammaBetaNCHW( - (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf, (const half*)betaBuf, - (const half*)maskBuf, batchSize, numChannels, xySize, epsilon, activation); - else - customCudaRMSNormGammaBetaNHWC( - (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf, (const half*)betaBuf, - (const half*)maskBuf, batchSize, xySize, numChannels, epsilon, activation); - } - } - else { - // Allocate temp buffer for spatial reduction from scratch (float regardless of FP16 mode). - // Holds per-block partial sums plus the final reduced value per batch element; see - // SPATIAL_RMSNORM_BLOCKS_PER_BATCH in cudahelpers.cu (partialStride = that + 1). - SizedBuf sumSqBuf(scratch->allocator, (size_t)batchSize * CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE * sizeof(float)); - if(!usingFP16) { - if(!usingNHWC) - customCudaSpatialRMSNormNCHW( - (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf, (const float*)betaBuf, - (const float*)maskBuf, maskSumBuf, batchSize, numChannels, xySize, epsilon, activation, (float*)sumSqBuf.buf); - else - customCudaSpatialRMSNormNHWC( - (const float*)inputBuf, (float*)outputBuf, (const float*)gammaBuf, (const float*)betaBuf, - (const float*)maskBuf, maskSumBuf, batchSize, xySize, numChannels, epsilon, activation, (float*)sumSqBuf.buf); - } - else { - if(!usingNHWC) - customCudaSpatialRMSNormNCHW( - (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf, (const half*)betaBuf, - (const half*)maskBuf, maskSumBuf, batchSize, numChannels, xySize, epsilon, activation, (float*)sumSqBuf.buf); - else - customCudaSpatialRMSNormNHWC( - (const half*)inputBuf, (half*)outputBuf, (const half*)gammaBuf, (const half*)betaBuf, - (const half*)maskBuf, maskSumBuf, batchSize, xySize, numChannels, epsilon, activation, (float*)sumSqBuf.buf); - } - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - } -}; - -//------------------------------------------------------------------------------ - -struct TransformerAttentionBlock { - const string name; - const int numHeads; - const int numKVHeads; - const int qHeadDim; - const int vHeadDim; - const bool useRope; - const bool learnableRope; - const int inChannels; - - const int nnXLen; - const int nnYLen; - const bool usingFP16; - const bool usingNHWC; - - const TransformerRMSNormLayer preLN; - const MatMulLayer qProj; - const MatMulLayer kProj; - const MatMulLayer vProj; - const MatMulLayer outProj; - - // Fixed RoPE: precomputed cos/sin tables on device (NULL for learnable RoPE). - // Learnable RoPE: per-head frequencies on device (ropeFreqsBuf, FP32), cos/sin recomputed in-kernel. - void* ropeCosTable; - void* ropeSinTable; - float* ropeFreqsBuf; - int ropeNumPairs; - int ropeNumKVHeads; - - TransformerAttentionBlock() = delete; - TransformerAttentionBlock(const TransformerAttentionBlock&) = delete; - TransformerAttentionBlock& operator=(const TransformerAttentionBlock&) = delete; - - TransformerAttentionBlock( - CudaHandles* cudaHandles, - const TransformerAttentionDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - numHeads(desc->numHeads), - numKVHeads(desc->numKVHeads), - qHeadDim(desc->qHeadDim), - vHeadDim(desc->vHeadDim), - useRope(desc->useRope), - learnableRope(desc->learnableRope), - inChannels(desc->qProj.inChannels), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC), - preLN(cudaHandles, &desc->preLN, useFP16), - qProj(cudaHandles, &desc->qProj, useFP16), - kProj(cudaHandles, &desc->kProj, useFP16), - vProj(cudaHandles, &desc->vProj, useFP16), - outProj(cudaHandles, &desc->outProj, useFP16), - ropeCosTable(NULL), - ropeSinTable(NULL), - ropeFreqsBuf(NULL), - ropeNumPairs(0), - ropeNumKVHeads(0) - { - if(!useNHWC) { - throw StringError("Transformer blocks with NCHW layout are not yet supported by the CUDA backend"); - } - if(useRope) { - ropeNumPairs = qHeadDim / 2; - ropeNumKVHeads = numKVHeads; - if(learnableRope) { - // Table-free: upload the tiny per-head frequencies (FP32) and recompute cos/sin in-kernel. - // Avoids the numKVHeads-times-larger cos/sin table that otherwise spills L2 (see kernel comment). - testAssert(desc->ropeFreqs.size() == (size_t)(numKVHeads * ropeNumPairs * 2)); - void* freqsVoid = NULL; - CudaUtils::mallocAndCopyToDevice(name + ":ropeFreqs", desc->ropeFreqs.data(), (int)desc->ropeFreqs.size(), freqsVoid, false); - ropeFreqsBuf = (float*)freqsVoid; - } - else { - int seqLen = nnXLen * nnYLen; - vector cosTableData; - vector sinTableData; - desc->computeRopeCosSin(nnXLen, nnYLen, seqLen, cosTableData, sinTableData); - CudaUtils::mallocAndCopyToDevice(name + ":ropeCos", cosTableData.data(), (int)cosTableData.size(), ropeCosTable, useFP16); - CudaUtils::mallocAndCopyToDevice(name + ":ropeSin", sinTableData.data(), (int)sinTableData.size(), ropeSinTable, useFP16); - } - } - } - - ~TransformerAttentionBlock() { - if(ropeCosTable != NULL) cudaFree(ropeCosTable); - if(ropeSinTable != NULL) cudaFree(ropeSinTable); - if(ropeFreqsBuf != NULL) cudaFree(ropeFreqsBuf); - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - (void)cudaHandles; - (void)batchSize; - return 0; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* trunkBuf, - void* trunkScratchBuf, - void* maskBuf, - float* maskSumBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - (void)maskSumBuf; - (void)workspaceBuf; - (void)workspaceBytes; - - int seqLen = nnXLen * nnYLen; - int qTotalDim = numHeads * qHeadDim; - int kTotalDim = numKVHeads * qHeadDim; - int vTotalDim = numKVHeads * vHeadDim; - size_t bytesPerElt = usingFP16 ? sizeof(half) : sizeof(float); - - // NHWC: trunk is [N, XY, C]. RMSNorm + mask zeroing. - preLN.apply(cudaHandles, batchSize, seqLen, trunkBuf, trunkScratchBuf, maskBuf); - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D("CUDA Attn RMSNorm out", trunkScratchBuf, batchSize, inChannels, seqLen, usingNHWC, usingFP16, maskBuf); -#endif - - // Step 2: Q/K/V projections - // trunkScratchBuf is [N, XY, C] NHWC = [C, N*seqLen] column-major. - // MatMulLayer expects input as [inChannels, batchSize], which matches. - int matBatchSize = batchSize * seqLen; - - SizedBuf qBuf(scratch->allocator, (size_t)qTotalDim * matBatchSize * bytesPerElt); - SizedBuf kBuf(scratch->allocator, (size_t)kTotalDim * matBatchSize * bytesPerElt); - SizedBuf vBuf(scratch->allocator, (size_t)vTotalDim * matBatchSize * bytesPerElt); - - qProj.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, qBuf.buf, workspaceBuf, workspaceBytes); - kProj.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, kBuf.buf, workspaceBuf, workspaceBytes); - vProj.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, vBuf.buf, workspaceBuf, workspaceBytes); - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint2D("CUDA Attn Q", qBuf.buf, matBatchSize, qTotalDim, usingFP16); -#endif - - // Step 3: Apply RoPE to Q and K - // Q is [qTotalDim, seqLen*batchSize] column-major = [batchSize*seqLen, qTotalDim] row-major - if(useRope) { - if(learnableRope) { - // Table-free recompute path (cos/sin computed in-kernel from ropeFreqsBuf). - if(!usingFP16) { - customCudaApplyRoPELearnableRecompute((float*)qBuf.buf, ropeFreqsBuf, - batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); - customCudaApplyRoPELearnableRecompute((float*)kBuf.buf, ropeFreqsBuf, - batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); - } - else { - customCudaApplyRoPELearnableRecompute((half*)qBuf.buf, ropeFreqsBuf, - batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); - customCudaApplyRoPELearnableRecompute((half*)kBuf.buf, ropeFreqsBuf, - batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, nnXLen); - } - } - else { - if(!usingFP16) { - customCudaApplyRoPE((float*)qBuf.buf, (const float*)ropeCosTable, (const float*)ropeSinTable, - batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); - customCudaApplyRoPE((float*)kBuf.buf, (const float*)ropeCosTable, (const float*)ropeSinTable, - batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); - } - else { - customCudaApplyRoPE((half*)qBuf.buf, (const half*)ropeCosTable, (const half*)ropeSinTable, - batchSize, seqLen, numHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); - customCudaApplyRoPE((half*)kBuf.buf, (const half*)ropeCosTable, (const half*)ropeSinTable, - batchSize, seqLen, numKVHeads, numKVHeads, qHeadDim, ropeNumPairs, learnableRope); - } - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - } - - // Step 4: Scaled dot-product attention. - // We use cudnn SDPA (FlashAttention-style, fused, no score-matrix materialization) when available - // (FP16 + cudnn >= 8.9.3 + supported GPU). Otherwise fall back to a custom online-softmax CUDA kernel. - // Both paths consume Q/K/V in BSHD layout and produce attnOut in the same layout as expected by outProj: - // attnOut: [numHeads*vHeadDim, seqLen*batchSize] col-major = [batchSize*seqLen, numHeads*vHeadDim] row-major. - - SizedBuf attnOutBuf(scratch->allocator, (size_t)numHeads * vHeadDim * seqLen * batchSize * bytesPerElt); - - bool usedSDPA = false; -#if KATAGO_CUDA_HAS_SDPA - SDPAGraphCache* sdpaCache = cudaHandles->sdpaCache.get(); - // Report once if cudaDisableGraphSDPA is the only reason we are not taking the cudnn graph SDPA path, - // i.e. FP16 and a cache are available so SDPA would otherwise have been used. - if(usingFP16 && sdpaCache != NULL && cudaHandles->cudaDisableGraphSDPA && !cudaHandles->loggedGraphSDPADisabled) { - cudaHandles->loggedGraphSDPADisabled = true; - if(cudaHandles->logger != NULL) - cudaHandles->logger->write( - "Cuda backend: cudaDisableGraphSDPA is set, using the custom attention kernel instead of the cudnn graph SDPA path that would otherwise have been used"); - } - if(usingFP16 && sdpaCache != NULL && !cudaHandles->cudaDisableGraphSDPA) { - bool hasMask = (maskBuf != NULL); - SDPAGraphKey sdpaKey = {numHeads, numKVHeads, qHeadDim, vHeadDim, seqLen, batchSize, hasMask, usingFP16}; - auto plan = sdpaCache->getOrBuildPlan(cudaHandles->cudnn, sdpaKey, cudaHandles->logger, cudaHandles->isWarmup); - if(plan != nullptr) { - std::unordered_map variant_pack = { - {SDPAPlanForBatchSize::Q_UID, qBuf.buf}, - {SDPAPlanForBatchSize::K_UID, kBuf.buf}, - {SDPAPlanForBatchSize::V_UID, vBuf.buf}, - {SDPAPlanForBatchSize::O_UID, attnOutBuf.buf}, - }; - - // When a mask is present, materialize a [B, 1, S, S] additive bias: bias[b,q,k] = (mask[b,k] != 0 ? 0 : -1e4). - // For our test model (B=16, S=361) this is ~4 MB; the bias only depends on the mask, but - // we rebuild it per attention block for simplicity (the mask kernel itself is cheap). - SizedBuf biasBuf(scratch->allocator, hasMask ? (size_t)batchSize * seqLen * seqLen * bytesPerElt : 1); - if(hasMask) { - customCudaMaskToAttnBiasFull((const half*)maskBuf, (half*)biasBuf.buf, batchSize, seqLen); - variant_pack[SDPAPlanForBatchSize::BIAS_UID] = biasBuf.buf; - } - - // Workspace from cudnn (separate from the conv workspace - different shape and lifetime). - SizedBuf sdpaWs(scratch->allocator, (size_t)plan->workspaceBytes); - - auto status = plan->graph->execute(cudaHandles->cudnn, variant_pack, sdpaWs.buf); - if(status.is_bad()) { - string reason = string("cudnn SDPA execute failed: ") + status.get_message(); - // During warmup we tolerate this: disable SDPA from here on and fall through to the custom - // kernel. Outside of warmup a failure here is fatal - the plan was already validated and - // built, so an execute failure means something is genuinely wrong. - if(!cudaHandles->isWarmup) - throw StringError(reason); - sdpaCache->sdpaSupported = false; - sdpaCache->disableReason = reason; - if(cudaHandles->logger != NULL) - cudaHandles->logger->write("Cuda backend: disabling cudnn SDPA and falling back to custom attention kernel: " + reason); - } - else { - usedSDPA = true; - } - } - } -#endif - - if(!usedSDPA) { - if(!usingFP16) { - customCudaFlashAttention( - (const float*)qBuf.buf, (const float*)kBuf.buf, (const float*)vBuf.buf, - (const float*)maskBuf, (float*)attnOutBuf.buf, - batchSize, seqLen, numHeads, numKVHeads, qHeadDim, vHeadDim); - } - else { - customCudaFlashAttention( - (const half*)qBuf.buf, (const half*)kBuf.buf, (const half*)vBuf.buf, - (const half*)maskBuf, (half*)attnOutBuf.buf, - batchSize, seqLen, numHeads, numKVHeads, qHeadDim, vHeadDim); - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - } - - // Step 5: Output projection - // attnOutBuf is [numHeads*vHeadDim, seqLen*batchSize] col-major - // outProj maps to [inChannels, seqLen*batchSize] - outProj.apply(cudaHandles, scratch, matBatchSize, attnOutBuf.buf, trunkScratchBuf, workspaceBuf, workspaceBytes); - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D("CUDA Attn outProj", trunkScratchBuf, batchSize, inChannels, seqLen, usingNHWC, usingFP16, maskBuf); -#endif - - // Step 6: Residual addition: trunk += trunkScratch * mask - // NHWC: trunk is [N, XY, C], mask is [N, XY] - if(!usingFP16) { - customCudaMaskedResidualAddNHWC((float*)trunkBuf, (const float*)trunkScratchBuf, (const float*)maskBuf, batchSize, seqLen, inChannels); - } - else { - customCudaMaskedResidualAddNHWC((half*)trunkBuf, (const half*)trunkScratchBuf, (const half*)maskBuf, batchSize, seqLen, inChannels); - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D("CUDA Attn residual", trunkBuf, batchSize, inChannels, seqLen, usingNHWC, usingFP16, maskBuf); -#endif - } -}; - -//------------------------------------------------------------------------------ - -struct TransformerFFNBlock { - const string name; - const int numChannels; - const int ffnChannels; - const bool useSwiGLU; - - const int nnXLen; - const int nnYLen; - const bool usingFP16; - const bool usingNHWC; - - const TransformerRMSNormLayer preLN; - const MatMulLayer linear1; - std::unique_ptr linearGate; - const MatMulLayer linear2; - - TransformerFFNBlock() = delete; - TransformerFFNBlock(const TransformerFFNBlock&) = delete; - TransformerFFNBlock& operator=(const TransformerFFNBlock&) = delete; - - TransformerFFNBlock( - CudaHandles* cudaHandles, - const TransformerFFNDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - numChannels(desc->numChannels), - ffnChannels(desc->ffnChannels), - useSwiGLU(desc->useSwiGLU), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC), - preLN(cudaHandles, &desc->preLN, useFP16), - linear1(cudaHandles, &desc->linear1, useFP16), - linear2(cudaHandles, &desc->linear2, useFP16) - { - if(!useSwiGLU) { - throw StringError("Non-SwiGLU transformer FFN is not yet supported in CUDA backend"); - } - linearGate = std::make_unique(cudaHandles, &desc->linearGate, useFP16); - if(!useNHWC) { - throw StringError("Transformer blocks with NCHW layout are not yet supported by the CUDA backend"); - } - } - - ~TransformerFFNBlock() - {} - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - (void)cudaHandles; - (void)batchSize; - return 0; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* trunkBuf, - void* trunkScratchBuf, - void* maskBuf, - float* maskSumBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - (void)maskSumBuf; - - int seqLen = nnXLen * nnYLen; - int matBatchSize = batchSize * seqLen; - size_t bytesPerElt = usingFP16 ? sizeof(half) : sizeof(float); - - // Step 1: RMSNorm - preLN.apply(cudaHandles, batchSize, seqLen, trunkBuf, trunkScratchBuf, maskBuf); - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D("CUDA FFN RMSNorm out", trunkScratchBuf, batchSize, numChannels, seqLen, usingNHWC, usingFP16, maskBuf); -#endif - - // Step 2: linear1 projection - SizedBuf ffnBuf(scratch->allocator, (size_t)ffnChannels * matBatchSize * bytesPerElt); - linear1.apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, ffnBuf.buf, workspaceBuf, workspaceBytes); - - // Step 3: SwiGLU - { - SizedBuf gateBuf(scratch->allocator, (size_t)ffnChannels * matBatchSize * bytesPerElt); - linearGate->apply(cudaHandles, scratch, matBatchSize, trunkScratchBuf, gateBuf.buf, workspaceBuf, workspaceBytes); - - if((size_t)ffnChannels * (size_t)matBatchSize >= (size_t)2147483647) - throw StringError("CUDA SwiGLU element count exceeds the 32-bit index limit used by the kernel"); - int totalSize = (int)((size_t)ffnChannels * matBatchSize); - if(!usingFP16) { - customCudaSwiGLU((const float*)ffnBuf.buf, (const float*)gateBuf.buf, (float*)ffnBuf.buf, totalSize); - } - else { - customCudaSwiGLU((const half*)ffnBuf.buf, (const half*)gateBuf.buf, (half*)ffnBuf.buf, totalSize); - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - } - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint2D("CUDA FFN SwiGLU", ffnBuf.buf, matBatchSize, ffnChannels, usingFP16); -#endif - - // Step 4: linear2 projection back to trunk channels - linear2.apply(cudaHandles, scratch, matBatchSize, ffnBuf.buf, trunkScratchBuf, workspaceBuf, workspaceBytes); - - // Step 5: Residual addition: trunk += trunkScratch * mask - if(!usingFP16) { - customCudaMaskedResidualAddNHWC((float*)trunkBuf, (const float*)trunkScratchBuf, (const float*)maskBuf, batchSize, seqLen, numChannels); - } - else { - customCudaMaskedResidualAddNHWC((half*)trunkBuf, (const half*)trunkScratchBuf, (const half*)maskBuf, batchSize, seqLen, numChannels); - } - CUDA_ERR(name.c_str(), cudaPeekAtLastError()); - -#ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D("CUDA FFN residual", trunkBuf, batchSize, numChannels, seqLen, usingNHWC, usingFP16, maskBuf); -#endif - } -}; - -//------------------------------------------------------------------------------ - -BlockStack::BlockStack( - CudaHandles* cudaHandles, - CudnnManager* manager, - int nBlocks, - int trunkChannels, - const std::vector>& descBlocks, - int nnX, - int nnY, - bool useFP16, - bool useNHWC -) : - numBlocks(nBlocks), - trunkNumChannels(trunkChannels), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC) -{ - testAssert(numBlocks == descBlocks.size()); - for(int i = 0; irequiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - } - else if(blocks[i].first == GLOBAL_POOLING_BLOCK_KIND) { - GlobalPoolingResidualBlock* block = (GlobalPoolingResidualBlock*)blocks[i].second.get(); - b = block->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - } - else if(blocks[i].first == NESTED_BOTTLENECK_BLOCK_KIND) { - NestedBottleneckResidualBlock* block = (NestedBottleneckResidualBlock*)blocks[i].second.get(); - b = block->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - } - else if(blocks[i].first == TRANSFORMER_ATTENTION_BLOCK_KIND) { - TransformerAttentionBlock* block = (TransformerAttentionBlock*)blocks[i].second.get(); - b = block->requiredWorkspaceBytes(cudaHandles, batchSize); - bytes = std::max(bytes, b); - } - else if(blocks[i].first == TRANSFORMER_FFN_BLOCK_KIND) { - TransformerFFNBlock* block = (TransformerFFNBlock*)blocks[i].second.get(); - b = block->requiredWorkspaceBytes(cudaHandles, batchSize); - bytes = std::max(bytes, b); - } - else { - ASSERT_UNREACHABLE; - } - } - return bytes; -} - -void BlockStack::apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* maskBuf, - float* maskSumBuf, - void* trunkBuf, - void* trunkScratchBuf, - void* workspaceBuf, - size_t workspaceBytes -) const { - - for(int i = 0; iapply( - cudaHandles, - scratch, - batchSize, - trunkBuf, - trunkScratchBuf, - maskBuf, - workspaceBuf, - workspaceBytes - ); - } - else if(blocks[i].first == GLOBAL_POOLING_BLOCK_KIND) { - GlobalPoolingResidualBlock* block = (GlobalPoolingResidualBlock*)blocks[i].second.get(); - block->apply( - cudaHandles, - scratch, - batchSize, - trunkBuf, - trunkScratchBuf, - maskBuf, - maskSumBuf, - workspaceBuf, - workspaceBytes - ); - } - else if(blocks[i].first == NESTED_BOTTLENECK_BLOCK_KIND) { - NestedBottleneckResidualBlock* block = (NestedBottleneckResidualBlock*)blocks[i].second.get(); - block->apply( - cudaHandles, - scratch, - batchSize, - trunkBuf, - trunkScratchBuf, - maskBuf, - maskSumBuf, - workspaceBuf, - workspaceBytes - ); - } - else if(blocks[i].first == TRANSFORMER_ATTENTION_BLOCK_KIND) { - TransformerAttentionBlock* block = (TransformerAttentionBlock*)blocks[i].second.get(); - block->apply( - cudaHandles, - scratch, - batchSize, - trunkBuf, - trunkScratchBuf, - maskBuf, - maskSumBuf, - workspaceBuf, - workspaceBytes - ); - } - else if(blocks[i].first == TRANSFORMER_FFN_BLOCK_KIND) { - TransformerFFNBlock* block = (TransformerFFNBlock*)blocks[i].second.get(); - block->apply( - cudaHandles, - scratch, - batchSize, - trunkBuf, - trunkScratchBuf, - maskBuf, - maskSumBuf, - workspaceBuf, - workspaceBytes - ); - } - else { - ASSERT_UNREACHABLE; - } - } -} -//------------------------------------------------------------------------------ - -struct SGFMetadataEncoder { - const string name; - - const bool usingFP16; - - const MatMulLayer mul1; - const MatBiasLayer bias1; - const MatMulLayer mul2; - const MatBiasLayer bias2; - const MatMulLayer mul3; - - SGFMetadataEncoder() = delete; - SGFMetadataEncoder(const SGFMetadataEncoder&) = delete; - SGFMetadataEncoder& operator=(const SGFMetadataEncoder&) = delete; - - SGFMetadataEncoder( - CudaHandles* cudaHandles, - const SGFMetadataEncoderDesc* desc, - bool useFP16 - ) : - name(desc->name), - usingFP16(useFP16), - mul1(cudaHandles,&desc->mul1,useFP16), - bias1(cudaHandles,&desc->bias1,useFP16,desc->act1.activation), - mul2(cudaHandles,&desc->mul2,useFP16), - bias2(cudaHandles,&desc->bias2,useFP16,desc->act2.activation), - mul3(cudaHandles,&desc->mul3,useFP16) - { - } - - ~SGFMetadataEncoder() - { - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - (void)batchSize; - size_t bytes = 0; - size_t b; - - b = mul1.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = mul2.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = mul3.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* inputBuf, - void* outputBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - SizedBuf internalBuf1(scratch->allocator, scratch->getBufSizeFloat(std::max(mul1.outChannels,mul2.outChannels))); - SizedBuf internalBuf2(scratch->allocator, scratch->getBufSizeFloat(std::max(mul1.outChannels,mul2.outChannels))); - - mul1.apply(cudaHandles,scratch,batchSize,inputBuf,internalBuf1.buf,workspaceBuf,workspaceBytes); - bias1.apply(cudaHandles,batchSize,internalBuf1.buf); - mul2.apply(cudaHandles,scratch,batchSize,internalBuf1.buf,internalBuf2.buf,workspaceBuf,workspaceBytes); - bias2.apply(cudaHandles,batchSize,internalBuf2.buf); - mul3.apply(cudaHandles,scratch,batchSize,internalBuf2.buf,outputBuf,workspaceBuf,workspaceBytes); - } - -}; - - -//---------------------------------------------------------------------------- - -struct Trunk { - const string name; - const int modelVersion; - const int numBlocks; - const int trunkNumChannels; - - const int nnXLen; - const int nnYLen; - const bool usingFP16; - const bool usingNHWC; - - std::unique_ptr initialConv; - std::unique_ptr initialMatMul; - std::unique_ptr sgfMetadataEncoder; - const BlockStack blocks; - const int trunkNormKind; - std::unique_ptr trunkTipBN; - std::unique_ptr trunkTipRMSNorm; - - Trunk() = delete; - Trunk(const Trunk&) = delete; - Trunk& operator=(const Trunk&) = delete; - - Trunk( - CudaHandles* cudaHandles, - CudnnManager* manager, - const TrunkDesc* desc, - int nnX, - int nnY, - bool inputsUseNHWC, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - modelVersion(desc->modelVersion), - numBlocks(desc->numBlocks), - trunkNumChannels(desc->trunkNumChannels), - nnXLen(nnX), - nnYLen(nnY), - usingFP16(useFP16), - usingNHWC(useNHWC), - blocks(cudaHandles,manager,desc->numBlocks,desc->trunkNumChannels,desc->blocks,nnX,nnY,useFP16,useNHWC), - trunkNormKind(desc->trunkNormKind) - { - int midNumChannels = desc->midNumChannels; - int regularNumChannels = desc->regularNumChannels; - int gpoolNumChannels = desc->gpoolNumChannels; - - int maxBatchSize = manager->maxBatchSize; - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,trunkNumChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,midNumChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,regularNumChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,gpoolNumChannels); - - initialConv = std::make_unique(cudaHandles,manager,&desc->initialConv,useFP16,inputsUseNHWC,useNHWC); - initialMatMul = std::make_unique(cudaHandles,&desc->initialMatMul,useFP16); - if(desc->metaEncoderVersion > 0) { - sgfMetadataEncoder = std::make_unique(cudaHandles,&desc->sgfMetadataEncoder,useFP16); - testAssert(sgfMetadataEncoder->mul3.outChannels == initialMatMul->outChannels); - } - - if(desc->trunkNormKind == TRUNK_NORM_KIND_STANDARD) { - trunkTipBN = std::make_unique(cudaHandles,&desc->trunkTipBN,&desc->trunkTipActivation,nnXLen,nnYLen,useFP16,useNHWC); - } - else if(desc->trunkNormKind == TRUNK_NORM_KIND_RMSNORM) { - trunkTipRMSNorm = std::make_unique(cudaHandles,&desc->trunkTipRMSNorm,desc->trunkTipActivation.activation,nnXLen,nnYLen,useFP16,useNHWC); - } - else { - throw StringError("Unsupported trunk norm kind: " + Global::intToString(desc->trunkNormKind)); - } - testAssert(desc->blocks.size() == numBlocks); - } - - ~Trunk() - { - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - - b = initialConv->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - - b = initialMatMul->requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - - if(sgfMetadataEncoder != nullptr) { - b = sgfMetadataEncoder->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - } - - b = blocks.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* inputBuf, - void* inputGlobalBuf, - void* inputMetaBuf, - void* maskBuf, - float* maskSumBuf, - void* trunkBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - - SizedBuf trunkScratch(scratch->allocator, scratch->getBufSizeXY(trunkNumChannels)); - - //Feed the conv into trunkScratch.buf, not trunkBuf - initialConv->apply(cudaHandles,batchSize,false,inputBuf,trunkScratch.buf,workspaceBuf,workspaceBytes); - - #ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("After initial conv"), trunkScratch.buf, batchSize, trunkNumChannels, nnXLen*nnYLen, usingNHWC, usingFP16); - #endif - - //Feed the matmul into trunkBuf - initialMatMul->apply(cudaHandles,scratch,batchSize,inputGlobalBuf,trunkBuf,workspaceBuf,workspaceBytes); - //Then accumulate it into trunkScratch.buf, broadcasting during the process - if(!usingFP16) { - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); - } - else { - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); - } - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - - if(sgfMetadataEncoder != nullptr) { - testAssert(inputMetaBuf != NULL); - //Feed the result into trunkBuf - sgfMetadataEncoder->apply(cudaHandles,scratch,batchSize,inputMetaBuf,trunkBuf,workspaceBuf,workspaceBytes); - //Then accumulate it into trunkScratch.buf, broadcasting during the process - if(!usingFP16) { - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC((float*)trunkScratch.buf,(const float*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); - } - else { - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,trunkNumChannels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC((half*)trunkScratch.buf,(const half*)trunkBuf,batchSize,nnXLen*nnYLen,trunkNumChannels); - } - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - } - else { - testAssert(inputMetaBuf == NULL); - } - - //Flip trunkBuf and trunkScratch.buf so that the result gets accumulated in trunkScratch.buf - blocks.apply( - cudaHandles, - scratch, - batchSize, - maskBuf, - maskSumBuf, - trunkScratch.buf, - trunkBuf, - workspaceBuf, - workspaceBytes - ); - - //And now with the final norm port it from trunkScratch.buf to trunkBuf. - if(trunkNormKind == TRUNK_NORM_KIND_STANDARD) { - trunkTipBN->apply(cudaHandles,batchSize,trunkScratch.buf,maskBuf,trunkBuf); - } - else { - trunkTipRMSNorm->apply(cudaHandles,scratch,batchSize,trunkScratch.buf,trunkBuf,maskBuf,maskSumBuf); - } - - #ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("Trunk tip"), trunkBuf, batchSize, trunkNumChannels, nnXLen*nnYLen, usingNHWC, usingFP16); - #endif - } - -}; - -//------------------------------------------------------------------------------ - -static void fillMaskFloatBufAndMaskSumBuf(void* maskBuf, float*& maskFloatBuf, float*& maskSumBuf, bool usingFP16, int batchSize, int nnXLen, int nnYLen) { - if(!usingFP16) { - maskFloatBuf = (float*)maskBuf; - customCudaPoolRowsSumNCHW((const float*)maskFloatBuf,maskSumBuf,batchSize,1,nnXLen*nnYLen,1.0); - CUDA_ERR("sumMask",cudaPeekAtLastError()); - } - else { - customCudaCopyFromHalf((const half*)maskBuf,maskFloatBuf,batchSize*nnXLen*nnYLen); - CUDA_ERR("copyMaskFromHalf",cudaPeekAtLastError()); - customCudaPoolRowsSumNCHW((const float*)maskFloatBuf,maskSumBuf,batchSize,1,nnXLen*nnYLen,1.0); - CUDA_ERR("sumMask",cudaPeekAtLastError()); - } -} - - -//------------------------------------------------------------------------------ - -struct PolicyHead { - const string name; - const int modelVersion; - const int nnXLen; - const int nnYLen; - const int p1Channels; - const int g1Channels; - const int p2Channels; - const bool usingFP16; - const bool usingNHWC; - - const ConvLayer p1Conv; - const ConvLayer g1Conv; - const BatchNormLayer g1BN; - const MatMulLayer gpoolToBiasMul; - const BatchNormLayer p1BN; - const ConvLayer p2Conv; - const MatMulLayer gpoolToPassMul; - const MatBiasLayer gpoolToPassBias; - const MatMulLayer gpoolToPassMul2; - - PolicyHead() = delete; - PolicyHead(const PolicyHead&) = delete; - PolicyHead& operator=(const PolicyHead&) = delete; - - PolicyHead( - CudaHandles* cudaHandles, - CudnnManager* manager, - const PolicyHeadDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - modelVersion(desc->modelVersion), - nnXLen(nnX), - nnYLen(nnY), - p1Channels(desc->p1Conv.outChannels), - g1Channels(desc->g1Conv.outChannels), - p2Channels(desc->p2Conv.outChannels), - usingFP16(useFP16), - usingNHWC(useNHWC), - p1Conv(cudaHandles,manager,&desc->p1Conv,useFP16,useNHWC), - g1Conv(cudaHandles,manager,&desc->g1Conv,useFP16,useNHWC), - g1BN(cudaHandles,&desc->g1BN,&desc->g1Activation,nnX,nnY,useFP16,useNHWC), - gpoolToBiasMul(cudaHandles,&desc->gpoolToBiasMul,false), - p1BN(cudaHandles,&desc->p1BN,&desc->p1Activation,nnX,nnY,false,useNHWC), - p2Conv(cudaHandles,manager,&desc->p2Conv,false,useNHWC), - gpoolToPassMul(cudaHandles,&desc->gpoolToPassMul,false), - gpoolToPassBias(cudaHandles,&desc->gpoolToPassBias,false,desc->passActivation.activation), - gpoolToPassMul2(cudaHandles,&desc->gpoolToPassMul2,false) - { - } - - ~PolicyHead() - { - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - - b = p1Conv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = g1Conv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = gpoolToBiasMul.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = p2Conv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = gpoolToPassMul.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = gpoolToPassMul2.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = sizeof(float)*batchSize*g1Channels*nnXLen*nnYLen; - bytes = std::max(bytes,b); - - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* maskBuf, - float* maskFloatBuf, - float* maskSumBuf, - void* trunkBuf, - float* policyPassBuf, - float* policyBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - - SizedBuf p1Out(scratch->allocator, scratch->getBufSizeXYFloat(p1Channels)); //Need to hold floats, not just halfs - SizedBuf p1Out2(scratch->allocator, scratch->getBufSizeXYFloat(p1Channels)); //Need to hold floats, not just halfs - SizedBuf g1Out(scratch->allocator, scratch->getBufSizeXY(g1Channels)); - SizedBuf g1Out2(scratch->allocator, scratch->getBufSizeXY(g1Channels)); - SizedBuf g1Concat(scratch->allocator, scratch->getBufSizeFloat(g1Channels*3)); - SizedBuf g1Bias(scratch->allocator, scratch->getBufSizeFloat(p1Channels)); - SizedBuf p1Pass(scratch->allocator, scratch->getBufSizeFloat(p1Channels)); - - p1Conv.apply(cudaHandles,batchSize,false,trunkBuf,p1Out.buf,workspaceBuf,workspaceBytes); - g1Conv.apply(cudaHandles,batchSize,false,trunkBuf,g1Out.buf,workspaceBuf,workspaceBytes); - g1BN.apply(cudaHandles,batchSize,g1Out.buf,maskBuf,g1Out2.buf); - - if(!usingFP16) { - if(!usingNHWC) - customCudaPoolRowsGPoolNCHW((const float*)g1Out2.buf,(float*)g1Concat.buf,batchSize,g1Channels,nnXLen*nnYLen,maskFloatBuf,maskSumBuf); - else - customCudaPoolRowsGPoolNHWC((const float*)g1Out2.buf,(float*)g1Concat.buf,batchSize,nnXLen*nnYLen,g1Channels,maskFloatBuf,maskSumBuf); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - } - else { - customCudaCopyFromHalf((const half*)g1Out2.buf,(float*)workspaceBuf,batchSize*g1Channels*nnXLen*nnYLen); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - if(!usingNHWC) - customCudaPoolRowsGPoolNCHW((const float*)workspaceBuf,(float*)g1Concat.buf,batchSize,g1Channels,nnXLen*nnYLen,maskFloatBuf,maskSumBuf); - else - customCudaPoolRowsGPoolNHWC((const float*)workspaceBuf,(float*)g1Concat.buf,batchSize,nnXLen*nnYLen,g1Channels,maskFloatBuf,maskSumBuf); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - } - - gpoolToBiasMul.apply(cudaHandles,scratch,batchSize,g1Concat.buf,g1Bias.buf,workspaceBuf,workspaceBytes); - - #ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("p1 pre-gpool-sum"), p1Out.buf, batchSize, p1Channels, nnXLen*nnYLen, usingNHWC, usingFP16); - CudaUtils::debugPrint3D(string("g1 pre-gpool"), g1Out.buf, batchSize, g1Channels, nnXLen*nnYLen, usingNHWC, usingFP16); - CudaUtils::debugPrint2D(string("g1 pooled"), g1Concat.buf, batchSize, g1Channels*3, false); - CudaUtils::debugPrint2D(string("g1 biases"), g1Bias.buf, batchSize, p1Channels, false); - #endif - - float* p1OutBufA; - float* p1OutBufB; - if(!usingFP16) { - p1OutBufA = (float*)p1Out.buf; - p1OutBufB = (float*)p1Out2.buf; - } - else { - customCudaCopyFromHalf((const half*)p1Out.buf,(float*)p1Out2.buf,batchSize*p1Channels*nnXLen*nnYLen); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - p1OutBufA = (float*)p1Out2.buf; - p1OutBufB = (float*)p1Out.buf; - } - - if(!usingNHWC) - customCudaAddNCBiasInplaceNCHW(p1OutBufA,(float*)g1Bias.buf,batchSize,p1Channels,nnXLen*nnYLen); - else - customCudaAddNCBiasInplaceNHWC(p1OutBufA,(float*)g1Bias.buf,batchSize,nnXLen*nnYLen,p1Channels); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - - p1BN.apply(cudaHandles,batchSize,p1OutBufA,maskFloatBuf,p1OutBufB); - p2Conv.apply(cudaHandles,batchSize,false,p1OutBufB,(float*)policyBuf,workspaceBuf,workspaceBytes); - - if(modelVersion >= 15) { - gpoolToPassMul.apply(cudaHandles,scratch,batchSize,g1Concat.buf,p1Pass.buf,workspaceBuf,workspaceBytes); - gpoolToPassBias.apply(cudaHandles,batchSize,p1Pass.buf); - gpoolToPassMul2.apply(cudaHandles,scratch,batchSize,p1Pass.buf,policyPassBuf,workspaceBuf,workspaceBytes); - } - else { - gpoolToPassMul.apply(cudaHandles,scratch,batchSize,g1Concat.buf,policyPassBuf,workspaceBuf,workspaceBytes); - } - - #ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("p1 after-gpool-sum"), p1OutBufA, batchSize, p1Channels, nnXLen*nnYLen, usingNHWC, false); - CudaUtils::debugPrint2D(string("policypass"), policyPassBuf, batchSize, 1, false); - CudaUtils::debugPrint3D(string("policy"), policyBuf, batchSize, p2Channels, nnXLen*nnYLen, usingNHWC, false); - #endif - - } - -}; - -//------------------------------------------------------------------------------ - -struct ValueHead { - const string name; - const int modelVersion; - const int nnXLen; - const int nnYLen; - const int v1Channels; - const int v2Channels; - const int valueChannels; - const int scoreValueChannels; - const int ownershipChannels; - const bool usingFP16; - const bool usingNHWC; - - const ConvLayer v1Conv; - const BatchNormLayer v1BN; - const MatMulLayer v2Mul; - const MatBiasLayer v2Bias; - const MatMulLayer v3Mul; - const MatBiasLayer v3Bias; - const MatMulLayer sv3Mul; - const MatBiasLayer sv3Bias; - const ConvLayer vOwnershipConv; - - ValueHead() = delete; - ValueHead(const ValueHead&) = delete; - ValueHead& operator=(const ValueHead&) = delete; - - ValueHead( - CudaHandles* cudaHandles, - CudnnManager* manager, - const ValueHeadDesc* desc, - int nnX, - int nnY, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - modelVersion(desc->modelVersion), - nnXLen(nnX), - nnYLen(nnY), - v1Channels(desc->v1Conv.outChannels), - v2Channels(desc->v2Mul.outChannels), - valueChannels(desc->v3Mul.outChannels), - scoreValueChannels(desc->sv3Mul.outChannels), - ownershipChannels(desc->vOwnershipConv.outChannels), - usingFP16(useFP16), - usingNHWC(useNHWC), - v1Conv(cudaHandles,manager,&desc->v1Conv,useFP16,useNHWC), - v1BN(cudaHandles,&desc->v1BN,&desc->v1Activation,nnX,nnY,useFP16,useNHWC), - v2Mul(cudaHandles,&desc->v2Mul,false), - v2Bias(cudaHandles,&desc->v2Bias,false,desc->v2Activation.activation), - v3Mul(cudaHandles,&desc->v3Mul,false), - v3Bias(cudaHandles,&desc->v3Bias,false,ACTIVATION_IDENTITY), - sv3Mul(cudaHandles,&desc->sv3Mul,false), - sv3Bias(cudaHandles,&desc->sv3Bias,false,ACTIVATION_IDENTITY), - vOwnershipConv(cudaHandles,manager,&desc->vOwnershipConv,useFP16,useNHWC) - { - } - - ~ValueHead() - { - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - - b = v1Conv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = v2Mul.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = v3Mul.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = sizeof(float)*batchSize*v1Channels*nnXLen*nnYLen; - bytes = std::max(bytes,b); - - b = sv3Mul.requiredWorkspaceBytes(cudaHandles); - bytes = std::max(bytes,b); - b = vOwnershipConv.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = sizeof(float)*batchSize*ownershipChannels*nnXLen*nnYLen; - bytes = std::max(bytes,b); - - return bytes; - } - - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - void* maskBuf, - float* maskSumBuf, - void* trunkBuf, - float* valueBuf, - float* scoreValueBuf, - void* ownershipBuf, - void* workspaceBuf, - size_t workspaceBytes - ) const { - SizedBuf v1Out(scratch->allocator, scratch->getBufSizeXY(v1Channels)); - SizedBuf v1Out2(scratch->allocator, scratch->getBufSizeXY(v1Channels)); - SizedBuf v1Mean(scratch->allocator, scratch->getBufSizeFloat(v1Channels*3)); - SizedBuf v2Out(scratch->allocator, scratch->getBufSizeFloat(v2Channels)); - SizedBuf ownershipScratch(scratch->allocator, scratch->getBufSizeXYFloat(ownershipChannels)); - - v1Conv.apply(cudaHandles,batchSize,false,trunkBuf,v1Out.buf,workspaceBuf,workspaceBytes); - v1BN.apply(cudaHandles,batchSize,v1Out.buf,maskBuf,v1Out2.buf); - - void* bufToBePooled = v1Out2.buf; - if(usingFP16) { - customCudaCopyFromHalf((const half*)v1Out2.buf,(float*)workspaceBuf,batchSize*v1Channels*nnXLen*nnYLen); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - bufToBePooled = workspaceBuf; - } - - if(!usingNHWC) - customCudaValueHeadPoolNCHW((float*)bufToBePooled,(float*)v1Mean.buf,batchSize,v1Channels,nnXLen*nnYLen,maskSumBuf); - else - customCudaValueHeadPoolNHWC((const float*)bufToBePooled,(float*)v1Mean.buf,batchSize,nnXLen*nnYLen,v1Channels,maskSumBuf); - CUDA_ERR(name.c_str(),cudaPeekAtLastError()); - - v2Mul.apply(cudaHandles,scratch,batchSize,v1Mean.buf,v2Out.buf,workspaceBuf,workspaceBytes); - v2Bias.apply(cudaHandles,batchSize,v2Out.buf); - v3Mul.apply(cudaHandles,scratch,batchSize,v2Out.buf,valueBuf,workspaceBuf,workspaceBytes); - v3Bias.apply(cudaHandles,batchSize,valueBuf); - - sv3Mul.apply(cudaHandles,scratch,batchSize,v2Out.buf,scoreValueBuf,workspaceBuf,workspaceBytes); - sv3Bias.apply(cudaHandles,batchSize,scoreValueBuf); - - #ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("v1"), v1Out.buf, batchSize, v1Channels, nnXLen*nnYLen, usingNHWC, usingFP16); - CudaUtils::debugPrint2D(string("v1 pooled"), v1Mean.buf, batchSize, v1Channels, false); - CudaUtils::debugPrint2D(string("v2"), v2Out.buf, batchSize, v1Channels, false); - #endif - - if(!usingFP16) { - vOwnershipConv.apply(cudaHandles,batchSize,false,v1Out2.buf,ownershipBuf,workspaceBuf,workspaceBytes); - } - else { - vOwnershipConv.apply(cudaHandles,batchSize,false,v1Out2.buf,ownershipScratch.buf,workspaceBuf,workspaceBytes); - customCudaCopyFromHalf((const half*)ownershipScratch.buf,(float*)ownershipBuf,batchSize*ownershipChannels*nnXLen*nnYLen); - CUDA_ERR("vOwnership copy",cudaPeekAtLastError()); - } - - } - -}; - -//------------------------------------------------------------------------------ - -struct Model { - const string name; - const int modelVersion; - const int maxBatchSize; - const int nnXLen; - const int nnYLen; - const int numInputChannels; - const int numInputGlobalChannels; - const int numInputMetaChannels; - const int numPolicyChannels; - const int numValueChannels; - const int numScoreValueChannels; - const int numOwnershipChannels; - const bool usingFP16; - const bool usingNHWC; - const bool inputsUsingNHWC; - - std::unique_ptr trunk; - std::unique_ptr policyHead; - std::unique_ptr valueHead; - std::unique_ptr manager; - - Model() = delete; - Model(const Model&) = delete; - Model& operator=(const Model&) = delete; - - Model( - CudaHandles* cudaHandles, - const ModelDesc* desc, - int maxBatchSz, - int nnX, - int nnY, - bool inputsUseNHWC, - bool useFP16, - bool useNHWC - ) : - name(desc->name), - modelVersion(desc->modelVersion), - maxBatchSize(maxBatchSz), - nnXLen(nnX), - nnYLen(nnY), - numInputChannels(desc->numInputChannels), - numInputGlobalChannels(desc->numInputGlobalChannels), - numInputMetaChannels(desc->numInputMetaChannels), - numPolicyChannels(desc->numPolicyChannels), - numValueChannels(desc->numValueChannels), - numScoreValueChannels(desc->numScoreValueChannels), - numOwnershipChannels(desc->numOwnershipChannels), - usingFP16(useFP16), - usingNHWC(useNHWC), - inputsUsingNHWC(inputsUseNHWC) - { - if(nnXLen > NNPos::MAX_BOARD_LEN) - throw StringError(Global::strprintf("nnXLen (%d) is greater than NNPos::MAX_BOARD_LEN (%d)", - nnXLen, NNPos::MAX_BOARD_LEN - )); - if(nnYLen > NNPos::MAX_BOARD_LEN) - throw StringError(Global::strprintf("nnYLen (%d) is greater than NNPos::MAX_BOARD_LEN (%d)", - nnYLen, NNPos::MAX_BOARD_LEN - )); - - int numFeatures = NNModelVersion::getNumSpatialFeatures(modelVersion); - if(numInputChannels != numFeatures) - throw StringError(Global::strprintf("Neural net numInputChannels (%d) was not the expected number based on version (%d)", - numInputChannels, numFeatures - )); - int numGlobalFeatures = NNModelVersion::getNumGlobalFeatures(modelVersion); - if(numInputGlobalChannels != numGlobalFeatures) - throw StringError(Global::strprintf("Neural net numInputGlobalChannels (%d) was not the expected number based on version (%d)", - numInputGlobalChannels, numGlobalFeatures - )); - if(numInputMetaChannels > 0) { - if(numInputMetaChannels != SGFMetadata::METADATA_INPUT_NUM_CHANNELS) - throw StringError(Global::strprintf("Neural net numInputMetaChannels (%d) was not the expected number (%d)", - numInputMetaChannels, SGFMetadata::METADATA_INPUT_NUM_CHANNELS - )); - } - - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numInputChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numInputGlobalChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numInputMetaChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numPolicyChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numValueChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numScoreValueChannels); - CudaUtils::checkBufferSize(maxBatchSize,nnXLen,nnYLen,numOwnershipChannels); - - manager = std::make_unique(name, maxBatchSize, nnXLen, nnYLen); - trunk = std::make_unique(cudaHandles,manager.get(),&desc->trunk,nnXLen,nnYLen,inputsUseNHWC,useFP16,useNHWC); - policyHead = std::make_unique(cudaHandles,manager.get(),&desc->policyHead,nnXLen,nnYLen,useFP16,useNHWC); - valueHead = std::make_unique(cudaHandles,manager.get(),&desc->valueHead,nnXLen,nnYLen,useFP16,useNHWC); - } - - ~Model() - { - } - - size_t requiredWorkspaceBytes( - CudaHandles* cudaHandles, - int batchSize - ) const { - size_t bytes = 0; - size_t b; - - b = trunk->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = policyHead->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - b = valueHead->requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - - return bytes; - } - - void apply( - CudaHandles* cudaHandles, - ScratchBuffers* scratch, - int batchSize, - bool requireExactNNLen, - - void* inputBuf, - void* inputGlobalBuf, - void* inputMetaBuf, - - float* policyPassBuf, - float* policyBuf, - - float* valueBuf, - float* scoreValueBuf, - void* ownershipBuf, - - void* workspaceBuf, - size_t workspaceBytes - ) const { - SizedBuf mask(scratch->allocator, scratch->getBufSizeXY(1)); - SizedBuf maskFloat(scratch->allocator, scratch->getBufSizeXYFloat(1)); - SizedBuf maskSum(scratch->allocator, scratch->getBufSizeFloat(1)); - - void* maskBuf = mask.buf; - float* maskFloatBuf = (float*)maskFloat.buf; - float* maskSumBuf = (float*)maskSum.buf; - - if(!usingFP16) { - if(inputsUsingNHWC) - customCudaChannel0ExtractNHWC((const float*)inputBuf, (float*)maskBuf, batchSize, nnXLen*nnYLen, numInputChannels); - else - customCudaChannel0ExtractNCHW((const float*)inputBuf, (float*)maskBuf, batchSize, numInputChannels, nnXLen*nnYLen); - CUDA_ERR("modelExtractMask",cudaPeekAtLastError()); - } - else { - if(inputsUsingNHWC) - customCudaChannel0ExtractNHWC((const half*)inputBuf, (half*)maskBuf, batchSize, nnXLen*nnYLen, numInputChannels); - else - customCudaChannel0ExtractNCHW((const half*)inputBuf, (half*)maskBuf, batchSize, numInputChannels, nnXLen*nnYLen); - CUDA_ERR("modelExtractMask",cudaPeekAtLastError()); - } - - fillMaskFloatBufAndMaskSumBuf(maskBuf,maskFloatBuf,maskSumBuf,usingFP16,batchSize,nnXLen,nnYLen); - - //Don't do any masking if we know the board is exactly the desired size - if(requireExactNNLen) { - //Set to NULL to signal downstream that this buf doesn't need to be used - maskBuf = NULL; - maskFloatBuf = NULL; - //The global pooling structures need this no matter what, for normalizing based on this and its sqrt. - //maskSumBuf = NULL; - } - - #ifdef DEBUG_INTERMEDIATE_VALUES - CudaUtils::debugPrint3D(string("Initial bin features"), inputBuf, batchSize, trunk->initialConv->inChannels, nnXLen*nnYLen, inputsUsingNHWC, usingFP16); - CudaUtils::debugPrint2D(string("Initial global features"), inputGlobalBuf, batchSize, trunk->initialMatMul->inChannels, usingFP16); - if(trunk->sgfMetadataEncoder != nullptr) { - assert(inputMetaBuf != NULL); - CudaUtils::debugPrint2D(string("Initial meta features"), inputMetaBuf, batchSize, trunk->sgfMetadataEncoder->mul1.inChannels, usingFP16); - } - #endif - - SizedBuf trunkBuf(scratch->allocator, scratch->getBufSizeXY(trunk->trunkNumChannels)); - - trunk->apply( - cudaHandles, - scratch, - batchSize, - inputBuf, - inputGlobalBuf, - inputMetaBuf, - maskBuf, - maskSumBuf, - trunkBuf.buf, - workspaceBuf, - workspaceBytes - ); - policyHead->apply( - cudaHandles, - scratch, - batchSize, - maskBuf, - maskFloatBuf, - maskSumBuf, - trunkBuf.buf, - policyPassBuf, - policyBuf, - workspaceBuf, - workspaceBytes - ); - valueHead->apply( - cudaHandles, - scratch, - batchSize, - maskBuf, - maskSumBuf, - trunkBuf.buf, - valueBuf, - scoreValueBuf, - ownershipBuf, - workspaceBuf, - workspaceBytes - ); - } - -}; - - -//------------------------------------------------------------------------------ - -struct LoadedModel { - ModelDesc modelDesc; - - LoadedModel(const string& fileName, const string& expectedSha256) { - ModelDesc::loadFromFileMaybeGZipped(fileName,modelDesc,expectedSha256); - modelDesc.applyScale8ToReduceActivations(); - } - - LoadedModel() = delete; - LoadedModel(const LoadedModel&) = delete; - LoadedModel& operator=(const LoadedModel&) = delete; -}; - -LoadedModel* NeuralNet::loadModelFile(const string& file, const string& expectedSha256) { - LoadedModel* loadedModel = new LoadedModel(file,expectedSha256); - return loadedModel; -} - -void NeuralNet::freeLoadedModel(LoadedModel* loadedModel) { - delete loadedModel; -} - -const ModelDesc& NeuralNet::getModelDesc(const LoadedModel* loadedModel) { - return loadedModel->modelDesc; -} - -//------------------------------------------------------------------------------ - -struct Buffers { - //All of these are device pointers - - float* inputBufFloat; - void* inputBuf; - float* inputGlobalBufFloat; - void* inputGlobalBuf; - float* inputMetaBufFloat; - void* inputMetaBuf; - size_t inputBufBytesFloat; - size_t inputBufBytes; - size_t inputGlobalBufBytesFloat; - size_t inputGlobalBufBytes; - size_t inputMetaBufBytesFloat; - size_t inputMetaBufBytes; - - float* policyPassBuf; - size_t policyPassBufBytes; - float* policyBuf; - size_t policyBufBytes; - - float* valueBuf; - size_t valueBufBytes; - float* scoreValueBuf; - size_t scoreValueBufBytes; - void* ownershipBuf; - size_t ownershipBufBytes; - - void* workspaceBuf; - size_t workspaceBytes; - - Buffers() = delete; - Buffers(const Buffers&) = delete; - Buffers& operator=(const Buffers&) = delete; - - Buffers(CudaHandles* cudaHandles, const Model& m, const ScratchBuffers& scratch) { - size_t batchXYFloatBytes = (size_t)scratch.batchXYFloatBytes; - size_t batchFloatBytes = (size_t)scratch.batchFloatBytes; - size_t batchXYBytes = (size_t)scratch.batchXYBytes; - size_t batchBytes = (size_t)scratch.batchBytes; - - inputBufBytesFloat = m.numInputChannels * batchXYFloatBytes; - inputBufBytes = m.numInputChannels * batchXYBytes; - inputGlobalBufBytesFloat = m.numInputGlobalChannels * batchFloatBytes; - inputGlobalBufBytes = m.numInputGlobalChannels * batchBytes; - inputMetaBufBytesFloat = m.numInputMetaChannels * batchFloatBytes; - inputMetaBufBytes = m.numInputMetaChannels * batchBytes; - - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&inputBufFloat), inputBufBytesFloat)); - CUDA_ERR("Buffers",cudaMalloc(&inputBuf, inputBufBytes)); - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&inputGlobalBufFloat), inputGlobalBufBytesFloat)); - CUDA_ERR("Buffers",cudaMalloc(&inputGlobalBuf, inputGlobalBufBytes)); - if(m.numInputMetaChannels > 0) { - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&inputMetaBufFloat), inputMetaBufBytesFloat)); - CUDA_ERR("Buffers",cudaMalloc(&inputMetaBuf, inputMetaBufBytes)); - } - else { - inputMetaBufFloat = NULL; - inputMetaBuf = NULL; - } - - if(m.modelVersion >= 17) - testAssert(m.policyHead->p2Channels == 2 || m.policyHead->p2Channels == 4); - else if(m.modelVersion >= 16) - testAssert(m.policyHead->p2Channels == 4); - else if(m.modelVersion >= 12) - testAssert(m.policyHead->p2Channels == 2); - else - testAssert(m.policyHead->p2Channels == 1); - - policyPassBufBytes = m.policyHead->p2Channels * batchFloatBytes; - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&policyPassBuf), policyPassBufBytes)); - policyBufBytes = m.policyHead->p2Channels * batchXYFloatBytes; - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&policyBuf), policyBufBytes)); - - valueBufBytes = m.valueHead->valueChannels * batchFloatBytes; - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&valueBuf), valueBufBytes)); - - scoreValueBufBytes = m.valueHead->scoreValueChannels * batchFloatBytes; - CUDA_ERR("Buffers",cudaMalloc(reinterpret_cast(&scoreValueBuf), scoreValueBufBytes)); - - //This buf is used for both an intermdiate fp16 result in fp16 mode, and ALSO the final fp32 output, so always must be fp32-sized - ownershipBufBytes = m.valueHead->ownershipChannels * batchXYFloatBytes; - CUDA_ERR("Buffers",cudaMalloc(&ownershipBuf, ownershipBufBytes)); - - //In theory the requiredWorkspaceBytes calls could give us values non-monotone in batch size - //such as if the convolution algorithm changes between batch size 1 and larger. - //So we call it for all the batch sizes. - size_t bytes = 0; - size_t b; - for(int batchSize = 1; batchSize <= m.maxBatchSize; batchSize++) { - b = m.requiredWorkspaceBytes(cudaHandles,batchSize); - bytes = std::max(bytes,b); - } - - CUDA_ERR("Buffers",cudaMalloc(&workspaceBuf, bytes)); - workspaceBytes = bytes; - } - - ~Buffers() { - cudaFree(inputBufFloat); - cudaFree(inputBuf); - cudaFree(inputGlobalBufFloat); - cudaFree(inputGlobalBuf); - if(inputMetaBufFloat != NULL) - cudaFree(inputMetaBufFloat); - if(inputMetaBuf != NULL) - cudaFree(inputMetaBuf); - - cudaFree(policyPassBuf); - cudaFree(policyBuf); - - cudaFree(valueBuf); - cudaFree(scoreValueBuf); - cudaFree(ownershipBuf); - - cudaFree(workspaceBuf); - } - -}; - -//------------------------------------------------------------------------------ - -struct ComputeContext { - int nnXLen; - int nnYLen; - enabled_t useFP16Mode; - enabled_t useNHWCMode; - // If true, skip the cudnn graph SDPA path entirely and always use the custom attention kernel. - bool cudaDisableGraphSDPA; - // Whether 1x1 NHWC convs use the cuBLAS GEMM path. Auto = matmul iff FP16. - enabled_t use1x1MatmulMode; -}; - -ComputeContext* NeuralNet::createComputeContext( - const std::vector& gpuIdxs, - Logger* logger, - int nnXLen, - int nnYLen, - const string& homeDataDirOverride, - enabled_t useFP16Mode, - const LoadedModel* loadedModel, - ConfigParser& cfg -) { - (void)gpuIdxs; - (void)logger; - (void)homeDataDirOverride; - (void)loadedModel; - - ComputeContext* context = new ComputeContext(); - context->nnXLen = nnXLen; - context->nnYLen = nnYLen; - context->useFP16Mode = useFP16Mode; - - // NHWC layout is a CUDA-specific option read directly off of cfg. Auto means "NHWC if FP16" (see below). - context->useNHWCMode = - cfg.contains("cudaUseNHWC") ? cfg.getEnabled("cudaUseNHWC") : enabled_t::Auto; - context->cudaDisableGraphSDPA = - cfg.contains("cudaDisableGraphSDPA") ? cfg.getBool("cudaDisableGraphSDPA") : false; - context->use1x1MatmulMode = - cfg.contains("cudaUse1x1Matmul") ? cfg.getEnabled("cudaUse1x1Matmul") : enabled_t::Auto; - return context; -} - -void NeuralNet::freeComputeContext(ComputeContext* computeContext) { - delete computeContext; -} - -//------------------------------------------------------------------------------ - -struct ComputeHandle { - std::unique_ptr cudaHandles; - std::unique_ptr model; - std::unique_ptr scratch; - std::unique_ptr buffers; - const bool usingFP16; - const int nnXLen; - const int nnYLen; - const bool requireExactNNLen; - const bool inputsUseNHWC; - const bool usingNHWC; - - ComputeHandle( - const ComputeContext* context, - const LoadedModel* loadedModel, - int majorComputeCapability, - int minorComputeCapability, - int maxBatchSize, - bool requireExactNNLen_, - bool inputsUseNHWC_, - bool useFP16, - bool useNHWC - ) : - usingFP16(useFP16), - nnXLen(context->nnXLen), - nnYLen(context->nnYLen), - requireExactNNLen(requireExactNNLen_), - inputsUseNHWC(inputsUseNHWC_), - usingNHWC(useNHWC) - { - cudaHandles = std::make_unique(majorComputeCapability,minorComputeCapability); - // Must be set before building the model: ConvLayer reads it at construction to pick the 1x1 conv path. - cudaHandles->use1x1MatmulMode = context->use1x1MatmulMode; - model = std::make_unique( - cudaHandles.get(), &(loadedModel->modelDesc), maxBatchSize, - nnXLen, nnYLen, inputsUseNHWC, useFP16, useNHWC - ); - scratch = std::make_unique(maxBatchSize, nnXLen, nnYLen, useFP16); - buffers = std::make_unique(cudaHandles.get(), *model, *scratch); - - //Synchronize after creating buffers and copying all the weights, just in case - CUDA_ERR("ComputeHandle", cudaDeviceSynchronize()); - } - ~ComputeHandle() { - } - - ComputeHandle() = delete; - ComputeHandle(const ComputeHandle&) = delete; - ComputeHandle& operator=(const ComputeHandle&) = delete; -}; - -ComputeHandle* NeuralNet::createComputeHandle( - ComputeContext* context, - const LoadedModel* loadedModel, - Logger* logger, - int maxBatchSize, - bool requireExactNNLen, - bool inputsUseNHWC, - int gpuIdxForThisThread, - int serverThreadIdx -) { - //Use whatever CUDA believes GPU 0 to be. - if(gpuIdxForThisThread == -1) - gpuIdxForThisThread = 0; - - CUDA_ERR("createComputeHandle",cudaSetDevice(gpuIdxForThisThread)); - - cudaDeviceProp prop; - cudaGetDeviceProperties(&prop,gpuIdxForThisThread); - - bool useFP16 = false; - bool useNHWC = false; - //Old GPUs - use FP32 and explicitly fail if FP16 enabled - if(prop.major < 5 || (prop.major == 5 && prop.minor < 3)) { - if(context->useFP16Mode == enabled_t::True) - throw StringError("Cuda device versions below 5.3 do not support useFP16=true"); - if(context->useNHWCMode == enabled_t::True) - useNHWC = true; - } - //In theory these GPUs support FP16, so allow if the user wants. - else if(prop.major < 6) { - if(context->useFP16Mode == enabled_t::True) - useFP16 = true; - if(context->useNHWCMode == enabled_t::True) - useNHWC = true; - } - //On Pascal architecture, default to using FP16 operations - //Actually, just use FP32 - there's a risk that on certain cards this might just be a lot worse. - //A user manually fine-tuning for performance can just enable it themselves if they know how. - else if(prop.major < 7) { - if(context->useFP16Mode == enabled_t::True) - useFP16 = true; - if(context->useNHWCMode == enabled_t::True) - useNHWC = true; - } - //On Volta and higher, use FP16 and NHWC together because we have tensor cores. - else { - if(context->useFP16Mode == enabled_t::True || context->useFP16Mode == enabled_t::Auto) - useFP16 = true; - if(context->useNHWCMode == enabled_t::True || (context->useNHWCMode == enabled_t::Auto && useFP16)) - useNHWC = true; - } - - //The CUDA transformer block implementation only supports NHWC (its channel projections, RoPE, and - //attention all assume the channel dim is contiguous per position). Unlike convnets, NHWC here is not - //tied to FP16/tensor-cores - the transformer kernels have FP32 paths too. So for transformer models - //force NHWC regardless of the FP16/NHWC-mode decision above, otherwise FP32 (or NHWC=false) would hit - //the "NCHW layout not supported" throw. No effect on convnets. - if(!useNHWC && loadedModel->modelDesc.trunk.hasAnyTransformerBlocks()) { - if(context->useNHWCMode == enabled_t::False) - throw StringError("CUDA backend: transformer models require NHWC, but cudaUseNHWC=false was set"); - useNHWC = true; - } - - if(logger != NULL) { - logger->write( - "Cuda backend thread " + Global::intToString(serverThreadIdx) + ": Found GPU " + string(prop.name) - + " memory " + Global::uint64ToString(prop.totalGlobalMem) - + " compute capability major " + Global::intToString(prop.major) - + " minor " + Global::intToString(prop.minor) - ); - logger->write( - "Cuda backend thread " + Global::intToString(serverThreadIdx) + ": Model version " + Global::intToString(loadedModel->modelDesc.modelVersion) + - " useFP16 = " + Global::boolToString(useFP16) + - " useNHWC = " + Global::boolToString(useNHWC) - ); - logger->write( - "Cuda backend thread " + Global::intToString(serverThreadIdx) + ": Model name: " + loadedModel->modelDesc.name + - " (" + loadedModel->modelDesc.getShortInfoString() + ")" - ); - } - - ComputeHandle* gpuHandle = new ComputeHandle( - context,loadedModel,prop.major,prop.minor,maxBatchSize,requireExactNNLen,inputsUseNHWC,useFP16,useNHWC - ); - gpuHandle->cudaHandles->logger = logger; - gpuHandle->cudaHandles->cudaDisableGraphSDPA = context->cudaDisableGraphSDPA; - return gpuHandle; -} - -void NeuralNet::freeComputeHandle(ComputeHandle* gpuHandle) { - delete gpuHandle; -} - -bool NeuralNet::isUsingFP16(const ComputeHandle* handle) { - return handle->usingFP16; -} - -bool NeuralNet::setIsWarmup(const ComputeHandle* handle, bool isWarmup) { - CudaHandles* cudaHandles = handle->cudaHandles.get(); - bool prev = cudaHandles->isWarmup; - cudaHandles->isWarmup = isWarmup; - return prev; -} - -//------------------------------------------------------------------------------ - -void NeuralNet::printDevices() { - int numDevices = 0; - cudaGetDeviceCount(&numDevices); - for(int i = 0; imodelDesc; - - maxBatchSize = maxBatchSz; - singleInputElts = (size_t)m.numInputChannels * nnXLen * nnYLen; - singleInputBytes = (size_t)m.numInputChannels * nnXLen * nnYLen * sizeof(float); - singleInputGlobalElts = (size_t)m.numInputGlobalChannels; - singleInputGlobalBytes = (size_t)m.numInputGlobalChannels * sizeof(float); - singleInputMetaElts = (size_t)m.numInputMetaChannels; - singleInputMetaBytes = (size_t)m.numInputMetaChannels * sizeof(float); - singlePolicyPassResultElts = (size_t)(m.numPolicyChannels); - singlePolicyPassResultBytes = (size_t)(m.numPolicyChannels) * sizeof(float); - singlePolicyResultElts = (size_t)(m.numPolicyChannels * nnXLen * nnYLen); - singlePolicyResultBytes = (size_t)(m.numPolicyChannels * nnXLen * nnYLen) * sizeof(float); - singleValueResultElts = (size_t)m.numValueChannels; - singleValueResultBytes = (size_t)m.numValueChannels * sizeof(float); - singleScoreValueResultElts = (size_t)m.numScoreValueChannels; - singleScoreValueResultBytes = (size_t)m.numScoreValueChannels * sizeof(float); - singleOwnershipResultElts = (size_t)m.numOwnershipChannels * nnXLen * nnYLen; - singleOwnershipResultBytes = (size_t)m.numOwnershipChannels * nnXLen * nnYLen * sizeof(float); - - testAssert(NNModelVersion::getNumSpatialFeatures(m.modelVersion) == m.numInputChannels); - testAssert(NNModelVersion::getNumGlobalFeatures(m.modelVersion) == m.numInputGlobalChannels); - if(m.numInputMetaChannels > 0) { - testAssert(SGFMetadata::METADATA_INPUT_NUM_CHANNELS == m.numInputMetaChannels); - } - - userInputBufferBytes = (size_t)m.numInputChannels * maxBatchSize * nnXLen * nnYLen * sizeof(float); - userInputGlobalBufferBytes = (size_t)m.numInputGlobalChannels * maxBatchSize * sizeof(float); - userInputMetaBufferBytes = (size_t)m.numInputMetaChannels * maxBatchSize * sizeof(float); - policyPassResultBufferBytes = (size_t)maxBatchSize * m.numPolicyChannels * sizeof(float); - policyResultBufferBytes = (size_t)maxBatchSize * m.numPolicyChannels * nnXLen * nnYLen * sizeof(float); - valueResultBufferBytes = (size_t)maxBatchSize * m.numValueChannels * sizeof(float); - scoreValueResultBufferBytes = (size_t)maxBatchSize * m.numScoreValueChannels * sizeof(float); - ownershipResultBufferBytes = (size_t)maxBatchSize * nnXLen * nnYLen * m.numOwnershipChannels * sizeof(float); - - userInputBuffer = new float[(size_t)m.numInputChannels * maxBatchSize * nnXLen * nnYLen]; - userInputGlobalBuffer = new float[(size_t)m.numInputGlobalChannels * maxBatchSize]; - if(m.numInputMetaChannels > 0) - userInputMetaBuffer = new float[(size_t)m.numInputMetaChannels * maxBatchSize]; - else - userInputMetaBuffer = NULL; - - policyPassResults = new float[(size_t)maxBatchSize * m.numPolicyChannels]; - policyResults = new float[(size_t)maxBatchSize * m.numPolicyChannels * nnXLen * nnYLen]; - valueResults = new float[(size_t)maxBatchSize * m.numValueChannels]; - - scoreValueResults = new float[(size_t)maxBatchSize * m.numScoreValueChannels]; - ownershipResults = new float[(size_t)maxBatchSize * nnXLen * nnYLen * m.numOwnershipChannels]; - } - - ~InputBuffers() { - delete[] userInputBuffer; - delete[] userInputGlobalBuffer; - if(userInputMetaBuffer != NULL) - delete[] userInputMetaBuffer; - delete[] policyPassResults; - delete[] policyResults; - delete[] valueResults; - delete[] scoreValueResults; - delete[] ownershipResults; - } - - InputBuffers() = delete; - InputBuffers(const InputBuffers&) = delete; - InputBuffers& operator=(const InputBuffers&) = delete; - -}; - -InputBuffers* NeuralNet::createInputBuffers(const LoadedModel* loadedModel, int maxBatchSize, int nnXLen, int nnYLen) { - return new InputBuffers(loadedModel,maxBatchSize,nnXLen,nnYLen); -} -void NeuralNet::freeInputBuffers(InputBuffers* inputBuffers) { - delete inputBuffers; -} - -//--------------------------------------------------------------------------------------- - - -void NeuralNet::getOutput( - ComputeHandle* gpuHandle, - InputBuffers* inputBuffers, - int numBatchEltsFilled, - NNResultBuf** inputBufs, - vector& outputs -) { - assert(numBatchEltsFilled <= inputBuffers->maxBatchSize); - assert(numBatchEltsFilled > 0); - const int batchSize = numBatchEltsFilled; - const int nnXLen = gpuHandle->nnXLen; - const int nnYLen = gpuHandle->nnYLen; - const int modelVersion = gpuHandle->model->modelVersion; - - const int numSpatialFeatures = NNModelVersion::getNumSpatialFeatures(modelVersion); - const int numGlobalFeatures = NNModelVersion::getNumGlobalFeatures(modelVersion); - const int numMetaFeatures = inputBuffers->singleInputMetaElts; - assert(numSpatialFeatures == gpuHandle->model->numInputChannels); - assert(numSpatialFeatures * nnXLen * nnYLen == inputBuffers->singleInputElts); - assert(numGlobalFeatures == inputBuffers->singleInputGlobalElts); - const int numPolicyChannels = gpuHandle->model->numPolicyChannels; - - for(int nIdx = 0; nIdxuserInputBuffer + (inputBuffers->singleInputElts * nIdx); - float* rowGlobalInput = inputBuffers->userInputGlobalBuffer + (inputBuffers->singleInputGlobalElts * nIdx); - float* rowMetaInput = inputBuffers->userInputMetaBuffer + (inputBuffers->singleInputMetaElts * nIdx); - - const float* rowGlobal = inputBufs[nIdx]->rowGlobalBuf.data(); - const float* rowSpatial = inputBufs[nIdx]->rowSpatialBuf.data(); - const float* rowMeta = inputBufs[nIdx]->rowMetaBuf.data(); - bool hasRowMeta = inputBufs[nIdx]->hasRowMeta; - std::copy(rowGlobal,rowGlobal+numGlobalFeatures,rowGlobalInput); - if(numMetaFeatures > 0) { - testAssert(rowMeta != NULL); - testAssert(hasRowMeta); - std::copy(rowMeta,rowMeta+numMetaFeatures,rowMetaInput); - } - else { - testAssert(!hasRowMeta); - } - SymmetryHelpers::copyInputsWithSymmetry(rowSpatial, rowSpatialInput, 1, nnYLen, nnXLen, numSpatialFeatures, gpuHandle->inputsUseNHWC, inputBufs[nIdx]->symmetry); - } - - Buffers* buffers = gpuHandle->buffers.get(); - ScratchBuffers* scratch = gpuHandle->scratch.get(); - - if(!gpuHandle->usingFP16) { - assert(inputBuffers->userInputBufferBytes == buffers->inputBufBytes); - assert(inputBuffers->userInputGlobalBufferBytes == buffers->inputGlobalBufBytes); - assert(inputBuffers->userInputMetaBufferBytes == buffers->inputMetaBufBytes); - assert(inputBuffers->policyPassResultBufferBytes == buffers->policyPassBufBytes); - assert(inputBuffers->policyResultBufferBytes == buffers->policyBufBytes); - assert(inputBuffers->valueResultBufferBytes == buffers->valueBufBytes); - assert(inputBuffers->singleInputBytes == inputBuffers->singleInputElts*4); - assert(inputBuffers->singleInputGlobalBytes == inputBuffers->singleInputGlobalElts*4); - assert(inputBuffers->singleInputMetaBytes == inputBuffers->singleInputMetaElts*4); - assert(inputBuffers->singlePolicyPassResultElts == numPolicyChannels); - assert(inputBuffers->singlePolicyPassResultBytes == numPolicyChannels * sizeof(float)); - assert(inputBuffers->singlePolicyResultElts == numPolicyChannels*nnXLen*nnYLen); - assert(inputBuffers->singlePolicyResultBytes == numPolicyChannels*nnXLen*nnYLen * sizeof(float)); - assert(inputBuffers->scoreValueResultBufferBytes == buffers->scoreValueBufBytes); - assert(inputBuffers->ownershipResultBufferBytes == buffers->ownershipBufBytes); - assert(inputBuffers->singleOwnershipResultElts == nnXLen*nnYLen); - assert(inputBuffers->singleOwnershipResultBytes == nnXLen*nnYLen * sizeof(float)); - - CUDA_ERR("getOutput",cudaMemcpy(buffers->inputBuf, inputBuffers->userInputBuffer, inputBuffers->singleInputBytes*batchSize, cudaMemcpyHostToDevice)); - CUDA_ERR("getOutput",cudaMemcpy(buffers->inputGlobalBuf, inputBuffers->userInputGlobalBuffer, inputBuffers->singleInputGlobalBytes*batchSize, cudaMemcpyHostToDevice)); - if(numMetaFeatures > 0) { - CUDA_ERR("getOutput",cudaMemcpy(buffers->inputMetaBuf, inputBuffers->userInputMetaBuffer, inputBuffers->singleInputMetaBytes*batchSize, cudaMemcpyHostToDevice)); - } - } - else { - assert(inputBuffers->userInputBufferBytes == buffers->inputBufBytesFloat); - assert(inputBuffers->userInputGlobalBufferBytes == buffers->inputGlobalBufBytesFloat); - assert(inputBuffers->userInputMetaBufferBytes == buffers->inputMetaBufBytesFloat); - assert(inputBuffers->policyResultBufferBytes == buffers->policyBufBytes); - assert(inputBuffers->valueResultBufferBytes == buffers->valueBufBytes); - assert(inputBuffers->userInputBufferBytes == buffers->inputBufBytes*2); - assert(inputBuffers->userInputGlobalBufferBytes == buffers->inputGlobalBufBytes*2); - assert(inputBuffers->userInputMetaBufferBytes == buffers->inputMetaBufBytes*2); - assert(inputBuffers->singleInputBytes == inputBuffers->singleInputElts*4); - assert(inputBuffers->singleInputGlobalBytes == inputBuffers->singleInputGlobalElts*4); - assert(inputBuffers->singleInputMetaBytes == inputBuffers->singleInputMetaElts*4); - assert(inputBuffers->singlePolicyPassResultElts == numPolicyChannels); - assert(inputBuffers->singlePolicyPassResultBytes == numPolicyChannels * sizeof(float)); - assert(inputBuffers->singlePolicyResultElts == numPolicyChannels*nnXLen*nnYLen); - assert(inputBuffers->singlePolicyResultBytes == numPolicyChannels*nnXLen*nnYLen * sizeof(float)); - assert(inputBuffers->scoreValueResultBufferBytes == buffers->scoreValueBufBytes); - assert(inputBuffers->ownershipResultBufferBytes == buffers->ownershipBufBytes); - assert(inputBuffers->singleOwnershipResultElts == nnXLen*nnYLen); - assert(inputBuffers->singleOwnershipResultBytes == nnXLen*nnYLen * sizeof(float)); - - CUDA_ERR("getOutput",cudaMemcpy(buffers->inputBufFloat, inputBuffers->userInputBuffer, inputBuffers->singleInputBytes*batchSize, cudaMemcpyHostToDevice)); - CUDA_ERR("getOutput",cudaMemcpy(buffers->inputGlobalBufFloat, inputBuffers->userInputGlobalBuffer, inputBuffers->singleInputGlobalBytes*batchSize, cudaMemcpyHostToDevice)); - if(numMetaFeatures > 0) { - CUDA_ERR("getOutput",cudaMemcpy(buffers->inputMetaBufFloat, inputBuffers->userInputMetaBuffer, inputBuffers->singleInputMetaBytes*batchSize, cudaMemcpyHostToDevice)); - } - - customCudaCopyToHalf((const float*)buffers->inputBufFloat,(half*)buffers->inputBuf,inputBuffers->singleInputElts*batchSize); - CUDA_ERR("getOutput",cudaPeekAtLastError()); - customCudaCopyToHalf((const float*)buffers->inputGlobalBufFloat,(half*)buffers->inputGlobalBuf,inputBuffers->singleInputGlobalElts*batchSize); - CUDA_ERR("getOutput",cudaPeekAtLastError()); - if(numMetaFeatures > 0) { - customCudaCopyToHalf((const float*)buffers->inputMetaBufFloat,(half*)buffers->inputMetaBuf,inputBuffers->singleInputMetaElts*batchSize); - CUDA_ERR("getOutput",cudaPeekAtLastError()); - } - } - - gpuHandle->model->apply( - gpuHandle->cudaHandles.get(), - scratch, - batchSize, - gpuHandle->requireExactNNLen, - - buffers->inputBuf, - buffers->inputGlobalBuf, - buffers->inputMetaBuf, - - buffers->policyPassBuf, - buffers->policyBuf, - - buffers->valueBuf, - buffers->scoreValueBuf, - buffers->ownershipBuf, - - buffers->workspaceBuf, - buffers->workspaceBytes - ); - - CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->policyPassResults, buffers->policyPassBuf, inputBuffers->singlePolicyPassResultBytes*batchSize, cudaMemcpyDeviceToHost)); - CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->policyResults, buffers->policyBuf, inputBuffers->singlePolicyResultBytes*batchSize, cudaMemcpyDeviceToHost)); - CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->valueResults, buffers->valueBuf, inputBuffers->singleValueResultBytes*batchSize, cudaMemcpyDeviceToHost)); - CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->scoreValueResults, buffers->scoreValueBuf, inputBuffers->singleScoreValueResultBytes*batchSize, cudaMemcpyDeviceToHost)); - CUDA_ERR("getOutput",cudaMemcpy(inputBuffers->ownershipResults, buffers->ownershipBuf, inputBuffers->singleOwnershipResultBytes*batchSize, cudaMemcpyDeviceToHost)); - - assert(outputs.size() == batchSize); - - float policyProbsTmp[NNPos::MAX_NN_POLICY_SIZE]; - - for(int row = 0; row < batchSize; row++) { - NNOutput* output = outputs[row]; - assert(output->nnXLen == nnXLen); - assert(output->nnYLen == nnYLen); - float policyOptimism = (float)inputBufs[row]->policyOptimism; - - const float* policyPassSrcBuf = inputBuffers->policyPassResults + row * numPolicyChannels; - const float* policySrcBuf = inputBuffers->policyResults + row * numPolicyChannels * nnXLen * nnYLen; - float* policyProbs = output->policyProbs; - - // These are in logits, the client does the postprocessing to turn them into - // policy probabilities and white game outcome probabilities - // Also we don't fill in the nnHash here either - // Handle version >= 12 policy optimism - if(numPolicyChannels == 2 || (numPolicyChannels == 4 && modelVersion >= 16)) { - if(gpuHandle->usingNHWC) { - for(int i = 0; isymmetry); - policyProbs[nnXLen*nnYLen] = policyPassSrcBuf[0] + (policyPassSrcBuf[1] - policyPassSrcBuf[0]) * policyOptimism; - } - else { - for(int i = 0; isymmetry); - policyProbs[nnXLen*nnYLen] = policyPassSrcBuf[0] + (policyPassSrcBuf[1] - policyPassSrcBuf[0]) * policyOptimism; - } - } - else { - assert(numPolicyChannels == 1); - SymmetryHelpers::copyOutputsWithSymmetry(policySrcBuf, policyProbs, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); - policyProbs[nnXLen*nnYLen] = policyPassSrcBuf[0]; - } - - int numValueChannels = gpuHandle->model->numValueChannels; - assert(numValueChannels == 3); - output->whiteWinProb = inputBuffers->valueResults[row * numValueChannels]; - output->whiteLossProb = inputBuffers->valueResults[row * numValueChannels + 1]; - output->whiteNoResultProb = inputBuffers->valueResults[row * numValueChannels + 2]; - - //As above, these are NOT actually from white's perspective, but rather the player to move. - //As usual the client does the postprocessing. - if(output->whiteOwnerMap != NULL) { - const float* ownershipSrcBuf = inputBuffers->ownershipResults + row * nnXLen * nnYLen; - assert(gpuHandle->model->numOwnershipChannels == 1); - SymmetryHelpers::copyOutputsWithSymmetry(ownershipSrcBuf, output->whiteOwnerMap, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); - } - - if(modelVersion >= 9) { - int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; - assert(numScoreValueChannels == 6); - output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; - output->whiteScoreMeanSq = inputBuffers->scoreValueResults[row * numScoreValueChannels + 1]; - output->whiteLead = inputBuffers->scoreValueResults[row * numScoreValueChannels + 2]; - output->varTimeLeft = inputBuffers->scoreValueResults[row * numScoreValueChannels + 3]; - output->shorttermWinlossError = inputBuffers->scoreValueResults[row * numScoreValueChannels + 4]; - output->shorttermScoreError = inputBuffers->scoreValueResults[row * numScoreValueChannels + 5]; - } - else if(modelVersion >= 8) { - int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; - assert(numScoreValueChannels == 4); - output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; - output->whiteScoreMeanSq = inputBuffers->scoreValueResults[row * numScoreValueChannels + 1]; - output->whiteLead = inputBuffers->scoreValueResults[row * numScoreValueChannels + 2]; - output->varTimeLeft = inputBuffers->scoreValueResults[row * numScoreValueChannels + 3]; - output->shorttermWinlossError = 0; - output->shorttermScoreError = 0; - } - else if(modelVersion >= 4) { - int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; - assert(numScoreValueChannels == 2); - output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; - output->whiteScoreMeanSq = inputBuffers->scoreValueResults[row * numScoreValueChannels + 1]; - output->whiteLead = output->whiteScoreMean; - output->varTimeLeft = 0; - output->shorttermWinlossError = 0; - output->shorttermScoreError = 0; - } - else if(modelVersion >= 3) { - int numScoreValueChannels = gpuHandle->model->numScoreValueChannels; - assert(numScoreValueChannels == 1); - output->whiteScoreMean = inputBuffers->scoreValueResults[row * numScoreValueChannels]; - //Version 3 neural nets don't have any second moment output, implicitly already folding it in, so we just use the mean squared - output->whiteScoreMeanSq = output->whiteScoreMean * output->whiteScoreMean; - output->whiteLead = output->whiteScoreMean; - output->varTimeLeft = 0; - output->shorttermWinlossError = 0; - output->shorttermScoreError = 0; - } - else { - ASSERT_UNREACHABLE; - } - } - -} - -//TESTING ---------------------------------------------------------------------------------- - - -bool NeuralNet::testEvaluateConv( - const ConvLayerDesc* desc, - int desiredBatchSize, - int nnXLen, - int nnYLen, - bool useFP16, - bool useNHWC, - const vector& inputBuffer, - vector& outputBuffer -) { - cudaDeviceSynchronize(); - CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); - - size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->inChannels; - size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->outChannels; - if(numInputFloats != inputBuffer.size()) - throw StringError("testEvaluateConv: unexpected input buffer size"); - - void* deviceInput; - void* deviceOutput; - CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); - CudaUtils::mallocOnDevice("deviceOutput", numOutputFloats, deviceOutput, useFP16); - - int maxBatchSize = desiredBatchSize; - - CudnnManager* manager = new CudnnManager("manager",maxBatchSize,nnXLen,nnYLen); - ConvLayer* convLayer = new ConvLayer(cudaHandles,manager,desc,useFP16,useNHWC); - - size_t workspaceBytes = - convLayer->requiredWorkspaceBytes(cudaHandles,desiredBatchSize); - void* deviceWorkspace; - CUDA_ERR("deviceWorkspace",cudaMalloc(&deviceWorkspace, workspaceBytes)); - - - bool accumulate = false; - convLayer->apply( - cudaHandles, - desiredBatchSize, - accumulate, - deviceInput, - deviceOutput, - deviceWorkspace, - workspaceBytes - ); - - outputBuffer.resize(numOutputFloats); - CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceOutput, useFP16); - - cudaFree(deviceWorkspace); - - delete convLayer; - delete manager; - cudaFree(deviceInput); - cudaFree(deviceOutput); - delete cudaHandles; - - return true; -} - - -bool NeuralNet::testEvaluateBatchNorm( - const BatchNormLayerDesc* desc, - int desiredBatchSize, - int nnXLen, - int nnYLen, - bool useFP16, - bool useNHWC, - const vector& inputBuffer, - const vector& maskBuffer, - vector& outputBuffer -) { - cudaDeviceSynchronize(); - CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); - - size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->numChannels; - size_t numMaskFloats = (size_t)desiredBatchSize * nnXLen * nnYLen; - size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->numChannels; - if(numInputFloats != inputBuffer.size()) - throw StringError("testEvaluateBatchNorm: unexpected input buffer size"); - if(numMaskFloats != maskBuffer.size()) - throw StringError("testEvaluateBatchNorm: unexpected mask buffer size"); - - ActivationLayerDesc actDesc; - actDesc.activation = ACTIVATION_IDENTITY; - - void* deviceInput; - void* deviceMask; - void* deviceOutput; - CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); - CudaUtils::mallocAndCopyToDevice("deviceMask", maskBuffer.data(), numMaskFloats, deviceMask, useFP16); - CudaUtils::mallocOnDevice("deviceOutput", numOutputFloats, deviceOutput, useFP16); - - BatchNormLayer* batchNormLayer = new BatchNormLayer(cudaHandles,desc,&actDesc,nnXLen,nnYLen,useFP16,useNHWC); - - batchNormLayer->apply( - cudaHandles, - desiredBatchSize, - deviceInput, - deviceMask, - deviceOutput - ); - - outputBuffer.resize(numOutputFloats); - CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceOutput, useFP16); - - delete batchNormLayer; - - cudaFree(deviceInput); - cudaFree(deviceMask); - cudaFree(deviceOutput); - delete cudaHandles; - - return true; -} - - -bool NeuralNet::testEvaluateResidualBlock( - const ResidualBlockDesc* desc, - int desiredBatchSize, - int nnXLen, - int nnYLen, - bool useFP16, - bool useNHWC, - const vector& inputBuffer, - const vector& maskBuffer, - vector& outputBuffer -) { - cudaDeviceSynchronize(); - CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); - - size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->preBN.numChannels; - size_t numMaskFloats = (size_t)desiredBatchSize * nnXLen * nnYLen; - size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->finalConv.outChannels; - if(numInputFloats != inputBuffer.size()) - throw StringError("testEvaluateResidualBlock: unexpected input buffer size"); - if(numMaskFloats != maskBuffer.size()) - throw StringError("testEvaluateResidualBlock: unexpected mask buffer size"); - - ScratchBuffers* scratch = new ScratchBuffers(desiredBatchSize, nnXLen, nnYLen, useFP16); - - void* deviceInput; - void* deviceMask; - void* deviceScratch; - CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); - CudaUtils::mallocAndCopyToDevice("deviceMask", maskBuffer.data(), numMaskFloats, deviceMask, useFP16); - CudaUtils::mallocOnDevice("deviceScratch", numInputFloats, deviceScratch, useFP16); - - int maxBatchSize = desiredBatchSize; - - CudnnManager* manager = new CudnnManager("manager",maxBatchSize,nnXLen,nnYLen); - ResidualBlock* residualBlock = new ResidualBlock(cudaHandles,manager,desc,nnXLen,nnYLen,useFP16,useNHWC); - - size_t workspaceBytes = - residualBlock->requiredWorkspaceBytes(cudaHandles,desiredBatchSize); - void* deviceWorkspace; - CUDA_ERR("deviceWorkspace",cudaMalloc(&deviceWorkspace, workspaceBytes)); - - residualBlock->apply( - cudaHandles, - scratch, - desiredBatchSize, - deviceInput, - deviceScratch, - deviceMask, - deviceWorkspace, - workspaceBytes - ); - - outputBuffer.resize(numOutputFloats); - CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceInput, useFP16); - - cudaFree(deviceWorkspace); - - delete residualBlock; - delete manager; - cudaFree(deviceInput); - cudaFree(deviceMask); - cudaFree(deviceScratch); - delete scratch; - delete cudaHandles; - - return true; -} - -bool NeuralNet::testEvaluateGlobalPoolingResidualBlock( - const GlobalPoolingResidualBlockDesc* desc, - int desiredBatchSize, - int nnXLen, - int nnYLen, - bool useFP16, - bool useNHWC, - const vector& inputBuffer, - const vector& maskBuffer, - vector& outputBuffer -) { - cudaDeviceSynchronize(); - CudaHandles* cudaHandles = CudaHandles::cudaHandlesTesting(); - - size_t numInputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->preBN.numChannels; - size_t numMaskFloats = (size_t)desiredBatchSize * nnXLen * nnYLen; - size_t numMaskSumFloats = (size_t)desiredBatchSize; - size_t numOutputFloats = (size_t)desiredBatchSize * nnXLen * nnYLen * desc->finalConv.outChannels; - - if(numInputFloats != inputBuffer.size()) - throw StringError("testEvaluateGlobalPoolingResidualBlock: unexpected input buffer size"); - if(numMaskFloats != maskBuffer.size()) - throw StringError("testEvaluateGlobalPoolingResidualBlock: unexpected mask buffer size"); - - ScratchBuffers* scratch = new ScratchBuffers(desiredBatchSize, nnXLen, nnYLen, useFP16); - - void* deviceInput; - void* deviceMask; - float* deviceMaskFloatOrig; - float* deviceMaskFloat; - float* deviceMaskSum; - void* deviceScratch; - - CudaUtils::mallocAndCopyToDevice("deviceInput", inputBuffer.data(), numInputFloats, deviceInput, useFP16); - CudaUtils::mallocAndCopyToDevice("deviceMask", maskBuffer.data(), numMaskFloats, deviceMask, useFP16); - CUDA_ERR("deviceMaskFloat",cudaMalloc(reinterpret_cast(&deviceMaskFloat), numMaskFloats * sizeof(float))); - CUDA_ERR("deviceMaskSum",cudaMalloc(reinterpret_cast(&deviceMaskSum), numMaskSumFloats * sizeof(float))); - deviceMaskFloatOrig = deviceMaskFloat; - CudaUtils::mallocOnDevice("deviceScratch", numInputFloats, deviceScratch, useFP16); - - fillMaskFloatBufAndMaskSumBuf(deviceMask, deviceMaskFloat, deviceMaskSum, useFP16, desiredBatchSize, nnXLen, nnYLen); - - int maxBatchSize = desiredBatchSize; - - CudnnManager* manager = new CudnnManager("manager",maxBatchSize,nnXLen,nnYLen); - GlobalPoolingResidualBlock* residualBlock = new GlobalPoolingResidualBlock( - cudaHandles,manager,desc,nnXLen,nnYLen,useFP16,useNHWC - ); - - size_t workspaceBytes = - residualBlock->requiredWorkspaceBytes( - cudaHandles,desiredBatchSize - ); - - void* deviceWorkspace; - CUDA_ERR("deviceWorkspace",cudaMalloc(&deviceWorkspace, workspaceBytes)); - - residualBlock->apply( - cudaHandles, - scratch, - desiredBatchSize, - deviceInput, - deviceScratch, - deviceMask, - deviceMaskSum, - deviceWorkspace, - workspaceBytes - ); - - outputBuffer.resize(numOutputFloats); - CudaUtils::expensiveCopyFromDevice("copyResultsToHost", outputBuffer.data(), numOutputFloats, deviceInput, useFP16); - - cudaFree(deviceWorkspace); - - delete residualBlock; - delete manager; - - cudaFree(deviceInput); - cudaFree(deviceMask); - cudaFree(deviceMaskFloatOrig); - cudaFree(deviceMaskSum); - cudaFree(deviceScratch); - delete scratch; - delete cudaHandles; - - return true; -} +// Element type that cublasHgemm expects buffers to be cast to. +using cublas_half_t = half; +#include "../neuralnet/cudaandrocmbackend.inc" #endif // USE_CUDA_BACKEND diff --git a/cpp/neuralnet/cudahelpers.cu b/cpp/neuralnet/cudahelpers.cu index 3308ef1115..ec4d60036d 100644 --- a/cpp/neuralnet/cudahelpers.cu +++ b/cpp/neuralnet/cudahelpers.cu @@ -1,3579 +1,16 @@ +// CUDA wrapper for the shared CUDA/ROCm GPU kernels. +// All kernel code lives in cudaandrocmhelpers.inc, which is shared with the ROCm backend +// (rocmhelpers.hip). See the comment at the top of that file for the macro contract. #include "../neuralnet/cudahelpers.h" -#include -#include -#include - +// Evaluated per device architecture during nvcc's per-arch device compilation passes, so the +// half-precision kernel bodies are compiled exactly for the archs that support them. #if __CUDA_ARCH__ >= 530 -#define CUDA_SUPPORTS_FP16 -#endif - -//TODO maybe tune this number, it varies by GPU -static const int targetNumThreads = 512; - -// The custom kernels below compute flattened element indices in 32-bit int (e.g. -// (n*cSize+c)*xySize+xy). For every board/batch/channel size KataGo actually runs this stays well -// under INT_MAX, but an extreme size would silently overflow into out-of-bounds memory access rather -// than fail cleanly. Guard the launchers: throw loudly if the total element count (the largest index -// any kernel here forms) does not fit in a positive int. Takes the dimensions as int64 so the -// product itself can't overflow during the check. -static void checkBufferIndexFitsInt(int64_t a, int64_t b, int64_t c, const char* whatKernel) { - int64_t total = a * b * c; - if(total >= (int64_t)2147483647) // INT_MAX; indices range over [0,total) so total itself must fit - throw std::runtime_error( - std::string(whatKernel) + ": total element count " + std::to_string(total) + - " exceeds the 32-bit index limit used by this kernel"); -} - -void splitThreadsAcrossDim01(int dim0Size, int dim1Size, int& threads0, int& blocks0, int& threads1, int& blocks1) { - if(dim0Size > targetNumThreads) { - threads0 = targetNumThreads/2; - blocks0 = (dim0Size + threads0 - 1) / threads0; - threads1 = 1; - blocks1 = dim1Size; - } - else if(dim0Size > targetNumThreads/2) { - threads0 = dim0Size; - blocks0 = 1; - threads1 = 1; - blocks1 = dim1Size; - } - else { - threads0 = dim0Size; - blocks0 = 1; - threads1 = targetNumThreads / dim0Size; - blocks1 = (dim1Size + threads1 - 1) / threads1; - } -} - -__forceinline__ __device__ float mishf(float a) { - return a * tanhf(a < 20.0f ? log1pf(expf(a)) : a); -} -__forceinline__ __device__ float mishf_scale8(float a) { - return a < 2.5f ? a * tanhf(log1pf(expf(a*8.0f))) : a; -} - -#ifdef CUDA_SUPPORTS_FP16 -__forceinline__ __device__ half mishh(half h) { - float a = __half2float(h); - return __float2half(a * tanhf(a < 20.0f ? log1pf(expf(a)) : a)); -} -__forceinline__ __device__ half mishh_scale8(half h) { - float a = __half2float(h); - return __float2half(a < 2.5f ? a * tanhf(log1pf(expf(a*8.0f))) : a); -} -__forceinline__ __device__ half siluh(half h) { - float a = __half2float(h); - return __float2half(a / (1.0f + expf(-a))); -} -#endif - -__forceinline__ __device__ float siluf(float x) { - return x / (1.0f + expf(-x)); -} - -//-------------------------------------------------------------------------------------------------------------- - -template -__global__ -void channelConcatKernel( - const T* inA, - const T* inB, - T* out, - int chwA, - int chwB, - int numBlocksA, - int numBlocksB, - int n -) { - if(blockIdx.x < numBlocksA) { - int index = blockIdx.x * blockDim.x + threadIdx.x; - if(index < chwA) { - int nchwA = n*chwA; - int chwOut = (chwA+chwB); - - int aIdx = index; - int outIdx = index; - while(aIdx < nchwA) { - out[outIdx] = inA[aIdx]; - aIdx += chwA; - outIdx += chwOut; - } - } - } - else { - int index = (blockIdx.x - numBlocksA) * blockDim.x + threadIdx.x; - if(index < chwB) { - int nchwB = n*chwB; - int chwOut = (chwA+chwB); - - int bIdx = index; - int outIdx = chwA+index; - while(bIdx < nchwB) { - out[outIdx] = inB[bIdx]; - bIdx += chwB; - outIdx += chwOut; - } - } - } -} - -template -void customCudaChannelConcatTemplate(const T* inA, const T* inB, T* out, int chwA, int chwB, int n) { - int blockSize = targetNumThreads; - int numBlocksA = (chwA + blockSize-1) / blockSize; - int numBlocksB = (chwB + blockSize-1) / blockSize; - int numBlocks = numBlocksA + numBlocksB; - channelConcatKernel<<>>(inA,inB,out,chwA,chwB,numBlocksA,numBlocksB,n); -} -template void customCudaChannelConcatTemplate(const float* inA, const float* inB, float* out, int chwA, int chwB, int n); -template void customCudaChannelConcatTemplate(const half* inA, const half* inB, half* out, int chwA, int chwB, int n); - -void customCudaChannelConcat(const float* inA, const float* inB, float* out, int chwA, int chwB, int n) { - customCudaChannelConcatTemplate(inA,inB,out,chwA,chwB,n); -} -void customCudaChannelConcat(const half* inA, const half* inB, half* out, int chwA, int chwB, int n) { - customCudaChannelConcatTemplate(inA,inB,out,chwA,chwB,n); -} - -//-------------------------------------------------------------------------------------------------------------- - -template -__global__ -void extractChannel0KernelNHWC(const T *in, T* out, int nhwSize, int cSize) -{ - int nhwIdx = blockIdx.x * blockDim.x + threadIdx.x; - if(nhwIdx < nhwSize) { - out[nhwIdx] = in[nhwIdx*cSize]; - } -} -template -void customCudaChannel0ExtractNHWCTemplate(const T *in, T* out, int n, int hw, int c) { - int nhw = n*hw; - int blockSize = targetNumThreads; - int numBlocks = (nhw+blockSize-1)/blockSize; - extractChannel0KernelNHWC<<>>(in,out,nhw,c); -} - -template -__global__ -void extractChannel0KernelNCHW(const T *in, T* out, int nSize, int cSize, int hwSize) -{ - int hwIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(hwIdx < hwSize && nIdx < nSize) { - out[nIdx * hwSize + hwIdx] = in[nIdx * cSize * hwSize + hwIdx]; - } -} -template -void customCudaChannel0ExtractNCHWTemplate(const T *in, T* out, int nSize, int cSize, int hwSize) { - int hwThreads; - int hwBlocks; - int nThreads; - int nBlocks; - splitThreadsAcrossDim01(hwSize, nSize, hwThreads, hwBlocks, nThreads, nBlocks); - - if(nBlocks > 65536) - throw std::runtime_error("customCudaChannel0ExtractNCHW: nSize too large given hwSize"); - - dim3 grid(hwBlocks,nBlocks,1); - dim3 threads(hwThreads,nThreads,1); - extractChannel0KernelNCHW<<>>(in,out,nSize,cSize,hwSize); -} - -void customCudaChannel0ExtractNCHW(const float* in, float* out, int n, int c, int hw) { - customCudaChannel0ExtractNCHWTemplate(in,out,n,c,hw); -} -void customCudaChannel0ExtractNCHW(const half* in, half* out, int n, int c, int hw) { - customCudaChannel0ExtractNCHWTemplate(in,out,n,c,hw); -} -void customCudaChannel0ExtractNHWC(const float* in, float* out, int n, int hw, int c) { - customCudaChannel0ExtractNHWCTemplate(in,out,n,hw,c); -} -void customCudaChannel0ExtractNHWC(const half* in, half* out, int n, int hw, int c) { - customCudaChannel0ExtractNHWCTemplate(in,out,n,hw,c); -} - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void sumChannelsNCHWKernel(const float* in, float* out, int cSize, int xySize, float scaleSum) -{ - extern __shared__ float sumPoolNCHWShared[]; - int xyId = threadIdx.x; - int xyBlockDim = blockDim.x; - int cId = threadIdx.y; - int cBlockDim = blockDim.y; - int cIdx = blockIdx.y * cBlockDim + cId; - int nIdx = blockIdx.z; - - int xycSize = xySize*cSize; - int sharedIdx = xyId + cId * xyBlockDim; - - float acc = 0.0f; - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - acc += in[xyIdx + cIdx * xySize + nIdx * xycSize]; - xyIdx += xyBlockDim; - } - sumPoolNCHWShared[sharedIdx] = acc; - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumPoolNCHWShared[sharedIdx] += sumPoolNCHWShared[sharedIdx + s]; - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) - out[cIdx + nIdx * cSize] = sumPoolNCHWShared[sharedIdx] * scaleSum; -} -__global__ -void valueHeadPoolChannelsNCHWKernel(const float* in, float* out, int nSize, int cSize, int xySize, const float* maskSum) -{ - extern __shared__ float sumPoolNCHWShared[]; - int xyId = threadIdx.x; - int xyBlockDim = blockDim.x; - int cId = threadIdx.y; - int cBlockDim = blockDim.y; - int cIdx = blockIdx.y * cBlockDim + cId; - int nIdx = blockIdx.z; - - int xycSize = xySize*cSize; - int sharedIdx = xyId + cId * xyBlockDim; - - float acc = 0.0f; - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - acc += in[xyIdx + cIdx * xySize + nIdx * xycSize]; - xyIdx += xyBlockDim; - } - sumPoolNCHWShared[sharedIdx] = acc; - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumPoolNCHWShared[sharedIdx] += sumPoolNCHWShared[sharedIdx + s]; - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumPoolNCHWShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - out[cIdx + nIdx * cSize*3] = mean; - out[cIdx + nIdx * cSize*3 + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; - out[cIdx + nIdx * cSize*3 + cSize*2] = mean * ((sqrtdiv - 14.0f) * (sqrtdiv - 14.0f) * 0.01f - 0.1f); - } -} -__global__ -void gPoolChannelsNCHWKernel(const float* in, float* out, int cSize, int xySize, const float* maskSum, int sharedMemElts) -{ - extern __shared__ float poolNCHWShared[]; - float* sumShared = (float*)poolNCHWShared; - float* maxShared = (float*)poolNCHWShared + sharedMemElts; - - int xyId = threadIdx.x; - int xyBlockDim = blockDim.x; - int cId = threadIdx.y; - int cBlockDim = blockDim.y; - int cIdx = blockIdx.y * cBlockDim + cId; - int nIdx = blockIdx.z; - - int xycSize = xySize*cSize; - int sharedIdx = xyId + cId * xyBlockDim; - - if(cIdx < cSize) { - float accSum = 0.0f; - float accMax = -1.0f; - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = in[xyIdx + cIdx * xySize + nIdx * xycSize]; - accSum += a; - accMax = fmaxf(accMax, a); - xyIdx += xyBlockDim; - } - sumShared[sharedIdx] = accSum; - maxShared[sharedIdx] = accMax; - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = mean; - out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; - out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; - } -} -__global__ -void gPoolChannelsNCHWMaskKernel(const float* in, float* out, int cSize, int xySize, const float* mask, const float* maskSum, int sharedMemElts) -{ - extern __shared__ float poolNCHWShared[]; - float* sumShared = (float*)poolNCHWShared; - float* maxShared = (float*)poolNCHWShared + sharedMemElts; - - int xyId = threadIdx.x; - int xyBlockDim = blockDim.x; - int cId = threadIdx.y; - int cBlockDim = blockDim.y; - int cIdx = blockIdx.y * cBlockDim + cId; - int nIdx = blockIdx.z; - - int xycSize = xySize*cSize; - int sharedIdx = xyId + cId * xyBlockDim; - - if(cIdx < cSize) { - float accSum = 0.0f; - float accMax = -1.0f; - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = in[xyIdx + cIdx * xySize + nIdx * xycSize]; - accSum += a; - // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 - // which is lower than the lowest value that any current activation function will produce. - // so the max over all valid spaces will the same as the mask over all spaces including padding - // We're relying on all padded space being equal to 0 because this gpool only ever follows a BN+Activate with a mask. - accMax = fmaxf(accMax, a + (mask[xyIdx + nIdx * xySize] - 1.0f)); - xyIdx += xyBlockDim; - } - sumShared[sharedIdx] = accSum; - maxShared[sharedIdx] = accMax; - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = mean; - out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; - out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; - } -} - -void customCudaPoolRowsSumNCHW(const float* in, float* out, int nSize, int cSize, int xySize, float scaleSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaPoolRowsSumNCHW: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaPoolRowsSumNCHW: cSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaPoolRowsSumNCHW"); - - //Use up as many threads as possible along the xy dimension. - int xyThreads = 1; - while(xyThreads < targetNumThreads && xyThreads < xySize/2) - xyThreads *= 2; - - //Distribute the extra threads along the c dimension. - int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //We need one shared memory spot per thread - int sharedMemSize = sizeof(float) * cThreads * xyThreads; - - dim3 grid(1,cBlocks,nSize); - dim3 threads(xyThreads,cThreads,1); - sumChannelsNCHWKernel<<>>(in,out,cSize,xySize,scaleSum); -} -void customCudaValueHeadPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* maskSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaValueHeadPoolNCHW: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaValueHeadPoolNCHW: cSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaValueHeadPoolNCHW"); - - //Use up as many threads as possible along the xy dimension. - int xyThreads = 1; - while(xyThreads < targetNumThreads && xyThreads < xySize/2) - xyThreads *= 2; - - //Distribute the extra threads along the c dimension. - int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //We need one shared memory spot per thread - int sharedMemSize = sizeof(float) * cThreads * xyThreads; - - dim3 grid(1,cBlocks,nSize); - dim3 threads(xyThreads,cThreads,1); - valueHeadPoolChannelsNCHWKernel<<>>(in,out,nSize,cSize,xySize,maskSum); -} -void customCudaPoolRowsGPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* mask, const float* maskSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNCHW: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNCHW: cSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaPoolRowsGPoolNCHW"); - - //Use up as many threads as possible along the xy dimension. - int xyThreads = 1; - while(xyThreads < targetNumThreads && xyThreads < xySize/2) - xyThreads *= 2; - - //Distribute the extra threads along the c dimension. - int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //We need one shared memory spot per thread, and then we double it because we need both sum and max. - //We also make sure it's a power of two to address any alignment concerns. - int sharedMemElts = 128; - while(sharedMemElts < cThreads * xyThreads) - sharedMemElts *= 2; - int sharedMemSize = sizeof(float) * sharedMemElts * 2; - - dim3 grid(1,cBlocks,nSize); - dim3 threads(xyThreads,cThreads,1); - if(mask != NULL) - gPoolChannelsNCHWMaskKernel<<>>(in,out,cSize,xySize,mask,maskSum,sharedMemElts); - else - gPoolChannelsNCHWKernel<<>>(in,out,cSize,xySize,maskSum,sharedMemElts); -} - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void gPoolChannelsNCHWHalfKernel(const half* in, half* out, int cSize, int xySize, const float* maskSum, int sharedMemElts) -{ -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float poolNCHWShared[]; - float* sumShared = (float*)poolNCHWShared; - float* maxShared = (float*)poolNCHWShared + sharedMemElts; - - int xyId = threadIdx.x; - int xyBlockDim = blockDim.x; - int cId = threadIdx.y; - int cBlockDim = blockDim.y; - int cIdx = blockIdx.y * cBlockDim + cId; - int nIdx = blockIdx.z; - - int xycSize = xySize*cSize; - int sharedIdx = xyId + cId * xyBlockDim; - - if(cIdx < cSize) { - float accSum = 0.0f; - float accMax = -1.0f; - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = __half2float(in[xyIdx + cIdx * xySize + nIdx * xycSize]); - accSum += a; - accMax = fmaxf(accMax, a); - xyIdx += xyBlockDim; - } - sumShared[sharedIdx] = accSum; - maxShared[sharedIdx] = accMax; - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = __float2half(mean); - out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); - out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void gPoolChannelsNCHWHalfMaskKernel(const half* in, half* out, int cSize, int xySize, const half* mask, const float* maskSum, int sharedMemElts) -{ -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float poolNCHWShared[]; - float* sumShared = (float*)poolNCHWShared; - float* maxShared = (float*)poolNCHWShared + sharedMemElts; - - int xyId = threadIdx.x; - int xyBlockDim = blockDim.x; - int cId = threadIdx.y; - int cBlockDim = blockDim.y; - int cIdx = blockIdx.y * cBlockDim + cId; - int nIdx = blockIdx.z; - - int xycSize = xySize*cSize; - int sharedIdx = xyId + cId * xyBlockDim; - - if(cIdx < cSize) { - float accSum = 0.0f; - float accMax = -1.0f; - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = __half2float(in[xyIdx + cIdx * xySize + nIdx * xycSize]); - accSum += a; - // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 - // which is lower than the lowest value that any current activation function will produce. - // so the max over all valid spaces will the same as the mask over all spaces including padding - accMax = fmaxf(accMax, a + (__half2float(mask[xyIdx + nIdx * xySize]) - 1.0f)); - xyIdx += xyBlockDim; - } - sumShared[sharedIdx] = accSum; - maxShared[sharedIdx] = accMax; - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], maxShared[sharedIdx + s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = __float2half(mean); - out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); - out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void customCudaPoolRowsGPoolNCHW(const half* in, half* out, int nSize, int cSize, int xySize, const half* mask, const float* maskSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNCHW: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNCHW: cSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaPoolRowsGPoolNCHW"); - - //Use up as many threads as possible along the xy dimension. - int xyThreads = 1; - while(xyThreads < targetNumThreads && xyThreads < xySize/2) - xyThreads *= 2; - - //Distribute the extra threads along the c dimension. - int cThreads = (targetNumThreads < xyThreads) ? 1 : (targetNumThreads / xyThreads); - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //We need one shared memory spot per thread, and then we double it because we need both sum and max. - //We also make sure it's a power of two to address any alignment concerns. - int sharedMemElts = 128; - while(sharedMemElts < cThreads * xyThreads) - sharedMemElts *= 2; - int sharedMemSize = sizeof(float) * sharedMemElts * 2; - - dim3 grid(1,cBlocks,nSize); - dim3 threads(xyThreads,cThreads,1); - if(mask != NULL) - gPoolChannelsNCHWHalfMaskKernel<<>>(in,out,cSize,xySize,mask,maskSum,sharedMemElts); - else - gPoolChannelsNCHWHalfKernel<<>>(in,out,cSize,xySize,maskSum,sharedMemElts); -} - - - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void sumChannelsNHWCKernel(const float* in, float* out, int xySize, int cSize, float scaleSum) -{ - extern __shared__ float sumPoolNHWCShared[]; - int cId = threadIdx.x; - int cBlockDim = blockDim.x; - int xyId = threadIdx.y; - int xyBlockDim = blockDim.y; - - int cIdx = blockIdx.x * cBlockDim + cId; - int nIdx = blockIdx.z; - int sharedIdx = cId + cBlockDim * xyId; - int xycSize = xySize*cSize; - - sumPoolNHWCShared[sharedIdx] = 0; - - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - sumPoolNHWCShared[sharedIdx] += in[cIdx + xyIdx * cSize + nIdx * xycSize]; - xyIdx += xyBlockDim; - } - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumPoolNHWCShared[sharedIdx] += sumPoolNHWCShared[sharedIdx + cBlockDim * s]; - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) - out[cIdx + nIdx * cSize] = sumPoolNHWCShared[sharedIdx] * scaleSum; -} -__global__ -void valueHeadPoolChannelsNHWCKernel(const float* in, float* out, int nSize, int xySize, int cSize, const float* maskSum) -{ - extern __shared__ float sumPoolNHWCShared[]; - int cId = threadIdx.x; - int cBlockDim = blockDim.x; - int xyId = threadIdx.y; - int xyBlockDim = blockDim.y; - - int cIdx = blockIdx.x * cBlockDim + cId; - int nIdx = blockIdx.z; - int sharedIdx = cId + cBlockDim * xyId; - int xycSize = xySize*cSize; - - sumPoolNHWCShared[sharedIdx] = 0; - - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - sumPoolNHWCShared[sharedIdx] += in[cIdx + xyIdx * cSize + nIdx * xycSize]; - xyIdx += xyBlockDim; - } - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumPoolNHWCShared[sharedIdx] += sumPoolNHWCShared[sharedIdx + cBlockDim * s]; - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumPoolNHWCShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - out[cIdx + nIdx * cSize*3] = mean; - out[cIdx + nIdx * cSize*3 + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; - out[cIdx + nIdx * cSize*3 + cSize*2] = mean * ((sqrtdiv - 14.0f) * (sqrtdiv - 14.0f) * 0.01f - 0.1f); - } -} -__global__ -void gPoolChannelsNHWCKernel(const float* in, float* out, int xySize, int cSize, const float* maskSum, int sharedMemElts) -{ - extern __shared__ float poolNHWCShared[]; - float* sumShared = (float*)poolNHWCShared; - float* maxShared = (float*)poolNHWCShared + sharedMemElts; - - int cId = threadIdx.x; - int cBlockDim = blockDim.x; - int xyId = threadIdx.y; - int xyBlockDim = blockDim.y; - - int cIdx = blockIdx.x * cBlockDim + cId; - int nIdx = blockIdx.z; - int sharedIdx = cId + cBlockDim * xyId; - int xycSize = xySize*cSize; - - sumShared[sharedIdx] = 0; - maxShared[sharedIdx] = -1.0f; - - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = in[cIdx + xyIdx * cSize + nIdx * xycSize]; - sumShared[sharedIdx] += a; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a); - xyIdx += xyBlockDim; - } - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = mean; - out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; - out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; - } -} -__global__ -void gPoolChannelsNHWCMaskKernel(const float* in, float* out, int xySize, int cSize, const float* mask, const float* maskSum, int sharedMemElts) -{ - extern __shared__ float poolNHWCShared[]; - float* sumShared = (float*)poolNHWCShared; - float* maxShared = (float*)poolNHWCShared + sharedMemElts; - - int cId = threadIdx.x; - int cBlockDim = blockDim.x; - int xyId = threadIdx.y; - int xyBlockDim = blockDim.y; - - int cIdx = blockIdx.x * cBlockDim + cId; - int nIdx = blockIdx.z; - int sharedIdx = cId + cBlockDim * xyId; - int xycSize = xySize*cSize; - - sumShared[sharedIdx] = 0; - maxShared[sharedIdx] = -1.0f; - - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = in[cIdx + xyIdx * cSize + nIdx * xycSize]; - sumShared[sharedIdx] += a; - // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 - // which is lower than the lowest value that any current activation function will produce. - // so the max over all valid spaces will the same as the mask over all spaces including padding - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a + (mask[xyIdx + nIdx * xySize] - 1.0f)); - xyIdx += xyBlockDim; - } - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = mean; - out[cIdx + nIdx * (cSize*3) + cSize] = mean * (sqrtdiv - 14.0f) * 0.1f; - out[cIdx + nIdx * (cSize*3) + cSize*2] = maxShared[sharedIdx]; - } -} - - -void customCudaPoolRowsSumNHWC(const float* in, float* out, int nSize, int xySize, int cSize, float scaleSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaPoolRowsSumNHWC: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaPoolRowsSumNHWC: cSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaPoolRowsSumNHWC"); - - //Use up to two warps worth of threads along the channel dimension, which is the - //most compact - int cThreads = 1; - while(cThreads < 64 && cThreads < cSize/2) - cThreads *= 2; - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //Distribute the extra threads to perform parallel reduction along the xy dimension. - int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); - - //We need one shared memory spot per thread - int sharedMemSize = sizeof(float) * cThreads * xyThreads; - - dim3 grid(cBlocks,1,nSize); - dim3 threads(cThreads,xyThreads,1); - sumChannelsNHWCKernel<<>>(in,out,xySize,cSize,scaleSum); -} - -void customCudaValueHeadPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* maskSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaValueHeadPoolNHWC: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaValueHeadPoolNHWC: cSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaValueHeadPoolNHWC"); - - //Use up to two warps worth of threads along the channel dimension, which is the - //most compact - int cThreads = 1; - while(cThreads < 64 && cThreads < cSize/2) - cThreads *= 2; - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //Distribute the extra threads to perform parallel reduction along the xy dimension. - int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); - - //We need one shared memory spot per thread - int sharedMemSize = sizeof(float) * cThreads * xyThreads; - - dim3 grid(cBlocks,1,nSize); - dim3 threads(cThreads,xyThreads,1); - valueHeadPoolChannelsNHWCKernel<<>>(in,out,nSize,xySize,cSize,maskSum); -} - -void customCudaPoolRowsGPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* mask, const float* maskSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNHWC: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNHWC: cSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaPoolRowsGPoolNHWC"); - - //Use up to two warps worth of threads along the channel dimension, which is the - //most compact - int cThreads = 1; - while(cThreads < 64 && cThreads < cSize/2) - cThreads *= 2; - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //Distribute the extra threads to perform parallel reduction along the xy dimension. - int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); - - //We need one shared memory spot per thread, and then we double it because we need both sum and max. - //We also make sure it's a power of two to address any alignment concerns. - int sharedMemElts = 128; - while(sharedMemElts < cThreads * xyThreads) - sharedMemElts *= 2; - int sharedMemSize = sizeof(float) * sharedMemElts * 2; - - dim3 grid(cBlocks,1,nSize); - dim3 threads(cThreads,xyThreads,1); - if(mask != NULL) - gPoolChannelsNHWCMaskKernel<<>>(in,out,xySize,cSize,mask,maskSum,sharedMemElts); - else - gPoolChannelsNHWCKernel<<>>(in,out,xySize,cSize,maskSum,sharedMemElts); -} - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void gPoolChannelsNHWCHalfKernel(const half* in, half* out, int xySize, int cSize, const float* maskSum, int sharedMemElts) -{ -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float poolNHWCShared[]; - float* sumShared = (float*)poolNHWCShared; - float* maxShared = (float*)poolNHWCShared + sharedMemElts; - - int cId = threadIdx.x; - int cBlockDim = blockDim.x; - int xyId = threadIdx.y; - int xyBlockDim = blockDim.y; - - int cIdx = blockIdx.x * cBlockDim + cId; - int nIdx = blockIdx.z; - int sharedIdx = cId + cBlockDim * xyId; - int xycSize = xySize*cSize; - - sumShared[sharedIdx] = 0; - maxShared[sharedIdx] = -1.0f; - - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = __half2float(in[cIdx + xyIdx * cSize + nIdx * xycSize]); - sumShared[sharedIdx] += a; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a); - xyIdx += xyBlockDim; - } - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = __float2half(mean); - out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); - out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void gPoolChannelsNHWCHalfMaskKernel(const half* in, half* out, int xySize, int cSize, const half* mask, const float* maskSum, int sharedMemElts) -{ -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float poolNHWCShared[]; - float* sumShared = (float*)poolNHWCShared; - float* maxShared = (float*)poolNHWCShared + sharedMemElts; - - int cId = threadIdx.x; - int cBlockDim = blockDim.x; - int xyId = threadIdx.y; - int xyBlockDim = blockDim.y; - - int cIdx = blockIdx.x * cBlockDim + cId; - int nIdx = blockIdx.z; - int sharedIdx = cId + cBlockDim * xyId; - int xycSize = xySize*cSize; - - sumShared[sharedIdx] = 0; - maxShared[sharedIdx] = -1.0f; - - if(cIdx < cSize) { - int xyIdx = xyId; - while(xyIdx < xySize) { - float a = __half2float(in[cIdx + xyIdx * cSize + nIdx * xycSize]); - sumShared[sharedIdx] += a; - // Init to -1.0 above and + mask - 1.0 is because it will effectively make all padded space into -1.0 - // which is lower than the lowest value that any current activation function will produce. - // so the max over all valid spaces will the same as the mask over all spaces including padding - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx], a + (__half2float(mask[xyIdx + nIdx * xySize]) - 1.0f)); - xyIdx += xyBlockDim; - } - } - __syncthreads(); - - for(int s = xyBlockDim>>1; s > 0; s >>= 1) { - if(xyId < s) { - sumShared[sharedIdx] += sumShared[sharedIdx + cBlockDim * s]; - maxShared[sharedIdx] = fmaxf(maxShared[sharedIdx],maxShared[sharedIdx + cBlockDim * s]); - } - __syncthreads(); - } - if(xyId == 0 && cIdx < cSize) { - float sum = sumShared[sharedIdx]; - float div = maskSum[nIdx]; - float sqrtdiv = sqrt(div); - float mean = sum/div; - - out[cIdx + nIdx * (cSize*3)] = __float2half(mean); - out[cIdx + nIdx * (cSize*3) + cSize] = __float2half(mean * (sqrtdiv - 14.0f) * 0.1f); - out[cIdx + nIdx * (cSize*3) + cSize*2] = __float2half(maxShared[sharedIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void customCudaPoolRowsGPoolNHWC(const half* in, half* out, int nSize, int xySize, int cSize, const half* mask, const float* maskSum) { - if(nSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNHWC: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaPoolRowsGPoolNHWC: cSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaPoolRowsGPoolNHWC"); - - //Use up to two warps worth of threads along the channel dimension, which is the - //most compact - int cThreads = 1; - while(cThreads < 64 && cThreads < cSize/2) - cThreads *= 2; - int cBlocks = (cSize + cThreads - 1) / cThreads; - - //Distribute the extra threads to perform parallel reduction along the xy dimension. - int xyThreads = (targetNumThreads < cThreads) ? 1 : (targetNumThreads / cThreads); - - //We need one shared memory spot per thread, and then we double it because we need both sum and max. - //We also make sure it's a power of two to address any alignment concerns. - int sharedMemElts = 128; - while(sharedMemElts < cThreads * xyThreads) - sharedMemElts *= 2; - int sharedMemSize = sizeof(float) * sharedMemElts * 2; - - dim3 grid(cBlocks,1,nSize); - dim3 threads(cThreads,xyThreads,1); - if(mask != NULL) - gPoolChannelsNHWCHalfMaskKernel<<>>(in,out,xySize,cSize,mask,maskSum,sharedMemElts); - else - gPoolChannelsNHWCHalfKernel<<>>(in,out,xySize,cSize,maskSum,sharedMemElts); -} - - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void copyToHalfKernel(const float *in, half* out, int n) -{ - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if(idx < n) { - out[idx] = __float2half(in[idx]); - } -} -__global__ -void copyFromHalfKernel(const half *in, float* out, int n) -{ - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if(idx < n) { - out[idx] = __half2float(in[idx]); - } -} - -void customCudaCopyToHalf(const float* in, half* out, int n) { - int blockSize = targetNumThreads; - int numBlocks = (n+blockSize-1)/blockSize; - copyToHalfKernel<<>>(in,out,n); -} -void customCudaCopyFromHalf(const half* in, float* out, int n) { - int blockSize = targetNumThreads; - int numBlocks = (n+blockSize-1)/blockSize; - copyFromHalfKernel<<>>(in,out,n); -} - -//-------------------------------------------------------------------------------------------------------------- - - -__global__ -void addTensorInplaceHalfKernel(half *buf, const half* biases, int nSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if(idx < nSize) { - buf[idx] = __hadd(buf[idx],biases[idx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -void customCudaAddTensorInplace(half* buf, const half* biases, int nSize) { - int blockSize = targetNumThreads; - int numBlocks = (nSize+blockSize-1)/blockSize; - addTensorInplaceHalfKernel<<>>(buf,biases,nSize); -} - -//-------------------------------------------------------------------------------------------------------------- - - -__global__ -void addCBiasInplaceNCKernel(float *buf, const float* biases, int nSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - buf[idx] = buf[idx] + biases[cIdx]; - } -} -__global__ -void addCBiasInplaceNCHalfKernel(half *buf, const half* biases, int nSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - buf[idx] = __hadd(buf[idx],biases[cIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} - -__global__ -void addCBiasInplaceNCKernelRelu(float *buf, const float* biases, int nSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - buf[idx] = fmaxf(buf[idx] + biases[cIdx],0.0f); - } -} -__global__ -void addCBiasInplaceNCHalfKernelRelu(half *buf, const half* biases, int nSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - const half halfzero = __float2half(0.0f); - half a = __hadd(buf[idx],biases[cIdx]); - buf[idx] = __hgt(a,halfzero) ? a : halfzero; - } -#else - //Do nothing, FP16 not supported -#endif -} - -__global__ -void addCBiasInplaceNCKernelMish(float *buf, const float* biases, int nSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - buf[idx] = mishf(buf[idx] + biases[cIdx]); - } -} -__global__ -void addCBiasInplaceNCHalfKernelMish(half *buf, const half* biases, int nSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - half a = __hadd(buf[idx],biases[cIdx]); - buf[idx] = mishh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void addCBiasInplaceNCKernelMishScale8(float *buf, const float* biases, int nSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - buf[idx] = mishf_scale8(buf[idx] + biases[cIdx]); - } -} -__global__ -void addCBiasInplaceNCHalfKernelMishScale8(half *buf, const half* biases, int nSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - half a = __hadd(buf[idx],biases[cIdx]); - buf[idx] = mishh_scale8(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void addCBiasInplaceNCKernelSilu(float *buf, const float* biases, int nSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - buf[idx] = siluf(buf[idx] + biases[cIdx]); - } -} -__global__ -void addCBiasInplaceNCHalfKernelSilu(half *buf, const half* biases, int nSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int nIdx = blockIdx.y * blockDim.y + threadIdx.y; - if(cIdx < cSize && nIdx < nSize) { - int idx = nIdx * cSize + cIdx; - half a = __hadd(buf[idx],biases[cIdx]); - buf[idx] = siluh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void sharedAddCBiasInplaceNC(void* buf, const void* biases, int nSize, int cSize, bool isHalf, int activation) { - int cThreads; - int cBlocks; - int nThreads; - int nBlocks; - splitThreadsAcrossDim01(cSize, nSize, cThreads, cBlocks, nThreads, nBlocks); - - if(nBlocks > 65536) - throw std::runtime_error("customCudaAddCBiasInplaceNC: nSize too large given cSize"); - - dim3 grid(cBlocks,nBlocks,1); - dim3 threads(cThreads,nThreads,1); - - if(activation == ACTIVATION_IDENTITY) { - if(isHalf) - addCBiasInplaceNCHalfKernel<<>>((half*)buf,(const half*)biases,nSize,cSize); - else - addCBiasInplaceNCKernel<<>>((float*)buf,(const float*)biases,nSize,cSize); - } - else if(activation == ACTIVATION_RELU) { - if(isHalf) - addCBiasInplaceNCHalfKernelRelu<<>>((half*)buf,(const half*)biases,nSize,cSize); - else - addCBiasInplaceNCKernelRelu<<>>((float*)buf,(const float*)biases,nSize,cSize); - } - else if(activation == ACTIVATION_MISH) { - if(isHalf) - addCBiasInplaceNCHalfKernelMish<<>>((half*)buf,(const half*)biases,nSize,cSize); - else - addCBiasInplaceNCKernelMish<<>>((float*)buf,(const float*)biases,nSize,cSize); - } - else if(activation == ACTIVATION_SILU) { - if(isHalf) - addCBiasInplaceNCHalfKernelSilu<<>>((half*)buf,(const half*)biases,nSize,cSize); - else - addCBiasInplaceNCKernelSilu<<>>((float*)buf,(const float*)biases,nSize,cSize); - } - else if(activation == ACTIVATION_MISH_SCALE8) { - if(isHalf) - addCBiasInplaceNCHalfKernelMishScale8<<>>((half*)buf,(const half*)biases,nSize,cSize); - else - addCBiasInplaceNCKernelMishScale8<<>>((float*)buf,(const float*)biases,nSize,cSize); - } - else { - throw std::runtime_error("customCudaAddCBiasInplaceNC: unsupported activation"); - } -} - -void customCudaAddCBiasInplaceNC(float* buf, const float* biases, int nSize, int cSize, int activation) { - sharedAddCBiasInplaceNC(buf,biases,nSize,cSize,false,activation); -} -void customCudaAddCBiasInplaceNC(half* buf, const half* biases, int nSize, int cSize, int activation) { - sharedAddCBiasInplaceNC(buf,biases,nSize,cSize,true,activation); -} - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void addNCBiasInplaceNCHWKernel(float *buf, const float* biases, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int ncIdx = nIdx * cSize + cIdx; - int idx = ncIdx * sSize + sIdx; - buf[idx] = buf[idx] + biases[ncIdx]; - } -} -__global__ -void addNCBiasInplaceNCHWHalfKernel(half *buf, const half* biases, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int ncIdx = nIdx * cSize + cIdx; - int idx = ncIdx * sSize + sIdx; - buf[idx] = __hadd(buf[idx],biases[ncIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void sharedAddNCBiasInplaceNCHW(void *buf, const void* biases, int nSize, int cSize, int xySize, bool isHalf) { - if(nSize > 65536) - throw std::runtime_error("customCudaAddNCBiasInplaceNCHW: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaAddNCBiasInplaceNCHW: cSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaAddNCBiasInplaceNCHW"); - - int sSize = xySize; - int sThreads; - int sBlocks; - int cThreads; - int cBlocks; - splitThreadsAcrossDim01(sSize, cSize, sThreads, sBlocks, cThreads, cBlocks); - - dim3 grid(sBlocks,cBlocks,nSize); - dim3 threads(sThreads,cThreads,1); - if(isHalf) - addNCBiasInplaceNCHWHalfKernel<<>>((half*)buf,(const half*)biases,cSize,sSize); - else - addNCBiasInplaceNCHWKernel<<>>((float*)buf,(const float*)biases,cSize,sSize); -} - -void customCudaAddNCBiasInplaceNCHW(float *buf, const float* biases, int nSize, int cSize, int xySize) { - sharedAddNCBiasInplaceNCHW(buf,biases,nSize,cSize,xySize,false); -} -void customCudaAddNCBiasInplaceNCHW(half *buf, const half* biases, int nSize, int cSize, int xySize) { - sharedAddNCBiasInplaceNCHW(buf,biases,nSize,cSize,xySize,true); -} - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void addNCBiasInplaceNHWCKernel(float *buf, const float* biases, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int ncIdx = nIdx * cSize + cIdx; - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - buf[idx] = buf[idx] + biases[ncIdx]; - } -} -__global__ -void addNCBiasInplaceNHWCHalfKernel(half *buf, const half* biases, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int ncIdx = nIdx * cSize + cIdx; - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - buf[idx] = __hadd(buf[idx],biases[ncIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void sharedAddNCBiasInplaceNHWC(void *buf, const void* biases, int nSize, int xySize, int cSize, bool isHalf) { - if(nSize > 65536) - throw std::runtime_error("customCudaAddNCBiasInplaceNHWC: nSize too large"); - if(xySize > 65536) - throw std::runtime_error("customCudaAddNCBiasInplaceNHWC: xySize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaAddNCBiasInplaceNHWC"); - - int sSize = xySize; - int cThreads; - int cBlocks; - int sThreads; - int sBlocks; - splitThreadsAcrossDim01(cSize, sSize, cThreads, cBlocks, sThreads, sBlocks); - - dim3 grid(cBlocks,sBlocks,nSize); - dim3 threads(cThreads,sThreads,1); - if(isHalf) - addNCBiasInplaceNHWCHalfKernel<<>>((half*)buf,(const half*)biases,sSize,cSize); - else - addNCBiasInplaceNHWCKernel<<>>((float*)buf,(const float*)biases,sSize,cSize); -} - -void customCudaAddNCBiasInplaceNHWC(float *buf, const float* biases, int nSize, int xySize, int cSize) { - sharedAddNCBiasInplaceNHWC(buf,biases,nSize,xySize,cSize,false); -} -void customCudaAddNCBiasInplaceNHWC(half *buf, const half* biases, int nSize, int xySize, int cSize) { - sharedAddNCBiasInplaceNHWC(buf,biases,nSize,xySize,cSize,true); -} - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void applyCScaleBiasNCHWKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = in[idx] * scale[cIdx] + biases[cIdx]; - } -} -__global__ -void applyCScaleBiasNCHWReluKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f); - } -} -__global__ -void applyCScaleBiasNCHWMishKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]); - } -} -__global__ -void applyCScaleBiasNCHWMishScale8Kernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]); - } -} -__global__ -void applyCScaleBiasNCHWSiluKernel(const float *in, float* out, const float* scale, const float* biases, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]); - } -} -__global__ -void applyCScaleBiasNCHWMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = (in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNCHWReluMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNCHWMishMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNCHWMishScale8MaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNCHWSiluMaskKernel(const float *in, float* out, const float* scale, const float* biases, const float* mask, int cSize, int sSize) -{ - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNCHWHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = __hfma(in[idx],scale[cIdx],biases[cIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWReluHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - const half halfzero = __float2half(0.0f); - out[idx] = __hgt(a,halfzero) ? a : halfzero; - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWMishHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - out[idx] = mishh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWMishScale8HalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - out[idx] = mishh_scale8(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWSiluHalfKernel(const half *in, half* out, const half* scale, const half* biases, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - out[idx] = siluh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - out[idx] = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWReluMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - const half halfzero = __float2half(0.0f); - out[idx] = __hgt(a,halfzero) ? a : halfzero; - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWMishMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - out[idx] = mishh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWMishScale8MaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - out[idx] = mishh_scale8(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNCHWSiluMaskHalfKernel(const half *in, half* out, const half* scale, const half* biases, const half* mask, int cSize, int sSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int sIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * cSize + cIdx) * sSize + sIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - out[idx] = siluh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void sharedApplyCScaleBiasNCHW(const void* in, void* out, const void* scale, const void* biases, const void* mask, int nSize, int cSize, int xySize, bool isHalf, int activation) { - if(nSize > 65536) - throw std::runtime_error("customCudaApplyCScaleBiasNCHW: nSize too large"); - if(cSize > 65536) - throw std::runtime_error("customCudaApplyCScaleBiasNCHW: cSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaApplyCScaleBiasNCHW"); - - int sSize = xySize; - int sThreads; - int sBlocks; - int cThreads; - int cBlocks; - splitThreadsAcrossDim01(sSize, cSize, sThreads, sBlocks, cThreads, cBlocks); - - dim3 grid(sBlocks,cBlocks,nSize); - dim3 threads(sThreads,cThreads,1); - if(mask == NULL) { - if(activation == ACTIVATION_IDENTITY) { - if(isHalf) - applyCScaleBiasNCHWHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); - else - applyCScaleBiasNCHWKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); - } - else if(activation == ACTIVATION_RELU) { - if(isHalf) - applyCScaleBiasNCHWReluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); - else - applyCScaleBiasNCHWReluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); - } - else if(activation == ACTIVATION_MISH) { - if(isHalf) - applyCScaleBiasNCHWMishHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); - else - applyCScaleBiasNCHWMishKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); - } - else if(activation == ACTIVATION_SILU) { - if(isHalf) - applyCScaleBiasNCHWSiluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); - else - applyCScaleBiasNCHWSiluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); - } - else if(activation == ACTIVATION_MISH_SCALE8) { - if(isHalf) - applyCScaleBiasNCHWMishScale8HalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,cSize,sSize); - else - applyCScaleBiasNCHWMishScale8Kernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,cSize,sSize); - } - else { - throw std::runtime_error("customCudaApplyCScaleBiasNCHW: unsupported activation"); - } - } - else { - if(activation == ACTIVATION_IDENTITY) { - if(isHalf) - applyCScaleBiasNCHWMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); - else - applyCScaleBiasNCHWMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); - } - else if(activation == ACTIVATION_RELU) { - if(isHalf) - applyCScaleBiasNCHWReluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); - else - applyCScaleBiasNCHWReluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); - } - else if(activation == ACTIVATION_MISH) { - if(isHalf) - applyCScaleBiasNCHWMishMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); - else - applyCScaleBiasNCHWMishMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); - } - else if(activation == ACTIVATION_SILU) { - if(isHalf) - applyCScaleBiasNCHWSiluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); - else - applyCScaleBiasNCHWSiluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); - } - else if(activation == ACTIVATION_MISH_SCALE8) { - if(isHalf) - applyCScaleBiasNCHWMishScale8MaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,cSize,sSize); - else - applyCScaleBiasNCHWMishScale8MaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,cSize,sSize); - } - else { - throw std::runtime_error("customCudaApplyCScaleBiasNCHW: unsupported activation"); - } - } -} - -void customCudaApplyCScaleBiasNCHW(const float* in, float* out, const float* scale, const float* biases, const float* mask, int nSize, int cSize, int xySize, int activation) { - sharedApplyCScaleBiasNCHW(in,out,scale,biases,mask,nSize,cSize,xySize,false,activation); -} -void customCudaApplyCScaleBiasNCHW(const half* in, half* out, const half* scale, const half* biases, const half* mask, int nSize, int cSize, int xySize, int activation) { - sharedApplyCScaleBiasNCHW(in,out,scale,biases,mask,nSize,cSize,xySize,true,activation); -} - - -//-------------------------------------------------------------------------------------------------------------- - -__global__ -void applyCScaleBiasNHWCKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = in[idx] * scale[cIdx] + biases[cIdx]; - } -} -__global__ -void applyCScaleBiasNHWCReluKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f); - } -} -__global__ -void applyCScaleBiasNHWCMishKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]); - } -} -__global__ -void applyCScaleBiasNHWCMishScale8Kernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]); - } -} -__global__ -void applyCScaleBiasNHWCSiluKernel(const float* in, float* out, const float* scale, const float* biases, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]); - } -} -__global__ -void applyCScaleBiasNHWCMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = (in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNHWCReluMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = fmaxf(in[idx] * scale[cIdx] + biases[cIdx],0.0f) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNHWCMishMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = mishf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNHWCMishScale8MaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = mishf_scale8(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNHWCSiluMaskKernel(const float* in, float* out, const float* scale, const float* biases, const float* mask, int sSize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = siluf(in[idx] * scale[cIdx] + biases[cIdx]) * mask[nIdx*sSize+sIdx]; - } -} -__global__ -void applyCScaleBiasNHWCHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = __hfma(in[idx],scale[cIdx],biases[cIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCReluHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - const half halfzero = __float2half(0.0f); - out[idx] = __hgt(a,halfzero) ? a : halfzero; - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCMishHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - out[idx] = mishh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCMishScale8HalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - out[idx] = mishh_scale8(a); - } -#else - //Do nothing, FP16 not supported +#define KATAGO_GPU_SUPPORTS_FP16 #endif -} -__global__ -void applyCScaleBiasNHWCSiluHalfKernel(const half* in, half* out, const half* scale, const half* biases, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hfma(in[idx],scale[cIdx],biases[cIdx]); - out[idx] = siluh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - out[idx] = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCReluMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - const half halfzero = __float2half(0.0f); - out[idx] = __hgt(a,halfzero) ? a : halfzero; - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCMishMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - out[idx] = mishh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCMishScale8MaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - out[idx] = mishh_scale8(a); - } -#else - //Do nothing, FP16 not supported -#endif -} -__global__ -void applyCScaleBiasNHWCSiluMaskHalfKernel(const half* in, half* out, const half* scale, const half* biases, const half* mask, int sSize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int sIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx < cSize && sIdx < sSize) { - int idx = (nIdx * sSize + sIdx) * cSize + cIdx; - half a = __hmul(__hfma(in[idx],scale[cIdx],biases[cIdx]),mask[nIdx*sSize+sIdx]); - out[idx] = siluh(a); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void sharedApplyCScaleBiasNHWC(const void* in, void* out, const void* scale, const void* biases, const void* mask, int nSize, int xySize, int cSize, bool isHalf, int activation) { - if(nSize > 65536) - throw std::runtime_error("customCudaApplyCScaleBiasNHWC: nSize too large"); - if(xySize > 65536) - throw std::runtime_error("customCudaApplyCScaleBiasNHWC: xySize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaApplyCScaleBiasNHWC"); - - int sSize = xySize; - int cThreads; - int cBlocks; - int sThreads; - int sBlocks; - splitThreadsAcrossDim01(cSize, sSize, cThreads, cBlocks, sThreads, sBlocks); - - dim3 grid(cBlocks,sBlocks,nSize); - dim3 threads(cThreads,sThreads,1); - if(mask == NULL) { - if(activation == ACTIVATION_IDENTITY) { - if(isHalf) - applyCScaleBiasNHWCHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); - else - applyCScaleBiasNHWCKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); - } - else if(activation == ACTIVATION_RELU) { - if(isHalf) - applyCScaleBiasNHWCReluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); - else - applyCScaleBiasNHWCReluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); - } - else if(activation == ACTIVATION_MISH) { - if(isHalf) - applyCScaleBiasNHWCMishHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); - else - applyCScaleBiasNHWCMishKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); - } - else if(activation == ACTIVATION_SILU) { - if(isHalf) - applyCScaleBiasNHWCSiluHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); - else - applyCScaleBiasNHWCSiluKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); - } - else if(activation == ACTIVATION_MISH_SCALE8) { - if(isHalf) - applyCScaleBiasNHWCMishScale8HalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,sSize,cSize); - else - applyCScaleBiasNHWCMishScale8Kernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,sSize,cSize); - } - else { - throw std::runtime_error("customCudaApplyCScaleBiasNHWC: unsupported activation"); - } - } - else { - if(activation == ACTIVATION_IDENTITY) { - if(isHalf) - applyCScaleBiasNHWCMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); - else - applyCScaleBiasNHWCMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); - } - else if(activation == ACTIVATION_RELU) { - if(isHalf) - applyCScaleBiasNHWCReluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); - else - applyCScaleBiasNHWCReluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); - } - else if(activation == ACTIVATION_MISH) { - if(isHalf) - applyCScaleBiasNHWCMishMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); - else - applyCScaleBiasNHWCMishMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); - } - else if(activation == ACTIVATION_SILU) { - if(isHalf) - applyCScaleBiasNHWCSiluMaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); - else - applyCScaleBiasNHWCSiluMaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); - } - else if(activation == ACTIVATION_MISH_SCALE8) { - if(isHalf) - applyCScaleBiasNHWCMishScale8MaskHalfKernel<<>>((const half*)in,(half*)out,(const half*)scale,(const half*)biases,(const half*)mask,sSize,cSize); - else - applyCScaleBiasNHWCMishScale8MaskKernel<<>>((const float*)in,(float*)out,(const float*)scale,(const float*)biases,(const float*)mask,sSize,cSize); - } - else { - throw std::runtime_error("customCudaApplyCScaleBiasNHWC: unsupported activation"); - } - } -} - -void customCudaApplyCScaleBiasNHWC(const float* in, float* out, const float* scale, const float* biases, const float* mask, int nSize, int xySize, int cSize, int activation) { - sharedApplyCScaleBiasNHWC(in,out,scale,biases,mask,nSize,xySize,cSize,false,activation); -} -void customCudaApplyCScaleBiasNHWC(const half* in, half* out, const half* scale, const half* biases, const half* mask, int nSize, int xySize, int cSize, int activation) { - sharedApplyCScaleBiasNHWC(in,out,scale,biases,mask,nSize,xySize,cSize,true,activation); -} - -//============================================================================================== -// Transformer support kernels -//============================================================================================== - -//-------------------------------------------------------------------------------------------------------------- -//-------------------------------------------------------------------------------------------------------------- -// RoPE: Apply rotary position embeddings in-place. -// buf: [totalDim, seqLen*batchSize] column-major (totalDim = numBufHeads*qHeadDim, fast-moving). -// Each thread handles one (pair, xy, n, h) combination. - -// See coalescing comment on applyRoPEHalfKernel below for the layout reasoning. -__global__ -void applyRoPEKernel( - float* buf, const float* cosTable, const float* sinTable, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int learnableRope -) { - int xy = blockIdx.x; - int n = blockIdx.y; - int hp = threadIdx.x; - int totalHP = numBufHeads * numPairs; - if(xy >= seqLen || n >= batchSize || hp >= totalHP) - return; - - int h = hp / numPairs; - int pairIdx = hp % numPairs; - int c0 = h * qHeadDim + 2 * pairIdx; - int c1 = c0 + 1; - size_t col = (size_t)n * seqLen + xy; - size_t idx0 = c0 + col * totalDim; - size_t idx1 = c1 + col * totalDim; - - int tableIdx; - if(learnableRope) { - int kvh = h * numKVHeads / numBufHeads; - tableIdx = (kvh * numPairs + pairIdx) * seqLen + xy; - } else { - tableIdx = pairIdx * seqLen + xy; - } - - float cosVal = cosTable[tableIdx]; - float sinVal = sinTable[tableIdx]; - float x0 = buf[idx0]; - float x1 = buf[idx1]; - buf[idx0] = x0 * cosVal - x1 * sinVal; - buf[idx1] = x0 * sinVal + x1 * cosVal; -} - -// RoPE for BSHD-laid-out Q or K buffer. Buffer linear index is: -// buf[h*qHeadDim + d + (n*seqLen + xy) * totalDim] where totalDim = numBufHeads*qHeadDim. -// For a warp to coalesce, consecutive threads must access consecutive memory addresses. -// The contiguous axis is "channel within position": (h, d) jointly varying with d innermost. -// So threadIdx.x walks over channel pairs within a single (n, xy) row, and grid.x walks over xy. -// -// Each thread processes one pair (d=2*pairIdx, d=2*pairIdx+1) for one head: c0 = h*qHeadDim + 2*p. -// We pack the (h, p) pair index into threadIdx.x: hp = h*numPairs + p, range 0..numBufHeads*numPairs. -// -// Memory access pattern: for fixed (n, xy), consecutive hp threads read consecutive (c0, c1) -// halfs, which are 2 halfs = 4 bytes apart. 32 threads = 128 bytes = 2 cache lines, fully -// coalesced. - -__global__ -void applyRoPEHalfKernel( - half* buf, const half* cosTable, const half* sinTable, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int learnableRope -) { -#ifdef CUDA_SUPPORTS_FP16 - int xy = blockIdx.x; - int n = blockIdx.y; - int hp = threadIdx.x; // hp = h * numPairs + pairIdx - int totalHP = numBufHeads * numPairs; - if(xy >= seqLen || n >= batchSize || hp >= totalHP) - return; - - int h = hp / numPairs; - int pairIdx = hp % numPairs; - int c0 = h * qHeadDim + 2 * pairIdx; - int c1 = c0 + 1; - size_t col = (size_t)n * seqLen + xy; - size_t idx0 = c0 + col * totalDim; - size_t idx1 = c1 + col * totalDim; - - int tableIdx; - if(learnableRope) { - int kvh = h * numKVHeads / numBufHeads; - tableIdx = (kvh * numPairs + pairIdx) * seqLen + xy; - } else { - tableIdx = pairIdx * seqLen + xy; - } - - float cosVal = __half2float(cosTable[tableIdx]); - float sinVal = __half2float(sinTable[tableIdx]); - float x0 = __half2float(buf[idx0]); - float x1 = __half2float(buf[idx1]); - buf[idx0] = __float2half(x0 * cosVal - x1 * sinVal); - buf[idx1] = __float2half(x0 * sinVal + x1 * cosVal); -#else - //Do nothing, FP16 not supported -#endif -} - -// Learnable RoPE, table-free variant: recompute cos/sin in-kernel from the per-head frequencies -// instead of reading a precomputed [numKVHeads, numPairs, seqLen] cos/sin table. -// -// The precomputed table is numKVHeads-times larger than the fixed-RoPE table (per-head rather than -// shared), and for many heads its aggregate footprint across all transformer blocks exceeds L2, so -// the (non-coalesced, stride-seqLen) table reads spill to DRAM and dominate the kernel. The -// frequencies are tiny (numKVHeads*numPairs*2 floats, ~KB) and stay resident in cache, so we read -// those and compute angle = x*freqX + y*freqY with __sincosf. The (x,y) decode is uniform across the -// block (one block == one xy), and buf access is unchanged (still coalesced over channel pairs). -// -// freqs layout: (numKVHeads, numPairs, 2) flattened; [...,0]=freqX (width/x), [...,1]=freqY (height/y). -__global__ -void applyRoPELearnableRecomputeKernel( - float* buf, const float* freqs, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int nnXLen -) { - int xy = blockIdx.x; - int n = blockIdx.y; - int hp = threadIdx.x; - int totalHP = numBufHeads * numPairs; - if(xy >= seqLen || n >= batchSize || hp >= totalHP) - return; - - int h = hp / numPairs; - int pairIdx = hp % numPairs; - int c0 = h * qHeadDim + 2 * pairIdx; - int c1 = c0 + 1; - size_t col = (size_t)n * seqLen + xy; - size_t idx0 = c0 + col * totalDim; - size_t idx1 = c1 + col * totalDim; - - int kvh = h * numKVHeads / numBufHeads; - int x = xy % nnXLen; - int y = xy / nnXLen; - float freqX = freqs[(kvh * numPairs + pairIdx) * 2 + 0]; - float freqY = freqs[(kvh * numPairs + pairIdx) * 2 + 1]; - float angle = (float)x * freqX + (float)y * freqY; - float cosVal, sinVal; - __sincosf(angle, &sinVal, &cosVal); - - float x0 = buf[idx0]; - float x1 = buf[idx1]; - buf[idx0] = x0 * cosVal - x1 * sinVal; - buf[idx1] = x0 * sinVal + x1 * cosVal; -} - -__global__ -void applyRoPELearnableRecomputeHalfKernel( - half* buf, const float* freqs, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int totalDim, int numPairs, int nnXLen -) { -#ifdef CUDA_SUPPORTS_FP16 - int xy = blockIdx.x; - int n = blockIdx.y; - int hp = threadIdx.x; - int totalHP = numBufHeads * numPairs; - if(xy >= seqLen || n >= batchSize || hp >= totalHP) - return; - - int h = hp / numPairs; - int pairIdx = hp % numPairs; - int c0 = h * qHeadDim + 2 * pairIdx; - int c1 = c0 + 1; - size_t col = (size_t)n * seqLen + xy; - size_t idx0 = c0 + col * totalDim; - size_t idx1 = c1 + col * totalDim; - - int kvh = h * numKVHeads / numBufHeads; - int x = xy % nnXLen; - int y = xy / nnXLen; - float freqX = freqs[(kvh * numPairs + pairIdx) * 2 + 0]; - float freqY = freqs[(kvh * numPairs + pairIdx) * 2 + 1]; - float angle = (float)x * freqX + (float)y * freqY; - float cosVal, sinVal; - __sincosf(angle, &sinVal, &cosVal); - - float x0 = __half2float(buf[idx0]); - float x1 = __half2float(buf[idx1]); - buf[idx0] = __float2half(x0 * cosVal - x1 * sinVal); - buf[idx1] = __float2half(x0 * sinVal + x1 * cosVal); -#else - //Do nothing, FP16 not supported -#endif -} - -// One block per (xy, n). threadIdx.x = h*numPairs + pairIdx covers all channel pairs for the -// position. Block dim is rounded up to a multiple of 32 for warp alignment; out-of-range threads -// short-circuit. -void customCudaApplyRoPE( - float* buf, const float* cosTable, const float* sinTable, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope -) { - int totalDim = numBufHeads * qHeadDim; - int totalHP = numBufHeads * numPairs; - // The kernel maps one thread per (head,pair) within a single block (no grid-stride loop), so - // totalHP must fit in one block. Fail loudly rather than silently clamping and skipping rotations. - if(totalHP > 1024) - throw std::runtime_error("customCudaApplyRoPE: numHeads*qHeadDim/2 (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); - int threads = ((totalHP + 31) / 32) * 32; // round up to warp size - dim3 blocks(seqLen, batchSize, 1); - applyRoPEKernel<<>>( - buf, cosTable, sinTable, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, learnableRope ? 1 : 0 - ); -} -void customCudaApplyRoPE( - half* buf, const half* cosTable, const half* sinTable, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope -) { - int totalDim = numBufHeads * qHeadDim; - int totalHP = numBufHeads * numPairs; - if(totalHP > 1024) - throw std::runtime_error("customCudaApplyRoPE: numHeads*qHeadDim/2 (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); - int threads = ((totalHP + 31) / 32) * 32; - dim3 blocks(seqLen, batchSize, 1); - applyRoPEHalfKernel<<>>( - buf, cosTable, sinTable, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, learnableRope ? 1 : 0 - ); -} - -// Table-free learnable RoPE: same block/thread mapping as customCudaApplyRoPE, but recomputes cos/sin -// in-kernel from the per-head frequencies (numKVHeads, numPairs, 2) flattened. See kernel comment. -void customCudaApplyRoPELearnableRecompute( - float* buf, const float* freqs, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen -) { - int totalDim = numBufHeads * qHeadDim; - int totalHP = numBufHeads * numPairs; - if(totalHP > 1024) - throw std::runtime_error("customCudaApplyRoPELearnableRecompute: numHeads*qHeadDim/2 (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); - int threads = ((totalHP + 31) / 32) * 32; - dim3 blocks(seqLen, batchSize, 1); - applyRoPELearnableRecomputeKernel<<>>( - buf, freqs, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, nnXLen - ); -} -void customCudaApplyRoPELearnableRecompute( - half* buf, const float* freqs, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen -) { - int totalDim = numBufHeads * qHeadDim; - int totalHP = numBufHeads * numPairs; - if(totalHP > 1024) - throw std::runtime_error("customCudaApplyRoPELearnableRecompute: numHeads*qHeadDim/2 (" + std::to_string(totalHP) + ") exceeds the 1024 threads/block limit"); - int threads = ((totalHP + 31) / 32) * 32; - dim3 blocks(seqLen, batchSize, 1); - applyRoPELearnableRecomputeHalfKernel<<>>( - buf, freqs, batchSize, seqLen, numBufHeads, numKVHeads, qHeadDim, totalDim, numPairs, nnXLen - ); -} - -//-------------------------------------------------------------------------------------------------------------- -// FlashAttention-style scaled dot product attention with online softmax (tiled). -// Grid: (numQGroups, batchSize * numHeads), block: BLOCK_Q threads. -// Each thread handles Q_PER_THREAD query positions, separated by BLOCK_Q within a workgroup. -// BLOCK_KV K/V rows are loaded into shared memory and reused across BLOCK_Q*Q_PER_THREAD queries. -// Layout: BSHD row-major (see header). Templated on qHeadDim/vHeadDim so inner loops unroll. -// -// Coalescing notes: K/V row stride in memory is qHeadDim/vHeadDim (== inner D dim of BSHD), so the -// cooperative tile-load loop reads consecutive D values across the warp -> fully coalesced if -// qHeadDim is a multiple of 32 (or BLOCK_Q divides qHeadDim cleanly). - -template -__device__ __forceinline__ -void flashAttentionTiledImpl( - const T* Q, const T* K, const T* V, const T* mask, T* output, - int seqLen, int numHeads, int numKVHeads, float scale -) { - const int tid = threadIdx.x; - const int qBlockStart = blockIdx.x * (BLOCK_Q * Q_PER_THREAD); - const int bh = blockIdx.y; - const int n = bh / numHeads; - const int h = bh % numHeads; - const int kvh = h * numKVHeads / numHeads; - - const int qTotalDim = numHeads * qHeadDim; - const int kTotalDim = numKVHeads * qHeadDim; - const int vTotalDim = numKVHeads * vHeadDim; - const int oTotalDim = numHeads * vHeadDim; - - constexpr int K_TILE_STRIDE = qHeadDim; - constexpr int V_TILE_STRIDE = vHeadDim; - __shared__ float kTile[BLOCK_KV * K_TILE_STRIDE]; - __shared__ float vTile[BLOCK_KV * V_TILE_STRIDE]; - __shared__ float kMaskTile[BLOCK_KV]; - - float qReg[Q_PER_THREAD * qHeadDim]; - float qMask[Q_PER_THREAD]; - float runningMax[Q_PER_THREAD]; - float runningSum[Q_PER_THREAD]; - float acc[Q_PER_THREAD * vHeadDim]; - - // Load Q for the Q_PER_THREAD positions this thread owns. - #pragma unroll - for(int qi = 0; qi < Q_PER_THREAD; qi++) { - int qPos = qBlockStart + qi * BLOCK_Q + tid; - qMask[qi] = 0.0f; - if(qPos < seqLen) { - if(mask != NULL) { - qMask[qi] = (float)mask[n * seqLen + qPos]; - } else { - qMask[qi] = 1.0f; - } - if(qMask[qi] != 0.0f) { - const T* qPtr = Q + ((size_t)n * seqLen + qPos) * qTotalDim + h * qHeadDim; - #pragma unroll - for(int d = 0; d < qHeadDim; d++) qReg[qi * qHeadDim + d] = (float)qPtr[d]; - } - } - runningMax[qi] = -1e30f; - runningSum[qi] = 0.0f; - #pragma unroll - for(int d = 0; d < vHeadDim; d++) acc[qi * vHeadDim + d] = 0.0f; - } - - // Iterate over K/V in BLOCK_KV-row tiles. - for(int kvStart = 0; kvStart < seqLen; kvStart += BLOCK_KV) { - // Cooperatively load K tile: BLOCK_KV rows of qHeadDim values (stride K_TILE_STRIDE). - #pragma unroll - for(int t = tid; t < BLOCK_KV * qHeadDim; t += BLOCK_Q) { - int tileKPos = t / qHeadDim; - int tileD = t % qHeadDim; - int globalKPos = kvStart + tileKPos; - float v = 0.0f; - if(globalKPos < seqLen) { - const T* kPtr = K + ((size_t)n * seqLen + globalKPos) * kTotalDim + kvh * qHeadDim; - v = (float)kPtr[tileD]; - } - kTile[tileKPos * K_TILE_STRIDE + tileD] = v; - } - // Cooperatively load V tile: BLOCK_KV rows of vHeadDim values (stride V_TILE_STRIDE). - #pragma unroll - for(int t = tid; t < BLOCK_KV * vHeadDim; t += BLOCK_Q) { - int tileKPos = t / vHeadDim; - int tileD = t % vHeadDim; - int globalKPos = kvStart + tileKPos; - float v = 0.0f; - if(globalKPos < seqLen) { - const T* vPtr = V + ((size_t)n * seqLen + globalKPos) * vTotalDim + kvh * vHeadDim; - v = (float)vPtr[tileD]; - } - vTile[tileKPos * V_TILE_STRIDE + tileD] = v; - } - // Cooperatively load mask tile. - for(int t = tid; t < BLOCK_KV; t += BLOCK_Q) { - int globalKPos = kvStart + t; - float m = 0.0f; - if(globalKPos < seqLen) { - m = (mask != NULL) ? (float)mask[n * seqLen + globalKPos] : 1.0f; - } - kMaskTile[t] = m; - } - __syncthreads(); - - int kvEnd = min(BLOCK_KV, seqLen - kvStart); - - // Each thread updates its Q_PER_THREAD queries against the shared K/V tile. - #pragma unroll - for(int qi = 0; qi < Q_PER_THREAD; qi++) { - int qPos = qBlockStart + qi * BLOCK_Q + tid; - if(qPos >= seqLen || qMask[qi] == 0.0f) continue; - - for(int tk = 0; tk < kvEnd; tk++) { - if(kMaskTile[tk] == 0.0f) continue; - - float dot = 0.0f; - #pragma unroll - for(int d = 0; d < qHeadDim; d++) { - dot += qReg[qi * qHeadDim + d] * kTile[tk * K_TILE_STRIDE + d]; - } - dot *= scale; - - float newMax = fmaxf(runningMax[qi], dot); - float expOldMax = __expf(runningMax[qi] - newMax); - float expCur = __expf(dot - newMax); - - #pragma unroll - for(int d = 0; d < vHeadDim; d++) { - acc[qi * vHeadDim + d] = acc[qi * vHeadDim + d] * expOldMax + expCur * vTile[tk * V_TILE_STRIDE + d]; - } - runningSum[qi] = runningSum[qi] * expOldMax + expCur; - runningMax[qi] = newMax; - } - } - __syncthreads(); - } - - // Write outputs. - #pragma unroll - for(int qi = 0; qi < Q_PER_THREAD; qi++) { - int qPos = qBlockStart + qi * BLOCK_Q + tid; - if(qPos >= seqLen) continue; - T* outRow = output + ((size_t)n * seqLen + qPos) * oTotalDim + h * vHeadDim; - if(qMask[qi] == 0.0f) { - #pragma unroll - for(int d = 0; d < vHeadDim; d++) outRow[d] = (T)0.0f; - } else { - float invSum = (runningSum[qi] > 0.0f) ? (1.0f / runningSum[qi]) : 0.0f; - #pragma unroll - for(int d = 0; d < vHeadDim; d++) outRow[d] = (T)(acc[qi * vHeadDim + d] * invSum); - } - } -} - -template -__global__ -void flashAttentionKernelFloat( - const float* Q, const float* K, const float* V, const float* mask, float* output, - int seqLen, int numHeads, int numKVHeads, float scale -) { - flashAttentionTiledImpl( - Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); -} - -template -__global__ -void flashAttentionKernelHalf( - const half* Q, const half* K, const half* V, const half* mask, half* output, - int seqLen, int numHeads, int numKVHeads, float scale -) { -#ifdef CUDA_SUPPORTS_FP16 - flashAttentionTiledImpl( - Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); -#endif -} - -// Dispatch: pick template instantiation by (qHeadDim, vHeadDim). Add more shapes as needed. - -#define FA_LAUNCH_FLOAT(QD, VD, BQ, BKV, QPT) \ - do { \ - int totalQPerBlock = (BQ) * (QPT); \ - dim3 grid((seqLen + totalQPerBlock - 1) / totalQPerBlock, batchSize * numHeads); \ - flashAttentionKernelFloat<(QD), (VD), (BQ), (BKV), (QPT)><<>>( \ - Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); \ - } while(0) - -#define FA_LAUNCH_HALF(QD, VD, BQ, BKV, QPT) \ - do { \ - int totalQPerBlock = (BQ) * (QPT); \ - dim3 grid((seqLen + totalQPerBlock - 1) / totalQPerBlock, batchSize * numHeads); \ - flashAttentionKernelHalf<(QD), (VD), (BQ), (BKV), (QPT)><<>>( \ - Q, K, V, mask, output, seqLen, numHeads, numKVHeads, scale); \ - } while(0) - -void customCudaFlashAttention( - const float* Q, const float* K, const float* V, const float* mask, float* output, - int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim -) { - if(batchSize * numHeads > 65536) - throw std::runtime_error("customCudaFlashAttention: batchSize * numHeads too large"); - float scale = 1.0f / sqrtf((float)qHeadDim); - // Only (qHeadDim,vHeadDim) pairs that stay comfortably under the 255-register-per-thread cap on - // EVERY target arch are instantiated. The per-thread qReg[qHeadDim]+acc[vHeadDim] arrays (at - // Q_PER_THREAD=1) dominate register use, and ptxas allocation varies by arch: pairs with a head dim - // >= 96 measure ~226-254 regs on sm_80 (clean) but spill on sm_120 (Blackwell), a perf cliff. So - // 96/64, 64/96, 96/96, 128/64, 64/128 and 128/128 are deliberately left unsupported until the - // kernel is restructured (e.g. accumulator/Q tiles in shared memory) to fit large dims under the - // cap on all archs. BLOCK_Q/BLOCK_KV tuning can't fix this (the spill is from the per-thread arrays). - if(qHeadDim == 32 && vHeadDim == 32) FA_LAUNCH_FLOAT(32, 32, 128, 32, 1); - else if(qHeadDim == 32 && vHeadDim == 16) FA_LAUNCH_FLOAT(32, 16, 128, 32, 1); - else if(qHeadDim == 64 && vHeadDim == 64) FA_LAUNCH_FLOAT(64, 64, 128, 32, 1); - else if(qHeadDim == 64 && vHeadDim == 32) FA_LAUNCH_FLOAT(64, 32, 128, 32, 1); - else if(qHeadDim == 32 && vHeadDim == 64) FA_LAUNCH_FLOAT(32, 64, 128, 32, 1); - else throw std::runtime_error("customCudaFlashAttention: unsupported (qHeadDim,vHeadDim) combination"); -} -void customCudaFlashAttention( - const half* Q, const half* K, const half* V, const half* mask, half* output, - int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim -) { - if(batchSize * numHeads > 65536) - throw std::runtime_error("customCudaFlashAttention: batchSize * numHeads too large"); - float scale = 1.0f / sqrtf((float)qHeadDim); - // See the float overload above for why only these small pairs are instantiated (255-register cap, - // arch-dependent spills for head dims >= 96). - if(qHeadDim == 32 && vHeadDim == 32) FA_LAUNCH_HALF(32, 32, 128, 32, 1); - else if(qHeadDim == 32 && vHeadDim == 16) FA_LAUNCH_HALF(32, 16, 128, 32, 1); - else if(qHeadDim == 64 && vHeadDim == 64) FA_LAUNCH_HALF(64, 64, 128, 32, 1); - else if(qHeadDim == 64 && vHeadDim == 32) FA_LAUNCH_HALF(64, 32, 128, 32, 1); - else if(qHeadDim == 32 && vHeadDim == 64) FA_LAUNCH_HALF(32, 64, 128, 32, 1); - else throw std::runtime_error("customCudaFlashAttention: unsupported (qHeadDim,vHeadDim) combination"); -} - -#undef FA_LAUNCH_FLOAT -#undef FA_LAUNCH_HALF - -//-------------------------------------------------------------------------------------------------------------- -// Convert mask [batchSize, seqLen] (0/1) into a fully-materialized additive attention bias of shape -// [batchSize, seqLen, seqLen] suitable for cuDNN SDPA's `[B, 1, S, S]` bias input. -// bias[b, q, k] = (mask[b, k] != 0 ? 0 : -3e4). -// Note: the q dim is fully replicated since the mask only depends on k. -// -// The constant must be a large finite negative to avoid any chance of misbehavior in -// cuDNN's softmax, and it must fit in fp16 (max ~65504) since the bias tensor's dtype must match -// Q/K/V's. We use -3e4, the largest round value that leaves fp16 headroom for the model's own -// logits on top. Measured logit magnitudes on real models as of mid-2026 are < ~500. -// -// Threading: one thread per (b, q, k). Inner-most (warp) axis = k so we write contiguous bytes per -// (b, q) row. Each thread broadcast-reads mask[b, k], so within a warp all 32 lanes read consecutive -// halfs from mask[b, k..k+32) - fully coalesced. - -__global__ -void maskToAttnBiasFullKernel(const float* mask, float* outBias, int seqLen) { - int k = blockIdx.x * blockDim.x + threadIdx.x; - int q = blockIdx.y; - int b = blockIdx.z; - if(k >= seqLen) - return; - float m = mask[b * seqLen + k]; - outBias[((size_t)b * seqLen + q) * seqLen + k] = (m != 0.0f) ? 0.0f : -3e4f; -} - -__global__ -void maskToAttnBiasFullHalfKernel(const half* mask, half* outBias, int seqLen) { -#ifdef CUDA_SUPPORTS_FP16 - int k = blockIdx.x * blockDim.x + threadIdx.x; - int q = blockIdx.y; - int b = blockIdx.z; - if(k >= seqLen) - return; - float m = __half2float(mask[b * seqLen + k]); - outBias[((size_t)b * seqLen + q) * seqLen + k] = __float2half((m != 0.0f) ? 0.0f : -3e4f); -#endif -} - -void customCudaMaskToAttnBiasFull(const float* mask, float* outBias, int batchSize, int seqLen) { - if(batchSize <= 0 || seqLen <= 0) - return; - int threads = 128; - dim3 blocks((seqLen + threads - 1) / threads, seqLen, batchSize); - maskToAttnBiasFullKernel<<>>(mask, outBias, seqLen); -} -void customCudaMaskToAttnBiasFull(const half* mask, half* outBias, int batchSize, int seqLen) { - if(batchSize <= 0 || seqLen <= 0) - return; - int threads = 128; - dim3 blocks((seqLen + threads - 1) / threads, seqLen, batchSize); - maskToAttnBiasFullHalfKernel<<>>(mask, outBias, seqLen); -} - -//-------------------------------------------------------------------------------------------------------------- -// SwiGLU: out[i] = SiLU(a[i]) * b[i] - -__global__ -void swiGLUKernel(const float* a, const float* b, float* out, int size) -{ - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if(idx < size) { - out[idx] = siluf(a[idx]) * b[idx]; - } -} - -__global__ -void swiGLUHalfKernel(const half* a, const half* b, half* out, int size) -{ -#ifdef CUDA_SUPPORTS_FP16 - int idx = blockIdx.x * blockDim.x + threadIdx.x; - if(idx < size) { - float av = __half2float(a[idx]); - float bv = __half2float(b[idx]); - out[idx] = __float2half(siluf(av) * bv); - } -#else - //Do nothing, FP16 not supported -#endif -} - -// Grid-stride pattern (mirrors OpenCL transformerSwiGLU): each thread handles ELTS_PER_THREAD -// half2 pairs separated by blockDim.x. swiGLU is purely memory-bound, so the win is issuing wide -// (32-bit half2) loads/stores instead of scalar 16-bit ones to better use memory bandwidth. -// Operates on pairCount = size/2 half2 elements; a scalar tail handles an odd final element. -template -__global__ -void swiGLUHalfStrideKernel(const half* a, const half* b, half* out, int size) -{ -#ifdef CUDA_SUPPORTS_FP16 - const half2* a2 = reinterpret_cast(a); - const half2* b2 = reinterpret_cast(b); - half2* out2 = reinterpret_cast(out); - int pairCount = size >> 1; - int tileStart = blockIdx.x * blockDim.x * ELTS_PER_THREAD; - int lid = threadIdx.x; - #pragma unroll - for(int d = 0; d < ELTS_PER_THREAD; d++) { - int p = tileStart + d * blockDim.x + lid; - if(p < pairCount) { - half2 av = a2[p]; - half2 bv = b2[p]; - float a0 = __half2float(__low2half(av)); - float a1 = __half2float(__high2half(av)); - float b0 = __half2float(__low2half(bv)); - float b1 = __half2float(__high2half(bv)); - out2[p] = __halves2half2(__float2half(siluf(a0) * b0), __float2half(siluf(a1) * b1)); - } - } - // Tail: if size is odd, the last element isn't covered by any half2 pair. Handle it once. - if((size & 1) != 0) { - int last = size - 1; - if(blockIdx.x == 0 && lid == 0) { - float av = __half2float(a[last]); - float bv = __half2float(b[last]); - out[last] = __float2half(siluf(av) * bv); - } - } -#else - (void)a; (void)b; (void)out; (void)size; -#endif -} - -void customCudaSwiGLU(const float* a, const float* b, float* out, int size) { - if(size <= 0) - return; - int threads = targetNumThreads; - int blocks = (size + threads - 1) / threads; - swiGLUKernel<<>>(a, b, out, size); -} -void customCudaSwiGLU(const half* a, const half* b, half* out, int size) { - if(size <= 0) - return; - constexpr int ELTS_PER_THREAD = 4; // half2 pairs per thread - int threads = 256; - int pairCount = size >> 1; - int blocks = (pairCount + threads * ELTS_PER_THREAD - 1) / (threads * ELTS_PER_THREAD); - if(blocks < 1) blocks = 1; // ensure the odd-size tail still gets a block - swiGLUHalfStrideKernel<<>>(a, b, out, size); -} - -//-------------------------------------------------------------------------------------------------------------- -// Masked residual add: trunk[i] += residual[i] * mask[spatial_idx] -// NCHW: trunk/residual [n, c, xy], mask [n, xy] -// NHWC: trunk/residual [n, xy, c], mask [n, xy] - -__global__ -void maskedResidualAddNCHWKernel(float* trunk, const float* residual, const float* mask, int cSize, int xySize) -{ - int xyIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(xyIdx >= xySize || cIdx >= cSize) - return; - int idx = (nIdx * cSize + cIdx) * xySize + xyIdx; - float m = (mask != NULL) ? mask[nIdx * xySize + xyIdx] : 1.0f; - trunk[idx] += residual[idx] * m; -} - -__global__ -void maskedResidualAddNCHWHalfKernel(half* trunk, const half* residual, const half* mask, int cSize, int xySize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int xyIdx = blockIdx.x * blockDim.x + threadIdx.x; - int cIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(xyIdx >= xySize || cIdx >= cSize) - return; - int idx = (nIdx * cSize + cIdx) * xySize + xyIdx; - float m = (mask != NULL) ? __half2float(mask[nIdx * xySize + xyIdx]) : 1.0f; - trunk[idx] = __float2half(__half2float(trunk[idx]) + __half2float(residual[idx]) * m); -#else - //Do nothing, FP16 not supported -#endif -} - -void customCudaMaskedResidualAddNCHW(float* trunk, const float* residual, const float* mask, int nSize, int cSize, int xySize) { - if(nSize > 65536) - throw std::runtime_error("customCudaMaskedResidualAddNCHW: nSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaMaskedResidualAddNCHW"); - int xyThreads, xyBlocks, cThreads, cBlocks; - splitThreadsAcrossDim01(xySize, cSize, xyThreads, xyBlocks, cThreads, cBlocks); - dim3 grid(xyBlocks, cBlocks, nSize); - dim3 threads(xyThreads, cThreads, 1); - maskedResidualAddNCHWKernel<<>>(trunk, residual, mask, cSize, xySize); -} -void customCudaMaskedResidualAddNCHW(half* trunk, const half* residual, const half* mask, int nSize, int cSize, int xySize) { - if(nSize > 65536) - throw std::runtime_error("customCudaMaskedResidualAddNCHW: nSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaMaskedResidualAddNCHW"); - int xyThreads, xyBlocks, cThreads, cBlocks; - splitThreadsAcrossDim01(xySize, cSize, xyThreads, xyBlocks, cThreads, cBlocks); - dim3 grid(xyBlocks, cBlocks, nSize); - dim3 threads(xyThreads, cThreads, 1); - maskedResidualAddNCHWHalfKernel<<>>(trunk, residual, mask, cSize, xySize); -} - -__global__ -void maskedResidualAddNHWCKernel(float* trunk, const float* residual, const float* mask, int xySize, int cSize) -{ - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int xyIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx >= cSize || xyIdx >= xySize) - return; - int idx = (nIdx * xySize + xyIdx) * cSize + cIdx; - float m = (mask != NULL) ? mask[nIdx * xySize + xyIdx] : 1.0f; - trunk[idx] += residual[idx] * m; -} - -__global__ -void maskedResidualAddNHWCHalfKernel(half* trunk, const half* residual, const half* mask, int xySize, int cSize) -{ -#ifdef CUDA_SUPPORTS_FP16 - int cIdx = blockIdx.x * blockDim.x + threadIdx.x; - int xyIdx = blockIdx.y * blockDim.y + threadIdx.y; - int nIdx = blockIdx.z; - if(cIdx >= cSize || xyIdx >= xySize) - return; - int idx = (nIdx * xySize + xyIdx) * cSize + cIdx; - float m = (mask != NULL) ? __half2float(mask[nIdx * xySize + xyIdx]) : 1.0f; - trunk[idx] = __float2half(__half2float(trunk[idx]) + __half2float(residual[idx]) * m); -#else - //Do nothing, FP16 not supported -#endif -} - -void customCudaMaskedResidualAddNHWC(float* trunk, const float* residual, const float* mask, int nSize, int xySize, int cSize) { - if(nSize > 65536) - throw std::runtime_error("customCudaMaskedResidualAddNHWC: nSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaMaskedResidualAddNHWC"); - int cThreads, cBlocks, xyThreads, xyBlocks; - splitThreadsAcrossDim01(cSize, xySize, cThreads, cBlocks, xyThreads, xyBlocks); - dim3 grid(cBlocks, xyBlocks, nSize); - dim3 threads(cThreads, xyThreads, 1); - maskedResidualAddNHWCKernel<<>>(trunk, residual, mask, xySize, cSize); -} -void customCudaMaskedResidualAddNHWC(half* trunk, const half* residual, const half* mask, int nSize, int xySize, int cSize) { - if(nSize > 65536) - throw std::runtime_error("customCudaMaskedResidualAddNHWC: nSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaMaskedResidualAddNHWC"); - int cThreads, cBlocks, xyThreads, xyBlocks; - splitThreadsAcrossDim01(cSize, xySize, cThreads, cBlocks, xyThreads, xyBlocks); - dim3 grid(cBlocks, xyBlocks, nSize); - dim3 threads(cThreads, xyThreads, 1); - maskedResidualAddNHWCHalfKernel<<>>(trunk, residual, mask, xySize, cSize); -} - -//-------------------------------------------------------------------------------------------------------------- -// RMSNorm with gamma/beta/activation (for trunk tip, non-spatial mode). -// NHWC: input/output [n, xy, c], gamma/beta [c], mask [n, xy] -// Each block handles one (n, xy) position. - -__global__ -void rmsNormGammaBetaNHWCKernel( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - int nSize, int xySize, int cSize, float epsilon, int activation -) { - extern __shared__ float rmsShared[]; - int pos = blockIdx.x; // n * xySize + xy - int tid = threadIdx.x; - int n = pos / xySize; - int xy = pos % xySize; - if(n >= nSize) - return; - - float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; - - const float* inRow = in + (size_t)pos * cSize; - - float acc = 0.0f; - for(int c = tid; c < cSize; c += blockDim.x) { - float val = inRow[c] * maskVal; - acc += val * val; - } - rmsShared[tid] = acc; - __syncthreads(); - for(int s = blockDim.x / 2; s > 0; s >>= 1) { - if(tid < s) rmsShared[tid] += rmsShared[tid + s]; - __syncthreads(); - } - float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); - - float* outRow = out + (size_t)pos * cSize; - for(int c = tid; c < cSize; c += blockDim.x) { - float val = inRow[c] * maskVal * rms * gamma[c] + beta[c]; - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - outRow[c] = val; - } -} - -// Vectorized half2 path: each thread loads ELTS_PER_THREAD half2 values (= 2*ELTS_PER_THREAD halfs). -// Block size = cSize / (2 * ELTS_PER_THREAD), rounded up to a warp multiple. -// In-row values are kept in registers across the two passes so the kernel reads `in` only once. -// Per-warp reduction via __shfl_xor_sync, then a single inter-warp reduction in shared memory. -// -// Requires cSize % (2 * ELTS_PER_THREAD) == 0. - -template -__global__ -void rmsNormGammaBetaNHWCHalfVecKernel( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int xySize, int cSize, float epsilon, int activation -) { -#ifdef CUDA_SUPPORTS_FP16 - int pos = blockIdx.x; - int tid = threadIdx.x; - int n = pos / xySize; - int xy = pos % xySize; - if(n >= nSize) - return; - - constexpr int VALS_PER_THREAD = 2 * ELTS_PER_THREAD; - float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - - const half2* inRow2 = reinterpret_cast(in + (size_t)pos * cSize); - const half2* gamma2 = reinterpret_cast(gamma); - const half2* beta2 = reinterpret_cast(beta); - half2* outRow2 = reinterpret_cast(out + (size_t)pos * cSize); - - // Stage 1: load all of this thread's values into registers, compute sum of squares. - float vals[VALS_PER_THREAD]; - float acc = 0.0f; - #pragma unroll - for(int e = 0; e < ELTS_PER_THREAD; e++) { - int idx2 = tid + e * blockDim.x; // half2-pair index - half2 v2 = inRow2[idx2]; - float v0 = __half2float(__low2half(v2)) * maskVal; - float v1 = __half2float(__high2half(v2)) * maskVal; - vals[2*e] = v0; - vals[2*e + 1] = v1; - acc += v0 * v0 + v1 * v1; - } - - // Stage 2: warp reduce, then inter-warp reduce via shared memory. - for(int off = 16; off > 0; off >>= 1) acc += __shfl_xor_sync(0xffffffff, acc, off); - __shared__ float warpSums[32]; // max 32 warps per block (1024 threads); we use far fewer. - int warpId = tid >> 5; - int laneId = tid & 31; - if(laneId == 0) warpSums[warpId] = acc; - __syncthreads(); - - // First warp combines per-warp sums. - int numWarps = (blockDim.x + 31) >> 5; - float total = 0.0f; - if(tid < numWarps) total = warpSums[tid]; - if(tid < 32) { - for(int off = 16; off > 0; off >>= 1) total += __shfl_xor_sync(0xffffffff, total, off); - if(tid == 0) warpSums[0] = total; - } - __syncthreads(); - float rms = rsqrtf(warpSums[0] / (float)cSize + epsilon); - - // Stage 3: compute output, reusing `vals` from registers. - #pragma unroll - for(int e = 0; e < ELTS_PER_THREAD; e++) { - int idx2 = tid + e * blockDim.x; - half2 g2 = gamma2[idx2]; - half2 b2 = beta2[idx2]; - float g0 = __half2float(__low2half(g2)); - float g1 = __half2float(__high2half(g2)); - float b0 = __half2float(__low2half(b2)); - float b1 = __half2float(__high2half(b2)); - float o0 = vals[2*e] * rms * g0 + b0; - float o1 = vals[2*e + 1] * rms * g1 + b1; - if(activation == ACTIVATION_RELU) { - o0 = fmaxf(o0, 0.0f); - o1 = fmaxf(o1, 0.0f); - } else if(activation == ACTIVATION_MISH) { - o0 = mishf(o0); - o1 = mishf(o1); - } else if(activation == ACTIVATION_SILU) { - o0 = siluf(o0); - o1 = siluf(o1); - } - o0 *= maskVal; - o1 *= maskVal; - outRow2[idx2] = __halves2half2(__float2half(o0), __float2half(o1)); - } -#else - (void)in; (void)out; (void)gamma; (void)beta; (void)mask; - (void)nSize; (void)xySize; (void)cSize; (void)epsilon; (void)activation; -#endif -} - -// Generic (scalar) fallback for shapes the vectorized path can't handle. -__global__ -void rmsNormGammaBetaNHWCHalfKernel( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int xySize, int cSize, float epsilon, int activation -) { -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float rmsShared[]; - int pos = blockIdx.x; - int tid = threadIdx.x; - int n = pos / xySize; - int xy = pos % xySize; - if(n >= nSize) - return; - - float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - - const half* inRow = in + (size_t)pos * cSize; - - float acc = 0.0f; - for(int c = tid; c < cSize; c += blockDim.x) { - float val = __half2float(inRow[c]) * maskVal; - acc += val * val; - } - rmsShared[tid] = acc; - __syncthreads(); - for(int s = blockDim.x / 2; s > 0; s >>= 1) { - if(tid < s) rmsShared[tid] += rmsShared[tid + s]; - __syncthreads(); - } - float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); - - half* outRow = out + (size_t)pos * cSize; - for(int c = tid; c < cSize; c += blockDim.x) { - float val = __half2float(inRow[c]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - outRow[c] = __float2half(val); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void customCudaRMSNormGammaBetaNHWC( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - int nSize, int xySize, int cSize, float epsilon, int activation -) { - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaRMSNormGammaBetaNHWC"); - int totalPositions = nSize * xySize; - if(totalPositions <= 0) - return; - int threads = 1; - while(threads < cSize && threads < targetNumThreads) threads *= 2; - int sharedMem = threads * sizeof(float); - rmsNormGammaBetaNHWCKernel<<>>( - in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); -} -void customCudaRMSNormGammaBetaNHWC( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int xySize, int cSize, float epsilon, int activation -) { - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaRMSNormGammaBetaNHWC"); - int totalPositions = nSize * xySize; - if(totalPositions <= 0) - return; - // Vectorized path: cSize must be even (use half2). Pick ELTS_PER_THREAD so we end up with a - // power-of-two thread count that's a multiple of 32 (warp size) and <= 512. - // For cSize=384 -> 192 half2 pairs -> 192 threads, 1 elt/thread. - // For cSize=768 -> 384 half2 pairs -> 384 threads, 1 elt/thread. - // For cSize=1024 -> 512 half2 pairs -> 512 threads, 1 elt/thread. - // Larger cSize -> 2 or more pairs per thread. - if(cSize % 2 == 0) { - int halfPairs = cSize / 2; - if(halfPairs <= 512 && halfPairs % 32 == 0) { - rmsNormGammaBetaNHWCHalfVecKernel<1><<>>( - in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); - return; - } - if(halfPairs % (2 * 32) == 0 && halfPairs / 2 <= 512) { - rmsNormGammaBetaNHWCHalfVecKernel<2><<>>( - in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); - return; - } - if(halfPairs % (4 * 32) == 0 && halfPairs / 4 <= 512) { - rmsNormGammaBetaNHWCHalfVecKernel<4><<>>( - in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); - return; - } - } - // Fallback to scalar kernel. - int threads = 1; - while(threads < cSize && threads < targetNumThreads) threads *= 2; - int sharedMem = threads * sizeof(float); - rmsNormGammaBetaNHWCHalfKernel<<>>( - in, out, gamma, beta, mask, nSize, xySize, cSize, epsilon, activation); -} - -// NCHW variant: input/output [n, c, xy], gamma/beta [c], mask [n, xy] -// Each block handles one (n, xy) position. Need to stride over channels. -__global__ -void rmsNormGammaBetaNCHWKernel( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - int nSize, int cSize, int xySize, float epsilon, int activation -) { - extern __shared__ float rmsShared[]; - int pos = blockIdx.x; // n * xySize + xy - int tid = threadIdx.x; - int n = pos / xySize; - int xy = pos % xySize; - if(n >= nSize) - return; - - float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; - - float acc = 0.0f; - for(int c = tid; c < cSize; c += blockDim.x) { - float val = in[(n * cSize + c) * xySize + xy] * maskVal; - acc += val * val; - } - rmsShared[tid] = acc; - __syncthreads(); - for(int s = blockDim.x / 2; s > 0; s >>= 1) { - if(tid < s) rmsShared[tid] += rmsShared[tid + s]; - __syncthreads(); - } - float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); - - for(int c = tid; c < cSize; c += blockDim.x) { - float val = in[(n * cSize + c) * xySize + xy] * maskVal * rms * gamma[c] + beta[c]; - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - out[(n * cSize + c) * xySize + xy] = val; - } -} - -__global__ -void rmsNormGammaBetaNCHWHalfKernel( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int cSize, int xySize, float epsilon, int activation -) { -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float rmsShared[]; - int pos = blockIdx.x; - int tid = threadIdx.x; - int n = pos / xySize; - int xy = pos % xySize; - if(n >= nSize) - return; - - float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - - float acc = 0.0f; - for(int c = tid; c < cSize; c += blockDim.x) { - float val = __half2float(in[(n * cSize + c) * xySize + xy]) * maskVal; - acc += val * val; - } - rmsShared[tid] = acc; - __syncthreads(); - for(int s = blockDim.x / 2; s > 0; s >>= 1) { - if(tid < s) rmsShared[tid] += rmsShared[tid + s]; - __syncthreads(); - } - float rms = rsqrtf(rmsShared[0] / (float)cSize + epsilon); - - for(int c = tid; c < cSize; c += blockDim.x) { - float val = __half2float(in[(n * cSize + c) * xySize + xy]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - out[(n * cSize + c) * xySize + xy] = __float2half(val); - } -#else - //Do nothing, FP16 not supported -#endif -} - -void customCudaRMSNormGammaBetaNCHW( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - int nSize, int cSize, int xySize, float epsilon, int activation -) { - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaRMSNormGammaBetaNCHW"); - int totalPositions = nSize * xySize; - if(totalPositions <= 0) - return; - int threads = 1; - while(threads < cSize && threads < targetNumThreads) threads *= 2; - int sharedMem = threads * sizeof(float); - rmsNormGammaBetaNCHWKernel<<>>( - in, out, gamma, beta, mask, nSize, cSize, xySize, epsilon, activation); -} -void customCudaRMSNormGammaBetaNCHW( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int cSize, int xySize, float epsilon, int activation -) { - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaRMSNormGammaBetaNCHW"); - int totalPositions = nSize * xySize; - if(totalPositions <= 0) - return; - int threads = 1; - while(threads < cSize && threads < targetNumThreads) threads *= 2; - int sharedMem = threads * sizeof(float); - rmsNormGammaBetaNCHWHalfKernel<<>>( - in, out, gamma, beta, mask, nSize, cSize, xySize, epsilon, activation); -} - -//-------------------------------------------------------------------------------------------------------------- -// Spatial RMSNorm: normalize over all C*H*W per batch element. -// NHWC: input/output [n, xy, c], gamma/beta [c], mask [n, xy], maskSum [n] -// NCHW: input/output [n, c, xy], gamma/beta [c], mask [n, xy], maskSum [n] -// -// Three-pass, deterministic: -// Pass 1 (SumSq): grid (numBlocksPerBatch, nSize). Many blocks per batch element grid-stride over -// the flat C*xy range, reduce in-block, write one partial per block into partialBuf. -// Pass 2 (Reduce): grid (nSize). One block per batch element sums its numBlocksPerBatch partials -// (fixed order) into sumSqBuf[n]. -// Pass 3 (Apply): grid (numApplyBlocks, nSize). Normalize + activation + remask, vectorized. -// -// The reduction in pass 1 is layout-agnostic: the value array is flat [n, C*xy] in both NHWC and NCHW, -// so we load it flat (half2-vectorized). Only the mask's xy derivation differs by layout. -// -// sumSqBuf layout: [nSize * (SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1)] floats. -// [n * stride + 0 .. + numBlocksPerBatch-1] = pass-1 partials, written by pass 1, read by pass 2. -// [n * stride + numBlocksPerBatch] = final sum of squares, written by pass 2, read by pass 3. - -static const int SPATIAL_RMSNORM_BLOCKS_PER_BATCH = 8; -// partialStride is always CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE; keep them in sync with the backend's alloc. -static_assert(CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE == SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1, - "CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE must equal SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1"); - -// Choose how many blocks per batch element to launch for pass 1. Capped so each block gets enough -// work to amortize launch/reduction, and so pass 2 can reduce the partials within a single block. -static int spatialRMSNormBlocksPerBatch(int totalElems) { - int maxUseful = (totalElems + targetNumThreads - 1) / targetNumThreads; - if(maxUseful < 1) maxUseful = 1; - int b = SPATIAL_RMSNORM_BLOCKS_PER_BATCH; - if(b > maxUseful) b = maxUseful; - return b; -} - -// Pass 1: partial sum of squares. One block computes one partial over a strided slice of the flat range. -template -__global__ -void spatialRMSNormSumSqKernel( - const float* in, const float* mask, float* partialBuf, - int totalElems, int cSize, int xySize, int numBlocksPerBatch, int partialStride -) { - extern __shared__ float srmsShared[]; - int n = blockIdx.y; - int blk = blockIdx.x; - int tid = threadIdx.x; - - const float* inRow = in + (size_t)n * totalElems; - - float acc = 0.0f; - // Grid-stride over the flat range, this block covers indices blk, blk+numBlocksPerBatch, ... in tiles. - for(int i = blk * blockDim.x + tid; i < totalElems; i += blockDim.x * numBlocksPerBatch) { - int xy = IS_NHWC ? (i / cSize) : (i % xySize); - float m = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; - float val = inRow[i] * m; - acc += val * val; - } - srmsShared[tid] = acc; - __syncthreads(); - for(int s = blockDim.x / 2; s > 0; s >>= 1) { - if(tid < s) srmsShared[tid] += srmsShared[tid + s]; - __syncthreads(); - } - if(tid == 0) partialBuf[n * partialStride + blk] = srmsShared[0]; -} - -template -__global__ -void spatialRMSNormSumSqHalfKernel( - const half* in, const half* mask, float* partialBuf, - int totalElems, int cSize, int xySize, int numBlocksPerBatch, int partialStride -) { -#ifdef CUDA_SUPPORTS_FP16 - extern __shared__ float srmsShared[]; - int n = blockIdx.y; - int blk = blockIdx.x; - int tid = threadIdx.x; - - const half* inRow = in + (size_t)n * totalElems; - - float acc = 0.0f; - // For NHWC, two consecutive flat elements share the same xy (same mask), so vectorize with half2. - if(IS_NHWC && (cSize & 1) == 0) { - int totalPairs = totalElems >> 1; - const half2* inRow2 = reinterpret_cast(inRow); - int cPairs = cSize >> 1; - for(int p = blk * blockDim.x + tid; p < totalPairs; p += blockDim.x * numBlocksPerBatch) { - int xy = p / cPairs; - float m = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - half2 v2 = inRow2[p]; - float v0 = __half2float(__low2half(v2)) * m; - float v1 = __half2float(__high2half(v2)) * m; - acc += v0 * v0 + v1 * v1; - } - } - else { - for(int i = blk * blockDim.x + tid; i < totalElems; i += blockDim.x * numBlocksPerBatch) { - int xy = IS_NHWC ? (i / cSize) : (i % xySize); - float m = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - float val = __half2float(inRow[i]) * m; - acc += val * val; - } - } - srmsShared[tid] = acc; - __syncthreads(); - for(int s = blockDim.x / 2; s > 0; s >>= 1) { - if(tid < s) srmsShared[tid] += srmsShared[tid + s]; - __syncthreads(); - } - if(tid == 0) partialBuf[n * partialStride + blk] = srmsShared[0]; -#else - //Do nothing, FP16 not supported -#endif -} - -// Pass 2: reduce numBlocksPerBatch partials per batch element to a single value, in fixed order. -__global__ -void spatialRMSNormReduceKernel( - const float* partialBuf, float* sumSqBuf, int numBlocksPerBatch, int partialStride -) { - int n = blockIdx.x; - // numBlocksPerBatch is small (<= SPATIAL_RMSNORM_BLOCKS_PER_BATCH); a single thread sums in fixed order. - if(threadIdx.x != 0) - return; - float total = 0.0f; - const float* row = partialBuf + (size_t)n * partialStride; - for(int b = 0; b < numBlocksPerBatch; b++) - total += row[b]; - sumSqBuf[n * partialStride + numBlocksPerBatch] = total; -} - -// Pass 3 (apply): NHWC. grid (numApplyBlocks, nSize). Flat over C*xy; recover c = i % cSize, xy = i / cSize. -__global__ -void spatialRMSNormApplyNHWCKernel( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - const float* maskSum, const float* sumSqBuf, - int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride -) { - int n = blockIdx.y; - float mSum = maskSum[n]; - float totalSize = mSum * (float)cSize; - float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); - - const float* inRow = in + (size_t)n * totalElems; - float* outRow = out + (size_t)n * totalElems; - - for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { - int xy = i / cSize; - int c = i - xy * cSize; - float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; - float val = inRow[i] * maskVal * rms * gamma[c] + beta[c]; - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - outRow[i] = val; - } -} - -__global__ -void spatialRMSNormApplyNHWCHalfKernel( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - const float* maskSum, const float* sumSqBuf, - int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride -) { -#ifdef CUDA_SUPPORTS_FP16 - int n = blockIdx.y; - float mSum = maskSum[n]; - float totalSize = mSum * (float)cSize; - float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); - - const half* inRow = in + (size_t)n * totalElems; - half* outRow = out + (size_t)n * totalElems; - - // half2 path: a pair (i, i+1) shares xy/mask; gamma/beta indexed at c, c+1. - if((cSize & 1) == 0) { - int totalPairs = totalElems >> 1; - int cPairs = cSize >> 1; - const half2* inRow2 = reinterpret_cast(inRow); - const half2* gamma2 = reinterpret_cast(gamma); - const half2* beta2 = reinterpret_cast(beta); - half2* outRow2 = reinterpret_cast(outRow); - for(int p = blockIdx.x * blockDim.x + threadIdx.x; p < totalPairs; p += blockDim.x * gridDim.x) { - int xy = p / cPairs; - int cp = p - xy * cPairs; - float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - half2 v2 = inRow2[p]; - half2 g2 = gamma2[cp]; - half2 b2 = beta2[cp]; - float o0 = __half2float(__low2half(v2)) * maskVal * rms * __half2float(__low2half(g2)) + __half2float(__low2half(b2)); - float o1 = __half2float(__high2half(v2)) * maskVal * rms * __half2float(__high2half(g2)) + __half2float(__high2half(b2)); - if(activation == ACTIVATION_RELU) { o0 = fmaxf(o0, 0.0f); o1 = fmaxf(o1, 0.0f); } - else if(activation == ACTIVATION_MISH) { o0 = mishf(o0); o1 = mishf(o1); } - else if(activation == ACTIVATION_SILU) { o0 = siluf(o0); o1 = siluf(o1); } - o0 *= maskVal; o1 *= maskVal; - outRow2[p] = __halves2half2(__float2half(o0), __float2half(o1)); - } - } - else { - for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { - int xy = i / cSize; - int c = i - xy * cSize; - float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - float val = __half2float(inRow[i]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - outRow[i] = __float2half(val); - } - } -#else - //Do nothing, FP16 not supported -#endif -} - -// Pass 3 (apply): NCHW. Flat over C*xy; recover c = i / xySize, xy = i % xySize. -__global__ -void spatialRMSNormApplyNCHWKernel( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - const float* maskSum, const float* sumSqBuf, - int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride -) { - int n = blockIdx.y; - float mSum = maskSum[n]; - float totalSize = mSum * (float)cSize; - float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); - - const float* inRow = in + (size_t)n * totalElems; - float* outRow = out + (size_t)n * totalElems; - - for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { - int c = i / xySize; - int xy = i - c * xySize; - float maskVal = (mask != NULL) ? mask[n * xySize + xy] : 1.0f; - float val = inRow[i] * maskVal * rms * gamma[c] + beta[c]; - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - outRow[i] = val; - } -} - -__global__ -void spatialRMSNormApplyNCHWHalfKernel( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - const float* maskSum, const float* sumSqBuf, - int totalElems, int cSize, int xySize, float epsilon, int activation, int numBlocksPerBatch, int partialStride -) { -#ifdef CUDA_SUPPORTS_FP16 - int n = blockIdx.y; - float mSum = maskSum[n]; - float totalSize = mSum * (float)cSize; - float rms = rsqrtf(sumSqBuf[n * partialStride + numBlocksPerBatch] / totalSize + epsilon); - - const half* inRow = in + (size_t)n * totalElems; - half* outRow = out + (size_t)n * totalElems; - - for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < totalElems; i += blockDim.x * gridDim.x) { - int c = i / xySize; - int xy = i - c * xySize; - float maskVal = (mask != NULL) ? __half2float(mask[n * xySize + xy]) : 1.0f; - float val = __half2float(inRow[i]) * maskVal * rms * __half2float(gamma[c]) + __half2float(beta[c]); - if(activation == ACTIVATION_RELU) val = fmaxf(val, 0.0f); - else if(activation == ACTIVATION_MISH) val = mishf(val); - else if(activation == ACTIVATION_SILU) val = siluf(val); - val *= maskVal; - outRow[i] = __float2half(val); - } -#else - //Do nothing, FP16 not supported -#endif -} - -//-- Host launchers ---------------------------------------------------------------------------------- - -static int spatialRMSNormApplyBlocks(int totalElems, int threads) { - int blocks = (totalElems + threads - 1) / threads; - if(blocks < 1) blocks = 1; - if(blocks > 256) blocks = 256; // grid-stride caps the block count; this saturates the GPU - return blocks; -} - -void customCudaSpatialRMSNormNHWC( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, - int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf -) { - if(nSize <= 0) - return; - if(nSize > 65536) - throw std::runtime_error("customCudaSpatialRMSNormNHWC: nSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaSpatialRMSNormNHWC"); - int totalElems = xySize * cSize; - int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); - int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; - - int threads1 = targetNumThreads; - int sharedMem1 = threads1 * sizeof(float); - dim3 grid1(numBlocksPerBatch, nSize); - spatialRMSNormSumSqKernel<<>>( - in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); - - spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); - - int threads2 = targetNumThreads; - int applyBlocks = spatialRMSNormApplyBlocks(totalElems / 2, threads2); - dim3 grid2(applyBlocks, nSize); - spatialRMSNormApplyNHWCKernel<<>>( - in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); -} -void customCudaSpatialRMSNormNHWC( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, - int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf -) { - if(nSize <= 0) - return; - if(nSize > 65536) - throw std::runtime_error("customCudaSpatialRMSNormNHWC: nSize too large"); - checkBufferIndexFitsInt(nSize, xySize, cSize, "customCudaSpatialRMSNormNHWC"); - int totalElems = xySize * cSize; - int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); - int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; - - int threads1 = targetNumThreads; - int sharedMem1 = threads1 * sizeof(float); - dim3 grid1(numBlocksPerBatch, nSize); - spatialRMSNormSumSqHalfKernel<<>>( - in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); - - spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); - - int threads2 = targetNumThreads; - int applyBlocks = spatialRMSNormApplyBlocks(totalElems / 2, threads2); - dim3 grid2(applyBlocks, nSize); - spatialRMSNormApplyNHWCHalfKernel<<>>( - in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); -} - -void customCudaSpatialRMSNormNCHW( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, - int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf -) { - if(nSize <= 0) - return; - if(nSize > 65536) - throw std::runtime_error("customCudaSpatialRMSNormNCHW: nSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaSpatialRMSNormNCHW"); - int totalElems = cSize * xySize; - int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); - int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; - - int threads1 = targetNumThreads; - int sharedMem1 = threads1 * sizeof(float); - dim3 grid1(numBlocksPerBatch, nSize); - spatialRMSNormSumSqKernel<<>>( - in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); - - spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); - - int threads2 = targetNumThreads; - int applyBlocks = spatialRMSNormApplyBlocks(totalElems, threads2); - dim3 grid2(applyBlocks, nSize); - spatialRMSNormApplyNCHWKernel<<>>( - in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); -} -void customCudaSpatialRMSNormNCHW( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, - int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf -) { - if(nSize <= 0) - return; - if(nSize > 65536) - throw std::runtime_error("customCudaSpatialRMSNormNCHW: nSize too large"); - checkBufferIndexFitsInt(nSize, cSize, xySize, "customCudaSpatialRMSNormNCHW"); - int totalElems = cSize * xySize; - int numBlocksPerBatch = spatialRMSNormBlocksPerBatch(totalElems); - int partialStride = SPATIAL_RMSNORM_BLOCKS_PER_BATCH + 1; - - int threads1 = targetNumThreads; - int sharedMem1 = threads1 * sizeof(float); - dim3 grid1(numBlocksPerBatch, nSize); - spatialRMSNormSumSqHalfKernel<<>>( - in, mask, sumSqBuf, totalElems, cSize, xySize, numBlocksPerBatch, partialStride); - spatialRMSNormReduceKernel<<>>(sumSqBuf, sumSqBuf, numBlocksPerBatch, partialStride); +#define KATAGO_GPU_CUDA 1 +#define KATAGO_GPU_SINCOSF __sincosf - int threads2 = targetNumThreads; - int applyBlocks = spatialRMSNormApplyBlocks(totalElems, threads2); - dim3 grid2(applyBlocks, nSize); - spatialRMSNormApplyNCHWHalfKernel<<>>( - in, out, gamma, beta, mask, maskSum, sumSqBuf, totalElems, cSize, xySize, epsilon, activation, numBlocksPerBatch, partialStride); -} +#include "../neuralnet/cudaandrocmhelpers.inc" diff --git a/cpp/neuralnet/cudahelpers.h b/cpp/neuralnet/cudahelpers.h index 7f9e07d9e9..e1b277936b 100644 --- a/cpp/neuralnet/cudahelpers.h +++ b/cpp/neuralnet/cudahelpers.h @@ -4,144 +4,6 @@ #include "../neuralnet/cudaincludes.h" #include "../neuralnet/activations.h" -//Given two tensors with shapes inA: [n,cA,h,w] and inB: [n,cB,h,w], that are on the GPU -//Copy them into a single tensor out: [n,cA+cB,h,w] that is also allocated on the gpu -void customCudaChannelConcat(const float* inA, const float* inB, float* out, int chwA, int chwB, int n); -void customCudaChannelConcat(const half* inA, const half* inB, half* out, int chwA, int chwB, int n); - -//Given a tensor [n,c,hw], extract out channel 0 to [n,hw] -void customCudaChannel0ExtractNCHW(const float* in, float* out, int n, int c, int hw); -void customCudaChannel0ExtractNCHW(const half* in, half* out, int n, int c, int hw); -//Given a tensor [n,hw,c], extract out channel 0 to [n,hw] -void customCudaChannel0ExtractNHWC(const float* in, float* out, int n, int hw, int c); -void customCudaChannel0ExtractNHWC(const half* in, half* out, int n, int hw, int c); - -//Given an input tensor and an output buffer of shape [n,c], fill output buffer with sum or max over c. -void customCudaPoolRowsSumNCHW(const float* in, float* out, int nSize, int cSize, int xySize, float scaleSum); -void customCudaPoolRowsSumNHWC(const float* in, float* out, int nSize, int xySize, int cSize, float scaleSum); - -//Specialized operations for value head and general global pooling. Same as the other pooling, but fusedly fills -//an output buffer of shape [n,c*3]. -void customCudaValueHeadPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* maskSum); -void customCudaValueHeadPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* maskSum); -void customCudaPoolRowsGPoolNCHW(const float* in, float* out, int nSize, int cSize, int xySize, const float* mask, const float* maskSum); -void customCudaPoolRowsGPoolNHWC(const float* in, float* out, int nSize, int xySize, int cSize, const float* mask, const float* maskSum); -void customCudaPoolRowsGPoolNCHW(const half* in, half* out, int nSize, int cSize, int xySize, const half* mask, const float* maskSum); -void customCudaPoolRowsGPoolNHWC(const half* in, half* out, int nSize, int xySize, int cSize, const half* mask, const float* maskSum); - -void customCudaCopyToHalf(const float* in, half* out, int n); -void customCudaCopyFromHalf(const half* in, float* out, int n); - -//Given a tensor, add another tensor to it. -void customCudaAddTensorInplace(half* buf, const half* biases, int n); -//Given an input with shape [n,c] and biases of shape [c], add the biases in-place. -void customCudaAddCBiasInplaceNC(float* buf, const float* biases, int n, int c, int activation); -void customCudaAddCBiasInplaceNC(half* buf, const half* biases, int n, int c, int activation); -//Given an input with shape [n,c,xy] and biases of shape [n,c], add the biases in-place. -void customCudaAddNCBiasInplaceNCHW(float *buf, const float* biases, int nSize, int cSize, int xySize); -void customCudaAddNCBiasInplaceNCHW(half *buf, const half* biases, int nSize, int cSize, int xySize); -//Given an input with shape [n,xy,c] and biases of shape [n,c], add the biases in-place. -void customCudaAddNCBiasInplaceNHWC(float *buf, const float* biases, int nSize, int xySize, int cSize); -void customCudaAddNCBiasInplaceNHWC(half *buf, const half* biases, int nSize, int xySize, int cSize); - -//Given an input with shape [n,c,xy] and scale and biases of shape [c], multiply by scale and add the biases -//Optionally also apply an activation. -//Optionally also multiply by mask (can be null), with shape [n,xy] -void customCudaApplyCScaleBiasNCHW(const float* in, float* out, const float* scale, const float* biases, const float* mask, int n, int c, int xy, int activation); -void customCudaApplyCScaleBiasNCHW(const half* in, half* out, const half* scale, const half* biases, const half* mask, int n, int c, int xy, int activation); -//Given an input with shape [n,xy,c] and scale and biases of shape [c], multiply by scale and add the biases -//Optionally also apply relu. -//Optionally also multiply by mask (can be null), with shape [n,xy] -void customCudaApplyCScaleBiasNHWC(const float* in, float* out, const float* scale, const float* biases, const float* mask, int n, int xy, int c, int activation); -void customCudaApplyCScaleBiasNHWC(const half* in, half* out, const half* scale, const half* biases, const half* mask, int n, int xy, int c, int activation); - -//Apply RoPE (rotary position embeddings) in-place on Q or K buffer. -//buf has shape [totalDim, seqLen*batchSize] (column-major). -//cosTable/sinTable have shape depending on learnable: if learnable, [numKVHeads*numPairs*seqLen], else [numPairs*seqLen]. -void customCudaApplyRoPE( - float* buf, const float* cosTable, const float* sinTable, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope); -void customCudaApplyRoPE( - half* buf, const half* cosTable, const half* sinTable, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, bool learnableRope); - -//Table-free learnable RoPE: recompute cos/sin in-kernel from the per-head frequencies instead of -//reading a precomputed cos/sin table (which is numKVHeads-times larger than the fixed-RoPE table and -//spills L2 for many heads). freqs has shape [numKVHeads, numPairs, 2] flattened (FP32 even for the -//half buf, since it is tiny and used for full-precision angle accumulation). -void customCudaApplyRoPELearnableRecompute( - float* buf, const float* freqs, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen); -void customCudaApplyRoPELearnableRecompute( - half* buf, const float* freqs, - int batchSize, int seqLen, int numBufHeads, int numKVHeads, int qHeadDim, int numPairs, int nnXLen); - -//Convert a [batchSize, seqLen] mask (0/1) into a fully-materialized additive attention bias of shape -//[batchSize, seqLen, seqLen] suitable for cuDNN SDPA's [B, 1, S, S] bias input: -// bias[b, q, k] = (mask[b, k] != 0 ? 0 : -3e4). -//See the comment in cudahelpers.cu for why this bias value for the mask. -void customCudaMaskToAttnBiasFull(const float* mask, float* outBias, int batchSize, int seqLen); -void customCudaMaskToAttnBiasFull(const half* mask, half* outBias, int batchSize, int seqLen); - -//FlashAttention-style scaled dot product attention with online softmax. -//Layout (BSHD, matching CUDA backend's Q/K/V buffers from MatMulLayer): -// Q: [batchSize*seqLen, numHeads*qHeadDim] row-major -// i.e. element at (n, xy, h, d) = Q[(h*qHeadDim + d) + (n*seqLen + xy)*(numHeads*qHeadDim)] -// K: [batchSize*seqLen, numKVHeads*qHeadDim] row-major -// V: [batchSize*seqLen, numKVHeads*vHeadDim] row-major -// Output: [batchSize*seqLen, numHeads*vHeadDim] row-major (same layout as Q/V). -// mask: [batchSize, seqLen] (0 means masked). -//No score-matrix materialization; output is computed via online softmax. -void customCudaFlashAttention( - const float* Q, const float* K, const float* V, const float* mask, float* output, - int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim); -void customCudaFlashAttention( - const half* Q, const half* K, const half* V, const half* mask, half* output, - int batchSize, int seqLen, int numHeads, int numKVHeads, int qHeadDim, int vHeadDim); - -//SwiGLU: out[i] = SiLU(a[i]) * b[i], where SiLU(x) = x / (1 + exp(-x)) -void customCudaSwiGLU(const float* a, const float* b, float* out, int size); -void customCudaSwiGLU(const half* a, const half* b, half* out, int size); - -//Masked residual add: trunk[i] += residual[i] * mask[spatial_idx], for NHWC or NCHW layouts. -//mask has shape [n, xy]. -void customCudaMaskedResidualAddNCHW(float* trunk, const float* residual, const float* mask, int nSize, int cSize, int xySize); -void customCudaMaskedResidualAddNCHW(half* trunk, const half* residual, const half* mask, int nSize, int cSize, int xySize); -void customCudaMaskedResidualAddNHWC(float* trunk, const float* residual, const float* mask, int nSize, int xySize, int cSize); -void customCudaMaskedResidualAddNHWC(half* trunk, const half* residual, const half* mask, int nSize, int xySize, int cSize); - -//RMSNorm with gamma/beta and optional activation. Non-spatial: per-position across channels. -//input/output [n, xy, c] NHWC or [n, c, xy] NCHW. gamma/beta shape [c]. -void customCudaRMSNormGammaBetaNHWC( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - int nSize, int xySize, int cSize, float epsilon, int activation); -void customCudaRMSNormGammaBetaNHWC( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int xySize, int cSize, float epsilon, int activation); -void customCudaRMSNormGammaBetaNCHW( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, - int nSize, int cSize, int xySize, float epsilon, int activation); -void customCudaRMSNormGammaBetaNCHW( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, - int nSize, int cSize, int xySize, float epsilon, int activation); - -//Spatial RMSNorm: normalizes over all C*H*W per batch element. gamma/beta shape [c]. -//Uses a deterministic multi-block reduction: many blocks per batch element compute partial sums of -//squares, then a reduce pass combines them. sumSqBuf is a pre-allocated float scratch buffer that must -//hold both the per-block partials and the final value: size [nSize * CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE]. -#define CUDA_SPATIAL_RMSNORM_SUMSQ_STRIDE 9 // SPATIAL_RMSNORM_BLOCKS_PER_BATCH (8) partials + 1 final -void customCudaSpatialRMSNormNHWC( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, - int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf); -void customCudaSpatialRMSNormNHWC( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, - int nSize, int xySize, int cSize, float epsilon, int activation, float* sumSqBuf); -void customCudaSpatialRMSNormNCHW( - const float* in, float* out, const float* gamma, const float* beta, const float* mask, const float* maskSum, - int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf); -void customCudaSpatialRMSNormNCHW( - const half* in, half* out, const half* gamma, const half* beta, const half* mask, const float* maskSum, - int nSize, int cSize, int xySize, float epsilon, int activation, float* sumSqBuf); - +#include "../neuralnet/cudaandrocmhelpers.h" #endif // NEURALNET_CUDAHELPERS_H_ diff --git a/cpp/neuralnet/cudautils.cpp b/cpp/neuralnet/cudautils.cpp index b84a4c9ab4..0cf846c37d 100644 --- a/cpp/neuralnet/cudautils.cpp +++ b/cpp/neuralnet/cudautils.cpp @@ -1,143 +1,10 @@ +// CUDA wrapper for the GPU utility functions shared with the ROCm backend (rocmutils.cpp). +// Everything lives in cudaandrocmutils.inc. See the comment at the top of that file. + #include "../neuralnet/cudautils.h" -#include #include "../neuralnet/cudaerrorcheck.h" #include "../neuralnet/cudaincludes.h" #include "../neuralnet/cudahelpers.h" -#include "../neuralnet/debugprint.h" - -#include "../external/half-2.2.0/include/half.hpp" - -//------------------------ -#include "../core/using.h" -//------------------------ - -using half_t = half_float::half; - -void CudaUtils::mallocOnDevice(const string& name, int numWeights, void*& deviceBuf, bool useFP16) { - if(useFP16) { - size_t halfBytes = numWeights * sizeof(half_t); - CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, halfBytes)); - } - else { - size_t floatBytes = numWeights * sizeof(float); - CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, floatBytes)); - } -} - -void CudaUtils::mallocAndCopyToDevice(const string& name, const vector& weights, void*& deviceBuf, bool useFP16) { - size_t numWeights = weights.size(); - if(useFP16) { - size_t halfBytes = numWeights * sizeof(half_t); - vector weightsHalf(weights.size()); - for(size_t i = 0; i(weights[i]); - CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, halfBytes)); - CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weightsHalf.data(), halfBytes, cudaMemcpyHostToDevice)); - } - else { - size_t floatBytes = numWeights * sizeof(float); - CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, floatBytes)); - CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weights.data(), floatBytes, cudaMemcpyHostToDevice)); - } -} - -void CudaUtils::mallocAndCopyToDevice(const string& name, const float* weights, int numWeights, void*& deviceBuf, bool useFP16) { - if(useFP16) { - size_t halfBytes = numWeights * sizeof(half_t); - vector weightsHalf(numWeights); - for(int i = 0; i(weights[i]); - CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, halfBytes)); - CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weightsHalf.data(), halfBytes, cudaMemcpyHostToDevice)); - } - else { - size_t floatBytes = numWeights * sizeof(float); - CUDA_ERR(name.c_str(),cudaMalloc(&deviceBuf, floatBytes)); - CUDA_ERR(name.c_str(),cudaMemcpy(deviceBuf, weights, floatBytes, cudaMemcpyHostToDevice)); - } -} - -//Only use in testing, allocates an intermediate buffer in the case of FP16 which will be very slow. -void CudaUtils::expensiveCopyFromDevice(const string& name, float* weights, int numWeights, const void* deviceBuf, bool useFP16) { - if(useFP16) { - vector weightsHalf(numWeights); - size_t halfBytes = numWeights * sizeof(half_t); - CUDA_ERR(name.c_str(),cudaMemcpy(weightsHalf.data(), deviceBuf, halfBytes, cudaMemcpyDeviceToHost)); - for(int i = 0; i values(totalSize); - expensiveCopyFromDevice(name, values.data(), totalSize, deviceBuf, useFP16); - - vector maskValues; - float* maskPtr = nullptr; - if(maskBuf != nullptr) { - maskValues.resize(batchSize * spatialSize); - expensiveCopyFromDevice(name + ":mask", maskValues.data(), batchSize * spatialSize, maskBuf, useFP16); - maskPtr = maskValues.data(); - } - - if(useNHWC) { - DebugPrint::print3DSummary(name, values.data(), batchSize, spatialSize, cSize, "NSC", batchSize, spatialSize, maskPtr); -#ifdef DEBUG_INTERMEDIATE_VALUES_VERBOSE - DebugPrint::print3DVerbose(name, values.data(), batchSize, spatialSize, cSize, "NSC"); -#endif - } - else { - DebugPrint::print3DSummary(name, values.data(), batchSize, cSize, spatialSize, "NCS", batchSize, spatialSize, maskPtr); -#ifdef DEBUG_INTERMEDIATE_VALUES_VERBOSE - DebugPrint::print3DVerbose(name, values.data(), batchSize, cSize, spatialSize, "NCS"); -#endif - } -} - -void CudaUtils::debugPrint2D(const string& name, const void* deviceBuf, int batchSize, int cSize, bool useFP16) { - vector values(batchSize * cSize); - expensiveCopyFromDevice(name, values.data(), values.size(), deviceBuf, useFP16); - DebugPrint::print2DSummary(name, values.data(), batchSize, cSize); -#ifdef DEBUG_INTERMEDIATE_VALUES_VERBOSE - DebugPrint::print2DVerbose(name, values.data(), batchSize, cSize); -#endif -} - -void CudaUtils::checkBufferSize(int batchSize, int xSize, int ySize, int channels) { - if((int64_t)batchSize * xSize * ySize * channels >= (int64_t)1 << 31) - throw StringError("Batch size too large, resulting GPU buffers might exceed 2^31 entries which is not currently supported"); -} -void CudaUtils::hostMallocZeroOneBufs(void*& zeroBuf, void*& oneBuf, bool useFP16) { - if(!useFP16) { - zeroBuf = malloc(sizeof(float)); - oneBuf = malloc(sizeof(float)); - *((float*)zeroBuf) = 0.0f; - *((float*)oneBuf) = 1.0f; - } - else { - //Convert to FP16 on the device, then copy back so we have it in host memory - float zero = 0.0f; - float one = 1.0f; - void* zeroTmp; - void* oneTmp; - mallocAndCopyToDevice("Buffers",&zero,1,zeroTmp,useFP16); - mallocAndCopyToDevice("Buffers",&one,1,oneTmp,useFP16); - zeroBuf = malloc(sizeof(half_t)); - oneBuf = malloc(sizeof(half_t)); - CUDA_ERR("Buffers",cudaMemcpy(zeroBuf,zeroTmp,sizeof(half_t),cudaMemcpyDeviceToHost)); - CUDA_ERR("Buffers",cudaMemcpy(oneBuf,oneTmp,sizeof(half_t),cudaMemcpyDeviceToHost)); - cudaFree(zeroTmp); - cudaFree(oneTmp); - } -} +#include "../neuralnet/cudaandrocmutils.inc" diff --git a/cpp/neuralnet/desc.cpp b/cpp/neuralnet/desc.cpp index 50b6c50926..44c6769e19 100644 --- a/cpp/neuralnet/desc.cpp +++ b/cpp/neuralnet/desc.cpp @@ -2424,6 +2424,26 @@ ModelPostProcessParams::~ModelPostProcessParams() //----------------------------------------------------------------------------- +void ModelDesc::checkNameValid(const string& name) { + if(name.size() <= 0) + throw StringError("Model name is empty, a nonempty model name is required"); + if(name.size() > 96) + throw StringError("Model name is too long (" + Global::intToString((int)name.size()) + " chars, max 96): " + name); + for(char c : name) { + bool ok = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == '-'; + if(!ok) + throw StringError("Model name must contain only alphanumeric characters, underscores, and hyphens: " + name); + } +} + +ModelDesc::ArchSummary::ArchSummary() + : present(false), + trunkSpatialConvDepth(0.0), + numParameters(0), + hasAnyTransformerBlocks(false), + hasAnyNestedBottleneckBlocks(false) +{} + ModelDesc::ModelDesc() : modelVersion(-1), numInputChannels(0), @@ -2435,7 +2455,9 @@ ModelDesc::ModelDesc() numOwnershipChannels(0), metaEncoderVersion(0), preferPassAliveUnderSuicideRules(false), - postProcessParams() + preferExcludeTerritoryAdjacentToAtari(false), + postProcessParams(), + archSummary() {} ModelDesc::ModelDesc(istream& in, const string& sha256_, bool binaryFloats) { @@ -2445,15 +2467,7 @@ ModelDesc::ModelDesc(istream& in, const string& sha256_, bool binaryFloats) { if(in.fail()) throw StringError("Model failed to parse name or version. Is this a valid model file? You probably specified the wrong file."); - // The model name is embedded into on-disk cache filenames (e.g. the TensorRT plan cache), so keep - // it short and restricted to filesystem-safe characters: at most 96 chars of [A-Za-z0-9_-]. - if(name.size() > 96) - throw StringError("Model name is too long (" + Global::intToString((int)name.size()) + " chars, max 96): " + name); - for(char c : name) { - bool ok = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == '-'; - if(!ok) - throw StringError("Model name must contain only alphanumeric characters, underscores, and hyphens: " + name); - } + checkNameValid(name); if(modelVersion < 0) throw StringError("This neural net has an invalid version, you probably specified the wrong file. Supposed model version: " + Global::intToString(modelVersion)); @@ -2547,10 +2561,25 @@ ModelDesc::ModelDesc(istream& in, const string& sha256_, bool binaryFloats) { if(in.fail()) throw StringError(name + ": model failed to parse preferPassAliveUnderSuicideRules"); + //Whether the model expects territory scoring with no seki tax to exclude points adjacent to atari (rules v3). + int preferExcludeTerritoryAdjAtariInt = 0; + in >> preferExcludeTerritoryAdjAtariInt; + if(preferExcludeTerritoryAdjAtariInt == 0) + preferExcludeTerritoryAdjacentToAtari = false; + else if(preferExcludeTerritoryAdjAtariInt == 1) + preferExcludeTerritoryAdjacentToAtari = true; + else + throw StringError(name + ": model preferExcludeTerritoryAdjacentToAtari unexpected value: " + Global::intToString(preferExcludeTerritoryAdjAtariInt)); + if(in.fail()) + throw StringError(name + ": model failed to parse preferExcludeTerritoryAdjacentToAtari"); + + //Spare slots for future model options. Claiming one means updating everything else that has to + //carry the option alongside the model: export_model_pytorch.py writes this same slot layout, + //and the ONNX metadata block needs a matching required "katago." key in onnxmodelbuilder.cpp + //plus a row in docs/ONNX_Model_Files.md. A .onnx model has no header to parse, so an option + //left out of that block reads as its default instead of failing the way a spare slot does here. int unused = 0; in >> unused; - if(unused != 0) throw StringError(name + ": unknown/unsupported model option C: " + Global::intToString(unused)); - in >> unused; if(unused != 0) throw StringError(name + ": unknown/unsupported model option D: " + Global::intToString(unused)); in >> unused; if(unused != 0) throw StringError(name + ": unknown/unsupported model option E: " + Global::intToString(unused)); @@ -2567,6 +2596,7 @@ ModelDesc::ModelDesc(istream& in, const string& sha256_, bool binaryFloats) { metaEncoderVersion = 0; numInputMetaChannels = 0; preferPassAliveUnderSuicideRules = false; + preferExcludeTerritoryAdjacentToAtari = false; } trunk = TrunkDesc(in, modelVersion, binaryFloats, metaEncoderVersion); @@ -2633,7 +2663,9 @@ ModelDesc& ModelDesc::operator=(ModelDesc&& other) { numOwnershipChannels = other.numOwnershipChannels; metaEncoderVersion = other.metaEncoderVersion; preferPassAliveUnderSuicideRules = other.preferPassAliveUnderSuicideRules; + preferExcludeTerritoryAdjacentToAtari = other.preferExcludeTerritoryAdjacentToAtari; postProcessParams = other.postProcessParams; + archSummary = other.archSummary; trunk = std::move(other.trunk); policyHead = std::move(other.policyHead); valueHead = std::move(other.valueHead); @@ -2661,22 +2693,30 @@ int ModelDesc::maxConvChannels(int convXSize, int convYSize) const { } double ModelDesc::getTrunkSpatialConvDepth() const { + if(archSummary.present) + return archSummary.trunkSpatialConvDepth; return trunk.getSpatialConvDepth(); } int64_t ModelDesc::getNumParameters() const { + if(archSummary.present) + return archSummary.numParameters; return trunk.getNumParameters() + policyHead.getNumParameters() + valueHead.getNumParameters(); } -string ModelDesc::getShortInfoString() const { - bool isTransformer = hasAnyTransformerBlocks(); - bool isNbt = false; +bool ModelDesc::hasAnyNestedBottleneckBlocks() const { + if(archSummary.present) + return archSummary.hasAnyNestedBottleneckBlocks; for(size_t i = 0; i < trunk.blocks.size(); i++) { - if(trunk.blocks[i].first == NESTED_BOTTLENECK_BLOCK_KIND) { - isNbt = true; - break; - } + if(trunk.blocks[i].first == NESTED_BOTTLENECK_BLOCK_KIND) + return true; } + return false; +} + +string ModelDesc::getShortInfoString() const { + bool isTransformer = hasAnyTransformerBlocks(); + bool isNbt = hasAnyNestedBottleneckBlocks(); string kind; if(isNbt) kind = isTransformer ? "nbt transformer" : "nbt convnet"; @@ -2712,27 +2752,30 @@ bool TrunkDesc::hasAnyTransformerBlocks() const { return blocksContainTransformerRecursive(blocks); } bool ModelDesc::hasAnyTransformerBlocks() const { + if(archSummary.present) + return archSummary.hasAnyTransformerBlocks; return trunk.hasAnyTransformerBlocks(); } -void ModelDesc::applyScale8ToReduceActivations() { +bool ModelDesc::applyScale8ToReduceActivations() { // Scale8 scales the entire net's activations by 1/8 and compensates with MISH_SCALE8. // This is unsafe when: // - Non-standard trunk norm (RMSNorm is scale-invariant, so it would undo the 1/8 scaling) // - SiLU activation anywhere (no SiLU_SCALE8 variant exists) // - Any transformer blocks (their internal RMSNorm would undo the scaling) if(trunk.trunkNormKind != TRUNK_NORM_KIND_STANDARD) - return; + return false; if(trunk.trunkTipActivation.activation == ACTIVATION_SILU) - return; + return false; if(blocksContainTransformerRecursive(trunk.blocks)) - return; + return false; trunk.applyScale8ToReduceActivations(); policyHead.applyScale8ToReduceActivations(); valueHead.applyScale8ToReduceActivations(); postProcessParams.outputScaleMultiplier *= 8.0f; + return true; } void ModelDesc::releaseWeights() { @@ -2753,6 +2796,10 @@ struct NonCopyingStreamBuf : public std::streambuf void ModelDesc::loadFromFileMaybeGZipped(const string& fileName, ModelDesc& descBuf, const string& expectedSha256) { try { string lower = Global::toLower(fileName); + if(Global::isSuffix(lower,".onnx") || Global::isSuffix(lower,".onnx.gz")) + throw StringError( + "Only the TensorRT and ONNX backends can load .onnx model files, KataGo normally requires a .bin.gz model." + ); //Read model file with no compression if it's directly named .txt or .bin if(Global::isSuffix(lower,".txt")) { bool binaryFloats = false; diff --git a/cpp/neuralnet/desc.h b/cpp/neuralnet/desc.h index 4d5f8c6278..f7dc224fec 100644 --- a/cpp/neuralnet/desc.h +++ b/cpp/neuralnet/desc.h @@ -523,12 +523,29 @@ struct ModelDesc { //multi-stone suicide were always legal, regardless of the actual suicide rule. bool preferPassAliveUnderSuicideRules; + //True if the model expects territory scoring with TaxRule NONE (both for adjudication and for its + //territory input features) to exclude empty points adjacent to chains in atari, per rules version 3. + bool preferExcludeTerritoryAdjacentToAtari; + ModelPostProcessParams postProcessParams; TrunkDesc trunk; PolicyHeadDesc policyHead; ValueHeadDesc valueHead; + //Architecture summary values that are normally derived by walking trunk/policyHead/valueHead. + //Set (present = true) only for a desc reconstructed from a .onnx file, which has no layer + //structure to walk; the summary getters below then report these values instead. + struct ArchSummary { + bool present; + double trunkSpatialConvDepth; + int64_t numParameters; + bool hasAnyTransformerBlocks; + bool hasAnyNestedBottleneckBlocks; + ArchSummary(); + }; + ArchSummary archSummary; + ModelDesc(); ~ModelDesc(); ModelDesc(std::istream& in, const std::string& sha256, bool binaryFloats); @@ -547,18 +564,27 @@ struct ModelDesc { //True if the model's trunk contains any transformer (attention or ffn) block. Useful for callers //that want to report model stats or special-case transformer-only behavior (e.g. graph warmup). bool hasAnyTransformerBlocks() const; + bool hasAnyNestedBottleneckBlocks() const; //Short human-readable summary of the model architecture kind and parameter count, e.g. //"nbt transformer, 12345678 params". Backends can append this in parentheses after the model name. std::string getShortInfoString() const; void transformToReduceActivations(); - void applyScale8ToReduceActivations(); + //Rescales the net's activations by 1/8 to keep them inside the FP16 range, compensating via + //postProcessParams.outputScaleMultiplier. Returns whether it was applied: for models where the + //rescaling would be unsound it changes nothing and returns false. + bool applyScale8ToReduceActivations(); //Loads a model from a file that may or may not be gzipped, storing it in descBuf //If expectedSha256 is nonempty, will also verify sha256 of the loaded data. static void loadFromFileMaybeGZipped(const std::string& fileName, ModelDesc& descBuf, const std::string& expectedSha256); + //Throws StringError if name is not usable as a model name. Model names get embedded into on-disk + //cache filenames (e.g. the TensorRT plan cache), so they are restricted to a short + //filesystem-safe character set. + static void checkNameValid(const std::string& name); + //Return the "nearest" supported ruleset to desiredRules by this model. //Fills supported with true if desiredRules itself was exactly supported, false if some modifications had to be made. Rules getSupportedRules(const Rules& desiredRules, bool& supported) const; diff --git a/cpp/neuralnet/dummybackend.cpp b/cpp/neuralnet/dummybackend.cpp index 00a986605f..c3a14d6d0b 100644 --- a/cpp/neuralnet/dummybackend.cpp +++ b/cpp/neuralnet/dummybackend.cpp @@ -94,6 +94,11 @@ bool NeuralNet::setIsWarmup(const ComputeHandle* handle, bool isWarmup) { void NeuralNet::printDevices() { } +std::string NeuralNet::getRuntimeBackendDetail(ConfigParser& cfg) { + (void)cfg; + return std::string(); +} + InputBuffers* NeuralNet::createInputBuffers(const LoadedModel* loadedModel, int maxBatchSize, int nnXLen, int nnYLen) { (void)loadedModel; (void)maxBatchSize; diff --git a/cpp/neuralnet/eigenbackend.cpp b/cpp/neuralnet/eigenbackend.cpp index 424dbce8b9..bd8c7bb1e5 100644 --- a/cpp/neuralnet/eigenbackend.cpp +++ b/cpp/neuralnet/eigenbackend.cpp @@ -2631,6 +2631,11 @@ void NeuralNet::getOutput( void NeuralNet::printDevices() { } +std::string NeuralNet::getRuntimeBackendDetail(ConfigParser& cfg) { + (void)cfg; + return std::string(); +} + // FOR TESTING --------------------------------------------------------------------------------------------------------- bool NeuralNet::testEvaluateConv( const ConvLayerDesc* desc, diff --git a/cpp/neuralnet/metalbackend.cpp b/cpp/neuralnet/metalbackend.cpp index d13cfa582b..93f352e53e 100644 --- a/cpp/neuralnet/metalbackend.cpp +++ b/cpp/neuralnet/metalbackend.cpp @@ -769,6 +769,11 @@ void NeuralNet::printDevices() { printMetalDevices(); } +std::string NeuralNet::getRuntimeBackendDetail(ConfigParser& cfg) { + (void)cfg; + return std::string(); +} + //------------------------------------------------------------------------------ // InputBuffers implementation //------------------------------------------------------------------------------ diff --git a/cpp/neuralnet/nneval.cpp b/cpp/neuralnet/nneval.cpp index 881c9fbb67..43bbc0bd2a 100644 --- a/cpp/neuralnet/nneval.cpp +++ b/cpp/neuralnet/nneval.cpp @@ -140,12 +140,15 @@ NNEvaluator::NNEvaluator( modelVersion = desc.modelVersion; inputsVersion = NNModelVersion::getInputsVersion(modelVersion); numInputMetaChannels = desc.numInputMetaChannels; - postProcessParams = desc.postProcessParams; computeContext = NeuralNet::createComputeContext( gpuIdxs,logger,nnXLen,nnYLen, homeDataDirOverride, usingFP16Mode,loadedModel,cfg ); + // Snapshot postProcessParams only after createComputeContext: backends may apply + // config-dependent transforms to the model desc there (e.g. the ONNX backend's + // scale8 workaround multiplies outputScaleMultiplier by 8). + postProcessParams = desc.postProcessParams; } else { internalModelName = "random"; @@ -292,6 +295,18 @@ double NNEvaluator::getTrunkSpatialConvDepth() const { return NeuralNet::getModelDesc(loadedModel).getTrunkSpatialConvDepth(); } +int64_t NNEvaluator::getNumModelParameters() const { + return NeuralNet::getModelDesc(loadedModel).getNumParameters(); +} + +bool NNEvaluator::modelHasAnyTransformerBlocks() const { + return NeuralNet::getModelDesc(loadedModel).hasAnyTransformerBlocks(); +} + +bool NNEvaluator::modelHasAnyNestedBottleneckBlocks() const { + return NeuralNet::getModelDesc(loadedModel).hasAnyNestedBottleneckBlocks(); +} + enabled_t NNEvaluator::getUsingFP16Mode() const { return usingFP16Mode; } @@ -306,6 +321,12 @@ bool NNEvaluator::modelPreferPassAliveUnderSuicideRules() const { return NeuralNet::getModelDesc(loadedModel).preferPassAliveUnderSuicideRules; } +bool NNEvaluator::modelPreferExcludeTerritoryAdjacentToAtari() const { + if(loadedModel == NULL) + return false; + return NeuralNet::getModelDesc(loadedModel).preferExcludeTerritoryAdjacentToAtari; +} + bool NNEvaluator::getDoRandomize() const { return currentDoRandomize.load(std::memory_order_acquire); } @@ -510,7 +531,10 @@ void NNEvaluator::maybeWarmupComputeHandle(ComputeHandle* gpuHandle, int serverT Board board(nnXLen, nnYLen); //Featurize the way this model expects (a no-op under Tromp-Taylorish rules, but robust if the //warmup rules ever change). - BoardHistory history(board, P_BLACK, Rules::getTrompTaylorish(), 0, modelPreferPassAliveUnderSuicideRules()); + BoardHistory history( + board, P_BLACK, Rules::getTrompTaylorish(), 0, + BoardHistoryModes(modelPreferPassAliveUnderSuicideRules(), modelPreferExcludeTerritoryAdjacentToAtari()) + ); MiscNNInputParams nnInputParams; SGFMetadata sgfMeta; const SGFMetadata* sgfMetaPtr = NULL; diff --git a/cpp/neuralnet/nneval.h b/cpp/neuralnet/nneval.h index b266ff0612..cbf9c205c9 100644 --- a/cpp/neuralnet/nneval.h +++ b/cpp/neuralnet/nneval.h @@ -126,6 +126,9 @@ class NNEvaluator { bool getRequireExactNNLen() const; int getModelVersion() const; double getTrunkSpatialConvDepth() const; + int64_t getNumModelParameters() const; + bool modelHasAnyTransformerBlocks() const; + bool modelHasAnyNestedBottleneckBlocks() const; enabled_t getUsingFP16Mode() const; // Check if the loaded neural net supports shorttermError fields @@ -136,6 +139,11 @@ class NNEvaluator { // False if there is no loaded model (e.g. debugSkipNeuralNet). bool modelPreferPassAliveUnderSuicideRules() const; + // Whether the loaded model declares that it expects territory scoring with TaxRule NONE to + // exclude empty points adjacent to chains in atari (rules version 3), both for adjudication and + // for its territory input features. False if there is no loaded model (e.g. debugSkipNeuralNet). + bool modelPreferExcludeTerritoryAdjacentToAtari() const; + // Return the "nearest" supported ruleset to desiredRules by this model. // Fills supported with true if desiredRules itself was exactly supported, false if some modifications had to be made. Rules getSupportedRules(const Rules& desiredRules, bool& supported) const; diff --git a/cpp/neuralnet/nninputs.cpp b/cpp/neuralnet/nninputs.cpp index 8cce96b0a4..c52c711b71 100644 --- a/cpp/neuralnet/nninputs.cpp +++ b/cpp/neuralnet/nninputs.cpp @@ -870,11 +870,11 @@ Hash128 NNInputs::getHash( const Board& board, const BoardHistory& hist, Player nextPlayer, const MiscNNInputParams& nnInputParams ) { - //Hash using the effective pass-alive computation mode for this eval, which is normally hist's own + //Hash using the effective BoardHistoryModes for this eval, which are normally hist's own //but may be overridden per-query (e.g. for a secondary net whose declared featurization differs). Hash128 hash = BoardHistory::getSituationRulesAndKoHash( board, hist, nextPlayer, nnInputParams.drawEquivalentWinsForWhite, - nnInputParams.getAlwaysComputePassAliveUnderSuicideRules(hist) + nnInputParams.getModes(hist) ); //Fold in whether a pass ends this phase. @@ -945,7 +945,20 @@ Hash128 NNInputs::getHash( bool MiscNNInputParams::getAlwaysComputePassAliveUnderSuicideRules(const BoardHistory& hist) const { if(passAliveSuicideRulesOverride >= 0) return passAliveSuicideRulesOverride != 0; - return hist.alwaysComputePassAliveUnderSuicideRules; + return hist.modes.alwaysComputePassAliveUnderSuicideRules; +} + +bool MiscNNInputParams::getExcludeTerritoryAdjacentToAtari(const BoardHistory& hist) const { + if(excludeTerritoryAdjAtariOverride >= 0) + return excludeTerritoryAdjAtariOverride != 0; + return hist.modes.excludeTerritoryAdjacentToAtari; +} + +BoardHistoryModes MiscNNInputParams::getModes(const BoardHistory& hist) const { + return BoardHistoryModes( + getAlwaysComputePassAliveUnderSuicideRules(hist), + getExcludeTerritoryAdjacentToAtari(hist) + ); } bool MiscNNInputParams::getSuicideLegalForPassAlive(const BoardHistory& hist) const { @@ -1977,6 +1990,7 @@ void NNInputs::fillRowV6( area,whiteMinusBlackIndependentLifeRegionCount, keepTerritories, keepStones, + nnInputParams.getExcludeTerritoryAdjacentToAtari(hist), nnInputParams.getSuicideLegalForPassAlive(hist) ); if(hist.rules.taxRule == Rules::TAX_ALL) @@ -2416,6 +2430,7 @@ void NNInputs::fillRowV7( whiteMinusBlackIndependentLifeRegionCount, keepTerritories, keepStones, + nnInputParams.getExcludeTerritoryAdjacentToAtari(hist), nnInputParams.getSuicideLegalForPassAlive(hist) ); if(hist.rules.taxRule == Rules::TAX_ALL) diff --git a/cpp/neuralnet/nninputs.h b/cpp/neuralnet/nninputs.h index 97a87c3bb8..2899172f72 100644 --- a/cpp/neuralnet/nninputs.h +++ b/cpp/neuralnet/nninputs.h @@ -58,17 +58,24 @@ struct MiscNNInputParams { int symmetry = NNInputs::SYMMETRY_NOTSPECIFIED; double policyOptimism = 0.0; int maxHistory = 1000; - // -1 = no override: pass-alive featurization follows hist.alwaysComputePassAliveUnderSuicideRules. + // -1 = no override: pass-alive featurization follows hist.modes.alwaysComputePassAliveUnderSuicideRules. // 0/1 = override that flag for featurization (and its contribution to the nn cache hash). Used when // evaluating with a secondary net (e.g. a human SL profile net) whose declared featurization mode // differs from the mode the search itself is using. int passAliveSuicideRulesOverride = -1; + // Same, but for hist.modes.excludeTerritoryAdjacentToAtari. + int excludeTerritoryAdjAtariOverride = -1; - // The effective value of alwaysComputePassAliveUnderSuicideRules for featurization: the override - // if one is set, else hist's own flag. + // The effective value of modes.alwaysComputePassAliveUnderSuicideRules for featurization: the + // override if one is set, else hist's own flag. bool getAlwaysComputePassAliveUnderSuicideRules(const BoardHistory& hist) const; + // The effective value of modes.excludeTerritoryAdjacentToAtari for featurization: the override + // if one is set, else hist's own flag. + bool getExcludeTerritoryAdjacentToAtari(const BoardHistory& hist) const; + // The effective full modes for featurization, taking both overrides into account. + BoardHistoryModes getModes(const BoardHistory& hist) const; // The suicide legality to use for pass-alive area computations in featurization, taking the - // override and hist.alwaysComputePassAliveUnderSuicideRules into account. + // override and hist.modes.alwaysComputePassAliveUnderSuicideRules into account. bool getSuicideLegalForPassAlive(const BoardHistory& hist) const; static const Hash128 ZOBRIST_CONSERVATIVE_PASS; diff --git a/cpp/neuralnet/nninterface.h b/cpp/neuralnet/nninterface.h index aadb77a36c..8ce368d743 100644 --- a/cpp/neuralnet/nninterface.h +++ b/cpp/neuralnet/nninterface.h @@ -38,6 +38,15 @@ namespace NeuralNet { // Print available backend devices void printDevices(); + // A short lowercase alphanumeric string identifying any materially-different runtime + // configuration of this backend, or the empty string if the compile-time backend name + // already says everything (the common case). + // Currently only the ONNX backend returns anything: the execution provider selected + // by the onnxProvider config key (e.g. "openvino", "directml"), + // Used to disambiguate the version that contribute reports to the data server, + // so keep results short and stable for a given config. + std::string getRuntimeBackendDetail(ConfigParser& cfg); + // Model I/O ----------------------------------------------------------------- LoadedModel* loadModelFile(const std::string& file, const std::string& expectedSha256); diff --git a/cpp/neuralnet/onnxbackend.cpp b/cpp/neuralnet/onnxbackend.cpp new file mode 100644 index 0000000000..b8d89b9eca --- /dev/null +++ b/cpp/neuralnet/onnxbackend.cpp @@ -0,0 +1,1208 @@ +// ONNX Runtime backend for KataGo. +// +// Loads standard .bin.gz KataGo model files, converts the ModelDesc to a serialized +// ONNX ModelProto via the same OnnxModelBuilder that the TensorRT backend uses, and +// hands the bytes to an Ort::Session. Inference is run through ONNX Runtime with a +// configurable execution provider, or EP (CPU, OpenVINO, CUDA, TensorRT, MIGraphX, +// CoreML, DirectML), selected at runtime via the onnxProvider config key. Not every +// provider is tested, and most need an ONNX Runtime package or build that includes +// them - see Compiling.md "Execution providers". +// +// The IO tensor protocol is identical to the TensorRT ONNX-emitter path (see +// onnxmodelbuilder.h): four NCHW float32 inputs declared in the order InputSpatial, +// InputGlobal, InputMeta, InputMask, and five NCHW float32 outputs OutputPolicyPass / +// OutputPolicy / OutputValue / OutputScoreValue / OutputOwnership, all raw logits. +// getOutput below reproduces the TensorRT backend's post-processing exactly (per-row +// optimism blend, inverse-symmetry, version-branched score-value decode) so that the +// same downstream decode path is shared. + +#ifdef USE_ONNX_BACKEND + +#include "../neuralnet/nninterface.h" +#include "../neuralnet/nneval.h" +#include "../neuralnet/nninputs.h" +#include "../neuralnet/modelversion.h" +#include "../neuralnet/onnxmodelbuilder.h" + +#include +#ifdef __APPLE__ +#include +#endif +#ifdef _WIN32 +// dml_provider_factory.h is only shipped by DirectML-enabled ONNX Runtime packages such as +// Microsoft.ML.OnnxRuntime.DirectML, not by the stock CPU prebuilt. Guard on availability so +// that building against an ORT without it still compiles, with the DirectML provider then +// failing at runtime with a clear error instead of at compile time. +#if __has_include() +#include +#define KATAGO_ONNX_HAS_DML_PROVIDER_FACTORY 1 +#endif +#endif + +#include +#include +#include +#include +#include + +using namespace std; + +//-------------------------------------------------------------- + +// ONNX execution providers this backend knows how to wire up. Being listed here means the +// wiring exists, not that the provider is tested - see Compiling.md "Execution providers". +// Exposing a new provider takes an entry here plus an AppendExecutionProvider_* branch in +// ComputeHandle. +static const char* const kKnownProviders[] = { + "cpu", "openvino", "cuda", "tensorrt", "migraphx", "coreml", "directml", +}; + +//-------------------------------------------------------------- + +struct LoadedModel { + ModelDesc modelDesc; + string modelFileName; + + // True if the model came from a .onnx file rather than a .bin.gz. The graph is then taken verbatim + // from externalOnnx.serializedModel instead of being emitted from weights. + bool isExternalOnnx; + OnnxModelBuilder::LoadResult externalOnnx; + + // One-time scale8 transform (see maybeApplyScale8), called from createComputeContext. + // + // It MUST run inside createComputeContext rather than lazily at compute-handle creation: + // applyScale8ToReduceActivations() multiplies postProcessParams.outputScaleMultiplier by 8 + // to compensate for the 1/8-scaled graph outputs, and NNEvaluator snapshots + // postProcessParams immediately after createComputeContext returns (nneval.cpp). A later + // application would leave NNEvaluator decoding 1/8-scale outputs with the stale + // multiplier. Running here also happens-before the server threads spawn and read + // modelDesc in OnnxModelBuilder::build(). The mutex only keeps the transform idempotent + // if multiple contexts are ever created on one model. + mutable bool scale8Resolved; + // Whether the transform took effect; it is skipped for models where the rescaling would be + // unsound. Recorded in the emitted graph's metadata. + mutable bool scale8Applied; + mutable std::mutex scale8Mutex; + + LoadedModel(const string& fileName, const string& expectedSha256) + : modelFileName(fileName), isExternalOnnx(false) + { + if(OnnxModelBuilder::isOnnxFileName(fileName)) { + isExternalOnnx = true; + // loadModelFile has no logger; createComputeHandle logs the graph's build settings instead. + externalOnnx = OnnxModelBuilder::load(fileName, expectedSha256, modelDesc, NULL); + } + else { + ModelDesc::loadFromFileMaybeGZipped(fileName, modelDesc, expectedSha256); + } + scale8Resolved = false; + scale8Applied = isExternalOnnx && externalOnnx.buildParams.scale8Applied; + } + + // Apply the scale8 FP16-range workaround exactly once per model, unless skipped via + // onnxSkipScale8. See the comment on scale8Resolved for why this must run at + // createComputeContext time. + void maybeApplyScale8(bool skip, bool skipWasExplicit, Logger* logger) const { + std::lock_guard lock(scale8Mutex); + if(scale8Resolved) + return; + scale8Resolved = true; + // A loaded graph's weights are already whatever they are, and the postProcessParams read out of + // the same file already match them. Applying the transform now would rescale + // outputScaleMultiplier alone, decoding every output 8x too large. + if(isExternalOnnx) { + if(logger != NULL && skipWasExplicit && skip == externalOnnx.buildParams.scale8Applied) + logger->write( + string("ONNX backend: WARNING - config option onnxSkipScale8 = ") + Global::boolToString(skip) + + " has no effect on a model loaded from a .onnx file. This graph was emitted with " + "scale8Applied=" + Global::boolToString(externalOnnx.buildParams.scale8Applied) + ); + return; + } + if(!skip) + scale8Applied = const_cast(this)->modelDesc.applyScale8ToReduceActivations(); + } + + LoadedModel() = delete; + LoadedModel(const LoadedModel&) = delete; + LoadedModel& operator=(const LoadedModel&) = delete; +}; + +LoadedModel* NeuralNet::loadModelFile(const string& file, const string& expectedSha256) { + return new LoadedModel(file, expectedSha256); +} + +void NeuralNet::freeLoadedModel(LoadedModel* loadedModel) { + delete loadedModel; +} + +const ModelDesc& NeuralNet::getModelDesc(const LoadedModel* loadedModel) { + return loadedModel->modelDesc; +} + +//-------------------------------------------------------------- + +struct ComputeContext { + Ort::Env env; + int nnXLen; + int nnYLen; + string providerName; + string openvinoDeviceType; + string openvinoCacheDir; + // Optional OpenVINO provider options (empty = not passed to ORT) + string openvinoPrecision; // FP16 / FP32 / ACCURACY (GPU only; the NPU is FP16-only) + string openvinoNumStreams; // 1-8 + bool transformerNHWC; // run the trunk block stack channel-last (NHWC) + bool skipScale8; // skip the scale8 FP16-range workaround (see createComputeContext) + + // Per-thread device type (index = serverThreadIdx). Filled with openvinoDeviceType + // by default, and individual entries are replaced by onnxOpenVINODeviceTypeThread. + std::vector perThreadDeviceType; + + ComputeContext(int xLen, int yLen) + : env(ORT_LOGGING_LEVEL_WARNING, "KataGoOnnx"), + nnXLen(xLen), + nnYLen(yLen), + providerName("cpu"), + openvinoDeviceType("GPU"), + openvinoCacheDir(""), + openvinoPrecision(""), + openvinoNumStreams(""), + transformerNHWC(true), + skipScale8(false) + {} +}; + +static std::vector parseDeviceNames(const std::string& deviceType); + +ComputeContext* NeuralNet::createComputeContext( + const std::vector& gpuIdxs, + Logger* logger, + int nnXLen, + int nnYLen, + const string& homeDataDirOverride, + enabled_t useFP16Mode, + const LoadedModel* loadedModel, + ConfigParser& cfg +) { + (void)gpuIdxs; + (void)homeDataDirOverride; + // The emitted ONNX graph is fp32, and inference precision is chosen internally by the + // execution provider (e.g. OpenVINO downcasts to FP16 per onnxOpenVINOPrecision). KataGo's + // global useFP16 flag therefore cannot force FP16 here, so fail loudly instead of silently + // ignoring a request. useFP16 = false is honored, though: for the OpenVINO provider it + // forces precision = FP32 below. + if(useFP16Mode == enabled_t::True) + throw StringError( + "ONNX backend: useFP16 = true is not supported and cannot be honored. " + "Precision is controlled by the execution provider; for the OpenVINO provider set " + "onnxOpenVINOPrecision (e.g. FP16/FP32/ACCURACY). Leave useFP16 unset/auto, or set it " + "to false to force full FP32."); + + ComputeContext* ctx = new ComputeContext(nnXLen, nnYLen); + + // Provider selection. Defaults to CPU. OpenVINO is the EP used for Intel Arc GPUs. + string providerName = cfg.contains("onnxProvider") ? cfg.getString("onnxProvider") : "cpu"; + ctx->providerName = Global::toLower(providerName); + + // OpenVINO EP options. + ctx->openvinoDeviceType = cfg.contains("onnxOpenVINODeviceType") ? cfg.getString("onnxOpenVINODeviceType") : "GPU"; + ctx->openvinoCacheDir = cfg.contains("onnxOpenVINOCacheDir") ? cfg.getString("onnxOpenVINOCacheDir") : ""; + ctx->openvinoPrecision = cfg.contains("onnxOpenVINOPrecision") ? cfg.getString("onnxOpenVINOPrecision") : ""; + ctx->openvinoNumStreams = cfg.contains("onnxOpenVINONumStreams") ? cfg.getString("onnxOpenVINONumStreams") : ""; + + // useFP16 = false is an explicit request for full FP32 on every other backend. The only + // provider here that downcasts an fp32 graph by default is OpenVINO (GPU/NPU run FP16 + // unless told otherwise), so honor the request by forcing its precision option to FP32 + // when the user has not explicitly set onnxOpenVINOPrecision themselves. + if(useFP16Mode == enabled_t::False && ctx->providerName == "openvino" && ctx->openvinoPrecision.empty()) { + ctx->openvinoPrecision = "FP32"; + if(logger != NULL) + logger->write("ONNX backend: useFP16 = false, forcing OpenVINO precision = FP32"); + } + + // Trunk layout for transformer models. Default NHWC (channel-last), matching the TensorRT + // backend's trtTransformerNHWC default. NHWC is markedly faster for transformer trunks on + // OpenVINO GPU/NPU, and is ignored entirely for models without transformer blocks. + ctx->transformerNHWC = cfg.contains("onnxTransformerNHWC") ? cfg.getBool("onnxTransformerNHWC") : true; + if(loadedModel->isExternalOnnx && logger != NULL && cfg.contains("onnxTransformerNHWC") && + ctx->transformerNHWC != loadedModel->externalOnnx.buildParams.transformerNHWC && + loadedModel->modelDesc.hasAnyTransformerBlocks()) + logger->write( + "ONNX backend: WARNING - onnxTransformerNHWC = " + Global::boolToString(ctx->transformerNHWC) + + " has no effect on a model loaded from a .onnx file. The trunk layout is baked into the graph " + "(transformerNHWC=" + Global::boolToString(loadedModel->externalOnnx.buildParams.transformerNHWC) + ")."); + + // Skip the scale8 FP16-range workaround. Default false, meaning the workaround is applied. + // See the onnxSkipScale8 documentation in configs/gtp_example.cfg for the tradeoff. + ctx->skipScale8 = cfg.contains("onnxSkipScale8") ? cfg.getBool("onnxSkipScale8") : false; + + // Must happen here rather than at compute-handle creation. See LoadedModel::scale8Resolved. + loadedModel->maybeApplyScale8(ctx->skipScale8, cfg.contains("onnxSkipScale8"), logger); + + // --- Per-thread device type assignment --- + // Pre-parse onnxOpenVINODeviceTypeThread keys so ComputeHandle can look up + // the device type for each server thread without reaching back into ConfigParser. + { + int numThreads = 1; + if(cfg.contains("numNNServerThreadsPerModel")) + numThreads = cfg.getInt("numNNServerThreadsPerModel", 1, 1024); + ctx->perThreadDeviceType.resize(numThreads, ctx->openvinoDeviceType); + for(int t = 0; t < numThreads; t++) { + string key = "onnxOpenVINODeviceTypeThread" + Global::intToString(t); + if(cfg.contains(key)) + ctx->perThreadDeviceType[t] = cfg.getString(key); + } + } + + // The OpenVINO provider is only used for GPU/NPU acceleration here. For CPU inference the + // plain cpu provider (or the Eigen backend) is the right tool, so reject any device string + // that resolves to CPU alone (CPU, cpu, CPU.0, AUTO:CPU, ...). Composite strings that also + // list a non-CPU device (e.g. AUTO:GPU,CPU) keep CPU only as an OpenVINO-internal fallback + // and are allowed. + if(ctx->providerName == "openvino") { + for(int t = 0; t < (int)ctx->perThreadDeviceType.size(); t++) { + std::vector deviceNames = parseDeviceNames(ctx->perThreadDeviceType[t]); + bool allCpu = !deviceNames.empty(); + for(const std::string& name : deviceNames) { + if(name != "CPU") + allCpu = false; + } + if(allCpu) + throw StringError( + "ONNX backend: OpenVINO provider with device_type = " + ctx->perThreadDeviceType[t] + + " is not supported. For CPU inference use onnxProvider = cpu (or the Eigen backend); " + "the OpenVINO provider is for GPU/NPU acceleration only."); + } + } + + // The NPU runs FP16 only, so an FP32 request (useFP16 = false, or an explicit + // onnxOpenVINOPrecision = FP32) cannot be honored on an NPU-only device. Fail loudly like + // other backends do for impossible precision requests, rather than letting the EP quietly + // run FP16 anyway. Mixed composite strings (e.g. AUTO:GPU,NPU) are left to the EP. + if(ctx->providerName == "openvino" && Global::toUpper(Global::trim(ctx->openvinoPrecision)) == "FP32") { + for(int t = 0; t < (int)ctx->perThreadDeviceType.size(); t++) { + std::vector deviceNames = parseDeviceNames(ctx->perThreadDeviceType[t]); + bool allNpu = !deviceNames.empty(); + for(const std::string& name : deviceNames) { + if(name != "NPU") + allNpu = false; + } + if(allNpu) + throw StringError( + "ONNX backend: FP32 precision was requested (useFP16 = false or onnxOpenVINOPrecision = FP32) " + "but device_type " + ctx->perThreadDeviceType[t] + " is an NPU, which only supports FP16 " + "inference. Unset useFP16 and onnxOpenVINOPrecision, or use a GPU device for this thread."); + } + } + + { + bool knownProvider = false; + for(const char* p : kKnownProviders) { + if(ctx->providerName == p) { + knownProvider = true; + break; + } + } + if(!knownProvider) + throw StringError( + "ONNX backend: unknown onnxProvider '" + ctx->providerName + + "'. Known providers: cpu, openvino, cuda, tensorrt, migraphx, coreml, directml."); + } + + if(logger != NULL) + logger->write("ONNX backend: creating compute context for " + + Global::intToString(nnXLen) + "x" + Global::intToString(nnYLen) + + " with provider '" + ctx->providerName + "'"); + + return ctx; +} + +void NeuralNet::freeComputeContext(ComputeContext* computeContext) { + delete computeContext; +} + +//-------------------------------------------------------------- +// Helper: list the short device names an OpenVINO device_type string can run on, dropping +// device index suffixes and the qualifier of a composite (AUTO/MULTI/HETERO) string. +// +// "NPU" -> {"NPU"} +// "GPU" / "GPU.1" -> {"GPU"} +// "AUTO:GPU,CPU" -> {"GPU","CPU"} +// "MULTI:GPU.0,GPU.1" -> {"GPU","GPU"} +//-------------------------------------------------------------- +static std::vector parseDeviceNames(const std::string& deviceType) { + std::string upper = Global::trim(Global::toUpper(deviceType)); + + std::string devices = upper; + size_t colonPos = upper.find(':'); + if(colonPos != std::string::npos) { + std::string prefix = upper.substr(0, colonPos); + if(prefix == "AUTO" || prefix == "MULTI" || prefix == "HETERO") + devices = upper.substr(colonPos + 1); + } + + std::vector names; + for(const std::string& piece : Global::split(devices, ',')) { + std::string name = Global::trim(piece); + size_t dotPos = name.find('.'); + if(dotPos != std::string::npos) + name = name.substr(0, dotPos); + if(!name.empty()) + names.push_back(name); + } + return names; +} + +//-------------------------------------------------------------- + +struct ComputeHandle { + ComputeContext* ctx; + std::unique_ptr session; + int modelVersion; + int numInputChannels; + int numInputGlobalChannels; + int numInputMetaChannels; + int numPolicyChannels; + int numValueChannels; + int numScoreValueChannels; + int numOwnershipChannels; + + // Queried graph input/output names (and raw-char pointer views for Run). + vector inputNames; + vector outputNames; + vector inputNamePtrs; + vector outputNamePtrs; + + ComputeHandle(ComputeContext* context, const LoadedModel& loadedModel, Logger* logger, int deviceIdxForThread, int serverThreadIdx, bool requireExactNNLen) + : ctx(context), + modelVersion(loadedModel.modelDesc.modelVersion), + numInputChannels(loadedModel.modelDesc.numInputChannels), + numInputGlobalChannels(loadedModel.modelDesc.numInputGlobalChannels), + numInputMetaChannels(loadedModel.modelDesc.numInputMetaChannels), + numPolicyChannels(loadedModel.modelDesc.numPolicyChannels), + numValueChannels(loadedModel.modelDesc.numValueChannels), + numScoreValueChannels(loadedModel.modelDesc.numScoreValueChannels), + numOwnershipChannels(loadedModel.modelDesc.numOwnershipChannels) + { + // The graph either comes verbatim from a .onnx file, or is emitted here from the .bin.gz weights + // by the same emitter the TensorRT backend uses. Either way Ort::Session parses it directly. The + // FP32 node-name lists are ignored, since ORT has no per-node precision API. + OnnxModelBuilder::Result onnxResult; // only filled on the emit path + const string* onnxBytesPtr = NULL; + if(loadedModel.isExternalOnnx) { + OnnxModelBuilder::checkRuntimeParams( + loadedModel.externalOnnx, loadedModel.modelFileName, ctx->nnXLen, ctx->nnYLen, requireExactNNLen); + if(logger != NULL && serverThreadIdx <= 0) { + const OnnxModelBuilder::BuildParams& params = loadedModel.externalOnnx.buildParams; + logger->write(Global::strprintf( + "ONNX backend: using the graph from %s as-is (emitted for %dx%d, requireExactNNLen=%s, " + "transformerNHWC=%s, scale8Applied=%s)", + loadedModel.modelFileName.c_str(), params.nnXLen, params.nnYLen, + Global::boolToString(params.requireExactNNLen).c_str(), + Global::boolToString(params.transformerNHWC).c_str(), + Global::boolToString(params.scale8Applied).c_str())); + // The OpenVINO EP mis-binds inputs declared after one that no node consumes (ORT >= 1.23). + // It surfaces as a shape-mismatch crash on the first evaluation, which is hard to trace + // back to the graph. + if(loadedModel.externalOnnx.danglingInputNotDeclaredLast) + logger->write( + string("ONNX backend: ") + (ctx->providerName == "openvino" ? "WARNING" : "note") + " - " + + loadedModel.modelFileName + + " declares a graph input that no node consumes, ahead of inputs that are consumed. The " + "OpenVINO execution provider binds the inputs after it to the wrong buffers and fails " + "with a shape mismatch. Unconsumed inputs must be declared last."); + } + // Read straight out of the LoadedModel, which outlives every compute handle - no need for a + // per-thread copy of what can be hundreds of MB. + onnxBytesPtr = &loadedModel.externalOnnx.serializedModel; + } + else { + if(logger != NULL) + logger->write("ONNX backend: building ONNX graph from model weights..."); + // TODO: every server thread re-runs this build, transiently duplicating the fully + // weight-baked serialized proto (hundreds of MB for large nets) across N spawning + // threads. The bytes are identical per (nnXLen, nnYLen, requireExactNNLen, + // transformerNHWC), so they could be built once in the ComputeContext and shared. + OnnxModelBuilder::BuildParams buildParams; + buildParams.nnXLen = ctx->nnXLen; + buildParams.nnYLen = ctx->nnYLen; + buildParams.requireExactNNLen = requireExactNNLen; + buildParams.transformerNHWC = ctx->transformerNHWC; + buildParams.scale8Applied = loadedModel.scale8Applied; + onnxResult = OnnxModelBuilder::build(loadedModel.modelDesc, buildParams, logger); + onnxBytesPtr = &onnxResult.serializedModel; + } + const string& onnxBytes = *onnxBytesPtr; + + if(logger != NULL) + logger->write("ONNX backend: ONNX graph ready (" + Global::uint64ToString(onnxBytes.size()) + " bytes)"); + + // Dump the ONNX model to a file when KATAGO_DUMP_ONNX is set (debug aid). + { + const char* dumpPath = getenv("KATAGO_DUMP_ONNX"); + if(dumpPath != nullptr && dumpPath[0] != '\0') { + ofstream dumpFile(dumpPath, ios::binary); + if(dumpFile.is_open()) { + dumpFile.write(onnxBytes.data(), (streamsize)onnxBytes.size()); + dumpFile.close(); + if(logger != NULL) + logger->write(string("ONNX backend: dumped ONNX model to ") + dumpPath + + " (" + Global::uint64ToString(onnxBytes.size()) + " bytes)"); + } else if(logger != NULL) { + logger->write(string("ONNX backend: WARNING - could not open dump path ") + dumpPath); + } + } + } + + Ort::SessionOptions sessionOpts; + + // Select execution provider based on providerName. + const string& provider = ctx->providerName; + if(provider == "coreml") { +#ifdef __APPLE__ + uint32_t coremlFlags = COREML_FLAG_CREATE_MLPROGRAM; + Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CoreML(sessionOpts, coremlFlags)); + if(logger != NULL) + logger->write("ONNX backend: CoreML execution provider enabled (MLProgram mode)"); +#else + throw StringError("ONNX backend: CoreML is only available on Apple platforms"); +#endif + } + else if(provider == "cuda") { + OrtCUDAProviderOptions cudaOpts{}; + cudaOpts.device_id = (unsigned int)(deviceIdxForThread >= 0 ? deviceIdxForThread : 0); + sessionOpts.AppendExecutionProvider_CUDA(cudaOpts); + if(logger != NULL) + logger->write("ONNX backend: CUDA execution provider enabled, device_id=" + Global::intToString((int)cudaOpts.device_id)); + } + else if(provider == "tensorrt") { + OrtTensorRTProviderOptions trtOpts{}; + trtOpts.device_id = (unsigned int)(deviceIdxForThread >= 0 ? deviceIdxForThread : 0); + sessionOpts.AppendExecutionProvider_TensorRT(trtOpts); + if(logger != NULL) + logger->write("ONNX backend: TensorRT execution provider enabled, device_id=" + Global::intToString((int)trtOpts.device_id)); + } + else if(provider == "migraphx") { + OrtMIGraphXProviderOptions migraphxOpts{}; + migraphxOpts.device_id = (unsigned int)(deviceIdxForThread >= 0 ? deviceIdxForThread : 0); + sessionOpts.AppendExecutionProvider_MIGraphX(migraphxOpts); + if(logger != NULL) + logger->write("ONNX backend: MIGraphX execution provider enabled, device_id=" + Global::intToString((int)migraphxOpts.device_id)); + } + else if(provider == "openvino") { + // The OpenVINO EP runs the graph nodes itself with its own internal threading, leaving + // ORT's intra-op pool with only the few EP-external nodes. With one ORT session per + // nn-server thread, leaving the default intra-op thread count would oversubscribe the + // CPU with N x M worker pools. Pin it to 1 for this provider only. + sessionOpts.SetIntraOpNumThreads(1); + + // --- Determine this thread's device_type --- + string threadDeviceType = ctx->openvinoDeviceType; // global default + if(serverThreadIdx >= 0 && serverThreadIdx < (int)ctx->perThreadDeviceType.size()) + threadDeviceType = ctx->perThreadDeviceType[serverThreadIdx]; + + // --- Build EP option map --- + std::unordered_map openvinoOpts; + + // Map the per-thread device index (from the gpuToUse*/deviceToUse* config keys) into OpenVINO's + // device_type suffix, e.g. GPU -> GPU.1. The OpenVINO EP selects devices via device_type + // ("GPU.0", "GPU.1", ...). The legacy device_id provider option is deprecated and only accepts + // a bare device name, so passing a numeric index there would throw at session creation. + string deviceType = threadDeviceType; + if(deviceIdxForThread > 0 && deviceType.find('.') == string::npos && deviceType.find(':') == string::npos) + deviceType += "." + Global::intToString(deviceIdxForThread); + else if(deviceIdxForThread > 0 && logger != NULL) + logger->write( + "ONNX backend: device index " + Global::intToString(deviceIdxForThread) + + " ignored for device_type '" + deviceType + + "' because it already selects a specific device (\"GPU.1\"-style suffix) or is a " + "composite/qualified device string (AUTO:/MULTI:/HETERO:). " + "Select the device explicitly in onnxOpenVINODeviceType or the per-thread onnxOpenVINODeviceTypeThread override."); + openvinoOpts["device_type"] = deviceType; + + auto setIfNotEmpty = [&](const char* ortKey, const std::string& val) { + if(!val.empty()) + openvinoOpts[ortKey] = val; + }; + setIfNotEmpty("cache_dir", ctx->openvinoCacheDir); + setIfNotEmpty("precision", ctx->openvinoPrecision); + setIfNotEmpty("num_streams", ctx->openvinoNumStreams); + + // Some ORT OpenVINO builds reject optional keys. cache_dir and num_streams are + // tuning-only, so if the EP rejects the option set, retry without them and degrade + // gracefully. precision is never dropped: silently discarding a precision request + // (useFP16 = false or onnxOpenVINOPrecision) could run the net at a different precision + // than the user demanded, so a rejection with precision set stays fatal. + static const char* droppableKeys[] = { + "cache_dir", "num_streams" + }; + // Wraps a final, non-retryable rejection. If a precision request is in play, explain why + // it was deliberately not dropped, since the EP's own error may be opaque. Only valid to + // call while handling an exception (the bare throw rethrows the current one). + auto throwFinalError = [&openvinoOpts](const Ort::Exception& err) { + if(openvinoOpts.count("precision") > 0) + throw StringError( + string("ONNX backend: OpenVINO provider rejected its options. The precision option " + "was kept because it was requested via useFP16 or onnxOpenVINOPrecision, and this " + "EP or device may not support it. Error: ") + err.what()); + throw; + }; + try { + sessionOpts.AppendExecutionProvider_OpenVINO_V2(openvinoOpts); + } + catch(const Ort::Exception& e) { + bool hadDroppableKeys = false; + for(const char* k : droppableKeys) { + if(openvinoOpts.count(k) > 0) { + hadDroppableKeys = true; + break; + } + } + if(!hadDroppableKeys) + throwFinalError(e); + + if(logger != NULL) { + logger->write( + string("ONNX backend: OpenVINO provider options rejected, retrying without cache_dir/num_streams. Error: ") + + e.what() + ); + } + for(const char* k : droppableKeys) + openvinoOpts.erase(k); + try { + sessionOpts.AppendExecutionProvider_OpenVINO_V2(openvinoOpts); + } + catch(const Ort::Exception& e2) { + throwFinalError(e2); + } + } + + if(logger != NULL) { + string extras; + for(const char* k : {"cache_dir", "precision", "num_streams"}) { + if(openvinoOpts.count(k) > 0) + extras += string(", ") + k + "=" + openvinoOpts[k]; + } + logger->write( + "ONNX backend: OpenVINO execution provider enabled for thread " + Global::intToString(serverThreadIdx) + + ", device_type=" + deviceType + extras + ); + } + } + else if(provider == "directml") { +#ifdef _WIN32 +#if defined(KATAGO_ONNX_HAS_DML_PROVIDER_FACTORY) + // DirectML does not support memory-pattern optimization and requires sequential + // execution mode (see the ORT DirectML EP docs). With one session per nn-server + // thread the single-Run restriction of a DML session is satisfied naturally. + sessionOpts.DisableMemPattern(); + sessionOpts.SetExecutionMode(ORT_SEQUENTIAL); + + // Prefer the OrtDmlApi route: the plain OrtSessionOptionsAppendExecutionProvider_DML + // export in dml_provider_factory.h is deprecated. Check the status by hand rather + // than via Ort::ThrowOnError so that a DML-less ORT build produces this friendly + // error instead of a generic Ort::Exception. + const OrtDmlApi* dmlApi = nullptr; + { + const OrtApi* ortApi = OrtGetApiBase()->GetApi(ORT_API_VERSION); + OrtStatus* status = ortApi->GetExecutionProviderApi("DML", ORT_API_VERSION, (const void**)&dmlApi); + if(status != nullptr || dmlApi == nullptr) { + string detail = status != nullptr ? ortApi->GetErrorMessage(status) : "GetExecutionProviderApi returned null"; + if(status != nullptr) + ortApi->ReleaseStatus(status); + throw StringError( + "ONNX backend: DirectML execution provider is not available in this ONNX Runtime build: " + detail); + } + } + + int dmlDeviceId = deviceIdxForThread >= 0 ? deviceIdxForThread : 0; + try { + Ort::ThrowOnError(dmlApi->SessionOptionsAppendExecutionProvider_DML(sessionOpts, dmlDeviceId)); + } + catch(const std::exception& e) { + // SessionOptionsAppendExecutionProvider_DML is where ORT creates the D3D12/DirectML + // device. A failure here (too-old DirectML, missing device, driver issue) would otherwise + // become a silent fastfail on Windows when it escapes the nn-server thread, so log the + // cause and the fix before rethrowing. DMLCreateDevice1 reports an unsupported minimum + // feature level as DXGI_ERROR_UNSUPPORTED (0x887A0004) - i.e. a DirectML runtime/driver + // too old for feature level 5.0 - and anything else is a different setup problem. + string what = string(e.what()); + string low = Global::toLower(what); + bool versionTooOld = low.find("887a0004") != string::npos || low.find("dxgi_error_unsupported") != string::npos; + string msg = string("ONNX backend: DirectML init failed: ") + what + ". "; + if(versionTooOld) { + msg += "DirectML feature level 5.0 (DirectML.dll >= 1.8.0) is unavailable - Windows 10's " + "inbox DirectML is only 1.1.0. Copy Microsoft.AI.DirectML's DirectML.dll " + "next to onnxruntime.dll. Update the GPU driver if it still fails. " + "See https://github.com/lightvector/KataGo/pull/1222#issuecomment-5278419866"; + } + else { + msg += "Check that DirectML.dll >= 1.8.0 sits next to onnxruntime.dll and that " + "onnxDeviceToUse selects a valid device, or update the GPU driver."; + } + if(logger != NULL) + logger->write(msg); + cerr << msg << endl; + throw; + } + if(logger != NULL) + logger->write("ONNX backend: DirectML execution provider enabled, device_id=" + Global::intToString(dmlDeviceId)); +#else + throw StringError( + "ONNX backend: DirectML is not available in this ONNX Runtime build: the ORT install " + "tree does not ship dml_provider_factory.h. Compile against the " + "Microsoft.ML.OnnxRuntime.DirectML package to use the DirectML execution provider."); +#endif +#else + throw StringError("ONNX backend: DirectML is only available on Windows"); +#endif + } + else if(provider == "cpu" || provider.empty()) { + if(logger != NULL) + logger->write("ONNX backend: using CPU execution provider"); + } + else { + throw StringError("ONNX backend: unknown onnxProvider '" + provider + "'"); + } + + session = std::make_unique(ctx->env, onnxBytes.data(), onnxBytes.size(), sessionOpts); + + Ort::AllocatorWithDefaultOptions allocator; + size_t numInputs = session->GetInputCount(); + for(size_t i = 0; i < numInputs; i++) { + Ort::AllocatedStringPtr name = session->GetInputNameAllocated(i, allocator); + inputNames.push_back(name.get()); + } + for(auto& n : inputNames) + inputNamePtrs.push_back(n.c_str()); + + size_t numOutputs = session->GetOutputCount(); + for(size_t i = 0; i < numOutputs; i++) { + Ort::AllocatedStringPtr name = session->GetOutputNameAllocated(i, allocator); + outputNames.push_back(name.get()); + } + for(auto& n : outputNames) + outputNamePtrs.push_back(n.c_str()); + + if(logger != NULL) { + // The graph input/output orders are identical for every server thread, so log them once. + if(serverThreadIdx <= 0) { + string inList = "ONNX backend: graph input order:"; + for(size_t i = 0; i < inputNames.size(); i++) + inList += " [" + Global::uint64ToString(i) + "]" + inputNames[i]; + logger->write(inList); + string outList = "ONNX backend: graph output order:"; + for(size_t i = 0; i < outputNames.size(); i++) + outList += " [" + Global::uint64ToString(i) + "]" + outputNames[i]; + logger->write(outList); + } + logger->write("ONNX backend: session created, inputs=" + Global::uint64ToString(numInputs) + + " outputs=" + Global::uint64ToString(numOutputs)); + } + } + + ComputeHandle() = delete; + ComputeHandle(const ComputeHandle&) = delete; + ComputeHandle& operator=(const ComputeHandle&) = delete; +}; + +ComputeHandle* NeuralNet::createComputeHandle( + ComputeContext* context, + const LoadedModel* loadedModel, + Logger* logger, + int maxBatchSize, + bool requireExactNNLen, + bool inputsUseNHWC, + int gpuIdxForThisThread, + int serverThreadIdx +) { + // ONNX Runtime sessions support dynamic batch sizes, but the InputBuffers maxBatchSize + // field still enforces the upper bound at inference time. + (void)maxBatchSize; + if(inputsUseNHWC) + throw StringError("ONNX backend: inputsUseNHWC = true not supported, must use NCHW"); + + if(logger != NULL) { + logger->write("ONNX backend thread " + Global::intToString(serverThreadIdx) + + ": Model version " + Global::intToString(loadedModel->modelDesc.modelVersion)); + logger->write("ONNX backend thread " + Global::intToString(serverThreadIdx) + + ": Model name: " + loadedModel->modelDesc.name + + " (" + loadedModel->modelDesc.getShortInfoString() + ")"); + string deviceInfo = + context->providerName == "openvino" + ? (serverThreadIdx >= 0 && serverThreadIdx < (int)context->perThreadDeviceType.size() + ? context->perThreadDeviceType[serverThreadIdx] + : context->openvinoDeviceType) + : Global::intToString(gpuIdxForThisThread); + logger->write("ONNX backend thread " + Global::intToString(serverThreadIdx) + + ": provider=" + context->providerName + " deviceIdx=" + deviceInfo); + } + + return new ComputeHandle(context, *loadedModel, logger, gpuIdxForThisThread, serverThreadIdx, requireExactNNLen); +} + +void NeuralNet::freeComputeHandle(ComputeHandle* computeHandle) { + delete computeHandle; +} + +bool NeuralNet::isUsingFP16(const ComputeHandle* handle) { + (void)handle; + // The emitted ONNX graph is fp32, and precision is delegated to the execution provider, + // which may downcast internally, so from KataGo's perspective this is fp32. + return false; +} + +bool NeuralNet::setIsWarmup(const ComputeHandle* handle, bool isWarmup) { + (void)handle; + (void)isWarmup; + return false; +} + +//-------------------------------------------------------------- + +struct InputBuffers { + int maxBatchSize; + + size_t singleMaskElts; + size_t singleInputElts; + size_t singleInputGlobalElts; + size_t singleInputMetaElts; + + size_t singlePolicyPassResultElts; + size_t singlePolicyResultElts; + size_t singleValueResultElts; + size_t singleScoreValueResultElts; + size_t singleOwnershipResultElts; + + vector maskInput; + vector spatialInput; + vector globalInput; + vector metaInput; + + InputBuffers(const LoadedModel* loadedModel, int maxBatchSz, int nnXLen, int nnYLen) { + const ModelDesc& m = loadedModel->modelDesc; + + if(nnXLen > NNPos::MAX_BOARD_LEN) + throw StringError( + Global::strprintf("nnXLen (%d) is greater than NNPos::MAX_BOARD_LEN (%d)", nnXLen, NNPos::MAX_BOARD_LEN)); + if(nnYLen > NNPos::MAX_BOARD_LEN) + throw StringError( + Global::strprintf("nnYLen (%d) is greater than NNPos::MAX_BOARD_LEN (%d)", nnYLen, NNPos::MAX_BOARD_LEN)); + + maxBatchSize = maxBatchSz; + singleMaskElts = (size_t)nnXLen * nnYLen; + singleInputElts = (size_t)m.numInputChannels * nnXLen * nnYLen; + singleInputGlobalElts = (size_t)m.numInputGlobalChannels; + singleInputMetaElts = (size_t)m.numInputMetaChannels; + singlePolicyPassResultElts = (size_t)m.numPolicyChannels; + singlePolicyResultElts = (size_t)m.numPolicyChannels * nnXLen * nnYLen; + singleValueResultElts = (size_t)m.numValueChannels; + singleScoreValueResultElts = (size_t)m.numScoreValueChannels; + singleOwnershipResultElts = (size_t)m.numOwnershipChannels * nnXLen * nnYLen; + + testAssert(NNModelVersion::getNumSpatialFeatures(m.modelVersion) == m.numInputChannels); + testAssert(NNModelVersion::getNumGlobalFeatures(m.modelVersion) == m.numInputGlobalChannels); + if(m.numInputMetaChannels > 0) + testAssert(SGFMetadata::METADATA_INPUT_NUM_CHANNELS == m.numInputMetaChannels); + + maskInput.assign(singleMaskElts * maxBatchSize, 0.0f); + spatialInput.assign(singleInputElts * maxBatchSize, 0.0f); + globalInput.assign(singleInputGlobalElts * maxBatchSize, 0.0f); + if(singleInputMetaElts > 0) + metaInput.assign(singleInputMetaElts * maxBatchSize, 0.0f); + } + + InputBuffers() = delete; + InputBuffers(const InputBuffers&) = delete; + InputBuffers& operator=(const InputBuffers&) = delete; +}; + +InputBuffers* NeuralNet::createInputBuffers(const LoadedModel* loadedModel, int maxBatchSize, int nnXLen, int nnYLen) { + return new InputBuffers(loadedModel, maxBatchSize, nnXLen, nnYLen); +} + +void NeuralNet::freeInputBuffers(InputBuffers* inputBuffers) { + delete inputBuffers; +} + +//-------------------------------------------------------------- + +void NeuralNet::globalInitialize() { +} + +void NeuralNet::globalCleanup() { +} + +//-------------------------------------------------------------- + +// Find the index of a name in the graph's name list, matching any of the target alternatives. +static int findNameIndex(const vector& names, std::initializer_list targets) { + for(size_t i = 0; i < names.size(); i++) { + for(const char* t : targets) { + if(names[i] == t) + return (int)i; + } + } + return -1; +} + +void NeuralNet::getOutput( + ComputeHandle* gpuHandle, + InputBuffers* inputBuffers, + int numBatchEltsFilled, + NNResultBuf** inputBufs, + vector& outputs +) { + assert(numBatchEltsFilled <= inputBuffers->maxBatchSize); + assert(numBatchEltsFilled > 0); + + const int batchSize = numBatchEltsFilled; + const int nnXLen = gpuHandle->ctx->nnXLen; + const int nnYLen = gpuHandle->ctx->nnYLen; + const int modelVersion = gpuHandle->modelVersion; + + const int numSpatialFeatures = NNModelVersion::getNumSpatialFeatures(modelVersion); + const int numGlobalFeatures = NNModelVersion::getNumGlobalFeatures(modelVersion); + const int numMetaFeatures = (int)inputBuffers->singleInputMetaElts; + assert(numSpatialFeatures * nnXLen * nnYLen == inputBuffers->singleInputElts); + assert(numGlobalFeatures == inputBuffers->singleInputGlobalElts); + + // Fill host input buffers, mirroring the TensorRT backend exactly: + // - global / meta are straight copies (no symmetry) + // - spatial is symmetry-transformed (NCHW, useNHWC=false) + // - mask = channel 0 of the symmetry-transformed spatial input + for(int nIdx = 0; nIdx < batchSize; nIdx++) { + float* rowMaskInput = inputBuffers->maskInput.data() + inputBuffers->singleMaskElts * nIdx; + float* rowSpatialInput = inputBuffers->spatialInput.data() + inputBuffers->singleInputElts * nIdx; + float* rowGlobalInput = inputBuffers->globalInput.data() + inputBuffers->singleInputGlobalElts * nIdx; + + const float* rowGlobal = inputBufs[nIdx]->rowGlobalBuf.data(); + const float* rowSpatial = inputBufs[nIdx]->rowSpatialBuf.data(); + std::copy(rowGlobal, rowGlobal + numGlobalFeatures, rowGlobalInput); + SymmetryHelpers::copyInputsWithSymmetry( + rowSpatial, rowSpatialInput, 1, nnYLen, nnXLen, numSpatialFeatures, false, inputBufs[nIdx]->symmetry); + std::copy(rowSpatialInput, rowSpatialInput + inputBuffers->singleMaskElts, rowMaskInput); + + if(numMetaFeatures > 0) { + float* rowMetaInput = inputBuffers->metaInput.data() + inputBuffers->singleInputMetaElts * nIdx; + const float* rowMeta = inputBufs[nIdx]->rowMetaBuf.data(); + testAssert(inputBufs[nIdx]->hasRowMeta); + std::copy(rowMeta, rowMeta + numMetaFeatures, rowMetaInput); + } + else { + testAssert(!inputBufs[nIdx]->hasRowMeta); + } + } + + // Build Ort::Value views over the host buffers. These stay in CPU memory - the execution + // provider copies to device internally and returns outputs in CPU memory. + Ort::MemoryInfo memInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); + + std::array maskShape = {batchSize, 1, nnYLen, nnXLen}; + Ort::Value maskTensor = Ort::Value::CreateTensor( + memInfo, inputBuffers->maskInput.data(), inputBuffers->singleMaskElts * batchSize, + maskShape.data(), maskShape.size()); + + std::array spatialShape = {batchSize, numSpatialFeatures, nnYLen, nnXLen}; + Ort::Value spatialTensor = Ort::Value::CreateTensor( + memInfo, inputBuffers->spatialInput.data(), inputBuffers->singleInputElts * batchSize, + spatialShape.data(), spatialShape.size()); + + std::array globalShape = {batchSize, numGlobalFeatures, 1, 1}; + Ort::Value globalTensor = Ort::Value::CreateTensor( + memInfo, inputBuffers->globalInput.data(), inputBuffers->singleInputGlobalElts * batchSize, + globalShape.data(), globalShape.size()); + + Ort::Value metaTensor(nullptr); + std::array metaShape; + if(numMetaFeatures > 0) { + metaShape = {batchSize, numMetaFeatures, 1, 1}; + metaTensor = Ort::Value::CreateTensor( + memInfo, inputBuffers->metaInput.data(), inputBuffers->singleInputMetaElts * batchSize, + metaShape.data(), metaShape.size()); + } + + // Bind tensors in the graph's declared input order (ORT matches by pointer array + name array). + int maskIdx = findNameIndex(gpuHandle->inputNames, {"InputMask"}); + int spatialIdx = findNameIndex(gpuHandle->inputNames, {"InputSpatial"}); + int globalIdx = findNameIndex(gpuHandle->inputNames, {"InputGlobal"}); + if(maskIdx < 0 || spatialIdx < 0 || globalIdx < 0) + throw StringError("ONNX backend: graph is missing expected inputs InputMask/InputSpatial/InputGlobal"); + int metaIdx = -1; + if(numMetaFeatures > 0) { + metaIdx = findNameIndex(gpuHandle->inputNames, {"InputMeta"}); + if(metaIdx < 0) + throw StringError("ONNX backend: model has metadata channels but the graph has no InputMeta input"); + } + + vector inputTensors; + inputTensors.reserve(gpuHandle->inputNames.size()); + for(size_t i = 0; i < gpuHandle->inputNames.size(); i++) { + if((int)i == maskIdx) + inputTensors.push_back(std::move(maskTensor)); + else if((int)i == spatialIdx) + inputTensors.push_back(std::move(spatialTensor)); + else if((int)i == globalIdx) + inputTensors.push_back(std::move(globalTensor)); + else if((int)i == metaIdx) + inputTensors.push_back(std::move(metaTensor)); + else + throw StringError("ONNX backend: unexpected graph input '" + gpuHandle->inputNames[i] + + "' -- only InputMask/InputSpatial/InputGlobal/InputMeta are supported"); + } + + auto outputTensors = gpuHandle->session->Run( + Ort::RunOptions{nullptr}, + gpuHandle->inputNamePtrs.data(), + inputTensors.data(), + inputTensors.size(), + gpuHandle->outputNamePtrs.data(), + gpuHandle->outputNamePtrs.size()); + + int policyPassIdx = findNameIndex(gpuHandle->outputNames, {"OutputPolicyPass"}); + int policyIdx = findNameIndex(gpuHandle->outputNames, {"OutputPolicy"}); + int valueIdx = findNameIndex(gpuHandle->outputNames, {"OutputValue"}); + int scoreValueIdx = findNameIndex(gpuHandle->outputNames, {"OutputScoreValue"}); + int ownershipIdx = findNameIndex(gpuHandle->outputNames, {"OutputOwnership"}); + if(policyPassIdx < 0 || policyIdx < 0 || valueIdx < 0 || scoreValueIdx < 0 || ownershipIdx < 0) + throw StringError( + "ONNX backend: graph is missing expected outputs " + "(OutputPolicyPass/OutputPolicy/OutputValue/OutputScoreValue/OutputOwnership)"); + + const float* policyPassData = outputTensors[policyPassIdx].GetTensorData(); + const float* policyData = outputTensors[policyIdx].GetTensorData(); + const float* valueData = outputTensors[valueIdx].GetTensorData(); + const float* scoreValueData = outputTensors[scoreValueIdx].GetTensorData(); + const float* ownershipData = outputTensors[ownershipIdx].GetTensorData(); + + assert(policyPassData != nullptr); + assert(policyData != nullptr); + assert(valueData != nullptr); + assert(scoreValueData != nullptr); + assert(ownershipData != nullptr); + assert((int)outputs.size() == batchSize); + + const int numPolicyChannels = (int)inputBuffers->singlePolicyPassResultElts; + assert(inputBuffers->singlePolicyResultElts == (size_t)numPolicyChannels * nnXLen * nnYLen); + const int numValueChannels = (int)inputBuffers->singleValueResultElts; + const int numScoreValueChannels = (int)inputBuffers->singleScoreValueResultElts; + + // Per-row decode, reproducing the TensorRT backend's post-processing exactly. + // Outputs are raw logits, so the client applies softmax / tanh / etc. + float policyProbsTmp[NNPos::MAX_NN_POLICY_SIZE]; + + for(int row = 0; row < batchSize; row++) { + NNOutput* output = outputs[row]; + assert(output->nnXLen == nnXLen); + assert(output->nnYLen == nnYLen); + float policyOptimism = (float)inputBufs[row]->policyOptimism; + + // Policy: OutputPolicyPass is [N, numPolicyChannels, 1, 1] and OutputPolicy is [N, numPolicyChannels, H, W]. + { + const float* policyPassSrcBuf = policyPassData + row * numPolicyChannels; + const float* policySrcBuf = policyData + row * numPolicyChannels * nnXLen * nnYLen; + float* policyProbs = output->policyProbs; + + if(numPolicyChannels == 2 || (numPolicyChannels == 4 && modelVersion >= 16)) { + // NCHW: channel 0 = base logits, channel 1 = optimism logits. + for(int i = 0; i < nnXLen * nnYLen; i++) { + float p = policySrcBuf[i]; + float pOpt = policySrcBuf[i + nnXLen * nnYLen]; + policyProbsTmp[i] = p + (pOpt - p) * policyOptimism; + } + SymmetryHelpers::copyOutputsWithSymmetry( + policyProbsTmp, policyProbs, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); + policyProbs[nnXLen * nnYLen] = + policyPassSrcBuf[0] + (policyPassSrcBuf[1] - policyPassSrcBuf[0]) * policyOptimism; + } + else { + assert(numPolicyChannels == 1); + SymmetryHelpers::copyOutputsWithSymmetry( + policySrcBuf, policyProbs, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); + policyProbs[nnXLen * nnYLen] = policyPassSrcBuf[0]; + } + } + + // Value: [N, 3, 1, 1] raw categorical logits (win/loss/noresult). + { + assert(numValueChannels == 3); + output->whiteWinProb = valueData[row * numValueChannels]; + output->whiteLossProb = valueData[row * numValueChannels + 1]; + output->whiteNoResultProb = valueData[row * numValueChannels + 2]; + } + + // Ownership: [N, 1, H, W] raw, inverse-symmetried back to canonical orientation. + if(output->whiteOwnerMap != NULL) { + assert(inputBuffers->singleOwnershipResultElts == (size_t)nnXLen * nnYLen); + const float* ownershipSrcBuf = ownershipData + row * nnXLen * nnYLen; + SymmetryHelpers::copyOutputsWithSymmetry( + ownershipSrcBuf, output->whiteOwnerMap, 1, nnYLen, nnXLen, inputBufs[row]->symmetry); + } + + // ScoreValue: [N, numScoreValueChannels, 1, 1] raw, version-dependent channel interpretation. + { + if(modelVersion >= 9) { + assert(numScoreValueChannels == 6); + output->whiteScoreMean = scoreValueData[row * numScoreValueChannels]; + output->whiteScoreMeanSq = scoreValueData[row * numScoreValueChannels + 1]; + output->whiteLead = scoreValueData[row * numScoreValueChannels + 2]; + output->varTimeLeft = scoreValueData[row * numScoreValueChannels + 3]; + output->shorttermWinlossError = scoreValueData[row * numScoreValueChannels + 4]; + output->shorttermScoreError = scoreValueData[row * numScoreValueChannels + 5]; + } + else if(modelVersion >= 8) { + assert(numScoreValueChannels == 4); + output->whiteScoreMean = scoreValueData[row * numScoreValueChannels]; + output->whiteScoreMeanSq = scoreValueData[row * numScoreValueChannels + 1]; + output->whiteLead = scoreValueData[row * numScoreValueChannels + 2]; + output->varTimeLeft = scoreValueData[row * numScoreValueChannels + 3]; + output->shorttermWinlossError = 0; + output->shorttermScoreError = 0; + } + else if(modelVersion >= 4) { + assert(numScoreValueChannels == 2); + output->whiteScoreMean = scoreValueData[row * numScoreValueChannels]; + output->whiteScoreMeanSq = scoreValueData[row * numScoreValueChannels + 1]; + output->whiteLead = output->whiteScoreMean; + output->varTimeLeft = 0; + output->shorttermWinlossError = 0; + output->shorttermScoreError = 0; + } + else if(modelVersion >= 3) { + assert(numScoreValueChannels == 1); + output->whiteScoreMean = scoreValueData[row * numScoreValueChannels]; + output->whiteScoreMeanSq = output->whiteScoreMean * output->whiteScoreMean; + output->whiteLead = output->whiteScoreMean; + output->varTimeLeft = 0; + output->shorttermWinlossError = 0; + output->shorttermScoreError = 0; + } + else { + ASSERT_UNREACHABLE; + } + } + } +} + +// Device class to report for an OpenVINO device name. Any name other than the three device +// classes that differ in numerics reports as "other": an OpenVINO device_type string can also +// name a virtual device ("AUTO", "BATCH:GPU"), carry a per-device suffix ("GPU(2)"), or simply be +// a typo, none of which are worth distinguishing. +static string reportedDeviceName(const string& name) { + if(name == "CPU") + return "cpu"; + if(name == "GPU") + return "gpu"; + if(name == "NPU") + return "npu"; + return "other"; +} + +std::string NeuralNet::getRuntimeBackendDetail(ConfigParser& cfg) { + // Report which execution provider will run under this backend, and for OpenVINO also which + // device classes it will run on, matching the parsing in createComputeContext and ComputeHandle. + // Providers are effectively different backends with different numerics and maturity, as are CPU + // versus GPU versus NPU under OpenVINO, so e.g. the distributed training server wants to be able + // to tell them apart. Produces e.g. "openvino-gpu-npu", at most 26 characters. + // + // Every piece of the result is a fixed string rather than any of the config text it was derived + // from, so that whoever aggregates these sees a small closed set of values and never something a + // user typed. + string provider = Global::toLower(cfg.contains("onnxProvider") ? cfg.getString("onnxProvider") : "cpu"); + + string detail; + for(const char* knownProvider : kKnownProviders) { + if(provider == knownProvider) { + detail = knownProvider; + break; + } + } + // An unknown provider is a config error, but one that createComputeContext raises later than + // this runs. Report nothing rather than anything derived from the offending value. + if(detail.empty()) + return detail; + + // OpenVINO is the only provider that can target device classes differing in numerics without a + // change of provider name. The rest are single-class by construction: the CPU, or a GPU-like + // accelerator picked by device index. + if(detail == "openvino") { + string defaultDeviceType = + cfg.contains("onnxOpenVINODeviceType") ? cfg.getString("onnxOpenVINODeviceType") : "GPU"; + int numThreads = + cfg.contains("numNNServerThreadsPerModel") ? cfg.getInt("numNNServerThreadsPerModel", 1, 1024) : 1; + + // Sorted and deduplicated, so that the result depends only on which device classes are in use + // and not on how threads were assigned to them. + std::set deviceNames; + for(int t = 0; t < numThreads; t++) { + string key = "onnxOpenVINODeviceTypeThread" + Global::intToString(t); + string threadDeviceType = cfg.contains(key) ? cfg.getString(key) : defaultDeviceType; + // A composite device string contributes every device it lists, since any of them may end up + // running the graph. + for(const string& name : parseDeviceNames(threadDeviceType)) + deviceNames.insert(reportedDeviceName(name)); + } + + for(const string& name : deviceNames) + detail += "-" + name; + } + return detail; +} + +void NeuralNet::printDevices() { + cout << "ONNX backend: device enumeration is execution-provider-specific." << endl; + cout << "Providers other than cpu need an ONNX Runtime package or build that includes them," << endl; + cout << "and not all of them are tested. For the status of each provider and what it needs, see:" << endl; + cout << "https://github.com/lightvector/KataGo/blob/master/Compiling.md#execution-providers" << endl; + cout << "Set onnxProvider (e.g. 'openvino') plus provider-specific options in the config." << endl; + cout << endl; + cout << "OpenVINO provider options:" << endl; + cout << " onnxOpenVINODeviceType = GPU (default; GPU, NPU, GPU.0, GPU.1, etc.)" << endl; + cout << " Also supports OpenVINO multi-device strings:" << endl; + cout << " AUTO:GPU,CPU MULTI:GPU,NPU HETERO:GPU,CPU" << endl; + cout << endl; + cout << " Multi-device per-thread assignment:" << endl; + cout << " onnxOpenVINODeviceTypeThread0 = NPU" << endl; + cout << " onnxOpenVINODeviceTypeThread1 = GPU" << endl; + cout << endl; + cout << " Optional tuning:" << endl; + cout << " onnxOpenVINOCacheDir = katago_ov_cache" << endl; + cout << " onnxOpenVINOPrecision = FP16" << endl; + cout << " onnxOpenVINONumStreams = 2" << endl; +} + +//-------------------------------------------------------------- +// The layer-level test entry points are not implemented for this backend. Returning +// false tells the test harness this configuration is unsupported rather than failing. +// The TensorRT backend does the same. + +bool NeuralNet::testEvaluateConv( + const ConvLayerDesc*, int, int, int, bool, bool, + const std::vector&, std::vector& +) { + return false; +} + +bool NeuralNet::testEvaluateBatchNorm( + const BatchNormLayerDesc*, int, int, int, bool, bool, + const std::vector&, const std::vector&, std::vector& +) { + return false; +} + +bool NeuralNet::testEvaluateResidualBlock( + const ResidualBlockDesc*, int, int, int, bool, bool, + const std::vector&, const std::vector&, std::vector& +) { + return false; +} + +bool NeuralNet::testEvaluateGlobalPoolingResidualBlock( + const GlobalPoolingResidualBlockDesc*, int, int, int, bool, bool, + const std::vector&, const std::vector&, std::vector& +) { + return false; +} + +#endif // USE_ONNX_BACKEND diff --git a/cpp/neuralnet/onnxmodelbuilder.cpp b/cpp/neuralnet/onnxmodelbuilder.cpp index 8b29ed53ea..25f9f02943 100644 --- a/cpp/neuralnet/onnxmodelbuilder.cpp +++ b/cpp/neuralnet/onnxmodelbuilder.cpp @@ -1,12 +1,16 @@ #include "../neuralnet/onnxmodelbuilder.h" #include +#include +#include +#include "../core/fileutils.h" #include "../core/global.h" #include "../core/test.h" #include "../neuralnet/activations.h" #include "../neuralnet/modelversion.h" #include "../neuralnet/nninputs.h" +#include "../neuralnet/sgfmetadata.h" #include "onnx.pb.h" @@ -14,6 +18,155 @@ using namespace std; namespace { +// ---- Embedded KataGo metadata ---- +// +// Every emitted graph carries a block of "katago." metadata_props holding the model parameters that +// an ONNX graph cannot express: model version, channel counts, score post-processing multipliers, +// and the build settings baked into the graph. Without the block a .onnx file cannot be loaded and +// run (see OnnxModelBuilder::load). +// +// docs/ONNX_Model_Files.md documents this block and the graph's input/output contract for third +// parties, who can write a conforming .onnx of their own. KEEP THAT DOCUMENT IN SYNC with changes +// here, including the rules below. +// +// The block has two namespaces, and which one a new key belongs in is the first thing to decide: +// +// - "katago." is must-understand. load() refuses any key here that this build does not know, since +// a key it cannot interpret is one whose instructions it would be ignoring. Everything that +// changes how KataGo evaluates a position, decodes an output, or adjudicates a game belongs +// here, and as a REQUIRED key rather than an optional one with a default: silently defaulting a +// semantic flag off is exactly the failure this namespace exists to prevent. +// - "katago.info." is safe to ignore. Unknown keys here pass, so an older build still loads a file +// that carries newer reporting keys. Only put things here that affect nothing but log lines and +// diagnostics. +// +// Keys outside "katago." are left alone entirely - ONNX defines conventional metadata_props of its +// own, and other tooling in the pipeline may stamp the file. +// +// Versioning on top of that: +// +// - Adding a key under "katago.info.": do NOT bump. Older readers ignore it, and newer readers +// fall back to the documented default when an older writer omitted it. +// - Adding a key under "katago.", changing the meaning or units of an existing one, or changing +// the graph IO contract: bump KATAGO_METADATA_VERSION. The bump is what lets an older build say +// which version it wanted; refusing the unknown key is only the backstop if the bump is missed. +// - Raise KATAGO_METADATA_VERSION_MIN_READ only when this build can no longer honor an older +// version's semantics. Leaving it alone is what keeps old files working. +const int KATAGO_METADATA_VERSION = 1; +const int KATAGO_METADATA_VERSION_MIN_READ = 1; + +// Namespace prefixes, per the contract above. +const char* const META_PREFIX = "katago."; +const char* const META_INFO_PREFIX = "katago.info."; + +const char* const META_VERSION = "katago.metadataVersion"; +const char* const META_NAME = "katago.name"; +const char* const META_SOURCE_SHA256 = "katago.info.sourceSha256"; +const char* const META_MODEL_VERSION = "katago.modelVersion"; +const char* const META_NUM_INPUT_CHANNELS = "katago.numInputChannels"; +const char* const META_NUM_INPUT_GLOBAL_CHANNELS = "katago.numInputGlobalChannels"; +const char* const META_NUM_INPUT_META_CHANNELS = "katago.numInputMetaChannels"; +const char* const META_NUM_POLICY_CHANNELS = "katago.numPolicyChannels"; +const char* const META_NUM_VALUE_CHANNELS = "katago.numValueChannels"; +const char* const META_NUM_SCORE_VALUE_CHANNELS = "katago.numScoreValueChannels"; +const char* const META_NUM_OWNERSHIP_CHANNELS = "katago.numOwnershipChannels"; +const char* const META_META_ENCODER_VERSION = "katago.metaEncoderVersion"; +const char* const META_PREFER_PASS_ALIVE = "katago.preferPassAliveUnderSuicideRules"; +const char* const META_PREFER_EXCLUDE_TERRITORY_ADJ_ATARI = "katago.preferExcludeTerritoryAdjacentToAtari"; +const char* const META_TD_SCORE_MULT = "katago.postProcess.tdScoreMultiplier"; +const char* const META_SCORE_MEAN_MULT = "katago.postProcess.scoreMeanMultiplier"; +const char* const META_SCORE_STDEV_MULT = "katago.postProcess.scoreStdevMultiplier"; +const char* const META_LEAD_MULT = "katago.postProcess.leadMultiplier"; +const char* const META_VARIANCE_TIME_MULT = "katago.postProcess.varianceTimeMultiplier"; +const char* const META_SHORTTERM_VALUE_ERROR_MULT = "katago.postProcess.shorttermValueErrorMultiplier"; +const char* const META_SHORTTERM_SCORE_ERROR_MULT = "katago.postProcess.shorttermScoreErrorMultiplier"; +const char* const META_OUTPUT_SCALE_MULT = "katago.postProcess.outputScaleMultiplier"; +const char* const META_NN_X_LEN = "katago.build.nnXLen"; +const char* const META_NN_Y_LEN = "katago.build.nnYLen"; +const char* const META_REQUIRE_EXACT_NNLEN = "katago.build.requireExactNNLen"; +const char* const META_TRANSFORMER_NHWC = "katago.build.transformerNHWC"; +const char* const META_SCALE8_APPLIED = "katago.build.scale8Applied"; +const char* const META_ARCH_TRUNK_DEPTH = "katago.info.arch.trunkSpatialConvDepth"; +const char* const META_ARCH_NUM_PARAMS = "katago.info.arch.numParameters"; +const char* const META_ARCH_HAS_TRANSFORMER = "katago.info.arch.hasAnyTransformerBlocks"; +const char* const META_ARCH_HAS_NBT = "katago.info.arch.hasAnyNestedBottleneckBlocks"; +const char* const META_FP32_NODES_TRUNKTIP_HEAD = "katago.fp32Nodes.trunkTipAndHead"; +const char* const META_FP32_NODES_RMSNORM = "katago.fp32Nodes.rmsNorm"; + +// Every key in the must-understand namespace. load() rejects any "katago." key absent from this +// list, so a key added to build() without being added here fails the dump/load round trip at once. +const char* const KNOWN_META_KEYS[] = { + META_VERSION, + META_NAME, + META_MODEL_VERSION, + META_NUM_INPUT_CHANNELS, + META_NUM_INPUT_GLOBAL_CHANNELS, + META_NUM_INPUT_META_CHANNELS, + META_NUM_POLICY_CHANNELS, + META_NUM_VALUE_CHANNELS, + META_NUM_SCORE_VALUE_CHANNELS, + META_NUM_OWNERSHIP_CHANNELS, + META_META_ENCODER_VERSION, + META_PREFER_PASS_ALIVE, + META_PREFER_EXCLUDE_TERRITORY_ADJ_ATARI, + META_TD_SCORE_MULT, + META_SCORE_MEAN_MULT, + META_SCORE_STDEV_MULT, + META_LEAD_MULT, + META_VARIANCE_TIME_MULT, + META_SHORTTERM_VALUE_ERROR_MULT, + META_SHORTTERM_SCORE_ERROR_MULT, + META_OUTPUT_SCALE_MULT, + META_NN_X_LEN, + META_NN_Y_LEN, + META_REQUIRE_EXACT_NNLEN, + META_TRANSFORMER_NHWC, + META_SCALE8_APPLIED, + META_FP32_NODES_TRUNKTIP_HEAD, + META_FP32_NODES_RMSNORM, +}; + +// Graph IO tensor names, in the order they are declared / bound. Their shapes and the meaning of +// every channel are part of the published contract in docs/ONNX_Model_Files.md. +const char* const INPUT_SPATIAL = "InputSpatial"; +const char* const INPUT_GLOBAL = "InputGlobal"; +const char* const INPUT_META = "InputMeta"; +const char* const INPUT_MASK = "InputMask"; +const char* const OUTPUT_POLICY_PASS = "OutputPolicyPass"; +const char* const OUTPUT_POLICY = "OutputPolicy"; +const char* const OUTPUT_VALUE = "OutputValue"; +const char* const OUTPUT_SCORE_VALUE = "OutputScoreValue"; +const char* const OUTPUT_OWNERSHIP = "OutputOwnership"; + +// Doubles and floats are written with enough digits to round-trip exactly, since they scale the +// engine's score and value outputs. +string doubleToMeta(double x) { + return Global::strprintf("%.17g", x); +} +string floatToMeta(float x) { + return Global::strprintf("%.9g", (double)x); +} + +string joinLines(const vector& strs) { + string result; + for(size_t i = 0; i < strs.size(); i++) { + if(i > 0) + result += "\n"; + result += strs[i]; + } + return result; +} +vector splitLines(const string& str) { + vector result; + if(str.empty()) + return result; + for(const string& s : Global::split(str, '\n')) { + if(!s.empty()) + result.push_back(s); + } + return result; +} + // Builder that accumulates ONNX nodes and initializers into a single GraphProto, handing back // tensor names as it goes. Tensors are float32; transformerNHWC selects a channel-last NHWC trunk // instead of NCHW (see buildBlockStack / buildConv). @@ -420,7 +573,11 @@ struct Builder { testAssert((int)desc.weight.size() == C); int rmsStart = graph->node_size(); // meanSq over channels (axis 1), keepdims -> [N,1,H,W] - string sq = addNode("Mul", {input, input}, uniq(desc.name + "/sq"), desc.name + "/sq"); + // Pow(x, 2.0) rather than Mul(x, x): OpenVINO's RMSFusion pass only matches + // Power(x, const(2)) and silently skips Mul(x, x), which would leave every RMSNorm + // running as an unfused ReduceMean/Sqrt/Div chain. + string twoName = addScalarInitializer(uniq(desc.name + "/pow2"), 2.0f); + string sq = addNode("Pow", {input, twoName}, uniq(desc.name + "/sq"), desc.name + "/sq"); string meanSq = addNode("ReduceMean", {sq, addInt64Initializer(uniq(desc.name + "/axC"), {1})}, uniq(desc.name + "/meansq"), desc.name + "/meansq"); { onnx::NodeProto* n = lastNode(); onnx::AttributeProto* a = addAttr(n, "keepdims"); a->set_type(onnx::AttributeProto::INT); a->set_i(1); } @@ -455,7 +612,9 @@ struct Builder { int C = desc.numChannels; testAssert((int)desc.weight.size() == C); int rmsStart = graph->node_size(); - string sq = addNode("Mul", {input, input}, uniq(desc.name + "/sq"), desc.name + "/sq"); + // Pow(x, 2.0) rather than Mul(x, x): see the NCHW variant above. + string twoName = addScalarInitializer(uniq(desc.name + "/pow2"), 2.0f); + string sq = addNode("Pow", {input, twoName}, uniq(desc.name + "/sq"), desc.name + "/sq"); string meanSq = addNode("ReduceMean", {sq, addInt64Initializer(uniq(desc.name + "/axC"), {3})}, // C is axis 3 of [N,H,W,C] uniq(desc.name + "/meansq"), desc.name + "/meansq"); { onnx::NodeProto* n = lastNode(); onnx::AttributeProto* a = addAttr(n, "keepdims"); a->set_type(onnx::AttributeProto::INT); a->set_i(1); } @@ -821,14 +980,37 @@ struct Builder { namespace OnnxModelBuilder { +BuildParams::BuildParams() + : nnXLen(0), + nnYLen(0), + requireExactNNLen(false), + transformerNHWC(false), + scale8Applied(false) +{} + +LoadResult::LoadResult() + : serializedModel(), + buildParams(), + metadataVersion(0), + sourceSha256(), + trunkTipAndHeadNodeNames(), + rmsNormNodeNames(), + danglingInputNotDeclaredLast(false) +{} + Result build( const ModelDesc& desc, - int nnXLen, - int nnYLen, - bool requireExactNNLen, - bool transformerNHWC, + const BuildParams& buildParams, Logger* logger ) { + const int nnXLen = buildParams.nnXLen; + const int nnYLen = buildParams.nnYLen; + const bool requireExactNNLen = buildParams.requireExactNNLen; + // Normalize to what the graph actually gets built with: a trunk with no transformer blocks has no + // NHWC region, so the flag means nothing there. Doing it here rather than ignoring it downstream + // keeps the recorded value accurate, which matters because TensorRT keys its caches on it. + const bool transformerNHWC = buildParams.transformerNHWC && desc.hasAnyTransformerBlocks(); + if(logger != NULL) logger->write("Building internal onnx model, requireExactNNLen=" + Global::boolToString(requireExactNNLen) + " transformerNHWC=" + Global::boolToString(transformerNHWC)); @@ -848,8 +1030,41 @@ Result build( m->set_key(k); m->set_value(v); }; - addMeta("name", desc.name); - addMeta("modelVersion", Global::intToString(desc.modelVersion)); + // Everything about the model that the graph itself cannot express. Kept in sync with the reader + // in load(); see the KATAGO_METADATA_VERSION comment above. + addMeta(META_VERSION, Global::intToString(KATAGO_METADATA_VERSION)); + addMeta(META_NAME, desc.name); + addMeta(META_SOURCE_SHA256, desc.sha256); + addMeta(META_MODEL_VERSION, Global::intToString(desc.modelVersion)); + addMeta(META_NUM_INPUT_CHANNELS, Global::intToString(desc.numInputChannels)); + addMeta(META_NUM_INPUT_GLOBAL_CHANNELS, Global::intToString(desc.numInputGlobalChannels)); + addMeta(META_NUM_INPUT_META_CHANNELS, Global::intToString(desc.numInputMetaChannels)); + addMeta(META_NUM_POLICY_CHANNELS, Global::intToString(desc.numPolicyChannels)); + addMeta(META_NUM_VALUE_CHANNELS, Global::intToString(desc.numValueChannels)); + addMeta(META_NUM_SCORE_VALUE_CHANNELS, Global::intToString(desc.numScoreValueChannels)); + addMeta(META_NUM_OWNERSHIP_CHANNELS, Global::intToString(desc.numOwnershipChannels)); + addMeta(META_META_ENCODER_VERSION, Global::intToString(desc.metaEncoderVersion)); + addMeta(META_PREFER_PASS_ALIVE, Global::boolToString(desc.preferPassAliveUnderSuicideRules)); + addMeta(META_PREFER_EXCLUDE_TERRITORY_ADJ_ATARI, Global::boolToString(desc.preferExcludeTerritoryAdjacentToAtari)); + addMeta(META_TD_SCORE_MULT, doubleToMeta(desc.postProcessParams.tdScoreMultiplier)); + addMeta(META_SCORE_MEAN_MULT, doubleToMeta(desc.postProcessParams.scoreMeanMultiplier)); + addMeta(META_SCORE_STDEV_MULT, doubleToMeta(desc.postProcessParams.scoreStdevMultiplier)); + addMeta(META_LEAD_MULT, doubleToMeta(desc.postProcessParams.leadMultiplier)); + addMeta(META_VARIANCE_TIME_MULT, doubleToMeta(desc.postProcessParams.varianceTimeMultiplier)); + addMeta(META_SHORTTERM_VALUE_ERROR_MULT, doubleToMeta(desc.postProcessParams.shorttermValueErrorMultiplier)); + addMeta(META_SHORTTERM_SCORE_ERROR_MULT, doubleToMeta(desc.postProcessParams.shorttermScoreErrorMultiplier)); + addMeta(META_OUTPUT_SCALE_MULT, floatToMeta(desc.postProcessParams.outputScaleMultiplier)); + addMeta(META_NN_X_LEN, Global::intToString(nnXLen)); + addMeta(META_NN_Y_LEN, Global::intToString(nnYLen)); + addMeta(META_REQUIRE_EXACT_NNLEN, Global::boolToString(requireExactNNLen)); + addMeta(META_TRANSFORMER_NHWC, Global::boolToString(transformerNHWC)); + addMeta(META_SCALE8_APPLIED, Global::boolToString(buildParams.scale8Applied)); + // Architecture summary. Only used for reporting and for lenience thresholds in tests; a reloaded + // graph has no layer structure left to recompute these from. + addMeta(META_ARCH_TRUNK_DEPTH, doubleToMeta(desc.getTrunkSpatialConvDepth())); + addMeta(META_ARCH_NUM_PARAMS, Global::int64ToString(desc.getNumParameters())); + addMeta(META_ARCH_HAS_TRANSFORMER, Global::boolToString(desc.hasAnyTransformerBlocks())); + addMeta(META_ARCH_HAS_NBT, Global::boolToString(desc.hasAnyNestedBottleneckBlocks())); onnx::GraphProto* graph = model.mutable_graph(); graph->set_name(desc.name.empty() ? "katago" : desc.name); @@ -884,7 +1099,19 @@ Result build( shape->add_dim()->set_dim_value(1); shape->add_dim()->set_dim_value(1); }; - addInput("InputMask", 1); + // Declaration order matters for the OpenVINO execution provider under ONNX Runtime (from ORT + // 1.23.0): the EP builds its name->index map skipping graph inputs that no node consumes, but + // does not adjust the indices it then binds tensors by, so every input after a dangling one is + // bound to the wrong buffer. Declaring InputMask first makes the EP misroute the [N,1,H,W] mask + // tensor into the InputSpatial port, failing at runtime with: + // "can't handle input tensor ...:InputSpatial, because model input (shape=[?,22,19,19]) + // and tensor (shape=[1,1,19,19]) are incompatible" + // (observed on ORT 1.29 + OpenVINO 2026.2, Intel Arc B580). InputMask is exactly such a dangling + // input whenever requireExactNNLen skips all masking, which is why the failure shows up only + // there. Declaring it last keeps the live inputs at contiguous indices. + // This rule is part of the graph contract in docs/ONNX_Model_Files.md, since externally-produced + // models have to follow it too. Keep the two in sync. + // InputMeta, when the model has a metadata encoder, goes after InputGlobal and before InputMask. addInput("InputSpatial", numInputChannels); addInputNC11("InputGlobal", numInputGlobalChannels); // HumanSL-style nets additionally take a per-row SGF metadata vector. Only declare the input when @@ -893,6 +1120,7 @@ Result build( bool hasMetaEncoder = desc.metaEncoderVersion > 0; if(hasMetaEncoder) addInputNC11("InputMeta", desc.numInputMetaChannels); + addInput("InputMask", 1); // ---- Mask-derived features ---- if(!requireExactNNLen) { @@ -1115,6 +1343,11 @@ Result build( // logger->write("OnnxModelBuilder: DEBUG exposed all internal node outputs as graph outputs"); // } + // Record the FP32-pinning node names in the metadata as well as returning them: the TensorRT + // backend needs them for a loaded .onnx too, where there is no emit step to produce them. + addMeta(META_FP32_NODES_TRUNKTIP_HEAD, joinLines(b.trunkTipAndHeadNodeNames)); + addMeta(META_FP32_NODES_RMSNORM, joinLines(b.rmsNormNodeNames)); + OnnxModelBuilder::Result result; if(!model.SerializeToString(&result.serializedModel)) throw StringError("OnnxModelBuilder: failed to serialize ModelProto"); @@ -1123,4 +1356,486 @@ Result build( return result; } +//-------------------------------------------------------------------------------------------------- +// Reading a .onnx model file +//-------------------------------------------------------------------------------------------------- + +bool isOnnxFileName(const string& fileName) { + string lower = Global::toLower(fileName); + return Global::isSuffix(lower, ".onnx") || Global::isSuffix(lower, ".onnx.gz"); +} + +namespace { + +// Metadata accessors. A key read through the plain getters is required: defaulting a missing one +// would silently mis-decode the net rather than fail. +struct MetaReader { + const map& meta; + const string& fileName; + + [[noreturn]] void fail(const string& msg) const { + throw StringError("Error loading ONNX model file " + fileName + ": " + msg); + } + const string& getString(const char* key) const { + auto iter = meta.find(key); + if(iter == meta.end()) + fail(string("metadata is missing required key ") + key); + return iter->second; + } + bool has(const char* key) const { + return meta.count(key) > 0; + } + // Optional-key accessors. The defaults are part of the documented contract, so a file that omits + // a key means the same thing to every reader. + string getStringOr(const char* key, const string& dflt) const { + auto iter = meta.find(key); + return iter == meta.end() ? dflt : iter->second; + } + int getIntOr(const char* key, int dflt) const { + return has(key) ? getInt(key) : dflt; + } + int64_t getInt64Or(const char* key, int64_t dflt) const { + return has(key) ? getInt64(key) : dflt; + } + bool getBoolOr(const char* key, bool dflt) const { + return has(key) ? getBool(key) : dflt; + } + double getDoubleOr(const char* key, double dflt) const { + return has(key) ? getDouble(key) : dflt; + } + double getPositiveDoubleOr(const char* key, double dflt) const { + return has(key) ? getPositiveDouble(key) : dflt; + } + int getInt(const char* key) const { + int value = 0; + if(!Global::tryStringToInt(getString(key), value)) + fail(string("metadata key ") + key + " is not an integer: " + getString(key)); + return value; + } + int64_t getInt64(const char* key) const { + int64_t value = 0; + if(!Global::tryStringToInt64(getString(key), value)) + fail(string("metadata key ") + key + " is not an integer: " + getString(key)); + return value; + } + bool getBool(const char* key) const { + bool value = false; + if(!Global::tryStringToBool(getString(key), value)) + fail(string("metadata key ") + key + " is not a boolean: " + getString(key)); + return value; + } + double getPositiveDouble(const char* key) const { + double value = 0.0; + if(!Global::tryStringToDouble(getString(key), value)) + fail(string("metadata key ") + key + " is not a number: " + getString(key)); + if(!(value > 0) || !isfinite(value)) + fail(string("metadata key ") + key + " must be a positive finite number, got: " + getString(key)); + return value; + } + double getDouble(const char* key) const { + double value = 0.0; + if(!Global::tryStringToDouble(getString(key), value)) + fail(string("metadata key ") + key + " is not a number: " + getString(key)); + if(!isfinite(value)) + fail(string("metadata key ") + key + " must be finite, got: " + getString(key)); + return value; + } +}; + +// One expected graph input or output: its name, its channel count, and whether it is board-shaped +// (H,W = nnYLen,nnXLen) or a per-row vector (H,W = 1,1). +struct ExpectedTensor { + string name; + int channels; + bool spatial; +}; + +// Check that one declared graph tensor has the float32 [batch,channels,H,W] shape the backends bind +// to it. A drifted IO signature otherwise fails deep inside the execution provider, or silently +// reads the wrong buffer. +void checkTensorMatches( + const MetaReader& reader, + const onnx::ValueInfoProto& vi, + const ExpectedTensor& expected, + int nnXLen, + int nnYLen, + const char* inOrOut +) { + string what = string(inOrOut) + " '" + expected.name + "'"; + if(!vi.type().has_tensor_type()) + reader.fail("graph " + what + " is not a tensor"); + const onnx::TypeProto::Tensor& t = vi.type().tensor_type(); + if(t.elem_type() != onnx::TensorProto::FLOAT) + reader.fail( + "graph " + what + " has element type " + Global::intToString((int)t.elem_type()) + + ", but KataGo binds float32 (1) buffers to it. Graphs converted to another IO precision " + "(e.g. float16) cannot be run by this backend."); + const onnx::TensorShapeProto& shape = t.shape(); + if(shape.dim_size() != 4) + reader.fail("graph " + what + " has rank " + Global::intToString(shape.dim_size()) + ", expected rank 4 (NCHW)"); + + // Dim 0 must stay symbolic: the backends run varying batch sizes through one session/engine. + if(shape.dim(0).has_dim_value()) + reader.fail( + "graph " + what + " has a fixed batch dimension of " + Global::int64ToString(shape.dim(0).dim_value()) + + ", but KataGo needs a dynamic (symbolic) batch dimension"); + + const int64_t expectedDims[3] = { + (int64_t)expected.channels, + (int64_t)(expected.spatial ? nnYLen : 1), + (int64_t)(expected.spatial ? nnXLen : 1), + }; + const char* dimNames[3] = {"channel", "height", "width"}; + for(int i = 0; i < 3; i++) { + const onnx::TensorShapeProto::Dimension& dim = shape.dim(i + 1); + if(!dim.has_dim_value()) + reader.fail( + "graph " + what + " has a symbolic " + dimNames[i] + + " dimension, but KataGo needs it fixed at " + Global::int64ToString(expectedDims[i])); + if(dim.dim_value() != expectedDims[i]) + reader.fail( + "graph " + what + " has " + dimNames[i] + " dimension " + Global::int64ToString(dim.dim_value()) + + ", but the model metadata says it should be " + Global::int64ToString(expectedDims[i])); + } +} + +// Check the graph declares exactly the expected inputs/outputs and nothing else. +void checkGraphIO( + const MetaReader& reader, + const onnx::GraphProto& graph, + const vector& expected, + bool isInput, + int nnXLen, + int nnYLen +) { + const char* inOrOut = isInput ? "input" : "output"; + // Initializers may also be declared as graph inputs (a legacy ONNX convention some tooling + // reintroduces); those are weights, not IO, so they don't count as extra inputs. + set initializerNames; + if(isInput) { + for(int i = 0; i < graph.initializer_size(); i++) + initializerNames.insert(graph.initializer(i).name()); + } + + map declared; + const int n = isInput ? graph.input_size() : graph.output_size(); + for(int i = 0; i < n; i++) { + const onnx::ValueInfoProto& vi = isInput ? graph.input(i) : graph.output(i); + if(initializerNames.count(vi.name()) > 0) + continue; + if(declared.count(vi.name()) > 0) + reader.fail(string("graph declares ") + inOrOut + " '" + vi.name() + "' more than once"); + declared[vi.name()] = &vi; + } + + for(const ExpectedTensor& e : expected) { + auto iter = declared.find(e.name); + if(iter == declared.end()) + reader.fail(string("graph has no ") + inOrOut + " named '" + e.name + "'"); + checkTensorMatches(reader, *iter->second, e, nnXLen, nnYLen, inOrOut); + declared.erase(iter); + } + if(!declared.empty()) { + string extras; + for(const auto& kv : declared) + extras += (extras.empty() ? "" : ", ") + kv.first; + reader.fail( + string("graph declares unexpected ") + inOrOut + "(s): " + extras + + ". KataGo binds a fixed set of tensors by name and cannot feed or read anything else."); + } +} + +} // namespace + +LoadResult load( + const string& fileName, + const string& expectedSha256, + ModelDesc& descBuf, + Logger* logger +) { + LoadResult result; + string sha256Buf; + { + string lower = Global::toLower(fileName); + if(Global::isSuffix(lower, ".gz")) + FileUtils::uncompressAndLoadFileIntoString(fileName, expectedSha256, result.serializedModel, &sha256Buf); + else + FileUtils::loadFileIntoString(fileName, expectedSha256, result.serializedModel, &sha256Buf); + } + + // Parsing doubles peak memory for the length of this function: the raw bytes have to be kept too, + // since they are what gets handed to TensorRT or ONNX Runtime. The parsed copy is then dropped. + onnx::ModelProto model; + if(!model.ParseFromString(result.serializedModel)) + throw StringError( + "Error loading ONNX model file " + fileName + + ": file could not be parsed as an ONNX ModelProto. Is it actually an ONNX file?"); + + map meta; + for(int i = 0; i < model.metadata_props_size(); i++) + meta[model.metadata_props(i).key()] = model.metadata_props(i).value(); + MetaReader reader{meta, fileName}; + + if(meta.count(META_VERSION) == 0) + throw StringError( + "Error loading ONNX model file " + fileName + + ": this is an ONNX model, but it carries no KataGo metadata, so KataGo cannot tell what its " + "inputs and outputs mean or how to decode them. An .onnx model KataGo can run must carry a " + "katago.* metadata block - 'katago dumponnx' writes one when converting a .bin.gz, and a " + "model from any other source needs one added."); + result.metadataVersion = reader.getInt(META_VERSION); + if(result.metadataVersion > KATAGO_METADATA_VERSION) + throw StringError(Global::strprintf( + "Error loading ONNX model file %s: its KataGo metadata is version %d, but this KataGo build " + "understands up to version %d. Use a newer KataGo, or write the file to version %d.", + fileName.c_str(), result.metadataVersion, KATAGO_METADATA_VERSION, KATAGO_METADATA_VERSION)); + if(result.metadataVersion < KATAGO_METADATA_VERSION_MIN_READ) + throw StringError(Global::strprintf( + "Error loading ONNX model file %s: its KataGo metadata is version %d, which this KataGo build " + "no longer reads (minimum %d). Re-dump the model from its .bin.gz.", + fileName.c_str(), result.metadataVersion, KATAGO_METADATA_VERSION_MIN_READ)); + + // Refuse keys in the must-understand namespace that this build has no code for. Reaching here + // means the version check passed, so the file claims to be readable while carrying instructions + // this build would be ignoring - most likely a writer that added a key without bumping the + // version, or a typo in a hand-written block. + { + vector unknownKeys; + for(const auto& keyAndValue: meta) { + const string& key = keyAndValue.first; + if(!Global::isPrefix(key, META_PREFIX) || Global::isPrefix(key, META_INFO_PREFIX)) + continue; + bool known = false; + for(const char* knownKey: KNOWN_META_KEYS) { + if(key == knownKey) { + known = true; + break; + } + } + if(!known) + unknownKeys.push_back(key); + } + if(unknownKeys.size() > 0) + throw StringError( + "Error loading ONNX model file " + fileName + ": its KataGo metadata has key(s) this build " + "does not know: " + Global::concat(unknownKeys, ", ") + + ". Keys under \"katago.\" have to be understood to run the model correctly. Re-dump the " + "model with this KataGo, use a newer KataGo, or drop the keys if they do not apply - purely " + "informational ones belong under \"katago.info.\" instead."); + } + + descBuf = ModelDesc(); + descBuf.name = reader.getString(META_NAME); + ModelDesc::checkNameValid(descBuf.name); + descBuf.sha256 = sha256Buf; + result.sourceSha256 = reader.getStringOr(META_SOURCE_SHA256, string()); + + descBuf.modelVersion = reader.getInt(META_MODEL_VERSION); + if(descBuf.modelVersion < NNModelVersion::oldestModelVersionImplemented) + throw StringError( + "Error loading ONNX model file " + fileName + + ": model version " + Global::intToString(descBuf.modelVersion) + " is no longer supported by the engine."); + if(descBuf.modelVersion > NNModelVersion::latestModelVersionImplemented) + throw StringError( + "Error loading ONNX model file " + fileName + ": model version " + Global::intToString(descBuf.modelVersion) + + " requires a newer KataGo version. Obtain a newer KataGo at https://github.com/lightvector/KataGo."); + + descBuf.numInputChannels = reader.getInt(META_NUM_INPUT_CHANNELS); + descBuf.numInputGlobalChannels = reader.getInt(META_NUM_INPUT_GLOBAL_CHANNELS); + descBuf.numInputMetaChannels = reader.getInt(META_NUM_INPUT_META_CHANNELS); + descBuf.numPolicyChannels = reader.getInt(META_NUM_POLICY_CHANNELS); + descBuf.numValueChannels = reader.getInt(META_NUM_VALUE_CHANNELS); + descBuf.numScoreValueChannels = reader.getInt(META_NUM_SCORE_VALUE_CHANNELS); + descBuf.numOwnershipChannels = reader.getInt(META_NUM_OWNERSHIP_CHANNELS); + // These entered the .bin.gz header at model version 15, and are gated here the same way: a model + // too old to have them cannot have meant anything but the defaults. The prefer* flags govern how + // the caller featurizes and adjudicates for this model, so a graph that needs one set has to say + // so rather than silently defaulting off. + if(descBuf.modelVersion >= 15) { + descBuf.metaEncoderVersion = reader.getInt(META_META_ENCODER_VERSION); + descBuf.preferPassAliveUnderSuicideRules = reader.getBool(META_PREFER_PASS_ALIVE); + descBuf.preferExcludeTerritoryAdjacentToAtari = reader.getBool(META_PREFER_EXCLUDE_TERRITORY_ADJ_ATARI); + } + else { + descBuf.metaEncoderVersion = reader.getIntOr(META_META_ENCODER_VERSION, 0); + descBuf.preferPassAliveUnderSuicideRules = reader.getBoolOr(META_PREFER_PASS_ALIVE, false); + descBuf.preferExcludeTerritoryAdjacentToAtari = reader.getBoolOr(META_PREFER_EXCLUDE_TERRITORY_ADJ_ATARI, false); + } + + // The input encoding and output decoding are fixed by the model version, so every channel count + // has exactly one legal value. Checking them here means a corrupted or hand-edited metadata block + // fails at load rather than producing plausible-looking but wrong evaluations. + auto checkChannels = [&](const char* what, int actual, int expected) { + if(actual != expected) + reader.fail(Global::strprintf( + "%s is %d, but model version %d requires %d", what, actual, descBuf.modelVersion, expected)); + }; + checkChannels("numInputChannels", descBuf.numInputChannels, NNModelVersion::getNumSpatialFeatures(descBuf.modelVersion)); + checkChannels("numInputGlobalChannels", descBuf.numInputGlobalChannels, NNModelVersion::getNumGlobalFeatures(descBuf.modelVersion)); + if(descBuf.metaEncoderVersion < 0 || descBuf.metaEncoderVersion > 1) + reader.fail("metaEncoderVersion is not implemented: " + Global::intToString(descBuf.metaEncoderVersion)); + if(descBuf.metaEncoderVersion > 0 && descBuf.modelVersion < 15) + reader.fail("metaEncoderVersion > 0 requires model version >= 15"); + checkChannels( + "numInputMetaChannels", descBuf.numInputMetaChannels, + NNModelVersion::getNumInputMetaChannels(descBuf.metaEncoderVersion)); + if(descBuf.metaEncoderVersion > 0 && descBuf.numInputMetaChannels != SGFMetadata::METADATA_INPUT_NUM_CHANNELS) + reader.fail(Global::strprintf( + "numInputMetaChannels (%d) != METADATA_INPUT_NUM_CHANNELS (%d)", + descBuf.numInputMetaChannels, SGFMetadata::METADATA_INPUT_NUM_CHANNELS)); + // Policy channels: 1 for old nets, 2 once the optimism channel exists, 4 from v16 on. + if(!(descBuf.numPolicyChannels == 1 || descBuf.numPolicyChannels == 2 || + (descBuf.numPolicyChannels == 4 && descBuf.modelVersion >= 16))) + reader.fail(Global::strprintf( + "numPolicyChannels (%d) is not supported for model version %d", + descBuf.numPolicyChannels, descBuf.modelVersion)); + checkChannels("numValueChannels", descBuf.numValueChannels, 3); + checkChannels("numOwnershipChannels", descBuf.numOwnershipChannels, 1); + { + int expectedScoreValueChannels = + descBuf.modelVersion >= 9 ? 6 : + descBuf.modelVersion >= 8 ? 4 : + descBuf.modelVersion >= 4 ? 2 : 1; + checkChannels("numScoreValueChannels", descBuf.numScoreValueChannels, expectedScoreValueChannels); + } + + // The score post-processing multipliers entered the .bin.gz header at model version 13; below that + // every model uses the built-in defaults, so the keys are optional exactly there. + { + const ModelPostProcessParams dflt; + ModelPostProcessParams& p = descBuf.postProcessParams; + if(descBuf.modelVersion >= 13) { + p.tdScoreMultiplier = reader.getPositiveDouble(META_TD_SCORE_MULT); + p.scoreMeanMultiplier = reader.getPositiveDouble(META_SCORE_MEAN_MULT); + p.scoreStdevMultiplier = reader.getPositiveDouble(META_SCORE_STDEV_MULT); + p.leadMultiplier = reader.getPositiveDouble(META_LEAD_MULT); + p.varianceTimeMultiplier = reader.getPositiveDouble(META_VARIANCE_TIME_MULT); + p.shorttermValueErrorMultiplier = reader.getPositiveDouble(META_SHORTTERM_VALUE_ERROR_MULT); + p.shorttermScoreErrorMultiplier = reader.getPositiveDouble(META_SHORTTERM_SCORE_ERROR_MULT); + } + else { + p.tdScoreMultiplier = reader.getPositiveDoubleOr(META_TD_SCORE_MULT, dflt.tdScoreMultiplier); + p.scoreMeanMultiplier = reader.getPositiveDoubleOr(META_SCORE_MEAN_MULT, dflt.scoreMeanMultiplier); + p.scoreStdevMultiplier = reader.getPositiveDoubleOr(META_SCORE_STDEV_MULT, dflt.scoreStdevMultiplier); + p.leadMultiplier = reader.getPositiveDoubleOr(META_LEAD_MULT, dflt.leadMultiplier); + p.varianceTimeMultiplier = reader.getPositiveDoubleOr(META_VARIANCE_TIME_MULT, dflt.varianceTimeMultiplier); + p.shorttermValueErrorMultiplier = + reader.getPositiveDoubleOr(META_SHORTTERM_VALUE_ERROR_MULT, dflt.shorttermValueErrorMultiplier); + p.shorttermScoreErrorMultiplier = + reader.getPositiveDoubleOr(META_SHORTTERM_SCORE_ERROR_MULT, dflt.shorttermScoreErrorMultiplier); + } + // Not a .bin.gz field: it exists only because a graph may have been emitted with its activations + // rescaled. A graph that was not rescaled says 1, which is also the default. + p.outputScaleMultiplier = (float)reader.getPositiveDoubleOr(META_OUTPUT_SCALE_MULT, dflt.outputScaleMultiplier); + } + + // Reporting only: log lines and the tolerances in the neural net tests. A graph has no layer + // structure to recompute these from, so absent means unknown, reported as zero. + descBuf.archSummary.present = true; + descBuf.archSummary.trunkSpatialConvDepth = reader.getDoubleOr(META_ARCH_TRUNK_DEPTH, 0.0); + descBuf.archSummary.numParameters = reader.getInt64Or(META_ARCH_NUM_PARAMS, 0); + descBuf.archSummary.hasAnyTransformerBlocks = reader.getBoolOr(META_ARCH_HAS_TRANSFORMER, false); + descBuf.archSummary.hasAnyNestedBottleneckBlocks = reader.getBoolOr(META_ARCH_HAS_NBT, false); + + result.buildParams.nnXLen = reader.getInt(META_NN_X_LEN); + result.buildParams.nnYLen = reader.getInt(META_NN_Y_LEN); + result.buildParams.requireExactNNLen = reader.getBool(META_REQUIRE_EXACT_NNLEN); + // Both describe how the graph was produced rather than how to run it: NHWC only buckets TensorRT's + // caches, and the scale8 compensation is already folded into outputScaleMultiplier above. + result.buildParams.transformerNHWC = reader.getBoolOr(META_TRANSFORMER_NHWC, false); + result.buildParams.scale8Applied = reader.getBoolOr(META_SCALE8_APPLIED, false); + if(result.buildParams.nnXLen < 2 || result.buildParams.nnXLen > NNPos::MAX_BOARD_LEN || + result.buildParams.nnYLen < 2 || result.buildParams.nnYLen > NNPos::MAX_BOARD_LEN) + reader.fail(Global::strprintf( + "graph board size %dx%d is outside the supported range 2 to %d", + result.buildParams.nnXLen, result.buildParams.nnYLen, NNPos::MAX_BOARD_LEN)); + + // Optional: which nodes TensorRT must keep in FP32, for reductions that would overflow. Absent or + // empty means none are needed, which the TensorRT backend warns about when running in FP16. + result.trunkTipAndHeadNodeNames = splitLines(reader.getStringOr(META_FP32_NODES_TRUNKTIP_HEAD, string())); + result.rmsNormNodeNames = splitLines(reader.getStringOr(META_FP32_NODES_RMSNORM, string())); + + // Now that the metadata is known to be self-consistent, check the graph agrees with it. + { + const int nnXLen = result.buildParams.nnXLen; + const int nnYLen = result.buildParams.nnYLen; + vector expectedInputs; + expectedInputs.push_back({INPUT_SPATIAL, descBuf.numInputChannels, true}); + expectedInputs.push_back({INPUT_GLOBAL, descBuf.numInputGlobalChannels, false}); + if(descBuf.metaEncoderVersion > 0) + expectedInputs.push_back({INPUT_META, descBuf.numInputMetaChannels, false}); + expectedInputs.push_back({INPUT_MASK, 1, true}); + checkGraphIO(reader, model.graph(), expectedInputs, true, nnXLen, nnYLen); + + vector expectedOutputs; + expectedOutputs.push_back({OUTPUT_POLICY_PASS, descBuf.numPolicyChannels, false}); + expectedOutputs.push_back({OUTPUT_POLICY, descBuf.numPolicyChannels, true}); + expectedOutputs.push_back({OUTPUT_VALUE, descBuf.numValueChannels, false}); + expectedOutputs.push_back({OUTPUT_SCORE_VALUE, descBuf.numScoreValueChannels, false}); + expectedOutputs.push_back({OUTPUT_OWNERSHIP, descBuf.numOwnershipChannels, true}); + checkGraphIO(reader, model.graph(), expectedOutputs, false, nnXLen, nnYLen); + } + + // Flag the input-declaration hazard described where build() declares its inputs: ONNX Runtime's + // OpenVINO execution provider mis-binds every graph input declared after one that no node + // consumes. Only that provider is affected, so the backends warn rather than refusing a graph + // that is fine everywhere else. + { + const onnx::GraphProto& graph = model.graph(); + set consumed; + for(int i = 0; i < graph.node_size(); i++) { + for(int j = 0; j < graph.node(i).input_size(); j++) + consumed.insert(graph.node(i).input(j)); + } + for(int i = 0; i + 1 < graph.input_size(); i++) { + if(consumed.count(graph.input(i).name()) == 0) + result.danglingInputNotDeclaredLast = true; + } + } + + if(logger != NULL) { + logger->write( + "Loaded ONNX model file " + fileName + ": model " + descBuf.name + + " (" + descBuf.getShortInfoString() + "), model version " + Global::intToString(descBuf.modelVersion)); + string sourceStr = result.sourceSha256.empty() ? string() : (", from model sha256 " + result.sourceSha256); + logger->write(Global::strprintf( + "ONNX graph was emitted for %dx%d, requireExactNNLen=%s, transformerNHWC=%s, scale8Applied=%s%s", + result.buildParams.nnXLen, + result.buildParams.nnYLen, + Global::boolToString(result.buildParams.requireExactNNLen).c_str(), + Global::boolToString(result.buildParams.transformerNHWC).c_str(), + Global::boolToString(result.buildParams.scale8Applied).c_str(), + sourceStr.c_str())); + } + + return result; +} + +void checkRuntimeParams( + const LoadResult& loadResult, + const string& modelFileName, + int nnXLen, + int nnYLen, + bool requireExactNNLen +) { + const BuildParams& params = loadResult.buildParams; + if(params.nnXLen != nnXLen || params.nnYLen != nnYLen) + throw StringError(Global::strprintf( + "ONNX model file %s was emitted for a %dx%d board buffer, but this run needs %dx%d. The board " + "size is baked into the graph, so re-dump the model with -nn-x-len %d -nn-y-len %d, or change " + "the config (maxBoardSizeForNNBuffer) to match the graph.", + modelFileName.c_str(), params.nnXLen, params.nnYLen, nnXLen, nnYLen, nnXLen, nnYLen)); + + // A graph emitted with requireExactNNLen skips all masking and is only correct when every + // position fills the whole buffer. The reverse (a masked graph run where every position happens to + // fill the buffer) is correct, just slightly slower, so it is allowed. + if(params.requireExactNNLen && !requireExactNNLen) + throw StringError( + "ONNX model file " + modelFileName + + " was emitted with requireExactNNLen (no board masking), so it can only evaluate positions that " + "fill the whole " + Global::intToString(params.nnXLen) + "x" + Global::intToString(params.nnYLen) + + " buffer, but this run allows smaller boards. Either set requireMaxBoardSize = true in the config, " + "or re-dump the model without -require-exact-nnlen."); +} + } // namespace OnnxModelBuilder diff --git a/cpp/neuralnet/onnxmodelbuilder.h b/cpp/neuralnet/onnxmodelbuilder.h index 10d3819150..1e8a0f43e9 100644 --- a/cpp/neuralnet/onnxmodelbuilder.h +++ b/cpp/neuralnet/onnxmodelbuilder.h @@ -9,7 +9,7 @@ // Emits an ONNX ModelProto (serialized to bytes) describing a KataGo model, given its ModelDesc // and the runtime board dimensions. The serialized bytes are intended to be handed to TensorRT's -// nvonnxparser, which builds the engine. +// nvonnxparser or to ONNX Runtime, which build the engine/session. // // The emitted graph reproduces the same tensor semantics as the hand-assembled ModelParser in // trtbackend.cpp: NCHW float32 tensors, inputs named InputMask / InputSpatial / InputGlobal / @@ -20,6 +20,27 @@ // Weights are baked into the ModelProto as initializers, so the serialized bytes are fully // self-contained. namespace OnnxModelBuilder { + + // Build settings that get baked into an emitted graph and cannot be changed afterwards. A graph is + // only valid for the board size and masking mode it was emitted with, so build() records these in + // the model's metadata and load() checks them again. + struct BuildParams { + int nnXLen; + int nnYLen; + // If true, the graph assumes every position fills the whole nnXLen x nnYLen buffer and skips all + // masking. Such a graph produces wrong results for smaller boards. + bool requireExactNNLen; + // Run the trunk block stack channel-last. Only meaningful for models with transformer blocks; + // build() normalizes it to false for any other model, including in the recorded metadata. + bool transformerNHWC; + // Whether ModelDesc::applyScale8ToReduceActivations() was applied to the weights before emitting. + // The compensation for it lives in postProcessParams.outputScaleMultiplier, which is recorded + // already transformed, so this is only reported, never re-applied. + bool scale8Applied; + + BuildParams(); + }; + struct Result { std::string serializedModel; // the serialized ONNX ModelProto @@ -32,13 +53,73 @@ namespace OnnxModelBuilder { }; // Build a serialized ONNX ModelProto for the given model. + // Inputs are always declared in the order InputSpatial, InputGlobal, InputMeta (when the + // model has a metadata encoder), InputMask. ONNX Runtime's OpenVINO execution provider + // requires this exact order and misroutes tensors at runtime otherwise. See the input + // declarations in onnxmodelbuilder.cpp for the full rationale. Result build( const ModelDesc& desc, + const BuildParams& buildParams, + Logger* logger + ); + + // ---- Reading a .onnx model file ---- + + // A KataGo model read from a .onnx file rather than from a .bin.gz. The graph carries the weights + // but none of KataGo's scalar model parameters, such as the model version, the channel counts and + // the score post-processing multipliers; those travel in the ModelProto's metadata_props under + // "katago." keys, which build() writes and load() reads. Files without that block are rejected, + // since nothing else can supply the parameters. + // + // docs/ONNX_Model_Files.md documents the block and the graph IO contract for third parties: a + // conforming .onnx from any source loads, not only dumponnx output. + struct LoadResult { + std::string serializedModel; // raw bytes as read from the file, to be handed to TRT / ORT as-is + BuildParams buildParams; // the settings the graph was emitted with + int metadataVersion; + std::string sourceSha256; // sha256 of the .bin.gz this was emitted from, empty if unrecorded + + // FP32-pinning node name lists, same meaning as in Result. Recorded in the metadata because the + // TensorRT backend needs them for models it did not emit itself in this process. + std::vector trunkTipAndHeadNodeNames; + std::vector rmsNormNodeNames; + + // True if the graph declares an input that no node consumes anywhere but last. ONNX Runtime's + // OpenVINO execution provider mis-binds every input after such a one; see build()'s input + // declarations. + bool danglingInputNotDeclaredLast; + + LoadResult(); + }; + + // True if fileName names a raw ONNX model file (.onnx or .onnx.gz) rather than a KataGo .bin.gz. + bool isOnnxFileName(const std::string& fileName); + + // Read a .onnx (or .onnx.gz) file, validate it, and fill descBuf with the model parameters + // recorded in its metadata. Verifies the sha256 of the file contents against expectedSha256 if + // that is nonempty, and sets descBuf.sha256 to the file's own sha256. + // Throws StringError with an explanatory message if the file is not parseable as ONNX, carries no + // KataGo metadata block, states a metadata version this build cannot read, or has a graph whose + // input/output signature disagrees with the metadata. + // + // descBuf is filled with scalar parameters only: trunk/policyHead/valueHead stay empty and + // descBuf.archSummary carries the recorded architecture summary in their place. + LoadResult load( + const std::string& fileName, + const std::string& expectedSha256, + ModelDesc& descBuf, + Logger* logger + ); + + // Check that a graph loaded by load() can be run at the board size and masking mode the backend is + // about to use, throwing StringError explaining the mismatch if not. Both are baked into the graph + // when it is built, so a mismatch cannot be fixed at runtime. + void checkRuntimeParams( + const LoadResult& loadResult, + const std::string& modelFileName, int nnXLen, int nnYLen, - bool requireExactNNLen, - bool transformerNHWC, - Logger* logger + bool requireExactNNLen ); } diff --git a/cpp/neuralnet/openclbackend.cpp b/cpp/neuralnet/openclbackend.cpp index 17fe078eb8..3ae11034fe 100644 --- a/cpp/neuralnet/openclbackend.cpp +++ b/cpp/neuralnet/openclbackend.cpp @@ -3831,6 +3831,11 @@ void NeuralNet::printDevices() { } } +std::string NeuralNet::getRuntimeBackendDetail(ConfigParser& cfg) { + (void)cfg; + return std::string(); +} + //-------------------------------------------------------------- struct InputBuffers { diff --git a/cpp/neuralnet/rocmbackend.cpp b/cpp/neuralnet/rocmbackend.cpp new file mode 100644 index 0000000000..e66403cb5d --- /dev/null +++ b/cpp/neuralnet/rocmbackend.cpp @@ -0,0 +1,51 @@ +#ifdef USE_ROCM_BACKEND + +#include "../neuralnet/rocmerrorcheck.h" +#include "../neuralnet/rocmincludes.h" + +// Optional Composable Kernel FMHA fused attention support, see cpp/external/composable_kernel_fmha +// and KATAGO_ROCM_HAS_CK_FMHA in CMakeLists.txt. Mirrors the CUDA backend's optional cudnn-frontend +// SDPA path, but CK's fmha_fwd() has no expensive one-time "build plan" step to cache - each call +// directly checks traits/shape compatibility and either executes or returns a negative "unsupported" +// sentinel, so unlike the CUDA backend there is no need to tolerate plan-build failures only +// during warmup. +// ck_tile's FMHA kernels were never ported to GCN/Vega (gfx90x) or RDNA1 (gfx101x) - no +// MFMA/WMMA on those architectures. In the ck_tile version this glue targets (TheRock 7.13), +// arch.hpp's get_compiler_target() has no branch for them, so merely including its headers while +// compiling a device pass for one of these archs (as happens in a multi-arch fat binary that +// targets them) hard-fails with "member reference base type 'void' is not a structure or union", +// since get_compiler_target() falls through without a return. (Other ck_tile versions fail +// differently, but none support these archs.) Skip CK entirely for just these archs' +// device-compile passes, where the plain (non-fused) attention kernel still covers them. This +// list must stay in sync with the exclusion list in CMakeLists.txt's CK section. +#if defined(__gfx900__) || defined(__gfx902__) || defined(__gfx906__) || defined(__gfx909__) || defined(__gfx90c__) \ + || defined(__gfx1010__) || defined(__gfx1011__) || defined(__gfx1012__) || defined(__gfx1013__) + #define KATAGO_ROCM_CK_FMHA_ARCH_OK 0 +#else + #define KATAGO_ROCM_CK_FMHA_ARCH_OK 1 +#endif + +#if KATAGO_ROCM_HAS_CK_FMHA && KATAGO_ROCM_CK_FMHA_ARCH_OK + #include + #include + #include "fmha_fwd.hpp" +#endif + +#include "../neuralnet/rocmhelpers.h" +#include "../neuralnet/rocmutils.h" +#include "../neuralnet/rocmcudanames.h" + +// Backend selector for the shared implementation file included below. See the comment at the +// top of that file for the full contract. +#define KATAGO_GPU_HIP 1 + +// Short backend name used in error messages and debug-output labels that are otherwise +// identical between the CUDA and ROCm backends. +#define KATAGO_GPU_BACKEND_NAME "ROCm" + +// Element type that hipblasHgemm expects buffers to be cast to. +using cublas_half_t = hipblasHalf; + +#include "../neuralnet/cudaandrocmbackend.inc" + +#endif // USE_ROCM_BACKEND diff --git a/cpp/neuralnet/rocmcudanames.h b/cpp/neuralnet/rocmcudanames.h new file mode 100644 index 0000000000..2695e2f433 --- /dev/null +++ b/cpp/neuralnet/rocmcudanames.h @@ -0,0 +1,79 @@ +// Maps the CUDA spellings used by the shared backend implementation file +// (cudaandrocmbackend.inc) to their HIP/hipBLAS/MIOpen equivalents, so that the code shared +// with the CUDA backend can be written once, with CUDA spellings, and compiled unchanged by hip +// clang. Only the names that the SHARED regions of that file actually use are mapped here. Code +// inside its KATAGO_GPU_HIP regions uses native HIP/MIOpen spellings directly, and cuDNN/cuBLAS +// API with no direct MIOpen/hipBLAS equivalent (convolution setup, algo search, ...) exists only +// inside KATAGO_GPU_CUDA regions and is deliberately absent here. +// +// Functions are static inline forwarders rather than #defines so that types are checked and +// nothing leaks into other headers. hipMalloc also has a templated overload that would make +// function-pointer aliases ambiguous. Adding a new CUDA API call to shared code means adding +// its mapping here - the HIP build error is the reminder. + +#ifndef NEURALNET_ROCMCUDANAMES_H_ +#define NEURALNET_ROCMCUDANAMES_H_ + +#include "../neuralnet/rocmincludes.h" + +// Types +using cudaDeviceProp = hipDeviceProp_t; +using cublasHandle_t = hipblasHandle_t; +using cudnnHandle_t = miopenHandle_t; +using cudnnStatus_t = miopenStatus_t; +using cudnnTensorDescriptor_t = miopenTensorDescriptor_t; + +// Enum constants +constexpr auto cudaSuccess = hipSuccess; +constexpr auto cudaMemcpyHostToDevice = hipMemcpyHostToDevice; +constexpr auto cudaMemcpyDeviceToHost = hipMemcpyDeviceToHost; +constexpr auto CUBLAS_OP_N = HIPBLAS_OP_N; + +// Runtime API +//void** only (not a template): the real cudaMalloc is looser (it has a T** overload), but +//keeping the shim strict means a shared call site that compiles here also compiles on CUDA. +static inline hipError_t cudaMalloc(void** ptr, size_t size) { return hipMalloc(ptr, size); } +static inline hipError_t cudaFree(void* ptr) { return hipFree(ptr); } +static inline hipError_t cudaMemcpy(void* dst, const void* src, size_t size, hipMemcpyKind kind) { + return hipMemcpy(dst, src, size, kind); +} +static inline hipError_t cudaDeviceSynchronize() { return hipDeviceSynchronize(); } +static inline hipError_t cudaDeviceReset() { return hipDeviceReset(); } +static inline hipError_t cudaGetDeviceCount(int* count) { return hipGetDeviceCount(count); } +static inline hipError_t cudaGetDeviceProperties(hipDeviceProp_t* prop, int device) { + return hipGetDeviceProperties(prop, device); +} +static inline hipError_t cudaPeekAtLastError() { return hipPeekAtLastError(); } + +// hipBLAS +static inline hipblasStatus_t cublasCreate(hipblasHandle_t* handle) { return hipblasCreate(handle); } +static inline hipblasStatus_t cublasDestroy(hipblasHandle_t handle) { return hipblasDestroy(handle); } +static inline hipblasStatus_t cublasSgemm( + hipblasHandle_t handle, hipblasOperation_t transa, hipblasOperation_t transb, + int m, int n, int k, + const float* alpha, const float* A, int lda, const float* B, int ldb, + const float* beta, float* C, int ldc +) { + return hipblasSgemm(handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc); +} +static inline hipblasStatus_t cublasHgemm( + hipblasHandle_t handle, hipblasOperation_t transa, hipblasOperation_t transb, + int m, int n, int k, + const hipblasHalf* alpha, const hipblasHalf* A, int lda, const hipblasHalf* B, int ldb, + const hipblasHalf* beta, hipblasHalf* C, int ldc +) { + return hipblasHgemm(handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc); +} + +// MIOpen, tensor descriptor lifetime only. Descriptor SETUP has no cuDNN-compatible signature +// and lives in the KATAGO_GPU_HIP regions of cudaandrocmbackend.inc. +static inline miopenStatus_t cudnnCreate(miopenHandle_t* handle) { return miopenCreate(handle); } +static inline miopenStatus_t cudnnDestroy(miopenHandle_t handle) { return miopenDestroy(handle); } +static inline miopenStatus_t cudnnCreateTensorDescriptor(miopenTensorDescriptor_t* desc) { + return miopenCreateTensorDescriptor(desc); +} +static inline miopenStatus_t cudnnDestroyTensorDescriptor(miopenTensorDescriptor_t desc) { + return miopenDestroyTensorDescriptor(desc); +} + +#endif // NEURALNET_ROCMCUDANAMES_H_ diff --git a/cpp/neuralnet/rocmerrorcheck.h b/cpp/neuralnet/rocmerrorcheck.h new file mode 100644 index 0000000000..96e051280c --- /dev/null +++ b/cpp/neuralnet/rocmerrorcheck.h @@ -0,0 +1,59 @@ +#ifndef NEURALNET_ROCMERRORCHECK_H_ +#define NEURALNET_ROCMERRORCHECK_H_ + +#include "../neuralnet/rocmincludes.h" +#include "../core/global.h" + +// ---------- HIP runtime ---------- +static inline void checkCudaError(hipError_t status, + const char* opName, + const char* file, + const char* func, + int line) { + if(status != hipSuccess) + throw StringError(std::string("HIP Error @") + opName + " " + + file + ":" + func + ":" + Global::intToString(line) + + " : " + hipGetErrorString(status)); +} +#define CUDA_ERR(opName,x) { checkCudaError((x),opName,__FILE__,#x,__LINE__); } + +// ---------- hipBLAS ---------- +static inline const char* cublasGetErrorString(hipblasStatus_t s) { + switch(s) { + case HIPBLAS_STATUS_SUCCESS: return "HIPBLAS_STATUS_SUCCESS"; + case HIPBLAS_STATUS_ALLOC_FAILED: return "HIPBLAS_STATUS_ALLOC_FAILED"; + case HIPBLAS_STATUS_MAPPING_ERROR: return "HIPBLAS_STATUS_MAPPING_ERROR"; + case HIPBLAS_STATUS_EXECUTION_FAILED: return "HIPBLAS_STATUS_EXECUTION_FAILED"; + case HIPBLAS_STATUS_INTERNAL_ERROR: return "HIPBLAS_STATUS_INTERNAL_ERROR"; + case HIPBLAS_STATUS_INVALID_VALUE: return "HIPBLAS_STATUS_INVALID_VALUE"; + case HIPBLAS_STATUS_NOT_INITIALIZED: return "HIPBLAS_STATUS_NOT_INITIALIZED"; + case HIPBLAS_STATUS_NOT_SUPPORTED: return "HIPBLAS_STATUS_NOT_SUPPORTED"; + default: return "HIPBLAS_STATUS_UNKNOWN"; + } +} +static inline void checkCublasError(hipblasStatus_t status, + const char* opName, + const char* file, + const char* func, + int line) { + if(status != HIPBLAS_STATUS_SUCCESS) + throw StringError(std::string("hipBLAS Error @") + opName + " " + + file + ":" + func + ":" + Global::intToString(line) + + " : " + cublasGetErrorString(status)); +} +#define CUBLAS_ERR(opName,x) { checkCublasError((x),opName,__FILE__,#x,__LINE__); } + +// ---------- MIOpen ---------- +static inline void checkCudnnError(miopenStatus_t status, + const char* opName, + const char* file, + const char* func, + int line) { + if(status != miopenStatusSuccess) + throw StringError(std::string("MIOpen Error @") + opName + " " + + file + ":" + func + ":" + Global::intToString(line) + + " : " + miopenGetErrorString(status)); +} +#define CUDNN_ERR(opName,x) { checkCudnnError((x),opName,__FILE__,#x,__LINE__); } + +#endif // NEURALNET_ROCMERRORCHECK_H_ diff --git a/cpp/neuralnet/rocmhelpers.h b/cpp/neuralnet/rocmhelpers.h new file mode 100644 index 0000000000..3b5bd4f061 --- /dev/null +++ b/cpp/neuralnet/rocmhelpers.h @@ -0,0 +1,9 @@ +#ifndef NEURALNET_ROCMHELPERS_H_ +#define NEURALNET_ROCMHELPERS_H_ + +#include "../neuralnet/rocmincludes.h" +#include "../neuralnet/activations.h" + +#include "../neuralnet/cudaandrocmhelpers.h" + +#endif // NEURALNET_ROCMHELPERS_H_ diff --git a/cpp/neuralnet/rocmhelpers.hip b/cpp/neuralnet/rocmhelpers.hip new file mode 100644 index 0000000000..24966b6009 --- /dev/null +++ b/cpp/neuralnet/rocmhelpers.hip @@ -0,0 +1,19 @@ +// ROCm/HIP wrapper for the shared CUDA/ROCm GPU kernels. +// All kernel code lives in cudaandrocmhelpers.inc, which is shared with the CUDA backend +// (cudahelpers.cu). See the comment at the top of that file for the macro contract. + +#include "../neuralnet/rocmhelpers.h" + +// HIP_SUPPORTS_FP16 is defined (or not) by the build system (see CMakeLists.txt) uniformly for +// all target archs at once - unlike CUDA there is no per-arch preprocessor gating here. Every +// arch KataGo's default arch list targets supports packed FP16. If this is absent, the half +// kernels compile to empty stubs, and the backend detects that via customCudaFp16KernelsCompiled() +// and refuses FP16 at runtime rather than silently computing garbage. +#ifdef HIP_SUPPORTS_FP16 +#define KATAGO_GPU_SUPPORTS_FP16 +#endif + +#define KATAGO_GPU_HIP 1 +#define KATAGO_GPU_SINCOSF sincosf + +#include "../neuralnet/cudaandrocmhelpers.inc" diff --git a/cpp/neuralnet/rocmincludes.h b/cpp/neuralnet/rocmincludes.h new file mode 100644 index 0000000000..dc7a0e6adb --- /dev/null +++ b/cpp/neuralnet/rocmincludes.h @@ -0,0 +1,24 @@ +#ifndef NEURALNET_ROCMINCLUDES_H +#define NEURALNET_ROCMINCLUDES_H + +//Note: unlike the CUDA backend (which defines CUDA_API_PER_THREAD_DEFAULT_STREAM here), the ROCm +//backend currently runs all work on the shared legacy null stream. HIP's analog would be defining +//HIP_API_PER_THREAD_DEFAULT_STREAM (or compiling with -fgpu-default-stream=per-thread), but +//flipping it also changes which stream MIOpen/hipBLAS calls run on relative to our own kernels +//and memcpys, so it needs a careful audit of stream synchronization before enabling. Correctness +//is unaffected either way. Multiple server threads sharing one GPU just serialize their GPU work. + +#include +#include + +// hipBLAS 2.x (ROCm 6.x) declared hipblasGemmEx's type arguments as the now-removed +// hipblasDatatype_t. Defining HIPBLAS_V2 first selects the modern spelling (hipDataType plus +// hipblasComputeType_t) that hipBLAS 3.0+ uses unconditionally, so one call site compiles +// against both. hipBLAS 3.x defines this +// macro itself and nothing in it is conditional on the macro, so predefining it is a no-op there. +#define HIPBLAS_V2 +#include +#include + + +#endif //NEURALNET_ROCMINCLUDES_H diff --git a/cpp/neuralnet/rocmutils.cpp b/cpp/neuralnet/rocmutils.cpp new file mode 100644 index 0000000000..568417b1f8 --- /dev/null +++ b/cpp/neuralnet/rocmutils.cpp @@ -0,0 +1,11 @@ +// ROCm/HIP wrapper for the GPU utility functions shared with the CUDA backend (cudautils.cpp). +// Everything lives in cudaandrocmutils.inc. See the comment at the top of that file. + +#include "../neuralnet/rocmutils.h" + +#include "../neuralnet/rocmerrorcheck.h" +#include "../neuralnet/rocmincludes.h" +#include "../neuralnet/rocmhelpers.h" +#include "../neuralnet/rocmcudanames.h" + +#include "../neuralnet/cudaandrocmutils.inc" diff --git a/cpp/neuralnet/rocmutils.h b/cpp/neuralnet/rocmutils.h new file mode 100644 index 0000000000..d34e61fe88 --- /dev/null +++ b/cpp/neuralnet/rocmutils.h @@ -0,0 +1,27 @@ +#ifndef NEURALNET_ROCMUTILS_H +#define NEURALNET_ROCMUTILS_H + +#include "../core/global.h" + +namespace CudaUtils { + void mallocOnDevice(const std::string& name, int numWeights, void*& deviceBuf, bool useFP16); + void mallocAndCopyToDevice(const std::string& name, const std::vector& weights, void*& deviceBuf, bool useFP16); + void mallocAndCopyToDevice(const std::string& name, const float* weights, int numWeights, void*& deviceBuf, bool useFP16); + + //Only use in testing, allocates an intermediate buffer in the case of FP16 which will be very slow. + void expensiveCopyFromDevice(const std::string& name, float* weights, int numWeights, const void* deviceBuf, bool useFP16); + + // Debug print a 3D spatial tensor [N,C,S] or [N,S,C] on the GPU. + // Prints summary stats (always) and verbose dump (if DEBUG_INTERMEDIATE_VALUES_VERBOSE). + // maskBuf is device-side mask [N,S] (can be half or float depending on useFP16), nullable. + void debugPrint3D(const std::string& name, const void* deviceBuf, + int batchSize, int cSize, int spatialSize, bool useNHWC, bool useFP16, + const void* maskBuf = nullptr); + // Debug print a 2D tensor [N,C] on the GPU. + void debugPrint2D(const std::string& name, const void* deviceBuf, int batchSize, int cSize, bool useFP16); + + void checkBufferSize(int batchSize, int xSize, int ySize, int channels); + void hostMallocZeroOneBufs(void*& zeroBuf, void*& oneBuf, bool useFP16); +} + +#endif // NEURALNET_ROCMUTILS_H diff --git a/cpp/neuralnet/trtbackend.cpp b/cpp/neuralnet/trtbackend.cpp index 886499c814..10ce451ea2 100644 --- a/cpp/neuralnet/trtbackend.cpp +++ b/cpp/neuralnet/trtbackend.cpp @@ -79,6 +79,41 @@ void NeuralNet::globalCleanup() { // Empty for TensorRT backend } +struct LoadedModel { + ModelDesc modelDesc; + string modelFileName; + + // True if the model came from a .onnx file rather than a .bin.gz. The network is then parsed from + // that graph verbatim instead of being emitted from weights. + bool isExternalOnnx; + OnnxModelBuilder::LoadResult externalOnnx; + // Whether the 1/8 activation rescaling is in effect, either because we applied it here or because + // the graph was emitted with it. Only used for reporting. + bool scale8Applied; + + LoadedModel(const string& fileName, const string& expectedSha256) + : modelFileName(fileName), isExternalOnnx(false) + { + if(OnnxModelBuilder::isOnnxFileName(fileName)) { + isExternalOnnx = true; + // loadModelFile has no logger; createComputeHandle logs the graph's build settings instead. + externalOnnx = OnnxModelBuilder::load(fileName, expectedSha256, modelDesc, NULL); + // A loaded graph's weights are already whatever they are, and the postProcessParams read out + // of the same file already match them. Re-applying the transform would rescale + // outputScaleMultiplier alone, decoding every output 8x too large. + scale8Applied = externalOnnx.buildParams.scale8Applied; + } + else { + ModelDesc::loadFromFileMaybeGZipped(fileName, modelDesc, expectedSha256); + scale8Applied = modelDesc.applyScale8ToReduceActivations(); + } + } + + LoadedModel() = delete; + LoadedModel(const LoadedModel&) = delete; + LoadedModel& operator=(const LoadedModel&) = delete; +}; + struct ComputeContext { int nnXLen; int nnYLen; @@ -99,7 +134,6 @@ ComputeContext* NeuralNet::createComputeContext( const LoadedModel* loadedModel, ConfigParser& cfg) { (void)gpuIdxs; - (void)logger; ComputeContext* context = new ComputeContext(); context->nnXLen = nnXLen; @@ -118,6 +152,17 @@ ComputeContext* NeuralNet::createComputeContext( context->transformerNHWC = (cfg.contains("trtTransformerNHWC") ? cfg.getBool("trtTransformerNHWC") : true) && NeuralNet::getModelDesc(loadedModel).hasAnyTransformerBlocks(); + // For a graph loaded from a .onnx file the layout is already baked in, so take the value from the + // file. The plan and timing cache keys are derived from it and would otherwise be wrong. + if(loadedModel->isExternalOnnx) { + bool bakedNHWC = loadedModel->externalOnnx.buildParams.transformerNHWC; + if(logger != NULL && cfg.contains("trtTransformerNHWC") && context->transformerNHWC != bakedNHWC) + logger->write( + "TensorRT backend: WARNING - trtTransformerNHWC = " + Global::boolToString(context->transformerNHWC) + + " has no effect on a model loaded from a .onnx file; the trunk layout is baked into the graph " + "(transformerNHWC=" + Global::boolToString(bakedNHWC) + ")."); + context->transformerNHWC = bakedNHWC; + } // Debugging: if set, the ONNX-emitter path dumps the emitted ONNX model and the built engine's // per-layer info (precision/format/tactic, via a detailed-profiling build + IEngineInspector) into // this directory. Files are disambiguated by board size, FP16/FP32, and exact/max NN-length so the @@ -131,19 +176,6 @@ void NeuralNet::freeComputeContext(ComputeContext* computeContext) { delete computeContext; } -struct LoadedModel { - ModelDesc modelDesc; - - LoadedModel(const string& fileName, const string& expectedSha256) { - ModelDesc::loadFromFileMaybeGZipped(fileName, modelDesc, expectedSha256); - modelDesc.applyScale8ToReduceActivations(); - } - - LoadedModel() = delete; - LoadedModel(const LoadedModel&) = delete; - LoadedModel& operator=(const LoadedModel&) = delete; -}; - LoadedModel* NeuralNet::loadModelFile(const string& file, const string& expectedSha256) { LoadedModel* loadedModel = new LoadedModel(file, expectedSha256); return loadedModel; @@ -1242,15 +1274,39 @@ struct ComputeHandle { unique_ptr model; // These must outlive buildSerializedNetwork below: nvonnxparser::parse() does not necessarily // deep-copy initializer weights, so the parsed INetworkDefinition may reference data inside - // onnxBytes (and the parser object) until the engine is actually built. Keeping them at this - // scope avoids a use-after-free that manifests as all-NaN engine outputs. - string onnxBytes; + // the ONNX bytes (and the parser object) until the engine is actually built. Keeping them at + // this scope avoids a use-after-free that manifests as all-NaN engine outputs. (For a model + // loaded from a .onnx file the bytes live in the LoadedModel, which outlives this entirely.) + string emittedOnnxBytes; + const string* onnxBytesPtr = NULL; unique_ptr onnxParser; if(useOnnxEmit) { - logger->write("TensorRT backend: building network via ONNX emitter"); const ModelDesc& desc = loadedModel->modelDesc; - OnnxModelBuilder::Result onnxResult = OnnxModelBuilder::build(desc, ctx->nnXLen, ctx->nnYLen, requireExactNNLen, ctx->transformerNHWC, logger); - onnxBytes = std::move(onnxResult.serializedModel); + vector trunkTipAndHeadNodeNames; + vector rmsNormNodeNames; + if(loadedModel->isExternalOnnx) { + OnnxModelBuilder::checkRuntimeParams( + loadedModel->externalOnnx, loadedModel->modelFileName, ctx->nnXLen, ctx->nnYLen, requireExactNNLen); + logger->write("TensorRT backend: building network from the ONNX graph in " + loadedModel->modelFileName); + onnxBytesPtr = &loadedModel->externalOnnx.serializedModel; + trunkTipAndHeadNodeNames = loadedModel->externalOnnx.trunkTipAndHeadNodeNames; + rmsNormNodeNames = loadedModel->externalOnnx.rmsNormNodeNames; + } + else { + logger->write("TensorRT backend: building network via ONNX emitter"); + OnnxModelBuilder::BuildParams buildParams; + buildParams.nnXLen = ctx->nnXLen; + buildParams.nnYLen = ctx->nnYLen; + buildParams.requireExactNNLen = requireExactNNLen; + buildParams.transformerNHWC = ctx->transformerNHWC; + buildParams.scale8Applied = loadedModel->scale8Applied; + OnnxModelBuilder::Result onnxResult = OnnxModelBuilder::build(desc, buildParams, logger); + emittedOnnxBytes = std::move(onnxResult.serializedModel); + onnxBytesPtr = &emittedOnnxBytes; + trunkTipAndHeadNodeNames = std::move(onnxResult.trunkTipAndHeadNodeNames); + rmsNormNodeNames = std::move(onnxResult.rmsNormNodeNames); + } + const string& onnxBytes = *onnxBytesPtr; if(dumpDebugPlan) { string onnxPath = dumpDebugBasePath + ".onnx"; @@ -1287,8 +1343,8 @@ struct ComputeHandle { // on TensorRT declining to fuse a numerically-equivalent FP16 path back in. This matches the // FP32-forcing the hand-built ModelParser path already does for its heads/gpool. std::set fp32Names; - fp32Names.insert(onnxResult.trunkTipAndHeadNodeNames.begin(), onnxResult.trunkTipAndHeadNodeNames.end()); - fp32Names.insert(onnxResult.rmsNormNodeNames.begin(), onnxResult.rmsNormNodeNames.end()); + fp32Names.insert(trunkTipAndHeadNodeNames.begin(), trunkTipAndHeadNodeNames.end()); + fp32Names.insert(rmsNormNodeNames.begin(), rmsNormNodeNames.end()); int pinned = 0; for(int i = 0; i < network->getNbLayers(); i++) { ILayer* layer = network->getLayer(i); @@ -1302,6 +1358,25 @@ struct ComputeHandle { } forceObeyPrecision = true; logger->write(Global::strprintf("TensorRT backend: pinned %d layers to FP32 (rmsnorm + heads)", pinned)); + // Matching nothing means the network's layer names bear no relation to the list, which for a + // loaded .onnx means the graph was rewritten after the list was written. Under FP16 that + // silently drops the protection against overflow in the RMSNorm sum-of-squares and yields + // plausible-looking but wrong evaluations, so refuse rather than run. + if(usingFP16 && pinned == 0 && !fp32Names.empty()) + throw StringError( + "TensorRT backend: none of the " + Global::uint64ToString(fp32Names.size()) + + " layers that must run in FP32 could be matched in the network built from " + + loadedModel->modelFileName + + (loadedModel->isExternalOnnx + ? ". The graph's node names disagree with its own metadata, so it was probably rewritten " + "after the metadata was written. Re-dump the model, or run with useFP16 = false." + : ". This is a bug; running with useFP16 = false avoids it.")); + if(usingFP16 && fp32Names.empty()) + logger->write( + "TensorRT backend: WARNING - " + loadedModel->modelFileName + + " declares no layers to keep in FP32 (katago.fp32Nodes.* metadata), and this engine is " + "FP16. Reductions such as RMSNorm sums-of-squares can overflow in FP16 at larger board " + "sizes. Use useFP16 = false if results look wrong."); // Set optimization profile dims for each input the parser created. auto setProfile = [&](const char* name, Dims4 minDims, Dims4 optMaxDims) { @@ -1336,6 +1411,12 @@ struct ComputeHandle { SHA2::get256(tuneDesc.c_str(), model->tuneHash); } else { + if(loadedModel->isExternalOnnx) + throw StringError( + "TensorRT backend: trtDisableOnnx = true cannot be used with the .onnx model file " + + loadedModel->modelFileName + + ". That option builds the network from a .bin.gz model's weights instead of from an ONNX " + "graph; load the .bin.gz model, or drop trtDisableOnnx."); auto modelParser = make_unique(); model = modelParser->build( move(network), profile, loadedModel, ctx->nnXLen, ctx->nnYLen, maxBatchSize, requireExactNNLen); @@ -1398,12 +1479,17 @@ struct ComputeHandle { ctx->useOnnx ? "onnx" : "prsr", (ctx->useOnnx && ctx->transformerNHWC) ? "nh" : ""); const char* lenStr = requireExactNNLen ? "ex" : "mx"; + // A .onnx model file shares its net name with the .bin.gz it was dumped from, so fold the file + // hash into the filename so the two don't overwrite each other's cached plans. + string netName = loadedModel->modelDesc.name; + if(loadedModel->isExternalOnnx) + netName += "-onnxfile-" + loadedModel->modelDesc.sha256.substr(0, 8); auto planCacheFile = Global::strprintf( "%s/trt-%d_gpu-%s_net-%s_s%d_%s_%s%dx%d_b%d_fp%d", cacheDir.c_str(), getInferLibVersion(), deviceIdent, - loadedModel->modelDesc.name.c_str(), + netName.c_str(), ModelParser::tuneSalt, buildModeStr.c_str(), lenStr, @@ -1787,6 +1873,11 @@ void NeuralNet::printDevices() { } } +std::string NeuralNet::getRuntimeBackendDetail(ConfigParser& cfg) { + (void)cfg; + return std::string(); +} + struct InputBuffers { int maxBatchSize; diff --git a/cpp/program/gtpconfig.cpp b/cpp/program/gtpconfig.cpp index 3fa8651e5b..e74e05230d 100644 --- a/cpp/program/gtpconfig.cpp +++ b/cpp/program/gtpconfig.cpp @@ -537,6 +537,12 @@ string GTPConfig::makeConfig( #endif #ifdef USE_OPENCL_BACKEND replacement += "openclDeviceToUseThread" + Global::intToString(i) + " = " + Global::intToString(deviceIdxs[i]) + "\n"; +#endif +#ifdef USE_ONNX_BACKEND + replacement += "onnxDeviceToUseThread" + Global::intToString(i) + " = " + Global::intToString(deviceIdxs[i]) + "\n"; +#endif +#ifdef USE_ROCM_BACKEND + replacement += "rocmDeviceToUseThread" + Global::intToString(i) + " = " + Global::intToString(deviceIdxs[i]) + "\n"; #endif } replace("$$MULTIPLE_GPUS", replacement); diff --git a/cpp/program/play.cpp b/cpp/program/play.cpp index 98b2af8802..839f5cdcf3 100644 --- a/cpp/program/play.cpp +++ b/cpp/program/play.cpp @@ -389,11 +389,11 @@ void GameInitializer::createGame( const PlaySettings& playSettings, OtherGameProperties& otherGameProps, const Sgf::PositionSample* startPosSample, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& gameHistoryModes ) { //Multiple threads will be calling this, and we have some mutable state such as rand. lock_guard lock(createGameMutex); - createGameSharedUnsynchronized(board,pla,hist,extraBlackAndKomi,initialPosition,playSettings,otherGameProps,startPosSample,alwaysComputePassAliveUnderSuicideRules); + createGameSharedUnsynchronized(board,pla,hist,extraBlackAndKomi,initialPosition,playSettings,otherGameProps,startPosSample,gameHistoryModes); if(noResultStdev != 0.0 || drawRandRadius != 0.0) throw StringError("GameInitializer::createGame called in a mode that doesn't support specifying noResultStdev or drawRandRadius"); } @@ -406,11 +406,11 @@ void GameInitializer::createGame( const PlaySettings& playSettings, OtherGameProperties& otherGameProps, const Sgf::PositionSample* startPosSample, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& gameHistoryModes ) { //Multiple threads will be calling this, and we have some mutable state such as rand. lock_guard lock(createGameMutex); - createGameSharedUnsynchronized(board,pla,hist,extraBlackAndKomi,initialPosition,playSettings,otherGameProps,startPosSample,alwaysComputePassAliveUnderSuicideRules); + createGameSharedUnsynchronized(board,pla,hist,extraBlackAndKomi,initialPosition,playSettings,otherGameProps,startPosSample,gameHistoryModes); if(noResultStdev > 1e-30) { double mean = params.noResultUtilityForWhite; @@ -488,16 +488,16 @@ void GameInitializer::createGameSharedUnsynchronized( const PlaySettings& playSettings, OtherGameProperties& otherGameProps, const Sgf::PositionSample* startPosSample, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& gameHistoryModes ) { - //The game-level pass-alive computation mode, so that any adjudication during start position - //replay below is consistent with the game that will be played. (hist.clear() preserves this.) - hist.setAlwaysComputePassAliveUnderSuicideRules(alwaysComputePassAliveUnderSuicideRules); + //The game-level BoardHistoryModes, so that any adjudication during start position + //replay below is consistent with the game that will be played. (hist.clear() preserves these.) + hist.setModes(gameHistoryModes); if(initialPosition != NULL) { board = initialPosition->board; hist = initialPosition->hist; - hist.setAlwaysComputePassAliveUnderSuicideRules(alwaysComputePassAliveUnderSuicideRules); + hist.setModes(gameHistoryModes); pla = initialPosition->pla; //No handicap when starting from an initial position. @@ -894,6 +894,8 @@ static NNRawStats computeNNRawStats(const Search* bot, const Board& board, const //Featurize the way this bot's own searches would, even if the passed history differs. nnInputParams.passAliveSuicideRulesOverride = Search::resolveAlwaysComputePassAliveUnderSuicideRules(bot->searchParams, bot->nnEvaluator) ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = + Search::resolveExcludeTerritoryAdjacentToAtari(bot->searchParams, bot->nnEvaluator) ? 1 : 0; bot->nnEvaluator->evaluate(board,hist,pla,nnInputParams,buf,false,false); NNOutput& nnOutput = *(buf.result); @@ -1548,14 +1550,18 @@ FinishedGameData* Play::runGame( Board board(startBoard); BoardHistory hist(startHist); - //Game-level pass-alive computation mode, used for whole-game adjudication (endGameIfAllPassAlive, - //final scoring) and training data targets: use the suicide-rules-based computation only if BOTH - //bots' searches will be using it. Each bot's Search still stamps its own resolved setting onto its + //Game-level BoardHistoryModes, used for whole-game adjudication (endGameIfAllPassAlive, + //final scoring) and training data targets: use each new-behavior mode only if BOTH + //bots' searches will be using it. Each bot's Search still stamps its own resolved settings onto its //internal copy of the history, which may differ from this when the two bots' settings differ. - hist.setAlwaysComputePassAliveUnderSuicideRules( - Search::resolveAlwaysComputePassAliveUnderSuicideRules(botSpecB.baseParams, botSpecB.nnEval) && - Search::resolveAlwaysComputePassAliveUnderSuicideRules(botSpecW.baseParams, botSpecW.nnEval) - ); + { + const BoardHistoryModes modesB = Search::resolveHistoryModes(botSpecB.baseParams, botSpecB.nnEval); + const BoardHistoryModes modesW = Search::resolveHistoryModes(botSpecW.baseParams, botSpecW.nnEval); + hist.setModes(BoardHistoryModes( + modesB.alwaysComputePassAliveUnderSuicideRules && modesW.alwaysComputePassAliveUnderSuicideRules, + modesB.excludeTerritoryAdjacentToAtari && modesW.excludeTerritoryAdjacentToAtari + )); + } Player pla = startPla; testAssert(!(extraBlackAndKomi.makeGameFair && extraBlackAndKomi.makeGameFairForEmptyBoard)); testAssert(!(playSettings.forSelfPlay && !clearBotBeforeSearch)); @@ -1565,8 +1571,8 @@ FinishedGameData* Play::runGame( Player makeFairPla = P_BLACK; if(playSettings.flipKomiProbWhenNoCompensate != 0.0 && gameRand.nextBool(playSettings.flipKomiProbWhenNoCompensate)) makeFairPla = P_WHITE; - //Use the game-level pass-alive computation mode for the komi-fairing evals too. - BoardHistory h(b,makeFairPla,startHist.rules,startHist.encorePhase,hist.alwaysComputePassAliveUnderSuicideRules); + //Use the game-level BoardHistoryModes for the komi-fairing evals too. + BoardHistory h(b,makeFairPla,startHist.rules,startHist.encorePhase,hist.modes); //Restore baseline on empty hist, adjust empty hist to fair, then apply to real history. PlayUtils::setKomiWithoutNoise(extraBlackAndKomi,h); PlayUtils::adjustKomiToEven(botB,botW,b,h,makeFairPla,playSettings.compensateKomiVisits,otherGameProps,gameRand); @@ -2004,7 +2010,7 @@ FinishedGameData* Play::runGame( Color* independentLifeArea = new Color[Board::MAX_ARR_SIZE]; int whiteMinusBlackIndependentLifeRegionCount; - board.calculateIndependentLifeArea(independentLifeArea,whiteMinusBlackIndependentLifeRegionCount, false, false, hist.suicideLegalForPassAlive()); + board.calculateIndependentLifeArea(independentLifeArea,whiteMinusBlackIndependentLifeRegionCount, false, false, hist.modes.excludeTerritoryAdjacentToAtari, hist.suicideLegalForPassAlive()); for(int i = 0; ifinalFullArea[i] == C_BLACK || gameData->finalFullArea[i] == C_WHITE)) gameData->finalSekiAreas[i] = true; @@ -2236,6 +2242,8 @@ FinishedGameData* Play::runGame( //Featurize the way this bot's own searches would, even if the game-level history differs. nnInputParams.passAliveSuicideRulesOverride = Search::resolveAlwaysComputePassAliveUnderSuicideRules(toMoveBot2->searchParams, toMoveBot2->nnEvaluator) ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = + Search::resolveExcludeTerritoryAdjacentToAtari(toMoveBot2->searchParams, toMoveBot2->nnEvaluator) ? 1 : 0; toMoveBot2->nnEvaluator->evaluate( sp2->board,sp2->hist,sp2->pla,nnInputParams, nnResultBuf,false,false @@ -2357,9 +2365,9 @@ static void replayGameUpToMove(const FinishedGameData* finishedGameData, int mov board = finishedGameData->startHist.initialBoard; pla = finishedGameData->startHist.initialPla; - //Replay under the same pass-alive computation mode that the game was actually played and - //adjudicated with (clear() below preserves this). - hist.setAlwaysComputePassAliveUnderSuicideRules(finishedGameData->endHist.alwaysComputePassAliveUnderSuicideRules); + //Replay under the same BoardHistoryModes that the game was actually played and + //adjudicated with (clear() below preserves these). + hist.setModes(finishedGameData->endHist.modes); if(rules.scoringRule == Rules::SCORING_AREA) hist.clear(board,pla,rules,0); @@ -2487,6 +2495,8 @@ void Play::maybeForkGame( //Featurize the way this bot's own searches would, even if the replayed game-level history differs. nnInputParams.passAliveSuicideRulesOverride = Search::resolveAlwaysComputePassAliveUnderSuicideRules(bot->searchParams, bot->nnEvaluator) ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = + Search::resolveExcludeTerritoryAdjacentToAtari(bot->searchParams, bot->nnEvaluator) ? 1 : 0; bot->nnEvaluator->evaluate(copy,copyHist,getOpp(pla),nnInputParams,buf,false,false); std::shared_ptr nnOutput = std::move(buf.result); double whiteScore = nnOutput->whiteScoreMean; @@ -2663,20 +2673,23 @@ FinishedGameData* GameRunner::runGame( BoardHistory hist; ExtraBlackAndKomi extraBlackAndKomi; OtherGameProperties otherGameProps; - //Game-level pass-alive computation mode for this game, matching the value Play::runGame will - //stamp onto the game history it plays out: on only if BOTH bots' searches will be using it. - const bool gamePassAliveSuicideMode = - Search::resolveAlwaysComputePassAliveUnderSuicideRules(botSpecB.baseParams, botSpecB.nnEval) && - Search::resolveAlwaysComputePassAliveUnderSuicideRules(botSpecW.baseParams, botSpecW.nnEval); + //Game-level BoardHistoryModes for this game, matching the values Play::runGame will + //stamp onto the game history it plays out: each on only if BOTH bots' searches will be using it. + const BoardHistoryModes modesB = Search::resolveHistoryModes(botSpecB.baseParams, botSpecB.nnEval); + const BoardHistoryModes modesW = Search::resolveHistoryModes(botSpecW.baseParams, botSpecW.nnEval); + const BoardHistoryModes gameHistoryModes = BoardHistoryModes( + modesB.alwaysComputePassAliveUnderSuicideRules && modesW.alwaysComputePassAliveUnderSuicideRules, + modesB.excludeTerritoryAdjacentToAtari && modesW.excludeTerritoryAdjacentToAtari + ); if(playSettings.forSelfPlay) { testAssert(botSpecB.botIdx == botSpecW.botIdx); SearchParams params = botSpecB.baseParams; - gameInit->createGame(board,pla,hist,extraBlackAndKomi,params,initialPosition,playSettings,otherGameProps,startPosSample,gamePassAliveSuicideMode); + gameInit->createGame(board,pla,hist,extraBlackAndKomi,params,initialPosition,playSettings,otherGameProps,startPosSample,gameHistoryModes); botSpecB.baseParams = params; botSpecW.baseParams = params; } else { - gameInit->createGame(board,pla,hist,extraBlackAndKomi,initialPosition,playSettings,otherGameProps,startPosSample,gamePassAliveSuicideMode); + gameInit->createGame(board,pla,hist,extraBlackAndKomi,initialPosition,playSettings,otherGameProps,startPosSample,gameHistoryModes); bool rulesWereSupported; if(botSpecB.nnEval != NULL) { diff --git a/cpp/program/play.h b/cpp/program/play.h index f33d9f4ba2..b25a728804 100644 --- a/cpp/program/play.h +++ b/cpp/program/play.h @@ -95,7 +95,7 @@ class GameInitializer { const PlaySettings& playSettings, OtherGameProperties& otherGameProps, const Sgf::PositionSample* startPosSample, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& gameHistoryModes ); //A version that doesn't randomize params @@ -106,7 +106,7 @@ class GameInitializer { const PlaySettings& playSettings, OtherGameProperties& otherGameProps, const Sgf::PositionSample* startPosSample, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& gameHistoryModes ); Rules randomizeScoringAndTaxRules(Rules rules, Rand& randToUse) const; @@ -130,7 +130,7 @@ class GameInitializer { const PlaySettings& playSettings, OtherGameProperties& otherGameProps, const Sgf::PositionSample* startPosSample, - bool alwaysComputePassAliveUnderSuicideRules + const BoardHistoryModes& gameHistoryModes ); Rules createRulesUnsynchronized(); diff --git a/cpp/program/playutils.cpp b/cpp/program/playutils.cpp index a3db385941..2140da3fbc 100644 --- a/cpp/program/playutils.cpp +++ b/cpp/program/playutils.cpp @@ -185,9 +185,11 @@ Loc PlayUtils::getGameInitializationMove( MiscNNInputParams nnInputParams; nnInputParams.drawEquivalentWinsForWhite = searcher->searchParams.drawEquivalentWinsForWhite; //Featurize for this bot's net the way that bot's own searches would, even if the game-level history - //carries a different pass-alive computation mode. + //carries different BoardHistoryModes. nnInputParams.passAliveSuicideRulesOverride = Search::resolveAlwaysComputePassAliveUnderSuicideRules(searcher->searchParams, nnEval) ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = + Search::resolveExcludeTerritoryAdjacentToAtari(searcher->searchParams, nnEval) ? 1 : 0; nnEval->evaluate(board,hist,pla,nnInputParams,buf,false,false); std::shared_ptr nnOutput = std::move(buf.result); @@ -282,11 +284,13 @@ void PlayUtils::playExtraBlack( if(!hist.isGameFinished) { NNResultBuf buf; bool botPassAliveMode = Search::resolveAlwaysComputePassAliveUnderSuicideRules(bot->searchParams, bot->nnEvaluator); + bool botExcludeTerritoryAdjAtari = Search::resolveExcludeTerritoryAdjacentToAtari(bot->searchParams, bot->nnEvaluator); for(int i = 0; isearchParams.drawEquivalentWinsForWhite; //Featurize the way this bot's own searches would, even if the passed history differs. nnInputParams.passAliveSuicideRulesOverride = botPassAliveMode ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = botExcludeTerritoryAdjAtari ? 1 : 0; bot->nnEvaluator->evaluate(board,hist,pla,nnInputParams,buf,false,false); std::shared_ptr nnOutput = std::move(buf.result); @@ -964,7 +968,7 @@ PlayUtils::BenchmarkResults PlayUtils::benchmarkSearchOnPositionsAndPrint( Board board; Player nextPla; BoardHistory hist; - sgf.setupInitialBoardAndHist(initialRules, board, nextPla, hist, Search::resolveAlwaysComputePassAliveUnderSuicideRules(params, nnEval)); + sgf.setupInitialBoardAndHist(initialRules, board, nextPla, hist, Search::resolveHistoryModes(params, nnEval)); int moveNum = 0; diff --git a/cpp/program/setup.cpp b/cpp/program/setup.cpp index bf7950315e..98e400d1f2 100644 --- a/cpp/program/setup.cpp +++ b/cpp/program/setup.cpp @@ -20,7 +20,9 @@ std::vector Setup::getBackendPrefixes() { prefixes.push_back("trt"); prefixes.push_back("metal"); prefixes.push_back("opencl"); + prefixes.push_back("rocm"); prefixes.push_back("eigen"); + prefixes.push_back("onnx"); prefixes.push_back("dummybackend"); return prefixes; } @@ -87,12 +89,27 @@ vector Setup::initializeNNEvaluators( string backendPrefix = "metal"; #elif defined(USE_OPENCL_BACKEND) string backendPrefix = "opencl"; + #elif defined(USE_ROCM_BACKEND) + string backendPrefix = "rocm"; #elif defined(USE_EIGEN_BACKEND) string backendPrefix = "eigen"; + #elif defined(USE_ONNX_BACKEND) + string backendPrefix = "onnx"; #else string backendPrefix = "dummybackend"; #endif + #if defined(USE_ONNX_BACKEND) + // Distributed selfplay (contribute) uploads training data, which must never contain + // FP16-overflow NaN rows, so always apply the scale8 workaround regardless of onnxSkipScale8. + if(setupFor == SETUP_FOR_DISTRIBUTED && cfg.contains("onnxSkipScale8") && cfg.getBool("onnxSkipScale8")) { + cfg.overrideKey("onnxSkipScale8", "false"); + logger.write( + "WARNING: onnxSkipScale8 = true is not allowed for contribute (distributed selfplay); " + "forcing it to false so FP16-overflow NaNs cannot poison contributed training data."); + } + #endif + //Automatically flag keys that are for other backends as used so that we don't warn about unused keys //for those options for(const string& prefix: getBackendPrefixes()) { @@ -142,7 +159,10 @@ vector Setup::initializeNNEvaluators( requireExactNNLen = cfg.getBool("requireMaxBoardSize"); } - bool inputsUseNHWC = backendPrefix == "opencl" || backendPrefix == "trt" || backendPrefix == "metal" ? false : true; + //ROCm defaults to NHWC inputs like CUDA: its compute layout is NHWC in the default FP16 path + //(transformers always, convnets on the archs where NHWC is faster), and unlike cuDNN, MIOpen + //cannot consume mismatched input/compute layouts for free - it costs a device transpose. + bool inputsUseNHWC = backendPrefix == "opencl" || backendPrefix == "trt" || backendPrefix == "metal" || backendPrefix == "onnx" ? false : true; if(cfg.contains(backendPrefix+"InputsUseNHWC"+idxStr)) inputsUseNHWC = cfg.getBool(backendPrefix+"InputsUseNHWC"+idxStr); else if(cfg.contains("inputsUseNHWC"+idxStr)) @@ -651,6 +671,9 @@ vector Setup::loadParams( if(cfg.contains("alwaysComputePassAliveUnderSuicideRules"+idxStr)) params.alwaysComputePassAliveUnderSuicideRules = cfg.getEnabled("alwaysComputePassAliveUnderSuicideRules"+idxStr); else if(cfg.contains("alwaysComputePassAliveUnderSuicideRules")) params.alwaysComputePassAliveUnderSuicideRules = cfg.getEnabled("alwaysComputePassAliveUnderSuicideRules"); else params.alwaysComputePassAliveUnderSuicideRules = enabled_t::Auto; + if(cfg.contains("excludeTerritoryAdjacentToAtari"+idxStr)) params.excludeTerritoryAdjacentToAtari = cfg.getEnabled("excludeTerritoryAdjacentToAtari"+idxStr); + else if(cfg.contains("excludeTerritoryAdjacentToAtari")) params.excludeTerritoryAdjacentToAtari = cfg.getEnabled("excludeTerritoryAdjacentToAtari"); + else params.excludeTerritoryAdjacentToAtari = enabled_t::Auto; //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); diff --git a/cpp/runcmdtests.sh b/cpp/runcmdtests.sh index 0c23ab144f..06fb5abac7 100755 --- a/cpp/runcmdtests.sh +++ b/cpp/runcmdtests.sh @@ -9,6 +9,13 @@ do ./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, rootSymmetryPruning=false, nnRandSeed=forTesting, searchRandSeed=forTesting, forDeterministicTesting=true, cudaUseFP16 = false, trtUseFP16 = false, openclUseFP16 = false, cudaUseNHWC = false" < $CMDFILE 1> tests/results/gtp/$BASENAME.stdout 2> tests/results/gtp/$BASENAME.stderr done +# Territory scoring only reaches a real game end (rather than a search-estimated score) when the +# cleanup phases are allowed, so this one needs preventCleanupPhase=false and cannot be a plain +# tests/gtp/ file sharing the config above. Scores a seki whose ko mouth at F6 is a point for black +# only under rules version 2, so flipping excludeTerritoryAdjacentToAtari moves the score by one. +echo tests/results/gtp/excludeterritoryscore +echo -e 'boardsize 7\nkata-set-rules {"ko":"SIMPLE","scoring":"TERRITORY","tax":"NONE","suicide":false,"hasButton":false,"friendlyPassOk":false,"whiteHandicapBonus":"0"}\nkomi 0\nset_position w d7 b e7 b f7 b g7 w a6 w b6 w c6 w d6 b e6 b g6 b a5 b b5 b c5 b d5 w e5 b f5 b g5 w a4 b c4 w d4 w e4 w f4 w g4 w a3 w b3 b c3 w d3 b e3 w g3 w a2 b b2 b c2 w d2 b f2 w g2 w a1 b c1 w d1 w e1 b f1 b g1\nplay b pass\nplay w pass\nplay b pass\nplay w pass\nplay b pass\nplay w pass\nfinal_score\nprintsgf -\nkata-set-param excludeTerritoryAdjacentToAtari true\nfinal_score\nprintsgf -\nkata-set-param excludeTerritoryAdjacentToAtari false\nfinal_score' | ./katago gtp -config configs/gtp_example.cfg -model tests/models/g170-b6c96-s175395328-d26788732.bin.gz -override-config "logFile=tests/results/gtp/excludeterritoryscore.log, logDir=, logTimeStamp=false, maxVisits=100, maxPlayouts=10000, numSearchThreads=1, nnRandomize=false, rootSymmetryPruning=false, nnRandSeed=forTesting, searchRandSeed=forTesting, forDeterministicTesting=true, preventCleanupPhase=false, cudaUseFP16 = false, trtUseFP16 = false, openclUseFP16 = false, cudaUseNHWC = false" 1> tests/results/gtp/excludeterritoryscore.stdout 2> tests/results/gtp/excludeterritoryscore.stderr + echo tests/results/gtp/defaultkomitt echo 'genmove_debug b' | ./katago gtp -config configs/gtp_example.cfg -model tests/models/g170-b6c96-s175395328-d26788732.bin.gz -override-config "logFile=tests/results/gtp/defaultkomitt.log, logDir=, logTimeStamp=false, maxVisits=100, maxPlayouts=10000, numSearchThreads=1, nnRandomize=false, rootSymmetryPruning=false, nnRandSeed=forTesting, searchRandSeed=forTesting, forDeterministicTesting=true, cudaUseFP16 = false, trtUseFP16 = false, openclUseFP16 = false, cudaUseNHWC = false, rules=, scoringRule=AREA,koRule=POSITIONAL,multiStoneSuicideLegal=false,taxRule=NONE,hasButton=false" 1> tests/results/gtp/defaultkomitt.stdout 2> tests/results/gtp/defaultkomitt.stderr echo tests/results/gtp/defaultkomiterr diff --git a/cpp/search/patternbonustable.cpp b/cpp/search/patternbonustable.cpp index 57ab67c853..2930db6162 100644 --- a/cpp/search/patternbonustable.cpp +++ b/cpp/search/patternbonustable.cpp @@ -118,8 +118,8 @@ void PatternBonusTable::addBonusForGameMoves(const BoardHistory& game, double bo void PatternBonusTable::addBonusForGameMoves(const BoardHistory& game, double bonus, Player onlyPla) { std::set hashesThisGame; Board board = game.initialBoard; - //Replay under the same pass-alive computation mode as the history we're replaying. - BoardHistory hist(board, game.initialPla, game.rules, game.initialEncorePhase, game.alwaysComputePassAliveUnderSuicideRules); + //Replay under the same BoardHistoryModes as the history we're replaying. + BoardHistory hist(board, game.initialPla, game.rules, game.initialEncorePhase, game.modes); for(size_t i = 0; imutexPool->getNumMutexes()); rootHistory.clear(rootBoard,rootPla,Rules(),0); - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); rootKoHashTable->recompute(rootHistory); } @@ -181,12 +181,27 @@ bool Search::resolveAlwaysComputePassAliveUnderSuicideRules(const SearchParams& return nnEval != NULL && nnEval->modelPreferPassAliveUnderSuicideRules(); } -void Search::applyPassAliveModeToRootHistory() { - bool b = resolveAlwaysComputePassAliveUnderSuicideRules(searchParams, nnEvaluator); - if(rootHistory.alwaysComputePassAliveUnderSuicideRules != b) { - //Changing the mode changes graph hashes and in-tree adjudication, so no search state can be kept. +bool Search::resolveExcludeTerritoryAdjacentToAtari(const SearchParams& params, const NNEvaluator* nnEval) { + if(params.excludeTerritoryAdjacentToAtari == enabled_t::True) + return true; + if(params.excludeTerritoryAdjacentToAtari == enabled_t::False) + return false; + return nnEval != NULL && nnEval->modelPreferExcludeTerritoryAdjacentToAtari(); +} + +BoardHistoryModes Search::resolveHistoryModes(const SearchParams& params, const NNEvaluator* nnEval) { + return BoardHistoryModes( + resolveAlwaysComputePassAliveUnderSuicideRules(params, nnEval), + resolveExcludeTerritoryAdjacentToAtari(params, nnEval) + ); +} + +void Search::applyHistoryModesToRootHistory() { + BoardHistoryModes m = resolveHistoryModes(searchParams, nnEvaluator); + if(rootHistory.modes != m) { + //Changing the modes changes graph hashes and in-tree adjudication, so no search state can be kept. clearSearch(); - rootHistory.setAlwaysComputePassAliveUnderSuicideRules(b); + rootHistory.setModes(m); } } @@ -196,7 +211,7 @@ void Search::setPosition(Player pla, const Board& board, const BoardHistory& his plaThatSearchIsFor = C_EMPTY; rootBoard = board; rootHistory = history; - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); rootKoHashTable->recompute(rootHistory); avoidMoveUntilByLocBlack.clear(); avoidMoveUntilByLocWhite.clear(); @@ -212,7 +227,7 @@ void Search::setPlayerAndClearHistory(Player pla) { bool assumeMultipleStartingBlackMovesAreHandicap = rootHistory.assumeMultipleStartingBlackMovesAreHandicap; rootHistory.clear(rootBoard,rootPla,rules,rootHistory.encorePhase); rootHistory.setAssumeMultipleStartingBlackMovesAreHandicap(assumeMultipleStartingBlackMovesAreHandicap); - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); rootKoHashTable->recompute(rootHistory); @@ -233,7 +248,7 @@ void Search::setKomiIfNew(float newKomi) { clearSearch(); rootHistory.setKomi(newKomi); } - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); } void Search::setAvoidMoveUntilByLoc(const std::vector& bVec, const std::vector& wVec) { @@ -273,14 +288,14 @@ void Search::setRootSymmetryPruningOnly(const std::vector& v) { void Search::setParams(const SearchParams& params) { clearSearch(); searchParams = params; - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); } void Search::setParamsNoClearing(const SearchParams& params) { searchParams = params; //Deliberately overrides the "no clearing" if the resolved pass-alive mode actually changes, //since in that case no search state is valid to keep. - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); } void Search::setExternalPatternBonusTable(std::unique_ptr&& table) { @@ -316,7 +331,7 @@ void Search::setNNEval(NNEvaluator* nnEval) { if(humanEvaluator->getNNXLen() != nnXLen || humanEvaluator->getNNYLen() != nnYLen) throw StringError("Search::setNNEval - humanEval has different nnXLen or nnYLen"); } - applyPassAliveModeToRootHistory(); + applyHistoryModesToRootHistory(); } void Search::clearSearch() { @@ -654,10 +669,7 @@ void Search::beginSearch(bool pondering) { //Invariant: every setter that installs or rebuilds rootHistory or changes params/nnEvaluator //re-stamps this flag, so it should always be consistent by the time a search begins. - testAssert( - rootHistory.alwaysComputePassAliveUnderSuicideRules == - resolveAlwaysComputePassAliveUnderSuicideRules(searchParams, nnEvaluator) - ); + testAssert(rootHistory.modes == resolveHistoryModes(searchParams, nnEvaluator)); rootBoard.checkConsistency(); diff --git a/cpp/search/search.h b/cpp/search/search.h index b822a942f9..91024aaed6 100644 --- a/cpp/search/search.h +++ b/cpp/search/search.h @@ -237,6 +237,10 @@ struct Search { //Resolve a false/auto/true alwaysComputePassAliveUnderSuicideRules setting against what a neural net //declares that it expects. Auto resolves to the net's declaration (false if nnEval is NULL). static bool resolveAlwaysComputePassAliveUnderSuicideRules(const SearchParams& params, const NNEvaluator* nnEval); + //Same, for the excludeTerritoryAdjacentToAtari setting. + static bool resolveExcludeTerritoryAdjacentToAtari(const SearchParams& params, const NNEvaluator* nnEval); + //Resolve all the BoardHistoryModes settings at once. + static BoardHistoryModes resolveHistoryModes(const SearchParams& params, const NNEvaluator* nnEval); void setExternalPatternBonusTable(std::unique_ptr&& table); void setCopyOfExternalPatternBonusTable(const std::unique_ptr& table); void setExternalEvalCache(const std::shared_ptr& cache); @@ -670,13 +674,13 @@ struct Search { // Initialization and core search logic // search.cpp //---------------------------------------------------------------------------------------- - //Enforce the invariant that rootHistory's alwaysComputePassAliveUnderSuicideRules always matches - //what searchParams and nnEvaluator resolve to, regardless of any history set into this Search. - //Clears search if this changes the flag, since all graph hashes and in-tree adjudication change. + //Enforce the invariant that rootHistory's modes always match what searchParams and nnEvaluator + //resolve to, regardless of any history set into this Search. + //Clears search if this changes the modes, since all graph hashes and in-tree adjudication change. //Called by every setter that installs or rebuilds rootHistory or changes params or nnEvaluator. - void applyPassAliveModeToRootHistory(); - //Copy of nnInputParams for querying humanEvaluator, overriding the pass-alive featurization mode - //with the human net's own resolution, which may differ from the mode the search is using. + void applyHistoryModesToRootHistory(); + //Copy of nnInputParams for querying humanEvaluator, overriding the featurization modes + //with the human net's own resolution, which may differ from the modes the search is using. MiscNNInputParams paramsForHumanEvaluator(const MiscNNInputParams& nnInputParams) const; void computeRootValues(); // Helper for begin search void recursivelyRecomputeStats(SearchNode& node); // Helper for search initialization diff --git a/cpp/search/searchnnhelpers.cpp b/cpp/search/searchnnhelpers.cpp index 1d7660385e..2965d7b911 100644 --- a/cpp/search/searchnnhelpers.cpp +++ b/cpp/search/searchnnhelpers.cpp @@ -36,10 +36,12 @@ void Search::computeRootNNEvaluation(NNResultBuf& nnResultBuf, bool includeOwner MiscNNInputParams Search::paramsForHumanEvaluator(const MiscNNInputParams& nnInputParams) const { MiscNNInputParams humanNNInputParams = nnInputParams; - //Featurize for the human net per its own resolution (its own declaration when the param is auto), - //which may differ from the mode the search itself is using. + //Featurize for the human net per its own resolution (its own declaration when the params are auto), + //which may differ from the modes the search itself is using. humanNNInputParams.passAliveSuicideRulesOverride = resolveAlwaysComputePassAliveUnderSuicideRules(searchParams, humanEvaluator) ? 1 : 0; + humanNNInputParams.excludeTerritoryAdjAtariOverride = + resolveExcludeTerritoryAdjacentToAtari(searchParams, humanEvaluator) ? 1 : 0; return humanNNInputParams; } diff --git a/cpp/search/searchparams.cpp b/cpp/search/searchparams.cpp index 8f02bdc7d3..39d65eebe6 100644 --- a/cpp/search/searchparams.cpp +++ b/cpp/search/searchparams.cpp @@ -72,6 +72,7 @@ SearchParams::SearchParams() enablePassingHacks(false), enableMorePassingHacks(false), alwaysComputePassAliveUnderSuicideRules(enabled_t::Auto), + excludeTerritoryAdjacentToAtari(enabled_t::Auto), playoutDoublingAdvantage(0.0), playoutDoublingAdvantagePla(C_EMPTY), avoidRepeatedPatternUtility(0.0), @@ -201,6 +202,7 @@ bool SearchParams::operator==(const SearchParams& other) const { enablePassingHacks == other.enablePassingHacks && enableMorePassingHacks == other.enableMorePassingHacks && alwaysComputePassAliveUnderSuicideRules == other.alwaysComputePassAliveUnderSuicideRules && + excludeTerritoryAdjacentToAtari == other.excludeTerritoryAdjacentToAtari && playoutDoublingAdvantage == other.playoutDoublingAdvantage && playoutDoublingAdvantagePla == other.playoutDoublingAdvantagePla && @@ -457,6 +459,7 @@ json SearchParams::changeableParametersToJson() const { ret["enablePassingHacks"] = enablePassingHacks; ret["enableMorePassingHacks"] = enableMorePassingHacks; ret["alwaysComputePassAliveUnderSuicideRules"] = alwaysComputePassAliveUnderSuicideRules.toString(); + ret["excludeTerritoryAdjacentToAtari"] = excludeTerritoryAdjacentToAtari.toString(); // Special handling in GTP ret["playoutDoublingAdvantage"] = playoutDoublingAdvantage; @@ -641,6 +644,7 @@ void SearchParams::printParams(std::ostream& out) const { PRINTPARAM(enablePassingHacks); PRINTPARAM(enableMorePassingHacks); out << "alwaysComputePassAliveUnderSuicideRules: " << alwaysComputePassAliveUnderSuicideRules.toString() << std::endl; + out << "excludeTerritoryAdjacentToAtari: " << excludeTerritoryAdjacentToAtari.toString() << std::endl; PRINTPARAM(playoutDoublingAdvantage); std::cout << "playoutDoublingAdvantagePla" << ": " << (int)playoutDoublingAdvantagePla << std::endl; diff --git a/cpp/search/searchparams.h b/cpp/search/searchparams.h index 309c0500ed..04a04f4ae9 100644 --- a/cpp/search/searchparams.h +++ b/cpp/search/searchparams.h @@ -94,8 +94,12 @@ struct SearchParams { bool enableMorePassingHacks; //Always weightless search passing and non passing moves when a pass would end the phase after a few visits. //Whether to compute pass-alive areas as if multi-stone suicide were always legal regardless of the actual suicide //rule, for game end/scoring within the search tree and for nn input featurization. - //Auto = do so if and only if the neural net declares that it expects this. See BoardHistory::alwaysComputePassAliveUnderSuicideRules. + //Auto = do so if and only if the neural net declares that it expects this. See BoardHistoryModes. enabled_t alwaysComputePassAliveUnderSuicideRules; + //Whether territory scoring with TaxRule NONE excludes empty points adjacent to chains in atari (rules version 3), + //for game end/scoring within the search tree and for nn input featurization. + //Auto = do so if and only if the neural net declares that it expects this. See BoardHistoryModes. + enabled_t excludeTerritoryAdjacentToAtari; 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/backendreferencedata.cpp b/cpp/tests/backendreferencedata.cpp new file mode 100644 index 0000000000..6321cb9d95 --- /dev/null +++ b/cpp/tests/backendreferencedata.cpp @@ -0,0 +1,567 @@ +// Compiled-in reference data for Tests::runBackendReferenceTest (testbackendreference.cpp). +// +// THIS FILE IS MACHINE-GENERATED: positions are sampled from the training distribution, +// per-net outputs are dumped via "katago testbackendreference -dump-candidate" for a sampling +// of nets from the run, blended, and re-emitted. Do not hand-edit individual data lines. +// +// Current data (August 2026): 512 positions sampled from kata1 distributed selfplay games +// (2026-06-29, kata1-zhizi-b40c768nbt), weighted by training-row weight plus a floor so all +// positions are eligible, with policyOptimism / pda / maxHistory varied across positions. +// Reference values are blended across 12 nets of model version >= 10, from +// kata1-b40c256-s12350780416 (2021) through kata1-b28c512nbt, b40c768nbt, and 2026 +// experimental transformers, with the most recent nets double-weighted. Policy is stored to +// 3 significant figures with exact zeros as bare 0, ownership as integers in [-100,100] +// holding white ownership times 100, and scalars to 6 significant figures. The allowed +// ownership MAE is computed against the quantized values, absorbing the quantization error. +// +// Schema, one JSON object per line: +// { +// "sample": {...}, // Sgf::PositionSample, same schema as PositionSample::toJsonLine +// "rules": "chinese", // Rules::parseRules-compatible string. Komi comes from the +// // next field. +// "komi": 7.0, +// "policyOptimism": 0.25, // policy optimism for this position's eval. +// // null/missing to use the caller's default. +// "pda": 0.0, // playoutDoublingAdvantage for this position's eval, from the +// // perspective of the player to move. +// // null/missing to use the caller's default. +// "maxHistory": 2, // cap on history planes for this position's eval. +// // null/missing for no cap. +// "policyMixture": [p0, ...], // full averaged policy across reference nets, length +// // xSize*ySize+1, row-major y*xSize+x with pass last. +// // Entries at illegal moves are ignored. +// // null/missing to skip policy KL and consensus checks. +// "winrateAvg": 0.5, // average across reference nets of white winrate, +// // 0.5*(1 + whiteWinProb - whiteLossProb), compared by binary KL. +// // null/missing to skip, likewise for the fields below. +// "leadAvg": 0.0, // averages compared by absolute error: whiteLead, +// "scoreMeanAvg": 0.0, // whiteScoreMean, +// "scoreStdevAvg": 20.0, // sqrt(whiteScoreMeanSq - whiteScoreMean^2), +// "shorttermWinlossErrorAvg": 0.1, // shorttermWinlossError (skipped on model versions +// "shorttermScoreErrorAvg": 1.5, // that lack these outputs), shorttermScoreError. +// "ownership": [o1, o2, ...], // averaged white ownership across reference nets times 100, +// // integers in [-100,100], row-major y*xSize+x over the +// // actual board. null to skip. +// "ownershipAllowedMAE": 0.1 // max across reference nets of mean abs deviation from the +// // averaged ownership. Required whenever ownership is present. +// } + +#include "../tests/tests.h" + +std::vector TestCommon::getBackendReferenceJsonData() { + std::vector lines; + lines.reserve(600); + lines.push_back(R"%({"sample":{"board":"................../...........XX...../..........OOOXXX../..X.X...O...OOOO../............X...../....X............./..OOX............./..XOXO............/..XXOX...O.XO.X.../.OOOOXOXXOX...XO../.OXOXXX..XXO..OXO./XXXOXOOXX.X......./.OXXO.O..XOOO..O../.OX..O..XXX......./..OX.O.OX.OXX.XO../.X..XO.OX.OOO.O.../...XO............./................../","hintLoc":"null","initialTurnNumber":106,"metadata":"001191B83B1952FF078DED82ED0E1322:116","moveLocs":["H15","J14","B13","B12","H16","B14","C13","D13","C14","D14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.62,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":6.5,"policyOptimism":0.97,"pda":-1.438,"policyMixture":[9.22e-06,9.96e-06,9.95e-06,1e-05,9.83e-06,9.68e-06,9.54e-06,9.95e-06,1.02e-05,9.92e-06,1.02e-05,9.24e-06,8.94e-06,9.49e-06,9.91e-06,9.25e-06,9.96e-06,9.11e-06,9.81e-06,1.02e-05,1.78e-05,1.44e-05,1.53e-05,1.15e-05,1.11e-05,1.1e-05,1.17e-05,1.16e-05,1.15e-05,0,0,9.83e-06,9.66e-06,9.64e-06,1.07e-05,9.67e-06,9.93e-06,1.35e-05,3.63e-05,6.54e-05,7.18e-05,2.83e-05,1.03e-05,0,1.18e-05,1.14e-05,0,0,0,0,0,0,1.99e-05,1.04e-05,1.09e-05,1.35e-05,0,0.198,0,3.89e-05,1.12e-05,0,0,1.06e-05,9.72e-06,8.82e-06,0,0,0,0,5.53e-05,1.02e-05,1.18e-05,0,0,0,0.743,4.8e-05,1.23e-05,1.25e-05,0,1.05e-05,1.25e-05,1.05e-05,0,1.04e-05,9.96e-06,1.02e-05,1.89e-05,9.57e-06,1.27e-05,0,0,0,0,3.83e-05,5.71e-05,1.14e-05,1.09e-05,1.16e-05,1.11e-05,1.08e-05,1.06e-05,1.12e-05,1.52e-05,1.56e-05,1.16e-05,1.01e-05,0.0469,0,0,0,0,4.1e-05,4.87e-05,1.12e-05,1.12e-05,1.15e-05,1.09e-05,1.18e-05,2.58e-05,1.07e-05,1.18e-05,1.13e-05,1.15e-05,9.78e-06,3.73e-05,0.000107,0,0,0,0,7.62e-05,1.09e-05,1.12e-05,1.08e-05,1.1e-05,1.25e-05,4.52e-05,1.06e-05,1.02e-05,1.03e-05,1.11e-05,9.76e-06,5.93e-05,0.000291,0,0,0,0,1.01e-05,1.04e-05,1.06e-05,0,1.05e-05,0,0,9.82e-06,0,9.59e-05,1.1e-05,1.02e-05,0.000117,0,0,0,0,0,0,0,0,0,0,1.06e-05,3.19e-05,9.06e-06,0,0,4.51e-05,9.83e-06,0.00113,0,0,0,0,0,0,9.58e-06,9.08e-06,0,0,0,1.03e-05,0.00154,0,0,0,1.02e-05,0,0,0,0,0,0,0,0,0,8.7e-06,0,1.27e-05,1.1e-05,1.08e-05,8.51e-05,7.03e-05,1.57e-05,9.11e-06,1.05e-05,0,0,0,0,0,0,1.28e-05,9.35e-06,0,0,0,0,1.34e-05,1.43e-05,0,1.14e-05,9.03e-06,1.05e-05,0,0,2.07e-05,1.47e-05,0,2.11e-05,4.52e-05,0,0,0,1.28e-05,8.87e-06,3.03e-05,4.39e-05,8.01e-05,1.11e-05,9.5e-06,9.83e-06,1.32e-05,0,0,1.07e-05,0,1.13e-05,0,0,9.98e-06,0,0,0,0.000239,0,0,7.75e-05,9.41e-06,9.56e-06,0,1.26e-05,1.83e-05,0,0,1.33e-05,0,0,1.11e-05,0,0,0,0.00119,0,0.00335,1.12e-05,9.57e-06,9.91e-06,1.06e-05,1.1e-05,0,0,5.61e-05,0.000376,5.61e-05,0.000144,2.21e-05,1.02e-05,1.01e-05,1.16e-05,8.01e-05,0.000195,1.48e-05,1.17e-05,9.64e-06,9.1e-06,1.05e-05,9.59e-06,1.06e-05,1.58e-05,1.1e-05,1.05e-05,1.12e-05,1.21e-05,1.04e-05,9.72e-06,9.72e-06,9.89e-06,1.01e-05,9.95e-06,9.72e-06,9.59e-06,8.99e-06,6.72e-06],"winrateAvg":0.832626,"leadAvg":2.31887,"scoreMeanAvg":3.67553,"scoreStdevAvg":9.56183,"shorttermWinlossErrorAvg":0.211531,"shorttermScoreErrorAvg":1.96161,"ownership":[-79,-80,-80,-79,-75,-68,-57,-31,-4,18,10,-15,-63,-81,-84,-81,-76,-61,-77,-79,-79,-81,-76,-72,-69,-57,-15,20,22,-82,-84,-84,-86,-80,-73,-43,-75,-78,-78,-85,-80,-72,-68,-90,21,44,97,97,97,-88,-88,-88,-40,-20,-61,-75,-92,19,-95,-54,-40,-89,88,56,54,58,97,97,97,96,16,15,-39,-37,-90,93,-55,-34,-6,24,88,36,15,20,-21,35,47,54,56,30,4,-91,-91,95,-89,-32,-10,14,30,11,9,6,8,19,20,30,29,32,56,96,95,96,-88,-50,-21,0,5,3,-6,-6,-2,8,14,21,30,28,79,92,92,95,-88,-31,-43,-19,-17,-12,-23,-28,-20,12,2,14,27,30,78,92,92,91,93,-97,-31,-54,-40,10,-49,-89,36,-7,-47,5,42,39,49,94,93,93,93,-97,-26,-100,-100,9,-99,-37,-18,-15,-47,84,62,61,-6,93,-90,94,-97,-97,-98,-97,-99,-100,-100,43,16,-10,87,76,93,77,-90,-90,-89,93,-96,84,84,-100,-100,-99,-100,-42,27,31,59,93,90,86,-86,-79,-90,-88,71,72,85,-15,-77,-100,81,79,79,44,63,98,89,86,-85,-80,-90,-37,49,89,73,-10,-100,-100,-99,-5,27,36,54,67,84,83,-85,-83,-67,-90,50,90,83,90,-100,-44,92,-14,-10,31,23,93,83,81,-86,-90,-72,-78,-81,90,72,90,-99,-23,93,93,93,50,95,81,82,81,-83,-80,-65,-86,26,24,45,39,-21,-25,49,70,82,83,86,82,82,81,-79,-74,-63,-28,-11,33,41,21,-16,-19,9,43,60,75,79,81,81,81],"ownershipAllowedMAE":0.0397909})%"); + lines.push_back(R"%({"sample":{"board":"....O..O.O.X.X.XO../.XXO..OXXOX.XXXO.../.XO.OOOOOXXXX.O.OXO/X.XO.XXO.OXOXOOXXO./XXOO.XOOX.OOOXXOO.O/.XXOXOO.XOOOX....O./XXOX.XOOOXXO...OOXO/OOOOXXXXOX.O.OOXXXX/X.O.OXOOX.XXO..XOO./OO.XOOOXX.OOOO.X.../OOOOO.OOXXOXX.XXOX./OXOXX.OXXOXX.XXOXXX/OXXOXOOXOOO..XOOOOX/XOX.XXXXOX..OOXOO.O/X.....OXXX....XXOOO/..XXXXXOO..XXXXOO../XXXOOOOXXXXXOOOXXO./OOOOXXOOOX.X..X.XO./........X.X....X.X./","hintLoc":"null","initialTurnNumber":308,"metadata":"9BA2613D87764A11A5468F22EDF4E721:318","moveLocs":["D17","C19","B19","P11","C17","D19","H1","G1","K1","O9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.53,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":-12.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000486,0,0,0,0,0.0112,0.000516,0,0.000372,0,0.0496,0,0.000121,0,0.0993,0,0,0.016,0.000475,0.000492,0,0,0,0.013,0.00058,0,0,0,0,0,0.000108,0,0,0,0,0.0161,0.012,0.000699,0.00054,0,0,0,0,0,0,0,0,0,0,0,0,0.0501,0,0.000296,0,0,0,0,0.000536,0,0,0.0142,0,0,0,0.0138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0139,0,0,0,0,0.015,0,0,0,0,0,0,0,0,0,0.00047,0,0,0,0,0,0,0.000493,0,0,0,0,0,0.000511,0.000527,0.00083,0.00145,0,0.116,0,0,0,0,0.000499,0,0,0,0,0,0,0,0.0127,0.000926,0.000653,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000178,0,0.0128,0,0,0,0,0,0,0,0.000467,0,0.000499,0,0,0,0,0,0.00944,0,0,0,0,0,0,0,0,0.00868,0,0,0.000498,0,0,0,0,0,0,0.00797,0,0,0,0,0.0183,0,0.0242,0.0132,0.00427,0,0,0,0,0,0.000613,0,0,0,0,0,0,0,0,0,0,0,0,0.00041,0,0,0,0,0,0.176,0,0,0,0,0,0,0.0476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0221,0.00235,0,0,0,0,0,0,0,0,0,0.00056,0,0,0,0,0,0,0.00646,0.00654,0,0,0,0,0,0,0,0,0.000597,0.000558,0.000508,0.000541,0.000556,0,0,0,0,0.000514,0.000526,0.000618,0.000595,0,0,0,0,0,0.000569,0.000505,0,0,0,0,0,0,0,0.000553,0.000506,0,0,0,0,0,0,0.0047,0.000804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00675,0,0,0,0,0,0,0,0,0,0,0.000509,0,0.000577,0.00058,0,0.000395,0,0,0.118,0.000475,0.000477,0.000478,0.000482,0.000484,0.000482,0,0,0,0,0,0.000534,0.000507,0.000519,0.000542,0,0.0173,0,0.00322,0.00711],"winrateAvg":0.984718,"leadAvg":1.34619,"scoreMeanAvg":1.49271,"scoreStdevAvg":1.51226,"shorttermWinlossErrorAvg":0.0543606,"shorttermScoreErrorAvg":0.62878,"ownership":[-100,-100,100,100,100,100,100,100,100,100,-79,-100,-100,-100,-66,-64,100,99,100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,99,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-47,100,100,100,99,100,-100,-100,-100,100,99,99,100,100,99,100,-100,100,-100,100,100,100,100,100,100,-100,-100,100,100,99,99,100,100,99,99,100,100,100,99,99,100,100,100,100,-100,-100,-100,100,99,100,100,100,99,100,100,100,99,100,100,100,100,100,47,-100,-100,100,100,100,100,100,100,100,-100,-100,100,99,99,100,100,100,-100,51,100,100,100,100,100,100,100,100,100,-100,29,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-99,-100,-100,100,100,100,-100,-99,-99,-99,100,100,100,100,100,100,100,-100,-100,-15,100,100,100,100,59,-100,-99,-99,-99,100,100,100,100,100,46,100,100,-100,-100,100,-100,-99,100,-100,-100,-99,-100,-99,100,-100,100,-100,-100,-54,100,-100,-100,-99,-100,-99,-98,-100,-100,100,-100,-100,-100,100,-100,-100,-100,-100,100,100,-100,-99,-99,-99,-99,-99,-100,100,100,100,100,-100,-100,-99,-100,-100,-100,-100,-100,-100,-99,-100,-99,-99,-99,-99,-100,100,100,100,100,-100,-99,-99,-100,-100,-100,-100,-100,-100,-100,-99,-99,-99,-99,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-99,-99,-99,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,69,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,44],"ownershipAllowedMAE":0.00898179})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..........O..XO.X../...O.O.......O.OX../.................../..X.......X..OOX.../..............XO.../.................../.................../.................../.................../.................../.................../.................../.................../...X...........X.../.................../.................../.................../","hintLoc":"null","initialTurnNumber":18,"metadata":"39BDEFB4B0C8F3E972861500BDD1FECC:28","moveLocs":["R14","R13","P12","S13","S14","R10","Q7","Q18","R18","P10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.0,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.29e-06,4.04e-06,3.97e-06,3.99e-06,4.22e-06,4.04e-06,4.06e-06,4.08e-06,4.13e-06,4.25e-06,4.22e-06,4.25e-06,3.83e-06,4.98e-06,4.3e-06,5.31e-06,4.04e-06,3.77e-06,3.85e-06,3.99e-06,7.86e-06,1.1e-05,1.8e-05,2.44e-05,2.16e-05,1.21e-05,1.11e-05,1.14e-05,1.1e-05,2.1e-05,9.06e-06,1.03e-05,0.168,5.63e-06,0,0,3.75e-06,4.07e-06,4.28e-06,2.05e-05,7.19e-05,1.64e-05,4.6e-05,2.23e-05,4.58e-05,7.56e-05,5.05e-05,5.26e-05,0,1.97e-05,1.15e-05,0,0,8.21e-06,0,3.75e-06,3.79e-06,4.89e-06,0.000144,7.85e-05,0,7.69e-06,0,4.86e-05,8.95e-05,7.89e-05,0.000973,0.015,0.000255,0.00176,0,4.43e-06,0,0,3.78e-06,4.28e-06,4.56e-06,8.65e-05,1.07e-05,1.35e-05,0.0248,2.28e-05,0.000676,0.000282,0.000138,1.88e-05,7.76e-06,3.97e-05,1.31e-05,9.55e-06,8.1e-05,4.05e-05,3.59e-06,3.74e-06,4.05e-06,4.48e-06,8.39e-06,0,1.19e-05,0.000199,0.000117,0.0345,0.00127,0.000148,9.2e-06,0,7.06e-06,9.66e-06,0,0,0,0,0,4.76e-06,4.06e-06,1.03e-05,1.08e-05,4.67e-05,0.000142,0.000251,0.000692,0.00054,0.000192,2.06e-05,9.73e-06,1.54e-05,0.0395,9.75e-06,0,0,0,0,4.02e-05,4.14e-06,1.14e-05,6.01e-05,8.96e-05,6.38e-05,0.000125,0.000172,0.000221,0.000208,0.000297,0.000646,0.163,0.397,6.73e-06,0,0.000364,1.24e-05,6.89e-05,6.63e-06,4.16e-06,1.44e-05,0.000182,0.000323,0.000106,0.000128,0.000152,0.000186,0.000206,0.000395,0.00103,0.0152,0.0159,9.01e-05,1.2e-05,0.00302,6.81e-05,1.24e-05,5.95e-06,4.26e-06,1.5e-05,0.000205,0.00134,0.000125,0.00012,0.000136,0.000146,0.000156,0.00019,0.000183,0.000254,0.000159,0.00011,0,1.09e-05,0,2.31e-05,4.76e-06,4.22e-06,1.41e-05,0.000134,0.000337,0.000118,0.000106,0.000118,0.000126,0.000135,0.000142,0.000143,0.000165,0.000142,0.000146,1.57e-05,0.0564,0.0362,2.01e-05,4.5e-06,4.25e-06,1.46e-05,0.000188,0.000233,0.000103,8.45e-05,9.76e-05,0.000111,0.000123,0.00013,0.000133,0.000152,0.000157,6.7e-05,1.45e-05,9.44e-06,0.000177,2.29e-05,4.56e-06,4.25e-06,1.56e-05,0.000343,0.000741,6.59e-05,5.23e-05,7.82e-05,9.38e-05,0.000112,0.000123,0.000122,0.00012,0.000105,2.56e-05,8.51e-06,0,1.06e-05,1.35e-05,4.51e-06,4.27e-06,1.49e-05,0.000493,0.000314,4.94e-05,3.01e-05,4.55e-05,7.54e-05,0.0001,0.000115,0.000106,8.21e-05,3.9e-05,1.87e-05,1e-05,7.21e-06,1.26e-05,1.05e-05,4.19e-06,4.32e-06,1.55e-05,5.32e-05,1.39e-05,1.95e-05,4.11e-05,4.76e-05,8.21e-05,0.000107,0.000125,0.000107,6.52e-05,2.53e-05,1.67e-05,9.99e-06,7.63e-06,1.21e-05,8.97e-06,4.12e-06,4.34e-06,1.14e-05,1.62e-05,0,1.34e-05,0.000197,0.000259,0.000177,0.00033,0.00119,0.000415,0.000152,8.32e-05,3.63e-05,9.97e-06,0,9.52e-06,7.96e-06,3.99e-06,4.01e-06,8.01e-06,1.51e-05,1.54e-05,3.48e-05,0.000239,0.000242,0.000246,0.000325,0.000888,0.000435,0.000204,0.000127,0.000111,3.75e-05,1.42e-05,1.14e-05,6.51e-06,3.89e-06,3.96e-06,5.77e-06,7.76e-06,1.07e-05,1.4e-05,1.37e-05,1.51e-05,1.57e-05,1.71e-05,1.9e-05,1.79e-05,1.61e-05,1.46e-05,1.31e-05,1.47e-05,1.07e-05,7.08e-06,5.31e-06,3.9e-06,3.48e-06,4.06e-06,4.03e-06,4.26e-06,4.24e-06,4.26e-06,4.3e-06,4.32e-06,4.39e-06,4.44e-06,4.41e-06,4.4e-06,4.37e-06,4.31e-06,4.39e-06,4.3e-06,4.04e-06,4e-06,3.51e-06,5.53e-06],"winrateAvg":0.497236,"leadAvg":-0.107547,"scoreMeanAvg":-0.135376,"scoreStdevAvg":13.9623,"shorttermWinlossErrorAvg":0.0836494,"shorttermScoreErrorAvg":0.733081,"ownership":[20,25,29,34,36,35,30,25,25,30,36,38,37,30,29,7,-10,-68,-67,16,21,31,37,40,37,34,27,27,33,45,43,32,18,37,66,-84,-68,-71,11,15,28,50,48,49,33,23,20,21,77,39,43,11,80,-6,-82,-77,-72,7,8,34,84,54,84,26,16,13,10,16,36,32,85,62,72,-84,-77,-69,-3,4,34,19,-3,24,8,6,5,9,6,19,36,51,30,-14,-56,-64,-53,-12,-18,-51,-2,1,10,-10,-5,-2,-3,-43,16,31,88,87,-81,-82,-83,19,-14,-18,-11,-3,1,0,-3,-5,-3,0,3,33,12,33,-35,68,68,70,30,-13,-12,-5,-5,0,-2,-2,-4,-4,-6,-6,-13,-25,-8,-36,1,33,41,45,-10,-10,-8,-6,-3,-2,-3,-4,-6,-11,-13,-12,-10,1,22,25,38,52,45,-7,-7,-7,-8,-3,-3,-3,-4,-5,-8,-9,-10,5,13,74,45,81,45,42,-4,-5,-5,-6,-3,-3,-3,-4,-5,-6,-7,-6,-1,2,19,-5,4,27,26,-4,-5,-9,-6,-5,-4,-4,-4,-5,-6,-6,-6,-5,6,15,-7,-5,2,7,-5,-5,-10,-11,-9,-7,-5,-5,-5,-6,-6,-6,-6,-5,-9,-71,-34,-9,-10,-9,-7,-4,-21,-14,-10,-8,-7,-6,-6,-7,-7,-8,-8,-16,-36,-35,-24,-21,-13,-16,-28,-31,-20,-15,-11,-10,-9,-9,-8,-9,-10,-11,-22,-39,-39,-28,-27,-16,-18,-32,-80,-32,-23,-15,-12,-12,-13,-12,-12,-13,-17,-28,-83,-41,-30,-28,-17,-19,-22,-33,-30,-13,-17,-16,-13,-12,-13,-15,-15,-11,-34,-36,-31,-29,-27,-18,-17,-20,-21,-20,-13,-13,-13,-13,-13,-13,-13,-14,-15,-24,-24,-26,-24,-26,-19,-19,-18,-19,-17,-14,-12,-11,-11,-10,-11,-12,-13,-16,-20,-22,-23,-24,-26],"ownershipAllowedMAE":0.0249768})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..X................/....X............../..O............O.../.XXX.............../.OOX...........O.../O..OX............../.OOO.............../.................../.XOO.............../..X.X............../....OXX............/.X.XXO............./....OO.........O.../..XOOXXX.X....O..../..XXO..OO.....OX.../....O............../.................../","hintLoc":"null","initialTurnNumber":50,"metadata":"763A8FBEE93B708E9047C6EAE62AE9ED:60","moveLocs":["K3","K2","J4","J2","L2","M2","L3","L1","K17","F16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.11,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1button1","komi":-6.0,"policyOptimism":0.113,"pda":0.0,"policyMixture":[9.58e-06,2.23e-05,3.83e-05,4.18e-05,4.91e-05,5.08e-05,5.68e-05,5.73e-05,5.36e-05,5.23e-05,4.12e-05,4.17e-05,4.5e-05,4.88e-05,5.11e-05,4.96e-05,4.08e-05,3.27e-05,1.12e-05,2.07e-05,5.46e-05,6.8e-05,0.000102,0.000196,0.000291,0.000456,0.00105,0.000341,0.000109,0.000126,0.000132,0.000155,0.000168,0.0002,0.000167,0.000126,8.29e-05,3.2e-05,2.68e-05,5.4e-05,0,0.000105,0.037,0.0752,0.0104,0.0737,0.000238,0,0.000115,0.000434,0.000999,0.00119,0.00433,0.0133,0.0123,0.000123,3.78e-05,2.95e-05,7.66e-05,8.98e-05,0.000107,0,0,0.184,0.226,0.00301,0.000214,0.000281,0.000549,0.000825,0.000943,0.00105,0.00639,0.000957,0.000127,4.46e-05,3.59e-05,0.000133,0,0.000142,0.00126,0.141,0.00963,0.00061,0.00889,0.00419,0.000708,0.000311,0.000352,0.00021,0.000199,0,0.000191,0.000224,4.35e-05,5.31e-05,0,0,0,8.29e-05,0.000781,0.00116,0.00125,0.00249,0.00174,0.00083,0.000483,0.000427,0.000248,0.00105,0.000136,0.000947,0.000167,4.67e-05,1.18e-05,0,0,0,0.000108,0.000837,0.000992,0.00134,0.00132,0.00101,0.000794,0.000534,0.000408,0.000198,0.000293,0,0.000244,0.000176,4.11e-05,0,2.56e-05,2.28e-05,0,0,0.000331,0.00389,0.00141,0.000944,0.000797,0.000703,0.00059,0.000507,0.00038,0.000412,0.000977,0.000393,0.000129,4.14e-05,1.33e-05,0,0,0,0.00471,0.00622,0.00714,0.00115,0.00074,0.000645,0.000632,0.000614,0.000552,0.000461,0.000376,0.000299,0.000654,0.000134,4.03e-05,3.01e-05,0.0134,4.96e-05,4.74e-05,0.000274,0.0277,0.00113,0.000658,0.000501,0.000513,0.000562,0.000604,0.000572,0.000471,0.000352,0.000466,0.000515,0.000123,4.12e-05,2.72e-05,0,0,0,0.000166,0.000101,0.000142,0.000186,0.000287,0.000374,0.000527,0.000637,0.000618,0.000498,0.000354,0.000473,0.000558,0.000128,4.3e-05,5.93e-05,8.43e-05,0,0.000105,0,4.54e-05,6.59e-05,0.000126,0.000257,0.000408,0.000606,0.000774,0.000734,0.000486,0.000352,0.000467,0.000784,0.000137,4.5e-05,2.22e-05,6.77e-05,4.53e-05,0.000128,0,0,0,0.000107,0.000152,0.000219,0.000409,0.000733,0.000786,0.000467,0.000286,0.000326,0.00078,0.000186,4.85e-05,1.16e-05,0,3.19e-05,0,0,0,0.000105,0.000116,9.94e-05,0.00011,0.000134,0.000784,0.00101,0.000216,0.000214,0.00022,0.000846,0.000881,5.71e-05,1.07e-05,1.74e-05,2.77e-05,5.4e-05,0,0,5.34e-05,4.62e-05,3.6e-05,4.35e-05,9.28e-05,0.000587,0.00178,0.000436,0.0001,0,0.000732,0.00178,6.33e-05,1.16e-05,1.49e-05,0,0,0,0,0,0,0,0,3.09e-05,0.000217,0.00686,0.000115,0,0.000128,0.000884,0.000739,5.5e-05,1.07e-05,1.48e-05,0,0,0,0.00204,0.000122,0,0,0,0,0.0033,0.00997,0.000138,0,0,0.000108,0.000166,4.36e-05,1.23e-05,2.05e-05,3.11e-05,0.000245,0,0.000157,0.00758,6.92e-05,0,0,0,0,0.00081,0.00112,0.000425,0.000142,0.00021,7.89e-05,3.88e-05,8.63e-06,1.63e-05,2.97e-05,5.86e-05,5.68e-05,7.94e-05,8.69e-05,0.00018,5.49e-05,0.00614,0,9.78e-05,9.82e-05,6.1e-05,4.35e-05,5.14e-05,3.37e-05,3.55e-05,1.14e-05,1.44e-05],"winrateAvg":0.00433219,"leadAvg":-15.667,"scoreMeanAvg":-17.4743,"scoreStdevAvg":14.3222,"shorttermWinlossErrorAvg":0.0118422,"shorttermScoreErrorAvg":1.31645,"ownership":[-69,-66,-62,-53,-44,-38,-38,-39,-41,-39,-29,-16,-5,5,13,15,16,16,17,-70,-73,-65,-58,-44,-41,-41,-43,-47,-46,-34,-17,-6,6,16,18,18,17,19,-71,-73,-91,-52,-34,-38,-42,-43,-44,-81,-25,-10,-6,4,34,25,20,22,21,-64,-71,-70,-71,-85,-5,-47,-59,-35,-29,-15,-10,1,10,23,31,36,30,27,-38,-63,-46,-70,-45,-35,-32,-28,-25,-23,-12,-3,5,15,28,85,48,30,32,6,-95,-96,-96,-53,-35,-26,-21,-16,-13,-7,0,6,11,22,46,42,37,33,44,77,76,-96,-55,-30,-21,-16,-12,-9,-5,1,6,14,25,82,46,32,31,77,76,74,76,-71,-23,-20,-14,-10,-7,-4,0,5,9,14,23,28,28,25,64,77,77,77,9,-10,-18,-12,-9,-6,-4,-1,3,5,10,18,17,20,19,35,4,52,46,15,-13,-8,-11,-9,-8,-5,-2,2,5,9,15,16,16,15,-7,-34,75,75,0,-11,-16,-13,-12,-12,-9,-4,0,4,8,12,14,15,13,-45,-23,-66,21,-89,-38,-26,-19,-19,-21,-17,-9,-3,3,9,13,14,15,13,-70,-71,-50,-78,-71,-92,-92,-19,-22,-28,-24,-14,-6,3,10,17,20,16,16,-86,-97,-65,-92,-92,83,-32,-4,-20,-27,-24,-14,-5,7,16,30,31,24,18,-89,-89,-40,-9,85,84,33,-31,-36,-36,-21,-13,-3,10,42,92,46,14,18,-87,-90,-94,84,85,-81,-82,-81,-82,-83,-47,-21,0,30,94,56,34,19,16,-81,-83,-94,-94,84,-17,49,89,88,-83,-82,5,24,46,94,11,29,21,15,-73,-61,-70,-4,84,72,69,80,89,89,-82,79,52,61,48,34,23,21,17,-59,-46,-25,5,36,68,72,76,83,78,80,74,61,55,51,35,27,22,19],"ownershipAllowedMAE":0.0355932})%"); + lines.push_back(R"%({"sample":{"board":".....X............./.OOOX.X............/.XXXOX.......X.X.../..OOO..........OX../................X../..............OOX../..............O.O../...............O.../.................../.................../.................../.................../.XX................/.OXO.............../.XOXO..........X.../.XOX.............../.XOXO..........X.../.OOO.............../..O................/","hintLoc":"null","initialTurnNumber":50,"metadata":"C609B7D2D36D4B091CD62E49685322FE:60","moveLocs":["R11","L4","Q11","S12","O11","R7","R9","R8","S6","O8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":-5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.01e-05,2.3e-05,1.97e-05,3.25e-05,1.85e-05,0,1.09e-05,2.95e-05,3.39e-05,3.58e-05,3.66e-05,3.75e-05,3.6e-05,3.9e-05,2.88e-05,2.85e-05,2.47e-05,2.13e-05,9.19e-06,3.09e-05,0,0,0,0,1.39e-05,0,6.98e-05,0.000118,0.000116,0.000127,0.000132,0.000125,8.58e-05,0.000101,7.62e-05,8.25e-05,4.59e-05,2.11e-05,5.41e-05,0,0,0,0,0,4.74e-05,0.000116,0.000179,0.00035,0.000383,0.000206,0.000158,0,0.000132,0,7.18e-05,6.77e-05,2.46e-05,5.01e-05,0.000631,0,0,0,0.00167,0.000118,0.000155,0.000466,0.00123,0.00221,0.00287,0.00656,0.000304,0.0225,0,0,4.53e-05,3.31e-05,6.11e-05,0.00016,0.000132,7.53e-05,0.000124,0.000164,0.000386,0.000319,0.000677,0.00147,0.00177,0.00119,0.00412,0.000161,7.17e-05,0.000379,0,7.77e-05,4.56e-05,3.77e-05,0.00252,0.000154,0.000151,0.000139,0.000169,0.000289,0.000353,0.000787,0.00186,0.00357,0.00753,0.00401,9.61e-05,0,0,0,0.000468,9.19e-05,2.97e-05,9.82e-05,0.000188,0.000159,0.000178,0.000186,0.000228,0.000364,0.000923,0.00219,0.00491,0.00241,0.011,0.000158,0,0,0,8.93e-05,6.05e-05,3.17e-05,0.000107,0.000152,0.000177,0.000172,0.000186,0.000226,0.000437,0.00111,0.00287,0.00622,0.00932,0.205,0.00021,0.000268,0,0.00192,0,5.32e-05,3.32e-05,0.000106,0.000181,0.000195,0.000167,0.00018,0.000223,0.00048,0.00122,0.00304,0.00485,0.0337,0.00072,0,0.000134,0,0,0.00227,6.56e-05,3.24e-05,9.55e-05,0.000144,0.000157,0.000152,0.000172,0.000219,0.000494,0.00125,0.00301,0.00525,0.00829,0.00512,0.000208,0.00021,9.26e-05,6.6e-05,0.00061,6.89e-05,2.89e-05,8.22e-05,9.7e-05,0.000114,0.000144,0.000174,0.000244,0.000566,0.00124,0.00255,0.00488,0.00899,0.0159,0.00732,0.00112,0.119,0,0.0609,0.00011,1.87e-05,2.94e-05,4.36e-05,8.57e-05,0.000172,0.000235,0.000365,0.000607,0.00112,0.002,0.0042,0.00912,0.00581,0,0.000451,0.000717,0,0.000118,7.01e-05,1.35e-05,0,0,0.0131,0.000169,0.000163,0.000227,0.000413,0.0008,0.00136,0.00229,0.00394,0.00161,0.000864,0.0068,9.49e-05,0,0.000148,6.44e-05,3.01e-05,0,0,0,0.000181,0.000136,0.000166,0.000221,0.000456,0.00125,0.00149,0.00359,0.00396,0.00646,0.00332,0.000174,0.000216,0,3.62e-05,9.5e-06,0,0,0,0,0.000109,0.000121,0.000162,0.000277,0.0013,0.00402,0.0626,0.0057,0.00175,0.000151,0,0.000103,8.35e-05,2.72e-05,9.9e-06,0,0,0,4.05e-05,0.000174,9.74e-05,0.000148,0.000221,0.000762,0,0.157,0.0126,0.000647,0.000122,6.42e-05,7.86e-05,8.26e-05,2.28e-05,2.6e-05,0,0,0,0,5.99e-05,0.000101,0.000133,0.000239,0.00023,0.00178,0.0055,0.0372,0.00062,0.000112,0,6.16e-05,5.7e-05,1.87e-05,2.21e-05,0,0,0,2.43e-05,5.97e-05,7.05e-05,9.17e-05,0.000124,0.000159,0.000347,0.000466,0.00076,0.000192,0.000116,6.85e-05,5.94e-05,3.63e-05,1.8e-05,9.82e-06,9.22e-06,0,8.88e-06,1.51e-05,1.96e-05,2.22e-05,2.83e-05,3.51e-05,4.53e-05,5.49e-05,5.91e-05,5.7e-05,4.93e-05,4.14e-05,3.38e-05,2.01e-05,1.86e-05,8e-06,1.97e-05],"winrateAvg":0.00651115,"leadAvg":-13.4888,"scoreMeanAvg":-15.5002,"scoreStdevAvg":13.8658,"shorttermWinlossErrorAvg":0.0141029,"shorttermScoreErrorAvg":1.08443,"ownership":[78,66,63,31,-21,-75,-67,-54,-37,-25,-16,-18,-29,-47,-62,-73,-77,-78,-76,85,89,88,89,-71,-67,-78,-48,-34,-21,-17,-18,-33,-55,-69,-78,-77,-79,-73,86,84,84,84,95,-73,-39,-13,-21,-17,-11,-6,-14,-87,-62,-91,-77,-77,-67,79,85,95,95,95,-22,-12,-15,-13,-8,-3,6,28,-16,-14,36,-90,-74,-57,56,70,42,38,18,3,7,-4,-4,-2,4,12,19,14,26,-8,-90,-58,-28,38,19,27,17,11,1,-2,-3,-3,-1,3,12,34,31,78,80,-89,17,-6,19,19,12,9,3,-1,-3,-3,-4,-5,-4,11,6,16,79,69,72,41,30,8,7,8,4,0,-2,-3,-4,-6,-10,-16,-22,-48,-8,3,72,-4,67,27,-5,-4,-4,-4,-3,-3,-4,-5,-8,-12,-17,-27,-35,-82,-39,-83,-82,-29,3,-20,-15,-9,-3,-4,-4,-4,-5,-7,-10,-14,-19,-17,-26,-30,-43,-40,-34,-19,-36,-33,-15,-11,-5,-4,-4,-4,-4,-4,-5,-5,-9,-4,-16,-10,-58,-16,-16,-59,-54,-40,-30,-8,-5,-4,-2,-1,1,2,8,13,60,15,5,53,11,-1,-84,-92,-92,-26,-1,5,2,2,3,4,6,8,6,15,23,15,52,10,-8,-88,-87,-92,77,51,19,12,9,7,7,7,4,2,-2,-5,-16,-13,-65,-29,-84,-89,96,72,92,36,23,18,16,13,6,3,-6,-10,-18,-85,-50,-52,-53,-35,-89,97,78,87,28,30,27,26,28,64,-18,-13,-14,-15,-52,-68,-66,-62,19,-89,97,79,96,55,40,35,30,30,21,3,-15,-21,-31,-87,-71,-68,-67,36,97,97,97,82,61,49,39,30,24,10,-1,-18,-29,-44,-62,-68,-67,-68,67,86,97,92,80,63,49,37,28,20,11,-1,-13,-27,-42,-54,-62,-65,-68],"ownershipAllowedMAE":0.0324451})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../......X...OOOOOOO../...X......XOXXXXOX./..........OXO..OXO./...X.......XX.OXX../.................../.X.X......O......../..OOX......XXX...../.OOXX...XO.OOX.X.../.OXX.......OXOX.X../.XO..........OOO.../....OXO............/..OO.OX........O.../....O....O....OXO../..OXXX..O.OOXXXX.../..OOOX.OOXXXOX.OX../.......OXX..OXO.X../.................../","hintLoc":"null","initialTurnNumber":106,"metadata":"319B09CC69CFDF3E2CA446EDED8C13EE:116","moveLocs":["P15","S14","S13","C17","E18","D18","D17","B14","B13","C16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.12,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.535,"pda":-2.218,"policyMixture":[1.81e-05,4.85e-05,2.27e-05,0.0312,2.04e-05,1.93e-05,2.07e-05,2.11e-05,2.11e-05,2.03e-05,1.95e-05,1.83e-05,1.74e-05,1.69e-05,1.67e-05,1.62e-05,1.69e-05,1.91e-05,1.75e-05,2.29e-05,0.00102,0.614,0,0,2.09e-05,2.27e-05,2.47e-05,2.66e-05,2.55e-05,2.18e-05,1.88e-05,1.76e-05,1.74e-05,1.72e-05,1.68e-05,1.82e-05,2.01e-05,1.72e-05,2.5e-05,2.11e-05,0,0,2.28e-05,2.29e-05,0,2.44e-05,4.78e-05,2.54e-05,0,0,0,0,0,0,0,0.000452,1.88e-05,3.4e-05,0.00142,0,0,2.28e-05,2.45e-05,2.37e-05,2.63e-05,2.95e-05,0.000173,0,0,0,0,0,0,0,0,2.26e-05,2.28e-05,0.096,0.000605,2.43e-05,2.25e-05,2.41e-05,2.59e-05,2.71e-05,2.81e-05,2.53e-05,0,0,0,2.09e-05,0,1.95e-05,0,0,2.77e-05,0.000445,0,6.67e-05,0,2.29e-05,2.58e-05,2.64e-05,2.78e-05,2.68e-05,2.6e-05,2.78e-05,0,0,2.06e-05,0,0,0,0,3.61e-05,2.16e-05,0,2.04e-05,2.06e-05,2.44e-05,2.52e-05,2.69e-05,2.82e-05,2.75e-05,2.8e-05,2.29e-05,2.12e-05,2.01e-05,2.09e-05,2.21e-05,2.08e-05,1.95e-05,0,2.1e-05,2.04e-05,0,0.00157,0,2.38e-05,2.53e-05,2.71e-05,2.89e-05,4.51e-05,2.48e-05,0,2.3e-05,1.92e-05,1.96e-05,1.96e-05,2.01e-05,2.11e-05,2.08e-05,1.91e-05,2.39e-05,6.61e-05,0,0,0,2.24e-05,2.74e-05,3.88e-05,6.18e-05,0.000264,0.00107,0,0,0,1.92e-05,2.04e-05,2.15e-05,2.09e-05,1.92e-05,3.55e-05,0,0,0,0,2.29e-05,3.11e-05,3.25e-05,0,0,0.00308,0,0,0,2.03e-05,0,2.05e-05,2.38e-05,1.98e-05,2.92e-05,0,0,0,1.98e-05,2.73e-05,6.41e-05,0.000122,0.000193,0.0628,6.99e-05,0,0,0,0,2.22e-05,0,2.4e-05,2.06e-05,3.08e-05,0,0,0.000221,0.000207,0.109,0.000201,0.000104,0.000182,0.000116,9.36e-05,0.000189,0.000128,0,0,0,2.59e-05,2.68e-05,1.99e-05,2.38e-05,0.038,0.0199,2.76e-05,0,0,0,0.00639,0.000127,0.000106,0.000153,0.00122,0.000914,2.64e-05,2.15e-05,2.33e-05,2.85e-05,8.29e-05,1.93e-05,2.02e-05,0.000126,0,0,0,0,0,0.000129,0.000247,8.88e-05,0.000104,0.000215,0.000331,3.12e-05,2.76e-05,0,3.17e-05,2.53e-05,1.93e-05,1.88e-05,2.24e-05,2.15e-05,2.26e-05,0,2.79e-05,2.77e-05,3.96e-05,6e-05,0,2.73e-05,5.68e-05,2.58e-05,2.28e-05,0,0,0,2.35e-05,2.04e-05,1.82e-05,1.96e-05,0,0,0,0,2.18e-05,2.21e-05,0,0.000176,0,0,0,0,0,0,2.24e-05,2.29e-05,2.03e-05,1.75e-05,1.83e-05,0,0,0,0,1.98e-05,0,0,0,0,0,0,0,1.85e-05,0,0,2.13e-05,1.92e-05,1.69e-05,1.79e-05,1.8e-05,1.89e-05,2.11e-05,2.2e-05,0.000197,0,0,0,2.12e-05,2.1e-05,0,0,0,1.98e-05,0,2e-05,1.9e-05,1.81e-05,1.73e-05,1.73e-05,1.81e-05,1.83e-05,4.16e-05,0.000111,0.00143,2.96e-05,1.96e-05,2.08e-05,2.07e-05,2.1e-05,1.99e-05,1.95e-05,1.89e-05,1.87e-05,1.82e-05,1.79e-05,1.58e-05],"winrateAvg":0.874937,"leadAvg":3.53567,"scoreMeanAvg":5.08257,"scoreStdevAvg":8.90563,"shorttermWinlossErrorAvg":0.178405,"shorttermScoreErrorAvg":1.83342,"ownership":[42,37,3,-66,-67,-65,-52,-29,1,35,62,78,87,92,94,93,91,86,78,43,50,-60,-56,-89,-62,-54,-21,9,40,73,91,96,98,98,98,91,87,62,43,44,49,-93,-71,-55,-87,-11,7,32,100,100,100,100,100,100,100,24,61,33,41,49,-91,-53,-40,-24,0,10,12,6,100,-94,-94,-94,-94,100,16,25,1,-25,17,-25,-41,-25,-17,-5,4,3,40,-97,-92,-92,-95,-93,-96,16,3,-54,-19,-51,-88,-41,-27,-16,-6,-1,-3,-10,-97,-97,-87,-83,-97,-96,21,-54,-68,-94,-64,-55,-44,-27,-18,-10,-3,-6,6,-28,-69,-83,-87,-88,-63,-71,-53,-80,-94,-53,-89,-58,-28,-20,-16,-9,12,59,6,-68,-82,-82,-74,-63,-60,-59,-58,-52,58,55,-89,-35,-25,-20,-15,3,14,-98,-99,-99,-78,-81,-73,-64,-62,-33,56,55,-88,-88,-27,-10,-20,-63,69,31,89,87,-99,-31,-96,-80,-70,-59,41,54,-89,-88,-34,-3,-4,-11,-9,-12,32,88,74,95,-33,57,-91,-60,-45,58,51,86,7,23,6,18,8,5,13,23,40,73,95,95,96,41,-24,-25,75,55,68,68,98,1,81,30,19,19,18,14,18,37,52,54,28,-24,2,86,75,100,100,93,95,47,50,31,33,19,8,-4,8,10,78,44,6,16,92,96,94,85,97,76,77,56,62,94,49,11,-24,-49,19,-99,49,9,8,96,98,100,70,70,70,78,78,97,29,81,81,-100,-100,-100,-100,-24,-24,-23,97,98,100,100,100,71,83,98,98,-95,-95,-95,-95,-100,-98,-97,-99,-66,-57,97,97,98,96,91,86,83,97,-94,-95,-94,-95,-95,-100,-96,-98,-99,-91,-75,96,96,95,93,90,84,82,-3,-11,-62,-88,-95,-97,-97,-97,-97,-96,-92,-85],"ownershipAllowedMAE":0.037467})%"); + lines.push_back(R"%({"sample":{"board":".............O..X../.XX...OXXXOXOXXXOX./X.XO.XOX.O.O.OXOOX./.XOXXXXOOOOOO.XOOXX/.OO..OXX.....OXXOOX/....X.........XOO.O/......OXXOO.X.XO.../.OOOO.OO..X..XOXO../.OXOXXOXXXO..XO..../.XXO..O.OOXX.XO..../.XOOOX.O..O..XOO.../.OX.X.X.O.OX.XXO.../..XX.XX..O....OXO../.X.OX.....O.X..XO../.OXO..X.......OXO../..X......OO..XXXXO./..XOO.X.X.XX..XOO../XXO.O.OX......XXOO./.O.O..O............/","hintLoc":"null","initialTurnNumber":182,"metadata":"C599D5970F7446742EC309B665B2BC23:192","moveLocs":["B7","F10","D4","F3","K3","H1","J1","G4","H3","F5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.81,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui0","komi":9.5,"policyOptimism":0.435,"pda":0.0,"policyMixture":[1.22e-05,1.14e-05,1.13e-05,1.14e-05,1.16e-05,1.24e-05,1.34e-05,1.12e-05,1.11e-05,0.266,3.93e-05,1.57e-05,1.54e-05,0,3.29e-05,1.2e-05,0,1.13e-05,1.11e-05,1.22e-05,0,0,1.17e-05,1.21e-05,1.25e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.22e-05,0,1.15e-05,0,0,1.23e-05,0,0,0,1e-05,0,0,0,0,0,0,0,0,0,1.25e-05,1.47e-05,0,0,0,0,0,0,0,0,0,0,0,0,0.000127,0,0,0,0,0,0.000138,0,0,1.73e-05,1.37e-05,0,0,0,2.57e-05,1.35e-05,1.33e-05,1.36e-05,1.3e-05,0,0,0,0,0,0,1.41e-05,0.000549,0.000165,2.7e-05,0,1.4e-05,1.55e-05,1.42e-05,1.47e-05,0.000133,2.55e-05,5.45e-05,1.45e-05,1.43e-05,0,0,0,0.000181,0,1.42e-05,1.58e-05,1.74e-05,1.57e-05,1.35e-05,0.0701,0,0,0,0,0,0.00144,0,1.18e-05,0,0,0.000137,0.00217,0.000584,1.29e-05,0,0,0,0,1.2e-05,0,0,4.16e-05,0.000128,0,0.000159,1.28e-05,0,0,0,0,3.07e-05,1.26e-05,1.52e-05,0,0,0,0,0,0,0,0,0,0,2.16e-05,1.27e-05,0,0,0.0011,0.000145,1.75e-05,1.26e-05,1.35e-05,0,0,0,1.11e-05,0,0,1.4e-05,0,0,0,0,1.15e-05,0,0,1.41e-05,6.3e-05,1.55e-05,1.23e-05,1.32e-05,0,0,0,0,0,1.64e-05,0,1.26e-05,1.32e-05,0,0.00186,1.29e-05,0,0,0,0.00011,1.8e-05,1.2e-05,1.29e-05,0,0,1.23e-05,0,1.15e-05,0,1.31e-05,0,1.18e-05,0,0,1.32e-05,0,0,0,0.00422,2.37e-05,1.29e-05,1.16e-05,0,0,0,1.23e-05,0,0,1.45e-05,1.32e-05,0,1.16e-05,0.00081,1.4e-05,1.23e-05,0,0,0,3.14e-05,1.3e-05,1.12e-05,0,1.26e-05,0,0,1.29e-05,1.39e-05,1.4e-05,1.89e-05,1.32e-05,0,2.07e-05,0,1.13e-05,1.23e-05,0,0,3.55e-05,0.00012,1.2e-05,0,0,0,0.637,0,0,1.35e-05,1.59e-05,1.86e-05,1.76e-05,5.56e-05,1.36e-05,1.2e-05,0,0,0,0.00745,1.52e-05,1.32e-05,1.31e-05,0,0,0.000209,2.09e-05,0,0.000221,1.36e-05,0,0,0.000196,1.22e-05,0,0,0,0,0,0.000334,1.25e-05,1.19e-05,0,0,0,0,0,0,0,0,0,0,1.17e-05,1.15e-05,0,0,0,1.61e-05,1.65e-05,0,0,0,0,0,0.000808,0,0,1.1e-05,1.21e-05,1.14e-05,1.14e-05,1.16e-05,1.14e-05,0,0,0,0,1.47e-05,1.38e-05,0,0,0,1.34e-05,0.00109,0,0,0,1.15e-05,1.21e-05,1.16e-05,1.14e-05,1.22e-05,1.31e-05,1.56e-05,0.000174,2.06e-05,1.13e-05,1.16e-05],"winrateAvg":0.600742,"leadAvg":-0.22654,"scoreMeanAvg":-0.272661,"scoreStdevAvg":2.8154,"shorttermWinlossErrorAvg":0.389932,"shorttermScoreErrorAvg":0.719903,"ownership":[-98,-99,-99,-99,-99,-99,-99,-96,-82,-73,73,95,83,82,-44,-98,-99,-98,-98,-98,-99,-99,-99,-99,-99,-99,-99,-99,-99,98,94,98,-100,-100,-100,99,-98,-98,-98,-95,-100,-99,-100,-100,-99,-99,45,100,99,100,34,39,-100,100,99,-98,-98,-26,-95,99,-100,-100,-100,-100,100,100,100,100,100,100,-48,-100,100,99,-99,-99,-8,99,99,-10,-71,4,-100,-100,-4,38,57,50,59,77,-100,-100,99,99,-99,30,38,66,22,-93,3,2,-48,-10,24,53,21,-16,46,-100,99,99,98,98,78,87,68,32,13,-22,100,-91,-91,97,96,-14,-100,-98,-100,99,98,98,98,94,100,100,100,100,95,100,100,14,8,-93,-54,-73,-100,100,99,100,99,98,91,100,-99,100,95,95,100,-98,-98,-98,-86,-91,-69,-100,100,99,99,99,99,77,-99,-99,100,99,100,100,53,100,100,-99,-97,-33,-100,100,99,99,99,99,-85,-99,100,100,100,-73,-4,100,99,99,100,77,-1,-100,100,100,99,99,99,-99,-99,-100,-30,-99,-72,-100,19,100,99,100,-35,-17,-100,-100,100,99,99,99,-99,-100,-100,-100,-97,-100,-100,-36,32,100,68,30,10,-79,-85,-100,100,99,99,-100,-100,-94,-92,-99,-28,-49,-4,3,62,99,38,-97,-86,-92,-100,100,99,99,-100,-100,-100,-93,-95,85,-79,23,8,45,47,-22,-35,-88,-83,-100,100,99,99,-99,-100,-100,-100,17,76,81,-44,-26,97,97,9,-58,-100,-100,-100,-100,99,99,-99,-99,-100,100,100,100,-100,-100,-100,-100,-100,-100,-96,-98,-100,99,99,99,99,-99,-98,100,100,100,100,99,-100,-98,-99,-99,-99,-99,-99,-100,-100,99,99,98,-14,99,99,100,100,100,99,100,-98,-98,-99,-99,-99,-99,-98,-7,15,97,98],"ownershipAllowedMAE":0.0294921})%"); + lines.push_back(R"%({"sample":{"board":".OX..XO............/.X.XXOO............/X..X.XO..........O./.XXXXXO..OO....OOOX/.OOO.XOOXO.O.OOXXX./.XOX.OXXOOO..OXXOO./.XOXOOOXO.XOOOXOXO./.OXO.OXXX.XXOXXOX../.XX.X..XXX.OXXOOO../....XXX.OOOOXOX..../....XOOOOXOOXOOO.XO/....XO.XXXOXXXO.OO./.OXXO.OOX.XO.XOOOXO/.XOOOOXOXXXOOOXXOX./X.XO.XXX.XO.OX.XX.X/.XXO.XX.XOOOOXXX.X./..XOOXOXXOOXOOX..../..XO.OO.XOXXXOXX.../.XO.OO...XX.XOOX.../","hintLoc":"null","initialTurnNumber":260,"metadata":"4D5911DC8B016F40C5F232EAD17170D4:270","moveLocs":["G8","F7","D1","D8","C8","C1","T6","T8","D1","C9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000173,0,0,0.000168,0.000235,0,0,0.000168,0.000168,0.00017,0.000169,0.000169,0.00017,0.00017,0.00017,0.000171,0.000167,0.000172,0.000312,0.000168,0,0.000169,0,0,0,0,0.000163,0.000163,0.000162,0.000164,0.000167,0.000168,0.00017,0.000171,0.000184,0.000371,0.0125,0.0053,0,0.000171,0.000167,0,0.000164,0,0,0.00016,0.000642,0.000158,0.000164,0.000168,0.000168,0.000167,0.000269,0.000488,0.000227,0,0.0164,0.000164,0,0,0,0,0,0,0.00016,0.000721,0,0,0.000168,0.000171,0.000167,0.000518,0,0,0,0,0.000166,0,0,0,0.000157,0,0,0,0,0,0,0,0.000169,0,0,0,0,0,0.0208,0.000165,0,0,0,0.00016,0,0,0,0,0,0,0.000168,0.000172,0,0,0,0,0,0.0361,0.000165,0,0,0,0,0,0,0,0,0.000163,0,0,0,0,0,0,0,0,0.0185,0.000169,0,0,0,0.000164,0,0,0,0,0.000162,0,0,0,0,0,0,0,0.0892,0.0162,0.000168,0,0,0.000165,0,0.000161,0.000162,0,0,0,0.000429,0,0,0,0,0,0,0.0164,0.0022,0.000176,0.000174,0.000202,0.000149,0,0,0,0.000267,0,0,0,0,0,0,0,0.00132,0.00193,0.000257,0.000274,0.000179,0.000386,0,0.269,0,0,0,0,0,0,0,0,0,0,0,0,0.000175,0,0,0.000197,0.465,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00034,0,0,0,0,0,0,0,0,0.000113,0,0,0.00756,0,0,0,0,0,0,0.000151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000162,0,0,0.000183,0,0,0,0.000163,0,0,0,0,0,0.000167,0,0,0.000167,0,0.000166,0,0,0,0.000179,0,0,0.000157,0,0,0,0,0,0,0,0,0.000167,0,0.000163,0.000161,0.000169,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000161,0.000161,0.000162,0.000166,0.000167,0.000151,0,0,0,0,0,0.000225,0,0,0,0,0,0,0,0,0.00016,0.000163,0.000166,0.000163,0,0.000418,0,0,0,0.000183,0.000253,0.000172,0,0,0.000114,0,0,0,0,0.000165,0.000166,0.000167,0.000136],"winrateAvg":0.999038,"leadAvg":28.9312,"scoreMeanAvg":28.5838,"scoreStdevAvg":3.28169,"shorttermWinlossErrorAvg":0.00588755,"shorttermScoreErrorAvg":1.3484,"ownership":[-98,-97,-100,-90,-7,-6,100,98,98,98,98,98,98,98,98,98,98,98,99,-98,-100,-98,-100,-100,100,100,97,98,98,98,98,98,98,98,98,98,98,99,-100,-99,-98,-100,-98,-100,100,97,97,98,98,98,98,98,98,98,98,100,99,-98,-100,-100,-100,-100,-100,100,98,98,100,100,98,98,98,99,100,100,100,98,-98,-96,-97,-97,-98,-100,100,100,97,100,99,100,98,100,100,98,98,98,99,-97,-99,-97,-99,-97,-96,-100,-100,100,100,100,99,99,100,98,98,100,100,98,-98,-99,-97,-99,-97,-96,-96,-100,100,34,-98,100,100,100,98,100,99,100,99,-98,-98,-100,-96,-98,-96,-100,-100,-100,-79,-98,-98,100,98,98,100,99,98,99,-98,-100,-100,-98,-100,-98,-98,-100,-100,-100,-10,100,98,98,100,100,100,100,99,-97,-97,-97,-98,-100,-100,-100,-22,100,100,100,100,98,100,98,99,98,98,99,-97,-96,-96,-99,-100,100,100,100,100,-100,100,100,98,100,100,100,98,96,100,-97,-99,-99,-98,-100,100,-100,-100,-100,-100,100,98,98,98,100,99,100,100,100,-98,-97,-99,-99,100,100,100,100,-100,-99,-100,100,99,98,100,100,100,-99,100,-97,-99,100,100,100,100,-100,100,-100,-100,-100,100,100,100,-100,-100,100,-99,-99,-100,-98,-100,100,-5,-100,-100,-100,-100,-100,100,98,100,-100,-99,-100,-100,-98,-99,-98,-100,-100,100,-42,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-99,-100,-98,-96,-97,-100,100,100,-100,98,-100,-100,100,100,-100,100,100,-100,-100,-99,-99,-99,-96,-93,-100,100,97,99,99,-32,-100,100,-99,-99,-100,100,-100,-100,-99,-99,-99,-91,-93,63,68,99,99,28,-34,-98,-99,-99,-98,-99,100,100,-100,-99,-99,-99],"ownershipAllowedMAE":0.0144761})%"); + lines.push_back(R"%({"sample":{"board":"...X..O...OOX...X../..OOXXO.O.OXX..X.X./.O.OXX.OOOX.O.XOXX./..OXOX..X.XXOX.OXO./..OXOOX...X.X.XOXO./..OXX.XXO..X.XOOOX./.O.OX.OOXX...XXOOO./..O.XOOX.X...OXXXO./.....OXXXXO.XXOOXO./.....OOXOOOOOOOXO../.X.O...O..X....X.OO/..O.O...OXX.XXXXXXO/.XXOOXOXOOOXOOXOOOO/.X.XOOOX.XOXOOOXXXX/..XXOXO...OXXOO..OO/.XXXXXOXXXXXXXOOOOX/OOOOXOXXOOX..OXXXOX/....OO.O.OOX.X...XX/..........O......../","hintLoc":"null","initialTurnNumber":234,"metadata":"8C1C42E15DADF01EAE1082E938071119:244","moveLocs":["M12","B8","A8","C9","B10","K16","K15","H16","J15","B11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000391,0.000542,0.00886,0,0.00142,0.000633,0,0.0143,0.014,0.0134,0,0,0,0.000318,0.000319,0.000337,0,0.000336,0.000316,0.000337,0.00054,0,0,0,0,0,0.000287,0,0.00987,0,0,0,0.000327,0.000347,0,0.000347,0,0.000323,0.000315,0,0,0,0,0,0.000733,0,0,0,0,0.000346,0,0.000366,0,0,0,0,0.0376,0.00031,0.000312,0,0,0,0,0.000474,0,0,0,0,0,0,0,0.00599,0,0,0,0.0558,0.000314,0.000311,0,0,0,0,0,0.00046,0,0,0,0.000343,0,0.000439,0,0,0,0,0.000809,0.000313,0.000321,0,0,0,0.000524,0,0,0,0.000352,0.000338,0,0.000348,0,0,0,0,0,0.00223,0.000375,0,0,0,0,0.000407,0,0,0,0,0.000423,0.000345,0.000321,0,0,0,0,0,0.000994,0.000534,0.000395,0,0.00639,0,0,0,0,0.000303,0,0.00187,0,0.000424,0,0,0,0,0,0.000514,0.0127,0,0.000692,0.00834,0.00841,0,0,0,0,0,0,0.00195,0,0,0,0,0,0,0.00111,0.000436,0,0.275,0.000632,0.000948,0,0,0,0,0,0,0,0,0,0,0,0,0.0184,0.0006,0.00873,0,0,0,0.000374,0.000394,0.000712,0,0.00339,0.0259,0,0.000494,0.000451,0.000452,0.00047,0,0.0424,0,0,0,0,0,0,0,0.000314,0.000451,0.178,0,0,0,0.000454,0,0,0,0,0,0,0,0.00163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000311,0,8.28e-05,0,0,0,0,0,0.0231,0,0,0,0,0,0,0,0,0,0,0.000394,0.00013,0,0,0,0,0,0.00724,0.000515,0.00858,0,0,0,0,0,0.000133,0.000131,0,0,0.00377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000358,0.000394,0,0,0,0,0,0,0.00037,0.00036,0.00922,0.00903,0,0,0.0822,0,0.0116,0,0,0,0.000411,0,0.000339,0.000322,0.000353,0,0,0.000317,0.000412,0.000895,0.00108,0.000657,0.000612,0.000463,0.00128,0.0147,0.00325,0,0.0303,0.000452,0.000333,0.000314,0.000316,0.00032,0.000312,0.000114,0.000347],"winrateAvg":0.999232,"leadAvg":4.62409,"scoreMeanAvg":4.62079,"scoreStdevAvg":1.57904,"shorttermWinlossErrorAvg":0.0121472,"shorttermScoreErrorAvg":0.460121,"ownership":[100,100,49,-56,-60,-23,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,26,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-86,100,100,100,-100,-100,-100,-1,100,-100,100,-100,-100,-100,-100,26,100,-100,99,-51,100,100,100,-100,-100,-100,-100,-26,-100,-100,-100,-100,-100,-99,-99,100,-100,100,95,100,100,100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,100,100,100,100,100,98,100,67,66,-100,-4,100,100,-100,-100,-99,-99,-100,-100,-100,100,100,100,100,88,98,100,-27,-100,100,100,-100,-100,-100,57,-100,-100,-100,-100,-100,-100,100,100,17,99,14,3,-33,100,-100,-100,-100,-100,100,63,-100,-100,100,100,-100,100,100,2,-99,-85,40,39,100,100,-100,100,100,100,100,100,100,100,-100,99,99,100,-97,-99,100,100,95,99,100,100,100,32,-100,-20,35,33,-41,-100,-19,100,100,-99,100,100,100,100,99,99,-42,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-99,-100,-100,100,100,99,100,-99,100,100,100,-100,100,100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,-99,57,18,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,-79,-20,35,100,-100,-100,100,100,3,2,100,100,13,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,100,-100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,9,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,65,-97,-99,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0169564})%"); + lines.push_back(R"%({"sample":{"board":".................../..XX.............../..O..XX.OOX...XXO../...O.XOXXX.X..XOO../...O.XO..OOOX....O./..OXXXXOO..XX.X.OXO/..O.OXO.X.X...O.OXO/.....OOOOX.....OXX./.OOOOX.X..XX...OOX./..XOXX.XXXOO.OOXXXX/.O.XO.OOXOO...OXOOO/.X.XO.OOOXO..OXXO.X/..X.X..OX..OOOXXOOX/...X.......OXXXO.OO/","hintLoc":"null","initialTurnNumber":144,"metadata":"B24534946196C9903282AD742B4D306B:154","moveLocs":["D8","T7","R1","L11","E7","Q1","B12","M12","N13","N11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":14},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.82e-05,7.23e-05,6.71e-05,6.65e-05,7.1e-05,7.92e-05,0.000224,0.0002,0.000389,0.000668,0.000361,0.000724,0.000243,0.000167,0.000152,8.21e-05,7.1e-05,7.1e-05,6.64e-05,7.15e-05,7.27e-05,0,0,7.09e-05,8.47e-05,0.000245,0.00186,0.00719,0.000606,0.259,0.562,0,0.000487,0.00088,8.82e-05,0.00032,7.24e-05,7.16e-05,7.08e-05,0,0,9.97e-05,6.68e-05,0,0,0.000882,0,0,0,0,0.13,0.000211,0,0,0,7.45e-05,6.84e-05,8.9e-05,0.00264,0.000129,0,6.94e-05,0,0,0,0,0,0,0,0,0.000537,0,0,0,6.92e-05,7.27e-05,8.95e-05,0.00147,0.000103,0,6.82e-05,0,0,9.48e-05,0.000107,0,0,0,0,9.55e-05,8.96e-05,0.000331,7.68e-05,0,0.000216,0.000104,0.0002,0,0,0,0,0,0,0,0.000196,7.66e-05,0,0,7.57e-05,0,8.55e-05,0,0,0,7.82e-05,0.000132,0,0,7.36e-05,0,0,6.02e-05,0,0.00026,0,6.98e-05,7.66e-05,0.000124,0,7.45e-05,0,0,0,7.52e-05,0.000267,0.000196,0.000209,0,0,0,0,0,0,6.65e-05,7.45e-05,7.67e-05,7.65e-05,7.69e-05,0,0,0,0,7.68e-05,0,0,0,0,0,7.88e-05,0,7.26e-05,7.4e-05,0,0,7.75e-05,7.63e-05,7.17e-05,0,0,0,4.79e-05,8.02e-05,0.000199,0,0,0,0,8.07e-05,0,0,0,0,0,7.46e-05,0,0,0,0,0,0,0.000137,0,0.00109,0,0,8.97e-05,0,0,0,0,0,6.63e-05,6.91e-05,6.75e-05,0,0,0,0,0,7.3e-05,0,7.69e-05,0,0,7.63e-05,0,0,0,0,0,6.81e-05,6.68e-05,0,0,0,0,4.22e-05,0,6.81e-05,7.1e-05,0,6.47e-05,0,7.63e-05,7.13e-05,0,0,7.44e-05,6.45e-05,0,0,0,0,0,0,0,0,6.75e-05,7.02e-05,6.41e-05,0,6.55e-05,7.37e-05,7.76e-05,7.28e-05,6.85e-05,6.55e-05,6.55e-05,0,0,0,0,0,0.0175,0,0,6.9e-05],"winrateAvg":0.991062,"leadAvg":8.21485,"scoreMeanAvg":8.43737,"scoreStdevAvg":8.06363,"shorttermWinlossErrorAvg":0.0409681,"shorttermScoreErrorAvg":2.28013,"ownership":[-62,-78,-87,-94,-95,-93,-88,-79,-73,-71,-74,-78,-84,-82,-65,-40,7,29,58,-51,-50,-98,-99,-94,-96,-87,-81,-72,-68,-66,-85,-95,-87,-86,-36,-5,73,72,-17,-50,68,-57,-37,-100,-100,-78,-67,-66,-67,-68,-89,-89,-97,-96,99,80,85,14,52,59,89,20,-100,-88,-95,-95,-94,-61,-69,-70,-85,-96,99,99,94,92,59,70,87,89,-29,-100,-88,-86,-75,-63,-63,-65,-97,-76,-60,-2,72,99,96,80,88,98,-99,-100,-100,-99,-62,-63,-78,-82,-97,-97,-50,-84,18,99,72,97,88,94,97,-100,-92,-99,-62,-64,-89,-90,-97,-54,17,13,96,75,99,72,96,91,94,84,68,-91,-63,-61,-63,-65,-97,-79,-42,11,40,63,99,73,71,95,78,98,98,98,98,-92,-82,-94,-88,-95,-97,-97,-3,28,75,99,98,69,75,55,59,28,98,-92,-92,24,-95,-95,-95,100,100,33,100,100,70,68,67,67,-38,67,28,-82,94,57,99,99,-95,100,100,97,95,97,100,68,68,67,67,-56,-93,-78,-91,94,48,99,99,99,98,100,99,97,100,72,68,68,70,68,-91,-93,-95,-92,-92,5,30,99,94,98,99,100,100,100,71,69,68,68,68,-91,-94,-94,-94,-71,-21,25,70,93,98,99,100,76,74,72,69,70,68,68],"ownershipAllowedMAE":0.0546354})%"); + lines.push_back(R"%({"sample":{"board":".O...........X.O../.XOOOOOOX..OOXO.O./.XXXXXXOXXXXOOXO../...O..XXOOOXX.XOO./.......O..OOX.XOX./....XO..O..XOOOX.X/..OOX.....X..OX.X./..XXXX...OOOOOX.../....O......XOXX.X./.........X.XX...O./..O..O..XO..OO.O../....OX.....XXO..O./.....OX......O..O./......X.....XXOOX./..OOO.........XXX./..XX.X.......X..../......X.........../................../","hintLoc":"null","initialTurnNumber":121,"metadata":"83EFE25CBF83950D3B13F436DD21DA60:131","moveLocs":["H7","G7","H8","G8","J7","H9","J9","J10","L9","J8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.95,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.63e-05,0,1.96e-05,1.74e-05,1.79e-05,1.84e-05,1.7e-05,1.8e-05,1.71e-05,1.9e-05,1.81e-05,1.75e-05,1.78e-05,0,1.82e-05,0,1.74e-05,1.68e-05,1.86e-05,0,0,0,0,0,0,0,0,1.72e-05,1.9e-05,0,0,0,0,1.75e-05,0,1.72e-05,1.94e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.73e-05,1.84e-05,1.93e-05,2.27e-05,3.64e-05,0,2.73e-05,1.97e-05,0,0,0,0,0,0,0,2e-05,0,0,0,1.97e-05,1.99e-05,2.2e-05,4.19e-05,1.99e-05,0.000293,0.0244,0.000158,0,1.83e-05,1.75e-05,0,0,0,1.86e-05,0,0,0,2.82e-05,1.98e-05,2.45e-05,1.81e-05,2.08e-05,0,0,1.94e-05,1.92e-05,0,1.78e-05,1.84e-05,0,0,0,0,0,0,0,2.24e-05,2.58e-05,0,0,0,1.75e-05,2.1e-05,1.99e-05,1.82e-05,1.87e-05,0,1.81e-05,1.72e-05,0,0,3.06e-05,0,1.9e-05,2.23e-05,0.000739,0,0,0,0,2.22e-05,2.17e-05,2.3e-05,0,0,0,0,0,0,9.33e-05,0.000244,4.64e-05,2.42e-05,0.136,0.000221,2.13e-05,0,2.24e-05,2.42e-05,0.000179,0,0.0093,2.94e-05,0,0,0,0,0.0177,0,0.000548,2.28e-05,0.0376,2.56e-05,2.26e-05,2.32e-05,2.46e-05,0.0343,0,0,0,0,0,0,2.16e-05,1.92e-05,1.85e-05,0,1.93e-05,2.15e-05,2.38e-05,0,2.31e-05,3.47e-05,0,0,0,0,0,0.151,0.326,0,0,1.79e-05,0,1.52e-05,1.84e-05,2.03e-05,2.36e-05,2.23e-05,2.05e-05,0,0,0,0,0,0.000931,0.00346,0,0,0,1.82e-05,1.77e-05,0,1.77e-05,2.04e-05,2.22e-05,2.35e-05,2.31e-05,2.25e-05,0,0,1.96e-05,1.87e-05,4.65e-05,6.23e-05,0.000234,0.166,0,1.85e-05,1.85e-05,0,1.84e-05,2.05e-05,4.23e-05,2.02e-05,2e-05,2.08e-05,8.02e-05,0,3.28e-05,2.21e-05,2.05e-05,2.16e-05,8.27e-05,0,0,0,0,0,1.99e-05,2.09e-05,6.32e-05,0,0,0,0.0378,8.32e-05,1.98e-05,2.04e-05,2e-05,2.01e-05,2.12e-05,3.17e-05,2.16e-05,0,0,0,2.04e-05,1.91e-05,0.00899,0,0,0.0394,0,0.000111,2.43e-05,2.08e-05,2.05e-05,2.08e-05,2e-05,2.22e-05,0,1.82e-05,1.8e-05,1.81e-05,1.78e-05,1.84e-05,2.23e-05,4.38e-05,7.61e-05,5.16e-05,0.000106,0,2.14e-05,2.01e-05,2.05e-05,1.97e-05,2.04e-05,1.98e-05,2.1e-05,1.85e-05,1.8e-05,1.73e-05,1.81e-05,1.82e-05,2.09e-05,2.07e-05,2.01e-05,4.19e-05,3.5e-05,1.97e-05,1.84e-05,1.87e-05,1.86e-05,1.85e-05,1.82e-05,1.82e-05,1.79e-05,1.78e-05,1.72e-05,1.78e-05,1.74e-05,2.12e-05],"winrateAvg":0.21045,"leadAvg":-1.83229,"scoreMeanAvg":-2.61927,"scoreStdevAvg":7.839,"shorttermWinlossErrorAvg":0.189534,"shorttermScoreErrorAvg":1.19324,"ownership":[-50,41,36,77,82,85,89,91,92,95,97,97,99,98,99,99,99,99,-74,-96,90,91,91,91,91,92,91,95,96,99,99,98,100,99,100,98,-91,-96,-96,-95,-95,-95,-96,93,92,92,92,92,99,99,95,100,99,98,-89,-88,-75,-53,-52,-33,-95,-96,99,99,99,92,92,97,96,100,100,66,-85,-84,-82,-80,-67,47,8,92,91,95,99,99,92,98,96,100,-90,-31,-79,-79,-83,-88,-99,65,37,51,97,92,96,95,100,100,100,-93,-91,-92,-73,-77,-73,-73,-99,-48,-5,-30,-11,92,91,98,99,100,-94,-93,-93,-89,-44,-78,-99,-99,-99,-99,-36,-18,24,100,100,100,100,100,-95,-80,-87,-77,-24,-21,-25,-34,39,-28,-30,-26,-59,34,26,-52,100,-95,-95,2,-86,7,15,16,7,10,13,-28,-32,-69,-2,-22,73,-53,-61,-19,-7,15,91,29,42,54,83,37,16,21,-98,40,-1,62,46,50,98,97,40,96,89,85,52,59,60,46,73,-98,-98,36,36,-21,-8,-80,-79,97,94,94,96,87,49,51,61,55,27,31,-98,-26,-21,-53,-38,-55,55,97,92,92,97,8,34,67,63,57,29,-33,-98,-52,-57,-64,-68,-70,-97,-98,93,93,-99,-3,8,-8,85,85,85,31,-69,-69,-73,-79,-80,-81,-84,-96,-100,-100,-100,-96,-27,-38,-90,-89,51,-96,-74,-76,-80,-83,-84,-85,-88,-99,-98,-98,-99,-98,-37,-70,-76,-87,-90,-91,-97,-84,-85,-84,-85,-87,-91,-96,-98,-98,-98,-98,-57,-70,-77,-84,-86,-90,-90,-88,-85,-84,-85,-87,-90,-94,-96,-97,-98,-98],"ownershipAllowedMAE":0.030458,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":"..............X.X../......O....OXOOX.X./..OO.O.....OOXOOX../.OOXXOX......X.OX../.XXOXOOX....O.OXX../.X..XXXOOOOOXOOO.../.XO....XXXXOXXXOOX./X..OOOOX..XXOX.OX../OXXXXXXXO.XO.X..XX./OX....OXOOOXO.XXO../.OX.XO.O..OX...XO../.O.XOOOOOOXXXXOXX../..OOOX....XO.OOOX../.O...X.O.OO..OOXXX./.X.XX.XO...OO..OOOO/..XX.XXO.X.OXO.OXXO/.X.XXOXO.X.OXO.OXO./XOXOOOOOX..XXXXXXO./.OO..............X./","hintLoc":"null","initialTurnNumber":209,"metadata":"109BBAD06771BDAA87B9F7AA6FAD4F2B:219","moveLocs":["A9","F10","N7","A6","A7","E17","E18","A5","T6","T7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.38,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000283,0.000292,0.00029,0.000295,0.000281,0.000284,0.000275,0.00028,0.000284,0.000284,0.00028,0.000285,0.00187,0.141,0,0,0,0.00109,0.000274,0.000295,0.000308,0.000294,0.000322,0,0.000328,0,0.000288,0.000286,0.000285,0.000281,0,0,0,0,0,0,0,0.000309,0.00034,0.000299,0,0,0,0,0.000315,0.000289,0.000283,0.000285,0.000282,0,0,0,0,0,0,0.000291,0.00029,0.0123,0,0,0,0,0,0,0.000325,0.000293,0.000295,0.000293,0.000296,0.000612,0,0.00328,0,0,0.000299,0.000296,0.0226,0,0,0,0,0,0,0,0.000335,0.00029,0.000293,0.000335,0,0.00137,0,0,0,0.000304,0.000289,0.00035,0,0.000366,0.0106,0,0,0,0,0,0,0,0,0,0,0,0,0.0535,0.000411,0.000298,0.00454,0,0,0.000528,0.000528,0.000397,0.0107,0,0,0,0,0,0,0,0,0,0,0,0.0005,0,0.00979,0.00956,0,0,0,0,0,0.000426,0.000417,0,0,0,0,0.00118,0,0,0.000691,0.000374,0,0,0,0,0,0,0,0,0,0.000428,0,0,0.00336,0,0.00171,0.0128,0,0,0.000318,0,0,0.000322,0.000461,0.000489,0,0,0,0,0,0,0,0,0.00104,0,0,0,0.000308,0.000297,0,0,0,0.0116,0,0,0.000604,0,0.00031,0.000317,0,0,0.00132,0.0103,0.0695,0,0,0.000274,0.000279,0.000289,0,0.0839,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.0105,0,0.000432,0,0,0,0,0.00468,0.000398,0.000447,0.0441,0,0,0,0,0,0,0,0.0104,0,0,0,0.237,0.00418,0.00546,0,0.00588,0,0.000387,0,0,0.000321,0.000302,0,0,0,0,0,0,0,0,0.000361,0,0,0,0,0,0.000465,0.0085,0.00037,0,0,0.000313,0.000313,0,0,0,0,0.00036,0.00038,0,0,0,0,0,0,0.00246,0,0.00244,0,0,0,0.000414,0,0,0,0,0.0102,0,0.00695,0,0,0,0,0,0.0342,0,0.0251,0,0,0,0.00938,0,0,0,0.000457,0,0,0,0,0,0,0,0,0,0.00471,0.00295,0,0,0,0,0,0,0,0.000423,0.000139,0,0,0.000361,0.000285,0.000292,0.000368,0.0148,0.0202,0.000862,0.00181,0.000326,0.000292,0.00029,0.000279,0.000308,0.01,0,0.000332,0.00031],"winrateAvg":0.00177326,"leadAvg":-2.25336,"scoreMeanAvg":-2.28092,"scoreStdevAvg":1.69745,"shorttermWinlossErrorAvg":0.0183697,"shorttermScoreErrorAvg":0.477025,"ownership":[100,100,100,100,100,100,100,100,100,100,100,100,99,87,-98,-98,-100,-100,-100,99,99,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,99,100,100,-100,100,100,100,100,100,100,100,100,99,100,100,-100,-100,-100,9,100,100,-100,-100,100,99,100,100,100,100,100,100,99,99,100,-100,-100,-100,11,-100,-100,-100,-100,100,100,99,100,99,100,100,100,100,100,-100,-100,-100,-100,-89,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,100,100,0,-100,-100,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-34,-59,-100,-100,-100,-100,7,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,66,-100,-100,-100,-100,-64,-18,-100,-100,-100,100,-100,-100,-100,-100,-100,45,-100,100,100,100,-100,-99,-100,-100,-100,-100,-100,-100,100,100,-100,-99,-100,100,42,100,100,100,100,-100,-100,-99,-41,-100,-100,-100,-100,99,100,50,-99,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-99,99,98,100,100,100,-100,-31,52,55,22,-100,100,100,100,100,100,-100,-99,-99,-100,99,94,42,-42,-100,-11,100,70,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,-38,-100,-100,-100,-100,100,13,55,76,100,100,100,100,100,100,100,100,-99,-99,-100,-100,-100,-100,-100,100,-36,-100,-1,100,-100,100,100,100,-100,-100,100,-97,-100,-12,-100,-100,100,-100,100,47,-100,2,100,-100,100,-4,100,-100,99,99,-97,99,-17,100,100,100,100,100,-100,-99,-100,-100,-100,-100,-100,-100,-100,99,71,33,99,99,99,100,98,87,-11,-38,-99,-100,-100,-100,-100,-100,-100,-99,-99,-63],"ownershipAllowedMAE":0.0193718})%"); + lines.push_back(R"%({"sample":{"board":"....O............O./.X.OXO.......XOOXX./....X.O..OOX.XXXOOO/...X.....OX.X..OXXO/.XX..O...OXOX..XX.X/.XOO..XOXXO.X.OOO../.O...OO.OXO..XXXO../..O...XO.OOOOOOXXX./......XOOXXXXXOOOX./.......OX.....X.XO./.OO....OX...O..XX../.XXO.XXXXX......O../.XOO..O.OOX...XX.../.O..X...OXOOOOXOX../.OXXOO.....OXXO.XX./.X..XO.OOOOXX.OO.O./.XXXXXOOXXOX.O..O../......XOX.XXXXO..../......O..X.X.XO..../","hintLoc":"null","initialTurnNumber":181,"metadata":"C6F0B27156DF8667D0F33A5D234A3C91:191","moveLocs":["O10","M9","P9","Q8","L9","M8","N10","F6","M10","G5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0button1","komi":11.5,"policyOptimism":0.975,"pda":0.0,"policyMixture":[7.89e-06,0.0498,0.00059,0.00152,0,0.000138,7.55e-06,5.12e-06,5.11e-06,9.35e-06,2.27e-05,5.65e-05,1.33e-05,9.99e-06,5.12e-06,4.4e-06,0.0047,0,9.21e-06,0.000131,0,0.168,0,0,0,8.13e-06,9.24e-06,5.71e-06,1.15e-05,7.52e-05,0.000327,2.98e-05,0,0,0,0,0,0.00422,3.84e-05,0.00187,0.0738,0.0887,0,0.000558,0,5.28e-06,4.56e-06,0,0,0,6.1e-06,0,0,0,0,0,0,3.21e-05,0.000241,0.000152,0,0.000234,3.25e-05,1.01e-05,5.51e-06,3.91e-06,0,0,0.000135,0,4.4e-06,4.64e-06,0,0,0,0,5.44e-05,0,0,0.000362,2.56e-05,0,5.61e-06,4.94e-06,4.3e-06,0,0,0,0,3.88e-06,0.00449,0,0,0.00438,0,0.000445,0,0,0,8.51e-06,5.88e-06,0,0,0,0,0,8.67e-06,0,5.13e-06,0,0,0,4.07e-06,0.00224,1.63e-05,0,4.44e-06,5.13e-06,5.55e-06,0,0,3.69e-06,0,0,0,4.87e-06,6.78e-06,0,0,0,0,4.63e-06,3.77e-06,5.47e-06,4.56e-06,0,5.94e-06,8.64e-06,1e-05,0,0,4.03e-06,0,0,0,0,0,0,0,0,0,3.8e-06,4.06e-06,5.2e-06,5.8e-06,9.93e-06,3.65e-05,2.78e-05,0,0,0,0,0,0,0,0,0,0,0,0,4.33e-06,3.82e-06,4.68e-06,6.74e-06,1.51e-05,0.000162,0.000711,0.000179,0,0,0.166,5.98e-05,0,0,0,0,0.000176,0,0,4.74e-06,4.12e-06,0,0,1.66e-05,0.00862,0.00101,0.000247,0,0,5.97e-06,0,0,0,8.7e-06,0,0,0,5.94e-05,4.64e-06,1.93e-05,0,0,0,0.00247,0,0,0,0,0,0.00283,0,0.000138,4.22e-05,9.93e-06,0,0,1.6e-05,6.85e-06,2.09e-05,0,0,0,0.000797,0.00256,0,0.0105,0,0,0,5.15e-05,1.28e-05,0.000127,0,0,7.6e-05,0.00013,0.000337,8.08e-06,0,4.6e-05,4.93e-05,0,0,0.0107,0.000962,0,0,0,0,0,0,0,0,0,2.77e-05,0.000404,8.96e-06,0,0,0,0,0,0,2.91e-05,8.67e-06,2.23e-05,3.31e-06,0,0,0,0,2.66e-05,0,0,0.00083,1.17e-05,0,5.34e-06,5.5e-06,0,0,0.374,0,0,0,0,0,0,7.91e-06,0,0,3.76e-05,0,0.000126,5.48e-06,0,0,0,0,0,0,0,0,0,0,0,3.8e-06,0,6.83e-06,5.64e-06,0,1.53e-05,1.19e-05,4.77e-06,6.26e-06,7.08e-06,9.5e-06,1.71e-05,0.000274,0,0,0,0,0,0,0,0,0,7.88e-06,8.95e-06,1.38e-05,8.86e-06,4.2e-06,8.22e-06,1.17e-05,6.71e-05,0.000141,3.84e-05,0,1.57e-05,0.00672,0,0,0,0,0,0,4.97e-06,6.99e-06,7.08e-06,3.83e-06,1.24e-05],"winrateAvg":0.993964,"leadAvg":8.47156,"scoreMeanAvg":8.63357,"scoreStdevAvg":6.10168,"shorttermWinlossErrorAvg":0.0214032,"shorttermScoreErrorAvg":1.90012,"ownership":[-80,-58,-27,67,93,92,92,87,82,43,26,-33,-75,-94,-97,-97,-96,-95,-97,-86,-94,-21,85,-7,99,95,93,89,91,20,-10,-86,-100,-94,-94,-99,-99,-98,-91,-90,-23,37,-5,39,99,93,94,100,100,-84,-80,-100,-100,-100,-97,-97,-97,-91,-90,-48,-69,19,19,90,93,95,100,-4,-1,-100,-98,-98,-97,-100,-100,-97,-84,-93,-93,1,8,98,93,92,98,100,-5,50,-100,-98,-97,-100,-100,-98,-100,-15,-93,100,100,80,88,84,100,97,97,100,-2,-100,-98,-96,-96,-96,-98,-97,11,99,96,79,75,100,100,98,100,97,100,53,-40,-100,-100,-100,-96,-98,-98,92,94,100,66,62,64,18,100,98,100,100,100,100,100,100,-100,-100,-100,-97,92,91,73,58,47,42,18,100,100,44,45,44,42,42,100,100,100,-100,-98,94,93,69,55,34,24,48,100,-95,44,68,98,99,99,23,30,-100,-96,-98,96,100,100,58,39,-48,-14,100,-95,-42,83,-28,98,50,85,-100,-100,-97,-97,98,93,93,99,-26,-96,-96,-95,-95,-95,14,-22,18,-11,-45,-100,-96,-97,-96,95,92,99,99,-33,-69,28,-26,99,99,-1,43,40,-27,-100,-100,-98,-95,-94,76,95,-52,-92,-98,-97,-2,35,99,95,100,100,100,99,-100,-21,-99,-95,-93,-48,94,-100,-100,79,79,-9,33,77,98,98,100,-100,-99,97,-23,-99,-99,-37,-69,-100,-99,-98,-100,80,80,100,100,100,100,-99,-99,-48,97,98,-8,96,27,-96,-100,-100,-100,-100,-100,100,100,-98,-98,100,-99,-74,91,92,96,97,95,91,-95,-93,-92,-80,-67,-28,-23,100,-98,-98,-99,-99,-99,-99,97,97,94,92,95,-91,-86,-71,-50,-19,24,87,68,-24,-99,-98,-99,-99,-99,97,95,95,95,94],"ownershipAllowedMAE":0.0509626})%"); + lines.push_back(R"%({"sample":{"board":".........X........./........OXOOXXO..../.....O..X.XOOX...../...X.....XXXOX.O.../..........XOOXO.OO./.........XOXOXXXX../........XOOXO.X..X./..........XXOOOOX.X/.........X.OXO.OOX./.........OOOXXOOXX./..........OXXXOOOXO/.........OXOX.OXOOX/......X...XOXXOXOX./..X.X....OOOOXOXXXX/.XOX.O....X.OXX..X./.OOO....OXOXOOXXXXO/...OXX..OO.XXXOOOXO/..OX.X......OO.OXO./....X.............O/","hintLoc":"null","initialTurnNumber":32,"metadata":"347E084BE6B56145D6D5B2713040F93A:42","moveLocs":["T7","P2","R1","T8","O19","M19","T7","Q1","P1","T8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":-4.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.15e-05,6.8e-05,6.76e-05,6.83e-05,6.67e-05,6.64e-05,6.37e-05,6.06e-05,0.0439,0,0.0961,0,0.013,0,0.00152,6.69e-05,6.23e-05,6.19e-05,5.94e-05,6.72e-05,8.12e-05,0.000202,0.000383,0.000116,6.93e-05,7.1e-05,7.28e-05,0,0,0,0,0,0,0,0.000155,0.000118,6.21e-05,6.23e-05,6.69e-05,0.000115,0.00544,0.00861,7.56e-05,0,6.36e-05,0.00056,0,0,0,0,0,0,0.000117,9.58e-05,6.9e-05,5.96e-05,5.96e-05,6.72e-05,0.000143,0.00799,0,0.000589,6.93e-05,6.85e-05,6.08e-05,0.00197,0,0,0,0,0,5.74e-05,0,5.92e-05,5.83e-05,5.92e-05,6.67e-05,0.000132,0.00042,0.00228,0.000423,9.41e-05,7e-05,6.32e-05,6.31e-05,0.0398,0,0,0,0,0,5.7e-05,0,0,5.96e-05,6.54e-05,9.13e-05,0.000452,0.000342,0.000156,8.27e-05,7.11e-05,6.09e-05,0.0528,0,0,0,0,0,0,0,0,5.9e-05,6.06e-05,6.44e-05,7.66e-05,0.000214,0.000174,9.23e-05,7.92e-05,6.84e-05,0.000127,0,0,0,0,0,4.78e-05,0,9.82e-05,0.00125,0,5.57e-05,6.38e-05,7.39e-05,0.000165,0.000128,8.2e-05,7.53e-05,6.89e-05,6.88e-05,0.484,0.196,0,0,0,0,0,0,0,0,0,6.37e-05,7.35e-05,0.000189,0.000156,8.61e-05,7.78e-05,7.35e-05,6.49e-05,0.000245,0,0.00975,0,0,0,4.31e-05,0,0,0,4.96e-05,6.34e-05,7.53e-05,0.000254,0.000242,0.000111,9.71e-05,9.84e-05,0.000126,7.87e-05,0,0,0,0,0,0,0,0,0,6.01e-05,6.39e-05,7.75e-05,0.000206,0.000225,0.000136,0.000134,0.000131,7.35e-05,6.1e-05,5.86e-05,0,0,0,0,0,0,0,0,0,6.36e-05,7.45e-05,0.000186,0.000105,0.00016,8.65e-05,7.65e-05,7.7e-05,5.93e-05,0,0,0,0,5.3e-05,0,0,0,0,0,6.45e-05,0.00018,0.000202,0.00322,0.000141,0.000758,0,7.08e-05,6.03e-05,5.6e-05,0,0,0,0,0,0,0,0,0,6.69e-05,0.000835,0,0.00144,0,0.00353,8.38e-05,9.5e-05,6.22e-05,0,0,0,0,0,0,0,0,0,0,7.29e-05,0,0,0,0.0064,0,0.000115,7.28e-05,5.98e-05,5.93e-05,0,5.96e-05,0,0,0,8.69e-05,6.53e-05,0,4.29e-05,6.38e-05,0,0,0,0.000134,6.31e-05,7.76e-05,6.36e-05,0,0,0,0,0,0,0,0,0,0,0,6.21e-05,6.07e-05,5.59e-05,0,0,0,6.58e-05,6.27e-05,0,0,5.83e-05,0,0,0,0,0,0,0,0,6.67e-05,6.45e-05,0,0,0,0,0.000106,0.000789,6.38e-05,6.11e-05,5.88e-05,5.89e-05,0,0,5.76e-05,0,5.68e-05,0,0.000111,6.11e-05,6.23e-05,0.000302,6.96e-05,0,6.1e-05,6.8e-05,6.34e-05,6.35e-05,6.15e-05,5.82e-05,5.82e-05,5.89e-05,5.93e-05,0,6.31e-05,0,6.27e-05,0,6.66e-05],"winrateAvg":0.0109895,"leadAvg":-24.4447,"scoreMeanAvg":-23.1244,"scoreStdevAvg":19.724,"shorttermWinlossErrorAvg":0.0479457,"shorttermScoreErrorAvg":8.59269,"ownership":[-27,-28,-26,-27,-29,-34,-44,-61,-78,-98,-70,-95,-82,-9,-15,20,39,51,55,-28,-28,-30,-29,-34,-31,-43,-59,-55,-99,23,25,-99,-100,20,-3,43,51,55,-27,-32,-41,-44,-41,-12,-43,-48,-98,-97,-100,25,26,-100,-41,-8,48,52,53,-25,-29,-36,-82,-46,-41,-44,-52,-63,-100,-100,-99,29,-100,-41,55,50,54,52,-22,-26,-31,-35,-38,-40,-40,-46,-59,-81,-100,36,33,-100,-5,-41,58,60,23,-18,-19,-20,-25,-27,-29,-32,-42,-61,-96,-93,-99,41,-100,-100,-100,-99,-45,-32,-15,-17,-17,-19,-20,-22,-27,-34,-93,-89,-92,-99,46,-72,-100,-77,-94,-99,-87,-15,-16,-15,-16,-16,-17,-19,-28,-26,-92,-98,-99,48,48,50,48,-98,-97,-99,-17,-18,-16,-15,-15,-15,-16,-22,-51,-97,-21,81,-94,48,-4,50,50,-99,-95,-22,-23,-19,-16,-16,-15,-11,-1,-10,76,79,82,-94,-95,49,48,-99,-99,-80,-28,-30,-24,-21,-18,-14,-8,-1,11,44,75,-95,-95,-94,48,50,50,-99,21,-34,-31,-30,-27,-23,-20,-15,4,9,68,41,97,-95,-27,51,-92,52,56,29,-29,-52,-38,-29,-34,-35,-71,-18,-37,41,35,99,-95,-94,54,-92,55,-87,26,-13,-6,-67,-54,-74,3,-6,12,17,98,99,99,99,-93,59,-92,-91,-89,-89,33,-7,79,-63,22,62,12,15,37,89,85,93,99,-93,-93,-49,-73,-93,51,44,81,80,81,18,3,19,33,98,86,93,86,99,99,-93,-93,-94,-94,97,63,61,74,82,-50,-51,7,30,98,98,88,85,86,86,100,100,100,-95,99,64,57,73,-39,-36,-47,-23,13,63,83,88,90,100,100,99,100,99,100,98,61,57,47,-16,-43,-33,-17,10,40,61,77,90,95,98,100,99,100,99,99],"ownershipAllowedMAE":0.0836758})%"); + lines.push_back(R"%({"sample":{"board":".................X./..XOXOOX...O....X../..XXXXOX...OXXXXOXX/..XOXOOX....OOOOOOX/.....O.X...O...XOXX/...X............OOX/.....O..X.........O/...O.....XO......../....OOXXXOO......../.....X.XXXO......../....OOX..OO......../......O.X...OO.O.../..O......XXXXXO..../.......OX.O..OXO.../..O..O..O.....XXX../..XO.OXXX........../..X.OXXO.X.....X.../....OX............./....O............../","hintLoc":"null","initialTurnNumber":113,"metadata":"ABCFE218845A8D2C262ECF1136AE428C:123","moveLocs":["C13","D13","C14","S13","S11","L13","K14","K13","G12","H8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.66,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1button1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.75e-06,7.87e-06,8.41e-06,8.88e-06,9.52e-06,8.47e-06,8.86e-06,9.37e-06,9.48e-06,9.68e-06,8.73e-06,1.08e-05,8.46e-05,0.00119,0.000248,0.00466,1.02e-05,0,8.88e-06,8.25e-06,8.04e-06,0,0,0,0,0,0,1.03e-05,1.09e-05,9.27e-06,0,0.00621,2.88e-05,3.99e-05,5.08e-05,0,8.03e-05,0.000847,9e-06,8.71e-06,0,0,0,0,0,0,9.38e-06,2.12e-05,1.01e-05,0,0,0,0,0,0,0,0,9.12e-06,1.43e-05,0,0,0,0,0,0,9.84e-06,0.000267,2.12e-05,9.67e-06,0,0,0,0,0,0,0,9.03e-06,0.000103,2.65e-05,7.38e-05,0.00145,0,9.55e-06,0,1.14e-05,0.000145,0.000209,0,8.88e-06,8.29e-06,8.14e-06,0,0,0,0,9.32e-06,9.17e-06,0,0,3.32e-05,1.22e-05,1.95e-05,4.15e-05,0.037,0,0.0981,1.11e-05,1.01e-05,8.98e-06,8.62e-06,8.55e-06,0,0,0,9.08e-06,8.88e-06,0,0,1.61e-05,0,8.74e-06,3.97e-05,0,0,0,0.321,4.83e-05,1.02e-05,8.98e-06,8.65e-06,8.35e-05,0,0,8.68e-06,9.04e-06,8.98e-06,0,8.2e-06,8.48e-06,0,0.0521,8.64e-06,0,0,1.99e-05,1.3e-05,1.03e-05,9.51e-06,9.85e-06,1.49e-05,1.37e-05,0.00375,8.34e-06,8.58e-06,9e-06,8.26e-06,0,0,0,0,0,0,0,9.02e-06,9.61e-06,9.96e-06,1e-05,1.08e-05,1.11e-05,0,9.68e-06,8.46e-06,8.29e-06,7.63e-06,8.11e-06,9.04e-06,0,0,0,0,0,0,8.64e-06,8.92e-06,9.57e-06,9.78e-06,1.03e-05,1.24e-05,1.01e-05,9.09e-06,8.38e-06,8.43e-06,8.49e-06,8.49e-06,0,0,0,5.69e-05,0.0157,0,0,8.49e-06,8.62e-06,8.68e-06,8.51e-06,1.03e-05,1.14e-05,2.66e-05,9.63e-06,8.39e-06,8.19e-06,8.22e-06,8.66e-06,9.22e-06,1.22e-05,0,0,0,8.23e-06,7.36e-06,8.78e-06,0,0,8.41e-06,0,1.73e-05,4.75e-05,1.04e-05,8.37e-06,8.28e-06,0,8.46e-06,9.18e-06,1.67e-05,0.00245,0.0455,2.07e-05,0,0,0,0,0,0,9.57e-06,2.43e-05,0.000375,1.03e-05,8.22e-06,8.84e-06,8.11e-06,8.62e-06,9.24e-06,1.8e-05,9.74e-05,0,0,0.00134,0,7.74e-06,7.55e-06,0,0,0,0.00901,0.000408,9.97e-06,8.05e-06,8.05e-06,0,7.98e-06,7.98e-06,0,1.29e-05,0.393,0,1.15e-05,8.05e-06,7.72e-06,7.62e-06,7.65e-06,0,0,0,1.51e-05,9.5e-06,8.2e-06,8.62e-06,0,0,8.06e-06,0,0,0,0,9.6e-06,8e-06,7.63e-06,7.78e-06,7.98e-06,8.16e-06,8.38e-06,8.1e-06,9.41e-06,8.99e-06,8.14e-06,7.81e-06,0,7.53e-06,0,0,0,0,8.63e-06,0,9.32e-06,7.77e-06,8.11e-06,8.16e-06,1.51e-05,0,0.00178,8.27e-06,8.39e-06,8.64e-06,8.14e-06,8.98e-06,7.66e-06,0,0,9.65e-06,2.01e-05,7.99e-06,9.44e-06,8.42e-06,8.2e-06,7.98e-06,8.97e-06,8.58e-06,0.000267,9.35e-06,1.35e-05,8.38e-06,7.35e-06,8.68e-06,8.92e-06,8.31e-06,0,7.46e-05,1.05e-05,1.15e-05,8.03e-06,8.01e-06,8.03e-06,7.82e-06,7.78e-06,7.84e-06,7.96e-06,7.64e-06,7.99e-06,8.38e-06,7.55e-06,8.64e-06],"winrateAvg":0.367881,"leadAvg":-1.00467,"scoreMeanAvg":-1.07916,"scoreStdevAvg":8.21347,"shorttermWinlossErrorAvg":0.231588,"shorttermScoreErrorAvg":1.33812,"ownership":[-95,-97,-98,-97,-14,21,48,-20,-29,15,53,73,58,7,-49,-80,-95,-97,-97,-92,-96,-99,-96,-99,92,92,-74,-19,8,45,96,27,-29,-72,-95,-97,-97,-96,-87,-94,-99,-99,-99,-99,92,-74,-19,17,29,96,-95,-95,-95,-95,99,-97,-97,-69,-81,-99,-65,-99,92,92,-74,-20,18,17,88,100,100,100,100,100,99,-96,-36,-24,-48,-68,3,92,22,-73,-23,9,34,98,83,80,85,75,99,-96,-96,12,33,85,-84,2,42,7,-31,-21,57,7,21,76,76,80,83,99,99,-97,53,79,86,-83,-7,97,14,-39,-95,-95,-93,73,73,78,78,76,40,-47,-46,77,84,75,94,33,88,90,18,-88,-96,98,76,78,80,77,71,52,20,-44,85,91,87,87,99,99,-99,-99,-98,98,98,78,79,79,75,70,59,84,5,88,89,86,81,31,-65,-63,-99,-98,-98,97,76,76,77,71,65,50,6,14,90,90,88,83,96,96,-94,-83,25,97,97,71,79,76,63,64,27,14,8,91,91,87,79,63,44,37,-99,-99,-28,2,-57,95,95,83,94,44,-3,6,93,93,98,77,62,20,-36,-20,-68,-100,-100,-100,-100,-100,85,33,0,5,-11,91,96,94,86,79,55,14,46,-95,-91,-88,-94,-97,-94,-100,37,-11,-36,-31,89,87,98,90,89,97,-32,33,37,-93,-92,-94,-95,-96,-100,-100,-99,-64,-51,84,86,79,97,96,98,-99,-99,-99,-95,-94,-94,-95,-95,-96,-93,-89,-84,-69,83,81,79,85,98,-99,-99,-93,-97,-99,-95,-95,-95,-95,-95,-98,-89,-86,-78,81,82,84,84,98,-99,-96,-94,-96,-96,-96,-95,-95,-95,-95,-94,-92,-87,-84,83,83,86,90,98,6,-93,-93,-95,-95,-95,-95,-95,-95,-94,-93,-92,-90,-87],"ownershipAllowedMAE":0.0405549})%"); + lines.push_back(R"%({"sample":{"board":".................../.............O...../...O.O...XO.XX.OO../..O......XO.XOXXX../..XX...OXXOOXO...../.......OOXXXOO...../.................../........O.X....XX../...X......XOOO.OX../.........OOXXO.OOX./.........XOOX.X.OX./..........OOX...OX./.........XXOXX.XO../..O......XOOXO.XOO./.........XO.XO.XXO./...O.....X.OXXOX.../.....X.....OO.OXOO./.........X....OXXXX/.................../","hintLoc":"null","initialTurnNumber":85,"metadata":"D16C26FC1A943353A28292343841D65E:95","moveLocs":["K18","J18","P17","N18","P18","L18","M18","K19","N19","J11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.4e-05,2.53e-05,2.52e-05,2.53e-05,2.52e-05,2.6e-05,2.71e-05,2.66e-05,2.94e-05,0,2.11e-05,0.0613,0,2.92e-05,2.57e-05,2.46e-05,2.47e-05,2.48e-05,2.37e-05,2.52e-05,2.62e-05,2.63e-05,2.59e-05,2.84e-05,2.93e-05,3.57e-05,2.99e-05,0,0,0,0,0,0,0,2.35e-05,2.46e-05,2.71e-05,2.67e-05,2.59e-05,2.95e-05,2.49e-05,0,2.71e-05,0,3.09e-05,0.000113,2.68e-05,0,0,0.00678,0,0,0,0,0,3.4e-05,2.96e-05,2.73e-05,3.15e-05,0,2.83e-05,3.05e-05,3.12e-05,4.47e-05,3.63e-05,2.54e-05,0,0,2.37e-05,0,0,0,0,0,0.00183,3.12e-05,2.7e-05,3.25e-05,0,0,3.18e-05,3.74e-05,2.88e-05,0,0,0,0,0,0,0,4.78e-05,0.000106,0.000472,0.000785,3.24e-05,2.67e-05,3.1e-05,2.87e-05,2.98e-05,3.54e-05,3.19e-05,2.64e-05,0,0,0,0,0,0,0,3.65e-05,0.00442,0.00836,0.00265,3.18e-05,2.67e-05,3.28e-05,3.51e-05,3.44e-05,3.56e-05,3.28e-05,3e-05,2.6e-05,2.52e-05,5.23e-05,3.33e-05,3.61e-05,3.19e-05,3.26e-05,9.52e-05,6.05e-05,0.000188,0.000234,3.11e-05,2.63e-05,3.26e-05,3.36e-05,3.65e-05,3.91e-05,3.47e-05,3.41e-05,3.37e-05,0,2.33e-05,0,3.07e-05,3.08e-05,2.97e-05,3.65e-05,0,0,9.4e-05,2.98e-05,2.62e-05,3.24e-05,3.34e-05,0,4.23e-05,4.48e-05,0.000108,0.00381,0,0.64,0,0,0,0,2.65e-05,0,0,3.07e-05,3.13e-05,2.63e-05,3.25e-05,3.43e-05,3.57e-05,4.5e-05,8.5e-05,0.000204,0.00353,0.0912,0,0,0,0,0,2.72e-05,0,0,0,2.64e-05,2.62e-05,3.29e-05,3.51e-05,3.52e-05,3.69e-05,8.44e-05,0.000274,0.00617,0.00197,0,0,0,0,0.000892,0,2.58e-05,0,0,2.6e-05,2.59e-05,3.14e-05,3.34e-05,3.4e-05,3.51e-05,4.88e-05,0.000169,0.0028,0.000223,0.126,0,0,0,2.92e-05,0.000945,5.11e-05,0,0,2.75e-05,2.56e-05,2.96e-05,2.94e-05,3.17e-05,3.46e-05,3.73e-05,0.000101,0.000235,9.73e-05,0,0,0,0,0,0.00017,0,0,2.71e-05,2.68e-05,2.6e-05,2.76e-05,0,2.97e-05,3.32e-05,3.6e-05,4.81e-05,9.04e-05,3e-05,0,0,0,0,0,3.28e-05,0,0,0,2.72e-05,2.53e-05,2.77e-05,2.72e-05,2.86e-05,3.23e-05,3.61e-05,6.1e-05,5.78e-05,2.98e-05,0,0,2.95e-05,0,0,0.0243,0,0,0,2.97e-05,2.53e-05,2.73e-05,2.87e-05,0,3.06e-05,0.000102,0.000108,6.14e-05,3.34e-05,0,3.1e-05,0,0,0,0,0,4.68e-05,0.000451,7.18e-05,2.56e-05,2.81e-05,3.06e-05,3.22e-05,8.73e-05,0,7.59e-05,4.15e-05,0.000976,0.000181,0.000102,0,0,3.57e-05,0,0,0,0,5.97e-05,2.6e-05,2.74e-05,2.98e-05,3.33e-05,3.69e-05,3.41e-05,3.42e-05,3.62e-05,6.78e-05,0,0.000167,2.98e-05,3.32e-05,2.89e-05,0,0,0,0,0,2.41e-05,2.6e-05,2.62e-05,2.7e-05,2.68e-05,2.74e-05,2.74e-05,2.86e-05,2.82e-05,3.25e-05,2.95e-05,3.24e-05,3.15e-05,2.84e-05,2.87e-05,2.71e-05,2.42e-05,2.41e-05,2.39e-05,2.27e-05],"winrateAvg":0.0877356,"leadAvg":-7.7024,"scoreMeanAvg":-9.07179,"scoreStdevAvg":17.9222,"shorttermWinlossErrorAvg":0.13559,"shorttermScoreErrorAvg":3.10183,"ownership":[56,59,60,56,44,18,-12,-42,-61,-71,3,41,56,57,70,75,71,64,55,51,57,60,65,53,40,-2,-37,-88,-63,-63,46,40,85,86,79,70,63,41,41,53,60,77,33,69,-11,-17,-60,-93,51,46,42,44,87,86,87,30,31,14,34,69,-26,-17,15,-50,-23,-56,-94,51,44,43,87,-42,-44,-45,6,6,-15,-22,-80,-81,-22,-21,-27,14,-94,-94,55,54,45,89,27,-3,-8,-28,-13,-31,-49,-48,-37,-18,-23,-23,11,9,-95,-95,-95,89,90,16,-5,-21,-34,-36,-38,-37,-40,-35,-24,-25,-29,-22,-34,-53,-66,-14,18,59,-12,-28,-41,-59,-55,-37,-41,-43,-39,-28,-28,-32,-39,-8,-86,-91,-3,42,27,-5,-78,-79,-71,-69,-31,-33,-45,-81,-27,-28,-36,-60,-76,56,-91,84,84,85,48,81,-78,-77,-72,-20,-23,-25,-23,-14,-13,-13,5,16,75,75,-93,-94,84,5,81,80,-77,-74,-8,-7,-10,-11,-6,0,8,21,32,22,76,77,-94,-2,-79,12,80,-78,-64,6,5,-5,-4,-4,0,7,24,22,57,75,75,-94,-59,-60,-30,80,-78,-31,21,23,7,0,-1,-2,0,2,-13,-88,-87,75,-94,-93,-79,-98,79,16,4,33,39,73,17,4,-4,-6,-7,-28,-87,73,74,-93,11,-53,-98,80,79,48,37,44,43,23,3,-13,-13,-17,-39,-87,74,46,-93,13,12,-98,-98,79,39,34,36,44,74,8,-10,-34,-34,-49,-87,-39,72,-92,-91,63,-98,-58,-19,10,28,29,26,26,19,-78,-50,-53,-48,-59,-21,71,71,-11,63,-98,-8,-10,-52,22,17,10,-1,-12,-50,-60,-63,-61,-83,10,31,57,45,63,-98,-98,-98,-98,17,12,6,-3,-20,-39,-54,-61,-64,-47,-16,22,24,18,-35,-52,-91,-96,-97],"ownershipAllowedMAE":0.0551819})%"); + lines.push_back(R"%({"sample":{"board":".................../.....XOXOO.OOX.O.../..OOOX.XXO.XOX.XO../...XOX.XOOO...XOO../..OOXX...OX..X.XO../..OXX.OOOXX......../...XOOOXXOX.....O../...XXOXX.OX......../.OOOXO..XOX......../...XOXX..X........./....O............../.................../.................../..X................/.................../...X........OOOOO../...........XOXXXX../............X....../.................../","hintLoc":"null","initialTurnNumber":92,"metadata":"50AEF48883F111C10870EB033AF139C2:102","moveLocs":["M16","N16","N15","L17","M15","N19","D9","D8","E8","F9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.53,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.69e-05,5.8e-05,0.000209,0.000263,0.000856,0.000108,0.00634,0.00336,0.0245,0.000685,0.0966,5.81e-05,0,0.000636,0.000341,0.000321,6.05e-05,4.36e-05,3.66e-05,4.91e-05,0.000324,0.000318,0.000464,0.0499,0,0,0,0,0,8.4e-05,0,0,0,0.00859,0,0.00103,5.05e-05,4.1e-05,4.05e-05,0.000848,0,0,0,0,0.00234,0,0,0,0,0,0,0,0.000115,0,0,4.59e-05,3.95e-05,3.89e-05,0.00664,0.000914,0,0,0,2.9e-05,0,0,0,0,0,0,0.000166,0,0,0,4.08e-05,3.96e-05,4.01e-05,0.000115,0,0,0,0,0.09,0.00154,0.0118,0,0,0,0,0,5.12e-05,0,0,4.35e-05,3.97e-05,3.97e-05,0.000216,0,0,0,0.000243,0,0,0,0,0,3.72e-05,3.81e-05,3.96e-05,4.39e-05,6.06e-05,5.51e-05,5.21e-05,4.02e-05,5.44e-05,0.000689,0.00221,0,0,0,0,0,0,0,0,3.77e-05,3.85e-05,4.06e-05,4.48e-05,4.77e-05,0,4.78e-05,4.06e-05,4.63e-05,0.00182,0.000149,0,0,0,0,0,4.15e-05,0,0,3.74e-05,3.91e-05,4.25e-05,4.48e-05,4.83e-05,4.83e-05,4.75e-05,3.96e-05,4.46e-05,0,0,0,0,0,0.0324,4.17e-05,0,0,0,3.83e-05,4.08e-05,4.38e-05,4.65e-05,4.82e-05,5e-05,4.77e-05,4e-05,3.83e-05,0.00502,3.85e-05,0,0,0,0,4.44e-05,4.3e-05,0,4.02e-05,4.09e-05,4.33e-05,4.57e-05,4.76e-05,4.88e-05,4.9e-05,4.75e-05,3.99e-05,3.61e-05,5.86e-05,0.00679,0,0,0,0.000421,4.69e-05,4.5e-05,4.35e-05,4.39e-05,4.47e-05,4.66e-05,4.83e-05,4.93e-05,5.01e-05,4.94e-05,4.74e-05,4.01e-05,3.62e-05,3.86e-05,0.609,0,0,0.0187,0.000335,8.64e-05,4.99e-05,4.72e-05,4.75e-05,4.81e-05,4.96e-05,4.96e-05,5.13e-05,5.73e-05,5.43e-05,4.88e-05,3.99e-05,4.05e-05,4.35e-05,3.74e-05,0.00206,0.000242,0.000223,0.000221,0.000106,5.77e-05,5.07e-05,4.99e-05,5.01e-05,5.08e-05,5.1e-05,5.27e-05,5.47e-05,6.64e-05,5.08e-05,4.06e-05,4.2e-05,4.23e-05,0,4.57e-05,4.61e-05,5.55e-05,9.42e-05,9.3e-05,6.69e-05,5.53e-05,5.33e-05,5.11e-05,5.01e-05,5.01e-05,5.08e-05,4.89e-05,6.4e-05,5.25e-05,4.13e-05,3.95e-05,4.28e-05,4.38e-05,4.49e-05,4.71e-05,4.98e-05,5.51e-05,6.33e-05,5.55e-05,5.48e-05,5.63e-05,4.97e-05,4.38e-05,3.99e-05,4.06e-05,4.11e-05,4.46e-05,5.34e-05,4.2e-05,3.93e-05,4.32e-05,4.54e-05,0,4.76e-05,5.01e-05,5.12e-05,5.14e-05,5.33e-05,5.18e-05,4.97e-05,8.95e-05,0,0,0,0,0,5.54e-05,4.23e-05,3.91e-05,4.33e-05,4.59e-05,4.77e-05,5.1e-05,4.94e-05,4.98e-05,4.95e-05,4.93e-05,4.92e-05,5.09e-05,0,0,0,0,0,0,4.83e-05,4.33e-05,3.97e-05,4.23e-05,4.45e-05,4.67e-05,4.68e-05,4.75e-05,4.75e-05,4.7e-05,4.59e-05,4.49e-05,5.33e-05,4.62e-05,0,4.03e-05,3.98e-05,3.67e-05,3.74e-05,4.27e-05,4.05e-05,3.55e-05,3.94e-05,3.98e-05,4.13e-05,4.07e-05,4.03e-05,4.01e-05,4.02e-05,3.98e-05,3.93e-05,3.99e-05,4.08e-05,3.77e-05,4.06e-05,3.92e-05,3.91e-05,3.83e-05,3.86e-05,3.65e-05,4.33e-05],"winrateAvg":0.953022,"leadAvg":19.3662,"scoreMeanAvg":17.648,"scoreStdevAvg":19.8711,"shorttermWinlossErrorAvg":0.127396,"shorttermScoreErrorAvg":5.96617,"ownership":[85,80,71,53,26,9,12,20,44,84,85,93,97,69,58,67,78,81,84,90,86,89,83,37,-10,21,-7,96,96,94,97,97,-62,-6,83,78,85,86,92,94,99,99,99,-9,9,-6,-7,97,97,-98,96,-65,-16,-12,97,90,87,93,94,97,96,99,-8,8,-4,97,97,97,-99,95,-24,-83,97,97,91,85,92,94,98,98,-8,-5,14,42,88,97,-99,-99,-99,-99,-53,-56,97,86,78,90,91,98,-8,-7,29,90,90,89,-99,-100,-79,-53,-37,-16,7,45,74,65,84,88,37,-5,87,89,89,-92,-94,-92,-100,-59,-38,-25,-8,17,88,59,46,77,80,50,-1,0,88,-91,-93,-93,-91,-99,-51,-31,-21,-9,-3,11,32,29,46,91,92,92,-1,87,-27,-48,-97,-90,-99,-40,-24,-17,-11,-3,4,14,13,3,4,2,-57,78,-78,-83,-36,-47,-94,-41,-21,-15,-11,-6,1,3,7,5,-36,-48,-55,-60,76,72,11,8,0,-4,-12,-9,-8,-5,-1,4,2,6,4,-56,-60,-79,32,-3,51,27,19,12,1,-2,-4,-1,3,6,7,7,9,9,-65,-71,-41,22,6,16,15,9,3,-1,-4,-2,4,9,12,12,10,20,19,-69,-73,-88,-36,-20,-7,-5,-7,-7,-7,-5,0,10,15,18,22,20,25,31,-67,-70,-65,-42,-25,-17,-18,-17,-14,-10,-6,11,29,38,41,44,48,54,32,-63,-65,-66,-88,-35,-28,-25,-23,-20,-18,-11,2,84,86,86,86,87,19,20,-58,-60,-59,-56,-44,-33,-29,-27,-26,-26,-36,-77,83,-90,-90,-90,-90,-17,-15,-56,-54,-53,-46,-42,-36,-33,-31,-33,-37,-51,-67,-81,-77,-84,-85,-76,-68,-28,-53,-51,-47,-44,-39,-34,-30,-29,-31,-39,-50,-61,-71,-79,-81,-81,-76,-70,-53],"ownershipAllowedMAE":0.0663168})%"); + lines.push_back(R"%({"sample":{"board":"....X............/.O.XOX..X...OX.X./.OX.OXOX.O.OXX.X./.O.O.OXO...OOXXO./......XXX.X.XOO.O/.X.O.X..O.X.X.OO./..O..XO..OOOX..../....OXO.OXXXOO.../.X.XXX.XXOXXXO.../.....X...OOXX..../....XOXXO.X.X..../.OOOOOOO.X.XOOX../OXX.X.X.OO..XO.../.OXX...X..O.XO.../.OOO.O.....XOX.../.........OX....../................./","hintLoc":"null","initialTurnNumber":125,"metadata":"8E43AF24700216A429C8CDD22618EB6A:135","moveLocs":["N2","M4","O7","P3","O8","M7","G8","G9","K1","L5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.21,"xSize":17,"ySize":17},"rules":"koPOSITIONALscoreAREAtaxALLsui1button1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.25e-06,3.37e-06,0.000116,3.85e-05,0,1.78e-05,9.14e-06,2.85e-06,3.28e-06,2.5e-06,2.35e-06,3.41e-06,5.05e-06,0.000748,1.37e-05,4.92e-05,2.11e-06,2.28e-06,0,3.73e-05,0,0,0,0.0182,1.93e-05,0,7.68e-06,4e-05,2.94e-06,0,0,0.000875,0,6.37e-06,2.16e-06,0,0,0.000631,0,0,0,0,2.15e-05,0,2.19e-06,0,0,0,2.88e-06,0,1.88e-05,2.33e-06,0,3.27e-06,0,3.22e-06,0,0,0,8.56e-06,0.00034,0.000537,0,0,0,0,0,2.48e-06,2.54e-06,2.79e-06,2.68e-06,2.65e-06,2.6e-06,2.5e-06,0,0,0,0.00306,0,0.000593,0,0,0,2.26e-06,0,2.4e-06,0,2.67e-06,0,2.68e-06,0,2.32e-06,2.21e-06,0,0.000304,0,0.00069,0,2.62e-06,0,0,2.29e-06,2.72e-06,3.87e-06,0,2.53e-06,2.49e-06,0,0,2.4e-06,3.08e-06,0,0,0,0,2.97e-06,2.47e-06,2.42e-06,2.28e-06,2.88e-06,3.26e-06,1.78e-05,2.76e-06,0,0,0,2.29e-06,0,0,0,0,0,0,2.38e-06,2.4e-06,2.14e-06,2.42e-06,0,6.01e-06,0,0,0,0,0,0,0,0,0,0,0,2.27e-06,2.34e-06,2.19e-06,2.57e-06,2.71e-06,4.27e-06,2.53e-06,2.28e-06,0,0,4.34e-06,2.66e-06,0,0,0,0,0,2.33e-06,2.57e-06,2.36e-06,2.52e-06,2.59e-06,2.56e-06,2.56e-06,0,0,0,0,0,0.00491,0,0,0,0,2.71e-06,2.9e-06,2.4e-06,2.28e-06,0,0,0,0,0,0,0,8.26e-06,0,0,0,0,0,0,3.52e-06,2.77e-06,0,0,0,2.29e-06,0,2.3e-06,0,2.62e-06,0,0,0,0,0,0,4.36e-06,1.67e-05,3.29e-06,2.28e-06,0,0,0,2.24e-06,2.38e-06,2.54e-06,0,8.27e-06,0.0295,0,0,0,0,0.0123,0.00479,3.25e-06,2.23e-06,0,0,0,2.26e-06,0,2.69e-06,3.03e-06,4.31e-05,0.219,0.431,0,0,0,0,0.00133,3.19e-06,2.15e-06,2.29e-06,2.26e-06,2.23e-06,2.24e-06,2.46e-06,2.74e-06,4.59e-06,4.84e-06,0,0,0.0496,0,0.00151,1.04e-05,3.02e-05,2.93e-06,2.22e-06,2.31e-06,2.25e-06,2.25e-06,2.18e-06,2.42e-06,2.52e-06,2.83e-06,2.88e-06,0,0.212,0.0069,2.29e-05,6.56e-06,4.24e-06,3.95e-06,2.25e-06,5.68e-06],"winrateAvg":0.905325,"leadAvg":6.89738,"scoreMeanAvg":4.82486,"scoreStdevAvg":8.56039,"shorttermWinlossErrorAvg":0.250103,"shorttermScoreErrorAvg":3.86974,"ownership":[92,86,58,-59,-85,-87,-88,-91,-92,-93,-91,-92,-94,-95,-97,-97,-96,94,97,61,-63,88,-90,-89,-93,-98,-91,-91,-93,-91,-98,-97,-98,-96,94,97,0,20,89,-90,-86,-98,-93,-88,-92,-89,-98,-98,-97,-98,-63,83,97,76,95,59,61,-100,-91,-95,-94,-92,-88,-88,-98,-98,92,26,58,60,48,45,-29,-55,-100,-100,-100,-95,-98,-94,-97,98,99,92,97,14,-18,25,84,-3,-100,-97,-96,-90,-95,-98,-95,-98,23,99,98,96,-12,0,73,18,-28,-100,-92,-94,-92,-91,-91,-91,-98,-33,92,95,95,-49,-10,30,-26,22,-100,-93,-97,-91,-98,-98,-98,99,99,94,93,92,-63,-95,-70,-100,-100,-100,-100,-100,-100,-16,-98,-98,-98,99,92,91,87,-39,-23,-16,-33,-64,-100,36,26,-52,-11,-9,-98,-98,100,88,83,80,22,16,45,9,-66,100,25,16,66,-24,-98,-98,-98,100,81,76,69,82,100,100,100,100,100,100,100,4,-74,-68,-98,100,100,53,62,54,99,90,89,95,85,91,79,87,94,94,-93,-90,-93,100,81,39,33,98,100,88,88,92,89,85,76,83,60,61,-92,-92,99,26,29,-7,98,100,100,100,95,99,90,85,85,56,11,-90,19,-64,-64,-48,-24,98,98,98,97,96,95,91,88,85,92,-73,-42,21,-52,-52,-47,-41,98,98,97,97,95,93,90,88,88,92,53,24,11,-34,-47,-47,-47],"ownershipAllowedMAE":0.0472786})%"); + lines.push_back(R"%({"sample":{"board":".X.O.......OOXO.XO./OOXXOOX...XOX..XXO./..OXOX...X.OXXXXO../..OOXX...XOOOXOX.OO/....OX...XXO.XO.XOX/..OXX....XO.OO.OXXX/..OXO.....O....OOO./..OOXX.OOO....X..../....OX..XXX...X..../.......O...X.X...../......X...XO.XOOO../..X.X.....XOX.XXO../..X.....O.OOX.X.XO./.O..OX.....OX..XXO./..OOXX..XO..XXXXO../...OOX..XO.XO...O../.OOX.X..X...X..O.../..X.X.......XO...../.................../","hintLoc":"null","initialTurnNumber":152,"metadata":"E0B8392AFE31DE2968FCE822C03E1FDC:162","moveLocs":["H11","D15","F14","B2","P2","Q2","P3","P1","Q15","S11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1button1","komi":44.0,"policyOptimism":0.0,"pda":-0.57,"policyMixture":[0.000117,0,0.000229,0,0.000183,0.0239,0.000194,0.000151,0.000161,0.000192,0.000385,0,0,0,0,0.000116,0,0,8.95e-05,0,0,0,0,0,0,0,0.00018,0.00019,0.000185,0,0,0,0.00282,0.000207,0,0,0,0.00102,0.000123,0.000123,0,0,0,0,0.000159,0.000181,0.000162,0,0.000171,0,0,0,0,0,0,0.000262,7.81e-05,0.000127,0.000125,0,0,0,0,0.000165,0.000173,0.000152,0,0,0,0,0,0,0,0.00176,0,0,0.000129,0.000141,0.000134,0,0,0,0.000165,0.000196,0.000168,0,0,0,0.000124,0,0,0,0,0,0,0.000144,0.000133,0,0,0,0,0.000202,0.00122,0.000233,0,0,0.0007,0,0,0.184,0,0,0,0,0.000157,0.000148,0,0,0,0.000173,0.00432,0.00167,0.000219,0.00259,0,0.0212,0.00106,0.000252,0.000196,0,0,0,0.00253,0.000179,0.00019,0,0,0,0,0.000839,0,0,0,0.00488,0.000533,0.00063,0.000254,0,0.000193,0.0023,0.00156,0.000222,0.000203,0.0126,0.00111,0.00344,0,0,0.00016,0,0,0,0,0.000158,0.000164,0.000159,0,0.000184,0.0146,0,0.000942,0.000259,0.00758,0.103,0.00265,0.00333,0.000185,0.000157,0,0.000122,0.000113,0.000123,0,0.000137,0,0.000164,0.000186,0.00211,0.00165,0.000133,0.000221,0.00228,0.000608,0.000374,0.000194,0.000163,0,0.000127,0.00012,0.000117,0,0,0.000127,0,0,0,0,0.000161,0.000135,0.00031,0.000309,0,0.000169,0,0.000141,0.000127,0.000122,0.000122,0.000121,0,0,0,0.000121,0,0,0,0.00016,0.000133,0.000272,0.00238,0,0.000168,0.000185,0.000143,0.000123,0.00012,0,0.000122,0,0,0,0.000118,0,0.000114,0,0,0.000137,0.000175,0,0.00063,0.00123,0,0,0.000114,0.000114,0.000119,0.000123,0.000118,0,0,0.000116,0.000116,0,0,0,0.000135,0.000187,0.000208,0,0,0,0,0.00011,0.000111,0,0,0.000121,0.000125,0,0,0,0,0,0.000195,0.00013,0.000155,0.000442,0.000119,0,0,0,0.000111,0.000111,0,0,0.000121,0,0,0.000153,0.000147,0.0788,0,0.000137,0.000132,0.000132,0,0,0,0.000212,0,0.000116,0.000114,0,0.000135,0.000134,0.000159,0,0.224,0,0,0.000268,0.000151,0.000127,0.000132,0,0,0.000217,0,0.000144,0.00014,0.000134,0.00014,0.000154,0.000167,0.00017,0,0,0,0,0.000149,0.000138,0.00013,0.000103,0.242,0.000201,0.000149,0.000129,0.000141,0.000123,0.000129,0.000144,0.00015,0.000161,0.000202,0.00713,0.000149,0,0.00251,0.00041,0.00014,0.000115,6.51e-05],"winrateAvg":0.000350705,"leadAvg":-22.0193,"scoreMeanAvg":-22.1713,"scoreStdevAvg":5.12889,"shorttermWinlossErrorAvg":0.00523173,"shorttermScoreErrorAvg":1.20965,"ownership":[98,96,98,98,79,-55,-71,-75,-56,-19,33,99,99,2,7,-53,-99,-97,-98,100,100,97,97,98,98,-94,-77,-80,-27,-70,99,-99,-7,-57,-99,-99,-97,-98,99,99,100,97,98,-99,-92,-87,-86,-99,12,99,-99,-99,-99,-99,-98,-97,-98,97,98,100,100,-99,-100,-85,-80,-82,-99,99,99,99,-98,-33,-99,-99,-97,-97,94,96,99,100,100,-100,-60,-59,-58,-99,-99,99,49,-98,23,-99,-99,-97,-99,89,96,100,-99,-99,-99,-16,-5,-12,-98,98,96,99,99,30,100,-99,-99,-99,83,93,100,-99,-46,-45,19,39,30,47,98,10,37,54,89,100,100,99,0,71,83,100,100,-99,-99,19,96,95,95,-2,-22,-6,-7,-99,-32,64,91,89,52,53,52,32,25,-99,-56,-100,-100,-100,-100,-60,-41,-68,-99,-32,17,99,92,23,33,18,20,-36,-55,-95,-95,-98,-99,-99,-100,-79,-100,-32,-6,62,96,96,-7,23,-33,-13,-30,-63,-99,-98,-98,-99,-100,-97,-99,-100,100,100,100,98,98,-15,-61,-98,-59,-98,-91,-97,-98,-99,-99,-100,-98,-100,-100,-100,-100,100,99,98,21,-11,-98,-25,-48,-91,-98,-99,-98,-99,-98,-98,-100,-100,-100,-100,-100,100,99,72,94,7,12,13,-100,-99,-99,-99,-99,-99,-98,-100,-100,-100,-100,-100,100,98,89,92,95,96,-100,-100,-99,-99,-100,-97,-99,-99,-100,-100,-100,-100,99,99,98,91,90,93,96,96,-100,-99,-99,-100,-97,-98,-100,-91,-92,-70,-63,99,98,98,88,94,94,-87,37,-100,-99,-99,-100,-99,-98,-97,-100,-58,-90,98,96,97,97,54,94,-77,-77,-97,-97,-98,-98,-99,-98,-96,-94,-100,-16,-91,97,94,95,96,34,-42,-37,-67,-83,-95,-97,-97,-97,-95,-92,-87,-51,-13,70,73,89,93,95],"ownershipAllowedMAE":0.0314462})%"); + lines.push_back(R"%({"sample":{"board":".................../..OX.......OXOX..../..OXO..OOX..OX.XO../..XO...OXX.OO..XXX./...O...O..O...OOOX./..O..X.OXXOXX.OXXO./..OXX.XOOO.O..OX.../..OOXX.XXX..OOXX.../...XXXXOXXOO.X...../XXXXOXOOXOX.OXXX.../XOOXOOXOXOO.OXO..../.XOOOXXOOO..OXOXXX./.XX....XXXXXXOOOOX./XOOO.OXXOOOOOX.OXO./XXXOO.XOO...OX.OX../OOOOXOXXO..O.OO.X../..OXXXXOO.OXOXXOO../.X.X.....XOXX.X..../.............X...../","hintLoc":"null","initialTurnNumber":200,"metadata":"6D6E800564B129C342A982085F306A63:210","moveLocs":["A7","L12","A12","G12","F16","F17","A14","B16","S3","Q4"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.68,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":11.0,"policyOptimism":0.792,"pda":0.0,"policyMixture":[3.42e-05,3.23e-05,3.54e-05,3.3e-05,3.31e-05,3.21e-05,3.2e-05,3.22e-05,3.36e-05,3.57e-05,4.17e-05,7.43e-05,4.24e-05,0.00016,3.3e-05,3.28e-05,3.23e-05,3.28e-05,3.53e-05,3.86e-05,0.00017,0,0,3.32e-05,3.33e-05,3.35e-05,3.2e-05,3.38e-05,3.45e-05,5.09e-05,0,0,0,0,3.24e-05,3.22e-05,3.12e-05,3.17e-05,4.45e-05,0.000337,0,0,0,0,3.95e-05,0,0,0,4.72e-05,4.73e-05,0,0,3.31e-05,0,0,3.09e-05,3.17e-05,0.000196,0,0,0,3.82e-05,0,3.93e-05,0,0,0,3.58e-05,0,0,0.001,0.000183,0,0,0,3.23e-05,3.73e-05,0.000974,0.000247,0,6.66e-05,5.99e-05,3.12e-05,0,3.07e-05,3.13e-05,0,3.25e-05,5.65e-05,0.000486,0,0,0,0,3.19e-05,0,3.26e-05,0,3.8e-05,3.72e-05,0,3.78e-05,0,0,0,0,0,0,3.27e-05,0,0,0,0,3.19e-05,3.68e-05,2.96e-05,0,0,0,2.94e-05,0,0,0,0,0,0,3.27e-05,0.000478,0,0,3.16e-05,3.36e-05,3.28e-05,0,7.28e-05,0,0,0,0,0,8.79e-05,3.37e-05,3.16e-05,0,0,0,0,0,0,3.16e-05,3.22e-05,3.3e-05,3.48e-05,3.16e-05,3.11e-05,0,0,0,0,0,3.06e-05,3.14e-05,0,0,3.37e-05,0,3.2e-05,3.12e-05,3.28e-05,3.27e-05,3.28e-05,0,0,0,0,0,0,0,0,3.12e-05,0,0,3.13e-05,0,0,0,0,3.33e-05,3.33e-05,3.3e-05,0,0,0,0,0,0,0,0,3.19e-05,0,0,3.15e-05,0,0,0,3.66e-05,3.27e-05,3.18e-05,3.34e-05,4.39e-05,0,0,0,0,0,0,0,0,0,3.12e-05,3.37e-05,0,0,0,0,0,0,3.35e-05,0,0,0,5.86e-05,5.88e-05,3.4e-05,3.39e-05,0,0,0,0,0,0,0,0,0,0,0,3.61e-05,0,0,0,0,2.71e-05,0,0,0,0,0,0,0,0,0,2.99e-05,0,0,0,0.00234,0,0,0,0,0,4.02e-05,0,0,0,3.08e-05,3.15e-05,3.53e-05,0,0,2.9e-05,0,0,0.277,0.00183,0,0,0,0,0,0,0,0,0,3.39e-05,0.00043,0,0.00011,0,0,0,0,0.7,0.00809,3.52e-05,3.9e-05,0,0,0,0,0,0,0,0.000314,0,0,0,0,0,0,0,0,3.62e-05,2.95e-05,0,6.04e-05,0,2.97e-05,3.47e-05,5.14e-05,0.000174,6.5e-05,0,0,0,0,2.44e-05,0,0.000151,8.1e-05,0.000181,3.42e-05,3.34e-05,3.53e-05,3.17e-05,3.45e-05,3.21e-05,3.43e-05,3.97e-05,3.55e-05,3.5e-05,3.39e-05,5.95e-05,7.54e-05,2.55e-05,0,2.83e-05,7.26e-05,3.95e-05,4.22e-05,3.43e-05,1.99e-05],"winrateAvg":0.949537,"leadAvg":2.57651,"scoreMeanAvg":3.38549,"scoreStdevAvg":7.71577,"shorttermWinlossErrorAvg":0.134693,"shorttermScoreErrorAvg":1.70967,"ownership":[97,98,98,99,98,98,98,97,97,95,88,37,32,-44,-68,-96,-97,-98,-98,96,97,100,98,99,98,98,98,98,97,96,98,-6,-8,-98,-97,-98,-98,-98,94,95,100,98,100,100,91,100,100,95,97,97,99,-89,-67,-100,-97,-98,-98,66,99,96,100,69,4,65,100,95,95,97,100,100,-44,21,-100,-100,-100,-98,16,50,98,100,2,20,42,100,98,98,100,96,94,92,97,97,96,-100,-98,-52,67,100,69,-7,-80,56,100,96,96,100,89,90,93,96,-100,-100,-98,-99,-54,35,100,-94,-95,-47,-53,100,100,100,99,100,97,95,97,-100,-98,-99,-98,-85,47,100,99,-96,-96,18,14,73,92,100,99,100,100,-100,-100,-98,-98,-98,-85,42,45,-96,-97,-97,-96,100,89,95,100,100,46,-100,-99,-98,-98,-98,-98,-97,-97,-97,-97,-92,-97,100,100,96,100,96,97,100,-100,-100,-100,-97,-98,-98,-98,-93,-94,-97,-93,-94,-99,100,99,100,100,52,100,-100,99,49,-96,-98,-98,-98,-98,-94,-93,-93,-99,-99,100,100,100,28,-39,100,-100,100,-99,-99,-100,-98,-98,-98,-98,-94,-94,-98,-99,-100,-100,-100,-100,-99,-99,99,99,100,99,-100,-96,-97,-95,-95,-93,-95,-95,-100,-100,100,100,99,99,99,96,97,100,-95,-93,-96,-98,-98,-98,-94,-94,-98,-100,100,100,94,92,85,99,95,98,100,-95,-92,-77,-93,-93,-94,-94,-100,-97,-100,-100,100,87,82,85,7,99,99,99,-94,-88,-26,-97,-97,-94,-99,-99,-100,-100,100,100,82,96,-94,4,-95,-95,99,99,-84,10,-96,-98,-97,-99,-89,-83,1,23,88,51,96,-94,-95,-95,-96,-45,78,59,25,-97,-98,-98,-95,-74,-49,-18,39,58,56,46,16,-86,-96,-87,-48,22,49,49],"ownershipAllowedMAE":0.0323064})%"); + lines.push_back(R"%({"sample":{"board":".................../................O../.....X..O..OO.O.OX./.XX..XOXO.O.XO.XXX./..O....X.XX.XX...O./......O........X.../...........X.....O./........XOOXOOO.O../...X....XXOXOX...../..........XOO.X.X../..........X....O.../...........X.XXOO../.............XO.O../...............O.../.X.X.............../..X..X..........O../OXOO..........O..../.O...O............./.................../","hintLoc":"null","initialTurnNumber":75,"metadata":"446AB03DF2CB9916488639FE90C6379B:85","moveLocs":["D16","D17","C11","C10","B10","D10","J15","J14","C12","B9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.79,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":4.0,"policyOptimism":0.0,"pda":-0.099,"policyMixture":[7.34e-06,8.51e-06,8.62e-06,8.74e-06,9.23e-06,8.98e-06,8.85e-06,8.64e-06,8.66e-06,8.1e-06,8.36e-06,8.18e-06,8.27e-06,8.06e-06,8.73e-06,7.96e-06,7.78e-06,7.8e-06,7.59e-06,8.44e-06,8.72e-06,8.98e-06,1.15e-05,1.08e-05,1.24e-05,2.8e-05,1.24e-05,9.24e-06,8.86e-06,8.45e-06,8.49e-06,8.26e-06,8.81e-06,8.85e-06,8.86e-06,0,8.25e-06,7.67e-06,8.48e-06,1.02e-05,3.26e-05,0,3.7e-05,0,0.000137,0.000143,0,8.42e-06,7.89e-06,0,0,9.14e-06,0,8.79e-06,0,0,7.67e-06,7.82e-06,0,0,0,0.00019,0,0,0,0,9.75e-06,0,1.7e-05,0,0,3.14e-05,0,0,0,7.7e-06,7.96e-06,0.757,0,0.0647,0.000391,0.0492,0.00484,0,0,0,0,9.91e-05,0,0,0.000124,9.43e-06,9.31e-06,0,8.03e-06,9.81e-06,0.000157,4.99e-05,0.00447,0.000592,1.74e-05,0,0.0211,0,5.02e-05,6.49e-05,0.0391,0.000229,4.71e-05,0.000207,0,8.66e-06,8.2e-06,8.27e-06,9.83e-06,1.27e-05,1.54e-05,3.72e-05,0.000179,4.65e-05,1.04e-05,2.29e-05,3.07e-05,1.18e-05,2.9e-05,0,0.00221,1.01e-05,9.49e-06,9.5e-06,8.32e-06,0,7.99e-06,1.12e-05,0.000406,0,0.0517,5.28e-05,4.33e-05,3.38e-05,1.63e-05,0,0,0,0,0,0,0,8.5e-06,0,8.14e-06,7.9e-06,0.000118,2.26e-05,0,0,1.14e-05,3.4e-05,2.06e-05,1.11e-05,0,0,0,0,0,0,8.24e-06,8.45e-06,8.23e-06,7.89e-06,7.76e-06,6.22e-05,0,0,0,1.02e-05,1.2e-05,1.2e-05,1.07e-05,9.8e-06,9.07e-06,0,0,0,8.59e-06,0,8.47e-06,0,7.67e-06,7.52e-06,4.87e-05,0,1.65e-05,9.28e-06,1e-05,1.11e-05,1.12e-05,1.08e-05,1.04e-05,9.29e-06,0,3.37e-05,8.02e-06,8.07e-06,9.02e-06,0,7.67e-06,7.74e-06,7.67e-06,8.49e-06,1.68e-05,1.19e-05,9.44e-06,1.02e-05,1.1e-05,1.12e-05,1.09e-05,1.04e-05,9.77e-06,8.52e-05,0,1.04e-05,0,0,0,0,8.06e-06,7.87e-06,9.01e-06,1.01e-05,1.08e-05,1.04e-05,1.05e-05,1.08e-05,1.12e-05,1.11e-05,1.06e-05,1e-05,9.94e-06,1.01e-05,1.04e-05,0,0,7.34e-06,0,8.09e-06,7.75e-06,8.74e-06,1.01e-05,1.2e-05,1.12e-05,1.25e-05,1.3e-05,1.24e-05,1.18e-05,1.05e-05,1.02e-05,9.86e-06,9.91e-06,9.6e-06,9.22e-06,8.24e-06,0,7.91e-06,7.71e-06,7.67e-06,9.25e-06,0,8.08e-06,0,3.43e-05,1.14e-05,1.36e-05,1.35e-05,1.3e-05,1.08e-05,1.05e-05,9.89e-06,9.58e-06,9.56e-06,8.67e-06,8.07e-06,7.91e-06,7.95e-06,7.58e-06,8.12e-06,9.46e-06,0,9.46e-06,1.12e-05,0,1.07e-05,1.37e-05,1.17e-05,1.1e-05,1.04e-05,9.71e-06,9.41e-06,8.8e-06,8.45e-06,8.17e-06,0,8.03e-06,8.01e-06,0,0,0,0,8.05e-06,9.1e-06,9.26e-06,9.65e-06,9.79e-06,9.73e-06,9.63e-06,9.44e-06,9.19e-06,8.38e-06,0,7.76e-06,7.68e-06,8.02e-06,7.65e-06,8.18e-06,0,7.59e-06,8.19e-06,7.86e-06,0,8.76e-06,9.25e-06,9.53e-06,9.57e-06,9.63e-06,9.31e-06,8.86e-06,8.4e-06,8.26e-06,8.13e-06,7.99e-06,8.11e-06,8.21e-06,7.5e-06,8.18e-06,7.76e-06,8.15e-06,7.9e-06,7.93e-06,8.05e-06,8.21e-06,8.43e-06,8.36e-06,8.41e-06,8.32e-06,8.18e-06,8.14e-06,8.06e-06,7.88e-06,7.78e-06,8.29e-06,7.26e-06,9.97e-06],"winrateAvg":0.337965,"leadAvg":-2.14256,"scoreMeanAvg":-2.98583,"scoreStdevAvg":16.8447,"shorttermWinlossErrorAvg":0.190531,"shorttermScoreErrorAvg":2.28402,"ownership":[-74,-77,-77,-74,-67,-55,-35,-14,13,33,54,69,77,79,75,65,25,15,-23,-71,-77,-80,-79,-71,-65,-40,-13,21,54,53,78,84,80,80,74,78,-24,-44,-66,-77,-80,-90,-65,-92,-40,-36,77,56,66,91,91,79,88,-43,78,-82,-63,-42,-89,-89,-8,-53,-92,1,-67,76,-16,77,1,-86,79,-42,-84,-84,-83,-38,-22,17,27,-25,-27,-21,-20,-64,76,-84,-84,-43,-86,-87,-63,-65,-23,68,1,2,9,4,1,-21,-16,21,-15,-87,-73,-62,-32,-23,-22,-14,-79,-23,49,60,11,10,10,-10,-24,-27,-19,-30,-45,-77,-80,-88,-7,18,13,-16,3,90,76,3,28,33,-7,-23,-25,-29,-37,-98,-69,-69,-88,91,90,90,56,92,86,84,-14,-35,31,-94,-34,-32,-33,-46,-98,-98,-70,-88,90,-34,20,58,81,85,83,-48,-30,-95,-94,-51,-40,-39,-40,-51,-71,-98,90,90,-18,-50,84,72,82,84,-60,-89,-73,-62,-51,-44,-41,-38,-40,-47,-97,-29,21,-52,7,98,87,87,85,-67,-64,-64,-57,-51,-46,-42,-37,-33,-28,-40,-93,-52,-88,-88,99,99,92,88,-65,-65,-59,-55,-49,-44,-40,-34,-29,-21,-13,-22,-34,-88,73,69,99,93,88,-61,-59,-55,-57,-49,-42,-38,-30,-23,-16,-9,-4,-10,-2,29,96,89,89,87,-35,-82,-67,-87,-41,-46,-34,-27,-18,-10,-2,3,4,0,19,48,82,88,85,-9,6,-77,15,-7,-79,-31,-17,-13,-4,2,6,0,13,30,54,95,85,82,63,6,83,84,19,6,-22,-12,-5,-1,3,7,5,4,87,64,73,78,78,63,79,77,72,51,69,11,7,0,2,4,9,14,33,50,65,68,72,74,72,73,74,68,57,38,21,6,2,-1,1,6,15,29,44,55,63,68,71],"ownershipAllowedMAE":0.0287937})%"); + lines.push_back(R"%({"sample":{"board":"...X...OO........../..X.XXOXXXX.OXX.O../.X.XO.OXOXXO.OXX.../.XXOO.OO.OXO.OOX.XX/OXOO....OOXX...OXXO/.OXX.OXXXXX.XXOOXO./..OXO.OXOO.XOOXOOO./.OOOOOXXXO...XXXXO./.O.O.OX.XOXXX..OXO./.XOX.XOOO.OOOX..XO./.XOX.XO.OOOOX..XOO./.XOOX.XO.OX.X.XO.O./X.X.XXOOO.X..X.OOO./OXXXOX..XX..X.XOXOX/OOOOOX....O.X.XX.X./OX.OXXXXX..O.XOXXX./.OOXOOOXOO..XXOOOX./OXXXXOOO.O.OXOO..OO/.X.XOOX.O...O....../","hintLoc":"null","initialTurnNumber":191,"metadata":"9EE2E235AF472FD380E0868526DBFD38:201","moveLocs":["S18","R17","S17","O19","P19","N19","T14","L6","K7","F19"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.73,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":2.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.56e-05,7.77e-05,8.16e-05,0,0.0943,0,0,0,0,0.000836,9.56e-05,0.000192,0,0,0,0.000155,0.000827,0.000435,0.000124,7.79e-05,7.9e-05,0,6.87e-05,0,0,0,0,0,0,0,0.0024,0,0,0,0.00014,0,0,0.000169,8.16e-05,0,7.84e-05,0,0,0.0613,0,0,0,0,0,0,8.43e-05,0,0,0,0,0,3.85e-05,0.0615,0,0,0,0,0.000143,0,0,0.0442,0,0,0,0.000164,0,0,0,0.000712,0,0,0,0,0,0,0.000117,0.0146,0.14,0.000682,0,0,0,0,0.00249,0.03,7.73e-05,0,0,0,0.000599,0.00295,0,0,0,9.08e-05,0,0,0,0,0,0,7.8e-05,0,0,0,0,0,0,0,0.00181,0.000811,0,0,0,0.00294,0,0,0,0,0.00129,0,0,0,0,0,0,0,0.000829,8.16e-05,0,0,0,0,0,0,0,0,0,0.00607,9.42e-05,9.05e-05,0,0,0,0,0,8.24e-05,0.0333,0,0,0,6.74e-05,0,0,9.66e-05,0,0,0,0,0,7.41e-05,7.44e-05,0,0,0,7.3e-05,0.0122,0,0,0,0.000244,0,0,0,0,0,0,0,0,0,9.23e-05,0.000103,0,0,7.31e-05,9.12e-05,0,0,0,8.65e-05,0,0,0,0,0,0,0,0,9.69e-05,9.91e-05,0,0,0,7.55e-05,6.17e-05,0,0,0,0,0.000177,0,0,0,0,0,0.00174,0,9.88e-05,0,0,0,0,7.86e-05,0,7.59e-05,0,0.157,0,0,0,0,0,0,0,0.000244,8.51e-05,0,0.0768,0,0,0,0.0106,0,0,0,0,0,0,0.000345,0.000684,0,0,0,0.00404,0,8.1e-05,0,0,0,0,0,0,0,0,0,0,0,9.44e-05,0.000123,9.69e-05,0.052,0,0.00102,0,9.71e-05,0,0,0.000121,0,0.00246,0,0,4.63e-05,0,0,0,0,0,0,0.008,0.000107,0,0.0214,0,0,0,0,0,8.75e-05,0,0,0,0,0,0,0,0,0,0,7.76e-05,0.132,0,0,0,0,0,0,0.000183,0,0,0,0,0,0,0,0,0,0,7.4e-05,0,0,0,0,7.55e-05,0.00197,0,0,3.49e-05,0,2.83e-05,0,0,0,0,7.38e-05,0,7.28e-05,8.21e-05,0.00191,0,0.00163,7.7e-05,0.000551,0.000655,0.00087,8.83e-05,7.6e-05],"winrateAvg":0.761306,"leadAvg":0.657505,"scoreMeanAvg":0.897813,"scoreStdevAvg":2.25755,"shorttermWinlossErrorAvg":0.173745,"shorttermScoreErrorAvg":0.436045,"ownership":[-99,-100,-100,-100,-96,100,100,100,99,-7,-67,5,99,100,-99,-99,-98,-97,-98,-100,-100,-100,-100,-100,-99,100,-100,-100,-100,-100,-30,100,-99,-99,-99,-97,-99,-98,-99,-100,-100,-100,100,-65,100,-100,-19,-100,-100,100,98,100,-99,-99,-98,-99,-98,-88,-100,-100,100,100,98,100,100,-15,99,-100,99,19,100,100,-99,-99,-99,-99,99,-100,100,100,99,94,-74,75,100,100,-100,-100,-50,-42,99,100,-99,-99,-21,99,100,100,100,100,100,-100,-100,-100,-100,-100,-99,-100,-100,100,100,-99,100,-28,99,100,100,100,100,52,53,-100,100,100,-74,-100,-99,-99,-100,100,100,100,68,99,100,100,100,100,100,-100,-100,-100,100,28,-52,-100,-100,-100,-100,-100,100,99,-26,100,100,100,65,100,-100,-12,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-24,-100,100,-99,2,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-99,-100,100,-100,-99,-100,100,100,100,100,100,100,-100,-100,-99,-100,100,100,99,-100,-100,100,100,-100,-51,-51,100,100,100,-100,-43,-100,-100,-100,100,100,100,95,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-11,-73,-100,9,100,100,100,35,100,-100,-100,-100,100,-100,44,20,-100,-100,99,6,-100,-100,-100,100,-53,100,-78,100,100,100,100,100,-100,-45,-41,-71,-18,100,-13,-100,-99,-100,-100,-51,-100,-82,100,15,98,100,-100,-100,-100,-100,-100,-17,92,99,28,-100,100,-100,-100,-100,-67,99,100,100,-99,100,100,100,-100,100,100,99,-41,-100,-100,100,100,100,-100,11,99,-99,-99,-99,-99,100,100,100,100,100,100,100,-100,100,100,100,99,99,99,-1,-99,6,-99,100,100,100,100,100,100,100,99,100,99,100,99,99,99,99],"ownershipAllowedMAE":0.0255235})%"); + lines.push_back(R"%({"sample":{"board":".XXXO...O.......O../XXOOOOOOXOXXX..O.OX/XXX.XO.OXOOXO.OOOX./XOXX.XOXXXOOOO.OXX./XOOX.XXXXOXXXOOXOO./OO.O.O.OXOO.XXOXOX./..OO.O.OOXO.OXXXX../...OXXXO.XO....XXX./..O.OXOXXXX..OXXOX./.O.OXX....O.OX.XOOX/O.OOOX..XXXO.XXO.O./XOOOXX...XOXX.XOOOO/XXXXO....XOO.XOXOX./OOXXXX....XXXOOXXO./..OXOXXX..XOOOOX.OO/.O.OOOXOXX.X.OXOOOX/.XO..OOOOXXOOOXXXX./..O.....OOXXOXXX.XX/..........OOOOOOXX./","hintLoc":"null","initialTurnNumber":220,"metadata":"16BAB91760361DC0857CA917E4F4B0D1:230","moveLocs":["T19","S19","M12","E15","D17","M11","T19","B5","A5","S19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.0,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":-1.0,"policyOptimism":0.951,"pda":0.0,"policyMixture":[0,0,0,0,0,8.33e-05,0.000147,0.000445,0,0.000386,0.000137,0.000118,0.000118,0.000126,0.000203,0.000981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000127,0.000126,0,0.112,0,0,0,0,0,0,0,0,0.0051,0,0,0,0,0,0,0.000117,0,0,0,0,0.00219,0,0,0,0,0.106,0,0,0,0,0,0,0,0,0,0.000112,0,0,0,0.000733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000933,0,0,0.000125,0,0.167,0,0.14,0,0,0,0,0.000145,0,0,0,0,0,0,0.000646,0.000117,0.000117,0,0,0.000228,0,0.000221,0,0,0,0,0.00011,0,0,0,0,0,0.000572,0.000134,0.000114,0.000113,0.000111,0,0,0,0,0,0.000193,0,0,0,0.112,0.00305,0.000123,0,0,0,0.000116,0.000116,0.000111,0,0.000204,0,0,0,0,0,0,0,0,0.337,0,0,0,0,0,0.000421,0.000113,0,0.000115,0,0,0,0.00012,0.000118,0.000122,0.000125,0,0.000152,0,0,0,0,0,0,0,0,0.000115,0,0,0,0,0.000117,0.000118,0,0,0,0,0.000119,0,0,0,0.00011,0,0.00039,0,0,0,0,0,0,0.000117,0.00012,0.000118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00012,0.000124,0.000119,0.000119,0,0,0,9.85e-05,0,0,0,0,0,0.000126,0,0,0,0,0,0,0.000119,0.000121,0.000119,0.000119,0,0,0,0,0,0,0,0,0.000125,0,0.000117,0,0,0,0,0,0,0.000126,0.000124,0,0,0,0,0,0,0.000262,0,0,0.000121,0,0.000115,0,0,0,0,0,0,0,0,0,5.32e-05,0,0,0,0,0,0,0.000119,0,0,0.000111,0.00011,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000257,0.000111,0.000114,0,0.000107,0.000111,0.00011,0.000111,0.000112,0,0,0,0,0,0,0,0,0,0,0,0.000117,0.000111,0.000109,0.000111,0.000112,0.000113,0.000113,0.000114,0.000118,0.000149,0,0,0,0,0,0,0,0,0,0.000132],"winrateAvg":0.00571747,"leadAvg":-4.03831,"scoreMeanAvg":-3.68753,"scoreStdevAvg":2.70191,"shorttermWinlossErrorAvg":0.0386066,"shorttermScoreErrorAvg":1.18145,"ownership":[-98,-99,-99,-99,100,99,99,99,99,99,99,99,98,98,98,96,96,39,36,-99,-99,100,100,100,99,99,99,-100,100,98,98,98,99,99,100,90,91,-75,-99,-99,-99,100,7,99,44,99,-100,100,100,98,100,99,100,100,100,-96,-78,-99,100,-99,-99,18,-99,45,-100,-100,-100,100,100,100,100,100,100,-96,-96,-95,-99,100,100,-100,-99,-99,-100,-100,-100,-99,-100,-100,-100,100,100,-100,-97,-97,-98,100,100,100,100,78,100,75,100,-100,-99,-99,-100,-100,-100,100,-100,-97,-100,-99,100,100,100,100,51,100,46,100,100,-100,-99,-99,-99,-100,-100,-100,-100,-99,-99,100,100,100,100,-100,-100,-100,100,-31,-100,-99,-99,-99,-100,-100,-100,-100,-100,-98,100,100,100,57,54,-100,-100,-100,-100,-100,-100,-100,-99,-99,-100,-100,100,-100,-95,99,100,100,100,-100,-100,-100,-100,-100,-100,-99,-100,-99,-100,-100,-100,100,100,-95,99,99,100,100,100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,100,100,100,81,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,99,100,99,100,96,96,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,99,99,100,99,96,96,99,-100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,99,99,100,100,96,99,99,100,100,100,-100,100,-100,-100,-98,-97,54,100,-100,100,100,100,-50,98,97,100,100,100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,-49,98,99,100,100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,99,99,100,100,100,100,100,100,100,99,100,100,100,100,100,100,-100,-100,-100],"ownershipAllowedMAE":0.0123108})%"); + lines.push_back(R"%({"sample":{"board":"................./......XXXXX....../..OOXXXOOOX....../.XX.XXOOOO.X.X.../XX.XXXXOOOX.XXXX./OOX.X.XOO.XOOOOXX/OXXXOOXOOOXO.OOOX/OXXOXO.OXXOO..OXX/OXXO.OOOXOOXOOOOX/OOO.OOXOXOXXXOOXX/OXXOOOXOXO.O..OOX/OOXXXXXXXO.O.OXXX/XOOOOOOOXO.O.OXOO/XXOOOO.OXO.XOOXO./.XXXOXXOXOXXXOO../...XXXXOXX.XO..O./.....XOOOXXX.OO../","hintLoc":"null","initialTurnNumber":223,"metadata":"4B2B60F90805619C1F6ED5003AAAC737:233","moveLocs":["N1","G4","D8","L14","L4","F12","L2","G10","K12","M13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":17,"ySize":17},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":9.5,"policyOptimism":0.0,"pda":-0.35,"policyMixture":[0.000975,0.00518,0.00188,0.00153,0.000942,0.000939,0.000913,0.000924,0.000921,0.000919,0.000896,0.000902,0.000879,0.000877,0.000875,0.000908,0.000896,0.0129,0.0221,0.00366,0.00142,0.0277,0.000938,0,0,0,0,0,0.000891,0.000919,0.000924,0.00091,0.000967,0.000908,0.000986,0.017,0,0,0,0,0,0,0,0,0,0.000869,0.000932,0.000872,0.000968,0.000918,0.000879,0.000891,0,0,0.00105,0,0,0,0,0,0,0,0,0.000873,0,0.000866,0.000889,0.000887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000856,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00102,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.012,0,0,0.00167,0.000988,0,0,0,0,0,0,0,0.0132,0,0,0,0.0112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000965,0,0.0108,0,0,0,0,0,0,0,0,0,0.00105,0.000988,0,0,0,0.00472,0,0.0119,0,0.0166,0,0.0173,0.0129,0,0,0,0,0,0.000946,0.0038,0.00693,0.00951,0.00092,0.0123,0.000972,0,0.012,0,0.0121,0,0,0,0,0,0,0,0,0,0,0,0,0.0117,0,0.0118,0,0.0116,0,0,0,0,0,0,0,0,0,0,0,0,0.0111,0,0,0.0136,0,0,0,0,0.00103,0.000927,0,0,0,0,0,0,0,0.012,0,0.0128,0.000869,0.0122,0,0,0.0146,0.000857,0.0285,0.089,0.00807,0,0,0,0,0,0.00102,0.0133,0,0.0134,0,0.0114,0.0134,0,0.000943,0.00105,0.0316,0.0289,0.0318,0.000974,0,0,0,0,0.000899,0.000999,0.000889,0,0,0,0.0114,0.000864,0.293],"winrateAvg":0.999981,"leadAvg":43.3007,"scoreMeanAvg":43.4381,"scoreStdevAvg":1.11368,"shorttermWinlossErrorAvg":0.00133444,"shorttermScoreErrorAvg":0.452642,"ownership":[-99,-99,-99,-99,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-99,-99,-100,-99,-99,-99,-99,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-99,-98,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,-100,-100,100,-100,-100,-100,100,100,-100,100,100,100,-100,100,100,100,100,100,-100,100,-100,-100,100,99,100,-100,100,100,100,100,100,100,100,100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,99,100,99,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,-100,-100,100,100,100,100,-100,100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.00334155})%"); + lines.push_back(R"%({"sample":{"board":".................../.........OXXXX.O.../...O.X.O.OOXOOOX.X./...O..O.OXXOOX.X.O./.....OX.O..XXX.XO../...O..X.OX........./.OXO....OXOX...XO../.OXO.XXO..XOOOO.O../.OOX...XO.X..XXOO../.XXX.X.XO.XOOXOXOX./...X.....XOXXXO.OX./.OOOX.....OX.X.OXO./..OXOOO..OOOXXXOXX./...XOX....OXXOX..../..OXXX.....OOO..X../..OO...OOO.OXO.X.../..O..XX.XXX.X.OX.../.XOX........X....../.................../","hintLoc":"null","initialTurnNumber":156,"metadata":"FEF8B0A06F242FF21A70FB3D194FDA47:166","moveLocs":["H8","H9","F8","J9","H7","J8","J6","Q14","R16","P14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.24,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":6.5,"policyOptimism":0.0,"pda":-1.545,"policyMixture":[5.86e-05,7.87e-05,8.45e-05,6.76e-05,7e-05,7.44e-05,7.59e-05,0.000123,0.00037,0.0291,0.000101,6.58e-05,5.93e-05,7.14e-05,7.27e-05,7.43e-05,6.49e-05,6.08e-05,5.72e-05,8.15e-05,0.00307,0.00453,0.00429,8.48e-05,7.76e-05,8.28e-05,0.00188,0.0417,0,0,0,0,0,0.00123,0,0.000131,6.15e-05,6.1e-05,6.79e-05,0.0029,0.00354,0,7.21e-05,0,0.00029,0,0.000449,0,0,0,0,0,0,0,6.25e-05,0,6.64e-05,6.68e-05,0.000318,0.000196,0,7.02e-05,0.000466,0,0.000125,0,0,0,0,0,0,9.04e-05,0,0,0,7.8e-05,7.17e-05,0.00214,0.00179,9.83e-05,0.00055,0,0,7.5e-05,0,7.35e-05,6.85e-05,0,0,0,7.32e-05,0,0,0.000434,7.03e-05,6.75e-05,0.000132,0.00556,0,0.000103,0.000105,0,5.99e-05,0,0,7.38e-05,6.27e-05,6.79e-05,8.09e-05,0,0,7.74e-05,8.37e-05,6.87e-05,6.84e-05,0,0,0,7.1e-05,6.85e-05,6.58e-05,0.00497,0,0,0,0,7.27e-05,0.000403,0.000327,0,0,6.98e-05,7.3e-05,6.89e-05,0,0,0,7.69e-05,0,0,0,7.23e-05,0.00775,0,0,0,0,0,5.71e-05,0,6.71e-05,7.41e-05,7.43e-05,0,0,0,6.83e-05,6.33e-05,6.42e-05,0,0,0.000119,0,0.000117,0.000111,0,0,0,0,8.54e-05,7.19e-05,7.59e-05,0,0,0,6.24e-05,0,6.97e-05,0,0,0.000348,0,0,0,0,0,0,0,0,5.91e-05,0.000119,7.67e-05,6.93e-05,0,6.61e-05,6.8e-05,0.0132,0,0,0,0,0,0,0,0,0,0,0,6.4e-05,9.85e-05,0,0,0,0,0,0.027,0,0,8.41e-05,0,0,5.47e-05,0,0.00867,0,0,0,6.92e-05,9.25e-05,7.7e-05,0,0,0,0,0,0,0.000755,0,0,0,0,0,0,0,0,0,6.06e-05,8.66e-05,0.00154,0.00313,0,0,0,0.000612,0.000232,0,0.000101,0,0,0,0,0,0.00133,7.15e-05,6.97e-05,5.92e-05,7.53e-05,8.64e-05,0,0,0,0,7.06e-05,0.000644,0.000107,0.00148,0.00378,0,0,0,9.1e-05,7.18e-05,0,6.81e-05,6.66e-05,7.26e-05,7.97e-05,0,0,7.24e-05,6.9e-05,7.4e-05,0,0,0,0.00991,0,0,0,0.0047,0,7.04e-05,7.43e-05,6.37e-05,7e-05,7.76e-05,0,9.53e-05,0.0305,0,0,7.73e-05,0,0,0,7.54e-05,0,0.007,0,0,7.62e-05,7.6e-05,6.37e-05,6.31e-05,0,0,0,0.0405,0.00309,6.94e-05,7.17e-05,6.85e-05,6.75e-05,6.87e-05,6.96e-05,0,6.44e-05,0.458,0.000101,8.48e-05,7.61e-05,6.51e-05,6.12e-05,8.11e-05,0.253,9.27e-05,0.00131,0.000106,8.05e-05,6.39e-05,6.42e-05,6.53e-05,6.47e-05,6.21e-05,6.71e-05,7.57e-05,8.87e-05,8.5e-05,7.4e-05,6.9e-05,5.97e-05,5.96e-05],"winrateAvg":0.963009,"leadAvg":3.35004,"scoreMeanAvg":3.74681,"scoreStdevAvg":5.62368,"shorttermWinlossErrorAvg":0.10417,"shorttermScoreErrorAvg":1.29465,"ownership":[95,94,95,95,95,95,95,93,91,60,53,15,-24,-80,-92,-94,-92,-91,-85,94,94,95,96,96,95,96,96,93,98,-94,-94,-94,-94,-91,-86,-95,-84,-82,95,95,96,100,96,93,96,100,98,98,98,-95,-93,-93,-93,-100,-94,-94,-43,96,96,97,100,92,95,98,76,100,-98,-98,-92,-93,-100,-97,-100,-99,20,-28,96,96,97,92,77,97,-90,-13,100,55,-94,-100,-100,-100,-11,-100,66,15,29,95,97,98,100,41,-4,-91,22,100,-98,-97,-44,-8,-20,99,99,67,83,58,85,98,98,100,27,-30,-70,-11,100,-98,-82,-83,32,21,94,95,100,80,73,48,98,98,100,42,-98,-98,98,97,-21,-97,100,100,100,100,99,100,75,63,-20,98,99,-99,-68,-92,-91,-92,100,-3,-98,-4,57,-97,-98,100,100,37,35,-73,-99,-99,-99,-90,-99,-3,-91,100,-10,-97,97,97,-97,98,98,100,-90,1,-30,-20,-32,-99,-98,-19,14,100,100,-14,99,-98,-97,-97,97,98,100,-91,-81,51,93,93,93,-99,-99,-94,-98,100,83,99,-98,-97,-97,-56,98,-97,-92,-92,84,90,93,-100,-92,-91,-89,-98,1,100,100,99,-97,-97,-97,98,-97,-97,-95,86,88,-36,-100,-92,-99,-88,-53,-93,12,100,-97,-97,98,-98,85,55,-95,-95,88,91,94,-100,-100,-99,-8,16,28,45,96,97,97,98,-87,9,-97,-94,-95,87,89,94,94,9,-64,2,92,93,93,15,97,-97,97,-38,-99,-96,-95,-94,82,82,94,74,-58,-99,-99,29,-98,-98,-98,45,-98,52,83,-99,-94,-93,-93,75,56,95,3,21,-89,-89,-91,-95,-96,-95,-93,-98,-65,-68,-87,-87,-89,-92,63,62,55,46,-9,-47,-79,-85,-91,-93,-93,-89,-79,-72,-68,-74,-83,-86,-90],"ownershipAllowedMAE":0.0429126})%"); + lines.push_back(R"%({"sample":{"board":"...............X.../..O.O.........XOX../..OXOX.X..X..XXOOX./..OX.OXO....O.OX.X./...X.OX.......O.XO./.O...OX...XO.X..XO./..OX..X...O....OO../..XOOOOX...O......./..XXX..O......OOX../..OOXXX........XX../...XOXOX.........../.O.XOO.......X...../....XO.........X.../..OX..........OOX../.O.O.O.........XX../.XOO...X.....OOOX../.XXXXOXO.....X.OOX./.....X.........O.OX/................O../","hintLoc":"null","initialTurnNumber":115,"metadata":"3C7281988A1F4ED8BBFD77F611ECE1DF:125","moveLocs":["J12","H13","F18","J11","D14","N4","L16","K16","L15","O16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.95,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":8.5,"policyOptimism":0.0,"pda":-2.929,"policyMixture":[3.4e-05,3.47e-05,3.68e-05,3.64e-05,3.79e-05,3.84e-05,4.29e-05,4.42e-05,4.52e-05,4.39e-05,4.29e-05,4.24e-05,3.91e-05,3.66e-05,0.000163,0,0.000304,3.33e-05,3.45e-05,3.54e-05,3.7e-05,0,3.84e-05,0,0,4.72e-05,7.2e-05,5.95e-05,6.68e-05,8.09e-05,5.09e-05,4.81e-05,3.89e-05,0,0,0,0.000143,3.28e-05,3.73e-05,3.68e-05,0,0,0,0,0.000902,0,0.000233,0.00972,0,0.0892,4.58e-05,0,0,0,0,0,3.79e-05,3.8e-05,3.83e-05,0,0,3.78e-05,0,0,0,0.000382,0,0,4.05e-05,0,0,0,0,2.15e-05,0,4.09e-05,3.74e-05,3.82e-05,4.14e-05,0,3.59e-05,0,0,5.57e-05,0.000112,0.000744,0,4.03e-05,4.26e-05,0.656,0,5.08e-05,0,0,4.25e-05,3.85e-05,0,3.84e-05,0,3.93e-05,0,0,4e-05,0.000337,0.00052,0,0,5.18e-05,0,0.000229,5.3e-05,0,0,3.84e-05,4.52e-05,4.44e-05,0,0,4.61e-05,4.35e-05,0,0,0.000147,6.34e-05,0,4.24e-05,7.84e-05,0.000521,0.000141,0,0,4.92e-05,4.53e-05,3.89e-05,6.78e-05,0,0,0,0,0,0,0,0.000244,5.16e-05,0,8.95e-05,0.00015,5.12e-05,4.41e-05,5.9e-05,0.000109,4.69e-05,3.81e-05,5.1e-05,0,0,0,3.66e-05,0.00457,0,0,0.00104,0.000464,9.73e-05,0.000374,9.28e-05,0,0,0,6.11e-05,4.35e-05,4.05e-05,0.000124,0,0,0,0,0,0.000161,0.109,0.000353,0.00111,0.00106,0.000747,0.00026,0.000863,0,0,5.45e-05,4.44e-05,4.06e-05,4.61e-05,5.39e-05,0,0,0,0,0,0.000111,0.000392,0.000759,0.000633,0.000623,0.000769,0.000161,6.51e-05,5.25e-05,5.28e-05,4.22e-05,4.06e-05,0,4.41e-05,0,0,0,0.000238,8.61e-05,0.000687,0.000415,0.000442,0.000335,0.000438,0,0.000544,0.000601,0.000127,5.77e-05,4.06e-05,4.07e-05,3.92e-05,4.31e-05,4.7e-05,0,0,0.000278,0.013,0.000555,0.000342,0.000282,0.000247,0.000398,0.000196,0.0262,0,0.000927,7.11e-05,4.13e-05,4.07e-05,3.9e-05,0,0,0.000346,0.00112,0.000411,0.000293,0.000314,0.000239,0.000247,0.000288,0.000759,7.13e-05,0,0,0,4.62e-05,4.03e-05,4.11e-05,0,3.89e-05,0,4.61e-05,0,6.02e-05,0.000789,0.000111,0.000131,0.000173,0.000171,0.000388,5.11e-05,5.6e-05,0,0,4.28e-05,4.21e-05,4.24e-05,0,0,0,4.66e-05,0.0536,6.71e-05,0,0.000452,6.72e-05,0.000191,0.000267,0,0,0,0,0,0.000153,3.93e-05,3.73e-05,0,0,0,0,0,0,0,5.66e-05,6.15e-05,8.4e-05,6.92e-05,0.00108,0,4.27e-05,0,0,0,4.24e-05,3.31e-05,3.47e-05,3.46e-05,3.48e-05,3.68e-05,0,4.7e-05,4.95e-05,5.06e-05,5.15e-05,5.43e-05,6.62e-05,0.000492,6.06e-05,4.3e-05,0,3.21e-05,0,0,3.4e-05,3.39e-05,3.35e-05,3.34e-05,3.6e-05,3.81e-05,3.86e-05,3.91e-05,3.91e-05,4.03e-05,4.16e-05,4.23e-05,4.42e-05,4.57e-05,4.58e-05,3.89e-05,0,3.84e-05,4.12e-05,4.14e-05],"winrateAvg":0.065189,"leadAvg":-5.04728,"scoreMeanAvg":-6.85855,"scoreStdevAvg":10.8223,"shorttermWinlossErrorAvg":0.0935574,"shorttermScoreErrorAvg":1.68093,"ownership":[97,97,98,97,94,66,34,-5,-26,-40,-45,-47,-56,-73,-91,-99,-98,-98,-97,96,97,99,94,98,98,14,-25,-41,-49,-52,-44,-61,-80,-99,-97,-98,-97,-97,94,96,99,91,98,19,18,-76,-46,-50,-74,-8,-55,-99,-99,-97,-96,-99,-92,89,94,99,90,94,98,-87,-26,-43,-70,79,-11,20,-99,73,-96,-96,-99,-32,79,86,93,89,94,98,-88,-49,-17,24,83,53,-8,69,74,9,-94,66,-12,14,97,92,97,93,98,-88,-54,-4,18,17,88,61,24,45,26,-91,63,43,0,-27,94,92,96,10,-88,-88,-26,18,88,74,51,54,56,83,83,60,33,-45,-28,-91,97,97,97,97,-86,17,-6,35,90,49,44,53,46,4,-22,5,-45,-69,-92,-91,-91,-15,4,28,-59,-27,3,21,13,23,81,81,-95,-62,-38,-7,-12,78,79,-90,-90,-90,-22,9,1,1,4,-1,-6,5,-96,-95,-82,-60,39,24,73,69,91,-90,-55,-88,-28,-9,-4,-4,-8,-16,-25,-52,-79,-81,-72,63,89,81,69,91,91,-57,-35,-17,-13,-7,-7,-13,-76,-23,-60,-75,-82,-76,71,76,82,80,76,91,10,-1,-14,-11,-8,-5,4,-9,17,-89,-79,-80,-73,69,78,94,74,85,78,19,-7,-12,-13,-11,-10,16,17,51,51,-90,-78,-64,9,91,90,92,64,90,9,-6,-23,-25,-27,-29,-10,28,2,-89,-90,-58,-44,-18,-99,91,91,-28,4,-35,-86,-42,-44,-49,-60,-85,77,77,77,-88,-13,-27,-95,-99,-99,-99,-99,2,-92,-56,-67,-59,-62,-63,-57,-63,40,76,76,-7,-3,-97,-98,-98,-98,-95,-95,-83,-78,-69,-67,-65,-60,-55,-22,22,76,68,66,0,-97,-98,-98,-97,-94,-89,-83,-75,-71,-66,-63,-55,-36,-7,37,62,72,58,44],"ownershipAllowedMAE":0.0492954})%"); + lines.push_back(R"%({"sample":{"board":"................O../....XX...XXO.OXOOOX/....OOX..XOOOOOXOX./..XXXOXXXO...XXXOX./.XXOOX..O..X.X.XOX./.XO.OX........XOXO./.O.OO.O......OXOXX./..O.X......OOX.O.../..OOOOX.....X.XXX../..XXOO.X......OOOX./.XX.XOOXOOOOO...XO./X.X.XOX.XOXXX.O.XO./...XXOXXXX.XXOOOXO./.X.XXXO...X.XO..O.O/X.XOOO..X..XO..OO../XXXO.OOX...O.O..O../XXXOO.OX.O..O.OOXX./..XO.OXXO....O..O../XXXOXX..X........../","hintLoc":"null","initialTurnNumber":192,"metadata":"578F431361C86606357592AC885CBBA4:202","moveLocs":["K1","L2","L3","S11","K2","K15","J14","L16","H11","M11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.31,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":8.0,"policyOptimism":0.473,"pda":0.0,"policyMixture":[1.61e-06,1.81e-06,1.79e-06,1.84e-06,1.81e-06,1.76e-06,1.7e-06,1.71e-06,1.84e-06,2.31e-06,2.47e-06,2.56e-06,2.1e-06,1.97e-06,2.77e-06,1.78e-06,0,1.96e-06,2.32e-06,1.79e-06,2.15e-06,3.14e-06,3.21e-06,0,0,2.05e-06,2.03e-06,1.98e-06,0,0,0,1.28e-06,0,0,0,0,0,0,1.89e-06,2.21e-06,1.25e-05,0.000103,0,0,0,1.86e-06,2.01e-06,0,0,0,0,0,0,0,0,0,8.97e-06,2.08e-06,2.03e-06,0,0,0,0,0,0,0,0,0,2.5e-06,1.45e-05,0,0,0,0,0,2.51e-06,2.52e-06,0,0,0,0,0,0.000191,2.71e-06,0,0,3.23e-06,0,3.47e-05,0,0,0,0,0,2.5e-06,2.68e-06,0,0,1.3e-06,0,0,9.61e-05,4.12e-06,0,0.000232,0.000102,0.000147,2.03e-05,2.43e-06,0,0,0,0,2.72e-06,2.53e-06,0,1.55e-06,0,0,4.36e-05,0,5.7e-06,7.68e-05,0.00616,0.00665,6.75e-05,1.7e-05,0,0,0,0,0,2.12e-06,2.33e-06,2.39e-06,0,1.6e-06,0,2.42e-06,9.62e-06,0.000154,0.000367,0.139,0.78,0,0,0,0.000728,0,2.57e-06,2.56e-06,1.87e-06,2.61e-06,4.71e-06,0,0,0,0,0,0,0.00512,0.000168,0.000562,0,0,3.81e-06,0,0,0,0,2.13e-06,2.8e-06,2.4e-06,0,0,0,0,6.47e-05,0,0.00209,5.38e-06,3.64e-06,2.48e-06,3.58e-06,0.0263,0,0,0,0,2.38e-06,1.69e-06,0,0,1.78e-06,0,0,0,0,0,0,0,0,0,2.74e-06,2.01e-06,1.76e-06,0,0,2.23e-06,0,1.98e-06,0,1.89e-06,0,0,0,0,0,0,0,0,0,4.69e-06,0,1.72e-06,0,0,1.8e-06,1.8e-06,1.97e-06,1.97e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.55e-06,1.78e-06,0,1.87e-06,0,0,0,0,5.89e-06,3.55e-06,8.11e-06,0,0,0,0,1.48e-06,1.51e-06,0,1.68e-06,0,0,0,0,0,0,0,7.18e-06,0.0191,0,0.000864,0.0102,0,0,1.51e-06,1.55e-06,0,0,1.72e-06,1.73e-06,0,0,0,0,1.05e-06,0,0,0,0.000432,9.98e-06,4.67e-06,0,1.55e-06,0,1.56e-06,1.57e-06,0,1.78e-06,1.78e-06,0,0,0,0,0,1.22e-06,0,0,2.52e-06,0,0,1.59e-06,0,1.48e-06,0,0,0,0,1.85e-06,1.78e-06,1.89e-06,0,0,3.95e-06,0,0,0,0,0,0,1.62e-06,1.6e-06,0,1.85e-06,1.88e-06,0,2.11e-06,1.89e-06,0,0,0,0,0,0,3.14e-06,2.16e-06,0,0,1.6e-06,1.56e-06,1.56e-06,1.6e-06,1.9e-06,2.08e-06,1.79e-06,1.86e-06,1.52e-06,9.87e-06],"winrateAvg":0.995171,"leadAvg":3.6921,"scoreMeanAvg":4.09998,"scoreStdevAvg":3.62395,"shorttermWinlossErrorAvg":0.0312508,"shorttermScoreErrorAvg":0.968296,"ownership":[-99,-99,-99,-99,-100,-100,-100,-100,-99,-93,-4,16,96,98,98,98,98,76,6,-99,-99,-99,-99,-100,-100,-100,-100,-100,-100,-100,98,97,98,98,98,98,98,-72,-99,-99,-99,-99,-97,-96,-100,-100,-100,-100,99,99,99,98,99,-100,98,-99,-70,-99,-100,-100,-100,-100,-91,-100,-100,-100,-94,-98,-20,26,-100,-100,-100,97,-99,-93,-93,-100,-100,100,100,-90,-24,-30,69,-95,-56,-97,-57,-100,-99,-100,98,-99,-98,-8,-100,100,99,100,-84,16,15,70,1,-1,-11,-7,-59,-100,-98,-100,-99,-99,34,99,98,100,100,45,94,37,17,-3,30,34,18,24,-100,-98,-100,-100,-99,40,68,100,92,69,66,30,40,7,17,88,91,88,-99,-98,-98,-99,-100,-99,12,-9,100,100,100,100,-15,78,13,1,-10,-96,-97,-88,-100,-100,-100,-100,-94,-46,-51,-100,-100,100,100,12,-79,-2,29,24,-5,26,21,99,99,99,-100,-8,-87,-100,-100,-100,-100,100,100,-89,99,100,100,100,100,80,94,99,98,100,-10,-100,-100,-100,-100,-100,100,-98,-89,-98,100,-95,-95,-95,16,100,99,98,100,91,-100,-100,-100,-100,-100,100,-98,-98,-98,-98,-95,-95,-95,100,100,100,99,100,99,-100,-100,-100,-100,-100,-100,85,-46,-89,-88,-96,-75,-95,100,100,100,100,100,100,-100,-100,-100,100,100,100,86,-17,-97,-65,-32,-71,99,99,100,100,100,99,99,-100,-100,-100,100,100,100,100,-94,-58,-6,14,100,98,100,100,100,100,99,99,-100,-100,-100,100,100,99,100,-94,29,100,100,100,100,100,100,100,98,98,99,-100,-100,-100,100,98,99,-95,-95,100,100,99,100,100,100,100,99,99,99,99,-100,-100,-100,100,-83,-88,-85,-30,-27,100,100,100,100,100,99,99,99,99,99],"ownershipAllowedMAE":0.0236106})%"); + lines.push_back(R"%({"sample":{"board":".................../....XO............./..O.XOXXO....XO.O../..OXXX.XO....XOO.O./...OXOXO.....XXXOO./...OX...O.XXXXOOXXO/.....X.O..XOOO...../...O.....X....OO.X./....O.O.OX..X.OXX../...........XOO.OX../..XX.X..O.XXXX.OX../..OO..X.XX.O..OO.XX/.....OX.OOO.O.OXXXO/..O.X....X.O..OXXO./.......O..O.XXXOO.O/..OXX.XXOO.XXOOXOO./..OOX...XX.....XO.O/...............XXO./.................X./","hintLoc":"null","initialTurnNumber":130,"metadata":"5FEEBBDDED453C2BC9A28204CEC4C251:140","moveLocs":["T6","S10","J18","H18","D18","E19","C11","B10","M18","P18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.77,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":5.0,"policyOptimism":0.734,"pda":0.0,"policyMixture":[3.91e-06,4.45e-06,4.38e-06,4.02e-06,0,3.79e-06,1.31e-05,0.000178,5.06e-06,4.53e-06,4.62e-06,5.2e-06,2.21e-05,1.25e-05,5.15e-06,4.92e-06,5.07e-06,4.87e-06,4.03e-06,4.26e-06,4.14e-06,4.14e-06,0,0,0,3.07e-05,0,0,4.77e-06,4.65e-06,0,0.091,4.23e-05,0,0.733,6.92e-06,6.15e-06,4.59e-06,4.2e-06,4.3e-06,0,3.95e-06,0,0,0,0,0,4.13e-06,6.05e-06,1.81e-05,2.19e-05,0,0,4.7e-06,0,4.26e-06,4.25e-06,4.25e-06,4.24e-06,0,0,0,0,0,0,0,4.94e-06,5.03e-06,6e-06,4.19e-06,0,0,0,3.72e-06,0,4.1e-06,4.04e-06,4.37e-06,4.23e-06,0,0,0,0,0,4.22e-06,6.36e-06,5.11e-06,4.4e-06,3.74e-06,0,0,0,0,0,8.4e-06,4.22e-06,4.45e-06,4.51e-06,0,0,6.14e-06,0.00532,4.2e-06,0,4.82e-06,0,0,0,0,0,0,0,0,0,4.17e-06,4.18e-06,4.11e-06,4.72e-06,4.36e-06,0,6.41e-06,0,4.64e-06,5.38e-06,0,0,0,0,4.8e-06,0.000241,0.000172,0.0003,0.000104,4.19e-06,5.32e-06,4.38e-06,0,4.83e-06,5.46e-06,6.02e-06,5.46e-06,6.43e-06,0,5.74e-06,2.49e-05,4.68e-06,4.4e-06,0,0,0.00167,0,0.000346,4.17e-06,1.81e-05,0,4.17e-06,0,4.72e-06,0,5.05e-06,0,0,4.94e-06,5.29e-06,0,5.3e-06,0,0,0,5.63e-06,0.0818,3.86e-06,0,5.3e-06,6.31e-06,1.07e-05,7.67e-06,8.76e-06,1.92e-05,6.72e-06,1.47e-05,4.09e-06,0,0,0,4.34e-06,0,0,0,0.000172,4.31e-06,4.86e-06,0,0,0.0802,0,7.72e-06,0.000267,0,5.32e-06,0,0,0,0,4.79e-06,0,0,5.24e-06,3.35e-05,4.38e-06,6.69e-06,0,0,0.000359,7.08e-06,0,7.32e-05,0,0,1.53e-05,0,4.45e-06,4.8e-06,0,0,3.91e-05,0,0,3.86e-06,4.65e-06,4.32e-06,4.24e-06,4.64e-06,0,0,1.77e-05,0,0,0,3.2e-06,0,4.23e-06,0,0,0,0,0,4.27e-06,4.29e-06,0,4.58e-06,0,9.58e-06,7.24e-06,4.53e-06,4.68e-06,0,4.2e-06,0,4.79e-06,4.63e-06,0,0,0,0,0,4.11e-06,4.11e-06,4.23e-06,4.72e-06,4.51e-06,4.69e-06,1.38e-05,0,4.16e-06,4.42e-06,0,4.39e-06,0,0,0,0,0,3.76e-06,0,4.29e-06,4.06e-06,0,0,0,4.74e-06,0,0,0,0,0.000152,0,0,0,0,0,0,0,3.54e-06,3.97e-06,4e-06,0,0,0,4.93e-06,6.48e-06,8.29e-05,0,0,0.000192,1.13e-05,4.95e-05,0.00236,2.89e-05,0,0,3.77e-06,0,4.11e-06,3.95e-06,4.65e-06,6.04e-06,3.11e-05,5.73e-06,5.62e-06,7.59e-06,6.41e-06,9.47e-06,1.16e-05,1.55e-05,8.56e-05,9.72e-05,0.000326,0,0,0,3.98e-06,3.91e-06,4.12e-06,4.51e-06,4.64e-06,4.43e-06,4.28e-06,4.38e-06,4.35e-06,4.48e-06,4.33e-06,4.47e-06,4.17e-06,4.29e-06,1.07e-05,5.81e-06,7.59e-06,2.4e-05,0,4.95e-06,4.59e-06],"winrateAvg":0.519134,"leadAvg":-0.0720613,"scoreMeanAvg":0.298415,"scoreStdevAvg":11.6103,"shorttermWinlossErrorAvg":0.243985,"shorttermScoreErrorAvg":1.6843,"ownership":[79,75,2,-41,-99,-97,-94,-23,6,62,59,32,-14,-35,30,58,89,93,94,84,83,14,58,-98,-96,-96,-97,92,59,62,81,-18,-44,-41,92,95,94,95,85,89,95,-26,-98,-95,-97,-97,91,30,12,29,-15,-95,95,91,98,96,95,82,88,94,-98,-98,-98,-96,-97,91,5,-9,-10,-35,-96,94,96,96,97,88,71,81,89,94,-98,-94,-95,87,85,-47,-43,-42,-67,-96,-96,-96,97,97,50,48,64,65,93,-99,-95,10,57,91,-8,-96,-96,-96,-96,93,93,-87,-87,49,20,34,38,37,-32,-97,2,90,38,-48,-95,94,94,94,91,52,8,-78,-38,-6,22,64,95,26,-10,19,44,-15,-95,-31,17,7,41,96,96,6,-96,-77,-52,23,88,56,90,24,84,35,66,-96,-53,-62,-68,-28,96,-96,-97,-94,-90,-56,-80,-25,-13,11,-35,12,-8,8,-20,-59,-96,92,94,92,96,-96,-96,-89,-44,-36,-81,-80,-49,-93,-34,6,43,-53,-95,-95,-95,-95,26,96,-96,-93,-91,-1,-24,88,88,-34,-49,-95,-42,-90,-90,17,89,-1,1,96,96,-7,-96,-95,14,80,71,-12,-31,7,-95,12,96,96,96,89,96,66,96,-95,-95,-95,97,67,80,93,-7,-88,-33,-28,-15,87,85,92,96,27,8,95,-96,-95,97,97,76,78,46,-3,-57,-41,-9,66,63,90,95,2,-98,-98,-97,97,97,97,97,87,91,95,-98,-98,-69,-97,-97,93,93,-4,-97,-97,-91,-91,-91,97,97,97,89,92,95,95,-97,-83,-86,-89,-96,-96,-81,-91,-92,-92,-91,-91,97,96,96,88,85,91,19,-30,-74,-79,-84,-89,-90,-90,-91,-92,-92,-89,-91,-92,96,70,83,79,52,39,-3,-41,-61,-77,-84,-88,-89,-91,-91,-91,-90,-86,-64,-62,38],"ownershipAllowedMAE":0.0335718})%"); + lines.push_back(R"%({"sample":{"board":"..OX.O..O.X......../.XO.OXO..OXO..XOO../.XXOOXO.OX...XXOX../...OXXO.OX...XOOOO./....X...OX....XO.../..XXXOOOX.....XXO../.XXOOXXXX.....XOO../.OX......X.....X.../.OX...OX.OXX...XO../.OX..X.XOXOXO..XOO./.OXXOOX.O.OOXO.XXO./..OX...O.OOXXO.XOO./OOOX..O.OXXXOXX.XX./.XXOXO.OXX.XOO...../...O.OXXXOXOXXX..../.O.O.OXOOOOOX..X.../.XXOXXOOO..OOX...../..O...XO....OX...../.................../","hintLoc":"null","initialTurnNumber":42,"metadata":"5969AD1B692702D762F71F757DD4A2B7:52","moveLocs":["G10","H9","J11","H12","F8","E10","T7","T6","O1","P1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.6,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":0.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000156,0.0048,0,0,0.000232,0,0.000172,0.000155,0,0.0332,0,0.00408,0.0385,0.00455,0.0191,0.000644,0.000165,0.000152,0.000151,0.000184,0,0,0.000498,0,0,0,0.000153,0.000169,0,0,0,0.0117,0.00366,0,0,0,0.00015,0.000152,0.000183,0,0,0,0,0,0,0.000149,0,0,0.0435,0.00359,0.00432,0,0,0,0,0.000156,0.000146,0.000185,0.00058,0.197,0,0,0,0,0.000149,0,0,0.00209,0.00294,0.00369,0,0,0,0,0,0.000148,0.00336,0.00953,0.00543,0.000169,0,0.000208,0.000175,0.000168,0,0,0.00218,0.00156,0.00242,0.00325,0,0,0.000155,0.00015,0.000148,0.00238,0.000452,0,0,0,0,0,0,0,0.00186,0.000927,0.000363,0.000362,0.000273,0,0,0,0.000154,0.00015,0.00671,0,0,0,0,0,0,0,0,0.00105,0.000561,0.000415,0.000227,0.000315,0,0,0,0.000158,0.000154,0.000784,0,0,0.000153,0.000156,0.000172,0.000165,0,0.00274,0,0.00404,0.000758,0.000385,0.00025,0.000457,0,0.000225,0.000182,0.000154,0.000164,0,0,0.000161,0.00017,0.000162,0,0,0,0,0,0,0.000464,0.000209,0.000161,0,0,0.000161,0.000156,0.000143,0,0,0.000163,0,0,0,0,0,0,0,0,0,0.000168,0.000159,0,0,0,0.000152,0.000155,0,0,0,0,0,0,0,0,0.000149,0,0,0,0,0.000153,0,0,0,0.000386,0.000154,0.000151,0,0,0.000168,0,0.000186,0,0.000153,0,0,0,0,0,0.000157,0,0,0,0.204,0,0,0,0,0.000533,0.000181,0,0.000174,0,0,0,0,0,0,0,0.000244,0,0,0,0.000162,0,0,0,0,0,0.108,0,0,0,0.0124,0,0,0,0.000331,0.00101,0.000221,0.000214,0,0.000157,0.000158,0.000161,0,0.000183,0,0,0,0,0,0,0,0,0,0,0.000153,0.000158,0.000157,0.000191,0.000155,0,0.00016,0,0.000162,0,0,0,0,0,0,0,0,0.000154,0.000146,0,0.000157,0.000157,0.000151,0.000157,0,0,0,0,0,0,0,0,0.000147,0.00015,0,0,0,0.000151,0.000149,0.00016,0.000162,0.000156,0.000156,0.000167,0,0.000157,0.000167,0.000157,0,0,0.00015,0.000157,0.000161,0.000155,0,0,0.000173,0.000142,0.000156,0.000163,0.000162,0.000147,0.000152,0.000153,0.000162,0.000155,0.000152,0.000158,0.000154,0.000153,0.000158,0.000165,0.00077,0.222,0,0,0.000176,0.000151,0.000161,0.000155,0.000129],"winrateAvg":0.00103623,"leadAvg":-6.61828,"scoreMeanAvg":-6.50282,"scoreStdevAvg":2.20963,"shorttermWinlossErrorAvg":0.0144358,"shorttermScoreErrorAvg":0.634293,"ownership":[-47,-18,95,95,98,99,99,99,99,12,-99,-97,-95,-96,-10,16,98,98,99,-61,-99,95,96,99,-100,100,99,98,98,-99,-95,-97,-97,-100,100,100,98,98,-88,-99,-99,99,99,-100,100,99,100,-100,-98,-99,-97,-100,-100,100,98,99,98,-96,-97,85,99,-100,-100,100,99,100,-100,-98,-97,-98,-100,100,100,100,100,99,-94,-92,-22,-52,-100,8,25,99,100,-100,-98,-98,-98,-99,-100,100,99,99,99,-94,-96,-100,-100,-100,99,100,100,-100,-98,-98,-98,-98,-98,-100,-100,100,99,99,-10,-100,-100,-98,-98,-100,-100,-100,-100,-98,-98,-98,-98,-98,-100,100,100,99,99,12,100,-100,-99,-99,-98,-99,-100,15,-100,-98,-98,-98,-98,-99,-100,-24,99,99,97,100,-100,-98,-98,-99,-98,-100,100,100,-100,-100,-99,-98,-98,-100,100,99,98,98,100,-100,-99,-100,-100,-98,-100,100,98,100,-100,-98,-99,-98,-100,100,100,98,99,100,-100,-100,100,100,-100,-100,100,99,100,100,-100,-97,-98,-100,-100,100,98,99,99,100,-100,-64,100,46,100,100,100,100,-100,-100,-97,-99,-100,100,100,99,100,100,100,-100,31,80,100,98,100,-100,-100,-100,-100,-100,-100,-99,-100,-100,98,98,96,96,100,32,100,64,98,-100,-100,-55,-100,-100,-100,-100,-98,-98,-99,-99,97,97,98,100,59,100,-100,-100,-100,100,-53,100,-100,-100,-100,-98,-98,-98,-98,97,99,97,100,98,100,-100,100,100,100,100,100,-100,-99,-99,-100,-98,-98,-98,97,96,96,100,96,97,100,100,100,98,98,100,100,-100,-98,-99,-98,-98,-98,97,97,100,98,98,98,96,100,98,98,98,99,100,-100,-99,-98,-98,-98,-98,97,97,97,98,98,98,98,98,98,98,98,98,99,99,-99,-98,-98,-98,-98],"ownershipAllowedMAE":0.0149394})%"); + lines.push_back(R"%({"sample":{"board":"................/............OXX./...X......O.OXO./..X......XO.XO../..XO........XO../..O.........X.../......X........./................/...........O..../................/................/...X............/.X....X....O..../.............O../...O............/................/................/","hintLoc":"null","initialTurnNumber":27,"metadata":"A88277B84015E46958E28E99D9A7D0FC:37","moveLocs":["P14","O12","P12","P11","Q13","F3","K13","N9","H3","J4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.89,"xSize":16,"ySize":17},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":4.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.7e-06,7.62e-06,7.46e-06,7.76e-06,7.97e-06,7.77e-06,7.87e-06,7.99e-06,8.1e-06,7.84e-06,7.84e-06,7.2e-06,7.34e-06,8e-06,8.33e-06,6.91e-06,7.64e-06,8.8e-06,1.07e-05,1.34e-05,1.27e-05,1.56e-05,1.8e-05,1.86e-05,1.53e-05,1.06e-05,8.12e-06,7.24e-06,0,0,0,7.79e-06,7.65e-06,9.48e-06,8.93e-06,0,2.26e-05,2.98e-05,6.02e-05,4.35e-05,1.64e-05,1.45e-05,0,7.13e-06,0,0,0,6.78e-06,8.25e-06,1.1e-05,0,4.27e-05,2.44e-05,4.69e-05,7.83e-05,4.29e-05,4.02e-05,0,0,7.62e-06,0,0,0,5.94e-06,7.9e-06,0.00337,0,0,1.27e-05,8.84e-05,7.36e-05,6.38e-05,2.78e-05,0,1.54e-05,8.33e-06,0,0,5.16e-06,0,9.3e-06,0.000183,0,0.0367,0.000127,0.00146,0.000156,5.23e-05,2.75e-05,1.85e-05,0.00343,1.02e-05,0,0,0,8.36e-06,8.6e-06,0.000365,2.25e-05,0.0416,0.000522,0.00286,0,4.36e-05,2.65e-05,2.35e-05,1.54e-05,5e-05,1.19e-05,1.76e-05,0,1.2e-05,8.36e-06,1.67e-05,0.000122,0.000404,0.000329,0.000415,0.000158,5.7e-05,3.37e-05,2.88e-05,0.000108,5.65e-05,0.0287,0.00097,0.000382,7.39e-06,8.08e-06,2.31e-05,0.000888,0.000648,0.000356,0.000217,0.000152,0.000101,5.95e-05,2.92e-05,1.74e-05,0,0,2.41e-05,2.81e-05,8.1e-06,7.97e-06,2.6e-05,0.00731,0.00338,0.000575,0.000188,0.000133,8.77e-05,6.12e-05,3.04e-05,4.66e-05,0.00105,0.0963,1.45e-05,2.07e-05,8.4e-06,8.29e-06,6.88e-05,4.54e-05,0.000153,0.000254,0.000452,9.98e-05,8.81e-05,5.31e-05,3.66e-05,2.81e-05,4.6e-05,8.34e-05,0.00754,4.01e-05,8.79e-06,8.08e-06,2.38e-05,2.87e-05,0,0.00828,4.62e-05,5.47e-05,3.04e-05,0.000138,4.59e-05,2.01e-05,1.25e-05,1.6e-05,6.3e-05,2.56e-05,8.6e-06,9.15e-06,0,0.000135,0.244,0.0118,0.000724,0,1.17e-05,1.78e-05,4.64e-05,1.36e-05,0,1.05e-05,1.31e-05,1.56e-05,8.15e-06,9.06e-06,0.000133,0.124,0.000357,0.00533,0.13,1.23e-05,0.0299,0,1.56e-05,3.54e-05,1.46e-05,1.14e-05,0,9.95e-06,8.06e-06,8.98e-06,7.35e-05,2.11e-05,0,6.63e-05,0,1.36e-05,0,0.146,0.00683,0.0334,9.2e-05,1.79e-05,1.07e-05,9.86e-06,7.29e-06,9.06e-06,1.62e-05,1.42e-05,1.6e-05,5.81e-05,0.0124,1.84e-05,3.31e-05,4.43e-05,0.000155,0.000132,2.56e-05,1.5e-05,1.12e-05,8.85e-06,7.74e-06,6.38e-06,8.39e-06,8.19e-06,9.96e-06,1e-05,9.59e-06,9.12e-06,1.02e-05,8.76e-06,9.32e-06,9.44e-06,8.95e-06,8.44e-06,7.88e-06,7.93e-06,6.76e-06,8.17e-06],"winrateAvg":0.409109,"leadAvg":-0.745856,"scoreMeanAvg":-1.14376,"scoreStdevAvg":11.0511,"shorttermWinlossErrorAvg":0.101332,"shorttermScoreErrorAvg":0.666162,"ownership":[-74,-75,-72,-63,-51,-35,-20,-4,15,38,57,73,79,78,75,76,-73,-76,-77,-73,-53,-37,-22,-6,4,40,67,80,91,70,70,75,-69,-75,-83,-91,-35,-28,-19,-5,6,18,94,49,91,70,85,77,-54,-78,-91,-24,-23,-17,-10,-9,11,-14,93,7,-67,85,84,77,-41,-43,-91,12,-16,-10,-9,-3,-12,79,43,-3,-67,85,75,80,-19,-19,26,-10,-21,-11,-14,-5,5,13,25,-9,-67,-67,79,72,-8,-5,-1,2,-5,-11,-68,-12,-5,-2,0,-4,-28,-41,-52,-30,-9,-12,-13,-6,-7,-7,-12,-7,-4,-3,1,-17,-23,-33,-27,-39,-16,-18,-14,-15,-10,-9,-9,-6,-2,0,7,48,-69,-42,-34,-34,-29,-28,-22,-23,-16,-12,-9,-7,-4,-1,5,2,19,-31,-19,-21,-42,-43,-40,-37,-26,-14,-13,-9,-5,-1,4,13,14,22,6,0,-53,-52,-53,-84,-22,-20,-21,-16,-4,0,6,21,22,19,25,21,-50,-77,-36,-3,-24,-26,-78,-33,-9,4,16,75,35,35,42,37,-38,-27,-7,-2,-8,-3,-38,-11,-55,-8,3,28,33,82,54,46,-18,-12,4,39,-8,-65,-28,32,-8,-2,16,15,35,44,51,47,-10,0,5,14,-4,-13,-11,5,6,5,14,19,31,37,44,46,-4,1,6,8,0,-7,-8,-2,1,6,11,19,27,35,40,43],"ownershipAllowedMAE":0.0306602})%"); + lines.push_back(R"%({"sample":{"board":"................/....XX........../.OO.OOXO..X.XO../.O.OOX.....OOX../.XO..X.....OXX../..XX............/................/................/..X........O..../....OX........../..OOXX........../.O.XOO........../...X........O.../..O.XOX........./.....X........../................/","hintLoc":"null","initialTurnNumber":46,"metadata":"B082A15636622D196CF62DDAF9C87171:56","moveLocs":["M14","G15","G13","J15","J13","H13","H12","J12","J14","H15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":16,"ySize":16},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":-5.0,"policyOptimism":0.57,"pda":-2.473,"policyMixture":[9.67e-07,1.18e-06,1.25e-06,1.34e-06,1.33e-06,1.76e-06,2.53e-06,1.93e-06,1.97e-06,1.79e-06,1.46e-06,1.32e-06,1.37e-06,1.37e-06,1.28e-06,9.57e-07,1.08e-06,1.34e-06,1.71e-06,1.3e-05,0,0,0,0,0,0.114,1.72e-06,1.49e-06,1.91e-06,4.59e-06,2.1e-06,1.27e-06,1.11e-06,0,0,1.24e-06,0,0,0,0,0,4.14e-06,0,0,0,0,6.68e-06,1.38e-06,1.25e-06,0,0,0,0,0,0,0,0,2.95e-06,1.35e-05,0,0,0,2.06e-06,1.39e-06,1.59e-06,0,0,2.13e-06,6.61e-05,0,2.55e-05,0,0,0.147,8.76e-06,0,0,0,1.77e-06,1.3e-06,1.48e-06,2.2e-06,0,0,1.88e-05,6.58e-05,6.97e-05,0.666,0.00156,6.85e-06,3.47e-06,0.0192,3.15e-06,1.91e-06,2.3e-06,1.21e-06,1.27e-06,2.33e-06,1.56e-06,2e-06,1.43e-05,0.00121,0.00131,4.24e-05,6.67e-06,4.13e-06,3.5e-06,8.12e-06,1.01e-05,8.97e-06,3.16e-06,1.29e-06,1.24e-06,2.11e-06,2.14e-06,3.57e-06,2.9e-05,0.00381,2.46e-05,9.49e-06,4.76e-06,3.63e-06,3.62e-06,3.24e-06,8.58e-06,1.91e-05,3.89e-06,1.31e-06,1.46e-06,2.33e-06,0,3.05e-06,0.04,0.000447,1.71e-05,8.28e-06,4.5e-06,3.55e-06,2.95e-06,0,3.34e-06,9.56e-06,3.16e-06,1.28e-06,1.5e-06,5.54e-05,2.2e-06,4.5e-05,0,0,2.62e-06,1.62e-05,4.93e-06,3.61e-06,3.26e-06,2.96e-06,3.33e-06,4.98e-06,2.96e-06,1.26e-06,1.88e-06,1.47e-05,0,0,0,0,3.25e-06,1.33e-05,4.15e-06,3.51e-06,3.34e-06,3.14e-06,3.55e-06,7.87e-06,3.15e-06,1.28e-06,2.12e-06,0,5.97e-05,0,0,0,5.61e-05,4.43e-06,3.22e-06,3.29e-06,3.67e-06,3.8e-06,7.95e-06,7.92e-06,3.91e-06,1.33e-06,1.73e-06,0.00331,0.000372,0,2.22e-06,2.86e-06,2.04e-06,2.54e-06,3.29e-06,5.43e-06,1.04e-05,1.22e-05,0,2.1e-05,3.65e-06,1.39e-06,1.82e-06,8.75e-05,0,5.93e-06,0,0,0,1.96e-06,3.13e-06,9.35e-06,1.39e-05,1.14e-05,2.03e-05,2.55e-05,3.18e-06,1.34e-06,1.7e-06,2.91e-05,4.48e-05,2.54e-05,2.05e-06,0,1.41e-06,2.15e-06,2.41e-06,3.02e-06,3.47e-06,3.92e-06,3.65e-06,3.18e-06,2.61e-06,1.33e-06,1.08e-06,1.96e-06,1.89e-06,1.95e-06,1.61e-06,1.06e-06,1.14e-06,1.23e-06,1.26e-06,1.31e-06,1.34e-06,1.37e-06,1.4e-06,1.32e-06,1.33e-06,1e-06,3.84e-06],"winrateAvg":0.0608987,"leadAvg":-5.83577,"scoreMeanAvg":-7.05477,"scoreStdevAvg":9.58843,"shorttermWinlossErrorAvg":0.091242,"shorttermScoreErrorAvg":1.45798,"ownership":[93,92,90,85,78,69,54,22,-8,-26,-48,-60,-68,-68,-68,-66,94,94,90,80,67,64,66,65,65,-31,-56,-74,-76,-69,-65,-67,92,97,97,91,96,95,-80,64,-78,-51,-95,-95,-95,-61,-66,-66,61,97,79,96,96,-82,-81,65,-80,-22,-38,31,29,-89,-71,-64,46,4,82,7,55,-81,-69,-80,18,-10,-2,34,-86,-87,-65,-53,-7,3,-68,-67,8,-37,-46,-65,-13,-3,8,7,-6,-33,-39,-36,-24,-32,-40,-26,-11,-35,-35,-31,-12,1,10,20,1,-8,-21,-18,-26,-29,-26,-20,-21,-26,-25,-17,-4,6,14,26,13,7,-2,-2,-16,-22,-58,-1,-43,-17,-29,-12,0,10,22,78,30,20,12,10,5,0,14,26,30,-80,-28,-14,2,9,16,30,27,26,22,19,30,41,73,73,-80,-78,-18,-14,3,10,16,25,30,29,26,24,55,77,11,-80,-4,-3,-9,3,5,12,19,29,39,41,32,27,66,55,-7,-81,-56,-51,-29,-16,-2,9,21,37,86,45,29,28,61,60,68,-18,-88,-51,-87,-31,-9,2,23,34,37,28,29,25,54,46,31,-1,-55,-90,-68,-43,-23,-4,9,22,24,27,23,25,46,37,19,-10,-48,-67,-64,-45,-25,-6,9,17,22,22,24,23],"ownershipAllowedMAE":0.0511256})%"); + lines.push_back(R"%({"sample":{"board":"....X.XO........O../.XOOOX.OX....XXO.O./.XXO.OOOX...X.OXO../.XOOOXXOX....X.XO../.XOX...OOXX....XO../..X.XXX.X.X...XOO../..XXOOXOOXO..X.X.../..XO.OXOX.XX....O../.OXOO.OXXXO.X....../XXOO.O...O.OX....../XO.O..OXXOOOX..XO../XXO....OXXO.OX.O.O./XOO..OOX.XO.OX.XO../XXX.XOX..XO.O..XO../OOXXXOOOOX.O.XX.XO./.OOOXXOXOXXO...XO../..OXX.XXXOXOXXXOO../.OOX....XOOOXOO.O../.............X.O.../","hintLoc":"null","initialTurnNumber":214,"metadata":"8A5FABCB880BFB1822D052409B316F10:224","moveLocs":["Q10","J19","K18","H14","R10","S10","R11","Q12","S11","Q5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":-5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.54e-06,0.000248,0.00712,5.12e-05,0,5.03e-06,0,0,0,0.0527,9.42e-05,1.26e-05,7.26e-06,6.13e-06,1.34e-05,9.32e-05,0,5.09e-06,4.05e-06,5.11e-06,0,0,0,0,0,5.5e-06,0,0,0,0.000109,3.74e-05,6.23e-06,0,0,0,0,0,5.36e-06,3.89e-06,0,0,0,0,0,0,0,0,7.07e-06,3.05e-05,6.44e-06,0,4.5e-06,0,0,0,4.91e-06,5.31e-06,3.36e-06,0,0,0,0,0,0,0,0,7.39e-06,5.71e-06,4.5e-06,3.73e-06,0,7.59e-06,0,0,5.26e-06,6.81e-06,3.67e-06,0,0,0,7.63e-06,7.81e-06,4.39e-05,0,0,0,0,3.79e-06,3.58e-06,6.49e-06,8.38e-06,0,0,6.5e-06,1.09e-05,4.36e-06,5.1e-06,0,8.37e-06,0,0,0,0,0,0.00025,0,3.7e-06,4.3e-06,7.59e-06,0,0,0,1.42e-05,0.012,4.03e-06,5.32e-06,0,0,0,0,0,0,0,0,0,1.32e-05,4.95e-06,0,0.00214,0,0.000713,0.000329,0.00132,4.54e-06,5.2e-06,0,0,0,0,0,0,0,1.76e-05,0,0,6.3e-06,1.95e-05,0.00266,0,0,0.0433,0.00158,4.51e-06,0,0,0,0,0,0,0,0,0,0,0.0014,0,1.21e-05,0.000359,1.67e-05,0,0,0.000244,0,0,0,0,3.88e-06,0,0.000256,0.00216,0.00098,0,0,0,0,1.15e-05,7.14e-05,0,0,0,0.0129,0,0,2.02e-05,0,7.55e-06,2.98e-05,0,0,0,0,0,0,0,8.91e-05,0.000497,0,0,0.00041,0.000211,0,0,0,4.16e-05,4.97e-05,7.62e-05,0.0586,0,0,0,0,5.28e-06,0,0,0.0709,0,0,0,1.12e-05,0,0,0,0.000142,0.000289,0,0,0,5.75e-06,0,0,9.47e-06,0,0,0.018,0,0,8.68e-06,6.86e-06,0,0,0,5.71e-06,0,0,0,2.58e-05,1.11e-05,0,0,5.66e-06,0,0.654,0.00553,0,0,2.19e-05,5.67e-06,0,0,0,0,0,0,0,0,0,0,1.23e-05,0,9.11e-05,0,0,0,0,0,4.66e-06,4.59e-06,0,0,0,0,0,0,0,0,0,0,0,1.29e-05,1.04e-05,6.24e-05,0,0,1.17e-05,4.06e-06,0.0358,4.86e-06,0,0,0,5.53e-06,0,0,0,0,0,0,0,0,0,0,0,4.87e-06,3.73e-06,0.00631,0,0,0,5.63e-06,6.4e-06,5.8e-06,4.86e-06,0,0,0,0,0,0,0,0,0,4.45e-06,3.7e-06,4.86e-06,6.83e-05,0.0037,7.2e-05,7.28e-06,5.76e-06,6.01e-06,7.46e-06,3.79e-05,0.000351,5.81e-06,0.000136,0.000193,0,5.07e-06,0,5.28e-06,4.01e-06,3.76e-06,1.96e-05],"winrateAvg":0.00383186,"leadAvg":-3.76578,"scoreMeanAvg":-3.79353,"scoreStdevAvg":2.64686,"shorttermWinlossErrorAvg":0.0263215,"shorttermScoreErrorAvg":0.698181,"ownership":[-63,-11,-6,80,85,99,99,100,100,89,64,-78,-92,-92,-51,26,99,99,99,-71,-100,100,100,100,99,99,100,-99,-99,-97,-91,-96,-100,-100,98,99,100,99,-96,-100,-100,100,99,100,100,100,-99,-98,-98,-98,-100,-99,-99,-99,100,99,98,-99,-100,100,100,100,-94,-94,100,-99,-99,-99,-99,-99,-100,-99,-99,100,98,93,-100,-100,100,-99,42,-69,5,100,100,-100,-100,-99,-99,-99,-98,-99,100,96,90,-100,-100,-100,-99,-99,-99,-99,100,-8,1,-100,-99,-98,-98,-99,100,100,94,76,-100,-100,-100,-100,100,99,-99,100,100,-99,-98,-99,-95,-100,-64,-67,57,78,61,-100,-100,-100,100,100,99,-100,100,-100,-99,-100,-100,-76,1,54,99,99,77,-13,-100,-100,-100,100,100,99,99,-100,-100,-100,66,-12,-100,-19,13,11,-100,-100,-58,-100,-100,100,100,96,100,88,-40,-63,100,65,100,-100,-60,-52,-100,-100,36,-59,-100,44,42,100,80,88,99,-100,-100,100,100,100,-100,-97,-77,-99,91,44,22,-100,-100,99,66,55,86,2,2,-100,-100,100,99,100,-100,9,72,71,96,65,-100,99,99,-13,-33,100,100,-83,-61,-100,100,99,100,-100,-48,-85,99,95,92,-100,-100,-100,-63,-100,100,9,6,19,-100,100,99,100,-98,-86,-89,99,99,97,99,99,-100,-100,-100,100,100,100,100,-100,36,100,22,-100,-100,61,56,100,99,99,99,99,99,-100,-100,100,-100,100,-100,-100,100,-2,-80,-2,1,100,100,100,99,99,99,-100,-100,-100,-100,-100,-100,100,-100,100,-99,-99,-99,100,100,100,100,98,99,99,-100,-98,-96,-98,-96,-100,100,100,100,-99,94,99,99,100,100,100,98,98,47,1,-95,-95,-94,-94,8,32,81,38,-79,-83,8,100,100,100,100],"ownershipAllowedMAE":0.0314613})%"); + lines.push_back(R"%({"sample":{"board":"............../....OX.OXX..../....OX..OX..../...O.X..O.X.../.OOX........O./..XX.X....XO../..XOO.....XO../...O.O......../...XO.XX..XO../......XOO.OO../...X.OOXX...../..XO.O.OX...../...XOOOX....../..XXXOXX....../.XOXXOXO.XXXX./.O.OXXOXXOXO../..OOOOOXXOXO../.......XOOO.O./............../","hintLoc":"null","initialTurnNumber":103,"metadata":"992F810DAA0E32C699C4E4FC1DDDAF6B:113","moveLocs":["E10","C11","J7","J6","K10","H13","K7","G8","E9","C4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":14,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.55e-06,9e-06,8.92e-06,9.1e-06,9.6e-06,1.7e-05,9.95e-06,9.09e-06,8.46e-06,7.87e-06,7.85e-06,8.15e-06,8.09e-06,7.43e-06,8.69e-06,9.09e-06,1.07e-05,8.99e-06,0,0,9.59e-06,0,0,0,8.56e-06,9.27e-06,8.61e-06,7.98e-06,8.74e-06,1.05e-05,1.63e-05,8.57e-06,0,0,8.29e-06,9e-06,0,0,9.65e-06,9.54e-06,9.12e-06,8.12e-06,9.07e-06,8.65e-06,9.52e-06,0,0.000137,0,1.02e-05,9.44e-06,0,1.15e-05,0,1.42e-05,8.66e-06,8e-06,8.97e-06,0,0,0,0.000129,0.000246,0.000142,1.09e-05,1.02e-05,3.85e-05,0.000219,9.83e-06,0,7.57e-06,9.28e-06,1.63e-05,0,0,0.000289,0,0.000564,0.000148,8.71e-05,1.13e-05,0,0,7.81e-06,7.47e-06,8.95e-06,9.75e-06,0,0,0,0.000151,0.0579,0,0.00272,1.06e-05,0,0,7.73e-06,7.48e-06,9.63e-06,1.16e-05,0.181,0,7.56e-06,0,0.000263,0.000342,0.00144,1.59e-05,9.53e-06,7.88e-06,7.41e-06,7.34e-06,8.73e-06,2.89e-05,0,0,0,8.16e-06,0,0,1.02e-05,8.61e-06,0,0,7.79e-06,7.61e-06,8.35e-06,1.01e-05,1.63e-05,0.245,0,8.01e-06,0,0,0,0,0,0,8.11e-06,7.77e-06,8.07e-06,8.29e-06,0.167,0,0,0,0,0,0,1.08e-05,8.1e-06,8.32e-06,9.15e-06,8.37e-06,7.85e-06,7.61e-06,0,0,7.33e-06,0,0,0.298,0,5.16e-05,1.4e-05,1.35e-05,1.86e-05,8.76e-06,8.37e-06,7.21e-05,6.18e-06,0,0,0,0,0,0,0,1.71e-05,0.000447,0.000475,9.1e-06,9.11e-06,0.0073,0,0,0,0,0,0,0,1.78e-05,9.05e-06,1.07e-05,1.09e-05,8.47e-06,0.000361,0,0,0,0,0,0,0,5.66e-06,0,0,0,0,8.32e-06,4.57e-05,0,0,0,0,0,0,0,0,0,0,0,1.05e-05,8.7e-06,1.13e-05,2.13e-05,0,0,0,0,0,0,0,0,0,0,8.3e-06,8.41e-06,9.49e-06,1.15e-05,9.09e-06,8.27e-06,8.95e-06,9.21e-06,0.0339,0,0,0,0,7.31e-06,0,8.19e-06,7.51e-06,8.99e-06,9.26e-06,9.2e-06,8.55e-06,9.85e-06,1.06e-05,2.19e-05,8.61e-06,7.76e-06,7.39e-06,7.6e-06,7.46e-06,7.61e-06,9.4e-06],"winrateAvg":0.559993,"leadAvg":0.220186,"scoreMeanAvg":0.659305,"scoreStdevAvg":10.9465,"shorttermWinlossErrorAvg":0.251735,"shorttermScoreErrorAvg":1.86299,"ownership":[40,40,37,34,-7,-30,-68,-68,-79,-76,-59,-38,-24,-9,37,35,39,39,53,-93,-73,-53,-94,-94,-56,-29,-8,5,33,26,47,42,52,-93,-73,-66,-49,-94,-52,-14,6,24,27,31,40,52,-22,-93,-73,-64,-50,-71,-91,13,36,49,-1,44,44,-94,-48,-64,-69,-69,-64,-69,-17,17,87,67,-32,-57,-94,-93,-5,-90,-68,-67,-58,-58,-84,91,83,80,-42,-50,-94,85,86,2,17,-85,-22,-32,-84,91,85,80,-30,-28,42,85,84,89,10,-35,9,6,-13,23,80,77,-35,-41,-68,-67,92,2,-72,-73,11,39,-34,97,82,71,-43,-46,-27,53,91,37,-70,97,98,98,98,97,70,57,-51,-58,-33,-40,92,92,92,22,18,54,49,40,38,32,-57,-62,-77,28,25,93,31,34,18,50,2,3,8,-3,-55,-65,-68,-79,92,92,93,-94,62,61,-17,-33,-20,-37,-47,-49,-79,-79,-80,92,-94,-94,-94,-9,-33,-53,-61,-67,-16,-56,-1,-80,-81,91,-93,-89,-92,-95,-95,-94,-93,-72,7,42,1,80,-80,-80,81,-92,-92,78,-95,72,-63,-36,35,28,81,81,79,80,80,-92,-92,78,-94,75,65,24,45,58,69,70,66,46,50,-90,78,77,76,75,76,63,55,59,60,57,26,17,-36,-57,8,59,73,73,73,70],"ownershipAllowedMAE":0.0507712})%"); + lines.push_back(R"%({"sample":{"board":".................../O.O.XOO......X...../XOOOOXOOO......XXX./XXXXXXXX......OOOX./.........X.......O./.O...OX............/..OO.OXOX........../.OXXXO.X.X.....O.../..X.XO.O.........../.XXOOO.O.O........./..OXO............../...X.XX............/..X.XO.OX.......O../.X..XO.X.X.....XXO./...OO.OOXXX....XO../..XO.OOXXO.....XO../.XXOOXXX.OXX...XO../.XO.OXOOOXX.....O../.O...O............./","hintLoc":"null","initialTurnNumber":64,"metadata":"98CD5C0B31DAE1B91B9B4DD4569ECDE6:74","moveLocs":["Q7","S14","R14","T15","O7","R15","Q14","Q2","Q1","P1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.96,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":5.5,"policyOptimism":0.0,"pda":-0.044,"policyMixture":[3.66e-06,3.97e-06,4.14e-06,4.14e-06,3.97e-06,3.93e-06,3.99e-06,3.77e-06,4.02e-06,4.05e-06,4.06e-06,4.12e-06,4e-06,4.4e-06,4.1e-06,3.81e-06,3.74e-06,3.89e-06,3.76e-06,0,4.37e-06,0,4.25e-06,0,0,0,3.86e-06,3.98e-06,4.68e-06,4.96e-06,9.8e-06,2.7e-05,0,2.33e-05,4.37e-06,3.97e-06,3.84e-06,3.77e-06,0,0,0,0,0,0,0,0,0,4.53e-06,6.88e-06,1.75e-05,2.21e-05,2.77e-05,0.000183,0,0,0,3.84e-06,0,0,0,0,0,0,0,0,0.000407,7.55e-06,1.11e-05,1.01e-05,8.3e-06,4.68e-06,0,0,0,0,3.97e-06,4.38e-06,4.5e-06,4.32e-06,4.37e-06,4.12e-06,4.46e-06,1.77e-05,7.7e-06,2.23e-05,0,2.72e-05,1.39e-05,6.11e-06,4.68e-06,3.85e-06,4.39e-06,0,0,0,4.4e-06,0,4.02e-06,4.23e-06,3.94e-06,0,0,4.46e-05,1.14e-05,1.85e-05,1.63e-05,2.1e-05,7.98e-06,4.98e-06,4.37e-06,0,0,0,3.69e-06,4.24e-06,3.64e-06,0,0,5.18e-06,0,0,0,0,4.87e-06,2.14e-05,2.31e-05,1.35e-05,5.19e-06,4.54e-06,4.09e-06,4.68e-06,5.43e-05,4.32e-06,4.34e-06,0,0,0,0,0,0.0387,0,7.37e-06,0,3.68e-05,2.38e-05,2.05e-05,7.83e-06,4.92e-06,0,3.99e-05,8.99e-05,4.48e-06,0.000221,7.97e-06,0,4.26e-06,0,0,3.84e-06,0,6.43e-06,1.32e-05,3.97e-05,3.88e-05,2.92e-05,1.38e-05,7.84e-06,6.14e-06,3.09e-05,3.37e-05,4.2e-06,2.52e-05,0,0,0,0,0,3.55e-06,0,3.85e-06,0,5.14e-06,3.61e-05,2.75e-05,1.24e-05,8.91e-06,9.69e-06,1.06e-05,5.51e-06,4.21e-06,1.09e-05,0.0264,0,0,0,3.99e-06,3.98e-06,4.41e-06,4.95e-06,4.88e-06,9.62e-06,1.51e-05,2.24e-05,1.12e-05,5.78e-06,5.86e-06,5.6e-06,4.97e-06,4.01e-06,3.96e-06,8.66e-06,4.37e-06,0,0.000237,0,0,3e-05,5.42e-06,8.66e-06,8.22e-06,1.89e-05,1.76e-05,5.34e-06,4.8e-06,4.58e-06,4.71e-06,1.24e-05,4.32e-06,4.13e-06,8.19e-06,0,6.49e-06,0,0,1.2e-05,0,0,4.33e-06,5.46e-06,6.07e-06,5.31e-06,0,4.49e-06,0,0,4.68e-06,4.19e-06,4.09e-06,0,0.000144,7.88e-06,0,0,4.64e-06,0,0,0,3.85e-06,5.24e-06,5.38e-06,4.8e-06,9.85e-06,0,0,0,3.98e-06,4.18e-06,7.18e-05,0.0625,0,0,3.56e-06,0,0,0,0,0,4.79e-06,4.97e-06,5e-06,4.31e-06,0,0,4.4e-06,4.35e-06,4.19e-06,4.66e-06,0,0,3.33e-06,0,0,0,0,0,4.91e-06,5.36e-06,4.67e-06,4.59e-06,4.32e-06,0,0,4.53e-06,4.31e-06,4.51e-06,0,0,0,0,0,0,0,4.81e-06,0,0,0,4.53e-06,4.83e-06,4.6e-06,0,0,4.35e-06,4.41e-06,4.55e-06,0,0,3.77e-06,0,0,0,0,0,0,0,3.64e-06,4.17e-06,4.53e-06,4.5e-06,0,0,5.04e-06,4.38e-06,4.15e-06,0,4.37e-06,4.26e-06,4.24e-06,0,4.47e-06,4.06e-06,4.01e-06,4.33e-06,4.12e-06,3.86e-06,3.88e-06,4.36e-06,0,0,0.869,6.45e-06,4.08e-06,6.19e-06],"winrateAvg":0.616619,"leadAvg":0.3679,"scoreMeanAvg":0.976516,"scoreStdevAvg":11.9477,"shorttermWinlossErrorAvg":0.195773,"shorttermScoreErrorAvg":1.20564,"ownership":[95,95,94,96,97,96,87,77,59,34,7,-14,-38,-55,-78,-89,-95,-97,-98,94,94,96,96,95,99,99,82,66,34,14,-5,-28,-89,-79,-94,-97,-98,-98,-97,96,96,96,97,-97,99,99,99,19,-9,12,1,-24,14,-99,-99,-99,-99,-97,-97,-97,-97,-97,-97,-96,-96,33,-17,-1,5,8,18,82,82,83,-99,-97,-33,-7,-28,-26,-24,13,-47,-81,-63,-90,-15,1,5,11,42,46,-72,-72,-98,13,90,45,24,44,95,-94,-90,-72,-37,-12,0,2,10,25,85,85,-95,-81,66,86,92,92,67,95,-94,-80,-94,-51,-15,-3,1,7,22,54,6,-32,-56,54,87,-95,-95,-96,95,47,-85,-41,-89,-13,-4,-1,7,21,84,22,-32,-36,16,0,-95,-14,-94,95,74,94,30,19,12,2,-3,0,3,13,16,-7,-21,-62,-96,-95,95,95,95,59,94,48,85,22,5,-7,-9,-6,-21,-3,-7,-6,-89,-93,-92,-97,96,25,-12,2,-15,16,1,-5,-10,-4,-4,3,11,12,12,-95,-96,-95,-96,26,-71,-72,-18,-25,-2,-7,-6,-1,19,21,29,40,16,39,-96,-96,-98,-48,-68,89,-8,31,-91,-43,-16,-8,8,79,35,96,97,89,58,-95,-98,13,46,-67,97,62,-61,-62,-98,-51,-14,-5,7,-3,-86,-87,98,87,-93,-90,46,99,99,98,99,99,-98,-98,-98,-37,-25,-27,-29,-85,98,97,95,-89,-91,-92,99,99,99,99,-98,-98,5,-52,-50,-42,-45,-42,-85,98,97,97,-84,-93,-92,99,99,-98,-98,-98,3,7,-98,-98,-55,-46,-40,-84,98,97,97,-25,-92,97,97,99,-98,93,94,93,-98,-98,-76,-40,-33,9,-82,99,96,97,1,92,91,93,96,96,94,46,-71,-81,-89,-71,-40,-2,7,98,98,96,96],"ownershipAllowedMAE":0.0365072})%"); + lines.push_back(R"%({"sample":{"board":".................../.XOO......X......../.XXO....XX.X.O.X.../.XOOO...OXXO....X../.XX.XOOO.OO......../.OX.X..OO........../.OO..XXXX.X......../...OO.O............/..XXOO............./...XXOXO.........../..O..XO............/....X.O............/..O.X............../.X..............X../...X.............../.XXOO....O.....O.X./..OX..O......O..X../.................../.................../","hintLoc":"null","initialTurnNumber":16,"metadata":"D5E2DD90A52633278A86C35C80D0B77E:26","moveLocs":["H18","M15","N16","M14","N18","H17","G18","O15","M18","P18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.42,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":14.0,"policyOptimism":0.0,"pda":0.236,"policyMixture":[5.2e-06,6.99e-06,6.81e-06,6.84e-06,6.76e-06,7.2e-06,6.58e-06,7.08e-06,1.34e-05,0.00078,0.0258,4.87e-05,7.78e-06,8.04e-06,7.77e-06,7.19e-06,6.93e-06,6.58e-06,5.99e-06,5.9e-06,0,0,0,6.71e-06,6.92e-06,0,0,0.211,1.62e-05,0,0,0,1.59e-05,0,6.83e-06,7.4e-06,7.13e-06,6.63e-06,5.25e-06,0,0,0,5.76e-06,7.01e-06,0.0133,0,0,0,0,0,0.00174,0,0.000304,0,8.92e-06,7.93e-06,6.75e-06,5.48e-06,0,0,0,0,5.9e-06,6.89e-06,1.86e-05,0,0,0,0,0,6.99e-05,0.00113,1.02e-05,0,1.15e-05,7e-06,6.91e-06,0,0,0.000116,0,0,0,0,6.8e-06,0,0,0,2.11e-05,0,0.000241,0.000403,2.19e-05,1.06e-05,7.17e-06,7.1e-06,0,0,7.95e-05,0,5.02e-05,6.4e-06,0,0,9.93e-06,4.98e-05,0,6.97e-06,1.12e-05,1.15e-05,1.16e-05,1.28e-05,1.2e-05,7.27e-06,8.27e-06,0,0,6.31e-06,0.00242,0,0,0,0,4.09e-05,0,2.11e-05,1.28e-05,1.31e-05,1.34e-05,1.43e-05,1.9e-05,1.28e-05,7.52e-06,1.86e-05,1.14e-05,8.45e-06,0,0,6.63e-06,0,1.08e-05,1.53e-05,0.000482,1.91e-05,2.71e-05,1.52e-05,1.71e-05,1.79e-05,3.03e-05,5.03e-05,1.48e-05,7.74e-06,3.28e-05,0.0013,0,0,0,0,8.61e-06,1.09e-05,0.00425,5.73e-05,0.000284,6.63e-05,4.03e-05,4.73e-05,5.97e-05,0.000134,0.000227,1.95e-05,8.11e-06,1.8e-05,0.00811,8.47e-06,0,0,0,0,0,1.9e-05,0.000141,0.000182,0.000105,8.79e-05,0.0001,0.00016,0.00301,0.0134,3.13e-05,8.18e-06,1.05e-05,0.000184,0,0.000459,9.73e-06,0,0,7.31e-06,1.36e-05,6.78e-05,0.000131,9.2e-05,9.29e-05,0.000115,0.000225,0.00338,0.0166,2.35e-05,8.04e-06,8.1e-06,1.05e-05,7.58e-06,7.61e-06,0,0.0131,0,8.54e-06,1.35e-05,1.96e-05,3.13e-05,4.34e-05,6.46e-05,9.19e-05,0.000152,0.00216,0.0109,8.58e-05,8.08e-06,6.83e-06,1.35e-05,0,8.31e-06,0,1.08e-05,9.41e-06,1.23e-05,1.37e-05,1.6e-05,1.82e-05,2.15e-05,4.12e-05,7.15e-05,9.16e-05,0.000912,0.0106,2.25e-05,7.46e-06,7.47e-06,0,0.000145,0.264,0.00042,0.047,3.29e-05,1.44e-05,1.31e-05,1.39e-05,1.55e-05,1.74e-05,2.39e-05,4.8e-05,3.85e-05,0.00013,0,4.93e-05,7.75e-06,7.51e-06,8.39e-06,0.0606,0,0.167,5.61e-05,1.67e-05,1.29e-05,1.15e-05,1.07e-05,1.25e-05,1.51e-05,1.82e-05,1.72e-05,1.44e-05,1.03e-05,0.00193,5.09e-05,7.21e-06,7.34e-06,0,0,0,0,1.35e-05,1.05e-05,1.07e-05,1.01e-05,0,1.15e-05,1.48e-05,1.48e-05,1.17e-05,1.01e-05,0,5.13e-05,0,7.24e-06,6.86e-06,9.81e-05,0,0,0.105,9.6e-06,0,8.81e-06,1.01e-05,9.95e-06,1.22e-05,1.33e-05,1.1e-05,0,9.88e-06,9.64e-05,0,1.05e-05,6.93e-06,6.75e-06,9.65e-06,1.5e-05,0.00113,1.15e-05,9.05e-06,8.42e-06,8.84e-06,9.14e-06,1.01e-05,1.06e-05,1.11e-05,1.09e-05,1.03e-05,1.39e-05,1.28e-05,1.04e-05,9.06e-06,6.94e-06,6.07e-06,6.93e-06,7.39e-06,7.79e-06,7.63e-06,7.17e-06,7.29e-06,6.95e-06,7.1e-06,7.19e-06,7.35e-06,7.42e-06,7.43e-06,7.83e-06,7.89e-06,7.76e-06,7.3e-06,7.28e-06,6.02e-06,8.16e-06],"winrateAvg":0.404291,"leadAvg":-1.24558,"scoreMeanAvg":-1.50857,"scoreStdevAvg":13.4421,"shorttermWinlossErrorAvg":0.213446,"shorttermScoreErrorAvg":1.83909,"ownership":[-49,-13,9,87,96,96,94,85,71,49,18,15,-24,-60,-86,-93,-92,-90,-88,-63,-81,98,98,97,96,97,97,77,38,14,18,14,-74,-96,-94,-92,-89,-85,-75,-81,-81,98,97,97,41,19,18,15,14,12,11,12,-76,-98,-92,-87,-80,-67,-81,98,98,99,97,85,75,92,15,16,15,13,-75,-71,-68,-97,-80,-68,-10,-81,-82,-5,-85,98,98,98,90,93,91,-96,-83,-96,-53,-43,-52,-59,-56,18,89,-82,-48,-84,-60,15,98,98,4,-22,-97,-62,-42,-36,-35,-39,-47,-41,66,89,89,58,41,-90,-91,-92,-92,-52,-93,-48,-27,-26,-26,-27,-28,-36,-29,45,30,40,92,91,19,87,0,-37,-29,-30,-16,-15,-16,-18,-18,-21,-24,-18,14,0,-80,-80,91,91,85,-5,-9,-11,-6,-5,-6,-8,-11,-12,-13,-14,-10,-20,-57,-62,-79,-79,92,84,89,15,0,1,0,-1,-3,-7,-14,-3,-8,-6,-50,-51,-42,-62,-52,-55,92,45,21,12,7,3,1,0,-5,-23,-6,-10,-9,-61,-60,-57,-66,-81,48,91,33,20,11,7,4,3,1,-2,-10,-10,-16,-17,-72,-66,-49,-68,-82,-4,23,17,16,12,8,5,4,2,-4,-15,-17,-32,-33,-77,-88,-70,-58,-23,6,11,14,13,12,8,6,6,7,-9,-8,-79,-54,-50,-79,-81,-76,-87,-18,-7,10,14,17,12,13,8,11,11,2,5,-2,-57,-64,-66,-89,-90,77,79,21,22,25,28,76,10,18,8,21,20,58,1,-84,-72,-56,-31,17,16,59,50,82,39,43,45,39,31,33,70,18,16,-81,-76,-75,-39,-23,6,25,43,53,58,51,46,44,41,38,40,38,4,-16,-49,-70,-70,-26,-11,7,26,42,50,52,49,45,42,39,37,36,28,12,-18,-42,-57,-64],"ownershipAllowedMAE":0.0396142})%"); + lines.push_back(R"%({"sample":{"board":"................../................../..XX.....O......../.XOOO..O......O.../.X................/..X..........X.O../.........X......../................../.....X............/........O........./.XX.............../.OOXXO......X...../..XOO..........X../.XX.............../.OXO............../.OO...........O.../................../................../","hintLoc":"null","initialTurnNumber":36,"metadata":"3FEE91852CFD952CC985C339B5DBF646:46","moveLocs":["F8","E8","D8","D5","F16","G8","F9","L3","N16","L14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":1.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.57e-06,4.91e-06,4.88e-06,5.18e-06,4.79e-06,5.36e-06,5.37e-06,5.56e-06,5.95e-06,6.13e-06,6.13e-06,5.89e-06,6.24e-06,6.13e-06,6.78e-06,5.74e-06,5.8e-06,4.12e-06,4.74e-06,4.76e-06,4.88e-06,4.85e-06,6.61e-06,9.54e-06,6.75e-05,2.31e-05,1.69e-05,3.46e-05,2.76e-05,3.29e-05,8.52e-06,0.00011,0.118,0.0283,1.11e-05,5.58e-06,4.89e-06,4.68e-06,0,0,6.42e-06,0,3.37e-05,0.00353,5.81e-05,0,0.00767,1.57e-05,0,8.8e-06,0.168,0.123,2.01e-05,5.19e-06,4.63e-06,0,0,0,0,2.88e-05,0.000652,0,2.61e-05,4.56e-05,0.000513,0.00148,2.06e-05,0.000117,0,4.95e-05,2.46e-05,5.51e-06,4.68e-06,0,4.76e-06,5.23e-06,6.07e-06,8.31e-06,0.00677,5.29e-05,0.000152,0.052,0,0.00196,0.195,1.52e-05,0.026,3.64e-05,0.000107,6.12e-06,4.74e-06,4.78e-06,0,5.54e-06,7.74e-06,1.1e-05,1.92e-05,9.67e-05,0.000168,1.47e-05,0.00034,0.185,1.36e-05,0,4.87e-05,0,9.19e-05,6.15e-06,4.92e-06,4.89e-06,5.08e-06,5.6e-06,7.09e-06,8.92e-06,1.39e-05,2.82e-05,1.38e-05,0,1.18e-05,0.000154,2.69e-05,1.26e-05,0.000183,0.0075,7.29e-05,6.18e-06,5.03e-06,5.06e-06,5.3e-06,5.5e-06,5.74e-06,6.4e-06,9.51e-06,1.77e-05,2.38e-05,1.17e-05,2.06e-05,7.49e-05,0.000103,0.000181,0.00118,0.00743,3.65e-05,5.88e-06,4.98e-06,5.09e-06,4.94e-06,5.12e-06,4.79e-06,0,6.01e-06,1.45e-05,1.41e-05,4.89e-05,4.04e-05,6.45e-05,9.19e-05,0.000102,0.000226,0.000379,1.68e-05,5.77e-06,4.87e-06,4.67e-06,4.71e-06,4.64e-06,4.53e-06,0,8.54e-06,1.85e-05,0,2.15e-05,6.45e-05,4.19e-05,3.14e-05,2.78e-05,6.53e-05,0.00011,1.47e-05,5.76e-06,4.91e-06,0,0,0,0,0,0,1.69e-05,3.09e-05,0.000106,6.03e-05,1.6e-05,1.05e-05,1.37e-05,2.17e-05,3.1e-05,1.18e-05,5.7e-06,0.0282,0,0,0,0,0,0.00177,1.57e-05,0.000121,0.000152,7.14e-05,1.13e-05,0,9.8e-06,1.42e-05,9.96e-06,1.06e-05,5.49e-06,6.54e-05,0.000531,0,0,0,7.8e-05,1.82e-05,7.7e-05,0.000157,0.00062,0.000144,2.31e-05,1.21e-05,1.62e-05,1.14e-05,0,8.51e-06,5.83e-06,8.21e-06,0,0,0,4.55e-06,8.11e-06,1.4e-05,7.75e-05,0.000137,0.000354,0.000193,0.000196,0.000142,9.62e-05,5.27e-05,1.32e-05,1.56e-05,5.66e-06,5.49e-06,0,0,0,6.43e-06,8.64e-06,1.6e-05,4.37e-05,7.9e-05,0.000196,0.00405,0.0005,0.000276,0.000703,0.0145,0.00136,4.84e-05,5.83e-06,4.71e-06,0,0,6.51e-06,1.68e-05,1.23e-05,2.82e-05,0.000113,0.000458,0.000127,0,0.000145,0.000402,3.33e-05,0,0.00394,2.45e-05,5.5e-06,4.75e-06,5.11e-06,5.84e-06,7.09e-06,9.26e-06,1e-05,1.04e-05,1.24e-05,4.87e-05,5.48e-05,0.000249,2.31e-05,2.92e-05,1.54e-05,1.64e-05,1.16e-05,9.42e-06,5.43e-06,4.71e-06,5.3e-06,5.19e-06,5.15e-06,5.28e-06,5.39e-06,5.35e-06,5.52e-06,5.83e-06,6.29e-06,6.29e-06,6.21e-06,5.95e-06,5.84e-06,5.64e-06,5.52e-06,5.51e-06,4.55e-06,6.95e-06],"winrateAvg":0.561808,"leadAvg":0.542603,"scoreMeanAvg":0.777574,"scoreStdevAvg":12.0205,"shorttermWinlossErrorAvg":0.0994105,"shorttermScoreErrorAvg":0.694726,"ownership":[-90,-87,-84,-78,-63,-42,-18,6,23,28,15,-4,-19,-20,-15,-8,-2,7,-92,-88,-88,-81,-73,-63,-26,10,29,36,18,-7,-26,-16,-13,-11,7,12,-95,-94,-95,-95,-3,-83,4,23,35,75,12,-4,-58,7,16,28,22,20,-95,-98,17,17,19,-4,16,73,39,43,24,1,-9,1,76,42,32,30,-93,-98,-48,-26,-13,-6,-8,23,22,13,66,0,-21,-11,19,38,41,37,-89,-90,-97,-34,-24,-14,-1,11,22,-4,7,-23,-20,-64,5,76,44,38,-82,-82,-66,-45,-25,-13,-1,4,-3,-61,-13,-11,-9,-15,0,13,32,30,-80,-76,-67,-51,-40,-21,-2,-2,0,-10,-7,-7,-10,-12,-4,11,19,19,-80,-78,-68,-60,-57,-94,-25,-7,5,-6,-4,-4,-7,-7,-6,9,7,7,-86,-82,-77,-74,-88,-95,-21,-2,60,6,0,-2,-6,-6,-5,-6,-4,-5,-84,-97,-97,-97,-89,-95,43,-1,8,-2,0,-1,-9,-7,-6,-9,-14,-14,-80,-30,-27,-98,-97,76,24,11,5,1,0,-6,-63,-14,-12,-17,-23,-21,-24,-27,-26,96,95,63,36,16,8,2,7,6,-7,-4,-13,-60,-28,-21,68,-25,-26,96,71,47,34,22,16,14,21,8,2,8,20,9,-11,-10,70,94,-33,96,61,48,36,29,25,24,20,17,10,10,12,20,12,4,89,94,94,81,54,49,39,31,25,32,82,32,21,37,78,35,21,18,90,89,84,73,60,51,43,37,34,43,50,47,40,47,52,46,34,26,88,86,81,71,58,47,40,35,34,37,41,41,40,43,44,42,38,34],"ownershipAllowedMAE":0.0328749})%"); + lines.push_back(R"%({"sample":{"board":"............O....O./.XOX......XOXOXXXOX/.OXXXX.O..XOXO..O../..OOXO...X.OXXXXOO./.O.XOO..OX..O.OXXO./.X.X.......O..OX.X./..X.......X..XO.XX./...........X.XOOOO./..O.O.....OX.OXOXO./...........X.OXOX../........XXXO.OXXX../........OOO.OXO..../..O.........OX.XXX./..XO...OOXX.OX.XOO./..O.X.OXXO...O.OO../...O....OOXXOO.OXX./..O..XOOXX.XXXXXOX./...X.O.OXOX......../.................../","hintLoc":"null","initialTurnNumber":151,"metadata":"5706AC787CCBD79A65FBA32A825E2F30:161","moveLocs":["T17","Q13","O19","P19","R19","O15","O14","M15","L15","L14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.5,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":6.0,"policyOptimism":0.099,"pda":2.146,"policyMixture":[8.4e-06,0.000502,0.000196,1.35e-05,7.72e-06,7.7e-06,7.97e-06,8.74e-06,1.01e-05,2.61e-05,0.0396,0.0955,0,0,0,0.00373,0,0,8.52e-06,0.00266,0,0,0,7.13e-06,8.63e-06,8.41e-06,9.81e-06,2.67e-05,0.00142,0,0,0,0,0,0,0,0,0,8.39e-06,0,0,0,0,0,1.21e-05,0,8.91e-06,2.88e-05,0,0,0,0,0.0233,0.0137,0,7.14e-06,0,7.91e-06,8.35e-06,0,0,0,0,8.01e-06,9.11e-06,7.86e-05,0,0.000969,0,0,0,0,0,0,0,7.97e-06,7.69e-06,0,8.97e-06,0,0,0,7.74e-06,8.85e-06,0,0,0,0.0221,0,0,0,0,0,0,0.018,1.86e-05,0,7.7e-06,0,1.25e-05,7.65e-06,8.08e-06,9.39e-06,7.67e-05,0.0647,0,0,0.144,0,0,0,0,0,0.00776,8.99e-06,9.92e-06,0,1.18e-05,1.25e-05,8.41e-06,8.34e-06,8.29e-06,1.7e-05,1.92e-05,0,0.0195,3.7e-05,0,0,0,0,0,0.259,1.04e-05,8.25e-06,8.06e-06,7.84e-06,8.18e-06,8.37e-06,8.45e-06,8.59e-06,9.2e-06,9.75e-06,1.32e-05,0,0.252,0,0,0,0,0,0.0068,7.4e-06,8.09e-06,0,7.86e-06,0,8.23e-06,8.56e-06,8.69e-06,9.87e-06,8.55e-06,0,0,8.96e-06,0,0,0,0,0,0.000184,7.03e-06,7.23e-06,7.8e-06,7.82e-06,8.25e-06,8.06e-06,8.5e-06,8.9e-06,8.13e-06,7.1e-06,1.54e-05,0,7.75e-06,0,0,0,0,0.0119,0.000599,7.21e-06,7.08e-06,7.63e-06,7.85e-06,8.1e-06,8.13e-06,8.27e-06,1.62e-05,0,0,0,0,8.51e-06,0,0,0,0,7.07e-05,0.00753,7.09e-06,7.42e-06,7.54e-06,7.85e-06,8.02e-06,8e-06,7.91e-06,8.56e-06,0,0,0,7.74e-06,0,0,0,5.18e-05,1.24e-05,9.17e-05,0.000393,7.15e-06,7.22e-06,0,7.71e-06,7.87e-06,7.76e-06,7.81e-06,8.08e-06,7.99e-06,8.2e-06,7.78e-06,8.25e-06,0,0,9.54e-05,0,0,0,0.0013,6.95e-06,7.13e-06,0,0,7.48e-06,7.74e-06,8e-06,0,0,0,0,7.9e-06,0,0,0.000235,0,0,0,9.93e-06,6.99e-06,7.21e-06,0,7.57e-06,0,7.43e-06,0,0,0,0,8.18e-06,8.51e-06,7.34e-06,0,7.89e-06,0,0,7.33e-06,7.92e-06,6.81e-06,7.34e-06,7.56e-06,0,7.37e-06,7.66e-06,7.87e-06,7.34e-06,0,0,0,0,0,0,7.64e-06,0,0,0,7.26e-06,7.03e-06,7.29e-06,0,7.25e-06,7.25e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,6.84e-06,6.97e-06,7.02e-06,6.89e-06,0,7.06e-06,0,7.26e-06,0,0,0,0,7.64e-06,7.38e-06,7.31e-06,7.4e-06,7.51e-06,8.43e-06,8.92e-06,7.39e-06,7.17e-06,7.2e-06,7.18e-06,6.98e-06,7.19e-06,7.54e-06,7.51e-06,7.26e-06,8.41e-06,7.48e-06,7.9e-06,7.6e-06,7.46e-06,7.53e-06,7.52e-06,7.28e-06,7.45e-06,7.51e-06,7.76e-06,1.76e-05],"winrateAvg":0.712703,"leadAvg":7.51357,"scoreMeanAvg":10.2819,"scoreStdevAvg":23.4122,"shorttermWinlossErrorAvg":0.51758,"shorttermScoreErrorAvg":11.1648,"ownership":[-55,-59,-62,-62,-54,-43,-29,-21,-26,-35,-37,41,43,42,10,72,93,92,90,-44,-60,-58,-78,-60,-47,-29,-9,-23,-34,-68,47,6,40,10,10,7,91,90,-49,-41,-79,-78,-79,-80,-20,26,-12,-39,-65,47,11,44,13,51,91,91,92,-49,-42,-42,-43,-78,40,2,0,-19,-68,-56,47,13,14,10,9,90,91,86,-55,-41,-66,-72,44,42,9,2,27,-67,46,41,50,12,47,9,6,90,62,-58,-72,-68,-75,-17,6,0,-1,-14,-23,-84,52,49,53,48,9,7,6,18,-37,-33,-75,-18,13,0,2,-3,-15,-37,-84,-48,-58,-79,50,7,8,7,12,1,1,-10,7,19,6,6,-1,-16,-34,-48,-89,-66,-77,50,46,44,41,16,21,31,82,39,83,23,10,1,-12,-35,-18,-90,-63,22,-92,46,-92,41,8,47,62,58,52,42,23,9,-12,-22,-44,-61,-90,-23,23,-93,42,-92,-55,-42,60,65,61,51,42,29,12,13,-73,-74,-75,43,13,20,-93,-92,-93,-79,-63,72,74,67,55,47,38,31,25,81,77,74,34,54,-89,-84,-88,-86,-81,-73,82,87,97,65,57,50,44,57,38,-10,-23,-9,53,-90,-87,-93,-93,-93,-38,88,92,88,98,72,63,65,90,89,-94,-94,-37,56,-89,-37,-93,51,53,-2,92,94,99,82,63,75,96,76,73,82,-74,-59,45,50,19,49,51,-8,-9,93,94,96,99,83,85,85,84,84,83,-100,-100,47,50,-27,50,-96,-95,-51,93,94,99,92,91,81,99,99,-96,-98,-97,-100,-100,-100,-100,-100,-92,-96,-81,93,92,92,86,92,98,95,99,-97,-90,-100,-97,-98,-98,-98,-97,-94,-92,-86,92,92,92,91,92,92,92,36,-50,-93,-96,-97,-97,-97,-97,-96,-95,-93,-90],"ownershipAllowedMAE":0.0806306})%"); + lines.push_back(R"%({"sample":{"board":"................/.XOXO.XO.XOO..../.XOXO.XOX.XOO.O./.XXOO.XOX.XOXXO./...XOXXOX.OXX.../....OX.XOOOOXOO./..XXOX.XOXXXOOX./...OXOX.O..XOXX./....X......XXO../...X............/..X............./...O............/.O..O.....XO.O../..X.OX.....O..../....O.........../................/","hintLoc":"null","initialTurnNumber":90,"metadata":"53BF943DB5352E50C1D06AB6A07F6261:100","moveLocs":["O7","L5","P5","H6","G6","G5","K5","J5","B5","C4"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.23,"xSize":16,"ySize":16},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":3.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.83e-06,3.39e-06,3.93e-06,3.89e-06,2.75e-06,3.84e-06,4.13e-06,1.09e-05,8.24e-06,9.66e-06,1.08e-05,6.78e-06,3.69e-06,3.3e-06,2.95e-06,3.13e-06,2.85e-06,0,0,0,0,3.13e-06,0,0,7.92e-06,0,0,0,4.62e-06,0.000513,3.89e-06,3.22e-06,2.78e-06,0,0,0,0,3.09e-06,0,0,0,6.34e-06,0,0,0,0.000565,0,3.53e-06,2.79e-06,0,0,0,0,2.86e-06,0,0,0,7.78e-06,0,0,0,0,0,5.19e-06,3.04e-06,3.38e-06,3.67e-06,0,0,0,0,0,0,4.12e-05,0,0,0,0.000467,0.00473,0.00092,2.91e-06,3.6e-06,3.8e-06,4.15e-06,0,0,3.21e-06,0,0,0,0,0,0,0,0,0.0163,3.22e-06,3.55e-06,0,0,0,0,3.58e-06,0,0,0,0,0,0,0,0,8.12e-06,2.87e-06,3.61e-06,4e-06,0,0,0,0,0.000131,0,0.000608,4.8e-06,0,0,0,0,5.38e-06,2.89e-06,3.52e-06,3.69e-06,3.75e-06,0,5.43e-06,7.11e-06,1.3e-05,0.00484,3.79e-05,6.97e-06,0,0,0,1.01e-05,5.86e-06,3.48e-06,5.07e-06,3.85e-06,0,6.16e-06,5.28e-05,0.000145,0.000374,0.000195,0.000435,7e-05,9.72e-06,5.94e-06,0,6.12e-05,5.68e-06,7.37e-06,4.36e-06,0,7.94e-06,8.37e-05,0.000207,0,0,0.000692,0.189,0.105,0.000529,7.57e-05,2.61e-05,2.14e-05,6.47e-06,0.00013,0,1.12e-05,0,6.39e-06,0.0559,0,0.00166,0,0,0,0.00765,0.00153,0.00261,0,3.08e-05,0.185,0,0,4.59e-06,0,0.000606,0.00118,0.000277,2.03e-05,8.24e-05,0,0,0.00106,0,0.0839,0.000553,6.4e-05,0.000105,0,4.82e-06,0,0,4.25e-06,5.67e-06,7.03e-06,1.76e-05,0.00126,0,0.0011,0.0107,0.315,0.00067,2.48e-05,5.08e-06,3.96e-06,4.23e-06,0,5.29e-06,4.96e-06,5.02e-06,5.79e-06,1.44e-05,0.000104,0.00195,0.000214,0.000271,0.000154,0.000111,3.38e-06,4.78e-06,3.75e-06,3.76e-06,3.94e-06,3.74e-06,3.55e-06,3.75e-06,3.72e-06,3.83e-06,5.43e-06,5.35e-06,6.58e-06,6.4e-06,7.34e-06,4.42e-06,1.5e-05],"winrateAvg":0.00298635,"leadAvg":-6.79427,"scoreMeanAvg":-6.76413,"scoreStdevAvg":4.53169,"shorttermWinlossErrorAvg":0.0174961,"shorttermScoreErrorAvg":1.04831,"ownership":[-99,-99,-99,-98,-98,-98,-98,-98,-81,15,52,94,98,98,99,99,-99,-100,-98,-99,-97,-98,-100,-97,-97,-98,100,100,99,99,99,99,-99,-100,-98,-99,-97,-98,-100,-97,-98,-86,-85,100,100,99,100,99,-99,-100,-100,-97,-97,-99,-100,-97,-98,19,-82,100,97,97,100,97,-99,-99,-98,-99,-97,-100,-100,-97,-98,33,99,97,97,98,95,92,-99,-99,-98,-98,-97,-100,-99,-100,98,99,99,99,97,99,99,59,-98,-98,-100,-100,-97,-100,-97,-100,98,-99,-99,-99,99,99,-94,44,-97,-98,-98,-97,-100,-62,-99,-32,97,16,-55,-99,99,-94,-94,-62,-96,-97,-97,-98,-100,-62,-34,-11,-29,-24,-47,-99,-99,-94,-94,-87,-94,-96,-97,-99,-34,-11,-11,1,-12,-27,-25,-31,-49,-98,-90,-88,-90,-91,-98,34,1,4,-45,95,-1,-39,-10,6,-9,-34,-75,-83,-73,-95,48,99,55,34,97,93,96,-42,89,49,23,34,-85,-78,-64,99,99,97,100,94,92,92,88,92,81,98,51,82,53,-80,94,96,94,97,100,89,92,92,91,91,91,98,64,35,-62,-61,94,95,97,97,100,94,93,92,91,91,91,88,74,53,-9,-40,94,96,96,97,97,96,94,92,90,89,87,79,65,32,8,-13],"ownershipAllowedMAE":0.0269056,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":".................../.....XX.O..X.OXO.../.XXXXOXXO.O.XOXOOO./.XOOOOOOOOO.XXOOX../.OO.....XXOXXO..XO./.XOX..X.XOXX.O.OOX./.OOOXX.X.OOX...X.O./.OXXXOO.XXXOOO..XX./.OX..OX..OOX.XXXOX./XXXOO.X..XO.XXOOOO./OXXXO..XXOOX..XX.O./OOXXO.OXO.OX.XOOO.O/.OXOOO.OOOXXXX.XXO./OOXXXOOXXX.....X.XO/.OOOOO.XO...XX..X.X/OXXXO.OOOXX.OX.XXXO/.X..XOOXXOXOOOOOX../....XXX.XOOOX.OXX../............O....../","hintLoc":"null","initialTurnNumber":186,"metadata":"832F57D6DDB55AEAB5318ECD727F89AE:196","moveLocs":["J11","J10","H15","S5","T10","R6","T11","T9","S6","P12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.62,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1button1","komi":9.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.46e-06,2.77e-06,2.55e-06,2.8e-06,3.08e-06,2.64e-06,2.78e-06,2.91e-06,2.85e-06,3.95e-06,4.47e-06,3.11e-06,3.14e-06,3.62e-06,3.43e-06,2.61e-06,2.69e-06,2.65e-06,2.46e-06,2.88e-06,3.01e-06,2.91e-06,3.17e-06,2.99e-06,0,0,3.15e-06,0,0.00655,1.06e-05,0,1.14e-05,0,0,0,2.65e-06,2.69e-06,2.55e-06,2.9e-06,0,0,0,0,0,0,0,0,2.87e-06,0,2.54e-06,0,0,0,0,0,0,2.63e-06,1.37e-05,0,0,0,0,0,0,0,0,0,0,2.73e-06,0,0,0,0,0,4.75e-05,2.73e-06,6.38e-05,0,0,2.96e-06,1.5e-05,6.13e-06,7.41e-06,0,0,0,0,0,0,0,8.3e-06,0.000146,0,0,4.66e-05,0.00317,0,0,0,2.9e-05,3.81e-05,0,2.34e-06,0,0,0,0,2.92e-06,0,0.00417,0,0,0,0.00354,1.12e-05,0,0,0,0,0,1.79e-05,0,3.56e-06,0,0,0,4.74e-06,0.000141,0.183,0,0.0659,0,0.00563,3.99e-06,0,0,0,0,0,0,2.85e-06,0,0,0,0,0,0,0,0.726,0,0,2.83e-06,0.000123,0,0,3.02e-06,3.39e-06,0,0,2.73e-06,0,0,0,0,2.93e-06,0,0,0,0,0,0,0,0,0,0,0,6.8e-06,0,3.69e-06,0,0,0,4.08e-06,0,0,0,0,0,0,0,0,0,0,0,0,2.99e-06,2.9e-06,0,0,0,0,0,2.7e-06,0.000117,0,0,2.34e-06,0,0,0,0,0,0,0,2.84e-06,0,0,0,0,0,0,2.74e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.07e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.77e-06,3.07e-06,2.93e-06,2.87e-06,2.8e-06,0,5.73e-05,0,0,0,0,0,0,0,0,4.84e-06,0,0,3.67e-06,2.98e-06,2.93e-06,0,0,2.88e-06,2.72e-06,0,0,4.63e-05,0,0,0,0,0,0,0,0,0,0,0,2.67e-06,0,0,2.68e-06,0,0,0,0,2.71e-06,0,2.71e-06,2.75e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,2.97e-06,3.42e-06,2.52e-06,2.97e-06,3.06e-06,3.11e-06,0,0,0,2.68e-06,0,0,0,0,0,3.02e-06,0,0,0,2.94e-06,2.85e-06,2.71e-06,3.08e-06,2.8e-06,2.98e-06,2.9e-06,2.93e-06,2.76e-06,2.62e-06,2.81e-06,0.000369,4.28e-05,0.000165,0,0.000284,2.64e-06,2.72e-06,2.87e-06,2.84e-06,2.38e-06,4.24e-06],"winrateAvg":0.0785456,"leadAvg":-7.89455,"scoreMeanAvg":-7.62713,"scoreStdevAvg":9.61299,"shorttermWinlossErrorAvg":0.240867,"shorttermScoreErrorAvg":4.8023,"ownership":[-96,-96,-96,-95,-90,-62,9,52,65,17,-28,-58,-32,61,89,95,99,98,98,-96,-96,-97,-96,-94,-93,-93,33,93,18,44,-90,7,86,86,100,99,98,97,-91,-98,-97,-97,-98,95,-93,-94,94,78,94,-52,-98,85,85,100,100,100,90,-13,-98,96,96,96,95,95,94,94,95,95,-20,-99,-99,100,100,58,70,80,38,96,96,71,1,-7,-28,-99,-100,-100,95,-99,-99,88,85,75,56,72,62,82,86,96,-7,-11,-66,-99,-98,-100,-99,-100,-100,-25,86,-11,81,79,46,49,87,96,96,96,-95,-95,11,-100,-99,-99,-99,-100,0,37,-54,-98,-51,53,-7,57,97,-96,-95,-95,90,88,6,-99,-99,-99,58,54,51,56,-95,-99,-99,-66,-8,96,-95,-38,65,90,-55,-40,-97,87,89,-97,-53,-100,-100,-100,-4,-98,-98,-96,-94,-94,100,100,30,-58,-27,31,27,90,-52,-100,-100,-4,-4,-6,-4,-97,100,-95,-93,-94,100,62,38,-38,-35,90,90,-100,-99,-97,-97,-92,-22,-5,-8,100,100,-94,-96,100,92,100,-34,97,90,90,-100,-100,-100,-4,-8,-9,-5,-3,100,100,-96,100,100,100,98,98,97,97,-100,-100,-100,-100,-34,-99,-98,-2,-4,100,100,-96,-96,-96,100,100,-69,-70,-72,-72,-77,-90,-88,-79,-100,-15,-10,0,82,100,100,100,100,100,63,-72,99,33,-63,-36,-100,-100,-72,-94,-100,-11,-21,83,-68,-67,-68,100,98,99,98,98,-76,-76,38,95,-100,52,-100,-100,-100,-21,28,-68,-63,-70,-94,99,99,-68,-66,95,-78,95,95,95,95,95,-100,-84,-55,-21,-26,-62,-80,-93,-94,-94,-68,-66,95,96,95,93,95,96,-100,-100,-79,-64,-37,-54,-67,-81,-87,-86,-70,-38,33,54,90,91,93,76,33,0,-89,-89,-77],"ownershipAllowedMAE":0.0579761})%"); + lines.push_back(R"%({"sample":{"board":".................../.X..X..XO.OOX....../.OOOX.X.XO.OXXXX.../XXXXO...XOXXOOOX.../...O.O.X.O.XXO.X.../..O....XOOXXOXX..../......OOXXOOOO.XXO./......XXXXXO..OXO../........O.OXXXO.O../...O......OX.XOO.../.......X.OXO.OX..../.....XXO..XO.O...../.....OOXXXXO......./..X..O.O.XO....O.../...X.OOO.XO......../..XO.O.O.XO....O.../..X.OXOOX.O.X..OX../...XOXXXXXO...O.OX./....O....O.....O.O./","hintLoc":"null","initialTurnNumber":149,"metadata":"850BCCF5AB3BB9406124750AE2C0C424:159","moveLocs":["K10","J9","O12","J10","N12","B10","F12","F11","E11","F13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.59,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.45e-05,0.000543,0.000151,7.9e-05,6.69e-05,6.23e-05,6.24e-05,7.68e-05,6.43e-05,0.00128,5.35e-05,0.00109,6.05e-05,6.31e-05,6.24e-05,6.09e-05,6.19e-05,6.42e-05,6.13e-05,0.00302,0,0.000685,9.75e-05,0,0.00336,8.62e-05,0,0,5.72e-05,0,0,0,5.87e-05,6.08e-05,6.27e-05,6.59e-05,6.58e-05,6.54e-05,0.135,0,0,0,0,0.0173,0,7.09e-05,0,0,0.0174,0,0,0,0,0,6.81e-05,6.85e-05,6.63e-05,0,0,0,0,0,6.72e-05,0.000171,0.000186,0,0,0,0,0,0,0,0,6.6e-05,6.77e-05,7.05e-05,0.0225,0.326,0.0496,0,8.18e-05,0,7.3e-05,0,8.07e-05,0,0.0112,0,0,0,0,0,6.99e-05,0.000432,7.69e-05,8.07e-05,7.08e-05,0,7.92e-05,0.000105,8.49e-05,0.000133,0,0,0,0,0,0,0,0,6.24e-05,8.49e-05,0.000208,8.33e-05,8.63e-05,0.000329,0.000162,0.000414,0.000709,0,0,0,0,0,0,0,0,0,6.29e-05,0,0,0,7.32e-05,8.81e-05,0.000549,0.00088,0.00101,0.383,0,0,0,0,0,0,0,0,0,0,0,0,7.53e-05,7.27e-05,9.31e-05,0.00122,0.00088,0.000132,0,0,0.000116,7.34e-05,0,7.31e-05,0,0,0,0,0,6.55e-05,0,6.85e-05,6.83e-05,0.000128,0,0.000932,0,7.95e-05,0.000237,7.4e-05,6.87e-05,0,0,0,0,7.32e-05,0,0,0,5.82e-05,6.29e-05,6.08e-05,8.64e-05,0.00155,0.00138,0.000339,0.000114,0.000153,0.000129,0,0,0,0,0,5.8e-05,0,0,5.81e-05,5.8e-05,6.02e-05,6.02e-05,8.67e-05,0.000689,0.00113,0.000623,0.000689,0,0,0,6.77e-05,7.55e-05,0,0,5.96e-05,0,5.8e-05,5.72e-05,5.7e-05,6.01e-05,5.89e-05,7.71e-05,0.000405,0.000894,0.000707,9.03e-05,0,0,0,0,0,0,0,5.81e-05,5.75e-05,5.66e-05,5.72e-05,5.7e-05,5.93e-05,5.86e-05,7.23e-05,0.000146,0,0.000118,7.59e-05,0,3.51e-05,0,5.95e-05,0,0,5.94e-05,5.72e-05,5.76e-05,5.77e-05,0,5.67e-05,5.96e-05,5.83e-05,6.87e-05,0.000118,8.03e-05,0,7.7e-05,0,0,0,5.77e-05,0,0,5.82e-05,5.83e-05,5.76e-05,5.71e-05,5.87e-05,5.73e-05,5.88e-05,5.83e-05,6.78e-05,6.85e-05,0,0,6.72e-05,0,4.08e-05,0,0.000369,0,0,5.95e-05,5.74e-05,5.79e-05,5.86e-05,0,5.91e-05,5.87e-05,5.83e-05,6.63e-05,6.78e-05,0,7.5e-05,0,0,0,0,0,0.000383,0,5.93e-05,0,5.74e-05,5.96e-05,0,0,5.84e-05,5.9e-05,6.58e-05,7.99e-05,7.34e-05,0,0,0,0,0,0,0,0,6.03e-05,5.93e-05,5.95e-05,0,5.97e-05,0,0,5.97e-05,6.35e-05,7.3e-05,7.03e-05,7.84e-05,0,6.54e-05,6.08e-05,5.95e-05,6.29e-05,0,6.37e-05,6.05e-05,6.02e-05,6.12e-05,6.05e-05,0,6.14e-05,0,5.96e-05,5.53e-05],"winrateAvg":0.00372228,"leadAvg":-7.79739,"scoreMeanAvg":-8.12824,"scoreStdevAvg":6.32384,"shorttermWinlossErrorAvg":0.0279524,"shorttermScoreErrorAvg":1.48097,"ownership":[-96,-96,-97,-97,-98,-97,-98,-97,-96,-95,-95,-96,-96,-97,-95,-93,-87,-81,-75,-96,-98,-97,-97,-100,-97,-97,-100,-94,-95,-93,-93,-100,-97,-97,-94,-85,-76,-67,-94,-92,-92,-92,-100,-67,-100,-98,-100,-93,-95,-93,-100,-100,-100,-100,-83,-66,-54,-94,-95,-94,-94,59,-31,-31,-80,-100,-93,-99,-99,-97,-97,-97,-100,-66,-64,-29,17,73,41,81,54,66,-28,-100,-96,-94,-95,-99,-99,-97,-99,-100,-59,-1,-10,42,60,87,42,-11,-30,-58,-100,-95,-95,-99,-99,100,-100,-100,-85,-36,-17,19,35,36,47,38,16,-65,-54,-57,-100,-100,100,100,100,100,-19,-99,-99,56,33,21,18,29,47,89,86,-100,-100,-100,-100,-100,100,100,100,100,-99,99,57,65,-6,13,22,53,88,-46,-36,-79,-62,-64,96,95,94,94,100,20,99,91,75,-29,-68,27,85,34,1,-43,-75,-100,96,96,95,98,94,100,100,96,94,90,-52,-47,-38,9,1,-13,-52,-100,-100,96,-99,100,96,100,95,97,96,96,94,-57,-56,-25,-4,7,-89,-93,-92,-98,-12,-100,100,97,100,97,97,97,96,95,-65,-64,1,13,26,100,100,-100,-100,-100,-100,100,97,98,98,97,97,97,96,-74,-82,-95,-10,32,100,99,100,-38,-100,100,98,98,98,98,100,98,97,97,-84,-90,-92,-92,29,100,100,100,48,-100,100,98,98,98,98,98,98,97,97,-89,-93,-97,94,93,100,99,100,-29,-100,100,97,98,98,98,100,98,97,97,-91,-93,-97,-18,95,-99,100,100,-99,-34,100,97,95,97,98,100,95,97,97,-90,-88,-87,-94,95,-99,-99,-99,-99,-99,100,97,97,97,100,98,100,96,97,-89,-87,-83,47,95,28,-54,-81,-74,94,94,96,97,97,98,100,98,100,97],"ownershipAllowedMAE":0.0315174,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..............O..../...X............X../.................../..X................/.................../.................../.................../.................../.................../..O................/.................../.................../..XXO............../...OX.X........O.../...OX............../....O............../.................../","hintLoc":"null","initialTurnNumber":4,"metadata":"EDA297C962799C6243187DBD18748F0C:14","moveLocs":["D6","D2","C2","C3","D1","C4","D2","B2","G3","E6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.81,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":3.0,"policyOptimism":0.453,"pda":0.0,"policyMixture":[7.64e-06,8.3e-06,7.85e-06,7.98e-06,8.04e-06,8.11e-06,8.17e-06,8.17e-06,8.14e-06,8.13e-06,8.13e-06,8.06e-06,8.01e-06,7.93e-06,8.02e-06,7.89e-06,7.67e-06,8e-06,7.58e-06,8.44e-06,9.39e-06,1.73e-05,2.88e-05,5.24e-05,1.25e-05,9.35e-06,9.38e-06,9.33e-06,9.29e-06,9.34e-06,9.39e-06,9.31e-06,9.03e-06,9.43e-06,1.04e-05,1.95e-05,8.8e-06,8.31e-06,7.97e-06,8.84e-06,6.26e-05,8.01e-05,6.66e-05,6.54e-05,5.07e-05,4.92e-05,4.93e-05,4.35e-05,4.2e-05,3.4e-05,1.12e-05,8.78e-06,0,1.38e-05,5.31e-05,9.72e-06,8.14e-06,8.13e-06,1.06e-05,6.56e-05,0,7.41e-05,3.01e-05,2.53e-05,2.71e-05,4.06e-05,4.15e-05,4.14e-05,2.41e-05,1.06e-05,9.89e-06,9.53e-06,6.54e-05,0,1.29e-05,8.05e-06,8.2e-06,1.18e-05,0.000105,0.000115,9.62e-06,1.01e-05,9.88e-06,9.88e-06,9.93e-06,9.85e-06,9.69e-06,9.53e-06,9.46e-06,9.6e-06,4.16e-05,9.26e-05,7.45e-05,1.8e-05,8.09e-06,8.15e-06,5.13e-05,0,4.6e-05,9.64e-06,9.9e-06,9.92e-06,9.98e-06,9.95e-06,9.84e-06,9.81e-06,9.82e-06,9.63e-06,9.86e-06,2.37e-05,5.76e-05,6.79e-05,3.14e-05,7.98e-06,8.21e-06,1.17e-05,7.22e-05,5.51e-05,9.76e-06,9.87e-06,9.98e-06,9.95e-06,9.87e-06,9.81e-06,9.87e-06,9.98e-06,1.01e-05,9.78e-06,1.41e-05,5.21e-05,6.28e-05,1.29e-05,7.97e-06,8.44e-06,1.44e-05,6.18e-05,3.41e-05,9.8e-06,9.73e-06,9.74e-06,9.75e-06,9.72e-06,9.75e-06,9.86e-06,1.01e-05,1.02e-05,9.81e-06,1.01e-05,3.15e-05,4.52e-05,8.89e-06,8.03e-06,8.43e-06,9.61e-06,6.08e-05,2.96e-05,9.63e-06,9.6e-06,9.58e-06,9.55e-06,9.63e-06,9.67e-06,9.85e-06,1.01e-05,9.98e-06,9.79e-06,9.62e-06,1.9e-05,3.21e-05,9.1e-06,8.14e-06,8.37e-06,9e-06,2.41e-05,1.44e-05,9.47e-06,9.5e-06,9.51e-06,9.53e-06,9.59e-06,9.6e-06,9.66e-06,9.84e-06,9.87e-06,9.77e-06,9.73e-06,1.7e-05,2.44e-05,9.26e-06,8.13e-06,8.11e-06,8.6e-06,8.22e-06,8.99e-06,9.53e-06,9.46e-06,9.48e-06,9.5e-06,9.51e-06,9.42e-06,9.59e-06,9.67e-06,9.73e-06,9.75e-06,9.7e-06,1.66e-05,2.09e-05,9.3e-06,8.13e-06,8.3e-06,7.92e-06,0,8.65e-06,1.13e-05,1.04e-05,9.36e-06,9.38e-06,9.49e-06,9.45e-06,9.54e-06,9.6e-06,9.65e-06,9.71e-06,9.68e-06,1.55e-05,2.38e-05,9.41e-06,8.1e-06,7.94e-06,8.9e-06,7.95e-06,8.94e-06,3.36e-05,1.34e-05,9.93e-06,9.79e-06,9.62e-06,9.54e-06,9.43e-06,9.54e-06,9.64e-06,9.6e-06,9.55e-06,3.29e-05,4.63e-05,9.38e-06,8.07e-06,8.25e-06,8.74e-06,2.28e-05,0,0,3.37e-05,2.17e-05,1.21e-05,1.09e-05,9.75e-06,9.46e-06,9.5e-06,9.47e-06,9.61e-06,9.53e-06,4.68e-05,6.08e-05,9.26e-06,7.98e-06,8.37e-06,8.14e-06,0,0,0,0.994,2.11e-05,2.23e-05,1.82e-05,1.06e-05,9.8e-06,9.6e-06,9.48e-06,9.5e-06,9.41e-06,9.38e-06,4.05e-05,9.17e-06,8.12e-06,8.56e-06,7.92e-06,0,0,0,1.94e-05,0,7.64e-05,4.33e-05,2.94e-05,2.14e-05,1.61e-05,2.56e-05,4.37e-05,9.22e-06,0,1.26e-05,9.25e-06,7.97e-06,8.68e-06,3.62e-05,0,0,0,3.95e-05,0,7.15e-05,6.89e-05,4.37e-05,3.02e-05,2.47e-05,4.24e-05,5.9e-05,4.19e-05,1.24e-05,1.94e-05,8.51e-06,7.86e-06,1.34e-05,0,0,0,0,1.14e-05,1.1e-05,2.77e-05,2.93e-05,1.34e-05,9.23e-06,9.1e-06,9.08e-06,9.19e-06,9.34e-06,9.27e-06,8.44e-06,8.36e-06,8.16e-06,7.37e-06,4.9e-05,7.04e-06,0,6.96e-06,8.12e-06,8.55e-06,8.2e-06,8.35e-06,8.53e-06,8.37e-06,8.35e-06,8.29e-06,8.22e-06,8.28e-06,8.07e-06,7.94e-06,8.25e-06,7.62e-06,7.69e-06],"winrateAvg":0.236335,"leadAvg":-3.00156,"scoreMeanAvg":-4.87694,"scoreStdevAvg":14.1502,"shorttermWinlossErrorAvg":0.141102,"shorttermScoreErrorAvg":1.66085,"ownership":[-34,-31,-28,-23,-17,-11,-7,-6,-5,-3,1,8,16,22,20,8,-8,-17,-25,-38,-34,-33,-27,-22,-11,-8,-8,-7,-5,0,7,14,26,29,3,-11,-25,-30,-40,-43,-45,-44,-37,-7,-9,-9,-8,-8,-4,3,8,19,63,-16,-25,-38,-36,-44,-46,-54,-85,-26,-12,-8,-7,-6,-6,-2,2,7,13,20,2,-69,-46,-39,-46,-52,-53,-37,-22,-10,-7,-5,-5,-5,-3,0,3,6,9,22,-33,-40,-36,-41,-49,-82,-32,-18,-9,-5,-4,-4,-3,-2,0,3,6,7,15,-16,-30,-27,-30,-33,-21,-12,-11,-6,-4,-3,-3,-2,-1,0,2,4,6,7,-14,-20,-18,-15,-16,-8,-8,-5,-4,-3,-2,-2,-1,-1,1,2,4,5,3,-2,-9,-9,-3,-4,-3,-4,-3,-3,-2,-2,-1,-1,0,1,2,3,4,4,2,-2,-3,7,5,1,-1,-1,-1,0,0,0,0,0,1,1,2,3,4,3,1,0,14,14,10,1,0,3,3,1,0,0,0,0,1,2,3,3,3,2,2,14,22,52,6,2,9,6,2,0,0,0,0,1,2,4,4,5,3,3,2,8,7,-3,1,29,11,2,-1,-1,-1,0,2,4,6,7,7,4,5,-21,-31,-1,23,-6,61,9,-4,-4,-2,-1,0,3,7,11,17,12,8,9,-40,-42,-68,-69,69,68,-27,-19,-8,-2,0,2,6,12,18,31,27,17,13,-48,-59,-68,40,-57,-64,-66,-9,-7,-1,1,4,8,18,31,81,32,19,17,-52,-54,-71,39,-58,-3,42,-9,3,3,2,5,9,17,33,38,23,21,18,-48,-54,40,40,40,22,33,21,13,8,6,6,8,13,22,23,23,18,19,-33,5,18,41,37,32,31,24,15,8,5,5,8,12,17,21,20,20,18],"ownershipAllowedMAE":0.0494001})%"); + lines.push_back(R"%({"sample":{"board":".................../.............XO..X./.........X....OXXO./...O..........OOOX./.................X./.................../.............O.O.O./.................../.............XX..../............XO.X.../...............X.X./..............OOXO./................O../.O..........O..OO../...X............X../..OX......X.OX.X.../..OX.........X...../.................../.................../","hintLoc":"null","initialTurnNumber":44,"metadata":"AC36BE01C8FFA86D17EB8D3FC93A3466:54","moveLocs":["R9","N8","N16","N15","O15","O16","N14","M15","O14","L17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.96,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0","komi":4.5,"policyOptimism":0.0,"pda":2.887,"policyMixture":[7.72e-06,2.11e-05,3e-05,3.8e-05,3.92e-05,3.34e-05,2.83e-05,2.57e-05,2.67e-05,3.15e-05,3e-05,2.8e-05,2.18e-05,2.08e-05,5.17e-05,0.000569,0.000124,2.01e-05,9.25e-06,2.19e-05,9.73e-05,0.000412,0.000859,0.00156,0.00061,0.000177,9.13e-05,0.000157,0.000461,0.242,0.0192,4.51e-05,0,0,0.000145,8.71e-05,0,1.17e-05,2.94e-05,0.000296,0.00648,0.0679,0.00308,0.00543,0.00175,0.000419,0.000115,0,0,0.00293,0.00735,1.88e-05,0,0,0,0,7.28e-05,3.57e-05,0.000453,0.00259,0,0.00299,0.0013,0.000593,0.000301,0.000503,0.00306,0.143,0.0043,0,0,0,0,0,0,8.58e-06,3.54e-05,0.000609,0.0016,0.00239,0.000668,0.000333,0.000293,0.000285,0.000413,0.00242,0.000373,0,0,0,5.08e-05,0.0001,0.000189,0,1.33e-05,2.9e-05,0.000336,0.00247,0.00117,0.000361,0.000269,0.000274,0.000265,0.000403,0.000913,0.000592,0.00469,0,0,0.000136,0.15,0.0643,8.32e-05,1.97e-05,2.55e-05,0.000114,0.000927,0.000728,0.00032,0.000263,0.000246,0.000252,0.000345,0.000422,0.0008,0.000396,0.0173,0,0.00248,0,9.2e-05,0,2.42e-05,2.32e-05,9.18e-05,0.000375,0.000362,0.000231,0.000209,0.000214,0.000227,0.00023,0.000282,0.000321,0.00024,8.24e-05,4.74e-05,3.62e-05,6.48e-05,9.2e-05,5.12e-05,2.01e-05,2.17e-05,8.51e-05,0.000258,0.000262,0.000178,0.000179,0.000199,0.000207,0.000228,0.000276,0.000194,0.000158,5.73e-05,0,0,1.73e-05,3.24e-05,4.23e-05,1.89e-05,2.08e-05,8.29e-05,0.000204,0.000206,0.000162,0.000165,0.000185,0.00022,0.000284,0.00041,0.00108,0.000147,0,0,2.52e-05,0,1.12e-05,1.99e-05,1.47e-05,2.06e-05,8.57e-05,0.00022,0.000243,0.000178,0.000146,0.000178,0.000249,0.000341,0.000491,0.000823,0.000516,0.000125,0.000225,4e-05,0,0,0,1.65e-05,2.22e-05,0.000119,0.000213,0.000224,0.000168,0.000128,0.000171,0.000271,0.000411,0.000752,0.000998,0.000227,0,9.93e-05,0,0,0,0,4.5e-05,2.55e-05,0.000278,0.00167,0.000247,0.000102,0.00011,0.00014,0.00027,0.000481,0.00149,0.0026,0.00205,8.95e-05,0.00546,0.000111,2.49e-05,0,7.51e-05,2.85e-05,3.6e-05,0,0.0115,9.15e-05,6.65e-05,8.06e-05,0.000107,0.000194,0.000313,0.00146,0.00335,0.000327,0,0.0809,0.000172,0,0,0.000199,3.03e-05,2.43e-05,0.000793,0.00105,0,2.71e-05,6.39e-05,8.93e-05,0.000145,0.000301,0.000371,0.000163,0.000101,0.0711,0.00491,0.000254,4.59e-05,0,0.000151,3.91e-05,3.22e-05,7.24e-05,0,0,2.17e-05,5.62e-05,7.8e-05,0.000116,0.000139,8.45e-05,0,0.000112,0,0,2.56e-05,0,3.29e-05,7.09e-05,2.46e-05,2.39e-05,6.28e-05,0,0,3.22e-05,6.52e-05,7.65e-05,8.45e-05,8.38e-05,8.65e-05,7.86e-05,0.000107,0.000384,0,2.04e-05,2.67e-05,3.66e-05,3.86e-05,1.48e-05,2.48e-05,7.43e-05,0.00307,0.000149,0.000109,5.51e-05,6.32e-05,6e-05,5.88e-05,6.13e-05,8.22e-05,0.000121,6.55e-05,3.86e-05,3.32e-05,2.76e-05,2.76e-05,2.49e-05,1.24e-05,8.49e-06,2.73e-05,3.44e-05,3.84e-05,2.42e-05,1.84e-05,1.76e-05,1.74e-05,1.7e-05,1.77e-05,1.94e-05,2.1e-05,2e-05,1.95e-05,1.37e-05,1.22e-05,1.15e-05,1.19e-05,6.33e-06,1.68e-05],"winrateAvg":0.00511129,"leadAvg":-15.6486,"scoreMeanAvg":-17.4906,"scoreStdevAvg":15.4668,"shorttermWinlossErrorAvg":0.0107132,"shorttermScoreErrorAvg":1.91545,"ownership":[17,17,15,12,6,-3,-14,-23,-30,-32,-19,1,25,46,62,32,-17,-38,-54,18,16,17,13,9,-5,-14,-21,-31,-35,-34,-3,37,18,90,41,-13,-68,-63,17,19,23,24,24,1,-9,-12,-25,-60,60,42,74,70,90,-33,-64,-63,-69,16,16,32,76,24,7,-3,-8,-13,-3,17,65,63,90,90,89,88,-72,-67,12,13,26,26,14,5,0,-4,-5,1,24,79,80,-53,20,44,6,-72,-49,6,3,7,13,7,2,-1,-4,-4,1,10,16,-53,-52,7,9,-3,-33,-29,0,-1,1,1,2,0,-2,-4,-5,-3,-1,-4,-24,23,-7,58,-8,17,-12,-2,-3,-3,-2,-2,-3,-3,-4,-4,-5,-6,-11,-20,-40,-21,2,-24,-25,-19,-2,-2,-4,-4,-4,-4,-4,-4,-4,-5,-8,-19,-45,-92,-92,-46,-34,-42,-36,2,1,-2,-4,-5,-5,-4,-4,-4,-4,-10,5,-72,5,-49,-93,-69,-58,-57,9,6,-1,-5,-6,-5,-5,-4,-3,0,4,7,15,-8,7,-93,-93,-93,-38,20,18,5,-4,-8,-8,-7,-6,-3,1,13,26,79,45,79,78,-93,25,-18,35,34,9,-10,-12,-13,-11,-9,-6,1,10,17,40,39,35,71,77,27,31,47,69,-12,-33,-21,-19,-17,-15,-11,-10,6,25,69,-15,14,76,75,42,33,58,54,4,-87,-37,-27,-24,-23,-21,-17,-9,19,-21,-37,-10,11,-81,-34,1,61,66,76,-87,-46,-33,-32,-30,-28,-32,-75,-8,27,-95,-51,-90,-67,-59,-35,60,62,76,-87,-50,-39,-34,-35,-31,-37,-41,-30,-25,-94,-76,-71,-62,-58,-53,56,58,29,-8,-49,-34,-37,-35,-34,-36,-39,-36,-48,-68,-73,-69,-67,-61,-58,48,35,24,-6,-27,-34,-34,-33,-32,-33,-34,-37,-46,-58,-65,-67,-66,-64,-62],"ownershipAllowedMAE":0.0514539})%"); + lines.push_back(R"%({"sample":{"board":"............../.....OX....O../....OX...XXO../...O.X.X.XOO../..OO....OOX.../.XXOX.....X.O./.OOXX.O..X.O../.OX.........../..O........O../....X.OXX.XO../...X...O..XO../....XO.OX.XXX./.....O..XOOX../............../","hintLoc":"null","initialTurnNumber":40,"metadata":"848D876B130F4086439E5D973077F646:50","moveLocs":["G6","J4","K3","H6","J6","F6","E6","G7","J7","D2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.11,"xSize":14,"ySize":14},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":7.0,"policyOptimism":0.172,"pda":0.0,"policyMixture":[9.51e-06,9.97e-06,9.88e-06,9.89e-06,1.01e-05,9.72e-06,9.28e-06,9.38e-06,9.4e-06,9.69e-06,9.49e-06,9.41e-06,9.09e-06,9.35e-06,9.81e-06,9.48e-06,9.24e-06,9.47e-06,1.13e-05,0,0,8.77e-06,9.41e-06,9.46e-06,8.85e-06,0,8.89e-06,9.37e-06,9.3e-06,5e-05,1.33e-05,9.3e-06,0,0,9.02e-06,8.93e-06,8.62e-06,0,0,0,9.06e-06,9.2e-06,1.01e-05,0.000578,8.49e-06,0,9.6e-06,0,9.22e-06,0,9.17e-06,0,0,0,1.01e-05,8.74e-06,9.47e-06,0.0121,0,0,9.78e-06,9.8e-06,9.48e-06,1.03e-05,0,0,0,0.00417,0.00267,9.12e-06,9.36e-06,0,0,0,0,9.63e-06,1e-05,9.35e-06,9.23e-06,8.55e-06,0,0.000186,0,9.11e-06,1.01e-05,0,0,0,0,9.05e-06,0,8.87e-06,9.2e-06,0,8.46e-06,0,0.000124,9.08e-06,1.03e-05,0,0,8.69e-06,8.87e-06,9.51e-06,0,9.26e-06,0,8.61e-06,8.89e-06,9.16e-06,8.69e-06,8.79e-06,1.02e-05,1.07e-05,0,9.38e-06,0,0,0,0,0,8.37e-06,8.53e-06,0,9.17e-06,9.3e-06,9.75e-06,2.38e-05,1.38e-05,9.09e-06,0,1.78e-05,0,0,0,8.51e-06,0,0,9.12e-06,9.35e-06,1.01e-05,5.36e-05,8.86e-05,0,9.95e-06,0.00106,5.13e-05,0,0,9.12e-06,0,0,8.86e-06,9.25e-06,9.89e-06,0.000147,0.0795,0.0143,0,0,9.97e-06,0,0,0,0,0,0,9.65e-06,9.7e-06,2.8e-05,0.0887,0,0.795,0,1.07e-05,1.05e-05,0,0,0,0,8.81e-06,9.26e-06,8.63e-06,9.48e-06,1.01e-05,1.04e-05,8.88e-06,1.14e-05,1.99e-05,9.34e-06,9.3e-06,9.05e-06,8.96e-06,9.15e-06,9.01e-06,9.67e-06,1.02e-05],"winrateAvg":0.449446,"leadAvg":-1.83059,"scoreMeanAvg":-1.85271,"scoreStdevAvg":20.3422,"shorttermWinlossErrorAvg":0.400197,"shorttermScoreErrorAvg":6.3529,"ownership":[67,64,59,42,22,-15,-27,-36,-18,4,44,68,86,87,70,67,63,63,14,12,-62,-42,-38,-20,15,93,88,89,74,70,67,63,73,-67,-49,-37,-47,-62,-61,92,91,89,77,78,78,91,13,-66,-21,-61,-15,-62,93,92,90,87,79,78,91,90,9,2,-3,-17,6,5,-75,5,79,84,76,72,71,90,-87,-55,-40,-26,-34,-45,-76,-1,89,79,69,77,77,-89,-88,-37,2,-34,-48,-90,-2,86,79,67,47,77,-11,-15,-64,-37,-4,-51,-97,-53,7,55,62,49,28,43,65,-17,-89,-7,-18,-17,-97,-58,8,83,71,5,1,3,-9,-42,-90,-36,-13,-96,-97,-74,-99,84,37,-2,-19,-33,-43,-89,-69,-39,-21,-11,-11,-56,-100,85,31,-49,-24,-42,-59,-41,-82,-9,-19,-14,-99,-100,-100,-100,-99,-71,-20,-13,-13,4,-75,-8,-35,-50,-99,-92,-93,-100,-98,-97,-17,-14,-10,-9,-5,-19,-44,-61,-74,-92,-96,-98,-98,-97],"ownershipAllowedMAE":0.0653699,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".................../..OOXXXX..OXX.X..../..OX.OOXO.OOXX.O.../..OX...O..OXX..O.../..OX.OO..XXX.O...../..OXO..OOOOX..O.O../..XX.OOOXXXXXX...../....X.OXX..OO....../.....OXOX........../...O.OXOOX...O...../..O..XX.OX.O.OX..../.XXX....OO.OXXOO.O./..OX.X.O...O..XOO.O/.XXOOX.OXXXO..XXXO./...O..XOX.X...XOOX./.XXO.XOOX.O...X..X./.XOOOOXX.XO....X.../XO.XOXX.XOO......../..O.OOX............/","hintLoc":"null","initialTurnNumber":161,"metadata":"94C13F2DABC3D22F2FA30C54464567F1:171","moveLocs":["K4","M5","J3","J15","E17","K3","N5","N4","J3","J16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.32,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":-1.178,"policyMixture":[1.77e-05,1.83e-05,1.82e-05,2.01e-05,0.000396,0.000103,6.29e-05,7.1e-05,4.34e-05,4.29e-05,2.24e-05,2.18e-05,1.79e-05,1.88e-05,1.87e-05,2.09e-05,2.13e-05,2.07e-05,1.82e-05,1.86e-05,1.88e-05,0,0,0,0,0,0,0.0738,6.8e-05,0,0,0,1.71e-05,0,1.99e-05,2.19e-05,2e-05,1.94e-05,1.79e-05,1.88e-05,0,0,0,0,0,0,0,3.87e-05,0,0,0,0,1.79e-05,0,1.91e-05,1.94e-05,1.85e-05,1.92e-05,1.97e-05,0,0,0.0229,1.67e-05,2.83e-05,0,0,2.19e-05,0,0,0,1.84e-05,1.92e-05,0,1.93e-05,1.92e-05,1.84e-05,2.06e-05,2.17e-05,0,0,2.14e-05,0,0,0.0204,0,0,0,0,1.71e-05,0,1.86e-05,1.96e-05,1.88e-05,1.91e-05,1.77e-05,2.34e-05,3.07e-05,0,0,0,1.73e-05,1.57e-05,0,0,0,0,0,1.78e-05,1.76e-05,0,1.99e-05,0,1.93e-05,1.8e-05,2.28e-05,9.19e-05,0,0,0.000488,0,0,0,0,0,0,0,0,0,2.22e-05,2.02e-05,1.91e-05,1.91e-05,1.73e-05,2.36e-05,0.000389,5.25e-05,0.000147,0,0.27,0,0,0,1.76e-05,1.87e-05,0,0,2.04e-05,2.18e-05,2.02e-05,1.89e-05,1.87e-05,1.74e-05,2.48e-05,0.00112,0.00244,0.0076,4.72e-05,0,0,0,0,1.87e-05,1.94e-05,2e-05,1.92e-05,1.97e-05,2.07e-05,1.89e-05,1.85e-05,1.89e-05,1.73e-05,2.49e-05,0.000113,2.49e-05,0,2.45e-05,0,0,0,0,0,1.95e-05,1.95e-05,1.87e-05,0,2e-05,1.89e-05,1.86e-05,1.9e-05,1.7e-05,2.21e-05,2.58e-05,0,1.96e-05,0.0074,0,0,1.93e-05,0,0,1.87e-05,0,1.93e-05,0,0,1.91e-05,1.8e-05,1.87e-05,1.73e-05,1.99e-05,0,0,0,0.00534,0.0113,0.000829,1.95e-05,0,0,1.85e-05,0,0,0,0,0,1.73e-05,0,1.77e-05,1.95e-05,1.84e-05,0,0,0.00214,0,2.11e-05,0,2.07e-05,1.97e-05,2.02e-05,0,0.0003,1.85e-05,0,0,0,1.82e-05,0,1.85e-05,0,0,0,0,0,7.57e-05,0,0,0,0,0,0.00706,0.000127,0,0,0,0,1.9e-05,1.8e-05,0.00012,0.000292,0,2.92e-05,0.000123,0,0,0,1.67e-05,0,0,0,3.67e-05,0,0,0,0,2.07e-05,1.85e-05,0,0,0,6.52e-05,0,0,0,0,0,0,0.06,0,0.000981,0,1.77e-05,1.98e-05,0,1.94e-05,2.24e-05,0,0,0,0,0,0,0,0,0.454,0,1.8e-05,0.0375,0.00883,1.94e-05,0,2.13e-05,2.06e-05,1.84e-05,0,0,1.74e-05,0,0,0,0,2.02e-05,0,0,0,2.15e-05,5.71e-05,2.31e-05,2.98e-05,2.23e-05,1.97e-05,1.97e-05,1.82e-05,2.38e-05,1.82e-05,0,1.68e-05,0,0,0,3.12e-05,2.48e-05,1.92e-05,1.77e-05,1.92e-05,2.01e-05,1.88e-05,1.95e-05,1.92e-05,1.81e-05,1.84e-05,1.8e-05,1.9e-05],"winrateAvg":0.32325,"leadAvg":-4.46829,"scoreMeanAvg":-5.0886,"scoreStdevAvg":17.2129,"shorttermWinlossErrorAvg":0.434611,"shorttermScoreErrorAvg":6.92855,"ownership":[79,80,79,50,42,8,-34,-70,-79,-85,-92,-95,-97,-95,-80,-71,-14,4,23,77,80,81,82,-78,-79,-79,-80,-77,-82,-80,-100,-100,-97,-98,67,-15,14,35,76,79,81,-61,42,43,44,-79,-78,-89,-80,-81,-100,-100,-19,95,46,57,48,69,78,80,-62,-4,30,30,35,-99,-94,-81,-100,-100,-26,-5,95,70,73,65,50,68,82,-63,-1,49,50,-41,-100,-100,-100,-100,-22,89,75,86,83,84,78,28,19,82,-63,44,46,48,47,51,50,51,-100,-62,3,92,71,96,87,82,-7,-16,-62,-63,-8,47,46,48,-99,-100,-100,-100,-100,-99,-15,53,77,84,82,-29,-38,-37,-39,-55,-5,48,-99,-99,-80,-23,70,68,-56,-32,61,77,81,80,-42,-36,-36,-25,-23,-6,-91,95,-99,-79,-12,24,33,3,-6,54,74,80,81,-53,-50,-29,-9,-33,-9,-90,98,98,-82,3,27,53,95,38,49,72,82,83,-70,-48,-19,-66,-52,-90,-90,9,98,-80,17,98,51,95,32,65,75,87,89,-84,-100,-100,-100,-55,-55,-5,46,98,98,74,98,-13,-14,98,97,90,97,93,-95,-98,-98,-99,-13,-86,-1,98,60,14,19,98,50,-17,-99,98,98,95,96,-95,-99,-99,72,71,-86,14,98,-67,-70,-71,98,-4,-32,-99,-99,-99,94,19,-93,-88,26,71,-17,-68,-78,97,-68,-31,-74,-75,1,-63,-99,-96,-96,-97,-53,-88,-91,-92,71,39,-69,96,97,-56,66,63,-10,-85,-59,-99,-97,-97,-97,-92,-79,-92,72,71,71,72,52,50,43,45,63,3,-13,-27,-66,-99,-93,-91,-93,-77,63,62,67,73,55,52,50,48,62,62,28,-1,-30,-50,-83,-89,-90,-91,-1,38,69,70,72,73,53,53,53,53,47,31,5,-21,-48,-64,-81,-86,-89],"ownershipAllowedMAE":0.0726958})%"); + lines.push_back(R"%({"sample":{"board":"...........OXX.O.O./..O.....X..OX.XXOOO/..OXXX.X.XO.OXXOOX./...OOOOX.X.OOXXOXX./..X.........OOOXX../..O....XXO....OOX../...O...XOO..OX.X.../......XO....OX..X../......OO.....O...../...............O.X./.................../..O................/.O.XX....X........./.OX.X.X....X...OO../.XOXOXOXXOOX....X../..OX..OXO..OXX.X.../..OXX.OOOOOX......./..........X.X....../...........X......./","hintLoc":"null","initialTurnNumber":123,"metadata":"44C9B75112E8C8650A0EE258312D2FB4:133","moveLocs":["L7","L6","K6","J7","L4","P8","L8","H8","O7","P7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.51,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1button1","komi":4.5,"policyOptimism":0.0,"pda":2.731,"policyMixture":[4.2e-06,4.53e-06,5.27e-06,9.45e-05,0.00125,0.00124,6e-05,5.58e-05,1.32e-05,5.8e-05,6.39e-06,0,0,0,7.17e-06,0,1.03e-05,0,4.2e-06,4.83e-06,4.84e-06,0,0.00034,1.9e-05,2.43e-05,6.69e-05,7.5e-06,0,8.32e-06,5.76e-06,0,0,0,0,0,0,0,0,4.87e-06,5.47e-06,0,0,0,0,0.000278,0,5.02e-06,0,0,4.91e-06,0,0,0,0,0,0,8.18e-06,4.83e-06,5.56e-06,5.88e-06,0,0,0,0,0,6.29e-06,0,5.1e-06,0,0,0,0,0,0,0,6.68e-06,4.88e-06,5.75e-06,0,5.9e-06,4.69e-06,4.84e-06,6.15e-06,1.82e-05,0.00102,4.05e-05,5.04e-06,4.8e-06,0,0,0,0,0,5.08e-06,5.29e-06,4.91e-06,5.27e-06,0,5.48e-06,5.87e-06,6.08e-06,6.08e-06,0,0,0,4.87e-06,4.65e-06,4.52e-06,4.92e-06,0,0,0,6.5e-06,4.82e-06,4.54e-06,5.27e-06,4.95e-06,0,5.67e-06,6.33e-06,6.53e-06,0,0,0,4.71e-06,4.71e-06,0,0,1.03e-05,0,2.94e-05,0.0137,4.92e-06,4.51e-06,5.23e-06,5.23e-06,5.56e-06,5.99e-06,7.17e-06,0,0,4.63e-06,4.8e-06,4.88e-06,4.67e-06,0,0,6.26e-06,1.02e-05,0,2.07e-05,5.26e-06,4.63e-06,5.48e-06,5.62e-06,5.98e-06,5.73e-06,5.8e-06,0,0,4.88e-06,5.24e-06,5.31e-06,5.2e-06,5.64e-06,0,7.99e-06,1.48e-05,0.000393,0.000812,5.47e-06,4.59e-06,5.39e-06,6.06e-06,6.39e-06,6.07e-06,5.56e-06,5.06e-06,4.97e-06,5.6e-06,5.84e-06,5.96e-06,6.17e-06,6.83e-06,7.43e-06,7.34e-06,0,0.000171,0,6.41e-06,4.61e-06,5.17e-06,5.29e-06,6.34e-06,9.21e-06,5.95e-06,5.98e-06,5.69e-06,6.14e-06,6.45e-06,5.92e-06,6.71e-06,8.47e-06,2.97e-05,3.52e-05,0.00189,0.0976,0.00363,5.19e-06,4.43e-06,4.74e-06,0,5.72e-06,5.28e-06,5.9e-06,7.79e-06,0,1.78e-05,1.63e-05,0,5.82e-06,1.85e-05,6.64e-05,0,0.00336,0.000126,9.95e-06,5.18e-06,4.32e-06,0,5.63e-06,0,0,0.00017,0.0019,0.000536,0,0,0,1.42e-05,4.08e-05,0,0,6.28e-06,6.16e-06,9.51e-06,5.25e-06,4.27e-06,0,0,0,0,9.93e-05,0,0.000429,0.0207,0,0,0,0.00052,0.252,0.0753,0,0,1.01e-05,5.5e-06,5.33e-06,0,0,0,0,0,0,0,0,0,0,0,0.209,0.000598,0.000415,0.00702,0,0.00254,5.72e-06,5.03e-06,5.75e-06,0,0,7.37e-06,0.0324,0,0,0,3.81e-06,0,0,0,0,0.00101,0,0.000629,2.56e-05,5.89e-06,4.8e-06,5.58e-06,0,0,0,7.8e-06,0,0,0,0,0,0,0.000126,0.0089,4.21e-05,8.5e-05,0.000771,2.64e-05,5.35e-06,4.7e-06,7.07e-06,0.00849,0.000502,0.000283,0.233,1.89e-05,9.07e-06,8.67e-06,0.0153,0,0,0,7.2e-06,8.56e-06,7.27e-06,6.68e-06,6.85e-06,5.46e-06,4.28e-06,4.88e-06,7.43e-06,5.47e-06,5.9e-06,8.3e-06,2.19e-05,6.64e-05,5.62e-05,1.11e-05,5.57e-06,0,6.09e-06,5.52e-06,5.11e-06,4.86e-06,4.77e-06,5.26e-06,4.24e-06,8.77e-06],"winrateAvg":0.587963,"leadAvg":1.26439,"scoreMeanAvg":1.57612,"scoreStdevAvg":12.2954,"shorttermWinlossErrorAvg":0.248936,"shorttermScoreErrorAvg":2.15565,"ownership":[84,81,67,46,14,-15,-49,-80,-67,-9,49,97,-90,-89,-7,96,94,95,13,86,87,92,17,-26,-71,-80,-90,-94,-40,-4,97,-90,-4,-89,-89,96,95,95,87,88,93,-85,-86,-87,-14,-94,-90,-93,96,96,99,-90,-89,96,96,-97,39,85,85,87,95,95,95,95,-94,-74,-93,-24,99,99,-90,-90,96,-96,-96,-56,82,83,68,73,54,26,-8,-60,-23,34,11,59,99,99,99,-96,-96,-93,-87,79,79,95,64,27,5,-24,-88,-87,98,57,59,70,31,99,98,-96,-92,-90,70,77,72,95,27,-1,-12,-88,98,98,68,70,95,-62,12,-92,-92,-88,-90,61,58,42,41,12,20,-23,96,76,56,51,57,95,-61,-21,-39,-96,-91,-85,57,56,47,30,13,18,95,95,34,31,36,39,51,70,7,9,-22,-71,-76,59,57,46,24,-3,-3,20,17,1,19,25,23,20,15,19,58,-16,-85,-54,66,67,46,16,22,-4,1,-19,-5,6,19,12,3,-3,-5,3,4,-39,-37,77,82,93,7,-27,-20,-30,-91,-22,12,63,17,-5,-23,-79,-19,-29,-29,-25,83,95,10,-97,-97,-47,-42,-81,-91,-90,63,-1,-1,30,-78,-38,-22,-24,-24,81,95,-72,-74,-97,-89,-92,-81,31,90,-64,-63,-27,-10,-47,-1,0,-35,-31,77,64,68,-96,-86,-92,90,-86,-86,90,90,-65,-49,-52,-39,-31,-86,-56,-46,56,66,67,-97,-89,53,90,-88,91,91,90,90,-98,-98,-58,-92,-74,-69,-56,35,28,66,-97,-96,2,90,90,91,91,91,-94,-94,-85,-81,-78,-70,-68,-62,18,7,-19,-48,-34,48,71,78,61,22,-91,-91,-97,-87,-82,-76,-72,-66,-64,5,-11,-25,-34,-19,25,56,51,32,-8,-56,-94,-92,-88,-82,-76,-71,-68,-66],"ownershipAllowedMAE":0.0387082})%"); + lines.push_back(R"%({"sample":{"board":".....OXX.....X...../.....OX.XO..OXOOXXX/....XOXXOO.X.XXO.OX/...XXXOO.....OXOOOO/.....O...OXXXOOXOX./..X....O..XOOXXXOX./.........XO.....X../......O............/.................../...............X.../....O............../.................../.X.OO.X..O.X.O..O../.XO.XOX.O......OXX./..XO.........X..OO./..XO...XOO..XO.O.../..XO...XXO.OXO.OX../.XO.O..X.XOX.XO..../..X.....X.O.X....../","hintLoc":"null","initialTurnNumber":42,"metadata":"0C21D05B51EE61DECA4AE7C1CEFA4613:52","moveLocs":["G9","J9","F5","E5","F10","E10","F11","H5","G5","F3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":34.5,"policyOptimism":0.741,"pda":-2.066,"policyMixture":[2.33e-05,2.43e-05,2.37e-05,2.46e-05,3.08e-05,0,0,0,1.92e-05,2.74e-05,2.84e-05,2.78e-05,2.8e-05,0,2.94e-05,3.06e-05,2.61e-05,2.75e-05,1.97e-05,2.45e-05,2.47e-05,2.45e-05,2.48e-05,3.39e-05,0,0,1.71e-05,0,0,2.93e-05,3.1e-05,0,0,0,0,0,0,0,2.41e-05,2.56e-05,2.52e-05,2.44e-05,0,0,0,0,0,0,3.12e-05,0,2.62e-05,0,0,0,2.11e-05,0,0,2.54e-05,2.78e-05,2.73e-05,0,0,0,0,0,3.58e-05,3.75e-05,2.83e-05,2.55e-05,3.34e-05,0,0,0,0,0,0,2.59e-05,2.97e-05,2.86e-05,2.87e-05,3.69e-05,0,0.000335,3.64e-05,0.000474,0,0,0,0,0,0,0,0,0,1.94e-05,2.72e-05,3.33e-05,0,3.56e-05,6.36e-05,0.000466,6.32e-05,0,9.9e-05,0.00021,0,0,0,0,0,0,0,0,2.27e-05,2.78e-05,3.77e-05,3.94e-05,5.1e-05,0.000576,0.000586,0.00049,0.000129,0.000177,0,0,4.28e-05,3.46e-05,3.07e-05,2.81e-05,3.03e-05,0,3.14e-05,2.82e-05,2.85e-05,4.19e-05,5.22e-05,0.000443,0.000375,0.0387,0,0.000326,0.00723,0.000139,0.000242,3.96e-05,3.68e-05,3.38e-05,3.24e-05,3.57e-05,3.2e-05,4.31e-05,2.62e-05,2.88e-05,4.46e-05,0.000129,0.000139,0.085,0,4e-05,0.000646,0.0018,0.000279,0.000157,4.99e-05,4.25e-05,3.85e-05,3.49e-05,3.17e-05,3.32e-05,3.17e-05,2.66e-05,2.86e-05,4.25e-05,0.00028,3.71e-05,0,0,2.73e-05,0.00013,0.000907,0.000445,0.00035,0.000208,8.53e-05,4.5e-05,3.65e-05,0,3.52e-05,3.58e-05,2.76e-05,2.85e-05,4.39e-05,0.000222,3.54e-05,0,3.72e-05,0,0.00023,0,0.000255,0.00563,0.0207,0.000245,7.55e-05,4.42e-05,3.76e-05,4.29e-05,3.88e-05,2.81e-05,2.79e-05,3.28e-05,4.74e-05,0.000113,3.74e-05,6.54e-05,3.52e-05,8.28e-05,0.000431,7.92e-05,0.000649,0.000266,0.00349,0.0134,6.09e-05,0.000263,8.97e-05,3.75e-05,2.68e-05,2.51e-05,0,0.000115,0,0,0.000299,0,4.05e-05,0.000178,0,0.000146,0,0.0882,0,0.00858,0.000302,0,4.27e-05,2.67e-05,2.46e-05,0,0,1.75e-05,0,0,0,0.387,0,3.79e-05,5.73e-05,4.69e-05,4.72e-05,3.9e-05,0.000107,0,0,0,2.68e-05,2.57e-05,2.58e-05,0,0,0,0,0,0,4.79e-05,9.41e-05,5.1e-05,3.46e-05,3.13e-05,0,0.000252,4.19e-05,0,0,2.63e-05,2.65e-05,2.79e-05,0,0,2.87e-05,0.294,4.33e-05,0,0,0,5.26e-05,0.0238,0,0,0.000704,0,2.79e-05,2.71e-05,2.58e-05,2.59e-05,2.6e-05,0,0,3.19e-05,0,4.93e-05,0,0,0,7.22e-05,0,0,0,0.000442,0,0,2.51e-05,2.47e-05,2.49e-05,0,0,0.000241,0,6.32e-05,0.0015,0,2.17e-05,0,0,0,2.38e-05,0,0,0.000217,3.23e-05,3.02e-05,2.51e-05,2.33e-05,2.7e-05,0,2.86e-05,3.43e-05,9.63e-05,0.000187,2.41e-05,0,3.39e-05,0,3.14e-05,0,2.43e-05,0.000476,2.69e-05,2.81e-05,2.44e-05,2.38e-05,2.01e-05],"winrateAvg":0.905646,"leadAvg":7.87346,"scoreMeanAvg":8.97083,"scoreStdevAvg":15.19,"shorttermWinlossErrorAvg":0.097385,"shorttermScoreErrorAvg":1.85922,"ownership":[-78,-81,-84,-87,-91,-88,-88,-87,26,53,44,5,-45,-98,-83,-67,-65,-68,-67,-77,-79,-82,-86,-95,-88,-88,-46,-42,72,19,-4,9,-98,-63,-59,-72,-71,-72,-73,-78,-82,-90,-98,-87,-88,-88,71,72,-34,-95,-64,-98,-98,-59,-63,-59,-73,-67,-73,-77,-98,-98,-98,73,74,64,22,-8,-73,-95,-94,-98,-59,-60,-61,-61,-58,-66,-62,-50,-26,45,41,57,41,55,-98,-99,-99,-94,-94,-98,-61,-83,-72,-44,-55,-82,-24,-17,-9,33,75,23,-10,-98,-9,-8,-98,-98,-98,-61,-84,-73,-26,-30,-18,-10,-26,-7,11,23,-6,-68,-5,-30,-30,-26,-47,-54,-91,-81,-70,-9,-10,-2,3,-24,-46,54,12,4,-8,-21,-12,-16,-19,-30,-42,-36,-61,-59,1,1,9,26,-31,-83,-8,-3,8,4,3,-4,-8,-10,-18,-26,-28,-33,-40,0,4,21,34,82,-82,-41,0,10,13,10,4,-1,-4,-6,-66,-24,-19,-19,-15,-13,9,42,84,-4,-80,-20,76,31,11,10,6,11,9,-8,-4,0,3,-42,-33,1,37,53,11,-37,-6,30,46,23,21,26,17,20,6,11,24,29,-63,-92,-28,88,88,4,-71,-22,35,92,39,-4,23,79,34,39,80,59,54,-86,-92,74,77,18,30,-70,-56,93,72,44,38,42,57,62,95,57,55,74,-89,-91,-91,87,87,-71,-71,74,77,66,52,44,39,30,56,85,98,98,81,-89,-90,-91,87,21,-58,-36,-48,94,94,60,32,24,94,72,98,94,91,91,-87,-87,-91,87,70,76,21,-47,-48,94,87,89,23,94,91,98,88,92,91,-82,-86,1,3,82,38,7,-47,-19,-20,90,26,25,26,96,91,91,90,90,-77,-62,-60,21,39,33,1,-23,-38,35,91,59,24,55,71,90,90,90,90],"ownershipAllowedMAE":0.0342196})%"); + lines.push_back(R"%({"sample":{"board":"............/...OX..X..../.OXX.XX.XX../..OOXXOXOX../.OOXXO.O.OO./OXXXO.O..X../O...OOXX..../..OX...OX.../OO.OOXXOX.../XOOOXXOXXXX./XXXXOOOXXOX./.X.XXO.OOOO./OOX.XOO.XO../OXXX.O..XO../XOXOO...XOOO/.OO.....XOXX/....O.O.XX.X/.......OOXX./.........OXX/","hintLoc":"null","initialTurnNumber":139,"metadata":"3726E170F07BB1D9BD0D1374BA8EF6D1:149","moveLocs":["J15","G15","H14","F14","J13","G12","F15","E12","D13","F14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.03,"xSize":12,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":6.0,"policyOptimism":0.045,"pda":0.0,"policyMixture":[3.05e-05,2.92e-05,3.09e-05,2.98e-05,2.99e-05,2.95e-05,2.92e-05,2.85e-05,2.95e-05,2.99e-05,3.11e-05,2.96e-05,2.91e-05,2.74e-05,5.68e-05,0,0,2.93e-05,2.79e-05,0,2.77e-05,3e-05,3.13e-05,3.18e-05,2.88e-05,0,0,0,0,0,0,0,0,0,0.000289,3.2e-05,2.8e-05,2.44e-05,0,0,0,0,0,0,0,0,0.0163,3.4e-05,2.55e-05,0,0,0,0,0,0,0,0,0,0,3.26e-05,0,0,0,0,0,0,0,0,0.000166,0,0.00363,0.00013,0,2.84e-05,3.55e-05,0,0,0,0,0,0,0.553,0.0881,0.000101,2.79e-05,2.86e-05,0,0,0,0.00081,0,0.00241,0,0.0365,0.294,0.00015,0,0,2.58e-05,0,0,0,0,0.00184,0,2.97e-05,0.000197,3.6e-05,0,0,0,0,0,0,0,0,0,0,0,3.44e-05,0,0,0,0,0,0,0,0,0,0,0,3.99e-05,0,0,0,0,0,0,2.68e-05,0,0,0,0,3.06e-05,0,0,0,0,0,0,0,2.81e-05,0,0,2.87e-05,2.96e-05,0,0,0,0,2.87e-05,0,2.91e-05,2.8e-05,0,0,2.84e-05,2.94e-05,0,0,0,0,0,2.93e-05,2.87e-05,2.76e-05,0,0,0,0,3.09e-05,0,0,2.67e-05,2.9e-05,2.81e-05,2.92e-05,2.77e-05,0,0,0,0,2.9e-05,2.67e-05,2.73e-05,2.72e-05,0,2.83e-05,0,2.7e-05,0,0,0,0,2.87e-05,2.68e-05,2.62e-05,2.74e-05,2.83e-05,2.72e-05,2.68e-05,0,0,0,0,0,2.87e-05,2.85e-05,2.78e-05,2.81e-05,2.91e-05,2.86e-05,2.94e-05,2.87e-05,2.89e-05,0,0,0,2.85e-05],"winrateAvg":0.43536,"leadAvg":-1.24054,"scoreMeanAvg":-0.709367,"scoreStdevAvg":7.5585,"shorttermWinlossErrorAvg":0.499104,"shorttermScoreErrorAvg":3.46325,"ownership":[-6,-30,-49,-74,-84,-96,-98,-97,-96,-91,-82,-67,20,-19,-49,-55,-98,-97,-98,-100,-96,-90,-77,-44,52,69,-79,-91,-92,-100,-100,-71,-99,-99,-64,-20,67,68,83,79,-100,-100,-24,-69,81,-99,6,12,83,85,83,-100,-100,52,-29,81,80,80,81,38,91,-99,-99,-100,91,56,83,82,35,-17,28,28,93,-58,77,91,89,91,-98,-97,29,8,-19,-11,90,71,96,-76,-81,-80,-98,-95,-98,-48,-62,-53,96,97,93,96,96,-97,-98,-95,-99,-84,-82,-79,-100,96,96,96,-96,-97,100,-98,-98,-98,-98,-79,-100,-100,-100,-100,100,100,100,-98,-98,100,-97,-8,-91,-100,-100,-100,-100,100,100,100,100,100,100,15,-15,-19,-100,-100,-100,100,100,30,-99,100,97,94,-2,-100,-100,-100,1,100,39,-30,-99,100,98,97,-4,99,-100,100,100,39,-22,-42,-100,100,100,99,54,99,99,97,84,64,5,-39,-100,100,-100,-100,87,92,95,97,99,87,99,-35,-100,-100,-100,-100,91,93,95,97,97,96,95,97,97,-100,-100,-100,92,94,95,96,97,96,93,60,-23,-18,-100,-100],"ownershipAllowedMAE":0.0579311})%"); + lines.push_back(R"%({"sample":{"board":"......O.......O..../.....O.OXOO.OOXOOX./......OXOOXXXXXOX../OOOO.O.X.XOO...OXX./OXXOXO.X.XXXXX.OX.X/X.XXXO.OO....O.OOX./OX...X.O.OXXO.OXXO./..OOXX..OX..OXXOXX./..OX.XO...X.O.XOOX./...OXOOOOX.OO..OOX./..OXX.X...X.XO.OXX./....XX..O.X.XOXOOX./XXXXOOXO.OXOOXOX.../OOOOX.X.X.O.OX.XX../.X.OXX...X.OX.XOXO./.OXXOXX.OXOXX.XOO.O/.OOOOXO.OOX..XXO.O./.....O.O..X....XO../......O............/","hintLoc":"null","initialTurnNumber":169,"metadata":"E4F4908C76B379988922275140C05D5E:179","moveLocs":["M18","M19","K6","B14","H19","J19","A14","J16","J15","B14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":3.16,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":2.0,"policyOptimism":0.25,"pda":0.0,"policyMixture":[5.11e-06,5.16e-06,4.93e-06,4.99e-06,5.13e-06,5.08e-06,0,0,0,6.11e-06,0.319,0,0.0564,0.249,0,0.0364,0.000899,9.36e-06,5.84e-06,5.33e-06,5.09e-06,4.97e-06,5.15e-06,5.1e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,5.3e-06,5.3e-06,4.83e-06,5.08e-06,5.31e-06,7.64e-06,5.27e-06,0,0,0,0,0,0,0,0,0,0,0,5.31e-06,5.87e-06,0,0,0,0,0.000222,0,5.86e-06,0,0,0,0,0,6.39e-06,5.23e-06,7.71e-05,0,0,0,5.35e-06,0,0,0,0,0,0,3.11e-05,0,0,0,0,0,0,0,0.0372,0,0,5.29e-06,0,0,0,0,0,0,0,0.024,0,0,0.00377,5.8e-06,5.78e-06,0.00238,0,0.0137,0,0,0,5.07e-06,0,0,2.2e-05,5.42e-06,7.63e-06,0,4.42e-05,0,0,0,0,0,0,0.000256,0,0,0,0,5.12e-06,5.02e-05,0.00334,0,0,0,0,0.000253,1.58e-05,0,0,6.55e-06,6.36e-06,0,0,0,0,0,0,5.19e-06,6.43e-06,2.39e-05,0,0,0.00322,0,0,5.42e-06,0.000347,4.74e-05,0,5.9e-06,0,1.11e-05,0,0,0,0,5.28e-06,6.4e-06,9.07e-06,0.0118,0,0,0,0,0,0,0,4.73e-05,0,0,0.0589,0.000324,0,0,0,5.45e-06,6.36e-06,6.25e-06,0,0,0,5.75e-06,0,3.62e-05,1.63e-05,1.1e-05,0,9.34e-06,0,0,1.63e-05,0,0,0,5.71e-06,5.48e-06,5.13e-06,5.44e-06,5e-06,0,0,6.23e-06,1.88e-05,0,9.08e-06,0,2.05e-05,0,0,0,0,0,0,5.97e-06,0,0,0,0,0,0,0,0,3.25e-05,0,0,0,0,0,0,0,0.011,6.14e-06,5.97e-06,0,0,0,0,0,5.93e-06,0,6.4e-05,0,0,0,0,0,0,0.166,0,0,5.57e-06,5.54e-06,0.000106,0,4.72e-05,0,0,0,5.63e-06,9.38e-06,1.19e-05,0,8.45e-06,0,0,5.33e-06,0,0,0,0,5.23e-06,4.99e-06,0,0,0,0,0,0,7.51e-06,0,0,0,0,0,5.37e-06,0,0,0,0,0,5.05e-06,0,0,0,0,0,0,5.44e-06,0,0,0,5.4e-06,5.34e-06,0,0,0,0,0,5.06e-06,4.98e-06,5.23e-06,5.13e-06,5.21e-06,5e-06,0,0,0,4.73e-06,5.21e-06,0,5.36e-06,5.38e-06,5.33e-06,5.73e-06,0,0,2.93e-05,5.06e-06,5.21e-06,5.23e-06,5.1e-06,5.12e-06,5.35e-06,5.25e-06,0,4.97e-06,5.45e-06,5.63e-06,5.56e-06,5.43e-06,5.33e-06,5.99e-06,5.69e-06,4.77e-06,0.000524,5.52e-06,4.89e-06,8.06e-06],"winrateAvg":0.300841,"leadAvg":-0.350263,"scoreMeanAvg":-1.01165,"scoreStdevAvg":7.46902,"shorttermWinlossErrorAvg":0.337724,"shorttermScoreErrorAvg":2.10268,"ownership":[96,96,96,96,98,99,100,100,100,97,84,84,76,75,85,83,34,7,-45,97,97,97,97,96,100,100,100,100,99,99,-99,79,80,-97,95,95,-87,-54,97,97,96,95,95,96,99,-98,100,100,-98,-98,-98,-98,-98,95,-92,-87,-81,97,98,98,98,-24,99,2,-98,98,-99,-97,-97,-97,-54,8,95,-91,-91,-87,98,-89,-89,98,-88,99,-19,-98,-99,-99,-99,-99,-99,-99,-36,96,-92,-86,-90,-40,-46,-88,-88,-88,98,22,82,83,-7,-48,-59,9,96,90,97,96,-88,-88,-47,-75,-72,-78,-86,-89,41,82,48,53,-98,-98,96,91,95,-99,-99,-89,-92,-61,-70,-64,-68,-89,-89,2,67,78,-78,-65,7,95,83,83,87,-99,-99,-95,-70,-69,-66,-83,-82,-89,83,73,37,-36,-91,30,95,89,81,85,86,-99,-97,-77,-76,-79,-79,-99,84,83,83,83,-88,17,94,94,80,82,84,86,-99,-98,-85,-81,-75,-99,-99,-32,-89,27,41,-41,-98,58,-93,81,37,84,-99,-100,-94,-92,-86,-87,-95,-99,-99,-54,23,77,-26,-98,-93,-94,78,-54,85,84,-100,-68,-99,-99,-99,-99,-97,-98,-99,67,12,40,-99,-92,-92,-99,-56,-99,-51,-41,-36,94,94,94,94,-99,-98,-99,36,-96,-96,-90,-94,-92,-100,-97,-100,-99,-3,13,93,93,95,95,-99,-99,-49,1,34,-97,-96,-92,-100,-99,-100,98,-99,97,66,96,100,94,95,100,-99,-98,-21,98,-97,-96,-100,-100,-100,-100,97,98,97,98,99,100,100,100,100,-99,92,56,98,98,-99,-96,-95,-100,-100,98,98,98,98,99,99,100,100,99,99,92,99,65,24,-99,-87,-86,-61,26,27,98,97,97,99,99,99,99,99,99,99,86,50,-22,-48,-83,-80,-54,-17,59,76,96,97],"ownershipAllowedMAE":0.0415269})%"); + lines.push_back(R"%({"sample":{"board":".................../...............O.../.....O.....X.O..X../...O....XO.....X.../....O..XO.XX.O...../..X....XO..OXO..X../...XOO.XO...XO.OX../.OXOXX.XO...X..O.../..OOX.XOX.......X../.X.OX..OX..X...OX../..OOXO....OX...OX../.OXXOOOO.O.OO..O.O./..XOOOXX..OX....O.O/.XXXXXOXXXX.X..XXO./XOO..OOXO..X...XOX./.XOO.OXO.O.....XO../..XO.OX.OO.....XOX./.XXO............X../..X................/","hintLoc":"null","initialTurnNumber":137,"metadata":"37C53A1FDA414AAC35484EF8A4CE4D61:147","moveLocs":["J9","K12","K15","J17","K17","K18","L18","J18","L17","M18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.96,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.62e-06,4.2e-06,4.07e-06,4.04e-06,4.08e-06,4.02e-06,4.08e-06,4.12e-06,4.32e-06,0.001,0.00874,0.6,2.84e-05,5.03e-06,4.23e-06,3.95e-06,3.95e-06,4.15e-06,3.92e-06,4.2e-06,4.24e-06,4.21e-06,4.2e-06,3.99e-06,4.21e-06,5.93e-06,5.44e-06,0,0,0,0,1.34e-05,4.38e-06,4.18e-06,0,4.35e-06,4.23e-06,4.34e-06,4.32e-06,4.4e-06,4.27e-06,4.36e-06,3.94e-06,0,5.06e-06,1.3e-05,0,0,0,0,5.46e-06,0,4.18e-06,4.14e-06,0,5.65e-06,4.31e-06,4.39e-06,4.76e-06,4.49e-06,0,4.02e-06,4.03e-06,9.09e-06,0.000224,0,0,4e-06,0.172,1.25e-05,4.43e-06,4.02e-06,0,5.08e-06,8.26e-06,4.17e-06,4.42e-06,4.52e-06,4.58e-06,4.17e-06,0,3.75e-06,4.6e-06,0,0,0,0,0,0.0223,0,3.83e-06,0.000769,0.00011,6.07e-06,4.16e-06,4.5e-06,4.59e-06,0,5.02e-06,4.12e-06,3.6e-06,3.73e-06,0,0,4.21e-06,0.0293,0,0,0,3.65e-06,4.09e-06,0,1.72e-05,4.06e-06,4.45e-06,4.59e-06,7.52e-06,0,0,0,0.000149,0,0,0.0581,0.0159,5.68e-06,0,0,3.77e-06,0,0,1.61e-05,4.43e-06,4.24e-06,0,0,0,0,0,4.91e-05,0,0,0,0.0579,1.38e-05,0,4.48e-06,3.85e-06,0,7.17e-05,1.63e-05,4.39e-06,4.27e-06,4.37e-06,0,0,0,4.22e-06,0,0,0,0.00029,0.0297,5.59e-05,1.88e-05,4.49e-06,4.06e-06,4.37e-06,0,4.84e-06,4.53e-06,4.22e-06,0,3.71e-06,0,0,4.11e-06,4.33e-06,0,0,9.17e-05,0.000478,0,6.35e-06,5.47e-06,4.35e-06,0,0,4.21e-06,4.31e-06,4.43e-06,3.39e-05,0,0,0,0,3.75e-06,3.71e-06,0,5.3e-06,0,0,6.88e-06,4.56e-06,4.03e-06,0,0,4.11e-06,4.11e-06,4.23e-06,0,0,0,0,0,0,0,4.19e-06,0,4.04e-06,0,0,4.3e-06,4.05e-06,0,3.77e-06,0,4.03e-06,0.000625,3.34e-06,0,0,0,0,0,0,3.48e-06,3.99e-06,0,0,4.01e-06,4.3e-06,4.28e-06,3.94e-06,0,3.69e-06,0,0.000163,0,0,0,0,0,0,0,0,0,0,0,0,4.21e-06,4.08e-06,0,0,0,4.15e-06,0,0,0,3.81e-06,3.94e-06,0,0,0,0,3.72e-06,3.86e-06,0,3.9e-06,4.3e-06,3.89e-06,0,0,0,5.46e-06,0.000384,0,0,0,3.86e-06,0,0,0,3.78e-06,0,4.05e-06,4.11e-06,4.25e-06,4.24e-06,3.85e-06,0,0,8e-06,4.56e-06,0.000791,0.000317,0,0,4.32e-06,0,0,4.43e-06,0,0,4e-06,4.58e-06,4.37e-06,4.4e-06,3.94e-06,0,0,0,3.95e-06,4.12e-06,0,0,0,4.3e-06,4.49e-06,4.47e-06,4.42e-06,4.25e-06,4.11e-06,4.19e-06,4.32e-06,4.52e-06,4.4e-06,4.21e-06,4.04e-06,0,3.86e-06,3.82e-06,4.26e-06,3.6e-06,0,4.44e-06,4.4e-06,4.25e-06,4.39e-06,4.26e-06,4.19e-06,4.08e-06,4.02e-06,4e-06,3.87e-06,3.87e-06,3.94e-06,3.92e-06,3.95e-06,3.82e-06,3.76e-06,5.82e-06],"winrateAvg":0.657355,"leadAvg":3.03054,"scoreMeanAvg":4.34126,"scoreStdevAvg":18.6146,"shorttermWinlossErrorAvg":0.346475,"shorttermScoreErrorAvg":5.21511,"ownership":[39,41,43,44,42,27,5,-16,-25,-1,58,59,24,36,35,25,8,-11,-32,38,39,45,49,49,45,11,-17,-50,-49,78,-1,21,35,29,47,-7,-39,-49,35,38,47,57,55,77,18,-15,-50,81,79,-7,31,65,13,-5,-79,-61,-58,34,34,49,86,59,30,1,-41,-52,80,15,21,7,26,2,-76,-65,-69,-66,32,30,42,55,83,24,-7,-66,81,82,-32,-33,30,75,11,-11,-60,-74,-71,29,26,4,33,53,30,-12,-68,81,48,16,21,-44,75,20,-13,-84,-76,-73,33,23,29,11,70,67,1,-68,81,43,27,-13,-46,74,46,70,-83,-72,-69,32,52,28,52,-70,-70,-67,-70,78,-16,20,-12,-49,7,32,71,35,-68,-57,24,32,54,52,-70,-43,-68,56,-23,-8,-4,-14,-12,2,28,-5,-69,-60,-32,9,-10,30,52,-71,-8,-39,57,-27,-1,-10,-44,-7,-5,28,81,-67,-39,-8,-4,-2,52,54,-73,67,42,51,66,35,65,-40,27,7,35,81,-67,7,27,-18,-2,-85,-85,66,65,68,66,34,70,60,73,73,40,22,81,39,72,55,-36,-46,-84,67,65,65,-88,-88,-31,-44,62,-68,10,-2,-8,-5,73,65,70,-79,-84,-84,-84,-84,-85,78,-89,-89,-90,-90,-68,-90,-34,-43,-100,-99,67,13,-83,74,74,5,-19,75,77,-91,59,-18,-43,-92,-64,-55,-62,-100,-93,-93,-64,-81,-82,75,75,37,75,65,76,56,82,9,-18,-36,-46,-63,-100,-94,-93,-89,-82,-81,-82,74,61,76,65,70,83,82,27,-20,-29,-45,-65,-100,-94,-97,-94,-82,-83,-82,75,54,70,67,72,72,60,16,-2,-26,-47,-64,-83,-99,-95,-96,-82,-83,-83,-35,26,49,64,68,61,43,23,-3,-26,-48,-65,-83,-93,-96,-96],"ownershipAllowedMAE":0.0486622})%"); + lines.push_back(R"%({"sample":{"board":".......XOOO...OXXX./.O..XXXXXOXO.OOOXX./.....XOOOO.O.OOX.../...X.XXXO...O.OX.../.....XOO...OOOOOX../..X.XOO...OXXOXXX../....XXO...OOXOX..../.XXXOO..O.OXXOOX.../X.XO.O.....OXOX.X../XXOOO.....OOXX...../OXO....O..OX......./OO.......OOXX..X.../..OO...OOOOX.X...../.O.OOOOXXOXX......./.O.OXOXXXX........./..OXXOOX........X../..OX.XXXX....X...../.OXX....OO..X....../.OOX.............../","hintLoc":"null","initialTurnNumber":18,"metadata":"6B4CC620691D83E65217847CF319AF70:28","moveLocs":["Q11","L17","B17","pass","A18","pass","C18","pass","B19","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.17,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":81.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00229,0,0.00274,0.000262,0.000256,0.000259,0.000253,0,0,0,0,0.000258,0.000244,0.000254,0,0,0,0,7.93e-05,0,0.00346,0,0.00324,0,0,0,0,0,0,0,0,0.000246,0,0,0,0,0,0.000266,0.00262,0,0.00335,0.000269,0.000242,0,0,0,0,0,0,0,0.000251,0,0,0,0.00371,0.000253,0.000267,0.000271,0.000254,0.000262,0,0.00274,0,0,0,0,0.000242,0.000243,0.000246,0,0,0,0,0.00372,0.000253,0.000255,0.000272,0.000262,0.000258,0.000258,0.00297,0,0,0,0.000258,0.00024,0.000246,0,0,0,0,0,0,0.000242,0.000259,0.000272,0.000265,0,0.00289,0,0,0,0.000241,0.000253,0.000244,0,0,0,0,0,0,0,0.000248,0.00027,0.000267,0.000245,0.00268,0.00279,0,0,0,0.000274,0.00025,0.000249,0,0,0,0,0,0.00278,0.000255,0.000259,0.000273,0.0029,0,0,0,0,0,0.00029,0.000248,0,0.00025,0,0,0,0,0,0,0.000254,0.000261,0.000275,0,0.00259,0,0,0,0,0.000247,0.000258,0.000247,0.000253,0.000244,0,0,0,0,0,0,0.000255,0.00028,0,0,0,0,0,0.000255,0.000257,0.000253,0.000255,0.000243,0,0,0,0,0.00298,0.000243,0.000243,0.000264,0.000274,0,0,0,0.000245,0.000245,0.000257,0.00025,0,0.000249,0.000245,0,0,0.00273,0.000263,0.000245,0.000246,0.000254,0.000261,0.000279,0,0,0.000271,0.000249,0.000252,0.000248,0.000252,0.000249,0.000245,0,0,0,0,0.00282,0.000248,0,0.00025,0.000265,0.000279,0.000252,0.000267,0,0,0.000249,0.000248,0.000247,0,0,0,0,0,0.00264,0,0.000249,0.00025,0.000255,0.000261,0.000278,0.000256,0,0.000252,0,0,0,0,0,0,0,0,0,0.000245,0.000253,0.000255,0.000256,0.000255,0.000258,0.000277,0.000285,0,0.00093,0,0,0,0,0,0,0,0.00282,0.00025,0.00025,0.000261,0.000258,0.000252,0.000254,0.000258,0.000265,0.0331,0.0463,0,0,0,0,0,0,0.000245,0.000244,0.000253,0.000254,0.000254,0.000255,0.000254,0.000263,0,0.000343,0.000268,0.0408,0.212,0,0,0.00302,0,0,0,0,0.00306,0.000253,0.000256,0.00266,0,0.000244,0.000249,0.000306,0.00028,0.00026,0.039,0,0,0,0.000282,0.000252,0.00025,0.00305,0,0,0.00301,0.000248,0,0.00261,0.000255,0.000257,0.000262,0.000272,0.000283,0.0616,0,0,0,0.000257,0.00027,0.000271,0.000263,0.00219,0.00226,0.000265,0.000265,0.000262,0.000268,0.000268,0.000275,0.000273,0.000287,0.000318,0.442],"winrateAvg":0.994004,"leadAvg":0.740768,"scoreMeanAvg":0.706168,"scoreStdevAvg":1.05454,"shorttermWinlossErrorAvg":0.0590905,"shorttermScoreErrorAvg":0.456967,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.00124318})%"); + lines.push_back(R"%({"sample":{"board":"............/..........O./........OOX./...X..OOXX../.....X.X..../.....O..X.../....X.....X./...OXOOOXXO./..XO.XOXOOO./..XO.XXXO.../..O....XO.../............/","hintLoc":"null","initialTurnNumber":40,"metadata":"C4CBC865B90409E970AC8C0D4FEFAA6C:50","moveLocs":["G11","C5","H10","F10","F11","D10","C9","E11","J11","E7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.86,"xSize":12,"ySize":12},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.56e-05,1.66e-05,1.65e-05,1.65e-05,1.62e-05,1.42e-05,1.27e-05,1.35e-05,1.39e-05,1.63e-05,1.58e-05,1.54e-05,1.64e-05,1.78e-05,1.76e-05,1.59e-05,0,0,0,1.38e-05,0,1.77e-05,0,1.55e-05,1.65e-05,2.02e-05,3.49e-05,0,1.3e-05,0,1.62e-05,0,0,0,0,1.48e-05,1.71e-05,1.78e-05,0,0,0.000921,2.08e-05,0,0,0,0,1.52e-05,1.62e-05,1.66e-05,1.85e-05,1.59e-05,1.57e-05,1.98e-05,0,0.00117,0,1.51e-05,1.48e-05,1.62e-05,1.61e-05,1.65e-05,1.91e-05,5.38e-05,0.112,0,0,0.0438,1.56e-05,0,1.56e-05,1.48e-05,1.64e-05,1.62e-05,3.02e-05,1.55e-05,0.667,0,0.164,4.82e-05,1.75e-05,1.55e-05,1.41e-05,0,1.61e-05,1.62e-05,4.18e-05,0,0,0,0,0,0,0,0,0,1.68e-05,1.67e-05,1.47e-05,0,0,9.24e-05,0,0,0,0,0,0,1.5e-05,1.61e-05,1.45e-05,0,0,1.45e-05,0,0,0,0,1.3e-05,1.68e-05,1.61e-05,1.57e-05,0.000938,0,0.000394,2.98e-05,1.54e-05,1.43e-05,0,0,0.000783,2.15e-05,1.66e-05,1.48e-05,1.54e-05,1.98e-05,1.68e-05,1.61e-05,1.64e-05,1.56e-05,2.96e-05,0.00718,7.34e-05,0.000107,1.52e-05,1.15e-05],"winrateAvg":0.491395,"leadAvg":0.268929,"scoreMeanAvg":-0.105981,"scoreStdevAvg":9.0217,"shorttermWinlossErrorAvg":0.378713,"shorttermScoreErrorAvg":2.49668,"ownership":[16,24,33,44,38,27,-3,-31,-40,-45,-49,-53,10,17,33,44,64,-57,-57,-54,-54,-40,-44,-61,-9,-1,3,62,57,64,37,-54,-30,-39,-77,-68,-27,-42,-72,-67,16,1,56,57,-97,-97,-77,-73,-28,-28,-24,-7,-4,-39,-5,-89,-84,-77,-72,-64,-13,-18,-18,-15,40,41,-21,-53,-97,-78,-41,-40,11,20,-31,-64,-88,-57,-57,-65,-77,-73,-77,1,35,42,83,84,-86,-41,-44,-43,-93,-92,81,21,49,56,50,82,-15,-78,-41,-76,80,80,80,66,56,57,51,82,11,-77,-76,-77,79,61,56,61,60,58,72,49,5,-27,-49,-78,81,57,42,54,61,64,57,40,12,-18,-36,-20,18,63,62,58],"ownershipAllowedMAE":0.0787816})%"); + lines.push_back(R"%({"sample":{"board":".O................./O.O................/XOXO..X..O...X...../.XXO...X....OX.X.../..XO.............../.XO.............O../.XO................/..X................/.................../.................../.................../.................../...X.............../.OX................/..OX.............../..OX.....O.....O.../..OX.........X...../.................../.................../","hintLoc":"null","initialTurnNumber":41,"metadata":"39D1B539B5E912976A18F19A6A9AE07A:51","moveLocs":["B7","B18","J15","D14","D13","E14","D12","A19","C11","E15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.85,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,4.92e-06,5.87e-06,4.26e-06,5.33e-06,5.82e-06,5.86e-06,5.21e-06,4.91e-06,4.57e-06,4.83e-06,4.86e-06,4.86e-06,4.77e-06,4.47e-06,4.31e-06,4.4e-06,3.57e-06,0.194,0,0,4.87e-05,0.00501,1.71e-05,5.07e-05,0.00569,1.53e-05,6.57e-06,8.99e-06,1.44e-05,1.72e-05,1.06e-05,1.07e-05,1.09e-05,8.77e-06,7.81e-06,4.54e-06,0,0,0,0,9.34e-06,0.000235,0,8.32e-06,1.02e-05,0,6.72e-06,1.64e-05,0.0014,0,8.18e-06,1.4e-05,2.54e-05,0.000112,4.78e-06,5.01e-06,0,0,0,1.34e-05,0.0683,8.57e-06,0,3.32e-05,6.26e-06,1.12e-05,1.08e-05,0,0,9.09e-06,0,0.00472,0.00689,5.76e-06,5.78e-06,5.2e-06,0,0,0,7.37e-06,0.000126,0.00293,0,9.11e-06,1.68e-05,2.27e-05,0.00539,8.36e-05,1.74e-05,1.07e-05,1.08e-05,0.000131,5.48e-06,4.4e-06,0,0,0,0,1.19e-05,0.00408,3.84e-05,1.09e-05,1.36e-05,3.15e-05,9.72e-05,0.00204,3.86e-05,5.3e-05,1.05e-05,0,9.18e-06,5.1e-06,3.83e-06,0,0,0,1.61e-05,0.0938,0.000306,9.96e-05,6.94e-05,3.9e-05,3.68e-05,6.77e-05,6.43e-05,4.27e-05,4.12e-05,4.75e-05,1.12e-05,1.05e-05,4.6e-06,4.31e-06,0.132,0,0,7.09e-06,0.000921,0.000181,9.87e-05,7.46e-05,5.77e-05,4e-05,5.15e-05,4.43e-05,3.9e-05,2.67e-05,7.99e-05,7.22e-05,1.25e-05,4.61e-06,4.49e-06,6.73e-06,0,9.52e-06,2.14e-05,0.000115,8.06e-05,6.94e-05,6.07e-05,5.05e-05,4.05e-05,4.45e-05,4.74e-05,5.1e-05,5.34e-05,0.000186,0.000197,1.55e-05,4.66e-06,4.86e-06,7.23e-06,8.52e-06,1.62e-05,2.4e-05,3.34e-05,4.86e-05,5.02e-05,4.99e-05,4.82e-05,4.6e-05,5.01e-05,5.59e-05,5.98e-05,6.85e-05,0.000217,0.000166,1.55e-05,4.72e-06,4.63e-06,6.92e-06,1.16e-05,2.66e-05,2.22e-05,4.81e-05,6.55e-05,6.65e-05,6.23e-05,5.83e-05,5.67e-05,5.85e-05,6.32e-05,6.59e-05,7.7e-05,0.000158,0.000123,1.45e-05,4.74e-06,4.37e-06,5.52e-06,8.69e-06,1.32e-05,3.05e-05,8.31e-05,9.82e-05,8.66e-05,8.46e-05,7.9e-05,7.21e-05,6.32e-05,6.88e-05,7.16e-05,9.37e-05,0.000177,0.000173,1.5e-05,4.77e-06,3.93e-06,0,1.25e-05,0,1.56e-05,3.69e-05,0.000109,0.000113,0.000106,9.99e-05,8.39e-05,6.24e-05,7.72e-05,7.07e-05,0.0001,0.000844,0.000497,1.52e-05,4.81e-06,3.65e-06,0,0,6.33e-06,0.0381,2.5e-05,0.000203,0.000116,9.48e-05,8.31e-05,7.22e-05,4.27e-05,6.44e-05,7.56e-05,9.47e-05,0.000407,0.000503,1.49e-05,4.82e-06,4.06e-06,3.73e-06,0,0,8.27e-06,0.000161,0.000192,0.00013,2.02e-05,1.19e-05,1.9e-05,4.58e-05,4.51e-05,0.000105,7.69e-05,1.67e-05,5.83e-05,1.54e-05,4.82e-06,4.13e-06,4.19e-06,0,0,6.2e-06,0.000164,0.00201,0.00577,1.38e-05,0,1.19e-05,7.56e-05,7.61e-05,0.000505,1.84e-05,0,2.48e-05,1.27e-05,5.02e-06,4.14e-06,4.76e-06,0,0,7.14e-06,0.023,0.0478,0.0479,0.000114,1.58e-05,4.74e-05,0.000163,2.81e-05,0,0.291,0.000434,0.000365,1.03e-05,4.6e-06,4.04e-06,6.39e-06,1.12e-05,1.24e-05,4.51e-05,2.24e-05,8.52e-05,2.84e-05,2.86e-05,2.2e-05,1.68e-05,1.39e-05,1.3e-05,1.47e-05,0.00129,0.000437,2.06e-05,7.6e-06,4.57e-06,3.75e-06,4.49e-06,5.81e-06,5.42e-06,5.23e-06,5.59e-06,5.44e-06,5.25e-06,5.45e-06,5.35e-06,5.39e-06,5.11e-06,5.04e-06,5.32e-06,5.85e-06,6.2e-06,5.2e-06,4.58e-06,3.66e-06,4.72e-06],"winrateAvg":0.525873,"leadAvg":0.162168,"scoreMeanAvg":0.382137,"scoreStdevAvg":13.4573,"shorttermWinlossErrorAvg":0.103437,"shorttermScoreErrorAvg":0.848182,"ownership":[-36,-32,-42,-50,-55,-52,-37,-19,5,17,14,0,-19,-39,-47,-45,-37,-30,-22,-38,-38,-27,-68,-55,-58,-56,-14,6,25,13,1,-21,-47,-58,-48,-39,-24,-15,-44,-34,-91,-58,-70,-59,-84,-32,5,57,15,5,-2,-90,-62,-48,-41,-12,-6,-44,-90,-92,-60,-79,-48,-51,-79,-7,20,9,0,27,-91,-49,-82,-25,5,1,-62,-82,-91,-62,-89,-40,-27,-7,54,14,4,9,-45,-38,-24,-14,-26,3,11,-64,-88,60,-88,-88,-21,-17,-4,9,5,4,-7,-7,-17,-7,-4,50,21,16,-48,-86,59,60,-22,7,-3,0,4,4,2,-2,-5,-5,-4,-3,9,18,16,-27,-22,-24,60,12,3,3,4,4,3,2,0,-1,-1,-2,2,1,9,11,-2,12,55,16,5,8,5,5,4,3,2,1,1,1,1,4,3,6,7,15,19,14,3,7,5,4,4,4,3,2,2,1,2,2,4,3,3,3,31,29,7,1,1,3,3,4,4,4,3,3,2,3,3,4,1,1,1,52,43,7,-7,-3,-1,1,4,6,6,5,3,3,4,6,6,5,2,1,68,91,28,-63,-17,-8,1,6,9,10,7,5,5,8,11,13,10,3,4,83,91,-42,-35,15,-8,0,7,13,16,11,7,8,13,23,40,10,6,7,85,87,89,-73,-18,-8,1,10,16,24,15,12,10,14,22,38,26,14,11,80,83,89,-73,-30,-9,0,16,27,76,25,15,9,8,34,84,32,18,15,75,71,89,-74,-37,-6,8,11,25,35,25,14,11,-20,65,49,16,20,17,66,67,-8,-19,-50,-15,-6,6,17,18,19,13,8,15,35,30,23,19,19,49,11,7,-24,-29,-24,-9,4,14,17,16,13,12,16,24,28,24,21,20],"ownershipAllowedMAE":0.0417339})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../...O.........X..X../.................../.................../.................../.................../.................../.................../.................../..OX.............../.O..XO............./.XOOXO............./.XXXOO..........O../.XXOXXXX.....OO..../X.XOX.OX......XX.../OXOOOO.OX...X....../.O.O.............../","hintLoc":"null","initialTurnNumber":27,"metadata":"9E18EE958D4EF33E5E3039FBD86C9587:37","moveLocs":["E8","D7","C7","D9","C9","A1","K3","C10","J3","D10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1button1","komi":6.5,"policyOptimism":0.0,"pda":0.783,"policyMixture":[3.16e-06,4.11e-06,4.23e-06,4.39e-06,4.4e-06,4.25e-06,4.25e-06,4.25e-06,4.25e-06,4.17e-06,4.13e-06,4.21e-06,4.32e-06,4.34e-06,4.49e-06,4.25e-06,4.17e-06,4.13e-06,3.38e-06,4.12e-06,5.49e-06,7.46e-06,9.49e-06,1.11e-05,9.64e-06,9.68e-06,1.01e-05,1.03e-05,9.93e-06,9.61e-06,1.22e-05,1.13e-05,1.23e-05,1.9e-05,1.13e-05,8.47e-06,7e-06,4.26e-06,4.12e-06,7.23e-06,9.8e-06,1.01e-05,2.98e-05,7.27e-05,6.14e-05,5.97e-05,6.26e-05,6.3e-05,6.43e-05,9.17e-05,4.46e-05,5.96e-05,0.000107,0.000137,0.000107,9.79e-06,4.34e-06,4.32e-06,8.84e-06,9.46e-06,0,8.83e-06,5.13e-05,5.59e-05,5.46e-05,6.05e-05,5.85e-05,5.02e-05,4.78e-05,6.17e-05,0,5.43e-05,0.000226,0,4.49e-05,4.71e-06,4.34e-06,1.08e-05,3.23e-05,8.49e-06,1.04e-05,1.61e-05,1.94e-05,2.47e-05,2.75e-05,2.37e-05,1.91e-05,2.59e-05,3.54e-05,7.46e-05,8.44e-05,8.67e-05,8.18e-05,1.19e-05,4.45e-06,4.31e-06,9.94e-06,0.000201,6.75e-05,1.83e-05,1.64e-05,2.08e-05,2.39e-05,2.39e-05,1.89e-05,1.96e-05,2.11e-05,2.4e-05,1.92e-05,2.55e-05,4.91e-05,4.99e-05,1.16e-05,4.32e-06,4.49e-06,1.02e-05,0.000396,6.3e-05,2.8e-05,2.32e-05,2.92e-05,2.61e-05,1.99e-05,2.18e-05,2.42e-05,2.55e-05,2.56e-05,2.34e-05,2.21e-05,3.55e-05,5.25e-05,9.64e-06,4.23e-06,4.48e-06,1.71e-05,0.000242,3.29e-05,1.72e-05,3.49e-05,3.85e-05,2.41e-05,2.46e-05,2.83e-05,3.11e-05,3.24e-05,3.08e-05,2.9e-05,3.19e-05,5.88e-05,5.88e-05,9.85e-06,4.22e-06,4.61e-06,2.15e-05,6.52e-06,7.22e-06,1.77e-05,4.63e-05,5.47e-05,3.62e-05,3.7e-05,3.94e-05,4.02e-05,4e-05,4e-05,3.85e-05,4.46e-05,8.76e-05,7.24e-05,1.02e-05,4.27e-06,4.6e-06,0.235,0,0,7.64e-06,0.000944,0.000137,5.76e-05,5.34e-05,5.39e-05,5.15e-05,4.96e-05,4.74e-05,4.42e-05,4.8e-05,9.47e-05,6.45e-05,1.01e-05,4.31e-06,4.88e-06,0.0265,0,0,7.59e-06,0.000449,0.00472,2.68e-05,7.34e-05,6.72e-05,6.06e-05,5.55e-05,5.09e-05,4.33e-05,3.95e-05,7.83e-05,5.26e-05,9.92e-06,4.3e-06,4.79e-06,4.65e-06,0,0,0,6.52e-05,0.132,0.000613,0.000147,8.05e-05,6.33e-05,5.45e-05,4.8e-05,4.41e-05,2.75e-05,3.51e-05,2.75e-05,9.15e-06,4.3e-06,5.22e-06,0,0,0,0,0,8.16e-06,0.00643,0.00768,0.000106,5.61e-05,4.13e-05,2.93e-05,2.01e-05,1.35e-05,1.14e-05,1.15e-05,7.95e-06,4.19e-06,4.83e-06,0,0,0,0,0,6.22e-06,0.0724,0.000545,9.97e-05,4.33e-05,2.74e-05,1.32e-05,1.12e-05,9.88e-06,7.48e-06,6.29e-06,6.95e-06,4.06e-06,4.22e-06,0,0,0,0,0,6e-06,1.59e-05,0.0625,0.000148,5.7e-05,2.88e-05,9.22e-06,5.14e-06,5.44e-06,6.15e-06,0,7.13e-06,4.56e-06,4.35e-06,0,0,0,0,0,0,0,9.71e-06,7.75e-06,0.000105,0.000135,8.14e-06,0,0,1.04e-05,1.06e-05,3.64e-05,4.73e-06,0,0,0,0,0,4.42e-06,0,0,0,0,4.8e-05,0.44,1.93e-05,0.000131,0,0,1.42e-05,0.000711,5.01e-06,1.97e-05,0,0,0,0,0,3.73e-06,0,0,1.31e-05,0.000111,1.42e-05,0,5.88e-06,5.92e-06,5.43e-06,7.07e-06,1.39e-05,4.68e-06,0,0,3.78e-06,0,3.5e-06,3.55e-06,3.75e-06,3.79e-06,4.99e-06,4.59e-06,4.74e-06,4.3e-06,4.21e-06,4.18e-06,4.43e-06,4.43e-06,4.55e-06,4.64e-06,3.49e-06,7e-06],"winrateAvg":0.525543,"leadAvg":0.0768586,"scoreMeanAvg":0.612272,"scoreStdevAvg":13.6891,"shorttermWinlossErrorAvg":0.147863,"shorttermScoreErrorAvg":1.33623,"ownership":[10,10,10,8,2,-4,-8,-9,-8,-6,-5,-7,-12,-18,-23,-28,-34,-38,-41,11,10,12,8,6,-8,-10,-10,-9,-7,-5,-5,-15,-20,-23,-31,-35,-41,-42,10,12,17,23,17,-11,-8,-8,-9,-9,-7,3,-23,-34,-32,-37,-41,-48,-43,8,9,24,70,17,2,-6,-7,-6,-6,-7,-10,-21,-77,-35,-26,-81,-51,-42,2,3,17,21,7,-1,-4,-5,-4,-4,-4,-5,-11,-21,-21,-28,-31,-40,-35,-8,-9,1,7,2,-2,-3,-3,-3,-3,-2,-3,-6,-10,-10,-13,-16,-25,-24,-22,-21,-13,-8,-4,-3,-2,-2,-2,-2,-2,-2,-4,-5,-7,-10,-14,-17,-15,-38,-29,-39,-19,-9,-3,-1,-1,-1,-1,-1,-1,-2,-3,-4,-6,-8,-11,-10,-46,-64,-52,-33,-11,-3,0,0,-1,-1,-1,-1,-1,-2,-3,-3,-4,-6,-6,-48,-37,-91,-92,-25,0,4,1,0,-1,-1,-1,-1,-1,-2,-3,-5,-3,-2,-44,-38,-36,-92,-27,-3,13,3,0,-1,-1,0,1,1,0,1,-1,2,3,-44,-41,-36,-92,42,38,30,12,1,1,1,2,3,5,5,6,7,9,10,-49,-36,-37,-92,-91,82,34,19,9,5,4,4,7,9,9,10,9,16,19,-49,-64,-36,-34,-90,82,45,32,18,13,9,8,10,13,11,20,25,29,27,-48,-63,-64,-64,82,82,47,41,44,25,16,14,17,27,32,34,73,38,27,-32,-65,-64,95,24,23,24,21,45,40,21,23,32,76,75,9,-11,7,17,-34,-28,-65,96,26,57,92,24,92,93,21,47,-17,16,-71,-71,-36,0,-3,-20,-27,96,95,95,95,91,92,64,72,22,-6,-62,-54,-64,-57,-43,-34,-14,-23,57,57,95,93,90,85,66,67,45,20,-12,-34,-53,-56,-53,-44,-35,-27],"ownershipAllowedMAE":0.0286624})%"); + lines.push_back(R"%({"sample":{"board":".............O...O./.X..XXXX...XXO...OX/XXXXOXOXOX.X.XOOOX./OXOOOOOOXXOX.XOOXX./OO......OXOOX.XOX../.XO...O.OOXXXX.X.../OX.....XO.OO..X.X../.O.X.OOXOOXOXX...../..X.XXXOOOXXXO..O../OO.XO.OO.XOOOO...../..OXO.O.X.XXX.XOOX./OOXXXXOOOX.XOOOX.X./XXOO.OXXOOXOXXXXX../.XXO.O.XXXXOOOXO.XX/.XOOOOO..OOOXOXXXXO/..XXXXOOOOXXXO.OXOO/....XOXXXXO.O.O.O.O/.....OX..XXO...O.O./.........XOO......./","hintLoc":"null","initialTurnNumber":227,"metadata":"5C47AB8449A30D2D8FE9E9E82636BA71:237","moveLocs":["P4","N13","K13","N19","J10","K9","Q19","O9","R18","L8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":7.5,"policyOptimism":0.006,"pda":0.0,"policyMixture":[0.000581,0.0006,0.000598,0.000594,0.000594,0.000595,0.000596,0.0006,0.000608,0.000592,0.000599,0.000585,0,0,0.000818,0,0.000123,0,0.101,0.000591,0,0.000601,0.000612,0,0,0,0,0.000614,0.0184,0.00066,0,0,0,0.00101,0.000711,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0157,0,0.000605,0,0,0,0,0,0.0132,0,0,0,0,0,0,0,0,0,0,0,0,0.000612,0,0,0,0,0,0.000652,0,0,0.00611,0.00066,0.000641,0.000653,0.000779,0.000918,0,0,0,0,0,0,0,0,0,0.000654,0.00064,0.00827,0,0,0.000733,0.000652,0.000665,0,0.0039,0,0,0,0,0,0,0,0,0.0137,0.0177,0.000602,0,0,0.00875,0.00105,0.000667,0.000673,0.00447,0,0,0,0,0,0,0,0,0.000614,0,0.000711,0.000613,0.00621,0,0.00528,0,0.00381,0,0,0,0,0,0,0,0,0,0.000619,0.000645,0.000625,0.00065,0.000622,0.00141,0.0101,0,0,0,0,0,0,0,0,0,0,0,0,0.000622,0.000623,0,0.000616,0.00063,0,0,0.00494,0,0,0.00369,0,0,0,0,0,0,0,0,0.000623,0.000651,0.000624,0.000645,0.000616,0.00126,0.00645,0,0,0,0.00294,0,0.209,0,0,0,0,0,0,0,0,0,0,0.000616,0,0,0,0,0,0,0,0,0,0,0,0,0.000618,0.000618,0.000615,0,0.000633,0,0.000606,0,0,0,0,0.00122,0,0,0,0,0,0,0,0,0,0,0,0,0.000608,0.000596,0.015,0,0,0,0.000634,0,0.0491,0,0,0,0,0,0,0,0,0,0.000569,0,0,0.0144,0,0,0,0,0,0,0.0358,0.0395,0,0,0,0,0,0,0,0,0,0,0.0141,0.0169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0143,0.0154,0.0167,0.0139,0,0,0,0,0,0,0,0.00542,0,0.000809,0,0.00206,0,0.00322,0,0.0165,0.0151,0.0177,0.0155,0.0179,0,0,0.0137,0.00149,0,0,0,0.00075,0.000626,0.000754,0,0.000969,0,0.00101,0.000786,0.0162,0.0135,0.0153,0.0122,0.0116,0.0147,0.0134,0.0132,0,0,0,0.000623,0.000623,0.000618,0.000628,0.000602,0.00061,0.000616,0.0171],"winrateAvg":0.000261536,"leadAvg":-18.6301,"scoreMeanAvg":-18.744,"scoreStdevAvg":1.6199,"shorttermWinlossErrorAvg":0.00426354,"shorttermScoreErrorAvg":0.617784,"ownership":[-99,-99,-99,-99,-99,-98,-98,-97,-96,-96,-97,-98,-100,100,99,100,100,100,88,-99,-100,-99,-99,-100,-100,-100,-100,-96,-94,-96,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,100,-100,-96,-100,-96,-100,-99,-100,100,100,100,-100,-100,100,-100,100,100,100,100,100,100,-100,-100,-97,-100,-99,-100,100,100,-100,-100,-98,100,100,98,95,94,94,95,97,100,-100,-97,-97,-100,-99,-100,100,-100,-97,-97,98,93,100,92,94,91,100,96,100,100,-100,-100,-100,-100,-98,-100,-98,-95,-96,100,93,94,93,93,95,97,95,100,100,100,100,-100,-99,-100,-96,-100,-97,-96,97,100,93,91,93,100,100,95,100,100,-100,100,-100,-100,-95,-95,-95,-95,-96,97,94,91,92,92,92,92,100,100,100,-100,-100,-100,-95,-95,-95,-93,-95,-96,100,100,93,92,100,96,100,100,100,-100,-97,-96,-96,-95,-96,-95,-94,-96,-96,97,96,98,92,100,96,100,86,-100,-100,-100,-100,-100,-100,-100,-93,-93,-100,-96,99,100,91,91,91,91,100,100,100,-100,-100,-100,-99,-99,-99,-100,-95,-100,-97,-100,-100,100,100,94,100,-100,-100,100,100,-100,100,-100,-100,-100,-100,-100,-97,-98,-97,-100,-100,100,96,100,-62,-100,-100,-100,-100,100,100,100,-100,-96,-97,-100,-100,-98,-100,100,100,100,100,100,13,-20,100,100,100,98,100,-100,-100,-100,-100,100,-97,-98,-100,-100,-100,-100,100,100,100,100,98,97,97,100,100,100,-100,100,100,-97,-97,-96,-97,-100,-97,-100,-100,-100,-100,100,97,100,96,100,98,100,99,100,-97,-95,-96,-97,-97,-97,-100,-97,-97,-100,-100,100,95,95,96,100,97,100,98,-97,-96,-96,-96,-97,-97,-97,-98,-97,-100,100,100,96,96,96,96,97,97,98],"ownershipAllowedMAE":0.0202436})%"); + lines.push_back(R"%({"sample":{"board":".................../X...OOOOX....O...../.OOOXXXOOXXXXOX..../OOXXX.OXOOXOOX.X.../.XX.OO.X..OOXX..X../.XOX.XOXX..O.....X./..OOXXX......OX.OO./.............X.OXX./.........O.....O.O./.OOO..........X.OX./..XO.............X./.XXO..........X.X../..XO.............../.XOO...........XO../.XXO.....O.....X.O./X.XO........O..XO../.OOX.X.........XX../..OX.............../.XO................/","hintLoc":"null","initialTurnNumber":109,"metadata":"49345AECACAB698526F8E32F3ED39792:119","moveLocs":["O11","N12","P11","K18","H3","G2","H2","F5","O3","G4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.59,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":58.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.54e-06,7.62e-06,7.76e-06,8.09e-06,7.73e-06,7.69e-06,8.62e-06,1.01e-05,0.000135,1.49e-05,0.000109,2.31e-05,2.06e-05,1.51e-05,1.52e-05,1.67e-05,1.19e-05,1.05e-05,7.61e-06,0,7.94e-06,8.03e-06,8e-06,0,0,0,0,0,0,9.72e-06,2.03e-05,0.00158,0,0.00163,0.000101,1.9e-05,1.63e-05,1.02e-05,7.7e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.17e-05,0.00107,1.2e-05,9.19e-06,0,0,0,0,0,8.43e-06,0,0,0,0,0,0,0,0,1.78e-05,0,1.58e-05,7.27e-05,1.29e-05,1.39e-05,0,0,0.0372,0,0,8.33e-06,0,7.95e-06,1.1e-05,0,0,0,0,2.04e-05,3.49e-05,0,0.000675,1.98e-05,1.05e-05,0,0,0,0.028,0,0,0,0,0.00409,7.61e-06,0,0.000143,2.13e-05,0.000357,1.34e-05,0.0792,0,5.47e-05,1e-05,0.0193,0,0,0,0,0,1.17e-05,1.34e-05,1.6e-05,1.49e-05,1.42e-05,0.0416,0,0,4.78e-05,0,0,0.000756,8.74e-06,1.29e-05,9.65e-06,1.26e-05,2.96e-05,1.1e-05,1.28e-05,1.83e-05,1.53e-05,1.51e-05,3.22e-05,0.000277,0,0,2.42e-05,0,0,0,0.0005,8.73e-06,7.96e-06,8.26e-06,1.03e-05,1.56e-05,2.57e-05,3.72e-05,3.06e-05,1.53e-05,0,1.74e-05,0.000109,0.318,0,0,0,0.000198,0,2.19e-05,1.2e-05,0,0,0,9.19e-06,1.8e-05,8.16e-05,7.07e-05,3.06e-05,1.86e-05,4.66e-05,0.00145,0.000593,0.000179,0,1.08e-05,0,0,5.76e-05,0.0013,0.0322,0,0,8.19e-06,1.54e-05,3.91e-05,6.5e-05,6.31e-05,6.22e-05,0.000101,0.0002,0.00941,0.0227,0.00382,0.00778,0.00762,0,1.09e-05,0.0757,0,0,0,8.3e-06,1.59e-05,5.59e-05,7.5e-05,6.76e-05,6.85e-05,8.44e-05,0.000141,0.000213,0.0782,0,0.000439,0,1.25e-05,1.21e-05,0.0311,8.31e-06,0,0,8.5e-06,2.15e-05,3.52e-05,6.41e-05,5.6e-05,4.91e-05,4.9e-05,0.0001,0.00162,0.000105,0.00543,0.000488,0.00137,0.011,1.08e-05,0.000121,0,0,0,8.8e-06,2.94e-05,0.00265,6.04e-05,4.94e-05,1.88e-05,2.34e-05,4.25e-05,7.19e-05,6.18e-05,1.34e-05,0,0,9.58e-06,1.28e-05,2.5e-05,0,0,0,9.98e-06,0,1.07e-05,0.0445,2.11e-05,0,1.54e-05,1.68e-05,1.42e-05,1.81e-05,9.96e-06,0,1.57e-05,0,8.67e-06,0,0.00135,0,0,0.0447,1.03e-05,0,0.045,2.84e-05,1.67e-05,1.58e-05,1.17e-05,0,8.58e-06,8.65e-06,0,0,9.37e-06,1.11e-05,0.00194,0,0,0,0.000186,0,0.000309,0,1.16e-05,2.13e-05,1.74e-05,1.26e-05,8.8e-06,0,9.59e-06,0,0,0.0257,9.68e-06,4.25e-05,1.17e-05,0,0,5.62e-05,0.00106,0,0,1.01e-05,1.5e-05,1.4e-05,1.24e-05,1.13e-05,1.24e-05,8.35e-05,1.5e-05,2.19e-05,4.21e-05,1.56e-05,9.15e-06,0,0,0.000107,0.000104,0.000109,0.000219,1.1e-05,9.85e-06,9.89e-06,9.64e-06,9.52e-06,9.67e-06,1.09e-05,1.15e-05,1.11e-05,1.57e-05,1.88e-05,7.71e-06,7.34e-06],"winrateAvg":0.424633,"leadAvg":-0.194292,"scoreMeanAvg":-0.673346,"scoreStdevAvg":12.8216,"shorttermWinlossErrorAvg":0.189746,"shorttermScoreErrorAvg":1.37733,"ownership":[97,98,98,99,99,98,94,61,41,-77,-83,-89,-90,-91,-92,-92,-90,-89,-89,96,98,98,99,100,100,99,99,-94,-94,-90,-92,-92,-89,-93,-92,-90,-89,-89,98,99,99,99,-95,-95,-95,99,99,-93,-93,-93,-94,-89,-98,-93,-88,-89,-89,99,99,-95,-94,-94,-92,-92,-98,99,98,-94,62,64,-99,-94,-99,-92,-90,-87,39,-95,-95,-87,-85,-85,-97,-98,-24,30,62,61,-98,-98,-49,-33,-98,-88,-78,-21,-95,42,-87,-87,-99,-95,-98,-98,34,27,62,-8,-43,-13,-3,34,-92,-39,-17,-39,44,47,-99,-98,-98,-45,-18,-2,-1,-10,-20,9,-63,12,65,65,-5,6,-4,22,3,-21,-38,-31,-12,-7,6,-16,-34,-77,-76,11,86,12,-2,8,51,49,45,32,-6,-2,-5,-2,5,61,5,5,55,87,87,87,77,75,11,75,92,92,92,29,12,6,1,-2,5,0,13,31,35,-26,36,83,-92,-19,59,64,-87,92,42,14,5,0,-2,-1,0,7,24,17,-3,12,1,-94,-71,17,-87,-87,93,43,16,9,2,-2,-1,0,4,9,11,-83,-52,-96,-86,-83,-10,-87,-89,93,40,0,0,1,-2,1,0,0,2,-17,-35,-75,-86,-81,-81,-41,-95,93,93,29,-13,-3,1,-2,4,3,-3,0,-9,-41,-98,-80,-80,-80,-75,-95,-94,93,19,-89,-22,9,8,73,18,16,19,-2,-38,-98,-91,-77,-80,-94,-92,-94,93,52,-69,-87,24,26,41,47,44,83,22,-28,-98,-81,-80,-80,-93,-89,-89,-95,4,-95,8,78,44,46,53,51,61,80,-7,-98,-98,-78,-80,-90,-90,-88,-95,-83,-78,-82,78,53,55,53,51,45,41,-30,-74,-82,-84,-78,-90,-91,-88,-93,-82,-68,-20,7,53,54,54,49,39,3,-25,-54,-68,-75,-80],"ownershipAllowedMAE":0.0385572})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...XXXO.....XOOO.O./.X..OOO.....XXX..../.OO.............X../.................../.................../.................../.................../.................../.................../........O........../......O............/.....XXOO.X.....X../.......XO........../...O...XOXX..OO.X../.....XXXXO.O.OXX.../.......XO.O......../.................../","hintLoc":"null","initialTurnNumber":50,"metadata":"FCA682DB48B34B5AE705AC91AF426847:60","moveLocs":["F7","C7","G8","Q5","S7","L8","K7","H8","K8","K9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.8,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0button1","komi":8.0,"policyOptimism":0.6,"pda":0.0,"policyMixture":[4.92e-06,4.97e-06,5.06e-06,5.08e-06,5.6e-06,5.87e-06,5.47e-06,5.09e-06,5.23e-06,5.13e-06,4.97e-06,5.03e-06,5.65e-06,5.26e-06,5.48e-06,5.35e-06,4.96e-06,5.21e-06,4.89e-06,5.46e-06,6.98e-06,5.64e-06,4.59e-06,5.3e-06,6.67e-06,1.5e-05,6.89e-06,6.82e-06,6.8e-06,5.87e-06,6.06e-06,7.74e-06,2.13e-05,6.51e-06,5.03e-06,2.39e-05,6.76e-06,5.08e-06,5.73e-06,7.76e-06,6.77e-06,0,0,0,0,5.94e-06,8.2e-06,7.23e-06,6.54e-06,4.77e-06,0,0,0,0,1.24e-05,0,5.86e-06,5.7e-06,0,3.74e-05,0.00237,0,0,0,5.86e-06,7.52e-06,7.61e-06,6.72e-06,4.97e-06,0,0,0,7.61e-06,1.81e-05,3.39e-05,5.14e-06,5.61e-06,0,0,1.96e-05,5.93e-06,5.14e-06,5.77e-06,7.11e-06,7.56e-06,7.7e-06,7.18e-06,6.08e-06,4.93e-06,4.63e-06,5.12e-06,5.53e-06,0,6.37e-06,5.57e-06,5.05e-06,6.16e-06,6.39e-06,7.59e-06,8.15e-06,7.48e-06,7.46e-06,7.43e-06,7.61e-06,7.6e-06,7.59e-06,7.18e-06,6.6e-06,6.41e-06,6.32e-06,6.24e-06,5.77e-06,6.84e-06,5.01e-06,5.34e-06,7.26e-06,7.61e-06,7.45e-06,7.46e-06,7.44e-06,7.52e-06,7.58e-06,7.57e-06,7.77e-06,8.06e-06,7.96e-06,7.65e-06,7.29e-06,7.13e-06,6.84e-06,6.88e-06,6.3e-06,4.96e-06,5.1e-06,7.39e-06,9.45e-06,8.53e-06,8.06e-06,7.99e-06,7.82e-06,7.65e-06,7.84e-06,7.96e-06,1.03e-05,1.13e-05,1.1e-05,8.22e-06,7.51e-06,7.29e-06,6.92e-06,6.28e-06,4.97e-06,5.18e-06,7.74e-06,1.89e-05,1.46e-05,1.07e-05,1.23e-05,1.4e-05,9.64e-06,9.88e-06,1.04e-05,1e-05,1.26e-05,2.23e-05,1.34e-05,7.85e-06,7.29e-06,6.9e-06,6.21e-06,4.99e-06,5.34e-06,9.11e-06,6.28e-05,4.41e-05,2.54e-05,1.9e-05,9.18e-05,2.49e-05,2.34e-05,1.24e-05,9.74e-06,2.15e-05,2.88e-05,2.69e-05,9.62e-06,7.39e-06,6.78e-06,6.05e-06,4.98e-06,5.71e-06,4.53e-05,0.00252,9.83e-05,1.66e-05,2.16e-05,0.00142,9.11e-06,9.08e-05,0,0.906,1.49e-05,3.68e-05,4.42e-05,1.51e-05,7.55e-06,6.48e-06,5.77e-06,4.78e-06,5.88e-06,7.92e-05,0.000346,0.000107,7.57e-06,5.67e-06,0,0,0,0,0,1.1e-05,6.31e-05,7.19e-05,3.04e-05,7.04e-06,5.87e-06,5.11e-06,4.5e-06,5.71e-06,0.000176,0,0.000136,5.76e-06,0,0,0.0622,7.1e-06,0,7.31e-06,3.2e-05,0.000251,0.000757,0.00019,6.54e-06,4.92e-06,0,4.29e-06,5.91e-06,0.000168,0.000102,0.000489,5.84e-06,0,0,0,0,5.82e-06,0,6.57e-06,0.000136,0.000333,9.4e-05,1.34e-05,0,4.38e-06,4.47e-06,6.15e-06,0.000434,0.00286,5.9e-05,6.28e-06,4.73e-06,4.48e-06,0,0,5.21e-06,5.09e-06,6.74e-06,0.000133,7.89e-06,4.81e-06,0,5.54e-06,5.58e-06,4.44e-06,5.83e-06,0.000135,0.000143,0,5.72e-06,4.58e-06,4.45e-06,0,0,0,0,0.0123,3.76e-05,0,0,5.85e-06,0,5.03e-06,4.67e-06,5.6e-06,4.48e-05,0.00334,9.82e-06,5.3e-06,0,0,0,0,0,6.88e-05,0,9.04e-06,0,0,0,4.56e-06,4.79e-06,4.41e-06,5.38e-06,9.47e-06,1.44e-05,2.45e-05,6e-06,4.76e-06,4.44e-06,0,0,5.22e-05,0,8.51e-06,0.00022,4.49e-05,6.56e-06,5.43e-06,4.88e-06,4.68e-06,4.52e-06,4.76e-06,5.24e-06,5.31e-06,5.32e-06,5.19e-06,5.29e-06,4.81e-06,5.14e-06,1.84e-05,7.87e-06,6.09e-06,6.51e-06,5.54e-06,5.69e-06,5.84e-06,5.29e-06,4.62e-06,4.66e-06,4.88e-06,7.3e-06],"winrateAvg":0.621016,"leadAvg":1.08711,"scoreMeanAvg":1.78592,"scoreStdevAvg":14.2371,"shorttermWinlossErrorAvg":0.124675,"shorttermScoreErrorAvg":1.04496,"ownership":[-41,-44,-47,-42,-27,-1,31,38,22,1,-20,-34,-26,9,38,57,64,65,63,-32,-44,-48,-48,-45,-3,33,52,12,0,-13,-45,-34,18,62,66,67,63,63,-16,-3,10,-55,-55,-56,94,47,9,-2,-9,-42,-86,76,75,76,43,74,38,33,-10,39,28,94,94,94,35,12,0,-7,-28,-86,-86,-86,-31,11,-22,9,47,90,90,56,49,43,35,17,10,3,-2,-6,-27,-36,-39,-35,-74,-28,-21,57,52,43,33,25,21,20,16,11,7,3,-3,-8,-7,-12,-19,-27,-29,-20,41,38,27,23,19,17,16,16,14,12,8,2,-2,-7,-10,-13,-12,-20,-20,30,28,21,16,13,13,15,18,19,19,13,5,-1,-7,-10,-13,-16,-20,-19,22,23,18,12,7,7,14,21,27,30,20,8,0,-8,-12,-14,-17,-21,-20,19,20,16,10,0,-2,9,26,49,76,16,4,-10,-16,-16,-16,-19,-24,-26,20,21,10,12,-7,-30,10,29,68,85,-69,-54,-30,-24,-19,-19,-21,-34,-34,26,30,20,6,-3,-34,-69,85,84,-57,-25,-52,-27,-23,-16,-17,-17,-41,-51,31,38,73,10,-25,-92,-12,-19,66,-52,-40,-20,-21,-20,-8,-19,-30,-89,-64,31,34,32,7,-27,-93,-93,77,77,6,-63,-17,-9,-4,5,16,-89,-81,-76,24,25,21,20,-12,-47,-88,-95,77,12,-22,-2,-1,25,50,78,39,-81,-77,16,16,27,61,-4,-41,-77,-95,75,-47,-49,-2,19,86,86,25,-88,-82,-80,7,6,-12,9,-16,-95,-95,-95,-95,66,16,82,62,87,-85,-85,-77,-77,-78,1,-10,-15,-20,-35,-65,-81,-95,49,47,79,73,70,42,-11,-75,-66,-73,-76,-4,-10,-16,-23,-40,-60,-73,-59,-41,28,60,69,61,37,-6,-31,-58,-67,-72],"ownershipAllowedMAE":0.0362108})%"); + lines.push_back(R"%({"sample":{"board":"......O............/.....XOX.XO......../..OO.OOX..X......../.XXXOOXX.O.....X.../...XXXO............/..O...O.O........../....X............../.................../.................../...X...........X.../.................../.................../.................../..X.............X../.................../...O.........O.O.../......O............/.................../.................../","hintLoc":"null","initialTurnNumber":37,"metadata":"1EBB62B54792C1F2828FD96B08B50361:47","moveLocs":["K17","M18","J18","L19","J19","E6","C8","E9","B4","B5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.93,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.47e-06,6.26e-06,6.33e-06,6.12e-06,6.31e-06,5.97e-06,0,8.23e-06,0,6.78e-06,0,5.36e-06,6.29e-06,6.7e-06,6.76e-06,6.8e-06,6.7e-06,6.87e-06,5.39e-06,7.47e-06,8.14e-06,6.4e-06,6.18e-06,5.84e-06,0,0,0,0,0,0,0,1.34e-05,7.35e-05,5.96e-05,2.27e-05,2.61e-05,1.55e-05,7.14e-06,7.46e-06,2.85e-05,0,0,6.08e-06,0,0,0,9.04e-06,0,0,7.78e-06,0.0144,0.119,8.72e-05,0.000238,0.119,7.92e-05,7.35e-06,6.37e-06,0,0,0,0,0,0,0,1.2e-05,0,0.000479,4e-05,3.79e-05,0.000915,7.24e-05,0,0.086,0.000271,8.54e-06,6.85e-06,8e-06,4.97e-06,0,0,0,0,1.6e-05,0.000577,0.000188,6.69e-05,0.0398,0.000258,0.000231,3.41e-05,3.15e-05,2.38e-05,0.000273,7.84e-06,6.78e-06,7.6e-06,0,7.62e-06,7.19e-06,2.22e-05,0,7.12e-06,0,1.94e-05,3.95e-05,0.000162,0.000252,0.000122,9.86e-05,0.000313,0.0019,3.33e-05,7.4e-06,6.05e-06,9.88e-06,7.83e-06,1.71e-05,0,1.64e-05,1.98e-05,1.38e-05,1.01e-05,1.58e-05,2.53e-05,6.44e-05,0.000174,0.000175,0.000124,0.00013,0.000112,2.15e-05,6.91e-06,6.15e-06,9.3e-06,0.0018,0.195,7.16e-05,7.71e-05,0.087,4.82e-05,2.55e-05,2.31e-05,3.21e-05,6.17e-05,0.000152,0.000185,0.000252,0.000193,0.00174,3.45e-05,7.07e-06,6.19e-06,0.000169,0.019,0.0233,1.94e-05,5.81e-05,0.00389,0.000232,6.14e-05,3.96e-05,4.2e-05,7.7e-05,0.000149,0.0002,0.000248,0.000228,0.000107,2.83e-05,7.04e-06,7.09e-06,0.0373,0.00739,0,1.23e-05,0.000226,0.000108,0.000154,0.000107,6.51e-05,6.51e-05,9.62e-05,0.000147,0.000187,0.000134,0,6.51e-05,3.19e-05,7.08e-06,6.46e-06,2.1e-05,1.01e-05,3.9e-05,0,0.000103,0.000116,0.00012,0.000114,0.00011,0.000113,0.000142,0.000197,0.000424,0.000117,0.00752,0.000218,3.86e-05,7.05e-06,6.62e-06,9.8e-06,0,1.84e-05,0.0115,0.00253,0.00661,0.000175,0.000161,0.000162,0.00017,0.000195,0.00029,0.00123,0.000684,0.00123,0.0708,0.00015,7.43e-06,8.17e-06,3.1e-05,1.16e-05,0.00664,1.95e-05,0.000362,0.000611,0.000217,0.0002,0.000219,0.000238,0.000229,0.000313,0.000966,0.000717,0.00169,4.45e-05,2.7e-05,7.2e-06,9e-06,7.48e-06,0,1.18e-05,0,0.000169,0.0123,0.000328,0.000238,0.000287,0.000236,0.000164,0.00022,0.000177,0.000109,7.36e-05,0,2.01e-05,7.46e-06,1.24e-05,0,0.00158,1.45e-05,8.99e-05,0.0135,0.0687,0.000595,0.000166,0.00031,0.000285,0.000218,3.36e-05,1.53e-05,1.7e-05,1.64e-05,0.00786,0.00211,7.96e-06,8.97e-06,0,5.59e-05,0,3.4e-05,0.000233,2.87e-05,0.000168,0.000811,0.000721,0.00155,0.000143,1.75e-05,0,8.68e-06,0,3.7e-05,0.000122,8.27e-06,8.04e-06,1.1e-05,2.64e-05,1.45e-05,6.59e-05,1.3e-05,0,1.8e-05,7.9e-05,0.000101,5.39e-05,4.93e-05,3.1e-05,1.53e-05,1.63e-05,1.64e-05,3.08e-05,1.71e-05,7.04e-06,6.47e-06,9.6e-06,9.22e-06,1.23e-05,1.26e-05,1.25e-05,1.07e-05,1.62e-05,1.83e-05,1.84e-05,1.73e-05,1.6e-05,1.64e-05,1.6e-05,1.36e-05,1.4e-05,1.17e-05,9.65e-06,6.5e-06,5.52e-06,6.24e-06,6.23e-06,6.6e-06,6.61e-06,6.61e-06,7.06e-06,6.8e-06,6.9e-06,6.99e-06,7.02e-06,6.86e-06,6.98e-06,7.08e-06,7.09e-06,6.75e-06,6.47e-06,6.49e-06,5.55e-06,8.71e-06],"winrateAvg":0.423101,"leadAvg":-0.855924,"scoreMeanAvg":-1.10273,"scoreStdevAvg":12.9958,"shorttermWinlossErrorAvg":0.093875,"shorttermScoreErrorAvg":0.773122,"ownership":[3,47,59,74,83,89,95,85,89,26,-59,-52,-42,-28,-19,-11,-8,-9,-10,-33,9,65,84,84,82,95,72,88,-52,-49,-65,-33,-22,-15,-13,-12,-8,-13,-61,15,92,92,92,94,94,72,83,92,-59,-32,-15,-17,-36,-17,-13,-19,-15,-67,-93,-92,-92,95,94,73,72,82,92,-4,-11,-16,-36,-47,-87,-40,-24,-22,-74,-68,-73,-92,-92,-91,88,81,76,49,11,4,-10,-19,-28,-38,-36,-33,-23,-65,-61,-42,-66,-57,3,88,59,89,25,10,-1,-5,-10,-17,-23,-28,-24,-21,-59,-61,-58,-59,-89,-26,-20,34,22,11,5,1,-2,-6,-11,-17,-19,-18,-18,-52,-56,-54,-40,-46,-31,2,0,9,5,3,1,-1,-4,-9,-16,-13,-16,-16,-46,-46,-57,-44,-37,-21,-8,0,2,3,1,0,-2,-6,-11,-22,-25,-21,-18,-45,-42,-50,-90,-47,-17,-6,-1,2,1,0,-1,-3,-8,-17,-74,-31,-22,-20,-43,-51,-49,-54,-87,-23,-9,-2,0,1,0,-1,-2,-5,-10,-18,-28,-23,-20,-45,-41,-21,-44,-36,-23,-1,-2,-1,0,0,0,0,-1,-5,-26,-11,-19,-20,-47,-50,-52,-41,-43,-22,-5,-1,-1,-1,0,0,2,3,-2,-12,-24,-25,-21,-53,-58,-82,-45,-83,-23,-3,1,0,0,1,2,6,12,-2,-4,-62,-25,-16,-34,-73,3,-7,-12,-12,11,5,3,3,3,6,11,24,2,18,28,1,-6,-16,46,21,71,19,22,18,10,10,8,11,12,24,82,48,83,31,5,4,9,4,39,46,45,40,78,21,11,16,8,-4,24,41,39,49,25,11,9,17,26,35,43,45,49,48,33,20,13,8,8,18,21,29,30,26,16,14,25,30,35,40,43,44,40,30,19,11,8,8,14,21,26,28,25,22,17],"ownershipAllowedMAE":0.0277284})%"); + lines.push_back(R"%({"sample":{"board":"..........XOO....../..OXXO..OX.XO.XOO../...OXOXXXXXOOOXXO../...OOX..XOOXO.OXXO./..O.....XXOX.XOOXO./..XO...XOOOXXO.XOO./.......XXO.OXO.XX../...OO..OXOX.XX...../..XX..OOO........../.....XO.OO.OX....../.....XXOOX......X../..OX..OXOX.XXX...../.......XX...O.O..../.X.X......OO...O.../.........X.....X.../..XO.O..OXOOXXX.X../..X.OXO.OO..O..XO../.........XOOX.X.X../.............X...../","hintLoc":"null","initialTurnNumber":38,"metadata":"944A4D27EAF185B3A9529A90184F1110:48","moveLocs":["F15","G16","B12","F11","F12","G13","L11","M11","G12","B11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.9,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":0.5,"policyOptimism":0.969,"pda":1.713,"policyMixture":[4.07e-06,3.84e-06,4.26e-06,0.146,0.0611,0.000492,7.05e-06,4.86e-06,4.52e-06,5.04e-06,0,0,0,4.43e-06,5.76e-06,4.6e-06,4e-06,4.04e-06,4.25e-06,3.98e-06,3.91e-06,0,0,0,0,0.437,4.5e-06,0,0,0.000203,0,0,4.74e-06,0,0,0,4.25e-06,3.96e-06,3.84e-06,4.1e-06,3.81e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.08e-06,4.01e-06,4.02e-06,4.15e-06,4.11e-06,0,0,0,0,4.04e-06,0,0,0,0,0,3.4e-05,0,0,0,0,4.06e-06,4.22e-06,4.45e-06,0,3.95e-06,4.06e-06,0,5.45e-05,0.00018,0,0,0,0,0.000262,0,0,0,0,0,4.13e-06,4.45e-06,5.02e-06,0,0,4.47e-06,0.000633,9.41e-06,0,0,0,0,0,0,0,0.000415,0,0,0,4.32e-06,7.01e-06,6.26e-06,7.97e-06,4.09e-06,3.86e-06,8.83e-05,0,0,0,0,5.41e-06,0,0,0,4.38e-06,0,0,0.000459,4.46e-06,1.05e-05,0,0.000362,0,0,0,0,0,0,0,0,8.42e-06,0,0,4.71e-06,4.56e-06,5.32e-06,1.94e-05,4.65e-06,1.71e-05,0,0,0,0.329,0,0,0,0,4.47e-06,0,0,3.87e-05,8.55e-06,4.76e-06,5.22e-06,7.33e-06,6.9e-06,4.86e-06,5.01e-06,5.83e-06,5.17e-06,5.95e-06,4.81e-06,0,0,3.58e-06,0,0,4.55e-06,0,0,6.93e-06,5.11e-06,6.63e-06,4.07e-05,9.19e-06,4.61e-06,4.69e-06,4.81e-06,5.01e-06,0.00171,5.63e-06,0,0,0,0,0,5.22e-06,5.48e-06,5.24e-06,4.97e-06,5.12e-06,0.000273,0,2.31e-05,4.68e-06,4.29e-06,4.54e-06,0,0,0.000841,0.000381,0,0,0,0,5.29e-06,0,0,0,0.00013,0.0002,0.000119,7.01e-06,4.47e-06,3.9e-06,5.08e-06,6.46e-06,8.47e-05,0.000952,0.00107,2.23e-05,0,0,3.59e-05,5.23e-06,4.55e-06,0,5.87e-06,0,1.05e-05,1.91e-05,5.35e-06,4.36e-06,4.36e-06,0,9.41e-06,0,9.37e-05,0.000232,7.58e-05,5.66e-06,5.18e-06,5.43e-06,0,0,4.28e-06,5.43e-06,5.05e-06,0,6.37e-05,5.26e-06,4.27e-06,4.13e-06,6.14e-06,1.52e-05,0.0168,5.42e-06,5.86e-06,5.66e-06,5.05e-06,5.04e-06,0,4.44e-06,4.21e-06,4.73e-06,4.45e-06,4.92e-06,0,4.35e-06,4.57e-06,4.24e-06,4.14e-06,4.93e-06,0,0,4.26e-06,0,4.31e-06,4.28e-06,0,0,0,0,0,0,0,0,0,4.51e-06,4.22e-06,4.14e-06,5.56e-06,0,5.19e-06,0,0,0,3.98e-06,0,0,3.84e-06,4.18e-06,0,4.39e-06,3.63e-06,0,0,4.16e-06,4.25e-06,4.28e-06,5.65e-06,2.62e-05,5.48e-05,4.72e-06,4.46e-06,4.2e-06,3.89e-06,3.95e-06,0,0,0,0,4.44e-06,0,3.92e-06,0,4.13e-06,3.97e-06,4.04e-06,4.29e-06,4.43e-06,4.87e-06,4.6e-06,4.06e-06,4.2e-06,3.92e-06,3.97e-06,4.05e-06,3.96e-06,4.27e-06,4.89e-06,0,4.17e-06,3.99e-06,3.95e-06,3.72e-06,4.11e-06,5e-06],"winrateAvg":0.489685,"leadAvg":0.0212324,"scoreMeanAvg":0.0534641,"scoreStdevAvg":5.56135,"shorttermWinlossErrorAvg":0.295061,"shorttermScoreErrorAvg":1.11165,"ownership":[97,98,98,98,87,50,-55,-89,-92,-84,-82,95,96,93,94,97,99,99,99,96,97,99,88,88,88,38,-97,-91,-99,13,7,96,94,92,100,100,99,99,92,96,98,100,89,89,-98,-99,-99,-99,-99,95,96,97,93,93,100,99,98,88,94,97,100,100,-98,-98,-97,-99,97,97,-99,96,88,96,93,94,99,96,78,87,100,97,94,94,-34,-95,-99,-99,98,-99,-53,-72,96,96,93,100,85,56,80,59,99,83,77,-42,-95,98,98,98,-99,-100,-34,-63,-98,99,99,69,12,4,71,84,72,-15,-95,-95,-95,98,12,-3,-100,-42,-82,-97,-98,-5,50,-47,47,-6,100,100,100,100,100,-95,98,-95,-95,-99,-100,-73,-66,-50,-27,1,-52,-97,-97,-97,94,-95,100,100,100,98,99,-98,-91,-64,-60,-56,-56,-38,-23,-87,-90,-92,-91,-21,-96,100,99,100,100,64,67,-96,-58,-47,-54,-56,-52,-42,-90,-91,-92,-87,-77,-96,-96,100,100,-87,-14,-23,-67,-55,-32,-27,-94,-60,-45,-92,-92,-88,-97,-58,-61,-46,-89,100,-87,-50,-98,-98,-97,44,2,-22,-49,-41,-95,-94,-93,-80,-48,-36,-58,-90,-90,-14,29,15,94,54,90,14,-27,-39,-37,-95,-98,-81,-95,-16,-15,17,-15,-23,-13,99,99,46,36,-9,37,-38,-45,-41,-95,-96,-65,50,5,30,21,8,20,-42,41,38,-27,-41,-55,-99,-64,-59,-57,-91,-95,-98,85,65,96,54,41,100,-46,100,100,-100,-100,-100,-97,-100,-89,-75,-83,-84,-98,-5,95,70,98,80,100,100,98,59,61,11,-82,-100,-96,-96,-89,-76,-59,-64,-9,64,68,91,92,97,96,100,100,-93,-31,-100,-100,-100,-98,-95,-60,-47,-22,-2,31,55,75,88,94,97,97,34,-48,-98,-98,-99,-99,-99,-97],"ownershipAllowedMAE":0.0398654})%"); + lines.push_back(R"%({"sample":{"board":"X.XXO......X.X.O.../X.XOXXOO...OXO...OO/.XXOO.XO..XOX.OOOX./O.XOX.XO.X.XOOOXXX./.XOO.XXO..XXXXX..../.X..OXOO......XX.../.XO..O...O..XX.X.../..O.........XX.X.../.O......O.XX...X.../O...O.O...XOX.XX.X./OOO.XOOXXXXOOXX.XO./O.OOXO.OXOX.OXX..O./..OOO..OOOOOOX.XO../O..OO.OO...O.OX.O../OO.......OOOOOXXOX./...O.O.O.OOOXX.XOX./O.OOOO.OOXXXX.XXOX./.O.OO.O.OOX..X.OX.X/OOO.OO.O.........X./","hintLoc":"null","initialTurnNumber":262,"metadata":"A82160A991D7A1A96333B870D8C64D0C:272","moveLocs":["F17","E15","C14","D14","J18","K18","L18","J17","P18","O17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.51,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0button1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0.000211,0,0,0,0.00177,0.000772,0.00023,0.00628,0.0698,0.00147,0,0.00521,0,0.23,0,0.0063,0.00103,0.000226,0,0.000195,0,0,0,0,0,0,0,0,0,0.000217,0,0,0,0.000988,0.000547,0,0,0.000251,0,0,0,0,0,0,0,0,0.126,0,0.000214,0,0,0,0,0,0,0.000942,0,0.00025,0,0,0,0.000103,0,0,0.000285,0,0.00023,0,0,0,0,0,0,0,0.000248,0.000237,0,0,0,0,0,0,0,0.00139,0.000407,0,0,0,0,0,0.000219,0.000207,0.000213,0.000217,0.000222,0,0,0,0,0,0,0,0.0246,0.105,0.00202,0.000277,0.000235,0.00022,0,0,0.000209,0.000214,0.000215,0.000333,0,0,0.012,0.0194,0,0.0123,0.00191,0.00956,0,0.0544,0.000338,0,0,0.000213,0,0.000209,0.000212,0.000215,0.00129,0.00622,0,0.00049,0.00358,0.0104,0.00294,0.00331,0.00777,0.123,0.002,0.000265,0,0,0.000215,0,0.000206,0.000211,0.000213,0.000267,0,0.000352,0.000242,0.000246,0.000277,0.0004,0.00668,0,0.0482,0,0,0.00023,0.000212,0.000208,0,0.000205,0.000209,0.000211,0,0.000238,0.000218,0.000223,0,0.000214,0,0.0542,0.00995,0.00026,0,0,0,0.000222,0,0,0.000218,0,0.000212,0,0,0,0.000211,0,0,0,0,0,0,0,0,0,0,0,0.000216,0,0,0.000221,0,0.000208,0,0,0,0,0.000213,0,0,0,0,0.000264,0,0,0,0.000212,0.000216,0,0.000217,0.000207,0.000207,0,0,0,0.000207,0.000206,0,0,0,0,0,0,0,0.000219,0,0,0.000219,0.000208,0,0.000202,0.000203,0,0,0.000202,0,0,0.000206,0.000206,0.000213,0,0,0,0,0.000219,0,0.000219,0.000208,0,0,0.000203,0.000199,0.000204,0.000204,0.000204,0.000202,0.000208,0,0,0,0,0,0,0,0,0,0.000207,0.000208,0.000205,0.000205,0,0.000204,0,0.000204,0,0.000208,0,0,0,0,0,0.000214,0,0,0,0.000206,0,0.000204,0,0,0,0,0.000208,0,0,0,0,0,0,0.000217,0,0,0,0,0.000218,0,0,0,0,0,0,0,0,0,0,0,0.00022,0.000219,0,0.000222,0,0,0.000218,0,0,0,0,0,0,0,0,0,0.000221,0.000487,0.000316,0.000235,0.000215,0.000211,0.000209,0.000222,0.000219,0,0.000214,0.000189],"winrateAvg":0.999085,"leadAvg":9.11992,"scoreMeanAvg":9.0417,"scoreStdevAvg":1.84413,"shorttermWinlossErrorAvg":0.0110061,"shorttermScoreErrorAvg":0.569533,"ownership":[-100,-100,-100,-100,-98,-98,63,91,92,25,-55,-100,-99,-99,-96,100,99,100,99,-100,-100,-100,100,-99,-99,100,100,83,88,-100,-100,-100,99,-96,100,100,100,100,-100,-100,-100,100,100,-99,-99,100,100,-60,-100,-100,-100,100,100,100,100,-100,51,-99,-100,-100,100,4,6,-99,100,9,-100,-99,-100,100,100,100,-100,-100,-100,-98,-99,-100,100,100,100,-99,-99,100,1,-41,-100,-100,-100,-100,-100,-100,-100,-100,-99,-91,-100,-100,100,100,-99,100,100,34,27,20,-55,-80,-98,-100,-100,-100,-100,-100,-67,-100,100,100,99,100,99,99,96,99,3,-47,-100,-100,-100,-100,-100,-100,-100,9,-70,100,99,99,99,99,99,98,-35,-37,-71,-100,-100,-100,-100,-100,-100,-100,52,100,99,99,99,99,99,97,99,-4,-100,-100,-99,-100,-100,-100,-100,-100,-100,100,99,99,99,100,100,100,-25,20,-57,-100,100,-99,-99,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-99,-100,100,100,100,100,100,100,100,100,-100,100,-100,48,100,-100,-100,-100,-100,-99,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-99,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,90,-15,-21,-99,-99,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.016472})%"); + lines.push_back(R"%({"sample":{"board":".OXX.......XOO.X.../.OOXXXX.X.XXXOOOX../...OXOOX.X.XOOOXX../..OOOOOOX..XOOX.X../.OOXXX.OOXXXXOXXX.X/.OXX.XXOXX.XOOOX.XO/OOOXXOOOOXXOOOXXXOO/XOOX.O.X.XXXO.OXO.O/XXXXO.OX.XOXXO.OOO./..XXXOOOOOOOXOOO.../.XOOOO.XXO.XOOOXXOO/.XOX.OXXOOX.OXOOOX./XXXX.OXXXXX.OXXOXX./OOXOOOO.OXXOOXOOXOO/O.OX.OO.OXXXXXOXXXO/.OOXXXXXOOX.XXXXOO./..OX..X.XOOXXOOOO.O/.O.OXXOXXXXXXXO..OX/..OOOOOX....XOO..../","hintLoc":"null","initialTurnNumber":294,"metadata":"7D29DC475BC08047FB415DE7D14700C4:304","moveLocs":["E12","F11","R19","O12","P19","T4","T7","H5","T8","H6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.16,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.089,"pda":-2.229,"policyMixture":[0.000929,0,0,0,0.000908,0.0009,0.000898,0.000923,0.000903,0.000899,0.000911,0,0,0,0,0,0,0.000901,0.000893,0.000955,0,0,0,0,0,0,0.0107,0,0.0016,0,0,0,0,0,0,0,0.000917,0.000903,0.000942,0.00121,0.00095,0,0,0,0,0,0.0122,0,0.00116,0,0,0,0,0,0,0.000911,0.00091,0.000955,0.000911,0,0,0,0,0,0,0,0.012,0.000934,0,0,0,0,0.000918,0,0.00092,0.00091,0.000931,0,0,0,0,0,0.0789,0,0,0,0,0,0,0,0,0,0,0.0113,0,0.000913,0,0,0,0.000682,0,0,0,0,0,0.000935,0,0,0,0,0,0.00119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0526,0,0.0671,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0504,0,0,0,0,0,0,0,0,0,0.023,0.000918,0.00127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00134,0.0233,0.0232,0.000933,0,0,0,0,0,0.0708,0,0,0,0.106,0,0,0,0,0,0,0,0,0.000914,0,0,0,0.0446,0,0,0,0,0,0,0.0542,0,0,0,0,0,0,0,0,0,0,0,0.045,0,0,0,0,0,0,0.0473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0227,0,0,0,0,0,0,0,0,0,0,0.000945,0,0,0,0,0,0,0,0.00269,0.00092,0,0,0.00182,0.00256,0,0.00119,0,0,0,0,0,0,0,0,0,0,0,0.00125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000905,0.0221,0,0,0.000889,0.0225,0,0,0,0,0,0,0.00091,0.000913,0.000915,0.000914,0,0,0,0.00114,0.0012,0.0221,0.000878,0.0194],"winrateAvg":0.99975,"leadAvg":3.52824,"scoreMeanAvg":3.66528,"scoreStdevAvg":0.716105,"shorttermWinlossErrorAvg":0.00944096,"shorttermScoreErrorAvg":0.295501,"ownership":[100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,-100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,9,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,100,100,-100,100,100,-100,-100,100,59,-100,-74,-100,-100,-100,100,100,100,-100,100,100,100,-100,-100,-100,-100,100,100,100,-100,17,-100,100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,-100,-100,100,100,100,100,12,-100,-100,100,-49,-100,100,100,100,100,100,100,100,-100,-100,100,-100,25,100,-100,-100,100,100,-100,-25,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-18,100,-100,-100,-100,-100,-100,25,100,-100,-100,100,-100,-100,-100,100,100,-100,100,100,100,100,100,100,-100,-100,100,100,-100,100,100,-100,100,100,100,100,100,-100,-57,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100],"ownershipAllowedMAE":0.0102389})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...OXX.X.........../.O.O.OX........X.../..XO.OX.......X.X../.X.X.OXOX..OO.OX.../.OXXXOOXXXXXOOOOX../O.O..XXOOOOOXXXOX../.O..X......OX.OX.../..........XO..OX.../...OXX.....O.OXO.../...OOX........XO.../..............O..../...X.X........O.X../...........XO....../...X.O.....X...O.../.........OX..X..O../.................../.................../","hintLoc":"null","initialTurnNumber":95,"metadata":"F1B111FB064C06A84E71D76011C4A7FC:105","moveLocs":["K4","C7","B9","Q2","R2","K2","J2","L2","K6","C8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.37,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":0.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.86e-05,4.32e-05,3.9e-05,4.52e-05,3.69e-05,3.75e-05,3.61e-05,3.62e-05,3.64e-05,3.6e-05,3.51e-05,3.47e-05,3.43e-05,3.47e-05,3.51e-05,3.39e-05,3.35e-05,3.41e-05,2.9e-05,4.99e-05,0.000266,7.63e-05,0.00027,0.0107,3.57e-05,0.00163,4.97e-05,4.81e-05,5.04e-05,4.84e-05,4.63e-05,4.54e-05,4.97e-05,6.37e-05,4.78e-05,4.46e-05,4.07e-05,3.43e-05,3.66e-05,7.56e-05,3.21e-05,0,0,0,6.73e-05,0,7.07e-05,0.000118,7.56e-05,0.000121,0.000104,4.65e-05,0.000103,5.17e-05,6.68e-05,4e-05,3.25e-05,5.4e-05,0,0.151,0,4.08e-05,0,0,4.59e-05,0.000473,6.4e-05,6.7e-05,6.82e-05,5.07e-05,4.55e-05,3.91e-05,0,3.61e-05,4.11e-05,3.21e-05,4.61e-05,0.0939,0,0,3.03e-05,0,0,8.86e-05,0.00875,9.81e-05,4.63e-05,3.81e-05,3.63e-05,4.66e-05,0,0,0,4.2e-05,3.18e-05,0.000827,0,0,0,3.23e-05,0,0,0,0,4.38e-05,0.00028,0,0,2.76e-05,0,0,0.000429,0.00251,3.08e-05,5.15e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.7e-05,3.25e-05,0,2.6e-05,0,0.0142,3.66e-05,0,0,0,0,0,0,0,0,0,0,0,0,4.01e-05,3.38e-05,2.69e-05,0,3.01e-05,0.0157,0,5.07e-05,0.00754,3.97e-05,3.35e-05,3.13e-05,3.18e-05,0,0,2.23e-05,0,0,9.84e-05,4.93e-05,3.5e-05,4.11e-05,3.08e-05,0.0874,0.166,8.58e-05,6.83e-05,4.56e-05,4.47e-05,4.01e-05,3.48e-05,0,0,3.45e-05,3.25e-05,0,0,5.84e-05,0.000163,3.66e-05,3.47e-05,0,0.346,0,0,0,4.32e-05,5.54e-05,4.53e-05,3.95e-05,3.54e-05,0,3.13e-05,0,0,0,4.57e-05,4.95e-05,3.66e-05,4.65e-05,0.000282,0,0,0,0,4.66e-05,0.000116,5.16e-05,4.42e-05,3.91e-05,3.7e-05,3.48e-05,3.69e-05,0,0,3.45e-05,4.06e-05,3.42e-05,4.93e-05,6.4e-05,0,0.00011,0.00783,0.00454,0.000182,9.85e-05,5.37e-05,4.64e-05,4.66e-05,4.21e-05,3.92e-05,3.52e-05,0,3.32e-05,3.54e-05,3.55e-05,3.26e-05,5.17e-05,0.00097,0.000164,0,0.00034,0,0.00022,0.000159,5.22e-05,0,4.75e-05,4.52e-05,4.15e-05,3.86e-05,0,3.43e-05,0,3.41e-05,3.2e-05,4.25e-05,0.000398,0.000626,0.000104,0.000423,7.03e-05,8.37e-05,9.01e-05,5.56e-05,4.47e-05,4.11e-05,0,0,4.11e-05,4e-05,3.65e-05,3.59e-05,3.51e-05,3.21e-05,3.95e-05,0.000149,0.000316,0,6.36e-05,0,5.82e-05,0.000218,4.49e-05,0,4.27e-05,0,0.00108,4.43e-05,4.53e-05,0,3.43e-05,3.45e-05,3.24e-05,3.74e-05,7.39e-05,0.000427,0.000879,0.00027,0.000194,0.000336,0.0215,8.88e-05,0,0,3.74e-05,0.000343,0,0.000197,4.31e-05,0,3.3e-05,3.2e-05,3.6e-05,5.18e-05,0.000172,0.00019,0.000645,0.000295,0.000396,9.52e-05,0,0,0,4.29e-05,0.000103,0.000354,0.0381,0,0,3.22e-05,3.26e-05,3.02e-05,3.66e-05,3.81e-05,3.99e-05,4.06e-05,4.06e-05,4.08e-05,4.14e-05,4.24e-05,5.11e-05,3.39e-05,3.85e-05,4.11e-05,4.52e-05,4.11e-05,0.000123,3.55e-05,3.18e-05,2.94e-05,2.65e-05],"winrateAvg":0.0591224,"leadAvg":-7.34763,"scoreMeanAvg":-8.91769,"scoreStdevAvg":13.1606,"shorttermWinlossErrorAvg":0.0766894,"shorttermScoreErrorAvg":1.71429,"ownership":[49,48,37,11,-31,-52,-65,-64,-55,-39,-27,-20,-19,-22,-28,-38,-48,-55,-60,51,44,53,8,-28,-77,-69,-76,-58,-43,-31,-24,-22,-26,-32,-44,-56,-61,-64,51,52,54,68,-91,-92,-90,-95,-50,-28,-23,-16,-18,-28,-25,-69,-62,-69,-69,29,67,39,68,-15,66,-95,-64,-31,-17,-6,-14,-12,-16,-42,-96,-81,-80,-75,-15,34,-70,68,42,64,-95,-87,-20,-17,8,19,14,0,-88,-86,-97,-86,-79,-60,-77,-70,-92,-30,65,-93,-81,-86,-11,36,92,93,50,92,-93,-90,-76,-78,-17,38,-92,-92,-92,65,65,-86,-85,-86,-85,-83,92,92,92,92,-95,-86,-74,43,32,45,-13,-87,-91,-89,99,99,99,100,99,89,88,86,93,-95,-75,-62,40,50,16,-52,-94,-56,6,29,46,48,68,100,88,90,92,-61,-61,-53,-41,41,40,25,-10,-49,-57,-22,-1,12,24,-4,100,94,84,91,-60,-8,-18,-12,33,51,26,49,-94,-93,-32,-9,8,19,37,99,72,92,60,93,31,32,21,5,-22,-87,49,48,-92,-38,-13,4,16,23,38,48,57,58,94,73,61,46,-23,-58,-86,-21,7,-32,-35,-10,10,25,13,8,13,38,97,81,71,65,59,-34,-47,-64,-91,-37,-90,-29,-13,19,78,8,-20,-18,33,97,76,54,63,64,-43,-46,-55,-56,-30,-30,-13,2,4,43,-6,-80,52,24,38,72,73,73,71,-41,-44,-55,-86,-12,52,12,22,30,77,-13,-79,-9,-11,25,93,78,80,77,-36,-39,-40,-23,-12,12,16,28,50,77,-80,-67,-53,-77,-37,30,92,85,81,-32,-27,-24,-17,-3,11,20,19,62,-81,-80,-70,-64,-65,21,2,91,76,81,-28,-24,-18,-10,2,14,20,22,-4,-27,-68,-67,-58,-36,-13,42,51,74,75],"ownershipAllowedMAE":0.0381017})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..X.O............../...XO..........O.../..XO.............../.XOO............X../.X................./.................../.................../.................../.................../.................../.............O...../.X........X......../...O...........X.../..X.........O.OOX../...XO..O..X...OXX../....O............../.................../","hintLoc":"null","initialTurnNumber":30,"metadata":"234BB421D8EA89D6FD78F9C1E5DBCCB1:40","moveLocs":["Q7","O17","J16","M7","J5","P5","Q6","K4","L4","K5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":8.0,"policyOptimism":0.0,"pda":1.095,"policyMixture":[1.18e-06,1.5e-06,1.78e-06,1.69e-06,1.57e-06,1.58e-06,1.58e-06,1.54e-06,1.51e-06,1.5e-06,1.49e-06,1.52e-06,1.55e-06,1.57e-06,1.57e-06,1.52e-06,1.49e-06,1.54e-06,1.18e-06,1.3e-06,1.82e-06,2.23e-06,3.61e-06,2.27e-06,2.65e-06,2.9e-06,4.82e-06,3.03e-06,2.67e-06,2.69e-06,3.13e-06,3.2e-06,1.54e-05,5.01e-06,4.54e-06,2.77e-06,2.46e-06,1.47e-06,1.38e-06,1.62e-06,0,2.18e-06,0,2.09e-06,2.96e-05,1.15e-05,2.52e-06,2.71e-06,1.27e-05,1.91e-05,2.91e-05,0,0.000185,8.56e-05,5.83e-05,8.58e-06,1.57e-06,1.39e-06,1.66e-06,1.99e-06,0,0,2.69e-06,1.86e-05,2.26e-06,0,2.18e-06,6.44e-06,1.2e-05,1.76e-05,2.15e-05,0.000574,0,8.37e-05,1.42e-05,1.72e-06,1.43e-06,1.64e-06,0,0,2.24e-05,7.06e-05,1.39e-05,3.86e-06,2.24e-06,2.47e-06,3.09e-06,3.4e-06,3.31e-06,2.84e-06,7.4e-06,3.55e-05,2.62e-06,1.13e-05,1.59e-06,1.14e-06,0,0,0,3.41e-06,1.08e-05,6.35e-06,1.13e-05,6.4e-06,3.49e-06,2.92e-06,3.01e-06,3.22e-06,3.19e-06,1.22e-05,2.34e-06,0,2.57e-06,1.54e-06,1.19e-06,0,2.39e-06,2.39e-06,5.11e-06,6.84e-06,6.59e-06,7.42e-06,6.04e-06,3.74e-06,2.98e-06,3.05e-06,3.09e-06,3.29e-06,3.5e-06,3.27e-06,2.37e-06,2.4e-06,1.41e-06,1.33e-06,2.02e-06,2.73e-06,1.52e-05,3.21e-06,6.79e-06,5.14e-06,4.61e-06,4.18e-06,3.49e-06,3.03e-06,2.94e-06,2.89e-06,2.87e-06,2.73e-06,3.87e-06,3.34e-06,2.48e-06,1.39e-06,1.37e-06,2.13e-06,2.35e-06,3.05e-06,4.17e-06,4.51e-06,4.47e-06,3.9e-06,3.7e-06,3.51e-06,3.21e-06,3.03e-06,3.01e-06,3.17e-06,3.38e-06,7.57e-06,3.56e-06,2.48e-06,1.4e-06,1.35e-06,2.05e-06,2.4e-06,2.6e-06,3.39e-06,3.76e-06,4.06e-06,3.88e-06,3.84e-06,4.19e-06,3.5e-06,3.17e-06,3.03e-06,3.23e-06,4.77e-06,8.34e-06,2.85e-06,2.41e-06,1.36e-06,1.37e-06,2.09e-06,2.44e-06,2.6e-06,3.41e-06,3.81e-06,4.16e-06,4.33e-06,4.09e-06,4.08e-06,4.28e-06,3.1e-06,2.84e-06,2.82e-06,4.06e-06,2.86e-06,2.49e-06,2.13e-06,1.33e-06,1.39e-06,2.18e-06,2.42e-06,3.05e-06,3.91e-06,4.7e-06,4.73e-06,4.62e-06,4.36e-06,4.21e-06,3.06e-06,3.46e-06,5.21e-06,3.38e-06,2.45e-06,2.08e-06,2.11e-06,1.95e-06,1.33e-06,1.35e-06,2.11e-06,2.91e-06,1.41e-05,3.97e-06,4.92e-06,4.39e-06,3.75e-06,5.38e-06,3.61e-06,1.16e-05,0,3.85e-06,0,1.96e-06,0,1.62e-06,1.83e-06,1.29e-06,1.21e-06,0,2.37e-06,3.71e-06,5.7e-06,4.83e-06,2.93e-06,2.47e-06,5e-06,0.0308,0,0.000677,5.14e-06,1.03e-05,2.73e-06,0,1.45e-06,1.69e-06,1.25e-06,1.28e-06,1.8e-06,2.7e-06,0,4.72e-06,1.12e-05,4.86e-06,2.05e-06,0,0,0.964,0.000173,1.56e-05,2.36e-06,0,0,1.39e-06,1.54e-06,1.25e-06,1.38e-06,1.9e-06,0,1.6e-05,2.76e-05,1.23e-05,8.85e-06,3.19e-05,0.00176,0,0,1.78e-05,0,1.94e-06,0,0,0,1.43e-06,1.31e-06,1.38e-06,2.06e-06,2.19e-06,0,0,3.41e-06,7.44e-05,0,9.92e-05,0.000162,0,1.93e-06,1.28e-05,6.99e-06,0,0,0,1.4e-06,1.24e-06,1.34e-06,1.84e-06,2.72e-06,4.14e-06,0,2.31e-06,8.28e-06,5.44e-05,1.83e-05,3.73e-06,2.26e-06,3.34e-06,7.9e-05,4.55e-05,3.82e-05,2.18e-06,1.75e-06,1.4e-06,1.27e-06,1.21e-06,1.54e-06,1.53e-06,1.74e-06,1.68e-06,1.56e-06,1.67e-06,1.57e-06,1.7e-06,1.59e-06,1.66e-06,1.63e-06,1.77e-06,2.45e-06,1.77e-06,1.9e-06,1.5e-06,1.29e-06,1.14e-06,4.36e-06],"winrateAvg":0.147952,"leadAvg":-4.41437,"scoreMeanAvg":-6.91073,"scoreStdevAvg":15.7069,"shorttermWinlossErrorAvg":0.108107,"shorttermScoreErrorAvg":1.44155,"ownership":[-43,-17,7,35,41,36,20,7,-4,-5,0,12,27,38,41,37,29,23,16,-55,-58,26,36,56,34,22,6,-1,-6,2,13,29,45,48,39,31,17,10,-63,-59,-85,24,75,33,2,-1,-23,-13,-3,0,17,78,48,44,35,5,3,-71,-62,-74,-75,74,16,14,-9,-64,-18,-3,2,6,26,28,78,11,0,-2,-76,-79,-84,60,37,-19,3,0,-16,-7,-4,0,5,11,11,14,32,-5,-11,-73,-88,58,59,16,5,1,-3,-8,-5,-1,0,1,4,-3,-10,-55,-23,-17,-53,-88,-28,13,0,1,0,-2,-3,-2,0,1,1,1,0,-5,-13,-19,-16,-38,-34,-3,-12,4,1,0,-1,-1,0,1,2,3,3,2,-2,0,-9,-11,-23,-22,-10,-2,2,1,0,-1,-1,0,3,5,6,5,2,-4,-5,-8,-8,-15,-13,-6,-1,1,0,-1,-2,-2,0,4,9,11,9,5,-9,-6,-9,-9,-14,-12,-3,1,2,0,-2,-4,-5,-4,3,14,15,19,8,-11,-15,-15,-14,-19,-17,-4,2,5,1,-2,-7,-12,-8,-3,16,16,18,5,-23,-23,-26,-24,-32,-27,7,-2,8,3,0,-5,-12,-31,-52,55,25,72,-13,-94,-47,-42,-39,-44,-72,-19,20,11,10,6,6,-1,-9,-87,-17,8,30,5,-94,-62,-60,-56,-58,-61,-1,65,24,15,12,12,-25,61,-86,-32,-25,28,73,-94,-89,-82,-72,-56,-63,-71,31,39,32,25,25,21,59,-84,-21,55,38,72,73,-95,-88,-82,-49,-44,-52,-64,83,49,44,78,19,3,-81,-25,0,36,73,-94,-95,-87,-83,-39,-34,-22,-16,83,63,58,49,15,-5,-39,-6,5,34,22,-16,-78,-76,-79,-31,-19,-5,33,49,61,53,40,16,-8,-20,-11,12,25,16,-22,-41,-65,-72],"ownershipAllowedMAE":0.0358971})%"); + lines.push_back(R"%({"sample":{"board":"............../..O.......XX../..OXX...X.OOX./...O......OXO./....O.....OXO./..OXO.....XX../..OOXX.....O../..XX........../............../.XX.......OOO./OOOXX....XXXO./.OOOXXX.....X./OXXOOXOX....../.X...O......../","hintLoc":"null","initialTurnNumber":61,"metadata":"23219852F3DEFCF9AF061757E7A4D4E0:71","moveLocs":["N13","L8","J10","M7","K13","G10","K9","K7","J7","J8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":14,"ySize":14},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.02e-05,1.04e-05,1.13e-05,1.15e-05,1.23e-05,1.19e-05,1.22e-05,1.16e-05,1.19e-05,1.17e-05,1.31e-05,1.33e-05,1.09e-05,1.03e-05,1.06e-05,1.12e-05,0,1.18e-05,1.16e-05,1.26e-05,1.25e-05,1.27e-05,2.57e-05,0,0,0,0,1.09e-05,1.08e-05,1.09e-05,0,0,0,1.26e-05,3.39e-05,1.34e-05,0,1.74e-05,0,0,0,1.11e-05,1.08e-05,1.08e-05,1.02e-05,0,1.17e-05,4.12e-05,0.00147,0.0001,1.37e-05,9.17e-06,0,0,0,1.04e-05,1.09e-05,1.12e-05,1.09e-05,1.07e-05,0,1.71e-05,0,0.0574,0,1.26e-05,0,0,0,1.15e-05,1.1e-05,1.1e-05,0,0,0,3.43e-05,0.142,0.178,5.88e-05,0,0,0,0.000196,2.44e-05,1.18e-05,1.22e-05,0,0,0,0,3.17e-05,0.00633,0,0.502,0,0,0.091,0.000181,1.19e-05,1.16e-05,0,0,1.24e-05,1.3e-05,1.39e-05,2.84e-05,0,0,2.4e-05,0,5.54e-05,0.000334,1.07e-05,1.11e-05,1.13e-05,1.14e-05,1.15e-05,1.19e-05,1.25e-05,1.27e-05,8.33e-05,0.000106,1.99e-05,1.5e-05,1.25e-05,2.19e-05,1.12e-05,0,0,1.1e-05,1.12e-05,1.15e-05,1.2e-05,1.21e-05,1.24e-05,1.28e-05,0,0,0,1.18e-05,0,0,0,0,0,1.03e-05,1.11e-05,1.12e-05,1.4e-05,0,0,0,0,1.03e-05,9.39e-06,0,0,0,0,0,0,1.3e-05,1.27e-05,6.08e-05,7.87e-05,0.0175,0,0.000482,0,0,0,0,0,0,0,0,3.59e-05,5.16e-05,0.000113,0.00021,0.000849,1.2e-05,1.18e-05,0,1.29e-05,1.13e-05,1.16e-05,0,1.18e-05,2.1e-05,1.15e-05,1.19e-05,1.27e-05,1.42e-05,1.29e-05,1.07e-05,8.86e-06],"winrateAvg":0.459994,"leadAvg":-0.534206,"scoreMeanAvg":-0.864814,"scoreStdevAvg":9.08611,"shorttermWinlossErrorAvg":0.292798,"shorttermScoreErrorAvg":1.83889,"ownership":[80,77,62,44,22,11,5,6,23,47,73,82,83,87,83,82,92,27,6,6,1,2,0,74,67,72,93,88,83,86,92,-20,-20,4,3,1,-20,19,97,97,89,90,78,82,84,93,18,10,0,11,20,58,97,-80,91,81,69,78,85,92,94,7,-58,13,94,81,97,-86,89,48,45,77,93,88,93,-16,6,25,12,84,-89,-88,7,28,20,25,93,93,-83,-82,-15,4,-28,53,-90,-10,-5,-2,-26,-1,-94,-94,-73,-44,-20,-6,6,-91,-85,-87,-56,-19,-54,-69,-79,-80,-64,-46,-34,-34,-67,-74,-68,-59,-50,-41,-59,-97,-96,-90,-73,-54,-48,-51,-67,-68,-43,-40,-38,-40,62,63,63,-100,-100,-79,-66,-66,-73,-97,-96,-94,-35,-50,56,62,61,63,-100,-100,-100,-84,-83,-87,-86,-81,-81,-55,62,44,46,63,66,-99,-73,-97,-85,-87,-85,-85,-70,-65,52,45,49,53,30,20,-71,-84,-87,-85,-84,-79,-76,-72],"ownershipAllowedMAE":0.0577652})%"); + lines.push_back(R"%({"sample":{"board":"...............X.../....OOXOOX.OOOX.XO./..O.OXXO..OXOXXXXX./..OX..XXOOXXOX.OXO./.OX..OO.OXXOXX..O../.X.X...OOX.O..X..../..X..XXXOXO.XOO.O../..X.X.OXOX.O.XO..../.....O.OX.XO.XXO.../.XOOO..XX.O....XO../..XXOXXXO.....XO.../.XXOOXO.O.OO..XO.../.XXXXOOO..X...XO.../..XOXXO.X..XXX.O.../..XOOOXX.O.OOXO..../..XX.O........XO.../..O.XO.XOO.X.XXXOO./....XO.O....O.XOXO./.................../","hintLoc":"null","initialTurnNumber":176,"metadata":"E805B21A61AC77723A79BC7CEC173DE6:186","moveLocs":["K11","L12","J7","H8","G11","L6","M7","J5","H6","N14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":3.29,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.12e-06,2.7e-06,2.79e-06,2.62e-06,2.34e-06,2.31e-06,9.25e-06,0.000138,0.000108,5.64e-06,3.43e-06,3.52e-06,3.73e-06,9.18e-06,2.49e-06,0,2.18e-06,2.29e-06,2.09e-06,2.6e-06,3.48e-06,5.53e-06,1.46e-05,0,0,0,0,0,0,0.000869,0,0,0,0,2.15e-06,0,0,2.24e-06,2.53e-06,3.11e-06,0,5.21e-05,0,0,0,0,6.56e-06,7.85e-05,0,0,0,0,0,0,0,0,2.58e-06,2.67e-06,4.56e-06,0,0,7.18e-05,5e-06,0,0,0,0,0,0,0,0,2.53e-06,0,0,0,2.88e-06,2.7e-06,0,0,2.21e-06,2.84e-06,0,0,3.39e-06,0,0,0,0,0,0,2.84e-06,3.57e-06,0,5.92e-06,2.81e-06,2.22e-06,0,2.09e-06,0,2.4e-06,2.41e-06,8.12e-06,0,0,0,0.000186,0,0,0.417,0,5.21e-06,3.56e-06,1.02e-05,2.63e-06,2.11e-06,2.09e-06,0,2.27e-06,2.29e-06,0,0,0,0,0,0,3.19e-06,0,0,0,1.37e-05,0,2.74e-06,2.57e-06,2.12e-06,2.16e-06,0,2.31e-06,0,2.26e-06,0,0,0,0,0,0,0.000393,0,0,0.122,2.93e-06,2.56e-06,2.33e-06,2.13e-06,2.08e-06,2.15e-06,2.16e-06,2.24e-06,0,0,2.22e-06,0,0,0,0,3.8e-05,0,0,0,5.39e-06,2.31e-06,2.2e-06,2.14e-06,0,0,0,0,2.22e-06,2.13e-06,0,0,0.00847,0,0.0142,0.279,0.00117,0.00051,0,0,2.2e-06,2.1e-06,2.14e-06,2.21e-06,0,0,0,0,0,0,0,0.00208,0.0034,0.054,0.034,1.33e-05,0,0,2.2e-06,2.1e-06,2.02e-06,2.14e-06,0,0,0,0,0,0,0,0,0.008,0,0,0.00454,2.31e-06,0,0,2.09e-06,2.14e-06,1.94e-06,2.12e-06,0,0,0,0,0,0,0,0,0.00181,0,0,2.24e-06,2.29e-06,0,0,2.13e-06,2.23e-06,2.03e-06,2.11e-06,2.17e-06,0,0,0,0,0,0,0,0.0389,0,0,0,0,0.000908,0,2.34e-06,2.49e-06,2.06e-06,2.08e-06,2.13e-06,0,0,0,0,0,0,0,0,4.55e-05,0,0,0,0,0.000104,3.45e-05,2.82e-06,2.14e-06,2.09e-06,2.11e-06,0,0,2.28e-06,0,2.68e-06,4.92e-05,7.39e-05,9.78e-06,2.06e-05,6.67e-06,4.99e-05,2.88e-06,0,0,0.000375,3.67e-06,2.26e-06,2.02e-06,2.12e-06,0,2.5e-06,0,0,0.00379,0,0,0,1.93e-05,0,0.000491,0,0,0,0,0,2.49e-06,2.05e-06,2.14e-06,2.34e-06,2.45e-06,0,0,1.47e-05,0,4.05e-06,3.74e-06,0.000461,0.00272,0,2.62e-06,0,0,0,0,2.51e-06,1.94e-06,2.14e-06,2.25e-06,2.22e-06,2.65e-06,3.55e-06,2.7e-06,3.2e-06,2.55e-06,2.46e-06,2.6e-06,2.64e-06,2.63e-06,2.59e-06,2.46e-06,2.49e-05,2.68e-06,2.8e-06,2e-06,8.77e-06],"winrateAvg":0.0662272,"leadAvg":-10.2736,"scoreMeanAvg":-10.0786,"scoreStdevAvg":12.4641,"shorttermWinlossErrorAvg":0.226337,"shorttermScoreErrorAvg":6.48153,"ownership":[74,86,92,95,96,97,96,96,96,95,92,72,-17,-52,-83,-99,-97,-92,-86,64,72,94,95,99,99,94,99,99,91,92,94,94,93,-99,-99,-99,-77,-81,47,93,97,-10,99,95,94,99,98,97,96,-99,93,-99,-99,-99,-99,-99,-50,30,-12,97,-93,-59,96,95,94,99,99,-100,-100,90,-99,-77,-5,-99,13,-43,-43,-8,-99,-92,23,99,99,98,99,-100,-100,59,-99,-99,-50,-7,67,16,16,-68,-99,-98,-100,10,-21,-41,99,99,-100,-43,62,62,-58,-84,-7,34,53,41,-97,-98,-100,-92,-75,-100,-100,-100,98,-100,67,54,7,74,64,25,79,63,54,-98,-99,-100,-99,-100,-99,-99,-100,96,-100,68,67,17,-72,66,8,47,61,55,-99,-99,-99,-99,-99,-98,-100,-100,-100,-100,-100,67,1,-67,-72,36,29,56,56,-99,-100,-98,-99,-99,-99,-99,-100,-100,-58,46,36,-34,-22,8,1,87,70,63,-99,-100,-100,-100,-99,-100,-100,-100,21,-9,11,3,-22,-47,-93,99,85,82,72,-99,-100,-100,-98,-99,-100,19,18,19,-10,39,39,-28,-52,-95,99,91,88,82,-99,-100,-100,-100,-100,23,19,20,-80,-65,-96,-96,-65,-79,-95,99,94,92,89,-99,-99,-100,93,-100,-100,21,-82,-81,-43,70,-97,-96,-96,-28,99,94,94,93,-98,-98,-100,94,93,93,-80,-82,93,93,61,78,79,-94,90,87,93,95,94,-96,-96,-100,-100,-5,94,-3,27,45,67,40,27,30,-64,-84,91,90,94,95,-93,-93,-87,-94,-98,94,21,1,97,97,35,-28,-18,-83,-82,-81,97,97,94,-91,-89,-89,-87,-98,94,79,96,92,77,55,22,41,-38,-82,3,-1,97,79,-89,-88,-85,-82,54,66,88,91,87,77,54,31,3,-34,-52,-33,29,49,71],"ownershipAllowedMAE":0.0529385})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../...X...........X.../.................../.................../.................../.................../.................../..........O......../.................../.................../..............XXX../...O..........OOXO./................OX./...O.X.........O.../.............X...../.................../.................../","hintLoc":"null","initialTurnNumber":17,"metadata":"36486E8ADB10161EFC056ED03B1BCBE9:27","moveLocs":["S4","O6","R14","P4","F17","Q3","R3","K16","D14","E14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.71e-06,3.49e-06,3.71e-06,4.11e-06,3.99e-06,3.97e-06,3.6e-06,3.69e-06,3.91e-06,3.85e-06,3.81e-06,3.74e-06,3.67e-06,3.7e-06,3.78e-06,3.77e-06,3.57e-06,3.53e-06,2.77e-06,3.51e-06,7.77e-06,2.75e-05,0.000131,5.64e-05,6.32e-06,7.81e-06,1.11e-05,1.89e-05,3.06e-05,1.59e-05,1.52e-05,1.2e-05,2.24e-05,2.29e-05,1.55e-05,1.05e-05,6.86e-06,3.52e-06,3.64e-06,1.78e-05,0.0121,6.7e-05,9.03e-06,0,8.07e-06,0.000145,0.000126,0.000185,9.7e-05,0.00019,0.000188,0.00922,6.75e-05,9.42e-05,0.000248,1.25e-05,3.6e-06,3.85e-06,9.68e-05,0.000114,0,0.000522,9.32e-06,5.53e-05,0.000123,0.000494,0,0.000275,0.000119,0.000198,0.000349,7.12e-05,0,8.11e-05,7.61e-05,4.09e-06,3.98e-06,0.00032,2.59e-05,7.8e-05,0.0266,2.11e-05,0.000113,7.57e-05,0.000119,0.000324,0.000142,0.000108,0.000126,8.51e-05,0.000378,3.4e-05,9.76e-06,4.19e-05,3.97e-06,4.1e-06,7.98e-05,0.00019,0,0,2.08e-05,0.000124,8.36e-05,7.92e-05,7.67e-05,8.31e-05,8.29e-05,9.77e-05,0.000103,0.000204,1.13e-05,0,6.53e-06,3.88e-06,3.83e-06,2.24e-05,0.000183,0.339,0.417,2.24e-05,7.35e-05,6.96e-05,5.87e-05,6.86e-05,7.58e-05,7.63e-05,7.75e-05,8.22e-05,3.62e-05,1.98e-05,7.71e-06,7.31e-06,3.43e-06,3.75e-06,1.78e-05,0.000269,0.149,0.000258,4.55e-05,4.82e-05,5.72e-05,3.5e-05,3.46e-05,2.66e-05,3.6e-05,2.9e-05,3.3e-05,1.85e-05,3.54e-05,1.7e-05,6.91e-06,3.41e-06,3.68e-06,1.19e-05,0.000245,0.000509,8.25e-05,4.88e-05,5.71e-05,5.97e-05,3.5e-05,1.08e-05,7e-06,1.01e-05,2.11e-05,3.76e-05,2.36e-05,4.63e-05,3.03e-05,7.52e-06,3.38e-06,3.6e-06,9.73e-06,0.00011,0.000161,6.39e-05,4.43e-05,5.24e-05,5.86e-05,2.5e-05,6.98e-06,0,6.71e-06,1.46e-05,2.68e-05,1.67e-05,2.11e-05,3.22e-05,7.88e-06,3.48e-06,3.5e-06,8.26e-06,4.26e-05,0.000104,4.31e-05,2.91e-05,4.57e-05,5.33e-05,3.29e-05,1.01e-05,6.82e-06,9.39e-06,1.36e-05,1.23e-05,1.17e-05,1.34e-05,1.46e-05,7.84e-06,3.72e-06,3.39e-06,7.09e-06,1.72e-05,2.6e-05,2.75e-05,1.62e-05,3.42e-05,4.63e-05,3.86e-05,3.95e-05,2.22e-05,1.68e-05,1.19e-05,1.44e-05,5.42e-06,4.23e-06,5.38e-06,6.35e-06,3.57e-06,3.37e-06,6.7e-06,9.85e-06,7.42e-06,1.16e-05,4.51e-05,7.65e-05,7.41e-05,6.95e-05,7.63e-05,5.65e-05,1.74e-05,1.62e-05,9.61e-06,0,0,0,2.15e-05,3.69e-06,3.33e-06,6.47e-06,6.19e-06,0,7.36e-06,5.75e-05,5.23e-05,7.24e-05,7.35e-05,6.1e-05,3.37e-05,1.39e-05,9.7e-06,0,0,0,0,0,3.65e-06,3.36e-06,5.73e-06,6.74e-06,4.62e-06,6.42e-06,1.48e-05,8.75e-05,8.19e-05,8.07e-05,4.59e-05,1.6e-05,1.32e-05,5.59e-06,7.71e-06,4.27e-06,0.0305,0,0,0.00132,3.23e-06,6.22e-06,7.09e-06,0,8.28e-06,0,3.71e-05,0.000161,0.000112,5.97e-05,1.89e-05,9.8e-06,7.73e-06,4.42e-06,0,0,4.49e-06,0,3.32e-06,3.23e-06,5.27e-06,1.06e-05,1.28e-05,2.21e-05,3.35e-05,2.78e-05,0.000162,8.1e-05,4.1e-05,2.17e-05,1.3e-05,7.05e-06,0,6.22e-06,0,0,3.29e-06,3.05e-06,3.22e-06,4.58e-06,7.11e-06,1.3e-05,1.38e-05,1.14e-05,1.18e-05,1.32e-05,9.54e-06,8.27e-06,7.79e-06,7.5e-06,6.59e-06,5.89e-06,5.88e-06,0.000475,4.42e-06,3.67e-06,3.24e-06,2.89e-06,3.28e-06,3.5e-06,3.79e-06,4e-06,3.89e-06,3.84e-06,3.7e-06,3.5e-06,3.39e-06,3.4e-06,3.43e-06,3.52e-06,3.49e-06,3.36e-06,3.56e-06,3.52e-06,3.14e-06,2.96e-06,3.87e-06],"winrateAvg":0.548139,"leadAvg":0.52469,"scoreMeanAvg":0.64118,"scoreStdevAvg":13.2689,"shorttermWinlossErrorAvg":0.0664509,"shorttermScoreErrorAvg":0.562877,"ownership":[-5,-6,-6,-7,-3,0,1,-3,-6,-9,-10,-10,-10,-11,-12,-14,-14,-14,-14,-6,-5,-9,-6,-9,4,1,-3,-9,-9,-14,-10,-10,-10,-17,-18,-17,-13,-13,-4,-9,-10,-35,-25,27,-9,-8,-16,-26,-20,-12,-15,-12,-26,-30,-18,-13,-12,-1,-4,-24,-79,-34,-22,-16,-14,-18,-70,-20,-16,-15,-25,-35,-80,-33,-12,-10,7,4,-2,-41,-34,-25,-18,-15,-13,-17,-11,-10,-11,-19,-20,-22,-36,-10,-2,17,23,25,70,-71,-45,-27,-12,-9,-10,-7,-6,-8,-14,-22,-9,45,12,7,24,28,32,54,37,14,-3,-6,-7,-6,-4,-4,-6,-9,-10,4,7,12,10,25,28,29,42,26,14,3,-2,-5,-4,-3,-4,-7,-8,-9,-2,1,4,6,23,25,26,24,17,9,3,0,-2,-5,3,-6,-6,-7,-9,-7,-3,-2,0,20,21,20,18,11,5,2,0,-1,4,52,2,-6,-9,-10,-10,-6,-8,-7,18,19,17,18,8,3,0,-1,-3,-5,4,-7,-10,-14,-16,-16,-17,-13,-14,19,19,15,19,8,0,-3,-2,-4,-3,-5,-9,-18,-17,-33,-39,-37,-25,-17,24,27,29,26,7,4,-2,-2,-3,-3,-6,-11,-20,-39,-88,-88,-88,-15,-3,29,30,46,83,18,-1,-5,-3,-4,-5,-9,-16,-31,-87,17,13,-89,58,30,32,35,41,47,11,-5,-2,-6,-6,-8,-12,-18,-36,-61,-47,14,73,51,66,33,36,51,82,10,-56,-12,-6,-9,-10,-15,-20,-26,-56,-81,67,60,79,69,32,33,40,20,7,-12,-14,-6,-11,-13,-17,-22,-35,-82,-22,-30,79,70,69,30,26,23,15,0,-12,-13,-10,-12,-16,-21,-27,-37,-38,-28,18,48,53,64,27,23,18,10,1,-8,-11,-11,-12,-14,-19,-25,-30,-30,-14,7,31,46,55],"ownershipAllowedMAE":0.0279937})%"); + lines.push_back(R"%({"sample":{"board":".X.X....XOO......../X.X.XXOXXXOO.OOOOX./OX.X.XOX.OO.OXXXOX./..X.XOX.XXXX.XXOXX./OOOXXOXX.XOXXXOOO../...OXOOXXOOOOOOO.OO/OOOOX..OXO.....XOO./.OXOOO.OOOO.OX.XOO./.XXOXXXX..XOO..XOXO/...O.XOXXXXXXXXXXXO/.XXOOOOOOXO.XOOOXX./.XOOXO.OXOOXO.OOOX./XXXOXO.XX..XXOXO.XO/...XX.O.OO..OXXXXO./XX..XO.OXOOO..X.O.O/.XX.XOOXXXXO.OOO.O./..OXOOXX.X.X.O...../..XXXOOOOXOXXXOO.../..........X..XXO.../","hintLoc":"null","initialTurnNumber":204,"metadata":"B537AA10AD520850216C352E8D32FCE7:214","moveLocs":["F1","O13","O11","L7","M6","N5","J1","A11","A10","L6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.93e-06,0,1.73e-06,0,1.7e-06,1.53e-06,1.59e-06,1.57e-06,0,0,0,2.01e-06,2.71e-05,2.1e-06,2.1e-06,2.56e-06,5.72e-06,4.5e-06,1.86e-06,0,1.68e-06,0,1.66e-06,0,0,0,0,0,0,0,0,2.22e-05,0,0,0,0,0,2.45e-06,0,0,1.56e-06,0,1.59e-06,0,0,0,2.93e-06,0,0,2.01e-05,0,0,0,0,0,0,1.8e-06,1.38e-05,5.7e-06,0,1.61e-06,0,0,0,1.53e-06,0,0,0,0,2.76e-06,0,0,0,0,0,1.97e-06,0,0,0,0,0,0,0,0,1.47e-06,0,0,0,0,0,0,0,0,3.75e-06,2.64e-06,2.03e-06,2.09e-06,2.12e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.48e-05,1.37e-05,0,0,0,1.84e-06,2.68e-06,6.18e-05,0,2.2e-05,0,0,0,1.59e-06,7.34e-06,0,0,0,0,0,3.69e-06,0,0,0,0,4.54e-05,0,0,2.51e-06,0,0,0,1.06e-05,0,0,0,0,0,0,0,0,3.12e-06,2.84e-06,0,0,0,0,1.74e-06,0,0,0,0,0,2e-06,1.71e-05,0,2.29e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.94e-06,0,0,0,0,0,0,0,0,0,0,0.496,0,0,0,0,0,0,1.65e-05,1.63e-06,0,0,0,0,0,2.55e-06,0,0,0,0,0,0,0.503,0,0,0,0,2.8e-05,0,0,0,0,0,0,2.6e-06,0,0,3.13e-06,0,0,0,0,0,0,2.84e-05,0,0,1.73e-06,1.83e-06,1.68e-06,0,0,1.09e-05,0,1.9e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,1.66e-06,1.68e-06,0,0,0,0,0,0,0,0,0,6.78e-06,0,2.63e-06,0,0,0,1.53e-06,0,0,1.68e-06,0,0,0,0,0,0,0,0,2.42e-06,0,0,0,2.15e-06,0,2.95e-06,1.59e-06,1.58e-06,0,0,0,0,0,0,2.43e-06,0,1.86e-06,0,8.59e-06,0,2.19e-06,2.16e-06,1.99e-06,1.91e-06,1.69e-06,1.73e-06,1.82e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.98e-06,2.09e-06,1.76e-06,1.54e-06,1.81e-06,1.68e-06,1.67e-06,2.94e-06,0,2.8e-06,2.96e-06,0,3.27e-06,0,1.67e-06,1.7e-06,0,0,0,1.92e-06,1.87e-06,1.75e-06,5.28e-06],"winrateAvg":0.00474961,"leadAvg":-3.54981,"scoreMeanAvg":-3.46837,"scoreStdevAvg":1.29539,"shorttermWinlossErrorAvg":0.0183588,"shorttermScoreErrorAvg":0.499544,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,99,100,-8,-100,-100,-100,-100,-100,-100,-100,-60,100,100,1,100,-100,-100,-100,100,99,100,-6,40,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-51,-100,-100,100,99,99,100,100,100,100,-100,-100,100,-100,-100,-100,-100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,34,61,100,-100,100,100,100,100,100,73,-100,100,100,100,14,100,-100,100,100,100,-33,100,100,100,100,100,100,-100,-34,-100,100,100,99,15,-100,-100,100,-100,-100,-100,-100,-18,3,-100,100,100,-100,-83,-100,100,-100,99,-100,-100,82,100,49,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,97,-100,-100,-100,100,100,100,100,100,100,-100,100,-70,-100,-100,-100,-100,-100,-100,-68,-100,-100,100,100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-78,-100,-100,-100,100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,99,-100,-100,-100,-100,-100,12,100,100,100,100,100,-100,100,-100,-100,-100,-100,100,99,-100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,29,-100,22,100,100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,77,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-60,-100,-100,-100,-14,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-99,-98,63,61,-99,-100,-100,-100,-100,-100,-100,100,100,100,100],"ownershipAllowedMAE":0.0170141})%"); + lines.push_back(R"%({"sample":{"board":".........X....X.../..X...OOX.X..XOOO./.X.XXOX.X.X.OXXO../..XOXOXOOXX...XOO./..XOOOO.XO....XXO./..OO.X..O.....XOOX/.O........X....XX./..X.....XX.XXX..../....XXX..OOOOOOO../..X..OO.O.....XX../.XOX...O........../.O.O....XXX.OX.O../..OO.OOOXXOX.X..../.....XOOOXOX....../...O..XOOXO..XXX../....OX.XOXOO..OX../....OXX.XXO..O.OO./................../","hintLoc":"null","initialTurnNumber":143,"metadata":"CBA519CC7CFC6BA4405D2F74E620DDAF:153","moveLocs":["H16","R9","S3","R5","E17","B14","C7","D17","D9","D10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.85,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":6.5,"policyOptimism":0.0,"pda":-2.303,"policyMixture":[2.34e-06,2.58e-06,2.53e-06,5.79e-06,9.43e-06,2.39e-06,2.21e-06,2.86e-06,2.55e-06,0,2.25e-06,2.47e-06,3.4e-06,6.9e-06,0,3.18e-06,2.35e-06,2.11e-06,2.55e-06,2.74e-06,0,0,0,2.11e-06,0,0,0,2.57e-06,0,2.28e-06,2.84e-06,0,0,0,0,2.35e-06,2.38e-06,0,0,0,0,0,2.37e-06,0,0,2.46e-06,0,2.3e-06,0,0,0,0,2.09e-06,2.32e-06,2.59e-06,2.23e-06,0,0,0,0,2.5e-06,0,0,0,0,2.2e-06,2.1e-06,2.33e-06,0,0,0,2.52e-06,2.76e-06,0,0,0,0,0,0,2.79e-06,0,0,0.051,2.25e-06,2.27e-06,2.31e-06,0,0,0,3.01e-06,2.68e-06,2.69e-06,0,0,2.58e-06,0,3.47e-06,2.42e-06,0,6.37e-06,0.195,3.84e-06,2.56e-06,2.57e-06,0,0,0,0,2.63e-06,0,2.54e-06,2.6e-06,3.15e-06,6.19e-06,8.16e-06,1.05e-05,2.78e-06,8.4e-05,0,3.58e-06,2.48e-06,6.48e-06,9.01e-05,0,0,2.63e-06,2.65e-06,4.01e-06,0,2.4e-06,2.74e-06,2.64e-06,3.55e-06,8.1e-06,0,0,8.03e-06,0,0,0,0.000776,4.38e-06,3.44e-06,2.87e-06,2.69e-06,6.11e-05,2.51e-06,0,0,0,0,1.36e-05,3.29e-06,0,0,0,0,0,0,0,3.4e-05,2.98e-06,2.96e-06,0.00063,0,0,0.68,0,0,3.2e-06,0,2.95e-06,2.86e-06,2.75e-06,2.4e-06,5.7e-06,0,0,0,2.9e-06,2.99e-06,0,0,0,9.83e-05,3.07e-06,2.99e-06,0,2.75e-06,2.77e-06,2.78e-06,3.05e-06,3.8e-06,0.049,4.55e-06,2.32e-06,2.8e-06,2.68e-06,2.49e-06,0,0,0,3.14e-06,3.05e-06,2.55e-06,3.05e-06,0,0,0,2.94e-06,0,0,2.37e-06,0,2.65e-06,6.83e-06,2.19e-06,2.39e-06,0,0,2.54e-06,0,0,0,0,0,0,0,3.33e-06,0,2.26e-06,2.25e-06,9.42e-06,4.41e-06,2.31e-06,2.39e-06,2.45e-06,2.47e-06,0.000728,0,0,0,0,0,0,0,3.05e-06,2.45e-06,2.36e-06,2.69e-06,0,0.0215,2.29e-06,2.56e-06,2.43e-06,0,1.29e-05,3.79e-06,0,0,0,0,0,2.38e-06,2.51e-06,0,0,0,4.51e-06,5.61e-06,2.29e-06,2.51e-06,2.4e-06,2.86e-06,0,0,0,0,0,0,0,0,2.86e-06,7.23e-06,0,0,2.57e-06,0,2.39e-06,2.78e-06,2.74e-06,2.69e-06,0,0,0,0.000219,0,0,0,2.48e-06,2.91e-06,0,2.8e-06,0,0,2.66e-06,2e-06,2.39e-06,2.58e-06,2.31e-06,2.9e-06,3.21e-06,2.05e-06,2.63e-05,2.4e-06,2.85e-06,3.1e-06,2.58e-06,2.66e-06,2.31e-06,2.46e-06,2.32e-06,2.3e-06,2.07e-06,3.48e-06],"winrateAvg":0.830246,"leadAvg":0.685749,"scoreMeanAvg":1.11852,"scoreStdevAvg":4.42603,"shorttermWinlossErrorAvg":0.202095,"shorttermScoreErrorAvg":0.742892,"ownership":[-100,-100,-90,-35,-23,52,77,12,-53,-100,-100,-99,-98,-82,-82,87,97,97,-100,-100,-100,-100,31,33,99,99,-100,-100,-100,-99,-99,-100,97,97,97,97,-100,-100,-100,-100,-100,99,99,99,-100,-100,-100,-99,-97,-100,-100,97,97,96,-99,-100,-100,99,-100,99,98,99,99,-100,-100,-98,-98,-99,-100,97,98,90,-67,-100,-100,99,99,99,99,93,75,72,-33,-96,-97,-98,-100,-100,98,19,-10,-32,99,99,54,-25,31,44,93,19,27,-93,-96,-98,-100,98,98,-80,36,95,61,25,-17,2,4,22,-10,-42,-99,-95,-96,-97,-95,-99,-99,-78,19,0,-93,-41,-38,-37,-30,-42,-98,-98,-23,-100,-100,-100,12,28,-4,-28,-25,-50,-69,-97,-98,-97,-97,-46,-47,99,99,99,99,99,99,99,34,-26,-39,-46,-76,97,96,100,100,51,99,68,47,48,40,-39,-99,-99,-99,-58,26,-46,100,94,97,95,96,99,23,-23,-19,32,7,-6,-95,-95,-95,-90,43,100,100,100,92,94,91,-64,-100,-100,-100,-28,40,-100,-96,-92,-95,-91,97,99,100,100,65,100,100,100,-100,-100,99,-99,-23,-100,-97,-96,-95,-92,97,98,98,55,25,-80,100,100,100,-100,99,-99,-79,-93,-97,-97,-99,47,98,98,98,99,11,-83,-91,100,100,-100,98,-22,-51,-100,-100,-100,-34,64,98,98,98,98,99,-99,-91,-97,100,-100,98,99,-45,-84,99,-100,-16,97,97,97,97,96,99,-99,-99,-98,-99,-100,98,96,98,100,99,100,100,97,97,97,96,96,-61,-73,-94,-98,-91,-25,-7,87,96,99,99,99,99,98],"ownershipAllowedMAE":0.0266198})%"); + lines.push_back(R"%({"sample":{"board":".................../XOXX.........OOX.../O.OX.......OOXOXX../..OX.....O...XXO.../..OX.........OO..X./OOX................/.X.X............O../.................../.................../.................X./..............X.X../...O.......X.X..OO./..OXX....O.X.XO.O../.O..........OXO.XX./...X.....XXO.OX..../..OXX...OOXXOOOO.O./..OXOO.X....XXO..../...X...XOX....O..../.................../","hintLoc":"null","initialTurnNumber":71,"metadata":"9B5E5DD48D02BA8F23596AD02F2D795A:81","moveLocs":["H8","H6","J11","A16","C12","C10","C13","D14","B12","B17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":15.5,"policyOptimism":0.0,"pda":-0.547,"policyMixture":[3.26e-06,2.49e-06,1.84e-06,1.83e-06,1.96e-06,2.19e-06,2.4e-06,2.4e-06,2.2e-06,1.9e-06,1.7e-06,1.57e-06,1.57e-06,1.79e-06,3.03e-06,9.48e-05,5.28e-06,5.53e-06,1.68e-06,0,0,0,0,3.1e-06,6.36e-06,7.55e-06,7.48e-06,6.07e-06,3.94e-06,2.49e-06,2.2e-06,2.04e-06,0,0,0,3.9e-06,4.16e-05,2.77e-06,0,0,0,0,2.79e-06,7.06e-06,3.8e-05,3.83e-05,7.96e-06,3.83e-06,2.74e-06,0,0,0,0,0,0,1.79e-05,3.16e-06,0,1.47e-05,0,0,2.73e-06,7.2e-06,3.45e-05,3.38e-05,6.51e-06,0,3e-06,2.89e-06,1.05e-05,0,0,0,0.0174,1.2e-05,2.9e-06,1.69e-06,5.74e-06,0,0,3.01e-06,8.83e-06,2.78e-05,3.07e-05,8.2e-06,5.08e-06,4.3e-06,3.95e-06,3.34e-06,0,0,3.65e-05,0.000458,0,3.94e-06,0,0,0,0,3.88e-06,2.28e-05,3.99e-05,4.16e-05,1.83e-05,7.8e-06,6.23e-06,5.36e-06,4.76e-06,3.56e-06,4.22e-06,1.47e-05,2.12e-05,0.000167,2.99e-06,5.58e-06,0,0,0,1.76e-05,0.000103,9.2e-05,7.5e-05,3.86e-05,1.64e-05,8.78e-06,8.73e-06,8.39e-06,8.48e-06,1.35e-05,8.67e-06,0,6.49e-06,2.88e-06,4.61e-06,0,0,0.0027,0.000325,0.000449,0.000205,6.95e-05,1.06e-05,2.57e-05,3.61e-05,3.42e-05,3.71e-05,4.58e-05,3.43e-05,1.17e-05,5.53e-06,7.96e-06,2.57e-06,9.1e-05,4.51e-05,0.00589,0.139,0.0104,0.000841,0.000318,1.89e-05,0,9.53e-06,7.97e-05,7.01e-05,5.39e-05,5e-05,3.02e-05,1.23e-05,4.4e-05,6.29e-06,2.72e-06,0.000133,0.269,0,0.0573,0.024,0.000912,0.000241,5.13e-05,1.16e-05,3.15e-05,8.44e-05,5.6e-05,2.39e-05,2.52e-05,1.49e-05,0.000248,8.5e-06,0,3.54e-06,2.85e-05,0.000423,0.45,0.000751,0.00164,0.000775,0.000103,9.71e-06,1.57e-05,7.45e-05,0.000114,7.32e-06,4.89e-06,5.32e-06,0,0.000117,0,7.06e-05,3.33e-06,5.3e-06,0.000367,0.000836,0,0.00458,0.000173,2.88e-05,0,6.3e-06,7.94e-06,6.18e-06,0,1.17e-05,0,9.51e-05,1.89e-05,0,0,3.47e-06,3.1e-06,4.19e-06,0,0,0,8.61e-05,4.24e-05,7.79e-05,5.74e-06,0,4.28e-06,0,2.58e-05,0,0,1.27e-05,0,3.25e-06,3.65e-06,2.03e-06,0,4.89e-06,7.28e-05,5.07e-05,1.3e-05,0.000292,0,0.00174,9.24e-06,4.44e-05,1.75e-05,0,0,0,6.79e-06,0,0,3.2e-06,2.09e-06,4.47e-06,9.93e-06,0,2.94e-06,8.94e-06,5e-05,9.49e-05,0.000574,0,0,0,2.31e-06,0,0,4.68e-06,3.95e-06,3.22e-06,2.75e-06,2.75e-06,3.32e-06,0,0,0,8.31e-06,8.03e-06,7.07e-05,0,0,0,0,0,0,0,0,2.25e-06,0,1.76e-06,2.8e-06,5.05e-06,0,0,0,0,4.36e-06,0,5.41e-05,0.000368,0.000369,0.000243,0,0,0,1.64e-06,1.84e-06,1.85e-06,1.4e-06,3.36e-06,9.83e-06,0.000383,0,4.23e-06,2.77e-06,4.3e-06,0,0,0,0.00267,0.000118,6.74e-06,5.12e-06,0,1.54e-06,1.77e-06,1.87e-06,1.43e-06,1.84e-06,7.46e-06,7.34e-06,8.17e-06,3.36e-06,2.62e-06,2.52e-06,3.37e-06,3.6e-06,2.88e-05,3.46e-06,6.05e-06,4.6e-06,3.94e-06,2.1e-06,1.35e-06,1.4e-06,1.44e-06,1.19e-06,6.43e-06],"winrateAvg":0.992185,"leadAvg":10.0623,"scoreMeanAvg":11.2674,"scoreStdevAvg":9.74395,"shorttermWinlossErrorAvg":0.028093,"shorttermScoreErrorAvg":1.43514,"ownership":[-97,-98,-97,-90,-75,-50,-27,-1,23,45,64,79,86,80,26,9,-50,-57,-65,-98,-96,-100,-100,-69,-45,-23,0,27,47,66,83,91,98,98,-83,-69,-71,-72,-94,-97,-10,-100,-59,-30,-12,2,31,52,65,99,99,80,97,-83,-83,-80,-76,-95,-39,-9,-100,-53,-24,-12,5,15,87,44,63,84,79,71,81,2,-81,-78,-20,-6,-11,-100,-49,-21,-10,1,14,17,30,32,57,97,97,27,-17,-87,-63,84,82,-99,-100,-45,-17,-8,0,8,16,16,23,28,38,18,-24,-27,-43,-48,86,83,88,-99,-38,-13,-3,6,13,16,13,13,16,20,11,-15,18,-30,-35,82,89,88,-6,-17,-3,5,13,25,18,10,7,8,17,0,-16,-21,-33,-40,80,68,32,1,-8,-1,9,23,80,23,2,-1,-5,-5,-13,-20,-19,-40,-53,76,76,-13,6,-13,-4,4,21,29,15,6,-9,-14,-19,-32,-33,-54,-86,-59,75,67,72,5,-10,-7,-3,20,16,11,7,-23,-33,-54,-92,-56,-86,-29,-34,77,78,72,74,-40,-18,2,58,8,-2,-26,-94,-65,-95,-8,13,88,88,20,81,82,93,-94,-94,-33,-22,-6,-9,40,-28,-94,-14,-95,89,71,88,79,74,80,94,-1,-48,-68,-54,-46,-91,-36,-31,-37,-26,82,-95,89,84,77,74,80,79,82,-24,-98,-81,-70,-76,-81,-82,-97,-97,75,77,100,89,92,91,91,90,68,77,84,-98,-98,-86,-85,-83,-72,-72,-97,-97,100,100,100,100,96,99,95,48,54,83,-98,-80,-79,-88,-96,-85,-82,-80,-81,-76,-72,100,98,97,97,97,34,3,38,-98,-89,-87,-88,-96,-78,-90,-58,-35,-18,25,100,96,97,97,97,8,-7,-64,-65,-88,-88,-90,-89,-87,-77,-60,-21,7,57,79,95,96,97,97],"ownershipAllowedMAE":0.0348457,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".................../...X...OX.....XX.../..X..XXOX....X.XOO./..XOO.OX......XOXX./.OXXO.OXX...XXOOO../.OXXOXXOXO.OOO...../OX.XOXOOOX....O..../.XXOOX...XXX.X...../OXO..X..XOO......../.O.O..X.OX...XO..../..............O.O../...OOX............./....X............X./..O.....O........OO/...O.....OO....OOX./..OXX..OOX.O..OOXX./.XXO.X.OXX.XO.OXX../.OO.OXOXOX.XX..OX../.....X.X.........../","hintLoc":"null","initialTurnNumber":136,"metadata":"854A89F6E857224908DCFCC7F61B6FF7:146","moveLocs":["K9","O2","O9","O8","N8","O7","M15","T3","T2","S2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.35,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":4.5,"policyOptimism":0.0,"pda":1.675,"policyMixture":[5.32e-05,5.41e-05,5.59e-05,5.48e-05,5.68e-05,5.62e-05,5.52e-05,5.95e-05,5.45e-05,5.41e-05,5.21e-05,5.19e-05,5.17e-05,5.29e-05,5.27e-05,5.58e-05,6.54e-05,6.95e-05,5.76e-05,5.74e-05,5.89e-05,5.48e-05,0,5.82e-05,5.58e-05,6.09e-05,0,0,5.44e-05,5.5e-05,5.35e-05,5.36e-05,5.25e-05,0,0,0.00054,0.00185,8.17e-05,5.88e-05,5.93e-05,0,5.78e-05,6.21e-05,0,0,0,0,5.4e-05,5.65e-05,5.52e-05,5.31e-05,0,4.98e-05,0,0,0,9.32e-05,6.84e-05,7.32e-05,0,0,0,6.51e-05,0,0,6.48e-05,6.11e-05,6e-05,5.5e-05,4.97e-05,5.44e-05,0,0,0,0,0.000127,6.26e-05,0,0,0,0,6.52e-05,0,0,0,8.14e-05,6.3e-05,0,0,0,0,0,0,0.00894,8.07e-05,0.00085,0,0,0,0,0,0,0,0,0,0.00232,0,0,0,0.000264,0.000216,0.000168,0.000237,8.13e-05,0,0,0.014,0,0,0,0,0,0,0,5.83e-05,5.98e-05,6.35e-05,9.35e-05,0,0.00368,0.000223,0.0153,8.4e-05,3.81e-05,0,0,0,0,0,5.77e-05,5.72e-05,5.96e-05,0,0,0,6.27e-05,0,0.0161,0.00332,0.000655,0.000151,7.61e-05,0,0,0,0.000115,0.00215,0,5.51e-05,5.86e-05,0,0,0,6.61e-05,7.44e-05,0.00011,0.00627,0.0448,0.00597,0.000292,7.61e-05,0.00133,0,0.000436,0,0.000853,6e-05,0,6.13e-05,0,0,6.37e-05,6.89e-05,6.79e-05,0,0,0.000411,0.153,0.000127,7.81e-05,0.000362,0.000118,0.0079,0.000207,0.00327,0.000208,6.3e-05,6.46e-05,6.89e-05,0,6.55e-05,7.69e-05,7.05e-05,0,0,0.000471,0,0.0667,7.26e-05,7.69e-05,9.64e-05,0.000251,0,0,0,6.82e-05,7.1e-05,7.68e-05,7.4e-05,7.99e-05,7.68e-05,0,0,0.00102,0.000181,0.0848,0.00012,7.53e-05,7.76e-05,0.00012,0.000506,0.00323,0,7.4e-05,7.45e-05,7.75e-05,7.56e-05,8.55e-05,8.24e-05,8.1e-05,0.0334,0,7.94e-05,0.00135,0.000282,0,8.97e-05,8.57e-05,0.000174,0,0.000102,0.000133,7.1e-05,7.5e-05,7.21e-05,0,6.03e-05,7e-05,0.000218,9.48e-05,9.49e-05,9.82e-05,8.57e-05,0.00656,0,0,8.58e-05,0.00274,0.000207,0,0.000646,6.66e-05,7.32e-05,8.34e-05,7e-05,0,0,0.000109,0.00027,8.17e-05,5.99e-05,0,0,0,7.92e-05,7.79e-05,0.0052,0,0,0,6.12e-05,6.26e-05,0,0,0,9.62e-05,0,0.00389,6.7e-05,0,0,0,0,6.31e-05,0.000119,0,0,0,0.000882,0,6.63e-05,0,0,0,5.29e-05,0,0,8.44e-05,0,0,0,0.000199,0,0.000132,0,0,0.000277,0,0,0,0,0,0,5.19e-05,0,0,0,0.000269,0,0,0,0,5.74e-05,0.000145,8.31e-05,0.00242,0.00126,0,6.35e-05,0,5.75e-05,5.24e-05,5.13e-05,5.41e-05,5.95e-05,0.0117,0.00057,0.0554,7.22e-05,0.408,4.2e-05,5.51e-05],"winrateAvg":0.97055,"leadAvg":6.03718,"scoreMeanAvg":6.99487,"scoreStdevAvg":7.09866,"shorttermWinlossErrorAvg":0.0758752,"shorttermScoreErrorAvg":1.3224,"ownership":[-76,-86,-91,-92,-91,-91,-94,-95,-94,-88,-84,-86,-90,-94,-94,-78,-59,-21,-3,-62,-83,-93,-98,-86,-92,-95,-94,-99,-85,-82,-84,-90,-96,-99,-99,-19,-22,30,-46,-79,-98,19,19,-96,-97,-95,-99,-69,-71,-79,-84,-99,-96,-99,82,83,63,-33,-27,-99,98,98,26,90,-99,-97,-20,-63,-71,-83,-94,-96,99,84,83,86,15,58,-99,-99,99,31,90,-100,-99,23,45,-96,-97,-97,99,99,99,90,88,61,61,-99,-99,98,-99,-99,-94,-99,62,59,98,98,98,95,86,83,90,85,86,-93,-92,-99,98,-99,-93,-93,-93,-99,-32,-1,18,10,98,71,78,74,79,89,-93,-91,98,98,-99,-96,-95,-96,-99,-99,-99,-51,-86,-9,66,74,77,75,93,-92,99,95,-31,-99,-93,-84,-98,-76,-72,-84,-58,-34,18,67,73,77,76,93,98,97,99,2,-42,-98,-76,-49,-96,-79,-68,-64,-84,98,76,76,80,79,95,95,89,90,17,-2,-47,-40,-55,-95,-43,-48,-55,-86,98,86,96,87,85,96,96,95,98,97,-76,-27,-5,-4,-11,-3,-19,-65,96,89,91,86,90,88,96,96,93,8,-49,-5,0,5,28,12,12,3,-25,95,88,87,94,85,91,96,97,99,36,-11,-3,3,28,97,56,40,20,41,64,82,89,92,96,95,95,92,98,98,-23,-28,-1,26,92,98,98,62,56,64,84,100,100,-26,23,93,91,98,-95,-95,-46,27,95,96,-99,-8,90,40,74,100,100,-26,-26,-20,92,90,89,92,-42,-98,72,95,-99,-99,-56,-99,48,47,100,-25,-24,-23,-21,87,93,93,90,91,-98,71,-99,-98,-99,-98,-99,-99,98,94,94,-21,-26,-21,74,56,24,-11,-47,-98,-95,-99,-99,-98,-98,-90,-20,4,70,3,-11,-19,-29],"ownershipAllowedMAE":0.0359925,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":".O................./XXO.O.......OX.XO../XOXO....O..OXX.XOX./..XO..O.O.O.O.XOXXX/..XO..OX.X...O.OOX./.XOXX.XO...XXO..OX./.XO...XOOX.XO.O.OOX/.XO...XXOOOXXOO..X./.OXX...OXXOOOXXXXX./.O......OX.....OOXO/.OXX....X.XOOX...O./.OX........XO....../.OOXO.X.XX.X....O../..OXX..O.O.X.....O./OOXX.OO........OXOX/XXX.XXXO.O...O.OOX./...OO.X...O..OXXXX./......X.O....OOX.OO/...............X.X./","hintLoc":"null","initialTurnNumber":167,"metadata":"251A925CF9E9E7D91D7F0559D387D1D6:177","moveLocs":["O8","P9","Q8","O6","R2","T4","M18","P8","F15","Q6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0button1","komi":5.5,"policyOptimism":0.0,"pda":0.828,"policyMixture":[1.6e-05,0,1.53e-05,1.4e-05,1.39e-05,1.41e-05,1.4e-05,1.42e-05,1.44e-05,1.42e-05,1.42e-05,1.46e-05,1.45e-05,6.07e-05,1.74e-05,9.1e-05,1.54e-05,1.55e-05,1.52e-05,0,0,0,1.45e-05,0,1.44e-05,1.43e-05,1.38e-05,1.42e-05,1.38e-05,1.39e-05,0,0,0,2.15e-05,0,0,0.000236,2.94e-05,0,0,0,0,1.43e-05,1.43e-05,1.45e-05,1.37e-05,0,1.38e-05,1.45e-05,0,0,0,1.43e-05,0,0,0,1.44e-05,0.00015,0.000376,0,0,1.43e-05,1.41e-05,0,1.46e-05,0,1.44e-05,0,1.4e-05,0,2.79e-05,0,0,0,0,0,1.46e-05,0.000497,0,0,1.58e-05,0,0,0,1.56e-05,0,1.47e-05,1.49e-05,1.73e-05,0,1.54e-05,0,0,0,1.29e-05,1.53e-05,0,0,0,0,9.46e-05,0,0,1.34e-05,1.39e-05,1.58e-05,0,0,0,1.43e-05,1.44e-05,0,0,0.000591,1.57e-05,0,0,1.42e-05,1.51e-05,1.36e-05,0,0,0,0,1.52e-05,0,0,1.56e-05,0,1.5e-05,0,0,0,1.61e-05,0,0,1.34e-05,1.46e-05,1.42e-05,0,0,0,0,0,0,0,0,0,1.5e-05,1.41e-05,0,2.41e-05,1.61e-05,0,0,0,1.38e-05,1.41e-05,1.5e-05,0,0,0,0,0,0,0,0,0,0,0,1.64e-05,1.47e-05,0,2.77e-05,1.56e-05,1.29e-05,1.36e-05,1.35e-05,1.42e-05,0,0,0.000375,1.39e-05,1.53e-05,0.000162,0.000139,0,0,0,0,1.29e-05,0,0,0,1.36e-05,1.37e-05,1.37e-05,1.44e-05,0,8.16e-05,0,0,0,0,0,0.00178,1.88e-05,0,1.6e-05,1.43e-05,0,0,1.38e-05,1.37e-05,1.33e-05,1.4e-05,1.4e-05,1.4e-05,1.46e-05,1.38e-05,0,0,0,0,0,1.67e-05,4.64e-05,1.63e-05,1.44e-05,0,0,0,0,1.55e-05,0,2.51e-05,0,0,1.36e-05,0,1.47e-05,2.66e-05,0.00105,0.0771,0,1.74e-05,1.63e-05,1.48e-05,1.48e-05,0,0,0,2.19e-05,1.46e-05,0,1.48e-05,0,1.43e-05,0,1.6e-05,0,0.0514,0,0.485,0,0.00434,0,0,0,0,8.85e-05,0,0,1.49e-05,1.52e-05,1.56e-05,1.45e-05,1.51e-05,2.54e-05,0.126,0.00405,0,0,0,0,0,0,0,2.16e-05,0,0,0,0,1.58e-05,0,1.53e-05,1.53e-05,1.55e-05,0,0.244,0,0,0,0,1.38e-05,1.35e-05,1.37e-05,0,0,1.31e-05,0,1.44e-05,1.47e-05,1.58e-05,0,1.58e-05,1.62e-05,0,0,0,0,0,1.14e-05,1.42e-05,1.33e-05,1.32e-05,1.38e-05,1.38e-05,1.42e-05,0,1.92e-05,0,1.51e-05,1.56e-05,1.55e-05,1.56e-05,0,0,0,0,0,0,1.48e-05,1.41e-05,1.35e-05,1.42e-05,1.41e-05,1.43e-05,1.73e-05,1.75e-05,1.53e-05,1.5e-05,1.56e-05,1.51e-05,1.53e-05,1.49e-05,0.000387,0,2.53e-05,0,1.26e-05,1.49e-05],"winrateAvg":0.289894,"leadAvg":-0.823807,"scoreMeanAvg":-1.23267,"scoreStdevAvg":5.93821,"shorttermWinlossErrorAvg":0.275037,"shorttermScoreErrorAvg":1.31692,"ownership":[-51,97,97,99,99,99,99,99,99,99,99,96,39,5,-84,-94,-96,-96,-97,-99,-98,98,99,100,99,99,99,99,99,99,100,100,-96,-91,-97,-96,-96,-98,-99,-98,-99,100,99,99,99,99,100,99,99,100,-96,-96,-86,-97,-96,-99,-98,-98,-99,-99,100,98,99,100,98,100,98,100,99,99,-28,-84,99,-99,-99,-99,-94,-98,-99,100,27,100,100,94,94,93,96,97,98,99,15,98,99,-99,-98,-80,-99,-96,-99,-98,55,-99,97,95,95,95,93,93,99,93,91,98,-99,-95,-40,-99,-97,-98,-96,-95,-99,97,97,94,95,93,97,96,99,64,98,98,-95,34,-99,-97,-98,-97,-97,-99,-99,97,97,97,93,93,99,99,-40,-8,-99,-94,50,99,-100,-100,-98,-97,-98,-97,-99,-99,97,97,97,-99,-99,-99,-99,-99,-51,97,98,68,-95,-98,-98,-98,-98,-98,-99,7,70,28,-32,-59,90,91,-99,81,98,98,-100,-100,-98,-98,-97,-97,-100,-98,-99,94,95,-99,-99,-77,91,95,82,98,98,-100,-99,-98,-97,-97,-97,-97,-97,-96,-100,94,95,-99,13,18,86,80,98,98,98,-100,-97,-97,-99,51,-100,-100,-52,-100,-38,-41,-65,-61,98,89,77,98,98,98,-100,-100,37,-35,97,-45,74,-3,-100,-54,-96,-22,-83,96,98,31,97,98,-100,-100,52,96,96,95,76,53,-21,-56,-3,21,37,98,96,98,-96,-100,-100,-100,-99,-100,-100,-100,96,85,99,14,-46,-3,100,68,98,98,-97,-97,-99,-99,-99,-98,-97,-98,-100,14,83,94,99,63,45,99,-98,-98,-98,-98,-9,-99,-99,-99,-98,-98,-97,-100,-64,97,93,96,96,93,100,99,-98,85,88,89,-99,-99,-98,-98,-98,-97,-80,-21,72,90,95,96,95,87,4,-98,-92,-96,-7],"ownershipAllowedMAE":0.0340686})%"); + lines.push_back(R"%({"sample":{"board":".....OXX.X.O.XXOOX./.....OXOXXXXXXOOO.O/.....OOOOOOOOXOXOOO/...O.........OXXXO./..O..........O..XXO/.OXX...........XOXX/.X................./.................../..X.X............../................O../.XOOO............../..XXO..........XO../.X..............O../........OXX......../..XO..O.O...X...O../..O.O.X.OXX..O.OX../...O...XOOXXO.X.X../........XXOOXXOX.../.................../","hintLoc":"null","initialTurnNumber":82,"metadata":"48E77D4C763E21E52332923B0F24ABA1:92","moveLocs":["T16","D11","D12","T15","T19","S5","B5","K7","L7","K8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.71,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.67e-06,3.54e-06,3.26e-06,3.39e-06,2.98e-06,0,0,0,1.77e-06,0,2.5e-06,0,2.05e-06,0,0,0,0,0,0,3.66e-06,4.59e-06,4.87e-06,5.21e-06,3.99e-06,0,0,0,0,0,0,0,0,0,0,0,0,9.45e-07,0,3.6e-06,5.6e-06,8.53e-06,1.07e-05,7.51e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.13e-06,6.11e-06,1.05e-05,0,0.000535,6.2e-06,4.76e-06,4.47e-06,4.31e-06,4.19e-06,4.18e-06,4.51e-06,1.12e-05,0,0,0,0,0,0.0211,6.36e-06,0.0221,0,0.00502,1.6e-05,3.59e-05,2.57e-05,1.32e-05,1.02e-05,9.16e-06,8.62e-06,1.85e-05,1.69e-05,0,7.41e-06,3.01e-06,0,0,0,1.23e-05,0,0,0,7.6e-06,4.99e-05,0.0001,7.03e-05,2.43e-05,1.76e-05,1.77e-05,2.35e-05,0.000162,0.0396,9.99e-06,0,0,0,0,4.74e-06,0,4.66e-06,4.47e-06,8.1e-06,3.27e-05,0.000208,0.000203,9.44e-05,6.67e-05,6.66e-05,9.09e-05,0.000213,0.000245,4.92e-05,6.5e-06,6.13e-06,4.25e-06,3.35e-06,4.04e-06,5.16e-06,5.15e-06,0,8.02e-06,0.000143,0.000663,0.000703,0.000188,0.000149,0.000154,0.00018,0.000223,0.000199,7.69e-05,3.34e-05,2.05e-05,1.8e-05,5.39e-06,4.07e-06,7.01e-06,0,0,0,8.99e-05,0.232,0.000742,0.000234,0.000201,0.000205,0.000245,0.000204,0.000138,0.000162,0.000145,0.00271,0.000118,6.36e-06,4.1e-06,8.77e-06,3.09e-05,1.74e-05,7.78e-06,0.00452,0.000125,0.000187,0.000145,0.000218,0.000197,0.000416,0.000168,0.000117,0.000107,0.000735,0,0.000159,7.5e-06,3.52e-06,0,0,0,0,9.07e-06,0.000126,0.000106,9.44e-05,1.38e-05,4.69e-05,0.0294,0.000212,8.66e-05,4.84e-05,0.00291,2.15e-05,2.69e-05,5.25e-06,3.51e-06,4.02e-06,0,0,0,9.29e-06,7.86e-05,9.73e-05,1.27e-05,0,0.439,5.43e-05,8.35e-05,0.000121,1.42e-05,0,0,6.78e-06,4.47e-06,3.14e-06,0,6.1e-06,7.37e-05,0.0158,2.26e-05,3.52e-05,0.000112,3.97e-05,0,0,7.35e-06,2.85e-05,6.69e-05,5.09e-05,1.67e-05,0,5.56e-06,4.15e-06,3.81e-06,4.4e-06,1.01e-05,0.000317,8.26e-05,3.19e-05,5.24e-05,9.04e-06,0,0,0,4.48e-06,8.82e-06,7.28e-05,0.0109,3.92e-05,7.32e-06,7.11e-06,4.01e-06,4.48e-06,0,0,0,6.62e-06,0.0101,0,1.32e-05,0,6.04e-06,4.31e-06,4.42e-06,0,3.08e-05,3.89e-05,0.00468,0,0,4.82e-06,7.53e-06,8.75e-05,0,0,0,1.37e-05,0,1.04e-05,0,0,0,3.69e-06,6.25e-06,0,0.000179,0,0,1.59e-05,6.29e-06,6.81e-06,0.00283,7.23e-06,0,5.03e-06,2.42e-05,9.94e-06,0,0,0,0,0,0,8.32e-06,0,5.96e-06,0,6.08e-06,4.72e-06,5.22e-06,7.07e-06,1.05e-05,7.35e-06,1.77e-05,1.22e-05,0.144,2.47e-05,0,0,0,0,0,0,0,0,4.37e-06,5.14e-06,3.67e-06,2.75e-06,4.18e-06,4.24e-06,4.66e-06,4.44e-06,4.27e-06,4.19e-06,4.11e-06,3.05e-06,3.63e-06,4.73e-06,4.82e-06,3.08e-06,3.09e-06,4.21e-06,3.38e-06,3.46e-06,3.25e-06,2.75e-06,5.13e-06],"winrateAvg":0.149743,"leadAvg":-3.03065,"scoreMeanAvg":-4.13692,"scoreStdevAvg":8.51066,"shorttermWinlossErrorAvg":0.126067,"shorttermScoreErrorAvg":1.07111,"ownership":[82,85,87,90,93,100,80,-9,-5,-62,-62,-61,-62,-57,-58,-54,-56,-58,-60,79,83,86,86,81,100,88,100,-63,-61,-60,-59,-59,-59,-54,-54,-55,-54,-60,72,80,84,80,67,100,100,100,100,100,100,100,99,-57,-57,-96,-58,-58,-62,52,81,81,91,7,36,42,47,50,53,54,62,80,91,-96,-97,-97,-61,-80,39,32,83,-42,-13,-1,9,18,25,28,31,33,40,90,4,-66,-97,-98,-78,-13,27,-92,-93,-34,-14,0,8,16,21,22,20,17,-18,-22,-89,-30,-97,-98,-28,-75,-70,-61,-32,-17,-6,2,10,14,14,9,-2,-4,-2,-31,-33,-45,-75,-57,-52,-69,-91,-51,-32,-9,1,8,10,9,5,0,-5,-7,-11,-13,-14,-39,-68,-76,-89,-6,-80,-1,-30,3,9,10,7,2,-2,-2,-3,4,4,16,2,-74,-62,-10,-8,22,13,8,14,15,15,10,0,-2,-2,1,12,85,53,35,-77,-90,83,82,83,30,24,23,27,36,12,1,-3,-3,-1,6,44,68,61,-85,-88,-91,-89,83,47,38,36,43,83,-29,-15,-10,-5,-1,-33,92,81,76,-83,-94,-28,27,26,51,45,47,66,83,-95,-25,-18,-8,8,30,92,86,80,-79,-73,5,23,39,43,40,52,84,-95,-96,-44,-32,-14,-16,28,60,83,78,-58,-83,-80,84,52,24,68,38,84,24,-81,-58,-86,-22,3,34,90,91,49,-41,48,81,76,88,27,-79,0,84,-97,-98,-63,-33,20,-2,41,-81,12,29,3,4,53,89,51,18,-44,-90,85,82,-98,-98,-1,-35,-91,17,-82,-40,-11,14,29,36,60,11,-5,-65,-89,-95,-95,-92,-93,-99,-99,-87,-95,-76,-60,-32,25,29,36,29,13,-23,-54,-71,-82,-91,-95,-96,-96,-95,-94,-90,-80,-68,-53],"ownershipAllowedMAE":0.0370892})%"); + lines.push_back(R"%({"sample":{"board":"..O................/.O.OX............../.OOXXX.O.X..OX...../..OOX.XO.OO.OX.X.../X.XXOOXO....O....../.X.X.OXXXX.X...X.../X.X.XO.OOOXXOO...../...O.OO.OXX.XX...../OXXO...OXO........./.O.O....XO........./..OX....O......OX../..XO........O....../..O................/...O.............../.................../..O.XX...X.....X.../...OOX.....O.X...../.........X........./.................../","hintLoc":"null","initialTurnNumber":94,"metadata":"614F9D99762DBC72C238940A2F0C9FAC:104","moveLocs":["Q10","R8","P9","Q8","R10","O15","P13","O18","P18","Q18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.27,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":-7.5,"policyOptimism":0.947,"pda":-2.072,"policyMixture":[1.25e-06,1.62e-06,0,7.6e-06,0.00026,8.5e-06,3.05e-06,4.12e-06,2.37e-06,1.95e-06,1.52e-06,1.59e-06,2.18e-06,0.132,0.114,2.4e-06,1.78e-06,1.64e-06,1.03e-06,3.75e-06,0,0,0,0,1.54e-06,1.87e-05,2e-05,1.52e-05,2.83e-06,2.09e-06,3.11e-06,0.442,0,0,0,5.77e-05,3.35e-06,1.46e-06,2.99e-06,0,0,0,0,0,3.27e-06,0,3.65e-05,0,1.95e-06,1.78e-06,0,0,0.108,0.076,7.4e-05,5.05e-06,1.44e-06,1.53e-06,1.52e-06,0,0,0,1.64e-06,0,0,5.34e-05,0,0,2.24e-06,0,0,0.00218,0,5.93e-06,3.45e-06,1.44e-06,0,1.52e-06,0,0,0,0,0,0,6.18e-05,1.52e-06,1.58e-06,2.2e-06,0,0,2.61e-06,1.98e-06,2.61e-06,2.32e-06,1.28e-06,1.05e-06,0,9.18e-07,0,1.27e-06,0,0,0,0,0,1.3e-06,0,2.5e-06,2.44e-06,1.83e-06,0,1.71e-06,1.94e-06,1.17e-06,0,1.15e-06,0,1.38e-06,0,0,7.01e-06,0,0,0,0,0,0,0,0,1.35e-06,1.61e-06,1.63e-06,1.1e-06,1.59e-06,1.53e-06,1.47e-06,0,2.14e-06,0,0,0,0,0,0,1.5e-06,0,0,1.64e-06,1.53e-06,1.39e-06,1.58e-06,1.11e-06,0,0,0,0,1.91e-06,1.54e-06,1.7e-06,0,0,0,1.33e-05,2.99e-06,1.9e-06,1.68e-06,2.14e-06,1.35e-06,1.21e-06,1.5e-06,1.06e-06,1.58e-06,0,0.000234,0,1.67e-06,2.42e-06,5.7e-06,0.000737,0,0,8.19e-05,2.37e-05,5.76e-06,5.08e-06,3.76e-06,0,0,1.95e-06,1.36e-06,1.39e-06,5.55e-05,0,0,6.55e-06,2.78e-06,7.06e-06,1.57e-05,0,2.39e-05,7.03e-05,4.85e-05,2.28e-05,7.45e-05,0,0,0,3.28e-06,1.68e-06,1.29e-06,9.48e-06,0,0,0.000239,2.79e-06,6.67e-06,9.32e-06,2.01e-05,1.98e-05,3.05e-05,3.66e-05,0,4.77e-05,0.0265,0,0,1.39e-05,1.64e-06,1.08e-06,1.87e-06,0,1.31e-05,4.53e-06,5.33e-06,1.44e-05,2.27e-05,2.71e-05,4.58e-05,8.27e-05,8.7e-05,7.11e-05,0.0472,1.16e-05,4.44e-06,4.92e-06,2.06e-05,1.75e-06,1.05e-06,1.7e-06,2.3e-06,0,1.16e-05,7.4e-06,1.88e-05,2.38e-05,8.06e-05,8.69e-05,0.000158,0.000146,0.000192,0.000189,0.000215,0.000664,0.000973,4.92e-05,2.2e-06,1.14e-06,2.08e-06,3.77e-05,0.000146,1.61e-06,2.09e-06,4.5e-06,2.37e-05,4.31e-05,1.21e-05,0.000112,0.000918,0.000106,0.000216,5.9e-05,4.09e-05,0.0332,0.0019,2.71e-06,1.13e-06,2.3e-06,0,7.19e-05,0,0,2e-06,4.92e-06,4.14e-06,0,1.18e-05,2.01e-05,5.29e-05,8.9e-06,1.08e-05,0,0.00848,0.000663,2.6e-06,1.19e-06,2.1e-06,4.94e-06,0,0,0,2.06e-06,3.79e-06,3.38e-06,2.63e-06,4.21e-06,0,3.91e-06,0,4.78e-06,1.95e-05,0.000158,4.12e-05,1.94e-06,1.18e-06,1.84e-06,2.29e-06,2.53e-06,1.35e-05,8.06e-06,4.43e-06,3.34e-06,2.39e-06,0,2.59e-06,3.52e-06,2.86e-06,3.1e-06,3.59e-06,4.98e-06,5.13e-06,3.84e-06,1.61e-06,1.04e-06,1.21e-06,1.38e-06,1.65e-06,1.7e-06,2.07e-06,1.67e-06,1.53e-06,1.39e-06,1.28e-06,1.49e-06,1.43e-06,1.43e-06,1.53e-06,1.49e-06,1.54e-06,1.44e-06,1.55e-06,1.03e-06,4.51e-06],"winrateAvg":0.0434106,"leadAvg":-6.47546,"scoreMeanAvg":-8.5027,"scoreStdevAvg":11.0434,"shorttermWinlossErrorAvg":0.0735874,"shorttermScoreErrorAvg":1.84013,"ownership":[75,74,72,51,-44,-65,-31,-4,35,53,59,53,32,-6,-21,-20,-20,-24,-30,75,72,71,70,-90,-49,20,59,56,60,67,71,22,21,-54,-5,-33,-30,-35,41,74,73,-91,-91,-91,23,88,71,53,77,77,93,-72,-28,-52,-48,-43,-40,-7,24,75,75,-91,-60,-95,88,73,92,92,64,93,-59,-28,-91,-61,-54,-49,-95,-89,-97,-97,98,98,-96,87,-36,0,42,-36,93,93,15,-44,-64,-64,-58,-95,-97,-96,-97,-27,98,-96,-96,-96,-95,-92,-98,0,46,-2,-93,-74,-70,-65,-97,-95,-97,-25,-88,98,-10,95,94,94,-98,-98,85,85,-93,-79,-75,-73,-69,-64,-75,11,98,-36,98,98,93,95,-97,-98,-90,-98,-98,-84,-79,-76,-74,-69,68,-94,-94,97,76,82,84,96,81,90,-35,-1,-35,-54,-73,-78,-80,-74,-66,71,92,-26,97,75,69,69,84,80,91,10,-2,-8,-33,-56,-95,-95,-80,-45,85,88,95,65,67,55,50,58,93,48,15,11,7,-32,-71,45,-95,-31,-31,88,91,84,94,44,39,34,31,29,20,17,21,65,12,3,44,46,-2,-2,90,92,98,64,31,21,18,14,12,9,9,11,11,-15,8,6,9,12,6,89,88,85,94,1,7,4,4,-6,-5,2,8,4,-4,-4,-6,-12,-6,1,89,90,81,-8,-17,-17,1,-18,-25,-24,-7,11,-3,-13,-17,-26,-41,-16,-9,90,93,97,-14,-78,-78,-33,-30,-45,-87,-27,-8,-18,-23,-41,-90,-41,-18,-18,90,91,92,96,95,-78,-46,-51,-43,-57,-35,19,-25,-81,-55,-60,-51,-29,-24,88,87,85,83,36,-2,-44,-34,-58,-85,-31,-24,-30,-48,-52,-48,-45,-34,-29,85,82,74,52,32,-5,-30,-48,-60,-57,-44,-29,-33,-40,-46,-45,-40,-37,-33],"ownershipAllowedMAE":0.0405016})%"); + lines.push_back(R"%({"sample":{"board":".......X.........../....OXX.XO....X..O./...OXX.XO.O..OX.O../.O.OXOX.O.X..O.XXO./...XOO.XO.......XXO/..X....XO.O.X.X.XO./..X..O.X.........../.X.XO....O......X../.XXO....X........../.OOO..........O..X./......O........XXOX/...........X..X.OO./..X.OOOO..OX.X..O../...OXXXOX.XOX..O.O./..OX...X...O....OO./..OX....X.O..XXOXOX/..OX.O.....X.XOOXX./..OOX.......XOOOX../.............X.X.../","hintLoc":"null","initialTurnNumber":127,"metadata":"658969889C133A90A0EA95E129135F3A:137","moveLocs":["Q18","F11","E11","B15","C16","A10","A9","A11","B9","E3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.16,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.42e-06,6.27e-06,5.94e-06,7.11e-06,6.19e-06,5.1e-06,5.22e-06,0,6.34e-06,6.41e-06,6.54e-06,5.85e-06,6.1e-06,5.51e-06,6.21e-06,6.39e-06,6.3e-06,5.49e-06,5.71e-06,6.43e-06,6.76e-06,8.94e-05,5.88e-05,0,0,0,0,0,0,5.15e-06,6.13e-06,6.13e-06,1.29e-05,0,0,4.85e-06,0,5.61e-06,5.98e-06,6.25e-06,4.82e-06,0,0,0,0,0,0,5.03e-06,0,6.01e-06,5.86e-06,0,0,5.02e-05,0,5.1e-06,6.15e-06,7.16e-06,0,0,0,0,0,0,5.96e-05,0,5.87e-06,0,6.57e-06,6.19e-06,0,6.37e-06,0,0,0,5.64e-06,5.59e-05,0,0.00308,0,0,0,3.21e-05,0,0,5.47e-06,6.35e-06,6.7e-06,7.12e-06,7.13e-06,6.12e-06,5.34e-06,0,0,0,7.84e-06,2.03e-05,0,8.92e-06,8.46e-06,6.37e-06,5.61e-06,0,0,5.58e-06,0,6.83e-06,0,1.41e-05,0,6.3e-06,0,0,6.16e-06,0.00063,6.65e-06,0,9.59e-05,0.000112,0,6.02e-06,0,6.45e-06,5.96e-06,6.22e-06,7.39e-06,1.27e-05,8.1e-05,6.93e-06,8.45e-06,8.68e-06,1.03e-05,5.75e-06,5.49e-06,0,0,0,0,7.08e-06,7.37e-06,6.83e-06,6.25e-05,0,7.36e-06,2.9e-05,8.46e-06,7.19e-06,6.91e-06,6.9e-06,0,8.05e-06,5.95e-06,0,0,0,0,0,0,7.2e-06,7.38e-06,0,5.31e-05,3.02e-05,2.16e-05,7.73e-06,6.83e-06,6.36e-06,6.37e-06,9.5e-06,7.5e-06,5.83e-06,0,0,0,0,5.72e-06,6.17e-06,6.55e-06,7.36e-06,8.61e-06,3.23e-05,8.3e-05,1.06e-05,7.66e-06,6.01e-06,0,7.62e-06,1.16e-05,0,5.84e-06,0,0,5.1e-06,5.31e-06,5.58e-06,5.68e-06,0,6.37e-06,1.38e-05,6.52e-05,5.83e-05,8.94e-06,6.98e-06,6.18e-06,6.79e-06,0,0,0,0,4.98e-06,5.1e-06,5.25e-06,5.26e-06,5.34e-06,5.44e-06,5.51e-06,5.69e-06,1.41e-05,0.000372,8.23e-05,0,8.87e-06,6.45e-06,0,6.31e-06,0,0,5.67e-06,5.33e-06,5.25e-06,0,5.54e-06,0,0,0,0,0.000931,7.49e-05,0,0,1.3e-05,0,6.19e-06,5.33e-06,0,4.84e-06,5.28e-06,5.37e-06,5.4e-06,5.51e-06,0,0,0,0,0,0,0.0197,0,0,0,6.24e-05,1.01e-05,0,4.04e-06,0,5.15e-06,5.2e-06,5.32e-06,0,0,0.087,6.54e-06,0.238,0,1.33e-05,0.00197,5.74e-06,0,0.000118,9.27e-05,2.02e-05,0.021,0,0,5.7e-06,5.22e-06,5.32e-06,0,0,4.84e-06,0.231,1.47e-05,6.13e-06,0,6.86e-06,0,5.96e-06,0.000121,0,0,0,0,0,0,5.12e-06,5.35e-06,0,0,0,0,5.87e-06,1.95e-05,1.33e-05,1.05e-05,7.15e-06,0,5.96e-05,0,0,0,0,0,7.08e-06,5.24e-06,5.23e-06,0,0,0,0.392,6.43e-06,6.48e-06,6.16e-06,6.38e-06,6.38e-06,5.77e-06,0,0,0,0,0,6.3e-06,6e-06,5.18e-06,5.22e-06,5.4e-06,5.52e-06,4.96e-05,8.07e-06,5.71e-06,5.35e-06,5.51e-06,5.56e-06,5.76e-06,0.000291,7.5e-05,0,4.06e-06,0,0.000228,0.000117,4.92e-06,8.64e-06],"winrateAvg":0.601003,"leadAvg":-0.835951,"scoreMeanAvg":0.325102,"scoreStdevAvg":10.8834,"shorttermWinlossErrorAvg":0.332257,"shorttermScoreErrorAvg":2.57117,"ownership":[59,58,48,19,-56,-68,-91,-92,-38,36,51,22,-9,-58,-65,8,61,64,67,62,50,67,2,4,-96,-96,-88,-88,86,55,37,9,30,-96,68,65,72,64,66,61,67,81,-97,-97,-94,-95,90,83,87,45,32,66,-95,-30,70,67,64,35,81,80,80,-97,77,-94,-4,89,29,-9,19,14,67,-45,-99,-99,70,56,-2,-61,37,-59,76,76,-47,-93,89,45,30,-14,-20,-14,-30,-71,-99,-98,53,-67,-58,-89,-49,14,51,-13,-93,88,53,81,0,-84,-52,-93,-71,-98,9,0,-76,-85,-89,-33,7,89,-5,-93,-10,37,29,6,-15,-19,-43,-58,-61,-12,-44,-85,-88,-64,-67,99,49,0,-41,15,74,24,-3,-18,-29,-42,-54,-96,-68,-69,-87,-87,-87,99,99,-21,6,-20,-73,0,7,-6,-23,-36,-39,-51,-66,-70,-75,-86,99,99,99,59,23,9,-9,-17,-4,-2,-14,-28,-33,-11,-52,-73,-88,-68,99,99,95,86,68,53,88,15,-4,-3,-6,-26,-32,-43,-50,-95,-95,98,-66,96,95,94,92,82,71,56,26,0,-2,-16,-96,-51,-65,-97,0,98,98,72,95,94,90,93,98,98,98,98,-24,-32,15,-96,-88,-98,-11,55,98,98,97,96,95,95,97,-9,-3,-6,97,-80,-22,-35,-21,-96,-37,37,98,98,98,95,96,97,99,-67,-2,-1,-3,-90,-73,-39,-21,-20,-61,-41,16,96,98,98,67,97,98,99,-70,-38,-24,-51,-58,-92,-50,-17,-54,-60,-97,-97,96,-90,98,-80,97,98,99,-72,-73,-6,-40,-46,-61,-54,-55,-97,-94,-98,95,95,-89,-89,-80,97,97,99,98,-70,-18,-43,-47,-54,-59,-69,-84,-98,95,95,95,-88,-86,-85,97,96,93,51,0,-32,-34,-45,-50,-58,-66,-74,-91,-93,-90,-90,-88,-86,-86],"ownershipAllowedMAE":0.0436788})%"); + lines.push_back(R"%({"sample":{"board":".................../.XO......XXO......./.XOXX.X...O..O...../.XOXOX.X...O.O.OX../.OXXOOX.XOO.OX..X../O.OOOOOOOXXO.OOOOO./.O.XOXX.OXXXXXXX..O/..OXXOXOOOXXOXOXXXX/...X...OXXXOOOOOXOO/..OOX.XXOOO...XXOOX/..OXX.XOO...O.XOO.X/...OX.XXXOO..OXXOX./.OO.XXXOOO.O..X.OOX/.XOXXOOO.XXX..XOOX./X.XOO...XXO.XXXXOXX/.XXO.OOOXOO.OOXXX.X/..XOXOXXOO.O.OX...X/.X.XOXX.XXO.O.OXXX./..X.O..X..XX.O...../","hintLoc":"null","initialTurnNumber":187,"metadata":"20C5891BEF8E92D993D32C122BF71489:197","moveLocs":["H15","J16","L19","J17","A16","D18","G16","F17","A7","A17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000335,0.00821,0.00355,0.000328,0.000328,0.00033,0.000339,0.000406,0.00432,0.0092,0,0.0858,0.000352,0.000356,0.000348,0.000345,0.000342,0.000349,0.000306,0.00812,0,0,0,0.000317,0.000332,0.000349,0.00313,0.0416,0,0,0,0.000338,0.000345,0.000355,0.000369,0.000375,0.000365,0.000355,0,0,0,0,0,0,0,0.000444,0,0.0703,0,0.000359,0.000333,0,0.000332,0.000355,0.000395,0.000375,0.000351,0,0,0,0,0,0,0,0,0,0.00791,0.000433,0,0.000356,0,0.000344,0,0,0.000384,0.000371,0.0178,0,0,0,0,0,0.000938,0,0,0,0,0.000395,0,0,0.000353,0.000367,0,0.000399,0.000373,0,0.000923,0,0,0,0,0,0,0,0,0,0,0.0592,0,0,0,0,0,0.000389,0.000339,0,0.0102,0,0,0,0,0.00686,0,0,0,0,0,0,0,0,0.0118,0.0442,0,0.000336,0.000372,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000336,0.000424,0.0146,0,0.000358,0.00324,0.0176,0,0,0,0,0,0,0,0,0,0,0,0,0.000342,0.000333,0,0,0,0.000387,0,0,0,0,0,0.000392,0.000483,0.00472,0,0,0,0,0,0.000349,0.000336,0,0,0,0.000368,0,0,0,0.000334,0.000349,0.000362,0,0.000577,0,0,0,0.000288,0,0.000329,0.000331,0.000461,0,0,0.000331,0,0,0,0,0,0.00044,0.00511,0,0,0,0,0,0,0,0,0,0.00492,0,0,0,0,0,0,0.000917,0,0.145,0.0152,0,0.000247,0,0,0,0.00878,0,0,0,0,0,0,0,0.000468,0,0,0,0.000908,0.000431,0,0,0,0,0,0,0,0,0,0,0.000356,0.000473,0.00444,0,0,0,0.0576,0,0,0,0,0,0,0,0.000389,0,0,0,0.0397,0,0,0,0,0,0,0.000489,0,0,0,0,0,0.000323,0,0.000377,0.000319,0,0,0,0,0,0,0,0,0.000414,0,0.00016,0,0,0.000331,0.000319,0.000321,0,0.000363,0,0,0,0,0,0,0,0,0,0,0.0149,0,0.000239,0,0,0,0,0.000314,0.00032,0.000412,0,0.000245,0,0.209,0.00031,0,0.000324,0.0108,0,0,0.0102,0,0.00243,0.00276,0.000383,0.000329,0.000326,0.000349],"winrateAvg":0.000559938,"leadAvg":-10.4201,"scoreMeanAvg":-10.3731,"scoreStdevAvg":1.98155,"shorttermWinlossErrorAvg":0.0074564,"shorttermScoreErrorAvg":0.590946,"ownership":[-100,-100,-100,-100,-100,-100,-100,-99,-95,-77,99,99,99,99,99,99,99,98,98,-100,-100,-100,-100,-100,-100,-100,-99,-97,-99,-99,100,100,100,99,99,98,98,98,-100,-100,-100,-100,-100,-100,-100,-99,-100,33,100,100,100,100,99,99,99,98,98,-29,-100,-100,-100,100,-100,27,-100,-100,-49,94,100,100,100,99,100,98,98,99,-36,99,-100,-100,100,100,27,100,-100,100,100,96,100,99,100,99,98,99,99,100,99,100,100,100,100,100,100,100,-100,-100,97,59,100,100,100,100,100,99,99,100,45,-100,100,-100,-100,42,100,-100,-100,-100,-100,-100,-100,-100,-7,44,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,100,-100,100,-100,-100,-100,-100,100,100,-21,-100,-100,-100,-26,100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,54,-48,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,99,100,-19,-100,-100,-100,-100,-100,100,100,99,99,-100,-100,-100,-100,-100,100,100,97,93,98,-100,-100,-100,-100,-100,100,100,100,-66,-100,-100,-100,100,100,100,-1,99,59,-12,-100,-100,-100,-100,-100,54,-91,100,-100,-100,100,100,100,12,-100,-100,-100,-43,-64,-100,-100,-100,-100,-100,-98,-91,-100,100,100,99,70,-75,-100,-100,99,-50,-100,-100,-100,-100,-100,-100,-100,-98,-100,-100,100,99,100,100,100,-100,99,99,66,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,92,100,-100,-100,99,99,81,100,99,100,-100,-100,-100,-100,-100,-100,-100,-99,-99,94,-100,-100,-100,-100,-100,78,-19,100,96,96,-100,-100,-100,-100,-100,-100,-100,-78,89,36,-99,-100,-100,-97,-97,-95,65,99,27,-64,-98,-100,-100],"ownershipAllowedMAE":0.0186663})%"); + lines.push_back(R"%({"sample":{"board":".XXXXX...XXO.../OOXOXOXXX.XOOO./..OOXOOO.XOXXX./.O.OOOXX.XOOO../OOO.OOOXX.XO.O./OXXOXOOXOX...OX/XX.XXXXXOOOOOX./.......XOOXXXX./......OXOXX.XOO/.......XOOXOXO./...X.XXXOX.XOXO/.X..XOOXXX.XO../X.XXOO.OX.XOOO./.XOOXOO.OOXXXOX/.O.....O.....O./","hintLoc":"null","initialTurnNumber":161,"metadata":"DAA686AF81A6285D06860334D4793CAD:171","moveLocs":["L1","K11","M10","P11","P12","P9","K3","M1","K1","J13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.044,0,0,0,0,0,0.00939,0.000437,0.00736,0,0,0,0.000112,0.000561,0.000474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00176,0.000517,0.00121,0,0,0,0,0,0,0,0,0,0,0,0,0.0034,0.000434,0,0.00014,0,0,0,0,0,0,0,0,0,0,0.00521,0,0,0,0,0.207,0,0,0,0,0,0,0,0,0.000416,0,0,0,0,0,0,0,0,0,0,0,0,0.0251,0,0.000444,0,0,0,0,0.0153,0,0,0,0,0,0,0,0,0,0,0,0,0.000471,0.000549,0.0176,0.000453,0.000443,0.000447,0.000434,0,0,0,0,0,0,0,0.000126,0.00045,0.000489,0.000469,0.00046,0.000453,0.000456,0,0,0,0,0,0,0,0,0,0.000472,0.000496,0.000495,0.000463,0.000465,0.000441,0.000436,0,0,0,0,0,0,0,0.000268,0.000536,0.000536,0.000553,0,0.00753,0,0,0,0,0,0.000506,0,0,0,0,0.00537,0,0.000922,0.015,0,0,0,0,0,0,0.0301,0,0,0.131,0.000475,0,0,0,0,0,0,0.00049,0,0,0,0,0,0,0,0.000532,0.0991,0,0,0,0,0,0,0.000506,0,0,0,0,0,0,0,0.000633,0,0.124,0.00133,0.189,0.000656,0.000512,0,0.000458,0,0,0,0.0385,0,0.000531,0.000792],"winrateAvg":0.101454,"leadAvg":-0.779386,"scoreMeanAvg":-0.978561,"scoreStdevAvg":1.28216,"shorttermWinlossErrorAvg":0.146542,"shorttermScoreErrorAvg":0.469166,"ownership":[27,-100,-100,-100,-100,-100,-100,-100,-99,-100,-99,100,100,99,100,100,100,-100,100,-100,100,-100,-100,-100,-99,-100,100,100,100,99,100,100,100,100,-100,100,100,100,-100,-100,100,99,99,99,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,78,100,100,100,-100,-100,-100,-100,100,100,100,-100,100,-100,-100,80,-100,100,100,-100,100,-100,-9,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-99,-99,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-69,-100,-100,-100,-100,-100,-100,-99,-100,100,-100,-100,-100,-100,100,100,-99,-99,-99,-99,-99,-100,-100,-100,100,100,-100,-99,-100,100,100,-99,-99,-99,-100,-99,-100,-100,-100,100,-100,-100,-100,100,100,100,-99,-100,-99,-98,-98,100,100,-100,-100,-100,-100,-100,100,100,100,-99,-98,-100,-100,100,100,100,100,-100,100,-100,100,100,100,100,-89,-99,99,99,99,100,100,100,100,100,-99,-99,-99,100,99,-55,93,94,98,99,100,100,100,100,100,100,-99,25,100,100],"ownershipAllowedMAE":0.00883148})%"); + lines.push_back(R"%({"sample":{"board":"............OX.XX../.XOX..XO..OXOOX..X./..OXX.XO.OOX.OOXX../.XOOX.XO..XOO....../X.XXOOX...XXOX.X.../.X.OO..X....X....OX/.XXO.OO....X..X.XX./.OXO.O.O.XXOO.XOXOX/.OOXO.OOOXXXOXO.O.O/..OXXXOXXOOXXO.OOO./...OX.X.XOOOOO.O.../..OOX..X.XOOOXOXO../.XOOX..X.XXXO...O../.OOXOO.X.X.O..XXO../OXXX.X..X...O.X.XO./.OOX.....X.O..XOOX./.XOX.XX..XO..O.XXX./..O..XOX.XOX..O..../...O.O....X......../","hintLoc":"null","initialTurnNumber":208,"metadata":"A5164E5CB4750E0219324DF0EFCE9DCD:218","moveLocs":["O12","T13","P16","M19","T12","S6","Q2","T13","M3","O4"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.79,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":42.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.15e-06,6.12e-06,6e-06,6.08e-06,6.02e-06,5.94e-06,6.44e-06,0.00128,1.39e-05,0.000102,6.48e-06,0,0,0,7.06e-06,0,0,6.22e-06,6.35e-06,6.29e-06,0,0,0,5.95e-06,6.06e-06,0,0,0.000241,6.69e-06,0,0,0,0,0,6.75e-06,6.39e-06,0,6.56e-06,6.26e-06,5.7e-06,0,0,0,6.25e-06,0,0,2.4e-05,0,0,0,0,0,0,0,0,6.51e-06,6.66e-06,6.02e-06,0,0,0,0,6.87e-06,0,0,0.000124,7.44e-06,0,0,0,0.00189,0,6.17e-06,6.7e-06,6.47e-06,7.1e-06,0,6.47e-06,0,0,0,0,0,8.67e-06,8.09e-06,7.23e-06,0,0,0,0,6.18e-06,0,6.51e-06,1.13e-05,0.00122,5.74e-06,0,7.8e-06,0,0,6.85e-06,0.000104,0,7.5e-06,7.24e-06,6.35e-06,6.19e-06,0,6.4e-06,5.56e-06,5.46e-06,9.02e-05,0,0,6.65e-06,0,0,0,6.89e-06,0,0,8.49e-05,8.13e-06,6.74e-06,6.59e-06,0,6.35e-06,6.53e-06,0,2.03e-05,0,0,0,7.03e-06,0,0,0,1.32e-05,0,0,0,7.68e-06,0,0,0,0,0,0,0,0,0,0.983,7.06e-06,0,0,0,0,0.00455,0,0,0,0,0,0,0,0,0,0,0,0,0,6.87e-06,6.46e-06,0,0,0,0,0,0,0,0,0,0,0,0,6.79e-06,0,0,0,6.95e-06,6.07e-06,0.000939,0.000228,0,0,5.82e-06,0,6.01e-06,0,0,0,0,0,0,7.36e-06,0,5.81e-06,6.28e-06,6.26e-06,5.4e-05,1.12e-05,0,0,0,5.7e-06,6.55e-06,0,6.05e-06,0,0,0,0,0,0,0,0,6.2e-06,6.54e-06,2.35e-05,0,0,0,0,6.43e-06,6.21e-06,0,6.66e-06,0,0,0,0,1.21e-05,7.14e-06,6.69e-06,0,5.96e-06,6.53e-06,0.00146,0,0,0,0,0,5.92e-06,0,6.1e-06,0,6.59e-06,0,2.7e-05,0.00179,0,0,0,0,6.61e-06,0,0,0,0,6.35e-06,0,5.91e-06,6.04e-06,0,6.44e-06,6.74e-06,5.83e-06,0,1.41e-05,0,6.12e-06,0,0,6.48e-06,0.00172,0,0,0,5.9e-06,5.89e-06,5.95e-06,5.98e-06,6.11e-06,0,2.26e-05,0,7.01e-06,0,0,0,0,0,6.23e-06,2.33e-05,0,0,0,6.02e-06,0,0,5.98e-06,6.12e-06,0,0,0,1.37e-05,0,1.41e-05,0,0,0,6.04e-06,4.06e-05,6.67e-06,0,6.28e-06,6.3e-06,0,0,0,5.75e-06,0,0,0,6.65e-06,9.98e-06,0,0,6.18e-06,6.63e-06,6.4e-06,5.96e-06,6.88e-06,6.71e-06,0,6.25e-06,0,6.5e-06,6.8e-06,6.03e-06,6.28e-06,0,6.54e-06,7.18e-06,7.02e-06,6.73e-06,6.33e-06,6.43e-06,6.81e-06,6.14e-06,1.02e-05],"winrateAvg":0.292121,"leadAvg":-0.779907,"scoreMeanAvg":-0.845357,"scoreStdevAvg":4.094,"shorttermWinlossErrorAvg":0.337736,"shorttermScoreErrorAvg":1.12445,"ownership":[-97,-98,-98,-95,-85,-76,4,13,85,93,97,99,99,4,8,-100,-100,-99,-98,-98,-99,-97,-100,-94,-86,-99,96,86,96,99,98,99,99,-72,-72,-98,-100,-95,-98,-98,-97,-100,-100,-70,-99,96,74,99,99,98,98,99,99,-100,-100,-89,-89,-98,-99,-97,-97,-100,58,-99,97,5,23,-99,98,98,-87,-99,-95,-81,-75,-76,-99,-99,-99,-98,99,99,-99,-13,-4,-19,-98,-98,98,-98,-76,-99,-79,-73,-63,-79,-99,92,99,99,83,44,-86,-24,-35,-56,-95,-100,-70,-37,-33,-75,-54,-63,-15,-99,-99,99,96,99,99,49,4,-25,-72,-100,-98,-85,-92,29,-91,-91,-24,20,98,-99,99,17,99,98,98,22,-100,-100,-98,-98,-98,-97,66,-91,14,-29,87,97,98,-99,14,-77,98,98,98,-100,-100,-100,-98,-99,86,63,99,10,33,94,96,98,-99,-99,-99,98,-88,-87,100,100,-100,-100,100,85,100,100,99,37,96,96,98,100,-99,-98,-99,-87,-88,100,100,100,100,100,96,100,97,84,74,97,98,100,100,-99,-98,-98,-100,-88,-100,100,100,100,4,98,7,100,91,84,98,98,99,100,-100,-99,-99,-100,-96,-100,-100,-100,100,6,-4,4,100,96,92,96,99,99,-100,-99,-98,-99,-100,-100,-100,-7,99,98,-77,-98,-98,100,100,87,96,-100,-100,-100,-99,-100,-99,-100,-100,-77,-18,60,99,12,-98,-77,-71,100,6,95,97,98,-100,-99,-99,-99,-99,-99,-100,13,91,75,97,-98,-83,-74,-99,-8,96,95,97,-100,-88,-100,-100,-99,-99,-100,12,-91,3,97,-35,-99,-99,-99,-90,95,96,98,-18,-47,-100,-11,-99,-98,-100,9,-92,10,59,82,-99,-96,-97,-96,96,96,96,96,67,62,-4,-84,-96,-93,-94,-80,-4,48,-1,-16,-95,-95,-96],"ownershipAllowedMAE":0.0276857})%"); + lines.push_back(R"%({"sample":{"board":".................../.X................./.OXXXXO......O...../..OOOXO........X.../.O..OOX...X......../..X.OXX............/..XO.............../..XOX....XO......../...X.............../.............O...../..X................/.................../..O................/...O.............../..OX...........X.../..OX...........XO../..XX...........X.../.................../.................../","hintLoc":"null","initialTurnNumber":41,"metadata":"CDF617BC6C79344F63CF888EAC84E503:51","moveLocs":["A18","C18","F18","E18","H18","F19","G18","D19","C11","D10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.94,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":50.0,"policyOptimism":0.859,"pda":0.0,"policyMixture":[1.6e-05,9.41e-05,1.58e-05,0,0,0,1.72e-05,1.56e-05,1.91e-05,1.95e-05,1.89e-05,1.83e-05,1.78e-05,1.8e-05,1.75e-05,1.77e-05,1.73e-05,1.73e-05,1.56e-05,0,0,0,0,0,0,0,0,1.91e-05,6.71e-05,6.28e-05,2.47e-05,2.12e-05,2.05e-05,2.2e-05,2.23e-05,2.17e-05,2.19e-05,1.75e-05,1.84e-05,0,0,0,0,0,0,1.53e-05,3.28e-05,0.000113,0.000322,6.43e-05,2.03e-05,0,1.98e-05,4e-05,5.58e-05,2.15e-05,1.71e-05,1.85e-05,1.53e-05,0,0,0,0,0,3.42e-05,8.94e-05,0.000159,0.000101,3.18e-05,2.21e-05,2.11e-05,2.52e-05,0,5.31e-05,2.22e-05,1.75e-05,1.69e-05,0,0.00917,1.18e-05,0,0,0,0.000739,0.000557,0.000144,0,2.37e-05,2.24e-05,2.61e-05,6.74e-05,5.38e-05,2.76e-05,2.27e-05,1.72e-05,3.39e-05,0.000537,0,0.00429,0,0,0,0.000121,0.000655,0.000172,5.81e-05,2.25e-05,2.23e-05,2.23e-05,2.15e-05,3.07e-05,6.98e-05,2.26e-05,1.72e-05,3.74e-05,2.66e-05,0,0,0.0257,0.2,9.97e-05,0.000232,0.000168,0.000196,2.69e-05,2.24e-05,2.22e-05,2.24e-05,2.21e-05,2.18e-05,2.54e-05,2.21e-05,1.72e-05,2.66e-05,9.49e-05,0,0,0,0.106,0.000215,0.000126,0.000108,0,0,2.07e-05,2.22e-05,2.22e-05,2.22e-05,2.19e-05,2.23e-05,2.21e-05,1.74e-05,2.72e-05,0.638,0,0,0.00246,0.000179,0.000106,3.39e-05,2.34e-05,0.00013,2.26e-05,2.2e-05,2.16e-05,2e-05,2.1e-05,2.2e-05,2.27e-05,2.21e-05,1.74e-05,1.99e-05,0.00164,2.19e-05,0,3.08e-05,3.56e-05,2.82e-05,2.32e-05,2.29e-05,2.29e-05,2.31e-05,2.22e-05,2.01e-05,0,1.95e-05,2.2e-05,2.29e-05,2.2e-05,1.75e-05,1.95e-05,6.93e-05,0,2e-05,2.53e-05,2.24e-05,2.28e-05,2.29e-05,2.27e-05,2.27e-05,2.27e-05,2.26e-05,2.14e-05,1.97e-05,2.13e-05,2.18e-05,2.25e-05,2.18e-05,1.75e-05,2.08e-05,3.9e-05,2.19e-05,2.12e-05,2.13e-05,2.15e-05,2.2e-05,2.21e-05,2.24e-05,2.25e-05,2.26e-05,2.26e-05,2.25e-05,2.25e-05,2.21e-05,2.18e-05,2.35e-05,2.17e-05,1.72e-05,1.97e-05,2.07e-05,0,1.65e-05,2.23e-05,3.15e-05,3.8e-05,2.2e-05,2.21e-05,2.23e-05,2.24e-05,2.24e-05,2.26e-05,2.27e-05,2.17e-05,2.24e-05,5.08e-05,2.42e-05,1.71e-05,1.96e-05,2.01e-05,1.48e-05,0,3.93e-05,0.000116,4.09e-05,2.19e-05,2.17e-05,2.2e-05,2.22e-05,2.22e-05,2.25e-05,2.22e-05,2.21e-05,2.03e-05,2.47e-05,4.06e-05,1.75e-05,1.94e-05,2.08e-05,0,0,2.14e-05,2.17e-05,2.16e-05,2.15e-05,2.17e-05,2.17e-05,2.19e-05,2.2e-05,2.22e-05,2.21e-05,1.9e-05,0,3.97e-05,2.2e-05,1.75e-05,2e-05,1.9e-05,0,0,1.78e-05,2.6e-05,2.35e-05,2.43e-05,3.13e-05,3.28e-05,2.32e-05,2.19e-05,2.18e-05,2.15e-05,1.82e-05,0,0,1.94e-05,1.78e-05,1.79e-05,0.000106,0,0,1.91e-05,2.83e-05,5.93e-05,3.74e-05,4.93e-05,5.64e-05,3.36e-05,2.28e-05,2.23e-05,2.21e-05,1.9e-05,0,2.64e-05,2.06e-05,1.71e-05,1.84e-05,2.27e-05,1.97e-05,1.95e-05,2.12e-05,2.16e-05,2.17e-05,2.16e-05,2.16e-05,2.18e-05,2.16e-05,2.16e-05,2.14e-05,2.15e-05,2.13e-05,2.02e-05,2.07e-05,2.14e-05,1.8e-05,1.57e-05,1.9e-05,1.75e-05,1.77e-05,1.74e-05,1.77e-05,1.77e-05,1.77e-05,1.79e-05,1.79e-05,1.78e-05,1.76e-05,1.74e-05,1.74e-05,1.7e-05,1.78e-05,1.75e-05,1.84e-05,1.56e-05,1.29e-05],"winrateAvg":0.0775326,"leadAvg":-8.13809,"scoreMeanAvg":-11.3853,"scoreStdevAvg":16.598,"shorttermWinlossErrorAvg":0.101621,"shorttermScoreErrorAvg":2.85319,"ownership":[-9,-26,-55,-69,-50,-53,-14,-7,-12,-13,-11,-7,-1,1,-2,-7,-8,-9,-9,55,-70,-68,-64,-70,10,7,6,-16,-20,-17,-10,-1,6,-8,-9,-11,-9,-11,56,65,-70,-71,-72,-73,6,-14,-33,-26,-21,-18,-8,35,-21,-27,-14,-14,-11,59,65,71,70,72,-75,12,-24,-22,-16,-31,-18,-13,-13,-22,-71,-25,-14,-12,56,69,46,52,69,72,-90,-37,-35,-31,-74,-20,-13,-10,-10,-23,-21,-14,-10,36,23,-54,33,69,-87,-87,-47,-42,-28,-21,-13,-8,-7,-8,-13,-8,-7,-8,4,-7,-56,66,14,15,-28,-32,-28,-18,-14,-7,-6,-3,-4,-7,-8,-6,-5,-36,-61,-56,67,-62,-3,-22,-23,-27,-65,35,-3,-3,-1,-3,-6,-7,-5,-3,-51,-54,-56,-95,-49,-28,-19,-18,-19,-9,-16,-4,-3,4,-4,-5,-4,-4,-3,-65,-78,-86,-95,-44,-27,-17,-15,-13,-11,-6,-3,3,53,2,-6,-5,-5,-3,-47,-57,-93,-47,-21,-20,-15,-13,-11,-9,-7,-5,-6,1,-8,-9,-9,-7,-4,-19,-19,-18,-25,-13,-14,-12,-12,-11,-10,-9,-8,-7,-7,-10,-14,-13,-9,-6,1,15,40,6,0,-8,-12,-13,-13,-12,-11,-10,-9,-10,-14,-21,-19,-9,-9,12,8,30,39,-6,0,-17,-18,-17,-14,-13,-13,-14,-16,-23,-38,-35,-16,-13,7,21,33,-91,-31,-24,-34,-25,-20,-17,-16,-17,-19,-23,-40,-95,-51,-18,-19,-5,-12,32,-91,-46,-28,-32,-30,-22,-19,-17,-20,-23,-28,-51,-95,-18,-31,-25,-32,-24,-91,-91,-54,-38,-29,-27,-18,-12,-18,-23,-26,-33,-55,-95,-48,-36,-34,-46,-73,-76,-77,-60,-47,-36,-28,-21,-18,-21,-27,-34,-41,-59,-67,-56,-44,-40,-60,-68,-72,-67,-57,-43,-31,-23,-17,-15,-17,-22,-30,-41,-52,-56,-53,-49,-44],"ownershipAllowedMAE":0.0308611})%"); + lines.push_back(R"%({"sample":{"board":".O..X.X..X.OO....../XXOOXOOOXOOOXO.O.../XOXOXXX.XO.XX.OXO../..XOO.OXXOOOXXXXOO./..XO..OXXXXXXO.XO.O/.XOXOOXXOOOOOO.XXO./.XOXXO.OO....OXXO.O/..OX...XXOOOOXXOOO./..XXOO..OXO.XOOXXX./..XOXO..XXOOXOOO.../.XOO.....OXOXO..OO./.X........XOXOOXXOO/.XO.OXX...OOXOX..XO/.XOOOOOXOOXXXXOXXXX/...OOXXO.XO..OOOXO./..XO...OOXOXXX.XX../..XO.XXXOXOOOXX..../.XXO....X.X......../.XOO.X...X........./","hintLoc":"null","initialTurnNumber":232,"metadata":"50A1A3051F4C61174AFC9637E3EDFE70:242","moveLocs":["Q7","Q9","C8","D8","F16","F15","P18","P19","O17","P18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":5.5,"policyOptimism":0.0,"pda":2.589,"policyMixture":[3.07e-05,0,0.00132,0.00981,0,0.0013,0,0.0304,0.0325,0,5.27e-05,0,0,0,0,0.000488,0.00159,0.000617,0.000316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0127,0.0017,0.000321,0,0,0,0,0,0,0,0.0106,0,0,0.00797,0,0,0,0,0,0,0.000325,0.000315,0.00318,0.00979,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000313,0.000346,0.000386,0,0,0,0,0,0,0,0,0,0,0,0,0.00332,0,0,0,0,0.000335,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00309,0,0,0,0,0.000335,0,0,0,0,0,0.348,0,0,0.000309,0.000313,0.000321,0.000326,0,0,0,0,0,0,0.000339,0.000397,0,0,0.101,0.012,0.00184,0,0,0,0,0,0,0,0,0,0,0,0.0129,0.000331,0.000331,0,0,0,0,0.000514,0.00364,0,0,0,0.00335,0,0,0,0,0,0,0.000322,0.00034,0.000386,0,0,0,0,0.00398,0.000503,0,0,0,0,0,0,0,0,0.000326,0.000328,0.00033,0.000337,0,0,0,0.007,0.00495,0.00115,0.00116,0.00115,0,0,0,0,0,0,0,0,0,0.000324,0.00034,0,0,0,0.0113,0.00139,0.000357,0.00067,0.00608,0.0025,0,0,0,0,0,0,0,0,0,0.00034,0,0,0,0,0,0,0.0251,0.00289,0.00395,0,0,0,0,0,0,0.000357,0,0,0.000336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000355,0.00111,0.04,0,0,0,0,0,2.81e-05,0,0,0.000458,0.00038,0,0,0,0,0,0.000394,0.000338,0.000354,0,0,0.00166,0.0036,0.00818,0,0,0,0,0,0,0,0.000394,0,0,0.000385,0.000344,0.000335,0.000331,0,0,0.00644,0,0,0,0,0,0,0,0,0,0,0.000378,0.00034,0.000338,0.00033,0.00034,0,0,0,0.0109,0.00529,0.000412,0.000402,0,0.205,0,0.000396,0.000403,0.000346,0.000339,0.000337,0.000336,0.000334,0.000332,0.000312,0,0,0,0.00324,0,0.000359,0.000383,0.000338,0,0.000345,0.000353,0.000345,0.000346,0.000338,0.00033,0.000328,0.000331,0.000322,0.00247],"winrateAvg":0.000877012,"leadAvg":-8.12868,"scoreMeanAvg":-8.07158,"scoreStdevAvg":1.88084,"shorttermWinlossErrorAvg":0.0113254,"shorttermScoreErrorAvg":0.721943,"ownership":[-45,93,93,29,-100,-25,-99,-81,-99,-99,3,100,100,100,100,100,99,100,100,-100,-100,99,99,-99,97,95,95,-100,100,100,100,-100,100,100,100,100,100,100,-100,-99,-100,99,-100,-100,-100,-45,-100,100,14,-100,-100,-100,100,-100,100,100,100,-99,-100,-100,99,99,-100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,-99,-99,-100,99,99,100,100,-100,-100,-100,-100,-100,-100,100,-40,-100,100,100,100,-99,-100,-99,-100,100,100,-100,-100,100,100,100,100,100,100,51,-100,-100,100,99,-99,-100,-99,-100,-100,100,-82,100,100,100,100,99,100,100,-100,-100,100,99,100,-99,-100,-99,-100,-22,95,99,98,98,100,100,100,100,-100,-100,100,100,100,99,-99,-99,-100,-100,100,100,99,99,99,98,100,43,-100,100,100,98,98,98,99,-99,-100,-100,100,99,100,99,99,98,98,100,100,-100,100,100,100,99,99,99,-99,-100,100,100,99,99,99,99,99,100,99,100,-100,100,100,100,100,100,99,-99,-100,-100,100,99,99,99,99,99,99,99,100,-100,100,100,-100,-100,100,100,-99,-100,100,99,100,98,98,99,99,99,100,100,-100,100,-100,-100,-99,-100,100,-99,-100,100,100,100,100,100,98,100,100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-99,-99,-74,100,100,-100,-100,100,91,-100,-98,-99,-100,-99,-99,-99,-100,-99,-99,-99,-99,-100,100,49,-68,-39,100,100,-100,-98,-100,-100,-100,-99,-100,-100,-99,-99,-99,-99,-100,100,27,-100,-100,-100,100,-100,-98,-98,-98,-100,-100,-99,-99,-99,-99,-99,-100,-100,100,-33,-98,-99,-99,-100,-100,-100,-99,-99,-99,-99,-99,-99,-99,-99,-99,-100,100,100,4,-100,-99,-99,-99,-100,-99,-99,-99,-99,-99,-99,-99,-99,-99],"ownershipAllowedMAE":0.0174102,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":"...XX.XXXXXO./.O..XXXOX.XOO/.OXXOOXOOXXO./XOOOOXXXOOXXO/XX..X.XOOXOOO/....XXXOOXXO./..XXOOOOOOXO./..XXXXOOXOXOO/.XOXXXXOXOXXX/.XOOOXXXXO.../..XXOOOOXOOX./..XOOO.OOO.OO/..XXO.O...O.O/","hintLoc":"null","initialTurnNumber":143,"metadata":"8468DE104EDF6BBD8D365970F71DACBB:153","moveLocs":["L4","A11","pass","A12","pass","B13","pass","C12","pass","C13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":13,"ySize":13},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":4.5,"policyOptimism":0.236,"pda":0.0,"policyMixture":[0,0,0,0,0,0,0,0,0,0,0,0,0.000341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00503,0.00411,0,0,0,0,0,0,0,0,0,0.00341,0.00448,0.00517,0.00419,0,0,0,0,0,0,0,0,0.00571,0.00378,0.00486,0,0,0,0,0,0,0,0,0,0,0.00646,0.00424,0.00874,0,0,0,0,0,0,0,0,0,0,0,0.00989,0,0,0,0,0,0,0,0,0,0,0,0,0.0368,0,0,0,0,0,0,0,0,0,0,0.0179,0.0191,0.0368,0.05,0,0,0,0,0,0,0,0,0,0,0.0176,0.0419,0.0429,0,0,0,0,0.00737,0,0,0,0.0125,0,0,0.0112,0.041,0,0,0,0.00746,0,0.00725,0.00548,0.0102,0,0.0105,0,0.54],"winrateAvg":0.000758209,"leadAvg":-2.53071,"scoreMeanAvg":-2.65659,"scoreStdevAvg":0.653851,"shorttermWinlossErrorAvg":0.0130116,"shorttermScoreErrorAvg":0.405675,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,100,-100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.00123028})%"); + lines.push_back(R"%({"sample":{"board":".................../....O.O.....XX...../..O......O.OOXX.XX./..OX..X....XOXOOXO./...X.X..X...OX..O../..O.XOOOOOO..OO.O../..O.X.XXXXO......../..OX.XO.XOX....O.../.O...XO....X...X.../.XOOXX.O.X.....X.../.XXO..O.OOX..X...../.OX.XXO.OXX.XOOO.../.OXX..OOX....XOX.../.OOOO.OXX......OOX./OO.O..O..........X./.XOX.XO.X...O..O.../.XOX.X........O.X../.XX....X.....OXX.../.................../","hintLoc":"null","initialTurnNumber":41,"metadata":"CB7C5519D73421049B45536AE4E4F50A:51","moveLocs":["D17","D18","M13","S7","R12","P12","N14","S12","R11","N12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.23,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":1.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.01e-06,4.3e-06,4.21e-06,4.47e-06,4.29e-06,4.43e-06,4.39e-06,4.32e-06,4.43e-06,4.52e-06,4.45e-06,4.45e-06,4.34e-06,4.13e-06,3.98e-06,4.23e-06,4.25e-06,4.57e-06,4.1e-06,4.54e-06,6.07e-06,7.78e-06,0,0,4.58e-06,0,5.29e-06,4.48e-06,4.84e-06,9.11e-06,5.19e-05,0,0,4.27e-06,4.43e-06,4.46e-06,4.29e-06,4.31e-06,4.49e-06,0.000134,0,0,4.26e-06,6.11e-06,5.96e-06,9.69e-06,1.1e-05,0,4.22e-05,0,0,0,0,4.26e-06,0,0,4.4e-06,2.37e-05,9.25e-05,0,0,4e-06,4.31e-06,0,4.76e-06,4.57e-06,7.52e-06,6.81e-06,0,0,0,0,0,0,0,4.77e-06,1.54e-05,0.000102,0.0439,0,4.07e-06,0,4.13e-06,4.2e-06,0,4.32e-06,4.36e-06,0.000254,0,0,1.06e-05,4.49e-06,0,1.16e-05,4.58e-06,5.19e-06,8.46e-05,0,4.38e-06,0,0,0,0,0,0,0,6.12e-06,0,0,0,4.51e-06,0,6.67e-06,4.7e-06,7.6e-06,7.36e-06,0,4.09e-06,0,7.32e-06,0,0,0,0,0,0,1.66e-05,5.73e-06,4.23e-06,5.17e-06,1.81e-05,7e-06,4.29e-06,4.82e-06,4.64e-06,0,0,4.56e-06,0,0,4.29e-06,0,0,0,0.891,0,6.24e-06,0,0,0,0,4.33e-06,7.59e-06,0,4.35e-06,3.53e-05,4.23e-06,0,0,9.43e-06,4.54e-06,7.79e-06,6.13e-06,0,1.99e-05,3.45e-05,4.71e-06,0,0,4.79e-06,4.47e-06,4.39e-06,0,0,0,0,0,0.000172,0,0.0588,0,4.54e-06,4.73e-06,5.83e-06,9.1e-06,4.8e-06,0,4.25e-06,4.45e-06,4.39e-06,4.57e-06,0,0,0,4.59e-06,4.46e-06,0,4.26e-05,0,0,0,4.75e-06,4.7e-06,0,5.42e-06,4.18e-06,4.2e-06,4.37e-06,4.39e-06,0.00426,0,0,4.96e-06,0,0,0,4.66e-06,0,0,0,4.22e-06,0,0,0,0,3.28e-05,2.28e-05,4.32e-06,0.000218,0,0,0,5.07e-06,1e-05,0,0,0,4.46e-06,4.44e-06,4.44e-06,4.44e-06,0,0,0,8.18e-06,0,1.38e-05,4.62e-06,0,0,0,0,4.47e-05,0,0,0,4.42e-06,4.65e-06,4.48e-06,5.07e-06,7.66e-06,4.76e-06,0,0,0,4.07e-06,0,0,4.59e-06,0,4.32e-06,6.91e-06,0,4.25e-06,4.51e-06,4.36e-06,4.63e-06,4.43e-06,5.6e-06,5.35e-06,4.98e-06,4.93e-06,7.12e-06,0,4.31e-06,4.54e-06,0,0,0,4.69e-06,0,0,4.53e-06,0,4.73e-06,4.83e-06,5.93e-06,0,2.14e-05,4.71e-06,0,4.43e-06,4.39e-06,4.48e-06,4.48e-06,0,0,0,4.64e-06,0,4.41e-06,4.67e-06,4.71e-06,4.65e-06,4.74e-06,5.39e-06,1.7e-05,2.69e-05,0,6.17e-06,0,4.48e-06,4.56e-06,4.54e-06,0,0,4.53e-06,4.42e-06,4.58e-06,4.4e-06,0,4.56e-06,4.63e-06,4.51e-06,4.61e-06,1.41e-05,0,0,0,4.31e-06,4.25e-06,4.11e-06,4.02e-06,4.23e-06,4.13e-06,4.15e-06,4.2e-06,4.39e-06,4.41e-06,4.29e-06,4.28e-06,4.41e-06,4.38e-06,4.25e-06,4.33e-06,4.55e-06,4.22e-06,4.3e-06,4.39e-06,4.25e-06,3.93e-06,4.85e-06],"winrateAvg":0.391438,"leadAvg":-0.730527,"scoreMeanAvg":-0.750036,"scoreStdevAvg":9.51319,"shorttermWinlossErrorAvg":0.29978,"shorttermScoreErrorAvg":1.9602,"ownership":[97,97,97,95,88,84,75,67,58,48,12,-29,-61,-88,-92,-93,-91,-87,-74,97,97,97,98,98,53,92,42,66,63,40,-19,-97,-97,-95,-94,-94,-64,-62,97,98,99,-95,21,1,-3,-21,16,93,68,90,89,-97,-97,22,-95,-95,-46,97,96,99,-95,-62,-69,-91,1,20,42,62,25,88,-97,64,65,-95,25,-25,95,96,-70,-96,-92,-92,-5,18,-19,37,55,33,88,-97,-46,64,92,23,46,95,95,96,-28,-97,90,90,90,90,89,88,-25,-87,87,89,76,93,78,62,92,95,96,-3,-97,-6,-95,-95,-95,-96,90,-95,-36,15,52,61,54,48,55,89,91,96,-96,-94,-96,91,-9,-95,-89,-96,-96,46,19,85,84,-77,57,21,-2,95,90,-79,-90,-97,91,49,-13,-90,-90,-97,-18,-26,-7,-77,-78,-23,-5,-43,-94,92,91,-97,-97,39,98,-26,-94,-80,-47,-20,8,-14,-77,-41,-23,-11,-48,-93,-93,90,-66,12,99,98,99,98,-98,-58,-29,-49,15,15,6,10,9,-10,99,-93,-76,-96,-95,99,99,98,-98,-98,-42,-68,97,97,97,34,19,47,95,99,-93,-93,22,13,99,99,-95,-73,-46,-31,3,-8,97,90,92,91,58,98,99,99,99,99,65,99,-95,-95,-39,-23,-11,3,25,58,98,98,-85,42,99,99,60,99,33,9,99,27,-38,-21,-12,2,21,40,54,66,12,-86,-36,53,-100,61,-99,-17,-99,99,16,-90,-28,-5,10,90,65,74,94,-10,-81,-74,-32,-100,-27,-99,-96,-99,32,-9,-35,-21,-10,3,36,80,92,15,-93,-90,-83,-93,-100,-100,-99,-98,-95,-86,-95,-49,-37,-20,3,-11,84,-92,-93,-89,-85,-86,-98,-99,-99,-99,-96,-92,-85,-69,-55,-32,-11,11,39,43,-2,-67,-87,-88,-87],"ownershipAllowedMAE":0.0395761})%"); + lines.push_back(R"%({"sample":{"board":"............../............../........X.X.../..OOO.O......./..XXX........./.....XXX....../....O.OXO...../.XXXO..OX...../.O.OX.O.X...../.O.OX.O......./....X.OX..X.../..O.........../....O........./............../","hintLoc":"null","initialTurnNumber":37,"metadata":"E11034AFD2FD0BA3F882E4084EE4D195:47","moveLocs":["M6","M5","M10","M8","M12","M13","L8","M7","L7","L6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.5,"xSize":14,"ySize":14},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.85e-06,9.08e-06,8.81e-06,9.46e-06,9.66e-06,1.01e-05,9.84e-06,9.61e-06,9.27e-06,9.48e-06,9.34e-06,8e-06,8.45e-06,7.66e-06,8.66e-06,9.53e-06,9.7e-06,1.03e-05,1.13e-05,1.3e-05,1.41e-05,5.14e-05,1.33e-05,0.000151,0.0132,0,0.325,8.69e-06,9.02e-06,1.1e-05,8.79e-06,8.45e-06,1.04e-05,1.63e-05,3.93e-05,0.0192,0,1.48e-05,0,0,0.0174,9.78e-06,1e-05,1.44e-05,0,0,0,1.07e-05,0,7.59e-05,0.142,0.00177,0.29,2.27e-05,0.000107,9.44e-06,8.64e-06,9.4e-05,0,0,0,3.19e-05,9.02e-06,2.72e-05,0.0332,0.00399,0.000323,0,1.08e-05,1.08e-05,8.52e-06,1.01e-05,8.88e-06,7.53e-06,1.84e-05,0,0,0,5.43e-05,7.46e-05,0.00142,0.0128,1.66e-05,1e-05,8.91e-06,9.83e-06,8.77e-06,1.1e-05,0,9.58e-06,0,0,0,1.56e-05,0,0,2.33e-05,9.89e-06,9.25e-06,0,0,0,0,1.01e-05,1.01e-05,0,0,1.15e-05,0,0,1.14e-05,9.2e-06,8.07e-06,0,8.54e-06,0,0,9.45e-06,0,2.22e-05,0,0.00649,0,0,0.131,8.83e-06,7.72e-06,0,8.09e-06,0,0,7.66e-06,0,1.47e-05,0.000265,1.45e-05,7.51e-06,0,8.59e-06,8.36e-06,7.94e-06,8.02e-06,7.77e-06,8.41e-06,0,8.69e-06,0,0,1.87e-05,1.25e-05,0,8.79e-06,9.36e-06,8.14e-06,8.26e-06,7.88e-06,0,7.71e-06,9.41e-06,9.08e-06,1.23e-05,0.000206,1.47e-05,4.31e-05,1.39e-05,1.31e-05,9.55e-06,8.21e-06,7.77e-06,7.84e-06,8.19e-06,8.08e-06,0,9.08e-06,1.3e-05,1.31e-05,1.63e-05,1.55e-05,1.19e-05,1.03e-05,9.25e-06,8.48e-06,7.63e-06,7.87e-06,7.98e-06,8.25e-06,8.16e-06,8.52e-06,9.12e-06,9.47e-06,9.3e-06,9.45e-06,8.86e-06,8.27e-06,8.43e-06,7.62e-06,1.28e-05],"winrateAvg":0.553119,"leadAvg":-0.0584955,"scoreMeanAvg":0.420198,"scoreStdevAvg":9.47126,"shorttermWinlossErrorAvg":0.197206,"shorttermScoreErrorAvg":1.11711,"ownership":[46,47,42,32,13,-6,-24,-40,-53,-55,-50,-34,-27,-11,43,44,49,39,15,-10,-21,-36,-55,-62,-43,-54,-1,-3,34,54,57,51,33,-8,11,-8,-79,-41,-74,33,6,10,8,21,77,78,78,49,72,0,10,-13,18,4,24,20,-25,-21,-92,-92,-93,-26,-13,-17,2,3,16,52,25,20,-39,-63,-62,-36,-28,-94,-94,-94,-42,-11,-22,17,1,7,-53,-59,-61,-3,65,-64,0,-94,-14,-40,-1,-82,-25,-20,-13,-85,-86,-85,65,60,-7,37,-81,-44,0,-81,-57,-47,13,92,-36,89,48,65,89,-11,-80,-36,-89,-55,-60,-61,77,92,82,90,50,69,89,18,-15,-47,-75,-93,-72,-69,86,89,81,71,49,71,89,-55,-30,-48,-94,-75,-74,-68,88,90,95,74,75,70,24,-6,-38,-40,-62,-57,-64,-64,89,88,88,80,91,50,23,-12,-29,-40,-49,-56,-58,-61,87,86,84,81,68,51,23,0,-22,-35,-45,-51,-56,-58],"ownershipAllowedMAE":0.0501015})%"); + lines.push_back(R"%({"sample":{"board":".................../.....O............./...XXO..O.......O../.X.XOO......XXXX.../..XOX........OO.O../.XOO.X.....X..O.O../.XO...X......XXX.../.XO..O.......OX..../...........O.X..X../....OX.........O.../....O......OOOO..../......O..X.XXXXOO../.....OXX.......XO../....XXXOOOOX..X.X../....XOOOXXXOOX...X./..XXO.X...OXXOOO.../.X.XO.O..XXXOXO.O../..XO.O...XOOOXXO.../..O................/","hintLoc":"null","initialTurnNumber":116,"metadata":"6A8005806CA058A489BE18763E940A16:126","moveLocs":["K17","K18","K16","L18","F11","G12","J16","H17","H12","E11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0button1","komi":22.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.16e-06,4.52e-06,4.45e-06,4.62e-06,4.92e-06,4.84e-06,4.87e-06,4.75e-06,5.02e-06,4.77e-06,5.06e-06,5.27e-06,5.4e-06,5.43e-06,6.11e-06,6.44e-06,6.76e-06,7.44e-06,4.1e-06,4.42e-06,4.43e-06,4.43e-06,4.62e-06,5.1e-06,0,5.18e-06,5.82e-06,5.71e-06,0,0,7.06e-06,7.03e-06,5.93e-06,7.17e-06,0.00224,0.0205,0.0496,6.42e-06,4.14e-06,4.38e-06,4.21e-06,0,0,0,5.06e-06,0,0,0,6.23e-06,7.24e-06,5.59e-06,4.83e-06,4.69e-06,7.72e-06,0,2.33e-05,6.85e-06,4.25e-06,0,4.17e-06,0,0,0,5.43e-06,5.77e-06,0,0,4.62e-06,5.72e-06,0,0,0,0,0.0118,5.16e-06,5.92e-06,4.31e-06,4.2e-06,0,0,0,5.71e-06,7.44e-06,6.68e-06,5.15e-06,4.96e-06,5.34e-06,5.2e-06,7.8e-06,0,0,0.000184,0,6.86e-06,8.16e-06,4.3e-06,0,0,0,9.01e-06,0,5.65e-06,4.21e-05,6.89e-06,6.73e-06,6.09e-06,0,7.96e-06,5.06e-06,0,0.00012,0,1.49e-05,7.66e-06,4.3e-06,0,0,4.6e-06,0.000568,0.00808,0,3.37e-05,2.26e-05,8.29e-06,8.25e-06,8.33e-06,8.22e-06,0,0,0,0.0288,0.000663,7.36e-06,4.41e-06,0,0,7.37e-05,0.00909,0,0,0,1.49e-05,2.54e-05,7.2e-05,1.33e-05,0.000165,0,0,4.75e-06,1.67e-05,0.0481,9.92e-06,4.91e-06,6.38e-06,0.00703,6.62e-06,0,0,0.0968,0.539,0.000692,0.000312,1.08e-05,0,1.4e-05,0,7.16e-06,0.00877,0,0.000572,8.12e-06,4.87e-06,6.88e-06,1.54e-05,5.4e-06,0,0,6.51e-06,0.0186,0.00356,0.0028,0.00133,6.3e-06,6.02e-06,5.32e-06,4.89e-06,0,0.00836,3.09e-05,5.95e-06,4.74e-06,6.6e-06,9.45e-06,6.84e-06,0,2.86e-05,9.36e-06,4.26e-05,5e-05,0.00033,0.0697,0,0,0,0,5.89e-06,9.29e-06,0.0147,5.89e-06,4.57e-06,6.36e-06,8.03e-06,1.35e-05,6.97e-06,7.58e-06,0,2.73e-05,8.14e-06,0,2.54e-05,0,0,0,0,0,0,6.21e-06,5.86e-06,4.52e-06,5.99e-06,6.3e-06,6.33e-06,6.62e-06,0,0,0,6.52e-06,7.05e-06,7.93e-06,5.95e-06,5.16e-06,4.43e-06,4.31e-06,0,0,7.02e-05,5.03e-06,4.5e-06,5.15e-06,5.25e-06,4.77e-06,0,0,0,0,0,0,0,0,4.23e-05,5.44e-06,0,4.27e-06,0,4.97e-06,5.36e-06,4.58e-06,4.81e-06,4.32e-06,4.39e-06,0,0,0,0,0,0,0,0,0,0,4.69e-06,5.08e-06,4.95e-06,0,5.03e-06,4.46e-06,4.42e-06,0,0,0,0.0012,0,0.037,7.7e-06,5.83e-06,0,0,0,0,0,0,5.01e-06,5.03e-06,5.22e-06,4.42e-06,0,4.01e-06,0,0,6.52e-06,0,8.46e-05,8.21e-06,0,0,0,0,0,0,0,0,5.09e-06,5.02e-06,4.55e-06,4.58e-06,0,0,9.06e-05,0,1.61e-05,0.00637,4.91e-06,0,0,0,0,0,0,0,9.86e-06,4.86e-06,4.93e-06,4.57e-06,2.29e-05,0,4.16e-05,2.02e-05,5.57e-06,6.48e-06,5.88e-06,4.99e-06,4.8e-06,0.000647,0.000111,5.76e-05,1.59e-05,4.97e-06,9.03e-06,5.09e-06,4.69e-06,4.39e-06,6.74e-06],"winrateAvg":0.448453,"leadAvg":-0.643137,"scoreMeanAvg":-1.38264,"scoreStdevAvg":19.2591,"shorttermWinlossErrorAvg":0.192202,"shorttermScoreErrorAvg":2.3305,"ownership":[-68,-56,-32,-12,25,45,86,90,91,85,57,31,0,-17,-21,-9,9,23,35,-80,-69,-62,-68,-15,96,90,93,94,94,94,26,-2,-27,-22,-17,17,32,43,-89,-85,-79,-95,-95,96,72,96,96,-84,22,3,-24,-30,-16,11,65,56,48,-93,-96,-93,-95,95,96,29,4,-85,-85,-36,-40,-84,-82,-81,-81,-12,57,48,-95,-94,-94,58,-40,10,7,-10,-31,-39,-37,-47,-14,55,55,10,62,53,41,-95,-97,57,58,10,-71,-44,-42,-32,-27,-30,-86,-43,-18,57,-7,64,36,24,-92,-97,56,38,23,3,-74,-55,-29,-19,-14,-4,-37,-88,-88,-88,-23,-2,-8,-75,-97,57,34,38,45,40,-88,-35,-9,-2,8,-14,-10,-87,-53,-51,-49,-38,-55,-52,-30,30,69,-71,-37,-80,-31,-7,14,62,8,-64,-26,-18,-80,-47,-38,-28,-25,26,29,68,-69,-36,-38,-19,-4,23,40,25,13,21,67,38,-8,-14,-12,-11,10,22,67,10,-10,-29,-26,-4,31,69,69,69,69,62,26,9,5,-11,-13,2,-9,14,4,33,-31,-32,-88,-47,-97,-97,-97,-97,65,65,36,9,-22,-28,-18,-17,-26,18,-95,-95,-6,-1,-11,-44,-71,-80,-89,-90,66,-22,-1,-39,-42,-31,-42,-94,-95,-95,88,88,87,86,-85,-79,-79,-95,-80,-88,-51,-42,-55,-57,-59,-75,-94,88,88,89,-83,-83,-84,-73,-75,-85,2,23,-17,-85,-42,-71,-74,-94,-93,90,88,30,25,14,-72,-76,-86,-86,94,94,94,25,22,-20,-71,-88,-58,-93,90,89,90,41,-12,-86,-86,-84,85,84,95,94,95,54,23,-66,-24,-60,75,75,90,54,-17,-30,-88,85,86,86,85,86,96,83,64,43,-37,-24,39,38,65,73,43,1,-44,-69,-62,-30,68,88,94,91,86,75,62],"ownershipAllowedMAE":0.0387235,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":"....OX.O.....OO.O../..XOX.XO.X.OXXXO.OX/..OXX.X.OXXXOXXXOO./.OX.X.XXO.OOOOXOO.O/..XX.XOOO....OOXOX./...X.XX.....XOOXX../..XOO...X.OXOXOX.X./..X......XXXO.XXX../...OO.....OOOOXO.X./....XO.X.XXO.XOO.OX/..O.XXXX..OXX.X.OO./.XO..OOXO.OOXX.XXO./.X...XXO.O..OXO.O../..X....X....OXO..O./.......X...OXOXXX../...X.XXOO....OOXOO./...X.OO.OO...O.O.O./....XOXOXO.....XO../.......X.........../","hintLoc":"null","initialTurnNumber":165,"metadata":"9D5559A35F9D2F085E67F053250B5025:175","moveLocs":["Q7","Q6","H3","B18","D19","H2","L18","N19","H3","C19"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.01,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.52e-06,0.403,0,0,4.11e-06,0,2.91e-06,0,2.53e-06,2.38e-06,2.42e-06,2.48e-06,0,0,0,0,0,2.2e-06,2.19e-06,1.19e-05,0,0,0.0261,0,2.53e-06,0,0,7.57e-05,0,0,0,2.31e-06,2.23e-06,2.12e-06,0,0,0,0,1.79e-05,0.215,0,0,0,2.53e-06,0,0.000631,0,0,0,0,0,2.11e-06,2.2e-06,2.19e-06,0,0,2.57e-06,1.01e-05,0,0,2.2e-06,0,2.38e-06,0,0,0,6.39e-05,0,0,0,0,2.21e-06,0,0,2.96e-06,0,6.24e-06,1.68e-05,0,0,2.37e-06,0,0,0,0,0.000348,5.1e-06,2.06e-05,2.64e-06,0,0,0,0,0,9.54e-06,2.95e-06,3e-06,2.27e-06,0,2.33e-06,0,0,3.04e-06,3.11e-06,3.38e-06,0.00113,8.91e-05,0,0,0,0,0,2.86e-06,3.36e-06,2.58e-06,2.55e-06,0,0,0,2.36e-06,2.62e-06,2.78e-06,0,3.04e-06,0,0,0,0,0,0,2.16e-06,0,2.68e-06,2.48e-06,2.43e-06,0,2.13e-06,2.27e-06,2.3e-06,2.54e-06,2.66e-06,2.59e-06,0,0,0,0,0.000381,0,0,0,2.42e-06,3.06e-06,2.29e-06,2.34e-06,2.21e-06,0,0,2.25e-06,2.37e-06,2.62e-06,3.01e-06,0.000261,0,0,0,0,0,0,4.06e-06,0,3.41e-06,2.23e-06,2.34e-06,2.18e-06,2.16e-06,0,0,2.32e-06,0,2.58e-06,0,0,0,1.47e-05,0,0,0,6.14e-05,0,0,2.26e-06,2.25e-06,0,2.23e-06,0,0,0,0,2.86e-06,1.05e-05,0,0,0,2.2e-06,0,0.00014,0,0,2.72e-06,2.32e-06,0,0,2.14e-06,2.26e-06,0,0,0,0,2.71e-06,0,0,0,0,7.14e-05,0,0,0,2.74e-06,2.3e-06,0,2.23e-06,2.27e-06,2.35e-06,0,0,0,3.64e-06,0,3.86e-06,0.000908,0,0,0,0,0,0.000337,9.55e-06,2.3e-06,2.3e-06,0,2.31e-06,2.34e-06,2.57e-06,2.49e-06,0,2.92e-06,0.001,1.67e-05,0.00033,0,0,0,0,6.78e-05,0,2.26e-06,2.18e-06,2.28e-06,2.23e-06,2.35e-06,2.26e-06,2.37e-06,2.23e-06,0,4.04e-06,3.26e-06,5.55e-06,0,0,0,0,0,0,2.88e-06,2.32e-06,2.2e-06,2.3e-06,2.24e-06,0,2.61e-06,0,0,0,0,2.62e-06,2.76e-06,3.14e-06,2.77e-06,0,0,0,0,0,2.14e-06,2.24e-06,2.31e-06,2.27e-06,0,0.00125,0,0,0,0,0,2.64e-06,2.59e-06,2.55e-06,0,2.41e-05,0,0,0,2.24e-06,2.28e-06,2.43e-06,2.38e-06,2.56e-06,0,0,0,0.348,0,0,2.64e-06,2.57e-06,2.45e-06,2.54e-06,2.3e-06,0,0,2.46e-06,2.24e-06,2.09e-06,2.31e-06,2.33e-06,2.48e-06,3.25e-06,0.000857,3.18e-06,0,2.47e-06,5.8e-06,2.59e-06,2.35e-06,2.25e-06,2.2e-06,2.18e-06,2.25e-06,2.33e-06,2.27e-06,2.17e-06,5.24e-06],"winrateAvg":0.106103,"leadAvg":-1.96571,"scoreMeanAvg":-2.44946,"scoreStdevAvg":4.35535,"shorttermWinlossErrorAvg":0.231372,"shorttermScoreErrorAvg":1.16319,"ownership":[-87,-86,-88,-94,-93,-99,-33,91,90,92,95,98,100,100,100,100,100,98,98,-88,-86,-89,-87,-100,-99,-100,92,92,88,88,100,99,100,100,100,100,100,95,-88,-87,-87,-100,-100,-99,-100,-87,98,90,89,90,100,100,100,100,100,100,97,-90,-86,-100,-99,-100,-100,-100,-100,98,96,100,100,100,100,100,100,100,39,98,-92,-95,-100,-100,-99,-100,98,98,98,10,38,42,82,100,100,-97,100,-73,68,-94,-97,-98,-100,-97,-100,-100,56,-7,10,-27,27,28,100,100,-97,-97,-73,-35,-96,-98,-100,-95,-95,-97,-92,-84,-98,-54,-12,-96,98,31,100,-97,-97,-97,-81,-97,-98,-100,-98,-97,-97,-95,-88,-86,-98,-98,-98,99,17,-96,-97,-97,-95,-86,-97,-98,-98,-95,-95,-97,-96,-90,-79,13,98,99,99,99,-96,98,-21,-95,-79,-97,-97,-98,-98,-100,-96,-98,-100,-60,-84,-83,99,96,94,99,99,54,99,-79,-98,-98,-95,-98,-100,-100,-100,-100,-4,-10,99,93,94,95,94,95,100,99,40,-98,-100,-95,-98,-98,-97,-97,-100,84,58,99,99,93,93,95,93,93,99,83,-98,-100,-97,-97,-97,-100,-100,23,26,97,90,94,98,93,99,94,99,96,96,-98,-98,-100,-97,-96,-96,-96,-98,-14,35,77,90,98,93,99,99,99,100,97,-98,-98,-98,-97,-96,-95,-95,-98,12,64,76,99,95,100,98,98,98,99,98,-97,-97,-98,-100,-93,-99,-99,99,99,80,84,90,97,100,100,98,100,100,98,-97,-97,-97,-100,-89,-79,-80,-81,99,99,90,91,94,100,98,100,99,100,98,-97,-96,-96,-96,-98,-79,-83,-75,-77,99,90,92,94,96,98,96,100,98,98,-96,-96,-95,-95,-90,-83,-78,-80,36,68,88,90,93,95,96,97,97,98,98],"ownershipAllowedMAE":0.0327365})%"); + lines.push_back(R"%({"sample":{"board":".................../.......O.........../...XO.......XO...../..XOXX.X.......O.../..OO.............../................X../...O.............../.................../..O................/................X../..X................/.................../.................../...............XX../...X...........XO../..X.............O../....O........O.O.../.................../.................../","hintLoc":"null","initialTurnNumber":13,"metadata":"8D47EB520BC4694628EF58AFD0AF0DF0:23","moveLocs":["E18","C17","F17","N16","M17","M16","L17","O18","L16","R15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.0,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":7.0,"policyOptimism":0.422,"pda":0.0,"policyMixture":[4.46e-06,4.64e-06,4.87e-06,4.78e-06,4.71e-06,4.56e-06,4.89e-06,4.77e-06,4.85e-06,4.88e-06,5.34e-06,5.66e-06,6.28e-06,5.6e-06,5.37e-06,5.26e-06,4.74e-06,5.13e-06,4.53e-06,5.02e-06,6.3e-06,0.05,4.84e-06,0,4.45e-06,4.81e-06,0,4.73e-06,5.24e-06,5.12e-06,5.38e-06,9.4e-06,0,6.28e-06,7.08e-06,6.09e-06,6.01e-06,5.16e-06,4.87e-06,1.81e-05,0,0,3.76e-06,0,4.5e-06,4.87e-06,5.19e-06,4.67e-06,0,0,0,0,9.53e-06,1.1e-05,1.08e-05,6.83e-06,4.99e-06,5.01e-06,0.000293,0,0,0,0,4.65e-06,0,5.57e-06,5.03e-06,0,0,0,1.43e-05,0.000109,0,1.1e-05,1.04e-05,5.79e-06,4.91e-06,7.4e-06,0,0,6.23e-06,5.01e-06,5.25e-06,5.57e-06,6.03e-06,6.42e-06,8.04e-06,9.41e-05,8.99e-06,9.25e-05,0.018,0.000254,0,0.0526,5.89e-06,4.95e-06,7.34e-06,8.19e-06,9.14e-06,8.13e-06,7.95e-06,7.08e-06,7.08e-06,7.21e-06,8.45e-06,1.21e-05,2.98e-05,2.29e-05,1.18e-05,0.000562,0.153,0,0.7,6.83e-06,5.16e-06,1.97e-05,4.08e-05,0,1.37e-05,9.73e-06,9.19e-06,8.6e-06,8.44e-06,9.13e-06,1.07e-05,1.55e-05,1.5e-05,1.67e-05,1.85e-05,0.000191,3.16e-05,0.000165,5.67e-06,5.32e-06,8.72e-06,0.000177,0.000229,8.94e-06,1.04e-05,1.02e-05,9.63e-06,9.53e-06,9.85e-06,1.08e-05,1.22e-05,1.45e-05,1.38e-05,1.38e-05,1.7e-05,2.18e-05,8.06e-06,5.38e-06,5.32e-06,0.000109,0,0.000131,1.02e-05,1.04e-05,1.04e-05,1.04e-05,1.04e-05,1.1e-05,1.2e-05,1.3e-05,1.37e-05,1.25e-05,1.16e-05,9.7e-06,7.56e-06,7.69e-06,5.23e-06,5.35e-06,8.88e-06,5.82e-05,1.55e-05,1.36e-05,1.19e-05,1.16e-05,1.18e-05,1.27e-05,1.43e-05,1.63e-05,1.56e-05,1.3e-05,1.14e-05,9.82e-06,8.14e-06,0,6.13e-06,5.18e-06,5.39e-06,7.53e-06,0,8.71e-06,3.14e-05,1.73e-05,1.45e-05,1.58e-05,2e-05,2.36e-05,2.32e-05,1.81e-05,1.27e-05,1.02e-05,9.33e-06,8.07e-06,6.43e-06,6.75e-06,4.97e-06,5.05e-06,7.04e-06,7.12e-06,1.36e-05,1.45e-05,1.6e-05,1.85e-05,2.32e-05,2.9e-05,3.03e-05,2.66e-05,1.8e-05,1.18e-05,9.88e-06,8.34e-06,7.72e-06,7.25e-06,6.23e-06,5.01e-06,4.96e-06,6.85e-06,8.66e-06,1.23e-05,1.1e-05,1.36e-05,2.35e-05,3.57e-05,3.78e-05,3.43e-05,2.8e-05,2.17e-05,1.32e-05,9.17e-06,6.85e-06,5.16e-06,4.91e-06,7.35e-06,5.29e-06,4.85e-06,6.28e-06,7.71e-06,7.75e-06,1.25e-05,4.64e-05,5.39e-05,5.67e-05,4.84e-05,3.99e-05,3.36e-05,4.26e-05,2.89e-05,8.99e-06,5.28e-06,0,0,1.13e-05,6e-06,4.77e-06,6.54e-06,5.29e-06,0,1.03e-05,0.000102,0.000126,8.74e-05,6.83e-05,4.93e-05,4.37e-05,6.78e-05,6.15e-05,1.03e-05,5.29e-06,0,0,2.38e-05,5.36e-06,5.04e-06,5.89e-06,0,5.24e-06,4.87e-05,0.000321,0.000179,0.000199,0.000137,7.64e-05,5.51e-05,5.94e-05,0.000126,0.000108,0.000434,0.0141,0,6.2e-06,5.76e-06,4.79e-06,7.36e-06,1.15e-05,0.000162,0,4.74e-05,0.000985,0.00232,0.000189,8.64e-05,6.28e-05,9.49e-05,0.000154,0,3.63e-05,0,7.98e-06,8.34e-06,5.29e-06,4.88e-06,7.53e-06,2.84e-05,8.06e-05,1.16e-05,4.12e-05,0.000126,5.58e-05,2.02e-05,1.05e-05,9.63e-06,1.22e-05,2.02e-05,5.27e-05,9.96e-05,1.5e-05,1.11e-05,6.5e-06,5.16e-06,4.46e-06,5.4e-06,5.54e-06,5.69e-06,5.54e-06,5.71e-06,5.73e-06,5.58e-06,5.39e-06,5.25e-06,5.3e-06,5.45e-06,5.36e-06,5.52e-06,5.96e-06,5.26e-06,5.1e-06,5.02e-06,4.66e-06,4.51e-06],"winrateAvg":0.599062,"leadAvg":0.844303,"scoreMeanAvg":1.20093,"scoreStdevAvg":11.558,"shorttermWinlossErrorAvg":0.0798485,"shorttermScoreErrorAvg":0.588783,"ownership":[7,-4,-16,-47,-73,-83,-74,-63,-57,-50,-5,1,33,48,73,71,67,62,56,21,17,-5,-50,-92,-85,-76,-54,-67,-63,-74,-45,-38,91,75,73,67,55,48,37,31,43,-75,-74,-96,-77,-75,-74,-71,-90,-90,-90,91,70,74,64,48,35,50,56,42,92,-96,-97,-51,-93,-49,-51,-90,70,70,62,32,90,62,31,19,60,64,92,92,5,-27,-17,-25,-22,-29,-4,0,17,12,-12,8,81,39,-17,60,68,68,41,4,-2,-6,-10,-8,-6,-10,7,1,1,-13,-11,-75,-63,-37,54,55,61,85,14,3,-1,-4,-5,-5,-5,-3,-3,-5,-9,-33,-43,-55,-48,41,53,50,31,11,2,0,-2,-4,-4,-4,-3,-3,-5,-8,-18,-31,-50,-51,25,30,76,8,7,1,0,-2,-3,-3,-2,-1,-3,-5,-9,-24,-41,-58,-54,1,3,-6,-1,0,0,-1,-2,-2,-2,-2,-1,-3,-6,-11,-9,-85,-61,-56,-19,-29,-68,-16,-3,1,0,-1,-2,-3,-2,-2,-4,-6,-10,-22,-45,-55,-51,-33,-39,-33,14,0,3,1,-1,-3,-3,-3,-4,-4,-8,-11,-22,-29,-41,-45,-40,-41,-34,-9,3,3,2,-1,-3,-4,-5,-6,-7,-9,-13,-33,-47,-53,-35,-46,-48,-42,-26,-12,2,2,-1,-4,-6,-7,-9,-8,-9,-27,-86,-86,-18,-14,-49,-55,-61,-85,5,4,3,-3,-6,-8,-8,-12,-5,2,-28,-86,88,27,19,-44,-56,-86,-21,11,8,5,1,-5,-8,-6,-3,0,22,-16,-31,88,74,43,-33,-35,-17,-22,65,20,1,-11,-8,-8,-4,-7,12,86,41,91,82,73,64,-22,-17,7,7,35,25,10,1,-4,-5,-1,8,29,56,70,82,80,77,72,-15,-4,4,19,25,22,12,2,-4,-6,-2,9,26,44,62,74,78,78,76],"ownershipAllowedMAE":0.0346949})%"); + lines.push_back(R"%({"sample":{"board":"......../......../.....X../.O.X.XO./....XO../....XO../..O...../......../","hintLoc":"null","initialTurnNumber":0,"metadata":"9D9D4F1707935C52F9D98F1E18662E6D:2","moveLocs":["F2","G2"],"movePlas":["B","W"],"nextPla":"B","weight":0.1,"xSize":8,"ySize":8},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":11.5,"policyOptimism":0.0,"pda":-0.726,"policyMixture":[1.42e-05,1.82e-05,1.72e-05,1.8e-05,1.87e-05,1.73e-05,1.64e-05,1.39e-05,1.76e-05,0.000128,6.5e-05,3.45e-05,2.61e-05,2.06e-05,1.73e-05,1.64e-05,1.64e-05,0.00158,0.00764,2.23e-05,1.65e-05,0,0.00333,1.79e-05,2.09e-05,0,0.026,0,1.7e-05,0,0,1.77e-05,1.9e-05,0.0362,0.00196,1.75e-05,0,0,8.97e-05,1.82e-05,1.88e-05,0.0513,0.143,2.33e-05,0,0,0.000334,1.82e-05,1.7e-05,0.00371,0,0.694,0.029,0,0,2.61e-05,1.3e-05,1.76e-05,3.82e-05,1.97e-05,0.000216,2.77e-05,0.000207,1.32e-05,2.62e-05],"winrateAvg":0.260071,"leadAvg":-1.06144,"scoreMeanAvg":-1.49357,"scoreStdevAvg":8.12392,"shorttermWinlossErrorAvg":0.357745,"shorttermScoreErrorAvg":1.98931,"ownership":[18,13,3,-12,-33,-43,-43,-37,22,15,6,-20,-35,-56,-50,-23,22,12,4,-26,-40,-95,12,-15,17,37,-42,-97,-87,-96,24,11,10,-9,-25,-63,-99,25,17,18,-2,-7,-44,-61,-99,19,21,18,-8,-25,-12,-90,-81,-76,21,17,-16,-22,-40,-54,-57,10,10,15],"ownershipAllowedMAE":0.0938098})%"); + lines.push_back(R"%({"sample":{"board":".................../.........X..X...OO./.OOO.XX.X..OX..XO.O/.OXXX.OOX.O.OX.XXO./.XX.O.......OX..OX./..OO.OOOX....X.O.X./.OO.OXOXX..OOX.OX../..XO.XXO...XOX..OX./.OXO.OXOXX..OX.OX../.XOO.OXXXO...OX.X../.XO.XOXXO....OXO.../..XX.XOXO....OOXX../..X...OOO......OX../..O.OOOXXXO.....OO./..O.OXOXO...XO.OOX./..OXXXXOXXX.XXO.XX./.OXO.XOOOX....X..../.................../","hintLoc":"null","initialTurnNumber":161,"metadata":"899B6461530B9A3FB7BE783B5D78E94C:171","moveLocs":["J14","K14","H14","L12","K15","L14","N13","M14","M15","M17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":18},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":-8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000119,0.000154,0.000153,0.000176,0.000212,0.000208,0.000194,0.000635,0.00195,0.00183,0.00161,0.00038,0.000144,0.000151,0.000177,0.000156,0.000139,0.000123,0.000122,0.000141,0.00015,0.000135,0.000204,0.0106,0.00893,0.000269,0.0021,0.00526,0,0.0266,0,0,0.000287,0.082,0.00387,0,0,0.000122,0.000121,0,0,0,0.0113,0,0,0.0123,0,0.0225,0.000142,0,0,0.000238,0.00541,0,0,7.38e-05,0,0.000168,0,0,0,0,0.000206,0,0,0,0,0,0,0,0,0.000452,0,0,0,0.000158,0.000179,0,0,0.000128,0,0.000133,0.00012,0,0,0,0,0,0,0,0.000134,0.00015,0,0,0.000371,0.000165,0.000161,0,0,0.000119,0,0,0,0,0.000191,0.163,0.000156,0,0,0.000126,0,0.00251,0,0.000169,0.000148,0,0,0.000117,0,0,0,0,0,0.000541,0,0,0,0,0.000129,0,0,0.0031,0.00202,0.000125,0.000124,0,0,0.000146,0,0,0,0.00012,0.000278,0.229,0,0,0,0.000181,0.00121,0,0,0.000316,0.000122,0,0,0,0.000131,0,0,0,0,0,0.000877,0.00706,0,0,0.00114,0,0,0.000694,0.000362,0.000123,0,0,0,0.000125,0,0,0,0,0,0.0388,0.00272,0.000219,0,0,0.0281,0,0.00136,0.000746,0.000114,0,0,0.000112,0,0,0,0,0,0.000163,0.000189,0.000219,0.000153,0,0,0,0.0109,0.0025,0.00179,0.000122,0.00012,0,0,0.000116,0,0,0,0,0.00014,0.00017,0.000185,0.000163,0,0,0,0,0.00645,0.00271,0.000119,0.000123,0,0.000117,0.000114,0.000121,0,0,0,0.0415,0.000164,0.000187,0.000191,0.000192,0.000169,0,0,0.00391,0.000815,0.000123,0.000122,0,0.000124,0,0,0,0,0,0,0,0.000167,0.00942,0.000283,0.0134,0.000129,0,0,0.000225,0.000123,0.000122,0,0.00644,0,0,0,0,0,0.000176,0.000227,0.000167,0,0,0.0237,0,0,0,0.000165,0.000119,0.000124,0,0,0,0,0,0,0,0,0,0.000161,0,0,0,0.00233,0,0,0.000148,0.00012,0,0,0,0.00364,0,0,0,0,0,0.000127,0.000141,0.000148,0.000799,0,0.028,0.000331,0.000163,0.000132,0.000117,0.000135,0.00124,0.000314,0.00412,0.136,0.000301,0.000202,0.000133,0.000162,0.000138,0.000128,0.000125,0.000142,0.000174,0.000183,0.000156,0.000138,0.000116,0.000116],"winrateAvg":0.0244759,"leadAvg":-9.96745,"scoreMeanAvg":-10.1065,"scoreStdevAvg":6.65966,"shorttermWinlossErrorAvg":0.0922185,"shorttermScoreErrorAvg":2.46139,"ownership":[79,76,77,58,16,-38,-61,-79,-89,-92,-92,-92,-82,-47,30,61,74,93,93,81,81,81,81,2,-33,-90,-89,-91,-97,-8,-99,-99,-54,20,-58,94,93,93,79,88,89,88,-9,-97,-97,25,-94,35,21,95,-99,-90,-69,-99,94,91,93,33,88,-93,-92,-93,-47,99,99,-92,93,94,95,96,-100,-95,-99,-99,92,82,-31,-92,-92,14,99,20,72,100,99,-83,-85,-85,96,-100,-96,-95,-91,-98,-47,-23,-4,100,100,99,100,100,100,-97,-89,-58,-9,96,-100,-96,-91,-94,-98,-84,47,100,100,99,100,-98,100,-98,-98,-87,-94,94,95,-100,-96,-91,-98,-96,-92,94,98,98,100,4,-98,-98,-97,-96,-42,34,19,95,-100,-95,-94,-92,-98,-93,94,98,98,100,39,98,-98,-97,-98,-98,-6,54,94,-100,-96,-89,-99,-95,-87,95,92,100,100,96,99,-98,-98,-98,48,19,52,87,98,-96,-89,-99,-84,-74,94,92,100,96,94,99,-98,-98,100,45,45,47,65,97,-95,-86,-90,-73,-32,94,94,93,93,95,94,100,-98,100,66,49,46,51,97,97,-94,-95,-26,5,94,95,93,96,97,98,100,100,100,62,56,32,34,61,61,62,-94,22,48,95,96,100,97,100,100,100,-97,-97,-97,70,10,32,44,79,63,91,91,42,97,97,100,69,100,-51,100,-96,-94,-95,-37,-6,-99,78,72,91,91,-95,-6,97,97,100,-48,-48,-50,-49,-47,-99,-100,-100,-71,-99,-99,75,-81,-95,-95,-84,96,99,90,90,30,-51,-47,-47,-44,-100,-95,-93,-95,-92,-95,-91,-93,-91,-88,95,94,91,66,-1,-39,-51,-55,-74,-82,-93,-92,-93,-92,-92,-93,-93,-92,-90],"ownershipAllowedMAE":0.0462013})%"); + lines.push_back(R"%({"sample":{"board":".X.OX.....O......../O.XOXOOXXO.OXX.XX../.OXOXXOXOO.OOX..OO./OXXO.XOXX.O.OX.XXO./.OXO.XXOXXOXX.X.OX./O.OXXXOOOXX.X.X.OX./.OOO.OX.OO.XOXO.OX./..OOOOX.OX.XO.O.OX./.OXOXXX.OXXX.O.XOX./.OXOOOX.OXOXXOXXXX./.OXXXOXXOXOOXOOXO../.OOX.XOXOOOOOXOO.../.XOXXOOOXXOOXXXXOO./X.XXOOOX.XXOOOX.X../XXOO..OOXX.XOX.X.X./XO.O....OXOXOXXXX.X/.O.OOOOO.XOXOXXOOX./OO..O.OXXXOXXOOOX.X/..OO.O.O.XOOOOO.OX./","hintLoc":"null","initialTurnNumber":326,"metadata":"130743FCE02ABE4BD7A0FFB8F6B577D0:336","moveLocs":["B18","S2","A17","T1","A15","T3","B14","S4","A13","T5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.53,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":6.0,"policyOptimism":0.0,"pda":-1.446,"policyMixture":[1.69e-06,0,1.78e-06,0,0,1.57e-06,1.61e-06,1.69e-06,1.79e-06,1.53e-06,0,1.53e-06,1.78e-06,1.69e-06,1.74e-06,1.69e-06,1.76e-06,1.73e-06,1.55e-06,0,0,0,0,0,0,0,0,0,0,1.65e-06,0,0,0,1.8e-06,0,0,1.73e-06,1.83e-06,0,1.69e-06,0,0,0,0,0,0,0,0,1.57e-06,0,0,0,1.83e-06,1.9e-06,0,0,1.68e-06,1.61e-06,0,0,0,1.76e-06,0,0,0,0,1.67e-06,0,1.62e-06,0,0,1.75e-06,0,0,0,1.65e-06,0,1.71e-06,0,0,1.73e-06,0,0,0,0,0,0,0,0,1.68e-06,0,1.76e-06,0,0,1.8e-06,3.34e-06,0,0,0,0,0,0,0,0,0,0,1.7e-06,0,1.8e-06,0,1.69e-06,0,0,1.83e-06,0,0,0,0,0.0474,0,0,1.89e-06,0,0,3.21e-06,0,0,0,0,2.16e-06,0,0,1.92e-06,0.0214,0.0047,0,0,0,0,0,1.85e-06,0,0,1.73e-06,0,0,2.91e-06,0,3.77e-06,0,0,1.88e-06,2.35e-05,0,0,0,0,0,0,1.9e-06,0,0,0,0,2.94e-06,0,2.07e-06,0,0,0,1.73e-06,2.05e-06,0,0,0,0,0,0,1.92e-06,0,0,0,0,0,0,0,0,0,0,1.74e-06,1.79e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000875,2.23e-06,3.31e-06,0,0,0,2.07e-06,0,0,0,0,0,0,0,0,0,0,0,0.000615,0.00022,4.85e-06,1.87e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.09e-06,0,2.1e-06,0,0,0,0,0,0,2.02e-06,0,0,0,0,0,0,1.73e-06,0,0.000842,0.924,0,0,0,0,1.84e-06,1.75e-06,0,0,0,0,5.3e-06,0,0,0,1.66e-06,0,4.15e-06,0,0,0,0,1.82e-06,0,1.76e-06,1.69e-06,1.8e-06,1.91e-06,0,0,0,0,0,0,0,0,0,0,0,1.73e-06,0,1.78e-06,0,0,0,0,0,1.91e-06,0,0,0,0,0,0,0,0,0,0,0,0,1.8e-06,1.84e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.53e-06,1.73e-06,0,0,0,0,0,0,1.76e-06,0,0,0,0,0,0,0,0,0,0,1.35e-05],"winrateAvg":0.00629742,"leadAvg":-12.2501,"scoreMeanAvg":-12.1347,"scoreStdevAvg":4.60995,"shorttermWinlossErrorAvg":0.0434881,"shorttermScoreErrorAvg":2.39712,"ownership":[-95,-100,-94,-91,-100,-94,-94,-94,-93,-94,-92,-94,-93,-94,-94,-94,-93,-93,-93,-94,-100,-100,-91,-100,-93,-92,-100,-100,-91,-93,-91,-100,-100,-93,-100,-100,-93,-93,-99,-98,-100,-91,-100,-100,-93,-100,-92,-91,-93,-91,-92,-100,-93,-93,-89,-89,-93,-94,-100,-100,-90,-93,-100,-93,-100,-100,-93,-90,-93,-90,-100,-94,-100,-100,-89,-93,-96,-84,-100,-90,-93,-100,-100,100,-100,-100,-91,-100,-100,-96,-100,-90,-82,-100,-93,-43,-84,97,-100,-100,-100,100,100,100,-100,-100,-98,-100,-94,-100,-91,-84,-100,-93,-36,96,95,95,-48,97,82,91,100,100,16,-100,-89,-99,-87,-90,-85,-100,-93,60,91,96,94,94,96,80,90,100,-100,-52,-100,-89,-89,-86,-91,-85,-100,-94,83,98,84,94,75,78,80,91,100,-100,-100,-100,-92,-85,-91,-100,-87,-100,-94,89,98,86,94,94,95,80,90,100,-100,100,-100,-100,-86,-100,-100,-100,-100,-93,90,98,86,87,87,95,80,83,100,-99,100,100,-100,-87,-87,-100,-88,-94,-92,90,98,99,88,92,90,100,83,100,100,100,100,100,-99,-88,-88,-91,-92,-91,91,87,99,90,89,100,100,100,90,90,100,100,-99,-99,-99,-99,-85,-87,-89,86,90,89,90,100,100,100,92,93,90,91,100,100,100,-99,-97,-99,-95,-94,85,85,100,100,96,95,100,100,89,90,95,92,100,-99,-97,-99,-97,-98,0,85,100,96,100,95,95,94,95,100,89,100,92,100,-99,-99,-99,-99,58,8,92,100,96,100,100,100,100,100,94,88,100,91,100,-100,-99,100,100,54,79,100,100,96,97,100,98,100,87,88,88,100,91,90,100,100,100,96,99,76,97,96,100,100,97,100,95,100,93,88,100,100,100,100,100,97,99,93,95],"ownershipAllowedMAE":0.0513662})%"); + lines.push_back(R"%({"sample":{"board":"......XXXX..XO..../.OOOXXXOXOOOXO..../..XOOXOOOXO.XOOO../.X.XXO.O.XOXXXXXO./....OO.OXXXOO.XOO./.OO.OXXXXOOOXXXXO./.X.O......XXOOOO../..XXOOOX.X..OX..../.XOO..OOX..OX.XO../..O.O...OX.OOX.O../.XOOOO.O.O...XO.X./OOO.OXOO.X.XO.XX../OXXOXXXO...XXO..O./XXXXOXXXO....XXXO./X.XOOOXX..O.XXOXXO/.XOO.OOX..X.XOOOO./OXOXXOXX..XOOX..../OOOXXX.X........../","hintLoc":"null","initialTurnNumber":227,"metadata":"D860C3D386695D0AE5F69A6848E1CC45:237","moveLocs":["K6","L8","J8","S10","O10","M1","O1","N10","R10","S9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.24,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":-6.5,"policyOptimism":0.0,"pda":0.594,"policyMixture":[3.95e-06,4.54e-06,3.75e-06,0.002,0.0288,6.2e-06,0,0,0,0,0.000143,1.3e-05,0,0,3.8e-06,4.11e-06,3.93e-06,3.36e-06,5.57e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,4e-06,4.33e-06,4.78e-06,4.22e-06,4.83e-06,5.2e-06,0,0,0,0,0,0,0,0,0,5.24e-06,0,0,0,0,4.15e-06,4.48e-06,4.53e-06,0,5.79e-06,0,0,0,5.32e-06,0,5.28e-06,0,0,0,0,0,0,0,0,4.04e-06,4.45e-06,4.89e-06,4.89e-06,5.07e-06,0,0,9.62e-06,0,0,0,0,0,0,4.39e-06,0,0,0,3.98e-06,4.1e-06,0,0,4.18e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,5.08e-06,3.89e-06,0,4.08e-06,0,4.18e-06,7.33e-06,8.77e-06,0.000606,9.53e-06,0.000235,0,0,0,0,0,0,0.000144,0.000249,3.9e-06,3.89e-06,0,0,0,0,0,0,6.66e-06,0,0.000119,0.0109,0,0,0.0052,1.34e-05,0.0435,0.168,3.77e-06,0,0,0,3.94e-06,3.87e-06,0,0,0,0.00347,3.59e-05,0,0,0.637,0,0,0,0,3.83e-06,4.04e-06,0,3.96e-06,0,3.71e-06,3.92e-06,3.96e-06,0,0,0.00684,0,0,0,5.24e-05,0,2.43e-05,0,3.92e-06,0,0,0,0,0,3.9e-06,0,0,0,0,0.000994,0.0202,0,0,0.000204,0,5.88e-06,0,0,0,6.73e-06,0,0,0,0,6.32e-06,0,5.47e-06,0,0,3.35e-05,0,0,6.4e-05,5.65e-06,0,0,0,0,0,0,0,0,5.48e-06,0,0.00226,0,0,0,6.13e-06,0.000134,0,4.52e-06,0,0,0,0,0,0,0,0,0,1.01e-05,2.78e-05,8.29e-06,4.3e-06,0,0,0,0,9.66e-06,0,0,0,0,0,0,0,0,0.000655,0.000471,0,4.96e-06,0,0,0,0,0,0,0.000412,0,0,0,0.000276,0,0,0,0.000469,0.0622,0,0.000255,0,0,0,0,0,5.56e-06,0,0,0,0,0,0,0,0,6.64e-06,6.04e-06,0,0,0,0,0.000657,4.48e-06,4.51e-06,4.13e-06,0,0,0,0,0,0,0,0,4.49e-06,4.84e-06,7.31e-05,0,0.0032,0,7.32e-06,4.67e-06,4.43e-06,3.61e-06,1.02e-05],"winrateAvg":0.944425,"leadAvg":1.38296,"scoreMeanAvg":1.76349,"scoreStdevAvg":3.49816,"shorttermWinlossErrorAvg":0.126206,"shorttermScoreErrorAvg":0.674641,"ownership":[97,96,90,54,49,-54,-99,-99,-99,-99,-99,-99,-100,99,99,99,99,99,97,99,99,99,-99,-99,-99,99,-99,-98,-98,-98,-100,99,99,99,99,99,98,98,97,99,99,-99,99,99,99,-100,-98,-99,-100,100,99,99,99,99,99,98,98,98,98,100,98,99,6,-100,-98,-100,-100,-100,-100,-100,100,98,99,99,99,99,100,100,-66,99,-100,-100,-100,-98,-98,-99,-100,100,100,94,99,100,100,100,100,-99,-100,-100,-100,-97,-97,-97,-100,-100,-100,-100,100,83,99,99,99,100,71,-23,12,-4,-87,-97,-98,-98,100,100,100,99,87,59,99,99,99,99,100,100,100,-61,-62,-99,2,53,100,-21,46,81,39,22,99,99,100,100,100,100,100,100,-89,-50,22,97,-6,-6,-56,98,98,-96,100,100,100,100,100,100,100,100,100,-61,50,97,97,-96,2,98,18,-97,100,99,100,100,100,100,100,100,100,100,-75,12,-9,-96,60,-27,-99,-90,100,100,100,35,100,-100,100,100,44,-61,-55,-100,-10,-94,-100,-100,-49,-59,100,-100,-100,37,-100,-100,-100,100,96,98,13,-100,-100,-89,-94,5,94,26,-100,-100,-100,-100,-99,-100,-100,-100,97,37,-3,-27,-80,-100,-100,-100,95,94,-100,-100,-100,-99,-99,-99,-100,-100,57,-17,48,-55,-100,-100,99,-100,-100,97,-99,-100,-99,-99,-99,-99,-98,-100,-15,-18,-99,-82,-100,99,99,99,99,98,-99,-100,-99,-100,-100,-99,-100,-100,-67,-70,-99,94,98,97,99,99,98,98,-98,-98,-99,-100,-100,-100,-100,-100,-95,-94,-96,-96,76,98,98,98,98,98],"ownershipAllowedMAE":0.0213597})%"); + lines.push_back(R"%({"sample":{"board":".................../.......XOOO..OXXXO./....X...XOX.O.XOO../.XX.....XXOO..X..../..OX....XOO.X..XO../..O......XOX.XXOO../.........XOXOXO..../.O.XX.....OXXOOO.../...XO...X.XOOX...../..OO..O.OXXXOOX..../....OOX..OXOXOO.O../..OXXXOOOX.OXOXXO../...O.....X..XO..O../..OOX.XOO...X.XXXO./..XO..X........XOO./..X.....X...XXXO.../...X.X......XOOO.../.................../.................../","hintLoc":"null","initialTurnNumber":6,"metadata":"91E411ED1CFB20F9EA05EEAE10E8AE64:16","moveLocs":["Q9","Q10","O6","P11","B13","G18","G17","H19","H17","J9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":4.0,"policyOptimism":0.0,"pda":1.05,"policyMixture":[1.92e-06,2.19e-06,2.19e-06,2.54e-06,3.56e-06,4.44e-06,4.2e-06,0,0.000121,2.66e-06,2.43e-06,3.57e-06,4.3e-06,1.82e-05,2.82e-06,2.15e-06,2.86e-06,8.46e-06,2.17e-06,2.12e-06,2.46e-06,2.56e-06,3.06e-06,4.6e-06,0.00338,0,0,0,0,0,1.89e-05,2.2e-05,0,0,0,0,0,4.3e-06,2.05e-06,2.19e-06,2.33e-06,2.46e-06,0,4.08e-06,0,0,0,0,0,2.23e-06,0,0.00318,0,0,0,0.00309,4.05e-06,2.35e-06,0,0,2.32e-06,2.64e-06,2.66e-06,2.55e-06,2.29e-06,0,0,0,0,2.89e-06,3.01e-06,0,0.0132,0.0385,3.8e-05,2.8e-06,2.35e-06,2.81e-06,0,0,2.78e-06,2.89e-06,2.88e-06,2.64e-06,0,0,0,2.69e-06,0,2e-06,2.49e-06,0,0,2.87e-06,2.35e-06,2.6e-06,3.75e-06,0,3.65e-06,3.2e-06,3.83e-06,4.39e-06,4.88e-06,5.67e-06,0,0,0,2.56e-06,0,0,0,0,2.61e-06,2.17e-06,3.53e-06,0,2.76e-05,3.07e-06,3.52e-06,1e-05,9.43e-05,0.00395,1.23e-05,0,0,0,0,0,0,2.31e-06,2.46e-06,2.4e-06,2.09e-06,3.34e-06,0,5.41e-06,0,0,3.83e-05,0.12,8.49e-05,0.000267,0.0487,0,0,0,0,0,0,2.26e-06,2.3e-06,1.99e-06,2.8e-06,0.578,4.46e-06,0,0,0.0332,0.000105,0.0278,0,0.0494,0,0,0,0,0,2.39e-06,2.29e-06,2.31e-06,1.95e-06,2.72e-06,7.09e-06,0,0,7.28e-06,7.27e-06,0,8.78e-06,0,0,0,0,0,0,0,0,2.36e-06,2.29e-06,2.01e-06,2.69e-06,5.59e-05,1.85e-05,0.000253,0,0,0,2.9e-06,0,0,0,0,0,0,0,0,0,2.3e-06,2.02e-06,2.92e-06,0.00228,0,0,0,0,0,0,0,0,0.0132,0,0,0,0,0,0,2.4e-06,2.03e-06,3.26e-06,9.44e-06,3.48e-06,0,4.04e-06,4.15e-06,3.64e-06,5.04e-06,5.51e-05,0,1.25e-05,0.000244,0,0,2.62e-06,2.6e-06,0,2.36e-06,2.2e-06,4.53e-06,0.0141,0,0,0,4.47e-06,0,0,0,0.0371,5.11e-06,2.85e-06,0,0,0,0,0,0,2.21e-06,8.4e-06,6.26e-05,0,0,0.000179,4.11e-06,0,4.01e-06,4.63e-06,9.88e-05,8.08e-06,2.84e-06,2.27e-06,2.18e-06,2.09e-06,0,0,0,2.23e-06,3.51e-06,4.53e-06,0,4.67e-06,6.46e-06,4.95e-06,4.02e-06,3.79e-06,0,1.48e-05,3.92e-06,2.83e-06,0,0,0,0,5.01e-06,2.73e-06,2.13e-06,2.39e-06,3.08e-06,3.06e-06,0,3.44e-06,0,3.37e-06,3.42e-06,3.49e-06,4.15e-06,3.65e-06,3.07e-06,0,0,0,0,5.39e-06,2.9e-06,2.23e-06,2.31e-06,2.74e-06,2.95e-06,2.92e-06,3.09e-06,2.83e-06,3.05e-06,2.98e-06,3.2e-06,3.58e-06,3.87e-06,1.07e-05,0.009,0.000212,3.5e-06,3.03e-06,2.73e-06,2.65e-06,2.24e-06,1.91e-06,2.2e-06,2.14e-06,2.29e-06,2.12e-06,2.35e-06,2.17e-06,2.28e-06,2.42e-06,2.5e-06,2.68e-06,3.75e-06,8.95e-06,4.48e-06,3.6e-06,2.8e-06,2.51e-06,2.3e-06,1.91e-06,4.97e-06],"winrateAvg":0.0711946,"leadAvg":-2.70231,"scoreMeanAvg":-3.7701,"scoreStdevAvg":6.17522,"shorttermWinlossErrorAvg":0.119255,"shorttermScoreErrorAvg":1.10306,"ownership":[-88,-83,-76,-61,-27,-1,47,83,83,95,97,97,88,11,-29,-81,-42,-22,35,-92,-88,-84,-78,-71,19,48,-99,99,99,99,98,92,92,-99,-99,-99,92,67,-95,-93,-90,-86,-98,-57,-99,-99,-99,99,98,99,99,-34,-99,90,95,92,90,-95,-100,-100,-91,-82,-75,-72,-79,-99,-99,99,99,11,-87,-99,-66,-35,95,94,-93,-92,-82,-98,-71,-60,-56,-54,-99,99,99,36,-98,-93,-96,-96,100,98,97,-86,-87,-82,-88,-74,-50,-40,-34,-47,-62,99,-97,-97,-98,-98,100,100,99,98,-60,-94,-90,-86,-70,-41,-19,-15,-10,-61,99,-97,-97,-98,100,99,99,99,99,-49,-29,-71,-99,-99,-18,-7,9,-8,59,99,-97,-97,100,100,100,100,99,99,21,-41,30,-99,48,-16,34,20,-73,-38,-98,100,100,100,100,100,100,99,99,54,90,98,98,47,60,96,54,97,-97,-97,-97,100,100,100,100,100,100,99,78,84,71,40,98,98,94,96,98,97,-97,-86,-100,100,100,-99,100,100,99,78,85,94,-60,-59,-60,98,98,98,-90,-89,-82,-100,100,-99,-99,100,100,100,63,83,91,94,13,-24,8,70,4,-87,-61,-87,-100,100,-56,20,100,100,100,33,32,94,94,-67,-50,-97,96,96,27,-14,-48,-100,-100,-100,-100,-100,100,99,-11,-27,-95,94,43,-36,-98,-7,32,-5,-19,-41,-66,-92,-99,-100,100,100,99,-44,-83,-96,56,6,-25,-84,-68,-95,-25,-39,-55,-100,-100,-100,99,99,99,98,-70,-85,-93,-99,-53,-98,-88,-85,-86,-71,-61,-70,-100,99,99,99,96,97,97,-82,-89,-93,-95,-95,-94,-90,-86,-82,-75,-64,-77,-38,59,81,94,93,93,95,-87,-91,-92,-93,-93,-91,-88,-83,-78,-71,-61,-52,-3,37,63,75,87,91,94],"ownershipAllowedMAE":0.0336573})%"); + lines.push_back(R"%({"sample":{"board":".O................./..OXXXOO.........../XOOOXOOO.....OO..../.XXOXOOX...X.X..O../.X.XOXXX.........../..XXOOXOOX........./...OXOOOX.......OO./...OXXOX.......XOX./...O..X........XXO./...OX.O.....X....../..XXOO.OO.....X.OO./..XOOXOOX...O.XO.X./..XO.XXXOO..OX.OX../..XOOO......OX.O.../...X.OXXX.OOX....../...X.OX.X.OXX.OOXX./...XO.OX.X.OX..XO../...X...OX...X.X..../.................../","hintLoc":"null","initialTurnNumber":4,"metadata":"E2EABF8F3DA7F703E3C4794F742EC4F8:14","moveLocs":["J15","J16","K15","J17","L15","J18","B13","B14","A18","B12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.4,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":6.0,"policyOptimism":0.0,"pda":2.717,"policyMixture":[1.42e-06,0,3.38e-06,0.00026,5.18e-05,1.68e-05,1.04e-05,4.43e-06,2.55e-05,6.09e-06,4.08e-06,3.6e-06,3.34e-06,3.06e-06,2.78e-06,2.56e-06,2.46e-06,2.6e-06,2.16e-06,0,1.79e-06,0,0,0,0,0,0,0,0.0182,1.31e-05,2.11e-05,6.42e-06,3.93e-06,3.37e-06,3.21e-06,3.15e-06,2.95e-06,2.53e-06,0,0,0,0,0,0,0,0,0,0.000251,0.000421,1.16e-05,7.71e-06,0,0,3.61e-06,3.35e-06,3.05e-06,2.39e-06,3.37e-06,0,0,0,0,0,0,0,0,5.27e-05,6.96e-06,0,6.34e-06,0,7.32e-06,4.6e-06,0,3.32e-06,2.63e-06,2.48e-06,0,0,0,0,0,0,0,0,0,0,7.05e-05,9.66e-06,9.29e-06,1.08e-05,5.59e-06,4.19e-06,3.32e-06,2.54e-06,3.69e-06,0,0,0,0,0,0,0,0,0,3.03e-05,8.29e-05,6.3e-05,9.77e-05,8.45e-05,6.95e-06,3.9e-06,3.02e-06,2.6e-06,1.05e-05,0,0.734,0,0,0,0,0,0,9.67e-06,1.48e-05,5.83e-05,0.000234,0.000488,6.5e-05,3.15e-05,0,0,2.65e-06,5.42e-06,0,8.06e-06,0,0,0,0,0,1.14e-05,6.67e-06,1.67e-05,0.000192,0.0457,0.0922,1.04e-05,0,0,0,9.66e-06,4.35e-06,0.000344,3.76e-06,0,5.93e-06,9.78e-05,0,9.71e-06,4.24e-06,6e-06,1.23e-05,0.000177,0.00517,0.00757,1.38e-05,0,0,0,4.48e-06,3.96e-06,9.65e-06,1.37e-05,0,0,3.33e-06,0,2.94e-06,3.41e-06,4.86e-06,8.81e-06,5.63e-05,0,0.000674,0.00432,1.17e-05,0.000171,1.06e-05,5.97e-06,3.37e-06,3.54e-06,0,0,0,0,2.51e-06,0,0,4.14e-06,5.98e-06,6.52e-06,7.82e-06,1.75e-05,0,1.1e-05,0,0,5.31e-06,3.16e-06,3.01e-06,0,0,0,0,0,0,0,4.09e-06,4.55e-06,3.98e-06,0,0.000413,0,0,0.000573,0,2.57e-05,2.88e-06,3.11e-06,0,0,3.11e-06,0,0,0,0,0,4.02e-06,3.35e-06,0,0,1.01e-05,0,0,1.69e-05,9.89e-06,2.73e-06,3.37e-06,0,0,0,0,7.41e-06,5.46e-06,3.28e-06,3.57e-06,3.63e-06,3.49e-06,0,0,6.94e-06,0,0.00114,0.0704,6.65e-06,2.72e-06,3.47e-06,3.45e-06,0,2.84e-06,0,0,0,0,3.43e-06,0,0,0,0.00085,1.13e-05,0.000138,0.00832,1.36e-05,5.6e-06,2.59e-06,3.47e-06,3.28e-06,0,3.05e-06,0,0,0,0,3.06e-06,0,0,0,4.59e-06,0,0,0,0,6.25e-06,2.66e-06,3.48e-06,3.27e-06,0,0,3.16e-06,0,0,0,0,7.62e-05,0,0,0.000151,0.000417,0,0,0.00476,5.03e-06,2.71e-06,3.33e-06,3.3e-06,0,3.65e-06,4.59e-06,5.97e-06,0,0,4.76e-06,4.9e-06,5.55e-06,0,0.000211,0,0.000505,6.54e-05,1.51e-05,4.35e-06,2.25e-06,2.97e-06,3.29e-06,3.73e-06,3.43e-06,3.19e-06,3.98e-06,3.3e-06,3.96e-06,3.53e-06,3.79e-06,3.87e-06,4.18e-06,4.34e-06,4.82e-06,4.58e-06,5.38e-06,4.18e-06,2.55e-06,6.29e-06],"winrateAvg":0.925497,"leadAvg":6.81981,"scoreMeanAvg":7.27469,"scoreStdevAvg":10.8316,"shorttermWinlossErrorAvg":0.146291,"shorttermScoreErrorAvg":3.08116,"ownership":[98,98,81,32,-9,-81,-94,-95,-78,-49,-20,0,28,52,68,76,80,81,82,99,98,98,-93,-94,-94,-93,-93,-97,-30,-23,9,34,64,82,83,83,82,82,14,98,98,98,-94,-92,-93,-94,-97,-31,12,2,10,93,94,80,83,83,82,11,-37,-38,98,-94,-93,-94,-97,-97,18,-5,-55,-12,-39,22,41,94,83,81,-28,-37,-33,-35,99,-97,-97,-97,99,99,98,-9,-7,0,11,23,42,79,80,-37,-38,-33,-32,99,100,-97,100,100,28,51,4,2,6,4,20,52,79,84,-30,78,85,95,94,99,100,100,35,49,27,7,5,9,3,-3,97,97,90,-26,-43,44,95,93,93,99,48,57,36,22,12,17,31,-12,-65,97,90,93,0,24,23,95,95,95,70,70,46,33,20,11,-3,-23,-26,-64,-65,92,85,-33,-52,-11,95,92,97,100,80,57,34,14,-6,-63,-32,-32,-22,8,7,75,-63,-75,-99,-98,100,100,99,100,100,43,14,-12,-1,-20,-81,7,94,94,64,-76,-91,-99,100,100,-97,100,100,85,85,53,24,88,11,-81,92,68,-15,37,-86,-94,-99,100,53,-97,-96,-96,94,94,68,61,88,-81,-25,92,-41,-5,3,-91,-97,-99,100,100,100,3,-75,4,-18,65,81,89,-81,23,92,-4,-18,-22,-94,-97,-98,-100,14,100,-99,-99,-99,-10,91,90,-99,-50,-24,44,-4,-50,-45,-96,-97,-98,-100,-7,99,-99,-98,-99,-40,91,-99,-99,-19,56,57,-84,-84,-64,-97,-97,-98,-100,88,39,40,-98,-97,-98,24,25,-98,-23,-4,-94,-73,-76,-75,-97,-97,-96,-100,31,40,-9,-7,-98,-83,-69,-18,-98,-85,-97,-84,-84,-79,-78,-96,-96,-95,-43,-11,23,9,-46,-62,-79,-66,-68,-80,-90,-91,-88,-82,-81,-79],"ownershipAllowedMAE":0.0425196})%"); + lines.push_back(R"%({"sample":{"board":".................../..O....OX.O..XO..../..XO.X.OXOOX.XO..../...O..XOOXO....O.../..OX.X..OXOXXXO.O../..OX.XOOOXOXOOOXO../...OXXXXOXXX...X.../....X.OOX....X...../..O.....X......X.../.................../...X.............../.................../.................../..O.............O../.................../...X...........X.../.................../.................../.................../","hintLoc":"null","initialTurnNumber":71,"metadata":"E73CF9B80D3FD26E0BE78B290AA4DA01:81","moveLocs":["H10","K9","E5","E4","E10","C12","B12","D18","C16","F10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.91,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1button1","komi":0.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.3e-06,2.61e-06,2.85e-06,2.89e-06,2.95e-06,3.08e-06,3.59e-06,3.16e-06,3.79e-06,3.2e-06,2.88e-06,3.33e-06,3.44e-06,3.63e-06,2.86e-06,3.19e-06,3.04e-06,2.95e-06,2.37e-06,2.79e-06,2.86e-06,0,0,5.39e-06,1.08e-05,3.56e-06,0,0,3.57e-06,0,3.59e-06,3.26e-06,0,0,3.19e-06,3.28e-06,3.02e-06,2.86e-06,2.63e-06,2.93e-06,0,0,3.14e-06,0,3.27e-06,0,0,0,0,0,3.25e-06,0,0,3.09e-06,3e-06,2.96e-06,2.77e-06,2.64e-06,2.72e-06,0,0,1.16e-05,3.13e-06,0,0,0,0,0,3.12e-06,3.04e-06,3.11e-06,2.97e-06,0,2.82e-06,3.07e-06,2.79e-06,2.62e-06,2.68e-06,0,0,3.2e-06,0,3.69e-06,2.08e-06,0,0,0,0,0,0,0,2.88e-06,0,2.99e-06,2.86e-06,2.71e-06,2.95e-06,0,0,2.89e-06,0,0,0,0,0,0,0,0,0,0,0,0,3.09e-06,2.96e-06,2.85e-06,3.06e-06,4.2e-06,0,0,0,0,0,0,0,0,0,8.73e-06,3.46e-06,3.66e-06,0,3.88e-06,4.2e-06,3.03e-06,2.63e-06,0,0,5.54e-06,0,2.65e-06,0,0,0,1.19e-05,3.37e-06,3.88e-06,7.77e-05,0,6.43e-05,4.28e-06,5.36e-06,5.85e-06,3.15e-06,3.02e-06,3.98e-06,0,0.000104,0.00293,0.0128,3.11e-06,5.8e-06,0,8.78e-06,2.08e-05,4.96e-06,6.08e-06,0.000182,5.85e-05,0,8.92e-06,6.05e-06,3.06e-06,2.94e-06,1.83e-05,1.58e-05,0.147,0,0,1.91e-05,0,0.000184,0.00011,5.92e-06,6.58e-06,7.88e-06,1.2e-05,1.07e-05,4.92e-05,1.52e-05,5.27e-06,3.01e-06,3.07e-06,4.21e-06,1.27e-05,0,0.677,0.0931,8.13e-06,4.98e-06,0.000534,0,3.33e-05,6.94e-06,7.25e-06,1.07e-05,1.85e-05,3.27e-05,2.97e-05,5.68e-06,3e-06,3.07e-06,4.71e-06,5.88e-06,5.79e-06,1.23e-05,9.25e-05,4.64e-05,7.53e-05,0.000154,0.000866,1.98e-05,1.32e-05,1.28e-05,1.58e-05,1.31e-05,2.26e-05,1.83e-05,5.28e-06,3.01e-06,2.96e-06,4.79e-06,4.8e-06,7.28e-06,4.29e-05,4.68e-05,6.63e-05,5.92e-05,4.44e-05,3.27e-05,3.08e-05,2.43e-05,2.99e-05,3.44e-05,2.08e-05,1.07e-05,5.38e-06,5.24e-06,2.96e-06,3.23e-06,4.6e-06,0,5.83e-06,1.59e-05,3.81e-05,4.7e-05,6.05e-05,4.53e-05,3.57e-05,2.92e-05,2.87e-05,3.48e-05,3.45e-05,6.15e-05,5.94e-06,0,4.9e-06,3.28e-06,3.13e-06,1.99e-05,6.99e-06,5.01e-05,0,0.0272,0.00374,5.74e-05,4.23e-05,3.44e-05,3.08e-05,3.02e-05,3.71e-05,3.37e-05,0.000234,4.69e-05,5.98e-06,2.44e-05,3.25e-06,3.36e-06,5.04e-05,1.35e-05,0,0,0.0294,0.0001,6.35e-05,5.41e-05,5.11e-05,4.55e-05,4.17e-05,5.89e-05,8.62e-05,6.92e-05,0,5.75e-05,4.71e-05,3.42e-06,3.1e-06,7.67e-06,3.81e-05,5.15e-06,5.66e-06,4.06e-05,0.000191,6.48e-05,4.61e-05,4.55e-05,4.3e-05,4.11e-05,5.22e-05,0.00048,3.97e-05,5.02e-05,4.28e-05,7.75e-06,3.14e-06,3.03e-06,4.98e-06,5.69e-06,7.41e-06,1.94e-05,1.17e-05,9.21e-06,6.85e-06,6.53e-06,6.54e-06,6.56e-06,6.58e-06,7.01e-06,1.01e-05,9.94e-06,7.47e-06,6.25e-06,5.06e-06,3.02e-06,2.32e-06,3.07e-06,3.06e-06,3.14e-06,3.23e-06,3.18e-06,3.16e-06,3.1e-06,3.14e-06,3.14e-06,3.13e-06,3.12e-06,3.1e-06,3.13e-06,3.14e-06,3.07e-06,3.04e-06,2.99e-06,2.32e-06,3.68e-06],"winrateAvg":0.641286,"leadAvg":1.17272,"scoreMeanAvg":1.9373,"scoreStdevAvg":12.488,"shorttermWinlossErrorAvg":0.168663,"shorttermScoreErrorAvg":1.3361,"ownership":[53,32,7,0,-25,-27,12,66,89,80,42,0,-46,-61,-44,51,63,73,77,73,50,80,-19,-8,-32,-17,93,88,91,90,23,-17,-94,90,67,79,77,80,79,86,76,96,-11,-86,-2,92,89,90,89,-67,-40,-93,90,83,82,83,79,84,89,97,97,14,-69,-86,92,92,-97,89,4,-60,-50,41,94,86,81,72,81,88,96,-77,-14,-94,-21,43,92,-97,89,-97,-97,-96,88,24,93,82,56,75,82,96,-80,-71,-94,91,91,91,-97,89,-97,88,88,88,-72,92,55,38,67,62,31,35,-94,-94,-93,-93,91,-97,-97,-98,-22,0,-1,-73,-18,17,11,59,74,-52,-43,-94,-62,-20,-20,-92,-84,-63,-54,-40,-83,-29,-41,-12,-3,-8,54,55,81,-30,-18,-31,-37,-56,-92,-60,-40,-37,-35,-25,-37,-78,-30,-12,-14,45,51,40,36,80,-60,-18,15,-32,-44,-36,-26,-22,-21,-22,-15,-15,-11,-11,38,36,30,-2,65,0,-12,-10,-26,-80,-24,-21,-18,-14,-12,-6,-1,-3,-4,31,33,28,29,39,15,-1,0,-2,-8,-14,-13,-13,-12,-10,-4,-3,2,3,27,32,26,21,20,12,6,4,-1,-5,-7,-8,-10,-10,-9,0,6,10,7,18,28,63,11,11,7,5,3,0,-4,-6,-8,-10,-14,-14,1,43,10,5,5,-2,-32,-15,41,-9,7,2,-1,-4,-7,-9,-12,-21,-19,-24,-46,-14,-4,-8,-8,-41,-78,-77,-5,-2,0,-1,-4,-6,-9,-14,-28,-37,-84,-40,-15,-15,-14,-20,-28,-44,-41,-24,-11,-4,-3,-1,-3,-8,-14,-16,-34,-42,-34,-24,-20,-19,-22,-30,-36,-31,-23,-12,-7,-4,-3,-4,-8,-12,-16,-26,-30,-31,-26,-24,-23,-26,-29,-30,-28,-20,-13,-7,-3,-2,-3,-6,-11,-17,-22,-26,-27,-28,-26],"ownershipAllowedMAE":0.0371949})%"); + lines.push_back(R"%({"sample":{"board":"...X.............../..X.XO.......XXX.../X.XXO..O....OXO..../.XOOOXX..X.XXO.OXX./.O...OX.OX..OO.OXO./..XO.OX.OX..OXXXOXX/.....OO.OX.....XOO./...O..X.OX...OOOOO./.XO.....OXO....XOX./.OXX..X..OXX..OOX.X/..X..X.O.O....O.OX./OXXO...OXOX...O.OO./.OOXXX.O..X...XOO../..OOOO.X......X..../..X..XXOXX......O../...OOOX.OX.....XO../..O.OXO.O..X...XX../....XXX............/.................../","hintLoc":"null","initialTurnNumber":151,"metadata":"0C21E9525BBF571CCE13851D7D1C5AF6:161","moveLocs":["K18","D2","M18","G18","M12","M17","F17","J18","H18","N13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":3.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.1e-06,0.000231,9.1e-06,0,7.32e-06,0.00588,1.06e-05,1.11e-05,2.17e-05,8.4e-06,8.73e-06,7.66e-06,7.19e-06,6.94e-06,7.21e-06,7.4e-06,7.73e-06,8.58e-06,6.98e-06,8.21e-06,0.000233,0,0,0,0,0,0,0,0,1.42e-05,0,0.0694,0,0,0,2.15e-05,2.13e-05,1.21e-05,0,5.88e-05,0,0,0,0,8.79e-06,0,0.00786,2.33e-05,0.002,0,0,0,0,0.000318,0.0492,0.000208,2.38e-05,1.09e-05,0,0,0,0,0,0,7.73e-06,1.05e-05,0,8.6e-06,0,0,0,7.31e-06,0,0,0,0.000228,1.35e-05,0,1.14e-05,7.95e-06,6.99e-06,0,0,7.67e-06,0,0,7.31e-06,1.88e-05,0,0,1.2e-05,0,0,0,1.17e-05,1.09e-05,1.48e-05,0,0,7.09e-06,0,0,7.97e-06,0,0,9.12e-06,0.0304,0,0,0,0,0,0,0,9.19e-06,1.22e-05,1.21e-05,7.93e-06,7.62e-06,0,0,7.51e-06,0,0,7.75e-06,0.258,0,0.112,1.09e-05,0,0,0,0.000101,9.64e-06,0.0897,1.66e-05,0,1.6e-05,2.14e-05,0,9.23e-06,0,0,7.9e-06,0,0.000773,0,0,0,0,0,7.22e-06,4.71e-05,0,0,0.0204,0.0847,0.0201,1.11e-05,1.02e-05,0,0,0,1.66e-05,9.69e-06,7.7e-06,7.22e-06,0,0,0,7.55e-06,2.04e-05,0,0,0,0.000575,1.68e-05,0,1.01e-05,7.31e-06,0,0,0,9.5e-06,7.81e-06,0,0,0,7.53e-06,0,0.0133,7.02e-05,0,8.34e-06,0.001,0,0.000549,0,7.93e-06,0,0.000199,1.15e-05,1.01e-05,8.16e-06,0,7.03e-06,0,0,7.69e-06,0,0,0,0,0.012,0.000761,9.11e-06,0,0,0,0,2.17e-05,0.0391,1.2e-05,0,6.77e-06,0,0,7.52e-06,9.1e-06,0,0,0,0,0,0.00482,0,8.97e-06,1.35e-05,0,4.27e-05,0.0506,0.00442,0,0,0,7.14e-06,7.09e-06,7.89e-06,7.7e-06,0,0,0,0,0.112,0,0.00104,3.36e-05,0.00285,1.08e-05,0.000184,1.23e-05,0,1.13e-05,7.19e-06,6.79e-06,7.25e-06,7.73e-06,8.1e-06,0,8.01e-06,1.14e-05,0,0,0,0,0,9.48e-06,9.61e-06,9.04e-06,1.11e-05,0.000261,5.01e-05,0,9.28e-06,8.56e-06,7.65e-06,8.16e-06,7.44e-06,0,0,0,0,0.0021,0,0,9.29e-06,1.06e-05,8.34e-06,9.99e-06,1.07e-05,0,0,1.17e-05,9.79e-06,8.02e-06,8.7e-06,0,7.73e-06,0,0,0,3.19e-05,0,9.93e-06,1.42e-05,0,2.42e-05,8.98e-06,9.55e-06,0,0,0.000284,9.62e-06,8.21e-06,1.06e-05,5.24e-05,0,0,0,0,1.06e-05,7.93e-06,9.08e-06,8.68e-06,3.56e-05,8.46e-06,9.55e-06,9.37e-06,9.39e-06,1e-05,1.17e-05,1.02e-05,7e-06,9.87e-06,8.6e-06,7.66e-06,6.97e-06,7.03e-06,7.3e-06,7.52e-06,7.64e-06,7.13e-06,7.34e-06,7.32e-06,7.48e-06,7.35e-06,7.63e-06,7.94e-06,8.32e-06,9.83e-06,7.3e-06,1.11e-05],"winrateAvg":0.534928,"leadAvg":0.445623,"scoreMeanAvg":0.499935,"scoreStdevAvg":7.64742,"shorttermWinlossErrorAvg":0.304608,"shorttermScoreErrorAvg":1.90397,"ownership":[-88,-88,-85,-83,-19,36,62,79,78,59,33,-28,-59,-77,-90,-95,-95,-94,-94,-88,-89,-90,-65,-69,98,50,94,-47,65,16,26,-59,-99,-98,-98,-89,-94,-94,-89,-85,-90,-91,99,99,65,92,-45,-63,-3,-93,-63,-99,32,-21,-35,-94,-93,-39,-85,99,99,99,50,49,57,-11,-95,-68,-93,-93,94,29,86,-96,-96,-92,4,76,75,83,94,100,51,73,99,-95,-55,-17,94,95,87,89,-96,-91,-92,34,30,28,97,81,100,48,76,99,-95,-30,-4,95,89,89,88,100,-91,-91,55,55,61,70,61,100,100,64,99,-94,-25,18,14,96,95,87,100,100,66,62,73,73,94,11,22,-48,21,99,-94,-15,78,60,100,100,100,100,100,98,45,35,88,-30,-28,-19,-30,25,99,-92,37,-4,22,48,88,92,100,97,98,19,50,-92,-92,-69,-62,-81,-14,70,97,-50,-49,7,46,100,100,98,98,97,-3,-47,-92,-88,-81,-89,2,97,68,97,34,-6,18,51,100,99,100,97,98,60,-92,-91,-83,-83,-37,21,97,13,97,-85,-15,20,40,100,99,100,100,97,59,97,97,-86,-86,-84,53,97,16,11,-87,-19,17,9,-85,100,100,96,93,83,89,98,97,97,97,49,-88,-15,-23,-52,-45,-56,-57,-86,8,67,88,83,81,83,77,88,-14,-97,-98,-85,-99,-99,-66,-62,-65,-70,-60,14,97,90,51,80,83,84,97,97,97,-98,-96,-92,-100,-82,-72,-79,-81,-79,-98,97,13,33,73,76,92,-1,96,-98,-95,-96,-93,-96,-94,-98,-90,-89,-90,-98,-98,-4,-14,59,39,-16,-98,-98,-98,-98,-96,-96,-95,-95,-95,-93,-92,-93,-95,-88,-82,-28,21,-28,-58,-73,-90,-94,-96,-96,-96,-95,-95,-94,-93,-92,-92,-91,-88,-81,-61],"ownershipAllowedMAE":0.0376178})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...............O.../...O.............../.................../.................../.................../.................../.................../.................../...X.............../...XO............../...XO............../...XO..........X.../....O............../..X...X.XX........./....O....OO....X.../.................../.................../","hintLoc":"null","initialTurnNumber":19,"metadata":"917558B9C67183183B47B96099A35994:29","moveLocs":["H2","L4","M3","R15","C14","O16","P16","P15","O17","N16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.77,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.25e-06,2.43e-06,2.38e-06,2.61e-06,2.7e-06,2.6e-06,2.53e-06,2.53e-06,2.56e-06,2.63e-06,2.87e-06,3.1e-06,3.32e-06,3.27e-06,2.86e-06,2.71e-06,2.59e-06,2.51e-06,2.2e-06,2.42e-06,2.75e-06,3.46e-06,4.02e-06,4.82e-06,4.49e-06,4.48e-06,4.41e-06,4.47e-06,4.67e-06,1.11e-05,0.00339,0.000102,6.45e-06,5.28e-06,2.93e-06,3.37e-06,3.53e-06,2.82e-06,2.3e-06,2.94e-06,3.92e-06,4.48e-06,1.67e-05,2.68e-05,2.43e-05,2.08e-05,1.69e-05,1.69e-05,1.84e-05,1.86e-05,0.751,0,5.04e-06,0,8.84e-06,3.02e-05,2.83e-06,2.26e-06,3.02e-06,3.2e-06,0,3.7e-06,5.69e-06,9.23e-06,1.54e-05,1.65e-05,1.33e-05,8.47e-06,4.07e-06,0,0,0,3.7e-05,0.000634,0.000242,2.75e-06,2.27e-06,3.03e-06,2.81e-06,2.87e-06,3.57e-06,4.4e-06,4.95e-06,5.92e-06,6.75e-06,6.08e-06,4.71e-06,4.28e-06,4.13e-06,0.00136,0,0.238,0,3.68e-05,2.5e-06,2.44e-06,2.83e-06,0,3.34e-06,4.17e-06,4.63e-06,5e-06,5.49e-06,6.15e-06,6.35e-06,5.93e-06,5.31e-06,5.89e-06,1.93e-05,9.71e-05,4.77e-05,1.72e-05,5.52e-06,2.56e-06,2.41e-06,3.52e-06,3.53e-06,3.86e-06,4.42e-06,4.77e-06,5.08e-06,5.43e-06,6.16e-06,7.27e-06,6.92e-06,6.73e-06,6.08e-06,7.18e-06,5.67e-06,1.19e-05,1.84e-05,4.86e-06,2.53e-06,2.51e-06,4.09e-06,9.93e-06,5.05e-06,4.48e-06,4.77e-06,5e-06,5.38e-06,6.33e-06,8.15e-06,8.94e-06,8.3e-06,8.38e-06,7.62e-06,7.12e-06,1.28e-05,2.12e-05,4.38e-06,2.51e-06,2.47e-06,4.28e-06,2.5e-05,1.08e-05,4.81e-06,5.05e-06,5.06e-06,5.57e-06,7.14e-06,1.03e-05,1.22e-05,1.27e-05,1.26e-05,1.15e-05,1.08e-05,2.5e-05,2.59e-05,4.34e-06,2.51e-06,2.46e-06,3.93e-06,6.82e-06,5.22e-06,4.35e-06,1.05e-05,5.34e-06,5.99e-06,9.44e-06,1.42e-05,1.59e-05,1.66e-05,1.67e-05,1.48e-05,1.47e-05,2.93e-05,2.92e-05,4.32e-06,2.56e-06,2.46e-06,3.71e-06,3.31e-06,0,6.82e-06,3.99e-06,4.74e-06,8.04e-06,1.73e-05,2.01e-05,2.01e-05,1.94e-05,1.75e-05,1.39e-05,1.39e-05,3e-05,4.05e-05,4.47e-06,2.51e-06,2.42e-06,3.59e-06,2.49e-06,0,0,2.81e-06,4.37e-06,1.28e-05,3.22e-05,2.96e-05,2.57e-05,2.19e-05,1.74e-05,1.28e-05,1.64e-05,3.2e-05,5.73e-05,9.86e-06,2.64e-06,2.4e-06,3.48e-06,2.47e-06,0,0,2.44e-06,3.92e-06,1.4e-05,3.37e-05,2.17e-05,2.55e-05,2.43e-05,2e-05,1.5e-05,2e-05,5.07e-05,5.26e-05,8.92e-06,2.47e-06,2.38e-06,3.56e-06,3.36e-06,0,0,2.57e-06,4.1e-06,4.54e-06,7.52e-06,1.13e-05,1.93e-05,2.66e-05,2.49e-05,1.26e-05,7.99e-05,0,8.76e-05,9.81e-06,2.6e-06,2.58e-06,3.94e-06,1.36e-05,0.000952,0,2.85e-06,3.92e-06,5.8e-06,3.06e-06,2.58e-06,3.06e-06,6.05e-06,4.57e-05,1.75e-05,0.000107,0.000103,0.00012,2.49e-05,2.61e-06,2.54e-06,4.07e-06,0,4e-05,2.95e-06,3.11e-06,0,3.61e-06,0,0,0,3.31e-05,5.15e-06,1.97e-05,0.000137,0.000307,0.00024,9.26e-06,2.56e-06,2.59e-06,3.58e-06,1.29e-05,4.5e-06,0,4.01e-06,5.51e-06,4.8e-06,3.5e-06,0,0,0,3.45e-06,3.4e-05,9.55e-05,0,0.000162,4.21e-06,2.54e-06,2.59e-06,3.39e-06,4.71e-06,4.01e-06,3.41e-06,4.1e-06,3.47e-06,0,2.84e-06,2.43e-06,2.22e-06,2.4e-06,3.32e-06,5.25e-06,7.38e-06,1.06e-05,4.23e-06,3.87e-06,2.47e-06,2.28e-06,2.53e-06,2.67e-06,2.67e-06,2.91e-06,2.71e-06,2.71e-06,2.53e-06,2.42e-06,2.39e-06,2.27e-06,2.45e-06,2.53e-06,2.65e-06,2.65e-06,2.74e-06,2.66e-06,2.59e-06,2.27e-06,3.32e-06],"winrateAvg":0.58031,"leadAvg":0.758322,"scoreMeanAvg":1.00578,"scoreStdevAvg":13.1937,"shorttermWinlossErrorAvg":0.0715904,"shorttermScoreErrorAvg":0.56525,"ownership":[29,25,22,19,14,8,4,2,2,7,17,32,50,61,66,65,57,48,41,31,28,28,21,20,9,4,2,3,8,23,39,56,71,71,71,60,43,29,34,37,40,44,38,10,5,2,-2,-1,8,26,79,85,79,87,34,22,17,40,42,53,86,25,9,3,0,-4,-11,-46,-81,-85,-84,82,31,25,14,-7,43,49,51,36,20,7,3,0,-5,-12,-19,-30,-42,-59,-83,10,-72,-37,-26,40,46,82,29,13,5,2,0,-3,-7,-12,-18,-22,-34,-42,-59,-44,-40,-35,28,29,17,9,5,2,1,0,-2,-4,-7,-11,-15,-20,-28,-35,-39,-36,-34,12,11,-8,3,0,0,-1,-1,-2,-3,-5,-7,-10,-14,-19,-24,-29,-32,-28,-3,-5,0,-10,-2,1,-1,-2,-3,-3,-4,-5,-7,-9,-13,-18,-24,-25,-21,-18,-22,-23,-27,-7,3,-3,-5,-5,-5,-5,-5,-5,-6,-9,-12,-25,-16,-13,-33,-40,-46,-92,0,5,-3,-8,-8,-8,-8,-6,-5,-4,-6,-16,-8,-7,-6,-47,-56,-62,-92,82,22,-6,-18,-14,-17,-13,-9,-5,-4,-4,-6,17,-2,-4,-57,-64,-71,-92,82,26,-4,-14,-13,-18,-17,-11,-7,-6,-9,-16,-23,-12,-9,-62,-67,-73,-92,82,24,-23,-14,-16,-15,-16,-10,-8,-11,-18,-77,-33,-17,-16,-62,-70,-67,22,83,19,-11,-13,-28,-31,-26,-14,-6,-6,-14,-33,-30,-22,-21,-55,-64,-86,-8,42,3,-61,-18,-72,-72,-72,19,8,4,-14,-28,-29,-30,-28,-45,-45,-37,-17,80,20,4,30,-15,87,87,87,25,-5,-17,-78,-45,-36,-35,-36,-29,-9,10,43,49,27,82,68,78,74,58,32,3,-24,-46,-46,-42,-38,-26,-14,-2,19,37,42,47,53,65,68,62,51,28,1,-22,-35,-41,-42,-40],"ownershipAllowedMAE":0.0328048})%"); + lines.push_back(R"%({"sample":{"board":"....O............../..XXXOOO.........../.XOXXXXOOO...O..O../..OXOXOXXXOOO..XO../.OOO.OOX.OXXO....../OOXXOOXX....XO...../XXXXXXO.....XO...../OOOOOXXO.....XOOO../..XXOXXX..X..X..XO./.XXO.OXX.X..XXOOXO./.XO.OOX..X.XOX.XXO./OXOOOXOOXOOOOX.XO../OOOOXXXOXXXO.X.OOXO/OXOX.X.OXXOOOXOOXO./XXXXXX..XOXXOOXXXO./..XOOOX.XOOX.OOOXXX/.OXOXOXX.OXXX.OXX.O/O.OXXOOXO.OX.OOOXXO/.O...OXX.O.XO.OX.X./","hintLoc":"null","initialTurnNumber":247,"metadata":"A8980F3E92DF9B5343763167B842DAAE:257","moveLocs":["L9","M10","S8","E15","T5","N2","S3","L10","R1","P11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.26e-05,1.92e-05,4.01e-05,0.000445,0,0.000428,1.51e-05,1.26e-05,1.27e-05,1.31e-05,1.3e-05,1.28e-05,1.23e-05,1.29e-05,1.21e-05,1.21e-05,1.31e-05,1.36e-05,1.09e-05,0.00011,0.0223,0,0,0,0,0,0,1.2e-05,1.35e-05,1.35e-05,1.35e-05,1.3e-05,1.23e-05,1.4e-05,1.38e-05,1.41e-05,1.42e-05,1.35e-05,0.00292,0,0,0,0,0,0,0,0,0,1.35e-05,1.4e-05,1.27e-05,0,1.33e-05,1.49e-05,0,1.33e-05,1.35e-05,0.000234,0.00127,0,0,0,0,1.14e-05,0,0,0,0,0,0,1.38e-05,1.52e-05,0,0,1.3e-05,1.3e-05,1.07e-05,0,0,0,0,1.27e-05,1.25e-05,0,2.28e-05,0,0,0,0,1.52e-05,1.55e-05,1.61e-05,1.44e-05,1.41e-05,1.22e-05,0,0,0,0,1.22e-05,1.27e-05,0,0,0.00149,0.00464,0.141,0.0437,0,0,1.4e-05,1.54e-05,1.56e-05,1.45e-05,1.23e-05,0,0,0,0,0,0,0,1.81e-05,0.000223,0.00343,0.0125,0.0135,0,0,1.72e-05,1.51e-05,1.44e-05,1.44e-05,1.24e-05,0,0,0,0,0,0,0,0,2.23e-05,0.000241,0.00247,0.00216,0.0664,0,0,0,0,1.56e-05,1.35e-05,2.76e-05,2.06e-05,0,0,0,0,0,0,1.4e-05,1.62e-05,0,0.000234,1.91e-05,0,0,0.463,0,0,1.22e-05,1.98e-05,0,0,0,1.97e-05,0,0,0,1.27e-05,0,0,0,0,0,0,0,0,0,1.19e-05,3.44e-05,0,0,5.51e-06,0,0,0,1.25e-05,1.21e-05,0,0,0,0,0,0.000562,0,0,0,1.19e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000733,0,0,0,1.18e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.07e-05,0,0.000354,0,0,1.08e-05,0,0,0,0,0,0,0,1.36e-05,0,0,0,0,0,0,0,0,0,0,0,1.12e-05,0,0,0,0,0,0,1.29e-05,1.43e-05,0,0,0,0,0,0,0,0,0,0,0,0.000161,5.73e-05,0,0,0,0,0,1.39e-05,0,0,0,0,0.00683,0,0,0,0,0,0,0.000168,0,0,0,0,0,0,0,5.03e-05,0,0,0,0,0.0102,0,0,0,0,0,0,5.43e-06,0,0,0,0,0,0,0,0.00262,0,0,0,0,0,0,0,0,0,3.84e-06,0,0.000445,0.000682,2.35e-05,0,0,0,1.81e-05,0,0.0102,0,0,3.64e-05,0,0.000251,0,0,0.183,7.16e-05],"winrateAvg":0.992786,"leadAvg":5.01673,"scoreMeanAvg":4.62657,"scoreStdevAvg":3.8207,"shorttermWinlossErrorAvg":0.045165,"shorttermScoreErrorAvg":1.35254,"ownership":[-96,-97,-96,-77,59,57,90,98,99,99,99,99,99,99,98,98,98,98,98,-95,-94,-100,-100,-100,100,100,100,99,99,99,99,99,99,98,98,98,98,98,-94,-95,-94,-100,-100,-100,-100,100,100,100,99,99,99,100,99,98,100,98,98,-95,-94,-95,-100,-100,-100,-100,-100,-100,-100,100,100,100,99,98,98,100,99,98,-95,-95,-95,-96,-100,-100,-100,-100,-96,-90,-88,-88,100,98,98,98,98,99,98,-96,-95,-100,-100,-100,-100,-100,-100,-95,-92,-87,-89,-92,99,98,98,99,98,99,-100,-100,-100,-100,-100,-100,-98,-98,-95,-92,-91,-90,-92,99,98,98,99,99,99,99,99,99,99,99,-100,-100,-96,-96,-95,-93,-93,-92,-100,100,100,100,99,99,97,97,97,97,99,-100,-100,-100,-98,-98,-100,-97,-97,-100,-100,82,-98,100,99,97,96,97,100,99,100,-100,-100,-99,-100,-100,-100,-100,-100,79,82,-98,100,100,98,97,100,99,100,100,-100,-99,-100,-100,97,-100,97,-100,-29,-99,-98,100,100,100,97,100,100,100,-100,-99,-99,-100,98,97,96,97,-100,-51,-99,100,100,100,100,100,100,100,-100,-100,-100,-99,-100,-100,-100,97,-17,-100,29,100,100,100,100,100,-100,100,-100,-100,-100,-99,-99,-100,-100,98,97,98,-100,100,100,97,100,100,-100,-100,-100,-100,-100,-100,-99,-99,-100,-98,-98,-98,98,98,96,97,97,100,100,-21,-39,-100,-98,-98,-98,-100,-100,-100,-98,-97,-97,15,98,98,98,96,97,97,92,92,-100,-98,-99,-98,-100,-100,-99,-97,-97,-97,-97,46,98,96,96,97,97,92,92,93,-98,-99,-98,-98,-100,-97,-98,-97,-97,-97,97,98,98,96,96,97,93,92,90,2,-98,-98,-100,-100,-99,-96,-97,-97,11,12,98,96,97,96,95],"ownershipAllowedMAE":0.0166941})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...O.........X.XX../.......O.......OX../...O...........OX../...............OO../....XXO.......O..../..OOOXO............/...OXOO.....XXX..../..X.X.X......OOO.../....X.X.........O../..XXOO.......XXXO../..XOX.O.......OO.../.XOO.O............./.X....X............/.OOOO........X.XX../.OXXXOX.......XO.../.X...X.X.........../.................../","hintLoc":"null","initialTurnNumber":68,"metadata":"AF34829069334EFB640B23AFE8C0C4B0:78","moveLocs":["J7","C16","C17","B12","B13","B11","C14","E16","D16","J16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.84,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.5e-06,4.58e-06,4.6e-06,4.76e-06,4.92e-06,4.98e-06,5.28e-06,5.52e-06,5.47e-06,5.19e-06,5.19e-06,5.04e-06,5.09e-06,5.03e-06,5.23e-06,4.93e-06,4.77e-06,4.85e-06,4.5e-06,4.47e-06,4.45e-06,4.86e-06,4.98e-06,5.1e-06,5.97e-06,1.12e-05,3.3e-05,2.82e-05,1.85e-05,7.78e-06,6.89e-06,6.34e-06,3.36e-05,8.41e-05,5.94e-06,5.24e-06,4.95e-06,4.92e-06,4.43e-06,4.57e-06,0,0,5.3e-06,6.19e-06,6.9e-05,0.777,0.0941,1.34e-05,3.53e-05,1.68e-05,6.49e-05,0,0.000115,0,0,4.85e-06,5.01e-06,4.38e-06,4.48e-06,0,0,0,5.6e-06,4.2e-05,0,0,6.48e-05,4.1e-05,2.48e-05,5.07e-05,4.41e-05,6.1e-06,0,0,4.65e-06,5.31e-06,4.63e-06,4.37e-06,4.57e-06,0,5.25e-06,5.96e-06,3.75e-05,0.0687,0.0279,3.56e-05,3.28e-05,2.73e-05,9.09e-06,5.9e-06,4.68e-06,0,0,6.41e-06,5.13e-06,4.83e-06,4.78e-06,0,4.95e-06,4.95e-06,5.77e-06,7.7e-06,4.27e-05,3.99e-05,4.02e-05,3.02e-05,2.92e-05,7.95e-06,5.57e-06,4.44e-06,0,0,7.31e-06,5.66e-06,5.13e-06,0,4.32e-06,4.91e-06,0,0,0,5.63e-06,1.05e-05,2.44e-05,2.62e-05,1.04e-05,8e-06,5.58e-06,0,4.56e-06,5.19e-06,5.36e-06,5.02e-06,5.85e-06,0,0,0,0,0,0,4.87e-06,7.91e-06,1.99e-05,1.59e-05,7.93e-06,5.72e-06,4.8e-06,4.72e-06,5.29e-06,4.83e-06,5.06e-06,4.95e-06,5.6e-06,0,7.21e-06,0,0,0,0,5.96e-06,1.67e-05,2.34e-05,1.94e-05,6.54e-06,0,0,0,5.39e-06,4.98e-06,5.28e-06,4.87e-06,5.8e-06,2.7e-05,0,0.0277,0,1.41e-05,0,7.42e-06,2.16e-05,2.68e-05,1.25e-05,6.8e-06,8.05e-06,0,0,0,4.59e-06,4.88e-06,4.85e-06,5.53e-06,0.000813,7.52e-06,4.43e-05,0,1.59e-05,0,6.22e-06,2.1e-05,3.32e-05,1.63e-05,2.76e-05,6.38e-06,5.06e-06,4.26e-06,4.65e-06,0,5e-06,4.88e-06,5.67e-06,0.000316,0,0,0,0,5.74e-06,7.11e-06,7e-06,2.57e-05,2.26e-05,1.93e-05,6.41e-06,0,0,0,0,4.91e-06,5.17e-06,6.82e-06,0.000113,0,0,0,4.75e-06,0,4.73e-06,0,7.07e-06,4.17e-05,1.82e-05,7.23e-06,6.67e-06,0,0,5.2e-06,5.65e-06,5.28e-06,6.21e-06,0,0,0,5.5e-06,0,5.9e-06,7.04e-06,6.74e-06,4.23e-05,3.57e-05,2.91e-05,2.67e-05,6.39e-06,4.79e-06,5.38e-06,8.49e-06,5.79e-06,5.58e-06,4.4e-05,0,9.4e-06,4.16e-06,4.71e-06,6.55e-06,0,2.48e-05,2.19e-05,2.36e-05,7.25e-06,7.9e-06,9.75e-06,6.61e-06,3.98e-05,5.81e-06,5.79e-06,7.48e-06,5.37e-06,5.76e-06,0,0,0,0,8.12e-06,2.12e-05,2.52e-05,6.36e-06,6.65e-06,6.77e-06,6.52e-06,6.74e-06,0,7.18e-06,0,0,7.99e-06,5.52e-06,5.24e-06,0,0,0,0,0,0,5.29e-06,6.28e-06,6.2e-06,6.07e-06,6.07e-06,7.94e-06,2.02e-05,0,0,1.82e-05,6.12e-06,5.22e-06,2.06e-05,0,0.000485,7.91e-06,1.97e-05,0,5.88e-06,0,5.55e-06,5.72e-06,5.65e-06,5.5e-06,6.09e-06,8.76e-06,7.6e-05,5.85e-06,5.95e-06,5.75e-06,5.32e-06,4.81e-06,1.09e-05,6.2e-06,6.3e-06,4.87e-06,5.35e-06,5.28e-06,4.87e-06,4.69e-06,4.86e-06,4.76e-06,4.85e-06,4.76e-06,5.13e-06,5.06e-06,5.28e-06,4.87e-06,5.19e-06,4.43e-06,5.23e-06],"winrateAvg":0.4639,"leadAvg":-0.254166,"scoreMeanAvg":-0.662167,"scoreStdevAvg":13.0927,"shorttermWinlossErrorAvg":0.159065,"shorttermScoreErrorAvg":1.14028,"ownership":[95,94,91,87,80,69,56,35,8,-12,-24,-32,-43,-55,-69,-80,-85,-85,-83,96,96,96,91,84,76,74,52,12,-30,-27,-32,-44,-66,-75,-87,-90,-85,-81,97,98,100,100,83,80,79,87,-52,-29,-21,-19,-27,-90,-39,-95,-95,-88,-74,97,98,97,100,71,80,82,93,-65,-23,-12,-6,4,-11,3,90,-95,-78,-60,96,97,98,100,85,82,80,26,-4,-14,-6,1,0,-2,30,91,-95,-41,-36,95,96,100,92,87,85,72,27,-3,-6,-4,1,-8,9,42,91,90,5,5,38,98,97,87,80,80,93,26,4,-5,-3,-5,3,7,83,51,59,67,37,5,-92,98,98,98,80,92,30,1,-5,-5,-5,-15,-12,-3,15,57,50,53,-77,-93,19,98,-95,91,92,9,6,-4,-6,-16,-66,-65,-65,0,68,68,63,-87,-89,-94,61,-94,-27,-94,-21,-7,-3,-5,-6,-3,93,93,93,80,72,68,-88,-85,-91,-89,-95,-34,-94,-26,3,5,-5,-2,10,14,9,43,95,81,66,-88,-92,-96,-96,85,85,4,-9,21,6,-6,-11,-14,-62,-60,-59,95,69,55,-83,-88,-97,84,76,82,88,38,78,16,-18,-17,-16,-17,73,75,67,40,24,-37,-88,84,84,78,87,26,3,24,-16,-35,-23,-19,-13,15,17,-20,-38,-11,43,-85,15,58,56,8,-74,5,-14,-28,-41,-35,-29,-31,21,-16,-38,-55,-51,60,85,85,85,85,4,-42,-28,-27,-41,-49,-49,-52,-95,-35,-95,-95,-78,-64,68,86,-97,-97,-97,0,-98,-54,-42,-50,-56,-60,-61,-77,-97,-77,-82,-80,-74,60,-88,-88,-95,-96,-99,-96,-98,-62,-62,-60,-63,-68,-79,-79,-83,-80,-78,-77,-29,-77,-90,-93,-96,-96,-94,-84,-74,-62,-59,-61,-67,-74,-79,-80,-80,-79,-78],"ownershipAllowedMAE":0.0310726})%"); + lines.push_back(R"%({"sample":{"board":".................../..............X..../.....O.OO.......XX./..XX...X....XXOOO../..O.........XO...O./..OXX.......XO.XXO./...O........XO...../............XXO.O../.............OO.OX./..O................/...........OX....../..........X..X..XO./..........XOO..X.O./..........XXO.XOXO./............XO..XXX/...X..OO..O.XO.OOO./....XO.OX..XOXXXXO./....O.OX...XO...OX./.....OX............/","hintLoc":"null","initialTurnNumber":97,"metadata":"E5C69FF35F2FC6932F0FE92CD23F9997:107","moveLocs":["M8","O6","C6","B5","L2","M4","M1","O2","N1","S9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.13,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0","komi":7.0,"policyOptimism":0.888,"pda":0.151,"policyMixture":[1.68e-06,2.11e-06,2.27e-06,2.63e-06,2.79e-06,2.63e-06,1.97e-06,2.04e-06,2.08e-06,2.17e-06,2.36e-06,2.31e-06,2.35e-06,2.78e-06,3.26e-06,2.97e-06,2.38e-06,2.22e-06,1.66e-06,2.14e-06,6.28e-06,1.65e-05,0.000338,0.00222,4.98e-06,3.85e-06,2.14e-06,2.42e-06,4.27e-06,3.66e-05,6.42e-05,0.00393,0.000233,0,6.62e-05,1.36e-05,5.28e-06,2.05e-06,2.38e-06,5.6e-06,4.7e-06,8.37e-06,3.41e-05,0,3.79e-06,0,0,4.07e-06,3.12e-05,3.87e-05,5.82e-06,2.13e-05,6.66e-05,1.96e-05,0,0,2.28e-06,2.63e-06,5.66e-05,0,0,4.05e-05,3.19e-05,0.0023,0,1.18e-05,5.42e-06,6.71e-06,3.16e-06,0,0,0,0,0,3.84e-06,2.36e-06,3.09e-06,6.02e-06,0,0.000458,3.67e-06,9.46e-06,1.27e-05,6.82e-06,8.18e-06,1.45e-05,5.82e-06,2.3e-06,0,0,2.67e-06,2.21e-06,2.16e-06,0,2.01e-06,2.36e-06,4.21e-06,0,0,0,4.95e-06,3.16e-05,2.49e-05,2.03e-05,1.38e-05,5.4e-06,2.22e-06,0,0,2.78e-06,0,0,0,1.78e-06,2.07e-06,4.09e-06,6.29e-06,0,0.000205,6.1e-06,2.59e-05,2.37e-05,1.79e-05,9.95e-06,5.83e-06,2.27e-06,0,0,2.62e-06,2.32e-06,2.51e-06,2.52e-06,2.1e-06,1.98e-06,4.05e-06,2.45e-05,4.85e-05,2.8e-05,2.71e-05,2.77e-05,2.48e-05,1.45e-05,9.29e-06,6.18e-06,3.12e-06,0,0,0,1.86e-06,0,1.73e-05,2.26e-06,1.84e-06,3.53e-06,4.36e-06,6.75e-06,1.41e-05,3.65e-05,3.7e-05,2.79e-05,1.53e-05,8.99e-06,6.78e-06,7.92e-06,1.3e-05,0,0,1.99e-06,0,0,2.58e-06,1.95e-06,3.01e-06,0,4.71e-06,9.79e-06,2.72e-05,3.71e-05,3.82e-05,2.94e-05,2.06e-05,8.6e-06,3.18e-05,0.00499,4.08e-06,3.4e-06,9.2e-06,0.00727,2.92e-05,2.65e-06,1.94e-06,4.06e-06,4.48e-06,6.09e-06,1.06e-05,2.26e-05,3.33e-05,4.07e-05,3.42e-05,1.47e-05,0.00041,0,0,7.19e-06,0.000258,0.000234,0.129,0,3.96e-06,2.09e-06,5.23e-06,2.97e-05,1.33e-05,1.03e-05,1.63e-05,3.04e-05,5.3e-05,2.32e-05,4.89e-06,0,0,2.57e-06,0,4.1e-05,8.24e-06,0,0,2.12e-06,2.23e-06,9.22e-06,2.26e-05,5.73e-05,1.88e-05,1.3e-05,1.6e-05,2.51e-05,2.04e-05,3.04e-06,0,0,0,0.000393,5.32e-05,0,0.0646,0,1.78e-06,2.27e-06,0.0262,0,7.63e-05,7.78e-05,5.82e-06,5.23e-06,6.07e-06,6.46e-06,4.01e-06,0,0,0,0,0,0,0,0,2.41e-06,2.13e-06,0,0.0113,4.19e-06,8.92e-06,3.61e-06,2.51e-06,2.71e-06,4e-06,8.94e-05,4.45e-06,0.000262,0,0,3.54e-06,0.0416,0,0,0,2.15e-06,6.37e-06,4.12e-06,0,5.94e-06,2.42e-06,0,0,4.57e-06,2.98e-06,0,0,0,0,0.0272,0,0,0,7.38e-06,2.46e-06,7.55e-05,0.0158,4.6e-06,0,0,1.62e-06,0,0,3.21e-06,0.423,0,0,0,0,0,0,0,5.27e-06,2.33e-06,5.7e-06,0.000151,2.04e-05,0,1.73e-06,0,0,3.57e-06,2.9e-06,0,0,0,0,2.59e-06,0.00291,0,0,0.0755,1.67e-06,2.57e-06,2.71e-06,2.42e-06,1.71e-06,0,0,2.61e-06,2.39e-06,2.18e-06,5.5e-06,0,0,1.55e-05,5.05e-06,1.84e-05,3.48e-05,0.156,2.47e-06,4.84e-06],"winrateAvg":0.729223,"leadAvg":2.90286,"scoreMeanAvg":3.84197,"scoreStdevAvg":12.7687,"shorttermWinlossErrorAvg":0.245202,"shorttermScoreErrorAvg":2.75362,"ownership":[-44,-41,-33,-15,12,37,53,59,52,35,12,-7,-26,-47,-65,-78,-79,-79,-74,-46,-43,-40,-26,11,48,67,72,60,29,12,-6,-14,-56,-90,-75,-82,-74,-71,-41,-56,-56,-32,-27,81,45,87,87,29,5,-8,-38,-33,9,-8,-84,-85,-58,-22,-19,-84,-84,-27,1,21,-35,28,10,-5,-31,-97,-96,93,92,93,-52,-5,12,19,76,3,-24,-8,-15,-3,1,-3,-10,-40,-97,89,85,85,89,94,31,38,60,76,-66,-65,-19,-11,-10,-7,-7,-15,-42,-97,89,85,76,77,94,69,55,63,51,67,-3,-13,-9,-8,-9,-9,-15,-42,-97,89,87,87,89,61,54,62,66,50,28,6,-1,-4,-5,-7,-9,-15,-36,-97,-97,96,89,96,10,31,63,67,51,26,12,3,-1,-3,-5,-6,-9,-15,-21,95,96,55,96,-39,6,60,65,87,26,13,5,1,0,-3,-6,-1,-3,20,26,35,16,0,-26,-23,51,54,35,19,9,4,1,0,-3,-14,6,38,-59,-8,5,-1,-10,-53,-33,42,45,31,17,6,3,1,1,-14,-23,-94,36,-18,-81,-35,-20,-58,-24,-43,37,41,31,22,5,2,0,-3,-13,-33,-95,39,38,-12,-58,-93,-46,-26,-54,23,56,77,6,3,2,3,1,-15,-28,-96,-96,39,-97,-97,-71,-96,-28,-77,14,-20,17,-2,7,15,31,30,11,-21,-20,-96,-97,-81,-89,-83,-96,-96,-96,-5,-1,-14,-43,17,49,98,98,45,19,75,-97,-97,-79,-83,-58,-55,-55,-78,-2,-7,21,6,-20,97,95,98,26,53,75,-97,67,-89,-90,-88,-87,-48,-62,1,9,23,22,93,92,98,70,71,64,78,-95,70,-89,-68,-66,-49,-61,-55,8,15,24,41,62,96,86,89,77,72,72,72,70,-37,-54,-56,-54,-52,-54],"ownershipAllowedMAE":0.0436956})%"); + lines.push_back(R"%({"sample":{"board":".................../.X......X.....O..O./X.XXX...OX.O.O.OOX./.X..XO..OX....XXX../.OXXOX.XXOO......../....OX............./....OX............./..O.O..........X.../......X............/.OOX............O../..XOX............../..XOX............../.XOOO........X...../.XOO....O.X....O.O./.XO........X.XXXO.O/..XO.....O.O.OOXXO./..XO.O.......OXX.../..XXO...........O../.................../","hintLoc":"null","initialTurnNumber":94,"metadata":"6CCA21916E13F793775E6FFED4924F73:104","moveLocs":["S15","T17","R7","R6","Q10","R11","Q11","R9","Q9","R12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.99,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.63e-06,2.56e-06,2.63e-06,2.63e-06,2.68e-06,2.69e-06,2.66e-06,2.69e-06,2.49e-06,3.21e-06,3.02e-06,2.95e-06,3.01e-06,2.86e-06,2.8e-06,2.61e-06,2.94e-06,3.09e-06,2.6e-06,2.54e-06,0,2.53e-06,2.5e-06,2.55e-06,2.47e-06,2.82e-06,2.95e-06,0,6.9e-06,0.000171,2.43e-05,7.51e-06,7.85e-06,0,4.05e-06,3.35e-06,0,4.36e-06,0,2.56e-06,0,0,0,2.86e-06,2.69e-06,3.94e-06,0,0,8.74e-06,0,5.68e-06,0,9.52e-06,0,0,0,0,2.56e-06,0,2.5e-06,2.4e-06,0,0,2.85e-06,3.94e-06,0,0,1.03e-05,0.00015,2.52e-05,2.28e-05,0,0,0,4.99e-06,0.00561,2.98e-06,0,0,0,0,0,2.76e-06,0,0,0,0,1.03e-05,0.0883,4.74e-05,4.17e-06,2.97e-06,3.02e-06,0,2.88e-06,3.12e-06,4.08e-06,3.33e-06,3.06e-06,0,0,2.76e-06,3.2e-06,4.73e-06,8.98e-06,5.86e-06,0.000127,0.000141,8.37e-05,2.82e-05,1.21e-05,1.24e-05,4.28e-06,3.38e-06,3.01e-06,5.17e-06,6.34e-06,4.08e-06,0,0,3.24e-06,4.01e-06,5.92e-06,3.5e-05,0.000148,0.000189,0.000352,4.29e-05,2.6e-05,0.018,0.0951,8.43e-06,3.47e-06,2.94e-06,4.72e-06,0,4.13e-06,0,5.1e-06,4.01e-06,4.19e-06,6.68e-06,1.71e-05,7.15e-05,0.000117,4.01e-05,9.17e-06,3.77e-06,0,0,3.45e-06,3.48e-06,3e-06,4.14e-06,4.92e-06,0.000468,7.2e-06,5.86e-06,0,4.59e-06,7.56e-06,1.35e-05,3.14e-05,3.3e-05,1.02e-05,5.78e-06,3.08e-06,0,0,2.99e-06,3.22e-06,3.23e-06,0,0,0,0.000151,0.0157,6.76e-06,7.28e-06,1.09e-05,1.84e-05,2.11e-05,1.28e-05,7.52e-06,5.17e-06,3.04e-06,0,0,2.96e-06,3.21e-06,0.00241,0.000952,0,0,0,4.52e-06,9.82e-05,4.43e-05,6.19e-05,5.15e-05,2.24e-05,8.63e-06,6.16e-06,5.2e-06,3.43e-06,0,0,3.11e-06,3.1e-06,7.7e-05,0.000443,0,0,0,7.08e-06,0.00161,0.000909,0.000441,0.000228,1.68e-05,5.9e-06,4.53e-06,4.45e-06,2.16e-05,0.157,0.325,3.65e-06,3.26e-06,3.26e-06,0,0,0,0,0.0455,0.000152,0.0121,0.00452,5.16e-05,5.43e-06,4.34e-06,3.31e-06,0,4.56e-05,0.0411,0,9.74e-05,3.07e-06,2.71e-06,0,0,0,4.7e-06,5.68e-06,7.29e-05,6.72e-05,0,0.000184,0,3.13e-06,3.56e-06,2.92e-06,3.46e-06,0,0,0,2.93e-06,2.64e-06,0,0,6.03e-06,6.06e-05,4.28e-06,8.98e-06,1.05e-05,0.000122,0.113,3.35e-06,0,4.71e-06,0,0,0,0,0,0,2.97e-06,2.68e-06,0,0,0.000124,5.22e-06,5.75e-06,7.29e-06,8.12e-06,0,0.0115,0,0.0421,0,0,0,0,0,3.79e-06,2.58e-06,2.85e-06,0,0,2.89e-05,0,7.03e-06,4.97e-06,5.19e-06,4.08e-06,3.98e-06,0.00793,3.55e-06,0,0,0,6.2e-06,0.000164,4.11e-06,2.66e-06,2.69e-06,0,0,0,2e-05,4.88e-06,3.99e-06,4.09e-06,4.4e-06,5.36e-06,1.2e-05,1.26e-05,0.00515,4.29e-06,6.88e-06,0,2.57e-05,3.94e-06,2.79e-06,2.63e-06,2.78e-06,3.06e-06,9.15e-05,5.95e-06,7.98e-06,2.72e-06,2.78e-06,2.88e-06,3.06e-06,3.57e-06,3.79e-06,3.82e-06,3.94e-06,3.68e-06,3.75e-06,3.41e-06,2.78e-06,5.42e-06],"winrateAvg":0.267878,"leadAvg":-1.09003,"scoreMeanAvg":-2.14629,"scoreStdevAvg":9.13415,"shorttermWinlossErrorAvg":0.164709,"shorttermScoreErrorAvg":1.05282,"ownership":[-99,-99,-99,-98,-96,-93,-88,-83,-71,-50,-13,21,47,73,88,93,91,87,82,-99,-100,-99,-99,-97,-93,-89,-85,-88,-73,-41,28,58,82,97,95,91,91,72,-100,-100,-100,-100,-100,-93,-88,-88,-81,-86,18,90,54,96,9,96,96,11,71,-84,-100,-100,-100,-100,-86,-89,-90,-82,-85,45,37,13,-2,-85,-84,-84,9,-16,-56,-6,-100,-100,88,-93,-79,-96,-96,79,79,20,-22,-9,-38,-42,-51,-72,-33,-5,-3,-27,-31,88,-93,-58,-41,-8,16,25,2,2,-20,-39,-23,-10,-15,-28,29,19,-4,24,88,-93,-38,-21,-8,8,6,-1,-9,-21,-49,-22,1,29,8,56,55,91,60,87,10,-34,-20,-7,-1,2,-5,-13,-23,-46,-92,90,58,40,71,78,66,49,38,-5,-81,-21,-10,-5,-6,-11,-18,-25,-46,-92,90,76,60,63,94,94,15,17,-19,-30,-15,-10,-9,-12,-17,-23,-29,-47,-93,90,83,72,27,50,12,98,-48,-18,-23,-17,-11,-11,-15,-21,-27,-33,-46,-92,91,81,81,-9,9,11,98,-49,-13,-23,-11,-1,-9,-18,-25,-34,-41,-48,-57,-28,81,81,-36,-98,98,98,97,-13,-1,-3,13,-1,-20,-32,-42,-88,10,3,-58,24,82,-66,-98,98,98,45,32,14,24,77,7,-78,-46,-50,-48,23,97,97,97,92,-92,-98,98,85,35,37,35,41,39,-9,-1,-76,-31,-94,-94,-94,97,95,96,-97,-98,-99,95,53,50,45,50,60,84,20,65,-10,41,41,-94,-94,95,92,-98,-98,-99,94,89,96,63,62,64,62,55,39,24,43,-94,-94,-35,35,84,-97,-97,-99,-98,93,80,70,66,65,61,54,38,25,-8,-48,-38,69,53,77,-97,-97,-94,-15,15,77,68,65,61,55,45,31,10,-11,-32,-15,17,44,59],"ownershipAllowedMAE":0.030243})%"); + lines.push_back(R"%({"sample":{"board":".........OX..X./...........XXOO/....XO...OOXOO./...X.O.O.OXOOXO/...XO...OXXXXXX/...XXX..OX.X.X./.......XXOOOOX./...O.........O./............O../..XO.........../.............../...O.......O.../......X......../.............../.............../","hintLoc":"null","initialTurnNumber":54,"metadata":"304E34E112C40ED6AC4C84FE6DD8158F:64","moveLocs":["L14","K14","N15","L3","N3","E3","L2","M2","M3","N2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.02,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":-8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.15e-06,5.65e-06,5.7e-06,6.76e-06,1.05e-05,8.31e-06,6.9e-06,6.58e-06,6.21e-06,0,0,4.14e-06,0,0,3.9e-06,5.77e-06,6.04e-06,6.14e-06,8.21e-06,0.000616,0.0147,1e-05,1.76e-05,7.13e-06,0,0,0,0,0,0,5.57e-06,6.3e-06,5.95e-06,5.72e-06,0,0,9.06e-06,7.94e-06,3.95e-05,0,0,0,0,0,6.66e-06,5.67e-06,6.5e-06,5.99e-06,0,6.46e-06,0,8.33e-06,0,0.0002,0,0,0,0,0,0,5.89e-06,6.69e-06,5.99e-06,0,0,6.82e-06,3.98e-05,1.31e-05,0,0,0,0,0,0,0,6.05e-06,7.22e-06,6.38e-06,0,0,0,7.17e-06,1.85e-05,0,0,4.18e-06,0,4.04e-06,0,4.79e-06,6.11e-06,7.75e-06,8.01e-06,6.77e-06,6.16e-06,6.95e-06,7.21e-06,0,0,0,0,0,0,0,5.48e-06,6.3e-06,9.06e-06,2.07e-05,0,8.55e-06,8.77e-06,8.43e-06,7.03e-06,7.75e-06,7.92e-06,6.03e-06,7.2e-06,8.01e-06,0,9.25e-06,6.18e-06,1.51e-05,0.00525,0.00203,0.000129,1.19e-05,1.31e-05,2.97e-05,3.34e-05,8.72e-06,7.7e-06,7.23e-06,0,8.93e-06,6.93e-06,6.59e-06,2.02e-05,0,0,0.000427,2.92e-05,4.29e-05,5.89e-05,3.29e-05,1.01e-05,8.63e-06,8.56e-06,1.06e-05,7.54e-06,6.41e-06,6.66e-06,0.000692,0.0369,0.00206,9.39e-05,2.73e-05,3.04e-05,3.02e-05,2.02e-05,1.22e-05,1.06e-05,2.16e-05,1.41e-05,8.63e-06,5.7e-06,7.03e-06,9.36e-05,0.00224,0,2.47e-05,2e-05,7.57e-06,9.12e-06,1.93e-05,2.26e-05,0.346,0,0.519,2.39e-05,5.69e-06,6.49e-06,2.41e-05,0.00107,4.35e-05,0,1.51e-05,0,7.02e-06,2.19e-05,0.0448,0,0,0,5.96e-05,6.08e-06,6.33e-06,9.17e-06,2.31e-05,0.000199,0.00104,1.5e-05,7.06e-06,7.54e-06,3.63e-05,0.0214,0,0,0,0.000129,5.73e-06,5.21e-06,6.36e-06,6.27e-06,7.06e-06,6.95e-06,7.01e-06,6.43e-06,5.96e-06,6.02e-06,6.63e-06,8.65e-06,6.86e-06,6.56e-06,5.93e-06,5.19e-06,6.63e-06],"winrateAvg":0.43697,"leadAvg":-0.178124,"scoreMeanAvg":-0.343385,"scoreStdevAvg":9.56828,"shorttermWinlossErrorAvg":0.206923,"shorttermScoreErrorAvg":1.24666,"ownership":[-63,-62,-59,-50,-27,8,45,68,78,88,-87,-88,-89,-88,-85,-62,-62,-64,-68,-48,3,71,65,77,88,-87,-88,-89,-81,-81,-59,-63,-65,-74,-88,86,69,77,80,88,89,-88,-81,-80,-81,-54,-64,-70,-96,2,86,41,88,82,89,-80,-76,-78,-81,-81,-46,-49,-61,-96,46,-15,-10,-1,84,-80,-79,-79,-80,-81,-81,-34,-44,-40,-97,-96,-96,-23,-9,79,-79,36,-77,22,-79,-46,-24,-25,-12,-22,-31,-31,-19,-68,-67,93,93,93,93,-78,47,-15,-17,-5,58,3,8,-7,-18,-3,26,46,60,87,89,59,-9,-14,-8,27,17,8,3,2,1,20,31,44,90,68,67,-3,-11,-35,76,26,18,8,6,10,21,29,32,45,51,53,5,3,18,40,33,18,12,9,15,27,27,19,31,37,42,13,12,51,90,49,20,11,15,20,36,30,43,18,33,39,19,26,34,59,88,29,-27,9,18,59,90,14,21,45,44,25,28,38,48,51,22,1,6,16,22,15,82,79,56,51,29,33,37,41,33,20,7,7,13,24,38,40,53,58,54],"ownershipAllowedMAE":0.0538862})%"); + lines.push_back(R"%({"sample":{"board":"........../........../........../......O.../..X......./........../......XX../...X.OO.../........../........../","hintLoc":"null","initialTurnNumber":7,"metadata":"FEA9347002783693526406118329AAE4:17","moveLocs":["H3","G8","F7","F4","H8","E3","J4","D8","E8","D9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.55,"xSize":10,"ySize":10},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.15e-05,1.3e-05,1.24e-05,1.23e-05,1.33e-05,1.3e-05,1.28e-05,1.25e-05,1.21e-05,1.1e-05,1.3e-05,1.43e-05,1.53e-05,0,0.000298,1.44e-05,1.45e-05,1.29e-05,1.29e-05,1.18e-05,1.24e-05,1.53e-05,1.75e-05,0,0,1.37e-05,0,0,1.31e-05,1.22e-05,1.28e-05,1.55e-05,3.26e-05,0.367,1.55e-05,0,0,1.47e-05,1.46e-05,1.26e-05,1.25e-05,3.85e-05,0,0.019,0.00808,1.53e-05,1.48e-05,0.000106,1.64e-05,1.23e-05,1.24e-05,1.8e-05,0.000835,0.00937,0.274,0.000728,1.85e-05,0.202,0.107,1.31e-05,1.25e-05,1.86e-05,8.53e-05,1.89e-05,0.00158,0,0,0,0,1.25e-05,1.22e-05,1.5e-05,4.76e-05,0,0,0,0,0,1.97e-05,1.29e-05,1.32e-05,1.59e-05,2.39e-05,1.68e-05,0.00891,2.73e-05,1.33e-05,1.19e-05,1.91e-05,1.19e-05,1.13e-05,1.39e-05,1.36e-05,1.4e-05,1.36e-05,1.44e-05,1.41e-05,1.21e-05,1.22e-05,1.08e-05,1.01e-05],"winrateAvg":0.551974,"leadAvg":0.0540134,"scoreMeanAvg":0.203047,"scoreStdevAvg":5.13502,"shorttermWinlossErrorAvg":0.204501,"shorttermScoreErrorAvg":0.681629,"ownership":[-81,-78,-75,-65,-44,3,32,52,59,62,-81,-81,-80,-88,-8,42,55,58,62,61,-81,-82,-80,-87,83,71,46,87,63,57,-80,-84,-85,27,27,94,93,57,55,54,-76,-79,-92,0,-24,15,26,38,55,52,-71,-72,-62,-26,1,-4,6,39,50,56,-69,-70,-65,-52,-74,-83,-80,-79,87,66,-71,-72,-75,-95,-96,88,88,88,83,81,-72,-72,-73,-82,-30,-9,74,77,81,83,-73,-71,-68,-53,-35,12,40,69,77,81],"ownershipAllowedMAE":0.0511182,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":".................../..X.X.........OXX../..OX..XXO.X...OXO../..O.XXOO.....OXOX../...OXO.....XO..OX../.....X.O....OXO.X../...O.....O.O.XX..../.X..O............../.................../..X.XO.........XO../....O.O.........O../...........O..XO.../..............XXO../..XX.......O......./.OOX......XO...X.O./......OX..X....XO../..OOXX.X...X.O.X.../...OOOX............/.....X............./","hintLoc":"null","initialTurnNumber":85,"metadata":"09D421F38ABBC71770406419F8AB6833:95","moveLocs":["J18","J16","K16","J15","H15","K15","L16","M16","G18","F17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":8.0,"policyOptimism":0.0,"pda":2.622,"policyMixture":[1.2e-06,1.53e-06,1.67e-06,1.55e-06,1.45e-06,1.37e-06,1.45e-06,1.45e-06,1.6e-06,4.78e-06,5.6e-06,7.46e-06,2.23e-06,1.76e-06,1.55e-06,1.87e-06,2.67e-06,1.47e-06,1.2e-06,1.44e-06,3.54e-06,0,1.59e-06,0,1.35e-06,0,1.34e-05,0,8.48e-06,0.0336,0.00565,3.31e-05,1.64e-06,0,0,0,9.67e-05,1.5e-06,1.45e-06,1.73e-06,0,0,0,0,0,0,0,0.184,0,0.0057,9.42e-06,1.56e-06,0,0,0,0.000249,1.53e-06,1.49e-06,1.61e-06,0,1.49e-06,0,0,0,0,0,0,0,0,3.69e-06,0,0,0,0,1.77e-06,1.4e-06,1.37e-06,1.66e-06,1.44e-06,0,0,0,1.42e-06,0,0,0,0.77,0,0,2.07e-06,1.96e-06,0,0,1.59e-06,1.42e-06,1.38e-06,1.93e-06,1.87e-06,1.69e-06,2.03e-06,0,1.67e-06,0,3.97e-06,2.28e-06,3.49e-06,1.77e-06,0,0,0,1.72e-06,0,1.68e-06,1.42e-06,1.45e-06,2.94e-06,1.86e-06,0,1.5e-06,1.8e-06,1.91e-06,1.57e-06,1.64e-06,0,1.66e-06,0,1.6e-06,0,0,2.2e-06,1.83e-06,1.8e-06,1.41e-06,1.42e-06,0,2.49e-06,1.73e-06,0,1.53e-06,1.48e-06,1.56e-06,1.42e-06,1.52e-06,1.55e-06,1.56e-06,1.62e-06,1.53e-06,1.64e-06,1.73e-06,2.07e-06,1.81e-06,1.38e-06,1.43e-06,2.5e-06,6.3e-06,1.82e-06,2.07e-06,1.57e-06,1.49e-06,1.47e-06,1.45e-06,1.53e-06,1.5e-06,1.64e-06,1.7e-06,1.71e-06,1.78e-06,3.61e-06,1.65e-06,1.66e-06,1.39e-06,1.46e-06,4.37e-06,0,1.19e-05,0,0,1.47e-06,1.51e-06,1.53e-06,1.57e-06,1.54e-06,2.01e-06,2.15e-06,1.89e-06,1.8e-06,0,0,1.46e-06,1.35e-06,1.44e-06,7.97e-06,2.46e-05,8.18e-06,0,1.54e-06,0,1.61e-06,1.64e-06,1.6e-06,1.75e-06,1.57e-06,2.05e-06,2.63e-06,2.32e-06,2.32e-06,0,1.4e-06,1.3e-06,1.55e-06,4.9e-06,2e-05,1.08e-05,2.04e-06,1.69e-06,1.67e-06,1.61e-06,1.66e-06,1.75e-06,1.61e-06,0,1.79e-06,1.66e-06,0,0,1.64e-06,1.55e-06,1.26e-06,1.48e-06,2.53e-06,1.8e-06,1.64e-06,1.87e-06,1.8e-06,1.84e-06,1.83e-06,1.84e-06,2.48e-06,1.63e-06,1.61e-06,1.79e-06,1.63e-06,0,0,0,1.6e-06,1.35e-06,1.54e-06,2.33e-06,0,0,1.61e-06,2.17e-06,3.97e-06,1.86e-06,1.95e-06,1.89e-06,2.99e-06,0,1.63e-06,1.78e-06,2.71e-06,2.94e-06,3.33e-06,1.71e-06,1.34e-06,1.51e-06,0,0,0,1.68e-06,4.22e-06,1.78e-05,2.7e-06,1.82e-06,1.74e-06,0,0,1.59e-06,5.42e-06,1.66e-06,0,1.76e-06,0,1.27e-06,1.36e-06,1.44e-06,1.47e-06,1.76e-06,3.02e-06,1.72e-06,0,0,1.71e-06,1.71e-06,0,7.41e-06,4.5e-06,1.9e-06,1.56e-06,0,0,1.6e-06,1.39e-06,1.43e-06,1.47e-06,0,0,0,0,8.16e-06,0,1.66e-06,1.76e-06,2.85e-06,0,5.71e-06,0,1.61e-06,0,2.76e-06,1.84e-06,1.49e-06,1.29e-06,1.44e-06,1.4e-06,0,0,0,0,2.36e-06,1.56e-06,1.71e-06,1.83e-06,2.07e-06,1.74e-06,1.87e-06,2.64e-06,4.55e-06,5.99e-06,1.93e-06,1.44e-06,1.07e-06,1.37e-06,1.32e-06,1.23e-06,1.4e-06,0,1.48e-06,1.4e-06,1.3e-06,1.28e-06,1.36e-06,1.42e-06,1.43e-06,1.51e-06,1.42e-06,1.52e-06,1.52e-06,1.54e-06,1.11e-06,2.43e-06],"winrateAvg":0.943506,"leadAvg":6.54796,"scoreMeanAvg":8.77942,"scoreStdevAvg":11.9013,"shorttermWinlossErrorAvg":0.125265,"shorttermScoreErrorAvg":2.59665,"ownership":[-44,-87,-89,-92,-87,-61,-19,13,44,67,71,70,63,56,5,-29,-64,-70,-79,-19,-10,-94,-94,-97,-66,4,-38,92,75,77,73,68,62,85,-93,-93,-82,-88,17,5,74,-96,-96,-97,-96,-95,94,85,65,73,66,71,86,-93,-90,-91,-90,30,55,75,-23,-97,-97,91,93,71,94,95,50,76,91,9,14,-98,-93,-88,27,26,47,74,-97,-8,-2,91,68,68,84,45,92,-34,11,14,-98,-87,-76,8,10,24,47,-9,-72,17,90,77,76,57,59,88,-88,12,-77,-98,-70,-59,-19,-8,4,88,27,2,19,38,47,89,59,89,0,-88,-89,-44,-34,-37,-37,-38,-64,-4,37,89,32,30,31,32,32,26,16,-2,-27,-27,-9,7,-7,-7,-53,-52,-16,9,28,48,36,27,22,21,14,10,-1,-9,-19,3,33,21,27,-51,-57,-73,-11,-28,87,48,24,16,15,16,12,5,-8,-21,-66,93,62,53,-40,-39,-29,-14,68,53,87,23,11,10,22,24,9,-7,-37,-31,93,82,70,-21,-24,-3,-9,7,9,23,1,-1,-5,18,75,14,-19,-90,84,82,83,79,-7,-11,-27,-21,2,3,4,-4,-9,-16,5,38,-1,-20,-89,-90,91,86,83,16,-18,-80,-80,-21,-7,1,-13,-12,-12,18,71,20,-1,-34,-43,1,83,81,30,92,91,-82,-27,-16,-16,-31,-30,-36,-91,71,18,7,-34,-92,-3,90,67,69,82,53,22,-9,-26,16,-96,-57,-65,-93,15,-9,-12,-38,-91,82,61,45,82,93,97,97,-74,-74,-61,-96,-82,-80,-84,-92,-30,13,-40,-91,21,16,21,91,93,96,98,98,98,-87,-84,-86,-84,-82,-72,-43,-23,-39,-56,-32,-3,7,93,94,95,93,61,-70,-73,-83,-83,-81,-73,-58,-41,-30,-36,-40,-35,-20,-5],"ownershipAllowedMAE":0.0377005})%"); + lines.push_back(R"%({"sample":{"board":".X.X.OX...OOXX.XO../.XXXXXOO.O.OOXXO.O./.XOXXOXX.O.OXXOOOO./.OOOOOOXOOOXXOOOXX./...OOXOO.OXXXXOX.X./..OX.XXX.OXOXOXXX.X/..X.XXOXXOXOXOOXOXX/...OX.OOOXXOXOOOOOX/.XXOXXOXXXOOOOO.O.O/.XOX.XOXO.OO.....O./OOOXXXXOOO.OOOOOO.O/...OX..XXOXXXXOXXO./OOOOX..XOXX.OXXOXX./..OXX...O.....O.OX./.OOX.XO.OX.XX.XXOX./..XOXO...X.OOXXO.O./..XOO.O.OX.OX.XOOO./.X.XOO..OO.OXXOXX../..X................/","hintLoc":"null","initialTurnNumber":288,"metadata":"6C5897318E6316330DFF5203AF8B318E:298","moveLocs":["Q6","B4","B3","B13","B14","B15","C15","K6","L6","C14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.17,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":6.0,"policyOptimism":0.781,"pda":0.0,"policyMixture":[3.18e-05,0,1.09e-05,0,0.064,0,0,0.00222,0.00444,0.000362,0,0,0,0,3.96e-05,0,0,0.00342,0.000374,0.000401,0,0,0,0,0,0,0,0.00779,0,0.000377,0,0,0,0,0,0,0,0.00151,0.00203,0,0,0,0,0,0,0,0.000372,0,0.000367,0,0,0,0,0,0,0,0.0646,0.00157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00311,0.000359,0,0,0,0,0,0,0,0.000397,0,0,0,0,0,0,0,5.18e-05,0,0.0004,0.0672,0,0,0,0.00071,0,0,0,0.000654,0,0,0,0,0,0,0,0,2.96e-05,0,0.000512,0,0,0.000967,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00178,0.0116,0.00173,0,0,0.0057,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000347,0,0,0,0.000444,0,0,0,0.000351,0,0,0,0,4.02e-05,0,0,0.00035,0.00035,0.000346,0.000354,0.000353,0,0,0,0,0,0,0,0,0,0,0,0,0.00193,0,0,0,0,0,0,0,0,0.000363,0.000361,0.000364,0,0,0.0004,0.000508,0,0,0,0,0,0,0,0,0,0,0,0.000345,0,0,0,0,0,0.000646,0.00127,0,0,0,0,0.000354,0,0,0,0.000392,0,0,0.00488,0.000357,0.000338,0,0,0,0.00463,0.25,0.00772,0,0,0,0.000345,0.000351,0.000358,0,0,0,0,0.0004,0.000421,0,0,0,0.00277,0,0,0.00527,0,0,0.00198,0,0,0.00036,0,0,0,0,0.000365,0.00324,0,0,0,0,0,0.00292,0.00888,0.348,0,0.00631,0,0,0,0,0,0.000405,0,0.000379,0.00305,0,0,0,0,0,0,0.000394,0,0,0.00314,0,0,0.000383,0,0,0,0,0.000363,0.000384,0,2.3e-05,0,0,0,0.000405,0.000408,0,0,0.00764,0,0,0,0,0,0,0.000354,0.000349,0.000394,0.000349,0,0.00497,0.00271,0.000363,0.000366,0.000357,0.000358,0.00231,0.0108,0.0384,0.00993,0.000434,0.00037,0.000353,0.000325,0.000342,0.000345,0.000207],"winrateAvg":0.000212262,"leadAvg":-19.5767,"scoreMeanAvg":-19.5967,"scoreStdevAvg":2.22792,"shorttermWinlossErrorAvg":0.00532641,"shorttermScoreErrorAvg":0.762545,"ownership":[-100,-100,-100,-100,-95,-48,-48,33,72,96,100,100,-100,-100,-3,-2,99,99,99,-99,-100,-100,-100,-100,-100,99,99,95,100,100,100,100,-100,-100,100,99,99,99,-13,-100,100,-100,-100,100,98,98,99,100,100,100,-100,-100,100,100,99,100,27,9,100,100,100,100,100,100,99,100,100,100,-100,-100,100,100,100,-100,-100,6,85,100,68,100,100,-100,100,100,70,100,-100,-100,-100,-100,100,-100,-100,-100,-99,76,63,70,-99,-5,-100,-100,-100,-11,100,-100,100,-100,100,-100,-100,-100,-100,-100,60,79,-99,-98,-100,-100,-100,-100,-100,100,-100,100,-100,100,100,-100,100,-100,-100,19,17,-98,-98,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,100,-100,-3,-99,-99,-98,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,99,98,44,-98,100,-100,-100,-100,-100,-100,100,41,100,100,100,100,100,100,100,100,94,100,100,100,-100,-100,-100,-100,100,100,100,35,100,100,100,100,100,100,87,95,100,100,100,100,-100,-92,-89,-89,-91,99,-100,-100,-100,-100,100,-100,-100,86,7,100,100,100,100,-100,-77,-66,-89,98,-100,-100,-100,-99,-100,-100,-100,-100,-100,-15,99,100,100,-100,-100,-66,-56,18,98,98,-100,-100,-100,-100,-100,-100,-99,-100,-98,84,100,100,-100,-6,-83,91,76,98,-91,-90,-100,-100,-100,-100,-100,-99,-100,-99,-2,100,-99,100,-7,97,87,77,-46,-91,-36,98,99,-100,-100,-99,-99,-99,-99,-14,-99,-99,100,100,97,100,86,100,-92,66,99,-100,-100,-100,-99,-99,-99,-99,-98,-98,-98,-98,100,100,99,99,100,100,93,98,-100,-100,-99,-100,-100,-99,-99,-98,-98,-98,-97,70,95,99,99,99,97,92,22,-21,-91,-99,-99,-99,-99,-99],"ownershipAllowedMAE":0.0225204,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../...O...........O.../.................../.................../...O.............O./..XXO......OO..OXO./...OX.....X.XO.OOX./....X.....X.X.OXXX./...X......OOXXXOO../......O.X..XOXO..../.....XO..O.XOO.OO../..OO.XOXXXX.XOOX.../.XXX..XO....XO.XX../...X.X.OXX..XOOOXX./..OO.X.OXOX.XOXXOO./......XOOOOOOXX.XO./.......O.XO.O..X.X./","hintLoc":"null","initialTurnNumber":31,"metadata":"D726101554A67E45443549BF76E0C23A:41","moveLocs":["C13","F12","E13","B11","L12","L17","N18","P18","Q17","Q18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.89,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui0","komi":3.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.23e-06,6.04e-06,6.35e-06,6.45e-06,6.72e-06,6.74e-06,6.72e-06,6.74e-06,6.73e-06,6.5e-06,6.38e-06,6.39e-06,5.91e-06,6.12e-06,6.92e-06,5.83e-06,5.72e-06,6.75e-06,5.23e-06,6.12e-06,6.34e-06,7.29e-06,8.16e-06,1.21e-05,1.9e-05,2.44e-05,2.54e-05,2.53e-05,2.4e-05,0.000103,9.66e-06,0,6.8e-05,0,0,0.686,6.74e-05,6.98e-06,6.08e-06,6.62e-06,7.4e-06,8.09e-06,2.49e-05,4.57e-05,8.35e-05,0.000103,0.000381,2.87e-05,0,0.0115,0.000328,0.00136,1.13e-05,0,0.00213,0.00735,7.12e-06,5.93e-06,7.1e-06,6.88e-06,0,7.63e-06,9.66e-06,1.98e-05,3.35e-05,2.57e-05,1.27e-05,9.59e-06,7.17e-05,0.0078,1.3e-05,6.77e-06,0,2.55e-05,3.77e-05,7.02e-06,5.96e-06,6.5e-06,6.61e-06,6.9e-06,7.44e-06,8.45e-06,1.02e-05,1.5e-05,1.17e-05,8.78e-06,7.93e-06,7.91e-06,7.5e-06,7.45e-06,7.16e-06,7.98e-06,7.95e-06,7.38e-06,6.41e-06,5.74e-06,6.98e-06,5.88e-06,5.71e-06,6.1e-06,7.83e-06,2.8e-05,3.02e-05,1.7e-05,8.4e-06,7.24e-06,6.6e-06,6.56e-06,6.48e-06,6.45e-06,6.39e-06,6.14e-06,5.92e-06,6.23e-06,6.88e-06,2.25e-05,0,0,0,8.54e-05,2.77e-05,7.85e-05,6.89e-05,8.81e-06,5.99e-06,5.69e-06,5.77e-06,5.69e-06,5.66e-06,5.56e-06,5.19e-06,0,5.93e-06,7.63e-06,0.176,0,0,0,0,0.000195,0.000718,0.0426,0.00019,0,0,0,5.26e-06,4.88e-06,0,0,0,5.86e-06,6.31e-06,0,2.75e-05,0,0,0.000228,7.52e-05,0.000443,0.0115,0.000129,0,0.000296,0,0,5.17e-06,0,0,0,6.22e-06,5.69e-06,0.00038,0.00334,1.16e-05,0,1.13e-05,1.42e-05,3.11e-05,0.00013,2.67e-05,0,3.75e-05,0,5.35e-06,0,0,0,0,5.92e-06,6.2e-06,9.54e-06,3.19e-05,0,8.9e-06,6.84e-06,6.84e-06,8.45e-06,9.42e-05,0.000799,0,0,0,0,0,0,0,5.31e-06,5.77e-06,5.98e-06,7.5e-06,6.87e-06,7.72e-06,7.25e-06,8.08e-06,0,7.1e-06,0,8.15e-06,6.81e-06,0,0,0,0,5.15e-06,5.25e-06,5.87e-06,5.69e-06,5.93e-06,5.97e-06,5.73e-06,5.24e-06,5.93e-06,0,0,7.55e-06,9.82e-06,0,6.97e-06,0,0,0,5.41e-06,0,0,5.26e-06,5.58e-06,6.07e-06,6.08e-06,0,0,0.000315,0,0,0,0,0,0,7.32e-06,0,0,0,0,5.58e-06,6.52e-06,5.78e-06,6.99e-06,0,0,0,0.00403,0.00042,0,0,5.99e-06,6.07e-06,5.6e-06,7.07e-06,0,0,3.84e-06,0,0,5.14e-06,8.12e-06,6.58e-06,5.96e-06,4.78e-06,0,9.57e-05,0,0.0013,0,0,0,5.87e-06,5.45e-06,0,0,0,0,0,0,9.97e-06,6.34e-06,5.6e-06,0,0,4.86e-06,0,5.09e-06,0,0,0,0,5.37e-06,0,0,0,0,0,0,6.84e-06,7.25e-06,8.2e-06,4.88e-06,5.68e-06,4.8e-05,5.94e-06,0,0,0,0,0,0,0,0,0,0,0,0,1.54e-05,5.32e-06,5.7e-06,5.71e-06,5.55e-06,5.59e-06,5.88e-06,5.65e-06,0,5.74e-06,0,0,4.52e-06,0,0.0372,6.02e-05,0,0,0,7.31e-05,6.68e-06],"winrateAvg":0.485742,"leadAvg":-0.243658,"scoreMeanAvg":-0.202525,"scoreStdevAvg":10.4975,"shorttermWinlossErrorAvg":0.193424,"shorttermScoreErrorAvg":1.34638,"ownership":[40,39,36,33,27,18,6,-4,-8,-5,4,29,45,57,57,61,61,68,69,42,40,41,36,32,20,6,-5,-9,-10,3,32,82,61,41,47,81,73,74,43,45,47,49,38,25,7,-22,-12,-18,-55,2,4,56,55,95,76,76,76,44,48,53,86,33,19,5,-6,-12,-11,-15,-10,11,34,52,95,85,83,79,46,42,53,47,33,14,7,0,-3,-3,1,6,18,34,48,64,76,83,83,36,58,54,54,35,17,4,4,2,3,11,16,28,39,50,64,75,86,87,24,-18,86,85,86,11,7,7,9,17,32,41,46,50,54,67,83,98,90,-30,-15,-90,-89,85,-54,1,6,22,17,95,95,95,81,71,98,83,98,93,-43,-91,-90,-86,-98,-40,-16,-7,-26,-16,-88,43,-84,97,93,98,99,86,93,-73,-79,-86,-94,-98,-50,-36,-29,-45,-60,-89,-82,-85,-28,95,85,86,87,91,-81,-86,-88,-99,-77,-54,-49,-51,-56,-83,-77,-74,-86,-85,-86,94,94,90,80,-87,-88,-90,-90,-84,-65,-38,-64,-95,-87,-87,-97,89,-85,93,90,78,54,50,-88,-90,-90,-90,-89,-98,-37,-72,-85,-80,-90,-97,90,90,90,94,93,28,-3,-89,-90,-84,-83,-88,-98,-37,-97,-98,-98,-98,-94,-97,90,91,-95,-18,-42,-33,-77,-99,-99,-98,-89,-94,-95,99,52,-68,-70,-69,-96,91,-29,-96,-96,-66,-65,-57,-44,-48,-98,-79,-99,55,99,-95,-95,-56,-12,-96,91,91,90,-96,-96,-87,-28,-2,21,21,-57,-99,7,100,-95,100,-60,35,-96,92,-95,-95,-93,-94,-95,-4,11,15,14,13,-72,-87,100,100,100,100,100,100,-95,-96,-94,-96,-94,-95,5,10,13,13,-17,-37,12,100,100,99,100,100,100,77,-67,-95,-95,-96,-95],"ownershipAllowedMAE":0.0340554})%"); + lines.push_back(R"%({"sample":{"board":".................../..X..........OOO.../..XO........XXOXOO./..XO..X.X.....XXXXO/..XO.O...........O./.XOO.XX.......XX.../..XO.O.O......XOO../..X................/....X..........O.../.................../................X../.................../.................../.................../...............O.../..XXX........O..O../.OOO........X.X..../.....O............./.................../","hintLoc":"null","initialTurnNumber":55,"metadata":"E1C70737C2FDD3E4F361BE417853EEB9:65","moveLocs":["G15","H14","H15","J15","J14","J13","K14","G13","H16","K13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.09,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.11e-06,3.32e-06,4.57e-06,4.24e-06,4.29e-06,3.8e-06,3.97e-06,3.75e-06,3.74e-06,3.55e-06,3.74e-06,3.75e-06,3.59e-06,3.13e-06,2.87e-06,3.05e-06,3.2e-06,3.21e-06,2.62e-06,3.17e-06,3.75e-06,0,7.94e-05,5.48e-06,6e-06,1.06e-05,3.23e-05,2.55e-05,7.95e-06,6.46e-06,5.87e-06,7.69e-06,0,0,0,3.03e-06,3.54e-06,3.34e-06,3.18e-06,3.8e-06,0,0,3.56e-06,5.23e-06,9.53e-06,0.0358,0.148,5.92e-05,2.19e-05,2.38e-05,0,0,0,0,0,0,3.41e-06,3.03e-06,6.21e-06,0,0,3.35e-06,4.91e-06,0,0,0,4.61e-05,0.0055,2.1e-05,5.6e-06,4.94e-06,0,0,0,0,0,3.72e-06,0.000372,0,0,3.08e-06,0,0,0,0,5.65e-05,0.0102,1.01e-05,4.88e-06,4.02e-06,3.67e-06,3.31e-06,4.04e-06,0,3.46e-06,6.1e-06,0,0,0,0.021,0,0,0,0,0,0.431,1.63e-05,4.6e-06,3.72e-06,0,0,5.01e-06,4.23e-06,3.45e-06,1.01e-05,0.000115,0,0,3.57e-06,0,0,0,0,0,0.00187,4.68e-06,5.24e-06,4.76e-06,0,0,0,4.92e-06,3.77e-06,4.45e-06,0.000116,0,0.00142,7.5e-06,8.4e-05,0.276,0.00117,4.27e-06,4.88e-06,5.44e-06,5.48e-06,7.34e-06,1.06e-05,0.000111,4.85e-06,4.29e-06,5.43e-06,3.79e-06,3.67e-06,1.15e-05,3.88e-05,0.00013,0,0.000629,9.69e-06,6.67e-06,5.61e-06,5.79e-06,6.61e-06,7.95e-06,1.19e-05,4.83e-05,7.9e-06,0,1.02e-05,1.09e-05,3.64e-06,3.48e-06,6.59e-06,1.25e-05,1.04e-05,0.00035,1.5e-05,9.63e-06,8.18e-06,7.75e-06,8.37e-06,9.38e-06,1.34e-05,2.78e-05,5.98e-05,0.000186,5.79e-05,0.0002,3.74e-05,3.65e-06,3.49e-06,7.34e-06,1.94e-05,4.22e-05,2.99e-05,3.09e-05,1.3e-05,1.1e-05,1.08e-05,1.17e-05,1.64e-05,2.61e-05,3.73e-05,4.94e-05,0.00124,0.00527,0,7.66e-06,3.94e-06,3.55e-06,8.57e-06,8.36e-05,9.72e-05,7.66e-05,4.63e-05,3.6e-05,2.71e-05,2.33e-05,2.41e-05,2.79e-05,3.64e-05,5.32e-05,6.25e-05,0.000107,0.000713,2.44e-05,9.5e-06,3.94e-06,3.83e-06,1.91e-05,0.00708,0.000121,7.01e-05,6.77e-05,6.47e-05,5.19e-05,3.85e-05,3.47e-05,3.36e-05,3.35e-05,3.7e-05,5.11e-05,5.24e-05,7.1e-05,0.00402,1.61e-05,4.11e-06,4.87e-06,1.32e-05,0.000227,0.000103,4.28e-05,2.44e-05,4.48e-05,4.89e-05,3.99e-05,3.77e-05,4.09e-05,5.32e-05,3.84e-05,3.07e-05,8.43e-06,7.68e-06,2.57e-05,1.1e-05,3.85e-06,4.73e-06,8.53e-05,5.89e-06,4.52e-06,5.35e-06,1.33e-05,1.29e-05,3.89e-05,3.47e-05,4.61e-05,8.97e-05,0.000294,1.76e-05,8.13e-06,5.83e-06,0,4.63e-06,8.06e-06,3.71e-06,4.56e-06,2.07e-05,0,0,0,9.04e-06,0.00509,3.49e-05,2.54e-05,8.35e-05,0.000275,0.000114,0.000509,0,3.17e-05,4.23e-06,0,5.74e-06,3.62e-06,3.8e-06,0,0,0,5.12e-06,7.71e-06,6.1e-05,1.73e-05,2.92e-05,0.000121,0.0367,2.12e-05,0,0.000174,0,0.000253,8.07e-06,6.33e-06,3.22e-06,2.97e-06,2.98e-06,2.98e-06,3.11e-06,3.74e-06,0,5.89e-06,7.32e-06,7.77e-06,1.06e-05,1.81e-05,4.49e-05,8.45e-06,6.51e-06,1.21e-05,5.02e-05,1.53e-05,5.69e-06,3.12e-06,3.06e-06,3.14e-06,3.09e-06,3.34e-06,3.03e-06,3.02e-06,3.27e-06,3.38e-06,3.6e-06,3.75e-06,4.01e-06,3.83e-06,4.5e-06,4.48e-06,4.71e-06,3.96e-06,3.91e-06,3.38e-06,2.8e-06,6.82e-06],"winrateAvg":0.626059,"leadAvg":1.01762,"scoreMeanAvg":1.62782,"scoreStdevAvg":12.462,"shorttermWinlossErrorAvg":0.132952,"shorttermScoreErrorAvg":1.07666,"ownership":[-85,-83,-57,-47,-4,23,37,30,9,-9,-14,-5,17,43,66,87,90,89,87,-90,-87,-95,48,4,40,48,40,6,-17,-20,-18,6,93,93,93,91,88,87,-92,-93,-95,92,49,60,72,71,-15,-33,-35,-34,-87,-87,93,-93,92,92,85,-93,-93,-95,92,73,76,69,92,-85,-51,-48,-45,-56,-79,-93,-93,-93,-93,84,-92,-91,-95,91,63,91,91,91,-84,-57,-49,-44,-47,-60,-76,-73,-57,73,71,-87,-93,91,91,32,-92,-93,-93,-44,-40,-42,-37,-35,-50,-92,-92,16,33,51,-74,-88,-94,92,30,42,-93,-68,-89,-86,-43,-24,-21,-30,-92,83,83,59,44,-62,-68,-94,16,-14,-3,-9,-67,-42,-31,-21,-15,-5,-3,5,36,42,36,31,-44,-46,-38,-32,-80,-8,-18,-26,-22,-19,-11,-5,0,9,15,78,10,16,11,-31,-33,-25,-24,-15,-14,-12,-14,-12,-10,-5,-1,3,8,4,17,8,-3,-4,-22,-25,-21,-17,-15,-10,-10,-9,-8,-5,-2,1,3,6,10,7,-48,-19,-14,-17,-19,-18,-19,-17,-13,-9,-7,-4,-2,1,3,5,8,9,7,-8,-12,-12,-13,-13,-7,-22,-24,-17,-11,-7,-3,0,2,4,8,12,17,12,11,-5,-2,-8,-14,-19,-20,-22,-19,-13,-7,-2,2,4,6,12,17,25,40,-3,13,12,-5,-5,-31,-38,-32,-18,-16,-10,0,5,9,7,15,30,40,87,44,28,29,22,-45,-82,-81,-80,-31,12,5,4,9,3,2,-6,64,4,36,88,55,39,37,89,89,90,-13,20,5,14,10,9,27,-16,-59,18,-49,21,29,39,38,70,74,85,85,79,87,45,28,16,11,-1,-19,-35,-40,-31,-8,7,27,32,73,80,81,82,75,58,45,30,18,6,-5,-20,-30,-31,-25,-12,5,16,25],"ownershipAllowedMAE":0.0331721})%"); + lines.push_back(R"%({"sample":{"board":"X.OX.....OXOO.O.O../XOOOXXX.XXXXOOXO.../X.OX.OXOO.XOOXXO.../OOOX.X.XXXOOXXOO.../.XXX.X.XOO.OOXXXO../.XOOXXXO..OXX.X.O../XXXOOOO..OOOXXXXO../XXO.OXXOOXOXXXXOOOO/XO..XO..OXXXOXO.OXX/XOO.X..O.OXXOOOOXXX/OOO...X..OOXOX..XXO/OX.....OOXXXXXXXXOO/OX....XXO...XOOXOO./XOOO...OOOOOOOXOXO./XXXOOOOOXO.OXXXOXO./.X.XOXXXXXOXO..OXO./.X.XOOOOX.XX.XXOXOO/..X.XX.OXX....XXXXO/...XXOOOOX......XO./","hintLoc":"null","initialTurnNumber":288,"metadata":"62B5F22CBE8F6E6C4722862AD7EE2E4C:298","moveLocs":["L5","T1","L4","G2","P4","Q9","Q14","K7","P9","Q11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":6.0,"policyOptimism":0.0,"pda":-0.495,"policyMixture":[0,0.000355,0,0,0.00337,0.000809,0.000819,0.000801,0.00484,0,0,0,0,0,0,0,0,0.0113,0.000776,0,0,0,0,0,0,0,0.0071,0,0,0,0,0,0,0,0,0.0129,0.00498,0.000921,0,8.16e-05,0,0,0.00768,0,0,0,0,0.00806,0,0,0,0,0,0,0.0166,0.0143,0.000905,0,0,0,0,0.00274,0,0.0076,0,0,0,0,0,0,0,0,0,0.0167,0.0168,0.000948,0.00578,0,0,0,0.00381,0,0.00463,0,0,0,0,0,0,0,0,0,0,0.00553,0.000846,0.000829,0,0,0,0,0,0,0,0.0162,0.00472,0,0,0,0.000418,0,0,0,0.00083,0.000836,0,0,0,0,0,0,0,0.0183,0.00228,0,0,0,0,0,0,0,0,0.000824,0.000831,0,0,0,0.017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0172,0.0179,0,0,0.00389,0.000849,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0153,0,0.00199,0.00154,0,0.0174,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0167,0.00203,0.00119,0,0.00124,0.0179,0,0,0,0,0,0,0,0,0,0,0,0,0.0167,0.0181,0.0045,0.00156,0.000983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0115,0.0156,0.00298,0.000904,0,0,0,0,0.216,0.245,0,0,0,0,0,0,0.000802,0,0,0,0,0.000852,0.00088,0.000851,0,0,0,0,0,0,0,0,0.00814,0,0,0.0163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00143,0,0,0.0162,0.000811,0,0.00231,0,0,0,0,0,0,0,0,0,0,0.00684,0,0.00086,0,0,0.000793,0.000803,0,0.0074,0,0,0,0,0,0,0.000802,0,0,0.00753,0,0,0.000821,0,0,0,0.000763,0.00197,0,0.00763,0,0,0,0,0,0,0.000829,0.000799,0.000793,0.00083,0,0,0,0,0,0.000795,0.000782,0.0073,0,0,0,0,0,0,0,0.000788,0.000794,0.000794,0.000784,0.000814,0.000818,0,0,0,0.0241],"winrateAvg":0.999448,"leadAvg":5.035,"scoreMeanAvg":5.00033,"scoreStdevAvg":0.871714,"shorttermWinlossErrorAvg":0.0108931,"shorttermScoreErrorAvg":0.387253,"ownership":[-100,-99,-99,-100,-99,-99,-99,-99,-99,-99,-100,100,100,100,100,100,100,100,100,-100,-99,-99,-99,-100,-100,-100,-99,-100,-100,-100,-100,100,100,-100,100,100,100,100,-100,-99,-99,-100,-100,-99,-100,-99,-99,-100,-100,100,100,-100,-100,100,100,100,100,-99,-99,-99,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,100,100,100,-100,-100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,100,100,100,99,99,100,100,-100,100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,99,100,100,100,100,-100,-100,-100,100,-100,100,100,100,-100,-100,-100,100,100,100,99,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,99,99,100,100,100,-100,100,-100,-100,100,-100,-100,100,100,99,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,99,100,100,100,100,99,99,100,100,19,-36,-100,100,100,-100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,-100,100,-100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100],"ownershipAllowedMAE":0.00351302})%"); + lines.push_back(R"%({"sample":{"board":".................../.O.OOX.....O.OXO.../.OOXX......O.XOO.../..X.....X.XO.XX.O../.X.X.......XO..X.../..X.XO.....X.X.OO../.XOXO.......X.O..../.XO.O.O......XO..O./.OX..X......XOXX.X./XO.OOX........OX.../.OO..X.....X.O.X.../OOXX.......XO.O.XX./OOOX........XOOOXO./OXXX..X.....XXO.O.O/OOOX.O..........O../XXXO.OX.....XOO..O./..X.OXO.....X.XXX../.................../.................../","hintLoc":"null","initialTurnNumber":125,"metadata":"CD19F60D90FFEA5A9F028E20643D912B:135","moveLocs":["D12","O10","G5","H6","B2","C2","B1","A2","E1","D1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.83,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.82e-05,5.13e-05,5.62e-05,5.3e-05,5.64e-05,7.19e-05,5.61e-05,5.85e-05,5.82e-05,5.85e-05,5.63e-05,5.37e-05,5.8e-05,5.54e-05,5.98e-05,4.87e-05,4.76e-05,4.83e-05,4.56e-05,4.97e-05,0,4.15e-05,0,0,0,7.45e-05,7.88e-05,7.74e-05,7.45e-05,5.84e-05,0,5.79e-05,0,0,0,4.82e-05,4.81e-05,4.88e-05,5.55e-05,0,0,0,0,0.0489,0.000128,9.26e-05,8.85e-05,8.22e-05,7.23e-05,0,6.25e-05,0,0,0,4.97e-05,5.04e-05,4.93e-05,5.99e-05,6.48e-05,0,7.3e-05,0.000215,0.00049,0.000164,0.0002,0,8.59e-05,0,0,0.000102,0,0,6.4e-05,0,5.41e-05,5.15e-05,6.28e-05,0,0,0,0.0168,0.000413,0.00233,0.000654,0.000234,9.64e-05,7.96e-05,0,0,0.000108,0.000102,0,6.14e-05,5.72e-05,5.18e-05,7.67e-05,7.14e-05,0,0.000218,0,0,0.000294,0.0429,0.000457,9.4e-05,7.44e-05,0,6.21e-05,0,9.59e-05,0,0,5.76e-05,5.36e-05,6.5e-05,0,0,0,0,0.000118,0.000934,0.00155,0.000931,9.27e-05,7.26e-05,6.35e-05,0,6.57e-05,0,5.11e-05,5.7e-05,6.12e-05,5.39e-05,7.6e-05,0,0,0,0,0.00462,0,0.000723,0.000895,8.29e-05,6.95e-05,6.18e-05,6.01e-05,0,0,5.64e-05,6.73e-05,0,5.49e-05,0.00098,0,0,5.27e-05,5.78e-05,0,0.000137,0.0305,0.000102,7.63e-05,6.8e-05,6.11e-05,0,0,0,0,5.86e-05,0,5.81e-05,0,0,4.93e-05,0,0,0,6.73e-05,0.000146,7.48e-05,7.39e-05,6.64e-05,7.58e-05,0.000397,0,0,0,5.19e-05,5.84e-05,5.58e-05,5.63e-05,0,0,6.98e-05,0.00116,0,7.33e-05,8.51e-05,7.57e-05,7.18e-05,6.58e-05,0,6.85e-05,0,7.6e-05,0,5.39e-05,5.64e-05,5.51e-05,0,0,0,0,0.00112,0.000551,0.000298,0.000108,7.97e-05,7.35e-05,6.65e-05,0,0,4.96e-05,0,5.37e-05,0,0,5.57e-05,0,0,0,0,0.00125,0.000345,9.23e-05,8.33e-05,8.41e-05,7.58e-05,7.11e-05,6.72e-05,0,0,0,0,0,0,5.61e-05,0,0,0,0,9.63e-05,0.0377,0,0,0.000249,8.14e-05,7.51e-05,7.07e-05,0,0,0,3.94e-05,0,5.06e-05,0,0,0,0,0,0.000224,0,0,0.0115,0.0238,0.000154,8.35e-05,7.9e-05,6.74e-05,7.49e-05,5.97e-05,5.75e-05,0,5.51e-05,5.47e-05,0,0,0,0,6.92e-05,0,0,0.000504,0.0291,0.00759,0.000127,7.53e-05,0,0,0,5.93e-05,5.26e-05,0,5.55e-05,6.45e-05,0.0147,0,0.463,0,0,0,0.000104,0.00817,0.0281,0.000555,8.52e-05,0,0.00147,0,0,0,7.33e-05,6.19e-05,0,0,0,0.0738,0.0197,0.0936,0.000217,0.000984,0.000412,0.000536,0.000115,0.00855,0.00038,0.00025,8.76e-05,6.38e-05,6.31e-05,6.91e-05,5.88e-05,9.81e-05,0,0.0025,0,0,0.000119,0.000179,6.99e-05,6.75e-05,6.61e-05,6.32e-05,6.04e-05,6.8e-05,6.68e-05,5.79e-05,5.57e-05,5.58e-05,5.46e-05,5.01e-05,4.54e-05],"winrateAvg":0.0506355,"leadAvg":-5.88922,"scoreMeanAvg":-7.46135,"scoreStdevAvg":11.1186,"shorttermWinlossErrorAvg":0.13746,"shorttermScoreErrorAvg":2.82437,"ownership":[88,88,86,82,8,-1,-17,-21,-17,-3,33,69,78,86,95,96,96,96,95,87,87,88,89,88,-28,-6,-20,-20,-1,20,84,-8,93,94,99,96,95,94,59,88,88,-90,-89,-1,-4,-22,-33,-18,-22,83,-13,-90,99,99,96,95,92,-9,-10,-96,-89,-35,-15,-20,-23,-85,-41,-81,83,4,-90,-90,27,98,92,88,-66,-96,-95,-96,-35,-30,-6,-3,-20,-34,-60,-99,0,-63,-58,-72,10,84,78,-82,-92,-95,-30,-74,66,12,19,-13,-29,-50,-98,-65,-97,-34,93,94,79,58,-54,-93,95,-28,95,64,5,-13,-22,-34,-46,-69,-100,-43,70,51,44,45,37,-21,-89,95,95,94,-21,32,-16,-33,-42,-51,-61,-85,-99,69,-24,-3,74,-16,25,96,92,93,-33,-96,-12,-24,-43,-50,-55,-65,-99,-95,-99,-99,-31,-87,-25,37,97,95,96,96,-96,-49,-53,-57,-57,-60,-63,-58,-96,9,-99,-65,-64,-63,84,97,97,20,-1,-96,-70,-69,-66,-63,-66,-99,-40,83,13,-100,-87,-79,-75,97,96,-91,-91,-49,-71,-75,-73,-69,-63,-64,-99,59,58,94,-16,-99,-99,-46,96,96,96,-90,-34,-66,-70,-74,-67,-58,-55,-72,-98,94,94,94,-99,92,21,95,-92,-91,-90,-2,45,-91,-92,-49,-43,-44,-54,-97,-97,94,93,96,93,95,96,95,95,-90,10,93,93,14,-12,-28,-33,-46,-71,-15,84,82,96,94,93,-60,-61,-60,85,70,94,35,34,-15,-17,-27,-49,-98,89,89,-31,5,94,70,-48,-35,-62,63,91,81,88,44,28,-8,-24,-46,-98,-2,-94,-93,-93,-35,59,-51,2,-63,-28,37,82,66,46,27,1,-23,-32,-78,-78,-87,-85,-63,-14,20,-24,7,-28,-56,53,47,62,49,30,6,-18,-42,-58,-73,-79,-75,-63,-51,-14],"ownershipAllowedMAE":0.0445015})%"); + lines.push_back(R"%({"sample":{"board":"...........X......./....O.....O..XXX.../..X..O...O.OOXOX.../...O.....O..XOOOX../.X.O....OXXX....X../.OO..O.OXO..XXX..../..OXXO.O.....OXO.../.OXXOXXO..OOO.OXX../OXXX.O.O.XOXX.OOX../.OOXXXOXX.XOO....XX/OXX..XO..XX.XXXOOO./.OX.XOOOX...XOX...O/.OXXXXOX.XOOXOX.OOX/.OOX.XXXOOXOOOOOOXX/XXOO.O.X.XXOXO.OX../OXXOO.O.X.XO...OX../..XOXOOX.X.OXXOOX../.XOXXO..X.XOXOOXX../..........O.O....../","hintLoc":"null","initialTurnNumber":202,"metadata":"794ECDD4BA1813DF7AF084C3D3A97346:212","moveLocs":["S5","L19","K13","G11","E11","J13","K12","L14","L13","N15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.03,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":7.0,"policyOptimism":0.0,"pda":1.896,"policyMixture":[2.22e-06,0.00021,7.14e-05,3.85e-05,2.85e-06,1.78e-06,1.67e-06,1.61e-06,1.66e-06,1.72e-06,0,0,1.81e-06,2.03e-06,1.71e-06,1.62e-06,1.78e-06,1.68e-06,1.79e-06,7.51e-05,0.000166,5.62e-05,0.000151,0,2.81e-05,1.84e-06,1.82e-06,1.8e-06,1.8e-06,0,1.52e-06,2.35e-06,0,0,0,1.78e-06,1.93e-06,1.73e-06,8.57e-05,0.000109,0,9.5e-06,3.31e-05,0,1.81e-06,1.77e-06,1.8e-06,0,1.69e-06,0,0,0,0,0,1.74e-06,1.83e-06,1.67e-06,5.89e-05,0.000631,0.000104,0,2.46e-06,1.83e-06,1.75e-06,1.78e-06,1.71e-06,0,2.07e-06,0.00528,0,0,0,0,0,1.89e-06,1.75e-06,0.00048,0,0.000165,0,4.5e-06,1.81e-06,1.71e-06,1.79e-06,0,0,0,0,0,0.535,1.8e-06,1.86e-06,0,1.96e-06,1.77e-06,0.00158,0,0,0.00384,3.58e-05,0,2.3e-06,0,0,0,0,0.00123,0,0,0,2.48e-06,2.11e-06,1.97e-06,1.81e-06,0.00076,0.000202,0,0,0,0,2.78e-06,0,0,0,0,0.00834,0.0657,0,0,0,2.31e-06,2.22e-06,1.76e-06,0.00033,0,0,0,1.89e-06,0,0,0,1.98e-06,0,0,0,0,2.11e-06,0,0,0,2.28e-06,1.92e-06,0,0,0,0,0,0,0,0,2.08e-06,0,0,0,0,0.0794,0,0,0,2.81e-06,1.89e-06,0.0468,0,0,0,0,0,0,0,0,2.03e-06,0,0,0,1.31e-05,0.000583,0.0649,0.0138,0,0,0,0,0,1.87e-06,1.75e-06,0,0,2.11e-06,1.89e-06,0,0,0.00683,0,0,0,0,0,0,3.48e-06,0.00125,0,0,1.76e-06,0,0,0,0,0,2.32e-06,0.161,1.43e-05,0,0,0,4.93e-06,1.99e-06,2.15e-06,0,1.77e-06,0,0,0,0,0,0,0,1.86e-06,0,0,0,0,0,0,2.05e-06,0,0,0,2.08e-06,0,0,0,2.11e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.41e-06,0,3.68e-06,0,1.97e-06,0,0,0,0,0,1.79e-06,0,0,0,1.67e-06,0,0,0,0,0,0,0,1.85e-06,0,1.89e-06,0,0,1.75e-06,1.77e-06,1.77e-06,0,0,1.94e-06,1.93e-06,1.75e-06,1.93e-06,0,0,0,0,0,0,1.78e-06,0,1.72e-06,0,0,0,0,0,0,1.92e-06,1.95e-06,1.7e-06,0,0,0,0,0,2.19e-06,1.79e-06,0,1.9e-06,0,0,0,0,0,0,0,1.92e-06,1.93e-06,1.71e-06,1.78e-06,3.8e-06,1.81e-06,1.86e-06,2.08e-06,2.14e-06,2e-06,2e-06,3.77e-06,0,0,0,2.31e-06,1.94e-06,1.93e-06,1.77e-06,1.9e-06,1.78e-06,4.69e-06],"winrateAvg":0.0320373,"leadAvg":-1.65297,"scoreMeanAvg":-2.41199,"scoreStdevAvg":5.5252,"shorttermWinlossErrorAvg":0.113115,"shorttermScoreErrorAvg":1.72986,"ownership":[93,94,95,97,98,99,99,99,99,99,100,-25,-31,-73,-97,-99,-99,-99,-99,94,93,95,96,100,99,99,99,99,99,100,82,-43,-100,-100,-100,-99,-99,-99,94,94,93,98,98,100,99,99,99,100,74,99,99,-100,-94,-100,-99,-99,-99,95,95,97,100,99,99,99,99,99,100,-13,76,-92,-93,-94,-94,-100,-99,-99,96,95,98,100,98,99,99,99,100,-98,-98,-98,-92,-98,-97,-98,-100,-99,-99,97,100,100,-48,-35,100,99,100,94,93,74,-47,-100,-100,-100,-99,-99,-98,-98,98,99,100,-100,-100,100,63,100,100,-100,-99,-28,-25,61,-100,-97,-98,-98,-98,98,99,-100,-100,-90,-89,-54,100,37,-100,90,89,87,64,88,-99,-99,-98,-97,98,-100,-100,-100,-100,100,100,100,-34,-100,90,85,80,80,89,90,-99,-98,-97,96,96,-16,-100,-100,-100,100,-100,-100,-98,-100,86,84,-1,-25,52,49,-98,-97,98,-100,-100,-100,-100,-100,100,26,-70,-100,-100,-45,-99,-99,-99,99,100,100,29,96,98,-100,-100,-100,100,100,100,-100,-75,-61,-13,-99,99,-99,-38,48,93,97,46,98,-100,-100,-100,-100,100,-100,-98,-99,100,100,-99,100,-99,41,100,100,-99,-29,98,98,-100,-53,-100,-100,-100,-98,-98,-100,100,100,100,100,100,100,-99,-99,-99,-99,98,98,16,95,10,-100,-99,-100,-100,100,99,100,100,100,-99,-99,-99,-99,-99,-99,98,98,94,96,-47,-100,-99,-100,100,99,99,100,100,-99,-99,-98,-99,-99,-99,98,-99,96,96,-98,-97,-100,33,100,98,98,100,100,-99,-99,-98,-99,-100,-99,-99,-99,96,19,-54,-99,-80,-90,100,98,100,100,-99,-99,-98,-98,-99,-99,-99,-73,18,62,25,-51,-76,-39,83,84,99,90,12,-6,-97,-99,-98],"ownershipAllowedMAE":0.0230384})%"); + lines.push_back(R"%({"sample":{"board":".................../..............O..../.....X............./..O.OO..O.....O.X../...............OO../.................../..........X......../.................../.................../...O.X..........O../..OXX........X...../..X................/.............X.XO../.........O..XOX.O../...........OOO.XX../..XX.X........X..../...OXXO..X....OX.../....OX............./.................../","hintLoc":"null","initialTurnNumber":45,"metadata":"46D628FB45249766928A15E6D77F7A5F:55","moveLocs":["O3","Q2","Q8","Q9","P8","R8","R9","S8","P7","Q6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.68,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":-6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.74e-05,5.38e-05,5.49e-05,5.67e-05,5.57e-05,5.61e-05,5.4e-05,5.68e-05,5.79e-05,5.64e-05,5.43e-05,5.37e-05,5.24e-05,5.29e-05,5.21e-05,5.26e-05,5.15e-05,5.28e-05,4.64e-05,5.35e-05,5.81e-05,6.22e-05,6.33e-05,6.21e-05,6.16e-05,6.27e-05,7.24e-05,0.000102,7.27e-05,6.51e-05,6.46e-05,6.34e-05,5.81e-05,0,5.54e-05,5.86e-05,5.63e-05,5.32e-05,5.28e-05,6.11e-05,6.17e-05,6.71e-05,0.000129,0,0.000254,0.000285,0.000184,0.000212,0.00015,6.66e-05,6.26e-05,5.98e-05,5.75e-05,5.72e-05,5.71e-05,5.59e-05,5.16e-05,5.56e-05,6.1e-05,0,6e-05,0,0,9.63e-05,8.13e-05,0,8.33e-05,0.000221,8.78e-05,6.53e-05,5.83e-05,0,5.57e-05,0,5.93e-05,5.21e-05,5.38e-05,6.38e-05,6.1e-05,6.22e-05,5.73e-05,5.75e-05,6.34e-05,8.07e-05,7.12e-05,0.000148,0.00024,0.000111,6.61e-05,6.2e-05,5.45e-05,0,0,5.85e-05,5.63e-05,5.41e-05,6.24e-05,7.01e-05,6.44e-05,6.68e-05,6.68e-05,6.8e-05,9.61e-05,0.000188,0.000197,0.000149,0.000152,7.77e-05,6.34e-05,6.21e-05,5.72e-05,5.83e-05,6.47e-05,5.63e-05,5.46e-05,6.36e-05,0.000156,0.000136,8.35e-05,8.74e-05,9.74e-05,0.000141,0.000248,0.000191,0,0.000178,0.000158,7.96e-05,6.6e-05,7.2e-05,0.000136,6.42e-05,5.41e-05,5.47e-05,6.37e-05,0.000185,0.000277,0.000187,0.000196,0.000174,0.000185,0.000206,0.000261,0.000248,0.000326,0.000218,0.000159,0.00013,0.000201,0.000238,7.6e-05,5.5e-05,5.47e-05,5.93e-05,0.000178,5.89e-05,0.000136,0.000234,0.000255,0.000181,0.000205,0.000255,0.000301,0.000255,0.000192,0.000167,0.000344,0.000195,6.05e-05,6.05e-05,5.46e-05,5.26e-05,0.000534,0.000682,0,0.000115,0,0.000138,0.00015,0.000222,0.00028,0.000265,0.000187,0.000111,0.000148,0.000266,0.000405,0,5.37e-05,5.26e-05,5.33e-05,0.00026,0,0,0,7.09e-05,0.0001,0.000183,0.000303,0.000352,0.000301,0.000175,6.48e-05,0,0.00733,0,0,0.000308,5.54e-05,5.26e-05,0.00053,0,0.000153,6.03e-05,6.8e-05,7.38e-05,0.000191,0.000329,0.000355,0.000308,0.000227,0.000122,0.953,0,0,0,0,0.000159,5.35e-05,6.07e-05,0.00033,6.41e-05,6.42e-05,6.82e-05,9.71e-05,0.000255,0.000188,7.86e-05,0.000136,0.000126,0.00018,0,0,0,0,0.000212,5.58e-05,5.2e-05,5.98e-05,6.22e-05,6.1e-05,6.28e-05,6.78e-05,0.000178,0.00037,7.95e-05,0,6.14e-05,9.32e-05,0,0,0,0,0,5.32e-05,5.44e-05,5.16e-05,5.74e-05,5.88e-05,5.86e-05,6.11e-05,6.8e-05,0.000278,0.000544,0.000405,0.000101,6.34e-05,0,0,0,5.19e-05,0,0,5.98e-05,4.87e-05,5.19e-05,0.000156,0,0,5.21e-05,0,0.000381,0.000292,0.000728,0.000819,0.00021,6.02e-05,5.48e-05,6.18e-05,0,9.71e-05,0.000139,4.89e-05,4.86e-05,5.28e-05,5.87e-05,0.00016,0,0,0,0,0.000143,0.000846,0,0.000637,0.000372,6.46e-05,0,0,0,5.19e-05,5.05e-05,4.83e-05,5.53e-05,5.76e-05,5.9e-05,5.76e-05,0,0,0.000256,0.000148,0.000392,0.000612,0.000542,0.000242,7.18e-05,6.06e-05,6.26e-05,0,5.37e-05,5.03e-05,4.98e-05,4.83e-05,5.5e-05,5.22e-05,5.61e-05,5.64e-05,6.2e-05,5.43e-05,5.87e-05,5.96e-05,5.92e-05,5.92e-05,6.04e-05,5.92e-05,6.05e-05,5.89e-05,5.74e-05,5.19e-05,5.2e-05,4.75e-05,6.47e-05],"winrateAvg":0.0103064,"leadAvg":-11.48,"scoreMeanAvg":-12.8907,"scoreStdevAvg":13.0519,"shorttermWinlossErrorAvg":0.0244138,"shorttermScoreErrorAvg":1.60973,"ownership":[45,43,39,34,29,23,20,19,21,23,27,34,43,59,70,73,66,63,60,48,47,40,39,29,26,18,24,20,29,29,34,44,52,89,70,67,60,60,49,54,51,47,61,8,25,31,37,32,25,29,33,33,67,70,65,60,58,50,56,87,55,92,92,32,34,80,22,19,20,26,38,95,75,51,60,58,47,50,39,40,41,35,28,21,22,13,10,11,14,18,42,96,96,60,61,39,40,35,26,21,14,4,6,8,6,-5,4,5,11,18,43,56,68,59,32,34,29,21,12,5,1,1,-1,-8,-60,-10,-3,3,12,28,41,46,54,22,26,21,17,7,-3,-5,-4,-5,-7,-15,-6,-9,-4,5,23,44,50,47,10,16,19,7,-5,-15,-10,-8,-7,-9,-13,-14,-11,-10,7,14,35,45,41,-9,5,28,43,-24,-87,-25,-13,-10,-12,-15,-18,-17,-15,-3,25,70,45,31,-34,-27,33,-93,-92,-48,-20,-12,-9,-9,-12,-18,-24,-57,-24,-31,69,5,11,-54,-70,-90,-69,-50,-28,-18,-9,-3,-1,-4,0,-19,92,92,91,-82,-83,-13,-68,-71,-68,-58,-45,-29,-15,-2,4,14,13,27,72,73,90,-99,-83,-82,-66,-73,-75,-69,-58,-44,-30,-13,3,20,74,36,65,55,91,-99,-99,-84,-88,-82,-79,-82,-75,-63,-51,-38,-18,9,9,22,41,89,90,91,21,-99,-99,-92,-90,-83,-88,-99,-99,-83,-99,-35,-13,-6,7,18,39,44,-28,-95,-95,-96,-96,-93,-86,-88,-89,-85,-99,-99,4,-27,-28,-64,2,-4,41,62,62,-99,-96,-95,-94,-87,-87,-87,-90,-85,-99,-42,-46,-41,-34,-11,1,17,23,2,-99,-94,-94,-94,-87,-88,-87,-87,-88,-82,-72,-52,-41,-26,-12,3,5,-1,-33,-59,-91,-93,-93],"ownershipAllowedMAE":0.032482})%"); + lines.push_back(R"%({"sample":{"board":"XXXXXOO...OXX.XOO../OOOXOO.OOOOOX.XXO../.OXXXXOOXXOXXX.XOO./.OX.X.XOXXOOOOXO..O/.OOXX.XOXOOOXXXOOOX/.OX..X.XXXXXXXOOOXX/.OXXXX..XXXOOXXOXXX/..OXOX..XOXXOOOX.X./..OOOX..XOOOOXXXXXX/..OOXX..XOOXOOXOXOX/.OXXXOXXXXOXOOOOOOO/.OOX.O.OOOXXXXOOO../.OXXOOOOXXXXOOO..OO/OOXXXO.XOOOXXOXO.OX/XXXOOO.XXOOOXXXOOXX/XOOOOOOXXXO.OXOOXX./OO.OXXOX.XO.OXOX.../..OX.XX.XO.OXXXXXO./..OXX.XXXO.OOX...../","hintLoc":"null","initialTurnNumber":301,"metadata":"13A076C5D546E32B1DB04AF525A1D53E:311","moveLocs":["G8","E8","G5","G6","pass","S3","pass","T2","pass","S1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0button1","komi":12.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0,0,0,0,0,0.0336,0.0144,0.0136,0,0,0,0.00491,0,0,0,0.0128,0.00931,0,0,0,0,0,0,2.74e-05,0,0,0,0,0,0,0.00529,0,0,0,0.0138,0.013,0.0137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0313,0.0135,0,0,0,0,0.00899,0,0,0,0,0,0,0,0,0,0,0.0296,0.0353,0,0.0131,0,0,0,0,0.00799,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0125,0,0,0.0038,0.00339,0,0.00252,0,0,0,0,0,0,0,0,0,0,0,0,0.0126,0,0,0,0,0,0.00917,0.00253,0,0,0,0,0,0,0,0,0,0,0,0.00905,0.0265,0,0,0,0,0.00389,0.00478,0,0,0,0,0,0,0,0,0,0,0,0.00619,0.0136,0,0,0,0,0.00536,0.00514,0,0,0,0,0,0,0,0,0,0,0,0.0101,0.0267,0,0,0,0,0.0019,0.0022,0,0,0,0,0,0,0,0,0,0,0,0.0131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0264,0.0269,0.0136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0266,0.0293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0283,0,0,0,0,0,0,0.00198,0,0,9.01e-06,0,0,0,0,0,0,0,0,0.0306,0,0,0,0,0,0,0.00196,0.0136,0.0332,0,0,0,0,0,0,0,0,0.0295,0,0,0,0,0,0,0,0,0.011,0.0137,0,0,0,0,0,0,0,0,0.0301,0,0,0,0.00197,0.00194,0.00198,0,0,0.188],"winrateAvg":0.999957,"leadAvg":9.39412,"scoreMeanAvg":9.45748,"scoreStdevAvg":0.545184,"shorttermWinlossErrorAvg":0.00647379,"shorttermScoreErrorAvg":0.341011,"ownership":[-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,100,100,100,-100,-100,-100,100,100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,-100,-100,-100,100,100,100,-100,100,-100,-100,-100,-100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,100,100,-100,100,-100,100,-100,100,100,-100,-100,-100,100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,100,100,100,-100,-100,100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,100,100,100,-100,100,100,-100,-100,-100,100,100,100,100,-100,-100,100,-100,-100,-100,100,100,100,-100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.000369418})%"); + lines.push_back(R"%({"sample":{"board":".O.XXX.XXO..O....../XOXX..XXOO.OXOXXO../..XX..X.XO.OX..OX../XXX..X.XXXO.XO.OO../OOOXXX.XXO.OX....../..OOOXXXOOOXXO..OO./.O..OOXXOO.OX.O.OO./.O.OOXXXXXOOX.XOXOO/.O.O.OXXOXO..XOOXXO/OOOOOOXXOOO..OOOOXO/XXXOXX.XOOXXX.OXOXX/X.XOX.XOO....OXXXX./.XOOXXO.O.OOOOOX.../XOOX.XOOO.OXXXX..../XXX.XXOOXOOOXXXX.../OOXXXXOXXXOOOOOXX../.OOOOXOX.OXXOOOXO../O.OXOXX.XOX.XXOX.../.OXXXX.X......X..../","hintLoc":"null","initialTurnNumber":154,"metadata":"EEFEF7CCF7DB1CE2A68A4A81BB42BBE3:164","moveLocs":["M2","M1","N8","pass","J3","H2","A14","pass","L1","K1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.17,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui0","komi":9.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00479,0,0.00231,0,0,0,0,0,0,0,0.00298,0.0233,0,0.0206,0.0196,0.0231,0.00993,0.0016,0.00139,0,0,0,0,0.002,0.00206,0,0,0,0,0.0175,0,0,0,0,0,0,0.0103,0.00151,0.00414,0.00634,0,0,0.0077,0.0035,0,0,0,0,0.0215,0,0,0.0334,0.0247,0,0,0.0592,0.00161,0,0,0,0.00151,0.00178,0,0.00147,0,0,0,0,0.0292,0,0,0.0166,0,0,0.011,0.00151,0,0,0,0,0,0,0.00146,0,0,0,0.023,0,0,0.0198,0.0106,0.0119,0.0178,0.00976,0.00154,0,0.00627,0,0,0,0,0,0,0,0,0,0,0,0,0.0178,0.0124,0,0,0.00478,0.00635,0,0.00513,0.00412,0,0,0,0,0,0,0.0181,0,0,0.0184,0,0.0179,0,0,0.0092,0.00283,0,0.00414,0,0,0,0,0,0,0,0,0,0,0.0318,0,0,0,0,0,0.00416,0,0.004,0,0.00551,0,0,0,0,0,0,0.0143,0.029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0208,0.0205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0142,0.0211,0.0192,0,0,0,0,0,0,0.00157,0,0,0,0,0,0,0,0.00928,0,0.0191,0,0,0,0,0,0,0.00168,0.00654,0.00173,0,0,0,0,0,0,0,0,0,0.0177,0,0,0,0,0,0.00169,0.0182,0.0101,0.00188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.0112,0.00187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.011,0.00174,0.00464,0,0,0,0,0,0,0,0.00166,0.00188,0,0,0,0,0,0,0,0.00508,0.00254,0,0.00522,0,0,0,0,0,0,0,0.00523,0,0,0,0,0,0,0.00881,0.014,0.00235,0.00575,0,0,0,0,0,0,0,0,0,0,0,0.00165,0.0103,0,0.0101,0.00389,0.00252,0.00167,0.000286],"winrateAvg":0.9999,"leadAvg":30.012,"scoreMeanAvg":30.0744,"scoreStdevAvg":1.50013,"shorttermWinlossErrorAvg":0.00347264,"shorttermScoreErrorAvg":0.687991,"ownership":[-87,-76,-89,-100,-100,-100,-89,-100,-100,100,90,92,99,91,94,95,88,88,91,-98,-74,-100,-100,-86,-86,-100,-100,100,100,92,100,82,99,82,82,100,89,90,-88,-89,-100,-100,-87,-87,-100,-87,-100,100,93,100,83,94,96,100,91,97,90,-100,-100,-100,-88,-87,-100,-88,-100,-100,-100,100,91,84,100,91,100,100,91,91,100,100,100,-100,-100,-100,-88,-100,-100,100,93,100,84,94,89,89,91,90,90,100,100,100,100,100,-100,-100,-100,100,100,100,85,84,100,90,89,100,100,89,100,100,100,100,100,100,-100,-100,100,100,92,100,83,94,100,91,100,100,91,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,81,97,86,100,-100,100,100,100,100,100,100,100,100,-100,-100,100,-100,100,90,96,84,100,100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,100,100,91,92,100,100,100,100,-100,100,-100,-100,-100,100,-100,-100,-88,-100,100,100,76,77,76,90,100,-100,100,-100,-100,-100,-88,-100,100,-100,-87,-100,100,100,89,89,89,100,100,-100,-100,-100,-100,-88,-92,-100,100,100,-100,-100,100,91,100,91,100,100,100,100,100,-100,-89,-87,-87,-100,100,100,-100,-87,-100,100,100,100,91,100,-100,-100,-100,-100,-92,-87,-88,-87,-100,-100,-100,-88,-100,-100,100,100,-100,100,100,100,-100,-100,-100,-100,-90,-87,-87,100,100,-100,-100,-100,-100,100,-100,-100,-100,100,100,100,100,100,-100,-100,-89,-88,100,100,100,100,100,-100,100,-100,-89,-88,-100,-100,100,100,100,-100,-81,-91,-88,100,100,100,-100,100,-100,-100,-100,-100,-88,-100,-88,-100,-100,100,-100,-91,-88,-87,100,100,-100,-100,-100,-100,-89,-100,-89,-99,-90,-100,-89,-89,-100,-90,-89,-88,-87],"ownershipAllowedMAE":0.0368929})%"); + lines.push_back(R"%({"sample":{"board":".O....XXX.X.O./OXXX.XXXOXXXOO/.OOXXXOOOOXOO./.OXOXOX..OOXOO/...OOO.X...XOX/.O......X.XXXX/...X..XX.XOX.X/.OO..OXOOXOOX./.OXXXXOO.O..OX/.XX.XXXXOOOO.O/..OX.XOOXXXO../..OXOOO.O.XXO./..X.XXOOXXXO.O/.....XO.OXOOO./","hintLoc":"null","initialTurnNumber":136,"metadata":"3A0CB5F1E717028B6BD780B2F1160AEF:146","moveLocs":["G10","F9","H1","D7","E4","J1","N5","N4","H1","K10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.81,"xSize":14,"ySize":14},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":8.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0.000236,0.000182,0.000295,0.000135,0,0,0,0.000585,0,0.000116,0,0,0,0,0,0,0.000144,0,0,0,0,0,0,0,0,0,0.00117,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000223,0,0,0,0,0,0,0.00228,0.00213,0,0,0,0,0,0.000209,0.000358,0.0044,0,0,0,0,0,0.0037,0,0.000203,0,0,0,0.000203,0,0.00272,0.000207,0.000201,0,0.000266,0.000187,0,0.743,0,0,0,0,0.00019,0.000719,0.0036,0,0.00128,0.00234,0,0,0.0738,0,0,0,0.000156,0,0.000195,0,0,0,0.002,0,0,0,0,0,0,0,0,0.000276,0.000213,0,0,0,0,0,0,0,0,0,0.0324,0.0368,0,0,0.000202,0,0,0.000168,0,0,0,0,0,0,0,0,0,0,0.000188,0.000181,0,0,0,0,0,0,0,0,0,0,0,0.00149,0.000181,0.000182,0,0,0,0,0,0.0784,0,0.000171,0,0,0,0.000173,0.000181,0.000177,0,0.000172,0,0,0,0,0,0,0,0,0,0,0.000176,0.000176,0.000174,0.000174,0.00016,0,0,0,0.000192,0,0,0,0,0,0.000193],"winrateAvg":0.942811,"leadAvg":2.02549,"scoreMeanAvg":2.18113,"scoreStdevAvg":3.9686,"shorttermWinlossErrorAvg":0.172811,"shorttermScoreErrorAvg":1.90082,"ownership":[25,23,-64,-91,-95,-96,-97,-97,-97,-94,-92,91,100,100,80,-98,-98,-98,-97,-98,-98,-97,-88,-93,-93,-93,100,100,84,98,98,-98,-98,-98,-90,-89,-89,-88,-94,100,100,100,93,99,97,99,-98,99,-99,-96,-92,-88,-87,-93,100,100,97,98,97,99,99,99,-99,-99,-96,-85,-89,-92,100,-92,96,99,52,37,41,99,14,-62,-99,-94,-93,-91,-92,-92,93,85,19,-24,-16,-30,-99,-98,-82,-99,83,-92,-61,-93,78,97,96,96,-10,42,-99,40,43,-98,82,81,-63,-23,-4,97,-100,-100,-100,-100,36,39,46,100,85,79,90,-23,-30,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,91,94,-95,-97,-96,-100,-100,-100,85,87,87,88,89,100,100,96,-96,-98,-96,-100,83,86,85,85,85,87,89,90,100,99,-97,-98,-99,-98,-98,-98,85,84,87,88,89,100,100,100,-98,-98,-98,-98,-97,-98,86,86,85,89,100,100,100,100],"ownershipAllowedMAE":0.0839788})%"); + lines.push_back(R"%({"sample":{"board":"................../..........X......./...........X.XXO../...O........OOOO../...........X..X.../.........XX..X.XX./.......O.OOX.XXOO./.............XO.O./..........OXXOOO../.......OX.OOOXO.../...O...OXXXOOXXO../....X.XX..XOXXXO../.XOOX...XXOOXXOO../.O.OXXO..O..XXXXX./.XXXOX.....OX.X.../.OOOOX.....OOXOO../....XOX....OXXXO../................../","hintLoc":"null","initialTurnNumber":62,"metadata":"89DDA90C5656D07E5B255FF3E4A3E9AB:72","moveLocs":["R3","R6","R7","S2","S3","P1","N1","R9","Q9","R10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.7,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":7.5,"policyOptimism":0.0,"pda":-2.364,"policyMixture":[1.32e-05,1.62e-05,1.55e-05,1.56e-05,1.52e-05,1.51e-05,1.51e-05,1.49e-05,1.51e-05,1.45e-05,1.59e-05,2.09e-05,2.08e-05,1.84e-05,2.68e-05,1.74e-05,1.83e-05,1.44e-05,1.6e-05,1.78e-05,1.76e-05,1.9e-05,1.76e-05,1.8e-05,1.84e-05,1.86e-05,1.78e-05,1.78e-05,0,2.67e-05,3.76e-05,4.43e-05,6.8e-05,0.00157,2.28e-05,1.87e-05,1.53e-05,1.82e-05,1.91e-05,2.02e-05,2.08e-05,2.59e-05,2.19e-05,1.9e-05,1.7e-05,0.000361,4.7e-05,0,0.000363,0,0,0,1.7e-05,1.83e-05,1.57e-05,1.97e-05,2.16e-05,0,1.96e-05,2.08e-05,2.02e-05,1.87e-05,1.79e-05,1.91e-05,6.9e-05,0.000147,0,0,0,0,2.03e-05,0.000353,1.51e-05,1.81e-05,2.11e-05,2.02e-05,1.91e-05,1.82e-05,1.84e-05,1.82e-05,1.73e-05,1.93e-05,1.73e-05,0,3.53e-05,1.57e-05,0,1.69e-05,0.0907,0.000733,1.51e-05,1.83e-05,2.01e-05,1.89e-05,1.76e-05,1.78e-05,1.81e-05,1.76e-05,2.77e-05,0,0,2.35e-05,6.81e-05,0,0,0,0,0.00757,1.52e-05,1.85e-05,1.83e-05,1.79e-05,1.76e-05,1.74e-05,1.81e-05,0,1.73e-05,0,0,0,3.44e-05,0,0,0,0,0.000861,1.51e-05,1.82e-05,1.76e-05,1.75e-05,1.76e-05,1.74e-05,1.79e-05,1.89e-05,1.84e-05,1.62e-05,1.6e-05,0.00131,0.00036,0,0,2.11e-05,0,0.13,1.51e-05,1.79e-05,1.75e-05,1.8e-05,1.75e-05,1.75e-05,1.72e-05,1.83e-05,2.03e-05,1.72e-05,0,0,0,0,0,0,0,0.0819,1.51e-05,1.77e-05,2.56e-05,1.85e-05,1.81e-05,1.78e-05,1.65e-05,0,0,1.53e-05,0,0,0,0,0,0,0,0.0327,1.55e-05,1.92e-05,2.36e-05,0,1.76e-05,1.71e-05,1.59e-05,0,0,0,0,0,0,0,0,0,0.367,0.027,1.59e-05,1.95e-05,1.77e-05,1.82e-05,0,1.55e-05,0,0,1.47e-05,1.56e-05,0,0,0,0,0,0,0,0.0206,1.71e-05,0,0,0,0,1.41e-05,1.54e-05,1.55e-05,0,0,0,0,0,0,0,0,0,0.174,1.69e-05,0,1.77e-05,0,0,0,0,1.56e-05,1.61e-05,0,1.52e-05,0.0149,0,0,0,0,0,0.000267,1.62e-05,0,0,0,0,0,1.62e-05,1.62e-05,1.68e-05,1.76e-05,1.72e-05,0,0,0,0,1.15e-05,0.000423,0.00176,1.53e-05,0,0,0,0,0,1.65e-05,1.71e-05,1.81e-05,1.76e-05,1.58e-05,0,0,0,0,0,0,0,1.51e-05,1.67e-05,1.55e-05,1.53e-05,0,0,0,1.7e-05,1.9e-05,1.74e-05,1.48e-05,0,0,0,0,0,3.51e-05,0,1.41e-05,1.61e-05,1.54e-05,1.62e-05,1.59e-05,1.61e-05,1.55e-05,1.57e-05,1.6e-05,1.6e-05,1.64e-05,0.0137,0,1.25e-05,0,0.0276,0.000836,1.59e-05,1.94e-05],"winrateAvg":0.479021,"leadAvg":-3.85014,"scoreMeanAvg":-1.1805,"scoreStdevAvg":17.2862,"shorttermWinlossErrorAvg":0.453623,"shorttermScoreErrorAvg":6.62647,"ownership":[14,15,13,12,6,-4,-16,-30,-43,-62,-74,-79,-68,-53,-17,16,33,35,15,14,17,14,7,-7,-19,-27,-41,-50,-93,-85,-80,-66,-40,29,36,34,15,18,27,29,25,-5,-13,-23,-31,-17,-64,-94,-3,-72,-75,46,38,31,15,12,39,83,27,1,-9,-16,-27,-38,-58,-42,38,40,43,45,31,29,13,18,32,30,14,3,-3,-5,-26,-39,-70,-98,-19,-21,-94,-31,37,-36,9,10,16,15,7,1,-5,6,-8,-97,-98,-94,-79,-97,-92,-93,-90,-56,7,8,7,6,4,5,18,78,23,80,80,-96,-89,-97,-97,84,84,-8,8,8,5,3,1,3,15,26,16,42,29,-24,-89,-97,89,83,84,52,13,13,5,1,-3,-1,7,8,10,21,94,-91,-90,89,88,89,72,76,24,25,28,-2,-10,-4,-8,36,-98,-18,94,95,96,-79,89,89,73,76,41,32,19,48,-26,-25,-40,33,-98,-98,-98,94,95,-80,-80,89,82,67,60,73,61,-58,-99,-61,-99,-99,-97,-96,-98,94,-82,-79,-79,89,89,42,75,68,90,89,-99,-79,-58,-59,-99,-98,94,94,-81,-80,87,90,-79,3,80,88,85,90,-100,-100,-4,-23,4,76,75,69,-83,-81,-80,-80,-80,-54,83,81,81,80,89,-100,-45,-22,-5,22,63,92,-82,-80,-81,-70,-72,-75,83,88,87,88,88,-99,-62,-27,0,18,49,91,92,-79,-60,-59,-59,-61,77,71,71,-40,-82,-82,-97,-42,-12,28,53,91,-76,-78,-76,-60,-58,-63,71,66,52,24,-53,-86,-79,-49,-6,31,66,87,88,31,-77,-71,-57,-60],"ownershipAllowedMAE":0.101745})%"); + lines.push_back(R"%({"sample":{"board":"............/.....X.OXX../....OXO.OX../...XX...OXX./.........OOO/..O.....OXX./.......XXOX./.O.....XOOX./.XOX.O.XOX.X/.O.OXO.XOOX./..O....XXOXO/..........O./","hintLoc":"null","initialTurnNumber":39,"metadata":"62E01C3ED18AC49EAD087838063CE5A6:49","moveLocs":["L4","H7","J8","K4","F9","K1","E11","F8","G9","D11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.83,"xSize":12,"ySize":12},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":3.0,"policyOptimism":0.303,"pda":0.0,"policyMixture":[2.31e-05,2.61e-05,2.41e-05,4.33e-05,0.00338,0.0371,3.71e-05,2.93e-05,0.00301,2.78e-05,0.00025,2.35e-05,2.59e-05,2.77e-05,4.74e-05,0,0,0,0.0503,0,0,0,0.057,0.0026,2.62e-05,0.000112,0.000201,0.000504,0,0,0,2.54e-05,0,0,2.61e-05,0.000218,2.72e-05,0.00138,0.000308,0,0,0,0,2.21e-05,0,0,0,0.84,2.71e-05,0.000154,0.000131,3.36e-05,3.93e-05,0,3.92e-05,2.54e-05,0,0,0,0,2.62e-05,2.91e-05,0,3.17e-05,8.97e-05,3.6e-05,2.49e-05,0,0,0,0,2.3e-05,2.46e-05,2.66e-05,2.72e-05,3.08e-05,4.63e-05,3.71e-05,2.46e-05,0,0,2.13e-05,0,2.25e-05,2.4e-05,0,2.68e-05,0.000423,2.96e-05,2.73e-05,2.49e-05,0,2.06e-05,2.12e-05,0,2.18e-05,2.41e-05,0,0,0,0.000663,0,2.31e-05,0,2.05e-05,0,0,0,2.31e-05,0,2.43e-05,0,0,0,2.45e-05,0,2.05e-05,2.04e-05,0,2.25e-05,2.28e-05,2.49e-05,0,2.63e-05,7.34e-05,5.25e-05,2.97e-05,0,0,2.01e-05,0,0,2.29e-05,2.34e-05,2.45e-05,2.57e-05,2.68e-05,2.81e-05,2.61e-05,2.33e-05,2.24e-05,0,0,2.24e-05,2.8e-05],"winrateAvg":0.389009,"leadAvg":-0.279925,"scoreMeanAvg":-0.531456,"scoreStdevAvg":4.21417,"shorttermWinlossErrorAvg":0.410313,"shorttermScoreErrorAvg":1.39733,"ownership":[-56,-67,-77,-73,-74,-42,21,81,76,62,60,60,-44,-55,-69,-95,-66,-64,64,98,58,55,56,62,-20,-40,-48,-95,-66,-64,98,94,98,58,63,69,5,18,-8,-97,-97,96,97,52,98,61,57,87,45,32,-12,-19,-56,-89,-10,-57,98,98,98,98,68,73,92,-6,-9,-26,-47,-100,98,-100,-100,-10,84,80,43,13,-6,-4,-40,-100,-100,-100,-100,-71,93,98,45,40,15,4,-28,-100,-100,-100,-100,-96,97,96,98,22,58,85,-10,-100,-100,-100,-100,-100,97,99,94,95,5,84,-25,-100,-100,-100,-100,-100,97,95,98,29,23,-13,-34,-100,-100,-100,-100,-99,95,93,78,60,19,-12,-58,-81,-98,-100,-99,-99],"ownershipAllowedMAE":0.103342})%"); + lines.push_back(R"%({"sample":{"board":".................../..O................/....O.....X..OX..../..X.....O....O.X.../......OOXXX.X..OX../...X..OXO....O..X../....O..X..X....OX../..O......XO...OX.../............O.OX.../.............XX..../.................../.................../.................../...............X.../.................../...O...........O.../.................../.................../.................../","hintLoc":"null","initialTurnNumber":41,"metadata":"C3E97F75651E3080B4AA50744B76137D:51","moveLocs":["L11","K11","K10","L10","L9","M10","N10","M9","N9","M8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.08,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.352,"pda":0.0,"policyMixture":[3.73e-06,4e-06,3.78e-06,3.94e-06,4.09e-06,4.03e-06,4.1e-06,4.24e-06,4.41e-06,4.53e-06,4.69e-06,4.7e-06,4.54e-06,4.84e-06,4.73e-06,4.98e-06,4.4e-06,4.31e-06,3.84e-06,4.62e-06,4.87e-06,0,4.92e-06,5.03e-06,5.15e-06,5.27e-06,5.7e-06,2.09e-05,4.07e-05,0.000103,8.84e-06,4.71e-05,1.27e-05,0.0138,2.99e-05,2.24e-05,5.04e-06,4.24e-06,4.31e-06,5.33e-06,4.95e-06,4.84e-06,0,5.36e-06,5.63e-06,6.49e-06,6.75e-06,0.000119,0,5.47e-05,4.42e-06,0,0,0.000163,0.0505,6.34e-06,3.95e-06,4.21e-06,4.48e-06,0,4.65e-06,5.05e-06,4.78e-06,4.25e-06,4.69e-06,0,2.92e-05,1.1e-05,6.9e-05,5.62e-06,0,0.00393,0,0.000281,5.96e-06,4.04e-06,4.23e-06,5.32e-06,4.8e-06,4.87e-06,4.98e-06,4.06e-06,0,0,0,0,0,3.27e-05,0,6.16e-05,8.8e-06,0,0,4.65e-06,4.07e-06,4.47e-06,7.39e-06,5.17e-06,0,5.32e-06,4.32e-06,0,0,0,4.58e-06,1.56e-05,2.39e-05,2.8e-05,0,5.12e-06,0.000224,0,3.94e-06,4.01e-06,4.58e-06,2.15e-05,6.25e-06,7.24e-06,0,5e-06,2.62e-05,0,2.35e-05,0.00599,0,0.145,2.56e-05,5.28e-06,6.04e-06,0,0,4.16e-06,3.81e-06,4.61e-06,6.63e-06,0,5.66e-06,5.78e-06,5.92e-06,6.23e-06,2.47e-05,3.01e-05,0,0,5.69e-06,4.76e-05,5.14e-06,0,0,8.67e-06,4.73e-06,3.9e-06,4.04e-06,5.69e-06,5.39e-06,5.92e-06,6.43e-06,6.3e-06,6.34e-06,6.27e-06,3.16e-05,0,0,6.92e-05,0,1.85e-05,0,0,5.71e-06,5.1e-06,4.09e-06,4.08e-06,5.51e-06,6.54e-06,5.99e-06,6.2e-06,6.33e-06,6.41e-06,6.16e-06,2.44e-05,0,0,0,0,0,0,0.505,1.08e-05,5.37e-06,4.05e-06,4.1e-06,5.49e-06,6.44e-06,5.96e-06,6.01e-06,6.17e-06,6.23e-06,6.22e-06,6.44e-06,6e-06,0,0,0,2.4e-05,1.43e-05,7.4e-05,8.91e-06,5.43e-06,4.07e-06,4.07e-06,5.44e-06,5.91e-06,5.83e-06,5.91e-06,6.05e-06,6.12e-06,6.11e-06,6.17e-06,5.29e-06,6.14e-06,0,0.27,0.000226,0.00142,5.82e-05,2.74e-05,5.93e-06,4.16e-06,4.07e-06,5.42e-06,6.22e-06,5.88e-06,5.91e-06,5.96e-06,6.18e-06,6.13e-06,6.25e-06,6.65e-06,7.93e-06,1.23e-05,3.74e-05,0.000107,0.000259,6.47e-05,3.37e-05,7.01e-06,4.28e-06,4.07e-06,5.52e-06,1.26e-05,7.75e-06,5.76e-06,5.97e-06,6.05e-06,6.14e-06,6.18e-06,6.33e-06,6.42e-06,1.22e-05,2.53e-05,4e-05,4.84e-05,0,3.76e-05,7.54e-06,4.36e-06,4.17e-06,5.7e-06,9.45e-06,5.73e-06,5.77e-06,5.81e-06,6.01e-06,6.05e-06,6.15e-06,6.25e-06,6.34e-06,7.39e-06,1.25e-05,2.05e-05,8.35e-06,7.75e-06,2.06e-05,1.06e-05,4.43e-06,4.12e-06,5.58e-06,5.95e-06,0,5.63e-06,8.9e-06,6.84e-06,6.33e-06,6.52e-06,6.6e-06,6.77e-06,7.9e-06,1.56e-05,2.48e-05,5.9e-06,0,6.6e-06,6.8e-06,4.34e-06,4.02e-06,5.04e-06,6.02e-06,6e-06,7.77e-06,1.64e-05,9.58e-06,7e-06,6.89e-06,6.99e-06,7.16e-06,7.98e-06,1.19e-05,2.13e-05,1.22e-05,6.31e-06,6.32e-06,5.38e-06,4.21e-06,4.03e-06,4.64e-06,5.01e-06,5.57e-06,5.78e-06,5.76e-06,5.76e-06,5.82e-06,5.82e-06,5.86e-06,5.87e-06,5.88e-06,5.94e-06,5.94e-06,6.13e-06,5.99e-06,5.26e-06,4.71e-06,4.14e-06,3.75e-06,4.05e-06,4.03e-06,4.08e-06,4.22e-06,4.11e-06,4.12e-06,4.13e-06,4.12e-06,4.12e-06,4.15e-06,4.17e-06,4.21e-06,4.22e-06,4.35e-06,4.28e-06,4.14e-06,4.09e-06,3.74e-06,4.71e-06],"winrateAvg":0.458207,"leadAvg":-0.634747,"scoreMeanAvg":-0.673386,"scoreStdevAvg":13.9344,"shorttermWinlossErrorAvg":0.137644,"shorttermScoreErrorAvg":1.24863,"ownership":[40,51,56,64,60,52,37,20,0,-17,-24,-19,-10,-11,-29,-40,-52,-55,-59,35,36,78,62,67,55,38,25,8,-19,-35,-26,-4,-10,-31,-57,-58,-59,-62,21,21,37,39,86,51,42,31,10,-15,-81,-22,-7,36,-79,-64,-58,-66,-67,13,8,-13,25,24,36,46,53,58,-24,-51,-24,-19,35,1,-89,-76,-75,-73,10,10,9,17,31,41,88,88,-92,-91,-91,-34,-66,-13,-6,10,-97,-85,-80,17,10,9,-10,27,41,88,-70,-54,-74,-10,-9,-2,54,7,-45,-97,-90,-82,30,26,20,38,78,32,16,-71,-61,-36,-44,32,14,25,2,6,-97,-86,-79,40,57,82,34,23,12,6,-16,-41,-87,42,19,28,33,62,-91,-81,-76,-69,40,43,35,24,13,7,-1,-20,-36,-87,37,-33,78,10,59,-91,-62,-64,-58,32,31,23,18,10,5,-2,-13,-47,2,-81,-81,78,-51,-54,-26,-40,-47,-47,24,25,20,14,9,5,-1,-8,-20,-12,-2,-82,77,18,-26,-38,-44,-41,-39,19,21,17,12,8,4,0,-5,-11,-19,-45,-80,44,19,-35,-35,-35,-33,-31,17,18,16,13,9,5,2,-2,-6,-10,-16,-10,14,9,-4,-28,-30,-27,-22,18,19,21,21,14,8,4,1,-2,-3,-5,-4,5,4,-6,-69,-22,-17,-13,21,27,37,33,20,13,7,3,0,-1,-2,-1,1,3,-2,-1,-3,-4,-4,23,26,42,83,33,19,7,4,2,0,-1,0,1,6,9,60,9,5,4,22,24,24,32,28,13,8,4,1,0,-1,0,1,5,12,19,14,10,8,21,19,21,19,16,7,4,3,1,0,-1,-1,1,2,8,10,12,9,10,19,19,17,16,12,8,5,2,0,-1,-1,-1,0,3,7,10,12,11,11],"ownershipAllowedMAE":0.0275743})%"); + lines.push_back(R"%({"sample":{"board":"............./...XOX...XO../...X..O..XOO./.......O.XO.O/...X...O.XXO./..X...XXO.OX./.......O..OX./..O...O.O..../......OX.XXX./...OO....XOOX/.O.OXOOX.OOXX/..XXXXXXO.OOX/.........O.X./","hintLoc":"null","initialTurnNumber":45,"metadata":"D26500125AF82E73BB0BCFE08C2EF563:55","moveLocs":["J4","J5","H4","J3","G4","N5","G12","F11","F10","F13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.79,"xSize":13,"ySize":13},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":7.0,"policyOptimism":0.513,"pda":2.877,"policyMixture":[3.16e-06,3.52e-06,3.36e-06,3.72e-06,1.72e-05,0,0.395,0.00577,0.000132,0.000135,5.67e-06,2.97e-06,2.51e-06,3.51e-06,3.98e-06,4.16e-06,0,0,0,0,0.00735,0.0191,0,0,2.88e-06,3.26e-06,3.44e-06,4.61e-06,4.24e-06,0,0.0139,0,0,0.000104,4.9e-06,0,0,0,2.92e-06,4.24e-06,6.88e-06,3.39e-05,1.63e-05,0.379,0,5.79e-06,0,3.49e-06,0,0,2.52e-06,0,6.01e-06,0.000308,9.32e-06,0,4.4e-05,0.0958,1.13e-05,0,5.04e-06,0,0,0,5.08e-06,9.11e-06,0.000954,0,1.34e-05,0.00209,0.00596,0,0,0,4.31e-06,0,0,0.00066,1.12e-05,0.00651,5.37e-05,1.32e-05,1.02e-05,7.61e-06,5.43e-06,0,3.82e-06,3.94e-06,0,0,0.000305,5.81e-06,1.05e-05,0,4.84e-06,4.58e-06,3.75e-06,0,0.0023,0,0.0049,0.0323,0.0236,1.04e-05,3.67e-06,5.99e-06,3.67e-06,3.47e-06,3.03e-06,3.02e-06,0,0,0,0,0,0,0,3.43e-06,4.16e-06,4.36e-06,0,0,2.74e-06,0,0,0,0,0,0,0,3.36e-06,0,5.09e-06,0,0,0,0,0,0,0,0,0,0,3.69e-06,1.7e-05,0,0,0,0,0,0,0,3.46e-06,0,0,0,3.17e-06,4e-06,3.93e-06,3.21e-06,3.08e-06,3.12e-06,1.11e-05,0.00399,4.87e-06,0,9.27e-06,0,0,1.36e-05],"winrateAvg":0.983775,"leadAvg":3.35788,"scoreMeanAvg":3.66769,"scoreStdevAvg":4.84356,"shorttermWinlossErrorAvg":0.0784146,"shorttermScoreErrorAvg":1.27233,"ownership":[-93,-95,-96,-96,-95,-96,59,88,92,93,96,98,98,-92,-95,-96,-99,-92,-97,99,95,95,91,99,98,98,-91,-94,-95,-99,-92,-96,98,97,95,91,99,99,98,-86,-91,-92,-44,-19,87,80,99,95,91,99,98,98,-79,-86,-92,-96,-25,49,61,99,95,91,91,98,91,-37,-79,-96,-48,-25,46,35,35,99,93,99,-69,38,-9,-29,-20,-9,-6,30,66,100,94,75,98,-77,-11,31,55,94,24,31,43,100,57,99,35,19,-70,-65,59,68,68,59,56,63,100,-95,-96,-97,-97,-97,-96,65,67,73,100,100,96,100,100,100,-97,-94,-93,-96,41,78,-51,99,-99,100,100,-99,-99,-94,-94,-97,-96,19,-2,-99,-99,-99,-99,-99,-99,-95,-95,-93,-94,-96,-11,-45,-58,-88,-94,-97,-98,-97,-96,-92,-93,-97,-96],"ownershipAllowedMAE":0.0429724})%"); + lines.push_back(R"%({"sample":{"board":".OO.O........O...../XX.O.X....OOO.O.XO./.XOOOX...OOXXOXX.O./.OOXXX....OXXXO.XX./.O.X.XXOO.OOXOOOOX./XOOOXOXX...XXX...O./XOXXXO......XXOO.O./.XX..OXXXXXX.OOXO../...XOOOOOOOXXOXXO../..OOOX....XOXXX.OO./.O.OXX.X.X.OOX.OXX./...OO.......OX.O.../.OOXXX.OX...OX.XX../.OXX..XOX.X..OX..../.X.OXOXXOOOO.OO.O../..XXOOOOOXXO..XOO../....X..XOX.XO.XXOX./....XOOOXXXXO.X.XO./......OXX.XO...X.X./","hintLoc":"null","initialTurnNumber":230,"metadata":"BBCEEFB2380EBE833B27DB0E0FD49C7E:240","moveLocs":["O18","J9","J8","O17","M6","K6","O18","Q6","O17","P7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.03,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":-1.928,"policyMixture":[5.73e-05,0,0,0,0,0.039,0.000231,0.000326,0.000223,0.00498,7.59e-05,6.89e-05,0.0118,0,0.000178,0.00107,0.000141,0.000153,7.08e-05,0,0,6.82e-05,0,0.375,0,0.000301,0.00643,0.334,6.7e-05,0,0,0,0,0,0.0034,0,0,0.000101,7.02e-05,0,0,0,0,0,8.79e-05,0.003,0.000138,0,0,0,0,0,0,0,0.000489,0,0.000101,0.000188,0,0,0,0,0,8.13e-05,0.00122,0.000592,6.81e-05,0,0,0,0,0,0.000289,0,0,8.85e-05,0.00941,0,8.81e-05,0,7.04e-05,0,0,0,0,0.000163,0,0,0,0,0,0,0,0,7.74e-05,0,0,0,0,0,0,0,0,0.000105,0.000188,9.25e-05,0,0,0,0.000511,0.000171,7.57e-05,0,7.79e-05,0,0,0,0,0,0,7.76e-05,7.65e-05,7.57e-05,7.93e-05,7.42e-05,6.84e-05,0,0,0,0,6.69e-05,0,7.09e-05,0.00184,0,0,7.4e-05,7.68e-05,0,0,0,0,0,0,0,7.42e-05,0,0,0,0,6.82e-05,7.03e-05,0.000613,0.011,0.0001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.87e-05,7.08e-05,0.0105,0.0001,0,0,0,0,7.69e-05,8.05e-05,0.000243,8.31e-05,0,0,0,0,0,0.000129,0,0,7.29e-05,0.000117,0,6.54e-05,0,0,0,9.69e-05,0,0,0,0.0139,0,0,0,7.79e-05,0,0,0,7.41e-05,8.74e-05,0.000358,0.00504,0,0,0.000305,0.000171,0.000112,0,0.000147,0.0204,0.000121,0,0,0.121,0,7e-05,7.72e-05,7.58e-05,7.99e-05,0,0,0,0,0,0.000124,0,0,0.0014,0.00229,0.000189,0,0,0,0,0,7.83e-05,8.29e-05,0.00173,0,0,0,7.29e-05,8.58e-05,0,0,0,0,0,0,0.00365,0,0,0,9.83e-05,0.000473,9.73e-05,8.09e-05,0,8.23e-05,0,0,0,0,0,0,0,0,0,8.42e-05,0,0,0,0,0.000108,0.000103,7.52e-05,7.25e-05,0,0,0,0,0,0,0,0,0,0,0.000485,0.000731,0,0,0,0.000189,0.000122,7.1e-05,7.65e-05,7.7e-05,8.19e-05,0,0.000927,0.000227,0,0,0,4.06e-05,0,0,7.62e-05,0,0,0,0,0.000113,7.21e-05,7.72e-05,8.52e-05,8.71e-05,0,0,0,0,0,0,0,0,0,7.76e-05,0,6.66e-05,0,0,0.000119,6.55e-05,7.49e-05,7.67e-05,7.83e-05,8.49e-05,6.83e-05,0,0,0,3.87e-05,0,0,8.03e-05,7.44e-05,7.02e-05,0,6.92e-05,0,7.02e-05,5.75e-05],"winrateAvg":0.89938,"leadAvg":5.38516,"scoreMeanAvg":5.53356,"scoreStdevAvg":8.86317,"shorttermWinlossErrorAvg":0.220272,"shorttermScoreErrorAvg":2.84704,"ownership":[20,58,57,40,30,-78,-59,-24,35,70,85,85,64,64,7,-45,-69,-64,-51,-9,-11,23,60,-78,-99,-50,19,9,81,93,93,92,-99,13,-58,-84,-23,-40,3,-3,58,61,61,-100,-49,-30,69,91,92,-99,-99,-100,-99,-99,-21,-19,-35,22,65,62,-100,-100,-100,-52,2,68,80,91,-100,-100,-100,98,30,-45,-44,-31,58,64,-34,-100,-99,-100,-100,83,86,69,92,92,-100,97,98,98,98,-46,23,-70,65,65,65,-99,99,-100,-100,-12,0,7,-100,-100,-100,-50,84,97,100,41,-84,63,-99,-99,-99,99,32,-63,-41,-29,-39,-84,-100,-100,98,99,98,100,93,-82,-98,-99,-43,30,99,-99,-100,-100,-100,-100,-100,-46,98,98,-99,100,99,98,-43,-15,1,-70,99,99,99,99,98,98,97,-100,-100,98,-99,-99,100,98,96,21,49,99,99,99,-63,22,54,-3,38,-20,84,-100,-100,-100,19,99,100,74,74,98,97,99,-65,-66,-39,-87,-3,-75,5,84,83,-99,-31,70,30,27,60,92,95,95,99,98,20,-75,-83,-88,-34,-12,44,83,-99,-62,71,56,37,42,82,96,96,-98,-98,-98,-84,-78,-87,34,42,47,83,-98,18,-7,-1,34,38,18,95,-98,-98,24,9,-89,-77,-87,99,28,28,73,99,15,91,41,37,43,-21,-97,-94,4,1,99,-88,-88,100,100,100,100,92,99,99,91,96,69,52,-83,-88,-98,-98,99,99,99,99,100,-100,-100,100,85,18,-96,96,96,65,26,-82,-82,-88,-90,-89,-8,92,91,99,-100,-99,-100,87,-25,-97,-97,96,-77,-25,-82,-80,-77,-78,-89,93,93,93,-99,-99,-99,-100,85,-22,-96,-96,-96,-81,-82,-80,-77,-70,-14,32,58,93,-99,-100,-99,-99,-16,-13,-22,-79,-96,-96,-95,-86],"ownershipAllowedMAE":0.0483964,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":"...OXX.XXXO..OOOX../.XXOOXX.XOO.O.OXX../XOXXOXXXOO.OOOOOX../O.OOOXOXXXOOXOOXXX./OOOXOXOOOXXOXXXOOX./X.OXOO..OO.XX.O.OX./XX.XXO.OOOOXX.OOOOX/OXXX.XOOOX.XOO..OXX/OOX.XXXXO.XXXO..OOX/O.OXXOOOXXO.XOOOXX./.OOOOOXOOXOX.XXX.X./OX.O.XXXXXOX..X.XO./....OXOOOXXOOOXXOO./...O.OOXOX.XXXX.XO./....OX.XX.X.OOX..../..OOOXXX.XXXOXXOOO./.....OOOXXXXOOOXXX./.......OOOXOOXX..../........OOOOOOXX.X./","hintLoc":"null","initialTurnNumber":292,"metadata":"EE34DC6FEB1EA1B8FD41B4BCD7412B35:302","moveLocs":["K11","E6","L14","O13","L12","E8","M5","O14","G5","B14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.5,"policyOptimism":0.065,"pda":0.0,"policyMixture":[0.0213,0.0032,0.0209,0,0,0,0.00103,0,0,0,0,0.000958,0.000939,0,0,0,0,0.000985,0.001,0.0126,0,0,0,0,0,0,0.00103,0,0,0,0.00101,0,0,0,0,0,0.000993,0.000979,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00101,0.000974,0,0.0548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00103,0,0,0,0,0,0,0.0307,0.00789,0,0,0,0,0,0,0,0,0,0,0.0104,0,0,0.354,0,0,0,0.0144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000197,0,0,0,0,0,0,0,0,0,0.000951,0.00096,0,0,0,0,0,0,0.000184,0,0,0,0,0,0,0,0,0,0,0.000972,0.000973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00996,0,0,0,0,0,0,0.0104,0,0,0,0,0,0,0,0,0,0,0,0,0.00964,0,0,0,0.00937,0,0.00111,0,0,0.000983,0,0,0,0,0,0,0,0,0,0.00946,0.00897,0,0.00668,0,0,0.0105,0.00186,0.000996,0.000995,0.000973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00762,0.000965,0.00101,0.000973,0,0,0,0,0,0,0,0.00108,0,0,0,0,0.0101,0,0,0.00867,0.000997,0.00107,0.001,0.000971,0,0,0,0,0,0.00118,0,0,0,0,0,0.0107,0.0119,0.00654,0.00129,0.00101,0.0113,0,0,0,0,0,0,0.00107,0,0,0,0,0,0,0,0,0,0.0107,0.00121,0.0215,0.0214,0.0154,0.0259,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00127,0.00155,0.016,0.0235,0.0231,0.03,0.0103,0.00118,0,0,0,0,0,0,0,0,0.0072,0.00144,0.0104,0.00101,0.000995,0.00199,0.00218,0.00236,0.00243,0.00147,0.00179,0.001,0,0,0,0,0,0,0,0,0.01,0,0.000598,0.044],"winrateAvg":0.999567,"leadAvg":6.28005,"scoreMeanAvg":6.24286,"scoreStdevAvg":0.999584,"shorttermWinlossErrorAvg":0.00897864,"shorttermScoreErrorAvg":0.427222,"ownership":[100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,99,99,100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,-100,100,-100,-100,-100,100,100,-100,100,100,-100,-100,-100,-100,100,100,100,-100,100,-100,100,100,100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,-100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-98,-100,-100,100,100,100,100,100,100,-100,-100,100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,100,100,-100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,99,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,100,100,100,100,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-99,100,100,100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-99,-99,-99,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-99,-99,-99,-99,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.00174761})%"); + lines.push_back(R"%({"sample":{"board":".....O.......O..../...XOXO.....OXXXX./.XX...XOOOOOXXXOO./..OXXXXX.XXXOOOX../.O.O..OXX..OX.OX../..OOXX.XOOO.X.OX../......O.XO....O.../.OXO....X...O..OX./.XOOO.....O.....X./X.XXO............./.X.XXOO.........../....OX.......X..O./..OX.X.X.......O.O/...........O..XXO./..............XOO./.OXX...XO.....XOOX/..O.X..XO..O..XO.O/.OXX...O.....X.XOX/................../","hintLoc":"null","initialTurnNumber":128,"metadata":"87DC90D5981750B129D23F9C03CCBBAF:138","moveLocs":["G2","J2","R3","H5","G5","G6","H6","J5","G4","S3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.0,"xSize":18,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":39.5,"policyOptimism":0.415,"pda":0.0,"policyMixture":[2.68e-06,3.38e-06,3.24e-06,4.71e-06,4.3e-06,0,3.9e-06,6.82e-06,4.25e-06,4.3e-06,4.53e-06,3.99e-06,5.66e-06,0,4.34e-06,2.28e-06,2.81e-06,2.74e-06,2.89e-06,3.28e-06,3.11e-06,0,0,0,0,6.88e-05,6.34e-06,4.02e-06,5.92e-06,0.0185,0,0,0,0,0,2.86e-06,3.37e-06,0,0,3e-06,0.0015,0.00393,0,0,0,0,0,0,0,0,0,0,0,3.64e-06,3.97e-06,1.2e-05,0,0,0,0,0,0,3.63e-06,0,0,0,0,0,0,0,4.37e-06,3.18e-06,3.92e-06,0,0,0,3.45e-06,3.15e-06,0,0,0,5.09e-06,9.77e-06,0,0,3.14e-06,0,0,4.13e-06,3.25e-06,4.89e-06,4.72e-06,0,0,0,0,4.81e-06,0,0,0,0,0.000343,0,3.38e-06,0,0,4.46e-06,3.59e-06,5.28e-06,0.00253,2.37e-05,7.02e-06,0.0137,8.29e-06,0,2.4e-05,0,0,6.06e-06,3.21e-05,9.19e-06,8.47e-06,0,0.0391,8.41e-06,3.58e-06,7.13e-05,0,0,0,5.33e-06,0.00218,6.07e-05,8.07e-06,0,0.000121,3.2e-05,0.000104,0,0.000747,6.38e-06,0,0,2.91e-06,3.92e-06,0,0,0,0,1.03e-05,0.00231,5.52e-05,0.000126,0.00184,0,0.00199,0.000617,0.00694,0.00222,0.114,0,2.89e-06,0,2.91e-06,0,0,0,1.12e-05,1.31e-05,0.00041,0.000416,0.00208,0.00259,0.000168,0.000279,0.0304,0.192,0.000225,1.24e-05,4.32e-06,3.12e-06,0,2.97e-06,0,0,0,0,0.000454,0.000539,0.000408,0.000373,0.000553,0.000162,2.75e-05,0.000434,0.00942,1.4e-05,4.3e-06,4.18e-06,5.1e-06,6.02e-06,4.78e-06,0,0,1.08e-05,0.0204,0.00532,0.00203,0.00103,0.00185,4.06e-05,0,3.21e-05,9.38e-06,0,2.89e-06,4.41e-06,5.43e-06,0,0,5.04e-06,0,8.44e-06,0,2.25e-05,0.264,0.0084,0.00101,0.000118,1.88e-05,0.000258,0,0,0,3.79e-06,7.84e-06,8.52e-06,4.86e-06,4.27e-06,6.26e-06,0,0,1.31e-05,0.00297,0.000782,0,0.00149,8.62e-06,0,0,0,2.93e-06,4.08e-06,6.23e-06,5.94e-06,4.31e-06,3.73e-06,3.86e-06,0,0,0,9.69e-06,0.000142,0.000696,0.00276,5.52e-06,0,0,0,3.28e-06,3.36e-06,0,0,0,3.42e-06,3.26e-06,0,0,0,5.63e-06,5.88e-05,0.0632,0.000791,5.26e-06,0,0,0,0,4.16e-06,5.16e-06,0,4.61e-06,0,3.59e-06,3.89e-06,0,0,5.04e-06,0.000113,0,0.16,4.49e-06,0,0,0,0,3.68e-06,0,0,0,3.67e-06,4.2e-06,0,0,0,6.53e-06,3.73e-05,0.00705,2.11e-05,0,4.24e-06,0,0,0,2.72e-06,4.92e-06,2.91e-06,2.89e-06,3.36e-06,3.77e-06,5.05e-06,6.38e-06,3.24e-06,3.96e-06,5.6e-06,6.9e-06,7.67e-06,3.81e-06,6.04e-06,1.57e-05,4.68e-05,3.61e-06,5.86e-06],"winrateAvg":0.106062,"leadAvg":-3.8868,"scoreMeanAvg":-5.3246,"scoreStdevAvg":10.8301,"shorttermWinlossErrorAvg":0.0997313,"shorttermScoreErrorAvg":1.10383,"ownership":[-86,-88,-89,-63,-22,46,45,58,64,61,44,27,-14,-13,-62,-78,-83,-90,-84,-88,-93,-97,16,2,57,56,68,65,56,-10,-6,-98,-97,-97,-97,-93,-44,-97,-98,-95,-85,1,-99,72,72,72,73,74,-97,-97,-97,-93,-93,-94,2,-1,56,-99,-99,-99,-99,-99,-39,-97,-97,-96,86,85,85,-96,-94,-93,49,87,57,90,26,-71,-28,-99,-99,-33,3,61,39,67,85,-96,-90,-89,66,79,90,91,-97,-98,-36,-99,88,88,89,45,39,61,86,-96,-87,-86,33,29,79,44,-32,-36,39,4,-25,88,73,60,67,69,85,-51,-81,-83,1,56,54,90,13,-27,6,7,-28,33,68,62,89,46,53,69,-88,-73,-35,-92,90,90,90,21,14,20,8,29,88,34,25,19,12,-14,-87,-38,-95,-92,-97,-97,90,63,32,10,10,14,16,12,4,-5,-20,-17,-18,-9,-91,-97,-92,-98,-97,79,79,24,11,4,6,-1,-3,-17,-6,3,24,35,-88,-87,-88,-95,-92,-98,-3,30,-10,-4,3,2,-17,-78,-14,33,90,75,-83,-84,-77,-98,-94,-98,-82,-90,-26,-32,0,9,1,-38,-21,81,82,91,-79,-79,-84,-88,-92,-89,-78,-90,13,7,20,75,7,-32,-88,-87,91,88,-76,-80,-85,-90,-90,-90,-97,91,92,38,31,23,1,-38,-87,92,92,79,-76,-75,-98,-98,-93,-89,-97,-96,92,55,47,4,-15,-43,-87,92,92,51,-76,-75,-77,-92,-99,-83,-80,-96,91,70,57,85,-13,-50,-87,92,44,50,-78,-75,-97,-98,-87,-60,-78,91,92,75,67,43,-3,-84,-72,-72,44,38,-81,-86,-88,-89,-79,-60,10,47,80,76,55,27,-20,-49,-57,20,25,40],"ownershipAllowedMAE":0.0327339})%"); + lines.push_back(R"%({"sample":{"board":"...........OO.O..O./...XO.....XOXO.OOX./.XXOOO.O.OOXXXOOXX./.OOXOOX...XO.XOXO../.OXXXOOX..XO.XOX.../..OOXXXOO.X..XX..../..OXXXO.OOX.X...X../..OX.O.OOXOX......./...X.XOO.XOOX...O../.O..XXXO.OOX......./.OOOOOOX.OXX...XXX./XOXXO..OXXOX....OO./.XX.X..X..OX......./..OXX...OXOX......./..O....O.XOX....XX./..XX.X....X.XXX.X.X/..XOOOO..O.XOOOOOX./..XOX......XO...OO./...X.XO............/","hintLoc":"null","initialTurnNumber":182,"metadata":"E0E05FA642C3B1AD17773715DD2ADA56:192","moveLocs":["T2","P2","G2","F2","H1","H2","J2","G1","C11","J9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.23,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.43e-06,0.0178,0.186,0.000536,0.201,3.46e-06,2.9e-06,2.73e-06,2.89e-06,2.99e-06,0.000985,0,0,0,0,4.48e-06,0.00123,0,5.3e-06,0.000133,0.201,0.000104,0,0,1.08e-05,5.18e-06,3.88e-06,1.4e-05,2.87e-05,0,0,0,0,0,0,0,0,5.51e-06,0.0109,0,0,0,0,0,0.000849,0,0.000116,0,0,0,0,0,0,0,0,0,3.77e-06,0.0159,0,0,0,0,0,0,2.21e-05,0.00018,0.000171,0,0,2.49e-06,0,0,0,0,0.000421,1.02e-05,3.7e-05,0,0,0,0,0,0,0,2.44e-05,3.97e-06,0,0,2.56e-06,0,0,0,0.00305,0.000104,4e-06,0.000373,0.0678,0,0,0,0,0,0,0,3.23e-06,0,2.77e-06,2.6e-06,0,0,4.1e-06,4.86e-06,4.21e-06,3e-06,0.000994,1.25e-05,0,0,0,0,0,0,0,0,0,2.99e-06,0,2.57e-06,2.61e-06,2.7e-06,0,3.02e-06,2.72e-06,1.57e-05,0.0684,0,0,6.64e-06,0,0,0,0,0,0,0,2.84e-06,2.63e-06,2.49e-06,2.55e-06,2.65e-06,2.82e-06,2.41e-06,3.81e-06,0.0718,0,0,2.28e-06,0,0,0,2.54e-06,0,0,0,0,2.64e-06,2.54e-06,2.51e-06,0,2.61e-06,2.33e-06,3.31e-06,0,2.47e-06,2.37e-06,0,0,0,0,0.000199,0,0,0,2.67e-06,2.62e-06,2.51e-06,2.57e-06,2.6e-06,2.68e-06,2.53e-06,4.14e-06,0,0,0,0,0,0,0,0,0,0,0,2.61e-06,2.61e-06,2.62e-06,0,0,0,2.64e-06,0,0,0,0,0,3.19e-06,0.0112,0,0,0,0,0,2.56e-06,2.55e-06,2.54e-06,2.6e-06,0,0,2.42e-06,3.03e-06,0,0,2.81e-06,0,6.03e-06,8.95e-05,0,1.64e-05,8.43e-06,0,0,2.57e-06,2.56e-06,2.59e-06,2.61e-06,2.49e-06,2.58e-06,2.34e-06,2.69e-06,2.89e-06,0,0,0,4.15e-06,3.48e-05,1.01e-05,0,0,0,0,2.6e-06,2.63e-06,2.64e-06,2.6e-06,2.56e-06,2.54e-06,2.4e-06,2.52e-06,2.85e-06,0,3.17e-06,3.35e-06,4.2e-06,5.1e-06,0,6.35e-06,0,0,0,2.62e-06,2.64e-06,2.7e-06,3.04e-06,0,0,2.41e-06,2.49e-06,2.91e-06,0,0,4.66e-06,0,6.82e-06,6.92e-06,5.25e-06,3.81e-06,0,2.81e-06,0,0,0,3.29e-06,0,2.78e-06,0,2.45e-06,2.95e-06,0,0,0,0,0,9.75e-05,8.74e-06,0,3.69e-06,0,0,0,0,0,0,0,2.76e-06,2.68e-06,3.1e-06,0,0,0,0,0.138,0,0,8.6e-06,3.84e-06,0,0,2.93e-06,0,2.68e-06,0,0,0,2.55e-06,2.82e-06,6.33e-06,0,3.86e-06,0,0,0,6.75e-06,4.02e-06,3.76e-06,3.35e-06,0.000346,7.75e-05,3.41e-06,6.19e-06,2.95e-06,3.15e-06,2.7e-06,9.05e-06],"winrateAvg":0.0541277,"leadAvg":-7.22417,"scoreMeanAvg":-6.49091,"scoreStdevAvg":10.7622,"shorttermWinlossErrorAvg":0.181668,"shorttermScoreErrorAvg":4.70902,"ownership":[-43,-38,-39,-10,10,63,73,80,82,85,85,92,95,93,96,91,73,76,45,-42,-43,-27,-29,99,83,86,86,83,88,83,92,-100,96,92,97,96,14,38,-26,-41,-39,99,99,99,87,97,82,95,95,-100,-100,-100,97,97,12,13,24,11,85,85,62,99,99,71,78,59,-24,-98,-92,-96,-100,96,-90,15,14,5,49,87,62,66,69,99,99,26,23,-47,-98,-91,-96,-100,96,-93,-6,-21,-33,70,84,87,88,71,73,72,100,100,-1,-97,-94,-95,-100,-100,-92,-83,-45,-62,78,84,89,73,74,75,99,97,100,100,-97,-93,-99,-94,-94,-93,-98,-89,-75,82,83,89,76,85,98,96,100,100,91,97,-95,-91,-93,-93,-93,-93,-91,-87,86,84,78,77,86,84,100,100,96,91,96,97,-99,-93,-94,-95,-87,-93,-91,90,99,91,91,84,83,82,100,93,96,97,-100,-96,-95,-95,-94,-95,-93,-94,76,100,100,99,100,100,99,92,97,96,-100,-100,-95,-95,-95,-100,-100,-100,-96,-85,99,-97,-97,100,51,18,94,-93,-94,-90,-100,-95,-95,-96,-97,-93,-93,-97,-86,-97,-97,-96,-98,-8,27,-8,27,-93,-91,-100,-95,-95,-96,-96,-97,-97,-96,-90,-93,-90,-98,-98,-36,-5,43,68,-98,-91,-100,-95,-95,-95,-96,-96,-96,-96,-92,-94,-90,-94,-47,-15,19,81,-14,-98,-91,-100,-96,-94,-93,-94,-100,-100,-97,-93,-94,-99,-99,27,-53,17,37,-5,-28,-99,-97,-100,-100,-100,50,-100,-96,-99,-92,-94,-99,78,78,80,82,69,28,51,-24,-99,96,95,95,95,96,-99,-96,-89,-83,-98,77,-17,79,8,75,-38,-5,-34,-99,96,92,95,94,96,96,-96,-83,-77,-68,-68,-20,-28,10,-22,-7,-16,-45,-18,23,92,92,94,93,51,23],"ownershipAllowedMAE":0.0692816,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".................../.............O...../...............OOO./...X....O...X.XXXO./...........X....XXX/.............O.XOOX/.........XOXXOX.OOO/..........XOXOO.O../............O..OXOO/..............XXXO./................OX./................X../.................../................X../.................../...X.....XX..O.O.../.....O..OO.X......./.................../.................../","hintLoc":"null","initialTurnNumber":59,"metadata":"74CD8662DEE41504605B1B1F92AE66AF:69","moveLocs":["L14","M14","M11","K15","K10","K12","O10","O8","O17","O16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.27,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui0button1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.3e-06,7.17e-06,7.44e-06,7.72e-06,7.9e-06,7.57e-06,7.35e-06,7.14e-06,7.22e-06,7.22e-06,7.34e-06,7.34e-06,6.82e-06,6.36e-06,6.37e-06,6.96e-06,6.35e-06,6.36e-06,6.71e-06,7.09e-06,1.17e-05,1.59e-05,1.98e-05,2.17e-05,1.84e-05,1.37e-05,1.22e-05,1.24e-05,1.27e-05,1.6e-05,1.23e-05,7.76e-06,0,6.86e-06,6.71e-06,6.29e-06,6.45e-06,6.79e-06,7.41e-06,1.49e-05,5.4e-05,0.000154,7.03e-05,0.000149,3.47e-05,1.56e-05,1.28e-05,3.47e-05,0.0331,0.00331,8.96e-06,0,7.31e-06,0,0,0,6.42e-06,7.51e-06,1.73e-05,7.27e-05,0,0.000147,9.95e-05,4.74e-05,1.24e-05,0,5.38e-05,0.0252,0.00108,0,0,0,0,0,0,6.6e-06,7.66e-06,1.87e-05,5.76e-05,0.00011,5.06e-05,2.46e-05,1.95e-05,1.49e-05,1.68e-05,0,6.87e-06,0,1.01e-05,6.54e-06,1.78e-05,2.52e-05,0,0,0,7.36e-06,1.86e-05,0.000178,9.31e-05,3.74e-05,2.62e-05,4.94e-05,3.44e-05,0.0724,7.53e-06,0,0,6.07e-06,0,0.393,0,0,0,0,7.38e-06,1.55e-05,7.35e-05,6.94e-05,2.97e-05,2.82e-05,3.78e-05,4.22e-05,1.27e-05,0,0,0,0,0,0,1.27e-05,0,0,0,7.44e-06,1.47e-05,4.47e-05,4.3e-05,2.45e-05,2.71e-05,4.71e-05,5.97e-05,1.2e-05,0,0,0,0,0,0,2.89e-05,0,6.16e-06,6.19e-06,7.48e-06,1.46e-05,4.95e-05,5.11e-05,2.6e-05,3.06e-05,5.36e-05,4.19e-05,2.98e-05,1.01e-05,1.08e-05,0,0,1.06e-05,0.00147,0,0,0,0,7.5e-06,1.48e-05,5.76e-05,5.98e-05,2.91e-05,3.72e-05,6.26e-05,0.000108,1.42e-05,0,1.12e-05,9.27e-06,6.23e-06,0,0,0,0,0,6.29e-06,7.54e-06,1.5e-05,6.19e-05,6.22e-05,3.14e-05,3.82e-05,5.78e-05,5.45e-05,3.52e-05,1.42e-05,2.87e-05,0.000134,3.53e-05,0.00651,0.000404,2.48e-05,0,0,0.000388,7.51e-06,1.54e-05,7.5e-05,7e-05,3.79e-05,3.93e-05,4.97e-05,4.75e-05,7.73e-05,0.00013,0.00231,0.0494,0.00221,0,0.00769,2.03e-05,0,0.0015,8.69e-06,7.52e-06,1.64e-05,0.000124,0.000123,6.53e-05,5.61e-05,7.09e-05,7.43e-05,0.000104,0.000163,0.00199,0.00324,0.0201,0.00046,0.00418,0.0192,1.02e-05,0.00265,8.32e-06,7.49e-06,2.38e-05,0.00345,0.000192,4.63e-05,6.41e-05,8.6e-05,9.43e-05,8.09e-05,0.000186,0.00031,9.35e-05,0.000228,0.000169,0.000533,0.00067,0,2.32e-05,7.86e-06,7.68e-06,2.05e-05,3.03e-05,0.000111,0.0005,0.000127,0.000101,0.00698,1.81e-05,8.98e-06,1.04e-05,0.000456,8.93e-05,1.29e-05,1.51e-05,1.28e-05,0.291,0.0297,8.03e-06,7.45e-06,1.76e-05,2.39e-05,0,4.83e-05,1.43e-05,2.36e-05,1.73e-05,0.000103,0,0,1.09e-05,1.75e-05,0,9.35e-06,0,3.8e-05,0.000616,8.84e-06,7.37e-06,1.34e-05,2.19e-05,3.07e-05,1.55e-05,0,1.26e-05,1.06e-05,0,0,1.46e-05,0,0.000279,1.86e-05,2.02e-05,1.57e-05,5.61e-05,2.36e-05,8.05e-06,7.04e-06,1.09e-05,1.51e-05,7.59e-05,6.99e-05,1.26e-05,1.16e-05,8.58e-06,7.51e-06,8.36e-06,1.28e-05,1.59e-05,0.00483,0.000476,2.35e-05,1.61e-05,1.37e-05,1.07e-05,7.41e-06,6.13e-06,6.99e-06,7.49e-06,8.1e-06,7.79e-06,7.54e-06,6.88e-06,6.96e-06,7.31e-06,7.91e-06,7.88e-06,8.1e-06,8.14e-06,8.86e-06,8.91e-06,8.47e-06,7.83e-06,7.47e-06,6.19e-06,5.87e-06],"winrateAvg":0.368944,"leadAvg":-1.3144,"scoreMeanAvg":-1.9878,"scoreStdevAvg":13.8988,"shorttermWinlossErrorAvg":0.142804,"shorttermScoreErrorAvg":1.28438,"ownership":[-24,-24,-22,-20,-13,-6,2,7,9,9,13,22,38,49,74,85,86,84,83,-24,-24,-25,-22,-17,-5,2,8,10,11,10,22,42,90,88,89,89,86,83,-23,-26,-31,-35,-31,-7,1,7,10,1,-5,-6,-41,88,-52,91,92,93,75,-20,-24,-37,-81,-25,-10,-2,2,39,-40,-20,-34,-94,-94,-93,-93,-92,92,-55,-15,-19,-28,-27,-15,-9,-7,-12,-39,-95,-89,-96,-62,7,-15,-54,-92,-92,-92,-10,-9,-6,-17,-9,-6,-6,-13,-4,-85,-80,-95,0,92,63,-48,88,90,-92,-6,-6,-8,-7,-6,-5,-6,-14,-31,-92,-81,-94,-94,92,9,26,88,89,89,-3,-5,-7,-6,-5,-5,-6,-11,-26,-91,-91,87,-93,92,93,63,88,89,87,-2,-3,-5,-5,-4,-4,-4,-4,-5,-10,14,87,87,73,-29,54,-78,87,88,0,-2,-3,-4,-4,-3,-2,4,5,67,20,32,34,81,-79,-79,-80,86,51,0,-1,-1,-2,-3,-2,-2,0,1,10,7,5,5,-5,-33,-74,-54,-60,18,0,-1,-2,-1,-2,-2,-3,-3,-3,-3,-2,-6,-19,-77,-38,-54,-84,-37,-27,-2,-2,-4,-3,-2,-1,-2,-3,-5,-7,-4,-9,-2,-21,-23,-34,-49,-50,-38,-7,-5,0,-16,-5,0,0,-2,-6,-11,-9,-7,-6,-4,-13,-26,-77,-44,-34,-13,-17,-22,-21,2,9,5,8,-14,-26,-22,-1,1,14,-6,8,43,0,-16,-19,-22,-34,-70,-3,19,19,11,-25,-76,-76,-26,10,67,35,72,33,-1,3,-22,-24,-26,-28,-26,76,37,34,69,69,-20,-74,-5,16,15,42,29,16,11,-22,-20,-17,-8,9,49,52,53,54,36,2,-31,-11,-9,8,26,28,20,17,-20,-17,-12,-2,18,35,45,46,39,23,-2,-19,-19,-5,8,20,25,24,21],"ownershipAllowedMAE":0.0352065})%"); + lines.push_back(R"%({"sample":{"board":".................O./.................../.OOX.X.O..O...O..../.OXX............X../..OX...X.......O.../..O..............O./................XO./.................../....XO............./.....X............./.................../............X.X..../.........O...XO..../.....O.....XXO.XX../.......OO.O..O..OO./..XX...XXX..XO.O.../..OX........XOOXX../............XOXX.../.................../","hintLoc":"null","initialTurnNumber":59,"metadata":"59960C02B246FB875967C01BACC95D9D:69","moveLocs":["R8","Q8","R9","R7","S7","S6","T6","R11","S9","P13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.26,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1button1","komi":17.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.62e-06,3.69e-06,3.84e-06,3.85e-06,3.63e-06,3.65e-06,3.43e-06,3.52e-06,3.35e-06,3.16e-06,3.45e-06,3.33e-06,3.34e-06,3.29e-06,3.63e-06,3.46e-06,3.15e-06,0,2.52e-06,2.9e-06,3.38e-06,5.46e-06,7.91e-06,7.79e-06,5.52e-06,8.16e-06,6.36e-06,6.38e-06,6.18e-06,5.51e-06,7.3e-06,7.04e-06,6.87e-06,5.65e-06,6.26e-06,5.1e-06,4.1e-06,3.21e-06,2.67e-06,0,0,0,4.36e-06,0,7.96e-06,0,6.04e-06,6.67e-06,0,7.53e-06,1.08e-05,8.03e-06,0,7.55e-06,7.65e-06,6.13e-06,3.55e-06,2.64e-06,0,0,0,4.14e-06,7.54e-06,1.44e-05,1.05e-05,1.09e-05,1.2e-05,8.89e-06,2.06e-05,2.95e-05,2.31e-05,2.17e-05,0.135,0,7.17e-06,3.7e-06,3.25e-06,3.28e-06,0,0,4.71e-06,8.88e-06,1.99e-05,0,3.11e-05,6.49e-05,6.86e-05,5.4e-05,3.15e-05,0.000188,0.00115,0,0.0223,6.57e-06,3.87e-06,3.48e-06,4.05e-06,0,0.00012,8.01e-06,1.19e-05,1.33e-05,2.98e-05,4.63e-05,4.82e-05,7.55e-05,8.1e-05,6.63e-05,0.00205,0.0167,0.0664,0.0299,0,3.22e-06,3.52e-06,6.26e-06,7e-06,1.15e-05,2.64e-05,1.35e-05,1.23e-05,1.49e-05,2.09e-05,3.65e-05,5.46e-05,6.27e-05,7.05e-05,4.87e-05,0,3.41e-05,0,0,3.56e-06,3.48e-06,9.06e-06,1.61e-05,1.55e-05,0.000138,5.57e-05,1.38e-05,1.21e-05,2.09e-05,3.66e-05,4.76e-05,5.45e-05,6.05e-05,6.27e-05,4.06e-05,0.063,0.00887,0.000619,1.67e-05,3.53e-06,1.01e-05,4.73e-05,1.74e-05,0,0,4.1e-05,1.53e-05,4.05e-05,5.32e-05,5.37e-05,4.99e-05,4.02e-05,6.18e-05,0.000171,0.00389,0,0.0878,1.17e-05,3.52e-06,9.66e-06,1.9e-05,1.97e-05,7.51e-05,0,0.000137,4.21e-05,7.97e-05,9.02e-05,9.16e-05,5.47e-05,1.1e-05,1.36e-05,0.000851,0.137,2.2e-05,6.05e-06,2.36e-05,3.53e-06,9.02e-06,2.46e-05,2.59e-05,5.03e-05,4.58e-05,8.54e-05,0.000119,0.000122,9.4e-05,6.36e-05,3.33e-05,9.87e-06,0.174,1.28e-05,0.000125,0,0,3.93e-06,3.51e-06,8.76e-06,3.17e-05,2.56e-05,6.39e-05,0.000151,0.000411,0.00011,1.7e-05,7.57e-06,1.11e-05,1e-05,0,4.52e-06,0,0,0,2.84e-06,3.81e-06,3.53e-06,9e-06,6.26e-05,9.65e-05,5.47e-05,7.52e-06,9.35e-06,4.1e-05,8e-06,0,6.19e-06,0.000468,6.14e-06,0,0,2.68e-06,0,0,3.54e-06,3.64e-06,1.07e-05,9.41e-05,9.67e-05,8.3e-06,0,6.07e-06,4.98e-06,4.93e-06,5.68e-06,2.13e-05,0,0,0,0.0968,0,0,0,0,3.85e-06,1.17e-05,9.83e-06,1.03e-05,8.33e-06,9.25e-06,1.58e-05,0,0,0.000313,0,4.88e-06,0.000817,0,3.54e-06,0.00016,0,0,4.27e-06,3.85e-06,4.89e-05,0,0,9.25e-06,1.95e-05,0.068,0,0,0,0.00346,9.56e-06,0,0,2.82e-06,0,1.33e-05,4.03e-06,5.65e-06,4.32e-06,8.55e-06,0,0,7.51e-06,1.04e-05,6.42e-06,5.13e-06,3.82e-06,5.67e-06,1.05e-05,6.01e-06,0,0,0,0,0,2.33e-05,6.88e-06,3.47e-06,3.39e-05,7.01e-06,2.22e-05,7.04e-06,6.17e-06,5.88e-06,5.54e-06,5.85e-06,6.15e-06,7.45e-06,7.84e-06,0,0,0,0,3.67e-06,0.00081,6.34e-06,2.6e-06,3.49e-06,4.01e-06,3.56e-06,3.45e-06,3.2e-06,3.17e-06,3.18e-06,3.21e-06,3.32e-06,3.8e-06,5.48e-06,0.0514,0.0209,0.000213,3.9e-06,4.06e-06,3.85e-06,2.74e-06,4.63e-06],"winrateAvg":0.675236,"leadAvg":1.45211,"scoreMeanAvg":2.57452,"scoreStdevAvg":14.4581,"shorttermWinlossErrorAvg":0.114812,"shorttermScoreErrorAvg":1.05795,"ownership":[67,49,31,-18,-41,-39,-18,5,23,33,38,35,31,35,45,51,56,65,57,74,76,11,-20,-58,-45,-14,13,23,36,44,38,29,36,51,54,51,55,56,79,85,86,-81,-61,-78,-16,51,18,22,71,21,12,13,84,57,50,53,54,78,86,-81,-81,-43,-30,-16,-11,-2,4,8,-3,-5,8,32,62,33,50,54,68,80,83,-80,-30,-29,-25,-71,-10,-3,0,-8,-8,0,19,81,51,56,56,46,42,83,28,-14,-14,-19,-18,-10,-6,-8,-10,-9,-3,-1,4,36,77,56,19,2,24,6,-4,-15,-15,-14,-10,-8,-9,-12,-14,-20,-66,-17,-46,77,46,-4,-7,-13,-8,-19,-22,-17,-14,-11,-9,-10,-12,-14,-16,-21,-10,-15,-4,36,-14,-16,-17,-26,-74,6,-29,-15,-10,-8,-9,-11,-13,-18,-14,-11,-50,24,34,-17,-18,-20,-22,-37,-76,-23,-14,-8,-7,-8,-13,-18,-13,-10,20,23,27,58,-16,-18,-17,-16,-18,-20,-11,-11,-6,-6,-10,-18,-30,16,-26,16,92,92,78,-16,-17,-15,-12,-7,-10,10,1,-9,0,-16,-33,-94,-81,-90,-88,92,89,83,-17,-18,-11,-3,-7,12,10,1,5,47,-3,-25,-82,-91,39,-71,-71,92,90,-25,-23,-9,-1,15,62,31,19,0,-18,-17,-92,-92,87,41,-69,-68,-70,91,-40,-43,-37,-24,-6,13,10,51,47,-60,19,-43,10,88,50,19,93,93,88,-52,-64,-95,-94,-19,-4,18,-91,-91,-92,-20,-37,-86,87,85,91,57,20,20,-61,-71,-65,-95,-43,-26,-47,-52,-62,-59,-52,-47,-86,87,89,-63,-64,-29,-14,-65,-64,-73,-70,-56,-42,-46,-53,-54,-53,-46,-36,-85,87,-65,-65,-57,-50,-36,-66,-67,-65,-60,-52,-44,-42,-44,-45,-42,-30,-21,18,27,-15,-52,-54,-51,-45],"ownershipAllowedMAE":0.0300247})%"); + lines.push_back(R"%({"sample":{"board":".................../.O.....OOOX...XOO../.XOOOXXXOXXO.X.XO../..XO.O.XOX.....XO../..X...OOXX.O....XO./..XOO..X..XO....XO./.OOXO.....OXX...XO./XXXXX...O.OX....XO./XOXX.X....OX...XOXO/O.OOX....OXOOOX..X./.OOOXX...OX.XX.XXX./OXOXO.O..OX.X.XO.O./.XXXO.XOO.OOXO.O.../XX.XO..OX.XOXO...O./OOXO...OOX.OOX.XXXX/.OOO..XXOX.OX.XX..X/.O.O.X.OXXOO.X.X.X./.OO.O.XO.OOXXXOOXOX/.........OXX....O../","hintLoc":"null","initialTurnNumber":181,"metadata":"A771B055F6C93D3B9D3F8DE79FB57BBF:191","moveLocs":["N14","O13","C6","J13","A7","B16","H12","A18","M18","L19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.61,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.2e-06,0.0131,0.0129,0.000155,5.24e-06,1.2e-05,0.000104,3.29e-06,1.79e-06,2.94e-06,0,0.344,0.188,0.00106,0.00171,2.34e-05,2.9e-06,2.15e-06,1.89e-06,0,0,0.0461,0.000527,7.03e-06,0.165,0.00376,0,0,0,0,0,0.00925,6.48e-05,0,0,0,2.53e-06,2.18e-06,0.000373,0,0,0,0,0,0,0,0,0,0,0,0.000721,0,0.000343,0,0,2.63e-06,2.12e-06,2.33e-06,0,0,0,3.39e-06,0,0.0334,0,0,0,4.57e-06,0.000353,1.46e-05,8.02e-06,0.000478,0,0,2.44e-06,2.43e-06,2.4e-06,2.8e-06,0,1.83e-05,4.86e-06,3.85e-06,0,0,0,0,0.00019,0,2.67e-06,3.48e-06,6.86e-05,5.37e-05,0,0,2.18e-06,2.3e-06,4.02e-06,0,0,0,1.4e-05,0.0261,0,4.86e-06,0.013,0,0,0,3.31e-05,3.34e-06,3.27e-06,0,0,2.11e-06,4.55e-06,0,0,0,0,5.23e-05,0.00047,0.000167,0,0.132,0,0,0,0,5.36e-06,2.74e-06,0,0,2.36e-06,0,0,0,0,0,0.000694,0.00168,0,0,4.37e-06,0,0,2.37e-06,3.08e-06,2.68e-06,2.84e-06,0,0,3.88e-06,0,0,0,0,0,0,0.000714,9.25e-06,4.42e-06,3.4e-06,0,0,2.79e-06,2.61e-06,2.67e-06,0,0,0,0,0,4.15e-06,0,0,0,3.6e-06,0.000158,3.19e-05,4.26e-06,0,0,0,0,0,0,2.77e-06,2.12e-06,0,9.18e-05,2.54e-06,0,0,0,0,0,0.00169,9.13e-06,3.44e-06,0,0,7.08e-05,0,0,0,0,0,0,1.64e-05,0,2.26e-06,0,2.17e-06,0,0.000148,0,5.3e-06,2.78e-06,0,0,0.00063,0,0.000215,0,0,2.26e-06,0,2.34e-06,0,2.23e-06,2.31e-06,2.22e-06,0,4.8e-06,0,0,0,2.14e-06,0,0,0,0,2.34e-06,0,2.2e-06,2.34e-06,2e-06,2.13e-06,2.24e-06,0,2.23e-06,0,2.84e-06,3.34e-06,0,0,2.3e-06,0,0,0,0,2.16e-06,2.35e-06,2.27e-06,0,2.14e-06,0,0,2.16e-06,0,2.2e-06,2.45e-06,2.39e-06,0,0,0,2.35e-06,0,0,0,0.000123,0,0,0,0,2.04e-06,0,0,0,2.15e-06,2.23e-06,0,0,0,0,2.25e-06,0,0,0,0,0,2.18e-06,2.38e-06,0,2.09e-06,0,2.16e-06,0,2.28e-06,0,2.21e-06,0,0,0,0,0,0.000303,0,2.65e-06,0,2.26e-06,0,0,2.14e-06,0,0,2.29e-06,0,2.28e-06,0,0,2.42e-06,0,0,0,0,0,0,0,0,0,0,2.09e-06,2.14e-06,2.07e-06,2.07e-06,2.09e-06,2.09e-06,2.21e-06,2.23e-06,2.28e-06,0,0,0,2.12e-06,2.08e-06,2.14e-06,1.81e-06,0,2.01e-06,2.07e-06,5.32e-06],"winrateAvg":0.988635,"leadAvg":5.14047,"scoreMeanAvg":5.64067,"scoreStdevAvg":9.53823,"shorttermWinlossErrorAvg":0.0634342,"shorttermScoreErrorAvg":3.64625,"ownership":[-8,19,55,78,89,89,82,51,17,-21,-87,-66,-73,-77,-15,23,94,97,97,-87,38,39,87,92,95,93,96,96,96,-89,-69,-84,-88,-96,99,99,98,98,-84,-99,98,99,99,92,93,92,96,-89,-90,-72,-87,-98,-94,-97,99,98,98,-94,-99,-99,99,92,99,97,92,96,-89,-80,-79,-78,-90,-91,-98,99,98,98,-96,-97,-99,-44,71,76,99,99,-87,-89,-80,-71,-83,-89,-91,-95,-100,99,98,-97,-97,-99,97,97,69,-10,-60,-53,-2,-83,-70,-71,-90,-93,-94,-100,99,96,-97,-95,-95,-99,97,20,30,43,-61,36,99,-99,-100,-100,-94,-95,-100,99,94,-99,-99,-99,-99,-99,-36,19,99,99,76,98,-99,-95,-94,-95,-95,-100,99,79,-99,42,-99,-99,-95,-98,-23,8,65,90,98,-99,-94,-96,-95,-100,-95,-100,80,78,41,100,100,-97,-55,-29,12,48,100,-97,-90,-90,-90,-100,-96,-97,-100,-70,74,100,100,100,-96,-96,16,30,57,100,-97,-96,-99,-100,-98,-100,-100,-100,-97,100,97,100,97,100,-44,90,71,79,100,-97,39,-99,-95,-100,-91,-96,-92,-96,100,96,96,96,100,64,49,100,100,97,100,100,-99,-91,-96,-92,-95,-95,-94,97,96,100,96,100,72,74,100,95,97,94,100,-100,-92,-95,-96,-96,-92,-96,100,100,96,100,96,95,96,100,100,94,97,100,100,-99,-95,-100,-100,-100,-100,97,100,100,100,95,96,93,93,100,94,97,100,-97,-96,-100,-100,-96,-96,-100,96,100,96,100,97,92,97,99,94,94,100,100,57,-100,-96,-100,-95,-100,-96,96,100,100,97,100,97,93,99,96,100,100,-100,-100,-100,-92,-92,-98,-94,-100,97,96,96,96,96,96,97,96,97,100,-99,-100,-96,-95,-96,-96,-93,-97,-96],"ownershipAllowedMAE":0.0273503})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..O.XOX......O...../..OX.XO........X.../.....X........O.OO./..OO............OX./.XXO.........XOOX../...OXX.....O..XXX../..XXOX...OOXX....../..XOOX...OX....O.O./..X..XO..OX......../.....OXO.OX......../....O............../...XXO.OXXX....OO../..XXOO....O....OX../..XOOXXXXXO.XX.OX../..OXXOO.OO..OX.XX../..X..XO.....OOX..../.................../","hintLoc":"null","initialTurnNumber":102,"metadata":"C18E36E7C2C34B9CA8579DDF3345F418:112","moveLocs":["G7","H7","H9","M14","G10","G6","O15","P16","N12","L13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.94,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":42.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.7e-06,0.000175,2.13e-05,3.85e-05,1.11e-05,7.3e-06,5.74e-06,6.02e-06,6.11e-06,6.17e-06,6.19e-06,6.13e-06,6.35e-06,6.56e-06,6.41e-06,6.04e-06,5.92e-06,5.98e-06,4.82e-06,7.91e-05,0.1,0.0159,0.0329,2.63e-05,0.00343,9.99e-06,1.22e-05,1.1e-05,1.19e-05,1.09e-05,9.85e-06,9.06e-06,1.07e-05,1.41e-05,1.69e-05,7.9e-06,8.61e-06,6.46e-06,1.06e-05,1.59e-05,0,6.02e-06,0,0,0,0.000105,2.25e-05,3.8e-05,1.88e-05,1.95e-05,7.17e-05,0,1.1e-05,0.00204,1.92e-05,1.26e-05,6.94e-06,0.126,8.7e-06,0,0,5.53e-06,0,0,0.000221,5.65e-05,3.96e-05,2.95e-05,5.2e-05,0.514,0.00441,0,0,1.08e-05,1.14e-05,6.96e-06,0.000892,0.00316,1.59e-05,0.000125,6.22e-06,0,0.00231,2.42e-05,4e-05,2.44e-05,1.17e-05,0.00904,0.000342,0,0,4.02e-05,0,0,7.57e-06,9.27e-05,0.00613,0,0,8.36e-06,9.03e-06,2.04e-05,6.1e-05,3.81e-05,6.26e-05,6.32e-06,0,0.00201,1.48e-05,0.00153,1.34e-05,0,0,6.53e-06,6.6e-06,0,0,0,7.6e-06,6.65e-06,8.95e-06,1.15e-05,1.66e-05,8.53e-06,0,4.18e-05,8.09e-06,0,0,0,0,8.2e-06,7.64e-06,5.63e-06,6.31e-06,5.77e-06,0,0,0,6.23e-06,8.56e-06,2.85e-05,2.93e-05,6.85e-06,0,0,5.4e-06,0,0,0,8.54e-06,8.48e-06,6.3e-06,5.96e-06,0,0,0,0,5.02e-06,6.95e-06,6.54e-06,0,0,0,0,5.83e-06,6.03e-06,6.66e-06,8.22e-06,3.61e-05,7.58e-06,5.82e-06,6.26e-06,0,0,0,0,0,5.34e-06,5.39e-06,0,0,6.41e-06,7.52e-06,9.09e-06,1.01e-05,0,7.67e-06,0,7.76e-06,5.42e-06,5.52e-06,0,6.56e-06,6.07e-06,0,9.6e-06,0,1.16e-05,0,0,6.32e-06,1.21e-05,1.56e-05,0.00023,1.09e-05,0.0717,1.05e-05,5.99e-06,5.25e-06,5.4e-06,5.53e-06,7.75e-06,1.22e-05,0,0,0,5.87e-05,0,0,7.33e-06,1.28e-05,7.77e-05,9.37e-05,0.0103,0.0284,0.0444,7.27e-06,5.29e-06,5.4e-06,5.45e-06,6.25e-06,0,5.62e-06,0,0,4.29e-05,0.000629,6.4e-06,9.92e-06,1.75e-05,4.18e-05,0.00146,9.43e-06,8.31e-05,4.24e-05,7.17e-06,5.31e-06,5.56e-06,5.17e-06,0,0,0,0,0,0,0,0,1.51e-05,1.77e-05,3.55e-05,7.64e-06,0,0,4.4e-05,7.83e-06,5.42e-06,5.27e-06,0,0,0,0,5.22e-06,5.58e-06,5.42e-06,7.25e-06,0,1.97e-05,7.92e-06,7.93e-06,5.57e-06,0,0,1.38e-05,9.45e-06,5.48e-06,5.89e-06,0,0,0,0,0,0,0,0,0,5.32e-05,0,0,5.67e-06,0,0,7.37e-06,7.13e-06,5.38e-06,5.89e-06,0,0,0,0,0,0.000621,0,0,0.00219,0.0108,0,0,5.3e-06,0,0,5.5e-06,5.61e-06,5.37e-06,5.83e-06,0,2.97e-05,0.00146,0,0,1.64e-05,3.47e-05,3.42e-05,0.000101,1.31e-05,0,0,0,5.31e-06,5.24e-06,5.14e-06,5.41e-06,5.02e-06,5.31e-06,5.24e-06,6.26e-06,2.08e-05,1.73e-05,8.41e-05,1.7e-05,1.45e-05,8.27e-06,7.35e-06,7.3e-06,7.55e-06,9.91e-06,5.91e-06,5.35e-06,5.55e-06,5.46e-06,5.16e-06,7.09e-06],"winrateAvg":0.478876,"leadAvg":0.267935,"scoreMeanAvg":-0.383721,"scoreStdevAvg":18.0114,"shorttermWinlossErrorAvg":0.172547,"shorttermScoreErrorAvg":1.90618,"ownership":[20,19,6,-19,-48,-56,-46,-25,-9,0,2,2,10,25,34,38,43,46,47,19,17,17,-21,-62,-63,-48,-20,-4,5,6,-4,8,37,42,38,44,46,50,16,25,38,-23,-89,-60,-72,-6,4,13,17,-7,-30,71,50,32,45,53,51,1,24,36,-84,-77,-92,3,-13,12,23,32,-1,-57,2,77,26,54,57,55,-11,18,17,-35,-42,-92,-50,-9,18,31,38,28,-16,-76,77,52,78,79,35,-31,-7,29,28,-26,-38,-28,15,24,29,56,77,-32,-50,-4,55,78,-20,17,-46,-86,-84,27,-38,-36,2,1,17,44,85,25,-32,-88,58,59,-89,-19,-30,-74,-82,-2,29,-93,-94,-29,-7,-5,37,65,64,-92,-82,-90,-90,-90,-53,-40,-84,-88,-98,-97,-32,-93,-49,7,18,87,87,-92,-92,-29,-29,-25,-19,-27,-10,-88,-93,-98,-32,-29,-94,-93,-32,16,88,-86,-68,-40,-9,-1,55,26,54,21,-85,-88,-98,-73,-33,-94,-81,-87,19,89,-86,-41,-5,-5,4,25,19,38,39,-78,-80,-56,-4,9,67,-80,80,60,90,-86,-31,-16,-6,9,16,39,29,36,-74,-74,-63,15,68,65,-43,80,2,-16,-58,-18,-12,-4,-11,23,38,40,27,-75,-76,-73,-95,-95,80,80,81,-89,-88,-88,-33,-15,-4,13,67,68,9,8,-82,-85,-95,-95,81,82,26,-7,-62,-21,65,-10,-27,-15,18,66,-94,-32,-30,-88,-91,-95,82,82,-85,-86,-87,-87,-87,68,5,-91,-91,18,64,-93,-77,-56,-89,-87,-84,-89,-89,77,78,-32,83,84,63,31,76,-91,-81,-94,-93,-87,-75,-89,-90,-91,-86,-48,-45,78,74,76,77,70,70,76,76,-91,-87,-89,-83,-81,-86,-84,-78,-61,-42,-11,4,53,69,74,71,67,53,-7,-32,-84,-85,-84,-82],"ownershipAllowedMAE":0.0467581})%"); + lines.push_back(R"%({"sample":{"board":".....X.../....OX.X./.....OX../..XXOOOX./..OX.OXOX/.OX.XO.O./....XO.../........./........./","hintLoc":"null","initialTurnNumber":11,"metadata":"EA8D31131946C18728CB90A98B0DA431:21","moveLocs":["D7","E2","B5","C3","H9","G9","J4","B7","J6","H7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.92,"xSize":9,"ySize":9},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":6.5,"policyOptimism":0.0,"pda":0.528,"policyMixture":[4.99e-05,5.68e-05,5.26e-05,5.33e-05,7.34e-05,0,0,0,3.32e-05,7.08e-05,0.0145,0.0108,4.81e-05,0,0,0,0,0.681,7.67e-05,0,0.0303,0,4.73e-05,0,0,0,5.25e-05,5.44e-05,0.00114,0,0,0,0,0,0,0,4.98e-05,0,0,0,5.12e-05,0,0,0,4.64e-05,4.31e-05,0,0,0.000125,0,0,4.44e-05,0,0,5.31e-05,0.237,0,5.73e-05,0,0,4.97e-05,4.9e-05,4.69e-05,6.82e-05,0.000535,0.00293,5.85e-05,0,0.0193,5.89e-05,5.1e-05,5.01e-05,4.56e-05,0.000106,9.46e-05,6.07e-05,8.3e-05,8.97e-05,5.85e-05,5e-05,4.8e-05,5.47e-05],"winrateAvg":0.578397,"leadAvg":0.421164,"scoreMeanAvg":0.341279,"scoreStdevAvg":4.79652,"shorttermWinlossErrorAvg":0.488521,"shorttermScoreErrorAvg":1.82068,"ownership":[-64,-55,-31,12,52,17,27,30,31,-76,-61,-50,-1,94,17,37,35,40,-80,-96,4,87,90,99,31,33,45,-80,-81,-99,-98,99,99,99,28,83,-74,-65,-65,-98,9,99,93,98,82,-69,-62,-97,-95,-99,99,91,98,98,-67,-61,-96,-90,-99,98,12,38,77,-67,-66,-80,-84,-98,29,-18,23,49,-68,-70,-74,-80,-69,-62,-36,-13,23],"ownershipAllowedMAE":0.115778})%"); + lines.push_back(R"%({"sample":{"board":"................./................./.....X.......X.../...X.....O......./..............X../................./................./................./...O............./.............XX../...........X.XOO./...O.........OXO./.............O.../........O.....O../...O......X.X..../................./................./","hintLoc":"null","initialTurnNumber":22,"metadata":"750EA34DE2E3C456A4BEA2808B12F534:32","moveLocs":["M15","C12","C5","C6","B6","B7","E4","D4","D5","E5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.86,"xSize":17,"ySize":17},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.27e-06,4.72e-06,4.68e-06,4.73e-06,4.87e-06,5.23e-06,5.11e-06,5.3e-06,5.23e-06,5.18e-06,5.08e-06,5.16e-06,4.63e-06,4.71e-06,4.46e-06,4.52e-06,4.41e-06,4.76e-06,5.36e-06,5.67e-06,5.92e-06,6.3e-06,6.76e-06,8.3e-06,9.53e-06,7.77e-06,8.2e-06,7.54e-06,6.31e-06,5.86e-06,4.88e-06,4.85e-06,4.65e-06,4.6e-06,4.96e-06,6.12e-06,6.6e-06,6.38e-06,6.17e-06,0,1.15e-05,5.21e-05,3.84e-05,7.28e-06,7.66e-06,0,5.24e-06,0,4.95e-06,4.7e-06,4.44e-06,5.03e-06,8.95e-06,7.24e-06,0,6.55e-06,9.02e-06,6.16e-05,0.00135,3e-05,0,1.04e-05,6.98e-06,5.89e-06,5.53e-06,4.99e-06,4.93e-06,4.47e-06,5.08e-06,1.58e-05,0.000337,7.1e-06,8.11e-06,3.5e-05,0.000169,0.00012,0.000176,4.88e-05,6.85e-05,8.73e-06,6.9e-06,6.06e-06,0,5.25e-06,4.76e-06,5.05e-06,1.33e-05,0,0.00201,3.04e-05,5.84e-05,0.000111,0.000177,0.00232,0.000651,4.17e-05,9.98e-06,7.71e-06,6.95e-06,6.26e-06,5.93e-06,4.8e-06,5.12e-06,6.77e-06,0.000181,4.64e-05,4.12e-05,3.08e-05,6.33e-05,9.94e-05,0.000191,0.000125,4.41e-05,9.71e-06,8.06e-06,7.34e-06,7.3e-06,6.75e-06,4.89e-06,4.88e-06,6.47e-06,9.98e-06,4.47e-05,1.12e-05,1.39e-05,2.85e-05,5.41e-05,8.58e-05,6.87e-05,2.2e-05,8.54e-06,7.41e-06,7.24e-06,7.79e-06,6.93e-06,5.19e-06,4.78e-06,5.66e-06,8.26e-06,0,1.31e-05,7.69e-06,1.16e-05,3.08e-05,4.95e-05,3.93e-05,9.25e-06,7.34e-06,6.09e-06,5.25e-06,5.61e-06,7.21e-06,5.44e-06,4.83e-06,6.33e-06,8.15e-06,8.73e-06,6.18e-06,7.37e-06,8.34e-06,1.75e-05,3.67e-05,2.67e-05,7.64e-06,6.15e-06,4.92e-06,0,0,2.07e-05,5.14e-06,5.71e-06,0,0.000195,5.64e-06,5.97e-06,6.78e-06,8.07e-06,1.26e-05,2.2e-05,1.19e-05,6.94e-06,0,4.88e-06,0,0,0,4.7e-06,4.59e-06,0,0,0,0.188,6.31e-06,9.35e-06,1.5e-05,1.35e-05,8.38e-06,7.54e-06,6.64e-06,6.75e-06,0,0,0,4.65e-06,5.44e-06,0.655,0,0,0,5.56e-05,2.5e-05,2.25e-05,2.79e-05,1.3e-05,7.8e-06,7.61e-06,6.16e-06,0,4.6e-06,5.84e-06,4.85e-06,4.74e-06,0.143,0.000224,0,0,3.76e-05,7.45e-05,4.88e-05,0,8.56e-06,6.18e-06,6.21e-06,5.95e-06,7e-06,0,7.59e-06,4.6e-06,4.85e-06,6.94e-06,9.09e-06,0,0.00034,1.52e-05,4.72e-05,5.41e-05,4.05e-05,6.17e-06,0,4.93e-06,0,7.08e-06,0.00142,1.17e-05,5.01e-06,4.98e-06,5.8e-06,1.65e-05,8.75e-05,1.64e-05,1.16e-05,1.23e-05,1.62e-05,4.87e-05,7.19e-06,5.49e-06,5.43e-06,5.51e-06,8.08e-06,3.65e-05,1.01e-05,5.18e-06,4.39e-06,5.1e-06,5.28e-06,5.43e-06,5.56e-06,5.31e-06,5.28e-06,5.26e-06,5.43e-06,5.13e-06,5.22e-06,4.77e-06,5.3e-06,5.23e-06,4.85e-06,5.07e-06,4.44e-06,5.83e-06],"winrateAvg":0.52487,"leadAvg":0.303801,"scoreMeanAvg":0.182823,"scoreStdevAvg":11.092,"shorttermWinlossErrorAvg":0.139201,"shorttermScoreErrorAvg":0.979546,"ownership":[-20,-26,-32,-41,-45,-41,-27,-14,-8,-11,-25,-45,-63,-71,-75,-76,-76,-15,-20,-33,-42,-54,-48,-30,-14,-8,-10,-25,-57,-74,-79,-78,-76,-75,-9,-13,-29,-52,-53,-84,-11,1,-4,8,-2,-90,-62,-94,-78,-75,-73,-3,-6,-35,-85,-40,-34,-12,-10,9,50,-7,-19,-39,-51,-72,-74,-68,8,1,-31,-26,-20,-17,-9,0,-2,8,-14,-18,-26,-41,-91,-66,-60,21,27,59,-19,-8,-10,-5,-5,-7,0,-5,-12,-21,-28,-40,-52,-48,32,37,22,17,-4,-3,-4,-5,-5,-3,-6,-12,-19,-25,-31,-37,-32,39,39,30,20,9,3,0,-3,-6,-7,-8,-13,-18,-23,-27,-25,-15,43,49,41,81,19,11,4,-1,-5,-7,-10,-16,-21,-35,-34,-11,2,45,45,46,50,33,16,8,1,-4,-7,-10,-21,-39,-86,-86,-23,38,32,70,57,63,48,28,12,4,-2,-7,-15,-77,-26,-86,93,93,63,19,-29,93,93,77,42,18,8,3,-2,-4,-1,12,94,91,94,82,-10,-30,-27,-25,95,61,26,18,11,-2,-8,3,25,94,93,87,82,-20,-19,20,82,36,48,29,29,71,2,-19,0,1,21,94,76,70,-21,-19,15,83,51,41,33,27,25,29,-66,-27,-65,5,24,45,53,-18,-13,-11,51,42,38,31,24,12,0,-27,-43,-40,-5,-15,34,35,-13,-11,4,21,34,34,30,21,9,-7,-24,-34,-31,-22,0,11,26],"ownershipAllowedMAE":0.0448425})%"); + lines.push_back(R"%({"sample":{"board":".....O...OOX.XX.XX./....OXO.OXO.XX...X./..O.OXOOXXOOOX..X../...OXXOXXOXXOOX.X../..XXX.OXO..XXX..X../......OX......XX.../.......O.........../......X............/..OX..OX.........../..O.XXOX........O../...OOOX.......O..../..OOXX.X.......X.../...XOX.......O...O./.O.X..........OOOX./.OX...O.......OXX.X/.OOX.XO...O....OX../..XX..O........OX../..X.O..........OX../.................../","hintLoc":"null","initialTurnNumber":126,"metadata":"E82E6B8B321E9B502EF39B19C87D9A05:136","moveLocs":["J14","D13","E13","G13","C13","D12","C12","F12","E12","H12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.33,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":-7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.14e-06,1.28e-05,1.33e-05,0.000183,0.000807,0,0.00063,0.145,0.000538,0,0,0,4.31e-06,0,0,4.12e-06,0,0,4.02e-06,1.72e-05,0.000136,4.54e-05,0.000195,0,0,0,0.000478,0,0,0,0.00207,0,0,4.39e-06,4.57e-06,4.27e-06,0,4.06e-06,4.16e-05,0.406,0,0.000228,0,0,0,0,0,0,0,0,0,0,4.24e-06,4.36e-06,0,4.03e-06,4.04e-06,0.000112,0.0318,0.0653,0,0,0,0,0,0,0,0,0,0,0,0,4.27e-06,0,4.47e-06,4.43e-06,3.39e-05,0.000114,0,0,0,6.7e-06,0,0,0,2.4e-05,5.79e-06,0,0,0,4.26e-06,4.1e-06,0,5.49e-06,5.23e-06,1.22e-05,1.18e-05,6.04e-06,3.64e-05,6.21e-06,1.08e-05,0,0,0,3.23e-05,1.18e-05,7.46e-06,6.02e-06,5.27e-06,0,0,6.49e-06,9.4e-06,6.33e-06,2.1e-05,3.77e-05,0,0,0,9.25e-06,0,0,7.14e-05,7.71e-05,2.34e-05,1.68e-05,1.26e-05,1.04e-05,8.74e-06,9.82e-06,1.8e-05,1.91e-05,8.27e-06,0.0002,0.000371,0,0,0,0,0,0,1.68e-05,0.000325,0.000128,4.79e-05,3.57e-05,3.02e-05,2.99e-05,4.09e-05,0.00012,7.05e-05,1.11e-05,5.98e-05,0.00671,0,0,1.18e-05,0.0905,0,0,9.94e-05,0.000971,0.000405,0.000218,0.000178,0.000167,0.00019,0.00016,0.000458,0.000204,1.3e-05,3.68e-05,4.33e-05,0,2.53e-05,0,0,0,0,7.22e-05,0.00141,0.000546,0.000409,0.000347,0.000294,0.000279,0.000706,0,0.000517,1.31e-05,1.42e-05,0.000371,5.05e-06,0,0,0,0,2.49e-05,0.000373,0.00289,0.000916,0.000507,0.000337,0.000303,0,0.000598,0.00222,0.00045,1.57e-05,1.03e-05,0.000185,0,0,0,0,1.59e-05,0,0.000716,0.00131,0.00076,0.000422,0.000161,0.000215,0.000179,0,9.77e-05,0.0148,1.48e-05,7.47e-06,0.000308,0.00281,0,0,0,3.97e-05,0.000425,0.00339,0.0578,0.000735,0.000192,0.000107,0,1.16e-05,1.18e-05,0.000225,0,5.59e-05,6.26e-06,0,1.75e-05,0,5.46e-05,0.000567,8.45e-05,0.0629,0.0059,0.000172,8.74e-05,5.6e-05,2.59e-05,1.41e-05,0,0,0,0,9.37e-06,6.49e-06,0,0,8.58e-06,2.21e-05,0.000375,0,4.85e-05,0.00055,0.000139,0.000169,2.78e-05,2.16e-05,1.71e-05,0,0,0,7.46e-06,0,8.24e-06,0,0,0,9.32e-06,0,0,1.95e-05,0.000162,0.000288,0,0.000153,7.2e-05,0.000558,0.00387,0,0,8.31e-06,6.87e-06,1.13e-05,9.67e-05,0,0,0.000116,0.0505,0,4.48e-05,0.000198,0.000229,0.000416,0.00012,0.000594,0.00259,0.000195,0,0,1.07e-05,8.17e-06,1.52e-05,1.11e-05,0,1.97e-05,0,0.000174,0.000292,0.000322,0.00027,7.33e-05,4.63e-05,4.19e-05,0.0002,0.000677,0.000101,0,0,1.13e-05,1.37e-05,5.35e-06,6.95e-06,6.17e-06,1.35e-05,3.47e-05,1.88e-05,1.8e-05,1.18e-05,8.43e-06,7.92e-06,7.68e-06,7.71e-06,8.17e-06,2.22e-05,3.12e-05,0.0106,0.000486,1.48e-05,4.88e-06,8.29e-06],"winrateAvg":0.0069972,"leadAvg":-8.3899,"scoreMeanAvg":-9.10452,"scoreStdevAvg":10.1326,"shorttermWinlossErrorAvg":0.0253107,"shorttermScoreErrorAvg":1.54739,"ownership":[65,76,83,86,91,93,92,89,90,90,88,-97,-97,-100,-100,-100,-100,-100,-99,41,84,85,84,93,-98,97,94,93,-96,89,-47,-100,-100,-100,-100,-100,-100,-99,21,-16,91,43,91,-99,97,97,-95,-95,88,89,90,-100,-100,-100,-100,-98,-96,-39,-30,-85,38,-99,-99,97,-95,-95,-93,-100,-100,89,90,-100,-100,-100,-91,-89,-65,-87,-99,-99,-99,-19,97,-95,-92,-94,-77,-100,-100,-100,-100,-100,-100,-81,-77,-77,-86,-95,-96,-70,14,97,-95,-95,-55,-21,-38,-48,-67,-100,-100,-69,-56,-58,-64,-89,-98,-95,-97,13,97,96,54,15,-3,-16,-21,-26,-40,-39,-25,-38,-34,-39,-30,-98,-93,-97,91,84,96,43,13,-1,-8,-11,-11,-10,-5,-3,-16,-10,20,26,97,-93,-86,-43,84,-83,-7,-8,-3,-4,-5,0,4,14,14,4,11,55,89,97,53,-89,-89,77,-86,-31,-13,-2,0,2,8,24,31,82,17,25,83,90,95,98,98,98,-95,-83,15,-9,0,3,10,26,85,45,33,29,26,93,95,98,98,-98,-98,-91,-97,-46,-16,2,9,19,41,50,23,59,-3,20,94,93,-1,-96,-93,-98,-6,-40,-13,-17,9,22,36,97,74,69,87,88,14,93,97,20,-96,-93,-12,34,-31,5,24,35,40,53,74,99,99,99,-78,-18,83,97,-76,-73,-52,28,96,14,32,54,55,66,70,79,99,-87,-88,-75,-84,41,97,97,-96,-65,-81,96,57,64,79,96,83,82,85,91,95,-87,-82,-80,11,-10,-96,-96,8,-44,97,85,89,89,90,89,87,87,88,95,-87,-79,-79,-25,-58,-96,-37,86,81,90,89,89,90,89,89,88,89,86,95,-87,-71,-75,-50,-72,-74,-26,35,79,87,89,89,89,89,88,87,85,82,22,-18,-74,-70],"ownershipAllowedMAE":0.030571})%"); + lines.push_back(R"%({"sample":{"board":".O.O.........XX..../XXO....OX.XXXOXO.../..XOOOOOX.OXOOOXX../..X.XOXOOX.XOX.OX../..X.XXXO.XXOO..OX../.XXX....OOOX...O.X./.OXOXO.O.....O.X..X/.OXOOO..XXOO..OXXXO/.OOXXO.X.OXX..OXOOO/.XXX....X......OXO./.OOOX.......X.O..../.XXX.X.....X.O..O../.O.......XOX.O...../.OXX...OX.XOO..XXO./..OX....OXXXOX..O../..OXOOOOXOXXXO.O.O./..OOOXXXX.OX.O.OXXX/...........X.XOX.X./..............OOX.O/","hintLoc":"null","initialTurnNumber":184,"metadata":"3D3C4C1DD81DF02061714B27FC5BFFE9:194","moveLocs":["R14","P13","P3","P4","O1","P3","N3","E2","F2","H8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.65,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":10.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000258,0,0,0,0.000251,0.000338,0.000322,0.00821,0.00983,0.000282,0.000184,0.000217,0.000243,0,0,0.000229,0.000222,0.000211,0.000207,0,0,0,0.00595,0.00564,0.000264,0.000266,0,0,0.000276,0,0,0,0,0,0,0.000231,0.000215,0.000212,0.000248,0.00028,0,0,0,0,0,0,0,0.000268,0,0,0,0,0,0,0,0.00021,0.000209,0.000254,0.000257,0,0.000315,0,0,0,0,0,0,0.000283,0,0,0,0.00878,0,0,0.000208,0.000208,0.000207,0.000207,0,0.00025,0,0,0,0,0.000234,0,0,0,0,0.00577,0.00187,0,0,0.000211,0.000208,0.000213,0,0,0,0.000323,0.000355,0.0127,0.000324,0,0,0,0,0.00966,0.00294,0.00917,0,0,0,0.000228,0.00022,0,0,0,0,0,0.00476,0,0.000487,0.000378,0.0108,0.00041,0.000449,0,0,0,0.000232,0.000239,0,0.000218,0,0,0,0,0,0.00154,0.00124,0,0,0,0,0.0277,0.000254,0,0,0,0,0,0.000223,0,0,0,0,0,0.000356,0,0.000341,0,0,0,0.0511,0.00332,0,0,0,0,0,0.000229,0,0,0,0.000286,0.027,0.00114,0.000361,0,0.000341,0.000299,0.000321,0.00373,0.0482,0.00112,0,0,0,0.00609,0.000268,0,0,0,0,0.000335,0.00103,0.028,0.00201,0.000459,0.000324,0.000311,0,0.0489,0,0.0141,0.0126,0.00979,0.00108,0.000334,0,0,0,0.000272,0,0.00243,0,0.177,0.000416,0.000351,0,0.00121,0,0.00226,0.0123,0,0.00305,0.00107,0.000758,0,0.00038,0.00026,0.000311,0.000537,0.00222,0.0845,0.000807,0,0,0,0.00399,0,0.00128,0.00083,0.00229,0.0148,0.00101,0.000287,0,0,0,0.000337,0.0042,0.0698,0,0,0.000267,0,0,0,0.0306,0.00332,0,0,0,0.00337,0.000291,0.00032,0,0,0.000339,0.000388,0.000392,0.0654,0,0,0,0,0,0,0.0074,0.0297,0,0.0323,0.00768,0.00026,0.000257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00942,0,0.00512,0.000228,0.000245,0,0,0,0,0,0,0,0.000234,0,0,0,0,0,0,0,0,0,0.000229,0.000247,0.000262,0.000284,0,0,0.00022,0.000214,0.000211,0.000215,0.000239,0,0.000318,0,0,0,0.000322,0,0.000339,0.000212,0.000233,0.000345,0.000361,0.0038,0.000386,0.000246,0.000221,0.00022,0.000215,0.000226,0.000241,0.000252,0,0,0,0,0.000403,0,0.000223],"winrateAvg":0.987419,"leadAvg":5.56817,"scoreMeanAvg":5.31092,"scoreStdevAvg":3.84805,"shorttermWinlossErrorAvg":0.0533444,"shorttermScoreErrorAvg":1.18592,"ownership":[-40,96,96,99,98,97,96,-2,-37,-95,-98,-99,-99,-99,-99,-98,-99,-99,-99,-99,-98,99,99,99,99,98,100,-99,-98,-100,-100,-100,100,-99,-98,-99,-99,-100,-99,-99,-100,100,100,100,100,100,-99,-98,-98,-100,100,100,100,-100,-100,-100,-100,-99,-99,-100,10,-100,100,-100,100,100,-99,-99,-100,100,98,98,99,-100,-100,-100,-100,-100,-100,-82,-100,-100,-100,100,47,-99,-99,100,100,99,98,99,-100,-100,-100,-100,-100,-100,-100,6,-30,-33,53,100,100,100,96,98,99,98,99,-100,-100,-99,-100,-99,-100,99,8,99,52,99,44,10,47,96,97,100,100,-100,-99,-99,-99,-99,-99,-100,99,99,99,55,39,-98,-98,98,99,28,66,100,-100,-100,-100,99,-99,-99,-99,-100,-100,99,15,-98,-97,-95,-98,-98,-9,15,100,-99,99,99,99,-99,-100,-100,-100,-51,-12,36,-16,-99,-96,-96,-89,-71,-30,37,99,98,99,98,-99,-99,-99,-99,-100,-30,15,24,-45,-94,-95,-95,-98,-24,100,98,99,98,98,-68,-100,-100,-100,-77,-96,15,76,-67,-87,-97,-99,0,99,98,98,100,99,98,-12,99,-41,-79,-38,-15,32,16,-36,-99,-96,-99,24,100,98,98,98,98,98,86,99,-100,-100,-28,-1,28,86,-94,-92,-100,98,99,97,97,97,98,99,98,98,99,100,-100,9,40,55,11,7,-100,-100,-100,99,97,98,98,100,99,98,99,100,100,-100,100,100,100,100,-100,-99,-100,-100,-100,99,100,100,98,100,98,100,100,100,100,100,-100,-100,-100,-100,-100,-99,-100,-100,99,100,100,98,98,98,100,100,100,99,100,-100,-99,-99,-99,-99,-99,-100,-98,-99,100,99,99,98,98,99,99,99,99,13,-28,-98,-99,-99,-99,-99,-99,-99,-99,99,99,98,98,98],"ownershipAllowedMAE":0.0263581})%"); + lines.push_back(R"%({"sample":{"board":".O.XXO.OX../OXXXOOOX.../O.XOOOOXXX./XXXOOXOOOX./.OOXX...OOX/XXOX.OOOXX./.O..O.OX.../..OOXOXXXO./..OXXXX.O../.O.OXX..X../..O.OXO..../","hintLoc":"null","initialTurnNumber":72,"metadata":"4932E3EAC458F20B02A8925CCA33F401:82","moveLocs":["A5","A7","C5","G11","K2","H2","H11","D1","K11","J10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.64,"xSize":11,"ySize":11},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":1.0,"policyOptimism":0.445,"pda":0.0,"policyMixture":[0.0115,0,0.00226,0,0,0,0.0296,0,0,0,0.00134,0,0,0,0,0,0,0,0,0,0.0226,0.0154,0,0.000737,0,0,0,0,0,0,0,0,0.0153,0,0,0,0,0,0,0,0,0,0,0.0521,0,0,0,0,0,0.00192,0.00181,0.00178,0,0,0,0,0,0,0,0.00164,0,0,0,0,0,0.0162,0,0,0,0.0017,0,0.0393,0,0,0.0102,0.114,0.0271,0.00133,0.00131,0,0,0,0,0,0,0,0,0.0096,0.00136,0.00161,0,0,0,0,0,0.00195,0,0.0151,0.0136,0.00136,0,0.0159,0,0,0,0.00196,0,0,0,0.0125,0.00146,0.00191,0,0,0.469,0,0,0.0139,0.0278,0.0284,0.00612,0.00753],"winrateAvg":0.00269235,"leadAvg":-7.6016,"scoreMeanAvg":-7.37985,"scoreStdevAvg":1.60073,"shorttermWinlossErrorAvg":0.0158903,"shorttermScoreErrorAvg":0.778643,"ownership":[85,97,-9,-100,-100,100,-2,-1,-100,-98,-99,99,-100,-100,-100,100,100,100,-100,-100,-99,-99,97,-4,-100,100,100,100,100,-100,-100,-100,-99,-100,-100,-100,100,100,99,100,100,100,-100,-99,-100,100,100,99,99,100,100,100,100,100,-100,-100,-100,100,99,100,100,100,100,-100,-100,-100,100,100,100,100,100,7,100,-100,-100,-99,-99,100,100,100,100,-100,8,-100,-100,-100,-98,-99,100,100,100,-100,-100,-100,-100,-100,-99,-99,-99,99,100,99,98,-100,-100,-100,-100,-100,-98,-99,99,99,99,89,87,-100,-99,-100,-99,-98,-99],"ownershipAllowedMAE":0.0234726})%"); + lines.push_back(R"%({"sample":{"board":"............../...X........../...XO......X../..X.O....X.O../...XO.O......./...XOX......../..OOX........./....X.....O.../...OX.....OX../.O.OX....OXX../..OXX....OXO../.OXO......OXX./OXX......O.O../............../","hintLoc":"null","initialTurnNumber":46,"metadata":"10B5282C8448530041B27DE9B5098C83:56","moveLocs":["M7","E13","D7","C7","B9","L12","L11","M13","N12","K12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.1,"xSize":14,"ySize":14},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":6.5,"policyOptimism":0.0,"pda":-2.569,"policyMixture":[3.07e-05,3.71e-05,3.69e-05,4.13e-05,4.94e-05,3.84e-05,3.76e-05,3.46e-05,3.6e-05,3.81e-05,3.85e-05,3.46e-05,3.33e-05,2.84e-05,3.38e-05,3.79e-05,3.69e-05,0,0,4.31e-05,4.15e-05,4.61e-05,5.37e-05,5.09e-05,8e-05,0,0.0182,3.38e-05,3.38e-05,3.69e-05,3.57e-05,0,0,3.75e-05,6.26e-05,0.000683,0.141,0,0,0,0,3.19e-05,3.65e-05,3.8e-05,0,3.66e-05,0,4.21e-05,7.96e-05,0.00476,0.484,0,0,0,6.15e-05,3.55e-05,3.69e-05,3.75e-05,3.7e-05,0,0,6.43e-05,0,7.01e-05,0.000208,4.08e-05,5.21e-05,0.0307,4.44e-05,3.58e-05,3.77e-05,0,0.000163,0,0,0,4.99e-05,6.13e-05,6.47e-05,8.83e-05,0.000221,6.39e-05,4.18e-05,3.54e-05,4.67e-05,6.86e-05,0,0,0,3.89e-05,4.33e-05,5.81e-05,6.15e-05,5.12e-05,0.000134,4.35e-05,3.79e-05,3.34e-05,7.31e-05,0.000667,0,0,0,3.44e-05,4.2e-05,4.84e-05,6.88e-05,4.33e-05,0,0,3.37e-05,3.31e-05,5.53e-05,0.000197,0.0473,0,0,3.32e-05,4.13e-05,4.63e-05,8.92e-05,4.63e-05,0,0,3.2e-05,3.21e-05,0.000108,0,4.36e-05,0,0,3.31e-05,4.18e-05,4.83e-05,4e-05,0,0,0,3.55e-05,3.38e-05,0.0735,0.00044,0,0,0,3.5e-05,4.36e-05,5.15e-05,4.3e-05,0,0,0,3.66e-05,3.53e-05,0.000368,0,0,0,0.0611,3.5e-05,6.43e-05,5.23e-05,0.0526,4.03e-05,0,0,0,3.26e-05,0,0,0,0.00128,0.0769,3.7e-05,4.43e-05,4.87e-05,4.39e-05,0,0.000149,0,0.000127,3.51e-05,5.62e-05,8.93e-05,3.53e-05,5.05e-05,3.96e-05,3.41e-05,3.6e-05,3.79e-05,3.51e-05,3.46e-05,3.69e-05,3.23e-05,3.28e-05,3e-05,2.3e-05],"winrateAvg":0.860788,"leadAvg":2.65486,"scoreMeanAvg":3.71283,"scoreStdevAvg":9.75997,"shorttermWinlossErrorAvg":0.158495,"shorttermScoreErrorAvg":1.34532,"ownership":[-68,-67,-62,8,31,64,66,65,63,56,43,19,5,-9,-70,-68,-66,-78,89,64,62,65,71,67,46,45,-10,-22,-70,-72,-72,-76,89,56,43,26,44,81,79,-54,-55,-33,-62,-71,-81,16,89,43,23,3,-58,-80,-78,-33,-46,-45,-44,-43,-57,-66,89,7,75,15,-14,-25,-35,-50,-50,-49,-1,-52,30,-63,89,-54,13,5,-2,-7,-17,-36,-50,-54,32,61,90,88,-91,-48,-9,0,0,8,6,-28,-62,-62,62,75,91,-92,-91,-42,-13,-4,4,19,64,-93,-75,-74,83,90,86,90,-91,-40,-13,0,7,46,64,-93,-87,-80,89,94,91,90,-92,-40,-10,4,31,91,-93,-93,-85,-81,88,90,92,-92,-92,-37,-12,10,32,92,-93,-77,-75,-72,85,90,-33,-36,-81,-25,-5,13,-15,87,90,-75,-73,-38,86,-37,-34,-34,-46,-28,-4,18,34,91,78,75,19,-13,27,2,-31,-40,-48,-32,-4,24,56,72,73,54,39,18],"ownershipAllowedMAE":0.064515})%"); + lines.push_back(R"%({"sample":{"board":"............../........XO..../..XX....XO..../..OX......O.../..OO.O.....O../............X./.......X.O.XX./.XO...X.XOOOXO/.XO....XO.OXO./.X.....XXOXX../..X.X..OXOOXXO/...OX..OXXOOXO/.......OOXO.O./.........X...O/","hintLoc":"null","initialTurnNumber":52,"metadata":"C4B5DFB6330C2EDBD01CAC7D48A23600:62","moveLocs":["F12","B8","E7","F8","G9","E8","K10","J11","H11","F7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.37,"xSize":14,"ySize":14},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":6.5,"policyOptimism":0.4,"pda":1.262,"policyMixture":[4.78e-06,5.15e-06,5.38e-06,5.41e-06,5.14e-06,5.69e-06,5.44e-06,5.7e-06,6.19e-06,0.000486,7.4e-06,8.05e-06,6.22e-06,4.91e-06,5.98e-06,6.55e-06,5.66e-06,5.48e-06,5.61e-06,5.77e-06,6.05e-06,5.85e-06,0,0,0.000116,3.46e-05,2.15e-05,6.23e-06,6.59e-06,1.53e-05,0,0,5.67e-06,0,6.78e-06,6.19e-06,0,0,4.49e-06,0.0743,8.49e-05,6.29e-06,6.29e-06,1.32e-05,0,0,6.41e-06,6.73e-06,6.56e-06,0,0,0.314,0,1.3e-05,0.00104,6.08e-06,6.48e-06,7.4e-06,0,0,7.7e-06,0,8.81e-06,0.000131,0.0169,0,0.0006,0,0.000131,5.86e-06,6.46e-06,0.00025,8.27e-06,7.47e-06,9.52e-06,0.000111,0,7.36e-06,3.36e-05,0.00209,0.268,5.81e-06,0,4.96e-06,5.07e-05,0,0.00226,1.92e-05,0,0,6.14e-06,0,6.87e-06,0,5.93e-06,0,0,5.29e-06,5.99e-06,0,0,0.000123,0,0,0,5.26e-06,0,0,0,0,0,0,4.9e-06,0,0,7.83e-05,0.193,0.122,6.03e-06,0,0,9.64e-06,0,0,0,0.000376,5.04e-06,0,1.1e-05,0.000575,0.00105,3.83e-05,7.82e-06,0,0,0,0,0,5.32e-05,5.57e-05,5.64e-06,5.76e-06,0,3.72e-05,0,7.9e-06,7.71e-06,0,0,0,0,0,0,0,5.36e-06,6.23e-06,7.5e-06,0,0,6.82e-06,5.96e-06,0,0,0,0,0,0,0,5.69e-06,6.39e-06,6.47e-06,7.25e-06,7.53e-06,7.23e-06,5.93e-06,0,0,0,0,5.84e-06,0,0,4.82e-06,5.77e-06,5.85e-06,6.12e-06,6.43e-06,6.14e-06,5.89e-06,6.07e-06,6.15e-06,0,7.25e-06,5.86e-06,6.43e-06,0,8.16e-06],"winrateAvg":0.321165,"leadAvg":-1.00502,"scoreMeanAvg":-2.30441,"scoreStdevAvg":11.8919,"shorttermWinlossErrorAvg":0.257047,"shorttermScoreErrorAvg":2.10278,"ownership":[-60,-73,-80,-83,-80,-74,-62,-51,-26,-13,25,30,34,34,-35,-77,-80,-88,-86,-78,-69,-57,-75,58,33,36,32,34,-10,-2,-93,-93,-56,-91,-50,-53,-75,58,39,32,32,30,33,13,76,-93,7,-19,-13,-79,-5,-38,65,41,28,26,44,64,76,77,39,69,-8,-29,-31,-69,9,61,36,19,37,44,64,62,44,-19,-82,-39,-4,7,15,21,3,16,-6,62,54,57,77,77,-8,-90,28,97,48,1,1,28,-31,-91,68,20,-31,78,-85,-66,-70,98,98,98,2,84,-71,-90,67,-2,-28,16,-31,-93,36,32,99,95,96,85,-81,-90,-20,-32,-50,-25,-32,-92,-92,99,97,96,96,95,-80,-83,-91,-60,-93,-56,-54,-38,-91,99,99,96,96,98,-72,-71,-68,-37,-92,-61,-53,-38,-91,-91,99,99,96,98,-66,-61,-51,-46,-43,-59,-49,-38,-41,-91,99,89,98,97,-62,-58,-53,-49,-51,-50,-52,-56,-73,-90,-19,68,81,96],"ownershipAllowedMAE":0.0572042})%"); + lines.push_back(R"%({"sample":{"board":".X..XO.O.OO...../X...XOOXO.OXO.X./.X.XXOXXOOXOOOOX/XXXXOXX.XXX.XOX./.XXXO..X....XXX./XXOOO.OOOX....../OO....OXX......./..O...OOX.X...../.......X...XX.../.......O....OX.X/......OOOO..OXXO/OOOO.O....OOOXO./.XO.OOOOOOOXXXO./X.XO.O.XXOXXOOO./..XOOXXXOOXXXOOO/...XX.X.XX....../","hintLoc":"null","initialTurnNumber":181,"metadata":"1A4845B858935E3D864AFD85927F4BD4:191","moveLocs":["J8","K8","J7","O15","O16","Q5","Q4","J12","P16","Q15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.85,"xSize":16,"ySize":16},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0.000112,0.000113,0,0,0.000113,0,0.289,0,0,0.0121,0.00982,0,0,5.86e-05,0,0.000113,0.000113,0.000113,0,0,0,0,0,4.72e-05,0,0,0,0,0,0,0,0,0.000116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0104,0,0,0,0.00825,0,0,0,0,0,0.00269,0.000159,0,0,0.00186,0.000119,0.000104,0,0,0,0.000122,0,0,0,0,0,0.000146,0,0,0,0,0.00206,0.000111,0.000114,0.000114,0.000113,0.000115,0,0,0.000119,0.000113,0.000117,0.000126,0,0,0,0.00338,0.000133,0.000118,0.000116,0.000123,0.000123,0.000118,0.000117,0.000122,0,0.000114,0.000116,0.000115,0,0,0,0.00469,0,0.000124,0.000126,0.000136,0.000129,0.00012,0.000117,0.000116,0.000115,0.000113,0.000114,0.000114,0.000123,0,0,0,0.00011,0,0,0.00213,0.0108,0.00014,0.000116,0.000115,0.000115,0.000115,0.000114,0.000115,0.000117,0,0,0.00037,0.249,0.00335,0,0,0.000121,0,0.000117,0.000115,0.000115,0.000115,0.000115,0.000122,0,0,0,0,0.000149,0.000139,0,0,0,0.168,0,0,0,0,0.000124,0,0.000122,0.00012,0.000121,0.000124,0,0,0,0,0,0,0.0872,0,0,0.000127,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0556,0,0,0.000126,0,0.000355,0,0,0,0,0,0,0,0,4.53e-05,0.00223,0.00127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000207,0.0439,0.0087,0,0,0,0,0,0,0,0.000568,0.000115,0.0117,0.00183,0.000127,5.75e-05,0.000159],"winrateAvg":0.111465,"leadAvg":-0.660388,"scoreMeanAvg":-0.768865,"scoreStdevAvg":1.64524,"shorttermWinlossErrorAvg":0.212246,"shorttermScoreErrorAvg":0.580571,"ownership":[-100,-100,-100,-100,-100,-100,-100,99,100,100,100,100,99,99,99,-20,-100,-100,-100,-100,-100,-100,-100,-100,100,99,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,99,-100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-78,-100,100,-100,-100,-100,-100,-100,-100,100,-63,-26,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,34,100,100,100,-100,-99,-100,-100,-100,-100,-100,100,100,100,100,99,99,100,-100,-100,-99,-99,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-99,-100,-99,-99,-99,-99,-99,100,100,100,100,100,100,100,100,100,-99,-15,-100,-100,-99,-99,-98,100,100,100,100,100,100,100,100,100,35,56,-16,100,-100,-99,-98,100,100,100,100,100,100,100,100,100,100,68,46,100,-100,-100,-8,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,-6,76,-98,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,-99,-99,-100,100,100,100,-2,-100,-100,100,-100,-100,100,100,100,100,-99,-99,-99,100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,-98,-99,-99,-99,-99,-99,-100,-100,-100,-100,-99,-87,12,23,99,100],"ownershipAllowedMAE":0.0109466})%"); + lines.push_back(R"%({"sample":{"board":"O.OOOX.......XXO.../.O.OXXX.....X.XOOO./O.OOOXX......XOXXX./OOXXX.X..XX..XOOOX./XX.XOX...XOXXO.OOO./.XOXOXX.XOOOXOOX.OO/OXXOOO.XOOOOO.OXXXX/.OO.O.XXXXOXXOO.OOX/.OXXOXXXOOO.XXOOOXX/.OOOXX..XXO.XOO.OOX/OOXXOOX.XXOXXOXOOX./XOX.XOOXX.X.X.XXXXX/XX.XXXOOOXOX.XXX.X./X.X.XOOXXX..X.XOXOX/XXOOXO.OXX...XOOOOO/OOXOOO.OOOX.XOOO.../.OXOOXO.OX.XXOXXOO./...OX.XOXXXX.XXXO../.....X.OOX..X.XOO../","hintLoc":"null","initialTurnNumber":305,"metadata":"F63A254A69348373A737F87161B12EBE:315","moveLocs":["R7","D1","C2","R6","T7","G4","H3","T6","R7","G1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,3.45e-06,0,0,0,0,3.85e-06,3.73e-06,3.61e-06,3.52e-06,3.63e-06,1.67e-05,0.000217,0,0,0,1.54e-06,3.75e-06,3.32e-06,3.34e-06,0,3.28e-06,0,0,0,0,3.36e-06,3.5e-06,3.57e-06,7.5e-06,7.24e-05,0,0,0,0,0,0,3.63e-06,0,3.33e-06,0,0,0,0,0,3.49e-06,3.2e-06,5.85e-06,2e-05,0.000288,0.000225,0,0,0,0,0,4.76e-06,0,0,0,0,0,0,0,3.36e-06,5.31e-06,0,0,0.00045,0.000419,0,0,0,0,0,5.97e-06,0,0,5.42e-06,0,0,0,3.98e-06,3.69e-06,2.33e-05,0,0,0,0,0,3.73e-06,0,0,0,4.35e-06,2.36e-05,0,0,0,0,0,0,1.36e-05,0,0,0,0,0,0,0,0,8.75e-06,0,0,0,0,0,0,0,0,6.22e-06,0,0,0,0,0,0,8.85e-06,0,0,0,0,0,1.31e-05,0,0,9.26e-06,0,6.36e-06,0,0,0,0,0,0,0,0,0,7.97e-06,0,0,0,3.54e-06,0,0,0,0,0,0,0,0,0,0,4.88e-06,0,0,0,0,0,0,0,1.7e-06,0,0,0,0,0,8.65e-06,3.93e-06,0,0,0,4.95e-06,0,0,0,2.33e-06,0,0,0,0,0,0,0,0,0,0,1.18e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9.87e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9.89e-06,0,0,0,1.03e-05,0,0,0,0,0,0,4.1e-06,3.75e-06,0,0,0,0,1.49e-05,0,0,0,0,0,0,0,0,0.703,0,0,0,3.75e-06,3.81e-06,9.16e-06,0,0,0,0,0,0,0,0,3.76e-06,0,0,0,0,0,0,0,0,3.9e-06,0,0,0,0,3.7e-06,3.89e-06,3.89e-06,3.61e-06,0,4.19e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.55e-06,4.02e-06,3.96e-06,0,0,0,0.294,0,0,0,0,0,0,0,0,0,0,0,3.88e-06,3.94e-06,3.72e-06,3.89e-06,4.79e-06,0,0,0,0,0,0,0,4.16e-06,4.08e-06,0,0,0,0,0,3.75e-06,4.05e-06,2.43e-05],"winrateAvg":0.991872,"leadAvg":14.4248,"scoreMeanAvg":14.2387,"scoreStdevAvg":1.23422,"shorttermWinlossErrorAvg":0.0152916,"shorttermScoreErrorAvg":0.602397,"ownership":[100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-99,-99,-99,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-99,-100,100,-100,-100,100,100,100,100,100,100,-16,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,-100,100,100,-100,19,100,100,100,-100,-100,100,100,100,-60,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,17,-100,-100,-100,-100,100,-100,-100,100,100,59,100,100,-100,100,100,100,100,100,-100,-100,-100,100,100,100,12,-100,-100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,-47,-100,100,100,100,100,100,-100,100,100,-100,-100,100,100,-100,-100,-100,-100,100,-100,-100,100,-100,100,100,-100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-44,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,45,-100,-45,-100,-100,-100,-42,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,52,100,-45,-100,-100,100,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,100,99,99,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,99,99,100,99,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100],"ownershipAllowedMAE":0.0156951})%"); + lines.push_back(R"%({"sample":{"board":"....XXOOOO.X.XX..../XXXXOXOOOOXXXOXX.../XOXOOXXOXOXOOOOXOX./OOOOX.XXXOOO.OXXX../...OX.X.OOO..OOXXXX/....OXXOOXOXXOXOOXO/OO.OOOXOXXXO.OX.OOO/.O..OXXOOXXO....OO./O.OOXXOOXXXXOOOOXOX/XOOOXXXXXOOXXOXXXXX/XXXX..XOOOXXO.OXXX./OOX.XXOO.OOOO.OX..X/..OXXO.OOXOXO.OOXXX/OOOOOOOOXXXXXOOOOOX/XOOO...OOOX.XOXXOOO/XXOXXXX.OXX.XOXOO../.XXXOXOOOOX..XXXOO./XXOOOOXXXX...XOO.O./.O...X.......XXOO../","hintLoc":"null","initialTurnNumber":298,"metadata":"A2E8FE25256EBA9A0D2A4B3F849C352E:308","moveLocs":["H15","H4","E5","L19","N19","G5","F5","P12","T12","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.7,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":5.0,"policyOptimism":0.0,"pda":0.922,"policyMixture":[0.00156,0.00153,0.00155,0.0168,0,0,0,0,0,0,0,0,0,0,0,0.00187,0.00148,0.00144,0.00155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0171,0.00443,0.00145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00184,0,0,0,0,0,0.0167,0,0,0,0,0,0,0.00143,0,0,0,0,0.0171,0.00153,0.0014,0.00152,0.00138,0,0,0.0167,0,0,0,0,0,0.00163,0.00229,0,0,0,0,0,0,0.00138,0.00143,0.00532,0.00311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00264,0,0,0,0,0,0,0,0,0,0.0525,0,0,0.0438,0,0,0,0,0,0.00179,0.00193,0,0,0,0,0,0,0,0,0.0458,0.00374,0,0.0464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.017,0.0165,0,0,0,0,0,0,0,0.00185,0,0,0,0,2e-05,0,0,0,0.0159,0,0,0,0,0,0,0,0,0,0.00149,0,0,0.00653,0.00772,0,0.0406,0.0434,0,0,0,0,0,0,0,0,0,0,0,0.00141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000743,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00606,0,0,0,0,0,0.00139,0.00143,4.65e-06,0,0,0,0,0,0,0,0,0,0,0.01,0.0376,0,0,0,0,0,0.00142,0,0,0,0,0,0,0,0,0,0,0.0306,0.01,0.0094,0,0,0,0,0,0.00155,1.58e-05,0,0.0323,0.00095,0.0267,0,0.0218,0.00181,0.00116,0.00376,0.00232,0.00411,0.00343,0,0,0,0,0.0501,0.00147,0.263],"winrateAvg":0.000281288,"leadAvg":-7.99227,"scoreMeanAvg":-7.88396,"scoreStdevAvg":0.74088,"shorttermWinlossErrorAvg":0.00779801,"shorttermScoreErrorAvg":0.382995,"ownership":[-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,100,-100,100,100,-100,-100,100,-100,100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,100,-100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,-100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,100,100,100,100,-100,100,-100,-100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,100,100,100,100,-100,100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,100,-100,-100,100,100,100,-100,-100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100],"ownershipAllowedMAE":0.000645656,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":"................../................../.....X............/...X..........O.../................../...............O../................../................../................../..............O.../............XX..../............OX..../...........O.O..../..............XX../...X........XXO.X./........O...XOOOXX/...........OOOXXOO/................X./","hintLoc":"null","initialTurnNumber":33,"metadata":"7B48AFC8397681BDE704E98B31869635:43","moveLocs":["Q7","P6","P1","Q11","O10","Q9","P8","P12","N12","N13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.78,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":8.5,"policyOptimism":0.0,"pda":1.885,"policyMixture":[1.79e-06,3.19e-06,3.35e-06,3.48e-06,4e-06,3.88e-06,3.68e-06,3.53e-06,3.49e-06,3.66e-06,3.88e-06,4.1e-06,4.34e-06,4.49e-06,4.27e-06,3.56e-06,3.16e-06,1.87e-06,3.36e-06,1.24e-05,1.68e-05,2.42e-05,2.55e-05,0.000113,2.16e-05,2.25e-05,2.02e-05,2.27e-05,2.78e-05,3.63e-05,3.83e-05,4.74e-05,3.02e-05,1.71e-05,8.58e-06,3.19e-06,3.98e-06,3.91e-05,0.000213,0.00033,0.000525,0,0.00022,7.37e-05,0.000108,0.000147,0.000248,0.000457,0.000669,0.000229,6.02e-05,6e-05,1.66e-05,3.41e-06,4.73e-06,5.67e-05,0.000482,0,0.00257,0.000139,0.000165,8.28e-05,0.000101,0.000152,0.000247,0.000655,0.00856,4.34e-05,0,0.000295,2.91e-05,4.24e-06,4.95e-06,0.000136,0.000225,0.000477,2.49e-05,2.89e-05,4.4e-05,6.11e-05,8.79e-05,0.00012,0.000181,0.000139,0.000407,4.04e-05,0.000349,0.000129,4.02e-05,4.55e-06,4.05e-06,3.25e-05,0.000171,7.21e-05,3.81e-05,3.29e-05,5.45e-05,8.13e-05,0.000119,0.000169,0.000259,0.34,0,0.0112,0.0326,0,2.71e-05,5.8e-06,3.73e-06,2.12e-05,0.000114,7.25e-05,3.5e-05,4.16e-05,6.74e-05,0.00011,0.000173,0.000287,0.000754,0.0908,0,0.0171,0,0.00373,6.37e-05,5.03e-06,3.67e-06,1.92e-05,9.65e-05,6.58e-05,3.83e-05,4.8e-05,7.62e-05,0.000126,0.000213,0.00035,0.000682,0.0028,0.0046,0.000175,4.41e-05,0,7.26e-05,5.15e-06,3.64e-06,1.91e-05,0.000104,8.28e-05,4.05e-05,4.83e-05,7.52e-05,0.000124,0.000212,0.000438,0.00172,0.0823,0.000376,0,7.04e-05,0.00117,0.0126,5.94e-06,3.67e-06,1.9e-05,0.000102,8.05e-05,3.97e-05,4.64e-05,6.78e-05,0.00011,0.000195,0.000394,0.00274,0.00187,2.43e-05,1.04e-05,0,0,0.0219,5e-06,3.67e-06,1.94e-05,9.97e-05,7.4e-05,4e-05,4.61e-05,6.21e-05,9.22e-05,0.000147,0.000266,0.000245,0.0526,0,0,0,0.000694,2.54e-05,5.15e-06,3.76e-06,2.26e-05,0.000158,0.000107,5e-05,4.99e-05,6.1e-05,9.5e-05,0.000167,0.000278,0.000292,1.34e-05,0,0,0.273,0,1.17e-05,5.06e-06,4.1e-06,3.91e-05,0.000238,0.000127,6.52e-05,4.81e-05,5.17e-05,8.11e-05,0.000158,0.000526,9.72e-05,0,1.77e-05,0,0,4.37e-06,0.000789,4.82e-06,4.9e-06,0.000126,0.000297,0.000339,8.09e-05,4.56e-05,3.93e-05,4.96e-05,8.35e-05,0.000179,0.00025,3.7e-05,4.13e-06,2.19e-05,0,0,7.94e-06,5.02e-06,4.95e-06,8.63e-05,0.000614,0,0.000213,0.000109,4.91e-05,2.21e-05,1.59e-05,3.11e-05,0.000544,2.19e-05,0,0,0,5.99e-06,0,2.78e-06,4.28e-06,4.01e-05,0.000245,0.00026,0.000122,0.00014,5.23e-05,1.3e-05,0,1.05e-05,2.26e-05,1.42e-05,0,0,0,0,0,0,3.51e-06,1.49e-05,2.55e-05,3.4e-05,3.88e-05,2.59e-05,1.61e-05,1.17e-05,6.04e-06,7.17e-06,5.43e-06,0,0,0,0,0,0,0,1.89e-06,3.28e-06,3.93e-06,4.18e-06,4.14e-06,3.64e-06,3.32e-06,3.03e-06,3.01e-06,2.74e-06,2.62e-06,2.22e-06,2.09e-06,3.56e-06,0,0.00968,0,0,6.99e-06],"winrateAvg":0.973381,"leadAvg":9.66924,"scoreMeanAvg":12.2679,"scoreStdevAvg":14.8251,"shorttermWinlossErrorAvg":0.0312187,"shorttermScoreErrorAvg":1.69461,"ownership":[-34,-38,-41,-44,-47,-43,-34,-23,-13,-6,0,6,14,23,31,36,38,40,-32,-35,-43,-47,-53,-50,-37,-23,-15,-7,0,6,14,27,35,40,40,40,-29,-34,-45,-54,-54,-82,-22,-14,-11,-4,2,6,15,27,49,47,43,39,-26,-28,-45,-85,-37,-30,-8,-7,-4,-1,3,4,6,17,80,49,38,35,-20,-24,-39,-27,-22,-15,-7,-2,0,3,8,5,0,1,22,26,31,26,-14,-14,-11,-14,-10,-8,-3,1,4,9,17,51,-40,-16,-34,47,17,14,-9,-11,-12,-9,-7,-4,-1,2,6,12,22,40,73,4,-56,-8,-1,-2,-7,-9,-10,-7,-5,-2,0,3,7,11,18,27,16,35,-7,-54,-21,-11,-5,-7,-8,-5,-3,-1,0,2,5,9,15,28,27,84,22,-6,-8,-10,-4,-6,-6,-4,-2,-1,1,2,3,5,8,5,4,39,83,-27,3,0,-4,-5,-6,-3,-2,0,1,3,4,4,-1,-16,-48,-47,82,48,11,10,-4,-4,-5,-4,-2,0,2,5,8,12,11,11,54,-44,37,78,29,4,-7,-5,-4,-10,-4,-1,2,7,10,22,20,67,42,43,-73,-8,-11,-14,-11,-14,-25,-21,-10,-4,1,7,13,14,10,13,-4,-57,-73,-74,-39,-40,-15,-15,-29,-74,-23,-8,4,11,18,14,20,-1,-55,-57,92,-24,-74,-62,-16,-19,-25,-29,-20,-7,4,21,81,29,26,33,-56,93,93,93,-73,-72,-17,-15,-18,-14,-10,2,14,33,53,60,60,94,93,93,7,-3,-5,-10,-16,-16,-15,-13,-8,1,15,33,50,60,72,81,85,76,79,22,-7,-12],"ownershipAllowedMAE":0.031813})%"); + lines.push_back(R"%({"sample":{"board":"....O.X.XO..O....../...OXXOXOOO.XOX..../..OOOX.XXOOOXOX..../...OXO..OXOXXO.XXXX/...OX..OOXXOXO.XOOO/.OOOXO.OX.XOOOXXOX./..XXOO.OXXXO..XOO../......XX..XXO..XOO./O.X.X..X.XOXO..OOX./X..XO...XO.O..O.X.X/..........O....OOX./.........X.O..O.XO./...X....X.O.O.X.XX./.XX...O..OO.O.XO.../.XOX.OXXXOXOOOOXX../.OOXXX...XXO.OXOX../.O.OXOXXX.XXO...X../.O.OX.....XO.O.X.../..O................/","hintLoc":"null","initialTurnNumber":172,"metadata":"F510CA3A24D18DABA2B1271102E3CDC7:182","moveLocs":["E1","B12","B13","A12","K9","J9","G1","Q8","P19","Q19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.22,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":-0.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000181,0.00018,0.000176,0.000192,0,0.000185,0,0.00022,0,0,0.00015,0.0073,0,0.549,0,0,0.00196,0.00026,0.000194,0.000183,0.000182,0.000178,0,0,0,0,0,0,0,0,0.0181,0,0,0,0.0116,0.00589,0.0013,0.000238,0.000182,0.00018,0,0,0,0,0.000187,0,0,0,0,0,0,0,0,0.000438,0.000215,0.000221,0.000196,0.000182,0.000184,0.000181,0,0,0,0.000203,0.0002,0,0,0,0,0,0,0.0026,0,0,0,0,0.000185,0.000183,0.000183,0,0,0.000204,0.000197,0,0,0,0,0,0,0,0.000214,0,0,0,0,0.00021,0,0,0,0,0,0.000219,0,0,0,0,0,0,0,0,0,0,0,0.000198,0.00031,0,0,0,0,0,0.000292,0,0,0,0,0,0.000222,0.000424,0,0,0,0.000198,0.000207,0,0,0.00111,0.0593,0.06,0.0107,0,0,0.000204,0.00954,0,0,0,0.000252,0.00664,0,0,0,0.000277,0,0.000203,0,0.000686,0,0.00695,0.000201,0,0.00985,0,0,0,0,0.000234,0.00023,0,0,0,0.00179,0,0.000205,0.000214,0,0,0.000204,0.000201,0.00019,0,0,0.000247,0,0.00022,0.000228,0,0.0398,0,0,0,0.000189,0.000193,0.000194,0.000207,0.000197,0.000202,0.000193,0.000192,0,0,0,0.000209,0.000229,0.000293,0.0012,0,0,0,0.00332,0.000189,0.000191,0.000194,0.000191,0.000194,0.000193,0.000192,0.00442,0.00796,0,0.000254,0,0.000244,0.00419,0,0,0,0,0.00026,0.000195,0.000193,0.00019,0,0.000192,0.000194,0.000191,0.000235,0,0.000324,0,0.000189,0,0.0601,0,0.000246,0,0,0.000205,0.000269,0,0,0.000193,0.000196,0.000189,0,0.00201,0.0451,0,0,0.000184,0,0.00255,0,0,0.000202,0.000201,0.00019,0.0023,0,0,0,0.000186,0,0,0,0,0,0,0,0,0,0,0,0,0.000184,0.000187,0.000276,0,0,0,0,0,0.000182,0.000184,0.000193,0,0,0,0.000192,0,0,0,0,0.000185,0.000184,0.000205,0,0.000183,0,0,0,0,0,0,0.000194,0,0,0,0.00024,0.0111,0.000198,0,0.000191,0.000184,0.000183,0,0.00019,0,0,0.000273,0.000203,0.000255,0.000265,0.00106,0,0,0.000247,0,0.00235,0,0.000239,0.000213,0.000192,0.000181,0.000188,0,0.00024,0,0.000355,0,0.000629,0.00505,0.00231,0.00555,0.00157,0.000248,0.000251,0.000383,0.00439,0.000436,0.000232,0.000186,0.000189],"winrateAvg":0.00146151,"leadAvg":-5.43409,"scoreMeanAvg":-5.46033,"scoreStdevAvg":2.23304,"shorttermWinlossErrorAvg":0.0173154,"shorttermScoreErrorAvg":0.718038,"ownership":[100,100,100,100,100,99,98,98,98,99,98,98,99,97,95,-99,-99,-99,-99,100,100,100,100,98,98,98,97,99,99,99,99,99,100,-100,-99,-99,-99,-99,100,100,100,100,100,98,98,97,96,99,99,100,99,100,-99,-99,-99,-99,-99,99,100,100,100,99,99,98,98,99,-100,99,98,99,100,-3,-100,-100,-100,-100,99,100,100,100,99,99,98,99,100,-100,-100,100,99,100,0,-100,100,100,100,99,100,100,100,99,100,89,99,-100,-100,-100,100,100,100,-100,-100,100,98,99,-26,100,-98,-97,100,100,-55,100,-100,-100,-100,100,66,-23,-100,100,100,99,98,-100,-100,-97,51,79,26,-100,-100,-100,-98,-100,-100,100,18,26,31,100,100,59,-99,-100,-100,-92,-99,-95,-98,-100,-98,-97,30,-100,100,52,62,100,100,-97,1,-100,-100,-99,-100,-98,-98,-98,-99,-100,100,29,99,93,90,100,92,-97,-97,-98,-100,-100,-99,-99,-99,-99,-99,-99,-100,100,100,96,89,89,95,100,100,-99,-98,-100,-100,-100,-99,-99,-99,-99,-98,-98,-98,43,100,89,76,96,-100,-100,-99,-100,-100,-100,-100,-100,-99,-99,-99,-99,-100,22,100,100,100,83,-99,-99,-100,-100,-100,-98,-100,-100,-100,-99,-99,-98,-99,23,100,100,100,100,70,-99,-99,-100,-100,-100,0,-100,100,-100,-99,-99,-100,-100,-100,100,-100,100,100,100,100,-100,-100,-100,-100,8,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,99,100,-52,-45,-100,-100,-100,95,100,100,100,-100,-67,-100,-100,-100,-92,-100,-100,99,72,-49,-71,-100,-100,-100,100,100,100,100,-100,-56,-47,-37,-57,-64,-100,46,48,99,7,-100,-99,-100,-100,100,100,100,97,97,88,90,36,21,-45,-38,-34,57,53,8,-60,-98,-99,-99],"ownershipAllowedMAE":0.032725})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../","hintLoc":"null","initialTurnNumber":0,"metadata":"1EBB62B54792C1F2828FD96B08B50361:0","moveLocs":[],"movePlas":[],"nextPla":"B","weight":0.3,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.89e-06,4.5e-06,3.89e-06,4.69e-06,4.36e-06,4.61e-06,4.11e-06,4.15e-06,4.04e-06,4.03e-06,4.04e-06,4.11e-06,3.98e-06,4.56e-06,4.25e-06,4.71e-06,3.9e-06,4.31e-06,2.97e-06,4.27e-06,7.5e-06,1.36e-05,1.67e-05,2.46e-05,1.95e-05,1.97e-05,1.89e-05,1.89e-05,1.88e-05,1.89e-05,1.89e-05,1.98e-05,1.95e-05,2.46e-05,1.65e-05,1.33e-05,7.72e-06,4.24e-06,3.99e-06,1.36e-05,0.000303,0.0128,0.00214,0.00144,0.000335,0.000353,0.000266,0.000306,0.000269,0.000343,0.000334,0.00144,0.00221,0.0131,0.000276,1.31e-05,3.91e-06,4.75e-06,1.68e-05,0.0129,0.171,0.0157,0.000449,0.000655,0.000754,0.00149,0.00173,0.00149,0.000753,0.000633,0.000457,0.0161,0.168,0.0133,1.77e-05,4.89e-06,4.4e-06,2.49e-05,0.00214,0.0158,0.000129,7.48e-05,5.87e-05,9.18e-05,0.000114,0.000131,0.000113,8.93e-05,5.6e-05,7.02e-05,0.000112,0.0156,0.00225,2.57e-05,4.39e-06,4.5e-06,1.98e-05,0.00142,0.000442,7.48e-05,4.59e-05,6.5e-05,9.79e-05,0.000125,0.000133,0.000123,9.47e-05,6.25e-05,4.45e-05,6.96e-05,0.000464,0.00147,2.09e-05,4.62e-06,4.11e-06,1.98e-05,0.000291,0.000662,5.84e-05,6.52e-05,9.61e-05,0.00014,0.000164,0.000175,0.000162,0.000136,9.23e-05,6.26e-05,5.61e-05,0.000665,0.000327,2.05e-05,4e-06,4.11e-06,1.88e-05,0.00033,0.000711,8.93e-05,9.48e-05,0.000139,0.000176,0.000195,0.0002,0.000193,0.000174,0.000135,9.33e-05,8.88e-05,0.00074,0.000337,1.94e-05,4.06e-06,4.05e-06,1.89e-05,0.000259,0.00148,0.00011,0.000122,0.000162,0.000196,0.000203,0.000206,0.000203,0.000195,0.000161,0.000121,0.000111,0.00153,0.000262,1.92e-05,4e-06,4.06e-06,1.89e-05,0.000298,0.00173,0.000128,0.000131,0.000174,0.000201,0.000207,0.000208,0.000205,0.000199,0.000171,0.00013,0.000127,0.00176,0.000302,1.91e-05,4.01e-06,4.1e-06,1.89e-05,0.000268,0.0015,0.000112,0.000124,0.000165,0.000197,0.000205,0.000207,0.000202,0.000192,0.00016,0.000121,0.00011,0.0015,0.000266,1.92e-05,4e-06,4.17e-06,1.88e-05,0.000334,0.000779,9.14e-05,9.75e-05,0.000141,0.00018,0.000198,0.000202,0.000193,0.000175,0.000138,9.53e-05,8.7e-05,0.000767,0.000342,1.94e-05,4.12e-06,4.06e-06,1.99e-05,0.000308,0.000637,5.71e-05,6.69e-05,9.74e-05,0.000142,0.000166,0.000175,0.000161,0.000138,9.67e-05,6.44e-05,5.57e-05,0.000631,0.000327,2e-05,4.06e-06,4.58e-06,1.94e-05,0.0014,0.000408,7.53e-05,4.6e-05,6.66e-05,9.87e-05,0.000127,0.000135,0.000124,9.59e-05,6.42e-05,4.55e-05,6.93e-05,0.000425,0.00145,2.01e-05,4.74e-06,4.39e-06,2.45e-05,0.00214,0.0162,0.000104,7.42e-05,5.77e-05,9.27e-05,0.000114,0.00013,0.000111,8.64e-05,5.45e-05,6.85e-05,0.000116,0.0158,0.00216,2.52e-05,4.47e-06,4.78e-06,1.7e-05,0.0131,0.171,0.0155,0.000453,0.000657,0.000783,0.00151,0.00173,0.00148,0.000735,0.000606,0.000441,0.0161,0.169,0.0131,1.81e-05,4.94e-06,3.96e-06,1.46e-05,0.000301,0.013,0.00225,0.00144,0.00034,0.000363,0.000284,0.000323,0.000286,0.000349,0.000322,0.00145,0.00224,0.0133,0.000335,1.38e-05,3.83e-06,4.04e-06,7.93e-06,1.41e-05,1.74e-05,2.66e-05,2.03e-05,2.02e-05,1.91e-05,1.86e-05,1.87e-05,1.86e-05,1.87e-05,1.95e-05,1.96e-05,2.55e-05,1.74e-05,1.39e-05,7.9e-06,4.2e-06,3.02e-06,4.31e-06,4.12e-06,4.75e-06,4.49e-06,4.75e-06,4.24e-06,4.35e-06,4.28e-06,4.25e-06,4.23e-06,4.26e-06,4.19e-06,4.66e-06,4.41e-06,4.75e-06,3.92e-06,4.34e-06,2.82e-06,3.65e-05],"winrateAvg":0.380435,"leadAvg":-1.22634,"scoreMeanAvg":-1.90655,"scoreStdevAvg":13.6699,"shorttermWinlossErrorAvg":0.0509005,"shorttermScoreErrorAvg":0.497752,"ownership":[-6,-5,-4,-4,-3,-3,-3,-2,-2,-2,-2,-2,-2,-3,-3,-4,-4,-5,-6,-5,-5,-4,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-3,-3,-3,-4,-5,-4,-4,-4,-1,-2,-1,-2,-2,-2,-2,-2,-2,-2,-2,-3,-2,-1,0,-4,-4,-3,-4,-2,0,-2,-3,-2,-2,-3,-3,-3,-2,-2,-4,-3,0,-1,-3,-4,-3,-3,-2,-2,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-2,-2,-4,-3,-2,-3,-3,-3,-1,-2,-2,-2,-2,-2,-2,-1,-1,-2,-2,-3,-3,-3,-3,-2,-3,-3,-2,-2,-2,-1,-2,-2,-2,-2,-1,-1,-2,-2,-2,-2,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-3,-2,-2,-2,-2,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-3,-2,-3,-2,-1,-2,-2,-3,-2,-2,-1,-2,-2,-2,-2,-2,-2,-2,-2,-3,-2,-3,-2,-2,-2,-2,-2,-2,-1,-1,-2,-2,-2,-2,-2,-2,-2,-2,-3,-2,-3,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-2,-3,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-2,-3,-2,-3,-3,-2,-3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-3,-3,-3,-3,-3,-3,-2,-2,-1,-1,-1,-1,-2,-2,-2,-1,-2,-1,-2,-2,-1,-3,-3,-3,-4,-2,0,-2,-3,-2,-2,-3,-3,-2,-2,-2,-4,-3,0,-1,-3,-3,-4,-3,-1,-2,-1,-3,-2,-2,-2,-2,-2,-2,-3,-3,-2,-2,0,-4,-4,-5,-5,-4,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-3,-4,-3,-4,-5,-5,-6,-4,-4,-3,-3,-3,-2,-2,-2,-1,-2,-2,-2,-3,-3,-3,-4,-4,-6],"ownershipAllowedMAE":0.019936})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...........O...XO../...O.OOO.O.....XO../..O...XX.......XO../.OXX.OX........XXO./.OOXOOX........XO../.XXO.OX.......X..O./...XOOX.........O../.X.XOXXXO........../.XOOXXOOO........../....OOX............/......X............/.....X.O.........../.X.X.............../...........X.OOOO../..O.X.X.......XXX../............X....../.................../","hintLoc":"null","initialTurnNumber":79,"metadata":"FEA6EE1402A8BC09B6AE28B42EEBFCF2:89","moveLocs":["E5","F5","E2","D3","D2","M6","F2","N8","O10","P8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.84,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.88e-06,5.4e-06,5.06e-06,5.27e-06,5.27e-06,5.2e-06,5.21e-06,5.23e-06,5.21e-06,5.33e-06,5.46e-06,5.88e-06,5.96e-06,6.09e-06,5.94e-06,6.13e-06,6.47e-06,5.64e-06,4.81e-06,5.33e-06,5.5e-06,5.6e-06,5.8e-06,5.54e-06,5.69e-06,5.69e-06,5.81e-06,5.93e-06,6.4e-06,6.76e-06,7.37e-06,1.06e-05,1.01e-05,1.4e-05,1.01e-05,8.67e-06,6.57e-06,5.54e-06,4.96e-06,5.43e-06,5.54e-06,5.38e-06,5.05e-06,5.29e-06,5.15e-06,5.34e-06,5.83e-06,6.26e-06,6.92e-06,0,9.63e-06,2.19e-05,7.65e-06,0,0,5.89e-06,5.56e-06,5.25e-06,6.6e-06,5.16e-06,0,5.34e-06,0,0,0,7.46e-06,0,7.85e-06,1.01e-05,1.41e-05,1.38e-05,6.29e-06,0,0,5.54e-06,5.66e-06,5.92e-06,5.98e-06,0,1.04e-05,7.07e-06,0.000418,0,0,0.00436,1.17e-05,1.22e-05,2.21e-05,4.79e-05,1.41e-05,6.03e-06,0,0,5.39e-06,5.22e-06,5.19e-06,0,0,0,1.96e-05,0,0,5.75e-06,6.7e-05,0.00137,0.000117,0.000118,9.59e-05,1.53e-05,6.3e-06,0,0,0,5.22e-06,6.08e-06,0,0,0,0,0,0,7.85e-06,1.59e-05,0.00911,0.000441,0.000196,0.000215,2.31e-05,6.98e-06,0,0,5.31e-06,5.23e-06,2.54e-05,0,0,0,4.93e-06,0,0,8.25e-06,1.74e-05,0.00133,0.000104,0.000197,0.000151,0.000131,0,7.9e-06,5.44e-06,0,5.11e-06,7.76e-06,9.2e-06,8.98e-06,0,0,0,0,6.87e-06,1.25e-05,0.00028,0.000222,0.000194,0.000203,3.56e-05,0.0241,2.01e-05,0,5.91e-06,5.47e-06,6.24e-06,0,0.000964,0,0,0,0,0,0,8.33e-06,0.000123,0.00126,1.57e-05,0,2.19e-05,0.0223,9.1e-06,8.48e-06,6.1e-06,6.73e-06,0,0,0,0,0,0,0,0,6.98e-06,4.84e-05,0.0013,0.000809,0.000394,0.000536,9.18e-05,4.25e-05,1.25e-05,6.72e-06,6.76e-06,0.000417,2.04e-05,0.000431,0,0,0,8.3e-06,6.84e-06,1.1e-05,3.17e-05,0.000114,0,4.25e-05,0,0.0007,0.118,7.46e-05,7.6e-06,6.66e-06,1.17e-05,0.000184,0.000204,7.81e-06,8.19e-06,0,1.7e-05,1.18e-05,1.77e-05,3.41e-05,0.000248,0.000202,0.000899,5.03e-05,0.000203,0.00313,0.00055,8.26e-06,6.27e-06,1.52e-05,1.69e-05,0.00136,3.3e-05,0,1.02e-05,0,8.88e-06,2.22e-05,0.0004,0,0.000154,4.19e-05,2.61e-05,2.22e-05,0.00015,2.35e-05,7.82e-06,6.93e-06,0,1.43e-05,0,0,0,8.97e-06,8.3e-06,1.14e-05,2.12e-05,0.00164,0.000169,0.000393,6.93e-06,6.28e-06,6.41e-06,7.53e-06,0.0137,7.76e-06,6.67e-06,0.000464,0.000558,5.28e-05,2.19e-05,1.65e-05,2.47e-05,2.97e-05,2.87e-05,1.87e-05,0.000163,0,9e-05,0,0,0,0,1.27e-05,7.59e-06,6.57e-06,1.1e-05,0,0,0,0.00323,0,0.000907,5.95e-05,3.06e-05,2.45e-05,0.000463,0.000329,0.000261,0,0,0,0.776,6.81e-06,6.37e-06,8.09e-06,5.94e-06,0,0,0,0.000251,2.26e-05,1.16e-05,1.04e-05,2e-05,0.0001,0,3.85e-05,9.06e-06,7.21e-06,6.05e-06,7.56e-06,6.42e-06,5.05e-06,5.86e-06,5.88e-06,5.02e-06,5.12e-06,5.64e-06,6.54e-06,7.17e-06,6.66e-06,6.19e-06,6.18e-06,6.1e-06,7.58e-06,6.54e-06,6.43e-06,6.32e-06,6.53e-06,6.25e-06,5.14e-06,4.75e-06],"winrateAvg":0.491103,"leadAvg":-0.269524,"scoreMeanAvg":-0.219231,"scoreStdevAvg":13.6494,"shorttermWinlossErrorAvg":0.117158,"shorttermScoreErrorAvg":0.939213,"ownership":[77,76,76,77,77,77,76,73,68,61,51,32,11,-13,-23,-20,6,14,49,76,76,77,78,80,81,80,77,73,67,62,49,16,-4,-28,-19,4,67,67,76,77,77,84,81,85,85,82,74,71,55,80,10,1,-33,-76,90,74,76,77,80,83,97,77,98,97,97,32,87,26,24,3,-7,-32,-76,90,85,81,75,77,92,28,62,-1,-94,-93,-7,-11,25,13,3,-8,-32,-76,90,86,85,60,82,-23,-25,49,73,-95,-46,-15,-2,1,7,1,-9,-34,-75,-75,91,84,2,82,81,-28,73,73,-95,-35,-16,-3,-2,4,5,-11,-42,-75,84,83,82,-16,-82,-83,-11,-11,73,-95,-36,-19,-14,-5,3,2,-4,-68,-14,34,92,74,-57,-77,-77,-83,74,74,-95,-45,-15,-32,-2,3,4,7,9,7,83,63,62,-70,-86,-69,-84,69,-95,-95,-95,25,-11,-4,-9,8,58,-6,12,21,41,42,-75,-87,-60,-63,-94,-94,28,26,27,-8,-12,-1,-15,-2,-11,-5,4,26,32,-74,-71,-72,-73,-71,-72,-95,-33,-15,-23,-18,-30,-80,-36,-73,-22,22,27,30,-72,-76,-74,-79,-83,-87,-95,-28,-27,-24,-27,-34,-35,-21,-24,-5,1,34,34,-69,-67,-73,-73,-81,-97,-47,5,-26,-29,-33,-86,-29,-13,-8,3,14,34,41,-41,-85,-63,-89,-60,-97,-46,-32,-33,-31,-33,-43,-10,9,18,27,40,59,37,-20,9,-17,-40,-68,-72,-46,-42,-33,-36,-42,-87,-1,66,66,65,67,17,27,16,25,51,-82,-82,21,-79,-38,-34,-35,-43,-45,-9,2,-86,-86,-87,16,-13,27,35,49,58,57,57,-31,-15,-31,-37,-49,-59,-87,-73,-80,-80,-72,-74,-13,41,47,51,53,46,25,10,-11,-20,-34,-47,-60,-67,-75,-76,-75,-72,-64,-47],"ownershipAllowedMAE":0.0312273,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":"................/......OOX......./..OOOOXXX.O...../..XXXX......O.X./......O........./.........X.O.X../................/...........OX.../...........OX.../...........XO.../...O............/................/................/...O........X.../.....X....O...../................/................/","hintLoc":"null","initialTurnNumber":32,"metadata":"7979DE7F3CE2543743ECDC168384A6F2:42","moveLocs":["L8","O8","P9","K9","K8","J9","J8","H9","G11","H12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.27,"xSize":16,"ySize":17},"rules":"koSITUATIONALscoreAREAtaxALLsui1button1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.76e-06,5.31e-06,4.41e-06,4.25e-06,5.22e-06,8.08e-06,1.06e-05,0.0034,4.83e-06,4.92e-06,5.22e-06,5.73e-06,4.68e-06,4.28e-06,3.83e-06,3.43e-06,5.82e-06,6.79e-06,5.54e-06,4.67e-06,1.6e-05,0.000105,0,0,0,4.6e-06,0.000317,7.03e-05,7.32e-05,8.1e-06,5.61e-06,3.72e-06,6.69e-06,0.00242,0,0,0,0,0,0,0,9.6e-06,0,9.04e-05,0.000106,3.37e-05,5.73e-06,3.81e-06,6.71e-06,0.0175,0,0,0,0,0.471,5.23e-06,6.11e-06,0.12,0.00204,0.0029,0,9.06e-06,0,3.74e-06,4.55e-06,0.000176,3.98e-06,3.77e-06,3.97e-06,9.39e-06,0,0.000352,0.0178,0.00137,0.0226,0.0257,2.43e-05,5.66e-06,5.27e-06,3.88e-06,3.97e-06,6.34e-06,8.2e-06,7.74e-06,9.46e-06,1.31e-05,3.67e-05,0,8.02e-06,0,0.000683,0,0.00555,0,4.93e-06,3.97e-06,4.31e-06,9.23e-06,4.22e-05,6.52e-05,6.14e-05,7.05e-06,0,0.175,3.67e-05,0.0588,0.000449,7.05e-05,0.00428,6.36e-06,5.97e-06,3.95e-06,4.33e-06,1.03e-05,0.000193,0.000355,5.92e-05,2.05e-05,9.96e-06,7.56e-06,6.71e-06,9.68e-05,6.25e-06,0,0,5.31e-06,5.38e-06,4.29e-06,4.17e-06,9.9e-06,6.84e-05,5.76e-05,3.39e-05,2.65e-05,1.43e-05,0,0,0,0.0298,0,0,6.49e-06,0,3.96e-06,4e-06,8.6e-06,2.46e-05,3.58e-05,2.77e-05,2.09e-05,1.54e-05,0.031,0,0,0,0,0,0,8.35e-06,4.27e-06,3.93e-06,8.35e-06,1.46e-05,0,3.96e-05,2.01e-05,9.83e-05,1.08e-05,5.42e-06,3.92e-06,4.02e-06,6.26e-06,1.4e-05,6.1e-06,5.88e-06,4.43e-06,3.92e-06,8.52e-06,1.91e-05,2.24e-05,2.45e-05,1.2e-05,1.93e-05,1.08e-05,1e-05,7.62e-06,8.15e-06,1.6e-05,0.000445,5.14e-05,7.05e-06,4.48e-06,3.98e-06,8.79e-06,1.2e-05,2.61e-05,8.84e-05,1.81e-05,1.15e-05,1.1e-05,1.25e-05,1.08e-05,2.18e-05,9.03e-05,0.000114,0.000117,1.02e-05,4.42e-06,3.92e-06,7.29e-06,1.8e-05,0,1.3e-05,6.51e-06,9.28e-06,1.67e-05,2.13e-05,2.41e-05,4.06e-05,1.64e-05,0,0.00029,1.12e-05,4.55e-06,3.87e-06,6.56e-06,1.34e-05,1.89e-05,6.39e-06,0,6.54e-06,1.36e-05,2.74e-05,8.81e-06,0,7.95e-05,0.000199,0.00245,8.96e-06,4.26e-06,3.95e-06,5.7e-06,7.05e-06,8.27e-06,7.78e-06,5.8e-06,6.34e-06,7.43e-06,8.05e-06,7.34e-06,7.3e-06,2.12e-05,2.78e-05,1.06e-05,5.92e-06,4.03e-06,3.47e-06,3.92e-06,3.97e-06,4.25e-06,3.94e-06,4.06e-06,3.8e-06,3.9e-06,4.04e-06,4.05e-06,4.1e-06,4.26e-06,4.44e-06,4.16e-06,3.9e-06,3.33e-06,4.95e-06],"winrateAvg":0.386081,"leadAvg":-0.830557,"scoreMeanAvg":-1.53222,"scoreStdevAvg":12.2348,"shorttermWinlossErrorAvg":0.102014,"shorttermScoreErrorAvg":0.778977,"ownership":[54,72,77,78,75,68,27,-47,-57,-38,-4,9,12,3,-7,-17,33,65,77,82,81,69,71,67,-82,-17,8,23,13,3,-16,-25,-5,42,84,83,83,85,-82,-82,-81,-16,59,27,26,1,-23,-37,-30,-46,-87,-87,-87,-88,-72,-36,-24,-5,12,29,65,-7,-71,-46,-40,-54,-47,-41,-34,-14,46,5,-2,15,18,23,12,-6,-52,-59,-35,-29,-19,-14,-6,-7,-3,52,10,-45,21,72,8,-81,-68,-62,-21,-19,-8,-4,-4,-4,-49,1,5,0,15,28,-19,-54,-67,-61,-7,-4,-2,2,4,8,4,19,29,25,39,66,-80,-60,-54,-55,7,7,12,12,8,12,19,76,76,76,-28,65,-79,-24,-68,-36,17,21,23,23,11,9,13,-1,-84,-84,-84,-84,9,13,-2,-22,25,26,39,77,14,5,-1,-16,-26,-34,-38,-31,-22,-11,-11,-10,27,28,33,29,6,2,-3,-10,-18,-17,-18,-24,-17,-16,-7,-7,26,27,36,32,-1,-2,-3,-6,-12,-16,-23,-32,-23,-19,-7,-5,24,25,32,75,13,-4,-2,-6,-11,-14,-25,-39,-82,-9,-5,-7,20,21,19,23,14,-53,-8,1,-8,-5,32,-22,-24,-22,-12,-9,17,14,12,6,-1,-19,-13,-5,-2,3,8,-4,-8,-13,-12,-11,15,12,8,4,-5,-11,-10,-5,-1,3,4,-1,-6,-10,-11,-11],"ownershipAllowedMAE":0.038282})%"); + lines.push_back(R"%({"sample":{"board":"......X.X.X..../....O.OXOXO.O../...OX.OX.X.O.../...O.OX.X.OO.../.X.OXOOX..XXOO./..XXOO.OX.XOOX./...O.O.O.XOOOX./..XOOXOOOOXOX../..XOXXXXXXXX.../..XOOX...O..O../...XOO....XOX../...XXO.....XX../...XOO...O...../...X.....XX..../.............../","hintLoc":"null","initialTurnNumber":102,"metadata":"EA87CDBAC2AC28CEBB3718120152BA2F:112","moveLocs":["K12","H12","M15","N15","G12","C9","H12","B9","O8","A6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.605,"pda":-0.867,"policyMixture":[2.57e-06,3.99e-06,4.52e-06,9.73e-06,0.00299,1.63e-05,0,3.78e-06,0,4.78e-06,0,0,0,3.8e-06,2.63e-06,3.46e-06,4.47e-06,0.000234,0.00769,0,0.00113,0,0,0,0,0,3.55e-06,0,5.94e-06,4.46e-06,3.29e-06,5.72e-06,7.56e-06,0,0,1.45e-05,0,0,2.92e-06,0,8.42e-05,0,3.41e-06,0.307,1.47e-05,3.14e-06,4.11e-06,4.05e-06,0,3.08e-06,0,0,0,0,0,0,0,1.45e-05,0.0409,1.3e-05,3.46e-06,0,3.55e-06,0,0,0,0,0,2.31e-06,2.78e-06,0,0,0,0,0.00165,4.92e-06,3.75e-06,0,0,0,0,3.04e-06,0,0,2.94e-06,0,0,0,0,6.19e-05,5.15e-06,0,0,0,0,0,3.04e-06,0,2.25e-06,0,0,0,0,0,3.15e-06,0.000401,0.0581,0,0,0,0,0,0,0,0,0,0,0,0,2.55e-06,0.34,0.0184,0,0,0,0,0,0,0,0,0,0,3.24e-06,3.27e-06,2.98e-06,0,0.0354,0,0,0,0,3.22e-06,3.26e-06,3.36e-06,0,2.99e-06,3.49e-06,0,3.11e-06,2.75e-06,0.000269,0.166,5.16e-06,0,0,0,4.55e-06,5.14e-06,4.05e-06,3.68e-06,0,0,0,2.98e-06,2.7e-06,3.51e-05,0.0127,3.61e-06,0,0,0,4.86e-06,5.76e-05,2.26e-05,4.02e-06,3.43e-06,0,0,2.62e-06,2.61e-06,5.49e-06,2.19e-05,3.26e-06,0,0,0,5.21e-06,0.00694,0.000131,0,3.64e-06,2.7e-06,2.57e-06,2.6e-06,2.47e-06,3.86e-06,6.04e-06,3.2e-06,0,1.05e-05,4.77e-06,3.37e-05,5.36e-05,6.91e-06,0,0,2.78e-06,2.73e-06,2.62e-06,2.6e-06,2.69e-06,3.42e-06,3.06e-06,3.3e-06,4.6e-06,4.38e-06,4.26e-06,3.77e-06,3.33e-06,2.75e-06,2.69e-06,2.73e-06,2.55e-06,2.55e-06,2.51e-06,7.86e-06],"winrateAvg":0.10896,"leadAvg":-2.07855,"scoreMeanAvg":-2.44907,"scoreStdevAvg":5.7445,"shorttermWinlossErrorAvg":0.203581,"shorttermScoreErrorAvg":1.46887,"ownership":[89,86,83,61,5,-12,-74,-75,-98,-95,-97,-88,86,82,75,89,88,87,85,96,56,95,-100,-98,-100,27,16,85,64,71,90,90,92,100,91,95,95,-99,-99,-99,-53,86,80,64,69,91,92,94,100,98,100,-99,-100,-100,-100,86,86,86,82,59,92,90,96,100,98,100,100,-100,-98,-98,-98,-98,89,88,7,94,96,93,93,100,100,99,99,-98,-98,-98,88,89,-98,-48,93,100,100,100,100,100,99,99,61,-97,89,89,88,-98,-78,87,-14,-89,100,100,-99,100,99,99,99,-100,89,-98,-98,-92,57,22,-89,100,-99,-99,-100,-100,-100,-100,-100,-100,-97,-97,-96,56,-70,-89,100,100,-99,-33,-27,-29,18,-42,-98,-95,-97,-97,-17,-77,-89,-93,100,100,17,20,3,-7,-98,-94,-100,-98,-98,-62,-77,-86,-93,-92,100,57,48,25,-1,-39,-100,-100,-99,-98,-76,-86,-88,-93,100,100,50,15,60,61,20,-94,-98,-98,-98,-82,-86,-88,-93,28,59,21,4,-61,-97,-97,-96,-97,-98,-98,-84,-86,-86,-50,-8,25,12,-20,-50,-67,-91,-96,-97,-98,-98],"ownershipAllowedMAE":0.0330032})%"); + lines.push_back(R"%({"sample":{"board":"..............X.../.O....X......X.X../.OX.X.O.......XO../.XOOX....X..X.O.../....X.O........O../..OOXXO.X.....XO../.OXXOOXXXO.....X../.X....O.O....OOO../.....O.O....XX..../...X..X......OXX../.XO...........OX../.X............OOO./.OXX..........OXX./.OOX.........XXO../..OOX...X....XOO../..OXX.......XOX.../.OXO.........OO.../................../","hintLoc":"null","initialTurnNumber":93,"metadata":"F0E53CD2FA39826962FC8EB4385667FC:103","moveLocs":["K13","J14","F17","H11","G10","J10","H9","J9","H8","F16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.81,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":-3.5,"policyOptimism":0.457,"pda":0.0,"policyMixture":[3.25e-06,3.6e-06,4.32e-06,4.16e-06,4.13e-06,4.24e-06,2.31e-05,3.65e-06,3.13e-06,3.38e-06,3.27e-06,3.33e-06,3.32e-06,3.37e-06,0,3.39e-06,3.37e-06,3.05e-06,3.16e-06,0,5.32e-06,5.58e-06,0.0532,0,0,0.546,4.16e-06,4.42e-06,4.52e-06,4.51e-06,4.86e-06,0,0,0,4.51e-06,3.36e-06,3.1e-06,0,0,4.65e-05,0,0,0,0.00479,7.74e-06,4.9e-06,5.32e-06,4.61e-06,3.96e-05,7.24e-05,0,0,5.97e-06,3.72e-06,4.25e-06,0,0,0,0,6.69e-06,4.1e-05,0.000156,2.44e-05,0,4.87e-06,5.28e-06,0,1.73e-05,0,3.9e-06,4.85e-06,3.61e-06,3.91e-06,0.00282,4.37e-06,4.38e-06,0,3.88e-06,0,4.2e-06,0,6.18e-06,4.51e-06,5.77e-06,1.05e-05,7.03e-06,4.92e-06,0,3.81e-06,3.72e-06,5.33e-06,0.00256,0,0,0,0,0,3.06e-06,0,0,3.81e-06,6.14e-06,1.48e-05,4.25e-05,0,0,4.58e-06,3.84e-06,5.22e-06,0,0,0,0,0,0,0,0,0,4.46e-06,8.81e-06,1.1e-05,4.68e-06,2.76e-05,0,8.29e-06,3.93e-06,4.52e-06,0,0.000688,0.000282,7.58e-05,4.31e-06,0,0,0,0.278,5.78e-06,7.16e-06,6.26e-05,0,0,0,5.31e-06,4.04e-06,3.91e-06,1.36e-05,0.00493,0.069,1.19e-05,0,0,0,0,4.64e-06,7.57e-06,9.11e-06,0,0,0.000235,4.09e-06,5.9e-06,3.98e-06,3.73e-06,6.95e-06,0.0323,0,0.000185,4.71e-06,0,0,0,4.12e-06,1.18e-05,1.81e-05,0.000232,0,0,0,4.24e-06,3.97e-06,3.92e-06,0,0,0.000728,4.76e-05,5.74e-06,4.53e-06,0,0.000248,9.33e-06,1.41e-05,4.23e-05,4.49e-05,2.17e-05,0,0,5e-06,4.29e-06,4.28e-06,0,1.36e-05,5.52e-06,8.17e-05,1.23e-05,6.68e-06,5.68e-06,2.53e-05,4.22e-05,2.28e-05,2.37e-05,2.36e-05,4.21e-06,0,0,0,4.16e-06,3.55e-06,0,0,0,9.59e-06,3.02e-05,5.05e-05,8.34e-05,3.53e-05,2.4e-05,1.52e-05,9.97e-06,1.16e-05,5.7e-06,0,0,0,4.4e-06,3.21e-06,0,0,0,8.05e-05,0.000242,0.000114,0.000633,9.98e-05,3.23e-05,1.6e-05,1.39e-05,6.05e-06,0,0,0,4.42e-06,3.59e-06,3.38e-06,3.44e-06,0,0,0,6.2e-06,3.97e-05,7.48e-05,0,2.24e-05,1.38e-05,1.27e-05,9.23e-06,0,0,0,3.4e-06,3.48e-06,3.23e-06,3.24e-06,0,0,0,5.33e-06,4.62e-05,1.93e-05,1.09e-05,7.18e-06,1.07e-05,6.27e-06,0,0,0,3.22e-06,3.53e-06,3.29e-06,3.36e-06,0,0,0,8.81e-05,5.19e-06,6.34e-06,6.18e-06,5.89e-06,5.8e-06,5.58e-06,5.42e-06,5.7e-06,0,0,3.65e-06,3.51e-06,3.24e-06,3.08e-06,3.23e-06,3.78e-06,3.55e-06,3.52e-06,3.46e-06,3.56e-06,3.45e-06,3.4e-06,3.41e-06,3.58e-06,3.7e-06,3.42e-06,3.05e-06,3.03e-06,3.27e-06,3.29e-06,3.03e-06,7.81e-06],"winrateAvg":0.613233,"leadAvg":1.01928,"scoreMeanAvg":1.50822,"scoreStdevAvg":11.7773,"shorttermWinlossErrorAvg":0.193,"shorttermScoreErrorAvg":1.47348,"ownership":[68,56,36,1,-5,7,17,8,-4,-20,-34,-46,-60,-72,-79,-70,-59,-46,72,81,6,-22,-23,15,4,15,-11,-26,-36,-46,-56,-81,-61,-77,-44,-35,75,80,-38,-26,-93,-91,11,-20,-28,-43,-33,-41,-46,-32,-65,25,-21,-15,72,66,74,68,-93,-84,-88,-83,-68,-94,-35,-32,-82,-19,64,21,22,9,51,70,54,-48,-94,-85,-77,-85,-96,-32,-20,-10,-18,-4,37,74,41,31,17,1,69,67,-93,-93,-76,-89,-96,32,-6,-1,1,34,10,75,50,39,-37,2,-77,-77,58,58,-97,-96,-96,33,0,-1,17,40,61,13,22,34,-47,-76,-58,-17,2,60,81,-96,22,23,-14,-11,12,83,82,82,30,19,-60,-58,-60,5,19,80,79,80,-70,-10,-48,-33,-71,-71,-10,7,10,6,-63,-61,-40,-73,6,33,16,80,-72,-31,-38,-25,-28,14,-49,-50,-21,-9,-56,-76,-9,-30,-1,19,41,81,-9,-19,-25,-11,6,0,90,-50,-22,14,2,-75,-57,-38,0,7,18,26,9,-12,-15,-9,18,32,89,89,89,58,27,94,-84,-83,-22,0,14,16,3,-8,-9,-6,11,17,89,77,74,75,86,93,94,-83,-39,1,5,9,-6,-10,-10,-9,-4,-40,-42,95,85,83,91,93,93,93,-74,-20,-13,-16,-72,-24,-16,-10,-12,-40,95,95,84,86,92,92,93,-72,-74,-29,-20,-29,-39,-27,-15,-5,-35,92,87,88,90,88,91,92,39,40,-6,-25,-22,-29,-30,-23,-11,5,18,92,92,87,89,89,89,84,68,14,-14,-22,-25,-28,-27,-20,-6,10,32,49,79,87,88,88],"ownershipAllowedMAE":0.0506206})%"); + lines.push_back(R"%({"sample":{"board":".............X...../...X........X.XOO../.....X.......XOXX../...O.........XOOO../..XXX............../..OOX.X............/...XOXOXX........../..O.O.OOX....X...../.OX.O...O........../.O.XX..O.........../..O................/..XO....X........../...XO..X.X........./...XOXXOX........../....OOOO.......X.../...XOX...XO.....X../..OO..........O..../.................../.................../","hintLoc":"null","initialTurnNumber":73,"metadata":"792AEF103C307282D94F5C611CB92551:83","moveLocs":["K5","J5","J4","K3","K6","J7","J3","L3","M4","N3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.8,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":-7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.01e-05,3.11e-05,3.02e-05,3.13e-05,3.05e-05,3.09e-05,3.04e-05,3.07e-05,3.09e-05,3.11e-05,3.2e-05,3.18e-05,3.2e-05,0,4.53e-05,3.21e-05,3.16e-05,3.14e-05,2.95e-05,3.12e-05,3.26e-05,3.4e-05,0,3.51e-05,3.48e-05,3.4e-05,3.42e-05,3.42e-05,3.51e-05,3.61e-05,3.6e-05,0,0,0,0,0,3.66e-05,3.12e-05,3.17e-05,3.46e-05,3.32e-05,3.48e-05,3.46e-05,0,3.61e-05,3.47e-05,3.54e-05,3.59e-05,3.79e-05,3.92e-05,3.54e-05,0,0,0,0,3.87e-05,3.58e-05,3.24e-05,4.23e-05,3.62e-05,0,3.53e-05,3.47e-05,3.43e-05,3.51e-05,3.53e-05,3.66e-05,3.8e-05,3.81e-05,4.13e-05,0,0,0,0,3.7e-05,3.37e-05,3.3e-05,0.000185,0,0,0,5.64e-05,4.18e-05,3.63e-05,3.78e-05,3.8e-05,3.84e-05,3.97e-05,0.000174,0.00028,4.06e-05,3.27e-05,3.74e-05,4.06e-05,3.3e-05,3.47e-05,0.00019,0,0,0,0.000172,0,4.21e-05,3.9e-05,3.95e-05,3.97e-05,4.05e-05,8.35e-05,7.28e-05,0.000179,4.68e-05,5.07e-05,4.02e-05,3.3e-05,3.39e-05,3.64e-05,3.41e-05,0,0,0,0,0,0,3.9e-05,4.11e-05,4.1e-05,4.3e-05,5.75e-05,5.15e-05,4.44e-05,4.62e-05,4.06e-05,3.38e-05,3.32e-05,3.25e-05,0,3.33e-05,0,3.89e-05,0,0,0,9.59e-05,4.77e-05,4.44e-05,7.44e-05,0,5.87e-05,6.11e-05,4.88e-05,4.26e-05,3.43e-05,3.13e-05,0,0,3.31e-05,0,3.29e-05,3.22e-05,3.25e-05,0,0.000138,0.000282,0.000114,0.000116,8.76e-05,4.89e-05,7.72e-05,6.94e-05,4.27e-05,3.43e-05,3.03e-05,0,3.56e-05,0,0,3.52e-05,3.7e-05,0,3.38e-05,4.94e-05,0.000246,0.000254,0.000142,7.57e-05,6.14e-05,0.000108,0.000111,4.3e-05,3.43e-05,3.05e-05,3.18e-05,0,3.43e-05,3.51e-05,3.72e-05,3.97e-05,3.88e-05,3.8e-05,0.000136,0.000272,0.000317,0.000202,0.000129,8.64e-05,0.000123,0.000132,4.32e-05,3.43e-05,3.03e-05,3.04e-05,0,0,3.44e-05,3.65e-05,4.24e-05,3.17e-05,0,3.5e-05,0.000413,0.000429,0.000308,0.000192,0.000147,0.000153,0.000167,4.36e-05,3.42e-05,3.06e-05,3.02e-05,3.2e-05,0,0,3.41e-05,3.75e-05,0,0,0,0.00363,0.000746,0.000396,0.000281,0.000248,0.000176,0.000159,4.46e-05,3.46e-05,3e-05,3.11e-05,3.03e-05,0,0,0,0,0,0,0,0.000874,0.046,0.000438,0.000431,0.000347,0.000297,0.000183,4.37e-05,3.48e-05,2.96e-05,3.01e-05,3.08e-05,3.11e-05,0,0,0,0,0,0,0.000205,0.000138,0.000697,0.000855,0.00142,0,0.000119,0.000109,3.54e-05,2.95e-05,3.02e-05,3.09e-05,0,0,0,3.29e-05,3.31e-05,0,0,0,0,0.538,0.00103,0.000238,0.000308,0,0.000188,3.63e-05,3.01e-05,3.06e-05,0,0,3.27e-05,3.23e-05,3.28e-05,3.28e-05,0,0,0,0.387,0,7.36e-05,0,7.62e-05,0.000411,0.000165,3.67e-05,2.97e-05,2.99e-05,3.08e-05,3.14e-05,3.25e-05,3.24e-05,3.28e-05,3.63e-05,0.000133,0.000243,9.37e-05,3.74e-05,9.25e-05,7.73e-05,4.57e-05,7.66e-05,9.99e-05,5.49e-05,3.64e-05,2.97e-05,2.98e-05,3.03e-05,3.07e-05,3.11e-05,3.14e-05,3.19e-05,3.39e-05,3.71e-05,3.92e-05,3.91e-05,3.86e-05,3.76e-05,3.79e-05,3.71e-05,3.55e-05,3.48e-05,3.51e-05,3.1e-05,2.81e-05],"winrateAvg":0.0672205,"leadAvg":-5.87062,"scoreMeanAvg":-7.84282,"scoreStdevAvg":11.8968,"shorttermWinlossErrorAvg":0.113957,"shorttermScoreErrorAvg":2.34646,"ownership":[-78,-83,-88,-91,-93,-92,-89,-86,-83,-83,-85,-88,-92,-95,-29,22,58,63,71,-72,-77,-84,-98,-93,-93,-89,-86,-84,-83,-85,-86,-97,-93,-92,80,79,77,78,-62,-70,-80,-85,-90,-99,-86,-84,-83,-82,-79,-73,-80,-96,89,77,77,77,79,-49,-68,-83,-76,-87,-85,-84,-82,-80,-77,-72,-66,-64,-95,89,88,90,78,73,-21,-52,-99,-99,-99,-80,-82,-81,-76,-69,-62,-55,-51,-36,-31,22,41,61,50,-2,0,22,24,-99,-54,-95,-84,-70,-56,-50,-43,-35,-26,2,10,19,16,30,29,17,19,18,93,-54,90,-93,-93,-48,-33,-30,-28,-26,-14,-5,-1,10,11,63,68,92,72,94,55,90,89,-93,-16,-17,-21,-23,-79,-21,-11,-5,0,2,82,97,33,54,93,59,50,76,81,9,10,-13,-14,-20,-15,-11,-9,-5,-4,88,97,60,12,10,35,31,86,29,10,-14,-17,-16,-15,-12,-10,-9,-9,-8,88,86,95,69,44,29,14,6,-9,-6,-22,-21,-18,-13,-11,-11,-11,-13,-11,85,87,83,94,37,16,7,-29,-73,-43,-25,-21,-14,-9,-9,-13,-14,-18,-17,85,85,86,83,99,48,-21,-74,-72,-73,-19,-9,-4,-2,-5,-16,-21,-26,-25,86,86,87,83,100,-12,-18,99,-73,41,2,5,7,2,-6,-25,-28,-36,-34,88,88,88,92,100,100,100,99,-73,43,31,26,10,2,-8,-80,-53,-47,-45,90,91,91,86,100,65,85,90,93,-42,72,76,63,-2,-12,-34,-84,-60,-48,91,93,99,99,83,72,64,63,91,-39,-36,38,-38,-11,27,-22,-37,-48,-46,92,93,93,90,78,64,55,57,7,-9,-25,-35,-15,-18,-5,-19,-27,-38,-42,91,91,89,83,72,59,45,27,13,-4,-16,-18,-19,-13,-11,-15,-26,-32,-38],"ownershipAllowedMAE":0.0302193})%"); + lines.push_back(R"%({"sample":{"board":"....O..X.........../..XO.OX.XOO...OO.../...XOOXXO.OX.XX..../..XXXXO.O.OX...OO../..XOXOO.O.OX....X../..OOXOXXOOO.O.OOX../.....XO........X.../....X.O............/..OOOO.X.....O..X../..XXX.......XOX..../..XO..X.....OXOOO../.............XOXXX./............OXXOOX./............OOX.O../..XX......XX.XOO.O./..OX.X...OXO.XXXOO./..OOXXO.XXOXOOOOXX./..O.OXO.OOOXXXXX.../...O.............../","hintLoc":"null","initialTurnNumber":148,"metadata":"FA9167BE2B9C352509A5ACA5589F1DB5:158","moveLocs":["N8","S9","M9","S6","S16","S17","S15","T16","T15","T17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.11,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":-0.865,"policyMixture":[7.68e-06,8.42e-06,2.16e-05,8.16e-06,0,1.51e-05,0.0079,0,6.51e-06,8.19e-06,8.82e-06,7.93e-06,8.08e-06,8.65e-06,9.48e-06,1.06e-05,2.99e-05,5.61e-05,7.92e-06,8.88e-06,9.69e-06,0,0,0,0,0,6.39e-06,0,0,0,8.06e-06,8.33e-06,1.09e-05,0,0,0.000202,0.000414,0.000106,7.98e-06,9.14e-06,7.98e-06,0,0,0,0,0,0,7.08e-06,0,0,8.13e-06,0,0,0.000167,0.000587,0,0,8.68e-06,8.79e-06,0,0,0,0,0,1.25e-05,0,6.98e-06,0,0,7.8e-06,8.35e-06,1.11e-05,0,0,0,0,9.39e-06,1.07e-05,0,0,0,0,0,1.03e-05,0,7.24e-06,0,0,9.07e-06,1.12e-05,1.06e-05,0.000847,0,0,0,8.84e-06,1.8e-05,0,0,0,0,0,0,0,0,0,0.00196,0,1.24e-05,0,0,0,7.79e-06,7.61e-06,8.93e-06,1.35e-05,1.19e-05,1.54e-05,9.65e-06,0,0,1.77e-05,1.44e-05,1.02e-05,1.26e-05,0.00197,0.00407,0.00107,0.0001,0,1.84e-05,4.66e-05,9.97e-06,8.69e-06,1.49e-05,1.26e-05,1.19e-05,0,9.17e-06,0,0.000294,0.0776,0.000236,0.00249,0.103,0.061,0.191,0.000105,6.16e-05,1.1e-05,1.89e-05,8.71e-06,8.74e-06,1.38e-05,0,0,0,0,2.38e-05,0,1.4e-05,8.09e-05,5.97e-05,2.91e-05,0.00298,0,0.000338,1.15e-05,0,1.07e-05,1.04e-05,9.25e-06,1.09e-05,0,0,0,1.01e-05,1.02e-05,1.04e-05,1.25e-05,1.5e-05,1.28e-05,8.99e-06,0,0,0,0.000672,4.23e-05,0.113,4.29e-05,8.75e-06,9.48e-06,0,0,8.66e-06,9.09e-06,0,1.12e-05,1.18e-05,1.22e-05,1.05e-05,0,7.43e-06,0,0,0,0,0,1.24e-05,8.08e-06,9.32e-06,8.84e-06,8.99e-06,9.18e-06,9.39e-06,9.68e-06,1.07e-05,1.13e-05,1.11e-05,1.01e-05,8.25e-06,0,0,0,0,0,0,9.49e-06,8.1e-06,9.53e-06,9.61e-06,9.52e-06,9.62e-06,1.02e-05,1.08e-05,1.16e-05,1.16e-05,1.07e-05,9.83e-06,9.39e-06,0,0,0,0,0,0,7.77e-06,8.75e-06,1.17e-05,9.02e-06,8.84e-06,9.31e-06,1.11e-05,1.3e-05,1.61e-05,1.64e-05,1.05e-05,9.49e-06,8.5e-06,0,0,0,8.12e-06,0,0,7.69e-06,1.03e-05,6.33e-05,0,0,8.39e-06,1.03e-05,2.16e-05,0.00925,0.000206,2.73e-05,0,0,8.05e-06,0,0,0,0,0,7.4e-06,8.77e-06,2.81e-05,0,0,8.12e-06,0,0.00638,0.0529,0.304,0,0,0,7.69e-06,0,0,0,0,0,8.8e-06,8.44e-06,9.59e-06,0,0,0,0,0,0.0253,0,0,0,0,0,0,0,0,0,0,9.11e-06,8.34e-06,8.46e-06,0,0,0,0,0,1.78e-05,0,0,0,0,0,0,0,0,8.89e-06,8.32e-06,8.47e-06,7.12e-06,7.95e-06,8.13e-06,0,8.31e-06,0.0118,0.00471,0.0117,9.35e-06,7.67e-06,8.46e-06,8.06e-06,7.94e-06,7.59e-06,7.48e-06,7.37e-06,7.6e-06,8.26e-06,7.86e-06,8.94e-06],"winrateAvg":0.554062,"leadAvg":0.942544,"scoreMeanAvg":0.9248,"scoreStdevAvg":9.82221,"shorttermWinlossErrorAvg":0.246558,"shorttermScoreErrorAvg":1.63383,"ownership":[-69,-69,-60,-57,-38,-42,-41,-42,28,75,92,88,81,81,85,89,89,88,86,-68,-69,-81,-44,-48,-42,-43,-21,-21,100,100,80,77,76,95,94,88,85,85,-63,-68,-79,-89,-45,-42,-43,-42,100,98,100,62,72,65,63,79,86,88,87,-45,-74,-90,-90,-89,-89,98,34,100,98,100,62,73,75,78,94,93,-68,88,-22,-19,-90,68,-91,97,98,82,100,98,100,63,75,76,78,-19,-70,-68,-66,15,14,69,68,-91,97,55,53,100,100,100,68,87,46,92,90,-68,-60,-58,33,43,48,14,-70,-69,86,55,26,39,37,35,28,13,24,-53,-48,-49,-52,36,39,53,10,-73,47,87,17,-23,0,3,-11,-1,-8,0,-7,-46,-44,-44,19,16,89,88,88,88,13,-65,-21,-2,-10,-14,9,51,5,-20,-71,-45,-36,-19,-26,-95,-95,-94,21,-10,-32,-27,-20,-15,-35,-77,50,-31,-8,-21,-42,0,-45,-73,-95,-58,-74,-63,-91,-44,-36,-38,-45,-93,-77,-92,96,97,96,96,47,-58,-67,-68,-69,-63,-59,-54,-47,-44,-47,-60,-74,-93,-92,96,93,94,94,95,-56,-57,-69,-65,-61,-56,-51,-47,-45,-50,-60,-75,-66,-92,-92,98,98,94,96,-45,-72,-72,-70,-60,-56,-49,-40,-44,-52,-67,-77,-65,-67,-92,12,98,97,93,-16,-20,-95,-95,-65,-54,-41,-31,-30,-57,-98,-98,-82,-97,70,86,83,97,82,28,26,87,-95,-83,-87,-2,7,-21,-18,-99,-94,-97,-97,-98,-98,97,97,33,55,72,88,87,-87,-87,87,40,-26,-25,82,-100,-95,-95,-95,-94,-98,-98,27,69,82,88,80,84,-87,88,71,84,84,83,-100,-100,-100,-100,-100,-95,-66,-64,77,81,84,86,69,51,64,79,79,69,-5,-13,-86,-96,-97,-96,-92,-86,-69],"ownershipAllowedMAE":0.0306897})%"); + lines.push_back(R"%({"sample":{"board":".............XO./.XOOOOO..OXX.XO./.XXOX.X.O..XXOO./...XX....OXX.XOX/.........OXOXXXX/XXX....O.OXOOOOO/.OOXXXXXO.O...../OX.OO..O.OOOX.X./.OO.XOX.O.XXXX../OO.OXX.X....OOX./OX.OX.XOO.X...../XX.O.XO..O...OX./X.XOOXOOO..OO.X./.X.OXXO....OXX../.XOOXO.O...OOX../X.X...O........./","hintLoc":"null","initialTurnNumber":139,"metadata":"62AA51FA3D92A96C3A385B6D5079D2A3:149","moveLocs":["F9","G9","G12","G13","O1","P1","N1","P2","H13","F12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":16,"ySize":16},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":5.5,"policyOptimism":0.788,"pda":0.0,"policyMixture":[1.53e-05,0.000122,1.94e-05,1.76e-05,1.86e-05,1.8e-05,1.8e-05,2.05e-05,2.65e-05,0.0128,0.0353,0.000203,0.128,0,0,1.64e-05,1.53e-05,0,0,0,0,0,0,2.29e-05,2.28e-05,0,0,0,0.00298,0,0,0.0128,1.71e-05,0,0,0,0,0.00802,0,3.02e-05,0,3.65e-05,0.000146,0,0,0,0,0.392,1.76e-05,1.99e-05,2.12e-05,0,0,2.66e-05,0,0,2.06e-05,0,0,0,0,0,0,0,1.76e-05,1.82e-05,1.79e-05,1.74e-05,1.57e-05,0,0,2.72e-05,2.03e-05,0,0,0,0,0,0,0,0,0,0,1.73e-05,1.68e-05,2.03e-05,0.391,0,1.95e-05,0,0,0,0,0,0,0,1.86e-05,0,0,0,0,0,0,0,0,1.98e-05,0,2.49e-05,2.21e-05,0.000173,2.46e-05,2.46e-05,0,0,1.75e-05,0,0,0,0,0,1.82e-05,0,0,0,0,1.56e-05,0,0.00112,1.48e-05,0,0,3.46e-05,0,0,0,2.46e-05,0,2.08e-05,0,0,0,0,3.59e-05,9.65e-05,0,0,2.2e-05,0,0,0,0,0,2.49e-05,0.0001,6.33e-05,0.00165,0,0,0,0.000105,0,0,2.13e-05,0,0,0,0,0,0,2.06e-05,0,6.09e-05,1.87e-05,0.000105,0.00159,2.13e-05,0,0,0.00112,0,0.00235,0,0,1.98e-05,1.97e-05,0,0.000139,1.99e-05,2e-05,0,0,2.32e-05,0,0,0,0,0,0,0,0,0,2.09e-05,1.88e-05,0,0,2.18e-05,0,1.93e-05,3.39e-05,0,0.00172,0,0,0,0,1.97e-05,1.85e-05,1.86e-05,1.81e-05,0,0,0,1.66e-05,1.77e-05,5.46e-05,0,0,0,0,0,2.04e-05,0,1.9e-05,1.95e-05,1.87e-05,0,0,0,0,1.74e-05,0,0,0,0.00124,0.0027,2.18e-05,0,1.87e-05,1.89e-05,1.85e-05,1.89e-05,1.77e-05,0,0,0,1.65e-05,9.74e-06],"winrateAvg":0.636483,"leadAvg":0.472252,"scoreMeanAvg":0.705862,"scoreStdevAvg":2.19141,"shorttermWinlossErrorAvg":0.306683,"shorttermScoreErrorAvg":0.579097,"ownership":[-71,-39,-35,82,96,98,99,98,98,79,59,-97,-98,-99,-99,-99,-79,-100,99,99,99,99,99,98,98,99,-99,-100,-99,-100,-99,-99,-99,-100,-100,99,-100,68,-99,-51,100,67,-9,-100,-100,-99,-99,-99,-99,-99,-99,-100,-100,-97,-99,99,99,100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-99,-98,-99,99,99,99,100,-99,99,-99,-100,-100,-100,-100,-100,-100,-100,-99,62,97,100,99,100,-99,99,99,99,100,99,-28,99,99,-100,-100,-100,-100,-100,100,100,100,98,-12,-9,-21,21,99,99,99,100,99,99,-100,80,81,100,100,100,-100,-74,-100,-14,99,100,100,15,-100,99,-100,6,99,26,-100,-100,-100,-100,-99,-96,100,100,77,100,-100,-100,-99,-99,19,7,-70,-13,98,98,-99,-99,100,-99,-10,100,-100,-98,-100,100,100,26,-97,-26,54,54,15,-99,-99,-99,-39,100,19,-99,100,100,100,100,-88,4,71,99,-100,-99,-99,-99,-99,100,100,-99,100,100,100,99,99,100,100,-16,-100,-100,-99,-99,-27,100,-99,-99,100,100,100,99,99,100,-100,-100,-100,-100,-99,-100,100,100,-98,96,96,100,99,100,100,100,100,-100,-100,-100,-98,-78,-82,69,2,59,98,98,99,100,100,100,100,100,-100,-100],"ownershipAllowedMAE":0.0205417})%"); + lines.push_back(R"%({"sample":{"board":"OX...O...OX.X....../OXX.OXOOOXX.X....../OOXXX.XXOX.X...X.../.OOOXXX.X..X.XXXX../OOO.OOX..XXX.XOOXX./O.OOO.OXX.X.XXXOOXX/...OXOOXXXXXXOOO.OX/O.OOX.OXOOOOXOXOO.O/O.OXXOOXXOXXXXXXOO./.OOOOXOXOOOOOX.XO.O/.XOXXXXXOXOXOOXXOOO/.OXOXOXXOXXXOOOXXOX/.X.OOOX.XXXOOOXXXXX/OOOOXX.XXXOOXOOXXOX/O...OX.XOXXXXXOOOOO/O.OOOXXOOOOXOO.OOO./O...OXOOO..OO..O..O/....OXXO.OO.O.O..O./.OO.OOOO..O..OOOO../","hintLoc":"null","initialTurnNumber":352,"metadata":"01A524F779DFA1AB2C67F6028529A36E:362","moveLocs":["J19","A9","G19","C7","H19","A7","E19","F12","D18","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":7.0,"policyOptimism":0.596,"pda":0.0,"policyMixture":[0,0,0.0116,0.0203,0,0.0205,0,0,0,0.0209,0,0.026,0,0.00142,0.00128,0.00125,0.00124,0.00122,0.0012,0,0,0,0,0.0187,0,0.0216,0.0252,0.0283,0,0,0.0266,0,0.00812,0.00143,0.00249,0.00137,0.00129,0.00121,0,0,0,0,0,0.0176,0,0,0.0271,0,0.0227,0,0.0367,0.0128,0.0112,0,0.0115,0.00144,0.00125,0,0,0,0,0,0,0,0.0243,0,0.0275,0.0137,0,0.0145,0,0,0,0,0.011,0.00136,0,0,0,0,0,0,0,0.0277,0.0256,0,0,0,0.0125,0,0,0,0,0,0.01,0,0.00117,0,0,0,0,0,0,0,0.0104,0,0.00832,0,0,0,0,0,0,0,0.00117,0.00402,0.00115,0,0.00124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00118,0,0,0.00121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00124,0,0.0012,0.00119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0906,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00123,0.00121,0.00118,0,0,0.0415,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0012,0,0,0,0,0,0,0,0,0,0,0,0,0.00122,0,0,0,0,0,0.00143,0.00144,0.00117,0,0,0,0,0,0.00127,0.00128,0,0,0.00125,0.00123,0,0.00176,0.00137,0,0.00119,0.00174,0.00284,0.00147,0,0,0,0,0.00121,0,0,0.00124,0,0.00122,0,0.00123,0.00131,0,0.00124,0.00121,0,0,0.0012,0,0,0,0,0.00119,0.00118,0,0.0012,0.0012,0,0,0,0,0.00122,0.00117,0.201],"winrateAvg":0.999996,"leadAvg":40.0653,"scoreMeanAvg":40.0889,"scoreStdevAvg":0.745845,"shorttermWinlossErrorAvg":0.00044064,"shorttermScoreErrorAvg":0.458382,"ownership":[100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,-100,100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,100,-100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,100,-100,100,100,-100,-100,100,100,100,100,100,100,100,-100,100,-100,-100,100,-100,-100,-100,100,100,100,-100,-100,100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,100,100,-100,-100,100,-100,100,100,100,100,100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.000681489})%"); + lines.push_back(R"%({"sample":{"board":".................../............X....../.X.XXX..O...OXOXX../.OX.O..X.....OOOO../..OO..O..........O./................X../..X.O..O.........../......X............/..X.X.X.O........../...O..O............/..O..O.........XXX./..O...........XOOX./..XO.............O./.X...........O...../...O........XO.O.../..XO.X...X...XX.O../..X.OX.........XO../..XO.OX.........XO./.................../","hintLoc":"null","initialTurnNumber":45,"metadata":"B5626A8493D6CB1B722AE80490AAA76C:55","moveLocs":["E12","G13","B10","B9","B15","B14","A16","B13","C14","C12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0button1","komi":-14.5,"policyOptimism":0.507,"pda":0.0,"policyMixture":[1.46e-06,1.5e-06,1.44e-06,1.43e-06,1.4e-06,1.47e-06,1.52e-06,1.53e-06,1.58e-06,1.58e-06,1.63e-06,1.61e-06,1.59e-06,4.2e-06,1.73e-06,1.79e-06,1.68e-06,1.7e-06,1.51e-06,1.47e-06,1.52e-06,1.47e-06,1.47e-06,1.48e-06,1.51e-06,1.71e-06,1.7e-06,1.83e-06,1.86e-06,2.55e-06,1.87e-06,0,0.00084,0.00036,2.48e-06,1.62e-06,3.72e-06,1.72e-06,1.6e-06,0,1.58e-06,0,0,0,1.57e-06,2e-06,0,2.16e-06,8.41e-06,0.0019,0,0,0,0,0,7.35e-06,1.97e-06,0,1.62e-06,0,1.92e-06,0,1.91e-06,1.8e-06,0,9.64e-06,2.52e-06,3.62e-06,2.49e-06,6.69e-05,0,0,0,0,5.79e-06,1.79e-06,1.77e-06,0,0,0,1.86e-06,1.89e-06,0,2e-06,2.03e-06,2.24e-06,2.03e-06,1.98e-06,1.86e-06,1.7e-06,1.58e-06,1.51e-06,1.97e-06,0,1.64e-06,2.37e-06,0,0,2.62e-06,5.3e-05,3.74e-06,1.73e-06,1.7e-06,1.92e-06,1.9e-06,2e-06,1.97e-06,1.95e-06,1.96e-06,2.07e-06,1.83e-06,0,5.46e-06,1.54e-06,1.76e-06,0,0,1.03e-05,0,2.92e-05,0,0,3.36e-06,1.95e-06,2.02e-06,1.99e-06,1.98e-06,2.07e-06,2.38e-06,2.98e-06,1.95e-06,1.9e-06,1.56e-06,1.66e-06,0.854,0,0.14,0,1.45e-06,0,3.01e-05,0.000443,3.53e-06,2.4e-06,2.02e-06,2.02e-06,2.25e-06,2.68e-06,5.3e-06,5.99e-06,1.98e-06,1.61e-06,1.62e-06,1.97e-06,0,3.59e-06,0,1.4e-06,0,3.26e-05,0,1.12e-05,2.52e-06,2.12e-06,2.08e-06,2.37e-06,2.29e-06,2.17e-06,1.96e-06,1.98e-06,1.62e-06,1.63e-06,0,1.72e-06,0,6.54e-06,2e-05,0,0.000568,1.9e-05,2.94e-06,2.4e-06,2.15e-06,2.3e-06,2.19e-06,1.92e-06,1.65e-06,1.54e-06,1.58e-06,1.58e-06,4.79e-06,0,0,1.57e-06,1.34e-05,0,3.94e-05,6.39e-06,3.82e-06,2.27e-06,2.1e-06,2.17e-06,1.94e-06,1.93e-06,1.79e-06,0,0,0,1.5e-06,2.1e-06,2.87e-06,0,3.58e-05,1.05e-05,8.98e-06,8.15e-06,3.32e-06,2.14e-06,2.05e-06,2.02e-06,1.98e-06,2.03e-06,1.85e-06,0,0,0,0,1.55e-06,2.56e-06,1.85e-06,0,0,9.72e-05,3.64e-06,3.34e-06,2.11e-06,2.14e-06,2.01e-06,2.01e-06,1.99e-06,1.86e-06,1.84e-06,2.34e-06,3.47e-06,9.59e-06,0,2.06e-06,1.54e-06,0,1.46e-05,0.000556,7.84e-05,5.08e-06,4.01e-06,2.3e-06,2.27e-06,2.07e-06,1.95e-06,1.87e-06,4.51e-06,0,2.87e-06,8.07e-06,1.2e-05,4.32e-06,1.73e-06,1.54e-06,1.7e-06,2.19e-06,0,1.96e-06,1.82e-06,2.99e-06,2.71e-06,2.07e-06,1.94e-06,2.02e-06,2.09e-06,0,0,7.72e-06,0,1.83e-06,1.84e-06,1.6e-06,1.66e-06,1.6e-06,0,0,1.03e-05,0,1.82e-06,5.03e-06,2.07e-06,0,1.94e-06,2.1e-06,1.84e-06,0,0,1.76e-06,0,1.8e-06,1.59e-06,1.51e-06,1.61e-06,0,6.6e-06,0,0,2e-06,1e-05,2.46e-06,2.04e-06,2.04e-06,1.94e-06,1.78e-06,1.53e-06,1.44e-06,0,0,2.08e-06,1.7e-06,1.61e-06,1.62e-06,0,0,1.83e-06,0,0,1.86e-06,1.9e-06,1.93e-06,1.72e-06,1.71e-06,1.68e-06,1.57e-06,4.13e-06,5.12e-06,0,0,1.92e-06,1.5e-06,1.46e-06,1.68e-06,1.69e-06,1.87e-06,5.12e-06,1.68e-06,1.57e-06,1.54e-06,1.52e-06,1.47e-06,1.46e-06,1.47e-06,1.47e-06,1.61e-06,1.81e-06,1.57e-06,1.94e-06,1.5e-06,2.77e-06],"winrateAvg":0.311498,"leadAvg":-1.78957,"scoreMeanAvg":-2.53153,"scoreStdevAvg":10.7221,"shorttermWinlossErrorAvg":0.245905,"shorttermScoreErrorAvg":2.02017,"ownership":[-96,-95,-91,-84,-76,-56,-31,-3,16,26,30,35,46,55,62,61,61,62,64,-98,-97,-95,-96,-89,-73,-31,-2,25,32,29,36,30,62,68,64,62,62,67,-98,-99,-98,-100,-100,-99,-29,-11,60,29,29,26,80,52,99,57,58,71,69,-99,-98,-99,-36,68,-24,5,-60,10,26,25,29,48,98,99,99,99,79,77,-85,-98,74,75,47,39,83,2,15,20,19,22,27,40,47,45,47,95,71,-74,-26,-29,44,51,57,58,30,19,19,16,15,15,17,14,19,-23,15,54,-67,-28,-30,59,84,51,93,93,31,20,13,11,10,8,5,12,8,16,19,-56,-69,88,76,-1,31,-1,45,16,20,11,9,6,2,-4,-16,13,-2,-5,-41,-48,-55,30,1,20,-3,37,83,22,12,7,3,-4,-17,-17,-14,-27,-34,15,-60,29,89,43,50,83,11,24,15,8,4,0,-8,-12,-36,-46,-55,-61,44,94,93,72,56,90,36,25,13,10,5,3,0,-4,-32,-89,-90,-90,-75,52,49,93,72,45,31,10,10,7,5,4,3,2,4,-54,46,38,-91,-57,6,16,-61,81,33,22,10,7,3,2,3,4,11,18,14,22,-9,26,-43,-20,-78,-25,38,32,7,5,2,-2,-5,-3,0,16,75,24,30,-4,13,4,-62,-73,13,81,24,0,0,-5,-13,-20,-19,-12,-64,75,-9,85,56,41,41,-74,-78,-83,81,13,-63,-22,-19,-27,-86,-44,-42,-52,-84,-84,21,92,71,65,-74,-77,-82,11,71,-63,-45,-18,-36,-56,-57,-57,-60,-65,-66,-73,92,79,75,-73,-72,-84,63,51,58,-57,-21,-39,-46,-55,-57,-60,-60,-68,-6,-3,82,73,-71,-71,-22,-5,39,-8,-17,-31,-36,-44,-51,-55,-57,-56,-39,-18,30,34,61],"ownershipAllowedMAE":0.0408235})%"); + lines.push_back(R"%({"sample":{"board":".....X.........../..OXXOOXXO.X.XO../.O..XOXX.OOXXOOO./.OOXXXOOOO.OXOXXO/.XXOOXOXXXOOXXXXO/...OXXOXOOOX.XX.X/OO..OOX.X.OX..XXO/XOOO.OXX.OXX..XO./.XXXOOXX.OX.X.XXO/.X..XXOO.OX.XOXO./..XX.OO.OXXXO.O.O/.X.OXO.OOXXOOOOO./...O.XOO.OOO.OXO./..XO.XOXOXXOOXXO./..X.XXOXOXXXX.XXO/....XOOXXX...XXO./...X.X.OOX......./","hintLoc":"null","initialTurnNumber":204,"metadata":"B4FE6D7910956BF8011C6B7931FDF15C:214","moveLocs":["G1","E7","E5","D8","A9","D17","K17","L17","J17","R8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":17,"ySize":17},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":33.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000219,0.00591,0.00744,0,0.00792,0,0.00285,3e-05,0,0,0,0.000791,0.000269,0.000244,0.00025,0.000263,0.000151,0.00162,0.00406,0,0,0,0,0,0,0,0,0.0313,0,0.000268,0,0,0.000239,0.00032,0.000497,0,0.00291,0.000378,0,0,0,0,1.7e-05,0,0,0,0,0,0,0,0.00428,0.000978,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000196,0.000188,0.0482,0,0,0,0,0,0,0,0,0,0.000228,0,0,0.00389,0,0,0,0.000278,0.0344,0,0,0,0.0827,0,0.0137,0,0,0.000218,0.000224,0,0,0,0,0,0,0,0,0,0,0,0.000296,0,0,0,0.000226,0.000256,0,0,0.676,0,0,0,0,0,0,0,0,0.000364,0,0,0.000223,0,0.00131,0,0,0,0.000174,0,0.00192,0,0.00112,0.000189,0,0,0.000782,0,0,0.00022,0,0,0,0,0,0.000231,0.000245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000221,0,0.000245,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0312,0.000221,0.000228,0.000247,0,0,0,0,0,0.00236,0,0,0,0,0,0,0,0.000203,0.000214,0.000227,0,0,0.000248,0,0,0,0,0,0,0,0,0,0,0,0.00527,0.000209,0.000211,0,0.000257,0,0,0,0,0,0,0,0,0,0.000215,0,0,0,0.000202,0.00021,0.000216,0.000233,0,0,0,0,0,0,0.000212,0.000213,0.000225,0,0,0,0.00414,0.000196,0.000208,0.000214,0,0.000242,0,0,0.000253,0.000235,0,0.00021,0.00021,0.000213,0.000245,0.00117,0.00629,0.000299,0.000196],"winrateAvg":0.00255011,"leadAvg":-7.11689,"scoreMeanAvg":-7.03147,"scoreStdevAvg":1.42689,"shorttermWinlossErrorAvg":0.0128142,"shorttermScoreErrorAvg":0.62861,"ownership":[98,98,97,97,-81,-100,-100,-100,-100,-100,93,-51,-99,-99,-99,-99,-99,98,98,99,-100,-100,-100,-100,-100,-100,100,97,-100,-100,-100,-99,-99,-99,98,99,53,-35,-100,-100,-100,-100,-22,100,100,-100,-100,-99,-99,-99,-99,99,99,99,-100,-100,-100,100,100,100,100,100,100,-100,-99,-100,-100,-99,99,98,98,100,100,-100,100,100,100,99,100,100,-100,-100,-100,-100,-99,99,99,99,100,-100,-100,100,99,100,100,100,-100,-100,-100,-100,-100,-100,100,100,99,99,100,100,99,99,99,100,100,-100,-100,-100,-100,-100,-97,-100,100,100,100,100,100,99,99,99,100,-100,-100,-100,-99,-100,-97,-97,-100,-100,-100,-100,100,100,99,99,99,100,-100,-100,-100,-44,-100,-100,100,-100,-100,-78,98,98,100,100,100,100,100,-100,-100,-100,66,-100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,100,68,100,100,100,-100,-100,-100,-99,-100,100,100,100,100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-99,-100,-100,100,100,79,100,100,100,100,100,-100,100,100,-100,-100,-100,-99,-100,-100,100,-100,80,-100,-100,100,100,-100,-100,100,99,-100,-100,-100,-100,-100,-100,100,-100,-2,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,99,99,-100,-100,-100,-100,-99,-99,-99,-99,-100,-100,-100,-100,-100,-100,-95,-90,13],"ownershipAllowedMAE":0.00969181})%"); + lines.push_back(R"%({"sample":{"board":"............./..........X../......X.OOX../..O......XO../............./............./.....X......./............./............./...X.X....X../..OO.O......./............./............./","hintLoc":"null","initialTurnNumber":15,"metadata":"B8AB6625A676BDE7B51E1C3723F590E5:25","moveLocs":["M10","K9","K12","C11","D11","D10","D12","B11","B10","C12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.35,"xSize":13,"ySize":13},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":3.0,"policyOptimism":0.27,"pda":0.0,"policyMixture":[8.35e-06,0.15,0.00132,0.0986,8.33e-06,6.43e-06,6.1e-06,5.97e-06,5.7e-06,6.04e-06,9.16e-06,6.39e-06,4.57e-06,0.0142,0.0192,0,0,0.000165,0.27,0.00313,9.48e-06,4.99e-06,0,0,0.000124,6.43e-06,0.000855,0,0,0,0.0299,0.148,0,2.58e-05,0,0,0,1.61e-05,5.74e-06,0.00588,0,0,0,0.0066,0.000154,0.000135,8.8e-05,2.05e-05,0,0,0,5.35e-06,6.21e-06,1.15e-05,0.000282,0.056,1.12e-05,9.24e-06,8.9e-06,9.97e-06,7.71e-06,0,4.38e-05,8.05e-06,5.42e-06,5.99e-06,0.0087,0.0865,5e-05,1.02e-05,8.48e-06,8.26e-06,8.81e-06,9.04e-06,1.68e-05,0.029,7.56e-05,6.01e-06,5.65e-06,3.31e-05,3.91e-05,1.21e-05,9.33e-06,0,8.44e-06,8.31e-06,8.68e-06,1e-05,0.00101,3.1e-05,5.72e-06,5.76e-06,3.9e-05,5.78e-05,1.42e-05,1.08e-05,9.17e-06,8.28e-06,8.37e-06,8.6e-06,9.98e-06,1.88e-05,1.1e-05,5.77e-06,5.79e-06,3.82e-05,1.93e-05,1.24e-05,7.98e-06,1.28e-05,9.15e-06,8.83e-06,9.17e-06,1.93e-05,9.28e-05,1.27e-05,5.73e-06,5.5e-06,8.37e-06,2.58e-05,0,0.000184,0,0.0506,1.12e-05,1.31e-05,0.0017,0,2.82e-05,5.86e-06,5.31e-06,6e-06,0,0,1.87e-05,0,0.0152,3.64e-05,2.91e-05,0.000392,0.000382,1.01e-05,5.67e-06,5.11e-06,5.29e-06,5.04e-06,5.17e-06,7.91e-06,9.14e-06,1.81e-05,9.51e-06,1.22e-05,1.06e-05,9.73e-06,8.59e-06,5.93e-06,4.4e-06,5.1e-06,4.71e-06,5.14e-06,5.01e-06,5.63e-06,5.54e-06,5.98e-06,6.19e-06,5.89e-06,5.63e-06,5.79e-06,4.56e-06,1.07e-05],"winrateAvg":0.632351,"leadAvg":0.816877,"scoreMeanAvg":1.10158,"scoreStdevAvg":7.42877,"shorttermWinlossErrorAvg":0.186184,"shorttermScoreErrorAvg":0.950083,"ownership":[21,23,27,30,9,-8,-9,0,28,54,59,62,64,22,24,14,43,6,4,-21,3,30,70,52,63,64,30,13,12,43,-28,-22,-70,-14,67,68,53,60,65,35,56,55,-82,-40,-36,-30,-19,-22,-78,75,77,53,26,22,-20,-49,-35,-32,-28,-27,-38,-78,-38,34,33,16,19,11,-23,-28,-33,-28,-27,-28,-29,-5,1,9,11,7,-8,-20,-30,-85,-32,-27,-27,-27,-20,-17,-11,8,8,-7,-17,-22,-35,-28,-26,-28,-29,-29,-29,-27,16,12,-2,-13,-29,-33,-28,-28,-30,-34,-37,-44,-40,32,35,6,-46,19,-67,-19,-32,-32,-35,-84,-56,-48,50,61,88,88,45,81,-41,-29,-33,-37,-49,-55,-50,60,71,77,75,63,46,-5,-23,-27,-38,-42,-48,-48,66,71,71,66,51,27,6,-14,-25,-32,-40,-43,-46],"ownershipAllowedMAE":0.0422573})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../................X../.O.O...........XO../................X../..............X..../.................../................O../.................../.................../...........X....O../....X.....X...O..X./................X.X/...OX...O..X..OOOX./...XO.O.OXX.XO.O.OO/...X.O.OX.OOXXXXOX./.XXXO..XX....XOOO../..OXOX.....O......./.O.OO............../","hintLoc":"null","initialTurnNumber":68,"metadata":"2111FC1B8BA762083CB03558964DE7F0:78","moveLocs":["K4","E7","F6","C6","F7","E4","B6","B7","B5","C7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.27,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":-4.0,"policyOptimism":0.61,"pda":2.138,"policyMixture":[2.11e-06,3.26e-06,3.42e-06,3.88e-06,4.17e-06,4.21e-06,4.17e-06,4.22e-06,4.25e-06,4.14e-06,3.87e-06,3.53e-06,3.24e-06,2.99e-06,2.69e-06,2.46e-06,2.3e-06,2.26e-06,1.82e-06,3.19e-06,7.2e-06,1.19e-05,1.79e-05,2.93e-05,2.79e-05,1.81e-05,2.04e-05,2.5e-05,2.16e-05,1.31e-05,9.1e-06,7.28e-06,5.91e-06,4.88e-06,4.23e-06,3.25e-06,2.88e-06,2.26e-06,3.26e-06,1.29e-05,9.16e-05,0.000105,8.27e-05,9.46e-05,7.7e-05,7.92e-05,9.21e-05,8.68e-05,5.1e-05,2.08e-05,9.63e-06,6.6e-06,5.37e-06,3.81e-06,0,2.98e-06,2.26e-06,4.32e-06,0,9.64e-05,0,0.000131,6.43e-05,6.16e-05,6.46e-05,7.66e-05,7.35e-05,4.34e-05,1.66e-05,8.71e-06,6.15e-06,4.75e-06,0,0,4.27e-06,2.63e-06,3.71e-06,1.95e-05,9.24e-05,7.11e-05,5.51e-05,4.96e-05,4.1e-05,3.89e-05,3.85e-05,3.05e-05,1.9e-05,1.11e-05,7.98e-06,5.51e-06,4.4e-06,3.92e-06,0,3.87e-06,2.69e-06,3.85e-06,1.22e-05,3.26e-05,2.83e-05,4.18e-05,3.77e-05,3.28e-05,2.92e-05,2.57e-05,2.01e-05,1.45e-05,1.09e-05,8.34e-06,5.8e-06,0,4.6e-06,4.68e-06,5.76e-06,3.07e-06,4.03e-06,1.68e-05,4.91e-05,4.71e-05,4.06e-05,3.46e-05,2.73e-05,2.21e-05,1.81e-05,1.41e-05,1.16e-05,1.02e-05,9.07e-06,7.52e-06,6.28e-06,6.33e-06,7.85e-06,8.07e-06,3.53e-06,4.7e-06,3.18e-05,8.53e-05,7.04e-05,5.11e-05,3.65e-05,2.41e-05,1.78e-05,1.36e-05,1.07e-05,9.58e-06,9.1e-06,9.08e-06,1.02e-05,1.46e-05,2.71e-05,0,1.49e-05,4.17e-06,5.95e-06,0.000104,0.000211,0.000134,7.89e-05,4.48e-05,2.43e-05,1.66e-05,1.15e-05,9.07e-06,7.77e-06,7.53e-06,8.31e-06,1.1e-05,1.85e-05,0.00011,7.91e-05,3.42e-05,4.59e-06,8.23e-06,0.000335,0.00169,0.000846,0.000142,4.9e-05,2.71e-05,1.82e-05,1.07e-05,7.04e-06,5.63e-06,4.92e-06,6.38e-06,1.03e-05,4.82e-05,0.000111,0.000196,6.04e-05,4.81e-06,4.73e-05,0.00723,0.315,0.0107,9.02e-05,5.46e-05,2.63e-05,2.91e-05,1.37e-05,6.27e-06,3.72e-06,0,4.52e-06,8.5e-06,6.1e-05,0.000213,0,7.81e-05,4.77e-06,5.81e-05,0.000488,0.197,8.62e-05,0,1.41e-05,3.97e-05,5.21e-05,3.85e-05,6.09e-06,0,3.02e-06,4.19e-06,6.27e-06,0,0.000122,1.89e-05,0,2.71e-06,0.000541,0,0,0.00021,0,0,7.68e-06,0.000208,6.33e-05,6.22e-06,3.52e-06,3.06e-06,3.86e-06,5.67e-06,1.35e-05,7.66e-06,0,3.04e-06,0,0.00347,0,0,0,0,0,5.74e-05,0.000189,0,5.44e-06,2.92e-06,0,3.22e-06,4.06e-06,0,0,0,0,3.78e-06,4.43e-06,0,0.266,0,0,4.81e-06,0,7.36e-05,0,0,0,3.01e-06,0,0,3.38e-06,0,0,0,0,0.131,0.000111,9.87e-06,0,0,0,3.74e-05,0,0,0,0,0,0,0,0,0,0,0,3.34e-06,6.14e-06,0,0,0,0,5.69e-06,4.69e-05,0,0,2.92e-06,4.3e-06,5.57e-06,5.03e-06,0,0,0,0,3.34e-06,2.23e-06,0.000129,0.0589,0,0,0,0,4.37e-06,3.49e-06,2.97e-06,3.54e-06,4.23e-06,0,2.96e-05,9.35e-05,8.62e-05,6.74e-06,4.26e-06,3.44e-06,2.57e-06,3.39e-06,0,0,0,0,3.65e-06,3.1e-06,2.75e-06,2.53e-06,2.61e-06,3.05e-06,4.15e-06,1.07e-05,3.03e-05,5.16e-06,3.93e-06,3.38e-06,2.83e-06,2.05e-06,6.49e-06],"winrateAvg":0.00311647,"leadAvg":-27.7536,"scoreMeanAvg":-29.3531,"scoreStdevAvg":18.7152,"shorttermWinlossErrorAvg":0.0142983,"shorttermScoreErrorAvg":4.69633,"ownership":[55,51,44,32,19,8,0,-3,-6,-8,-11,-17,-25,-34,-45,-57,-65,-70,-71,60,56,50,35,23,7,1,-4,-6,-9,-13,-20,-29,-39,-49,-59,-73,-73,-73,64,62,52,47,23,4,1,-4,-9,-9,-12,-19,-27,-37,-44,-60,-89,-76,-72,61,79,51,80,11,6,-1,-6,-8,-10,-13,-18,-24,-34,-47,-94,-65,-67,-68,53,46,29,28,12,2,-4,-7,-10,-12,-14,-17,-21,-30,-45,-58,-89,-68,-55,38,36,23,18,7,-2,-6,-8,-10,-12,-13,-15,-18,-25,-84,-37,-33,-33,-33,27,25,18,10,2,-5,-8,-10,-11,-12,-13,-13,-13,-14,-21,-16,-8,-9,-8,20,19,12,4,-4,-9,-11,-12,-13,-13,-14,-12,-10,-10,-7,-2,51,17,9,15,15,8,-2,-10,-15,-16,-15,-14,-14,-14,-14,-9,-5,0,7,11,23,19,14,4,14,-9,-21,-23,-21,-17,-17,-15,-17,-23,-11,-4,7,30,2,32,25,9,20,-20,-13,-31,-32,-26,-21,-17,-18,-40,-88,-21,-4,22,20,68,35,28,7,8,-21,-34,-82,-45,-28,-21,-14,-27,-89,-49,-5,16,90,57,44,22,30,-8,28,28,-43,-46,-91,-40,-37,-7,-33,-42,-51,-17,6,57,60,27,36,27,-25,-69,22,23,-92,-92,-27,-20,20,-29,-66,-98,-27,24,99,99,99,34,74,-54,-70,-35,-71,9,-20,15,1,16,-99,-99,-71,-93,62,13,99,98,99,99,-59,-64,-56,-70,10,13,-21,6,-99,-99,-9,-9,-93,-92,-92,-92,99,92,95,-50,-71,-69,-68,12,-33,-63,-98,-99,-75,-47,-23,-50,-91,99,99,99,93,93,-29,-37,-1,-67,13,-70,-61,-78,-80,-46,-41,6,-32,13,35,74,90,87,91,-14,2,1,12,11,-19,-48,-64,-64,-52,-31,-6,6,15,41,60,73,82,86],"ownershipAllowedMAE":0.0437687})%"); + lines.push_back(R"%({"sample":{"board":".O.X.X............./XOOOX...X........../.X.OX...XXXXXXXXO../.X.OXXXX..XOOXOX.../.XXXOX.X.XO..OOXXX./.OXOOOXOXXO..OXX..X/.OO...OOO.O..OOXXXO/..O.............OO./.O....OOO.....O.O../.X..OOXOXOOOO..X.../..XXOXXOX.XXXOOXOO./..XOO.XXXX.....XO.O/..XXOOOOOOXX.OX.XO./....O.XXXXO.X.X..X./...X.XOOOXXX....XXX/...X.XOX.OOOXXXXOOX/..XXOOO.....OOOO.OX/..XO.O...........OO/..O.O............../","hintLoc":"null","initialTurnNumber":169,"metadata":"CDE1EB8440FA0EA59EA4B6EDDA6C6B64:179","moveLocs":["B1","D1","B2","N8","T12","T11","T7","S8","A11","C11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.9,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1button1","komi":10.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.69e-05,0,4.08e-05,0,0.00169,0,4.2e-05,4.18e-05,4.23e-05,4.18e-05,4.2e-05,4.2e-05,4.29e-05,4.4e-05,4.43e-05,4.33e-05,4.48e-05,4.45e-05,4.26e-05,0,0,0,0,0,4.39e-05,4.2e-05,4.21e-05,0,4.14e-05,4.16e-05,4.22e-05,4.31e-05,4.41e-05,4.35e-05,4.51e-05,4.46e-05,4.47e-05,4.52e-05,0.00861,0,8.15e-05,0,0,4.19e-05,4.19e-05,4.32e-05,0,0,0,0,0,0,0,0,0,4.58e-05,4.6e-05,8.36e-05,0,8.45e-05,0,0,0,0,0,4.21e-05,4.3e-05,0,0,0,0,0,0,4.44e-05,4.41e-05,4.41e-05,0.0154,0,0,0,0,0,5.52e-05,0,4.34e-05,0,0,0.00315,0.00335,0,0,0,0,0,4.6e-05,0.00571,0,0,0,0,0,0,0,0,0,0,4.49e-05,4.47e-05,0,0,0,4.26e-05,4.35e-05,0,0.000104,0,0,0.0271,4.84e-05,0.00211,0,0,0,0.0411,0,4.7e-05,4.56e-05,0,0,0,0,0,5.75e-05,0.0149,3.9e-05,0,4.34e-05,0.000625,4.25e-05,4.3e-05,4.27e-05,4.49e-05,4.69e-05,4.41e-05,4.46e-05,4.44e-05,5.01e-05,0.0014,0.211,0,0,0,0,0,0,8.19e-05,4.7e-05,4.43e-05,0,0,0,4.55e-05,4.09e-05,4.18e-05,4.28e-05,5.5e-05,0,0.000111,0,0.000169,0,8.17e-05,0,0.000171,0.382,0,0,0,0,0,0,0,0,0,5.38e-05,0.0772,0,0.0853,5.4e-05,0.0745,4.91e-05,4.9e-05,0,0,0,0,0,0,0,5.12e-05,0,0,0,0,0,0,0,0,4.19e-05,4.79e-05,4.74e-05,0,0,0,4.51e-05,0,0,0,0,4.62e-05,6.44e-05,0,4.94e-05,0.0309,0,0,0,0,4.38e-05,4.22e-05,0,0,0,0,0,0,0,0,0,0,0.000266,0,0,4.78e-05,0,0,0,4.26e-05,4.24e-05,4.66e-05,9.44e-05,0,4.9e-05,0,0,0,0,0,4.3e-05,0,0.00371,0,4.25e-05,4.75e-05,0,4.78e-05,4.24e-05,4.25e-05,4.17e-05,0,5.1e-05,0,0,0,0,0,0,0,4.3e-05,4.85e-05,4.7e-05,4.49e-05,0,0,0,4.24e-05,4.28e-05,4.2e-05,0,5.05e-05,0,0,0,4.67e-05,0,0,0,0,0,0,0,0,0,0,4.2e-05,4.13e-05,0,0,0,0,0,4.27e-05,4.41e-05,4.48e-05,4.19e-05,4.38e-05,0,0,0,0,4.39e-05,0,0,4.23e-05,0,0,0,0,0,4.19e-05,4.5e-05,4.23e-05,4.29e-05,4.19e-05,4.13e-05,4.11e-05,4.07e-05,4.15e-05,4.12e-05,4.28e-05,0,0,4.19e-05,0,0,0,0,0.00259,4.31e-05,4.23e-05,4.14e-05,4.11e-05,4.06e-05,4.08e-05,4.06e-05,4.08e-05,4.13e-05,4.14e-05,4.08e-05,4.2e-05,4.17e-05,3.89e-05],"winrateAvg":0.811037,"leadAvg":0.400176,"scoreMeanAvg":0.554205,"scoreStdevAvg":2.89522,"shorttermWinlossErrorAvg":0.283824,"shorttermScoreErrorAvg":0.684843,"ownership":[32,93,-61,-99,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-98,-97,-96,-96,-97,-69,93,93,93,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-97,-96,-96,-97,-69,-91,11,93,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-96,-97,-97,7,-92,1,93,-100,-100,-100,-100,-100,-99,-100,98,98,-100,100,-100,-99,-98,-98,58,-92,-94,-94,100,-100,-32,-100,-99,-99,99,98,98,100,100,-100,-100,-100,-99,84,100,-94,100,100,99,-31,100,-99,-99,99,99,99,100,-100,-100,-100,-100,-100,59,100,100,99,98,99,100,100,100,-85,100,99,99,100,100,-100,-100,-100,-35,-74,56,100,98,99,99,99,99,99,99,99,99,99,99,-85,-98,100,99,-33,-93,100,100,99,99,99,100,100,100,99,99,99,99,99,100,97,100,98,98,-92,-98,50,-93,100,100,-99,100,-99,100,100,100,100,100,-82,-99,-81,99,98,-97,-97,-100,-100,100,-99,-99,100,-99,21,-99,-99,-99,100,100,-99,99,99,99,-98,-99,-100,100,100,32,-99,-99,-99,-99,-98,1,98,98,0,-99,99,99,99,-99,-99,-100,-100,100,100,100,100,100,100,-100,-100,-39,98,-100,-98,-99,99,-1,-99,-99,-99,80,100,-10,-100,-100,-100,-100,-100,-100,-100,77,-100,-99,-98,-99,1,-99,-99,-99,-100,-37,-100,100,100,100,-100,-100,-100,-99,-96,-99,-99,-99,-99,-99,-100,-100,-100,-100,-3,-100,100,99,100,100,100,100,-100,-100,-100,-100,100,100,-99,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-99,-100,-100,-100,98,99,100,99,99,100,100,100,100,100,100,100,100,100,100,100,-100,-100,98,98,98,99,99,99,100,100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.0225428})%"); + lines.push_back(R"%({"sample":{"board":"...O.O..X......./..O.O.OX...XXOX./...OXOOOX...OXXX/...OXXXX.XXO.OX./...OX...XOXXOOXX/...OOX.XXOOXXX.X/...XOXOXOOOOOOXO/..OOXXXOOXOXO.O./....OOOOOXXX..O./.OO...OXXXOX.O../..O...OOXOOX.XOO/.X.XXXOOX..OX.XX/..XOOOOX...OOXX./.OXOOXOXX..OXOO./OOXOXXX.X..XXX../.XXOOO.X......../","hintLoc":"null","initialTurnNumber":128,"metadata":"58637DCE74BB91900424C4AAE7630E8B:138","moveLocs":["N7","N6","P11","A6","B6","P10","F12","G11","P11","A3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":16,"ySize":16},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":0.5,"policyOptimism":0.789,"pda":0.0,"policyMixture":[0.000134,0.000134,0.000126,0,0.000143,0,0.101,0.00201,0,0.000249,0.00014,0.00013,0.000127,0.00013,0.000126,0.000121,0.000132,0.000128,0,0.000134,0,0.000204,0,0,0.0107,0.0024,0.000147,0,0,0,0,0.000128,0.00013,0.000132,0.000127,0,0,0,0,0,0,0.000203,0.000148,0.000131,0,0,0,0,0.000132,0.00013,0.000127,0,0,0,0,0,0,0,0,0,0.000138,0,0,0,0.000133,0.000131,0.000126,0,0,0,0.000134,0.000142,0,0,0,0,0,0,0,0,0.000133,0.000131,0.000128,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000133,0.000134,0.00013,0,0,0,0,0,0,0,0,0,0,0,0.205,0,0.000134,0.000134,0,0,0,0,0,0,0,0,0,0,0,0.000166,0,0.00363,0.000132,0.000137,0.000134,0.000138,0,0,0,0,0,0,0,0,0.19,0.000314,0,0.000257,0.000456,0,0,0.000134,0.000137,0.000127,0,0,0,0,0,0,0,0,0.00112,0.000204,0,0,0,0.000132,0.000138,0.000136,0,0,0,0,0,0,0,0,0,0,0.0285,0,0.00693,0,0,0,0,0,0,0.000887,0.000148,0,0,0,0,0,0.0956,0.00115,0,0,0,0,0,0,0.0132,0.0281,0.000162,0,0,0,0,0.00535,0,0,0,0,0,0,0,0,0,0.000688,0.000736,0,0,0,0,0.000447,0,0,0,0,0,0,0,0,0,0.000505,0.0109,0,0,0,0.0135,0.000575,5.2e-05,0,0,0,0,0,0.267,0,0.000239,0.00017,0.000163,0.000283,0.000176,0.000384,0.00015,0.000129,0.000103],"winrateAvg":0.130858,"leadAvg":-1.23126,"scoreMeanAvg":-1.80604,"scoreStdevAvg":3.28039,"shorttermWinlossErrorAvg":0.298905,"shorttermScoreErrorAvg":1.58511,"ownership":[99,99,99,100,96,96,0,-42,-91,-90,-96,-98,-99,-100,-100,-100,99,99,100,99,99,93,94,-84,-84,-93,-96,-100,-100,-99,-100,-100,99,99,100,100,-100,94,94,95,-99,-95,-97,-99,-99,-100,-100,-100,99,99,100,100,-100,-100,-100,-100,-99,-100,-100,-99,-100,-99,-100,-100,99,99,100,100,-100,-99,-100,-100,-100,100,-100,-100,-99,-99,-100,-100,99,99,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,15,-100,99,99,100,99,100,-100,-100,-100,100,100,100,100,100,100,12,74,99,99,100,100,-100,-100,-100,100,100,-100,100,-99,100,90,99,76,98,99,99,100,100,100,100,100,100,-100,-100,-100,-25,71,99,84,97,100,100,99,99,99,100,-100,-100,-100,-98,-100,95,96,88,89,92,100,100,99,99,99,100,100,-100,-98,-98,-100,-100,-100,92,91,88,91,97,97,97,98,100,100,-100,-99,-99,-97,-100,-99,-99,-99,91,90,92,100,100,100,100,-100,-98,-98,-98,-97,-97,-100,-99,-98,89,94,92,100,100,-83,100,-100,-100,-98,-99,-97,-100,-98,-98,-99,95,95,91,100,-86,-84,-93,-94,-100,-98,-98,-100,-100,-100,-99,-99,91,92,93,100,100,100,73,-97,-96,-98,-98,-99,-99,-99,-99,-99],"ownershipAllowedMAE":0.0261163})%"); + lines.push_back(R"%({"sample":{"board":"......X............/....XXOXX........O./...OOOOO.X..X..XX../.OO.....OX...XXOX../.XOX...O.O.XXOOOOO./..XOO...O..XO....X./..XOXX.....OOOX.X../...XO...O........XX/...XOO.OX....O.X..O/...XXO.OX...X.O.XXO/..X....X....XO..XO./.XXO.OOX...XO.O.XO./.OOO..XO.X..XOOOOO./.......X....XOOXXX./...X.XX......OXOOX./..O..O.X.XX.O.XX.../..XO.OX.OXOO...X.../..O...OXOO..X....../.................../","hintLoc":"null","initialTurnNumber":116,"metadata":"DD4467E722FC0A9167C1C3128E2A1BD7:126","moveLocs":["H3","R18","Q18","T14","T13","T15","R14","B14","B13","A15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.45,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":2.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.49e-06,5.17e-06,3.79e-06,4.16e-06,1.97e-06,2.47e-06,0,2.41e-06,1.66e-06,1.76e-06,1.58e-06,1.55e-06,1.71e-06,1.62e-06,1.92e-06,2.34e-06,3.4e-06,2.39e-06,1.88e-06,1.97e-06,2.03e-06,1.08e-05,1.83e-05,0,0,0,0,0,2.1e-06,2.08e-06,1.72e-06,1.83e-06,1.9e-06,1.95e-06,0,0,0,2.9e-06,1.91e-06,2.17e-06,2.05e-06,0,0,0,0,0,2.37e-06,0,1.84e-06,1.87e-06,0,1.74e-06,1.85e-06,0,0,2.75e-05,4.65e-06,2.59e-06,0,0,1.55e-05,0.000609,0.00032,3.17e-06,2.63e-06,0,0,2.21e-06,1.87e-06,1.8e-06,0,0,0,0,3.49e-05,3.54e-06,0,0,0,0,0.00166,0.00169,0.000342,0,0,0,2.91e-06,0,0,0,0,0,0,0,0,3.01e-06,0,0,0,0,0.00144,0.00186,1.03e-05,0,2.95e-06,5.6e-06,0,0,6.11e-06,0.0116,1.4e-05,0,0,0,0.0439,0,0,0,0,0,3.21e-05,7.57e-06,4.11e-06,4.77e-06,2.28e-05,0,0,0,0,1.95e-06,0,1.15e-06,0,7.75e-05,0.00035,1.95e-05,0,0,2.35e-06,2.38e-06,3.36e-06,0,0.000379,3.32e-05,3.1e-06,3.91e-06,1.09e-05,1.11e-05,2.46e-06,1.79e-06,0,0,5.06e-05,0.714,8.46e-06,0,0,0,1.85e-05,0,0,4.72e-06,0.000297,8.93e-06,0.00286,0,5.34e-05,0,1.86e-06,2.58e-06,0,1.46e-05,0.00221,2.36e-06,0,0,0,0.000168,0,0,2.56e-06,5.45e-06,2.54e-06,0,0.000485,0,2.16e-06,0,0,0,5.06e-06,2.25e-06,0,2.45e-06,3.93e-06,6.48e-06,0.19,0,2.26e-06,2.47e-06,2.53e-06,2.19e-06,0,0,4.16e-06,5e-06,0,0,2.38e-06,8.31e-06,0,0,0,9.92e-06,0,0,0,2.2e-06,2.11e-06,2.06e-06,0,0,0.00227,0,2.01e-06,0,0,1.45e-06,5.35e-05,0,0,0,6.22e-06,0.000142,0,0,2.54e-06,0,2.15e-06,2.15e-06,0,0,0,0,0,0,2.06e-06,3e-06,4.39e-05,2.54e-06,2.47e-06,2.32e-06,2.23e-06,1.96e-06,0,1.87e-06,1.88e-06,2.41e-06,2.3e-06,0,0,0,0,0,0,1.88e-06,2.74e-06,3.27e-06,6.04e-05,0,2.42e-06,0,0,1.73e-06,2.14e-06,2.23e-06,2.25e-06,2.73e-06,1.09e-05,0,0,0,0,0,1.63e-06,1.99e-06,3.68e-06,0,2.49e-05,9.58e-06,0,2.31e-06,0,3.37e-06,0,0,4.66e-06,0,2.78e-05,0,0,2.12e-06,2.13e-06,1.89e-06,2.02e-06,1.02e-05,0,0,2.51e-06,0,0,0,0,0,0,0,0.000157,1.38e-05,2.28e-06,0,2.01e-06,2.16e-06,1.71e-06,1.85e-06,2.82e-06,0,2.95e-06,4.15e-06,0.00356,0,0,0,0,3.31e-06,0.0185,0,4.42e-06,3.28e-06,2.45e-06,2e-06,1.92e-06,1.64e-06,1.48e-06,1.83e-06,2.08e-06,2.2e-06,2.21e-06,2.67e-06,8.03e-06,3.95e-06,6.08e-06,2.35e-06,3.11e-06,2.92e-06,2.12e-06,2.25e-06,1.99e-06,1.87e-06,1.6e-06,1.65e-06,1.33e-06,5.3e-06],"winrateAvg":0.0543722,"leadAvg":-2.74721,"scoreMeanAvg":-3.5237,"scoreStdevAvg":6.3716,"shorttermWinlossErrorAvg":0.111195,"shorttermScoreErrorAvg":1.0583,"ownership":[79,61,46,25,-10,-48,-85,-84,-94,-96,-97,-96,-95,-87,-69,-35,35,48,67,86,83,76,50,-43,-45,100,-98,-98,-97,-97,-97,-97,-94,-89,-98,86,87,84,93,89,93,100,100,100,100,100,43,-98,-94,-94,-99,-97,-98,-98,-99,-32,89,95,100,100,98,97,96,96,98,99,-97,-74,-87,-98,-99,-99,96,-98,-12,89,97,91,100,96,96,94,94,100,91,89,-19,-99,-98,97,97,97,97,97,96,15,93,-97,96,96,93,93,95,99,32,-18,-98,98,94,-40,13,-99,-99,96,-19,-97,-97,97,90,91,94,93,79,61,35,97,98,98,-93,-84,-99,-99,-99,-83,-94,-96,-99,99,96,95,94,96,7,18,35,42,49,10,-92,-98,-99,-99,-92,-97,-97,-98,99,99,94,98,-90,-18,-29,17,-14,92,6,-98,-95,-47,62,-92,-95,-96,-98,-98,99,1,98,-91,-61,-30,-36,-86,21,93,-30,-98,-98,76,-91,-94,-98,1,-9,79,-62,-97,-88,-75,-66,-65,-87,87,73,-34,-98,97,73,-24,-98,-98,98,54,97,97,-97,-88,-81,-70,-94,-1,-3,97,33,-98,97,82,-1,98,98,98,32,42,-75,-72,-93,-99,-72,-68,-86,97,97,97,97,97,46,45,23,16,-5,-12,-27,-50,-99,-84,-76,-55,-32,-85,97,97,-98,-98,-98,36,57,64,-21,-69,-38,-99,-99,-90,-78,-78,-33,8,31,97,-99,-97,-97,-98,-56,77,80,95,22,-12,89,-23,-99,45,-92,-92,35,96,14,-99,-99,-98,-95,-88,88,92,87,98,66,90,-98,-98,94,-93,96,96,34,-43,-76,-100,-97,-96,-95,93,94,97,89,83,33,39,-98,94,94,92,53,-69,-64,-88,-96,-97,-97,-96,94,94,92,86,69,50,21,20,41,73,70,39,-1,-61,-83,-93,-96,-96,-97],"ownershipAllowedMAE":0.0408001})%"); + lines.push_back(R"%({"sample":{"board":".O.OO.O.X.O.O.X.X../.XOOOOOOXXOO..OX.X./.XOOXXOX.XXOOOOOX../XXXOOXXXXOXXXXXOX../XOOOOXO.OO...OOXX../.XXXXOOO......OXO../.OX.XXXOOOOOOO.OX../.OXXOX.OXXXXOX.O.X./.OOOOX.OOX..XXXOXX./...OX..OXXOXOOOXOX./.OXOXXXXOXOX...XOX./..OXX.XOOOXXX...OX./.O.OXOXO.OOOXOOXXO./...OXXOXXXO.OXX..X./O..O.OOXXOO.OX..OX./XOOOOOXOXXO.OX.XXO./XXXXXXX.XO..OXOXOO./...X....XO..OOXOOX./...XO.O.O.....XXX../","hintLoc":"null","initialTurnNumber":251,"metadata":"F472CF5EDBD40181A86251ED682BD1FC:261","moveLocs":["O19","H2","H1","G2","Q19","A18","H15","P19","J17","F1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000165,0,0.000189,0,0,0.000156,0,0.000162,0,0.000158,0,9.41e-05,0,0,0,0.000549,0,0.000176,0.000157,0,0,0,0,0,0,0,0,0,0,0,0,0.000151,0.000153,0,0,0,0,0.000164,0,0,0,0,0.000152,0.00015,0,0.000155,0,0,0,0,0,0,0,0,0,0.000158,0.000157,0,0,0,0,0,0.000153,0.000155,0.00015,0.000158,0,0,0,0,0,0,0,0,0.000157,0.000159,0,0,0,0,0,0.000157,0,0,0,0,0.000152,0.000148,0.000153,0,0,0,0,0.000158,0.000158,0.00431,0,0,0,0,0,0,0,0.000154,0.000156,0.00015,0.000149,0.000147,0.000155,0,0,0,0.000157,0.000155,0.0989,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000494,0,0,0.000392,0.000155,0.00544,0,0,0,0,0,0.000176,0,0,0,0,0,0,0,0.0539,0,0.000454,0,0.000153,0.000154,0,0,0,0,0,0.000214,0,0,0,0.00475,0.0143,0,0,0,0,0,0,0.000155,0.000152,0.000158,0.000161,0,0,0.00385,0.081,0,0,0,0,0,0,0,0,0,0,0,0.000154,0.000156,0,0,0,0,0,0,0,0,0,0,0,0.0179,0.000817,0.0197,0,0,0,0.000156,0.000158,0.000165,0,0,0,0.000135,0,0,0,0,0,0,0,0.0206,0.0152,0.0155,0,0,0.00016,0.000157,0,0.000164,0,0,0,0,0,0.000183,0,0,0,0,0,0,0,0,0,0.000161,0.000164,0.000162,0.00016,0,0,0,0,0,0,0,0,0.000159,0,0,0,0.00197,0.000485,0,0.000183,0,0.000164,0.000156,0,0.000175,0,0,0,0,0,0,0.000167,0,0,0.00149,0.00598,0,0,0.000186,0,0,0,0,0,0,0,0,0,0,0,0.000158,0,0,0.00631,0,0,0,0.00602,0,0,0,0,0,0,0,0.000143,0,0,0.000191,0.000169,0,0,0,0,0,0,0.000519,0.000155,0.000156,0.000158,0,0.000124,0.227,0,0,0,0,0.000204,0.000196,0,0,0,0,0,0,0.0148,0.000159,0.000155,0.000157,0,0,0,0,0,0,0.249,0.000277,0.000203,0.000186,0.0917,0,0,0,0.0188,0.00405,0.000106],"winrateAvg":0.00135976,"leadAvg":-4.91443,"scoreMeanAvg":-4.92051,"scoreStdevAvg":1.30824,"shorttermWinlossErrorAvg":0.0153913,"shorttermScoreErrorAvg":0.548242,"ownership":[-74,97,97,100,100,99,100,99,98,99,100,99,100,100,70,70,-99,-98,-99,-100,-100,100,100,100,100,100,100,98,98,100,100,99,99,100,-98,-99,-100,-99,-99,-100,100,100,99,99,100,99,100,98,98,100,100,100,100,100,-100,-99,-99,-100,-100,-100,100,100,99,99,99,99,100,98,98,98,98,98,100,-100,-99,-99,-100,100,100,100,100,99,100,100,100,100,99,99,99,100,100,-100,-100,-99,-99,-99,-100,-100,-100,-100,100,100,100,99,99,99,99,99,99,100,-100,-99,-100,-99,81,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,99,99,-100,-99,-99,98,100,-100,-100,100,-100,-40,100,-100,-100,-100,-100,100,-100,59,99,-71,-100,-99,99,100,100,100,100,-100,20,100,100,-100,-100,-100,-100,-100,-100,99,-100,-100,-99,99,99,100,100,-100,-99,57,100,-100,-100,-99,-100,-98,-98,-98,-100,-99,-100,-99,99,100,99,100,-100,-100,-100,-100,100,-100,-99,-100,-99,-99,-99,-100,-99,-100,-99,100,99,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-99,-100,-100,-99,-100,-99,99,100,100,100,-100,-99,-100,100,50,100,100,100,-100,-99,-98,-100,-100,-99,-100,98,99,99,100,-100,-100,100,-100,-100,-100,100,100,100,-100,-100,-99,-99,-100,-99,99,99,99,100,50,100,100,-100,-100,100,100,100,100,-100,-99,-99,-98,-100,-99,-100,100,100,100,100,100,-100,-99,-100,-100,100,99,100,-100,-100,-100,-100,-98,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-99,-100,-99,-99,-99,-100,-100,-100,-100,-100,-94,-100,-100,-100,100,99,99,100,100,-100,-99,-99,-100,-99,-100,-100,-100,-100,-95,-97,98,98,99,99,99,99,99,79,-100,-100,-100,-99,-99],"ownershipAllowedMAE":0.0105882,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":"............./............./.....X......./...O.OX..X.../..O........../..X........../............./............./..XX........./.XOO........./............./..OO........./..OX........./.OXX........./..OX........./..OX.....O.../..OX........./..X........../............./","hintLoc":"null","initialTurnNumber":27,"metadata":"F475037545CC4B5911762040974A56A1:37","moveLocs":["F15","E17","D14","B14","D13","B15","B16","B17","A16","B7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":13,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":3.0,"policyOptimism":0.0,"pda":-2.968,"policyMixture":[6.44e-05,8.28e-05,9.02e-05,9.12e-05,8.63e-05,8.1e-05,7.94e-05,7.79e-05,7.76e-05,7.73e-05,7.7e-05,7.77e-05,6.45e-05,7.98e-05,0.000116,0.000186,0.000126,0.000112,0.000108,0.00023,0.000367,0.000146,0.000121,0.000116,0.000108,7.82e-05,8.85e-05,0,0.0343,0.00619,0,0,0.00304,0.000965,0.000679,0.000824,0.000686,0.000126,7.97e-05,0,0,0.000132,0,0.000101,0,0,0.00123,0.000901,0,0.000784,0.000131,8.2e-05,8.8e-05,0,0,7.6e-05,7.21e-05,0,0.0011,0.000474,0.000942,0.000869,0.000485,0.000146,8.13e-05,8.4e-05,0,0,0,7e-05,8.81e-05,0.000117,0.00102,0.000718,0.000584,0.000656,0.000133,8.02e-05,8.47e-05,0.000101,0.000134,0,8.32e-05,0.000108,0.000202,0.000619,0.000399,0.000423,0.000398,0.000124,7.97e-05,8.7e-05,0.00234,0.000119,9.93e-05,0.000118,0.000228,0.000592,0.000543,0.000336,0.000315,0.000259,0.000121,7.97e-05,9.16e-05,0.00105,0,0,0.0592,0.00123,0.000746,0.000518,0.000291,0.000335,0.000253,0.000121,7.96e-05,0.000121,0,0,0,0.000865,0.00126,0.000671,0.000363,0.000232,0.000347,0.000265,0.000121,7.98e-05,0.000138,0.0221,8.56e-05,7.43e-05,0.000111,0.000631,0.000586,0.000288,0.000195,0.000328,0.000259,0.000122,8.03e-05,0.000243,0.31,0,0,0.000166,0.000854,0.00029,0.000172,0.000168,0.000332,0.000305,0.000123,8.13e-05,0.0219,0,0,0,0.000123,0.000133,0.000139,0.000135,0.000144,0.000387,0.000408,0.000122,8.19e-05,0.00165,0,0,0,7.8e-05,0.000115,0.000122,0.000127,0.000131,0.000272,0.00052,0.00012,8.12e-05,0.111,0.378,0,0,7.22e-05,0.000107,0.000119,0.000121,0.000115,0.000114,0.00016,0.000128,8.23e-05,0.000284,0.0039,0,0,7.31e-05,0.000107,0.000119,0.000136,0.000111,0,0.000127,0.000124,8.27e-05,6.91e-05,7.37e-05,0,0,7.88e-05,0.000111,0.000131,0.00032,0.000141,0.000119,0.000121,0.000113,7.95e-05,6.78e-05,0.000144,0,0.000104,0.000104,9.7e-05,0.000109,0.00011,0.000118,0.000116,0.000108,9.5e-05,7.9e-05,6.23e-05,6.8e-05,8.08e-05,7.1e-05,7.09e-05,7.27e-05,7.65e-05,7.79e-05,7.95e-05,8.09e-05,7.9e-05,7.98e-05,6.55e-05,4.78e-05],"winrateAvg":0.0105573,"leadAvg":-11.2824,"scoreMeanAvg":-12.5469,"scoreStdevAvg":12.3155,"shorttermWinlossErrorAvg":0.0274104,"shorttermScoreErrorAvg":1.74253,"ownership":[-12,-29,-40,-49,-60,-64,-61,-56,-50,-45,-39,-37,-33,2,-19,-40,-59,-61,-73,-64,-57,-54,-47,-42,-34,-33,37,-45,-46,49,-82,-84,-56,-58,-55,-53,-40,-35,-30,78,81,84,86,-11,81,-72,-43,-42,-87,-43,-31,-27,41,-25,85,80,56,81,6,-13,-21,-28,-36,-30,-24,11,-24,-23,84,33,29,16,5,-6,-16,-20,-20,-18,-9,-16,32,82,20,13,7,2,-5,-11,-14,-15,-14,-17,-19,-5,8,-5,-1,-2,-4,-6,-9,-12,-13,-11,-19,-26,-58,-60,-25,-19,-10,-8,-8,-9,-11,-12,-11,0,-31,82,80,-12,-8,-10,-8,-8,-10,-11,-13,-11,20,51,62,47,18,4,-4,-6,-7,-9,-12,-13,-12,56,70,89,88,11,13,-4,-5,-6,-8,-11,-13,-11,63,51,88,-93,-17,-10,-7,-5,-4,-5,-9,-11,-9,51,63,-91,-92,-38,-14,-9,-4,1,4,-11,-7,-3,39,37,41,-93,-42,-18,-8,1,9,18,17,7,3,20,25,38,-93,-46,-21,-8,7,24,72,27,9,8,4,-7,38,-93,-51,-24,-9,13,17,24,17,11,10,-14,-13,-66,-60,-49,-35,-22,-8,4,6,11,8,10,-26,-42,-48,-57,-50,-36,-19,-5,4,9,9,11,10],"ownershipAllowedMAE":0.0521784})%"); + lines.push_back(R"%({"sample":{"board":".X.XOX............./O.XOOXOX...OX....../OXXOOXOX.O.O.X...../.OXOXX.O..XXXXXOXX./..OOOX..XXOO.OXX..X/..OO.X...XXOX.OOXX./.O.OOX.XXOOX....OO./.XXXXO.OOO.X......./.....O....OX...X.O./.X.O.O...OX......../.XO..XO..O......XO./.XXO.XO.O..X..X..../.OXX.X.......OOOOO./O.OO..XXXX.X.O.XX../.OXO.OOOOOOX.OXXO../.XX.OXO.X..XO.XOO../...XXXO....XO.X..../.....XO...OXO....../...........O......./","hintLoc":"null","initialTurnNumber":170,"metadata":"8A8988A025E4EAAB70A65B61B22E5F1C:180","moveLocs":["R11","S10","Q13","Q12","R12","P13","S12","N9","L7","P11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.95,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.53e-05,0,2.12e-05,0,0,0,1.94e-05,2.04e-05,2.04e-05,1.96e-05,1.9e-05,1.95e-05,1.93e-05,1.94e-05,1.93e-05,1.92e-05,1.92e-05,1.94e-05,2.01e-05,0,8.98e-05,0,0,0,0,0,0,2.06e-05,1.98e-05,1.96e-05,0,0,2e-05,1.9e-05,1.91e-05,1.89e-05,1.89e-05,1.94e-05,0,0,0,0,0,0,0,0,2.06e-05,0,1.93e-05,0,1.96e-05,0,1.93e-05,1.93e-05,1.9e-05,1.9e-05,1.94e-05,0.000155,0,0,0,0,0,1.99e-05,0,2.01e-05,1.96e-05,0,0,0,0,0,0,0,0,2.02e-05,0.000344,0.0139,0,0,0,0,1.96e-05,2.01e-05,0,0,0,0,2.05e-05,0,0,0,1.99e-05,2.03e-05,0,0.00162,0.000214,0,0,0.000171,0,2.1e-05,2.02e-05,2.06e-05,0,0,0,0,2.25e-05,0,0,0,0,2.2e-05,0.000414,0,0.000302,0,0,0,2.2e-05,0,0,0,0,0,2.2e-05,2.28e-05,0,0,0,0,0.166,4.43e-05,0,0,0,0,0,0.000446,0,0,0,0.0163,0,2.06e-05,0.0113,2.46e-05,0,0,0,3.01e-05,2.29e-05,1.92e-05,2.09e-05,2.29e-05,2.18e-05,0,3.66e-05,2.53e-05,2.39e-05,8.54e-05,0,0,2.21e-05,3.34e-05,0,0,0,0,2.28e-05,2.1e-05,0,2.58e-05,0,3.43e-05,0,2.54e-05,3.93e-05,2.3e-05,0,0,0.00033,5e-05,0.000756,0.542,3.25e-05,2.71e-05,0,2.1e-05,2.01e-05,0,0,1.82e-05,3.38e-05,0,0,0.00169,2.15e-05,0,0.000322,5.69e-05,0,4.6e-05,0.000368,0.000267,0,0,2.64e-05,2.21e-05,0,0,0,2.41e-05,0,0,0.000174,0,2.47e-05,2.26e-05,0,0.000116,4.82e-05,0,2.24e-05,0.000664,3.9e-05,3.06e-05,2.63e-05,0,0,0,2.26e-05,0,2.54e-05,2.39e-05,2.36e-05,2.09e-05,0,2.03e-05,2.33e-05,0,0,0,0,0,3.71e-05,0,0,0,0,0.000178,2.27e-05,0,0,0,0,2.38e-05,0,2.1e-05,0,2.09e-05,0,0,0.0106,3.07e-05,2.16e-05,0,0,0,2.45e-05,0,0,0,0,0,0,0,0.000689,0,0,0,0,0.0196,6.57e-05,2.21e-05,0,0,2.64e-05,0,0,0,2.07e-05,0,0.0074,7.57e-05,0,0,0.000144,0,0,0,8.79e-05,7.49e-05,2.2e-05,2.17e-05,2.19e-05,0,0,0,0,2.56e-05,3.42e-05,0.0253,0.0536,0,0,2.48e-05,0,0.0117,0.00982,0.0313,4.39e-05,2.31e-05,2.26e-05,2.16e-05,2.17e-05,1.95e-05,0,0,0.000433,6.03e-05,0.00902,0,0,0,0.000134,5.65e-05,0.0093,0.0276,0.00929,7.28e-05,2.04e-05,2.21e-05,2.16e-05,2.23e-05,2.4e-05,2.97e-05,0.000187,3.3e-05,0.000643,7.17e-05,8.93e-05,0,8.24e-05,0.0101,0.000104,3.87e-05,5.05e-05,5.9e-05,2.42e-05,1.88e-05],"winrateAvg":0.793695,"leadAvg":2.7839,"scoreMeanAvg":3.46465,"scoreStdevAvg":12.7599,"shorttermWinlossErrorAvg":0.260988,"shorttermScoreErrorAvg":2.8196,"ownership":[95,94,96,95,97,-99,-97,-95,-95,-94,-95,-96,-96,-98,-98,-98,-98,-98,-98,97,95,95,97,97,-99,-93,-96,-93,-94,-94,-93,-99,-98,-98,-98,-99,-98,-99,96,94,94,97,97,-99,-93,-97,-94,-92,-97,-93,-96,-100,-99,-99,-99,-99,-99,96,96,94,96,-99,-99,-96,-92,-96,-96,-100,-100,-100,-100,-100,-98,-100,-100,-99,91,92,97,96,96,-99,-95,-95,-100,-100,-94,-94,-95,12,-100,-100,-99,-99,-100,76,90,97,96,-25,-99,-93,-92,-97,-100,-100,-94,-98,12,67,65,-99,-99,-86,24,91,-28,96,96,-99,-3,-97,-98,97,97,-98,-51,-5,67,13,15,-28,-60,-50,-88,-88,-87,-87,97,24,97,98,98,-44,-98,-37,-19,54,62,-80,-79,-38,-81,-79,-21,20,45,97,89,87,88,81,83,-97,-14,38,67,-81,-80,96,17,-85,-91,-21,84,50,97,92,85,89,98,-48,-10,25,28,-17,-21,-4,96,71,-82,-90,35,-3,-19,-90,97,85,90,97,7,-5,85,44,5,-14,-56,96,90,-33,-90,-90,3,-60,-89,96,55,96,18,-26,-84,1,48,-35,31,6,83,94,2,88,-90,-90,-54,-89,-38,-10,-4,-30,-88,-58,54,100,100,100,100,100,92,88,87,95,95,14,20,-89,-89,-89,-89,-22,-80,25,100,93,82,81,86,89,25,88,-84,96,86,99,98,98,98,98,97,-80,-13,100,81,81,92,88,86,-4,-85,-84,8,86,-86,98,52,-13,5,-37,-82,99,93,79,92,91,85,83,-55,-77,-81,-85,-85,-86,98,58,44,20,-30,-83,99,90,79,82,83,79,79,-75,-76,-79,-81,-76,-85,98,74,82,81,95,-84,99,87,83,83,79,78,78,-77,-79,-79,-74,-71,-8,15,69,77,86,93,96,95,88,84,81,79,78,78],"ownershipAllowedMAE":0.0409716})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.....X.........O.../..X.............O../...............XO../................X../.................../.................../.................../.................../.................../.................../.................../...X............XO./...............XO../.....O.........XO../...O...........XO../.................../.................../","hintLoc":"null","initialTurnNumber":18,"metadata":"9E6D08A370EE2B8661A4D958A12F54CD:28","moveLocs":["Q14","R7","Q6","S8","N17","M3","Q7","Q8","R2","P2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.74,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":5.5,"policyOptimism":0.154,"pda":0.939,"policyMixture":[1.41e-06,1.62e-06,1.53e-06,1.58e-06,1.58e-06,1.7e-06,1.6e-06,1.62e-06,1.64e-06,1.68e-06,1.67e-06,1.66e-06,1.9e-06,2.16e-06,2.59e-06,2.43e-06,2.07e-06,2.11e-06,1.47e-06,1.53e-06,1.98e-06,2.34e-06,2.58e-06,2.69e-06,2.73e-06,2.84e-06,2.91e-06,2.97e-06,3.06e-06,3.03e-06,2.89e-06,2.71e-06,1.15e-05,7.71e-05,3.95e-05,4.73e-05,4.33e-06,2.17e-06,1.49e-06,2.46e-06,2.67e-06,3.4e-06,2.9e-06,0,3.27e-06,3.76e-06,4.01e-06,4.06e-06,3.92e-06,2.89e-06,0,3.07e-06,0.000101,0,3.85e-06,1.01e-05,2.1e-06,1.67e-06,2.6e-06,0,3.3e-06,3.9e-06,3.63e-06,4.28e-06,4.48e-06,4.59e-06,4.57e-06,4.13e-06,3.54e-06,3.24e-06,5.72e-06,4.21e-06,4.83e-05,0,3.8e-06,2.66e-06,1.61e-06,3.14e-06,3.17e-06,3.89e-06,4.85e-06,6.69e-06,5.93e-06,4.52e-06,4.95e-06,4.72e-06,4.14e-06,5.07e-06,1.01e-05,4.51e-06,2.22e-06,0,0,3.08e-05,2.39e-06,1.64e-06,3.51e-06,4.63e-06,5.34e-06,4.58e-06,9.11e-06,1.22e-05,9.28e-06,1.01e-05,7.03e-06,5.01e-06,6.33e-06,5.57e-06,3.71e-06,2.05e-06,0,0,7.75e-06,2.45e-06,1.67e-06,3.74e-06,1.2e-05,1.32e-05,8.56e-06,1.34e-05,1.78e-05,1.55e-05,1.42e-05,1.01e-05,6.39e-06,5.99e-06,5.13e-06,3.79e-06,2.75e-06,1.84e-06,1.85e-06,3.32e-06,1.83e-06,1.72e-06,3.97e-06,1.64e-05,2.62e-05,1.55e-05,1.55e-05,1.74e-05,1.62e-05,1.4e-05,1.05e-05,6.97e-06,5.62e-06,5.03e-06,4.53e-06,3.73e-06,3.34e-06,3.34e-06,2.7e-06,1.74e-06,1.75e-06,3.97e-06,1.94e-05,2.83e-05,1.52e-05,1.28e-05,1.32e-05,1.22e-05,1.05e-05,8.11e-06,6.35e-06,5.55e-06,5.33e-06,5.47e-06,5.67e-06,5.86e-06,5.99e-06,3.46e-06,1.8e-06,1.78e-06,3.98e-06,2.32e-05,2.65e-05,1.15e-05,7.9e-06,8.39e-06,7.97e-06,7.31e-06,6.43e-06,5.64e-06,5.16e-06,5.88e-06,7.01e-06,1.12e-05,1.11e-05,3.89e-06,3.45e-06,1.85e-06,1.79e-06,3.92e-06,1.87e-05,2.24e-05,6.61e-06,5.51e-06,6.55e-06,6.39e-06,6.23e-06,5.89e-06,5.4e-06,5.34e-06,5.35e-06,7.14e-06,1.04e-05,2.41e-05,0.0126,2.97e-06,1.69e-06,1.8e-06,3.77e-06,9.48e-06,7.94e-06,4.57e-06,4.56e-06,5.65e-06,6.04e-06,6.19e-06,5.92e-06,5.86e-06,5.94e-06,6.81e-06,6.78e-06,0.0413,0,3.77e-06,0,1.84e-06,1.79e-06,3.76e-06,3.92e-06,3.03e-06,3.78e-06,6.77e-06,1.01e-05,7.87e-06,7.01e-06,7.11e-06,7.78e-06,9.09e-06,7.37e-06,6.97e-06,3.33e-06,0,0,8.79e-05,0.00122,1.84e-06,3.89e-06,3.48e-06,0,3.12e-06,1.41e-05,1.05e-05,8.09e-06,8.14e-06,9.85e-06,1.41e-05,2.07e-05,1.3e-05,3.5e-06,1.88e-06,0,0,0,1.44e-05,1.93e-06,5.5e-06,1.62e-05,3.23e-06,3.2e-06,2.81e-05,2.22e-05,1.29e-05,1.06e-05,1.18e-05,1.51e-05,2.91e-05,2.27e-05,3.58e-06,1.74e-06,0,0,4.43e-05,3.81e-06,1.94e-06,4.06e-06,8.62e-05,0.000128,0.000301,0,2.63e-05,6.27e-06,8.16e-06,1.01e-05,3.01e-05,9.36e-05,2.23e-05,1.23e-05,1.92e-06,0,0,9.79e-06,0.000113,1.89e-06,3.94e-06,9.92e-05,0,0.000106,2.64e-05,6.21e-06,1.01e-05,5.39e-06,1.07e-05,3.5e-05,0,8.83e-05,0.000258,1.97e-05,0,0,0.586,3.6e-06,1.75e-06,3.25e-06,3.71e-06,1.47e-05,4.37e-06,4.16e-06,3.44e-06,3.17e-06,3.11e-06,3.54e-06,3.68e-06,2.03e-05,7.09e-05,0.000755,0,0.354,0,4.1e-06,3.07e-06,1.42e-06,1.81e-06,1.86e-06,1.86e-06,1.82e-06,1.72e-06,1.67e-06,1.65e-06,1.64e-06,1.71e-06,1.8e-06,1.76e-06,2.04e-06,2.15e-06,2.48e-06,2.59e-06,2.18e-06,3.25e-06,1.69e-06,2.31e-06],"winrateAvg":0.234806,"leadAvg":-3.34213,"scoreMeanAvg":-5.26236,"scoreStdevAvg":15.3475,"shorttermWinlossErrorAvg":0.093679,"shorttermScoreErrorAvg":1.00639,"ownership":[-55,-54,-53,-52,-50,-47,-39,-32,-29,-30,-32,-36,-35,-20,6,35,50,52,52,-54,-56,-55,-54,-55,-52,-44,-32,-31,-32,-34,-41,-41,-29,23,43,56,52,52,-53,-59,-57,-55,-48,-85,-31,-24,-27,-28,-28,-36,-77,-16,-24,70,53,50,48,-50,-58,-86,-30,-36,-33,-20,-19,-19,-21,-23,-26,-34,-18,-10,-31,61,51,33,-41,-46,-34,-30,-22,-23,-16,-12,-13,-14,-16,-21,-26,-24,-32,-82,61,9,8,-30,-32,-25,-21,-16,-14,-4,-8,-9,-10,-11,-14,-15,-17,-32,-82,-83,-29,-27,-21,-24,-24,-18,-14,-11,-9,-7,-7,-8,-8,-10,-11,-13,-14,-31,-43,-48,-35,-15,-17,-17,-18,-12,-9,-8,-7,-7,-6,-6,-7,-7,-9,-9,-13,-15,-19,-25,-10,-12,-11,-16,-10,-8,-7,-6,-6,-5,-5,-5,-5,-4,-3,-1,-5,-5,-1,-9,-10,-12,-14,-9,-7,-6,-6,-5,-4,-4,-3,-2,0,9,17,12,21,25,-9,-8,-9,-12,-7,-6,-5,-5,-4,-3,-2,-2,0,9,15,50,12,44,57,-10,-8,-4,-11,-6,-4,-4,-5,-4,-2,-1,-1,1,31,19,90,85,92,75,-10,-12,-14,-15,-3,-5,-4,-5,-3,-1,2,-1,-9,-12,-18,-87,91,88,84,-8,-8,-20,-57,-5,2,0,-4,-1,3,5,1,-11,-12,-36,-87,-87,91,83,1,-2,1,-1,10,14,0,0,3,7,14,13,-5,-13,-38,-89,87,87,74,12,18,16,14,25,77,21,14,22,24,19,23,6,-7,-35,-88,87,57,55,25,27,42,77,46,42,29,16,22,19,32,71,15,15,-26,-89,86,-24,6,32,41,50,54,49,38,31,24,25,28,35,41,11,-3,18,-82,-78,-24,-23,37,42,46,48,44,36,28,23,23,27,32,30,18,-2,-35,-54,-67,-59,-36],"ownershipAllowedMAE":0.0390736})%"); + lines.push_back(R"%({"sample":{"board":"..OXXXX.XOO...../OOOXX.X.XXOO..../O.OOOX.XXOOXOO../OOXXOXOXXOOXXO../XOXOOXOXOOO.X.O./XXXXOXXO.OXXXXO./.XXXXXOOOXXXX.X./OOXOOXXO.OOXOO../.OOXOO.XOO..OXX./XXXXX..XO.O.O.../X....X.XXO.OOOOO/X.X.XO..XOOXXXOO/XXXXXOX..XOOX.XO/XXXX.XXO.XOXXX.X/.XX.X....XX...X./X.X.X..X..O....X/","hintLoc":"null","initialTurnNumber":216,"metadata":"74AF9D425844391EAA2A4FD83F2DA51C:226","moveLocs":["J3","pass","H2","pass","H4","pass","G5","pass","Q14","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":16,"ySize":16},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":13.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00111,0.0011,0,0,0,0,0,0.00448,0,0,0,0.00146,0.00285,0.00213,0.00539,0.00169,0,0,0,0,0,0.00518,0,0.00562,0,0,0,0,0.0288,0.0621,0.0128,0.00318,0,0,0,0,0,0,0.00905,0,0,0,0,0,0,0,0.0172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0772,0.00208,0,0,0,0,0,0,0,0,0,0,0,0.00205,0,0.0235,0,0.00887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00418,0.0107,0,0,0,0,0,0,0,0,0,0,0,0,0.00179,0,0.00156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00249,0.00164,0.0113,0,0,0,0,0,0.0115,0,0,0,0.00196,0.00367,0,0,0,0.00156,0,0,0,0,0,0.0122,0.00378,0,0,0,0,0.00151,0,0.00169,0.0027,0.00162,0,0.00174,0.00538,0.00236,0.0114,0,0.0113,0,0,0,0,0,0,0,0,0,0,0.00141,0,0.00321,0,0.0112,0,0.00781,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00772,0,0,0.00909,0,0,0,0,0.0117,0,0,0,0,0,0,0.00685,0,0,0.0109,0,0,0,0,0,0,0.0123,0,0.000913,0,0,0.00311,0,0.0073,0.0105,0,0.0113,0,0,0.0117,0.00183,0.0119,0,0.0126,0,0.000912,0,0.00221,0,0.00152,0.00154,0,0.00195,0.0123,0,0.0129,0.00154,0.00156,0.0126,0,0.412],"winrateAvg":0.999741,"leadAvg":13.4864,"scoreMeanAvg":13.521,"scoreStdevAvg":1.18883,"shorttermWinlossErrorAvg":0.00693591,"shorttermScoreErrorAvg":0.681249,"ownership":[100,100,100,-100,-100,-100,-100,-98,-100,100,100,96,96,96,96,95,100,100,100,-100,-100,-98,-100,-98,-100,-100,100,100,96,95,94,95,100,100,100,100,100,-100,-97,-100,-100,100,100,94,100,100,96,92,100,100,-100,-100,100,-100,-96,-100,-100,100,100,94,94,100,95,96,-100,100,-100,100,100,-100,-95,-100,100,100,100,98,95,98,100,96,-100,-100,-100,-100,100,-100,-100,100,96,100,94,95,95,95,100,97,-96,-100,-100,-100,-100,-100,100,100,100,93,94,94,95,99,94,97,-94,-93,-100,-93,-93,-100,-100,100,96,100,100,95,100,100,97,96,-96,-93,-93,-100,-94,-94,-96,-100,100,100,96,96,100,90,91,96,-100,-100,-100,-100,-100,-96,-96,-100,100,96,100,96,100,95,95,96,-100,-97,-96,-97,-97,-100,-96,-100,-100,100,97,100,100,100,100,100,-100,-97,-100,-96,-100,-97,-100,-97,-100,100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-97,-100,-100,-97,-100,100,100,-100,-98,-100,100,-100,-100,-100,-100,-97,-100,-100,-97,-100,-100,100,-100,-100,-100,-98,-100,-97,-100,-100,-97,-100,-97,-97,-100,-96,-100,-100,-96,-96,-96,-100,-97,-100,-97,-100,-97,-100,-98,-97,-100,-96,-95,-91,-95,-96,-96,-96,-100],"ownershipAllowedMAE":0.0282335})%"); + lines.push_back(R"%({"sample":{"board":"................../................../.XOXXXX........OO./.XXO.O.O......OX../.OOO..........OX../..X..........XXOO./...OO..........X../.OXOXOX.....X...../.OOXXX.........XX./.XXO..O....XO.OOX./.....OOXXXX.X...O./....O.XOOXOX.XXOO./..OO..XXOO..OOXO.O/..XXO.OX....OXOXO./..XO.X.XO.O.O.OXO./..X..X.OOOXXX.OXO./.........XO...XXX./...............X../","hintLoc":"null","initialTurnNumber":109,"metadata":"4F601A9CE7073BE3B47CA618B85FDAAA:119","moveLocs":["J2","H2","M2","J1","L1","L6","N15","G13","G15","H11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":5.0,"policyOptimism":0.913,"pda":0.0,"policyMixture":[3.52e-06,3.86e-06,3.68e-06,3.66e-06,3.54e-06,3.52e-06,3.51e-06,3.51e-06,3.5e-06,3.59e-06,3.7e-06,3.92e-06,3.93e-06,3.91e-06,3.57e-06,3.48e-06,3.48e-06,3.35e-06,3.64e-06,4.2e-06,3.85e-06,4.05e-06,3.42e-06,3.54e-06,3.66e-06,3.73e-06,4.33e-06,4.49e-06,4.62e-06,4.72e-06,5.19e-06,6.95e-06,8.09e-06,3.69e-06,3.55e-06,3.24e-06,3.37e-06,0,0,0,0,0,0,4.25e-06,4.47e-06,4.69e-06,4.81e-06,5.1e-06,4.64e-06,2.59e-05,0.0164,0,0,3.59e-06,4.43e-06,0,0,0,6.61e-06,0,0,0,4.94e-06,5.26e-06,4.99e-06,4.72e-06,0,1.15e-05,0,0,3.78e-06,3.82e-06,3.5e-05,0,0,0,3.22e-05,4.9e-06,0.000262,0.00164,8.99e-06,5.55e-06,5.26e-06,4.71e-06,3.85e-06,1.66e-05,0,0,5.3e-06,4.27e-06,4.88e-06,0.000593,0,0.000768,4.85e-05,0.000327,0,0.000304,7.78e-05,1.03e-05,5.5e-06,4.85e-06,4.35e-06,0,0,0,0,5.11e-06,5.45e-06,9.93e-05,0.0115,0,0,0.275,2.3e-05,0.511,3.84e-05,1.5e-05,5.81e-06,4.86e-06,4.11e-06,4.03e-06,3.71e-06,0,6.28e-05,4.44e-06,8.79e-06,0,0,0,0,0,0,0,1.32e-05,6.78e-06,5.47e-06,4.87e-06,0,4.4e-06,4.24e-06,3.69e-06,3.73e-06,3.79e-06,2.28e-05,0,0,0,0,0,0.0107,0.0512,4.59e-06,4.7e-06,4.47e-06,4.73e-06,7.24e-06,4.88e-06,5.07e-06,0,0,3.57e-06,4.76e-06,0,0,0,1.96e-05,3.31e-06,0,4.62e-06,3.83e-06,4e-06,3.81e-06,0,0,0.00702,0,0,0,4.07e-06,4.76e-06,7.68e-06,4.21e-06,0.0529,2.24e-05,0,0,0,0,0,0,4.36e-06,0,9.71e-06,1.16e-05,4.67e-06,0,3.65e-06,4.91e-06,5.14e-05,9.83e-06,4.06e-06,0,9.37e-06,0,0,0,0,0,0,4.91e-06,0,0,0,0,3.45e-06,5.54e-06,0.00057,0,0,6.87e-06,0.0369,0,0,0,0,0,2.57e-05,0,0,0,0,0,0,5.7e-06,3.75e-05,0,0,0,0.00301,0,0,0.00776,5.02e-06,5.18e-06,0.000188,0,0,0,0,0,3.32e-06,4.68e-06,4.58e-06,0,0,0.000504,0,7.15e-06,0,0,4.4e-06,0,0.000233,0,5.13e-06,0,0,0,4.2e-06,3.7e-06,3.71e-06,0,1.15e-05,7.53e-06,0,1.01e-05,0,0,0,0,0,0,0.00672,0,0,0,5.63e-06,3.65e-06,4.05e-06,4.76e-06,8.58e-06,0.000664,0.002,1.03e-05,0,0,0,3.67e-06,0,4.13e-06,4.47e-06,0,0,0,3.89e-06,3.33e-06,3.54e-06,4.16e-06,4.5e-06,5.43e-06,1.26e-05,5.51e-06,4.22e-06,0,4.88e-06,0,3.63e-06,3.75e-06,3.83e-06,3.35e-06,0,3.55e-06,3.98e-06,8.25e-06],"winrateAvg":0.474313,"leadAvg":-0.0253044,"scoreMeanAvg":-0.237549,"scoreStdevAvg":9.70758,"shorttermWinlossErrorAvg":0.300931,"shorttermScoreErrorAvg":2.14832,"ownership":[-73,-87,-91,-93,-89,-82,-73,-58,-47,-40,-35,-24,-7,14,38,63,75,83,-60,-82,-92,-95,-95,-91,-80,-63,-49,-45,-38,-37,-8,22,35,67,86,90,-49,-92,-90,-99,-99,-99,-99,-45,-44,-41,-40,-40,-47,14,27,97,96,92,-4,-91,-92,93,-35,45,-98,-9,-35,-36,-37,-42,-88,-9,80,73,89,88,16,93,92,93,33,25,-9,-30,-30,-31,-31,-36,-44,-25,80,73,83,77,67,73,64,76,52,38,80,-12,-20,-26,-28,-34,-50,-93,-93,86,85,38,78,84,91,97,96,31,55,-19,-5,-17,-27,-36,-48,-53,-69,-78,-28,1,82,96,91,97,31,44,16,73,13,-11,-29,-45,-88,-14,-41,-50,-47,-46,73,96,96,35,34,29,59,26,4,-18,-35,-55,4,13,22,-80,-80,-59,61,46,51,81,67,74,96,12,-20,-37,-58,-90,32,4,92,93,-82,-3,50,56,66,60,70,96,96,-91,-91,-91,-91,-73,-84,-47,17,92,100,16,31,62,68,78,92,16,-85,95,95,-91,95,-70,34,-68,-68,100,100,98,3,-1,90,91,47,-49,-85,-84,95,95,95,55,95,95,-69,100,100,100,-38,-36,-94,-94,54,-28,12,-83,-35,86,72,46,94,91,92,-98,100,99,-58,-80,-94,6,2,-93,-43,-83,94,92,93,-19,95,90,92,-98,100,91,-74,-85,-94,-57,-58,-93,15,94,94,94,-99,-99,-99,-82,92,-98,99,15,-79,-81,-82,-68,-70,-8,17,94,-93,-98,-98,-99,-99,-98,-99,-98,-98,4,-79,-78,-72,-58,-23,10,43,76,78,-49,-99,-99,-99,-98,-98,-98,-72,-35],"ownershipAllowedMAE":0.0361377,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..........O..OOX.../...X.......OOX.X.../............XX..XX./..X............OO../.................O./................O../...............X.../...............XO../...............XO../...............XO../.................../..X.............X../..............X..../...O.........OOO.../......O....X......./.................../.................../","hintLoc":"null","initialTurnNumber":34,"metadata":"769DF87653DDEF74BA2DEACD659D378C:44","moveLocs":["R7","P7","S4","R3","Q7","P16","P15","Q15","Q18","O13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.65,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui1button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.69e-06,5.9e-06,5.86e-06,6.23e-06,6.55e-06,6.47e-06,6.5e-06,6.44e-06,6.33e-06,6.24e-06,6.36e-06,6.31e-06,6.9e-06,7.1e-06,6.52e-06,6.02e-06,6.24e-06,6.01e-06,5.66e-06,5.86e-06,6.71e-06,8.08e-06,1.08e-05,1.64e-05,1.74e-05,2.07e-05,1.98e-05,1.6e-05,1.12e-05,8.93e-06,8.78e-06,8.24e-06,1.32e-05,0.0001,0,5.83e-06,6.37e-06,5.86e-06,5.72e-06,7.29e-06,9.52e-06,1.16e-05,3.17e-05,0.000223,0.0194,0.00835,0.000103,1.32e-05,0,4.65e-06,0.151,0,0,0,5.92e-06,6.08e-06,6.19e-06,5.73e-06,7.53e-06,8.32e-06,0,1.11e-05,9.53e-05,0.000692,0.000532,7.27e-05,0.000137,5.99e-06,0,0,0,0,0,5.77e-06,5.99e-06,6.18e-06,5.73e-06,7.89e-06,7.53e-06,8.51e-06,1.21e-05,2.84e-05,0.000113,0.000147,6.85e-05,1.98e-05,1.01e-05,0.292,0,0,0,0,0,0,5.91e-06,6e-06,7.8e-06,0,1.03e-05,1.78e-05,3.32e-05,0.000112,0.000184,0.000172,0.000153,0.00105,0.00177,9.64e-06,6.25e-06,9.79e-06,0,0,8.04e-06,6.15e-06,5.85e-06,1.06e-05,1.15e-05,1.72e-05,2.5e-05,6.07e-05,0.000147,0.000198,0.000189,0.000141,0.000157,0.000401,0.0266,0,7.93e-05,8.74e-06,5.43e-06,0,6.26e-06,5.89e-06,1.25e-05,1.95e-05,2.84e-05,3.02e-05,8.2e-05,0.000143,0.000177,0.00018,0.000148,0.000129,0.00017,0.0169,0.00031,9.96e-06,1.96e-05,0,7.95e-06,9.11e-06,6.04e-06,1.34e-05,2.81e-05,9.18e-05,8.31e-05,0.000129,0.00016,0.000173,0.000171,0.000163,0.000161,0.000158,7.54e-05,2.2e-05,7.21e-06,0,0.00518,8.09e-06,8.98e-06,6.11e-06,1.44e-05,4.83e-05,0.000219,0.000151,0.00016,0.000174,0.00017,0.000164,0.000163,0.000164,0.000227,0.000123,1.41e-05,5.86e-06,0,0,7.49e-06,8.63e-06,6.14e-06,1.53e-05,9.83e-05,0.000279,0.000161,0.000178,0.000171,0.000163,0.000157,0.000156,0.000153,0.000197,7.74e-05,1.43e-05,5.77e-06,0,0,8.48e-06,1.99e-05,6.07e-06,1.45e-05,8.1e-05,0.000139,9.21e-05,0.000156,0.000164,0.000161,0.000158,0.000158,0.000162,0.000154,7.32e-05,2.07e-05,8.65e-06,0,0,0.039,8.65e-06,6.05e-06,1.38e-05,1.41e-05,6.81e-05,0.000149,0.000196,0.000187,0.000177,0.000174,0.000172,0.000211,0.000226,0.000538,1.54e-05,0,0,0,6.81e-06,7.32e-06,6.62e-06,1.18e-05,0,1.77e-05,0.00175,0.000193,0.000194,0.000224,0.000212,0.000201,0.00032,0.00457,9.7e-05,1.46e-05,1.39e-05,5.7e-06,0,7.56e-06,7.15e-06,6.58e-06,6.86e-05,1.21e-05,1.55e-05,0.000351,0.00205,0.000241,0.000165,0.000202,0.000135,0.000273,0.0649,0.000208,1.36e-05,0,9.71e-06,6.35e-06,5.94e-06,5.98e-06,7.08e-06,0.00014,5.22e-05,0,3.57e-05,9.18e-05,0.000103,0.0308,0.000326,0.000176,9.86e-05,1.86e-05,1.15e-05,0,0,0,9.1e-06,0,5.83e-06,6.25e-06,2.43e-05,0.000338,3.45e-05,2.52e-05,2.94e-05,0,0.000637,0.267,0.000301,1.26e-05,0,1.34e-05,9.65e-06,6.55e-06,5.73e-06,0,0.0458,6.81e-06,6.08e-06,1.11e-05,1.47e-05,1.74e-05,0.000218,4.11e-05,3.5e-05,9.82e-05,9.87e-05,1.77e-05,1.19e-05,9.21e-06,2.86e-05,3.57e-05,1.38e-05,1.05e-05,7.31e-06,8.18e-06,6.81e-06,5.31e-06,6.03e-06,5.89e-06,6.1e-06,6.4e-06,6.6e-06,6.61e-06,6.76e-06,6.93e-06,6.64e-06,6.43e-06,6.55e-06,6.31e-06,6.47e-06,6.32e-06,6.25e-06,6.24e-06,6.32e-06,5.4e-06,6.04e-06],"winrateAvg":0.617916,"leadAvg":1.13248,"scoreMeanAvg":1.68358,"scoreStdevAvg":14.4836,"shorttermWinlossErrorAvg":0.087783,"shorttermScoreErrorAvg":0.742267,"ownership":[-36,-32,-28,-24,-17,-6,6,19,34,49,56,53,20,-6,-49,-72,-83,-81,-80,-39,-35,-33,-27,-20,-5,7,21,36,51,68,68,81,-40,-56,-88,-82,-82,-75,-42,-43,-44,-44,-30,-2,-3,14,27,42,91,88,81,81,78,-88,-80,-65,-69,-45,-47,-55,-85,-24,-11,-1,11,20,16,54,91,90,-40,75,-87,-79,-71,-61,-47,-54,-54,-37,-20,-9,-4,3,12,27,50,-14,-36,-35,-37,92,-80,-81,-16,-41,-48,-83,-31,-15,-8,-5,-3,-1,-2,-12,-4,-4,23,45,92,92,49,43,-29,-31,-13,-3,-7,-4,-5,-5,-7,-8,-13,-23,-5,73,19,37,73,92,76,-18,-17,-8,-5,-3,-3,-3,-5,-7,-8,-9,-7,3,18,-1,-11,90,84,81,-12,-13,-10,-5,-4,-3,-3,-4,-5,-6,-6,-5,7,8,-27,-89,-43,82,70,-10,-12,-9,-8,-3,-3,-3,-3,-3,-3,-3,-3,2,-1,-33,-90,79,75,57,-11,-11,-9,-9,-5,-4,-3,-2,-2,-2,-1,-1,1,-2,-36,-90,79,69,13,-14,-13,-3,-9,-4,-4,-3,-2,-2,-1,0,1,4,-7,-24,-90,80,-18,-5,-18,-22,-17,-11,-7,-4,-3,-2,-3,-3,-1,3,12,4,41,-90,-90,-29,-44,-17,-25,-60,-7,-14,0,-1,-2,-5,-5,-2,3,26,15,-7,-37,-90,-78,-60,-10,-2,20,11,5,6,10,0,-9,-8,-7,0,21,34,-45,14,-13,-58,-64,0,0,31,77,31,27,19,-3,-10,-12,-11,-2,25,89,89,89,3,-68,-46,3,5,14,34,36,30,70,2,-45,-22,-26,-62,8,27,49,69,82,-24,-22,6,9,19,24,24,28,23,4,-19,-27,-32,-32,-3,16,45,56,50,37,-6,11,14,17,23,26,25,17,1,-16,-26,-29,-24,-7,17,35,49,46,35,22],"ownershipAllowedMAE":0.029469})%"); + lines.push_back(R"%({"sample":{"board":"............./............./..XX........./...O.....O.../............./............./.O.........../O.O........../.OXX.....O.../.XOX........./..OX......X../............./............./","hintLoc":"null","initialTurnNumber":18,"metadata":"2BA5E295D2E6B9FC8C11B5F3E1B08072:28","moveLocs":["B3","L4","K3","J4","K4","L5","J5","H4","J6","J2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.29,"xSize":13,"ySize":13},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":-6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.96e-06,1.17e-05,1.14e-05,1.53e-05,1.83e-05,2.29e-05,2.43e-05,2.72e-05,3.18e-05,3.27e-05,2.78e-05,2.21e-05,8.38e-06,1.2e-05,2.56e-05,1.97e-05,2.62e-05,6.84e-05,0.000124,0.000179,0.000255,0.000475,0.000404,0.000311,0.000109,2.23e-05,1.85e-05,4.37e-05,0,0,0.000112,0.000478,0.000671,0.00077,0.00109,0.00528,0.00286,0.000448,3.22e-05,2.51e-05,9.74e-05,0.000389,0,0.000997,0.000674,0.000564,0.000753,0.00301,0,0.0108,0.000502,4.06e-05,2.95e-05,0.00177,0.00044,0.000276,0.000189,0.000261,0.000319,0.000532,0.000792,0.011,0.0126,0.000826,4.14e-05,2.86e-05,0.000196,0.000963,0.000391,0.000401,0.000285,0.000284,0.000276,0.000553,0.000908,0.00161,0.000555,3.39e-05,1.29e-05,0,7.91e-05,0.000372,0.000583,0.00039,0.000292,0.00013,8.58e-05,0.000716,0.00269,0.000346,3.33e-05,0,0,0,0.000232,0.000145,0.000311,0.000581,4.84e-05,0,0.0354,0.000478,0.00346,3.29e-05,3.52e-05,0,0,0,4.4e-05,0.000128,0.000689,0.000135,0,0,0,0.000131,6.64e-05,1.8e-05,0,0,0,2.44e-05,8.53e-05,0.000143,0,0,0,0,0.0124,0.000186,1.01e-05,0,0,0,4.43e-05,0.000196,0.000237,5.95e-05,0.437,0,0,0.0791,0.00012,1.04e-05,2.92e-05,5.11e-05,4.74e-05,7.7e-05,0.000167,0.000925,0.000883,0,0.339,4.54e-05,0.0126,5.79e-05,7.83e-06,1.12e-05,2.12e-05,1.8e-05,2.18e-05,2.67e-05,3.29e-05,3.57e-05,6.15e-05,0.000106,5.36e-05,3.23e-05,9.83e-06,1.82e-05],"winrateAvg":0.0018283,"leadAvg":-14.0427,"scoreMeanAvg":-14.244,"scoreStdevAvg":9.08578,"shorttermWinlossErrorAvg":0.0106731,"shorttermScoreErrorAvg":1.36569,"ownership":[-57,-61,-59,-52,-35,-17,-4,6,14,18,19,20,20,-51,-62,-67,-59,-39,-19,-4,5,16,19,23,21,22,-40,-47,-81,-80,-25,-9,0,10,21,29,27,27,25,-18,-25,2,42,-13,10,4,8,17,75,35,29,29,12,-10,8,6,4,2,2,3,9,21,31,35,32,35,34,7,11,1,1,-1,-1,4,18,37,39,37,56,67,36,8,-2,0,-4,-2,-2,18,43,45,38,64,60,62,4,-5,-2,-3,-9,-48,-2,38,41,37,27,62,-95,-95,-23,-6,15,11,-49,76,77,50,29,-28,-79,-76,-95,-39,-10,13,54,53,-49,76,21,15,-58,-78,-75,-94,-41,-19,5,32,-35,-54,-53,-12,-14,-63,-76,-75,-79,-56,-5,8,5,17,-56,-44,-41,-27,-69,-76,-77,-69,-46,-20,-4,0,-20,-34,-41,-39,-32],"ownershipAllowedMAE":0.0570365})%"); + lines.push_back(R"%({"sample":{"board":".............../...XXO...OX..../...XOO.OXO...../.X.XOXO.X..OO../.XOOXXOO.....O./......XXOO.OX../..O.XX......OX./...OO....XOOOX./..X...X..OXOXX./.....X...XXXOX./..X.X.......OOX/...XO.....XOOX./.XXOO..X.X..OXX/..O......OO.OX./.............O./","hintLoc":"null","initialTurnNumber":85,"metadata":"299ED83EE2BF6FC3E90E2727A381C6D0:95","moveLocs":["H9","G9","G2","J2","L3","K4","J7","K1","H6","G3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.13,"xSize":15,"ySize":15},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":5.5,"policyOptimism":0.234,"pda":0.0,"policyMixture":[5.77e-06,8.28e-06,8.14e-06,1.3e-05,2.59e-05,1.74e-05,8.67e-06,7.9e-06,7.8e-06,7.05e-06,6.77e-06,6.36e-06,6.23e-06,6.56e-06,5.71e-06,8.72e-06,2.02e-05,1.18e-05,0,0,0,7.76e-06,1.34e-05,3.36e-05,0,0,7.3e-06,7e-06,6.89e-06,6.67e-06,8.29e-06,2.33e-05,1.52e-05,0,0,0,8.01e-06,0,0,0,7.46e-06,7.04e-06,6.98e-06,7.15e-06,6.3e-06,7.93e-06,0,0.000118,0,0,0,0,6.5e-06,0,8.3e-06,7.46e-06,0,0,7.49e-06,6.94e-06,7.48e-06,0,0,0,0,0,0,0,1.32e-05,7.83e-06,7.81e-06,7.51e-06,9.76e-06,0,7.5e-06,6.77e-06,1.41e-05,7.05e-06,7.62e-06,0.00288,1.07e-05,0,0,0,0,7.29e-06,0,0,0.011,1.16e-05,6.9e-06,7.2e-06,0,2.24e-05,0,0,0,0,1.22e-05,4.46e-05,7.29e-06,7.31e-06,0,0,2.87e-05,6.82e-06,9.8e-06,8.88e-06,0,0,1.3e-05,1.51e-05,0.0499,0.123,0,0,0,0,0,8.57e-06,7.09e-06,4.11e-05,0,1.04e-05,8.86e-06,0.00423,0,0.000226,0,0,0,0,0,0,7.37e-06,7.33e-06,3.63e-05,4.33e-05,0.00876,1.92e-05,0,0.0387,0,8.06e-05,0,0,0,0,0,0.157,7.18e-06,2.4e-05,0,1.93e-05,0,0.00162,0.192,0.0054,3.73e-05,8.67e-05,2.08e-05,6.82e-06,0,0,0,7.68e-06,2.86e-05,5.46e-05,0,0,0.000207,0.0195,4.46e-05,4.69e-05,0,0,0,0,0,0,7.58e-06,0,0,0,0,0.0092,0,0,1.9e-05,0,0,5.54e-06,0,0,0,7.71e-06,0.11,0,7.59e-06,0.00543,0.0649,0,3.1e-05,0,0,0,1.96e-05,0,0,5.7e-05,6.3e-06,8.61e-06,7.28e-06,0.000106,1.16e-05,1.03e-05,3.73e-05,2.87e-05,1.44e-05,0,0.19,1.32e-05,0.00328,0,0.000111,9.26e-06],"winrateAvg":0.732743,"leadAvg":1.4943,"scoreMeanAvg":2.38717,"scoreStdevAvg":10.0727,"shorttermWinlossErrorAvg":0.220035,"shorttermScoreErrorAvg":1.65041,"ownership":[-86,-84,-82,-71,-40,-11,57,65,72,75,74,72,72,73,75,-86,-86,-84,-89,-89,83,63,73,69,89,65,75,72,74,76,-86,-84,-84,-88,83,82,80,86,57,89,77,81,83,75,79,-84,-88,-61,-87,81,-77,85,70,58,77,80,98,98,87,85,-77,-89,-53,-53,-78,-78,84,85,81,81,81,80,82,97,83,-73,-69,-65,-70,-70,-79,-87,-87,97,97,84,97,60,62,75,-70,-68,-55,-68,-88,-89,-88,66,66,88,82,94,97,37,58,-73,-73,-70,-57,-58,-75,-40,11,83,78,97,97,97,38,52,-76,-77,-86,-73,-73,-79,-94,4,83,84,-90,97,39,36,44,-78,-81,-73,-68,-80,-97,-29,74,23,-90,-90,-90,64,35,43,-79,-82,-94,-87,-95,-72,-1,14,-15,-54,-71,-42,63,64,42,-78,-80,-85,-91,-5,-43,-31,-29,-39,-92,-93,64,64,43,46,-70,-90,-90,-4,-2,-34,-91,-93,-88,-93,53,49,65,41,44,-67,-27,-8,-11,-8,-18,-19,-52,-92,54,53,42,66,43,53,-47,-37,-18,-12,-15,-20,-38,-58,-85,-88,2,39,59,63,58],"ownershipAllowedMAE":0.0431922})%"); + lines.push_back(R"%({"sample":{"board":".................../.............OOXX../...X........OX.OX../.......X.O.....OX../...X...........O.../........O.......X../.................../.................../.X................./.OX.X............../............O....../.................../.................../..X.............XO./...X..O........XOO./..XOXXOX...O....X../..XO.O.O.....OOOX../..O.O.O.......XX.../.....O............./","hintLoc":"null","initialTurnNumber":54,"metadata":"19483C3CF8D8A84E0B00182B2F36C021:64","moveLocs":["O2","N3","R7","S7","R8","S8","Q4","R9","M17","N16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.02e-06,5.47e-06,5.14e-06,6.01e-06,5.71e-06,5.95e-06,6.65e-06,6.76e-06,6.67e-06,6.67e-06,5.87e-06,6.83e-06,6.1e-06,6.04e-06,6.79e-06,5.6e-06,5.29e-06,5.35e-06,5.63e-06,5.56e-06,5.85e-06,6.76e-06,6.84e-06,8.43e-06,9.81e-06,1.36e-05,6.46e-05,8.28e-05,1.73e-05,3.5e-05,0.0001,9.76e-06,0,0,0,0,4.87e-06,5.25e-06,5.42e-06,6.46e-06,5.82e-06,0,8.52e-06,3.55e-05,5.15e-05,9.57e-05,0.01,0.823,1.01e-05,0,0,0,6.52e-06,0,0,4.9e-06,5.45e-06,5.7e-06,6.67e-06,6.89e-06,7.17e-06,9.26e-06,2.99e-05,1.49e-05,0,4.21e-05,0,1.12e-05,0.000288,0,9.18e-06,5.36e-06,0,0,5.06e-06,5.89e-06,5.81e-06,7.46e-06,7.27e-06,0,9.46e-06,4.01e-05,0.000165,1.36e-05,0.000114,0.00312,0.000349,1.98e-05,1.28e-05,9.47e-06,6.55e-06,0,7.87e-06,7.03e-06,5.21e-06,5.84e-06,7.45e-06,8.58e-06,8.45e-06,1.14e-05,5.11e-05,0.000733,0.000417,0,8.6e-05,4.76e-05,3.03e-05,1.08e-05,1.25e-05,7.93e-06,8.76e-05,0,7.67e-06,5.7e-06,5.51e-06,7.61e-06,8.57e-06,9.81e-06,1.66e-05,7.1e-05,0.000107,0.000188,9.94e-05,5.52e-05,4.14e-05,1.67e-05,1.26e-05,1.24e-05,1.53e-05,1.27e-05,3.51e-05,2.55e-05,5.65e-06,5.47e-06,6.85e-06,9e-06,9.26e-06,1.26e-05,4.84e-05,0.000108,0.000135,0.000109,7.68e-05,4.25e-05,1.88e-05,1.33e-05,1.28e-05,1.34e-05,1.25e-05,2.76e-05,1.1e-05,5.72e-06,5.6e-06,0,7.81e-06,9.98e-06,9.56e-06,2.36e-05,0.000124,0.000155,0.000107,6.75e-05,4.49e-05,2.38e-05,1.41e-05,1.44e-05,1.65e-05,4.56e-05,0.000124,2.25e-05,6.03e-06,6.37e-06,0,0,7.85e-06,0,1.08e-05,0.00011,0.000145,0.000101,6.5e-05,4.68e-05,3.48e-05,5.11e-05,2.2e-05,2.94e-05,2.16e-05,0.00012,0.000806,6.06e-06,5.52e-06,9.12e-06,8.63e-06,9.54e-06,9.59e-06,3.53e-05,0.000131,0.00011,7.8e-05,5.39e-05,3.56e-05,6.58e-05,0,4.8e-05,3.32e-05,0.0164,0,8.94e-06,5.67e-06,5.44e-06,6.98e-06,7.68e-06,9.1e-06,3.45e-05,0.000119,0.000111,7.94e-05,4.89e-05,3.04e-05,2.5e-05,2.69e-05,6.12e-05,6.15e-05,0.000321,1.16e-05,0,0,5.09e-06,5.44e-06,6.59e-06,6.69e-06,7.85e-06,1.47e-05,0.000373,0.000109,6.91e-05,2.18e-05,1.57e-05,1.61e-05,2.73e-05,4.86e-05,0.000105,0.127,6.61e-06,0,0,5e-06,5.61e-06,5.92e-06,0,5.75e-06,9.11e-06,0.000304,0.000292,2.15e-05,1.06e-05,1.17e-05,1.74e-05,3.03e-05,0.00011,5.2e-05,0.000102,1.15e-05,0,0,4.81e-06,5.26e-06,5.36e-06,4.88e-06,0,5.96e-06,1.06e-05,0,9.56e-06,7.47e-06,1e-05,1.5e-05,5.38e-05,4.12e-05,3.28e-05,6.5e-06,0,0,0,5.58e-06,5.62e-06,5.76e-06,0,0,0,0,0,0,7.13e-06,9.33e-06,1.7e-05,0,7.52e-06,7.41e-06,6.53e-06,0,0,1.01e-05,7.23e-06,5.89e-06,6.31e-06,0,0,2.41e-05,0,0,0,7.53e-06,8.22e-06,2.71e-05,8.04e-06,0,0,0,0,0,7.09e-06,6.25e-06,5.8e-06,8.03e-06,0,0.000265,0,0,0,5.88e-06,6.43e-06,7.45e-06,7.74e-06,1.18e-05,0.00861,0,0,0,5.78e-06,7.54e-06,6.43e-06,5.34e-06,5.83e-06,5.93e-06,6.71e-06,4.78e-06,0,4.97e-06,5.3e-06,5.52e-06,5.68e-06,6.31e-06,6.75e-06,6.57e-06,5.41e-06,4.95e-06,4.99e-06,5.59e-06,5.83e-06,5.73e-06,6.36e-06],"winrateAvg":0.590829,"leadAvg":0.261511,"scoreMeanAvg":0.601537,"scoreStdevAvg":12.4257,"shorttermWinlossErrorAvg":0.123594,"shorttermScoreErrorAvg":0.870464,"ownership":[-62,-63,-61,-60,-55,-50,-44,-37,-29,-16,4,24,55,68,20,-5,-80,-84,-85,-63,-63,-68,-62,-60,-50,-48,-38,-33,-20,-5,23,55,91,91,-89,-89,-86,-85,-61,-63,-66,-93,-46,-48,-50,-47,-27,-48,4,-24,91,66,85,90,-89,-87,-84,-58,-61,-65,-66,-49,-38,-44,-84,-36,58,26,30,91,68,66,89,-89,-85,-79,-56,-57,-63,-90,-37,-26,-13,-18,0,7,21,32,34,38,43,89,19,-72,-62,-55,-55,-50,-37,-26,-11,-5,2,61,20,17,22,25,21,23,-17,-85,-62,-41,-55,-54,-42,-32,-18,-6,3,5,14,15,16,17,18,17,9,-3,-9,-24,-25,-61,-58,-39,-31,-19,-4,2,7,12,13,14,15,15,13,10,6,11,3,-1,-66,-86,-43,-49,-28,-6,3,7,11,13,13,14,15,12,11,16,16,17,24,-71,-60,-92,-58,-83,-8,0,7,11,13,13,16,21,16,18,30,42,33,52,-63,-68,-43,-37,-22,-4,5,9,12,14,16,21,77,23,20,28,91,83,73,-61,-57,-47,-24,-11,17,11,13,14,15,16,18,21,15,11,24,-30,90,84,-63,-64,-48,-19,-13,-6,10,14,16,17,18,18,15,10,8,5,-30,90,86,-63,-71,-88,-36,-7,-8,14,24,23,22,22,19,7,1,-21,-21,-31,89,82,-55,-62,-80,-84,-35,23,92,45,35,33,32,27,10,-5,-23,-88,90,90,61,-32,-70,-82,94,-37,-36,96,29,49,45,55,91,43,16,-14,-91,-91,-4,26,-13,-6,-81,96,17,99,95,98,62,59,55,73,91,91,90,91,-91,-74,-18,17,12,95,93,99,98,100,87,75,63,56,59,-8,-86,-87,-87,-84,-62,-40,43,84,86,94,97,99,96,87,74,63,47,14,-21,-48,-70,-81,-81,-75,-64],"ownershipAllowedMAE":0.0299549})%"); + lines.push_back(R"%({"sample":{"board":"....O.O..O.OOOOX../..XO.OO.OOOOXXX..X/.X.XO....OOXX.XXXX/.XXXOOO..OX.XXO.O./.OXO...OOXX.XOXXXX/.OOO....OX.XXOOOOO/......OOOX.X.XO.../..O.OO.OXOXX.XO.../...XXXOOXOOOOOO.../.OOO.XXOXXXXXXO.../OXXO.OXXXXOOXO.O../.X.XO.OOOXOOO.OX../.XXXO.OOXOXOOO.O../.XOOOOXOXOXX....X./...OXXXXXO.XOOOOO./..XX.....X.XOXXXO./...........XXOX.XO/................X./","hintLoc":"null","initialTurnNumber":220,"metadata":"3D3F37FD38E8A24642A982BC0C363B50:230","moveLocs":["D11","D12","C10","B10","L4","A9","C18","A7","A6","A15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.18,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000376,0.000394,0,0.0818,0,0,0,0.000369,0.000362,0,0,0,0,0,0,0,0.000386,0.000379,0.000504,0.000491,0,0,0,0,0,0.00037,0,0,0,0,0,0,0,0.000438,0.00039,0,0.269,0,8.11e-05,0,0,0.000363,0.000366,0.000373,0.00037,0,0,0,0,0.000375,0,0,0,0,0,0,0,0,0,0,0,0.000369,0.000372,0,0,0.000401,0,0,0,0.000433,0,0.000442,0.011,0,0,0,0.000385,0.000371,0.00037,0,0,0,0,0.0004,0,0,0,0,0,0,0.000409,0,0,0,0.000382,0.000374,0.000369,0.000369,0,0,0.000394,0,0,0,0,0,0,0,0.0111,0.000844,0.0135,0,0.000408,0.000394,0,0,0,0,0.000399,0,0.00722,0,0,0.000364,0.000368,0.00037,0.0104,0.0176,0,0,0,0,0,0,0,0,0,0,0.0421,0,0,0.000366,0.000368,0.000364,0.0118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000367,0.000367,0.000366,0,0,0,0,0.0681,0,0,0,0,0,0,0,0,0,0,0.000369,0.000366,0.000367,0,0,0,0,0.000497,0,0,0,0,0,0,0,0,0,0,0,0.000371,0.000366,0,0,0.000108,0,0,0.0179,0,0,0,0,0,0,0,0,0,0,0.000371,0.000364,0,0,0,0,0,0.0169,0,0,0,0.0929,0,0,0,0,0.00037,0,0.000365,0.000364,0.000258,0,0,0,0,0,0,0,0,0.000394,0,0,0.157,0.000454,0.000395,0.000372,0,0.000378,0.000396,0.00432,0.0881,0,0,0,0,0,0,0.000415,0,0,0,0,0,0,0,0.000412,0.000383,0.000384,0,0,0.000421,0.000371,0.000369,0.00037,0.000412,0,0.000412,0,0,0,0,0,0,0.0155,0.000377,0.000378,0.000367,0.000373,0.000372,0.000375,0.000376,0.000376,0.000371,0.000374,0.000373,0,0,0,0,0.00601,0,0,0.000361,0.000374,0.000373,0.000374,0.00037,0.000373,0.000373,0.000375,0.000374,0.000376,0.00037,0.00037,0.000388,0.00702,0.003,0.00235,0,0.00424,0.00292],"winrateAvg":0.999391,"leadAvg":2.41498,"scoreMeanAvg":2.40511,"scoreStdevAvg":0.972878,"shorttermWinlossErrorAvg":0.0117145,"shorttermScoreErrorAvg":0.387039,"ownership":[-100,-100,-100,-24,99,99,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,95,96,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-97,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,99,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,99,100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-94,-98,100,100,100,100,100,100,100,-100,100,100,100,100,-100,100,-100,-100,78,-98,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,63,-100,-100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,-100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,100,-100,-100,-100,-100,-53,60,100,100,100,100,-100,-100,34,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-27],"ownershipAllowedMAE":0.00606486})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..OOX............../..OXX..........O.../.................../..O.............O../...X..X............/.................../..O................/.O................./OXOO...X........X../.XXO.............../.X.............X.../...O...X..X.XOOX.../..XO.O.........OX../..X...XX..OOOO.OX../.XXOOXXO.O.XX.OX.../.OXOXXOO......XX.../.XOO.............../","hintLoc":"null","initialTurnNumber":69,"metadata":"460F3A347C351BAD435C4494F9637673:79","moveLocs":["C13","K17","O8","O17","G16","J14","G18","F18","J16","K16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.49,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.97e-06,8.58e-06,9.04e-06,1.56e-05,1.38e-05,2.88e-05,2.76e-05,1.01e-05,9.89e-06,9.78e-06,9.69e-06,9.69e-06,9.68e-06,9.53e-06,9.49e-06,9.57e-06,9.36e-06,8.8e-06,7.94e-06,8.18e-06,8.21e-06,9.4e-06,1.36e-05,0.000119,0,0,1.18e-05,0.0156,0.000104,2.25e-05,2.93e-05,1.43e-05,2.96e-05,3.92e-05,2.02e-05,1.11e-05,9.52e-06,8.6e-06,8.26e-06,7.73e-06,0,0,0,0.000678,1.11e-05,2.02e-05,0.00104,0,1.49e-05,0.000144,9.94e-05,0,0.000295,1.3e-05,1.07e-05,9.67e-06,8.49e-06,8.54e-06,7.5e-06,0,0,0,1.07e-05,0,1.01e-05,0,0,1.5e-05,5.89e-05,6.1e-05,0.000108,1.1e-05,0,1.05e-05,9.46e-06,8.48e-06,7.93e-06,8.44e-06,8.19e-06,1.15e-05,3.74e-05,0.617,2.95e-05,1.38e-05,0.0543,0.000114,1.94e-05,2.77e-05,1.56e-05,1.3e-05,1.16e-05,9.74e-06,9.32e-06,9.23e-06,8.74e-06,8.25e-06,7.53e-06,0,1.46e-05,2.32e-05,0.0657,0.0703,0.0695,0,5.37e-05,1.67e-05,1.46e-05,1.37e-05,1.32e-05,1.21e-05,1.04e-05,0,9.43e-06,8.93e-06,8.17e-06,7.58e-06,0,0,1.26e-05,0.00868,0,0.00532,0.000138,2.37e-05,1.59e-05,1.41e-05,1.34e-05,1.3e-05,1.22e-05,1.09e-05,9.87e-06,1.02e-05,8.94e-06,8.29e-06,7.76e-06,7.76e-06,1.06e-05,1.34e-05,1.66e-05,5.68e-05,3.67e-05,3.9e-05,2.59e-05,1.73e-05,1.45e-05,1.35e-05,1.29e-05,1.23e-05,1.18e-05,1.22e-05,1.13e-05,9e-06,8.16e-06,8.02e-06,0,8.83e-06,1.15e-05,1.93e-05,5.95e-05,8.07e-05,6.05e-05,4.13e-05,2.49e-05,1.57e-05,1.41e-05,1.29e-05,1.23e-05,1.2e-05,1.44e-05,1.17e-05,9.04e-06,8.78e-06,0,7.79e-06,7.75e-06,9.95e-06,1.32e-05,4.48e-05,0.000133,0.000102,9.54e-05,4.55e-05,1.99e-05,1.48e-05,1.3e-05,1.22e-05,1.25e-05,1.99e-05,1.13e-05,8.84e-06,0,0,0,0,9.81e-06,1.4e-05,7.68e-05,0,0.000216,0.0003,0.000144,8.03e-05,1.81e-05,1.2e-05,1.18e-05,1.39e-05,0,1.19e-05,8.85e-06,1.35e-05,0,0,0,1.09e-05,4.1e-05,0.000331,0.000368,0.000443,0.00422,0.000609,7.17e-05,1.23e-05,0,1.04e-05,0.000248,5.59e-05,9.88e-06,8.63e-06,8.72e-06,0,1.01e-05,7e-05,2.44e-05,2.45e-05,0.000468,0.0051,0.000234,0.00224,1.93e-05,3.44e-05,1.16e-05,8.86e-06,9.29e-06,0,1.22e-05,9.51e-06,8.27e-06,8.83e-06,1.29e-05,8.05e-05,0,9.83e-06,1.42e-05,6.26e-05,0,6.13e-05,3.93e-05,0,1.09e-05,0,0,0,0,1.16e-05,9.09e-06,8.09e-06,7.74e-06,1.47e-05,0,0,9.37e-06,0,8.28e-05,1.17e-05,2.41e-05,9.78e-05,1.1e-05,8.81e-06,9.11e-06,7.62e-06,8.53e-06,0,0,9.01e-06,7.98e-06,1.07e-05,6.38e-06,0,1.03e-05,9.2e-06,8.25e-06,0,0,1.4e-05,9.1e-06,0,0,0,0,9.08e-06,0,0,8.61e-06,7.79e-06,9.33e-06,0,0,0,0,0,0,0,8.46e-06,0,1.01e-05,0,0,4.3e-05,0,0,1.12e-05,8.6e-06,7.7e-06,9.24e-06,0,0,0,0,0,0,0,8.36e-06,8.88e-06,1.02e-05,1.08e-05,1.04e-05,1.19e-05,0,0,9.02e-06,8.16e-06,7.72e-06,0.0712,0,0,0,9.8e-06,1.01e-05,8.45e-06,8.14e-06,8.78e-06,9.49e-06,9.03e-06,9.54e-06,9.4e-06,8.96e-06,8.13e-06,7.96e-06,7.93e-06,8.03e-06,7.97e-06,9.03e-06],"winrateAvg":0.318861,"leadAvg":-1.66319,"scoreMeanAvg":-2.89427,"scoreStdevAvg":14.2171,"shorttermWinlossErrorAvg":0.177848,"shorttermScoreErrorAvg":1.72257,"ownership":[64,55,40,26,-8,-15,3,-9,-25,-34,-40,-39,-37,-29,-18,-9,-6,-3,2,73,66,66,12,-14,-46,23,-35,-18,-46,-45,-40,-43,-38,-8,-7,-7,0,8,78,81,88,88,-54,-15,1,1,-27,-84,-44,-29,-35,-70,23,27,5,15,14,82,84,88,-56,-53,-8,43,6,31,-84,-35,-26,-23,-6,12,75,38,26,24,84,87,22,-14,-8,38,2,-15,-11,-27,-22,-13,-9,-5,9,27,40,36,31,85,87,93,-36,4,9,-5,-15,-71,-27,-14,-9,-5,1,8,22,75,37,31,82,87,93,-51,3,10,-64,-18,-19,-15,-10,-6,-3,0,3,6,11,21,21,77,82,41,5,4,-11,-12,-15,-12,-9,-6,-4,-1,0,0,1,-4,4,7,71,82,96,19,12,2,-8,-12,-11,-7,-6,-4,-2,0,0,-2,1,-9,-8,46,94,87,24,12,1,-6,-20,-14,-9,-8,-8,-4,0,-2,-7,-7,-28,-25,44,-66,97,97,32,4,-12,-69,-19,-14,-12,-11,-6,8,1,-18,-82,-50,-41,-33,-67,-66,97,40,8,-4,-22,-20,-14,-15,-12,-6,72,7,-17,-59,-65,-55,-47,-68,2,59,43,7,-7,-20,-26,-18,-23,-12,-12,31,-6,-92,-71,-72,-66,-49,-58,-20,89,46,11,-12,-75,-30,-25,-65,-14,-48,85,86,-93,-88,-82,-77,-51,-54,-70,89,60,76,14,-41,-14,-7,15,27,15,69,71,75,-98,-91,-86,-56,-56,-69,13,40,-19,-73,-73,-4,33,92,92,92,91,60,75,-99,-95,-91,-44,-68,-70,84,83,-74,-73,82,34,88,27,-81,-81,17,71,-99,-96,-96,-94,-22,60,-70,84,-73,-73,81,81,64,44,-7,-40,-71,-77,-98,-99,-97,-96,-95,58,60,86,84,2,-27,11,61,60,41,12,-27,-58,-79,-88,-95,-97,-97,-96],"ownershipAllowedMAE":0.031048})%"); + lines.push_back(R"%({"sample":{"board":"O.O.....X........../.OXXXOOX.X.XXX...../.OOXO..OX.O.O..XX../.XXOOOOOX..O..OOX../..O.....XOOXXX.XOO./.XO...OX.OX..X.X.../.O.O...XOOOXX....X./.O.O...OXOX.....OX./O.OXO.....X......X./.OX..O..........O../...XO.O...OX....O../..XXXOO...XX.X.XX../.X..OXO.....OX...../X..X.X...OXX..O..../OXX.XXXX..O.XXO.XX./OOOXOXOOO.OXXOXX.../...OOO....OOXOOX.O./...........OXO.OO../..............O..../","hintLoc":"null","initialTurnNumber":165,"metadata":"E8507462FB6A14EDBB8062EB7D77FFE2:175","moveLocs":["G13","J11","K11","K10","J10","H11","G12","N16","M17","O17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.28,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":8.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0.000134,0,0.000133,0.000138,0.000148,0.000293,0.000211,0,0.000143,0.000162,0.000138,0.000125,0.000121,0.000122,0.000124,0.000125,0.000131,0.000124,0.00013,0,0,0,0,0,0,0,0,0,0.00215,0,0,0,0.00013,0.000143,0.000144,0.000126,0.000133,0.000132,0,0,0,0,0.000133,0.000131,0,0,0.00184,0,0,0,0,0.000134,0,0,0.000137,0.000122,0.000133,0,0,0,0,0,0,0,0,0.000218,0.0233,0,0,0.000118,0,0,0,0.000131,0.000122,0.000125,0.000133,0,0.000132,0.000128,0.000136,0.00015,0.0303,0,0,0,0,0,0,0.000129,0,0,0,0.000127,0.000131,0,0,0.000131,0.000127,0.00013,0,0,0.000218,0,0,0.00631,0.000124,0,0.000129,0,0.000152,0.000125,0.000124,0.000126,0,0.000134,0,0.000128,0.000128,0,0,0,0,0,0,0,0.000126,0.000122,0.000123,0.000263,0,0.000125,0.000135,0,0.000134,0,0.000133,0.000131,0,0,0,0,0,0.000926,0.000132,0.000126,0.000125,0.000122,0,0,0.000124,0,0.000143,0,0,0,0.000137,0.0036,0,0,0,0,0.000331,0.000146,0.000127,0.000125,0.000123,0.000135,0,0.000128,0.000166,0,0,0.00949,0.000161,0,0.000157,0.222,0,0,0.00269,0.000632,0.000142,0.000129,0.000125,0.000121,0,0.000132,0.000129,0.000574,0.00514,0.000159,0,0,0.000147,0,0.000292,0.141,0.337,0,0,0.000134,0.000128,0.000128,0.000129,0,0.00013,0.000137,0.00216,0.000195,0,0,0,0,0,0.00017,0.00146,0.0635,0,0,0.000131,0,0.000138,0,0,0.000295,0.000135,0.00191,0,0.000149,0.000154,0,0,0,0.000181,0.000614,0.00317,0.00565,0.000803,0,0,0.000146,0.000154,0.00109,0.00662,0.00026,0,0.00681,0.000291,0,0.00013,0,0.000175,0.000209,0.000235,0,0,0,0.000252,0.000225,0,0.000433,0.0149,0.00749,0.00307,0,0,0,0.000441,0,0,0,0,0.000578,0.000192,0,0.000164,0,0,0,0.0043,0,0,0.00772,0,0,0,0,0,0,0,0,0,0.000151,0,0,0,0,0,0,0.00834,0.0307,0.0101,0.00012,0.000134,0.000137,0,0,0,0.000134,0.000131,0.000129,0.000132,0,0,0,0,0,0,0.00125,0,0.00092,0.000131,0.000138,0.000128,0.000131,0.000126,0.000128,0.00013,0.000131,0.000132,0.00013,0.000131,0,0,0,0.000158,0,0,0.00016,0.000161,0.000123,0.000129,0.000127,0.00013,0.000128,0.000128,0.000127,0.000129,0.000131,0.000132,0.000149,0.00017,0.00519,0.000174,0,0.000112,0.000134,0.000147,0.000129,0.000188],"winrateAvg":0.00086659,"leadAvg":-5.67438,"scoreMeanAvg":-5.6551,"scoreStdevAvg":2.52996,"shorttermWinlossErrorAvg":0.0135895,"shorttermScoreErrorAvg":0.714395,"ownership":[99,98,99,97,98,96,60,-19,-99,-98,-99,-99,-99,-99,-99,-98,-98,-98,-99,97,100,96,96,96,100,100,-96,-96,-100,-57,-100,-100,-100,-99,-98,-98,-98,-98,98,100,100,96,100,99,99,100,-99,-57,86,86,88,-100,-98,-100,-100,-98,-98,97,96,96,100,100,100,100,100,-99,11,80,88,-100,-98,-97,-97,-100,-98,-98,97,98,100,98,97,97,57,25,-99,99,99,-100,-100,-100,-98,-100,-97,-97,-98,97,96,100,98,98,98,100,-91,-50,99,-3,6,-87,-100,-98,-100,-98,-98,-98,98,100,99,100,98,98,100,-91,99,99,99,-100,-100,-98,-98,-98,-98,-100,-98,98,100,99,100,98,98,100,100,99,99,-100,-98,-98,-98,-98,-98,-96,-100,-98,100,98,100,-18,100,97,99,98,98,99,-100,-98,-98,-98,-98,-98,-98,-100,-98,67,99,-59,-20,21,100,98,99,100,-98,-97,-98,-98,-98,-98,-98,-97,-98,-98,30,16,-20,-100,83,81,100,69,39,13,7,-100,-98,-98,-98,-98,-97,-98,-98,-18,-36,-100,-100,-100,100,100,42,24,-8,-100,-100,-98,-100,-98,-100,-100,-98,-98,-71,-100,-99,-99,-98,-100,100,17,11,-30,-51,-98,-96,-100,-98,-98,-98,-98,-98,-99,-98,-99,-100,-99,-100,-5,-19,4,72,-100,-100,-98,-98,-96,-98,-97,-97,-97,99,-100,-100,-43,-100,-100,-100,-100,-10,38,100,-22,-100,-100,-97,-98,-100,-100,-91,99,99,99,-45,100,-100,100,100,100,76,100,-100,-100,99,-99,-99,-24,68,-40,97,97,98,100,100,100,99,98,98,98,100,100,-100,99,99,-99,11,99,75,97,97,97,98,98,98,98,98,98,97,98,100,-100,99,99,100,100,98,97,97,97,97,97,98,98,98,98,98,97,98,23,-11,14,99,99,99,98,98],"ownershipAllowedMAE":0.0239055})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.OOO.O.......OOOX../.XXXX.O.....OX.XX../............OX..OXX/..XOX........O..OO./.X.OX.O....XO..O.../...O.O.....XX.XXX../..XO.............../..XXO..........XO../..OX.....O.....XO../....X...OOX...XOXX./...OX...XO.....OOO./.XXXO...XO........./.OXOXX..XXOOOO...../.OOOOX....XXXO.O.../.....X.......XXXO../....OX........XO.../.................../","hintLoc":"null","initialTurnNumber":105,"metadata":"69D9E92353BEEC0D0343B505ABEFC267:115","moveLocs":["L15","N8","M10","N10","R2","Q18","P18","R18","K14","P16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.9,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":6.5,"policyOptimism":0.365,"pda":0.0,"policyMixture":[3.92e-06,4.47e-06,4.15e-06,4.73e-06,4.11e-06,4.53e-06,4.13e-06,4.2e-06,4.05e-06,4.13e-06,4.62e-06,5.26e-06,5.7e-06,7.29e-06,1.26e-05,8.04e-06,3.85e-06,3.91e-06,3.97e-06,4.14e-06,4.27e-06,4.98e-06,4.6e-06,5.2e-06,6.65e-06,1.92e-05,4.52e-06,4.41e-06,4.56e-06,5.09e-06,1.66e-05,0.00155,5.57e-06,0,0,0,4.41e-06,5.22e-06,4.52e-06,0,0,0,9.33e-05,0,5.36e-06,4.83e-06,4.52e-06,5.03e-06,1.87e-05,9.8e-05,0.000974,0,0,0,0,1.27e-05,2.31e-05,4.41e-06,0,0,0,0,5.57e-06,0,4.86e-06,4.6e-06,4.59e-06,6.39e-06,7.66e-06,0,0,0,0,0,0.001,6.44e-06,4e-06,3.21e-05,2.64e-05,4.39e-06,5.1e-06,1.69e-05,7.47e-06,5.25e-06,4.5e-06,4.43e-06,0,5.55e-06,0,0,1.09e-05,1.72e-05,0,0,0,4.29e-06,0.000268,0,0,0,4.75e-06,5.04e-06,5.58e-06,4.66e-06,0,4.61e-06,0.000104,0.901,0,0.0206,2.95e-05,0,0,0.0175,4.37e-06,0,0.000914,0,0,4.14e-06,0,4.65e-06,4.9e-06,4.82e-06,4.48e-06,0,0,0.0108,0.0195,0,4.89e-06,6.11e-06,6.29e-06,4.27e-06,0.00014,0.00034,0,4.22e-06,0,4.24e-06,4.37e-06,4.51e-06,7.04e-06,4.6e-06,0,0,5.98e-05,0,0,0,2.93e-05,7.86e-06,3.91e-06,5e-06,0,0,4.02e-06,4.36e-06,4.26e-06,4.36e-06,4.4e-06,4.4e-06,4.35e-06,4.45e-06,5.13e-06,8.64e-06,4.09e-06,4.56e-06,0.000161,0.0201,6.44e-06,4.07e-06,4.34e-06,0,0,0,4.41e-06,4.63e-06,4.47e-06,4.3e-06,4.24e-06,4.08e-06,0,0,7.37e-06,1.94e-05,0,0,2.03e-05,7.79e-06,4.13e-06,4.05e-06,0,0,4.38e-06,4.9e-06,4.67e-06,4.42e-06,3.89e-06,0,4.34e-06,6.74e-06,5.84e-06,6.93e-06,3.85e-05,0,0,2.9e-05,4.67e-06,4.4e-06,4.15e-06,4.18e-06,4.21e-06,0,4.51e-06,6.01e-06,4.62e-06,0,0,0,4.15e-06,0,4.7e-06,0,0,0,0,5.27e-06,4.86e-06,1.56e-05,1.32e-05,0,0,4.4e-06,4.57e-06,4.38e-06,0,0,4.22e-06,4.18e-06,4.05e-06,4.33e-06,4.35e-06,0,0,0,3.95e-06,0.00287,0,0,0,0,1.93e-05,4.88e-06,4.01e-06,0,0,4.12e-06,3.84e-06,3.9e-06,3.98e-06,3.83e-06,3.83e-06,3.77e-06,3.79e-06,3.9e-06,4.5e-06,0,0,0,0,0,4.28e-06,4.35e-06,0,0,0,0,0,0,4.19e-06,4.17e-06,4.06e-06,3.98e-06,3.86e-06,4.25e-06,0,0,0,0,0,3.96e-06,4.18e-06,4.5e-06,3.52e-05,0,0,0,0,4.47e-06,0,3.59e-06,3.85e-06,3.93e-06,4.25e-06,4.3e-06,4.12e-06,5.21e-06,3.18e-05,0,3.72e-06,3.97e-06,3.97e-06,1.37e-05,3.06e-05,3.21e-05,0.000605,0,0,0,0,3.89e-06,3.86e-06,4.61e-06,5.3e-06,9.47e-06,1.01e-05,0,0,4.09e-06,3.89e-06,4.07e-06,4.29e-06,9.79e-06,4.39e-05,0.000165,4.33e-06,0,0,0,3.96e-06,3.78e-06,3.99e-06,4.53e-06,4.31e-06,4.7e-06,6.05e-06,2.26e-05,4.49e-06,4.08e-06,3.9e-06,3.89e-06,4.11e-06,4.43e-06,6.22e-06,5.03e-06,7.77e-06,4.3e-06,3.71e-06,3.7e-06,3.76e-06,6.67e-06],"winrateAvg":0.506252,"leadAvg":0.134899,"scoreMeanAvg":0.113949,"scoreStdevAvg":9.24996,"shorttermWinlossErrorAvg":0.269214,"shorttermScoreErrorAvg":1.62998,"ownership":[33,61,68,84,86,89,87,87,87,89,88,82,55,27,-45,-51,-86,-87,-85,12,22,80,83,91,87,89,85,87,89,92,93,90,80,89,-93,-93,-86,-85,-40,87,85,86,-72,95,84,79,80,81,82,78,72,88,87,89,-93,-90,-74,-50,-98,-98,-98,-98,-33,94,69,73,78,86,89,99,-93,-92,-93,-93,-75,-72,-84,-84,-39,12,-52,-15,5,45,59,74,97,41,99,-94,-36,-6,89,-76,-76,-90,-93,-96,81,-72,-13,-6,30,36,92,5,-30,96,97,19,54,89,88,55,-94,-98,31,80,-69,17,83,17,18,4,-26,-94,96,22,41,88,-9,-7,26,-95,-92,9,79,16,85,38,17,5,4,-31,-94,-94,-63,-97,-96,-96,-54,-15,-94,-97,-100,78,52,44,18,11,8,2,-2,-9,-52,-81,-87,-80,-63,-38,-34,-93,-95,-100,-100,63,7,-7,10,15,26,6,49,-87,-79,-83,-94,78,16,-3,-91,-93,-90,-100,-40,-9,-2,22,51,97,25,22,-29,-76,-75,-93,79,77,59,-88,-91,-93,-96,-100,-21,14,8,97,97,-36,-15,-87,-47,-78,99,78,78,89,-82,-89,-92,-90,-100,-37,-23,-28,-99,97,25,3,-19,5,12,99,99,99,93,33,-97,-97,-97,-78,-75,-53,-57,-99,97,70,34,22,31,47,74,91,95,95,42,89,-97,87,-100,-100,-74,-79,-99,-99,98,98,97,97,47,82,91,94,94,78,88,88,87,87,-100,-91,-93,-95,-96,-98,-98,-98,97,-44,96,91,93,94,81,81,70,27,-67,-100,-95,-95,-95,-95,-95,-93,-93,-94,-94,-94,95,94,93,79,73,77,-44,-20,-99,-94,-95,-94,-94,-94,-92,-89,-85,-94,95,94,90,92,76,77,48,3,-65,-70,-92,-93,-93,-93,-92,-89,-77,-76,-17,3,78,86,89],"ownershipAllowedMAE":0.0409622,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":".....XO.....OX...../.....XO....OOX...../...XXX.O..OOX.XX.XX/.XX.O.XO.OXX.X.XXXO/.XOO.XO.OOOX..OXOOO/X.XOOOOOX..O.OOXXO./.XOOXXXXXOO.OXOOXO./.OOX..XXOO.OOXXXO../.OX.XXOO....O...O../OXXXOXXOOO.OXX.XXOO/...O.OXX.XOO.....X./OOO.OOOX.X.OX...X../XO..OXXXOOOOX...XOO/XXXOX.X.X.O.X..X.XX/XOOOX..XO.OO.XX...X/.XOOXXXOOO.O..X.XXX/X.XOOOXXXO.OOOOXXX./X.XXO.XX.XO..OXXOOX/.....OOO.X...OOOOX./","hintLoc":"null","initialTurnNumber":211,"metadata":"FFF6E4AC54D630920346CFC7EC64842D:221","moveLocs":["B14","D7","E9","N15","N16","E10","T9","S12","E9","K6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.16,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":5.0,"policyOptimism":0.0,"pda":0.023,"policyMixture":[0.000353,0.000385,0.000389,0.000393,0.000376,0,0,0.000382,0.000378,0.000388,0.000439,0.0109,0,0,0.000387,0.000403,0.000403,0.000406,0.000381,0.000385,0.000388,0.00039,0.000392,0.000366,0,0,0.000478,0.000443,0.0113,0.0116,0,0,0,0.000395,0.00041,0.000403,0.000399,0.000385,0.000389,0.000388,0.00042,0,0,0,0.101,0,0.000403,0.0135,0,0,0,0.000477,0,0,0.000388,0,0,0.000391,0,0,0.0132,0,0.0167,0,0,0.000378,0,0,0,0,0,0.00791,0,0,0,0,0.000347,0,0,0,0.000385,0,0,0,0,0,0,0,0,0.0103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00467,0.000473,0,0,0,0,0,0,0,0.000374,0.00259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0125,0.00512,0,0,0,0.000454,0.000433,0,0,0,0,0.00037,0,0,0,0,0,0,0,0.0132,0.00161,0,0,0.000543,0,0,0,0,0.000391,0.000383,0.000382,0.000382,0,0.0132,0.00992,0.0135,0,0.0129,0.0128,0,0,0,0,0.175,0,0,0,0,0,0.000387,0,0,0,0.00135,0,0,0,0,0.000844,0.0318,0.00909,0,0,0,0,0,0.000767,0,0,0,0.0169,0.000671,0.000438,0.0004,0.000434,0,0,0,0,0,0,0,0,0,0,0.000792,0,0.000554,0,0,0.000435,0.000403,0.000394,0,0.000419,0.00041,0,0,6.23e-05,0,0,0,0,0,0,0,0,0,0,0.000396,0.000391,0.000407,0,0,0,0,0,0,0,0,0.000431,0,0.362,0,0,0,0.000546,0,0.000434,0.000416,0,0.000421,0,0,0,0,0,0,0,0.000442,0.00249,0,0,0,0,0,0.000733,0,0,0.000413,0.000381,0.000389,0,0.014,0,0,0,0,0,0,0,0,0,0.000377,0,0.00056,0.000624,0,0.000422,0,0,0,0,2.7e-05,0,0,0,0,0,0,0,0,0.000775,0,0,0,0,0,0,0,0.00286,0,0.00045,0,0,0,0.00614,0,0,0.0161,0,0,0.000737,0.000364,0,0,0,0,0,0,4.24e-05,0.000405,0.000495,0.008,0.000428,0,0,0,0.0019,0,0.0142,0.000436,0.000395,0,0,0,0,0,0.000429,0.000404],"winrateAvg":0.000101865,"leadAvg":-20.9062,"scoreMeanAvg":-20.8761,"scoreStdevAvg":1.47931,"shorttermWinlossErrorAvg":0.00399204,"shorttermScoreErrorAvg":0.483658,"ownership":[-100,-100,-100,-100,-100,-100,100,99,99,99,99,99,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,99,99,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-56,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-50,97,-12,-99,100,100,100,-100,-100,-100,-100,1,-100,-100,-100,100,-100,-100,100,100,84,-5,100,100,100,100,100,-100,100,9,100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,-100,4,77,100,100,100,100,-100,-100,100,100,-48,-100,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,100,100,-100,100,100,20,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-99,100,100,100,99,100,-100,-99,-100,-100,100,100,100,100,100,100,100,26,-2,21,100,100,100,100,-100,-100,-100,18,-100,-100,100,100,100,100,100,-100,-100,-87,-100,-100,100,100,99,5,38,94,14,100,-100,-100,-5,-99,100,100,14,-99,-99,-100,-100,-100,-100,100,100,100,92,100,100,100,-100,-73,-99,54,100,-100,-100,-100,-100,-100,-100,-100,-100,100,82,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-99,-99,-100,-100,-100,100,-100,-100,-100,-88,-87,100,100,17,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-99,-100,100,99,100,100,-34,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,59,-61,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-93,-100,-100,-100,-100,100,54,-100,-100,-99,-99,100,99,100,100,-100,-100,100,100,-93,-100,-100,-99,-35,36,99,99,99,-49,-99,72,99,100,100,100,100,100,27,34],"ownershipAllowedMAE":0.0227201})%"); + lines.push_back(R"%({"sample":{"board":"..X.X........X.O.X./.OOXXX..X.OXXXXOOOX/OXOXOX.OXO.XOXOX.X./O.OOOO.XOX..OXOXOX./XOOXXX.X.X.XOXOOOO./XX.XOO...XOOOOXOO../.OXXOX..OXO.OXXXXO./.X.OXX.O.XOOXX..O../OOO.X.....XOO.OXXO./..O......OXOXX..OO./O.OOX.XX.OXXOO.OOX./.OX.X.O.XXOXXOOXOX./OOX.X.XXOOO.XO.XOX./OXX..OOX....XO.XXO./.OOOOOXX.....X.XO.O/OOXOXXOX...X...XOO./.OXXXOOX.......XO../XXXOOOX.X.....X.XO./.......X.......X.../","hintLoc":"null","initialTurnNumber":225,"metadata":"F6AA14DB09D846A4E9E87BB4C5129B9E:235","moveLocs":["B19","O11","Q12","S1","F7","F8","E10","F10","D8","D7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.22,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0button1","komi":35.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000343,0,0,0.00464,0,0.000373,0.000421,0.000388,0.00263,0.000362,0.000358,0.000358,0.000347,0,0.000126,0,0.000215,0,0,0.000339,0,0,0,0,0,0.000829,0.00599,0,0.00104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0,0,0,0.000379,0,0,0,0,0,0.00125,0,0.000474,0,0.000353,0,0,0,0,0.176,0,0,0,0.000829,0.0264,0,0,0,0,0,0,0.00048,0,0,0,0,0,0,0.07,0,0.000399,0,0.0102,0,0,0,0,0,0,0,0.00035,0,0,0.0946,0,0,0,0.00171,0.000429,0.000351,0,0,0,0,0,0,0,0,0.000345,0.000323,0.00103,0,0,0,0,0,0.000368,0.000346,0,0,0,0.000131,0,0,0,0,0,0,0.000327,0.197,0,0.115,0,0,0,0.000342,0,0.00034,0,0,0,0,0,0.0109,0,0,0.000346,0.000324,0,0,0,0.0038,0,0.000359,0.000355,0.000336,0.000337,0.00351,0,0,0,0,0,0,0,0,0.000325,0.000341,0.000326,0,0.0069,0,0,0.000338,0.000337,0.000331,0,0,0,0,0,0.0153,0.000336,0,0,0.000329,0,0.000357,0,0,0,0,0,0,0.000353,0,0,0,0,0,0.000368,0,0,0,0.000352,0.000174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000348,0,0,0,0,0,0,0,0,0,0,0,0.000443,0,0,0.000316,0,0,0,0.000355,0,0,0,0.000587,0.000653,0,0,0,0.000334,0.000337,0.000353,0.00113,0,0,0.0229,0,0,0,0.00035,0.000575,0,0,0,0,0,0,0,0.000332,0.000343,0.000362,0.00171,0.00833,0,0.00702,0,0,0.000271,0,0,0,0,0,0,0,0,0,0.000329,0.000337,0.000355,0,0.00042,0.00472,0.000392,0,0,0,0.000364,0.0893,0,0,0,0,0,0,0,0.000329,0.000335,0.000339,0.000352,0.000367,0.000376,0.000356,0,0,0.00058,0.00104,0,0,0,0,0,0,0,0,0,0.000331,0.000333,0.000337,0.000344,0.000358,0,0,0,0,0.0169,0.0051,0.0157,0.018,0.0146,0.00212,0.000576,0.00671,0,0.000398,0.000333,0.000332,0.00033,0.000337,0.000352,0.000444,0,0,0,0.000542,0.000318],"winrateAvg":0.000459025,"leadAvg":-12.5924,"scoreMeanAvg":-12.5376,"scoreStdevAvg":1.82397,"shorttermWinlossErrorAvg":0.00826873,"shorttermScoreErrorAvg":0.631959,"ownership":[99,100,-26,-31,-100,-99,-99,-99,-99,-98,-99,-99,-99,-100,-31,99,98,95,96,99,100,100,-100,-100,-100,-99,-99,-100,-98,-98,-100,-100,-100,-100,100,100,99,95,100,98,100,-100,100,-100,-99,-98,-100,-98,-99,-100,100,-100,100,99,99,97,98,100,99,100,100,100,100,94,-100,-99,-100,-85,-56,100,-100,100,99,100,96,99,-98,100,100,-100,-100,-100,7,-100,-99,-100,-50,-99,100,-100,100,100,100,100,98,-98,-99,2,-100,-99,-99,-100,-98,-99,-100,100,100,100,100,99,100,100,98,98,-96,-92,-100,-100,-99,-100,-98,-98,-98,-100,100,100,100,99,99,99,99,100,98,87,-93,52,96,-100,-100,-98,-97,-99,-100,100,100,99,99,100,100,100,98,98,100,100,100,60,-100,-99,-98,-99,-98,-99,-100,100,100,99,100,98,97,100,98,100,100,100,-39,-37,-100,-98,-98,-99,-98,-100,100,99,99,100,99,100,100,97,100,100,100,100,-100,-100,-100,-100,-99,-98,-100,-100,100,100,99,100,100,94,97,100,100,-100,100,-100,-100,-99,-99,-100,-100,-99,-100,-100,100,100,-100,100,95,97,100,100,-100,-100,-100,100,-100,-100,-98,-98,-98,-99,-100,100,14,-100,100,95,97,100,-100,-100,-43,26,100,100,-100,-99,-99,-99,-99,-100,100,47,-100,-100,99,97,100,100,100,100,100,100,-100,-100,-99,-99,-99,-99,-99,-100,-89,-100,99,98,99,100,100,-100,100,-100,-100,-99,-100,-99,-99,-99,-100,-99,-99,-98,-100,99,98,97,49,100,-99,-99,-100,-99,-99,-100,-99,-99,-99,-99,-99,-99,-99,-100,99,95,94,-100,-100,-99,-99,-99,-99,-100,-100,-100,-99,-99,-99,-99,-99,-100,-100,-100,96,81,-99,-99,-99,-99,-99,-100,-100,-100,-99,-99,-99,-99,-99,-99,-99,-100,-97,-98,59],"ownershipAllowedMAE":0.0162182})%"); + lines.push_back(R"%({"sample":{"board":"......O............/.................../...XX.X.....OOOO.../..XXO.......XXX..../.OXOO...........X../..OX....O........../..O.X.X............/...X..O.O........../.....O.OXX........./..XXO.OXXO.O......./.X..O.....O.O...X../.OXXO.XXXXXO......./.OOOXX.OXOO.....O../OX.OOX..OXO......../.O.XXOOO.X.O.X...../.O.X.XO.X.OX...O.../OXXX.XO.X.O..XO..../OOX.XOO......X...../..X................/","hintLoc":"null","initialTurnNumber":110,"metadata":"0587767F6F1B8B97447D197147846CDB:120","moveLocs":["L5","M6","M3","K12","L11","K2","J5","H6","J2","M12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.41,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":15.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.58e-05,1.73e-05,1.7e-05,1.76e-05,1.78e-05,1.74e-05,0,1.76e-05,1.76e-05,1.79e-05,1.8e-05,1.77e-05,1.77e-05,1.78e-05,1.82e-05,1.79e-05,1.84e-05,1.91e-05,1.66e-05,1.75e-05,1.75e-05,1.74e-05,1.86e-05,1.88e-05,1.93e-05,2.02e-05,2.12e-05,2.18e-05,2.27e-05,2.14e-05,2.04e-05,1.96e-05,1.77e-05,1.77e-05,1.89e-05,1.97e-05,2.02e-05,1.82e-05,1.77e-05,1.95e-05,1.7e-05,0,0,1.98e-05,0,2.18e-05,2.23e-05,2.33e-05,2.31e-05,2.44e-05,0,0,0,0,2.06e-05,2.46e-05,1.8e-05,1.99e-05,2.04e-05,0,0,0,3.18e-05,2.22e-05,2.31e-05,2.21e-05,2.24e-05,3.13e-05,2.28e-05,0,0,0,1.97e-05,2.07e-05,2.14e-05,1.79e-05,1.85e-05,0,0,0,0,2.47e-05,7.55e-05,3.61e-05,2.21e-05,2.26e-05,2.21e-05,2.13e-05,1.84e-05,1.74e-05,1.84e-05,2.02e-05,0,2.2e-05,1.85e-05,1.95e-05,1.97e-05,0,0,2.97e-05,3.76e-05,2.22e-05,2.89e-05,0,2.13e-05,3.92e-05,2.03e-05,2.11e-05,2.15e-05,2.14e-05,2.12e-05,2.03e-05,2.15e-05,1.8e-05,1.99e-05,2.19e-05,0,5.68e-05,0,3e-05,0,0.147,5e-05,5.95e-05,2.52e-05,3.36e-05,2.17e-05,2.33e-05,2.27e-05,2.4e-05,2.46e-05,2.27e-05,1.82e-05,1.99e-05,2.49e-05,0.000924,0,2.78e-05,0.00125,0,0.000103,0,0,0.0555,0,2.57e-05,2.4e-05,2.47e-05,3.31e-05,4.11e-05,2.32e-05,1.81e-05,2.05e-05,3.88e-05,1.92e-05,2.41e-05,0.000101,0,0,0,0,0,0,0.0102,4.07e-05,5.52e-05,2.3e-05,2.56e-05,2.5e-05,2.23e-05,1.81e-05,2.03e-05,1.84e-05,0,0,0,3.12e-05,0,0,0,0,0.0184,0,3.43e-05,9.23e-05,2.28e-05,2.21e-05,2.09e-05,2.13e-05,1.84e-05,0.000758,0,1.67e-05,2.38e-05,0,2.41e-05,0.131,0.000884,0.11,0.13,0,0,0,2.44e-05,2.24e-05,2.1e-05,0,2.19e-05,1.85e-05,0.00197,0,0,0,0,0.047,0,0,0,0,0,0,7.87e-05,2.19e-05,2.27e-05,2.19e-05,2.14e-05,2.12e-05,1.82e-05,8.74e-05,0,0,0,0,0,0.0357,0,0,0,0,0.000145,0.0297,2.04e-05,2.29e-05,3.02e-05,0,2.22e-05,1.78e-05,0,0,0.00058,0,0,0,4.55e-05,0,0,0,0,0,0.000143,1.97e-05,3.17e-05,4.74e-05,4.04e-05,2.27e-05,1.81e-05,0.000137,0,0.00501,0,0,0,0,0,0,0,0,0,0.000589,0,4.26e-05,0.000176,4.66e-05,2.54e-05,1.81e-05,7.62e-05,0,1.72e-05,0,1.85e-05,0,0,0.00023,0,1.68e-05,0,0,2.9e-05,7.87e-05,0.000132,0,2.89e-05,2.26e-05,1.82e-05,0,0,0,0,1.7e-05,0,0,0.000197,0,2.44e-05,0,0,2.1e-05,0,0,2.17e-05,4.3e-05,2.12e-05,1.81e-05,0,0,0,1.51e-05,0,0,0,0.243,0,0,4.24e-05,0.00476,2.06e-05,0,5.11e-05,2.41e-05,2.16e-05,2.12e-05,1.86e-05,1.74e-05,1.85e-05,0,1.8e-05,8.93e-05,0.00562,0.012,0.0017,0.000575,4.4e-05,3.09e-05,2.29e-05,2.05e-05,2.05e-05,2.04e-05,2.01e-05,1.94e-05,1.87e-05,1.61e-05,2.95e-05],"winrateAvg":0.731106,"leadAvg":6.71329,"scoreMeanAvg":6.15483,"scoreStdevAvg":17.4369,"shorttermWinlossErrorAvg":0.316727,"shorttermScoreErrorAvg":5.15437,"ownership":[-65,-66,-64,-61,-52,-31,-4,-7,0,12,25,43,60,68,70,64,51,39,31,-63,-65,-68,-78,-72,-62,-49,-29,-6,9,23,46,66,80,80,71,50,36,17,-55,-71,-81,-93,-93,-58,-83,-17,0,5,12,25,91,91,90,90,42,2,5,-40,-35,-93,-93,5,-39,-19,-3,5,6,0,8,-57,-57,-56,13,7,-3,-12,-10,9,-92,7,5,-18,-12,-3,16,11,8,3,-7,-15,-21,-24,-61,-29,-20,5,10,28,-37,-25,-25,-11,18,74,29,23,15,7,3,-5,-9,-9,-16,-18,6,16,28,0,-64,-12,-54,-35,18,35,46,36,19,6,-3,-6,14,-5,-10,1,7,8,-52,10,30,91,83,91,89,48,89,31,12,5,1,0,0,-4,-8,-5,-23,-15,32,92,85,88,-68,-65,-62,59,47,16,13,8,8,2,-2,-18,-26,-50,-49,91,82,88,-65,-68,75,54,91,61,19,16,14,6,0,-1,-2,-44,-25,42,91,64,17,-35,-38,23,85,83,93,30,17,11,-35,-3,3,27,92,-31,-30,90,32,-70,-69,-69,-70,-70,92,40,22,16,17,16,16,13,87,92,92,92,-64,-66,-61,-29,-68,91,90,87,-6,14,13,17,69,30,23,92,88,88,92,92,-64,-45,-29,-34,-79,91,91,14,-1,11,20,26,30,28,90,92,-35,-97,-97,-29,-28,-31,-77,-77,-79,91,-1,-61,4,20,31,30,30,79,92,-25,-96,-95,-95,-30,-55,-77,-58,-39,-73,-30,-40,-5,67,41,30,30,82,-96,-96,-96,-94,-95,-27,-58,-75,-49,-36,-73,-59,-76,50,32,23,28,27,79,79,-96,-95,-95,-24,-25,-70,-75,-36,-42,-37,-59,-77,4,9,17,19,25,26,-14,-96,-94,-80,-63,-48,-60,-55,-43,-45,-52,-59,-51,-28,-1,8,16,22],"ownershipAllowedMAE":0.0680078})%"); + lines.push_back(R"%({"sample":{"board":"..............XX.../.XOX.......XOO.OX../.XOXOX....XOXOOOX../..XOO.......XXXXOO./.............XOO.O./.XXOO........XOXO../.OOXO............../.OX................/.OX................/.OX................/.OX................/.OX................/.XOXO...........X../.XOOX.......XXXXO../......O....OOOOXO../..X..OXO.....XOXO../....XXX......OXOXO./...............OXO./.................../","hintLoc":"null","initialTurnNumber":98,"metadata":"E55A71BD8E257EF2D9A7E04F5CF50D19:108","moveLocs":["D8","E5","F6","D5","B5","F5","F9","F7","H9","J8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.01,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":4.5,"policyOptimism":0.0,"pda":-1.313,"policyMixture":[1.41e-05,1.45e-05,0.104,1.68e-05,1.56e-05,1.68e-05,1.71e-05,1.72e-05,1.71e-05,1.69e-05,2e-05,2.12e-05,3.84e-05,2.15e-05,0,0,1.82e-05,1.68e-05,1.46e-05,1.49e-05,0,0,0,0.0011,2.28e-05,2.26e-05,2.21e-05,2.1e-05,2.75e-05,2.31e-05,0,0,0,1.75e-05,0,0,1.92e-05,1.93e-05,1.61e-05,0,0,0,0,0,2.34e-05,2.68e-05,2.42e-05,2.18e-05,0,0,0,0,0,0,0,4.55e-05,1.82e-05,1.81e-05,3.17e-05,0,0,0,2.48e-05,3.02e-05,2.96e-05,2.68e-05,2.7e-05,2.34e-05,0.000607,0,0,0,0,0,0,1.58e-05,2e-05,3.68e-05,0.000226,0.00192,2.43e-05,2.27e-05,9.72e-05,5.99e-05,3.68e-05,2.73e-05,2.31e-05,1.92e-05,1.51e-05,0,0,0,0,0,1.52e-05,1.97e-05,0,0,0,0,2.06e-05,0.000217,0.000158,5.95e-05,3.03e-05,2.49e-05,2.24e-05,1.82e-05,0,0,0,0,1.88e-05,1.63e-05,1.67e-05,0,0,0,0,2.35e-05,0.00116,0.00022,8.53e-05,3.42e-05,2.66e-05,2.39e-05,2.53e-05,0.00135,0.000153,5.19e-05,2.35e-05,2.44e-05,1.72e-05,1.46e-05,0,0,0.00629,2.54e-05,0.00453,0.000673,0.000369,0.000112,3.57e-05,2.87e-05,2.74e-05,2.92e-05,0.000103,0.000819,9.31e-05,6.42e-05,2.58e-05,1.75e-05,1.47e-05,0,0,2.11e-05,8.2e-05,0.000197,0.000559,0.000534,0.000177,6.55e-05,3.36e-05,3.14e-05,3.49e-05,4.82e-05,6.72e-05,9.97e-05,8.52e-05,2.77e-05,1.79e-05,1.48e-05,0,0,1.79e-05,2.58e-05,2.73e-05,4.67e-05,4.23e-05,0.000172,0.000243,6.72e-05,5.59e-05,6.55e-05,8.63e-05,0.000109,0.000142,0.00016,2.84e-05,1.82e-05,1.47e-05,0,0,1.66e-05,2.17e-05,0,2.31e-05,0,0.0649,8.97e-05,0.000129,9.1e-05,7.46e-05,6.66e-05,7.05e-05,8.81e-05,0.000443,3.08e-05,1.79e-05,1.66e-05,0,0,0,2.73e-05,3.39e-05,0.000114,0.0137,0,5.03e-05,0.00026,6.04e-05,3.36e-05,2.76e-05,3.23e-05,0.000316,6.52e-05,0.000119,1.83e-05,1.66e-05,0,0,0,0,0,3.51e-05,0.113,8.09e-05,0.000207,0.000406,3.47e-05,1.99e-05,1.72e-05,1.68e-05,2.34e-05,0,2.83e-05,1.81e-05,1.61e-05,0,0,0,0,0,4.34e-05,0.0377,0.0252,0.00104,0.000178,0.157,0,0,0,0,0,5.7e-05,1.65e-05,1.58e-05,0,1.67e-05,0,0,0,0,0.000231,0.00112,0.000142,3.82e-05,0,0,0,0,0,0,2.27e-05,1.57e-05,1.6e-05,1.59e-05,0,1.85e-05,1.63e-05,0,0,0,0.00888,0.000141,3.24e-05,2.33e-05,1.84e-05,0,0,0,0,2.23e-05,1.58e-05,1.59e-05,1.68e-05,1.76e-05,1.76e-05,0,0,0,0.00897,0.42,0.00024,3.06e-05,3.77e-05,3.93e-05,0,0,0,0,0,1.51e-05,1.61e-05,1.71e-05,1.85e-05,1.85e-05,1.78e-05,1.82e-05,2e-05,4.31e-05,0.0103,0.00203,2.41e-05,2.37e-05,2.14e-05,2.55e-05,0.000447,0,0,0,1.47e-05,1.44e-05,1.62e-05,1.61e-05,1.69e-05,1.65e-05,1.68e-05,1.89e-05,1.96e-05,2.04e-05,1.85e-05,1.74e-05,1.69e-05,1.72e-05,1.67e-05,1.89e-05,2.25e-05,0.000201,1.59e-05,1.43e-05,1.19e-05],"winrateAvg":0.83216,"leadAvg":3.93569,"scoreMeanAvg":5.44721,"scoreStdevAvg":14.1151,"shorttermWinlossErrorAvg":0.130558,"shorttermScoreErrorAvg":1.53153,"ownership":[-94,-94,-93,-70,-27,-12,-14,-18,-30,-44,-59,-63,-64,-60,-66,-67,-64,-26,8,-93,-96,-92,-94,11,-22,-17,-20,-28,-47,-44,-83,-49,-51,-57,-49,-67,-2,28,-83,-96,-87,-93,91,-48,-4,-13,-19,-35,-83,-47,-94,-51,-50,-51,-68,32,53,-60,-59,-89,91,92,24,10,-5,-11,-22,-36,-58,-94,-94,-94,-94,93,93,73,-18,-16,14,38,69,34,11,1,-6,-14,-23,-36,-61,-94,77,86,85,93,84,34,-30,-29,95,95,37,8,0,-5,-10,-16,-26,-35,-94,77,39,92,80,78,52,93,94,73,95,26,-1,-5,-7,-9,-10,-14,-20,-5,20,44,55,62,63,87,92,-68,64,29,-11,-11,-13,-10,-7,-6,-7,-8,-7,8,23,34,48,47,90,92,-66,20,-2,-12,-23,-24,-15,-6,-3,-3,-5,-4,4,16,26,36,33,89,92,-66,-16,-25,-30,-24,-37,-17,-3,0,-2,-6,-7,0,11,22,29,24,82,92,-65,-46,-36,-77,-43,-73,-4,7,7,-1,-8,-10,-5,8,25,25,18,22,91,-66,-67,-8,-1,-12,7,73,33,17,2,-8,-10,-10,-8,43,24,15,5,-94,92,-68,80,82,36,22,34,24,11,-3,-18,-24,-29,-37,-45,18,21,-69,-94,92,91,77,77,79,43,29,26,28,-23,-64,-64,-63,-65,94,40,41,-87,-95,14,91,91,92,92,61,31,24,36,93,93,93,93,-66,94,65,56,-91,-91,-95,5,7,92,-95,70,28,12,26,40,78,77,93,-66,95,73,77,-90,-89,-89,-80,-95,-96,-95,7,-55,-16,14,35,54,86,72,95,92,98,88,-89,-88,-87,-87,-89,-89,-80,-66,-46,-23,7,27,48,68,71,95,94,98,95,-88,-88,-87,-85,-85,-81,-74,-60,-44,-23,-1,23,47,66,79,90,95,96,96],"ownershipAllowedMAE":0.0364884})%"); + lines.push_back(R"%({"sample":{"board":"...............X.OO/.XO..XOX.....XXOO../.XO.OXX.X...X.XOXOO/..XO.OO......XOXXX./.X.XO.........O..../...X..........OXO../.....O.......OXOO../..OX...........XO../..O............XO../........X.......O../..O.......XXX.X..../....X..X.OOOOX...../..OOX...XX..XOXXOO./.OXXO..OOOXX.OOOXX./.XX.O....XOX...XOX./..XO.....OOX.O.XOX./.XO..O.....OO..X.../.................../.................../","hintLoc":"null","initialTurnNumber":119,"metadata":"7AE7E072926506FB7D68E5B8EB4F11C0:129","moveLocs":["P19","O19","S15","E18","F9","F11","J15","E9","C2","B7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.78,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.94e-06,7.68e-06,6.74e-06,6.7e-06,6.78e-06,6.58e-06,6.43e-06,6.68e-06,6.55e-06,6.51e-06,6.43e-06,6.71e-06,6.5e-06,0,0,0,5.42e-06,0,0,6.59e-06,0,0,6.41e-06,0,0,0,0,7.62e-06,7.26e-06,7.61e-06,7.64e-06,7.16e-06,0,0,0,0,6.25e-06,5.76e-06,6.71e-06,0,0,7.03e-06,0,0,0,7.29e-06,0,7.31e-06,8.16e-06,7.42e-06,0,0,0,0,0,0,0,1.15e-05,0.000296,0,0,6.7e-06,0,0,7.62e-06,7.32e-06,7.79e-06,1.95e-05,1.99e-05,6.94e-06,0,0,0,0,0,8e-06,6.96e-06,0,5e-05,0,0,6.29e-06,7.49e-06,7.05e-06,0,7.58e-06,3.26e-05,1.49e-05,1.23e-05,7.2e-06,0,9.01e-06,6.82e-06,0,6.62e-06,6.95e-06,4.14e-05,0.0289,0,0.000136,7.89e-06,7.94e-06,7.85e-06,7.5e-06,2.93e-05,2.63e-05,1.03e-05,7.55e-06,6.52e-06,0,0,0,6.71e-06,6.4e-06,6.87e-06,2.23e-05,9.15e-05,9.86e-05,5.04e-05,0,7.26e-06,3.55e-05,3.89e-05,2.92e-05,8.84e-06,7.67e-06,7.42e-06,0,0,0,0,6.49e-06,6.3e-06,6.75e-06,6.27e-06,0,0,0.0023,0.000155,2.44e-05,4.23e-05,2.44e-05,1.31e-05,8.09e-06,7.84e-06,7.65e-06,7.35e-06,6.83e-06,0,0,6.43e-06,6.16e-06,6.66e-06,5.77e-06,0,0.000277,0.000521,0,5.34e-05,1.49e-05,3.4e-05,7.12e-06,7.57e-06,7.66e-06,7.63e-06,7.19e-06,7e-06,0,0,6.42e-06,6.12e-06,6.44e-06,7.35e-06,5.9e-06,1.15e-05,0.000625,6.86e-05,9.15e-06,6.05e-05,0,0.000172,8.89e-06,7.04e-06,6.93e-06,0.0695,7.21e-06,6.98e-06,0,6.54e-06,6.39e-06,7.05e-06,7.61e-06,0,4.22e-05,0,0,7.67e-06,0.00398,0.00015,0.000118,0,0,0,4.35e-05,0,7.07e-06,6.85e-06,6.57e-06,6.49e-06,7.8e-06,0.889,8.24e-06,5.99e-06,0,7.43e-06,4.38e-05,0,6.16e-05,0,0,0,0,0,3.66e-05,3.18e-05,6.57e-06,6.4e-06,6.21e-06,8.28e-06,0,0,0,0,8.07e-06,1.15e-05,9.64e-05,0,0,1.27e-05,7.09e-06,0,0,0,0,0,0,6.35e-06,6.85e-06,0,0,0,0,7.15e-06,7.36e-06,0,0,0,0,0,1.42e-05,0,0,0,0,0,6.59e-06,6.17e-06,0,0,6.4e-06,0,6.38e-06,6.61e-06,6.39e-06,6.18e-06,0,0,0,6.46e-06,6.27e-06,6.29e-06,0,0,0,6.15e-06,5.97e-06,6.02e-06,0,0,6.2e-06,6.56e-06,6.4e-06,6.58e-06,6.55e-06,0,0,0,7.13e-06,0,6.42e-06,0,0,0,6.25e-06,6.42e-06,0,0,6.19e-06,6.52e-06,0,6.43e-06,6.4e-06,6.73e-06,6.52e-06,6.45e-06,0,0,6.88e-06,6.59e-06,0,0.000501,6.65e-05,6.43e-06,6.43e-06,6.86e-06,0,6.38e-06,6.29e-06,6.54e-06,6.33e-06,6.5e-06,6.53e-06,6.8e-06,6.59e-06,6.5e-06,6.85e-06,7.3e-06,1.22e-05,0.000123,0.000319,7.78e-05,6.52e-06,5.86e-06,6.24e-06,6.18e-06,6.19e-06,6.07e-06,6.17e-06,6.01e-06,5.99e-06,6.03e-06,6.22e-06,6.32e-06,6.25e-06,6.6e-06,7.01e-06,6.83e-06,6.82e-06,6.7e-06,6.41e-06,5.75e-06,7.4e-06],"winrateAvg":0.381327,"leadAvg":-1.32652,"scoreMeanAvg":-1.78649,"scoreStdevAvg":12.5864,"shorttermWinlossErrorAvg":0.19469,"shorttermScoreErrorAvg":1.63024,"ownership":[-74,-50,-45,-76,-89,-95,-97,-91,-78,-66,-65,-72,-83,-92,-88,-89,-50,77,82,-81,-96,0,-80,-99,-99,-95,-98,-81,-66,-60,-66,-79,-92,-92,-11,18,20,82,-91,-95,5,2,30,-99,-99,-51,-96,-38,-33,-39,-90,-81,-92,-13,-21,87,89,-89,-92,-95,29,29,43,44,-11,-5,-12,-3,-3,-29,-82,95,-15,-15,-11,90,-73,-96,-90,-96,40,17,15,16,53,10,13,0,2,-5,95,60,51,99,94,-47,-27,-13,-96,-34,5,7,4,11,-7,8,-1,-1,43,95,66,100,97,96,1,14,4,-48,-32,39,-2,-8,0,4,2,0,13,84,26,100,100,98,96,33,47,71,-81,-29,-17,-18,-6,-9,-3,-2,-2,3,23,28,-31,100,97,95,52,62,71,-11,-22,-82,-25,-24,-15,-18,-14,-9,-6,0,-3,-33,100,95,91,56,54,43,-8,-16,-36,-34,-34,-89,-43,-39,-36,-23,21,-24,28,100,87,81,57,58,67,-31,-82,-1,-34,-40,-69,-74,-93,-93,-93,-80,-89,1,47,64,57,41,64,36,-23,-81,-43,-31,-91,-73,-55,-54,-52,-52,-87,-68,13,43,64,32,-30,-68,38,38,-81,-16,-6,10,-84,-85,-74,-60,-66,58,-74,-73,84,84,-27,-74,-71,-75,-75,93,11,19,95,95,96,-79,-79,6,58,58,60,-96,-96,-43,-73,-75,-76,-18,94,61,70,78,93,91,97,-79,20,34,14,-94,-91,-95,-82,-70,-71,-75,91,83,80,80,86,90,98,98,-79,44,88,-37,-95,-92,-95,-90,-57,-71,93,86,91,98,88,89,89,92,89,95,95,30,-32,-95,-92,-91,-92,-29,5,92,85,89,92,90,89,88,87,86,84,62,11,-6,-72,-80,-87,-89,10,51,65,80,87,89,89,88,87,85,78,65,42,15,-21,-42,-70,-81,-86],"ownershipAllowedMAE":0.0456884})%"); + lines.push_back(R"%({"sample":{"board":".................../.....OX....X....XO./....XOX.O.OX.X.XO../..XX.XX...OO...XO../..OO.OXOO.OO...XO../....OOOXXXXOXXXO.../..XXO..O.XOX.XOO.../....XOOXXOOX.X...../..O.O....XOO.XO.O../..OX...XXO...O...../.OX...O............/......OXXO....X.X../......OX.X.X......./..XX...X.......O.../..OX.O.....OO....../..O........OXO..O../...O.O......XXX..../..........X......../.................../","hintLoc":"null","initialTurnNumber":112,"metadata":"FA19EDEF15034F975F61411BEFFBA224:122","moveLocs":["C8","E10","B8","B10","B5","B4","B7","H18","K18","B16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":7.5,"policyOptimism":0.0,"pda":-1.779,"policyMixture":[1.36e-05,1.82e-05,1.81e-05,2.39e-05,3.4e-05,0.000254,8e-05,0.000214,1.93e-05,2.06e-05,1.7e-05,1.64e-05,1.55e-05,1.58e-05,1.59e-05,1.7e-05,1.65e-05,1.58e-05,1.4e-05,1.78e-05,0.000139,0.0088,4.2e-05,0.0525,0,0,0,0.000616,0,2.09e-05,0,1.59e-05,1.61e-05,1.85e-05,1.98e-05,0,0,1.71e-05,1.61e-05,0.754,0.000756,2.17e-05,0,0,0,2.24e-05,0,1.95e-05,0,0,1.65e-05,0,1.55e-05,0,0,1.74e-05,1.57e-05,1.57e-05,0,0,0,0.00048,0,0,1.81e-05,2.18e-05,1.61e-05,0,0,1.82e-05,1.68e-05,1.6e-05,0,0,1.57e-05,1.55e-05,1.51e-05,0.000267,0,0,1.66e-05,0,0,0,0,8.73e-05,0,0,1.75e-05,1.57e-05,1.59e-05,0,0,1.68e-05,1.5e-05,1.5e-05,1.99e-05,1.41e-05,1.48e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.9e-05,1.78e-05,1.52e-05,1.57e-05,1.68e-05,0,0,0,1.42e-05,1.54e-05,0,2.88e-05,0,0,0,1.46e-05,0,0,0,1.84e-05,1.82e-05,1.56e-05,1.51e-05,1.75e-05,2.02e-05,6.08e-05,0,0,0,0,0,0,0,0,1.58e-05,0,7.54e-05,2.06e-05,1.93e-05,1.84e-05,1.62e-05,1.65e-05,1.54e-05,0,0.0256,0,1.78e-05,1.81e-05,1.83e-05,1.64e-05,0,0,0,2.15e-05,0,0,2.26e-05,0,2.14e-05,1.66e-05,1.57e-05,0,0,0,0,2.02e-05,2.43e-05,0,0,0,1.84e-05,1.92e-05,0.0036,0,0.00615,3.21e-05,2.76e-05,2.17e-05,1.67e-05,1.67e-05,0,0,0.0134,8.3e-05,1.93e-05,0,1.69e-05,1.59e-05,2.03e-05,2.09e-05,2.37e-05,3.13e-05,0.00295,3.08e-05,3.07e-05,2.06e-05,2.16e-05,1.68e-05,1.8e-05,0,0,1.47e-05,3.32e-05,1.71e-05,0,0,0,0,2.14e-05,2.34e-05,0.000471,0.000408,0,2.11e-05,0,2.05e-05,1.72e-05,1.34e-05,0,1.16e-05,4.67e-05,4.73e-05,1.94e-05,0,0,1.51e-05,0,1.87e-05,0,3.01e-05,0.000687,6.85e-05,4.67e-05,2.27e-05,2.75e-05,1.69e-05,0.000209,1.35e-05,0,0,1.75e-05,0.000203,0.000149,0,1.64e-05,1.82e-05,1.87e-05,1.89e-05,1.94e-05,0.000109,0.000117,0,0.000118,0.000218,1.72e-05,0.000771,0,0,0,1.97e-05,0,4.83e-05,2.12e-05,1.93e-05,2.06e-05,1.76e-05,0,0,2.18e-05,6.39e-05,0.000237,0.000178,8.6e-05,1.73e-05,0.118,0,0,0.000259,0.00275,0.000194,0.000169,3.48e-05,2.22e-05,2.33e-05,1.88e-05,0,0,0,6.01e-05,0.000306,0,2.76e-05,1.79e-05,1.58e-05,2.44e-05,2.72e-05,0,0.000177,0,2.87e-05,4.55e-05,3e-05,2.23e-05,1.93e-05,1.78e-05,0,0,0,2.3e-05,7.35e-05,2.25e-05,1.75e-05,1.55e-05,1.78e-05,2.43e-05,2.82e-05,8.09e-05,4.28e-05,2.27e-05,2.22e-05,2.25e-05,1.95e-05,0,1.74e-05,1.71e-05,1.62e-05,1.81e-05,2.28e-05,0.000112,2.08e-05,1.73e-05,1.43e-05,1.61e-05,1.66e-05,1.67e-05,1.75e-05,1.71e-05,1.69e-05,1.71e-05,1.67e-05,1.61e-05,1.55e-05,1.56e-05,1.63e-05,1.63e-05,1.7e-05,1.72e-05,1.73e-05,1.69e-05,1.42e-05,1.94e-05],"winrateAvg":0.787179,"leadAvg":4.76923,"scoreMeanAvg":6.07994,"scoreStdevAvg":15.5661,"shorttermWinlossErrorAvg":0.231161,"shorttermScoreErrorAvg":3.24524,"ownership":[-25,-38,-49,-61,-72,-71,-69,-65,-71,-81,-84,-84,-82,-75,-56,-31,26,29,60,-14,-23,-51,-59,-79,-64,-88,-57,-68,-83,-59,-93,-87,-83,-82,-11,-10,85,77,6,-38,-29,-61,-87,-64,-87,-69,-56,-67,-55,-92,-79,-95,-85,-95,96,84,86,21,49,-70,-72,-17,-86,-87,-73,-61,-62,-55,-55,-74,-71,-85,-95,96,92,88,51,50,94,95,32,98,-86,-58,-57,-67,-55,-55,-72,-84,-91,-95,96,90,87,63,75,76,84,98,98,99,-93,-93,-94,-93,-55,-96,-96,-95,94,89,86,81,73,70,59,59,98,92,41,41,-90,-93,14,-93,-91,-96,93,93,77,76,71,79,81,77,79,77,98,98,-94,-94,16,12,-91,-42,-96,-22,44,64,68,58,83,86,92,45,97,57,-9,-75,-29,-32,16,16,-30,-94,70,36,83,54,39,79,92,92,15,96,51,-7,-95,-95,6,-9,-7,-5,51,27,22,21,22,19,49,92,1,20,39,60,95,12,-65,-35,-18,-14,4,1,13,18,5,2,-1,34,4,2,25,54,61,95,-95,-95,-1,-21,-17,-8,4,-54,-14,-48,-17,-11,10,2,7,24,34,59,95,-94,-69,-81,-34,-73,-5,-9,-4,6,3,-5,-7,11,15,2,2,34,44,7,-93,-30,-23,-13,-6,6,2,2,60,12,-1,5,30,17,90,1,40,88,20,-14,-6,-7,8,56,56,10,-1,13,24,21,18,38,90,90,38,30,47,12,0,7,0,2,55,-88,19,-28,-10,63,34,26,62,64,82,92,48,90,27,5,-1,0,-29,-5,-88,-88,-88,-5,13,27,25,64,71,80,83,75,58,34,13,-10,-32,-81,-71,-80,-75,-56,-20,-7,15,19,70,75,76,75,66,51,30,6,-16,-38,-55,-69,-70,-63,-49,-27,-5,4,14],"ownershipAllowedMAE":0.0389539,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".................../.OXX.....OOOXX...O./.OOX.XXXO.X.OX..XX./.OXX..OXO...OX.XXO./.X.XOO.OXX..O....O./..OXXO.O.....O...../.....XO..X.....X.../.OO.........X.OOO../.XO.....X......OX../.XO.X.OOOX.......X./..XO..OXO..X...O.../.XXO..OX.O.....OX../X.XO...X...X...OX../XXO.O....X........./.O................./","hintLoc":"null","initialTurnNumber":99,"metadata":"6DC6C40C59CC7AA7CE2C56E3C8AE54AE:109","moveLocs":["B10","C11","A11","E8","F7","E7","D6","H14","L12","R10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.17,"xSize":19,"ySize":15},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":8.0,"policyOptimism":0.0,"pda":-0.275,"policyMixture":[1.22e-05,2.23e-05,0.172,1.16e-05,1.91e-05,1.73e-05,0.00291,3.14e-05,0.0281,1.58e-05,1.18e-05,1.55e-05,1.43e-05,1.31e-05,1.23e-05,1.21e-05,1.19e-05,1.18e-05,1.13e-05,1.16e-05,0,0,0,2.23e-05,0.000552,1.09e-05,0,0.000342,0,0,0,0,0,1.27e-05,1.34e-05,1.23e-05,0,1.24e-05,1.05e-05,0,0,0,1.25e-05,0,0,0,0,1.4e-05,0,1.62e-05,0,0,1.46e-05,1.16e-05,0,0,1.53e-05,1.26e-05,0,0,0,0.11,1.23e-05,0,0,0,1.86e-05,0,1.17e-05,0,0,1.48e-05,0,0,0,1.15e-05,0,0,0,0,0,0,1.18e-05,0,0,0,0.000116,2.12e-05,0,1.54e-05,1.91e-05,2.24e-05,0.00495,0,1.14e-05,1.28e-05,0,0,0,0,0,1.18e-05,0,4.44e-05,1.92e-05,0.000471,0.00122,1.4e-05,0,8.61e-05,0.00947,0,0.0296,1.37e-05,1.23e-05,1.22e-05,1.23e-05,1.41e-05,1.4e-05,0,0,1.31e-05,0.000472,0,5.56e-05,0.00082,0.000247,0.000137,0.131,0,0.115,0.0268,1.47e-05,1.24e-05,0,0,1.19e-05,0,3.17e-05,1.44e-05,1.61e-05,2.26e-05,2.99e-05,0.177,0.0012,0,7.42e-05,0,0,0,0.000147,2.1e-05,0.000139,0,0,1.15e-05,0,0,1.16e-05,1.58e-05,0,4.92e-05,0.0157,0.0303,0.000359,2.72e-05,1.29e-05,0,0,0.00459,2.03e-05,2.46e-05,0,0,0,0,1.23e-05,0,0,0,0,0.0262,0.00714,7.75e-05,2.36e-05,1.78e-05,1.73e-05,0.00232,0,1.73e-05,0.000283,1.63e-05,0,0,1.3e-05,1.24e-05,0,0,0,2.24e-05,0.00367,0,3.26e-05,3.14e-05,1.52e-05,0,9.68e-05,1.64e-05,1.45e-05,1.03e-05,0,0,0,1.21e-05,1.18e-05,0,0,1.44e-05,0,4.74e-05,0.0112,0.0017,2.2e-05,1.35e-05,0,0,1.93e-05,1.57e-05,0,0,0,0,1.18e-05,1.21e-05,1.46e-05,0,1.97e-05,7.69e-05,0.0514,0,6.34e-05,3.55e-05,1.49e-05,0,0,1.94e-05,1.47e-05,0,0,0,1.19e-05,0,1.31e-05,1.6e-05,1.98e-05,0.000996,0,2.8e-05,5.21e-05,0.00014,2.84e-05,9.58e-05,7.88e-05,0.0287,1.7e-05,1.56e-05,1.01e-05,0,1.22e-05,1.23e-05,1.25e-05,1.36e-05,1.43e-05,1.5e-05,1.38e-05,1.45e-05,1.46e-05,1.61e-05,1.62e-05,1.52e-05,1.54e-05,1.58e-05,1.65e-05,1.46e-05,1.22e-05,1.62e-05],"winrateAvg":0.336076,"leadAvg":-1.4125,"scoreMeanAvg":-1.94511,"scoreStdevAvg":13.9477,"shorttermWinlossErrorAvg":0.18585,"shorttermScoreErrorAvg":1.53477,"ownership":[44,31,11,-57,-72,-74,-76,-56,5,41,61,7,-10,-86,-92,-89,-82,-74,-49,57,83,-93,-94,-81,-79,-82,-92,-19,85,86,87,-97,-97,-93,-92,-84,-28,-31,79,84,84,-94,-44,-92,-93,-93,82,77,63,85,88,-97,-90,-93,-97,-97,-20,84,84,-94,-94,29,-35,57,-92,81,-14,72,50,87,-97,-56,-97,-97,23,-10,91,-93,-94,-94,85,85,58,85,-60,-61,-2,28,86,12,-11,-51,-21,24,12,90,96,94,-94,-93,84,81,84,16,-37,-13,-16,17,81,0,-19,-66,-6,26,83,86,15,-25,-65,-59,84,29,-6,-71,-32,-23,-9,29,40,-32,52,38,25,27,98,98,-18,-81,51,56,3,-15,-36,-11,-34,-69,7,88,88,88,-4,18,-36,-91,98,42,-80,89,63,15,-53,-36,-28,-27,-18,5,48,87,-56,-23,-15,-87,-94,98,98,-79,-1,98,98,97,-59,-19,-39,-25,1,23,49,7,-74,-36,-93,-94,-95,99,-20,11,97,-29,97,7,-13,-82,-30,-1,31,84,8,-62,-59,-94,-94,-94,98,64,62,97,-27,50,83,8,-31,-17,-1,32,85,-76,-70,-63,-94,-94,-94,98,78,69,14,-28,16,0,-6,-81,-24,-2,38,85,-76,-64,-64,-94,-94,94,94,97,53,27,-8,-5,-66,-49,-54,-14,5,42,19,-16,-63,-59,-72,84,82,90,81,64,25,-3,-33,-46,-53,-42,-19,12,27,19,-22,-39,-52],"ownershipAllowedMAE":0.0425035,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":"................./................./..........O..XX../...X........OOOX./...............O./..............X../................./................./................./................./................./..OO.....X......./..XO............./..XO........XXX../..XO......XOXOO../...........XO.O../.............O.../","hintLoc":"null","initialTurnNumber":32,"metadata":"B3F070E61D0792CBAFACD6A7F885B68A:42","moveLocs":["Q15","Q12","P11","P9","N15","P13","Q11","M11","N11","N12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.75,"xSize":17,"ySize":17},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":6.0,"policyOptimism":0.525,"pda":0.0,"policyMixture":[2.15e-06,2.49e-06,2.52e-06,2.58e-06,2.63e-06,2.61e-06,2.57e-06,2.54e-06,2.55e-06,2.51e-06,2.55e-06,2.71e-06,2.89e-06,2.85e-06,2.61e-06,2.46e-06,2.34e-06,2.43e-06,2.86e-06,3.25e-06,3.8e-06,3.85e-06,3.57e-06,3.55e-06,3.55e-06,3.43e-06,3.15e-06,4.07e-06,3.13e-06,2.95e-06,2.58e-06,2.34e-06,2.39e-06,2.47e-06,2.5e-06,3.34e-06,5.79e-06,4.38e-06,1.62e-05,2.64e-05,2.23e-05,1.59e-05,9.86e-06,4.88e-06,0,3.11e-05,0,0,0,0,2.41e-06,2.5e-06,3.88e-06,4.4e-06,0,3.71e-06,1.57e-05,1.4e-05,1.11e-05,9.67e-06,1.63e-05,1.53e-05,6.95e-05,0,0,0,0,2.84e-06,2.58e-06,3.89e-06,1.75e-05,3.76e-06,3.62e-06,3.8e-06,3.86e-06,4.1e-06,5.45e-06,6.39e-06,1.36e-05,5.53e-05,2.9e-05,3.14e-06,0,0,8.29e-06,2.49e-06,3.53e-06,2.74e-05,1.7e-05,3.72e-06,3.63e-06,3.6e-06,3.63e-06,3.74e-06,4.07e-06,1.12e-05,0.000181,0,0.0584,0,0,9.37e-06,2.49e-06,3.47e-06,2.06e-05,1.14e-05,3.69e-06,3.56e-06,3.56e-06,3.5e-06,3.56e-06,3.68e-06,7.48e-06,0,0,6.48e-06,0,0,2.75e-06,2.47e-06,3.52e-06,1.03e-05,5.57e-06,3.59e-06,3.52e-06,3.48e-06,3.49e-06,3.46e-06,3.53e-06,3.59e-06,5.73e-05,0.938,0.000136,7.8e-06,2.82e-06,2.73e-06,2.51e-06,3.51e-06,8.65e-06,3.85e-06,3.56e-06,3.49e-06,3.45e-06,3.48e-06,3.48e-06,3.49e-06,3.78e-06,5.33e-06,9.45e-05,0.000689,0,2.17e-05,2.53e-06,2.45e-06,3.68e-05,1.75e-05,3.7e-06,3.53e-06,3.55e-06,3.45e-06,3.48e-06,3.49e-06,3.61e-06,3.39e-06,3.93e-06,9.06e-06,3.25e-05,3.34e-05,7.08e-06,2.7e-06,2.8e-06,3.61e-05,8.18e-06,2.91e-06,3.41e-06,3.55e-06,3.5e-06,3.46e-06,3.28e-06,3.12e-06,3.26e-06,3.49e-06,3.54e-06,3.74e-06,4.3e-06,3.36e-06,2.54e-06,2.81e-06,0.00044,0,0,2.8e-06,3.54e-06,3.54e-06,3.53e-06,3.21e-06,0,3.06e-06,3.31e-06,3.12e-06,2.86e-06,2.83e-06,3e-06,2.53e-06,3.05e-06,1.5e-05,0,0,2.44e-06,3.43e-06,3.45e-06,3.44e-06,3.21e-06,3.39e-06,3.28e-06,2.57e-06,2.43e-06,2.26e-06,2.53e-06,3.33e-06,2.7e-06,3.09e-06,2.49e-06,0,0,2.43e-06,3.23e-06,3.39e-06,3.59e-06,3.41e-06,3.19e-06,2.78e-06,3e-06,0,0,0,4.22e-06,3.05e-06,2.74e-06,2.35e-06,0,0,3.4e-06,9.73e-06,6.93e-06,4.14e-06,3.44e-06,2.82e-06,0,0,0,0,0,1.97e-05,2.45e-06,2.78e-06,3.63e-06,1.68e-05,0.000889,1.97e-05,8.98e-06,3.5e-06,3.43e-06,3.3e-06,3.08e-06,2.55e-06,0,0,0,0,3.55e-06,2.76e-06,2.25e-06,2.78e-06,3.07e-06,2.58e-06,2.62e-06,2.57e-06,2.51e-06,2.53e-06,2.55e-06,2.55e-06,2.68e-06,5.26e-06,2.75e-06,0,2.49e-06,2.95e-06,2.12e-06,3.65e-06],"winrateAvg":0.371034,"leadAvg":-1.05755,"scoreMeanAvg":-1.42442,"scoreStdevAvg":10.6074,"shorttermWinlossErrorAvg":0.118593,"shorttermScoreErrorAvg":0.751682,"ownership":[-15,-14,-14,-13,-9,0,11,22,33,42,42,20,-24,-64,-76,-77,-79,-14,-14,-17,-16,-13,1,11,21,30,44,51,25,-20,-80,-80,-81,-80,-13,-17,-23,-35,-29,-4,5,15,22,36,82,29,-84,-83,-84,-84,-74,-13,-15,-36,-83,-30,-15,4,10,16,23,44,56,91,91,91,-84,4,-9,-13,-30,-30,-17,-9,0,6,11,21,32,52,60,63,91,91,42,-2,0,-6,-17,-9,-4,1,5,10,19,34,57,81,39,-84,90,45,6,9,4,4,-1,0,2,4,9,18,37,84,-87,-42,-84,-84,3,14,15,14,9,5,3,3,4,8,15,30,75,-90,-73,-72,-63,-59,22,22,16,14,9,5,4,4,6,11,22,45,-82,-72,-52,-62,-59,32,22,22,20,13,8,5,5,5,6,15,5,-75,-74,-69,-65,-61,36,61,52,39,17,11,6,4,1,-1,-1,-17,-46,-60,-63,-63,-58,25,18,95,95,34,15,7,1,-8,-70,-17,-7,-37,-50,-59,-54,-54,-1,3,-31,95,43,16,8,3,-3,-22,-33,-35,-48,-60,-64,-66,-41,-14,-22,-28,95,49,21,11,3,-6,-13,-43,-71,-94,-94,-94,-15,-14,-19,-21,-29,96,58,26,8,2,-10,-29,-83,-62,-93,75,75,28,29,-17,-19,-3,25,65,20,13,-2,-17,-34,-46,-73,70,71,73,71,43,-14,-10,2,29,40,32,15,-2,-20,-34,-46,-36,55,73,72,69,64],"ownershipAllowedMAE":0.0401501})%"); + lines.push_back(R"%({"sample":{"board":".................../....X..XXO..XOO..../..OO.X.XO.O.XXXOOO./..OXX.OXO..OOOOXXO./.....XXO..XO.XO..X./..OX..XO.OXOX.XXX../..O.OOXO.XOX.XO..../...OXXOOOXOX.X.X.../.O.OOXOX.XOXOX..O../...OXXX...OXXOXXO../.X.X..X....OOOOXOX./X.XXXX....O..XOOXO./.XO....XOOX.....XX./OXO..XO.XXOO...X.../.OO..XXO.........../.XOOOOOXX.OO.O.X.../.XXXOOX..O.X.OX..../...OOXXXXX...OXX.../.....O.......OOX.../","hintLoc":"null","initialTurnNumber":134,"metadata":"6FDF18CA46EAD460AAC6B7A15775C293:144","moveLocs":["D18","O6","P5","P6","Q5","R5","J9","K10","L9","J10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.94,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.31e-06,4.78e-06,5.19e-06,7.83e-06,2.24e-05,1.15e-05,4.5e-05,7.42e-06,5.92e-05,8.22e-06,5.23e-06,4.61e-06,4.5e-06,4.31e-06,4.63e-06,4.77e-06,4.4e-06,4.47e-06,4.3e-06,4.56e-06,4.72e-06,4.86e-06,0,0,0.00126,0.000849,0,0,0,4.74e-06,4.36e-06,0,0,0,4.16e-06,4.86e-06,4.52e-06,4.57e-06,4.73e-06,4.78e-06,0,0,0.0567,0,9.55e-05,0,0,4.93e-06,0,4.84e-06,0,0,0,0,0,0,5.32e-06,4.93e-06,4.97e-06,0,0,0,7.07e-06,0,0,0,5.47e-06,8.27e-06,0,0,0,0,0,0,0,7.31e-06,4.59e-06,5.89e-06,7.09e-05,0.0754,8.15e-06,0,0,0,4.65e-05,0.000301,0,0,8.8e-05,0,0,0.00103,7.28e-06,0,0.000119,5.22e-06,4.81e-06,0,0,8.23e-05,6.37e-06,0,0,0.000863,0,0,0,0,0,0,0,0,7.97e-06,8.64e-06,5.22e-06,5.58e-06,0,0.0134,0,0,0,0,1.65e-05,0,0,0,0.000414,0,0,6.89e-06,6.19e-06,6.64e-06,7.32e-06,5.53e-06,5.52e-06,5.74e-06,0,0,0,0,0,0,0,0,0,0.000234,0,4.82e-06,0,5.16e-06,4.98e-06,4.38e-06,6.93e-06,0,6.14e-06,0,0,0,0,0,5.78e-05,0,0,0,0,0,0.000515,0.000523,0,4.31e-06,5.07e-06,9.43e-06,3.04e-05,1.49e-05,0,0,0,0,8.2e-06,0,0,0,0,0,0,0,0,0,7e-05,4.72e-06,4.54e-06,0,4.54e-06,0,4.69e-06,4.88e-06,0,0.000193,0,2.8e-05,0,0,0,0,0,0,0,0,4.87e-05,0,0,0,0,0,0,6.67e-06,0.0501,5.93e-06,6.04e-06,0,4.33e-06,8.14e-06,0,0,0,0,0,1.12e-05,3.54e-06,0,0,1.13e-05,1.58e-05,0.00855,0.00109,0,0,0,0,9.82e-06,9.29e-06,1.64e-05,6.17e-06,5.66e-06,0,0,8.4e-06,0,0,0,8.34e-06,0.0337,0,0,2.51e-05,0,0,0,0,3.92e-05,0,0,0,8.85e-05,8.12e-06,4.86e-06,8.86e-06,0,0,3.96e-06,0.000131,0,0,0,8.7e-06,0.000654,7.16e-06,5.71e-06,9.18e-06,2.68e-05,0,0,0,7.85e-06,4.5e-06,5.82e-06,0,0,0,0,0,0,0,0,0.000111,0,0,6.31e-06,0,0.0745,0,0.0433,7.39e-06,4.98e-06,4.87e-06,0,0,0,0,0,0,7.28e-06,0.00202,0,0.0727,0,8.67e-06,0,0,4.01e-06,2.21e-05,6.89e-06,5.13e-06,6.56e-06,1.06e-05,9.94e-06,0,0,0,0,0,0,0,0.365,0.194,7.14e-06,0,0,0,6.57e-06,6.49e-06,4.99e-06,4.31e-06,7.58e-06,5.94e-06,5.31e-06,6.03e-06,0,6.18e-06,4.89e-06,4.69e-06,4.87e-06,9.55e-06,5.72e-05,6.43e-06,0,0,0,5.2e-06,5.25e-06,4.34e-06,8.13e-06],"winrateAvg":0.725034,"leadAvg":0.953342,"scoreMeanAvg":0.977507,"scoreStdevAvg":3.48386,"shorttermWinlossErrorAvg":0.246242,"shorttermScoreErrorAvg":0.902692,"ownership":[99,99,99,23,-14,-96,-98,-96,-11,17,99,99,99,99,99,99,99,99,99,99,99,99,100,-98,-97,-98,-99,-99,100,99,99,98,99,99,99,99,99,99,99,100,100,100,71,-100,-99,-100,100,99,100,99,99,99,98,100,100,100,98,99,99,100,-99,-99,-99,-99,-100,100,99,99,100,100,100,100,-99,-99,100,-2,99,99,62,46,-80,-100,-100,99,97,99,99,100,68,-98,100,52,-98,-100,-18,99,99,100,-86,-55,-23,-99,99,-45,99,99,100,-99,-97,-100,-100,-100,-99,-99,98,99,100,47,43,41,-99,99,-56,-100,100,-100,-98,-100,-99,-100,-99,-99,-99,95,97,97,100,-100,-100,99,99,99,-99,100,-100,-100,-100,-100,-100,-99,-99,-99,75,99,71,100,100,-100,99,-99,0,-100,100,-100,-99,-100,-100,-99,-99,-99,-99,31,-69,-45,100,-100,-100,-100,-99,-100,-100,100,-100,-100,100,-100,-100,-99,-99,-99,-71,-100,-79,-100,-100,-100,-100,-35,86,-31,100,100,100,100,100,-100,-99,-99,-99,-100,-99,-100,-100,-100,-100,-70,39,56,12,100,77,17,-47,100,100,-100,-99,-99,-51,-100,99,-35,-53,-90,-86,-99,97,98,95,97,-21,-42,-11,-2,-100,-100,-99,98,-99,99,-6,10,-99,-89,-98,-99,-99,100,100,-9,-100,-100,-100,-99,-99,-99,99,99,99,22,-9,-99,-99,-97,-98,8,52,53,-11,12,96,96,-100,-99,-99,99,98,99,99,99,99,99,-100,-100,-8,100,100,74,99,63,-99,-98,-99,-99,98,98,98,98,99,99,-100,-97,32,85,72,-29,51,99,-99,-98,-99,-99,-99,99,98,98,99,99,-99,-100,-100,-100,-99,28,-13,49,99,-99,-99,-99,-99,-99,98,98,98,91,29,29,-76,-94,-95,-80,-57,-14,52,99,99,-99,-99,-99,-99],"ownershipAllowedMAE":0.0320464})%"); + lines.push_back(R"%({"sample":{"board":"................./XO...XOOXX..O.O../.XOO.X.XOX.XOXO../X.XO.X.XOOX.OOXX./.XX.O.OXXOO.OX.X./..X.O.XO.X.OX.X../..OO..X.O......../.O....X........O./.OXX.OOO......X../..O.XXXO.....OX../.XX.XOX.......X../..O.XOX.O...OOX../..OXXO.....O.XOO./..XOOO.O.X.XOXO../..XO.XXX....XOO../.XOX............./................./","hintLoc":"null","initialTurnNumber":117,"metadata":"4C5D2042AA97EACCC339B583F1994B3C:127","moveLocs":["N11","P10","L16","J10","K11","F13","L15","L11","K10","L12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.74,"xSize":17,"ySize":17},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":-4.5,"policyOptimism":0.136,"pda":-0.495,"policyMixture":[0.000153,0.000607,0.000548,0.000715,0.000115,0.000166,5.58e-05,5.78e-05,5.93e-05,6.69e-05,5.92e-05,5.77e-05,5.62e-05,5.54e-05,5.5e-05,5.62e-05,5.48e-05,0,0,0.00086,0.000547,0.000171,0,0,0,0,0,0,6.02e-05,0,5.66e-05,0,5.77e-05,5.81e-05,0,0,0,0,5.84e-05,0,6.07e-05,0,0,0,0,0,0,0,0,5.68e-05,5.9e-05,0,0,0,0,5.91e-05,0,6.07e-05,0,0,0,0,0.0771,0,0,0,0,5.79e-05,5.83e-05,0,0,5.84e-05,0,0,0,0,0,0,0,0.855,0,0,0,0,5.68e-05,0.000544,0.000452,0,5.8e-05,0,6.48e-05,0,0,9.15e-05,0,0,0,0,0.000103,0,8.02e-05,5.88e-05,0.000243,0.000446,0,0,5.83e-05,6.21e-05,0,5.76e-05,0,0,0,5.67e-05,0,5.78e-05,0.000361,0.000364,5.85e-05,5.8e-05,0,5.98e-05,6.42e-05,0.000497,0.000246,0,6.16e-05,0,0,8.15e-05,5.68e-05,5.86e-05,5.7e-05,0,0,5.81e-05,5.69e-05,0,0,0,0.000339,0,0,0,5.84e-05,6.77e-05,5.67e-05,5.76e-05,5.74e-05,5.81e-05,0,5.92e-05,5.97e-05,6.26e-05,0.000478,0,0.000168,0,0,0,0,5.79e-05,5.94e-05,5.85e-05,5.88e-05,5.79e-05,0,0,5.49e-05,0.000112,0.000251,0,0,0.000209,0,0,0,5.99e-05,5.91e-05,6.09e-05,6e-05,5.8e-05,5.62e-05,5.88e-05,0,5.7e-05,5.93e-05,7.07e-05,0.000235,0,5.76e-05,0,0,0,0.000104,0,6.05e-05,6.09e-05,5.72e-05,0,0,0,5.71e-05,6.5e-05,6.68e-05,0.000104,0,0,0,0,5.61e-05,0.00033,9.94e-05,7.27e-05,6.14e-05,0,5.45e-05,0,0,0,5.84e-05,5.74e-05,0.0301,0,0,0,0,5.72e-05,0,0.000324,0,7.96e-05,0,0,0,0,5.31e-05,5.36e-05,5.52e-05,0.0192,0,0,5.63e-05,0,0,0,0.000247,0.000109,6.53e-05,7.4e-05,0,0,0,5.37e-05,5.37e-05,7.66e-05,0,0,0,0.000647,5.76e-05,5.66e-05,5.96e-05,6.33e-05,6.66e-05,6.49e-05,6.35e-05,6.25e-05,5.8e-05,5.57e-05,5.42e-05,5.46e-05,5.26e-05,0.000143,0.000292,0.000399,5.57e-05,5.65e-05,5.73e-05,5.94e-05,5.93e-05,6.04e-05,6.07e-05,6.03e-05,5.89e-05,5.84e-05,5.49e-05,5.4e-05,5.39e-05,4.74e-05],"winrateAvg":0.00693267,"leadAvg":-14.4469,"scoreMeanAvg":-13.9421,"scoreStdevAvg":11.7677,"shorttermWinlossErrorAvg":0.0403918,"shorttermScoreErrorAvg":3.21721,"ownership":[-24,-3,30,42,-8,-50,-41,34,71,86,88,95,97,97,91,82,55,-76,21,18,42,-14,-95,65,69,68,70,97,95,100,98,99,62,31,-79,-80,71,71,-27,-96,-54,-96,97,73,98,94,100,98,99,5,-6,-80,-81,-82,71,5,-96,-93,-96,98,99,96,98,100,100,-93,-93,-42,-76,-83,-83,1,71,-96,-88,-96,-97,99,99,99,100,-48,-47,-93,-84,-55,-61,-84,11,69,-10,-90,22,-92,-92,-89,98,13,17,-93,-88,-87,2,-24,66,68,37,-20,-89,22,70,72,-86,-5,76,-26,-72,-83,-83,24,54,25,-3,33,20,-86,-12,-23,72,-23,-26,-26,-34,-96,-71,-72,29,56,-89,-90,-16,81,82,82,32,38,3,-9,-7,-17,-96,-78,-71,-7,12,11,-73,-99,-99,-99,82,42,26,17,8,16,58,-96,-81,17,-43,-94,-94,-85,-99,12,-99,-4,25,33,24,22,37,-23,-96,-41,24,-82,-86,-83,-92,-99,13,-98,-1,77,25,32,45,98,98,-96,-18,60,-86,-87,-83,-98,-99,10,-24,15,26,12,25,96,93,95,100,100,78,-89,-89,-95,5,7,9,-37,39,-5,-69,11,-18,95,94,100,97,96,-91,-91,-95,4,-31,-91,-91,-92,-54,-46,-26,3,-3,100,100,96,96,-92,-95,-89,-90,-40,-71,-78,-77,-67,-52,-29,-4,38,64,91,91,94,-92,-92,-91,-74,-59,-59,-67,-66,-60,-45,-25,4,35,64,76,87,90],"ownershipAllowedMAE":0.0502853})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...X.........XXXXO./....X.........OOO../..O................/.................../...O.............../.................../.................../...............O.../.................../..OX.............../..OX.............../...X...........OO../..OX...........OX../..OX............X../...OX........X.X.../..OX.............../.................../","hintLoc":"null","initialTurnNumber":33,"metadata":"295912810AB5A62F13FAB4BC1459EA50:43","moveLocs":["C3","N15","Q12","D10","M17","S18","J17","C16","S16","C9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.02,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":8.5,"policyOptimism":0.0,"pda":1.151,"policyMixture":[1.62e-06,2.12e-06,2.32e-06,2.33e-06,2.85e-06,3.36e-06,3.34e-06,3.06e-06,2.92e-06,2.46e-06,2.68e-06,3.81e-06,3.62e-06,3.26e-06,3.23e-06,2.92e-06,3.58e-06,6.56e-06,2.04e-06,2.38e-06,6.21e-06,1.88e-05,8.88e-06,3.58e-05,5.48e-05,0.000379,2.72e-05,7.11e-06,8.39e-06,1.35e-05,4.9e-05,0.0232,5.64e-06,2.84e-06,4.22e-06,8.58e-06,0,0.000175,3.86e-06,1.13e-05,8.83e-06,0,6.1e-06,0.00212,0.0367,2.43e-05,0,8.49e-06,9.96e-06,0,7.1e-06,0,0,0,0,0,2.59e-06,5.13e-06,0.00139,0,3.92e-06,0,2.62e-05,0.0027,9.16e-05,1.53e-05,2.99e-05,0.000647,2.35e-05,1.2e-05,0.215,0,0,0,0,1.57e-06,6.09e-06,0.038,0,0.102,0.000144,0.0118,0.000126,0.000363,0.000273,0.000382,0.00122,8.71e-05,0,1.17e-05,4.33e-06,2.51e-06,2.12e-06,2.23e-06,1.71e-06,3.68e-06,7.98e-05,7.77e-06,1.16e-05,3.46e-05,0.0227,0.0207,0.00115,0.000498,0.0005,0.000396,0.000225,2.66e-05,3.19e-05,9.77e-06,4.6e-06,3.64e-06,3.37e-06,1.79e-06,3.09e-06,1.44e-05,1.05e-05,0,1.55e-05,0.118,0.126,0.00141,0.000541,0.000408,0.000283,0.000187,0.000151,3.59e-05,1.11e-05,6.14e-06,5.35e-06,3.72e-06,1.73e-06,3.16e-06,4.39e-05,3.56e-05,1.19e-05,0.000259,0.111,0.0255,0.00101,0.000473,0.000365,0.00027,0.000198,9.66e-05,2.53e-05,8.77e-06,0,4.44e-06,4.25e-06,1.74e-06,3.39e-06,3.65e-05,0.00115,8.29e-05,0.000896,0.000451,0.000524,0.000363,0.000387,0.000333,0.000248,0.000167,6.62e-05,1.69e-05,7.84e-06,4.17e-06,4.74e-06,3.57e-06,1.74e-06,3.44e-06,7.37e-06,5.28e-06,0,3.03e-05,8.23e-05,0.000207,0.000283,0.000337,0.000319,0.000237,0.000145,5.49e-05,1.94e-05,7.89e-06,0,4.45e-06,4.44e-06,1.81e-06,4.36e-06,0.0842,0,4.56e-06,0.00021,2.06e-05,0.000196,0.000246,0.00032,0.00032,0.000238,0.000145,5.13e-05,2.25e-05,1.1e-05,6.22e-06,6.85e-06,4.87e-06,1.91e-06,5.46e-06,1.29e-05,0,0,5.05e-06,2.08e-05,6.95e-05,0.000182,0.000294,0.00033,0.000241,0.000135,5.19e-05,2.02e-05,1.12e-05,6.97e-06,7.05e-06,5.77e-06,2.1e-06,3.24e-06,1.04e-05,0,0,3.51e-06,2e-05,4.78e-05,0.000162,0.000298,0.000379,0.000275,0.000151,6.75e-05,1.66e-05,7.55e-06,3.53e-06,3.68e-06,9.79e-06,2.9e-06,2.18e-06,7.35e-06,1.07e-05,0,3.49e-06,1.56e-05,3.74e-05,0.000124,0.000307,0.000523,0.000356,0.000275,0.000133,1.75e-05,4.21e-06,0,0,1.81e-05,3.81e-06,2.43e-06,3.15e-06,0,0,4.22e-06,1.73e-05,3.06e-05,0.000106,0.000332,0.000805,0.000441,0.000394,0.000211,2.53e-05,4.43e-06,0,0,3.16e-05,3.3e-06,1.9e-06,2.4e-06,0,0,7.08e-05,0.0027,9.5e-05,0.000154,0.000654,0.00235,0.000378,0.000185,0.000255,3.54e-05,0.000514,0.021,0,5.19e-06,2.99e-06,1.71e-06,2.11e-06,0,0,0,0.000125,0.000161,0.000193,0.000302,0.000278,0.000196,0.000209,0.000105,0,1.6e-05,0,6.22e-06,6.77e-06,2.28e-06,2.02e-06,2.17e-06,0,0,3.24e-05,1.75e-05,1.91e-05,1.81e-05,1.76e-05,1.67e-05,1.63e-05,1.86e-05,1.82e-05,1.99e-05,5.15e-05,9.17e-06,7.88e-06,4.74e-06,2.06e-06,1.6e-06,1.81e-06,2.14e-06,4.8e-06,3.68e-06,3.03e-06,2.93e-06,2.74e-06,2.62e-06,2.62e-06,2.53e-06,2.59e-06,2.55e-06,2.56e-06,2.68e-06,2.26e-06,2.2e-06,2.02e-06,1.56e-06,3.71e-06],"winrateAvg":0.923342,"leadAvg":5.66227,"scoreMeanAvg":8.49101,"scoreStdevAvg":13.5847,"shorttermWinlossErrorAvg":0.0556773,"shorttermScoreErrorAvg":0.99853,"ownership":[-59,-60,-59,-51,-40,-18,3,24,37,38,28,8,-29,-54,-66,-67,-65,-54,-22,-56,-62,-61,-68,-39,-24,3,26,44,42,36,-1,-21,-62,-74,-75,-60,-62,40,-49,-59,-72,-89,-54,-19,-16,16,76,36,39,78,-36,-81,-80,-80,-81,94,51,-15,-55,-83,-29,-84,-29,-13,-3,19,17,21,31,21,40,95,95,95,94,81,4,13,52,10,-11,-1,-4,0,8,10,13,7,-40,9,36,53,73,82,84,16,26,27,23,1,3,5,3,4,5,7,7,0,15,22,45,68,79,79,14,15,32,68,24,19,18,4,2,2,3,4,7,11,33,53,78,77,76,-1,6,9,16,8,24,11,3,0,0,1,2,7,16,31,93,78,75,72,-25,-12,7,-14,1,7,2,-2,-3,-2,0,2,6,11,17,61,74,70,67,-47,-58,-51,-88,-24,-8,-4,-5,-4,-3,-1,2,7,15,29,91,69,63,61,-53,-36,-90,-70,-10,-13,-8,-8,-6,-4,-2,1,5,6,27,43,59,59,55,-26,-13,49,-94,-35,-19,-12,-10,-7,-5,-2,1,5,9,16,38,51,43,48,2,43,47,-94,-44,-19,-15,-11,-7,-5,-2,2,5,11,17,41,56,61,35,42,65,-66,-94,-47,-22,-16,-12,-8,-6,-3,4,3,9,28,88,89,13,10,72,73,92,-94,-52,-25,-17,-12,-8,-16,-4,4,0,-7,28,89,-86,-30,-25,80,85,92,-94,-65,-23,-16,-11,-4,2,-6,-5,-3,-21,13,31,-86,-73,-47,84,88,92,92,-76,-31,-16,-11,-5,-2,-7,-6,-17,-85,-40,-90,-81,-74,-65,84,81,92,-11,-9,-51,-21,-17,-9,-7,-10,-18,-35,-58,-72,-81,-79,-76,-72,80,78,40,28,-19,-27,-27,-16,-9,-5,-8,-16,-31,-48,-64,-74,-77,-77,-75],"ownershipAllowedMAE":0.0267831})%"); + lines.push_back(R"%({"sample":{"board":"........./..XOO..X./..XOXXXO./..XXOXOX./.XOXOOOX./.O.OO.X../..OXXXOO./..X.XO.O./......O../","hintLoc":"null","initialTurnNumber":23,"metadata":"D0787E843573BC8F863175A35C0E53FD:33","moveLocs":["C4","H4","G8","J7","F8","H7","B6","B7","A5","A7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.28,"xSize":9,"ySize":9},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":8.5,"policyOptimism":0.639,"pda":-1.25,"policyMixture":[0.000232,0.176,0.0527,0.0504,0.000221,0.000141,0.000245,0.00067,9.71e-05,0.246,0.0282,0,0,0,0,0,0,0.0001,0,0,0,0,0,0,0,0,0,0.154,0,0,0,0,0,0,0,8.96e-05,0,0.000112,0,0,0,0,0,0,0.000102,0.000145,0,0,0,0,0.224,0,0,0.000109,0.000474,0.000188,0,0,0,0,0,0,0.000109,0.000302,0.0618,0,0.000145,0,0,9.42e-05,0,0.000103,0.000107,0.000238,0.000248,0.000346,0.00189,0.000129,0,0.000103,0.000115,8.23e-05],"winrateAvg":0.361012,"leadAvg":-5.31443,"scoreMeanAvg":-2.94959,"scoreStdevAvg":10.8466,"shorttermWinlossErrorAvg":0.483192,"shorttermScoreErrorAvg":6.21627,"ownership":[-87,-88,-89,-88,-88,-89,-94,-96,-97,-84,-86,-88,-84,-84,-84,-85,-100,-99,-90,-89,-89,-83,-100,-100,-100,-100,-100,16,45,-89,-89,90,-100,89,-100,-97,62,46,89,-90,90,89,89,-100,-88,56,86,89,90,89,31,-99,-100,-30,54,66,88,-21,-22,-22,76,74,-12,49,39,-10,-8,-23,74,71,71,59,48,40,33,24,47,69,73,69,64],"ownershipAllowedMAE":0.149369})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...X...........OXO./...............OXO./...............OOX./................X.X/..........X......X./.................../.................../.................../.................../.................../.................../.................../.................../..XXX..........O.../.XOOOX............./.....O............./.................../","hintLoc":"null","initialTurnNumber":25,"metadata":"A27EEFEEAD8363702D31752B8E17A5F7:35","moveLocs":["B2","E2","D2","G2","D15","C12","F4","G3","F5","H5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.85,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.157,"pda":0.96,"policyMixture":[1.83e-06,2.83e-06,3.54e-06,3.79e-06,3.48e-06,3.27e-06,2.81e-06,2.57e-06,2.54e-06,2.46e-06,2.41e-06,2.36e-06,2.25e-06,2.36e-06,2.44e-06,2.65e-06,3.19e-06,2.1e-06,1.81e-06,2.72e-06,1.17e-05,1.22e-05,2.08e-05,3.15e-05,2.95e-05,2.46e-05,2.02e-05,1.77e-05,1.44e-05,1.18e-05,1.03e-05,8.36e-06,1e-05,7.43e-06,6.94e-06,6.31e-06,4.25e-06,2.12e-06,3.08e-06,1.68e-05,0.349,0,0.0144,0.000917,0.000793,0.000274,0.000208,0.000106,3.68e-05,1.94e-05,1.58e-05,1.29e-05,5.09e-06,0,0,0,2.02e-06,3.33e-06,4.54e-05,9.69e-05,2.82e-05,0.000343,0.0854,0.0449,0.000493,0.000256,0.000173,7.06e-05,2.73e-05,1.38e-05,1.01e-05,3.3e-06,0,0,0,2.47e-06,3.31e-06,4.89e-05,1.85e-05,0,1.31e-05,0.0037,0.00156,0.000346,0.00017,9e-05,4.64e-05,2.59e-05,1.71e-05,1.37e-05,5.51e-06,0,0,0,3.61e-06,3.34e-06,5.63e-05,7.9e-05,1.28e-05,5.53e-05,0.000721,0.000679,0.000262,0.000153,8.84e-05,3.34e-05,2.82e-05,2e-05,1.92e-05,1.83e-05,4.12e-05,0,0,0,3.51e-06,5.85e-05,9.18e-05,0.005,0.0121,0.00216,0.000439,0.00026,0.000173,7.08e-05,0,2.7e-05,2.58e-05,3.68e-05,0.000611,2.43e-05,5.68e-06,0,1.9e-06,3.46e-06,2.84e-05,0,0.000417,0.035,0.00446,0.000527,0.000297,0.000183,0.000144,4.62e-05,3.38e-05,2.83e-05,2.9e-05,4.05e-05,1.93e-05,7.34e-05,9.2e-06,2.6e-06,3.15e-06,2.93e-05,5.01e-05,0.000623,0.00354,0.00211,0.000695,0.000326,0.000204,0.000122,7.65e-05,4.4e-05,3.22e-05,3.01e-05,3.4e-05,3.75e-05,4.19e-05,2.34e-05,2.59e-06,2.91e-06,3.28e-05,0.003,0.00471,0.00187,0.00168,0.000958,0.000393,0.000231,0.000151,9.62e-05,5.41e-05,3.81e-05,3.55e-05,3.7e-05,0.000103,0.000152,1.66e-05,2.36e-06,2.77e-06,1.94e-05,0.00142,0.0318,0.00277,0.00216,0.00105,0.000395,0.00026,0.000171,0.000113,6.66e-05,4.4e-05,3.58e-05,3.43e-05,5.55e-05,0.000101,1.58e-05,2.38e-06,2.65e-06,1.73e-05,0.000205,0.000998,0.00179,0.00218,0.000956,0.000442,0.00029,0.000191,0.000125,7.71e-05,4.52e-05,3.38e-05,3.21e-05,5.93e-05,7.71e-05,1.46e-05,2.38e-06,2.91e-06,2.02e-05,0.000132,2.92e-05,0.00162,0.053,0.00115,0.000261,0.000292,0.000175,0.000133,7.95e-05,4.62e-05,3.11e-05,3.06e-05,0.000116,0.000179,1.6e-05,2.5e-06,3.07e-06,1.07e-05,5.89e-05,0.00587,9.36e-05,2.08e-05,0.000666,0.129,0.000533,0.000223,0.000124,7.08e-05,4.03e-05,3.01e-05,3.16e-05,0.000189,0.000404,1.77e-05,2.63e-06,3.04e-06,2.32e-05,6.71e-06,7.7e-06,2.59e-05,0,1.28e-05,0,8.69e-05,0.000194,0.000115,8.83e-05,5.59e-05,4.18e-05,2.04e-05,1.58e-05,9.06e-05,2.14e-05,2.75e-06,4.86e-06,0.144,0,0,0,0,9.84e-06,5.76e-05,7.6e-05,0.00133,0.000175,0.000212,0.000391,0.000445,1.7e-05,0,2.16e-05,1.57e-05,2.76e-06,1.43e-05,0,0,0,0,0,0,1.14e-05,0.000761,0.00182,0.00024,0.000252,0.00135,0.00558,0.000141,2.32e-05,2.73e-05,1.07e-05,2.38e-06,3.28e-06,0,2.89e-06,0,0,0,0,8.3e-06,3.24e-05,2e-05,1.73e-05,1.84e-05,2.06e-05,2.29e-05,2.64e-05,1.72e-05,1.09e-05,6.32e-06,2.36e-06,1.96e-06,2.51e-06,2.49e-06,3.74e-06,0.0087,1.14e-05,3.07e-06,3.07e-06,3.07e-06,2.57e-06,2.49e-06,2.49e-06,2.66e-06,2.81e-06,2.92e-06,2.81e-06,2.39e-06,2.35e-06,1.8e-06,5.33e-06],"winrateAvg":0.885287,"leadAvg":5.10858,"scoreMeanAvg":7.42033,"scoreStdevAvg":13.5519,"shorttermWinlossErrorAvg":0.0565046,"shorttermScoreErrorAvg":0.886162,"ownership":[-20,-29,-35,-38,-33,-24,-14,-8,-4,-1,3,8,16,34,53,73,79,78,72,-12,-17,-44,-42,-40,-23,-14,-7,-3,0,3,8,16,17,68,80,75,80,62,0,0,35,-62,-10,-10,-6,-1,0,-1,2,7,12,26,45,94,76,81,57,10,15,24,16,7,11,9,3,1,-1,0,4,10,18,42,94,77,82,28,11,9,21,63,12,11,5,3,1,0,-3,1,5,13,22,94,94,-66,-23,2,5,6,17,3,5,3,0,-1,-2,-10,-2,1,4,9,-17,-68,-65,-70,-10,-13,0,10,3,1,-1,-2,-4,-10,-63,-10,-3,-1,15,-10,-36,-72,-63,-23,-32,-63,-12,-7,-1,-2,-3,-2,-2,-10,-3,-2,-2,-2,-12,-8,-43,-51,-29,-34,-24,-10,-6,-1,-1,-1,-1,-2,-4,-2,-1,-1,-3,-14,-17,-31,-36,-32,-32,-24,-15,-5,-1,0,0,-1,-2,-3,-2,-1,-2,-3,-5,-9,-18,-24,-35,-36,-29,-12,-5,-1,1,1,0,-1,-2,-2,-1,-1,-2,-5,-8,-12,-13,-36,-37,-33,-23,-10,-2,0,2,0,-1,-1,-2,-1,-1,-1,-3,-4,-6,-6,-34,-38,-30,-24,-11,2,0,-2,-2,-2,-2,-2,-1,0,2,-1,1,-2,0,-30,-33,-38,-31,-30,-9,-7,2,-10,-8,-5,-3,-1,3,8,15,7,3,6,-7,-51,-39,-30,-9,21,-18,-71,-29,-16,-9,-5,0,8,15,27,28,14,11,22,51,-65,-65,-66,19,-34,-33,-27,-17,-15,-8,-7,14,25,79,34,18,15,64,49,88,86,85,-74,-73,-37,-27,-21,-18,-11,-5,-7,24,30,22,18,15,64,86,84,86,21,25,-72,-46,-37,-27,-21,-14,-9,-4,9,14,16,14,16,78,79,81,71,44,-6,-34,-44,-36,-29,-21,-14,-7,0,7,12,13,15,15],"ownershipAllowedMAE":0.0266702})%"); + lines.push_back(R"%({"sample":{"board":".................../...XXX........X.XO./..XOXOXX.X..O..XOO./...OOO..O.....XOX../..OOXXX.....O.XO.../...XOO......OX..O../.O..........OOX..../...XXOO......X...../....OX........X.X../..XO.............../...O.............../..O.X............../................O../...XX..X.........../.XXO.........X...../.OO..O.........O.../...O...X.....O...../.....X............./.................../","hintLoc":"null","initialTurnNumber":72,"metadata":"1D32FD5CC6EB37358181B94E50AB2A9B:82","moveLocs":["G14","F13","E5","B7","D4","E2","F3","E4","M11","J17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.61,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":-6.5,"policyOptimism":0.0,"pda":-1.152,"policyMixture":[1.43e-06,1.68e-06,1.67e-06,1.53e-06,1.59e-06,1.54e-06,1.78e-06,2.48e-06,2.47e-06,1.99e-06,2.06e-06,2.04e-06,1.94e-06,1.98e-06,1.8e-06,1.91e-06,2.59e-06,0.00277,1.68e-06,1.77e-06,2.34e-06,2.09e-06,0,0,0,2.18e-06,3.75e-06,0.558,7.89e-05,5.67e-05,2.89e-06,2.99e-06,2.51e-06,0,2.05e-06,0,0,3.39e-06,2.08e-06,2.95e-06,0,0,0,0,0,0,0,0,9e-06,4.51e-06,0,6.1e-06,2.07e-06,0,0,0,2.45e-06,2.11e-06,2.11e-05,3.28e-06,0,0,0,0.0964,2.35e-06,0,0.0123,1.28e-05,5.9e-06,3.37e-06,2.91e-06,0,0,0,7.69e-05,2.56e-06,2.47e-06,0.000415,0,0,0,0,0,3.58e-06,0.000618,1.75e-05,1.09e-05,2.38e-06,0,2e-06,0,0,2.35e-06,4.55e-05,2.6e-06,2.36e-06,4.03e-05,0.311,0,0,0,0,2.26e-06,1.3e-05,1.19e-05,6.63e-06,2.05e-06,0,0,2.93e-06,0.000114,0,8.86e-05,2.82e-06,2.87e-06,0,0.000153,0.00397,2.22e-06,0,2.14e-06,6.72e-06,6.48e-06,4.65e-06,5.03e-06,2.37e-06,0,0,0,3.21e-06,2.86e-05,0.000676,2.52e-06,2.1e-06,0.00473,0.00231,0,0,0,0,0.000744,1.42e-05,4.24e-06,2.96e-06,2.4e-06,2.29e-06,0,2e-06,2.08e-06,2.27e-06,3.78e-06,2.14e-06,1.98e-06,4.51e-06,3.94e-05,0.000626,0,0,0.00058,5.23e-05,1.02e-05,3.23e-06,2.48e-06,0,2.03e-06,1.85e-06,0,1.98e-06,0,2.24e-06,1.75e-06,2.05e-06,3.43e-06,0,0,2.15e-05,0.000398,9.7e-06,9.05e-06,3.69e-06,2.86e-06,2.51e-06,2.22e-06,2.09e-06,2.1e-06,2.09e-06,1.94e-06,2.06e-06,2.27e-06,1.69e-06,2.24e-06,6.75e-05,2.1e-05,0,3.77e-06,3.64e-06,4.16e-06,3.25e-06,2.89e-06,2.71e-06,2.59e-06,2.58e-06,2.47e-06,2.5e-06,2.54e-06,2.52e-06,2.78e-06,2.54e-06,1.71e-06,2.32e-06,4.6e-06,0,0.000123,0,2.28e-06,2.5e-06,2.65e-06,2.59e-06,2.63e-06,2.59e-06,2.63e-06,2.69e-06,2.83e-06,2.82e-06,2.83e-06,2.99e-06,2.67e-06,1.79e-06,2.58e-06,0,4.74e-06,1.9e-06,1.77e-06,1.96e-06,2.12e-06,2.2e-06,2.38e-06,2.51e-06,2.62e-06,2.66e-06,2.74e-06,2.92e-06,3.15e-06,7.61e-06,0,3.28e-06,1.8e-06,2.48e-06,3.18e-06,2.22e-06,0,0,1.87e-06,2.21e-06,0,2.29e-06,2.53e-06,2.7e-06,2.73e-06,2.6e-06,2.54e-06,8.66e-06,2.85e-05,2.62e-05,6.51e-06,1.87e-06,2.72e-06,0,0,6.25e-06,0,2.32e-06,2.42e-06,2.37e-06,2.46e-06,2.57e-06,2.72e-06,2.96e-06,2.54e-06,0,3.69e-06,0.000189,0.000168,9.12e-05,2.05e-06,7.34e-05,0,0,0,0,0,3.44e-06,2.34e-06,2.6e-06,2.68e-06,2.9e-06,4.5e-06,4.25e-06,1.38e-05,0.000224,0,0.000939,1.3e-05,2.05e-06,2.78e-06,5.35e-05,8.13e-06,0,0.000207,0,2.03e-06,0,2.56e-06,2.86e-06,3.61e-06,8.07e-06,2.43e-05,0,0.000173,0.000312,0.00013,1.2e-05,2e-06,2.78e-06,4.99e-06,1.52e-05,3.7e-06,0,0,1.77e-06,2.08e-06,2.39e-06,2.56e-06,2.78e-06,3.02e-06,4.1e-06,1.75e-05,2.19e-05,1.18e-05,7.04e-06,3.28e-06,1.93e-06,1.49e-06,2.01e-06,2.03e-06,2.27e-06,2.81e-06,1.85e-06,1.6e-06,1.71e-06,1.65e-06,1.7e-06,1.74e-06,1.81e-06,1.9e-06,1.95e-06,2.01e-06,1.97e-06,1.91e-06,1.98e-06,1.43e-06,2.97e-06],"winrateAvg":0.194078,"leadAvg":-3.7952,"scoreMeanAvg":-5.51381,"scoreStdevAvg":13.0644,"shorttermWinlossErrorAvg":0.178183,"shorttermScoreErrorAvg":2.04588,"ownership":[-58,-70,-80,-88,-90,-89,-82,-76,-64,-56,-37,-21,-15,-38,-51,-51,-19,-20,29,-37,-56,-73,-95,-95,-96,-88,-69,-76,-55,-48,-4,6,-9,-82,-51,-50,71,42,-17,-13,-74,86,-94,84,-92,-91,28,-70,-16,4,51,16,-75,-79,71,71,66,17,12,23,86,87,87,-14,-43,35,7,-4,7,27,-22,-87,69,63,66,66,44,61,88,89,-49,-48,-50,-6,-6,2,9,21,61,1,-87,68,67,66,59,67,71,69,67,93,93,-48,3,11,9,10,24,62,-79,-75,-6,72,45,38,71,86,75,77,76,93,31,9,10,15,10,15,64,65,-89,-25,1,-9,7,71,64,62,48,44,93,92,25,10,9,7,-20,8,-87,-78,-20,-33,-28,-24,65,63,60,58,75,-24,31,10,-1,-2,-9,-77,-38,-49,-93,-47,-80,-42,-34,63,60,52,83,28,-10,2,-2,-8,-8,-12,-21,-25,-16,-35,-28,-28,-27,-27,61,59,71,82,-17,-13,-16,-12,-13,-11,-12,-16,-16,-16,-17,-8,-7,-8,-10,58,66,82,-23,-78,-33,-21,-20,-16,-13,-13,-13,-13,-11,-8,-5,5,9,8,28,77,0,-31,-54,-36,-35,-30,-22,-16,-14,-13,-11,-8,-1,8,64,28,22,-9,-10,-35,-85,-84,-43,-33,-82,-27,-19,-16,-13,-10,-9,12,19,28,31,29,-26,-66,-66,-12,-83,-19,-25,-30,-27,-18,-15,-13,-9,-51,10,27,40,28,29,1,50,47,-15,19,22,-29,-24,-30,-20,-15,-6,4,14,28,86,40,29,26,31,30,35,48,-34,-80,-48,-83,-34,-24,-11,-11,7,74,40,47,38,27,24,33,32,34,23,26,-80,-61,-56,-42,-27,-14,2,22,39,41,36,32,25,25,33,32,28,18,-17,-29,-52,-49,-41,-27,-12,3,20,32,36,33,29,27,24],"ownershipAllowedMAE":0.0326728})%"); + lines.push_back(R"%({"sample":{"board":"......X.X.X......../.....XOOOX.X...XXO./..OOXXXO.OXX...XO../.O..OXOXOOOX...XO../..OO.XOXX.XX..XO.X./.....X.O......OOOO./...X.........OX..../.XOX.........OX.X../.XXOO.......OX.X.../.XO..X.......OX.X../..O........O.OOXX../..OO.......X.XOOX../.OXOX.......XXOOXX./.XXXOX.X...XOOXOOO./..XOOOO..O.XX.XXO../..X.......O.....OX./.................../","hintLoc":"null","initialTurnNumber":135,"metadata":"2741E32D0600D94EF18167589ACC465A:145","moveLocs":["H3","F6","E11","G10","E10","D12","B6","D2","B12","B11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.19,"xSize":19,"ySize":17},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":-6.0,"policyOptimism":0.0,"pda":-0.513,"policyMixture":[8.37e-05,8.44e-05,8.51e-05,9.3e-05,9.6e-05,9.13e-05,0,0.000102,0,0,0,7.95e-05,8.12e-05,8.65e-05,8.86e-05,8.93e-05,9.87e-05,0.000102,9.03e-05,8.67e-05,8.37e-05,8.6e-05,9.33e-05,8.49e-05,0,0,0,0,0,0,0,8.46e-05,9.44e-05,9.89e-05,0,0,0,8.99e-05,8.16e-05,8.48e-05,0,0,0,0,0,0,8.49e-05,0,0,0,8.57e-05,0.000101,9.87e-05,0,0,8.89e-05,9.46e-05,8.02e-05,0,7.56e-05,7.48e-05,0,0,0,0,0,0,0,0,8.54e-05,9.41e-05,9.85e-05,0,0,9.84e-05,9.75e-05,8.16e-05,7.43e-05,0,0,7.76e-05,0,0,0,0,0.00148,0,0,9.12e-05,0.000167,0,0,9.23e-05,0,9.62e-05,8.31e-05,0,0.0236,0,0.371,0,0.000484,0,0.00152,0.000159,0.000101,9.63e-05,0.000102,9.76e-05,0,0,0,0,0.000117,0.000124,0,0.00334,0,0,0.000532,0.0219,0.00013,0.000177,0.00019,0.000119,0.000106,9.58e-05,0,0,9.64e-05,0.000104,0.000117,0.000405,7.03e-05,0,0,0,0,0.000107,0,0.00348,0.000458,0.000211,0.000139,0.000108,9.4e-05,0,0,9.53e-05,0,0.00423,0.000241,7.16e-05,0,0,0,0,0.00272,0.00446,0.00143,0.000582,0.000197,0.000127,0.000103,0,0,0.000198,0,8.73e-05,0.000638,0.000125,0.000105,0,0,0.000193,0.00074,0,0.00227,0.0018,0.000543,0.00024,0.000123,0.00011,9.86e-05,0,0,0,0,9.58e-05,9.66e-05,0.000102,9.1e-05,0,7.82e-05,0.167,0.205,0.0014,0.00092,0.000607,0.00087,0.000948,0,0.000116,0,0,0,0,9.16e-05,0.000104,0.000796,0,0,0,0.00238,0,0.000675,0.000906,0.000892,0.000912,0.00225,0,0.000214,0,0,0,0,8.48e-05,0.000112,0.000499,0,0,0,0,0.000154,0.000426,0.000445,0.000991,0.00235,0.00113,0.00022,0,0,0,0,0,0,0.00011,0.00405,0,0,0,0,0,0.0016,0,0.000677,0.000312,0.000127,0,0,0,0,0,0,0,0.000101,0.00056,0.00011,0,0,0,0,0,0,0.000106,0,0.000101,0,0,0.000126,0,0,0,8.84e-05,8.77e-05,0.0037,0.0034,0,0,0.13,0.000245,9.79e-05,9.19e-05,0.000101,9.23e-05,0,0.000119,9.49e-05,0.000338,0.000134,0.000199,0,0,9.96e-05,8.99e-05,0.000474,9.75e-05,0.000145,0.000356,0.000152,9.89e-05,9.31e-05,8.91e-05,9.28e-05,9.86e-05,0.000111,0.00012,0.000121,0.000122,0.000118,9.79e-05,9.76e-05,8.17e-05,7.94e-05],"winrateAvg":0.000135127,"leadAvg":-46.2045,"scoreMeanAvg":-47.0384,"scoreStdevAvg":16.239,"shorttermWinlossErrorAvg":0.00235646,"shorttermScoreErrorAvg":3.76704,"ownership":[64,56,9,-7,-42,-88,-97,-92,-98,-97,-100,-97,-93,-88,-83,-70,-35,-19,23,80,60,83,-13,-48,-99,-77,-74,-74,-99,-98,-100,-87,-87,-83,-92,-92,55,43,88,88,97,97,-99,-99,-99,-76,-76,-66,-100,-100,-67,-51,-58,-92,72,51,55,91,97,92,51,49,-99,-71,-92,-66,-63,-65,-100,-51,-33,-30,-92,72,65,56,87,93,98,98,-30,-99,-69,-92,-91,-67,-99,-100,-33,2,-29,76,70,48,53,34,95,61,-55,62,-98,-72,-14,-46,-41,-43,-41,-39,-34,75,75,76,77,48,8,-54,-45,-51,64,-27,-44,-36,-32,-23,-17,-7,-5,59,-71,4,23,-25,22,-35,-51,-40,-50,64,-21,-86,-29,-23,-15,-4,6,25,63,-71,-57,-89,-42,-33,-40,-50,-49,64,63,-31,-33,-27,-16,-8,5,18,76,-1,-2,-87,-85,-80,-58,-28,-50,64,55,0,-74,-37,-25,-14,-4,16,23,57,87,-41,-41,-92,-84,-76,-7,2,64,45,19,-9,-47,-27,-17,-7,-11,68,32,87,87,-91,-92,-85,-77,30,65,65,65,-2,-73,-35,-34,-18,-22,-24,-79,-24,-86,87,87,-92,-85,-79,-5,64,-82,63,-54,-20,-7,-16,-13,-7,-27,-59,-86,-86,86,87,-93,-93,-26,-49,-84,-83,-81,88,-26,43,-45,10,-9,-32,-90,-83,-83,-86,88,87,89,-4,-75,-77,-83,88,88,88,88,88,50,85,-23,-90,-90,-85,-87,-86,88,70,61,-72,-76,-84,-84,34,68,77,79,72,72,79,-25,-56,-50,-43,-20,89,41,58,-76,-75,-73,-37,-3,44,61,70,70,67,40,3,-23,-19,-15,27,53,61,55],"ownershipAllowedMAE":0.053142})%"); + lines.push_back(R"%({"sample":{"board":"..............OXX../.XOO..O.......OX.X./.XOX.XOX.......OXX./..XOOO.O...X...OXO./.XXXO..XOO..O..O.O./.OXOO..OXXO.....OX./.OOX......O....O.O./.OXX....XXX..XXO.X./.X......OOO.X.OXX../........XXOX..O..../........OXXO..OX.../....X..X.OXO..OX.../.XX...X.XXOOX..X.../X.XOOXXXOOOO......./.X.XOOOOXX........./X..X....O.....XXX../OX.X.O.X.....X.OO../.OXXX.......OO...../..O................/","hintLoc":"null","initialTurnNumber":123,"metadata":"BB1C8BEDB51C6699E5AFAA5748AE850D:133","moveLocs":["H10","H11","K4","K3","L4","J3","M12","M4","H13","E13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":3.6,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":6.0,"policyOptimism":0.0,"pda":2.557,"policyMixture":[2.1e-06,8.33e-06,2.55e-06,2.32e-06,1.98e-06,1.94e-06,1.91e-06,1.91e-06,1.84e-06,1.79e-06,1.79e-06,1.8e-06,1.9e-06,2.22e-06,0,0,0,1.87e-06,1.7e-06,2.39e-06,0,0,0,2.69e-06,2.21e-06,0,2.41e-06,2.39e-06,2.42e-06,2.43e-06,2.54e-06,2.7e-06,3.48e-06,0,0,1.53e-06,0,1.74e-06,1.88e-06,0,0,0,2.31e-06,0,0,0,2.86e-06,2.75e-06,2.6e-06,2.46e-06,2.97e-06,0.000146,2.34e-05,0,0,0,1.78e-06,2.4e-05,2.68e-06,0,0,0,0,2.76e-06,0,2.73e-05,3.18e-06,3.36e-06,0,1.66e-05,3.97e-05,3.34e-06,0,0,0,1.91e-06,9.85e-06,0,0,0,0,2.01e-06,0.000946,0,0,0,0.00166,0.000284,0,4.96e-05,3.4e-06,0,2.5e-06,0,1.9e-06,0.00153,0,0,0,0,2.54e-06,0.0242,0,0,0,0,9.58e-06,3.74e-05,0.000144,0.000638,3.33e-06,0,0,2.15e-06,2.56e-05,0,0,0,0,4.82e-06,4.77e-06,0,2.22e-06,2.8e-06,0,3.46e-06,6.1e-06,2.55e-06,4.85e-06,0,2.79e-06,0,2.53e-06,9.89e-05,0,0,0,0.399,0.0233,0.023,3.34e-06,0,0,0,0,2.01e-06,0,0,0,2.68e-06,0,1.91e-06,8e-06,0,0.345,0.0193,0.0707,0.0162,0.000148,0,0,0,0,2.93e-06,0,2.21e-06,0,0,0,2.03e-06,1.73e-06,3.29e-06,5.24e-05,0.0331,0.017,0.000186,6.27e-06,0.000723,0,0,0,0,0,5.14e-06,2.74e-06,0,2.12e-06,1.9e-06,2.01e-06,1.63e-06,2.45e-06,4.08e-06,9.5e-06,4.14e-06,2.86e-06,2.56e-06,2.54e-06,2.83e-06,0,0,0,0,0.000454,4.38e-06,0,0,1.93e-06,1.89e-06,1.6e-06,2.07e-06,2.16e-06,2.21e-06,2.26e-06,0,1.91e-06,2.02e-06,0,2.54e-06,0,0,0,1.39e-05,6.05e-06,0,0,1.86e-06,1.95e-06,1.62e-06,1.72e-06,0,0,1.99e-06,1.98e-06,1.98e-06,0,1.79e-06,0,0,0,0,0,5.18e-06,2.62e-06,0,1.88e-06,1.96e-06,1.62e-06,0,1.87e-06,0,0,0,0,0,0,0,0,0,0,2.01e-05,2.33e-06,2.07e-06,1.95e-06,1.92e-06,1.94e-06,1.71e-06,1.75e-06,0,1.74e-06,0,0,0,0,0,0,0,5.29e-06,0.0166,0.000155,2.12e-06,1.8e-06,1.79e-06,1.99e-06,2.25e-06,1.85e-06,0,1.92e-06,1.91e-06,0,1.9e-06,2e-06,1.89e-06,1.46e-05,0,0,0,0,0.00052,2.04e-06,0,0,0,2.44e-06,2.09e-06,0,0,1.8e-06,0,1.82e-06,0,2.3e-06,0,0,0,0.00272,0.000528,1.51e-05,0,2.48e-06,0,0,3.14e-06,2.07e-06,1.81e-06,0,0,0,0,2.21e-06,2.92e-06,2.92e-06,1.42e-05,1.48e-05,6.14e-05,6.56e-06,0,0,3.72e-06,2.49e-06,2.36e-06,2.13e-06,1.89e-06,1.53e-06,1.79e-06,0,1.66e-06,1.84e-06,1.88e-06,1.98e-06,2.44e-06,2.14e-06,2.06e-06,2.48e-06,1.99e-06,2.05e-06,2.08e-06,2.13e-06,2.07e-06,2.03e-06,1.95e-06,1.48e-06,4.89e-06],"winrateAvg":0.0543748,"leadAvg":-8.38944,"scoreMeanAvg":-9.02243,"scoreStdevAvg":10.4711,"shorttermWinlossErrorAvg":0.12883,"shorttermScoreErrorAvg":2.99067,"ownership":[8,49,74,85,90,92,90,83,75,69,66,66,68,74,82,-96,-96,-96,-96,-26,-71,98,98,93,93,97,80,73,69,66,65,66,66,83,-97,-95,-96,-96,-52,-69,98,94,98,90,97,63,73,68,64,63,65,65,80,95,-97,-97,-37,-63,-71,-72,100,100,99,53,81,67,69,59,46,67,62,64,95,-98,90,-21,-67,-75,-74,-72,99,57,15,-31,87,88,64,67,88,46,40,96,27,91,72,-73,-67,-77,99,99,23,-49,-29,-87,-86,76,34,31,16,-3,47,95,78,82,-74,-67,-68,-95,98,30,-26,-91,-72,-8,72,-23,33,-16,-3,84,62,86,47,-81,-67,-96,-96,-21,30,-27,-57,-94,-94,-94,-94,-40,-76,-76,84,17,-79,-25,-81,-93,-85,-62,-27,-18,-26,-10,-10,-10,-12,-59,-90,-20,80,-93,-93,-73,-70,-84,-81,-74,-57,-42,-31,-31,-96,-96,-96,-11,-73,-21,9,81,17,-84,-81,-77,-86,-83,-72,-60,-53,-46,-50,-89,-85,-96,-96,97,8,45,80,-97,-87,-85,-81,-91,-88,-76,-56,-95,-54,-73,-98,-94,-90,-95,98,61,38,81,-98,-88,-82,-80,-96,-100,-100,4,27,-45,-97,-93,-96,-96,98,98,-34,4,-11,-98,-85,-81,-72,-100,-98,-100,97,98,-96,-96,-97,97,97,98,98,20,-13,-33,-64,-79,-69,-56,-98,-100,-98,-100,97,97,97,97,87,87,91,46,2,-15,-38,-67,-74,-64,-36,-100,-98,-98,-100,-24,63,69,67,97,86,86,94,-3,-44,-97,-97,-97,-35,8,-97,-100,-98,-100,-42,86,46,5,97,97,89,69,16,-71,7,85,85,38,33,-98,-95,-100,-100,-100,37,0,29,56,84,84,82,96,96,64,77,69,68,43,-97,-98,-95,-97,-79,-70,-2,21,53,69,79,84,85,80,77,72,70,65,57],"ownershipAllowedMAE":0.0408981})%"); + lines.push_back(R"%({"sample":{"board":".X.X...XOOX.OOOOOOO/X.XXXXXXXOOOOOOXOXO/..XOXOOXO.OOXOOXXXO/X.XOO..O.OOXXXXOX.X/.XOO.X.OOOX.XXOO.O./X.XO...OXXXX.XXOO.O/XXXOO.OXXXOOXXOOOOO/OXXXO.OXXOOOOO.OOXO/OOXXOOOOOXOXXO.OXXO/.OOXXO..O.OXXOOOOXX/.OXXXO.OO.OX.XXXXX./OOOXOO.X.OOX...XO../.OXOOOO..OOXXX..XX./..XXXXOXX.OX.XXXOXX/.XXOOOOO.OXX.XOOOOO/.X.XXOXOOOX.X.XXOOO/XO.X.XXXXOXXXXXO..O/X.X.X.XXOOOOX.XOOOO/.X.X...XXOOXX.XOOX./","hintLoc":"null","initialTurnNumber":369,"metadata":"93F49B274A756BE91F7400A1B6E668A8:379","moveLocs":["F16","pass","K9","pass","T15","S8","S16","B6","R15","A7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.258,"pda":0.0,"policyMixture":[0,0,0,0,0.0024,0.00244,0.00246,0,0,0,0,0.0162,0,0,0,0,0,0,0,0,0.00301,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00691,0,0.00663,0,0.00407,0.00488,0,0,0,0,0,0,0,0.00873,0,0,0,0,0,0.0106,0.00761,0.00935,0,0,0.00484,0,0,0,0,0.0144,0,0.00893,0,0,0,0,0,0,0,0.00767,0,0.0103,0,0,0,0,0.0156,0,0.0154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00836,0.0164,0.0127,0,0,0,0,0,0,0,0,0,0,0.00439,0,0,0,0,0,0,0.0102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00773,0,0,0,0,0,0,0,0,0.00788,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00623,0,0,0,0,0.00452,0,0,0,0,0,0.00752,0.00823,0,0.0152,0,0,0,0,0,0,0,0,0,0.00441,0,0,0,0,0,0.0105,0,0,0,0,0,0.00251,0,0,0,0,0,0.00249,0,0,0,0,0,0,0.0153,0,0.0151,0,0,0,0.00261,0.00262,0.00253,0,0,0,0.00256,0,0,0,0,0,0,0,0.0154,0.0155,0,0,0,0,0,0.0026,0.0025,0,0,0.00252,0.0102,0,0,0,0,0,0,0,0,0.0149,0,0,0.00247,0,0,0,0,0,0,0.00484,0,0,0,0,0,0,0,0.0152,0,0,0,0.00251,0,0,0,0,0,0,0.00616,0,0.00708,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00604,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00741,0.00611,0,0,0.00623,0,0,0,0.00408,0,0,0,0,0,0,0,0.0026,0,0,0,0,0,0,0,0,0,0.00254,0.00293,0.00288,0,0,0,0,0,0,0.00257,0,0,0,0,0.0163,0.506],"winrateAvg":0.000248775,"leadAvg":-7.53442,"scoreMeanAvg":-7.61384,"scoreStdevAvg":0.70947,"shorttermWinlossErrorAvg":0.00655034,"shorttermScoreErrorAvg":0.406229,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,100,100,99,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,-100,100,100,-100,100,100,100,100,-100,100,100,100,100,100,100,-100,-100,-100,100,100,100,99,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,100,100,99,99,99,100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,100,99,99,99,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,99,100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,-99,-100,-100,-100,100,100,100,-100,-100,100,100,100,100,100,100,100,100,-100,100,-99,-99,-100,-100,100,100,100,100,100,99,100,-100,-100,100,100,100,-100,-100,100,-100,-99,-100,-100,-100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,99,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,99,98,99,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,99,99,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-100,100,98,98,99,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,99,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-99,-100,-100,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-99,-99,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-99,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,100,100,100],"ownershipAllowedMAE":0.00174929})%"); + lines.push_back(R"%({"sample":{"board":"................../.XXO............../.OXOX.OX......XO../.XOO..O.X.....XO../.X............XO../...O....X.....XXO./..............XOO./...............XO./...............X../................../....OO.OOOXX....../.X.XOXO.OXOX....../X.XOX.XOXXOOX...../.XOO...X...OX.X.../.OXOO....O..OX..../.OXOXX..X.OOOOX.../.OXXO.....OX..X.../..O.............../","hintLoc":"null","initialTurnNumber":94,"metadata":"95B6ABD1D0AFB65720C2835F2B39DE4A:104","moveLocs":["L5","M4","K2","K5","H7","F6","F2","D1","H2","R9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.1,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.19e-05,2.38e-05,2.89e-05,4.75e-05,2.8e-05,2.91e-05,2.88e-05,3.2e-05,2.84e-05,2.7e-05,2.68e-05,2.65e-05,2.68e-05,2.86e-05,3.59e-05,3.19e-05,2.67e-05,2.31e-05,2.46e-05,0,0,0,0.0687,2.62e-05,0.00274,0.000257,6.74e-05,3.06e-05,3.06e-05,3.04e-05,2.89e-05,4.2e-05,0.000216,0.0538,2.48e-05,2.67e-05,2.45e-05,0,0,0,0,2.68e-05,0,0,2.87e-05,3.11e-05,3.07e-05,2.95e-05,2.84e-05,2.57e-05,0,0,2.64e-05,2.4e-05,2.28e-05,0,0,0,5.49e-05,3.07e-05,0,3.54e-05,0,3.09e-05,3.1e-05,3.01e-05,2.68e-05,2.37e-05,0,0,3.09e-05,2.77e-05,2.32e-05,0,0.00035,3.09e-05,3.9e-05,0.00019,3.53e-05,5.3e-05,3.02e-05,3.33e-05,3.22e-05,3.05e-05,2.76e-05,2.36e-05,0,0,8.44e-05,2.55e-05,2.83e-05,3.51e-05,0.00106,0,5.04e-05,0.000112,0.000268,8.49e-05,0,3.6e-05,3.55e-05,3.21e-05,2.85e-05,2.42e-05,0,0,0,2.7e-05,2.86e-05,4.66e-05,0.000335,8.57e-05,0.000103,0.000172,0.000213,0.000154,4.3e-05,0.000102,3.99e-05,3.44e-05,3.05e-05,2.59e-05,0,0,0,2.34e-05,3.04e-05,5.35e-05,0.000462,0.000241,6.46e-05,5e-05,7.1e-05,0.000164,0.000279,0.00102,4.62e-05,3.67e-05,3.34e-05,3.1e-05,2.88e-05,0,0,2.11e-05,3e-05,7.75e-05,0.0181,0.000168,4.69e-05,4.01e-05,3.78e-05,4.41e-05,0.00032,0.00303,6.32e-05,3.72e-05,3.54e-05,3.59e-05,2.9e-05,0,0.0446,2.3e-05,2.96e-05,0.0002,0.0499,8.63e-05,3.17e-05,2.9e-05,0.00102,3.34e-05,3.25e-05,0.000296,3.63e-05,2.94e-05,3.36e-05,3.7e-05,4.17e-05,0.0412,0,2.8e-05,2.89e-05,3.96e-05,4.18e-05,0.0395,0,0,4.92e-05,0,0,0,0,0,2.88e-05,3.75e-05,0.000169,0.000974,7.48e-05,3.12e-05,2.22e-05,0,2.63e-05,0,0,0,0,0,0,0,0,0,2.95e-05,3.25e-05,4.02e-05,0.000487,0.116,3.09e-05,0,1.98e-05,0,0,0,0,0,0.0027,0,0,0,0,0,2.5e-05,3.22e-05,9.04e-05,0.000229,3.05e-05,2.42e-05,0,0,0,2.21e-05,0.00712,0.0245,0,0.07,0,0,0,0,2.58e-05,0,3.65e-05,3.62e-05,2.9e-05,2.32e-05,0,2.15e-05,0,0,0.000181,0.247,0.181,0.000443,0,0,0,0,0,2.47e-05,2.73e-05,3.12e-05,2.78e-05,2.31e-05,0,2.12e-05,0,0,0,3.76e-05,2.56e-05,0,0.000181,0,0,0,0,0,2.8e-05,2.79e-05,2.63e-05,2.1e-05,0,2.24e-05,2.8e-05,0,0,2.23e-05,0,1.82e-05,0,0,0,2.62e-05,3.39e-05,0,2.46e-05,2.7e-05,2.56e-05,2.2e-05,2.18e-05,0,0,2.44e-05,2.84e-05,2.78e-05,2.21e-05,3.25e-05,3.75e-05,0.0147,2.59e-05,2.9e-05,3.06e-05,2.72e-05,2.44e-05,2.57e-05,2.33e-05,1.89e-05],"winrateAvg":0.857969,"leadAvg":2.87724,"scoreMeanAvg":3.58533,"scoreStdevAvg":8.40011,"shorttermWinlossErrorAvg":0.135895,"shorttermScoreErrorAvg":1.07194,"ownership":[-71,-58,-33,17,40,33,19,-13,-42,-57,-63,-64,-56,-44,-6,27,36,63,-80,-85,-85,87,15,45,6,-42,-60,-65,-68,-69,-67,-68,-31,28,78,78,-86,-85,-85,87,13,45,79,-80,-68,-67,-71,-70,-71,-75,-98,94,84,86,-84,-88,86,87,52,47,80,15,-90,-72,-69,-68,-66,-72,-98,94,91,89,-56,-88,-21,52,44,25,26,12,-28,-65,-62,-61,-59,-66,-98,94,92,91,-36,-31,5,84,35,25,7,-11,-85,-55,-51,-50,-49,-60,-98,-98,94,89,-14,-14,16,33,23,17,6,-5,-23,-23,-33,-37,-40,-51,-98,94,94,86,-8,0,9,17,18,15,9,1,-5,-9,-16,-26,-32,-39,-68,-81,94,76,-13,-6,6,7,17,18,16,14,8,-3,-10,-20,-24,-30,-35,-80,-51,70,-30,-14,-19,8,32,38,16,34,37,23,1,-27,-22,-18,-13,4,72,58,-48,-50,-3,4,98,98,71,95,96,96,-86,-86,-35,-18,-5,6,27,28,-57,-65,-41,-43,99,84,94,33,96,-31,97,-85,-52,-24,-20,-5,-22,-2,-61,-51,-51,100,77,90,-23,33,-38,-40,97,98,-90,-38,-40,-40,-39,-27,-27,-55,100,100,84,15,-16,-79,-8,97,95,98,-89,-83,-96,-69,-50,-44,66,100,100,100,100,14,-49,-55,5,97,96,98,98,-93,-91,-52,-60,-55,96,100,99,100,-86,-86,-70,-75,-87,23,98,98,98,98,-95,-75,-69,-64,99,100,98,92,92,-86,-81,-88,-80,-82,98,70,89,-15,-95,-80,-73,-70,99,99,100,99,17,-27,-74,-76,-74,28,64,76,60,6,-49,-78,-77,-73],"ownershipAllowedMAE":0.0404578})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../......O..O...X...../...OO.OX.......XX../....XXXOOOOX..O..../..X....XXXX......../.XO................/.....O............./..X........O..X.XX./...XOO..X.XOX.XOXO./..XXXOXX.....O.XOO./.OXXOXXOOOOO...XOXX/.OOXOOOXX.XXOOOOXO./.XXOO.OOX...X..XX../.OOXXX.X..X..O.OX../..OOOX..XX.XXO.OX../.XO..XO.OOO.O.OXX../.O.OX.O......O.O.O./.XOX.............../","hintLoc":"null","initialTurnNumber":96,"metadata":"CA20C1A1957A363724BD070B680DCF1D:106","moveLocs":["N5","C2","A2","A3","C1","G5","A6","C2","H10","A1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.83,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":-7.0,"policyOptimism":0.568,"pda":0.0,"policyMixture":[5.54e-05,5.71e-05,5.46e-05,5.44e-05,5.45e-05,5.45e-05,5.42e-05,5.42e-05,5.38e-05,5.5e-05,5.42e-05,5.42e-05,5.52e-05,5.54e-05,5.58e-05,5.58e-05,5.43e-05,5.63e-05,5.49e-05,5.68e-05,5.68e-05,5.57e-05,5.49e-05,5.32e-05,5.41e-05,5.24e-05,5.11e-05,5.28e-05,5.13e-05,5.3e-05,5.86e-05,5.47e-05,5.56e-05,5.6e-05,5.74e-05,5.63e-05,5.61e-05,5.59e-05,5.55e-05,5.7e-05,5.77e-05,5.47e-05,5.5e-05,5.16e-05,0,5.51e-05,4.87e-05,0,4.9e-05,6.46e-05,6.98e-05,0,7.05e-05,5.61e-05,5.86e-05,5.64e-05,5.34e-05,5.57e-05,5.7e-05,6.09e-05,0,0,5.73e-05,0,0,4.84e-05,4.66e-05,4.79e-05,9.98e-05,6.66e-05,5.8e-05,6.31e-05,0,0,5.65e-05,5.36e-05,5.52e-05,9.75e-05,0.000293,0.000111,0,0,0,0,0,0,0,0,6e-05,5.23e-05,0,5.31e-05,5.51e-05,5.36e-05,5.4e-05,5.81e-05,0.00102,0,0.000534,6.32e-05,6.19e-05,6.51e-05,0,0,0,0,6.03e-05,5.55e-05,5.41e-05,5.17e-05,5.34e-05,5.39e-05,5.39e-05,5.39e-05,8.12e-05,0,0,0.00178,0.000149,6.38e-05,0.000138,0.000128,0.000127,7.84e-05,6.36e-05,0.000112,4.99e-05,5.14e-05,5.27e-05,5.08e-05,5.33e-05,5.39e-05,5.39e-05,6.34e-05,0.00393,0.00499,0.000673,0.000109,0,0.000134,0.00311,0.00575,0.00535,0.00103,0.000153,8.53e-05,5.07e-05,5.16e-05,0.000157,5.37e-05,5.46e-05,5.44e-05,6.94e-05,0.00032,0,0.00178,8.26e-05,7.31e-05,0.00044,0.00313,0.0123,0.00418,0.000666,0,6.52e-05,5.67e-05,0,0.000106,0,0,6.16e-05,6.83e-05,0.000132,0.000231,0,0,0,0.00343,0,0,0.00492,0,0,0,5.67e-05,0,0,0,0,4.53e-05,6.27e-05,0.0012,0,0,0,0,0,0,0.768,0.000136,0.000108,6.13e-05,5.79e-05,0,0.00108,0,0,0,5.65e-05,6.13e-05,0,0,0,0,0,0,0,0,0,0,0,5.28e-05,4.82e-05,0.000499,0,0,0,0,5.52e-05,0,0,0,0,0,0,0,0,0.026,0,0,0,0,0,0,0,0,0.000184,0,5.86e-05,0.000106,0,0,3.08e-05,0,0,0,0.00188,0.000488,0.00446,0,6.21e-05,5.26e-05,0,0,5.31e-05,5.34e-05,5.76e-05,0,0,0,0,0,0,0,0.000999,6.76e-05,0,0.000418,0,0,4.89e-05,0,0,5.02e-05,5.99e-05,6.3e-05,5.76e-05,0,0,0,0,5.94e-05,0.000989,0,0,6.5e-05,0,0,0,4.82e-05,0,0,4.78e-05,5.6e-05,0,0,0,0.00015,0.0194,0,0,5.1e-05,0,0,0,5.14e-05,0,4.99e-05,0,0,0,5.52e-05,5.55e-05,8.68e-05,0.0515,0,0,0,0.043,0,5.24e-05,5.3e-05,5.25e-05,5.15e-05,5.3e-05,4.94e-05,0,4.97e-05,0,5.76e-05,0,5.17e-05,0,0,0,0,0.00671,0.00208,9.7e-05,5.34e-05,5.41e-05,5.37e-05,5.34e-05,5.24e-05,5.28e-05,5.24e-05,5.27e-05,5.14e-05,5.38e-05,5.55e-05,5.71e-05,4.1e-05],"winrateAvg":0.00222062,"leadAvg":-16.587,"scoreMeanAvg":-16.6945,"scoreStdevAvg":8.54352,"shorttermWinlossErrorAvg":0.0124346,"shorttermScoreErrorAvg":1.8695,"ownership":[31,38,45,55,66,73,76,72,61,43,19,-8,-37,-55,-70,-76,-82,-85,-88,24,31,45,59,68,78,83,80,71,49,23,-22,-45,-69,-80,-83,-86,-87,-89,15,25,38,59,77,82,96,87,82,86,-40,-31,-47,-96,-84,-87,-91,-90,-89,-5,15,38,88,89,-15,95,79,79,36,-42,-41,-63,-72,-75,-99,-99,-93,-89,-27,-23,-7,-3,-89,-89,-90,84,82,81,80,-92,-64,-65,-49,-70,-85,-89,-88,-50,-54,-91,-33,-33,-30,-58,-97,-97,-97,-97,-52,-48,-60,-65,-73,-80,-85,-86,-55,-80,-8,-36,-4,17,-1,-26,-37,-38,-29,-9,-25,-50,-64,-71,-79,-85,-87,-56,-57,-50,-12,21,88,20,3,-9,-12,-3,-16,-11,-27,-59,-68,-81,-89,-92,-33,-58,-90,-35,0,59,45,17,12,1,15,77,0,-26,-99,-96,-99,-99,-94,1,-18,-65,-87,96,97,94,97,-12,26,-20,81,-50,10,-99,-94,-99,-86,-93,50,2,-87,-87,-85,98,96,96,99,65,56,54,20,96,49,-98,-87,-87,-85,72,99,-88,-88,99,97,97,100,100,100,100,99,70,78,41,-97,-86,-84,-84,93,99,99,-86,99,99,99,-96,-97,28,-91,-88,100,100,100,99,-94,-84,-78,99,98,98,99,99,16,99,99,-98,-90,-73,24,25,82,-2,-93,-93,-92,-77,61,99,99,-98,-99,-99,-99,-99,-98,-96,-98,57,100,100,40,97,-93,-66,-51,-48,-5,99,99,98,-99,-55,28,-99,-99,-57,-75,-72,100,94,97,-93,-37,-17,-98,-98,99,8,-42,-99,97,61,99,99,99,7,99,98,100,-90,-93,6,13,-97,-97,-98,0,-99,-9,97,91,95,97,97,97,97,100,97,97,-2,87,31,-98,-98,-98,-98,-89,6,50,87,92,95,96,96,97,97,96,92,90,82,65],"ownershipAllowedMAE":0.0401547})%"); + lines.push_back(R"%({"sample":{"board":"..XO..O.........O../...XOOXOXXOX..XO.O./...X.XXOOOXXX.XXO../....X.XX..XXOOO.O../..X.XXO.O.OX..O..../..XOOOOOO.OX..XO.O./.XO.OOXXX.OXX.XOO.O/.XOOX.OX.O.OO...OOX/.OOXOOOXX..XXXX.OXX/..OXX.XOX.X..OX.XXO/.XX..X.OOX...OOXXX./........O.X...OOOX./.XO...XO..OOOOX..O./.XO.OOOXO........../.XXO.X.XOO.....XOO./.XOOOX..OXXXXXX.XX./.OXXXOO.OOOXOOXX.../.X.X.XO.OXXOO.OX.../....X........X...../","hintLoc":"null","initialTurnNumber":199,"metadata":"E2D04FBB3CF2BD7FDB8AC9343B6DFCF0:209","moveLocs":["F19","B18","K1","O2","T4","T3","T5","S3","E8","F8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.03,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.33e-05,0.00532,0,0,5.25e-05,0,0,6.5e-05,0.0544,6.4e-05,6.77e-05,6.16e-05,6.81e-05,6.1e-05,0.000364,6.25e-05,0,5.14e-05,4.82e-05,5.09e-05,0,0.00134,0,0,0,0,0,0,0,0,0,4.92e-05,0.000825,0,0,5.23e-05,0,4.84e-05,5.08e-05,5.37e-05,0.000636,0,5.59e-05,0,0,0,0,0,0,0,0,0.000557,0,0,0,4.96e-05,4.74e-05,5.77e-05,9.39e-05,0.000117,6.3e-05,0,0,0,0,5.44e-05,5.3e-05,0,0,0,0,0,6.18e-05,0,4.86e-05,4.77e-05,7.15e-05,0.000207,0,0.0389,0,0,0,5.45e-05,0,5.77e-05,0,0,6.51e-05,5.75e-05,0,5.2e-05,4.74e-05,4.82e-05,4.77e-05,0.001,0.00221,0,0,0,0,0,0,0,5.22e-05,0,0,5.67e-05,0.0853,0,0,4.86e-05,0,4.95e-05,0.000121,0,0,2.86e-05,0,0,0,0,0,5.54e-05,0,0,0,0.000103,0,0,0,5.01e-05,0,0.0681,0,0,0,0,7.83e-05,0,0,5.32e-05,0,5.91e-05,0,0,0.00585,7.83e-05,5.43e-05,0,0,0,0.000419,0,0,0,0,0,0,0,0,0.0172,0.000804,0,0,0,0,0.0319,0,0,0,8.1e-05,5.92e-05,0,0,0,2.91e-05,0,0,0,7.32e-05,0,7.23e-05,5.71e-05,0,0,6.65e-05,0,0,0,0.000239,0,0,0.00029,5.52e-05,0,6.03e-05,0,0,0,5.27e-05,9.68e-05,5.8e-05,0,0,0,0,0,5.02e-05,0.000104,0.000113,0.0353,0.518,0,0,0.000127,5.18e-05,0,0.000477,0,6.35e-05,5.22e-05,4.94e-05,0,0,0,0,6.28e-05,5.51e-05,0,0,0.000209,0.000292,0.0906,0,0,5.3e-05,5.59e-05,0,0,0,0,0,0.000321,7.3e-05,0,7.89e-05,4.77e-05,0,0,5.45e-05,0,0,0,0,0,5.3e-05,5.59e-05,5.69e-05,5.87e-05,7.78e-05,0.000437,0.0305,0.000586,5.12e-05,5.43e-05,4.84e-05,0,0,0,5.22e-05,0,6.03e-05,0,0,0,5.87e-05,5.77e-05,5.91e-05,6.73e-05,6.83e-05,0,0,0,0,4.85e-05,0,0,0,0,0,5.64e-05,5.51e-05,0,0,0,0,0,0,0,0,0,0,0,4.66e-05,0,0,0,0,0,0,4.82e-05,0,0,0,0,0,0,0,0,4.84e-05,0,0,4.75e-05,0,4.86e-05,0,0,0,0,4.89e-05,0,0,0,0,0,0,0,0,4.94e-05,4.73e-05,4.74e-05,4.44e-05,4.7e-05,4.94e-05,6e-05,0,5.76e-05,6.17e-05,5.02e-05,4.96e-05,0,5.81e-05,5.25e-05,2.8e-05,0,7.42e-05,0.000124,5.02e-05,4.88e-05,4.54e-05,4.13e-05],"winrateAvg":0.145285,"leadAvg":-1.16009,"scoreMeanAvg":-1.42577,"scoreStdevAvg":2.72508,"shorttermWinlossErrorAvg":0.190705,"shorttermScoreErrorAvg":0.734024,"ownership":[-100,-99,-99,29,29,99,99,99,70,-77,-99,-96,-78,-22,3,16,99,99,99,-100,-100,-99,-100,99,99,-100,100,-98,-99,-99,-100,-95,-54,-99,98,98,100,100,-100,-99,-99,-100,-21,-100,-100,100,99,100,-100,-100,-100,-32,-100,-100,100,100,100,-99,-99,-99,-98,-100,-100,-100,-100,68,-35,-100,-100,100,100,100,-50,100,100,100,-99,-99,-100,71,-100,-100,100,51,100,25,100,-100,-23,84,100,99,100,100,100,-94,-99,-100,100,100,100,100,100,100,69,100,-100,-67,69,-99,100,100,100,99,-57,-98,100,100,100,100,-100,-100,-100,8,100,-100,-100,-89,-99,100,100,100,100,55,-98,100,100,100,100,100,-100,-47,99,96,98,96,-50,-61,56,100,100,-100,91,100,100,-99,100,100,100,-100,-99,35,-28,-100,-100,-100,-100,74,100,-100,-100,25,23,100,-99,-99,-59,-92,100,-99,-97,-100,-62,-8,100,-100,-98,-100,-100,-99,-45,-100,-100,-96,-63,-99,-16,100,100,-99,-63,6,30,100,100,-100,-100,-100,-98,-96,-55,14,81,94,-99,-42,30,100,-36,-93,-22,21,93,100,100,100,-100,-15,-99,-100,98,86,78,26,-68,99,95,49,99,100,100,100,-78,34,95,96,8,-100,-100,98,97,99,100,100,98,100,61,25,16,31,16,-68,-5,11,78,77,-100,-100,-100,98,98,98,99,99,100,100,5,-29,-13,-22,-67,-98,97,98,97,-100,-100,98,98,99,98,99,100,100,-100,-100,-100,-100,-100,-100,-98,-100,-100,97,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,99,99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,100,100,100,100,99,100,99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,1,64,99,100,100,100,90,-72,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0270581})%"); + lines.push_back(R"%({"sample":{"board":"...............O../......X.X..O.X.XO./.O.XX....O.OX.XO../....OO.X...XX.XOO./..O....XOO.XO.XXO./..O....O.O.XO.OOX./..XOOOO.O..XXOOX../...XXXXX...XO..O../..X.........X...../................../..O.............../...X............../..X.O..........X../.X.....O........../.OOOOOOXX...OOOO../..XXXOX......XXX../.....X.X........../................../","hintLoc":"null","initialTurnNumber":91,"metadata":"2189504459B1655922B3920303BA5CE3:101","moveLocs":["J16","B17","N3","R4","R5","R3","R6","Q8","Q5","P10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.88,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.206,"pda":0.0,"policyMixture":[3.11e-06,5.23e-06,3.85e-06,4.03e-06,3.83e-06,3.85e-06,4.09e-06,3.93e-06,4.1e-06,3.74e-06,3.7e-06,3.54e-06,3.62e-06,3.83e-06,3.44e-06,0,3.32e-06,3.11e-06,3.23e-05,0,0.25,5.21e-06,5.66e-06,1.38e-05,0,5.1e-06,0,5.06e-06,3.54e-06,0,3.67e-06,0,3.95e-06,0,0,3.08e-06,4.25e-06,0,0.000573,0,0,0.0162,6.49e-06,0.023,0,0,3.6e-06,0,0,3e-06,0,0,3.21e-06,2.94e-06,3.75e-06,5.06e-06,4.33e-06,4.1e-06,0,0,3.72e-06,0,3.58e-06,3.54e-06,3.68e-06,0,0,3.39e-06,0,0,0,3.1e-06,3.81e-06,4.19e-06,0,3.31e-06,3.34e-06,3.49e-06,3.57e-06,0,0,0,3.09e-06,0,0,3.2e-06,0,0,0,3.07e-06,4.02e-06,4.08e-06,0,2.94e-06,2.96e-06,3.24e-06,3.25e-06,0,2.85e-06,0,3.08e-06,0,0,3.71e-06,0,0,0,5.33e-06,4.05e-06,4.38e-05,0,0,0,0,0,3.24e-06,0,3.55e-06,3.66e-06,0,0,0,0,0,0.00504,4.39e-06,3.92e-06,6.56e-06,4.51e-06,0,0,0,0,0,5.82e-06,5.48e-06,4.92e-06,0,0,0.0373,0.000111,0,1.19e-05,4.09e-06,3.94e-06,6.31e-06,0,3.63e-06,3.7e-06,3.78e-06,3.95e-06,5.23e-06,1.16e-05,1.48e-05,1.38e-05,5.95e-06,0,1.6e-05,0,0.082,1.71e-05,4.07e-06,3.79e-06,4.88e-06,6.26e-06,1.49e-05,1.29e-05,1.08e-05,1.66e-05,1.82e-05,2.73e-05,2.89e-05,1.3e-05,1.68e-05,1.11e-05,0.0267,7.61e-05,9.34e-05,4.08e-05,4.37e-06,3.75e-06,5.93e-06,0,0.000104,0.000907,0.0123,0.000301,0.000109,5.82e-05,3.73e-05,3.77e-05,4.56e-05,5.24e-05,0.000222,4.69e-05,0,5.43e-05,4.63e-06,5.36e-06,6.35e-05,8e-06,0,0.00271,0.0208,0.00287,0.0224,0.000188,6.8e-05,6.23e-05,0.000101,0.000141,0.000209,4.57e-05,0.00353,7.29e-06,4.33e-06,5.9e-06,9.78e-06,0,0.00196,0,5.45e-06,2.13e-05,3.96e-05,0.000142,8.2e-05,6.12e-05,5.64e-05,2.6e-05,1.44e-05,0.00042,0,0,3.3e-06,3.47e-05,0,0.00267,3.58e-06,3.3e-06,3.62e-06,4.41e-06,0,0.126,8.94e-06,3.14e-05,8.13e-06,4.39e-06,3.82e-06,3.59e-06,0,0,3.67e-06,4.28e-06,0,0,0,0,0,0,0,0,9.12e-06,2.41e-05,4.19e-06,0,0,0,0,0,4.09e-06,4.19e-06,0.000608,0,0,0,0,0,6.79e-06,2.2e-05,3.24e-05,1.09e-05,4.13e-06,0,0,0,0,0,3.54e-06,4.86e-06,0.000136,6.15e-06,6.15e-06,0.000108,0,4.75e-05,0,7.47e-06,7.5e-06,5.05e-06,4.81e-06,4.3e-05,0.357,2.82e-06,4.2e-06,4.4e-06,3.18e-06,3.36e-06,4.42e-06,4.63e-06,1.53e-05,4.41e-06,5.75e-05,0.000199,3.75e-06,3.91e-06,3.99e-06,3.37e-06,3.77e-06,4.38e-06,5.47e-06,3.86e-06,3.49e-06,3.76e-06,2.93e-06,4.84e-06],"winrateAvg":0.713454,"leadAvg":0.801815,"scoreMeanAvg":1.54715,"scoreStdevAvg":12.4593,"shorttermWinlossErrorAvg":0.167756,"shorttermScoreErrorAvg":1.19503,"ownership":[28,24,-7,-41,-61,-63,-56,-47,-22,11,41,41,-13,-48,-20,86,86,92,32,12,19,-64,-69,-65,-72,-38,-49,-3,59,84,-26,-91,16,18,97,93,39,45,-58,-77,-76,29,-22,10,97,97,58,85,-95,-89,-94,98,97,96,36,8,6,-17,94,94,35,-3,34,49,-22,-94,-94,-89,-94,98,98,96,44,62,97,66,78,58,44,-2,98,98,-11,-94,30,-59,-94,-95,98,94,38,47,97,90,83,74,71,97,95,98,2,-94,40,37,90,89,87,93,6,13,-36,98,99,99,98,-4,96,37,-23,-94,-94,89,90,82,86,85,-25,-44,-37,-96,-96,-96,-96,-96,8,1,-20,-94,-4,-2,-2,89,70,58,-51,-61,-94,-75,-54,-42,-40,-32,-6,1,-8,-48,-90,-50,-80,6,14,21,-64,-73,-78,-60,-33,-13,-12,-11,-2,-2,-9,-21,-38,-34,-45,-31,-14,1,-67,-70,-60,-78,-13,12,2,0,-1,-4,-9,-15,-22,-27,-39,-75,4,8,-64,-72,-79,-88,-3,38,15,20,11,-3,-10,-10,-7,-16,-24,0,22,39,-51,-65,-87,35,79,48,32,33,11,-4,-9,0,5,11,-34,-48,84,62,4,-72,43,52,65,64,68,75,26,-36,-14,0,25,30,36,85,85,25,54,86,85,85,85,85,85,-95,-94,-29,1,25,86,85,85,85,-89,-4,66,-43,-93,-93,-93,85,-94,-90,-42,-8,-1,46,87,-89,-90,-89,-90,-83,40,20,-69,-85,-91,-95,-93,-96,-45,-14,26,65,62,58,-91,-88,-88,-85,9,-45,-55,-73,-87,-88,-86,-74,-48,-5,29,53,51,-28,-59,-85,-87,-85],"ownershipAllowedMAE":0.0375331})%"); + lines.push_back(R"%({"sample":{"board":".................../OOOXX.OX.......XXO./.X.O.X.OX...OOX.O../.OOOOX.O..O.OX.XXO./.XXXXO.....OXX.X.../....XO.O.....OXXOO./....XO.....OOX..XX./...XOX.....OX.X.X../...XO....XXO.XX.X../.X.XOOO..X.XO..XX../.OXXOX....XOO....../.OOOX..O...X......./...OX...O.X......../...OX.XXO......OO../..O.OX.OX.O.O..OX../..XOXX..X.....O.X../...OOX.......X.X.../...OX.......X....../.................../","hintLoc":"null","initialTurnNumber":120,"metadata":"0CC4B48AFC46F828EF5958BA983BA199:130","moveLocs":["K6","O7","M3","P8","K3","J3","K8","L8","F2","G2"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.91,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1button1","komi":9.5,"policyOptimism":0.183,"pda":-0.219,"policyMixture":[4.99e-06,5.51e-06,5.43e-06,6.24e-06,6.06e-06,5.91e-06,6.86e-06,1.06e-05,7.45e-06,6.92e-06,8.03e-06,8.26e-06,1.06e-05,3.16e-05,8.04e-06,6.74e-06,8.42e-06,0.00186,6.48e-06,0,0,0,0,0,8.07e-06,0,0,0.000437,2.42e-05,1.01e-05,1.23e-05,2.49e-05,0.0104,1.2e-05,0,0,0,7.15e-06,6.33e-06,0,5.75e-06,0,5.93e-06,0,1.4e-05,0,0,1.12e-05,7.42e-06,6.58e-06,0,0,0,6.13e-06,0,4.51e-05,7.84e-06,1.23e-05,0,0,0,0,0,7.88e-06,0,0.000317,1.47e-05,0,6.17e-06,0,0,7.28e-06,0,0,0,5.91e-06,0.00237,0,0,0,0,0,6.68e-06,8.6e-06,3.97e-05,9.74e-05,8.66e-06,0,0,0,6.3e-06,0,5.19e-05,8.48e-06,0.000106,1.04e-05,0.000283,1.2e-05,5.89e-06,0,0,6.24e-06,0,0.000121,0.000112,0.000106,1.12e-05,7.26e-06,0,0,0,0,0,0.000285,1.91e-05,0.0001,0.000107,0.000261,0,0,8.06e-06,1.72e-05,0.000111,0.276,1.75e-05,0,0,0,5.78e-06,5.16e-06,0,0,6.37e-06,1.17e-05,8.31e-05,4.12e-05,0,0,0,0.000149,6.77e-05,0.0165,5.95e-05,1.02e-05,0,0,0,0,5.09e-06,0,5.55e-06,6.21e-06,1.23e-05,0.0015,2.36e-05,0,0,6.15e-06,7.93e-06,0.00156,1.04e-05,0,0,0,1.56e-05,0,0,5.09e-06,0,6.02e-06,6.71e-06,0.00132,0,1.06e-05,0,0,0,0,1.91e-05,1.28e-05,0,0.00965,0,0,6.48e-06,6.2e-06,0,0,6.93e-06,6.46e-06,1.01e-05,0,0,0,0,0,3.34e-05,1.05e-05,7.67e-06,0.000146,0,0,0,1.04e-05,0.000871,1.52e-05,8.42e-06,1.02e-05,6.62e-06,5.77e-06,0,0,0,0,0.000532,8.78e-06,0,5.96e-06,0,0,0,0.000538,4.53e-05,0,0.12,0.00242,1.01e-05,6.58e-06,5.72e-06,5.91e-06,5.35e-06,0,0,9.3e-06,1.17e-05,6.89e-06,0,6.05e-06,0,5.82e-06,2.52e-05,0,0.000776,8.45e-06,6.97e-06,3.81e-05,6.91e-06,5.75e-06,6.69e-06,6e-06,0,0,7.47e-06,0,0,0,0,7.23e-06,0.0424,1.21e-05,1.72e-05,7.69e-06,0,0,0.000123,9.59e-06,5.93e-06,6.93e-06,0,1.08e-05,0,0,6.09e-06,0,0,7.11e-06,0,8e-06,0,8.23e-06,6.4e-06,0,0,0.00027,9.9e-06,6.09e-06,7.38e-06,0,0,0,0,5.93e-06,7.44e-06,0,8.55e-06,7.27e-06,7.09e-06,8.3e-06,0.000299,0,0.000221,0,9.93e-06,9.94e-06,6.07e-06,6.85e-06,7.09e-06,0,0,0,5.95e-06,1.04e-05,0,0,7.49e-06,0,0.000157,0,0.00035,0,1.42e-05,0.000382,7.69e-06,6.35e-06,7.22e-06,6.55e-06,0,0,0,0,1.32e-05,9e-05,1.19e-05,1.14e-05,2.3e-05,0,1.07e-05,9.95e-06,1.48e-05,4.62e-05,1.54e-05,7.47e-06,5.14e-06,6.23e-06,6.11e-06,6.67e-06,0.504,1.76e-05,6.04e-06,6.6e-06,6.64e-06,7.18e-06,7.03e-06,7.23e-06,7.38e-06,9.81e-06,9.44e-06,7.75e-06,7.4e-06,6.9e-06,5.21e-06,5.03e-06],"winrateAvg":0.510966,"leadAvg":-0.114319,"scoreMeanAvg":-0.094345,"scoreStdevAvg":12.6013,"shorttermWinlossErrorAvg":0.215555,"shorttermScoreErrorAvg":1.6998,"ownership":[95,95,90,86,80,78,67,60,46,42,36,32,-9,-19,-58,-80,-89,-85,-84,97,97,97,75,73,80,88,44,48,35,42,35,64,-14,-55,-99,-98,-79,-84,92,90,95,97,84,74,86,96,34,54,49,55,86,86,-99,-95,-80,-83,-83,49,97,97,97,97,76,84,96,71,60,92,83,87,-99,-96,-100,-100,-79,-84,31,-88,-88,-88,-87,97,83,76,55,49,62,91,-99,-99,-97,-100,-92,-87,-84,-69,-72,-80,-84,-89,97,73,94,45,42,51,42,-32,-26,-100,-100,-82,-82,-86,-71,-75,-80,-84,-88,97,49,37,17,35,37,88,87,-97,-95,-98,-100,-100,-92,-69,-76,-78,-89,93,45,49,18,11,-16,0,87,-79,-73,-100,-97,-100,-93,-89,-56,-68,-78,-89,93,72,39,21,-17,-75,-75,85,-31,-100,-100,-98,-100,-83,-72,-5,-80,-81,-89,93,92,92,19,-14,-75,-21,-18,36,-21,-73,-100,-100,-67,-53,31,89,-89,-88,93,6,61,14,-6,-12,-84,33,33,-20,-42,-48,-34,-25,-18,74,89,89,89,-84,7,-6,81,41,68,-84,-85,-42,-53,-91,16,-1,7,18,81,81,84,88,-84,-28,-20,18,87,13,-84,-48,-46,-89,-23,17,43,41,38,81,80,83,88,-83,-74,-90,-90,87,87,7,16,8,9,-11,84,85,29,28,81,78,90,2,3,-92,-87,-82,-91,26,90,62,89,63,65,84,-86,-30,-10,80,79,72,89,-91,-92,-85,-86,-92,-21,15,46,29,-5,83,16,-86,-75,-42,79,78,78,89,89,-92,-57,-66,-91,53,28,76,7,-83,25,-86,-77,-67,-62,78,76,78,90,47,54,-60,-26,-38,-11,15,8,-79,-71,-77,-80,-78,-75,-70,77,76,75,67,63,13,-15,-34,-33,-8,6,-5,-31,-60,-70,-77,-78,-77,-75],"ownershipAllowedMAE":0.0431571})%"); + lines.push_back(R"%({"sample":{"board":"..........XOX....../.XOO..OOOOXOO.X..../.XXO...XXX.X.O.X.../.XOOO...OXXOO...X../.XX.XOOO.OOX.X...../.OX.X..OO..X......./.OO..XXXX.X......../...OO.O............/..XXOO..........O../...XXOXO.........../..O..XO........X.../....X.O............/..O.X............../.X.X............X../...XO............../.XXOO....OX....O.X./..OX..O...O..O..X../.................../.................../","hintLoc":"null","initialTurnNumber":37,"metadata":"D5E2DD90A52633278A86C35C80D0B77E:47","moveLocs":["N15","K19","P10","R5","S6","S9","R9","S8","S12","Q6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.47,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":14.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.62e-06,2.74e-06,2.66e-06,2.53e-06,2.43e-06,2.34e-06,2.34e-06,2.53e-06,2.44e-06,0,0,0,0,2.89e-06,2.47e-06,2.27e-06,2.18e-06,2.12e-06,1.98e-06,2.42e-06,0,0,0,2.41e-06,2.75e-06,0,0,0,0,0,0,0,0.000561,0,2.38e-06,2.18e-06,2.18e-06,2.15e-06,2.35e-06,0,0,0,2.14e-06,7.39e-05,0.000349,0,0,0,0.00335,0,1.41e-05,0,0.00083,0,2.23e-06,2.25e-06,2.1e-06,2.39e-06,0,0,0,0,2.61e-06,2.35e-06,5.83e-06,0,0,0,0,0,0.0138,2.8e-06,2.29e-06,0,2.3e-06,2.25e-06,2.68e-06,0,0,2.66e-06,0,0,0,0,0,0,0,0,0,0,2.37e-06,2.2e-06,2.2e-06,2.39e-06,2.22e-06,2.53e-06,0,0,2.48e-06,0,2.73e-06,2.33e-06,0,0,3.35e-06,3.26e-06,0,2.21e-06,2.28e-06,2.28e-06,2.18e-06,2.3e-06,2.6e-06,2.28e-06,2.32e-06,0,0,2.67e-06,2.37e-06,0,0,0,0,2.59e-06,0,2.32e-06,2.31e-06,2.44e-06,2.5e-06,2.45e-06,2.61e-06,2.7e-06,2.33e-06,2.57e-06,2.64e-06,2.81e-06,0,0,2.55e-06,0,2.41e-06,2.49e-06,2.57e-06,2.62e-06,2.62e-06,2.7e-06,2.78e-06,2.92e-06,2.65e-06,3.21e-06,0,2.38e-06,2.55e-06,2.8e-06,0,0,0,0,5.81e-06,0.0054,7.12e-06,2.97e-06,3.01e-06,3.15e-06,3.24e-06,3.58e-06,3.09e-06,2.88e-06,0,7.54e-06,2.56e-06,2.31e-06,2.77e-06,2.46e-06,0,0,0,0,0,1.67e-05,7.81e-06,6.37e-06,8.03e-06,1.04e-05,3.65e-06,0,2.53e-06,4e-06,1.01e-05,2.63e-06,2.52e-06,2.57e-06,0,2.47e-06,2.38e-06,0,0,5.04e-06,4.07e-06,7.26e-06,9.82e-06,1.45e-05,1.68e-05,7.38e-06,2.91e-06,0,0,0,2.66e-06,2.41e-06,2.44e-06,2.43e-06,2.48e-06,0,2.85e-06,0,3.11e-06,3.15e-06,3.72e-06,5.08e-06,8.22e-06,1.33e-05,1.32e-05,1.4e-05,7.86e-06,0.000137,0,2.63e-06,2.4e-06,2.5e-06,0,2.37e-06,0,2.97e-06,4.29e-06,4.35e-06,3.09e-06,3.19e-06,3.26e-06,4.17e-06,8e-06,1.06e-05,1.42e-05,0.711,0.259,3.3e-06,2.51e-06,2.37e-06,0,2.38e-06,0,2.96e-06,4.01e-06,3.37e-06,3.06e-06,3.08e-06,3.02e-06,3e-06,3.09e-06,3.69e-06,3.58e-06,1.62e-05,0,0,0,2.71e-06,2.14e-06,2.27e-06,2.03e-06,0,0,2.79e-06,3.02e-06,2.95e-06,2.91e-06,1.2e-05,4.33e-06,4.31e-06,3.17e-06,3.08e-06,6.41e-05,6.41e-06,0,0.00406,3.29e-06,2.26e-06,0,0,0,0,2.87e-06,2.96e-06,2.88e-06,4.33e-06,0,0,4.17e-06,3e-06,3.55e-06,5.65e-06,0,6.78e-06,0,2.83e-06,2.24e-06,2.8e-06,0,0,1.27e-05,3.55e-06,0,2.85e-06,2.91e-06,1.15e-05,0,1.52e-05,3.14e-06,0,1.04e-05,0.000105,0,2.44e-06,2.44e-06,2.27e-06,2.71e-06,3.71e-06,5.2e-06,2.8e-06,2.83e-06,2.94e-06,2.76e-06,2.81e-06,2.69e-06,3.17e-06,2.84e-06,2.96e-06,5.28e-06,0.000184,1.64e-05,2.9e-06,3.02e-06,2.45e-06,2.01e-06,2.4e-06,2.57e-06,2.58e-06,2.38e-06,2.36e-06,2.38e-06,2.33e-06,2.3e-06,2.28e-06,2.37e-06,2.47e-06,2.47e-06,2.41e-06,2.54e-06,2.54e-06,2.53e-06,2.42e-06,2.02e-06,3.15e-06],"winrateAvg":0.256512,"leadAvg":-2.29817,"scoreMeanAvg":-3.45042,"scoreStdevAvg":12.7662,"shorttermWinlossErrorAvg":0.200107,"shorttermScoreErrorAvg":1.85343,"ownership":[-51,-12,5,92,98,99,99,99,99,99,89,88,34,25,-48,-92,-93,-94,-93,-68,-87,99,100,99,99,100,100,100,99,86,88,88,-29,-97,-94,-94,-94,-93,-80,-87,-88,100,98,98,92,84,84,83,86,85,85,87,-59,-99,-95,-94,-93,-72,-87,99,100,100,98,94,91,97,82,82,85,85,-64,-74,-80,-99,-93,-91,-8,-87,-87,-9,-89,99,99,99,95,96,95,-99,-99,-99,-72,-73,-80,-89,-89,16,89,-88,-54,-89,-68,18,99,99,0,-30,-99,-71,-63,-66,-68,-78,-86,-86,67,89,89,56,42,-93,-93,-94,-95,-58,-96,-50,-39,-50,-61,-64,-69,-86,-82,51,35,39,90,89,21,86,0,-36,-21,-25,-16,-24,-45,-63,-62,-64,-90,-75,25,25,-91,-91,89,89,84,-10,-13,-9,-2,-1,-7,-39,-63,-67,-51,-65,-70,-15,-73,-77,-91,-91,90,82,88,5,3,7,3,-7,-30,-93,-78,-76,-67,-65,-65,-70,-66,-80,-66,-66,91,44,24,12,14,7,-2,-12,-43,-94,-95,-57,-63,-76,-76,-76,-83,-95,47,90,36,22,17,15,11,3,-10,-24,-57,-73,-58,-64,-85,-82,-71,-87,-96,-21,20,23,23,21,18,15,9,-3,-21,-60,-64,-68,-70,-88,-96,-83,-97,2,-12,15,23,25,25,23,21,17,16,-13,60,-90,-90,-82,-87,-92,-92,-96,84,17,25,28,31,25,30,27,27,27,28,59,68,49,-82,-74,-96,-96,84,85,47,40,41,48,82,7,39,36,42,43,75,-2,-86,-81,-65,-43,3,2,37,63,89,56,60,63,82,42,50,83,36,15,-83,-78,-81,-48,-33,-8,15,36,54,70,67,65,66,68,58,56,52,9,-20,-60,-74,-75,-37,-22,-3,14,36,53,61,63,63,62,60,55,50,37,18,-20,-48,-63,-69],"ownershipAllowedMAE":0.0329091})%"); + lines.push_back(R"%({"sample":{"board":"............./............./....XOX....../..O..O...X.../...OO..O...../..XOXO......./...XXX......./..X........../............./..OO.....X.../..XX..O....../............./............./","hintLoc":"null","initialTurnNumber":23,"metadata":"E59B097D3D84387E60612667298F07B1:33","moveLocs":["E4","E3","J4","J5","H5","H4","J3","G5","H6","G4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.7,"xSize":13,"ySize":13},"rules":"koSITUATIONALscoreAREAtaxALLsui1button1","komi":9.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.07e-06,2.53e-06,2.5e-06,2.54e-06,2.9e-06,3.24e-06,3.35e-06,3.08e-06,3.1e-06,3.06e-06,2.88e-06,2.75e-06,2.13e-06,2.41e-06,3.22e-06,3.62e-06,3.72e-06,3.97e-06,7.79e-06,1.36e-05,2.1e-05,1.46e-05,8.27e-06,6.24e-06,4.82e-06,2.76e-06,2.48e-06,3.49e-06,3.37e-06,3.49e-06,0,0,0,2.97e-05,4.81e-05,2.01e-05,1.53e-05,6.21e-06,2.83e-06,2.97e-06,4.06e-06,0,2.57e-06,2.95e-06,0,4.32e-06,4.27e-06,9.64e-06,0,2.26e-05,8.62e-06,3.04e-06,3.24e-06,5.94e-06,4.6e-06,0,0,3.09e-06,3.21e-06,0,4.89e-06,3.32e-05,6.44e-05,1.18e-05,3.02e-06,3.43e-06,1.96e-05,0,0,0,0,4.98e-06,6.21e-06,1.39e-05,8.18e-05,8.93e-05,1.09e-05,2.98e-06,3.32e-06,0.000182,4.7e-06,0,0,0,9.68e-06,6.87e-06,4.36e-05,0.000381,0.000133,9.51e-06,2.93e-06,3.1e-06,1.07e-05,0,3.39e-06,4.2e-06,4.89e-05,0.539,0,0.0151,5.84e-05,0.000114,7.95e-06,2.94e-06,3.02e-06,1.49e-05,3.84e-06,3.18e-06,4.26e-06,5.69e-06,0,0,0,0.0971,3.28e-05,7.29e-06,2.95e-06,2.99e-06,5.18e-06,0,0,0,3.74e-05,0,0,0,0,0.000292,6.2e-06,2.93e-06,2.81e-06,0.000268,0,0,0,0.0659,0,0.149,0,0.127,2.93e-05,5.48e-06,2.86e-06,3.32e-06,4.78e-06,4.77e-06,3.7e-06,4.72e-06,8.83e-06,0.0022,0.00121,0.000412,0.000687,5.09e-06,4.21e-06,2.91e-06,2.29e-06,3.28e-06,2.9e-06,2.92e-06,3.05e-06,3.17e-06,3.97e-06,3.32e-06,3.93e-06,3.15e-06,2.87e-06,2.87e-06,2.21e-06,6.24e-06],"winrateAvg":0.900503,"leadAvg":3.45835,"scoreMeanAvg":4.37665,"scoreStdevAvg":7.73055,"shorttermWinlossErrorAvg":0.14272,"shorttermScoreErrorAvg":1.25404,"ownership":[38,35,32,26,22,19,15,13,5,-6,-12,-16,-17,38,39,35,31,24,15,15,16,9,-7,-16,-16,-19,39,40,48,47,15,90,-10,40,13,-19,-22,-20,-19,28,49,89,66,61,92,42,35,2,-61,-27,-17,-17,14,7,31,92,92,44,51,87,20,-5,-13,-15,-13,-12,-9,-61,91,-76,45,-2,35,13,0,-7,-6,-8,-31,-38,-60,-77,-75,-76,-3,21,7,5,0,-2,-2,-42,-59,-80,-42,-14,14,46,57,3,2,4,4,3,-44,-41,-49,-48,-51,-54,-92,56,-25,19,14,11,11,-44,-46,-22,-22,-21,-54,-93,-93,60,-2,25,19,18,-52,-47,-77,-77,-80,-54,-4,-54,57,42,31,27,24,-53,-65,-66,-69,-60,-43,-33,-3,13,30,30,30,28,-58,-61,-62,-61,-54,-42,-23,-9,10,21,27,29,30],"ownershipAllowedMAE":0.0626308})%"); + lines.push_back(R"%({"sample":{"board":".XOO.........XO..../..XO..OX..XXXO...../.XXO..OX...OXO.OO../..XO..OX.XXOOO.X.../.X.O.XOX.XOO....XO./.XO...X.XOO.O..XO../.XO.XXX.OOXXO..XOO./.O.OXOX.OXXOXXXXXO./OXOOO.O.OXOOO.OXOX./.XXXO.O..XXO...XOX./.X..O..XX.O.O.OX.X./..X..X.XO.O..X...../.X.XX.XO...X...XXXX/.OO....O.O..X.OX.../..OX...OXXXX..OOXXX/..O.XX.O..OX..OXXOO/...OOX..O.OX..O.OO./...OX.XO.OOOXX.OOXO/...........X.....X./","hintLoc":"null","initialTurnNumber":188,"metadata":"EEE56427D58AA97D5B5E9ECCBE72FA78:198","moveLocs":["F16","F17","N19","P17","A6","A5","A7","L7","O9","O11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.38,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000167,0,0,0,0.000217,0.00247,0.0771,0.0124,0.000276,0.000234,0.000197,0.00011,0,0,0,0.00658,0.000176,0.000189,0.000178,0.000173,0.000193,0,0,0.00128,0.000276,0,0,0.000231,0.000222,0,0,0,0,0.00698,0.00425,0.000182,0.000197,0.000196,0.000178,0,0,0,0.0317,0,0,0,0.000199,0.000263,0.00105,0,0,0,0,0,0,0.000235,0.000214,0.000175,0.000183,0,0,0.00121,0,0,0,0.000184,0,0,0,0,0,0.000228,0,0.00068,0.0017,0.000245,0.000177,0,0.00159,0,0.00029,0,0,0,0.000177,0,0,0,0.000205,0.000261,0.000275,0.00211,0,0,0.000302,0.000224,0,0,0.00612,0.000249,0.000229,0,0.000226,0,0,0,0.000237,0,0.000265,0.000248,0,0,0.00023,0.0229,0.00419,0,0,0.00026,0,0,0,0.000226,0,0,0,0,0,0.000268,0.000215,0,0,0,0.000252,0.000273,0,0,0,0,0,0,0.000311,0,0,0,0,0,0,0,0,0,0,0.155,0,0,0,0,0,0.000326,0,0.00162,0,0,0,0,0,0,0,0,0,0,0.000402,0.00608,0,0,0,0,0.000217,0,0.0018,0.0463,0,0,0,0.000237,0.0291,0.0223,0,0,0,0.000202,0.00018,0,0.000183,0.000296,0,0.000272,0.000276,0,0,0.00114,0,0.00023,0,0,0,0,0.0002,0,0.000178,0.000187,0.000184,0,0.000227,0.00027,0,0.000247,0,0,0.0348,0,0.0125,0.0471,0,0.000303,0.00022,0.000195,0.000189,0.000175,0,0,0.00034,0,0,0.0002,0,0,0.00998,0.000209,0,0,0.000348,0.0053,0.0125,0,0,0,0,0,0,0,0.0125,0.000245,0.000293,0.00237,0,0.00196,0,0.000893,0.000255,0,0.00044,0,0,0.000181,0.00018,0.000178,0,0.000248,0,0,0.000242,0.000277,0.000273,0,0,0,0,0,0.000236,0.000252,0,0,0,0,0,0.0949,0.000337,0,0.0192,0,0,0.0134,0,0.000249,0.00654,0,0,0.000262,0.000298,0,0,0,0,0,0.000268,0.028,0.000254,0,0,0,0.0755,0.000386,0,0.000213,0,0,0.000263,0.000304,0,0.00028,0,0,0,0.000568,0.046,0.0177,0,0,0.000414,0,0,0.000229,0,0,0,0,0,0.0197,0,0,0,0,0.000196,0.0132,0.000387,0.0128,0.00529,0.00301,0.00149,0.027,0.000401,0.000268,0.000703,0,0.000303,0.000211,0.000254,0.000303,0.000211,0,0.000179,0.000183],"winrateAvg":0.992419,"leadAvg":2.33596,"scoreMeanAvg":2.61376,"scoreStdevAvg":3.96237,"shorttermWinlossErrorAvg":0.0375635,"shorttermScoreErrorAvg":0.797512,"ownership":[-99,-99,100,100,97,93,4,-32,-91,-95,-97,-98,-98,-99,98,98,99,99,99,-100,-99,-100,100,95,96,99,-100,-94,-96,-98,-98,-98,100,98,99,99,99,99,-100,-100,-100,100,68,98,98,-100,-98,-96,-14,100,-99,100,100,100,100,99,99,-100,-100,-100,99,33,-96,98,-100,-99,-99,-100,100,100,100,44,-96,69,98,98,-100,-100,6,100,14,-97,98,-100,-99,-100,100,100,81,17,-17,-95,-95,99,95,-98,-100,100,58,2,-95,-99,-98,-99,100,100,48,100,25,-16,-100,98,97,84,-76,-100,100,25,-99,-99,-99,-18,100,100,-98,-98,100,5,-61,-100,98,98,79,88,97,95,100,-99,49,-99,25,100,-98,-98,99,-100,-100,-100,-100,-100,98,-66,90,-100,100,100,100,41,100,79,100,-98,99,99,99,99,99,-100,-100,-100,-75,-80,-100,-100,-100,100,78,100,22,-68,-98,-98,99,47,-8,-3,-100,-100,-100,-95,-98,-100,-70,-3,100,-11,20,-99,-99,-29,100,98,99,-99,10,-100,-100,-100,-99,-99,-99,-100,-61,3,-99,-97,-99,46,-14,100,-1,23,-99,-29,-59,-94,-99,-100,-99,-99,-56,-100,-100,-91,-98,100,46,80,99,-85,-40,-77,-29,-100,-100,-100,-100,-99,99,98,-19,-82,-71,6,100,58,97,25,-62,-98,-30,99,-100,-100,-100,-100,96,97,98,-93,-76,-18,50,100,-98,-98,-98,-98,-60,36,99,100,-100,-100,-100,95,98,98,-36,-99,-98,-15,100,50,1,99,-98,-45,41,99,-100,-100,100,100,97,97,96,98,97,-98,-60,67,100,74,99,-98,-95,-7,99,89,100,100,100,96,97,96,98,-72,-75,-96,97,96,99,99,99,-97,-96,-57,100,100,99,100,95,96,94,46,21,-71,-16,26,90,89,41,-61,-61,-71,-11,43,99,99,99],"ownershipAllowedMAE":0.0359627})%"); + lines.push_back(R"%({"sample":{"board":".............XX.XO./.........X.X.XOXXO./.....X..OX.O.XOOOO./.X.X....O......O.X./.OX.......O..X.OX../..............OXOX./.........X..O..XO../......OOOX...X..X../..X.O.XXXOXX.X.X.../.....OOOOOOXO....../...O.....OXXOX...../....XXXXXXOOXXX.O../..O.XOOOOOXOO..X.../..........X.O.OXO../..XX.X...OOXO.OO.O./.OOX..O...X.XXXOO../...OOO.....X...XXOX/.................X./.................../","hintLoc":"null","initialTurnNumber":128,"metadata":"255EF48815FE6F82BAA5AD427B94B6D2:138","moveLocs":["Q19","N14","N15","P13","S13","M15","L17","P15","L13","L14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.38,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":7.0,"policyOptimism":0.433,"pda":0.0,"policyMixture":[7.74e-06,8.11e-06,7.94e-06,8.15e-06,8.53e-06,9.33e-06,9.99e-06,9.43e-06,9.99e-06,9.59e-06,8.82e-06,8.54e-06,8.41e-06,0,0,0,0,0,7.49e-06,7.61e-06,7.85e-06,8.12e-06,8.58e-06,9.13e-06,1.11e-05,2.48e-05,4.39e-05,0.000753,0,7.76e-06,0,8.63e-06,0,0,0,0,0,1.33e-05,7.53e-06,7.6e-06,7.64e-06,8.68e-06,8.95e-06,0,0.000356,1.19e-05,0,0,0,0,1.97e-05,0,0,0,0,0,1.45e-05,7.98e-06,0,7.68e-06,0,9.53e-06,1.12e-05,0.0184,1.1e-05,0,0.00789,1.31e-05,1.44e-05,8.85e-06,8.52e-06,6.65e-06,0,7.39e-06,0,7.88e-06,8.42e-06,0,0,8.62e-06,9.61e-06,1.22e-05,6.9e-05,0.0468,0.231,0.000118,0,0,0,0,0,0,0,7.42e-06,7.83e-06,8.12e-06,9.05e-06,9.52e-06,9.84e-06,1.07e-05,1.24e-05,5.49e-05,0.0814,0.135,0.155,0,1.14e-05,0,2.76e-05,0,0,7.14e-06,0,7.61e-06,8.45e-06,9.75e-06,1.04e-05,1.18e-05,1.08e-05,1.11e-05,0.0174,0.00229,0.167,0,0,0.0343,0,3.76e-05,0,0,7.64e-06,0,7.74e-06,8.79e-06,1.02e-05,1.01e-05,1.31e-05,1.42e-05,0.000229,0,0,0,0,7.96e-06,7.36e-06,7.83e-06,0,7.68e-06,7.72e-06,0,8.22e-06,8.27e-06,9.78e-06,1.16e-05,0,0.000275,0,1.24e-05,0,0,0,0,0,0,9.27e-06,0,8.53e-06,0,8.45e-06,9.5e-06,9.42e-06,1.07e-05,4.08e-05,1.11e-05,0.00703,2.35e-05,0,0,0,0,0,0,0,0,1.04e-05,8.57e-06,8.83e-06,1.07e-05,1.35e-05,1.12e-05,1.23e-05,0.00157,0.0133,0,6.08e-05,9.63e-06,7.38e-06,7.24e-06,7.47e-06,0,0,0,0,0,8.38e-06,9.44e-06,1.64e-05,0.00124,1.12e-05,1.2e-05,0.000368,0.0387,0.000361,0,0,0,0,0,0,0,0,0,0,0,9.32e-06,0,2.8e-05,1.2e-05,1.21e-05,0.000125,0,2.88e-05,0,0,0,0,0,0,0,0,0,8.88e-06,8.45e-06,0,0.000106,0.000217,1.4e-05,1.18e-05,3.79e-05,2.59e-05,8.59e-06,1.23e-05,5.46e-05,1e-05,1.06e-05,9.52e-06,2.24e-05,0,0.0321,0,3.28e-05,0,0,0,1.78e-05,2.35e-05,1.01e-05,9.98e-05,0,0,8.67e-06,0,8.97e-05,1.69e-05,3.76e-05,0,0,0,0,0.000439,0,0,0,0,1.08e-05,1.03e-05,0,0,0,9.11e-06,1.14e-05,0,0.00013,0.000241,0.000129,0,1.75e-05,0,0,0,0,0,0.00213,9.57e-06,9.5e-06,8.94e-05,0.000177,0,0,0,1.26e-05,2.16e-05,8.08e-05,1.03e-05,8.17e-06,0,7.82e-06,8.03e-06,7.85e-06,0,0,0,0,9.75e-06,2.35e-05,2.72e-05,1e-05,8.99e-06,9.16e-06,1.04e-05,1.04e-05,1.05e-05,9.67e-06,8.37e-06,8.06e-06,7.73e-06,7.99e-06,8.09e-06,8.43e-06,8.44e-06,0,8.95e-06,8.03e-06,9.42e-06,9.61e-06,8.92e-06,9.13e-06,9.06e-06,8.61e-06,8.56e-06,8.53e-06,8.45e-06,8.21e-06,7.86e-06,7.61e-06,7.61e-06,7.54e-06,7.84e-06,8.39e-06,7.81e-06,8.01e-06,1.04e-05],"winrateAvg":0.610562,"leadAvg":2.16129,"scoreMeanAvg":2.00347,"scoreStdevAvg":24.6685,"shorttermWinlossErrorAvg":0.360849,"shorttermScoreErrorAvg":6.08803,"ownership":[-78,-76,-72,-66,-57,-41,-19,-5,-16,-56,-80,-82,-83,-84,-84,-85,-85,59,57,-79,-78,-76,-71,-67,-55,-33,-4,25,-86,-83,-86,-78,-85,66,-85,-87,59,53,-80,-79,-75,-73,-58,-80,-10,9,62,-86,-85,15,-50,-84,66,65,64,61,-3,-78,-90,-84,-92,-34,-10,-1,13,61,30,24,11,-28,-35,19,65,-10,-98,-22,-74,-61,-92,-37,-13,-5,4,-1,6,28,69,71,-66,-63,66,66,-99,-97,-92,-63,-64,-44,-19,-8,-8,-16,-26,-17,-21,70,67,68,45,67,-99,-98,-100,-95,-55,-51,-36,-13,-1,-8,-16,-23,-50,-93,-92,-40,70,-7,69,-100,-98,-100,-93,-49,-50,-30,-5,18,27,80,78,78,-93,-85,-24,-9,-99,18,-62,-100,-84,-82,-40,-47,-66,7,93,86,76,73,75,96,-94,-94,-88,-99,-57,-99,-64,-59,-60,-25,-27,-19,-7,48,96,96,96,96,96,96,-94,-83,-89,-53,-33,-10,-34,-38,-4,-9,-6,91,77,77,77,77,82,96,-94,-94,-84,-97,-50,-1,10,-29,-2,19,17,12,79,54,55,53,53,54,54,93,94,-97,-97,-97,18,79,53,21,45,56,85,67,56,96,95,95,96,96,-31,93,93,-16,-40,-81,22,56,45,63,71,66,63,65,74,75,72,70,77,-36,-41,93,60,93,-80,90,75,65,74,70,51,53,62,56,77,59,37,89,86,-78,92,-21,93,93,90,91,56,81,95,95,52,80,82,98,42,5,-4,-94,-81,-98,-98,-98,93,93,34,37,84,88,92,99,99,99,52,17,-10,-35,-66,-98,-94,-94,-95,-97,-97,32,-52,85,87,90,93,89,77,43,15,-13,-40,-60,-85,-90,-93,-94,-95,-92,-92,-53,87,88,88,85,78,62,42,14,-13,-36,-58,-71,-84,-89,-92,-93,-92,-86,-78],"ownershipAllowedMAE":0.0451144})%"); + lines.push_back(R"%({"sample":{"board":"...O....O........../.XXXOOOOXOO......O./..XOXXXXXXO..OOOOX./.XXO.....XXX.OXXX../.XOO.XOO.O........./.O.OXXXXOOXX.O...../.OO.OOX.OXOOX...X../.XXOOXOOOX.OOX...../.O.OXXX.OX.OX...X../OXOO....OX.OX....../.XX.OXX.OX....O.O../.X..XOX.OX........./..X.XOXOOOXX......./...OOOXXOXOO......./..XO.XOXOXX......../..XOX.OXXO....OOO../....O.OOX...X..XX../.............X...../.................../","hintLoc":"null","initialTurnNumber":138,"metadata":"3D00D809BD9E2A436FBA4AEE5CE22803:148","moveLocs":["M9","O11","O9","O10","N9","O13","J15","N6","L4","P12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.08e-05,1.01e-05,1.07e-05,0,1.09e-05,1.04e-05,1.13e-05,7.46e-05,0,9.4e-05,1.23e-05,1.18e-05,1.12e-05,1.1e-05,1.11e-05,1.09e-05,1.08e-05,1.16e-05,1.02e-05,1.02e-05,0,0,0,0,0,0,0,0,0,0,1.63e-05,0.000109,1.14e-05,1.09e-05,1.03e-05,1.12e-05,0,1.09e-05,1.03e-05,9.68e-06,0,0,0,0,0,0,0,0,0,0.000517,2.66e-05,0,0,0,0,0,1.07e-05,1.08e-05,0,0,0,1.27e-05,4.75e-05,3.6e-05,6.71e-05,0.00188,0,0,0,1.05e-05,0,0,0,0,1.16e-05,1.07e-05,1.06e-05,0,0,0,1.05e-05,0,0,0,0,0,0.000701,1.08e-05,1.61e-05,1.15e-05,1.21e-05,9.91e-06,1.04e-05,3.51e-05,1.11e-05,2.43e-05,0,0,0,0,0,0,0,0,0,0,0,9.66e-06,0,1.03e-05,1.61e-05,1.08e-05,1.1e-05,1.09e-05,2.77e-05,0,0,0,0,0,0,1.07e-05,0,0,0,0,0,0,1.01e-05,1.14e-05,0,1.08e-05,1.12e-05,0.000282,0,0,0,0,0,0,0,0,0,9.35e-06,0,0,0,0,1.07e-05,1.05e-05,1.48e-05,1.15e-05,0.000194,0,0.000192,0,0,0,0,6.15e-05,0,0,9.3e-06,0,0,0,0.000101,1.22e-05,0,1.22e-05,1.15e-05,0,0,0,0,1.07e-05,1.05e-05,1.09e-05,0.000138,0,0,1.5e-05,0,0,0,0.000199,1.82e-05,1.55e-05,2.11e-05,1.11e-05,0.000427,0,0,9.97e-06,0,0,0,0.000201,0,0,4.04e-05,0,0,0,0,0.000207,0,1.72e-05,1.1e-05,9.65e-06,0,1.02e-05,1.05e-05,0,0,0,0.000215,0,0,6.72e-05,3.47e-05,2.01e-05,0.00463,0.153,0.000274,1.94e-05,1.19e-05,1.1e-05,1.06e-05,1.08e-05,0,1.11e-05,0,0,0,0,0,0,0,0,0.24,0.19,0.0864,0.000374,1.99e-05,1.18e-05,1.11e-05,1.07e-05,1.08e-05,1.13e-05,0,0,0,0,0,0,0,0,0,0,0.314,0.00317,5.93e-05,1.58e-05,1.19e-05,1.11e-05,1.09e-05,1.13e-05,0,0,9.52e-06,0,0,0,0,0,0,1.2e-05,1.91e-05,0.000278,1.41e-05,1.22e-05,1.18e-05,1.19e-05,1.11e-05,1.12e-05,1.07e-05,0,0,0,1.04e-05,0,0,0,0,0,1.11e-05,1.14e-05,1.25e-05,0,0,0,1.09e-05,1.13e-05,1.09e-05,1.11e-05,1.04e-05,1.94e-05,0,1.15e-05,0,0,0,1.03e-05,1.04e-05,1.11e-05,0,1.08e-05,1.03e-05,0,0,1.08e-05,1.12e-05,1.1e-05,1.05e-05,1e-05,1.09e-05,1.21e-05,1.04e-05,1.11e-05,1.2e-05,1.11e-05,1.03e-05,1.05e-05,1.04e-05,1.08e-05,0,1.01e-05,1.01e-05,1e-05,1.05e-05,1.07e-05,1.02e-05,1.11e-05,1.09e-05,1.05e-05,1.08e-05,1.1e-05,1.1e-05,1.08e-05,1.07e-05,1.06e-05,1.04e-05,1.03e-05,1.06e-05,1.03e-05,1.07e-05,1.05e-05,1.03e-05,1.04e-05,9.98e-06,8.19e-06],"winrateAvg":0.584347,"leadAvg":2.18837,"scoreMeanAvg":2.23357,"scoreStdevAvg":17.9877,"shorttermWinlossErrorAvg":0.349766,"shorttermScoreErrorAvg":5.06146,"ownership":[-91,-90,-75,-7,-3,25,67,77,85,85,89,90,92,94,95,93,90,83,73,-91,-91,-92,-93,76,77,78,79,-83,92,93,91,91,96,97,96,88,88,56,-90,-92,-92,96,-83,-83,-83,-84,-83,-85,92,-21,79,100,100,100,99,42,55,-86,-92,-93,97,-20,-69,-76,-71,-58,-83,-82,-82,59,100,22,24,22,44,40,14,-93,96,96,58,-81,-53,-58,-57,-52,-73,-7,45,75,62,47,36,34,36,29,96,96,96,-80,-81,-82,-83,-52,-56,-78,-77,70,99,66,47,38,33,33,90,96,96,96,96,95,-81,-68,-54,-88,98,99,68,99,74,52,17,31,33,90,90,90,96,96,-98,-55,-56,-55,-89,49,99,99,96,98,50,44,50,34,83,93,94,96,-98,-98,-98,-86,-59,-90,12,99,-88,97,63,51,18,37,41,79,-92,97,96,15,-47,-92,-91,-62,-91,18,98,-91,94,60,52,48,51,48,-72,-90,-91,12,67,-99,-99,-92,-65,-92,-64,-90,-89,-89,83,57,87,57,54,-85,-90,-71,-36,-68,91,-99,-92,-67,-93,-91,-72,-55,-44,-6,50,54,59,55,-85,-86,-90,3,-70,92,-99,-71,-68,-69,-93,-93,-57,-55,-26,21,48,53,52,-79,-84,-1,91,92,91,-99,-99,-69,-99,-16,-16,-13,-47,-19,8,39,46,47,-71,-80,-85,91,90,86,91,-99,-67,-99,-99,-45,-32,-9,10,29,45,47,35,-59,-58,-84,91,84,90,91,-99,-99,-94,-98,-31,-12,13,71,73,73,15,15,-40,-47,13,35,92,81,91,90,-99,-92,-76,-60,-91,-11,8,-84,-84,-16,-14,-25,-10,7,29,67,67,73,14,-33,-76,-74,-77,-81,-92,-76,-81,-68,-60,-26,-12,0,14,37,53,60,44,22,-24,-53,-69,-74,-80,-80,-79,-75,-68,-60,-47],"ownershipAllowedMAE":0.049642,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":"................XX./.X..X....XXX..XXOOO/.XX....OOOXOXXXOOXO/OXOO...O..OOXOXOX.X/.O.....OO.OOXOOOXXX/.......XXOOXOOOOXX./...X....O.OXXOXXX.O/..OOO..X..X.XOOOXXX/.....OOXX..XXXXXOOO/..X.X...OX.OXX.XXO./.....XXXXO.OO..XOO./.OO...OOXOXXO..XO../.X.O.O..XO.....XO../.....X.OOO.XO..X.../..O......X..O....O./....XXXOOOXX.O.X.../.O.X.OOXXXOO.XOX.../....XOXX.O...O...../.....X.O.........../","hintLoc":"null","initialTurnNumber":195,"metadata":"367A2C81BF4A0C3D7E22D6DE8550D036:205","moveLocs":["F18","E16","S16","L10","L9","S17","E15","T19","D18","D17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":-4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.86e-05,4.58e-05,5.06e-05,0.000114,0.845,9.94e-05,5e-05,5.24e-05,5.16e-05,5.01e-05,4.96e-05,4.93e-05,4.99e-05,4.71e-05,4.62e-05,4.49e-05,0,0,0,4.81e-05,0,3.71e-05,0,0,0,7.04e-05,5.14e-05,5.08e-05,0,0,0,5.11e-05,4.65e-05,0,0,4.29e-05,4.31e-05,4.17e-05,5.56e-05,0,0,0,8.05e-05,0.014,5.26e-05,0,0,0,0,0,0,0,0,4.23e-05,4.2e-05,0,4.23e-05,0,0,0,0,0,0.00369,5.04e-05,0,4.35e-05,4.77e-05,0,0,0,4.61e-05,0,4.26e-05,0,0,0,5e-05,0,0.00022,0.000195,0,0.000176,5.31e-05,0,0,4.33e-05,0,0,0,4.46e-05,4.4e-05,4.36e-05,0,0,0,5.12e-05,6.98e-05,0.000108,5.23e-05,6.1e-05,0.000105,5.57e-05,0,0,0,0,0,4.48e-05,4.35e-05,4.41e-05,4.46e-05,0,0,4.84e-05,5.37e-05,5.42e-05,7.75e-05,0,5.61e-05,5.25e-05,5.79e-05,0.000171,0,4.84e-05,0,0,0,4.34e-05,0,0,0,4.87e-05,0,5.24e-05,5.27e-05,0,0,0,4.93e-05,5.08e-05,0,4.57e-05,9.34e-05,0,0,0,4.53e-05,4.49e-05,4.65e-05,0,0,0,5.36e-05,5.64e-05,5.5e-05,5.75e-05,5.11e-05,0,0,0,0,0.054,0.00618,0,0,0,0,0,0,0,0,5.31e-05,0.000171,0,0.000279,0,0.000107,0.00864,0.00266,0,0,0,0,0,0,4.75e-05,0,0,0,4.35e-05,5.43e-05,5.22e-05,7.23e-05,0.000271,0.000346,0,0,0,0,0,0,0,0,5.15e-05,4.91e-05,0,0,0,4.66e-05,5.25e-05,0,0,5.43e-05,0.000241,5.24e-05,0,0,0,0,0,0,0,5.39e-05,5.18e-05,0,0,4.61e-05,4.9e-05,5.31e-05,0,5.65e-05,0,5.87e-05,0,5.43e-05,5.22e-05,0,0,4.72e-05,4.71e-05,5.07e-05,5.44e-05,5.11e-05,0,0,5.08e-05,5.01e-05,5.38e-05,5.79e-05,8.68e-05,0.000126,0.000488,0,5.5e-05,0,0,0,4.83e-05,0,0,5.28e-05,5.2e-05,0,5.46e-05,5.29e-05,4.96e-05,5.37e-05,7.75e-05,0,0.000821,8.54e-05,5.64e-05,5.79e-05,4.76e-05,4.8e-05,0,4.83e-05,4.8e-05,0,5.25e-05,0.000471,0.000698,0.000551,0,5.01e-05,5.25e-05,0.000186,0.000593,5.71e-05,0,0,0,0,0,0,0,0,5.1e-05,0,8.2e-05,0,6.91e-05,5.93e-05,5.27e-05,5.15e-05,0,0.000143,0,0,0,0,0,0,0,0,0,5.19e-05,0,0,0,0.00012,0.000101,5.24e-05,5.51e-05,8.61e-05,0.0073,5.53e-05,0,0,0,0,0.0413,0,5.89e-05,5.66e-05,4.96e-05,0,5.77e-05,0.000271,5.73e-05,5.47e-05,5.16e-05,4.69e-05,5.63e-05,5.11e-05,7.81e-05,0.0012,0,0.000586,0,8.14e-05,4.88e-05,5.15e-05,4.96e-05,4.78e-05,4.97e-05,5.23e-05,5.23e-05,5.19e-05,5.12e-05,4.64e-05,4.75e-05],"winrateAvg":0.0524232,"leadAvg":-8.16481,"scoreMeanAvg":-7.90177,"scoreStdevAvg":9.62426,"shorttermWinlossErrorAvg":0.165791,"shorttermScoreErrorAvg":3.49192,"ownership":[16,11,18,63,77,73,64,33,-14,-54,-75,-95,-99,-99,-99,-99,-100,-100,-100,11,5,15,64,21,86,73,66,4,-99,-99,-99,-99,-99,-100,-100,-100,-100,-100,20,3,3,2,29,14,57,99,99,99,-99,98,-100,-100,-100,-100,-100,-100,-100,57,-1,90,90,10,32,51,99,98,97,98,98,-100,-100,-100,-100,-100,-100,-100,52,87,81,77,86,11,41,99,99,98,98,98,-100,-100,-100,-100,-100,-100,-100,53,55,64,59,51,14,14,-26,-20,98,98,-100,-100,-100,-100,-100,-100,-100,-100,42,48,65,33,50,5,-13,4,83,60,98,-100,-100,-100,-100,-100,-100,-99,-98,29,51,95,95,95,29,-42,-98,-47,-22,-99,-99,-100,-100,-100,-100,-100,-100,-100,16,3,5,11,10,79,79,-98,-98,-28,-94,-100,-100,-100,-100,-100,92,91,91,11,9,-64,-45,-91,-37,2,-94,-92,-95,-95,100,-100,-100,-86,-100,-100,90,90,46,25,18,-23,-37,-97,-97,-97,-97,100,100,100,100,25,-36,-100,91,90,89,67,95,95,34,20,-8,84,83,-98,100,90,90,100,34,-34,-100,90,90,88,67,46,78,94,33,85,31,-11,-98,100,94,92,87,-48,-52,-100,91,88,85,65,63,52,18,-10,-75,11,99,100,100,92,86,99,10,-37,-99,-8,73,71,63,61,82,-9,-36,-50,-8,6,89,85,89,93,99,36,-11,-47,28,85,35,57,37,6,-44,-98,-98,-97,92,91,92,84,85,91,95,-33,-89,-11,-5,16,42,63,-40,-97,-96,-94,-94,-95,-95,-94,96,96,81,65,78,-89,-45,0,-8,31,12,0,-60,-97,-95,-95,-95,49,86,85,89,85,89,32,19,-30,-23,-14,12,3,-21,-56,-88,-96,-83,21,20,69,85,85,82,60,41,-2,-13,-22,-19],"ownershipAllowedMAE":0.0381196})%"); + lines.push_back(R"%({"sample":{"board":"............X../..........OX.X./....OO.X.O.OX../...O.X.X..OXX../.......OO..O.../..O....O.X..X../..OX.........../.............../.............../........XXO.X../...X.....OX..../....XXOX.O.X.../...XOOO..OX..../...X.....OX..../.............../","hintLoc":"null","initialTurnNumber":46,"metadata":"46D3C46FAE0932333BE4C79739E44292:56","moveLocs":["G5","H3","J4","E2","K1","J1","J3","J2","G2","H2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.26,"xSize":15,"ySize":15},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":27.0,"policyOptimism":0.0,"pda":-2.557,"policyMixture":[1.12e-05,1.33e-05,1.27e-05,1.3e-05,1.36e-05,1.35e-05,1.34e-05,1.39e-05,1.45e-05,1.46e-05,2.44e-05,1.38e-05,0,1.3e-05,1.23e-05,1.32e-05,1.49e-05,1.52e-05,2.08e-05,1.69e-05,1.64e-05,1.62e-05,1.61e-05,7.79e-05,1.84e-05,0,0,1.28e-05,0,1.26e-05,1.26e-05,1.43e-05,6.11e-05,9.62e-05,0,0,1.77e-05,0,1.62e-05,0,2.59e-05,0,0,1.35e-05,1.26e-05,1.25e-05,1.61e-05,9.74e-05,0,0.00057,0,0.000208,0,0.000108,9.85e-05,0,0,0,1.33e-05,1.31e-05,1.28e-05,1.78e-05,0.00023,0.00166,0.000105,2.39e-05,0.00331,0,0,0.0451,3e-05,0,1.36e-05,1.27e-05,1.27e-05,1.32e-05,1.55e-05,0,0.00018,0.000101,0.00179,0.000153,0,1.25e-05,0,1.41e-05,1.44e-05,0,1.34e-05,1.32e-05,1.34e-05,1.59e-05,0,0,5.53e-05,0.0221,0.00986,2.38e-05,2.75e-05,1.43e-05,1.4e-05,1.36e-05,1.38e-05,1.39e-05,1.29e-05,1.35e-05,1.69e-05,0.000105,0.000255,4.65e-05,0.000202,6.9e-05,3.82e-05,4.9e-05,5.14e-05,1.47e-05,1.43e-05,1.38e-05,1.37e-05,1.29e-05,1.37e-05,1.6e-05,3.7e-05,3.99e-05,1.64e-05,1.86e-05,2.68e-05,2e-05,1.32e-05,1.45e-05,0.000247,1.28e-05,1.28e-05,1.32e-05,1.29e-05,1.36e-05,1.5e-05,1.52e-05,1.43e-05,1.37e-05,2.28e-05,1.53e-05,4.47e-05,0,0,0,1.82e-05,0,1.38e-05,1.33e-05,1.33e-05,1.42e-05,1.44e-05,0,1.24e-05,1.45e-05,0,1.79e-05,1.54e-05,0,0,5.43e-05,1.36e-05,1.36e-05,1.38e-05,1.3e-05,1.34e-05,1.25e-05,1.15e-05,0,0,0,0,0,0,3.48e-05,0,1.39e-05,1.39e-05,1.37e-05,1.32e-05,1.32e-05,1.35e-05,0,0,0,0,0,0,0,0,1.54e-05,2.89e-05,1.45e-05,1.35e-05,1.29e-05,1.31e-05,1.27e-05,0,0,1.1e-05,0,0,0,0,0,1.51e-05,2.35e-05,1.32e-05,1.37e-05,1.11e-05,1.33e-05,1.27e-05,1.16e-05,2.84e-05,0.000326,0.911,1.04e-05,0,0,1.49e-05,1.4e-05,1.35e-05,1.39e-05,1.14e-05,1.54e-05],"winrateAvg":0.62495,"leadAvg":2.82511,"scoreMeanAvg":3.1055,"scoreStdevAvg":16.4168,"shorttermWinlossErrorAvg":0.371572,"shorttermScoreErrorAvg":4.88768,"ownership":[72,74,75,76,77,72,62,51,42,34,-16,-53,-94,-93,-93,73,73,76,79,84,80,65,47,45,45,55,-92,-92,-95,-92,72,74,73,81,94,94,64,28,51,71,-4,-7,-95,-91,-87,71,74,79,95,51,21,47,29,57,30,56,-96,-96,-76,-77,71,76,73,48,41,40,41,82,80,-5,21,33,-10,-65,-62,68,79,92,29,21,27,36,82,24,-49,-7,-14,-77,-56,-50,58,67,91,-31,5,11,10,18,4,-7,-4,-13,-30,-42,-39,40,44,22,1,-4,-1,0,-5,-18,-32,-6,-10,-20,-29,-32,18,20,3,-8,-11,-11,-12,-17,-34,-24,5,-12,-19,-35,-31,-1,-4,-10,-28,-25,-36,-33,-35,-89,-88,4,-35,-76,-43,-35,-20,-23,-49,-93,-58,-60,-85,-67,-46,-18,-84,-54,-47,-39,-34,-36,-39,-33,-86,-92,-91,-31,-84,-84,-22,-52,-90,-44,-34,-31,-48,-53,-65,-91,-34,-34,-33,-33,-84,-28,-83,-62,-36,-33,-30,-55,-58,-65,-91,-32,-42,-53,-34,-31,-27,-83,-55,-37,-31,-30,-60,-62,-69,-57,-56,-50,-53,-42,-31,-52,-45,-47,-36,-32,-32],"ownershipAllowedMAE":0.0622263})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...X...OOX.....XO../...O...OXX.OO..XXX./.......O..O...OOOX./..O.....XXOXX.OXXO./......X....O......./...O.....X.....X.../...........O......./...............X.../...X.............../..............OXX../.............O.O.../...O...........OX../................X../.....O......X.O..../...X.XX........O.../.................../.................../","hintLoc":"null","initialTurnNumber":55,"metadata":"6D6E800564B129C342A982085F306A63:65","moveLocs":["E17","E11","P13","P12","O12","O11","N12","O9","P9","P10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.86,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":11.0,"policyOptimism":0.472,"pda":-0.314,"policyMixture":[4.41e-06,5.09e-06,4.91e-06,4.99e-06,5.3e-06,4.97e-06,4.85e-06,5.48e-06,6.1e-06,5.64e-06,5.7e-06,6.02e-06,5.98e-06,5.41e-06,5.52e-06,5.2e-06,5.26e-06,4.88e-06,4.57e-06,5.21e-06,6.2e-06,6.74e-06,1.18e-05,9.98e-06,6.96e-06,5.6e-06,6.12e-06,7.61e-06,8.83e-06,9.95e-06,1.37e-05,1.28e-05,9.85e-06,1.2e-05,8.06e-06,5.47e-06,5.25e-06,4.64e-06,5.03e-06,6.84e-06,5.38e-05,0,0,6.07e-06,4.83e-06,0,0,0,6.4e-06,6.57e-06,7.52e-06,1.19e-05,6.43e-06,0,0,5.47e-06,4.61e-06,5.14e-06,7.76e-06,1.93e-05,0,1.16e-05,6.86e-06,4.68e-06,0,0,0,4.96e-06,0,0,7.11e-06,1e-05,0,0,0,4.62e-06,5.27e-06,8.66e-06,9.28e-06,1.28e-05,1.21e-05,8.15e-06,5.76e-06,0,1.99e-05,1.8e-05,0,5.08e-06,5.97e-06,5.25e-06,0,0,0,0,4.74e-06,5.6e-06,8e-06,0,1.04e-05,1.72e-05,2.14e-05,1.26e-05,4.95e-05,0,0,0,0,0,5.65e-06,0,0,0,0,5.21e-06,5.32e-06,9.3e-06,8.28e-06,9.09e-06,1.89e-05,0.000441,0,1.6e-05,1.18e-05,9.68e-06,9.02e-06,0,5.42e-06,4.91e-06,0,0.04,6.09e-06,8.17e-06,5.11e-06,5.49e-06,1.33e-05,1.28e-05,0,0.0545,0.0348,4.82e-05,1.45e-05,1.59e-05,0,1.83e-05,4.22e-06,0,0,0,0,9.43e-06,8.39e-06,4.9e-06,5.55e-06,2.12e-05,3.42e-05,0.066,0,1.32e-05,0.000128,0.000154,9.29e-05,9.5e-05,9.75e-06,0,9.5e-06,0,8.04e-06,7.72e-06,6.48e-06,5.98e-06,4.51e-06,5.74e-06,2.19e-05,8.2e-05,2e-05,3.45e-05,2.8e-05,9.66e-05,9.42e-05,0.000447,0.0122,0.00627,9.15e-06,0.564,5.5e-06,0,0,9.84e-06,1.03e-05,4.83e-06,5.83e-06,4.44e-05,1.82e-05,0,5.86e-05,0.000149,0.000193,0.000203,0.000218,0.000237,0.000217,4.56e-05,0.0375,0,0,0.00231,7.9e-06,1.01e-05,5.1e-06,5.95e-06,2.65e-05,0.000125,8.04e-05,0.000149,0.000189,0.000279,0.000241,0.000278,0.000282,0.00129,0.0134,0.000395,8.33e-06,0,0,0,9.44e-06,4.92e-06,6e-06,4.94e-05,0.000105,1.2e-05,3.32e-05,0.0002,0.000352,0.000283,0.000291,0.000325,0.00042,0.000634,1.67e-05,0,4.94e-06,0,0.0277,5.76e-06,5.12e-06,5.88e-06,2.05e-05,1.29e-05,0,1.01e-05,0.000124,0.000159,0.000366,0.000319,0.000317,0.000564,0.000123,2.24e-05,7.39e-06,5.04e-06,0,0,6.12e-06,5.76e-06,5.88e-06,6.83e-05,0.000698,1.05e-05,1.23e-05,9.55e-06,2.25e-05,0.000945,0.00767,0.000535,0.000446,0.00454,1.57e-05,7.7e-06,6.28e-06,1.25e-05,0,7.3e-06,5.51e-06,5.46e-06,5.99e-05,0.00134,0.000459,0.000967,0,4.29e-05,4.99e-05,0.000242,0.0152,0.0638,6.07e-05,0,8.2e-06,0,6.29e-06,4.28e-05,2.12e-05,5.86e-06,5e-06,1.17e-05,0.0301,0,1.19e-05,0,0,1.27e-05,0.000176,0.000317,0.000651,0.000107,1.41e-05,1.28e-05,5.86e-06,0,1.07e-05,1.66e-05,5.75e-06,4.84e-06,7.88e-06,8.61e-06,8e-06,7.87e-06,6.12e-06,6.81e-06,9.77e-06,1.39e-05,1.48e-05,2.07e-05,1.63e-05,2.27e-05,1.09e-05,1.02e-05,6.89e-06,8.45e-06,8.05e-06,5.5e-06,4.23e-06,4.96e-06,4.86e-06,4.96e-06,4.99e-06,5.01e-06,4.95e-06,5.07e-06,5.37e-06,5.45e-06,5.49e-06,5.58e-06,5.59e-06,5.6e-06,5.42e-06,5.39e-06,5.11e-06,5.17e-06,4.43e-06,7.48e-06],"winrateAvg":0.466016,"leadAvg":-0.385367,"scoreMeanAvg":-0.549825,"scoreStdevAvg":14.2976,"shorttermWinlossErrorAvg":0.117253,"shorttermScoreErrorAvg":0.936882,"ownership":[44,46,50,57,64,65,59,38,17,-18,-18,3,9,-5,-28,-49,-70,-78,-83,43,44,48,55,72,70,67,72,16,-23,-39,22,-4,-8,-33,-74,-82,-81,-87,42,45,52,40,89,61,69,91,91,-80,-23,23,39,-4,-36,-98,-81,-90,-90,44,46,49,90,48,46,56,91,-79,-79,-9,90,91,10,-29,-98,-98,-98,-92,46,49,46,40,38,30,32,91,-14,-26,85,81,77,68,88,87,84,-98,-91,46,53,83,35,19,17,-5,9,-79,-79,86,63,61,77,87,-84,-85,-83,-89,39,46,41,23,5,14,-61,-28,-48,-40,-8,88,78,83,88,45,-82,-86,-83,24,26,30,64,-8,11,-7,-18,-29,-75,21,63,92,92,-88,-87,-72,-72,-78,8,13,5,18,-63,-10,-12,-14,-18,-16,13,88,29,-85,-79,-81,-81,-79,-76,-3,-6,-11,-26,-27,-17,-18,-16,-12,-8,-27,29,71,-72,-92,-92,-78,-79,-77,-8,-8,-27,-70,-22,-13,-10,-9,-7,-4,0,12,29,-69,69,8,-78,-81,-77,-5,-9,-10,-15,-7,-8,-5,-5,-4,-2,1,15,13,-1,74,-88,-89,-78,-75,0,3,-1,6,-5,1,0,-1,-1,-1,2,11,22,82,68,78,46,-78,-65,3,2,18,54,9,1,1,1,0,-1,2,3,2,25,44,78,-63,-52,-55,-2,-1,0,6,6,2,-4,-4,6,-1,-1,8,6,25,45,-3,-62,-44,-35,-14,-22,-25,-12,-5,34,-23,-11,-6,-5,11,-2,-41,22,83,31,0,-6,-14,-29,-35,-50,-88,-34,-90,-89,-30,-14,-13,-7,-2,-3,-2,37,83,26,8,9,-39,-50,-61,-71,-76,-75,-65,-42,-27,-18,-10,-4,6,13,33,50,39,29,19,-48,-54,-60,-66,-68,-66,-56,-40,-26,-17,-10,-2,5,18,31,40,39,34,27],"ownershipAllowedMAE":0.0320896})%"); + lines.push_back(R"%({"sample":{"board":"............./............./...XOX......./..XOX....X.../...O........./........O.O../.........OX../..X......XOO./.........XXO./...O.....XOX./.....X..OXO../.........XO../............./","hintLoc":"null","initialTurnNumber":14,"metadata":"BC61A5D39AFCBF4D1EED7C1A0B89A9F8:24","moveLocs":["E12","C11","F12","E9","D8","G11","E3","F4","G12","H11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.76,"xSize":13,"ySize":13},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":2.5,"policyOptimism":0.0,"pda":0.372,"policyMixture":[2.3e-05,3.15e-05,2.92e-05,2.93e-05,2.35e-05,2.15e-05,2.23e-05,2.78e-05,2.67e-05,2.72e-05,2.5e-05,2.59e-05,2.26e-05,2.82e-05,0.000234,3.72e-05,0.0123,0,0,0,0.858,7.78e-05,3.98e-05,2.97e-05,2.77e-05,2.54e-05,2.64e-05,2.88e-05,0,0,0,0,0,0,0.00029,4.01e-05,4.34e-05,2.96e-05,2.54e-05,2.7e-05,4.65e-05,0,0,0,0.00104,2.57e-05,2.76e-05,3.49e-05,0,3.11e-05,3.13e-05,2.58e-05,2.73e-05,0.084,0.0101,0,0,2.68e-05,0.000239,3.05e-05,2.72e-05,2.86e-05,2.68e-05,2.75e-05,2.6e-05,2.69e-05,0.000264,2.64e-05,0,0.0164,0.000349,4.34e-05,3.01e-05,0,2.49e-05,0,2.47e-05,2.54e-05,2.68e-05,3.79e-05,4.22e-05,3.17e-05,0.000148,7.04e-05,3.89e-05,4.33e-05,2.87e-05,0,0,2.54e-05,2.34e-05,2.67e-05,3.26e-05,0,0.00278,0.000148,5.28e-05,3.88e-05,3.92e-05,0.00165,0,0,0,2.27e-05,2.76e-05,3.24e-05,6.02e-05,4.03e-05,0.000217,6.2e-05,0.000112,0.000109,3.14e-05,0,0,0,2.01e-05,2.77e-05,3.23e-05,3.24e-05,0,3.54e-05,0,3.25e-05,9.54e-05,3.21e-05,0,0,0,2.59e-05,2.7e-05,3.07e-05,3.1e-05,2.71e-05,0,0,3.71e-05,3.13e-05,0,0,0,2.83e-05,2.48e-05,2.7e-05,2.86e-05,2.95e-05,3.79e-05,0.000151,0.00807,6.02e-05,3.94e-05,0.000283,0,0,2.6e-05,2.65e-05,2.35e-05,2.72e-05,2.6e-05,2.7e-05,2.85e-05,2.67e-05,2.76e-05,2.81e-05,2.92e-05,4.6e-05,2.51e-05,2.51e-05,2.23e-05,2.53e-05],"winrateAvg":0.230988,"leadAvg":-1.92798,"scoreMeanAvg":-2.88313,"scoreStdevAvg":9.5605,"shorttermWinlossErrorAvg":0.182882,"shorttermScoreErrorAvg":1.22833,"ownership":[-44,-45,-46,-43,-41,-40,-45,-51,-54,-50,-42,-34,-27,-40,-42,-55,-51,-30,-32,-35,-29,-64,-49,-41,-26,-20,-31,-48,-68,-69,-27,-90,-90,-91,-65,-52,-25,-16,-9,-7,-38,-67,71,-85,-68,-49,-34,-35,-80,-21,3,7,18,45,27,69,-83,-33,-25,-2,13,4,11,22,32,34,34,44,70,-7,-4,0,20,86,65,87,60,58,30,30,26,36,16,5,1,3,2,85,75,81,75,25,17,-12,32,1,-3,-7,-10,1,-78,92,93,82,23,24,26,13,0,-19,-13,-24,-33,-78,-79,93,78,25,24,38,69,-22,-82,-42,-40,-46,-78,68,68,77,26,28,27,42,60,-82,-51,-48,-21,-78,67,69,61,29,28,32,39,20,-4,-53,-41,-40,-79,67,-2,46,30,32,31,26,14,-15,-30,-44,-51,-51,-44,-12,12],"ownershipAllowedMAE":0.0922008})%"); + lines.push_back(R"%({"sample":{"board":"...XXO............/..X.XO...OXXXX..../..XXOO...OO.OX..../..OOO....X..O.XX../..OXXXOOOO....OOX./...OX.XXXO.O..OXXX/.....X..XXO....OX./...XX.XO.X......../....OXXO.XO......./..O..OO...O......./.XXO...OOO.O.X..../...XX.OXXX..XO..O./..XO.OOX.OX.XXX.../.XXXOOX.XO.XOO.O../.OOOXOXX.OX.XOXO../..XXXO....X.XOOX../.....OXX.....O..../................../","hintLoc":"null","initialTurnNumber":135,"metadata":"B500F428C6176D2128A03A5D4312E98E:145","moveLocs":["P5","P12","Q9","L11","M11","N11","N12","O13","O14","M10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.19,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":19.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.76e-05,0.000198,0.000174,0,0,0,9.69e-05,0.000102,0.000103,0.000109,0.000105,9.33e-05,9.03e-05,8.92e-05,8.86e-05,9.01e-05,9.28e-05,9.22e-05,0.000125,0.000137,0,0,0,0,9.31e-05,9.92e-05,0.0001,0,0,0,0,0,8.88e-05,9.07e-05,8.81e-05,9.34e-05,0.000113,0.000403,0,0,0,0,9.44e-05,9.69e-05,0.0001,0,0,0.000107,0,0,9.2e-05,9.16e-05,9.46e-05,8.91e-05,0.000125,0.000131,0,0,0,0.000105,9.6e-05,9.19e-05,0.0001,0,0.000106,9.99e-05,0,9.89e-05,0,0,9.69e-05,8.94e-05,0.000117,0.000117,0,0,0,0,0,0,0,0,9.99e-05,0.000103,0.0001,0,0,0,0,8.98e-05,0.000115,0.00013,0.00012,0,0,0,0,0,0,0,9.91e-05,0,0.00014,0,0,0,0,0,0.000131,0.00156,0.000572,0.000169,9.9e-05,0,0.00669,0.000282,0,0,0,0.0013,0,0.000729,0,0,0,8.99e-05,0.000144,0.00631,0.00483,0,0,0,0,0,9.49e-05,0,0,0,0,0.00997,0.000148,0.000159,0.000103,9.95e-05,0.000143,0.00194,0.00353,0.0249,0,0,0,0,0.000182,0,0,0,0.626,0.000494,0.000147,0.000118,0.000117,0.000104,0.000121,0.00224,0,0.000784,0.000549,0,0,9.24e-05,0.000116,0.000167,0,0.00258,0.0155,0.0461,0.000149,0,0.000113,0.000102,0.00012,0,0,0,0.0715,0.000372,0.000105,0,0,0,0.000102,0,0.00332,0,0.000355,0.000122,0.000111,0.000103,0.000101,0.00293,0.003,0,0,0.000547,0,0,0,0,0.000964,0.0558,0,0,0.000177,0.000122,0,9.93e-05,0.000109,0.000118,0,0,0.000177,0,0,0,0.000141,0,0,0.00178,0,0,0,0.00012,0.00011,0.000101,0.000121,0,0,0,0,0,0,0,0,0,0.000123,0,0,0,0,0,0.000103,9.89e-05,0.000181,0,0,0,0,0,0,0,0.000111,0,0,0.000103,0,0,8.18e-05,0,9.2e-05,9.46e-05,0.000331,0.0325,0,0,0,0,0.0233,0.00429,0.000137,0.000818,0,0.000101,0,0,0,0,9.17e-05,8.88e-05,0.001,0.00321,0.0048,0.00276,0.0088,0,0,0,0.000319,0.00132,0.000209,0.00013,0.000106,0,8.74e-05,9.15e-05,9.18e-05,9.38e-05,0.000111,0.00242,0.00106,0.00043,0.000191,0.000131,0.000123,0.000117,0.000112,0.000128,0.000144,0.000116,0.000115,0.000103,9.31e-05,8.97e-05,9.47e-05,9.13e-05,0.000118],"winrateAvg":0.00124406,"leadAvg":-12.2887,"scoreMeanAvg":-12.7874,"scoreStdevAvg":6.46395,"shorttermWinlossErrorAvg":0.0116872,"shorttermScoreErrorAvg":1.56823,"ownership":[-78,-91,-94,-95,-95,99,89,74,58,-26,-35,-87,-98,-99,-99,-99,-99,-99,-36,-94,-95,-95,-95,99,86,74,67,94,-99,-100,-100,-100,-100,-99,-99,-99,-27,-10,-95,-96,99,99,82,79,77,92,91,-65,68,-100,-99,-99,-99,-99,31,19,99,99,99,-18,72,78,76,53,53,44,72,-32,-100,-100,-99,-99,51,73,99,-99,-99,-99,98,98,97,97,55,39,-26,12,7,2,-100,-99,43,41,32,33,-99,-99,-100,-100,-100,96,47,81,31,-35,14,-99,-100,-100,17,11,-5,-23,-80,-100,-79,27,-100,-100,54,42,82,20,-57,-7,-100,-78,-7,-2,-36,-99,-99,-96,-96,91,-40,-100,-99,67,39,51,7,-15,-42,-44,-21,-24,-26,-34,48,-97,-96,91,-15,-99,97,58,87,28,6,3,-4,-6,-43,-18,35,11,43,97,98,85,-1,17,97,82,33,7,15,87,46,25,-66,-99,-99,55,36,-9,92,98,98,98,67,96,-8,-81,-12,13,49,50,-89,-93,-97,-98,-96,-3,96,-99,-99,-99,-19,50,-98,-39,-45,2,85,62,-95,-98,-100,18,21,97,97,-99,-95,-93,-99,-90,-97,-98,-98,-13,69,74,-98,-100,-100,-100,97,97,-99,-98,-99,-93,-96,-99,99,100,100,100,90,84,-98,-97,-96,-95,-96,97,-99,-99,-95,-92,-100,-97,-98,100,100,100,95,91,-96,-94,-96,-96,-95,97,65,-94,-93,-94,-100,-76,-98,100,100,96,97,95,-87,-91,-42,-18,29,97,-98,-98,-86,-76,-84,-34,-42,100,98,97,97,97,-69,-51,-22,11,61,47,-3,-79,-79,-62,-8,10,67,85,97,97,97,97],"ownershipAllowedMAE":0.046846})%"); + lines.push_back(R"%({"sample":{"board":"...........O.....X./...XOO.....OXX.XXOO/.XOXXXOOOO.OOXOXOO./..XOOXXOXOXOXXXXOXO/.X...XOXXOOXO.XOOX./X.XOO.O.XXXXO.X.O../OXXXO...XOOOO.XO.O./.OOO..O.XXO.O.XXXX./OXXOO..O.XXOOO...../.OXO.O...XOOX.OO.X./XOXO.O.OOXOXXXXOOX./.XX.O.XXXXX.XOXXOOX/..XXXXXOX.OXOOX.O../..XOOOXOXXXXOOOO..X/...OOXOOOOOOXXXXOOO/..XOXXXO..XXOOXXXX./..XOOX.OO.XOOOX..O./..XXOXX.OX.XXOOO.../....OOXXX...O....../","hintLoc":"null","initialTurnNumber":241,"metadata":"D1F1A9C87068952B238F5729F507C7FC:251","moveLocs":["A12","R13","T14","A10","T7","T9","S6","K4","M1","L2"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":9.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.73e-05,0.000108,0.000124,0.000271,0.025,0.000233,0.00408,0.000123,0.000104,0.000104,0.000104,0,0.22,0.000106,0.000101,0.000109,0.00284,0,0.00338,9.97e-05,0.000123,0.00996,0,0,0,0.0282,0.00231,0.000102,0.000101,9.72e-05,0,0,0,0.000101,0,0,0,0,0.000106,0,0,0,0,0,0,0,0,0,9.89e-05,0,0,0,0,0,0,0,4.34e-05,0.000158,0.000121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00336,0,0.00098,0.00145,0.0765,0,0,0,0,0,0,0,0,0.000133,0,0,0,0,0.000108,0,0,0,0,0,0.425,0,0.000117,0,0,0,0,0,0.000134,0,0.0174,0,0.000118,0,0,0,0,0,0,0.00012,0.000136,0.000376,0,0,0,0,0,0.000134,0,0,0,0,0.0019,0,0,0,0,0.000105,0.000104,0,0.000128,0,0,0,0.0001,0,0.000134,0,0,0,0,0.00185,0,0,0,0,0,0.000105,0.00011,0,0.000128,0,0,0,0,0,0.00013,0.000125,0.0606,0.000117,0.000112,0,0.0001,0,0,0.000105,0,0.000182,0.000153,0.000339,0,0,0,0,0.00454,0,0,0.00042,0,0.000109,0,0.000101,0,0,0.000104,0,0.085,0,0,0,0,0,0,0,0,0,0,0,0,9.92e-05,0,0,0.000136,0,0.000129,0,0,0,0,0,0,0,0,0,0,0,0,0,9.76e-05,9.93e-05,0,0,0,0,0,0,0,9.68e-05,0,0,0,0,0,0.0131,0,0.000105,0,9.78e-05,9.94e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000128,0,0.000103,9.85e-05,0.000118,0.000109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9.77e-05,9.95e-05,0,0,0,0,0,0,0.000163,0,0,0,0,0,0,0,0,0,0.00057,9.63e-05,9.73e-05,0,0,0,0,0.000235,0,0,0.000139,0,0,0,0,0,0.000227,0.000345,0,0.000103,9.6e-05,9.65e-05,0,0,0,0,0,0.000191,0,0,0,0,0,0,0,0,0.000101,0.000103,0.000101,9.41e-05,9.49e-05,0.000102,9.38e-05,0,0,0,0,0,0.000101,0.000174,0,0,0.000245,0.000105,9.94e-05,0.000102,0.000103,9.55e-05,8.41e-05],"winrateAvg":0.0860436,"leadAvg":-1.32162,"scoreMeanAvg":-1.37255,"scoreStdevAvg":2.01283,"shorttermWinlossErrorAvg":0.156313,"shorttermScoreErrorAvg":0.552737,"ownership":[-99,-99,-98,-84,-53,73,98,99,100,100,100,100,84,29,-93,-97,-96,-97,69,-99,-99,-99,-99,99,99,99,100,100,100,100,100,-100,-100,-99,-100,-100,99,99,-99,-99,-99,-99,-99,-99,100,100,100,100,100,100,100,-100,-98,-100,99,99,100,-99,-99,-99,100,100,-99,-99,100,-100,100,100,100,-100,-100,-100,-100,99,99,99,-97,-99,-64,24,78,-99,100,-100,-100,100,100,-100,100,-55,-100,99,99,99,99,-97,-96,-96,100,100,72,100,-33,-100,-100,-100,-100,100,6,-100,-8,99,98,99,100,-97,-96,-97,100,98,85,-49,-100,100,100,100,100,-10,-100,-7,-100,98,-30,100,100,100,100,100,99,100,9,-100,-100,100,100,100,39,-100,-100,-100,-100,-83,100,-100,-100,100,100,100,99,99,-47,-100,-100,100,100,100,39,-10,78,-98,-99,-100,-100,-100,100,100,100,97,94,-46,-100,100,100,-100,63,100,100,28,-100,-99,-100,-100,-100,100,100,100,-59,99,98,-100,100,-100,-100,-100,-100,100,100,-99,-100,-100,-100,-100,4,100,12,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,100,100,-99,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,100,-100,-85,100,100,100,-100,-100,-100,-100,-100,-100,-100,99,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,99,99,99,99,99,100,98,99,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,99,39,-100,-100,-100,100,100,100,100,100,99,100,-100,-100,-100,-100,-100,-100,-63,99,99,-57,-100,100,100,100,99,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-41,99,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-32,98,99,99,100,100,100,100,100],"ownershipAllowedMAE":0.0254857})%"); + lines.push_back(R"%({"sample":{"board":".................../...X.............../..X.XX.........X.../.OOX..O............/.O.OOX............./..O....X........X../.XXOOXX............/...XXO............./.....O............./.................../.................../.................../.................../................O../.................../..OOO......O.XX.O../..XXXOOO.....XOO.../.....XX............/.................../","hintLoc":"null","initialTurnNumber":47,"metadata":"5477B2F2B4E2AA70AFCF12F43BF035EB:57","moveLocs":["D10","E14","D14","B14","F14","F16","B11","C12","E11","B17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.32,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.23e-06,2.74e-06,2.83e-06,3e-06,3e-06,2.99e-06,3.03e-06,2.98e-06,3.03e-06,3.07e-06,3.29e-06,3.55e-06,3.65e-06,3.72e-06,3.65e-06,3.68e-06,3.34e-06,3.16e-06,2.47e-06,4.56e-06,3.95e-06,3.6e-06,0,3.16e-06,3.62e-06,4.48e-06,5.69e-06,6.48e-06,7.57e-06,9.74e-06,1.45e-05,1.83e-05,5.55e-05,5.36e-05,3.37e-05,1.01e-05,6.65e-06,3.02e-06,0.319,0,0,0,0,0,5.01e-06,6.13e-06,1.1e-05,1.87e-05,5.22e-05,0.000213,0.0121,0.00199,0.000227,0,3.26e-05,8.21e-06,3.01e-06,0.00147,0,0,0,1.02e-05,0,0,4.48e-06,2.28e-05,4.51e-05,8.68e-05,0.000238,0.000242,0.000121,0.000154,0.0004,4.94e-05,1.24e-05,3.13e-06,0.0961,0,1.96e-05,0,0,0,0.000815,6.57e-06,0.000944,6.11e-05,5.91e-05,7.88e-05,7.03e-05,5.4e-05,0.00142,0.000787,5.76e-05,3.17e-05,3.43e-06,3.2e-05,0,0,0,2.78e-06,0,0.000133,0,6.7e-05,3.77e-05,6.98e-05,7.32e-05,6.81e-05,5.26e-05,4.86e-05,0.000404,0,0.000103,3.4e-06,0.00227,0,0,0,0,0,0,1.74e-05,0.000244,6.24e-05,7.97e-05,8.11e-05,7.71e-05,7.37e-05,6.6e-05,0.000196,6.39e-05,1.22e-05,3.3e-06,8.02e-06,0.00401,0,0,0,0,0.0486,0.0097,0.000164,0.000116,8.01e-05,8.87e-05,8.75e-05,7.57e-05,6.5e-05,6.9e-05,6.78e-05,1.21e-05,3.24e-06,3.55e-06,0,0.0487,0.00335,0,0,3.75e-06,1.63e-05,9.51e-05,0.00011,8.86e-05,0.0001,9.88e-05,8.32e-05,7e-05,7.3e-05,5.1e-05,9.92e-06,3.16e-06,3.05e-06,3.77e-06,3.69e-06,0,3e-06,3.21e-06,4.33e-06,8.12e-06,2.46e-05,6.52e-05,9.21e-05,0.000126,0.000123,9.81e-05,8.05e-05,8.65e-05,4.92e-05,1e-05,3.19e-06,2.9e-06,3.66e-06,3.52e-06,3.34e-06,3.42e-06,3.8e-06,4.92e-06,7.51e-06,1.24e-05,3.61e-05,0.0001,0.000177,0.000172,0.000107,6.77e-05,8.35e-05,5.25e-05,1.02e-05,3.21e-06,2.86e-06,3.41e-06,3.63e-06,3.66e-06,3.84e-06,4.33e-06,5.24e-06,6.99e-06,1.05e-05,3.22e-05,0.00012,0.000521,0.00495,0.000124,4.97e-05,9.71e-05,1.84e-05,9.1e-06,3.1e-06,2.87e-06,3.82e-06,3.77e-06,3.79e-06,3.92e-06,4.4e-06,5.15e-06,6.42e-06,9.19e-06,2.26e-05,0.000145,0.0268,0.236,0.0274,0.00493,0.000139,1.15e-05,8.74e-06,2.88e-06,3e-06,4.2e-06,4.05e-06,3.66e-06,3.69e-06,4.03e-06,4.69e-06,5.75e-06,8.01e-06,1.38e-05,9.17e-05,0.0954,0.0103,0.00401,0.000634,1.21e-05,0,4.74e-06,3.04e-06,3.63e-06,1.43e-05,3.94e-06,2.98e-06,2.84e-06,3.98e-06,4.12e-06,5.01e-06,7.02e-06,1.16e-05,2.22e-05,1.35e-05,0.000548,6.94e-06,5.21e-06,7.71e-06,3.86e-06,4.42e-06,2.55e-06,5.28e-06,0.00227,0,0,0,3.29e-06,2.97e-06,3.56e-06,7e-06,2.95e-05,1.54e-05,0,5.35e-06,0,0,4.09e-06,0,3.29e-06,2.75e-06,4.85e-06,0.00096,0,0,0,0,0,0,7.92e-06,4.74e-05,0.000159,1.72e-05,5.27e-06,0,0,0,2.8e-06,3.14e-06,2.54e-06,3.33e-06,4.75e-06,4.44e-06,5.46e-06,7.12e-06,0,0,0.0237,1.11e-05,1.15e-05,1.18e-05,2.52e-05,8.42e-06,6.27e-06,4.91e-06,3.61e-06,3.01e-06,2.93e-06,2.57e-06,2.57e-06,3.27e-06,2.84e-06,3.42e-06,3.3e-06,3.4e-06,3.48e-06,3.56e-06,3.81e-06,3.71e-06,3.68e-06,3.51e-06,3.18e-06,3.22e-06,3.36e-06,2.99e-06,2.62e-06,2.59e-06,2.48e-06,4.56e-06],"winrateAvg":0.698106,"leadAvg":1.76038,"scoreMeanAvg":3.20707,"scoreStdevAvg":13.2442,"shorttermWinlossErrorAvg":0.156039,"shorttermScoreErrorAvg":1.50361,"ownership":[-79,-85,-89,-91,-86,-75,-59,-43,-31,-21,-15,-13,-16,-24,-36,-45,-50,-52,-51,-77,-77,-89,-99,-90,-76,-60,-45,-36,-25,-18,-15,-18,-26,-41,-54,-58,-53,-52,-65,-95,-97,-95,-99,-99,-51,-40,-29,-21,-16,-12,-7,-16,-29,-84,-56,-53,-50,-59,-40,-40,-95,-75,-99,-19,-37,-24,-16,-13,-12,-13,-16,-24,-28,-51,-51,-48,-38,-34,-37,-30,-34,-99,-56,-48,-23,-15,-11,-8,-8,-10,-14,-27,-44,-50,-45,-36,-39,-31,-34,-53,-55,-83,-93,-24,-13,-8,-6,-6,-7,-13,-22,-78,-47,-40,-3,-39,-39,-35,-36,-91,-91,-34,-8,-7,-4,-3,-4,-4,-7,-9,-21,-35,-31,42,55,-39,-39,-42,95,24,1,0,2,-1,-1,-1,-2,-4,-8,-12,-20,-21,73,91,74,62,95,96,42,13,6,5,3,2,0,-2,-4,-6,-11,-13,-12,77,75,75,96,68,47,29,20,15,11,8,6,3,-2,-5,-6,-5,-5,-4,70,70,68,63,52,44,35,28,22,18,15,14,11,-1,-8,-7,0,5,6,62,63,63,60,54,49,42,35,29,26,24,23,18,-2,-10,-7,3,18,19,53,59,61,59,56,52,46,40,36,32,32,32,38,-15,-14,-16,26,40,36,41,44,64,59,57,53,49,43,39,36,35,37,15,-1,-1,18,86,62,52,22,63,59,64,61,58,50,46,40,36,36,24,14,-8,-15,-4,43,74,67,-4,-15,91,91,92,74,60,51,42,37,41,76,6,-49,-50,-8,90,81,74,-34,-43,-80,-81,-81,92,92,92,43,31,32,10,-6,-49,86,87,80,78,77,-46,-66,-74,-78,-74,-76,-73,4,18,18,14,13,-13,-3,29,75,72,76,76,-60,-71,-75,-77,-74,-60,-24,-3,11,12,9,1,-6,-1,27,45,65,71,74],"ownershipAllowedMAE":0.0472269})%"); + lines.push_back(R"%({"sample":{"board":"...X...OO........../..X.XXOXXXX.OXX.OX./.X.XO.OXOXXO.OXXOX./.XXOO.OO.OXO.OOX.XX/OXOO....OOXX...OXXO/.OXX.OXXXXX.XXOOXO./..OXO.OXOO.XOOXOOO./.OOOOOXXXO...XXXXO./.O.O.OX.XOXXX..OXO./.XOX.XOOO.OOOX..XO./.XOX.XO.OOOOX..XOO./.XOOX.XO.OX.X.XO.O./X.X.XXOOO.X..X.OOO./OXXXOX..XX..X.XOXOX/OOOOOX....O.X.XX.X./OX.OXXXXX..O.XOXXX./.OOXOOOXOO..XXOOOX./OXXXXOOO.O.OXOO..OO/.X.XOOX.O...O....../","hintLoc":"null","initialTurnNumber":194,"metadata":"9EE2E235AF472FD380E0868526DBFD38:204","moveLocs":["O19","P19","N19","T14","L6","K7","F19","P7","M3","K5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":2.0,"policyOptimism":0.0,"pda":0.083,"policyMixture":[1.24e-05,4.64e-05,2.79e-05,0,6.64e-06,0,0.112,0,0,0.00245,1.98e-05,4.99e-05,0,0,0,0.000136,0.000242,0.0706,1.03e-05,2.21e-05,0.000137,0,0,0,0,0,0,0,0,0,0.00163,0,0,0,1.21e-05,0,0,4.78e-05,1.27e-05,0,0,0,0,0.168,0,0,0,0,0,0,0.000201,0,0,0,0,0,1.2e-05,0.0477,0,0,0,0,2.55e-05,0,0,0.00121,0,0,0,0.000184,0,0,0,0.000888,0,0,0,0,0,0,1.14e-05,2.79e-05,0.0824,8.45e-05,0,0,0,0,0.0346,0.00108,0.00517,0,0,0,0,0.0203,0,0,0,1.39e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.18e-05,1.04e-05,0,0,0,0.000109,0,0,0,0,3.46e-05,0,0,0,0,0,0,0,0.00266,1.87e-05,0,0,0,0,0,0,0,0,0,0.00527,1.45e-05,1.06e-05,0,0,0,0,0,1.43e-05,0.0245,0,0.0868,0,8.88e-05,0,0,2.11e-05,0,0,0,0,0,1.22e-05,1.16e-05,0,0,0,1.13e-05,0.0636,0,0,0,0.00211,0,0,0,0,7.52e-05,0,0,0,0,1.22e-05,0.000373,0,0,1.05e-05,1.12e-05,0,0,0,1.34e-05,0,0,4.23e-06,0,0,0,0,0,1.12e-05,0.000375,0,0,0,1.09e-05,3.18e-05,0,0,0,0,0.000179,0,0,3.1e-06,0,0,0.00172,0,1.11e-05,0,0,9.03e-06,0,1.51e-05,0,0,0,4.73e-06,0,0,0,0,0,0,0,0.00345,1.18e-05,0,0,0,0,0,0.0264,0,0,0,0,0,0,0.0935,0.000369,0,0,0,7.03e-05,0,9.82e-06,0,0,0,0,0,0,0,0,0,0,0,1.45e-05,1.38e-05,1.12e-05,0,0,0.000364,0,1.46e-05,0,0,4.27e-05,0,3.33e-05,0,0,1.42e-05,0,0,0,0,0,0,0.0206,0.000298,0,0.117,0,0,0,0,0,1.27e-05,1.44e-05,0,0,0,0,0,0,0,0,0,1.86e-05,0,0,0,0,0,0,0,0.000109,0,0,0,0,0,0,0,0,1.15e-05,0,1.27e-05,0,0,0,0,1.45e-05,1.3e-05,0,0,7.99e-06,0,0,0,0,0,0,1.08e-05,0,1.06e-05,1.19e-05,1.22e-05,0,1.22e-05,1.22e-05,1.25e-05,1.35e-05,1.26e-05,7.21e-06,1.62e-05],"winrateAvg":0.725405,"leadAvg":0.451406,"scoreMeanAvg":0.766582,"scoreStdevAvg":2.36073,"shorttermWinlossErrorAvg":0.184499,"shorttermScoreErrorAvg":0.453896,"ownership":[-99,-100,-100,-100,-97,100,100,100,99,0,-61,5,99,99,-99,-98,-97,-96,-98,-100,-99,-100,-100,-100,-99,100,-100,-100,-100,-100,-40,99,-99,-99,-98,-96,-99,-98,-99,-100,-100,-100,100,-1,100,-100,-13,-100,-100,100,98,100,-99,-99,-97,-99,-98,-70,-100,-100,100,100,98,100,100,-16,99,-100,100,21,100,100,-99,-99,-99,-99,99,-100,100,100,100,98,-45,74,100,99,-100,-100,-32,-44,99,100,-99,-99,-25,99,100,100,100,100,100,-100,-100,-100,-100,-100,-99,-100,-99,100,100,-99,100,-32,99,100,100,100,100,52,54,-100,100,100,-75,-100,-99,-99,-100,100,100,100,65,99,100,100,100,100,100,-100,-100,-100,100,2,-60,-100,-100,-100,-100,-100,100,99,-5,100,100,100,64,100,-100,-11,-100,100,-100,-100,-100,-100,-100,-99,-100,100,100,-5,-100,100,-99,-7,-100,100,100,100,99,100,100,100,-100,-100,-100,-100,100,100,-99,-100,100,-99,-99,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-99,-100,100,100,-100,-48,-53,100,100,100,-100,-8,-100,-100,-100,100,100,100,96,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-54,-88,-100,-100,100,100,100,13,100,-100,-100,-100,100,-100,70,6,-100,-100,98,-50,-100,-100,-100,100,-57,100,-78,100,100,100,100,100,-100,-43,-36,-92,-100,99,-36,-100,-100,-100,-100,-58,-100,-77,100,19,99,100,-100,-100,-100,-100,-100,51,77,100,35,-100,100,-100,-100,-100,-69,99,100,100,-99,100,100,100,-100,100,100,95,100,-100,-100,100,100,100,-100,8,99,-99,-99,-99,-99,100,100,100,100,100,100,100,-100,100,100,100,99,99,99,2,-99,8,-99,100,100,100,100,100,100,100,99,100,99,100,99,99,99,99],"ownershipAllowedMAE":0.0264724})%"); + lines.push_back(R"%({"sample":{"board":"....X.OX.XX......./...XO.OXXOX.XXOO../...XXO.XOO.XOXXO../..XOO.OO.O.XOOO.../..XOXO.....XXX..O./..XX.O.O.OOO..OOX./....XO..XXXOXXXOO./.....XX...O.OOXXX./...XXOX...OO....../..XOOOX.X.XO..O.X./..XO.O.OX.XXO.OX../XOOXOOO.O...X.OOX./.X.XXOXO.XO.X...X./..XXOO......XOO.../.XOO..X.XOOOOX.OO./XO.O..O.OXXOOX.XX./.XO..O.OX.XOX.X.../..O.....OX.X.X..../..........X.X...../","hintLoc":"null","initialTurnNumber":181,"metadata":"050F304FF57811DD3234D6A011F811D1:191","moveLocs":["K3","L2","K8","L8","K6","J3","H4","S5","A9","A7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.83,"xSize":18,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":-0.114,"policyMixture":[6.95e-05,7.73e-05,8.95e-05,0.00014,0,0.00787,0,0,0,0,0,7.65e-05,0.000174,0.0013,9.91e-05,7.92e-05,7.61e-05,7.09e-05,7.5e-05,7.51e-05,8.42e-05,0,0,8.44e-05,0,0,0,0,0,0.000105,0,0,0,0,7.99e-05,7.69e-05,7.52e-05,7.84e-05,7.4e-05,0,0,0,0.00419,0,0,0,9.3e-05,0,0,0,0,0,7.99e-05,7.66e-05,7.6e-05,7.4e-05,0,0,0,0.000102,0,0,7.5e-05,0,8.1e-05,0,0,0,0,0.000105,8.32e-05,7.83e-05,7.95e-05,7.6e-05,0,0,0,0,8.07e-05,7.91e-05,8.69e-05,8.31e-05,9.15e-05,0,0,0,0.000742,9.82e-05,0,7.5e-05,8.2e-05,8.82e-05,0,0,0.216,0,8.63e-05,0,0.000122,0,0,0,0.00158,0.00145,0,0,0,8.98e-05,8.63e-05,0.000112,0.000116,0.000949,0,0,0.000415,0.00135,0,0,0,0,0,0,0,0,0,0.000102,9.13e-05,0.000123,0.000148,0.00044,0.00141,0,0,0.000447,0.00175,0.000354,0,7.8e-05,0,0,0,0,0,0.000682,0.000122,0.000536,0.369,0,0,0,0,0.000121,0.0316,0.000261,0,0,8.16e-05,0.000104,0.000118,0.000537,0.000251,0.000114,0.000122,0.052,0,0,0,0,0,0.00218,0,0.00123,0,0,0.000109,0.000106,0,0.0126,0,0.000109,0,0.00539,0,0,7.5e-05,0,9.78e-05,0,0,0.00237,0,0,0,0.000109,0,0,0.000222,9.28e-05,0,0,0,0,0,0,0,8.18e-05,0,0,0,9.1e-05,0,0.000272,0,0,0,8.03e-05,0,0,8.07e-05,0,0,0,0,0,9.34e-05,0,0,0.00207,0,9.83e-05,9.53e-05,0.000108,0,8.29e-05,0.00793,0.0193,0,0,0,0,7.56e-05,7.55e-05,8.04e-05,0,7.92e-05,0.000109,0,0,0,9.78e-05,0.000443,0.0526,0.0139,0,0,0,7.81e-05,7.46e-05,0,7.45e-05,0,0,0,0,0,0,0.000177,0,0,0,0,0,0.00011,0,7.65e-05,7.52e-05,0,0,0,0,0,0,0,0,8.43e-05,0,0,0.000426,0.000232,0,0,7.85e-05,7.63e-05,0,7.71e-05,0,0,0.000132,0,0,0,0,0,7.68e-05,7.44e-05,8.39e-05,0.00077,0.172,0,7.61e-05,7.87e-05,8.07e-05,8.4e-05,0.000115,0,0,0,0,0,0,7.13e-05,7.28e-05,7.18e-05,7.42e-05,7.61e-05,7.88e-05,7.81e-05,7.7e-05,7.86e-05,8.16e-05,8.28e-05,0.000107,0.000453,6.69e-05,0,0,0,7.13e-05,7.21e-05,7.2e-05,7.24e-05,6.9e-05,4.98e-05],"winrateAvg":0.11304,"leadAvg":-2.93172,"scoreMeanAvg":-2.60855,"scoreStdevAvg":4.80846,"shorttermWinlossErrorAvg":0.223852,"shorttermScoreErrorAvg":1.50921,"ownership":[-96,-95,-93,-86,-83,82,99,-89,-90,-99,-99,-93,-69,-14,20,88,95,96,-97,-97,-96,-98,34,32,99,-89,-88,100,-100,-98,-99,-99,99,99,97,98,-97,-97,-97,-98,-98,99,96,-89,100,100,1,-100,98,-98,-98,99,99,99,-98,-99,-100,62,78,78,100,100,98,100,1,-100,98,98,98,98,99,99,-98,-99,-100,61,53,100,92,93,93,87,-49,-100,-100,-100,-57,-3,99,98,-98,-98,-100,-100,78,100,64,98,7,100,100,100,-14,-67,97,98,95,96,-97,-98,-98,-97,-99,100,-2,23,-77,-78,-77,100,-100,-100,-100,98,98,17,-97,-97,-98,-98,-99,-100,-100,-35,-45,34,100,99,100,99,-100,-100,-100,-48,-96,-97,-96,-100,-100,100,-100,-39,14,22,100,100,90,81,-14,10,-86,-95,-97,-97,-99,100,100,100,-100,-55,-99,-54,-98,100,91,77,99,59,-99,-98,-96,-97,-99,100,100,100,-21,89,-99,-9,-98,-98,88,-12,99,-97,-96,-96,-99,-97,-97,-98,100,100,100,89,100,100,-98,-95,-97,-8,99,99,-99,-82,-98,-98,-97,-98,-98,100,99,100,99,96,95,-34,-97,19,68,-14,-99,-49,-90,-88,-97,-97,100,100,99,99,99,100,58,9,-97,95,95,56,-4,0,-74,-89,100,100,99,99,98,99,98,99,99,100,100,-98,-25,82,81,-97,-74,52,50,100,99,99,100,100,100,-100,-100,100,100,-100,-63,-100,-100,-96,-1,-4,99,98,97,100,94,99,-20,-21,-100,99,-100,-100,-100,-100,-99,-98,52,50,99,97,95,94,83,61,70,-100,-100,-100,-100,-100,-100,-100,-99,-99,76,93,95,96,94,89,75,27,-9,-68,-100,-100,-100,-100,-100,-100,-99,-99],"ownershipAllowedMAE":0.0334123})%"); + lines.push_back(R"%({"sample":{"board":".................../.X...X.X.........../.OXXXOX....XO.OOX../..OOOOOXX..X.OXXX../.O.....OO.O......../.............O.O.X./......X.X..X......./...X...........OX../................X../..X................/.................../..O.X............../.................../...X.............../..OO.............../.OXO...O.......O.../.XXXOO.......O...../..X.XO............./.................../","hintLoc":"null","initialTurnNumber":1,"metadata":"65EFD7AEDEC7F082A4BFAED0E1496B9D:11","moveLocs":["H12","H13","A18","M15","P15","R6","R18","S18","R5","Q6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.4,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.518,"pda":0.0,"policyMixture":[5.47e-06,6.31e-06,6.52e-06,7.23e-06,6.7e-06,8.27e-06,0.000116,6.43e-06,6.27e-06,6.45e-06,6.23e-06,6.72e-06,7.61e-06,7.04e-06,9.27e-06,0.54,0.000157,7.6e-06,5.37e-06,0,0,0.000278,5.4e-06,7.38e-06,0,7.02e-05,0,9.91e-06,0.00395,2.79e-05,0.00223,3.1e-05,1.03e-05,1.91e-05,0.103,0,0,7.27e-06,5.4e-06,0,0,0,0,0,0,1.17e-05,0.000235,9.1e-05,4.7e-05,0,0,5.48e-06,0,0,0,9.41e-06,6.39e-06,5.16e-06,4.69e-06,0,0,0,0,0,0,0,0.00488,7.88e-06,0,5.85e-06,0,0,0,0,8.88e-06,6.07e-06,5.92e-06,0,5.32e-06,5.56e-06,5.7e-06,6.16e-06,6.4e-06,0,0,8.59e-06,0,0,8.09e-06,6.13e-06,0,6.59e-06,9.54e-06,0.00386,5.54e-06,6.35e-06,7.06e-06,9.24e-06,8.76e-06,1.08e-05,1.3e-05,8.51e-06,5.07e-06,5.79e-06,1.01e-05,5.72e-05,1.6e-05,1.75e-05,0,4.78e-06,0,7.38e-05,0,5.76e-06,6.82e-06,1.22e-05,1.31e-05,1.49e-05,4.96e-05,1.02e-05,0,0,0,1.34e-05,6.98e-05,0,0.000427,8.99e-06,1.01e-05,8.16e-06,5.2e-05,5.6e-05,5.78e-06,6.7e-06,1.28e-05,1.37e-05,0,5.3e-05,0.00153,1.27e-05,0,1.63e-05,0.000132,4.28e-05,4.84e-05,0.000115,5.61e-05,1.04e-05,0,0,6.58e-06,5.94e-06,6.53e-06,1.12e-05,1.12e-05,0.000531,0.00225,0.000632,1.41e-05,1.15e-05,1.58e-05,0.000117,0.000136,0.000111,0.0002,0.000737,6.06e-05,0.00048,0,6.7e-06,5.98e-06,6.52e-06,1.02e-05,0,2.66e-05,0.00229,0.000389,7.81e-05,0.000166,7.86e-05,0.000149,0.000125,0.000129,0.000122,0.000695,0.0489,1.57e-05,8.37e-06,8.4e-06,6.21e-06,6.61e-06,9.31e-06,1.4e-05,0.158,0.00025,9.01e-05,0.000318,0.000345,0.000191,0.000177,0.000174,0.000155,0.00014,0.000143,0.000434,3.27e-05,2.15e-05,1.02e-05,6.47e-06,6.78e-06,8.53e-06,0,8.85e-06,0,3.21e-05,0.0126,0.00364,0.00088,0.000233,0.000196,0.000172,0.000147,0.000114,8.03e-05,7.52e-05,0.000165,1.57e-05,6.5e-06,6.25e-06,7.58e-06,7e-06,8.86e-06,1.54e-05,3.02e-05,0.000152,0.000435,0.000836,0.000209,0.00019,0.000159,0.000223,0.000115,9.99e-05,1.02e-05,7.35e-06,8.37e-06,6.23e-06,6.65e-06,0.0565,1.28e-05,0,1.95e-05,1.52e-05,2.12e-05,3.43e-05,8.66e-05,9.62e-05,0.000131,0.000128,0.0102,0.00708,2.16e-05,0,0,0.000261,6.59e-06,8.39e-06,0.00127,0,0,7.14e-06,9.48e-06,8.82e-06,9.56e-06,1.47e-05,3.09e-05,6.57e-05,6.47e-05,0.0148,0.00592,3.72e-05,1.08e-05,0,0.000263,8.65e-06,9.54e-06,0,0,0,5.83e-06,6.08e-06,6.36e-06,0,9.55e-06,1.51e-05,2.69e-05,7.34e-05,0.000103,1.82e-05,1.07e-05,0,7.17e-06,1.61e-05,6.55e-06,8.16e-06,0,0,0,0,0,6.59e-06,7.47e-06,9.13e-06,1.2e-05,1.38e-05,1.5e-05,1.09e-05,0,7.92e-06,7.71e-06,7.72e-06,7.13e-06,5.72e-06,8.15e-06,6.2e-06,0,5.88e-06,0,0,6.33e-06,8.57e-06,8.95e-06,9.46e-06,9.81e-06,9.91e-06,9.43e-06,7.5e-06,7.52e-06,6.82e-06,6.92e-06,6.28e-06,5.7e-06,6.03e-06,7.57e-06,6.12e-06,6.55e-06,1.13e-05,6.93e-06,6.66e-06,6.88e-06,6.58e-06,6.35e-06,6.1e-06,5.93e-06,5.86e-06,6.15e-06,5.87e-06,5.77e-06,5.42e-06,5.74e-06,5.25e-06,6.77e-06],"winrateAvg":0.343691,"leadAvg":-1.24437,"scoreMeanAvg":-2.08286,"scoreStdevAvg":13.2854,"shorttermWinlossErrorAvg":0.11757,"shorttermScoreErrorAvg":0.914504,"ownership":[8,-30,-54,-62,-81,-87,-88,-84,-75,-58,-38,-15,26,50,60,62,22,1,-45,83,-51,-44,-85,-89,-94,-92,-95,-75,-57,-62,-18,13,58,69,46,49,-75,-63,83,89,-90,-90,-89,93,-93,-89,-65,-59,-53,-94,78,74,79,80,-88,-76,-74,87,90,94,94,94,94,92,-91,-92,-12,-33,-94,-22,81,-90,-91,-91,-80,-72,80,94,62,44,36,42,50,59,58,11,35,-94,-52,70,79,10,-23,-57,-70,60,50,26,15,3,-25,0,-28,-21,-22,-8,-38,-3,81,57,75,-9,-87,-68,28,20,11,-17,-11,-36,-90,-90,-90,-30,-17,-85,-11,21,20,16,-26,-65,-69,3,-5,-30,-79,-32,-27,-38,12,-35,-12,-15,-19,-7,8,16,54,-91,-77,-66,-14,-18,-28,-25,-25,-27,-25,-15,-16,-9,-6,-7,-1,9,1,-14,-91,-70,-62,-13,-20,-55,15,-26,-42,-19,-11,-9,-6,-6,-5,-4,1,3,-24,-47,-56,-53,6,7,5,43,6,-18,-11,-8,-6,-5,-5,-5,-4,-3,-4,-20,-34,-46,-43,31,28,77,12,-47,-6,5,-1,-2,-4,-4,-5,-5,-5,-9,-20,-29,-33,-33,48,47,35,15,-1,4,5,-1,-2,-3,-4,-6,-6,-6,-7,-27,-38,-43,-17,48,71,58,-20,13,6,11,8,1,-1,-2,-6,-12,-4,-15,-75,-74,6,0,22,10,91,91,33,21,19,15,-2,4,3,0,2,9,0,-7,78,42,27,-41,13,-84,92,73,47,37,81,18,14,12,12,17,27,25,87,62,56,42,-62,-84,-84,-83,92,91,53,43,28,20,20,21,30,87,63,65,49,52,47,-65,-72,-84,-63,-68,91,41,44,32,27,26,30,42,56,59,56,54,50,49,-67,-62,-76,-66,-52,-40,36,29,30,26,25,29,39,49,53,54,53,53,51],"ownershipAllowedMAE":0.0393472})%"); + lines.push_back(R"%({"sample":{"board":".................../......X.X........../..OX.....O........./..OX..O.........X../.OXX.............../..OX.............../..OO.O............./.................../.................../.................../.................../.................../.................X./.XO.............X../..XOO..........O.../.X.XO.O........OX../..XXX..........OX../.................../.................../","hintLoc":"null","initialTurnNumber":37,"metadata":"F00F1AC08225C2C2C99F9B3336DA67C9:47","moveLocs":["J17","F17","P16","P17","O17","Q17","O16","Q14","P7","H17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.82,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1e-05,1.07e-05,1.11e-05,1.02e-05,1.02e-05,1.07e-05,9.96e-06,1.12e-05,1.02e-05,1.02e-05,1.11e-05,1.2e-05,1.26e-05,1.4e-05,1.41e-05,1.51e-05,1.32e-05,1.26e-05,1.06e-05,9.53e-06,1.12e-05,1.57e-05,7.02e-05,3.17e-05,1.05e-05,0,1.33e-05,0,0.00164,1.6e-05,1.41e-05,1.85e-05,2.7e-05,0.00055,1.47e-05,3.09e-05,1.54e-05,1.24e-05,9.94e-06,1.03e-05,0,0,1.27e-05,0,1.29e-05,0,0,0,1.51e-05,1.85e-05,1.15e-05,0,0,0,1.25e-05,2.77e-05,1.26e-05,1.01e-05,9.8e-06,0,0,1.13e-05,1.34e-05,0,0.824,1.66e-05,1.33e-05,1.96e-05,1.84e-05,1.23e-05,0,0,0.000204,0,1.76e-05,1.31e-05,9.42e-06,0,0,0,1.05e-05,1.36e-05,1.37e-05,1.73e-05,6.78e-05,5.66e-05,2.66e-05,2.16e-05,1.75e-05,1.34e-05,1.31e-05,5.17e-05,0.0494,3.86e-05,1.27e-05,1.09e-05,9.96e-06,0,0,1.38e-05,1.36e-05,1.74e-05,1.89e-05,3.13e-05,5.55e-05,4.67e-05,5.18e-05,8.88e-05,0.000138,0.000114,0,0.000133,0.000138,1.27e-05,1.11e-05,1.02e-05,0,0,1.21e-05,0,1.55e-05,2.01e-05,2.71e-05,4.81e-05,6.31e-05,9.1e-05,0.000274,0.000389,0.00594,0.000194,9.37e-05,0.000107,1.34e-05,1.11e-05,1.15e-05,1.07e-05,1.09e-05,1.25e-05,1.44e-05,1.71e-05,2.08e-05,2.56e-05,4.66e-05,7.37e-05,0.000101,0.00019,0.00035,0.00088,0.0192,0.00486,5.6e-05,1.36e-05,1.16e-05,1.3e-05,1.37e-05,1.47e-05,1.53e-05,1.73e-05,1.92e-05,2.18e-05,3.13e-05,7.01e-05,9.64e-05,0.000116,0.000146,0.000207,0.000294,0.000509,0.000209,2.5e-05,1.3e-05,1.17e-05,1.47e-05,1.69e-05,1.7e-05,1.74e-05,1.86e-05,2.05e-05,2.38e-05,5.82e-05,0.000102,0.000123,0.000127,0.000122,0.000163,0.000198,0.000217,0.000167,2.08e-05,1.26e-05,1.16e-05,1.6e-05,1.91e-05,1.85e-05,1.86e-05,1.98e-05,2.16e-05,3.23e-05,8.62e-05,0.000134,0.000149,0.000124,8.19e-05,0.000106,9.13e-05,8.73e-05,7.47e-05,1.92e-05,1.23e-05,1.13e-05,1.76e-05,3.68e-05,2e-05,1.88e-05,1.98e-05,2.18e-05,4.51e-05,0.000106,0.000167,0.000187,0.000142,7.53e-05,2.36e-05,1.83e-05,3.37e-05,0.00104,1.88e-05,1.1e-05,9.91e-06,1.45e-05,0.0591,4.34e-05,1.78e-05,1.77e-05,2.04e-05,3.38e-05,0.000109,0.000196,0.000203,0.000127,2.75e-05,1.56e-05,0,1.64e-05,1.65e-05,0,1.2e-05,1.1e-05,0,0,1.56e-05,1.24e-05,1.38e-05,1.75e-05,2.68e-05,0.000101,0.000186,0.000171,7.58e-05,2.22e-05,1.55e-05,1.24e-05,4.5e-05,0,1.73e-05,1.58e-05,1.2e-05,0.000235,0,0,0,1.14e-05,1.54e-05,2.24e-05,0.000215,0.000919,0.000236,5.7e-05,2.06e-05,1.6e-05,1.1e-05,0,0.000304,1.58e-05,1.63e-05,9.97e-06,0,0,0,0,1.1e-05,0,2.19e-05,0.000235,0.0097,0.000318,8.78e-05,2e-05,1.53e-05,1.02e-05,0,0,1.66e-05,1.2e-05,9.84e-06,9.7e-06,0,0,0,6.94e-05,1.91e-05,0.000168,0.000194,0.000172,0.000109,4.65e-05,2.04e-05,1.64e-05,1.06e-05,0,0,1.8e-05,1.29e-05,9.83e-06,9.39e-06,9.7e-06,9.49e-06,1.15e-05,1.68e-05,3.85e-05,4.95e-05,2.05e-05,2.02e-05,1.99e-05,1.88e-05,1.8e-05,1.44e-05,4.11e-05,7.16e-05,0.00717,1.35e-05,1.38e-05,9.81e-06,9.9e-06,1.02e-05,1.08e-05,1.09e-05,1.17e-05,1.27e-05,1.26e-05,1.23e-05,1.22e-05,1.24e-05,1.23e-05,1.2e-05,1.16e-05,1.21e-05,1.41e-05,1.31e-05,1.22e-05,1.06e-05,1.1e-05],"winrateAvg":0.230937,"leadAvg":-2.50931,"scoreMeanAvg":-3.73457,"scoreStdevAvg":12.6851,"shorttermWinlossErrorAvg":0.0695379,"shorttermScoreErrorAvg":0.645959,"ownership":[54,33,11,-29,-62,-82,-85,-81,-67,-47,-16,16,30,21,-16,-41,-64,-70,-73,67,67,29,-39,-77,-86,-93,-83,-87,-78,0,23,45,23,-17,-72,-72,-75,-75,74,76,86,-90,-70,-90,17,-87,85,84,68,33,48,82,-85,-86,-81,-79,-75,80,85,86,-90,-27,15,79,75,56,45,38,36,35,81,81,29,-90,-75,-70,82,88,-90,-90,-24,3,30,36,28,28,25,17,11,18,10,-18,-39,-66,-59,80,75,94,-89,-3,14,22,21,23,22,19,14,9,-24,-22,-85,-57,-48,-44,69,76,95,94,37,87,22,20,20,18,15,11,9,-6,-11,-34,-43,-34,-28,50,53,45,42,30,30,21,17,17,15,13,10,9,7,-1,-11,-10,-15,-14,29,26,22,26,21,20,16,14,14,13,11,9,7,5,0,-5,-8,-9,-8,9,15,20,23,21,19,16,14,13,12,10,8,5,5,2,-1,-6,-9,-10,-11,4,18,23,21,19,16,14,12,11,9,7,4,5,5,-1,-5,-16,-17,-27,-21,15,25,22,20,17,14,12,10,9,7,5,3,16,8,18,-25,-36,-53,-7,17,25,21,20,16,13,11,11,9,8,10,16,78,20,-6,-85,-53,-63,-88,43,35,34,20,18,12,9,9,7,9,10,20,42,12,-86,-78,-70,-84,-90,-94,81,80,36,22,13,4,10,8,11,14,20,44,86,25,-78,-73,-92,-98,-94,-99,80,27,77,20,14,22,5,13,18,24,45,85,-84,-80,-75,-95,-96,-99,-98,-98,-3,18,-5,11,11,13,18,19,29,51,86,-84,-70,-70,-94,-90,-93,-88,-66,-23,-8,-1,1,8,13,19,27,31,56,24,-23,-61,-63,-91,-88,-81,-72,-53,-26,-6,-1,3,7,12,19,27,36,35,21,-10,-26,-50],"ownershipAllowedMAE":0.0274518})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.....O......X....../...X....O..X...X.../...XOOO......O...../...X..XX........O../...XO.OX.........../...XO.OX..X......../.OXOX.OXX........../.OOO.XXOOOO.X....../.X.X.XO.OXX......../......O..XOOXXOO.../..XXX.OX.XXXO.OX.../.XXOOO.X...OOO...../..O.......XXXOXX.../.O.O.OXX..XOXXOOO../.XXO.XO.OO.OOO...../.X.X.XO............/.................../","hintLoc":"null","initialTurnNumber":109,"metadata":"03761234E9A313EB5E00E27FB70C00C0:119","moveLocs":["C9","B8","B13","C12","B12","B15","M10","M9","M12","M13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.89,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":6.0,"policyOptimism":0.038,"pda":0.0,"policyMixture":[1.86e-06,2.53e-06,2.77e-06,2.96e-06,2.86e-06,2.62e-06,2.23e-06,2.23e-06,2.23e-06,2.24e-06,2.17e-06,2.1e-06,2.11e-06,2.1e-06,2.05e-06,2.05e-06,2.05e-06,2.09e-06,1.79e-06,2.43e-06,6.11e-06,0.000104,0.0327,8.8e-05,3.56e-06,2.93e-06,2.81e-06,3.13e-06,3.14e-06,2.93e-06,2.98e-06,2.78e-06,2.88e-06,2.83e-06,2.74e-06,2.72e-06,2.72e-06,2.1e-06,2.67e-06,8.51e-06,0.000212,0.000181,7.97e-06,0,2.67e-06,2.74e-06,2.79e-06,5.28e-06,4.42e-06,2.62e-06,0,3.1e-06,3.01e-06,2.69e-06,2.84e-06,2.7e-06,2.09e-06,2.93e-06,3.26e-05,1.62e-05,0,3.05e-06,2.21e-06,2.35e-06,2.39e-06,0,2.99e-06,3.38e-06,0,2.77e-06,2.56e-06,2.99e-06,0,2.89e-06,2.93e-06,2.11e-06,3.97e-06,0,8.45e-06,0,0,0,0,3.19e-06,4.17e-06,1.1e-05,1.16e-05,4.02e-06,2.77e-06,0,2.8e-06,3.02e-06,2.57e-06,2.74e-06,2.03e-06,3.01e-06,0.00333,2.87e-06,0,0.000254,4.45e-05,0,0,5.22e-06,0.000159,2.15e-05,8.96e-06,3.18e-06,2.71e-06,2.86e-06,2.57e-06,0,2.58e-06,2.06e-06,2.65e-06,0,2.09e-06,0,0,3.63e-05,0,0,2.93e-06,6.81e-05,0.00719,0,1.43e-05,3.3e-06,2.98e-06,2.67e-06,2.54e-06,2.62e-06,1.97e-06,2.08e-06,0,0,0,0,2.73e-06,0,0,2.3e-06,0.000142,0,0,0.000801,3.78e-06,3.1e-06,2.93e-06,2.9e-06,2.74e-06,2.01e-06,1.98e-06,0,0,0,0,0.000312,0,0,0,3.55e-06,4.12e-06,2.61e-05,0.705,4.09e-06,3.21e-06,3e-06,2.87e-06,2.74e-06,2.03e-06,3.81e-06,0,0,0,0.00216,0,0,0,0,0,0,0,0,3e-05,3.33e-06,2.95e-06,2.73e-06,2.68e-06,2.01e-06,4.53e-06,0,0,0,0.0666,0,0,2.32e-06,0,0,0,0,4.45e-06,8.11e-06,2.83e-06,2.45e-06,2.65e-06,2.54e-06,2e-06,2.61e-06,0,0.000658,0.00261,0.00152,0.0281,0,2.91e-06,2.95e-06,0,1.99e-06,2.08e-06,0,0,0,0,2.55e-06,2.54e-06,2.01e-06,1.91e-05,2.06e-06,0,0,0,2.79e-05,0,0,2.63e-06,0,0,0,0,2e-06,0,0,2.31e-06,2.39e-06,1.98e-06,3.45e-06,0,0,0,0,0,5.86e-06,0,2.54e-06,2.83e-06,5.48e-06,0,0,0,2.32e-06,2.3e-06,2.28e-06,2.24e-06,1.94e-06,0.00185,0.131,0,2.24e-06,3.49e-06,2.52e-06,7.63e-05,8.49e-06,7.53e-06,3.15e-06,0,0,0,0,0,0,2.34e-06,2.11e-06,1.91e-06,1.18e-05,0,0.000333,0,0.000277,0,0,0,3.04e-06,2.44e-06,0,0,0,0,0,0,0,2.2e-06,1.98e-06,2.38e-05,0,0,0,0.0114,0,0,2.3e-06,0,0,2.3e-06,0,0,0,1.96e-06,1.89e-06,1.97e-06,2.13e-06,1.83e-06,5.42e-06,0,4.52e-05,0,0.00145,0,0,1.97e-06,2.1e-06,2.1e-06,2.08e-06,2.06e-06,1.97e-06,1.92e-06,1.94e-06,2.01e-06,1.94e-06,1.92e-06,1.85e-06,1.92e-06,3.04e-06,1.89e-05,0.000218,3.33e-05,0.000958,4.73e-06,1.95e-06,1.98e-06,1.92e-06,1.81e-06,1.92e-06,1.81e-06,1.78e-06,1.72e-06,1.73e-06,1.71e-06,1.81e-06,1.68e-06,3.47e-06],"winrateAvg":0.829455,"leadAvg":5.47528,"scoreMeanAvg":7.08344,"scoreStdevAvg":17.2886,"shorttermWinlossErrorAvg":0.178575,"shorttermScoreErrorAvg":2.99296,"ownership":[-61,-58,-49,-29,8,30,44,40,28,8,-13,-33,-43,-43,-38,-33,-28,-24,-20,-67,-64,-62,-41,-40,60,52,46,29,10,-14,-34,-53,-44,-39,-34,-28,-20,-17,-68,-70,-66,-40,6,81,59,53,43,14,0,-42,-85,-27,-38,-35,-26,-16,-12,-71,-69,-72,-85,-8,49,66,54,78,13,-26,-85,-38,-18,-22,-72,-20,-9,-6,-67,-81,-71,-85,88,87,87,2,14,-6,-19,-37,-20,35,-6,-9,-14,2,4,-59,-47,-66,-85,-14,56,-74,-74,-20,-23,-38,-43,-27,-4,-2,-5,54,21,12,-44,-28,-58,-84,80,64,78,-72,-35,-26,-39,-77,-22,-4,3,3,10,19,15,-38,-29,-83,-83,81,48,78,-71,-47,-20,-54,74,-28,12,13,10,11,15,14,-37,-30,-84,-27,-76,-39,81,-71,-71,10,25,72,83,41,23,16,17,18,15,-48,-31,-26,-24,-50,-79,-76,88,89,89,89,90,-13,46,13,20,20,22,20,-52,-75,-24,-53,-42,-79,88,82,89,-91,-91,-91,-16,-32,12,36,39,34,28,-65,-77,-48,-38,-47,-23,87,-40,20,-91,-90,-86,-85,-83,91,91,53,43,39,-64,-68,-78,-78,-80,37,87,-90,-63,-91,-91,-90,83,14,91,60,66,56,49,-37,-75,-76,86,86,86,-12,-91,-75,-74,4,84,84,85,71,71,67,62,59,21,44,81,80,64,25,1,-65,-65,-61,-82,-82,-83,84,62,61,68,72,68,16,72,14,85,50,67,-83,-84,-2,15,-81,95,-83,-82,97,97,97,77,76,-41,-92,-91,84,21,-82,83,-17,90,90,-15,96,96,97,93,92,88,87,80,-87,-91,-90,-88,-72,-82,83,71,80,86,87,89,93,92,92,90,88,84,83,-89,-90,-90,-86,-77,-47,-31,43,67,80,85,89,90,91,90,89,88,86,85],"ownershipAllowedMAE":0.0386898})%"); + lines.push_back(R"%({"sample":{"board":".................../.......OO.....X..../..XO.X.XOX.O.XO..../..XO..X.XOX....O.../.XO.....X........../.O..............O../...............XO../.................../..X............O.../..........X....XO../.........X.X.X...../.........XXO.XOO.../.........OO.OOXX.../..OO...O........X../..X..OOX.........X./..OXOXOX.XXOOOOOOX./...OOXX.XXOXXXOXXX./.......XOXO.X.XOO../...........OOX.XO../","hintLoc":"null","initialTurnNumber":60,"metadata":"F437D745426AAC0F7A1A82AF9A600B68:70","moveLocs":["C14","D15","B16","C12","C13","D12","B12","O16","D11","R8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.5,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":8.5,"policyOptimism":0.63,"pda":-0.05,"policyMixture":[5.89e-06,6.19e-06,6.83e-06,6.5e-06,6.46e-06,7.16e-06,6.8e-06,6.15e-06,5.84e-06,6.1e-06,6.78e-06,7.17e-06,7.18e-06,7.85e-06,6.53e-06,7.55e-06,6.64e-06,6.73e-06,5.89e-06,6.07e-06,6.3e-06,6.95e-06,7.38e-06,7.93e-06,8.69e-06,2.01e-05,0,0,0.142,0.000128,5.85e-05,6.23e-05,0.00734,0,2.68e-05,1.22e-05,8.05e-06,6.82e-06,5.87e-06,6.14e-06,0,0,7.1e-06,0,6.52e-06,0,0,0,0.0507,0,0.0441,0,0,0.00808,0.000193,8.76e-06,6.48e-06,6e-06,0,0,0,6.37e-06,7.06e-06,0,5.98e-06,0,0,0,0.0248,0.0161,0,1.11e-05,0,1.1e-05,8.6e-06,6.39e-06,6.05e-06,0,0,0,7.12e-06,8.13e-06,7.7e-06,6.26e-06,0,0.000204,1.3e-05,5.78e-05,3.91e-05,8.4e-05,3.4e-05,1.39e-05,1.29e-05,8.83e-06,6.44e-06,8.11e-06,0,0,8.22e-06,1.07e-05,8.72e-06,8.78e-06,8.21e-06,8.62e-06,1.05e-05,2.97e-05,3.54e-05,2.53e-05,1.05e-05,8.76e-06,9.53e-06,0,8.38e-06,6.61e-06,7.56e-06,1.85e-05,0,1.04e-05,1.72e-05,9.95e-06,9.76e-06,9.71e-06,9.93e-06,1.13e-05,1.34e-05,2.83e-05,3.24e-05,2e-05,8.17e-06,0,0,8.33e-06,6.53e-06,6.27e-06,0,0,0,0.0214,2.71e-05,1.1e-05,1.05e-05,1.01e-05,1.01e-05,1.06e-05,1.14e-05,1.71e-05,2.04e-05,1.07e-05,0.00378,5.66e-05,8.43e-06,6.62e-06,6.85e-06,8.02e-06,0,0,2.88e-05,3.83e-05,2.03e-05,1.09e-05,9.39e-06,8.45e-06,8.12e-06,8.89e-06,1e-05,1.9e-05,0.103,0,0.208,8.79e-06,6.8e-06,6.53e-06,1e-05,7.58e-06,7.72e-06,1.73e-05,0.000101,7.31e-05,1.15e-05,8.65e-06,6.64e-06,0,6.56e-06,8.58e-06,1.07e-05,0.00724,0,0,3.17e-05,6.91e-06,6.68e-06,8.98e-06,1.11e-05,1.67e-05,2.33e-05,7.07e-05,9.6e-05,1.97e-05,7.67e-06,0,5.4e-06,0,7.01e-06,0,4.26e-05,2.71e-05,2e-05,6.94e-05,6.93e-06,6.82e-06,9.41e-06,1.46e-05,1.22e-05,1.42e-05,2.44e-05,5e-05,4.57e-05,9.41e-06,0,0,0,8.53e-05,0,0,0,0,7.97e-05,7.04e-06,6.73e-06,8.97e-06,8.43e-06,8.09e-06,9.29e-06,1.05e-05,1.19e-05,1.58e-05,1.66e-05,0,0,2.32e-05,0,0,0,0,1.13e-05,0.028,6.72e-06,6.79e-06,8.67e-06,0,0,1.42e-05,1.15e-05,3.93e-05,0,1.3e-05,8.09e-06,7.97e-06,0.000131,1.35e-05,4.15e-05,7.95e-06,6.6e-06,0,6.19e-06,7.16e-06,6.83e-06,2.2e-05,0,2e-05,0.000542,0,0,0,6.46e-06,6.6e-06,7.54e-06,8.83e-06,7.23e-06,6.89e-06,7.18e-06,7.26e-06,6.72e-06,0,6.49e-06,6.35e-06,0.00018,0,0,0,0,0,0,5.93e-06,0,0,0,0,0,0,0,0,0,6.22e-06,6.39e-06,7.09e-06,8.71e-05,0,0,0,0,5.87e-06,0,0,0,0,0,0,0,0,0,0,6.66e-06,6.39e-06,7.53e-06,7.42e-06,8.38e-06,8.9e-06,7.51e-06,6.79e-06,0,0,0,0,8.69e-06,0,9.42e-06,0,0,0,0.329,6.74e-06,5.91e-06,6.45e-06,7.1e-06,7.44e-06,7.07e-06,7.15e-06,6.61e-06,6e-06,7.99e-06,0.000129,0.000151,0,0,0,6.37e-06,0,0,0.0011,6.43e-06,6.99e-06],"winrateAvg":0.616734,"leadAvg":1.3578,"scoreMeanAvg":1.48888,"scoreStdevAvg":11.585,"shorttermWinlossErrorAvg":0.210961,"shorttermScoreErrorAvg":1.64304,"ownership":[-83,-77,-71,-60,-51,-47,-36,-28,-20,-13,-1,14,16,15,16,12,15,17,21,-86,-86,-76,-61,-65,-50,-41,-12,-9,-30,5,19,18,18,-5,21,14,22,25,-89,-91,-96,-40,-62,-90,-57,-80,-9,-68,-25,55,18,-2,79,19,21,31,30,-91,-96,-96,-38,-59,-67,-93,-74,-93,-44,-74,1,17,75,66,87,46,45,40,-93,-96,-40,-37,-55,-55,-57,-53,-93,-55,-30,-7,5,14,27,40,55,56,53,-93,-88,-92,-59,-57,-48,-45,-40,-40,-30,-21,-9,0,10,18,34,90,71,61,-90,-86,-92,-52,-52,-43,-36,-32,-30,-24,-18,-12,-5,2,9,-16,90,71,62,-79,-92,-34,-33,-52,-33,-29,-26,-25,-23,-21,-14,-9,-2,7,19,39,61,57,-66,-58,-89,-89,-31,-22,-21,-21,-22,-23,-33,-19,-14,-4,-1,74,42,56,53,-41,-37,-33,-24,-16,-14,-12,-14,-18,-44,-89,-45,-20,-5,27,-1,77,53,49,-17,-10,-7,-8,-2,-2,-6,-5,-28,-89,-83,-86,-48,-67,4,41,47,50,40,9,12,1,10,8,6,3,-6,-12,-89,-89,80,-12,-67,81,81,81,41,20,34,37,39,37,24,20,19,14,21,88,88,72,92,91,-38,-38,21,-13,-11,53,68,97,97,51,43,31,65,0,11,18,30,62,38,14,-15,-60,-38,-37,67,74,70,90,74,86,85,-96,-27,-39,-18,24,62,60,38,29,-5,-62,-51,73,75,92,85,97,-95,85,-97,-74,-99,-98,94,94,94,94,94,94,-60,-57,76,79,82,97,97,-95,-97,-97,-99,-99,52,46,46,47,93,-65,-64,-61,-52,77,76,74,87,19,1,-85,-98,-94,-99,54,51,46,56,55,52,54,-49,-38,76,73,68,37,23,-33,-64,-91,-94,-46,13,59,61,55,58,54,54,9,-18],"ownershipAllowedMAE":0.0380643})%"); + lines.push_back(R"%({"sample":{"board":"..........OXX....../OOOOXO...XOOXX...../OOOXOOXX...OOX.XX../XOXXXOXOO.O..OXOO../XXXXOOO.OO...OXXX../XOOXXXOOXO..OOOOXXX/XXO..XXOXOX.XOXOXOX/.XOOOOOXX.OXXOXXOOO/.XXXXXXOOOOOXO..OO./XO.....XXXOX.XO..../..OX..X.OXOX.X...../.O.XO..XXOOOXX...../X.OOX.XOO.O.OXO.O../..OX...XOXXOOXO..O./.OOX...XO.OOXOOXXO./.XOX.XX.XOOXXXOXO.O/.XXXX...XXOOX.XOOOO/.....XXXOOOXXOXXXO./........X.OOXX..XXO/","hintLoc":"null","initialTurnNumber":247,"metadata":"DDCD83F8C04F96A1923F466CEBD0E3BA:257","moveLocs":["K12","D13","H12","E13","T2","H1","K1","Q7","R6","T5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.47,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.0,"pda":1.57,"policyMixture":[4.85e-06,4.71e-06,4.72e-06,4.29e-06,4.83e-06,4.5e-06,4.69e-06,4.57e-06,4.61e-06,4.71e-06,0,0,0,4.36e-06,4.16e-06,3.93e-06,3.91e-06,3.95e-06,4.19e-06,0,0,0,0,0,0,4.7e-06,4.73e-06,4.66e-06,0,0,0,0,0,0.000158,4.54e-06,4.19e-06,4.11e-06,4.23e-06,0,0,0,0,0,0,0,0,5.01e-06,5.27e-06,4.51e-06,0,0,0,0.000174,0,0,4.07e-06,4.17e-06,0,0,0,0,0,0,0,0,0,4.75e-06,0,4.63e-06,4.42e-06,0,0,0,0,4.17e-06,4.38e-06,0,0,0,0,0,0,0,4.2e-06,0,0,4.68e-06,4.7e-06,4.12e-06,0,0,0,0,4.83e-06,4.55e-06,0,0,0,0,0,0,0,0,4.43e-06,0,4.68e-06,4.07e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.44e-06,0,0,4.37e-06,0,0,0,0,0,0,0,4.46e-06,0,0,0,0,0,0,0,4.18e-06,0,0,0,0,0,0,0,0,0,0,2.87e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,4.71e-06,4.9e-06,0,0,4.33e-06,0,0,3.43e-05,0.000164,1.85e-05,1.21e-05,0.000241,0,0,0,0,0,5.35e-06,0,0,5.04e-06,4.99e-06,4.75e-06,4.86e-06,0.000128,5.37e-06,0,0,0.000133,5.61e-06,0,2.21e-05,0,0,0,0,4.61e-06,0,2.28e-05,1.07e-05,8.02e-06,5.99e-06,4.65e-06,2.34e-05,0,4.2e-05,0,0,3.2e-05,0.000257,0,0,0,0,0,0,0,9.29e-05,9.83e-05,1.87e-05,9.09e-06,4.7e-06,0,0.000479,0,0,0,1.46e-05,0,0,0,4.38e-06,0,5.55e-06,0,0,0,0,0,6e-06,5.74e-06,0.000744,6.16e-06,0,0,4.5e-06,4e-06,5.43e-06,0,0,0,0,0,0,0,0,0.437,0,0,0.312,8.73e-06,0,0,0,4.12e-06,3.81e-06,4.27e-06,0,0,4.24e-06,0,0,0,0,0,0,0,0,0,4.92e-06,0,0,0,4.29e-06,0,0,1.95e-05,0,0,0,0,0,0,0,0,0,0.245,0,4.32e-06,0,0,0,0,4.05e-06,4.09e-06,1.95e-05,0,0,0,0,0,8.84e-06,0,0,0,0,0,4.01e-06,4.14e-06,4.14e-06,4.06e-06,4.33e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.07e-06,4.12e-06,4.03e-06,4.05e-06,4.09e-06,4.36e-06,4.31e-06,0,0,0,0,0,0,0,0.0015,4.53e-06,0,0,0,8.48e-05],"winrateAvg":0.998297,"leadAvg":24.876,"scoreMeanAvg":24.5268,"scoreStdevAvg":2.12302,"shorttermWinlossErrorAvg":0.00760931,"shorttermScoreErrorAvg":0.865137,"ownership":[97,96,94,93,93,91,89,89,89,89,100,-100,-100,-95,-93,-93,-92,-92,-93,100,100,100,100,91,100,89,88,87,81,100,100,-100,-100,-94,-94,-94,-92,-92,100,100,100,-100,100,100,85,84,88,88,90,100,100,-100,-97,-100,-100,-94,-92,-100,100,-100,-100,-100,100,87,100,100,90,100,90,91,100,-100,-92,-91,-92,-93,-100,-100,-100,-100,100,100,100,97,100,100,89,89,91,100,-100,-100,-100,-94,-94,-100,100,100,-100,-100,-100,100,100,97,100,89,89,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,97,100,87,90,90,100,90,100,-100,100,-100,-96,-100,100,100,100,100,100,100,98,100,100,91,90,100,88,87,100,100,100,-93,-100,-100,-100,-100,-100,-100,100,100,100,100,100,90,100,91,91,100,100,93,-98,-85,-92,-91,-91,-91,-94,-100,-100,-100,100,92,92,90,100,88,89,90,90,-91,-88,-85,-99,-91,-91,-100,-94,-92,-100,100,92,91,89,92,89,89,89,90,-89,-84,-90,-99,-86,-91,-93,-100,-100,100,100,100,90,90,92,90,89,90,90,-98,-90,-85,-85,-99,-90,-100,100,100,93,100,96,100,91,100,87,100,92,91,-90,-90,-86,-100,-90,-91,-91,-100,100,92,93,100,100,91,100,99,100,100,95,-91,-86,-85,-100,-91,-91,-91,-100,100,93,100,100,-100,100,100,94,94,100,92,-91,-100,-85,-100,-93,-100,-100,-95,-100,100,100,-100,-100,-100,100,95,100,96,99,-92,-100,-100,-100,-100,-95,-94,-95,-100,-100,100,100,-100,-97,-100,100,100,100,99,-92,-91,-92,-92,-93,-100,-100,-100,100,100,100,-100,-100,-96,-100,-100,-100,100,100,-92,-91,-91,-92,-93,-94,-96,-100,-100,100,100,100,-100,-100,-98,-98,-100,-100,100],"ownershipAllowedMAE":0.0419818})%"); + lines.push_back(R"%({"sample":{"board":"...........X.XXOO../..XX.XO...OXX.XXO../.X.X..XO..OOXXOOO../X.XOOOXX..OX.O.OX../.XXXOXX...OXXXXO.../X...XO.OXOOOXOOX.../X.XXXO.XOOXX.XO..../OXXXOOX.XX..XOO.O../OOOOOOOO..OOX.XO.../...OXXXOO.OXX....../XXXXX..X.O.O......./XO.XOOX.XXOO....O../.OOXXO.X.XO....O.O./O.O.XOOOOXO..OOXO../.O..XXO.XOOO.XXXXO./OXOOXOOOXXO..X...X./XXXOOXXOX.X.OOXXX.X/XXXXXXXOXXOOOXOX.X./......OOOX........./","hintLoc":"null","initialTurnNumber":62,"metadata":"983560250B0F3D37CC7B7F75F9DBBCB1:72","moveLocs":["N13","F1","L1","O13","P16","N16","N13","J7","H5","O13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.67,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.83e-06,8.32e-06,8.33e-06,8.75e-06,9.87e-06,2.93e-05,1.1e-05,1.42e-05,1.17e-05,1.08e-05,1.19e-05,0,0,0,0,0,0,9.01e-06,8.15e-06,8.15e-06,8.31e-06,0,0,1.25e-05,0,0,0.219,0.415,1.04e-05,0,0,0,0,0,0,0,8.78e-06,8.75e-06,8.02e-06,0,0,0,8.48e-06,2.12e-05,0,0,0.00137,1.08e-05,0,0,0,0,0,0,0,8.53e-06,8.42e-06,0,0,0,0,0,0,0,0,0.00845,9.86e-06,0,0,0,0,0,0,0,9.25e-06,8.46e-06,0,0,0,0,0,0,0,1.42e-05,0.0347,9.28e-06,0,0,0,0,0,0,9.74e-06,8.56e-06,8.54e-06,0,8.72e-06,8.38e-06,8.67e-06,0,0,0.0232,0,0,0,0,0,0,0,0,0,1.35e-05,9.09e-06,9.02e-06,0,8.55e-06,0,0,0,0,1.65e-05,0,0,0,0,0,0,0,0,9.37e-06,9.56e-06,9.01e-06,8.97e-06,0,0,0,0,0,0,0,0.00054,0,0,0.0965,9.91e-06,0,0,0,8.56e-06,0,9.41e-06,9.03e-06,0,0,0,0,0,0,0,0,9.62e-06,1.01e-05,0,0,0,0.0468,0,0,8.77e-06,9.17e-06,8.61e-06,0.000307,0.000218,0.000173,0,0,0,0,0,0,9.01e-06,0,0,0,0.000458,0.0092,1.97e-05,9.67e-06,9.35e-06,8.6e-06,0,0,0,0,0,0.000715,0.0047,0,0.0173,0,8.76e-06,0,3.91e-05,0.000126,0.000328,1.36e-05,9.77e-06,9.08e-06,8.65e-06,0,0,9.11e-06,0,0,0,0,0,0,0,0,0,1.03e-05,1.36e-05,1.34e-05,9.73e-06,0,9.2e-06,8.46e-06,0.0171,0,0,0,0,0,5.13e-06,0,0,0,0,9.3e-06,9.83e-06,1e-05,9.36e-06,0,8.61e-06,0,8.88e-06,0,8.29e-06,0,0.00434,0,0,0,0,0,0,0,9.25e-06,9.64e-06,0,0,0,0,9.09e-06,9.81e-06,3.05e-05,0,0.0493,0.0227,0,0,0,0,0,0,0,0,9.61e-06,0,0,0,0,0,1.47e-05,0,0,0,0,0,0,0,0,0,0,0,8.75e-06,1.03e-05,0,8.53e-06,8.55e-06,8.71e-06,0,7.98e-06,0,0,0,0,0,0,0,0,0,0.0262,0,8.37e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8.46e-06,0,8.38e-06,8.24e-06,8.08e-06,7.91e-06,8.2e-06,8.46e-06,0,0,0,0,0,0,8.08e-06,9.49e-06,4.34e-05,1.55e-05,9.05e-06,9.09e-06,8.27e-06,8.56e-06,1.56e-05],"winrateAvg":0.675991,"leadAvg":0.480036,"scoreMeanAvg":0.908474,"scoreStdevAvg":4.90162,"shorttermWinlossErrorAvg":0.318803,"shorttermScoreErrorAvg":1.2986,"ownership":[-100,-100,-99,-97,-93,-44,-30,49,60,53,-43,-100,-100,-100,-100,97,97,96,95,-100,-100,-100,-100,-95,-99,72,72,84,75,99,-100,-100,-100,-100,-100,97,96,95,-100,-100,-100,-100,-99,-99,-99,82,25,59,99,99,-100,-100,98,97,97,95,95,-100,-100,-100,-98,-98,-98,-99,-99,2,41,99,-100,-100,98,98,98,94,95,95,-100,-100,-100,-100,-99,-99,-99,-18,31,63,99,-100,-100,-100,-100,98,95,94,94,-100,-100,-100,-100,-100,100,-42,67,23,99,99,99,-100,99,99,95,95,94,94,-100,-100,-100,-100,-100,100,30,-2,99,99,-92,-94,-93,-94,99,97,96,95,94,100,-100,-100,-100,100,100,5,52,-10,-8,8,-20,-94,98,99,98,99,96,95,100,100,100,100,100,100,100,100,64,32,100,100,-93,18,-19,99,96,96,95,58,49,62,100,-98,-98,-97,100,100,85,100,-93,-93,-41,17,56,94,95,95,-98,-98,-98,-97,-97,11,-92,-95,23,100,99,100,-25,-27,22,50,84,96,96,-98,-91,-94,-98,99,99,-94,-85,-90,-90,100,100,18,10,26,57,99,97,96,-96,-91,-91,-98,-98,100,-7,-89,-89,-90,100,72,44,43,58,97,95,99,86,-92,-93,-92,-96,-98,100,100,100,100,-92,100,69,29,95,95,-100,96,91,31,-96,-92,-92,-95,-99,-98,100,100,100,100,100,100,-27,-100,-100,-100,-100,92,-66,-97,-100,-93,-92,-99,100,100,100,100,100,100,45,-39,-100,-100,-100,-100,-100,-80,-100,-100,-100,-93,-93,-100,-100,100,100,100,95,88,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-2,-4,-100,-99,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,99,100,96,65,33,-42,-74,-98,-99,-99],"ownershipAllowedMAE":0.0364238})%"); + lines.push_back(R"%({"sample":{"board":".................../...OX..X.X.OXX...../...OXXX.X..OOOXXXX./...O.O.O.O....OOOX./.......O.........O./..OO............O../...X.O...........X./...............XOO./............X..O.../.........X.X...XX../........X.XOXX.O.../.XOO....XXO.OXXOO../..X.....XOOO.OXOXX./...O.OOX.X.OO.OX.O./..XXXXOXXOO...OXX../....XO.OX.X.O.OOXX./..XXOO.O.X..OXXXOO./...O.O.O..XO....XX./....O.OX.........../","hintLoc":"null","initialTurnNumber":143,"metadata":"20F6CB4B1BCEF832A9133B5DF1126B66:153","moveLocs":["S10","M8","O2","S9","P10","S11","R11","T10","P12","P9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.84,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":7.0,"policyOptimism":0.315,"pda":-0.84,"policyMixture":[2.6e-05,2.98e-05,3.07e-05,0.0024,0.136,0.000193,0.000759,3.28e-05,0.000393,0.0097,0.000797,5.61e-05,0.00682,0.00028,7.67e-05,5.88e-05,2.99e-05,3.14e-05,2.72e-05,2.73e-05,2.96e-05,2.89e-05,0,0,3.01e-05,3.13e-05,0,3.07e-05,0,4.57e-05,0,0,0,0.00786,0.000131,2.89e-05,3.19e-05,2.79e-05,2.59e-05,2.96e-05,2.87e-05,0,0,0,0,7.15e-05,0,0.00017,3.06e-05,0,0,0,0,0,0,0,3.1e-05,2.6e-05,2.85e-05,2.84e-05,0,3.25e-05,0,3.17e-05,0,3.13e-05,0,3.16e-05,3.02e-05,2.77e-05,2.8e-05,0,0,0,0,3.44e-05,2.62e-05,2.92e-05,2.8e-05,2.79e-05,3.02e-05,3.07e-05,3.08e-05,0,2.95e-05,3.23e-05,3.27e-05,3.19e-05,3.06e-05,2.98e-05,2.81e-05,2.74e-05,2.64e-05,0,3.15e-05,2.73e-05,3.03e-05,0,0,2.96e-05,3e-05,3e-05,3.06e-05,3.22e-05,3.42e-05,3.54e-05,3.45e-05,3.37e-05,3.14e-05,3.01e-05,2.85e-05,0,3e-05,3.13e-05,2.8e-05,3.24e-05,3.26e-05,0,3.14e-05,0,3.19e-05,3.45e-05,3.57e-05,3.63e-05,3.79e-05,3.75e-05,9.26e-05,3.29e-05,2.93e-05,2.84e-05,3.01e-05,0,3.13e-05,2.9e-05,3.78e-05,3.55e-05,3.29e-05,3.33e-05,3.32e-05,3.44e-05,3.56e-05,3.72e-05,4e-05,3.66e-05,9.73e-05,4.8e-05,3.55e-05,0,0,0,0,3.41e-05,2.95e-05,0.000119,8.84e-05,4.79e-05,3.54e-05,3.83e-05,3.95e-05,3.66e-05,3.7e-05,3.36e-05,9.77e-05,3.04e-05,0,7.28e-05,3.01e-05,0,0,0,3.77e-05,3.07e-05,0.000578,0.00394,6.95e-05,4.31e-05,5.22e-05,4.65e-05,3.86e-05,2.81e-05,0,2.98e-05,0,3.14e-05,8.07e-05,0,0,0,0,0,3.04e-05,0.784,0.000147,3.26e-05,3.49e-05,3.9e-05,4.11e-05,3.09e-05,0,0,0,0.00218,0,0,0,0,0.000323,0,3.34e-05,3.34e-05,0,0,0,3.37e-05,3.56e-05,3.53e-05,2.9e-05,0,0,0,0,0,0,0,0,0,0.00433,0.000419,3.37e-05,0.00706,0,0.000465,3.24e-05,3.19e-05,3.18e-05,3.02e-05,0,0,0,0,3.31e-05,0,0,0,0,0,0.000794,3.08e-05,0.0106,0.000497,0,3.41e-05,0,0,0,0,0,2.78e-05,0,0,2.66e-05,0,0,0.00644,0,2.73e-05,2.9e-05,4.09e-05,0,0,0,0,0,0,0,0,0,2.38e-05,2.75e-05,2.89e-05,0,0,0,0.000136,2.87e-05,3.03e-05,0.000117,3.31e-05,2.9e-05,0,0,2.79e-05,0,0,0.00215,0,0.00014,0,0.000606,0,0,0,0,9.55e-05,3.1e-05,0.000107,0,0,0,0,2.71e-05,0,5.23e-05,0,3.39e-05,3.27e-05,0,0,0,0,0,0,0.000853,2.95e-05,5.98e-05,3.49e-05,0,2.58e-05,0,2.72e-05,0,3e-05,3.48e-05,0,0,2.46e-05,0,0.0018,0.00018,0,0,2.67e-05,2.8e-05,3.1e-05,2.99e-05,2.8e-05,0,2.6e-05,0,0,3.2e-05,3.39e-05,3.75e-05,3.24e-05,3.02e-05,2.67e-05,3.39e-05,2.92e-05,2.74e-05,2.59e-05,2.48e-05,2.47e-05],"winrateAvg":0.105273,"leadAvg":-2.91516,"scoreMeanAvg":-4.05611,"scoreStdevAvg":8.78293,"shorttermWinlossErrorAvg":0.148907,"shorttermScoreErrorAvg":1.53266,"ownership":[82,79,76,-43,-46,-85,-83,-87,-88,-48,6,76,63,-3,-75,-91,-93,-93,-93,86,84,82,99,-92,-86,-90,-93,-90,-92,1,97,-81,-85,-84,-94,-95,-94,-94,88,91,91,99,-93,-93,-93,-8,-92,6,26,97,97,97,-96,-96,-96,-96,-90,90,92,93,99,-38,61,-36,94,-14,85,32,44,52,79,98,98,98,-96,-13,89,93,93,71,52,37,40,95,43,24,26,28,31,40,52,71,93,95,17,85,90,99,99,61,48,35,31,19,14,11,16,21,31,49,68,97,66,57,80,83,71,48,62,89,21,15,7,2,-2,-8,1,17,44,74,58,-8,-1,75,76,72,61,54,19,2,0,-2,-10,-16,-13,-31,0,91,70,95,95,-6,69,75,72,60,43,-4,-7,-7,-13,-34,-24,-51,-98,-20,66,95,95,-92,-27,61,67,82,44,23,-2,2,-9,-50,-99,-74,-99,-89,-29,69,-96,-96,-91,-94,15,82,69,33,0,-3,3,-29,-99,-95,-97,-41,-99,-99,-99,-93,-94,-96,-93,-12,-90,90,88,7,4,8,-40,-100,-100,83,-41,-8,-99,-100,-93,-92,-93,-95,-71,-92,-91,6,-3,22,11,-47,-100,83,83,85,-19,24,-100,-92,-97,-97,-95,-85,-88,2,63,-13,96,97,-99,-88,-88,64,85,84,22,79,-100,-95,-94,-96,-88,-92,-96,-96,-96,-97,98,-99,-99,78,80,68,73,59,80,-100,-100,-97,-97,-85,-90,-92,-95,-96,100,97,100,-99,-39,-76,64,84,36,80,80,-100,-100,-98,-70,-72,-96,-96,100,100,98,100,-8,-95,-63,32,84,-96,-97,-97,-96,-97,-99,-57,23,-47,97,96,100,99,100,25,-36,-86,81,68,69,-26,-86,-100,-99,-98,-1,48,71,80,99,99,100,54,53,-17,-31,26,60,22,-11,-64,-86,-96,-98],"ownershipAllowedMAE":0.0336161})%"); + lines.push_back(R"%({"sample":{"board":".................../..O....OO........../.XO..OOXO.....X.OO./.X.OOXXXXOXOOOOOXX./XOO..O.XOOOXXX...../.XXX.XXO...O..XXX../....XOO.OOO.OOXO.X./.X.X........OXOOOX./.OOOXXX.X.X.XXXOOO./....XOXO.X.XXXXXXO./...O..XO.OOOOO.OXO./.O.....XO....O.OOX./..O.O..X....XXX.X.X/.OX..OX.O..X...X.X./.XX..O.X..O.O.O..../.OOXX.O.O.OOXXO.X../.XXO.XX.XXXXO.OX.../............O.OXO../...............X.../","hintLoc":"null","initialTurnNumber":101,"metadata":"244E906FD1E0498C380B65836A170953:111","moveLocs":["H11","H12","J9","J12","H13","G12","L6","H4","M7","A6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":10.0,"policyOptimism":0.0,"pda":1.205,"policyMixture":[5e-05,5.48e-05,4.97e-05,4.8e-05,4.65e-05,4.7e-05,4.54e-05,4.56e-05,4.6e-05,4.52e-05,4.59e-05,4.65e-05,4.73e-05,4.76e-05,4.86e-05,4.83e-05,5.03e-05,5.36e-05,4.48e-05,5.16e-05,5.15e-05,0,4.68e-05,4.7e-05,4.75e-05,4.87e-05,0,0,4.72e-05,4.64e-05,4.81e-05,4.73e-05,4.83e-05,5.06e-05,5.05e-05,5.62e-05,5.51e-05,5.85e-05,4.94e-05,0,0,4.74e-05,4.9e-05,0,0,0,0,4.76e-05,4.65e-05,4.68e-05,4.68e-05,5.02e-05,0,4.84e-05,0,0,0.000112,9.51e-05,0,5.18e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000941,0,0,0,5.01e-05,4.93e-05,0,5.65e-05,0,0,0,0,0,0,0,4.93e-05,4.67e-05,0.000279,0.000569,5.84e-05,0.0001,0,0,0,5.52e-05,0,0,0,4.79e-05,4.78e-05,4.86e-05,0,4.84e-05,4.9e-05,0,0,0,5.49e-05,5.8e-05,0.000145,0.00042,6.2e-05,5.39e-05,0,0,0,0,0,0,0,4.71e-05,0,0,0,0,5.24e-05,0,4.81e-05,0.000329,0,0.00936,0,0.0022,0.0786,0,0,0,0.0335,4.8e-05,4.56e-05,0,0,0,0,0,0,4.98e-05,0.000606,0,0,0,0,0,0,0,0,0.00209,0,5.2e-05,0,0,0,0,0,0,4.91e-05,0.000249,0.000258,0.000272,0.00197,0,0,0,0,5e-05,0,5.59e-05,0,0,0,0,0,0,0,4.7e-05,0.000618,0.0791,0.0507,0,0.00516,6.21e-05,0,0,0,0,0,0,0,0,4.92e-05,0,0,0,4.66e-05,0.00135,0,0.000156,0.0081,0.0026,0.00786,0.000126,0,0,4.63e-05,5.43e-05,5.03e-05,4.98e-05,0,4.78e-05,0,0,0,0.00703,0.000324,0.582,0,0.000877,0,6.65e-05,0.00163,0,5.53e-05,5.42e-05,5.27e-05,0,0,0,0,6.68e-05,0,0,0,0,0,0,0.108,5.24e-05,0,0,0.00312,0,4.91e-05,0,0,7.39e-05,5.1e-05,0.000189,0,5.29e-05,0,4.73e-05,0.000137,0,0,7.39e-05,8.7e-05,0,0.000843,0,0.000186,5.1e-05,0,5.34e-05,0,5.35e-05,0,0.000233,0.00018,6.08e-05,4.69e-05,5.23e-05,0,0,0,0,5.25e-05,0,0,0,5.09e-05,0,0,0,0,0,0.000351,0,6.11e-05,4.84e-05,4.83e-05,0,0,0,4.9e-05,0,0,8.86e-05,0,0,0,0,0,5.38e-05,0,0,0.000106,4.8e-05,4.77e-05,4.49e-05,4.67e-05,4.72e-05,4.52e-05,4.55e-05,4.6e-05,4.69e-05,6.02e-05,4.87e-05,4.65e-05,4.86e-05,5.3e-05,0,4.41e-05,0,0,0,4.86e-05,4.94e-05,4.67e-05,4.55e-05,4.53e-05,4.54e-05,4.52e-05,4.54e-05,4.59e-05,4.68e-05,4.77e-05,9.72e-05,5.66e-05,5.63e-05,5.3e-05,5.37e-05,5.15e-05,0,4.91e-05,4.92e-05,4.73e-05,6.37e-05],"winrateAvg":0.02732,"leadAvg":-3.29194,"scoreMeanAvg":-4.1222,"scoreStdevAvg":7.25733,"shorttermWinlossErrorAvg":0.0892855,"shorttermScoreErrorAvg":2.11328,"ownership":[47,90,92,97,98,99,99,99,99,99,99,99,98,97,95,94,89,80,65,3,-50,99,98,99,99,99,100,100,99,99,99,98,97,96,95,94,68,68,-63,-96,99,99,99,100,100,99,100,99,99,99,99,98,95,95,96,96,-85,-96,-96,61,100,100,99,99,98,99,100,99,100,100,100,100,100,-98,-99,-92,-98,98,98,12,15,100,99,99,100,100,100,-98,-98,-98,-12,18,-28,-95,-94,-97,-100,-100,-100,-95,-96,-92,100,100,100,100,100,63,-58,-100,-100,-100,-98,-96,-82,-77,-84,-93,-100,100,100,100,100,100,100,71,100,100,-100,-98,-99,-100,-98,-36,-85,26,-99,-97,46,-100,-100,-100,42,52,-31,100,-100,-99,-98,-99,-100,-99,-6,92,91,89,-100,-100,-100,99,-100,-91,-100,-84,-100,-100,-100,-99,-99,-99,-99,73,79,61,-73,-100,-42,-100,99,19,-99,-27,-100,-100,-100,-100,-100,-100,-98,-99,76,83,77,90,-9,-36,-100,99,99,99,99,99,99,99,38,98,-100,-98,-99,72,94,87,77,6,3,-63,-98,99,89,58,-15,-30,99,38,98,99,-99,-99,42,73,94,78,90,24,-47,-98,-6,84,89,90,-99,-99,-99,-5,-100,-99,-100,-77,69,-99,-12,29,77,-95,-20,93,76,99,-83,-86,7,-36,-99,-98,-100,-99,-81,-99,-99,-35,-22,77,-16,-99,1,17,99,29,98,97,99,66,-95,-99,-99,-98,-98,-99,-100,-100,-12,43,-99,48,-21,99,99,97,97,99,46,-99,-99,-99,-99,-100,-100,-99,-99,-100,-100,-98,-100,-100,-100,-100,99,98,99,-99,-98,-99,-99,-99,-99,-99,-99,-99,-99,-98,-95,-95,-93,-78,-70,98,80,99,-99,-98,-98,-99,-99,-99,-99,-99,-98,-97,-95,-90,-87,-68,-55,14,46,58,-18,-99,-98,-99,-99],"ownershipAllowedMAE":0.0326549})%"); + lines.push_back(R"%({"sample":{"board":".................../.XOO.........OXX.../XXXOXXOOOO..X.OX.../.XOO..OXXO.OO.OX.../.XXOXXXXOXX...OXO../..OXXOXXOO..X..XX../..O..OOOX.O..O...../..OXX...X..O......./...OXXOO.......XX../...OX...........O../...OXOO........O.../....OX............./....O...........O../...............X.../..........X.....O../..OOO..O.OX...X..../.XXX..X........X.../.....X............./.................../","hintLoc":"null","initialTurnNumber":103,"metadata":"4905AEE39610B68D1A4F71AD4C44D0C2:113","moveLocs":["B4","A4","A5","A3","B6","L11","M11","L9","M10","L10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.24,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.1e-06,0.000893,4.58e-06,8.45e-06,0.023,0.000271,0.013,5.34e-06,4.26e-06,4.35e-06,5.3e-06,5.14e-06,5.22e-06,5.92e-06,4.83e-06,3.84e-06,3.32e-06,3.4e-06,3.21e-06,3.95e-06,0,0,0,0.000842,0.0116,0.000159,4.9e-06,3.6e-06,4.4e-06,5.71e-06,6.35e-06,0.000101,0,0,0,3.47e-06,3.47e-06,3.33e-06,0,0,0,0,0,0,0,0,0,0,3.72e-06,5.77e-06,0,7.08e-06,0,0,3.53e-06,3.67e-06,3.15e-06,3.29e-06,0,0,0,0.000119,0.000153,0,0,0,0,4.03e-06,0,0,4.09e-06,0,0,3.66e-06,3.7e-06,3.18e-06,5.8e-06,0,0,0,0,0,0,0,0,0,0,4.14e-06,3.76e-06,3.46e-06,0,0,0,3.61e-06,3.46e-06,5.2e-06,0.0202,0,0,0,0,0,0,0,0,5.53e-06,4.43e-06,0,4.22e-06,4.65e-06,0,0,4.3e-06,3.48e-06,4.13e-06,4.39e-06,0,0.00156,0.000974,0,0,0,0,9.24e-06,0,4.63e-06,7.28e-06,0,5.41e-06,5.1e-06,4.94e-06,4.55e-06,3.93e-06,3.44e-06,3.77e-06,0,0,0,6.44e-06,3.76e-06,5.57e-06,0,6e-06,0.158,0,3.61e-06,5.13e-06,6.57e-06,5.72e-06,6.11e-06,6.22e-06,4.2e-06,3.38e-06,3.68e-06,3.44e-06,0,0,0,0,0,0.0176,6.59e-06,0,0,3.59e-06,6.04e-06,5.84e-06,0,0,0.00308,4.26e-06,3.3e-06,3.63e-06,3.45e-06,0,0,8.4e-05,4.59e-06,4.87e-06,1.11e-05,5.01e-06,0,0,5.02e-06,7.54e-06,7.3e-06,5.14e-06,0,1.78e-05,5.02e-06,3.34e-06,3.5e-06,3.21e-06,0,0,0,0,1.07e-05,0.000262,7.66e-06,0,0.00389,1.22e-05,1.32e-05,7.17e-06,0,4.07e-06,6.93e-06,3.92e-06,3.32e-06,3.34e-06,3.26e-06,3.12e-06,0,0,4.66e-05,0.0143,0.0529,0.00959,8.8e-06,1.89e-05,0.0611,8.37e-05,1.15e-05,5.84e-06,4.82e-06,5.51e-06,3.68e-06,3.36e-06,3.3e-06,3.13e-06,3.23e-06,0,5.77e-06,2.6e-05,0.0449,0.062,0.093,0.0593,0.000116,0.000611,0.00016,2.73e-05,5.17e-05,0,4.72e-06,4.06e-06,3.32e-06,0,3.2e-06,3.17e-06,3.56e-06,4.72e-06,1.07e-05,0.00516,0.0448,0.0308,9.59e-05,4.38e-05,7.63e-05,0.00328,1.66e-05,0,2.45e-05,7.35e-06,3.74e-06,0,3.18e-06,2.95e-06,3.14e-06,3.54e-06,4.84e-06,1.04e-05,2.74e-05,3.02e-05,0.0447,0,7.86e-06,7.9e-05,2.94e-05,1.17e-05,0.0153,0,9.81e-06,4.42e-06,0,0,0,0,0,4.82e-06,0.000243,0,6.74e-06,0,0,7.62e-06,5.23e-05,2.14e-05,0,1.37e-05,3.73e-05,0.0111,4.58e-06,0,0,0,0,0.000248,7e-06,0,1.89e-05,3.06e-05,0.0127,0.171,8.47e-06,5.5e-05,8.37e-05,8.23e-06,0,0.00218,0.000163,4.36e-06,3.51e-06,3.71e-06,5.5e-06,6.02e-06,6.67e-06,0,7.41e-06,1.9e-05,1.12e-05,0.00236,3.23e-05,9.16e-06,9.04e-06,9.03e-06,3.29e-05,1.06e-05,9.12e-06,1.24e-05,4.19e-06,3.2e-06,3.51e-06,3.64e-06,3.77e-06,3.93e-06,3.99e-06,4.25e-06,4.35e-06,4.24e-06,4.42e-06,4.36e-06,4.13e-06,4.04e-06,3.99e-06,4.26e-06,4.32e-06,4.25e-06,4.22e-06,3.19e-06,5.19e-06],"winrateAvg":0.700504,"leadAvg":0.975998,"scoreMeanAvg":2.05902,"scoreStdevAvg":10.0655,"shorttermWinlossErrorAvg":0.162695,"shorttermScoreErrorAvg":1.17118,"ownership":[-89,-87,-87,-82,-61,-25,37,61,76,71,58,34,0,-45,-63,-96,-98,-97,-97,-89,-91,-82,-81,-90,-35,18,78,85,80,55,46,11,72,-99,-100,-98,-97,-96,-91,-91,-93,-82,-94,-93,98,98,99,99,75,59,11,73,95,-100,-98,-96,-94,-72,-92,-82,-84,-90,6,98,-94,-94,99,88,98,98,83,95,-100,-97,-95,-91,-20,-92,-93,-85,-95,-95,-94,-94,93,75,73,83,81,75,95,-100,-93,-93,-87,2,39,94,-95,-95,87,-94,-95,92,93,79,73,55,65,-11,-100,-100,-90,-78,42,67,95,0,-50,87,85,85,-34,19,96,81,65,84,-5,-44,-74,-74,-64,58,82,94,-93,-93,1,66,21,-36,-16,10,95,39,12,3,-39,-68,-73,-37,71,86,92,98,-93,-94,89,89,24,-22,-77,94,23,-4,-28,-94,-94,-11,-10,84,89,92,98,-94,10,57,43,13,-24,-79,93,10,-1,-10,-31,72,16,24,90,92,94,98,-94,90,90,20,-1,-20,-80,-49,-6,-1,8,78,55,54,41,93,93,94,95,99,64,76,21,12,-2,-29,-24,-3,1,3,17,46,60,57,94,94,94,93,99,73,44,28,14,0,-15,-20,-7,-4,-3,-13,82,66,62,94,98,90,84,58,40,24,16,4,-10,-30,-21,-16,-15,-18,-52,3,69,59,95,95,88,79,53,29,21,27,7,-23,-88,-39,-31,-31,-46,20,78,59,47,-92,99,99,99,99,24,-6,75,23,49,-88,-49,-43,-50,-90,-16,-6,29,28,-92,-92,-91,-92,50,-19,-88,3,21,1,-14,-51,-46,-49,-67,-90,-20,-8,5,-91,-90,-91,-90,-89,-94,-54,-20,3,0,-15,-34,-42,-51,-58,-64,-43,-23,-10,-91,-90,-90,-89,-82,-60,-40,-13,1,3,-8,-23,-36,-45,-52,-48,-42,-32,-22],"ownershipAllowedMAE":0.027481})%"); + lines.push_back(R"%({"sample":{"board":".................../....OXO............/...XXOX.......X..../....OO..........O../..O............O.../.................../.................../.................../.................../.................../.................../..O.............X../..X............OX../....X..X.......OOX./..O...O........OX../.OXO.XO.X..O...OX../.XXXX..OX......OX../.OX.............X../.................../","hintLoc":"null","initialTurnNumber":52,"metadata":"D5CC92DE2449FAB584A3D893E49B5CD5:62","moveLocs":["D8","C9","B15","B16","D15","C14","D16","D9","D14","C13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.03,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":7.5,"policyOptimism":0.257,"pda":0.0,"policyMixture":[4.44e-06,5.6e-06,4.98e-06,5.95e-06,4.93e-06,8.57e-05,4.86e-06,5.71e-06,5.06e-06,4.97e-06,5.09e-06,5.29e-06,5.26e-06,5.01e-06,5.37e-06,4.96e-06,4.9e-06,4.72e-06,4.22e-06,5.22e-06,7.71e-06,6.67e-06,6.61e-05,0,0,0,5.4e-05,1.03e-05,1.1e-05,1.43e-05,2.23e-05,1.25e-05,8.88e-06,8.13e-06,2.04e-05,6.52e-05,9.3e-06,4.89e-06,5.63e-06,0.00121,6.82e-06,0,0,0,0,0.000224,7.64e-05,8.55e-05,0.000183,0.0041,0.000102,9.42e-06,0,1.18e-05,0.000119,9.98e-06,5.04e-06,5.44e-06,0,3.58e-05,0,0,0,0.0059,1.75e-05,7.61e-05,8.02e-05,0.000171,0.000189,0.000103,5.37e-05,1.22e-05,1.28e-05,0,9.45e-06,4.83e-06,5.18e-06,0,0,0,7.96e-06,1.75e-05,0.000154,0.000217,8.89e-05,5.73e-05,4.29e-05,2.99e-05,2.82e-05,3.23e-05,9.06e-05,0,7.51e-06,1.24e-05,4.71e-06,4.99e-06,6.76e-06,0,0,6.63e-06,0.252,0.0544,0.00531,0.000116,6.29e-05,3.78e-05,2.18e-05,1.69e-05,1.92e-05,3.87e-05,1.92e-05,2e-05,8.44e-06,4.61e-06,5.01e-06,6.22e-06,0,0.44,3.83e-05,0.0038,0.0109,0.00208,0.000116,6e-05,3.23e-05,1.75e-05,1.45e-05,1.39e-05,2.15e-05,3.24e-05,2.3e-05,9.17e-06,4.59e-06,4.94e-06,6.91e-06,1.23e-05,0.186,0.00228,0.000241,0.000266,0.000149,8.29e-05,4.67e-05,2.33e-05,1.59e-05,1.37e-05,1.26e-05,1.22e-05,2.34e-05,2.88e-05,8.66e-06,4.57e-06,4.68e-06,6.52e-06,1.66e-05,0.00143,0.000724,0.000196,0.000159,9.63e-05,5.71e-05,3.1e-05,1.86e-05,1.51e-05,1.36e-05,1.22e-05,1.11e-05,1.23e-05,1.29e-05,8.15e-06,4.7e-06,4.82e-06,6.48e-06,7.1e-06,1.11e-05,0.000111,0.000164,0.000128,7.67e-05,4.3e-05,2.23e-05,1.76e-05,1.57e-05,1.42e-05,1.29e-05,1.17e-05,1.05e-05,9.5e-06,7.06e-06,4.62e-06,4.76e-06,6.56e-06,0,0,7.45e-05,0.000117,9.02e-05,6.86e-05,3.52e-05,2.17e-05,1.93e-05,1.76e-05,1.76e-05,1.69e-05,5.12e-05,9.48e-06,6.5e-06,5.66e-06,4.4e-06,4.54e-06,9.75e-06,0,0,0.00081,0.000113,0.000108,9.62e-05,3.06e-05,3.09e-05,2.47e-05,2.14e-05,2.06e-05,1.53e-05,8.84e-06,1.42e-05,0,5.08e-06,4.56e-06,5.4e-06,0.000631,0,0.0178,8.81e-06,3.14e-05,9.94e-05,1.88e-05,2.62e-05,6.46e-05,4.78e-05,3.37e-05,2.29e-05,1.35e-05,5.72e-06,0,0,4.67e-06,4.33e-06,4.82e-06,1.21e-05,1.03e-05,7.84e-06,0,7.18e-06,0.000109,0,1.05e-05,9.59e-05,5.85e-05,5.04e-05,4.25e-05,1.36e-05,4.8e-06,0,0,0,3.93e-06,4.73e-06,6.76e-06,0,5.71e-06,5.21e-06,5.41e-06,0,7e-06,8.19e-06,1.99e-05,0.000267,0.000283,0.000152,3.87e-05,4.92e-06,0,0,3.97e-06,4.36e-06,5.06e-06,0,0,0,4.95e-06,0,0,6.31e-06,0,7.26e-06,8.14e-05,0,0.000154,6.34e-05,5.23e-06,0,0,4.09e-06,4.18e-06,4.47e-06,0,0,0,0,5.02e-06,5.93e-06,0,0,7.56e-06,0.000121,5.47e-05,0.000122,0.000169,7.32e-06,0,0,3.81e-06,4.16e-06,4.42e-06,0,0,3.97e-06,4.21e-06,4.72e-06,5.46e-06,6.94e-06,1e-05,3.27e-05,2.95e-05,7.62e-05,2.21e-05,1.28e-05,1.96e-05,9.7e-06,0,3.87e-06,4.13e-06,4.28e-06,4.48e-06,4.23e-06,4.36e-06,4.55e-06,4.55e-06,4.61e-06,4.65e-06,5.3e-06,5.23e-06,5.27e-06,5.16e-06,5.06e-06,5.36e-06,5.38e-06,5.37e-06,4.6e-06,3.96e-06,4.24e-06,7.84e-06],"winrateAvg":0.530181,"leadAvg":0.315168,"scoreMeanAvg":0.389769,"scoreStdevAvg":13.0818,"shorttermWinlossErrorAvg":0.106285,"shorttermScoreErrorAvg":0.835087,"ownership":[1,-7,-9,5,45,81,73,60,44,28,13,2,-7,-15,-15,-7,8,15,24,5,-4,-12,-28,80,79,89,52,43,25,14,3,-6,-17,-23,3,3,26,30,21,2,-24,-80,-79,87,34,59,30,20,13,-2,8,-10,-52,26,27,39,38,39,82,24,-81,84,84,44,30,18,13,8,6,2,3,-2,25,83,56,42,67,65,92,-81,-8,3,16,8,7,8,7,7,5,3,3,82,53,43,42,74,85,93,-83,-47,-41,-22,-12,-2,2,4,4,3,4,14,27,26,32,31,78,84,93,-44,-44,-35,-23,-15,-5,0,2,2,2,1,5,12,19,19,20,75,80,79,-14,-29,-24,-19,-12,-5,-1,1,2,1,1,2,4,7,7,6,70,73,48,16,-12,-15,-13,-8,-3,0,1,2,1,1,1,0,-3,-7,-7,64,68,54,27,6,-2,-5,-4,-2,0,1,1,1,2,2,-3,-11,-21,-20,55,72,91,91,24,6,-1,-3,-2,0,1,1,2,3,-1,-4,-23,-39,-36,44,48,90,-39,12,-1,-6,-7,-4,-2,0,3,5,7,15,15,-91,-62,-55,20,16,-48,-25,-23,-10,-15,-23,-10,-6,-2,3,8,14,31,87,-91,-85,-70,-2,-12,-22,-45,-84,-31,-18,-73,-19,-13,-4,4,10,19,39,86,87,-91,-84,-29,-29,5,-30,-42,-38,-3,-46,-15,-11,-13,9,20,28,45,86,-94,-88,-89,-61,-31,-97,-23,-71,-89,-3,-39,-81,-17,12,72,34,32,48,86,-93,-92,-91,-66,-97,-97,-97,-97,-59,-33,-10,-82,-25,12,29,28,28,37,86,-94,-92,-90,-75,-71,-97,-89,-75,-60,-34,-36,-49,-46,0,5,16,15,6,34,-94,-84,-88,-81,-91,-92,-85,-72,-56,-42,-37,-40,-29,-12,6,13,10,1,-29,-42,-80,-82],"ownershipAllowedMAE":0.023156})%"); + lines.push_back(R"%({"sample":{"board":"...............O./...XX.....X.O.OXO/.XOXO..X..XO.OXXX/.XXOOX....OXOXXX./.OO...O...OX...../..X..O.OOOX....../......OXXXX....../..O...O........../.....XX.O......../...OO.OO........./...OXOOXXX.XXXXX./..OXXXXOXOOXOOXO./..OX...OXXXO.OOX./..OX.OOOOXOOOO.O./.OXXXOOXXOOXO.O../OXO...OXXXX.XOXX./......OOX.OXXX.X./","hintLoc":"null","initialTurnNumber":148,"metadata":"11177AC061B809EE1A76B844C48870CA:158","moveLocs":["N13","M2","H9","F8","M3","L8","L7","M2","B4","B1"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.47,"xSize":17,"ySize":17},"rules":"koSIMPLEscoreAREAtaxALLsui0","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.23e-06,2.52e-06,2.42e-06,2.22e-06,2.29e-06,2.4e-06,2.32e-06,2.48e-06,2.36e-06,2.39e-06,2.37e-06,2.25e-06,2.24e-06,2.27e-06,2.21e-06,0,2.05e-06,2.42e-06,2.7e-06,2.37e-06,0,0,2.67e-06,2.7e-06,2.64e-06,2.51e-06,2.43e-06,0,2.57e-06,0,2.5e-06,0,0,0,2.33e-06,0,0,0,0,1.55e-05,2.65e-06,0,2.45e-06,2.89e-06,0,0,2.39e-06,0,0,0,0,2.29e-06,0,0,0,0,0,2.79e-06,2.9e-06,4.78e-06,2.93e-06,0,0,0,0,0,0,2.1e-06,7.07e-06,0,0,6.1e-05,2.34e-05,3.01e-06,0,2.51e-06,2.48e-06,3.28e-06,0,0,0,2.35e-06,2.38e-06,2.32e-06,2.27e-06,2.55e-06,2.21e-05,0,2.01e-05,9.6e-06,0,0,0,0,0,0,2.34e-06,2.37e-06,2.35e-06,2.28e-06,2.4e-06,2.26e-06,2.38e-06,3.02e-06,4.1e-06,4.75e-06,7e-06,2.57e-06,0,0,0,0,0,2.42e-06,2.45e-06,2.4e-06,2.37e-06,2.48e-06,2.35e-06,2.39e-06,4.52e-06,0,5.7e-06,7.87e-06,3.05e-06,0,4.64e-05,2.66e-06,2.61e-06,2.5e-06,2.48e-06,2.47e-06,2.48e-06,2.41e-06,2.51e-06,2.43e-06,2.34e-06,2.72e-06,1.68e-05,1.05e-05,3.95e-06,0,0,0,0,4.16e-06,2.48e-06,2.56e-06,2.44e-06,2.44e-06,2.4e-06,2.49e-06,2.3e-06,2.27e-06,4.72e-06,6.48e-05,0,0,0,0,0,3.81e-05,2.68e-06,0,2.6e-06,2.43e-06,2.35e-06,2.46e-06,2.63e-06,2.29e-06,2.69e-06,1.4e-05,0.0238,0,0,0,0,0,0,0,0,0,0,0,0,0,2.48e-06,2.67e-06,0.000632,0,0,0,0,0,0,0,2.5e-06,2.41e-06,0,0,0,0,0,1.77e-05,1.41e-05,0.000531,0,0,2.42e-06,2.74e-06,2.24e-06,0,0,0,0,0,0,0,0,0,4e-06,4.16e-06,0,0,0,2.8e-06,0,0,0,0,0,0,0,0,0,0,0,2.61e-06,0.000656,0,0,0,0,0,0,0,0,0,0,0.974,0,1.4e-05,0,7.12e-06,2.64e-06,0,0,0,3.12e-06,3.24e-06,2.6e-06,0,0,0,0,0,0,0,0,0,0,3.48e-06,0,0,2.31e-06,2.53e-06,2.65e-06,2.42e-06,0,0,0,5.23e-06,0,0,0,0,2.46e-06,0,2.14e-06,5.71e-06],"winrateAvg":0.0371273,"leadAvg":-11.2191,"scoreMeanAvg":-11.5047,"scoreStdevAvg":9.95803,"shorttermWinlossErrorAvg":0.144055,"shorttermScoreErrorAvg":4.66451,"ownership":[-69,-76,-77,-75,-55,-48,-43,-50,-57,-67,-76,-81,-85,-86,-88,-86,-94,-68,-62,-79,-89,-89,-37,-42,-53,-64,-69,-89,-85,-79,-88,-83,-99,-91,-64,-80,-73,-88,71,15,7,-79,-23,-18,-88,-81,-90,-84,-99,-99,-99,-51,-80,-81,68,69,-29,22,-2,9,6,59,-99,-87,-99,-99,-99,-95,-28,30,30,10,47,45,95,40,49,57,61,-99,-99,-92,-92,-93,-93,3,8,-10,28,47,96,91,94,93,94,-97,-90,-90,-90,-91,-91,-90,29,35,42,35,39,56,94,-96,-97,-97,-97,-84,-86,-88,-90,-90,-88,49,61,93,45,36,29,89,2,-1,-22,-46,-73,-83,-87,-89,-89,-86,62,73,74,62,35,-13,-14,-17,62,-4,-35,-55,-74,-83,-87,-88,-83,68,76,83,99,99,99,99,98,21,-30,6,-45,-72,-83,-87,-86,-77,69,78,73,99,33,99,99,-100,-100,-100,-100,-100,-100,-100,-100,-99,-36,72,68,82,38,34,31,33,94,-100,-97,-97,-100,88,88,-99,22,-17,72,73,80,38,55,67,72,93,-100,-100,-100,88,84,87,88,20,46,80,70,81,34,63,93,93,93,92,-100,88,89,87,87,74,83,50,83,88,37,32,31,93,93,-45,-46,88,90,-48,88,24,76,10,27,87,86,90,61,58,70,93,-46,-45,-47,-45,-46,-53,20,-51,-48,2,85,89,83,69,67,76,92,92,-48,-43,-36,-52,-48,-49,-47,-45,-28],"ownershipAllowedMAE":0.0753287})%"); + lines.push_back(R"%({"sample":{"board":".................../OOO......OXX...XO../OX.OOOO.OOOO..X.O../OXOOXXX.XXO.X.XO.O./.XXOOO.XXOXX..XXOO./X.XOXXX.XOOXXXOOX../XOOXO..OX.XOXOOOOX./X..X..XOXXOOXOO.O../.X.XX.XXOO.OOXXOXOO/.OOXO.OO.........OX/.XOXX...O...OO..OXX/XXXOXOXXX.O.O.O.OOX/.XOOOO.OXO.O.O.OOXX/.O.OX...X.OXOXOOOX./..O.OOOOXOOX.XOOX.X/.XOOOXXXOXXX.XXOXXX/X.XXOO..O....X.XOO./OXOXXXXX.....X.XO.O/.X............X..O./","hintLoc":"null","initialTurnNumber":208,"metadata":"5FFD01195BECDFA5BDDCFAA6AD4E72C1:218","moveLocs":["N18","R19","F10","A5","A10","K8","K19","J19","L19","H17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.24,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00011,0.000112,0.000113,0.000113,0.000111,0.000111,0.000109,0.00627,0,0,0,8.61e-05,0.000118,0.000129,0.000501,0.00395,0,0.000112,0.000106,0,0,0,0.000115,0.000113,0.00011,0.000105,0.00481,0.00759,0,0,0,0,0.000135,0.000283,0,0,0.000115,0.000111,0,0,0.000133,0,0,0,0,0,0,0,0,0,0.00192,0.000146,0,0.323,0,0.000117,0.000106,0,0,0,0,0,0,0,0.000145,0,0,0,0.000141,0,0.000118,0,0,0,0,0.00011,0.000807,0,0,0,0,0,0.000145,0,0,0,0,0,0.000118,0.000121,0,0,0,0,0.000111,0,0.000145,0,0,0,0,0,0.000121,0,0,0,0,0,0,0,0,0,0.000105,0.00011,0,0,0,0,0,0.000118,0.000119,0,0,0.000121,0,0,0,0,0,0,0,0,0.000106,0,0.000127,0.000123,0,0.000119,0.000113,0,0,0,0,0,0,0,0,0,0,0,0.00853,0.000107,0.000122,0,0.000149,0,0,0.00012,0,0,0,0,0.00337,0,0,0,0,0,0,0,0,0,0,0,0,0.000121,0,0,0,0.0109,0.00589,0.00718,0.000383,0.000662,0.00011,0.000106,0.00172,0.000795,0,0,0.00011,0,0,0,0,0.409,0.135,0.00078,0,0.000494,0.000118,0.000117,0,0,0.000109,0.000108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000115,0,0,0,0.000109,0,0,0,0.000132,0,0,0,0,0,0.0102,0,0,0,0,0,0,0,0,0,0,0,0,0.000116,0,0,0,0,0.000113,0.000698,0.0116,0,0.0152,0,0,0,0,0,0,0,0,5.04e-05,0,0.00043,0,0,0,0,0,0,0,0,0,0,0.000314,0,0,0,0,4.93e-05,0,0.000115,0,0,0,0,0,0,0,0,0,0,0,0.000129,0,0,0,0,0,0,0,0.000146,0,0,0,0,0.000142,0.00312,0,0.00216,0.000111,0.000111,0.000114,0,0.000119,0,0,0,0.00894,0,0,0,0,0,0,0,0,0.00189,0.000117,0.000113,0.000113,0.000111,0,0.000117,0,0,0,0,0.000122,0,0.000118,0.000113,0.000113,0.000113,0.000114,0.000112,0.000113,0.000114,0.000114,0.000113,0.000112,0.000117,0,0.000161,0.00158,0,0,7.26e-05],"winrateAvg":0.902795,"leadAvg":0.1596,"scoreMeanAvg":0.166256,"scoreStdevAvg":1.80979,"shorttermWinlossErrorAvg":0.24183,"shorttermScoreErrorAvg":0.723708,"ownership":[100,100,100,100,100,100,100,99,99,-99,-99,-99,-99,-97,-95,75,100,100,100,100,100,100,100,100,100,100,100,99,100,-100,-99,-99,-99,-98,-99,100,100,100,100,-100,54,100,100,100,100,100,100,100,100,100,85,-99,-100,-87,100,99,100,100,-100,100,100,-100,-99,-99,-50,-100,-100,100,-7,-100,-99,-100,59,58,100,100,86,-100,-100,100,100,100,14,-100,-100,-99,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,-100,-100,-100,-99,-100,-99,-99,-100,-100,-100,100,100,99,100,100,-100,-99,-99,-100,-99,-99,-99,-99,-100,-99,-99,100,-100,100,100,100,100,99,100,-100,-100,-100,-100,-100,-99,-100,-99,-100,-100,100,100,-100,100,100,100,100,99,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,99,99,100,99,100,100,-100,-100,-99,-100,-100,-100,100,100,99,99,99,99,99,100,100,100,100,100,-100,-99,-100,-99,-100,-100,-43,67,68,100,99,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,100,-99,-99,-99,100,100,100,100,100,100,100,100,100,-100,-8,-100,100,100,100,100,74,99,-99,100,100,100,88,100,100,100,100,-100,-100,92,100,100,100,99,99,93,75,-99,82,100,-100,88,-100,100,100,100,-100,-100,99,18,100,100,100,100,100,100,-99,100,100,-100,23,-100,100,100,-100,-100,-100,29,-99,100,100,100,-100,-100,-100,-97,-100,-100,-100,-97,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-30,-100,-99,-100,-100,-100,-100,-100,-100,-100,98,99,29,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,99,99,99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-38,69,99,99],"ownershipAllowedMAE":0.0149416})%"); + lines.push_back(R"%({"sample":{"board":".....X............./..O.OXOO.O.O......./..XO..XO..X..O..OX./..XOOX.XOOX.X..OXX./...X.X.XOXO....OOX./..X....OXX.....OX../...............XX../..O................/.................../.................../..O............X.../.................../.................../.................../..O............XX../....OO..........O../...XX........O.O.../......X............/.................../","hintLoc":"null","initialTurnNumber":59,"metadata":"0EEB5DF48E42D9D036902C7CA7AC3C38:69","moveLocs":["L14","F17","E15","E14","G14","F14","K13","C10","B9","O13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.12,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.66e-06,2.3e-05,8.45e-06,9.75e-06,9.75e-06,0,1.02e-05,9.22e-06,9.97e-06,9.69e-06,9.34e-06,9.95e-06,9.75e-06,1.03e-05,1.04e-05,1.07e-05,1.04e-05,9.96e-06,9.37e-06,2.34e-05,0.000996,0,1.02e-05,0,0,0,0,9.06e-06,0,9.62e-06,0,9.93e-06,1.05e-05,1.28e-05,0.000102,0.000258,1.45e-05,9.47e-06,4.33e-05,0.044,0,0,7.76e-06,0,0,0,8.96e-06,9.71e-06,0,1.1e-05,1.16e-05,0,1.42e-05,0.000577,0,0,9e-06,1.51e-05,2.47e-05,0,0,0,0,9.94e-06,0,0,0,0,1.15e-05,0,1.41e-05,1.11e-05,0,0,0,8.92e-06,1.24e-05,0.0813,9.2e-06,0,0,0,1.16e-05,0,0,0,0,1.21e-05,1.76e-05,6.59e-05,1.06e-05,0,0,0,9.47e-06,1.28e-05,0.056,0,1.07e-05,0,0,0,0,0,0,0,1.19e-05,0.000805,0.000737,3.23e-05,0,0,1.01e-05,9.58e-06,1.44e-05,0.00509,0.00014,0.021,1.54e-05,0.00022,2.11e-05,1.48e-05,0.181,0,1.15e-05,1.65e-05,0.000116,0,1.87e-05,0,0,1.2e-05,9.8e-06,1.42e-05,2.86e-05,0,1.69e-05,0.0244,0.348,0.0174,7.62e-05,0.000175,1.45e-05,1.49e-05,2.03e-05,8.11e-05,9.92e-05,7.52e-05,1.46e-05,1.28e-05,1.26e-05,9.86e-06,1.19e-05,1.67e-05,1.62e-05,2.42e-05,0.000266,0.00862,0.000206,0.000197,4.02e-05,2.1e-05,2.27e-05,7.63e-05,0.000214,0.000151,4.81e-05,2.08e-05,2.01e-05,1.49e-05,1.01e-05,1.06e-05,1.62e-05,0,9.52e-05,0.000554,8.5e-05,9.21e-05,4.55e-05,2.69e-05,2.87e-05,4.95e-05,0.00014,0.000204,0.000469,0.000261,5.54e-05,2.21e-05,1.55e-05,1.04e-05,9.93e-06,0,0,2.19e-05,2.45e-05,3.72e-05,4.1e-05,3.49e-05,3.77e-05,5.74e-05,0.000113,0.000166,0.000176,0.000159,0.00112,0,3.61e-05,1.55e-05,1.05e-05,9.73e-06,1.03e-05,1.1e-05,1.51e-05,2.06e-05,2.79e-05,3.52e-05,5.02e-05,7.5e-05,0.000105,0.000148,0.000187,0.000178,0.00045,0.000726,8.21e-05,6.47e-05,1.78e-05,1.04e-05,1.03e-05,1.23e-05,1.36e-05,1.49e-05,1.87e-05,2.34e-05,3.17e-05,6.84e-05,0.000103,0.000123,0.000148,0.000176,0.000195,0.000167,0.00165,0.00016,0.000208,6.1e-05,1.1e-05,1.01e-05,1.38e-05,1.28e-05,1.43e-05,1.72e-05,2.13e-05,2.47e-05,6.52e-05,9.92e-05,0.000107,0.000117,0.000135,0.000229,0.000148,0.000101,1.56e-05,1.22e-05,1.28e-05,9.94e-06,1.1e-05,1.63e-05,0,1.43e-05,1.16e-05,1.2e-05,1.95e-05,7.86e-05,0.000148,0.00011,6.15e-05,6.06e-05,0.000252,0.000349,1.63e-05,0,0,0.0358,1.31e-05,1.19e-05,0.000198,2.82e-05,2.79e-05,0,0,1.98e-05,0.000285,0.00018,0.000136,5.67e-05,4.33e-05,2.83e-05,2.87e-05,2.2e-05,1.4e-05,0,0.000372,1.45e-05,1.18e-05,0.0132,2.97e-05,0,0,7.25e-05,6.87e-05,0.143,0.000104,0.000166,7.27e-05,2.59e-05,1.8e-05,0,1.11e-05,0,1e-05,1.88e-05,1.07e-05,1.06e-05,2.21e-05,1.3e-05,1.15e-05,1.21e-05,1.23e-05,0,1.73e-05,4.21e-05,2.46e-05,2.23e-05,1.83e-05,1.82e-05,1.23e-05,1.24e-05,1.06e-05,1.19e-05,1.08e-05,1e-05,9.02e-06,1.06e-05,1.03e-05,1.06e-05,1.1e-05,1.06e-05,1.12e-05,1.04e-05,1.11e-05,1.12e-05,1.12e-05,1.08e-05,1.03e-05,1.06e-05,9.49e-06,9.98e-06,9.47e-06,9.67e-06,9.08e-06,9.31e-06],"winrateAvg":0.270183,"leadAvg":-1.63211,"scoreMeanAvg":-2.67152,"scoreStdevAvg":10.8401,"shorttermWinlossErrorAvg":0.117945,"shorttermScoreErrorAvg":0.880171,"ownership":[-79,-81,-82,-87,-92,-98,-22,37,71,86,86,85,78,66,44,11,-24,-43,-59,-77,-81,-78,-84,-84,-98,97,97,90,97,15,91,73,74,49,6,-22,-55,-76,-73,-78,-96,-84,-94,-98,-98,97,95,31,-6,30,14,89,64,3,7,-98,-84,-64,-84,-97,-86,-87,-98,-62,-71,98,98,-9,9,-16,19,40,74,-99,-99,-92,-45,-23,-92,-97,-87,-98,24,-70,98,91,97,40,11,15,20,74,74,-99,-95,-14,-10,-97,-79,-98,-98,90,93,89,90,97,27,3,-18,-17,75,-99,-97,-92,13,9,-6,20,-24,-19,20,53,92,96,44,11,-17,-87,-56,-99,-99,-85,-84,36,40,73,18,-3,41,22,22,35,28,14,5,-6,-28,-29,-49,-65,-73,-73,48,46,26,8,13,10,10,11,10,11,10,9,3,-8,-17,-36,-56,-64,-64,60,43,-8,18,-6,7,7,6,7,6,6,4,1,0,-19,-43,-61,-64,-60,67,89,90,20,14,10,7,5,4,3,2,0,-4,-7,-13,-89,-67,-63,-59,69,68,49,32,18,13,9,4,1,0,-1,-2,-5,-6,-25,-47,-62,-63,-56,64,63,46,29,22,16,11,4,0,-1,-1,-2,-5,-10,-21,-41,-61,-52,-51,58,62,52,39,22,18,12,4,2,0,-1,-4,-7,-11,-16,-42,-63,-69,-38,44,64,87,51,42,28,13,2,2,2,0,-3,-7,-9,-37,-91,-90,-12,-14,23,-4,-18,0,79,78,30,-31,-2,6,6,6,5,10,-57,-14,80,53,14,-10,-17,-55,-89,-89,8,-26,9,2,14,15,14,30,88,57,89,70,53,43,-27,-46,-58,-73,-80,-74,-83,-33,-10,7,19,30,48,68,77,78,68,61,52,-41,-49,-59,-67,-71,-68,-51,-35,-16,0,15,29,45,59,69,71,68,64,58],"ownershipAllowedMAE":0.0336164})%"); + lines.push_back(R"%({"sample":{"board":".................../..OOXO............./..OXXO..X....O...../..OX.......O...O.O./...X.O...........X./..O.....X.....X.X../....X............../..X.........O....../...........OXOO..../...........X.X...../.....O......X...O../.X.XXOX........XXO./.OX.OX.X.O.......XX/.OOXO.X.......XXXO./..O.XX....X..XXOOO./.O.X..X.O..O.XOOO../...XO.O.O.O.OOXOXXO/.O.XO...OXXO.OXOXO./..............XXX../","hintLoc":"null","initialTurnNumber":108,"metadata":"0C3ED2E0BFF0960DAE3BFB5D834C06A9:118","moveLocs":["D14","S12","C15","B15","B14","A14","B13","N10","Q12","Q13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":35.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.18e-06,1.16e-05,1.04e-05,0.000781,0.00288,0.000422,1.5e-05,1.36e-05,1.33e-05,1.29e-05,1.27e-05,1.25e-05,1.21e-05,1.18e-05,1.19e-05,1.13e-05,1.12e-05,1.15e-05,9.51e-06,1.52e-05,1.25e-05,0,0,0,0,1.57e-05,0.000995,2.64e-05,7.55e-05,9.96e-05,0.000125,2.61e-05,0.000109,1.81e-05,1.78e-05,1.46e-05,1.31e-05,1.15e-05,1.35e-05,1.5e-05,0,0,0,0,1.68e-05,5.19e-05,0,9.57e-05,0.00583,0.000219,0.000252,0,6.04e-05,2.26e-05,1.37e-05,0.000101,1.07e-05,1.1e-05,0.00487,0,0,1.12e-05,1.68e-05,0.000464,0.00021,0.000121,0.00826,0.0214,0,0.0107,0.000159,0.17,0,0.00695,0,2.9e-05,1.09e-05,0,0,0,1.1e-05,0,1.53e-05,0.000166,9.51e-05,0.000855,0.0201,0.00403,9.39e-05,4.42e-05,1.47e-05,1.9e-05,3.12e-05,0,1.08e-05,0,0,0,0,1.05e-05,1.37e-05,4.68e-05,2.71e-05,0,5.81e-05,0.000548,0.00027,0.000226,1.6e-05,0,3.81e-05,0,1.04e-05,1.2e-05,1.55e-05,0,9.54e-06,9.76e-06,0,1.29e-05,1.75e-05,5.77e-05,2.66e-05,0.000104,0.000106,0.000403,7.81e-05,3.45e-05,0.118,0,0.0448,2e-05,1.12e-05,9.8e-06,9.64e-06,0,1.03e-05,1.12e-05,1.31e-05,1.68e-05,2.19e-05,5.99e-05,6.95e-05,4.65e-05,3.12e-05,0,1.25e-05,0.000334,0,0.337,0,1.16e-05,1.1e-05,1.01e-05,1.06e-05,1.11e-05,1.21e-05,1.36e-05,1.56e-05,1.91e-05,2.79e-05,4.15e-05,0.0626,0,0.16,0,0,6.15e-05,0.000279,1.76e-05,1.14e-05,1.1e-05,1.12e-05,1.12e-05,1.15e-05,1.21e-05,1.25e-05,1.44e-05,1.66e-05,1.83e-05,1.85e-05,3.5e-05,0,0,0,1.29e-05,1.45e-05,1.51e-05,2.03e-05,1.22e-05,1.08e-05,1.07e-05,1.1e-05,1.05e-05,1.15e-05,0,1.31e-05,1.3e-05,1.49e-05,1.51e-05,1.52e-05,1.37e-05,0,1.13e-05,1.2e-05,1.51e-05,0,1.34e-05,1.19e-05,1.13e-05,0,1.16e-05,0,0,0,0,1.07e-05,1.3e-05,1.33e-05,1.32e-05,1.24e-05,1.15e-05,1.19e-05,1.06e-05,0,0,0,1.19e-05,2.62e-05,0,0,1.12e-05,0,0,9.45e-06,0,1.24e-05,0,1.29e-05,1.28e-05,1.16e-05,1.02e-05,9.61e-06,9.43e-06,9.78e-06,0,0,1.07e-05,0,0,0,0,1.31e-05,0,1.06e-05,1.33e-05,1.35e-05,1.29e-05,1.29e-05,1.13e-05,9.89e-06,0,0,0,0,1.11e-05,3.12e-05,9.39e-06,0,1.32e-05,0,0,1.01e-05,1.11e-05,1.41e-05,1.21e-05,0,1.27e-05,1.03e-05,0,0,0,0,0,1.11e-05,1.08e-05,0,1.6e-05,0,1.52e-05,1.1e-05,0,1.13e-05,0,0.00161,6.62e-05,0,1.04e-05,0,0,0,0,1.13e-05,1.33e-05,1.95e-05,0.00623,5.09e-05,0,0,3.65e-05,0,1.37e-05,0,6.06e-05,0,0,0,0,0,0,0,0,0,1.71e-05,0,0.00384,0,0,1.36e-05,1.43e-05,1.2e-05,0,0,0,0,9.01e-06,0,0,0,0,0,1.24e-05,9.23e-06,0.000212,1.19e-05,1.15e-05,1.23e-05,1.2e-05,1.18e-05,1.1e-05,1.06e-05,9.72e-06,9.71e-06,1.07e-05,9.96e-06,1.07e-05,0,0,0,1.16e-05,1.07e-05,8.45e-06],"winrateAvg":0.718708,"leadAvg":2.07428,"scoreMeanAvg":2.84473,"scoreStdevAvg":10.6474,"shorttermWinlossErrorAvg":0.153618,"shorttermScoreErrorAvg":1.12051,"ownership":[39,40,40,14,6,10,1,-10,-14,-10,3,20,38,53,60,61,59,56,53,36,42,49,51,-97,38,-1,-13,-27,-10,5,21,43,60,68,65,62,54,47,27,36,49,-98,-98,37,-6,-18,-60,-9,4,27,39,86,64,65,66,42,42,19,2,48,-99,-45,0,-18,-18,-14,-6,2,71,20,34,2,79,33,63,18,-12,4,-99,-99,-43,31,-12,-21,-11,-8,-3,5,15,20,7,5,20,-26,8,-13,-99,-95,-99,-54,-18,-22,-24,-71,-11,-4,4,6,3,-42,-4,-41,-10,-7,-82,-99,-96,-82,-95,-27,-28,-25,-20,-6,1,7,18,12,-5,31,-1,-9,6,-87,-88,-99,-66,-53,-37,-27,-22,-14,-4,9,31,78,42,16,-33,-15,35,12,-79,-77,-72,-59,-50,-39,-31,-23,-15,-7,-7,63,13,81,81,25,20,15,18,-70,-71,-65,-58,-51,-42,-37,-24,-16,-11,13,-45,15,-26,43,16,16,17,8,-59,-62,-61,-62,-50,-19,-47,-29,-16,-11,-11,-23,-63,-6,-6,-20,46,2,-14,17,-84,-80,-90,-90,-16,-89,-43,-12,-4,-10,-16,-22,-29,-39,-98,-99,7,-56,35,83,-82,5,3,-94,-86,-94,-20,46,-7,-13,-21,-31,-49,-81,-97,-98,-98,77,83,83,4,7,-80,-96,-39,5,1,-18,-13,-8,-52,-99,-99,-99,-87,-94,82,83,84,66,-97,-96,-62,-3,7,8,-62,5,-20,-99,-99,-88,-87,-87,-90,81,83,17,-63,-57,-36,-86,4,97,2,16,93,13,-99,-87,-85,-84,-87,-87,78,62,25,-63,53,-21,68,37,97,88,94,91,94,94,-87,-85,-88,-87,-85,67,77,-28,-67,55,47,42,73,97,85,86,94,91,94,-87,-82,-87,-86,-87,50,-1,-23,-33,-8,35,58,78,88,90,90,90,90,74,-86,-86,-87,-88,-87],"ownershipAllowedMAE":0.0340564})%"); + lines.push_back(R"%({"sample":{"board":".O.XO...........X../OXX.OX.O.....OXXOX./OOOOOXXXO....OXOOO./XXXXXO.XO.O.OXXXO../.....O.XX.X.OO..O../XOO.O.X....X..XXO../.XO..O..X.O.X.XOOO./..X.O.OOO..X.XOOXX./.X.X.O.XO.X.OOXOOX./..OX..O..X..OXXXXXX/..XX...OOX..OXOXX../..XOX.XOXOOXOO.XOXX/.XOOXOOXX...XO.XOO./XXXO..X...XXO.OXO../.XO..XXO...OOOXXO../.OOOO......OXXXOO../.OXXXOX...OXOOOX.../.X...X........OXO../.................../","hintLoc":"null","initialTurnNumber":97,"metadata":"DC0B17E6495A4D9DBD5D34504141B4FD:107","moveLocs":["K12","K15","M15","L14","N12","O13","M13","N14","S15","L17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.25,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":10.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.71e-06,0,3.67e-06,0,0,1.23e-05,3.79e-06,3.67e-06,4.76e-06,4.8e-06,4.84e-06,4.42e-06,3.96e-06,4.12e-06,4e-06,3.91e-06,0,3.87e-06,3.37e-06,0,0,0,4.18e-06,0,0,3.38e-06,0,0.000411,0.0362,0.176,0.00253,3.97e-06,0,0,0,0,0,3.77e-06,0,0,0,0,0,0,0,0,0,0.0589,0,0.163,1.11e-05,0,0,0,0,0,3.67e-06,0,0,0,0,0,0,3.32e-06,0,0,0.547,0,4.1e-05,0,0,0,0,0,2.85e-06,3.41e-06,8.22e-06,3.99e-06,3.38e-06,3.37e-06,3.36e-06,0,3.16e-06,0,0,0,0,0,0,0,0.000293,0.000693,0,0,3.25e-06,0,0,0,3.4e-06,0,3.3e-06,0,3.23e-06,3.08e-06,3.34e-06,0,0,0,2.96e-06,0,0,0,2.91e-06,3.27e-06,2.71e-05,0,0,3.39e-06,3.53e-06,0,3.26e-06,3.53e-06,0,3.4e-06,0,0,0,0,0,0,0,0,5.64e-06,5.11e-06,2.57e-05,0,3.33e-06,0,3.2e-06,0,0,0,0,3.75e-06,0,0,0,0,0,0,0,0.00364,3.31e-06,0,3.59e-06,0,3.07e-06,0,3.21e-06,0,0,3.46e-06,0,3.68e-06,0,0,0,0,0,0,3.57e-06,3.29e-06,3.37e-06,0,0,3.37e-06,3.37e-06,0,3.32e-06,3.36e-06,0,3.39e-06,3.62e-06,0,0,0,0,0,0,0,3.37e-06,3.65e-06,0,0,4.18e-05,9.26e-06,5.38e-06,0,0,0,3.45e-06,3.68e-06,0,0,0,0,0,2.1e-05,1.13e-05,3.42e-06,3.87e-06,0,0,0,0.0021,0,0,0,0,0,0,0,0,0.00247,0,0,0,0,3.43e-06,0,0,0,0,0,0,0,0,6.3e-06,3.67e-06,6.41e-06,0,0,3.2e-06,0,0,0,4.04e-06,0,0,0,0,0.000119,3.15e-05,0,0.000129,4.5e-06,6.02e-06,0,0,0,3.14e-06,0,0,0,3.56e-06,3.61e-06,6.43e-06,0,0,3.08e-06,4.95e-06,0,0,0,4.34e-06,4.29e-06,3.78e-06,0,0,0,0,0,0,3.73e-06,3.3e-06,3.5e-06,0,0,0,0,0.00301,0.000278,4.93e-06,6.62e-06,4.02e-06,3.45e-06,0,0,0,0,0,0,3.64e-06,3.38e-06,3.76e-06,0,0,0,0,0,0,5.75e-06,5.12e-06,3.73e-06,0,0,0,0,0,0,3.3e-06,3.46e-06,3.14e-06,0.000617,0,0.000796,7.97e-05,0.000191,0,0.00048,1.31e-05,3.91e-06,3.98e-06,3.6e-06,3.44e-06,3.57e-06,3.63e-06,0,0,0,3.5e-06,3.31e-06,3.24e-06,0.000306,6.69e-05,8.39e-05,2.72e-05,4.54e-05,3.93e-06,3.6e-06,3.55e-06,3.47e-06,3.39e-06,3.34e-06,3.41e-06,3.42e-06,3.39e-06,3.37e-06,3.26e-06,3.39e-06,2.94e-06,5.85e-06],"winrateAvg":0.87087,"leadAvg":7.94763,"scoreMeanAvg":7.66845,"scoreStdevAvg":14.6966,"shorttermWinlossErrorAvg":0.320909,"shorttermScoreErrorAvg":6.76739,"ownership":[86,96,51,6,97,9,-4,21,47,47,38,15,-16,-51,-68,-85,-87,-73,-6,98,6,5,58,98,-88,-43,62,58,46,43,26,-24,-13,-92,-92,98,-73,70,98,98,98,98,98,-87,-88,-90,70,45,7,40,-19,-15,-92,98,97,97,85,-94,-94,-94,-94,-92,92,-28,-89,69,16,46,28,45,-92,-93,-93,97,90,84,-93,-19,37,16,35,90,1,-89,-90,-92,-93,45,39,36,-74,30,97,98,82,-96,94,93,65,99,44,-84,-61,-69,-68,-93,-92,-93,-60,-94,-95,97,90,83,-96,-97,91,27,87,100,36,15,-81,-44,92,92,-94,-95,-95,98,97,98,34,-98,-97,-99,-12,100,99,100,100,100,100,82,65,99,-95,98,98,-97,-97,-9,-98,-100,-99,-100,21,100,99,96,100,76,45,73,99,99,-97,97,98,-97,-86,-99,-99,-98,-100,-23,38,100,96,66,45,58,70,99,-98,-98,-98,-97,-97,-97,-99,-99,-100,-100,-55,-51,69,99,99,44,52,56,99,-98,18,-98,-97,-97,-97,-99,-99,-100,-79,-93,14,11,99,-77,54,53,21,99,99,5,-97,98,-96,-97,-98,-99,-75,-76,-92,13,17,-79,-79,-28,3,33,34,99,-40,-97,98,98,-47,-99,-98,-98,-74,-82,-87,-98,-37,-33,-13,-44,-40,99,88,88,-96,98,93,90,-90,-98,-70,-75,-84,-98,-98,11,-15,8,28,98,99,99,-96,-96,97,93,89,-78,-69,-67,-67,-67,-70,-78,-37,-8,14,51,98,-94,-95,-95,96,96,94,92,-73,-68,-86,-86,-86,-61,-94,-36,-15,29,95,84,97,96,96,92,95,94,93,-75,-81,-82,-83,-83,-89,-35,-23,1,26,76,83,87,91,96,92,95,94,94,-78,-81,-82,-81,-81,-70,-50,-26,-2,34,60,79,86,90,93,94,94,94,94],"ownershipAllowedMAE":0.0643152})%"); + lines.push_back(R"%({"sample":{"board":".................../........O.O.OO...../...X.....OXXXXOOO../..............XXX../..X................/.................../.................../.................../...............X.../.................../...X.............../.................../........X........../............O....../..XX..OOX.....OO.../..OX.O.X.X...OX.OO./..O....O.....OX.XX./....O........OX..../.................../","hintLoc":"null","initialTurnNumber":25,"metadata":"0442956C7BD975DDDA3110D6D09B9798:35","moveLocs":["R8","C11","C10","D11","F8","K15","L14","P9","N7","O7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.4,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":0.267,"policyMixture":[2.85e-06,3.45e-06,3.35e-06,3.84e-06,3.9e-06,4.09e-06,4.34e-06,3.97e-06,4.12e-06,1.03e-05,6.11e-06,5.07e-06,5.97e-06,6.26e-06,8.96e-06,1.24e-05,3.77e-06,3.88e-06,2.9e-06,3.48e-06,4.53e-06,5.38e-06,6.15e-06,1.12e-05,2.02e-05,2.71e-05,1.09e-05,0,3.06e-05,0,0.00109,0,0,8.34e-05,1.31e-05,4.83e-06,4.73e-06,3.96e-06,3.35e-06,5.31e-06,5.68e-06,0,9.79e-06,0.000133,0.000115,9.81e-05,6.78e-06,0,0,0,0,0,0,0,0,0.0136,5.1e-06,3.6e-06,6.48e-06,7.19e-06,8.95e-06,1.33e-05,0.000117,6.08e-05,1.44e-05,2.53e-05,1.08e-05,9.22e-06,4.11e-06,3.62e-06,4.21e-06,0,0,0,3.78e-05,5.9e-06,4.6e-06,9.47e-06,0,1.76e-05,9.39e-05,0.000108,7.43e-05,5.41e-05,1.64e-05,0,1.45e-05,7.15e-06,6.42e-06,6.38e-06,3.94e-06,3.68e-06,4.59e-06,2.7e-05,4.4e-06,4.76e-06,5.09e-05,2.91e-05,0.00025,0.000788,0.000217,0.000159,0.000103,2.13e-05,0.000178,0,7.14e-06,8.79e-06,7.36e-06,6.46e-06,6.31e-06,7.56e-06,6.44e-06,3.77e-06,4.8e-06,2.63e-05,0.0926,0.000358,4.29e-05,0.000209,0.00022,0.000184,0.000195,2.07e-05,1.07e-05,1.19e-05,1.12e-05,9.96e-06,8.76e-06,8.54e-06,8.71e-06,7.59e-06,3.77e-06,4.33e-06,1.81e-05,8.32e-06,8.96e-06,0.000162,0.000169,0.000261,0.0002,0.000131,5.89e-05,3.99e-05,2.07e-05,1.77e-05,1.51e-05,1.13e-05,8.7e-06,1.27e-05,7.86e-06,3.88e-06,4.42e-06,3.5e-05,0,0,1.09e-05,0.00647,0.000259,0.000198,0.00014,9.04e-05,7.09e-05,6.8e-05,7.7e-05,8.52e-05,1.18e-05,0,1.99e-05,1.11e-05,4.13e-06,5.85e-06,0.000122,0,8.47e-06,2.1e-05,0.000124,0.000153,0.000125,0.000117,9.76e-05,8.6e-05,0.0001,0.000141,0.00016,8.71e-05,0.017,0.0475,1.88e-05,4.26e-06,4.71e-06,3e-05,6.65e-06,0,1.06e-05,1.75e-05,2.62e-05,6.6e-05,7.45e-05,6.94e-05,7.78e-05,5.59e-05,4.95e-05,2.51e-05,0,0.0305,2.65e-05,1.71e-05,4.41e-06,3.96e-06,7.36e-06,8.22e-06,7.6e-06,8.49e-06,0,1.2e-05,4.24e-05,1.11e-05,1.85e-05,3.07e-05,0.00027,0.00298,0.176,2.93e-05,1.23e-05,0,1.02e-05,4.55e-06,3.99e-06,6.73e-06,8.16e-06,8.14e-06,9.57e-06,7.99e-06,2.32e-05,1.01e-05,0,8.03e-06,1.42e-05,0.00158,0,0,9.81e-06,2.48e-05,9.62e-06,0.000718,4.18e-06,4.31e-06,1.05e-05,4.63e-06,5.18e-06,8.33e-06,1.76e-05,6.58e-06,2.26e-05,6.71e-06,7.91e-06,9.24e-06,0.327,0,0.0656,5.86e-06,5.55e-06,1.91e-05,4.43e-05,5.54e-06,5.88e-06,0.000122,0,0,5.16e-06,6.7e-06,0,0,0,4.38e-06,9.06e-06,1.03e-05,0.11,7.1e-06,0,0,4.25e-06,4.37e-05,5.64e-06,5.8e-06,0.000206,0,0,1.61e-05,0,1.13e-05,0,2.85e-05,0,6.46e-06,1.34e-05,7.85e-06,0,0,0.0495,0,0,0.000795,4.72e-06,1.68e-05,0,0.000313,7.31e-05,2.56e-05,0.00312,0,0.0386,1.83e-05,1.42e-05,1.68e-05,5.49e-06,0,0,7.21e-06,0,0,1.19e-05,5.07e-06,1.03e-05,8.58e-06,9.58e-06,0,4.67e-05,1.22e-05,5.22e-05,6.28e-05,2.12e-05,1.9e-05,1.21e-05,2.25e-05,0,0,1.1e-05,0.000294,7.81e-06,6.74e-06,3.14e-06,4.25e-06,4.45e-06,4.17e-06,4.66e-06,4.08e-06,4.92e-06,4.93e-06,4.73e-06,4.52e-06,4.4e-06,6.1e-06,5.86e-06,0.00357,4.81e-05,1.07e-05,1.11e-05,4.83e-05,3.27e-06,4.16e-06],"winrateAvg":0.314752,"leadAvg":-1.46417,"scoreMeanAvg":-2.74643,"scoreStdevAvg":12.8747,"shorttermWinlossErrorAvg":0.119117,"shorttermScoreErrorAvg":1.02995,"ownership":[-62,-61,-57,-45,-28,0,24,52,67,78,76,75,76,81,82,81,78,72,57,-63,-64,-65,-54,-30,-9,17,38,91,83,85,-47,87,87,84,86,77,71,33,-63,-66,-69,-89,-22,-7,1,6,42,89,-86,-87,-86,-87,90,90,91,32,26,-58,-70,-65,-44,-25,-11,3,10,24,40,9,-34,-50,-73,-93,-92,-92,7,-11,-46,-54,-90,-38,-18,-6,1,7,19,73,12,-18,-31,-43,-51,-60,-62,-66,-32,-30,-35,-20,-17,-8,-1,0,0,4,-4,-72,-32,-33,-37,-43,-48,-56,-47,-46,-11,-16,-33,6,3,4,0,-3,-4,-8,-21,-22,-24,-29,-36,-48,-49,-51,-47,1,5,13,12,1,6,2,-2,-3,-7,-10,-13,-15,-20,-34,-52,-56,-52,-47,-2,2,55,56,14,2,2,-3,-6,-8,-9,-11,-10,-13,-18,-86,-56,-48,-43,-24,-38,-80,6,-3,6,-1,-4,-8,-10,-10,-8,-4,-2,8,-29,-49,-38,-34,-43,-57,-62,-88,-22,-19,-11,-9,-14,-14,-11,-5,3,21,65,-11,-11,-20,-21,-50,-53,-46,-55,-45,-82,-19,-18,-26,-22,-17,-5,24,16,30,13,-48,-14,-3,-50,-46,-52,-39,-24,-16,-5,-7,-83,-37,-25,-27,-49,81,41,24,11,13,15,-42,-60,-57,-37,-3,-4,19,0,-35,-35,-22,-27,69,55,59,46,34,33,33,-19,-21,-83,-83,-11,31,78,79,-76,-46,-11,5,21,75,95,95,61,47,50,14,22,81,-83,-5,86,50,-37,-37,-79,-22,5,32,90,-37,21,86,86,28,36,59,82,-18,10,61,47,72,-28,-34,-4,8,36,90,-35,-12,-37,-39,-4,48,61,77,77,90,67,57,51,0,-7,-1,23,37,90,-37,-12,-27,-24,-28,58,69,75,79,76,69,53,32,10,-4,4,21,46,33,13,-15,-22,-25,-25],"ownershipAllowedMAE":0.0238576})%"); + lines.push_back(R"%({"sample":{"board":"..........X.../..X.X...O.OXO./..XXOX..XXOXX./.OXOO...OXOOOX/.OOX.X.XOOXOX./.OXX...O.OXXX./.OO....OOX.X../.X.O..XOX.XOX./.XO.O.OXXXOOOX/.XXO....OO.XO./..O.........O./..X......OXO../.........OO.../..X.....OXXXX./..X.....O...../.XOX.....OOOO./.OOX....OXXXO./.O.OX..XX.XOX./..O.O....X..../","hintLoc":"null","initialTurnNumber":125,"metadata":"5D9983724528E875E54B76F0079EB14A:135","moveLocs":["H17","K18","G16","F16","H10","D9","E9","D8","F7","F10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.28,"xSize":14,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.11e-06,4.25e-06,6.09e-06,3.6e-06,4.04e-06,3.83e-06,5.01e-06,6.03e-06,6.62e-06,2.83e-06,0,2.4e-06,2.52e-06,2.25e-06,6.06e-06,0.000252,0,3.44e-06,0,4.9e-06,0.000133,2.93e-05,0,0,2.97e-06,0,0,2.44e-06,5.16e-06,0.000395,0,0,0,0,6.62e-06,0,0,0,2.86e-06,0,0,2.34e-06,3.82e-06,0,0,0,0,0,0,3.79e-05,0,0,2.74e-06,2.73e-06,2.74e-06,0,2.84e-06,0,0,0,0.000588,0,0.0044,0,0,0,0,2.79e-06,0,2.22e-06,2.7e-06,0,0,0,0.0122,0.000205,3.69e-05,0,4.56e-06,0,0,0,0,3.37e-06,4.64e-06,0,0,0.000504,0.000457,0.00251,0.00112,0,0,0,0,0,2.22e-05,6.12e-06,4.98e-06,0,0.000174,0,0.000363,0.0116,0,0,0,0.0375,0,0,0,1.92e-05,3.97e-06,0,0,0.000473,0,0.126,0,0,0,0,0,0,0,0,3.21e-06,0,0,0,0.494,0,0.0163,0,0,0,2.47e-06,0,0,8.62e-06,3.32e-06,5.17e-06,0,0,0,0.288,0.000176,4.74e-06,2.81e-06,2.26e-06,2.41e-06,2.3e-06,0,2.29e-06,3.14e-06,8.57e-06,0,0,0.000769,0.000177,6.92e-05,4.8e-06,2.58e-06,0,0,0,2.35e-06,2.37e-06,3.53e-06,4.54e-06,1.09e-05,2.61e-05,3.96e-05,0,1.03e-05,5.24e-06,3.08e-06,0,0,2.41e-06,2.59e-06,2.35e-06,4.62e-06,1.12e-05,0,5.57e-06,5.17e-05,2.34e-05,1.83e-05,4.7e-06,0,0,0,0,0,2.53e-06,5.69e-06,0.000191,0,2.98e-05,6.42e-05,5.26e-05,1.59e-05,5.32e-06,0,2.9e-06,2.38e-06,2.27e-06,2.65e-06,2.62e-06,8.85e-06,0,0,0,1.85e-05,3.65e-05,2.75e-05,6.99e-06,5.09e-06,0,0,0,0,2.51e-06,3e-06,0,0,0,7.68e-05,1.87e-05,1.22e-05,4.22e-05,0,0,0,0,0,4.2e-06,2.3e-06,0,2.38e-06,0,0,0.000378,8.26e-06,0,0,0,0,0,0,0.000193,2.36e-06,2.49e-06,0,4.14e-06,0,8.39e-06,5.15e-06,3.37e-06,2.93e-06,0,0.00036,1.22e-05,3.29e-05,3.55e-06,6.67e-06],"winrateAvg":0.997245,"leadAvg":6.7311,"scoreMeanAvg":6.68153,"scoreStdevAvg":3.29096,"shorttermWinlossErrorAvg":0.0240961,"shorttermScoreErrorAvg":1.03241,"ownership":[-46,-81,-90,-92,-71,-30,4,-31,-81,-92,-100,-100,-99,-99,-21,-41,-100,-98,-100,-27,62,-60,-60,-100,-100,-100,-99,-100,21,21,-100,-100,-99,-100,51,96,-100,-100,-100,-100,-100,-100,56,99,-100,-99,-99,-100,96,96,99,-100,-100,-100,-100,-100,88,99,99,-99,-99,-100,-74,-79,99,99,-100,-100,-100,-100,83,99,-99,-99,-44,-46,6,100,98,99,-100,-100,-100,-98,16,99,99,23,-14,-47,20,100,100,-36,-35,-100,-97,-97,1,-99,34,99,34,-33,-49,100,95,95,-34,100,-98,-94,-61,-99,75,65,99,-29,98,94,95,94,100,100,100,-94,-92,-99,-99,94,88,-19,70,100,100,100,99,99,100,81,-97,-99,-97,-99,94,65,64,75,84,96,99,99,100,98,-95,-97,-100,-99,-22,55,66,69,79,100,99,100,99,99,-89,-93,-82,-25,11,92,59,62,86,100,100,99,99,99,-52,-93,-99,-40,-4,3,-8,33,100,98,98,98,98,99,-28,4,-99,-57,-18,-2,-7,20,100,99,99,99,99,99,47,6,99,-86,-23,-14,-12,-35,52,100,100,100,100,97,68,99,99,-86,-30,-27,-30,-36,52,-100,-100,-100,100,67,97,99,92,92,-52,-7,-51,-100,-100,-99,-99,-88,-90,56,97,97,97,80,81,-32,-52,-78,-97,-100,-98,-95,-86,-29],"ownershipAllowedMAE":0.0371877})%"); + lines.push_back(R"%({"sample":{"board":".OO..OOOX....XXO.XX/XO.OOOXXXOX..XOO.X./.XOXXO.XOXXXXXXOOOX/..XX.OOOOX.XOX.XXOO/XXX.XOXXOOXXO.XXOOO/XOXOXXX.XOOX..OXO.X/.OOX.XXXO.OXO..XOOX/..OXXXOO.OOX..OXXX./.OOXXO.OO.O.X...X../O..OOO.O...O.XOXOO./.O..OOO....O.XXXXO./.O.OXXXOO..OX...OO./XOOXX..X...OX.OOOX./XOOXOOO.O...OOOX.X./.XXOOXOOXOOOO...XX./...XXXO.X.OXOXXXXOO/..X.XOO.X.XXOX.XO.O/....XXO.X..XX.XOOOX/.....X.OOX...X.XO../","hintLoc":"null","initialTurnNumber":76,"metadata":"E0B13507E1EAC999414E6CB203F7610F:86","moveLocs":["P1","C18","T18","Q1","T1","P1","C17","T12","A8","A5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.42,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":-0.0,"policyOptimism":0.293,"pda":0.382,"policyMixture":[0.0138,0,0,0.000592,0.00048,0,0,0,0,0.00103,0.0109,0.000576,0.000425,0,0,0,0.0279,0,0,0,0,0.0608,0,0,0,0,0,0,0,0,0.000417,0.000409,0,0,0,0.0118,0,0,0.0128,0,0,0,0,0,0.0364,0,0,0,0,0,0,0,0,0,0,0,0.000122,0.0035,0.00882,0,0,0.00529,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000378,0,0,0,0,0,0,0,0,0,0.000416,0,0,0,0,0,0,0,0,0,0,0,0,0.00632,0,0,0,0,0.000411,0.000416,0,0,0,0.000903,0,0.2,0,0,0,0,0,0,0,0,0.000462,0,0,0,0.000417,0.00042,0,0,0,0,0.00113,0.000497,0,0,0,0,0,0,0.000477,0,0,0,0.000464,0.00042,0,0,0,0,0,0.00052,0,0,0,0,0,0.000473,0,0,0.000469,0,0.00854,0,0.000541,0.000457,0.000527,0,0.0108,0.00647,0,0.000505,0.000497,0,0,0,0.000481,0,0.000443,0.000438,0.000476,0,0.0095,0,0,0,0,0,0.00579,0.000489,0,0.000458,0.000496,0,0,0,0.000489,0.000446,0.000433,0.000432,0,0.0327,0,0,0,0,0,0.00108,0,0,0.000496,0,0,0,0,0,0,0.000451,0.000438,0,0,0.0149,0.00138,0.00132,0,0,0.0099,0,0,0,0,0,0.000524,0.000981,0,0.00237,0.00047,0.000456,0,0,0.00194,0,0,0,0,0.00691,0,0,0,0,0,0,0,0.00204,0,0.000616,0.000476,0.000505,0,0,0,0,0.0118,0,0.000541,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00108,0.00328,0.000575,0,0,0.00445,0.00662,0.00747,0.00649,0,0,0,0,0.00416,0,0.0291,0,0,0,0,0,0,0,0,0,0.00109,0.189,0,0.000544,0,0,0,0.00397,0,0.00232,0,0,0,0,0,0,0,0.000431,0,0.00379,0.00614,0.0121,0.00723,0,0,0,0.0214,0,0.0571,0.000909,0,0,0,0,0,0,0,0.000427,0.000473,0.00366,0.00213,0.00351,0.000465,0,0.0569,0,0,0,0.00575,0.00367,0.000504,0,0,0,0,0.000424,0,0.000948],"winrateAvg":0.00311987,"leadAvg":-7.12187,"scoreMeanAvg":-7.1525,"scoreStdevAvg":2.97131,"shorttermWinlossErrorAvg":0.0224444,"shorttermScoreErrorAvg":1.00818,"ownership":[58,98,99,98,99,100,100,100,-96,-97,-97,-99,-100,-100,-100,76,5,-81,-79,-97,98,73,100,100,100,-96,-95,-96,-96,-100,-99,-100,-100,78,77,1,-76,-45,-96,-99,74,-100,-100,100,68,-96,100,-100,-100,-100,-100,-100,-100,78,77,75,-45,-99,-98,-100,-100,-7,100,100,100,100,-100,-100,-100,-99,-100,-100,-100,-100,77,75,-100,-100,-100,-100,-100,100,-100,-100,100,100,-100,-100,-99,-99,-100,-100,77,78,77,-100,100,-100,-100,-100,-100,-100,-37,-34,100,100,-100,-99,-99,-99,-100,79,-54,-100,67,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-98,-99,-99,-100,78,77,-100,94,97,100,-100,-100,-100,100,100,100,100,100,-100,-99,-99,-98,-100,-100,-100,-100,98,100,100,-100,-100,100,100,100,100,100,100,-3,-100,-99,-99,-99,-100,-23,-51,100,100,100,100,100,100,100,100,100,100,100,100,13,-100,-99,-100,100,100,-3,100,100,100,100,100,100,100,100,100,100,100,100,1,-100,-100,-100,-100,100,73,100,100,100,100,99,99,99,100,100,99,100,100,-98,-78,-26,40,100,100,29,-89,100,100,99,99,99,99,99,99,99,99,100,-98,51,100,100,100,-100,-2,-88,100,100,99,100,100,100,99,100,99,99,100,100,100,100,-88,17,-100,-50,-89,-87,-88,100,100,-99,100,100,-99,100,100,100,100,39,-8,-73,-100,-100,43,-86,-86,-91,-98,-99,-99,100,25,-98,-3,100,-100,100,-100,-100,-100,-100,100,100,-90,-87,-99,-97,-99,100,100,-36,-98,-95,-100,-100,100,-100,-100,-100,100,100,100,-92,-93,-96,-98,-99,-99,99,31,-98,-93,-97,-100,-100,-100,-100,100,100,100,100,-95,-95,-96,-98,-98,-99,53,88,87,-95,-96,-97,-100,-100,-100,-100,100,100,100],"ownershipAllowedMAE":0.0351965,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".OO.OXX............/XO.OOX.X.........X./O...OOXXOOX..OOOOX./XO.OXOOXXXX.XXXXX../.OOOXXOOX...X....../O.OX.XXX.XO.OX...O./XXOOO.X.XX.OOXX.XXX/..XX.OXXOXXOXXXXXOX/.X.XOXOOOOO.OXOOXO./..XOO.......OXOXXO./.XOO.O......OXOXOO./.XOO.O......OOOXXO./.OXXO........XOOOOO/.OX.XO.....OOXXO.XO/.X.XXOOOO.O.X.X.XXX/XXXOOOXXOOXXXOXXX../OOOOXXXOOOOXO.OOOXX/..OXX.XXOXXXOO.XOOX/........X..XXO.O.OO/","hintLoc":"null","initialTurnNumber":245,"metadata":"0EEFC51D2F94E403AD81B956374BAC9F:255","moveLocs":["M15","L15","N7","D1","E14","T11","T10","B14","A15","M16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":7.5,"policyOptimism":0.0,"pda":1.112,"policyMixture":[0.000322,0,0,0.000307,0,0,0,0.0167,0.000363,0.000411,0.000401,0.000533,0.000646,0.00274,0.00768,0.00369,0.00096,0.00052,0.000308,0,0,0.000302,0,0,0,0,0,0.000313,0.000318,0.00869,0.0227,0.0172,0.00291,0.00156,0.000563,0.0203,0,0.000585,0,0.000312,0.00029,0.000307,0,0,0,0,0,0,0,0.000353,0.00826,0,0,0,0,0,0.0103,0.000306,0,0.00029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0173,0.00227,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000297,0.000297,0.000301,0.00897,0.0185,0.0148,0,0,0,0.000297,0,0,0,0,0,0,0,0.248,0,0,0.00029,0.000298,0.0003,0,0.000322,0,0,0,0,0,0.000562,0,0,0,0,0.0481,0,0,0,0,0.000293,0,0,0,0.0169,0.0179,0,0,0.000594,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0171,0,0,0,0,0,0,0,0,0,0,0.15,0,0,0,0,0,0,0,0.0193,0.0182,0,0,0,0.000313,0.000297,0.000292,0.000291,0.000287,0.000291,0.000293,0,0,0,0,0,0,0,0.0189,0,0,0,0.000315,0,0.000296,0.000287,0.000285,0.000283,0.000282,0.000287,0,0,0,0,0,0,0.000295,0.00374,0,0,0,0.000323,0,0.000297,0.000285,0.000283,0.000284,0.000282,0.000291,0,0,0,0,0,0,0.000296,0.0182,0,0,0,0,0.000315,0.000298,0.000284,0.000285,0.000287,0.000293,0.00029,0,0,0,0,0,0,0,0.00115,0,0,0,0,0,0.000293,0.000292,0.000293,0.000296,0.000314,0,0,0,0,0,0.00063,0,0,0.0176,0,0,0,0,0,0,0,0,0.00031,0,0.000965,0,0.000889,0,0.000879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0179,0.0172,0,0,0,0,0,0,0,0,0,0,0,0,0,0.12,0,0,0,0,0,0.000301,0.000311,0,0,0,0.000291,0,0,0,0,0,0,0,0,0.000309,0,0,0,0,0.000292,0.000356,0.00172,0,0.000302,0.000325,0.000303,0.016,0,0.0165,0.000282,0,0,0,0.000309,0,0.000141,0,0,0.000361],"winrateAvg":0.000314203,"leadAvg":-15.746,"scoreMeanAvg":-15.6946,"scoreStdevAvg":1.05336,"shorttermWinlossErrorAvg":0.00498793,"shorttermScoreErrorAvg":0.470246,"ownership":[97,100,100,98,100,-100,-100,-98,-98,-98,-98,-98,-98,-98,-98,-98,-98,-98,-98,95,100,98,100,100,-100,-98,-100,-98,-98,-98,-98,-98,-98,-98,-98,-98,-100,-98,100,97,98,98,100,100,-100,-100,-97,-97,-100,-98,-98,-97,-97,-97,-97,-100,-98,98,100,98,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-98,-98,100,100,100,100,-100,-100,100,100,-100,-98,-100,99,-100,-98,-98,-98,-98,-98,-98,100,-100,100,98,100,-100,-100,-100,-99,-100,99,98,100,-100,-98,-98,-98,-96,-98,-100,-100,100,100,100,-28,-100,-99,-100,-100,-56,100,100,-100,-100,-98,-100,-100,-100,-99,-99,-100,-100,63,100,-100,-100,100,-100,-100,100,-100,-100,-100,-100,-100,100,-100,-99,-100,-99,-100,100,96,100,100,100,100,100,100,100,-100,100,100,-100,100,-100,-99,-99,-100,100,100,98,97,97,98,98,98,98,100,-100,100,-100,-100,100,100,-99,-100,100,100,98,100,97,98,98,98,98,98,100,-100,100,-100,100,100,97,-99,-100,100,100,98,100,98,98,98,98,98,98,100,100,100,-100,-100,100,97,-99,-98,-100,-100,100,98,98,98,98,98,98,98,100,-100,100,100,100,100,100,-99,-98,-100,-99,-100,100,98,98,98,98,98,100,100,-100,-100,100,42,-100,100,-98,-100,-99,-100,-100,100,100,100,100,98,100,-23,-100,-100,-100,-64,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,100,100,-100,-100,-100,94,-100,-100,-100,-99,-99,100,100,100,100,-100,-100,-100,100,100,100,100,-100,100,95,100,100,100,-100,-100,98,98,100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,99,98,100,100,-100,96,99,-95,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,99,100,99,100,100],"ownershipAllowedMAE":0.0177673})%"); + lines.push_back(R"%({"sample":{"board":"..X................/.X.XOOOX...OXO...../..X.XOXXO..OOXOOOO./.XX.XXOOO...XXXXX../.OX.XO.O.O........./.XOXX.XXO........../.OOO.O............./..XOOX.O........X../.X.XXOO............/..XXOXO.........O../..X.OXOX...XX....../..XO.XX.X...O....../.XOO..OXX.XXO....O./..XO..OOO.OO....O.O/..XO.OX..O.....XXO./..OO.OXXO.XX...XOX./..OXXX..X......XOX./..X................/.................../","hintLoc":"null","initialTurnNumber":23,"metadata":"4AF8EEC4C4C66D5CF2E499346C7645C2:33","moveLocs":["R2","S2","O11","P10","P11","M11","Q13","R13","S15","S16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.76,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.35e-06,1.46e-06,0,1.44e-06,1.8e-06,1.57e-06,1.55e-06,1.84e-06,1.69e-06,1.52e-06,1.51e-06,1.65e-06,2.09e-06,1.93e-06,2.05e-06,1.79e-06,1.82e-06,1.93e-06,1.4e-06,1.51e-06,0,0,0,0,0,0,0,1.94e-06,1.66e-06,1.67e-06,0,0,0,2.12e-06,2.09e-06,2.1e-06,2.12e-06,2.36e-06,1.65e-06,1.5e-06,0,1.48e-06,0,0,0,0,0,1.64e-06,1.58e-06,0,0,0,0,0,0,0,4.35e-06,1.61e-06,0,0,1.5e-06,0,0,0,0,0,1.57e-06,1.59e-06,2.25e-06,0,0,0,0,0,0,0.785,1.88e-06,0,0,1.52e-06,0,0,1.79e-06,0,1.51e-06,0,1.88e-06,3.22e-06,2.94e-06,2.37e-06,2.45e-06,3.07e-06,2.73e-05,0,3.14e-06,2.03e-06,0,0,0,0,2.81e-06,0,0,0,1.79e-06,2.6e-06,9.09e-06,3.9e-05,2.51e-05,5.21e-05,0.103,0.0504,9.17e-06,2.51e-06,1.67e-06,0,0,0,1.78e-06,0,1.76e-06,1.99e-06,2.52e-06,2.6e-06,3.99e-06,4.7e-05,0.000153,4.88e-05,4.18e-06,0,0,9.67e-06,2.19e-06,1.99e-06,2.12e-05,0,0,0,0,1.87e-06,0,3.02e-06,1.15e-05,3.12e-05,6.05e-05,1.74e-05,2.34e-06,2.39e-06,5.14e-05,0,4.35e-06,2.3e-06,2.71e-06,0,0,0,0,0,0,1.86e-06,4.75e-06,8.05e-05,3.58e-05,0,8.8e-05,0,0,0.000376,7.93e-06,5.36e-06,2.02e-06,2.33e-06,2.3e-06,0,0,0,0,0,3.77e-06,4.98e-05,4.76e-05,9.26e-05,1.74e-05,0.000134,5.7e-05,0,8.59e-05,0,2.85e-06,1.91e-06,2.18e-06,3.19e-05,0,1.71e-06,0,0,0,0,2.51e-06,6.07e-05,4.78e-05,0,0,0.000341,1.68e-05,3.31e-06,2.46e-06,2.29e-06,1.68e-06,4.47e-06,0.000132,0,0,2.22e-06,0,0,0,0,4.66e-06,4.63e-06,0.000298,0,3.33e-06,6.12e-05,3.02e-06,2.33e-06,1.95e-06,1.58e-06,9.65e-06,0,0,0,1.96e-06,2.36e-06,0,0,0,7.25e-05,0,0,0,2.81e-06,1.72e-05,2.63e-06,1.91e-06,0,1.44e-06,3.89e-05,1.95e-05,0,0,1.71e-06,1.9e-06,0,0,0,2.23e-06,0,0,3.57e-06,4.92e-06,1.23e-05,2.79e-05,0,1.52e-06,0,1.69e-05,3.2e-05,0,0,1.85e-06,0,0,8.91e-06,3.59e-06,0,2.03e-06,2.37e-06,1.62e-05,7.39e-06,5.86e-06,0,0,0,1.67e-06,5.95e-06,5.7e-05,0,0,2.18e-06,0,0,0,0,0.000744,0,0,5.44e-06,3.07e-06,2.53e-06,0,0,0,1.79e-06,2.18e-06,2.22e-06,0,0,0,0,8.31e-05,0.000405,0,6.1e-05,3.07e-06,2.52e-06,2.94e-06,3.23e-06,0.000127,0,0,0,1.69e-06,1.91e-06,4.11e-06,0,2.12e-06,2.23e-06,2.3e-06,3.81e-06,5.61e-06,3.26e-05,3.34e-06,2.66e-06,2.43e-06,2.32e-06,0.000266,9.22e-05,0.0569,0,0,1.82e-06,1.39e-06,1.72e-06,1.73e-06,1.78e-06,1.81e-06,1.71e-06,1.72e-06,1.8e-06,1.86e-06,1.78e-06,1.65e-06,1.65e-06,1.67e-06,1.84e-06,4.76e-06,2.57e-06,2.71e-06,2.1e-06,1.39e-06,2.39e-06],"winrateAvg":0.906437,"leadAvg":6.57594,"scoreMeanAvg":7.58141,"scoreStdevAvg":15.7076,"shorttermWinlossErrorAvg":0.116592,"shorttermScoreErrorAvg":2.27183,"ownership":[-99,-99,-100,-90,-62,-35,77,89,91,91,91,94,94,92,90,89,88,87,83,-99,-100,-100,-100,89,90,90,88,90,90,87,98,93,94,86,88,88,84,82,-98,-99,-100,-100,-100,90,89,89,99,78,71,99,98,-53,92,91,92,92,80,-81,-100,-100,-99,-100,-100,99,100,100,70,39,3,-56,-54,-54,-55,-55,-60,80,-42,-9,-100,-99,-100,50,44,99,83,96,29,21,-2,-11,-15,-19,-36,65,58,30,-14,88,-99,-100,4,-30,-28,86,36,16,13,14,10,12,13,-16,5,6,53,89,89,89,-24,89,20,32,23,19,7,2,15,18,19,55,-40,-14,-12,6,32,-40,89,89,86,89,93,33,-3,-2,-8,9,29,29,7,-40,-12,-5,-45,-87,-38,-91,-91,92,92,31,9,2,-23,-70,3,83,83,48,16,18,14,-81,-86,-91,-91,85,-72,92,-11,-3,-23,-33,-41,-1,9,-31,32,81,41,40,-84,-87,-90,25,84,-73,90,-77,-34,-36,-52,-80,-79,-11,1,21,36,57,55,-80,-84,-90,94,14,-74,-76,-75,-79,-57,-57,10,64,13,21,21,31,62,69,-68,-85,94,94,22,6,93,-81,-79,-28,-75,-75,63,21,13,25,48,85,77,-31,-72,-71,94,73,86,92,92,91,59,87,86,-1,-13,10,13,79,74,82,21,12,-70,94,60,91,-90,23,51,88,18,-2,10,-4,-12,-95,-95,77,25,60,61,93,94,-25,88,-92,-92,62,11,-91,-91,-20,-25,-42,-95,-82,-86,-18,46,54,92,-94,-94,-94,-89,-84,-93,-74,-75,-65,-51,-47,-47,-95,-82,-86,-52,17,-12,-59,-61,-86,-89,-88,-87,-84,-77,-71,-64,-58,-51,-79,-84,-83,-85,-57,0,-21,-37,-65,-75,-85,-86,-85,-81,-75,-67,-61,-57,-60,-70,-82,-85,-82,-72],"ownershipAllowedMAE":0.0468571})%"); + lines.push_back(R"%({"sample":{"board":".............../.............../.........O...../..X.X......O.../.............../.............../.............../.............../.............../...X.........../.............../...X.......X.../.....O...O...../....X........../.............../","hintLoc":"null","initialTurnNumber":8,"metadata":"5D5695977898AE1086CC058B59A81F73:18","moveLocs":["L3","K4","M6","F5","F2","G3","N10","K7","F6","G6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.78,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreAREAtaxNONEsui0button1","komi":34.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.03e-06,3.5e-06,3.45e-06,3.53e-06,3.69e-06,3.81e-06,3.91e-06,4.08e-06,4.16e-06,4.05e-06,4.27e-06,4.06e-06,3.95e-06,4.04e-06,3.13e-06,3.47e-06,4.07e-06,4.9e-06,5.44e-06,7.79e-06,9.53e-06,1.21e-05,4.88e-05,6.08e-05,0.000331,9e-05,8.25e-05,1.79e-05,8.6e-06,4.1e-06,3.34e-06,4.98e-06,4.76e-06,5.82e-06,7e-06,3.18e-05,0.000175,0.000407,0.00416,0,0.000162,0.000243,0.00276,0.000115,4.52e-06,3.85e-06,4.91e-06,0,5.04e-06,0,7.67e-06,4.76e-05,0.000146,0.000388,0.000266,0.00377,0,0.00682,0.000207,4.84e-06,3.53e-06,6.04e-06,5.73e-06,5.99e-06,6.48e-06,9.02e-06,2.12e-05,3.72e-05,3.8e-05,1.88e-05,5.36e-05,5.45e-05,1.59e-05,0.000191,4.43e-06,3.66e-06,6.06e-06,7.95e-06,8.28e-06,1.19e-05,1.9e-05,2.27e-05,2.76e-05,2.81e-05,2.19e-05,9.59e-05,1.36e-05,0,8.36e-06,4.26e-06,3.72e-06,6.6e-06,1.01e-05,1.37e-05,2.91e-05,5.01e-05,3.08e-05,2.6e-05,2.57e-05,2.8e-05,3.75e-05,8.71e-05,9.94e-06,8.48e-06,3.78e-06,3.91e-06,7.07e-06,1.5e-05,4.24e-05,6.83e-05,6.11e-05,1.71e-05,2.74e-05,1.78e-05,3.47e-05,9.65e-05,9.62e-05,7.8e-05,8.11e-06,3.79e-06,4.08e-06,7.17e-06,2.02e-05,1.12e-05,7.62e-05,0.921,0.0495,1.07e-05,5.72e-05,0,0.000116,1.11e-05,9.67e-05,9.19e-06,3.87e-06,4.33e-06,8.04e-06,1.1e-05,0,0.00362,0,0,1.66e-05,1.15e-05,0.000123,9.21e-06,0,1.14e-05,9.26e-06,4.12e-06,4.34e-06,6.84e-06,1.33e-05,6.82e-06,8.42e-05,0,0.00252,9.99e-06,1.05e-05,7.95e-06,9.29e-06,6.88e-06,1.03e-05,7.48e-06,4.2e-06,4.19e-06,6.28e-06,7.07e-06,0,9.48e-06,9.57e-06,5.83e-06,1.03e-05,6.17e-06,0,7.32e-06,0,7.26e-06,6.29e-06,4.11e-06,3.98e-06,5.5e-06,6.97e-06,7.2e-06,1.43e-05,0,0,1.18e-05,6.75e-06,0,0,5.26e-06,6.98e-06,5.84e-06,3.84e-06,3.94e-06,4.9e-06,5.85e-06,5.23e-06,0,0,1.4e-05,1.12e-05,1.03e-05,0.000303,8.19e-05,1.52e-05,6.25e-06,5.07e-06,3.98e-06,3.16e-06,3.83e-06,3.84e-06,3.61e-06,3.18e-06,3.17e-06,3.82e-06,4.36e-06,4.48e-06,4.03e-06,4.85e-06,4.4e-06,3.73e-06,3.8e-06,3.14e-06,6.18e-06],"winrateAvg":0.324735,"leadAvg":-1.06857,"scoreMeanAvg":-1.99028,"scoreStdevAvg":10.5136,"shorttermWinlossErrorAvg":0.107995,"shorttermScoreErrorAvg":0.687799,"ownership":[-49,-46,-42,-35,-27,-16,-4,9,22,32,32,26,17,11,6,-52,-50,-46,-41,-29,-21,-4,7,23,37,36,26,18,5,0,-52,-58,-56,-50,-49,-28,-4,-8,8,72,37,33,20,-4,-4,-53,-54,-89,-58,-88,-26,-14,-4,3,20,22,73,6,-6,-6,-48,-55,-42,-47,-37,-20,-9,-4,1,7,9,12,20,-6,-11,-42,-42,-39,-35,-31,-17,-8,-3,0,3,0,-3,-55,-22,-14,-37,-40,-38,-36,-32,-23,-15,-5,0,4,2,2,-9,-16,-14,-35,-39,-38,-40,-38,-36,-32,-6,5,12,0,-8,7,-10,-12,-36,-42,-45,-50,-55,-85,12,7,20,68,-5,-14,-28,-17,-15,-37,-38,-57,-93,-50,-87,61,32,30,8,-10,-78,-39,-20,-17,-37,-38,-33,-59,-34,50,38,41,30,23,4,-41,-37,-17,-19,-39,-39,-63,-94,-21,18,47,45,46,77,4,-85,-55,-23,-20,-42,-48,-59,-61,-11,74,74,39,43,77,-75,-51,-20,-25,-22,-46,-47,-46,-63,-81,-80,-2,16,32,-1,-37,-44,-30,-23,-25,-48,-49,-54,-62,-62,-38,-15,7,11,4,-22,-32,-30,-27,-27],"ownershipAllowedMAE":0.0279858})%"); + lines.push_back(R"%({"sample":{"board":"O...........OOXXXX./....O.O....O.OOX.X./O.OOXO.....OOXOOX../XOOXXOXO.....X.OX../XXXOXOOX....O.OXX../.X..XXXOOOOOXOOOOX./.XO...XXXXXOXXXOOX./XX.OOOOXXXXX.XXOX../OXXXXXXXOOX.XXXOXX./OX...XOXOOOXO.XXO../OOXXXOOO..OX.XOXO../.OOXOOOOOOXXXXOXX../O.OOOXXOXXXOOOOOXXX/XOOXXXOOOOO..OOXXXO/XXOXX.XOXO.OO..OOOO/.XXX.XXOXXOOXOOOXXO/XXOXXOXOOXXOXOXOXOO/XOOOOOOOXXXXXXXXXOO/OOO...OXX.......XXO/","hintLoc":"null","initialTurnNumber":286,"metadata":"109BBAD06771BDAA87B9F7AA6FAD4F2B:296","moveLocs":["S10","pass","S9","N16","S12","O15","S15","G17","S17","J15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":5.0,"policyOptimism":0.568,"pda":0.0,"policyMixture":[0,0.0287,0.0265,0.0237,0.0263,0.0115,0.00167,0.00135,0.00135,0.00135,0.00135,0.00125,0,0,0,0,0,0,0.00165,0.0269,0.0343,0.026,0.0315,0,0.0266,0,0.00132,0.00141,0.00144,0.00131,0,0,0,0,0,0.00228,0,0.00137,0,0.0263,0,0,0,0,0,0.00125,0.00169,0.00155,0.00133,0,0,0,0,0,0,0,0.00138,0,0,0,0,0,0,0,0,0.00126,0.00171,0.00162,0.00126,0,0,0,0,0,0.00231,0.00141,0,0,0,0,0,0,0,0,0,0.00124,0.00132,0.00124,0,0,0,0,0,0,0.00139,0.00149,0,0.0107,0.0103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00141,0.00148,0,0,0.0112,0.0108,0.0108,0,0,0,0,0,0,0,0,0,0,0,0,0.00143,0,0,0.0107,0,0,0,0,0,0,0,0,0,0.00536,0,0,0,0,0,0.00142,0,0,0,0,0,0,0,0,0,0,0,0.00826,0,0,0,0,0,0,0.00141,0,0,0.0114,0.0118,0.0114,0,0,0,0,0,0,0,0,0.0108,0,0,0.00754,0,0.00141,0,0,0,0,0,0,0,0,0.0249,0.0245,0,0,0.0107,0,0,0,0.00841,0,0.0014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0084,0.00139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00136,0.00138,0,0,0,0,0,0,0,0,0,0,0,0.00172,0,0,0,0,0,0,0,0.0247,0.0246,0,0,0,0,0.00118,0,0,0,0.00165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00131,0.00131,0.00132,0,0,0,0.00142,0.00136,0.00135,0.00138,0.00135,0.00137,0.0014,0,0,0,0.38],"winrateAvg":0.999305,"leadAvg":3.14976,"scoreMeanAvg":3.08106,"scoreStdevAvg":0.693689,"shorttermWinlossErrorAvg":0.0136972,"shorttermScoreErrorAvg":0.380261,"ownership":[100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,100,100,-100,100,100,100,-100,-100,100,-100,-100,100,-100,-100,100,-100,100,100,-100,-100,100,-100,100,-100,100,-100,100,100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100],"ownershipAllowedMAE":0.00072537})%"); + lines.push_back(R"%({"sample":{"board":".....O.O.....X.X.../....O.OXXX..XOX.X../..X.OOOOX.XX.OOXX../.....O..XOOXXOXO.../OOOOOXX.XO.OOOXX.../OXXXOOOXXO...OOX.../XX.OXXO.XO..OOX..../..XXXXXXXXOOXXXXX../.OXOOOO..OOOOX.OOX./.XO.O..OO..XXOO..X./.X.O.OOXXO.OOX.XX.X/..XOXOXO.OO.OX.X.X./XXXXXOXO.XXXXOOXXOX/XOOXOOXOOX.XOO.XOOO/OOOXXXXOXOO.XOOOX../.OXX.XOOXXX.XXXXOO./.OOXXO..OX...XOOO../.OXX.OX.OXX..XO..../.O....O.OOX.XOO..../","hintLoc":"null","initialTurnNumber":237,"metadata":"3E38E999FD2C0FB09FC788532D898B9D:247","moveLocs":["J7","C9","E9","J19","G19","T8","D10","E1","F1","C1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":13.5,"policyOptimism":0.0,"pda":0.941,"policyMixture":[0.000525,0.000597,0.000572,0.000613,0.000544,0,0,0,0,0.000523,0.000536,0.00828,0.0123,0,0,0,0.00112,0.000524,0.00051,0.000603,0.000617,0.00308,0.000612,0,0.00012,0,0,0,0,0.00055,0.00311,0,0,0,0,0,0.000524,0.000521,0.0006,0.00347,0,0.00412,0,0,0,0,0,0.0459,0,0,0.152,0,0,0,0,0.000518,0.000513,0.000576,0.000581,0.00161,0.000587,0.00073,0,0.039,0.0435,0,0,0,0,0,0,0,0,0.000535,0.000523,0.000512,0,0,0,0,0,0,0,0.000857,0,0,0.000668,0,0,0,0,0,0.000578,0.000523,0.000515,0,0,0,0,0,0,0,0,0,0,0.000549,0.000557,0.00054,0,0,0,0.000569,0.000522,0.000513,0,0,0.000462,0,0,0,0,0.0182,0,0,0.00066,0.000666,0,0,0,0.000918,0.00159,0.000527,0.000518,0.00055,0.000529,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000618,0.000515,0.000516,0,0,0,0,0,0,0.0347,0.0191,0,0,0,0,0,0.0273,0,0,0,0.000511,0.000519,0,0,0,0,0.000374,0.00101,0,0,0.000893,0.0615,0,0,0,0,0.0297,0.000116,0,0.000516,0.000518,0,0,0,0,0,0,0,0,0,0.000808,0,0,0,0.000374,0,0,0,0,0.00052,0.000505,0,0,0,0,0,0,0.00395,0,0,0.051,0,0,0.000401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000465,0,0,0,6.21e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0129,0,0,0,0,0,0.0483,0.000466,1.1e-05,0,0,0,0,0,0,0,0,0,0,0.00112,0,0,0,0,0,0,0.000541,0.000552,0,0,0,0,0,0.00965,0.00505,0,0,0.000516,0.000651,0.000518,0,0,0,0,0.000572,0.000546,0.000554,0,0,0,0.275,0,0,0.00441,0,0,0,0.00117,0.0135,0,0,0.000484,0.000554,0.000548,0.000544,1.39e-05,0,0,0,0,0,0,0.00641,0,0,0,0.0131,0,0,0,0.000547,0.000555,0.000557,0.000523,0.000734],"winrateAvg":0.999714,"leadAvg":8.32845,"scoreMeanAvg":8.22957,"scoreStdevAvg":1.26585,"shorttermWinlossErrorAvg":0.00775902,"shorttermScoreErrorAvg":0.482619,"ownership":[99,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,99,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,99,100,100,100,100,100,-100,-57,-100,-100,-54,100,100,-100,-100,-100,-100,100,100,100,100,100,100,67,-44,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-99,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-66,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-15,51,100,100,100,100,-100,43,100,99,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,99,100,100,54,-82,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-51,-100,-100,-100,-100,-100,-100,-100,100,-100,100,-100,100,100,100,100,45,100,-100,-73,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,-100,-100,-100,-100,100,100,-100,-100,100,-100,-100,100,100,-100,100,100,-100,100,100,-100,-100,-100,100,100,21,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,89,100,99,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-89,-89,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100],"ownershipAllowedMAE":0.0144599,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":"....X........../XOOX.X.XXX...../O.OOXX..OOXO.../OOOXX..O.XX.X../OXXOOOO.OOOXX../XXXXOXXO..OOOX./OOXXX.XXOOXXOX./.O.XOXXXXO.OX../..OOOOOXXOOOX../...O.OXX.XOX.X./..O.OX.XXXXOX../OXOOXXXOXO.O.X./.OXXX.XOOO.O.X./O.O.XXOO.XX.OX./.O....O.X.X.OO./","hintLoc":"null","initialTurnNumber":151,"metadata":"B7648493261CBD6DF9C4E6DD1DC9DD6D:161","moveLocs":["L14","M12","N6","N3","M2","M6","G13","N6","C8","F9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":6.5,"policyOptimism":0.195,"pda":0.0,"policyMixture":[0.000626,0.000907,0.041,0.00229,0,0.000656,0.000709,0.000617,0.000604,0.000996,0.00712,0.0165,0.000855,0.0021,0.000549,0,0,0,0,0,0,0.683,0,0,0,0,0.0278,0.0269,0.00514,0.00142,0,0.000185,0,0,0,0,0,0.0155,0,0,0,0,0.0162,0.00696,0.000673,0,0,0,0,0,0.0018,0.00446,0,0.0152,0,0,0,0,0.00912,0.000684,0,0,0,0,0,0,0,0.000689,0,0,0,0,0,0.00474,0.000606,0,0,0,0,0,0,0,0,0.00057,0.000573,0,0,0,0,0.000594,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000574,0.000519,0,0,0,0,0,0,0,0,0,0.000569,0,0,0.000572,0.000537,0.000522,0.000523,0,0,0,0,0,0,0,0,0,0,0,0.000527,0.000535,0.000519,0.000521,0.000551,0,0.000539,0,0,0,0,0,0,0,0,0,0.000526,0.000522,0.000589,0,0.000561,0,0,0,0,0,0,0,0,0,0.000512,0.000534,0,0,0,0,0,0,0,0,0,0,0.00597,0,0.000407,0,0.000541,0.000572,0,0,0,0,0,0,0,0,0,0.00813,0,0,0,0.000662,0,0.000598,0,0.00392,0,0,0,0,0.017,0,0,0,0,0,0.00625,0.000529,0,0.000761,0.00448,0.0101,0.0295,0,0.000541,0,0,0,0.000483,0,0,0.000735,0.000602],"winrateAvg":0.00194517,"leadAvg":-7.41571,"scoreMeanAvg":-7.27682,"scoreStdevAvg":2.49965,"shorttermWinlossErrorAvg":0.0154801,"shorttermScoreErrorAvg":1.04442,"ownership":[99,99,89,-81,-96,-97,-98,-98,-99,-99,-98,-98,-98,-99,-99,99,99,99,-93,-95,-98,93,-99,-99,-99,-98,-99,-98,-98,-99,99,99,99,99,-99,-99,98,77,97,98,-100,-99,-99,-99,-99,99,99,99,-99,-99,-2,81,100,46,-100,-100,-100,-100,-99,-99,99,-100,-100,99,99,99,99,99,100,100,100,-100,-100,-100,-99,-100,-100,-100,-100,99,-100,-100,99,99,100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,100,-100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,99,100,100,100,100,-100,-100,-100,-100,-100,-100,95,-100,-100,-100,100,99,100,100,-100,-100,-100,96,-100,96,-8,96,-66,-100,-99,99,100,-100,-100,-100,-100,-100,95,95,95,72,96,-100,-100,-94,99,99,99,8,-100,-100,97,96,78,-98,-97,96,96,-100,-30,99,99,85,-26,-79,-42,97,10,-96,-96,-98,5,96,96,5],"ownershipAllowedMAE":0.0225662})%"); + lines.push_back(R"%({"sample":{"board":"............/............/............/........X.../............/............/............/............/............/.........X../............/............/","hintLoc":"null","initialTurnNumber":1,"metadata":"9D3F1956F21ADEB830E025440D6D16A2:11","moveLocs":["D4","C9","K10","K9","J10","H9","H10","F3","G9","G8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.9,"xSize":12,"ySize":12},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":18.0,"policyOptimism":0.0,"pda":-1.964,"policyMixture":[5.81e-05,6.94e-05,7e-05,7.48e-05,7.62e-05,7.26e-05,6.89e-05,6.65e-05,6.62e-05,6.43e-05,6.5e-05,5.67e-05,6.98e-05,8.9e-05,0.000112,0.000129,0.000241,0.000113,8.59e-05,6.39e-05,6.28e-05,6.27e-05,9.08e-05,7.09e-05,7.17e-05,0.0001,0.000134,0.00535,0.00103,0.00191,0.000169,0,0,0,0.000382,8.29e-05,7.24e-05,0.000127,0,0.000911,0.000375,0.634,0,0,0,0,0.0022,8.56e-05,7.41e-05,0.000221,0.000781,0.00315,0.000185,0.195,0,0.000556,7.69e-05,7.89e-05,9.73e-05,6.99e-05,7.67e-05,0.000269,0.0134,0.00282,0.00059,0.000143,0.000113,0.000156,0.000128,0.000122,0.000101,7.35e-05,7.44e-05,0.000153,0.0257,0.00135,0.00123,0.00539,0.00103,0.000199,0.000128,0.000141,9.98e-05,7.02e-05,7.69e-05,0.000175,0.00109,0.000119,0.00137,0.0215,0.00227,0.000137,0.000202,0.000141,0.000115,6.84e-05,7.66e-05,0.000127,0.000133,0,0.000116,0.00652,0.000294,0.00054,0.00382,0.00187,0.000106,6.88e-05,7.28e-05,0.000108,0.000185,0.000167,0.00285,0,0.000194,0.000569,0.0452,0,0.000151,6.84e-05,7.3e-05,8.95e-05,0.00012,0.00139,0.00361,0.000129,0.000115,0.000248,0.000119,0.000139,8.93e-05,7.08e-05,5.89e-05,7.29e-05,7.31e-05,8.06e-05,7.66e-05,7.6e-05,7.35e-05,7.25e-05,7.07e-05,6.84e-05,7.03e-05,5.63e-05,5.5e-05],"winrateAvg":0.0749218,"leadAvg":-3.16105,"scoreMeanAvg":-4.63184,"scoreStdevAvg":9.02181,"shorttermWinlossErrorAvg":0.0719626,"shorttermScoreErrorAvg":0.713348,"ownership":[-44,-40,-32,-16,4,29,50,65,69,67,61,49,-48,-46,-35,-22,5,29,56,71,77,67,61,28,-47,-52,-49,-20,-6,34,65,83,84,82,8,18,-40,-50,-77,-15,11,70,80,-83,-83,-83,-9,-16,-28,-27,-16,-1,11,4,-74,-59,-57,-58,-65,-35,-13,-13,3,-1,-1,-4,-48,-51,-50,-55,-51,-49,-3,-4,3,1,-6,-14,-34,-44,-50,-53,-58,-53,5,6,11,9,-17,-36,-37,-45,-51,-55,-60,-58,10,9,22,54,-7,-20,-51,-49,-57,-57,-64,-61,10,11,9,13,-3,-84,-51,-50,-43,-85,-70,-65,9,5,3,-5,-18,-52,-57,-53,-59,-66,-70,-65,6,4,0,-7,-23,-37,-47,-52,-56,-61,-64,-65],"ownershipAllowedMAE":0.0359659})%"); + lines.push_back(R"%({"sample":{"board":".............../.............../.............../...O.........../.............../.............../.............../.............../.............../.............../.............../..X............/.............../.............../.............../","hintLoc":"null","initialTurnNumber":2,"metadata":"A99211937E76A469970FD6169B9F6E50:12","moveLocs":["C13","D4","C3","D5","D13","D3","C5","C6","M4","B6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":15,"ySize":15},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.59e-06,6.89e-06,6.71e-06,7.09e-06,6.8e-06,7.12e-06,7.1e-06,7.27e-06,7.38e-06,7.44e-06,7.61e-06,7.73e-06,7.44e-06,7.54e-06,6.66e-06,6.83e-06,6.62e-06,6.6e-06,6.53e-06,9.66e-06,1.12e-05,1.14e-05,1.13e-05,1.21e-05,1.38e-05,2.11e-05,2e-05,1.53e-05,1.02e-05,7.39e-06,6.9e-06,7.42e-06,0,0,1.41e-05,3.43e-05,2.37e-05,1.8e-05,4.7e-05,0.00014,0.000409,0.0406,0.000851,1.45e-05,7.25e-06,7.21e-06,9.98e-06,2.64e-05,0,0.00184,0.00019,3.99e-05,3.62e-05,7.16e-05,0.000164,0.000496,0.0337,0.0446,2.02e-05,7.65e-06,7.36e-06,3.62e-05,2.92e-05,2.62e-05,1.21e-05,1.62e-05,1.72e-05,2.07e-05,2.9e-05,5.41e-05,0.000108,0.000501,0.00056,2.84e-05,7.51e-06,7.23e-06,2.84e-05,0.000167,0.000109,2.23e-05,1.67e-05,1.77e-05,1.91e-05,2.19e-05,3.01e-05,5.71e-05,0.000188,0.000208,1.56e-05,7.36e-06,7.14e-06,1.36e-05,0.000131,0.000111,2.07e-05,1.69e-05,1.7e-05,1.97e-05,2.17e-05,2.26e-05,3.1e-05,9.92e-05,0.000104,1.34e-05,7.34e-06,7.46e-06,1.27e-05,3.98e-05,1.79e-05,1.57e-05,1.49e-05,1.65e-05,2.01e-05,2.18e-05,2e-05,2.11e-05,5.97e-05,7.63e-05,1.27e-05,7.33e-06,7.09e-06,8.69e-06,1.06e-05,2.82e-05,1.4e-05,1.45e-05,1.62e-05,2.13e-05,2.24e-05,1.77e-05,1.74e-05,5.66e-05,9.16e-05,1.25e-05,7.3e-06,7.25e-06,0,0,4.72e-05,1.5e-05,1.2e-05,1.81e-05,2.25e-05,2.06e-05,1.69e-05,1.7e-05,8.76e-05,0.000147,1.27e-05,7.29e-06,7.74e-06,3.58e-05,0,0,9.01e-06,1.22e-05,1.56e-05,2.47e-05,3.42e-05,2.79e-05,1.33e-05,1.23e-05,7.33e-05,1.37e-05,7.43e-06,8.34e-06,7.13e-06,0,0,7.28e-06,1.21e-05,1.83e-05,7.82e-05,0.00016,0.000179,1.29e-05,0,1.55e-05,1.24e-05,7.41e-06,8.24e-06,8.02e-06,0,0,7.77e-06,1.46e-05,4.81e-05,8.89e-05,0.000329,0.000686,0.000116,1.53e-05,1.8e-05,1.05e-05,7.14e-06,7.3e-06,1.59e-05,0.301,0.569,1.42e-05,1.02e-05,1.08e-05,1.21e-05,1.34e-05,1.44e-05,1.59e-05,1.27e-05,1.03e-05,8.6e-06,7.21e-06,6.55e-06,8.02e-06,8.36e-06,9.97e-06,7.43e-06,7.02e-06,7.44e-06,7.29e-06,7.42e-06,7.42e-06,7.51e-06,7.31e-06,7.19e-06,7.29e-06,6.54e-06,7.69e-06],"winrateAvg":0.615007,"leadAvg":0.664558,"scoreMeanAvg":1.13423,"scoreStdevAvg":10.4129,"shorttermWinlossErrorAvg":0.0917593,"shorttermScoreErrorAvg":0.545121,"ownership":[-61,-64,-61,-52,-36,-19,-8,-1,2,3,3,2,0,-1,0,-57,-67,-70,-60,-39,-20,-9,-2,1,2,3,1,0,-2,-2,-51,-57,-83,-83,-26,-8,-4,0,2,2,2,1,-1,-1,-2,-36,-39,-21,44,4,8,2,1,1,1,0,20,-2,-2,-1,-17,-20,-9,4,13,6,4,2,1,-1,-1,-1,-1,-1,-1,5,2,8,13,9,6,4,2,1,0,-2,-2,-3,-1,0,22,23,22,15,11,6,4,2,1,0,-2,-2,-2,-1,-1,36,38,37,26,14,8,4,1,0,-1,-2,-3,-4,-2,-2,45,49,37,19,19,10,5,2,0,-2,-4,-5,-6,-4,-4,31,77,78,13,9,15,8,4,0,-4,-9,-14,-11,-8,-9,10,-15,-49,83,28,25,14,7,0,-8,-16,-27,-30,-18,-14,-16,-26,-47,84,44,30,20,12,3,-14,-27,-79,-36,-19,-17,-26,-35,-46,85,56,57,23,16,2,-8,-26,-31,-23,-20,-17,-33,-38,-45,-28,67,24,22,14,7,-1,-12,-16,-18,-16,-17,-38,-40,-34,-2,18,27,22,14,6,-3,-10,-14,-15,-16,-16],"ownershipAllowedMAE":0.0559627,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".....O....OOOOX../.....OX...OXOX.X./.....OXX.XOXXXXXX/...OOX...XO.OOOOX/.OOOXXXOOXO...OXX/.OXXO.XXXOOOOXOOX/.OOXOO..XXO..OOOX/.OXXX.OOXOOO....O/OXXX...XOXXXOOOO./.OX.XXXXOO..X...O/.OX.OXOXOXXXOO.OX/.OXXOOOOOX..XO.OX/OOOXOX..OXXX.XOOX/OXOXOXOXX.XX..XXX/.XOXO.OOOX.XXXOX./.XXXOOO.OX......./....XO.OXX......./","hintLoc":"null","initialTurnNumber":219,"metadata":"F1B29BBCAF00D66AC03FFC2703680176:229","moveLocs":["A3","A2","J16","J15","D1","K16","K17","M14","H5","M13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":17,"ySize":17},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4e-05,4.88e-05,4.44e-05,5.08e-05,5.65e-05,0,0.0103,0.00745,0.00847,0,0,0,0,0,0,0.0116,5.66e-05,4.69e-05,5.29e-05,5.43e-05,6.14e-05,7.57e-05,0,0,0.00663,0,0,0,0,0,0,0,0,4.79e-05,4.7e-05,5.08e-05,5.28e-05,6.02e-05,9.08e-05,0,0,0,0,0,0,0,0,0,0,0,0,4.87e-05,4.78e-05,4.96e-05,0,0,0,0.000141,0.000102,5.95e-05,0,0,0,0,0,0,0,0,4.76e-05,0,0,0,0,0,0,0,0,0,0,0,0.156,0.00526,0,0,0,3.3e-05,0,0,0,0,4.29e-05,0,0,0,0,0,0,0,0,0,0,0,5.39e-05,0,0,0,0,0,5.17e-05,4.4e-05,0,0,0,4.71e-05,6.39e-05,0,0,0,0,6.69e-05,0,0,0,0,0.000219,0,0,0,0,0,0,6.14e-05,5.67e-05,5.71e-05,6.38e-05,0,0,0,0,0,0.000117,0.000783,0.000128,0,0,0,0,0,0,0,0,0,6.53e-05,7.24e-05,0,0,0.000117,0,0,0,0,0,0,0.00757,0.00362,0,0.0424,0.000304,6.57e-05,0,6.48e-05,0,0,0.307,0,0,0,0,0,0,0,0,0,0,6.58e-05,0,0,3.59e-06,0,0,0,0,0,0,0,0,0,3.92e-05,0.0114,0,0,5.42e-05,0,0,0,0,0,0,0,0,6.09e-05,0,0,0,0,0,0.0114,0,0,0,0,0,0,0,0,0,0,0,0,0,0.345,0,0,7.84e-05,0.0114,0,0,0,0,0,0,0,0,5.62e-05,0,0,0,0,4.26e-05,0,0,0,0,0,4.59e-05,0,0,0,0,0,0,0,4.09e-05,0,0,4.74e-05,4.23e-05,4.22e-05,4.33e-05,4.43e-05,4.91e-05,4.22e-05,4.96e-05,0.000392,0.0347,0,0.0114,0,4.36e-05,0,0,0,4.42e-05,4.18e-05,4.19e-05,4.03e-05,4.25e-05,4.37e-05,4.46e-05,0.00154],"winrateAvg":0.99896,"leadAvg":2.39654,"scoreMeanAvg":2.50949,"scoreStdevAvg":1.34171,"shorttermWinlossErrorAvg":0.0111147,"shorttermScoreErrorAvg":0.497819,"ownership":[100,100,100,100,100,100,-16,6,97,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-70,98,-100,100,-100,100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-52,65,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,65,100,100,-100,100,100,100,-100,-99,-99,-100,-100,-100,-100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-100,-99,-99,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-99,-99,-99,-100,100,-100,-100,-100,100,100,100,100,100,100,100,-100,-18,-100,-100,-100,-100,100,100,-51,-54,-54,43,100,100,100,100,100,-100,63,100,-100,100,-100,100,-100,-100,-100,100,100,100,100,-100,100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,100,100,100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,100,-100,100,-100,100,100,100,44,-50,-50,-100,-100,-100,-100,-100,-100,-100,100,-100,100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-45,56,56,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0131833})%"); + lines.push_back(R"%({"sample":{"board":"......X............/.X.XO.XO.XOO......./..XOO.XO.OOXXXXXO../.XOO.XXXO.OXXOXOOO./.O...XOO..OXOO..XXO/..O..XO.O.OOX.X.XO./.....XOXXXXOXX.X.O./.....XOX..OXOOX..../......XO.XOXXOXOOO./...OX.XOX.XOXOXXXO./..O...O.OXX.XO..XX./..OXXXOOXX..XO.OOOX/...OOX.OXXO.OOOXO.O/..OXXX.OOXO.X.OXXOX/..OO.....OX.XOOOX../..OXXXXXO.X.XXOXX../.OXX.OOOO.XOOXO.O../OX.XO.O.OX.XXO.O.../..X....OXX....O..../","hintLoc":"null","initialTurnNumber":212,"metadata":"A284429BCD020821B960E022C22F3E90:222","moveLocs":["J19","N18","S7","D19","S3","T7","Q18","O18","S7","M8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.0,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":3.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.81e-05,2.8e-05,0.000106,0,4.56e-05,2.79e-05,0,5.09e-05,0,2.52e-05,0.000129,2.81e-05,2.9e-05,0.000119,5.51e-05,4.84e-05,3.86e-05,3.28e-05,2.71e-05,2.89e-05,0,3.2e-05,0,0,2.79e-05,0,0,2.84e-05,0,0,0,0,0,2.7e-05,0,0.00015,0.000176,2.77e-05,2.93e-05,2.89e-05,0,0,0,2.69e-05,0,0,2.79e-05,0,0,0,0,0,0,0,0,2.72e-05,4.99e-05,2.88e-05,0,0,0,2.86e-05,0,0,0,0,2.69e-05,0,0,0,0,0,0,0,0,0.000137,2.92e-05,0,2.84e-05,2.96e-05,2.85e-05,0,0,0,0.000218,0.00045,0,0,0,0,0.000131,0.000273,0,0,0,2.84e-05,2.88e-05,0,2.86e-05,2.82e-05,0,0,0.000357,0,0.000203,0,0,0,2.9e-05,0,2.79e-05,0,0,0.000241,2.84e-05,2.95e-05,3.02e-05,3.05e-05,2.83e-05,0,0,0,0,0,0,0,0,0,2.66e-05,0,3.26e-05,0,2.87e-05,2.8e-05,3.07e-05,3.51e-05,5.85e-05,3.05e-05,0,0,0,2.41e-05,0.16,0,0,0,0,0,3.04e-05,4.77e-05,4.21e-05,3.06e-05,2.8e-05,3.03e-05,3.93e-05,0.000128,3.85e-05,3.02e-05,0,0,8.59e-05,0,0,0,0,0,0,0,0,0,2.94e-05,2.83e-05,3e-05,2.94e-05,0,0,3.07e-05,0,0,0,2.83e-05,0,0,0,0,0,0,0,0,5.07e-05,2.84e-05,2.9e-05,0,2.98e-05,3.12e-05,3.1e-05,0,6.74e-05,0,0,0,0.827,0,0,2.97e-05,3e-05,0,0,8.72e-05,2.91e-05,2.99e-05,0,0,0,0,0,0,0,0,2.89e-05,0,0,0,3.19e-05,0,0,0,0,2.96e-05,0.000127,0.000186,0,0,0,2.74e-05,0,0,0,0,4.19e-05,0,0,0,0,0,0,0.000107,2.92e-05,2.93e-05,0,0,0,0,2.88e-05,0,0,0,0,5.25e-05,0,2.7e-05,0,0,0,0,0,2.77e-05,2.73e-05,0,0,2.89e-05,2.82e-05,2.79e-05,0.000184,0.000196,0,0,2.82e-05,0,0,0,0,0,0.00396,2.67e-05,2.84e-05,2.98e-05,0,0,0,0,0,0,0,0.000175,0,2.85e-05,0,0,0,0,0,2.65e-05,2.66e-05,2.73e-05,0,0,0,5.31e-05,0,0,0,0,2.77e-05,0,0,0,0,0,3.38e-05,0,0,2.54e-05,0,0,2.76e-05,0,0,3.14e-05,0,0,0,0,2.9e-05,0,0,0,0,0,2.92e-05,3.09e-05,2.8e-05,3.03e-05,2.86e-05,0,2.91e-05,0.000532,0.000475,0.000102,0,0,0,2.92e-05,2.95e-05,2.86e-05,3.02e-05,0,2.77e-05,2.72e-05,2.87e-05,2.68e-05,1.99e-05],"winrateAvg":0.756411,"leadAvg":5.71549,"scoreMeanAvg":5.18487,"scoreStdevAvg":13.4878,"shorttermWinlossErrorAvg":0.376835,"shorttermScoreErrorAvg":5.58961,"ownership":[34,35,31,82,73,1,-86,-79,-80,-31,6,39,45,26,0,-50,-17,20,35,35,31,37,36,95,18,-85,3,-31,-63,41,45,48,52,-5,-89,48,36,49,37,40,36,96,95,-26,-83,10,9,39,40,-85,-85,-87,-89,-88,72,53,55,59,36,96,96,35,-83,-83,-84,39,29,37,-85,-86,-82,-89,69,72,73,68,81,95,82,9,-19,-82,28,31,23,15,34,-86,-84,-86,-87,-18,-83,-81,73,82,80,95,18,-20,-81,28,-52,36,-24,33,31,-93,-90,-94,-60,-81,77,71,72,70,44,-3,-21,-80,29,-95,-96,-97,-98,30,-93,-94,-89,-92,2,78,74,68,66,50,14,-22,-81,31,-95,-77,-96,-96,-98,89,89,-91,-12,13,73,75,68,68,66,13,-11,-57,-79,23,-34,-98,-95,-99,-99,90,-90,80,80,81,70,73,76,72,87,-73,-22,-78,24,-84,-84,-99,-88,-99,92,-89,-88,-89,81,45,79,85,95,-3,-38,21,86,16,15,-99,-99,-91,-98,93,-6,-27,-87,-81,13,80,88,95,-93,-93,-93,87,86,-98,-98,-43,82,-97,94,80,87,86,84,0,78,85,-2,-1,-47,-93,6,86,-98,-98,83,79,93,94,93,5,85,19,20,71,80,88,-93,-93,-93,-12,85,86,-97,81,-51,-98,37,93,12,15,23,18,49,67,88,88,9,-73,-49,-30,84,87,-98,-82,-98,93,93,92,17,24,23,31,5,87,-94,-94,-94,-94,-94,89,-11,-98,-98,-98,-98,92,13,18,29,29,0,6,-93,-93,-42,86,84,85,87,-14,-98,-96,-96,-98,92,59,88,31,44,-1,-85,-84,-93,84,82,84,83,85,-96,-95,-97,-97,88,89,92,81,72,50,-52,-73,-90,-46,-4,80,82,82,-96,-96,-92,-81,-50,33,90,87,79,69,64],"ownershipAllowedMAE":0.107745})%"); + lines.push_back(R"%({"sample":{"board":".................../................X../..X.O......O..OOX../.............OXX.../..XO.........O.X.../..XO..........OXO../..XO...........OX../..XO............X../...O.............../.................../.................../................X../................XO./..OX............XO./...OXX..........XO./..O.O.X..X.....XO../..OO...........XO../.................../.................../","hintLoc":"null","initialTurnNumber":50,"metadata":"9A432977B01D18AA8590549610706354:60","moveLocs":["Q12","P13","O11","N11","L17","L18","N12","O12","M12","P11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.92,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui0button1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.59e-06,4.54e-06,5.06e-06,5.09e-06,4.94e-06,5.07e-06,5.17e-06,5.08e-06,4.75e-06,4.81e-06,5.75e-06,4.93e-06,4.84e-06,5.28e-06,5.39e-06,5.02e-06,4.98e-06,4.51e-06,4.77e-06,4.52e-06,5.04e-06,5.4e-06,7.28e-06,3.02e-05,7.63e-06,6.05e-06,5.85e-06,5.48e-06,0.000132,0,0.000185,1.38e-05,7.41e-06,5.69e-06,5.48e-06,0,4.36e-06,4.74e-06,4.71e-06,4.69e-06,0,2.49e-05,0,3.58e-05,2.18e-05,1.24e-05,1.22e-05,5.07e-05,0,0,0.000159,2.21e-05,0,0,0,4.54e-06,4.77e-06,4.61e-06,5.17e-06,5.5e-06,0.000212,6.38e-05,1.95e-05,1.87e-05,1.4e-05,1.47e-05,5.53e-05,6.6e-05,0.000468,9.36e-06,0,0,0,4.72e-06,4.56e-06,4.94e-06,4.83e-06,4.24e-06,0,0,5.08e-06,1.23e-05,1.14e-05,1.81e-05,2.43e-05,1.42e-05,8.83e-06,6.55e-06,5e-06,0,4.14e-06,0,5.18e-06,4.68e-06,5.01e-06,4.63e-06,4.17e-06,0,0,4.59e-06,6.24e-06,1.02e-05,2.13e-05,2.88e-05,2.2e-05,1.4e-05,8.14e-06,5.33e-06,4.79e-06,0,0,0,5.35e-06,4.99e-06,4.62e-06,4.21e-06,0,0,4.63e-06,5.95e-06,1.4e-05,2.89e-05,4.13e-05,3.49e-05,7.74e-06,4.89e-06,4.61e-06,5.54e-06,0,0,0,4.25e-06,4.85e-06,4.92e-06,4.63e-06,0,0,4.74e-06,6.65e-06,1.62e-05,3e-05,3.95e-05,3.51e-05,5.51e-06,0,0,0,0.000283,0,0,4.63e-06,4.82e-06,4.9e-06,5.72e-06,8.78e-06,0,5.24e-06,7.12e-06,1.87e-05,2.84e-05,3.53e-05,3.02e-05,9.23e-06,2.93e-05,0,0,0,4.7e-06,4.53e-06,5.08e-06,4.81e-06,4.8e-06,1.76e-05,1.55e-05,5.46e-06,6.01e-06,7.25e-06,1.79e-05,2.19e-05,2.39e-05,1.8e-05,2.27e-05,1.61e-05,9.96e-06,0.991,5.26e-06,7.52e-06,7.4e-06,5.65e-06,4.74e-06,4.86e-06,8.71e-06,5.66e-06,5.71e-06,5.81e-06,7.94e-06,1.34e-05,1.53e-05,1.66e-05,1.7e-05,1.87e-05,1.4e-05,1.81e-05,8.25e-06,5.86e-06,5.51e-06,5.81e-06,5.83e-06,4.94e-06,4.8e-06,5.49e-06,5.32e-06,5.8e-06,5.74e-06,6e-06,6.79e-06,6.61e-06,8.04e-06,1.12e-05,1.47e-05,1.23e-05,1.06e-05,8.69e-06,5.43e-06,4.74e-06,0,8.26e-06,4.73e-06,4.84e-06,5.07e-06,2.86e-05,2.26e-05,8.03e-06,5.7e-06,5.67e-06,5.77e-06,5.82e-06,6.98e-06,8.1e-06,7.01e-06,6.53e-06,5.84e-06,5.31e-06,4.26e-06,0,0,4.56e-06,4.68e-06,1.41e-05,0,0,5.28e-06,4.81e-06,5.15e-06,5.56e-06,5.81e-06,6.03e-06,6.1e-06,5.91e-06,5.77e-06,5.71e-06,5.11e-06,4.3e-06,0,0,4.4e-06,4.63e-06,6.52e-06,1.88e-05,0,0,0,4.66e-06,5.23e-06,5.72e-06,5.86e-06,6.07e-06,5.83e-06,5.83e-06,5.73e-06,5.45e-06,4.63e-06,0,0,4.51e-06,4.59e-06,4.65e-06,0,0,0,4.99e-06,0,5.38e-06,5.59e-06,0,5.88e-06,5.97e-06,5.74e-06,5.56e-06,4.51e-06,0,0,6.48e-05,4.8e-06,4.62e-06,4.61e-06,0,0,4.99e-06,1.92e-05,6.48e-06,7.15e-06,6.25e-06,5.86e-06,6.07e-06,5.78e-06,5.71e-06,5.38e-06,4.43e-06,0,0,0.00011,5.64e-06,4.64e-06,4.53e-06,4.72e-06,4.86e-06,5.35e-06,5.99e-06,1.67e-05,5.83e-06,5.56e-06,5.77e-06,5.36e-06,5.47e-06,5.43e-06,5.03e-06,2.62e-05,0.00145,0.00349,7.71e-05,1.3e-05,4.62e-06,4.67e-06,4.87e-06,4.86e-06,4.81e-06,5e-06,5.1e-06,5.12e-06,5.03e-06,4.96e-06,5.01e-06,5.01e-06,5.01e-06,4.75e-06,4.81e-06,7.19e-06,1.05e-05,1.13e-05,4.97e-06,5.33e-06],"winrateAvg":0.588597,"leadAvg":0.699191,"scoreMeanAvg":1.0601,"scoreStdevAvg":12.4057,"shorttermWinlossErrorAvg":0.116175,"shorttermScoreErrorAvg":0.845501,"ownership":[-47,-29,-15,11,26,32,28,27,32,42,52,63,56,31,4,-39,-64,-83,-85,-57,-53,-10,7,40,35,27,25,33,38,72,66,65,50,14,-12,-92,-86,-88,-66,-68,-84,33,85,31,20,17,19,15,-29,90,59,66,67,66,-93,-90,-89,-74,-79,-21,19,48,26,16,11,6,2,3,13,52,97,-91,-91,-89,-86,-87,-77,-82,-89,95,48,20,13,7,4,3,8,19,37,97,34,-91,-84,-83,-82,-72,-82,-89,95,45,17,10,4,0,1,1,2,8,61,97,-90,-70,-68,-73,-59,-76,-89,95,43,16,6,-1,-8,-8,1,-12,0,46,97,97,-81,-73,-60,-44,-48,-88,95,40,12,3,-4,-11,-14,-20,-71,-72,93,92,-75,-77,-45,-36,-19,-21,52,95,32,11,1,-5,-13,-19,-20,-48,-23,-78,88,51,11,-19,-15,-1,1,11,28,11,6,1,-3,-8,-11,-34,-35,-41,-76,11,19,8,-11,-1,8,4,10,9,6,2,0,-1,-4,-7,-14,-18,-23,-35,-10,5,-14,-7,9,17,23,12,4,1,-1,0,-1,-3,-6,-11,-14,-18,-23,-18,-25,-93,-10,28,33,33,28,6,-10,-6,-6,-6,-7,-10,-11,-15,-20,-22,-22,-40,-94,85,47,50,59,88,-37,-28,-26,-9,-12,-10,-15,-13,-16,-22,-26,-30,-50,-94,84,66,68,73,85,91,-81,-81,-41,-24,-26,-21,-21,-21,-25,-30,-24,-71,-94,85,78,80,88,98,83,86,-3,-85,-46,-42,-88,-39,-30,-31,-37,-43,-92,83,83,78,86,92,98,98,37,-9,-28,-23,-41,-48,-43,-35,-36,-42,-56,-91,83,75,75,87,87,89,75,41,13,3,-16,-27,-34,-39,-37,-42,-43,-62,-54,61,55,66,85,83,77,64,42,18,-3,-16,-26,-31,-34,-37,-40,-45,-46,-24,-1,32,49],"ownershipAllowedMAE":0.0284756,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":".................../..X.X.O.OOX.XXXOX../...XOOOX.OX.OXOX.X./..XOXXO.XOXXOOOOXX./..XOXOOXOXXO...OOX./.X.OXXOOO.O......X./OXXO.X...O.O...O.../XOOXX.X........OXX./.OXOO...XX.....XXO./XOX...OOOOX...X.O../.XX.O.O.OXX......O./OOOO..XOX...X.XXO../.XXXOOXXX.....OX.../...OXXOO....O.OOOO./...X.OXO.X.....X.X./..X.OO..X.O.OO.X.X./..XO.X.OOXX..XX.O../.OO.O......X......./.................../","hintLoc":"null","initialTurnNumber":167,"metadata":"287D67E25DAC62604305ED70CB660979:177","moveLocs":["K2","P5","N7","O5","M8","N9","L5","N5","L7","M5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.68,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.31e-05,5.23e-05,5.56e-05,6.41e-05,6.05e-05,5.92e-05,5.92e-05,5.53e-05,5.62e-05,6.77e-05,8.94e-05,7.22e-05,6.29e-05,5.75e-05,6.45e-05,7.1e-05,6.33e-05,5.84e-05,5.39e-05,5.2e-05,5.37e-05,0,0.00138,0,6.05e-05,0,5.39e-05,0,0,0,0.000101,0,0,0,0,0,6.74e-05,5.29e-05,5.16e-05,6.02e-05,0.00132,0,0,0,0,0,5.26e-05,0,0,6.75e-05,0,0,0,0,0.00119,0,5.39e-05,5.18e-05,5.26e-05,0,0,0,0,0,5.39e-05,0,0,0,0,0,0,0,0,0,0,5.41e-05,5.26e-05,5.54e-05,0,0,0,0,0,0,0,0,0,0,5.81e-05,5.71e-05,5.43e-05,0,0,0,5.42e-05,5.38e-05,0,5.53e-05,0,0,0,0,0,0,9.85e-05,0,5.72e-05,6.28e-05,6.04e-05,5.83e-05,5.78e-05,6.22e-05,0,6.06e-05,0,0,0,0,0.00158,0,6.26e-05,5.83e-05,5.86e-05,0,5.71e-05,0,6.5e-05,6.63e-05,6.2e-05,0,0.000101,8.46e-05,6.68e-05,0,0,0,0,0,0.000213,0,7.68e-05,6.34e-05,5.85e-05,6.8e-05,6.81e-05,7.57e-05,7.43e-05,7.21e-05,0,0,0,0.000662,0.000173,0,0,0,0,0.00319,6.16e-05,7.16e-05,0,0,0.000126,0.000255,0.000909,0.000504,0.000358,0,0,0,0.0384,0,0,0,5.77e-05,5.75e-05,6.19e-05,0,0,0,0,0,0.00131,0.00149,0.000299,0,0.006,0,6.04e-05,0.00486,0.000141,0,0,5.74e-05,0,6.01e-05,0,5.52e-05,0,0,0,0.0172,0,0.00108,0.000121,0.0831,5.6e-05,0,6.99e-05,0,0,0,0,6.49e-05,0.000112,0,0,0,0.00925,0.000102,0,0,0.0181,0,0,0,5.82e-05,0.003,6.29e-05,0,0,0,0,0,0,0,0,0.000486,0,8.2e-05,0,6.44e-05,0,0,0.00178,0.000281,8.92e-05,5.94e-05,5.79e-05,6.99e-05,0,0,0,0,0,0.101,0.0089,0.293,0.31,0,6.25e-05,0,0,0,0,0.000151,5.84e-05,6.79e-05,5.66e-05,0,0.00107,0,0,0,0.000143,0,0,0,0,0,0,0,0.0127,0,0.0003,6.14e-05,6e-05,0,6.22e-05,0,0,7.58e-05,0.000319,0,0.0582,0,0.000351,0,0,5.68e-05,0,0.00246,0,7.25e-05,5.78e-05,6.01e-05,0,0,6.01e-05,0,6.09e-05,0,0,0,0,0.000131,7.19e-05,0,0,6.1e-05,0,6e-05,5.75e-05,5.61e-05,0,0,5.6e-05,0,5.7e-05,5.68e-05,6.34e-05,6.71e-05,0,0.00337,0,7.6e-05,6.24e-05,6.38e-05,6e-05,5.47e-05,5.79e-05,5.91e-05,5.33e-05,5.36e-05,5.36e-05,5.34e-05,5.55e-05,5.63e-05,5.63e-05,5.94e-05,6.15e-05,6.28e-05,6.74e-05,7.03e-05,6.01e-05,5.94e-05,5.57e-05,5.61e-05,5.41e-05,5.76e-05,5.25e-05,5.3e-05],"winrateAvg":0.0181384,"leadAvg":-8.34606,"scoreMeanAvg":-9.76789,"scoreStdevAvg":14.4522,"shorttermWinlossErrorAvg":0.0732141,"shorttermScoreErrorAvg":4.63662,"ownership":[-98,-98,-96,-94,-85,-21,92,94,91,41,-28,-83,-87,-89,-89,-90,-89,-91,-92,-98,-97,-98,-95,-97,40,100,94,97,97,-89,-81,-93,-93,-93,21,-92,-91,-95,-98,-98,-96,-97,100,100,100,94,96,97,-89,-20,97,-92,96,10,14,-100,-96,-98,-98,-100,-92,-97,-96,100,98,95,97,-90,-89,96,96,96,96,-100,-100,-98,-99,-99,-100,-92,-97,100,100,98,100,-89,-90,90,83,82,81,96,96,-100,-97,-99,-100,-97,-92,-97,-97,100,100,100,60,99,89,83,71,61,61,-36,-100,-92,-97,-100,-100,-93,-95,-97,-15,28,52,99,66,98,43,23,40,87,26,-63,-82,-98,-96,-95,-97,-97,-86,-96,-9,-10,0,12,21,-4,1,-7,85,-99,-99,-35,-97,-97,-98,84,85,27,5,-32,-85,-84,-34,-10,-17,-15,-42,-99,-99,50,22,-98,-97,-98,-29,67,62,94,94,94,93,-97,-47,-45,-44,-95,-34,68,52,51,-43,-98,-98,4,96,10,94,15,94,-97,-97,-16,-94,-61,-48,-3,48,72,57,96,96,95,95,92,-48,-92,15,-92,-59,-24,57,-94,-31,-91,-92,70,63,39,91,84,85,84,95,94,-92,-93,-92,-17,68,52,69,31,70,-92,21,46,28,90,88,83,86,85,88,98,96,-5,-33,46,13,69,6,70,70,70,73,-21,90,89,89,84,93,99,93,96,-26,-88,50,-99,-100,-100,-100,-100,18,-99,-38,92,89,85,93,99,99,95,-33,-83,-70,43,-50,-50,-51,-75,-100,-97,-99,-93,94,93,85,99,95,88,90,94,94,-97,-97,-78,-71,-100,-100,-97,-95,-96,-97,96,100,100,98,100,93,90,88,71,72,-13,-98,-93,-97,-97,-97,-96,-97,-97,97,98,98,98,97,94,88,79,65,20,-52,-77,-92,-95,-97,-97,-97,-96,-96],"ownershipAllowedMAE":0.0402771})%"); + lines.push_back(R"%({"sample":{"board":"............../.XXOX........./X.XOX...O.X.../.XO..O....X.../.OOO.....OOXX./..X....O.O.OOX/......XO...OX./.X...OOXXXX.X./...O.XXOOOX.../..XO.OO...OX../..XO......OX../..XO.X....OX../..XXO......OX./............../","hintLoc":"null","initialTurnNumber":51,"metadata":"50D3A744C74DCD917EA936B7CC043AB8:61","moveLocs":["E14","K13","J13","D9","E10","E3","M13","L13","G2","G3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.84,"xSize":14,"ySize":14},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.18e-06,9.83e-06,1.07e-05,1.03e-05,0,9.25e-06,1.13e-05,1.02e-05,1.27e-05,0.000785,6.82e-05,1.59e-05,1.27e-05,1.01e-05,1.29e-05,0,0,0,0,1e-05,1e-05,1e-05,0,0,0,0,1.44e-05,1.25e-05,0,0,0,0,0,9.86e-06,9.95e-06,1.07e-05,0,1.18e-05,0,1.92e-05,0.00016,1.17e-05,1.66e-05,0,0,9.39e-06,9.34e-06,0,1.01e-05,1.01e-05,9.46e-06,9.39e-05,0,0.0647,2.64e-05,7.83e-05,0.0483,0,0,0,0,9.73e-06,9.23e-06,9.55e-06,9.55e-06,0,0,0,0,5.97e-05,0.000434,0.000433,0,0,2.41e-05,9.86e-06,9.8e-06,0,9.35e-06,0,1e-05,0,0,0,1.48e-05,0.00612,0.0186,4.95e-05,4.85e-05,1.08e-05,0,0,1.02e-05,9.62e-06,9.61e-06,0,0,0.0057,1.75e-05,0,0.00123,0.000103,1.76e-05,0,0,0,0,0,0,0.00135,0,1.79e-05,1.28e-05,4.09e-05,0.00394,0,1.26e-05,0,0,0,0,0,0,4.17e-05,2.51e-05,1.47e-05,1.14e-05,1.18e-05,0,0,1.04e-05,0,0,1.05e-05,1.03e-05,1.04e-05,0,0,2.62e-05,1.3e-05,1.04e-05,1.03e-05,0,0,1.07e-05,1.07e-05,1.06e-05,1.21e-05,1.16e-05,1e-05,0,0,1.25e-05,1.06e-05,1.01e-05,9.74e-06,0,0,0,0,0,0.319,6.95e-05,1.05e-05,0,0,3.94e-05,1.1e-05,9.84e-06,9.42e-06,0,0,0,0.293,0,0.187,0.000442,0.0465,2.71e-05,0,0,1.46e-05,9.64e-06,9.39e-06,9.52e-06,9.15e-06,1.02e-05,1.09e-05,1.17e-05,1.52e-05,1.06e-05,1.1e-05,1.08e-05,1.02e-05,9.33e-05,9.65e-06,1.33e-05],"winrateAvg":0.627866,"leadAvg":0.276211,"scoreMeanAvg":0.510332,"scoreStdevAvg":4.39906,"shorttermWinlossErrorAvg":0.361482,"shorttermScoreErrorAvg":1.23282,"ownership":[-82,-83,-63,89,93,88,89,89,-40,-45,-87,-92,-94,-95,-81,-80,-80,95,87,92,92,91,99,-96,-96,-90,-95,-96,-79,-79,-82,96,89,94,93,93,99,32,-95,-93,-96,-96,-66,-79,99,96,94,99,90,91,90,43,-95,-90,-97,-95,81,99,99,99,99,75,84,89,91,99,99,-97,-97,-96,59,-5,-59,-57,14,55,64,97,57,99,90,93,93,-95,8,-27,-2,8,38,41,39,97,-26,-42,-18,91,-97,-94,-29,-94,-40,16,54,98,98,-99,-99,-99,-99,21,-97,-96,-73,-84,31,99,96,96,95,98,98,98,-99,-97,-96,-95,-90,-96,-100,99,72,99,99,62,64,81,91,-99,-96,-94,-96,-98,-100,99,3,20,15,33,42,60,90,-99,-94,-90,-98,-99,-100,99,-62,-59,-63,51,29,50,89,-99,-80,-85,-99,-99,-100,-100,-55,-58,39,15,40,51,15,18,-80,-74,-99,-99,-99,-91,-82,-49,-21,19,40,40,29,-11,-16,-51],"ownershipAllowedMAE":0.0550769})%"); + lines.push_back(R"%({"sample":{"board":"..........XXO..../..X.X.....XOOO.../..OX.....XXXO.O../.XXOO...XOOXOOX../.XO.....XXOOXXX../..O.X..XXOO.OOX../..O..X...XOOOXO../........OXOXO.O../....O.X..XX.XO.../.XOO....X..XXOXO./..XXX.....OXOO.../.XXO.X.X.XXO...O./XOOXXXX.XXO.OXOX./.XOOOOOXO.OO.O.../XXXO...OO.....X../OXO.OX......O..../.O.............../","hintLoc":"null","initialTurnNumber":132,"metadata":"FD34EA9A116BE6AE889733D31BD46EBB:142","moveLocs":["A1","J15","J16","A2","P4","O6","A1","B15","B16","A2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":17,"ySize":17},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.13e-06,4.06e-06,4.07e-06,4.08e-06,4.3e-06,4.23e-06,4.37e-06,4.91e-06,4.62e-06,5.24e-06,0,0,0,3.12e-05,0.00046,2.45e-05,4.12e-06,4.17e-06,0,0,4.03e-06,0,3.99e-06,4.19e-06,5.18e-06,0,4.77e-06,0,0,0,0,0.0498,0.0387,1.35e-05,4.16e-06,0,0,0,4.29e-06,3.92e-06,4.76e-06,2.11e-05,0,0,0,0,0,0,0,0.0645,2.36e-05,3.98e-06,0,0,0,0,4.23e-06,4.25e-06,4.41e-06,0,0,0,0,0,0,0,7.54e-05,2.04e-05,4.09e-06,0,0,3.79e-06,4.11e-06,4.37e-06,4.39e-06,3.97e-06,0,0,0,0,0,0,0,3.65e-05,1.32e-05,4.03e-06,4.16e-06,0,4e-06,0,4.39e-06,4.02e-06,0,0,0,0,0,0,0,0,6.47e-06,8.8e-06,4.31e-06,4.01e-06,0,3.91e-06,4.22e-06,0,4.19e-06,4.15e-06,4.34e-06,0,0,0,0,0,0,0.000527,4.35e-06,4.27e-06,4.33e-06,3.88e-06,4.56e-06,4.04e-06,4.24e-06,4.06e-06,4.09e-06,0,0,0,0,0,3.43e-06,0,6.42e-06,3.86e-06,4.03e-06,4.67e-06,4e-06,4e-06,0,4e-06,0,4.08e-06,4.18e-06,0,0,4.66e-06,0,0,4.1e-06,4.32e-06,3.81e-06,3.75e-06,0,0,0,3.82e-06,3.75e-06,3.97e-06,4.01e-06,0,3.96e-06,4.18e-06,0,0,0,0,0,4.14e-06,4.35e-06,3.89e-06,0,0,0,3.79e-06,3.96e-06,4.01e-06,3.99e-06,3.82e-06,0,0,0,0,5.6e-05,0.000165,4.42e-06,7.74e-06,0,0,0,3.78e-06,0,4.1e-06,0,4.16e-06,0,0,0,0,0,0.0282,0,0.00479,0,0,0,0,0,0,0,4.42e-06,0,0,0,0,0,0,0,0,0.0885,3.5e-06,0,0,0,0,0,0,0,0,0.0879,0,0,4.02e-06,0,0,0.00034,0.00547,0,0,0,0,3.77e-06,3.99e-06,4.21e-06,0,0,0.000441,9.93e-06,3.2e-05,0.00343,1.18e-05,0,0.0189,0.000221,0,0,0,3.98e-06,0,0,4e-06,4.43e-06,4.16e-06,5.87e-06,5.73e-05,0.000741,0,0.317,0.000183,0.272,8.51e-05,0,0,1.54e-05,4.21e-06,4.23e-06,4.13e-06,4.05e-06,4.04e-06,4.13e-06,4.48e-06,4.45e-06,5.22e-06,7.53e-06,6.99e-05,0.000129,0.016,4.56e-06,1.94e-05],"winrateAvg":0.159531,"leadAvg":-2.23634,"scoreMeanAvg":-3.77944,"scoreStdevAvg":10.3855,"shorttermWinlossErrorAvg":0.243498,"shorttermScoreErrorAvg":2.27175,"ownership":[-94,-94,-93,-94,-92,-93,-92,-92,-91,-89,-95,-94,95,90,89,89,89,-95,-100,-100,-93,-99,-88,-92,-96,-97,-92,-95,95,96,96,88,92,87,-97,-93,-92,-98,-80,-87,-86,-82,-79,-95,-94,-94,96,91,95,88,86,-94,-99,-99,-78,-78,-86,-86,-87,-99,99,100,-93,96,96,82,87,87,-88,-99,-75,-85,-86,-88,-87,-90,-99,-99,100,100,84,82,83,86,87,-86,-86,-75,-85,-96,-89,-87,-99,-99,100,100,95,100,100,82,88,88,-85,-82,-74,-86,-83,-98,-88,-90,-91,-99,100,100,100,92,100,88,89,-83,-84,-82,-82,-86,-86,-89,-89,-82,-99,100,22,100,95,100,92,91,-85,-80,-85,-82,-75,-87,-99,-89,-89,-99,-99,29,-68,100,93,92,91,-82,-98,-76,-75,-89,-89,-90,-90,-100,-80,-72,-72,-71,100,87,98,92,-87,-94,-100,-100,-100,-91,-91,-90,-87,-80,-64,-73,100,100,94,90,91,-76,-100,-100,-90,-95,-100,-93,-100,-92,-99,-99,99,93,100,92,98,89,-81,94,95,-100,-100,-100,-100,-38,-99,-99,99,93,100,93,98,77,85,-55,-56,96,96,96,96,96,-38,98,-59,99,100,89,98,65,82,77,-58,-59,-59,95,84,82,86,98,98,79,81,81,81,83,65,68,74,-6,-56,73,69,89,62,84,86,86,83,82,85,94,69,71,71,72,-9,46,45,62,67,71,78,83,84,83,82,82,82,80,73,71,71],"ownershipAllowedMAE":0.0475896})%"); + lines.push_back(R"%({"sample":{"board":".O.X.............../.OX.X...XOOX...OOO./..OXXX.X.XXOOO..X../..OXOOO..X.XO..X.X./.OOX....X.XXXO.X.../.XO.X.X.XOOX...OXX./.XO....OXOXOXX.OX../.X.O..XOO..OOO..OXX/..XOXXXO.......O.OO/.XXXOOOO.........../..XO.............../.XOO......OOO....O./..XO...OOOXXXO.OOXO/..X...OXOX.XX...XX./.....O.XOXX.XO.O.X./...X....XOOXXO.O.../..X..O.X.OX.XXXOXX./.XOO.OXX.OX.O..OX../........O....X...../","hintLoc":"null","initialTurnNumber":103,"metadata":"847125C4EBFA02F90B72F181A77D9970:113","moveLocs":["H14","H15","F13","G13","F14","G15","E12","T6","T8","R8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.54,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":10.5,"policyOptimism":0.0,"pda":-2.33,"policyMixture":[9.8e-06,0,1.09e-05,0,1.08e-05,1.06e-05,1.05e-05,1.09e-05,1.13e-05,9.43e-06,1.15e-05,2.1e-05,1.17e-05,1.07e-05,1.11e-05,1.1e-05,1.13e-05,1.19e-05,1.11e-05,1.22e-05,0,0,0,0,1.06e-05,1.8e-05,1.13e-05,0,0,0,0,3.47e-05,1.21e-05,1.16e-05,0,0,0,1.2e-05,1.13e-05,1.2e-05,0,0,0,0,2.72e-05,0,1.1e-05,0,0,0,0,0,1.1e-05,1.25e-05,0,1.28e-05,1.21e-05,1.13e-05,1.23e-05,0,0,0,0,0,1.04e-05,1.13e-05,0,0,0,0,1.14e-05,1.15e-05,0,1.1e-05,0,9.15e-05,1.23e-05,0,0,0,1.31e-05,2.42e-05,0,0,0,8.73e-06,0,0,0,0,1.18e-05,0,6.88e-05,0.000163,8.69e-05,1.17e-05,0,0,1.88e-05,0,0,0,0,0,0,0,0,1.17e-05,1.25e-05,1.18e-05,0,0,0,0.00065,1.06e-05,0,0,1.21e-05,1.22e-05,0,0,0,0,0,0,0,0,0,1.19e-05,0,0,0.000854,0.00103,1.05e-05,0,1.21e-05,0,0,1.22e-05,0,0,0,1.14e-05,1.2e-05,0,0,0,1.07e-05,1.18e-05,0,0,0,1.03e-05,1.01e-05,0,0,0,0,0,0,1.11e-05,1.12e-05,1.05e-05,1.05e-05,1.1e-05,1.15e-05,1.2e-05,0,1.25e-05,0,0,1.01e-05,0,0,0,0,0,0,0,1.08e-05,1.05e-05,1.04e-05,1.05e-05,1.08e-05,1.07e-05,1.07e-05,1.18e-05,1.52e-05,2.65e-05,0.0238,1.04e-05,1.16e-05,0,0,1.2e-05,1.15e-05,1.1e-05,1.08e-05,1.08e-05,1.08e-05,1.07e-05,1.08e-05,1.1e-05,1.11e-05,1.03e-05,1.73e-05,0.387,0.0522,0.00702,1.26e-05,0,0,0,1.15e-05,1.15e-05,1.13e-05,1.07e-05,1.07e-05,1.13e-05,0,0,0,1.1e-05,1.17e-05,0.52,0,0,0,1.05e-05,1.35e-05,0,0,1.24e-05,1.18e-05,1.2e-05,0,0,0,0,0,0,0,1.13e-05,0,0,0,0,1.07e-05,1.24e-05,0,1.83e-05,1.12e-05,1.21e-05,0,0,0,0,0,0,0,1.06e-05,1.14e-05,1.33e-05,0,0,0,1.11e-05,1.38e-05,5.45e-05,0.000422,1.11e-05,0,0.000233,0,0,0,0,0,0,0,1.13e-05,0,1.08e-05,0,1.05e-05,1.15e-05,6.36e-05,2.88e-05,0,1.15e-05,1.28e-05,0.00119,3.53e-05,0,0,0,0,0,0,1.09e-05,0,0.000225,5.22e-05,1.2e-05,1.15e-05,9.94e-05,0,3.78e-05,1.11e-05,0,5.92e-05,0,4.69e-05,0,0,0.000374,0,0,0,0,0,0,9.73e-06,1.16e-05,0,0,0,1.16e-05,0,0,0,1.42e-05,0,0,0.00084,0,2.97e-05,7.53e-05,0,0,1.22e-05,1.03e-05,1.07e-05,1.68e-05,1.14e-05,1.09e-05,1.18e-05,1.84e-05,0.000353,8.31e-05,0,1.2e-05,0.00085,0.000289,1.51e-05,0,1.7e-05,2.22e-05,6e-05,1.87e-05,1.09e-05,9.12e-06],"winrateAvg":0.4095,"leadAvg":-0.19659,"scoreMeanAvg":-0.0318962,"scoreStdevAvg":4.4753,"shorttermWinlossErrorAvg":0.359983,"shorttermScoreErrorAvg":1.08692,"ownership":[73,99,70,-98,-98,-99,-99,-99,-94,-84,-11,20,77,88,96,97,96,89,82,50,99,-89,-92,-100,-99,-99,-99,-100,3,3,0,3,97,94,98,98,98,64,43,98,99,-100,-100,-100,-28,-100,-98,-100,-100,98,98,98,-43,12,-94,4,11,52,79,99,-100,16,16,13,-26,-75,-100,-99,-100,98,63,-31,-99,-94,-99,-55,8,99,99,-100,-66,10,-100,-100,-100,-85,-100,-100,-100,83,-25,-99,-99,-98,-97,-18,-100,99,6,-95,94,-100,100,-100,98,98,-100,-88,-2,13,81,-99,-99,-98,-76,-100,99,75,4,96,-100,100,-100,98,98,100,-93,-93,-53,90,-99,-98,-98,-98,-100,-41,98,99,24,-100,100,100,98,99,100,100,100,51,86,99,-98,-97,-100,-100,-100,98,-100,-100,-100,100,99,99,99,99,99,98,97,100,99,99,99,-100,-100,-100,-100,100,100,100,100,99,99,99,99,99,98,98,97,97,97,98,-100,-100,-100,98,97,97,97,99,99,99,99,99,99,98,97,97,96,96,97,-99,-100,98,98,90,94,96,98,99,99,100,100,100,97,97,98,96,98,98,-99,-99,-100,98,69,86,95,100,100,100,-100,-100,-100,95,53,99,99,-99,97,-98,-99,-100,-40,54,72,99,-86,100,-100,-100,-100,-100,-41,15,-10,-99,-98,-99,-97,-97,-94,-35,-18,99,80,-91,100,-100,-100,-100,-100,95,71,98,-34,-99,-98,-95,-96,-93,-96,-19,69,64,-92,-95,-94,-94,-100,-100,95,-35,98,22,-98,-98,-92,-92,-97,33,1,98,52,-95,-94,-94,-99,-99,-100,-100,-100,98,-99,-99,-98,-73,-91,96,96,83,98,-95,-95,-95,-94,-99,-97,-94,-96,-35,98,-99,-98,-97,-45,27,47,83,91,68,30,-93,-93,-96,-96,-97,-94,-96,-15,67,-4,-97,-97],"ownershipAllowedMAE":0.0448372})%"); + lines.push_back(R"%({"sample":{"board":".........X.XOX..O../....OOXXX.XO.OXO.O./..XO..XOXXXOO.XO.O./..XOX.XOOOO....XO../..XO.XOO...O.XOXO../.XOO.X.X..XO.XOXO../..XO.O....OX.XOO.../.X..OX....OX.XOOXX./..X..O...OX..X.XOO./...O...........XXO./.XXO............O../.XO...........XO.../.XOO....O........../.XXO.O.OOX.....X.../..XOXOXXO....X...../OOOX.O..O.XXX.X.X../X.OXXOXXXX.OOXOOX../XOOOXX..XOO..OOXX../X.OX.....O........./","hintLoc":"null","initialTurnNumber":94,"metadata":"FC0D138B12F75279438F7E5F2453AC7C:104","moveLocs":["L10","J10","J9","K9","K10","J11","K8","J8","L9","H9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.31,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.3,"pda":0.433,"policyMixture":[2.13e-05,7.17e-05,0.000455,0.000101,3.66e-05,4.07e-05,3.98e-05,2.04e-05,3.33e-06,0,3.96e-05,0,0,0,0.000394,2.05e-05,0,1.91e-05,1.62e-05,4.08e-05,0.000241,0.000824,0.000376,0,0,0,0,0,4.47e-06,0,0,0.0077,0,0,0,2.66e-05,0,1.62e-05,3.87e-05,5.69e-05,0,0,5.84e-05,3.71e-05,0,0,0,0,0,0,0,0.000868,0,0,2.18e-05,0,1.65e-05,3.22e-05,4.17e-05,0,0,0,3.17e-05,0,0,0,0,0,0.000275,0.0027,0.000503,0.139,0,0,1.81e-05,1.84e-05,2.33e-05,2.92e-05,0,0,2.38e-05,0,0,0,4.12e-05,6.29e-05,3.46e-05,0,5.36e-05,0,0,0,0,2.13e-05,2.21e-05,1.78e-05,0,0,0,0.000148,0,0.369,0,0.000618,0.0108,0,0,4.77e-05,0,0,0,0,3.52e-05,2.51e-05,1.91e-05,3.04e-05,0,0,0.00146,0,0.00298,0.000151,0.0102,0.00905,0,0,2.95e-05,0,0,0,6.63e-05,5.31e-05,3.1e-05,1.62e-05,0,4.78e-05,4.85e-05,0,0,0.000223,0.0132,0.00135,0.0276,0,0,2.1e-05,0,0,0,0,0,0.000129,1.77e-05,2.61e-05,0,0.000578,0.000161,0,0.000113,0.00246,0,0,0,2.1e-05,2.37e-05,0,0.00174,0,0,0,0.00042,1.87e-05,4.11e-05,6.63e-05,0,4.17e-05,3.81e-05,6.56e-05,0.00266,0,0,0,2.01e-05,3.58e-05,9.38e-05,0.000105,0,0,0,0.000378,1.59e-05,0,0,0,3.11e-05,3.77e-05,0.00133,0,0,6.88e-05,0,2.53e-05,3.94e-05,9.12e-05,0.000418,0.116,0,0.000909,0.000934,1.42e-05,0,0,4.22e-05,8.06e-05,8.21e-05,0.000548,0.000919,0,0,5.12e-05,3.99e-05,4.23e-05,6.7e-05,0,0,0.00113,0.0232,0.000454,1.38e-05,0,0,0,0.00151,0.000614,0.000702,5.26e-05,0,0.000318,7.7e-05,4.42e-05,4e-05,5.77e-05,0.000143,0.0227,0.00182,0.00199,0.000136,1.63e-05,0,0,0,0.00516,0,0.0183,0,0,0,5.96e-05,3.94e-05,3.11e-05,3.41e-05,4.79e-05,0,9.34e-05,0.000352,6.82e-05,1.68e-05,1.65e-05,0,0,0,0,0,0,0,8.06e-05,5.4e-05,2.81e-05,2.3e-05,0,3.38e-05,4.02e-05,4.47e-05,6.28e-05,4.23e-05,0,0,0,0,9.72e-05,0,4.34e-05,3.25e-05,0,9.36e-05,0,0,0,8.76e-05,0,0.00893,0,2.85e-05,2.8e-05,0,2.53e-06,0,0,0,0,0,0,0,0,0.00774,0,0,0,0,0,0,1.84e-05,1.88e-05,0,0,0,0,0,0,3.24e-05,2.59e-05,0,0,0,0.000791,0.000955,0,0,0,0,1.69e-05,1.85e-05,0,4.48e-06,0,0,1.29e-05,1.56e-05,3.38e-05,3.65e-05,0.00201,0,4.34e-05,0.108,0.000885,0.000419,0.0541,0.00222,1.96e-05,1.7e-05,1.38e-05,2.62e-05],"winrateAvg":0.000973176,"leadAvg":-11.6595,"scoreMeanAvg":-11.7346,"scoreStdevAvg":5.43985,"shorttermWinlossErrorAvg":0.0107371,"shorttermScoreErrorAvg":1.4637,"ownership":[-25,5,10,41,67,8,-18,-97,-99,-100,-62,-59,44,42,64,84,100,99,99,-45,-46,4,32,96,96,-100,-100,-100,-100,-100,97,44,87,33,100,100,100,99,-60,-53,-95,100,53,-5,-100,98,-100,-100,-100,97,97,64,39,100,99,100,99,-72,-90,-96,100,-99,-98,-100,98,98,98,98,87,15,35,57,53,100,99,99,-90,-95,-96,99,-21,-99,95,97,28,39,66,97,-8,-99,99,50,100,99,99,-95,-98,99,99,1,-100,-94,-91,-23,25,25,97,23,-100,99,42,100,98,98,-97,-95,-96,99,67,76,-29,-38,20,22,74,-99,-41,-100,99,99,98,97,96,-97,-99,-62,39,99,0,-2,-2,26,47,75,-99,-91,-100,99,99,94,93,95,-98,-90,-92,29,75,96,47,32,96,96,-100,-97,-94,-100,17,-91,97,96,91,-98,-97,29,99,89,87,82,81,97,-99,-100,-92,-88,-85,-65,-92,-92,97,76,-99,-100,-100,99,93,91,91,98,16,15,-99,-85,-82,-74,-33,-33,94,93,46,-99,-100,99,97,93,93,92,95,99,-87,-79,-79,-79,-78,-87,80,57,26,27,-99,-100,99,99,94,93,93,95,99,66,-81,-75,-76,-68,-51,-49,-15,-16,-7,-98,-100,-100,99,41,98,-43,99,99,-52,-41,-72,-73,-70,-64,-95,-50,-43,-36,-98,-98,-100,99,-6,98,-98,-98,99,48,-21,-63,-84,-99,-70,-58,-67,-69,-62,-97,-97,-97,-100,-6,98,-17,-48,99,-39,-100,-100,-100,-22,-93,-27,-100,-88,-80,-98,-97,-97,-100,-100,98,-100,-100,-100,-100,-16,91,92,-18,91,90,-100,-95,-90,-99,-97,-97,-97,-100,-100,-99,-95,-100,91,92,91,92,92,92,-100,-100,-97,-93,-99,-97,-97,-98,-98,-98,-95,-85,21,91,90,91,92,69,-38,-61,-94,-96,-95],"ownershipAllowedMAE":0.0420625})%"); + lines.push_back(R"%({"sample":{"board":"..O.....X.X.....O../.O.OXO.XOXOX..OOXO./..OX.XXXOO....XOX../.OOX.XOOOO.O..OXXX./O.OX.X..X.O.O.OOX.X/.OX.O..X...X.X..OX./.XXX..O...XX....OXX/..OOXXXX..XO.O...OO/...XOOX........OOX./.OOO....OOO.O....O./.X..OXX..XO.OX.OXO./..XO.OXX.XOXOXXXXX./.XOOOOX.XOX..XOX.../.OXOXXOXXO.X.XO.XO./..XX..OXOO.XOOOX.X./..X.X.OXOX.XXO..X../....O.XO.O.XO..OXO./...X..XOO..OO.O.OX./......X..........O./","hintLoc":"null","initialTurnNumber":195,"metadata":"95E7173512E44B7E840FEBBFDADB70D7:205","moveLocs":["S7","T9","K19","L3","L2","K18","T3","T4","K19","Q14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.45,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.11e-06,5.12e-06,0,5.36e-06,6.41e-06,5.87e-06,5.93e-06,0.0926,0,0,0,0.153,7.31e-06,6.75e-06,5.28e-06,5.68e-06,0,6.41e-06,4.81e-06,4.9e-06,0,4.98e-06,0,0,0,5.02e-06,0,0,0.000142,0,0,0.000221,1.03e-05,0,0,0,0,5.29e-06,5.14e-06,5.16e-06,0,0,5.22e-06,0,0,0,0,0,1.03e-05,9.58e-05,9.03e-05,0.00101,0,0,0,4.57e-05,0.0015,5.08e-06,0,0,0,5.19e-06,0,0,0,0,0,5.68e-06,0,6.88e-06,6.75e-06,0,0,0,0,2.94e-05,0,5e-06,0,0,5.03e-06,0,2.22e-05,6.6e-06,0,6.27e-06,0,5.99e-06,0,7.19e-06,0,0,0,0,0,5.38e-06,0,0,6.27e-06,0,5.7e-06,6.65e-05,0,1.42e-05,0.000402,5.95e-06,0,0.266,0,0.0104,0,0,0,0,5.49e-06,0,0,0,1.41e-05,4.99e-06,0,2.41e-05,0.0165,0.000158,0,0,1.12e-05,0.00252,1.03e-05,0.209,0,0,0,5.4e-06,5.64e-06,0,0,0,0,0,0,0.000198,0.000195,0,0,2.01e-05,0,1.11e-05,8.5e-06,9.85e-06,0,0,5.67e-06,5.39e-06,5.69e-06,0,0,0,0,6.18e-06,6.62e-06,7.25e-06,6.5e-06,6.88e-06,6.86e-06,2e-05,2.89e-05,0,0,0,9.35e-06,5.76e-06,0,0,0,5.82e-06,7.86e-06,9.43e-06,1.76e-05,0,0,0,5.55e-06,0,0.0159,9.76e-05,0.00912,0.00033,0,0.0044,6.11e-06,0,1.01e-05,4.9e-06,0,0,0,0.000268,0.000627,0,0,7.29e-06,0,0,6.32e-06,0,0,0,0,6.35e-06,6.68e-06,0,0,4.75e-06,0,0,0,8.18e-05,0,0,0,0,0,0,0,0,0,4.78e-05,9.09e-06,0,0,0,0,0,0,0,0,0,0,6.25e-06,0.00225,0,0,0,5.71e-06,0,9.83e-05,6.39e-06,0,0,0,0,0,0,0,0,0,6.53e-06,0,1.17e-05,0,0,0.0116,0,0,0.000647,5.96e-06,1.8e-05,0,0,0.000146,5.08e-05,0,0,0,0,4.96e-06,0,0,0,0,0,0,0,1.54e-05,5.96e-06,7.35e-06,0,1.29e-05,0,0.000179,0,0,0,0,5.16e-06,0,0,0,5.51e-06,0.0427,0,5.33e-06,0,5.81e-06,5.16e-06,5.49e-06,5.22e-06,0,0.000143,0,0,5.1e-06,0,0,0,0,5.15e-06,5.35e-06,0,0,0,0,5.2e-06,5.4e-06,5.12e-06,0,5.13e-06,5.67e-06,0,0,0,4.8e-06,0,0,0,5.38e-06,0,5.03e-06,0,0,0.157,5.01e-06,5.06e-06,4.78e-06,4.81e-06,5.16e-06,5.2e-06,0,5.4e-06,5.32e-06,5.06e-06,5.16e-06,5.04e-06,4.99e-06,4.86e-06,4.99e-06,5.14e-06,5.09e-06,0,4.85e-06,6.4e-06],"winrateAvg":0.660282,"leadAvg":0.821791,"scoreMeanAvg":0.931072,"scoreStdevAvg":8.68223,"shorttermWinlossErrorAvg":0.350248,"shorttermScoreErrorAvg":2.39227,"ownership":[99,98,98,29,-5,-20,-43,-23,-25,20,16,31,51,63,71,68,70,56,26,99,99,95,95,-58,-7,-75,-99,87,16,43,11,59,71,79,80,-97,56,-51,99,99,100,-99,-58,-99,-99,-99,87,87,42,62,59,64,65,78,-97,-53,-64,98,100,100,-99,-83,-99,88,88,88,88,78,92,76,72,89,-97,-97,-97,-96,98,95,99,-99,-93,-99,9,0,-73,13,89,1,88,14,89,86,-97,-97,-98,30,95,-97,-96,-85,-91,-79,-91,-16,9,-4,-90,24,-23,24,-6,74,-97,-98,-49,-97,-97,-97,-91,-85,-65,-71,-10,-32,-91,-90,-38,1,24,13,80,-98,-98,-25,-25,87,88,-100,-100,-100,-99,-42,-28,-91,53,15,91,52,58,82,90,89,47,51,85,81,90,85,-100,-36,16,32,4,16,48,44,30,95,94,65,80,86,99,99,98,71,-52,-71,26,94,94,94,61,94,22,4,14,-52,70,21,78,-86,69,96,98,-99,-99,-8,49,-91,94,55,95,-92,-49,22,-91,61,-80,47,-88,-85,98,97,97,-99,-99,-91,-91,94,0,95,-92,-92,-92,-92,-92,-80,-59,-90,97,97,97,97,-99,-96,-96,96,-57,-1,27,-93,96,-92,-86,-75,-81,-89,-88,-100,97,-94,-94,-89,-96,-96,96,-17,-88,-65,-92,97,17,-87,-74,-78,-93,-94,-100,-99,-94,-92,-89,-96,95,96,-38,-88,96,97,97,-75,-73,-86,-75,-96,-98,-100,-96,-98,-93,-89,-96,96,18,17,-89,-89,97,73,29,-83,-56,-76,-97,-98,-98,-96,-92,-93,-96,97,94,96,-90,-90,100,95,79,92,-78,94,94,-98,-98,-98,-99,-96,-95,-96,97,97,95,100,100,100,97,100,91,98,93,93,-98,-98,-98,-98,-97,-96,-97,-41,61,92,97,99,99,99,97,97,97,98,94],"ownershipAllowedMAE":0.0426433})%"); + lines.push_back(R"%({"sample":{"board":"............X....../.XXO......OX.XOO.../..X.......OOX.XXO../.XOOOO.OOOXXXXXO.../...OX..OXXX..X.OOO./.XXO...XOOO......X./..OXXXXOOX....X.X../..OOXOOOX.X.X....X./...OOX.OX.O.....O../...OXX.O.....O.O.../...OOOO...O......../..XXXX....X......../.......XX.X.X.OXOO./..X.O..OOO...OOOX../.XOX.XO...X.XOXXX../..OX.X.OOOX..X.XO../.XOXOXXO..OX...OX../..XOOOXXOOOX....X../...........OX....../","hintLoc":"null","initialTurnNumber":157,"metadata":"2823D44D15454624C7B44C8C71915B29:167","moveLocs":["S11","P11","T5","S5","T4","T6","Q12","Q13","P12","S6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.95,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui0button1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.16e-05,2.9e-05,0.000186,1.43e-05,1.49e-05,1.4e-05,1.4e-05,1.35e-05,1.4e-05,1.43e-05,2.28e-05,1.44e-05,0,1.22e-05,1.31e-05,1.28e-05,1.4e-05,1.36e-05,1.19e-05,4.83e-05,0,0,0,1.53e-05,1.42e-05,1.31e-05,1.37e-05,1.46e-05,1.38e-05,0,0,0,0,0,0,1.24e-05,1.42e-05,1.35e-05,0.000316,3.98e-05,0,1.81e-05,1.52e-05,1.33e-05,1.3e-05,1.3e-05,1.34e-05,1.31e-05,0,0,0,0,0,0,0,1.28e-05,1.37e-05,0.00038,0,0,0,0,0,1.28e-05,0,0,0,0,0,0,0,0,0,1.32e-05,1.29e-05,1.34e-05,8.47e-05,0.00217,0.000106,0,0,1.26e-05,1.27e-05,0,0,0,0,1.29e-05,1.1e-05,0,1.15e-05,0,0,0,1.29e-05,0.000127,0,0,0,1.28e-05,1.24e-05,1.22e-05,0,0,0,0,1.51e-05,0.186,0.128,6.35e-05,1.14e-05,1.31e-05,0,1.41e-05,7.97e-05,0.0118,0,0,0,0,0,0,0,0,1.84e-05,0.00985,0.00233,0.602,0,0,0,1.24e-05,1.28e-05,1.41e-05,1.35e-05,0,0,0,0,0,0,0,1.48e-05,0,4.45e-05,0,0.0123,0,0,1.37e-05,0,1.42e-05,1.38e-05,1.37e-05,1.24e-05,0,0,0,1.22e-05,0,0,1.48e-05,0,6.84e-05,1.76e-05,1.89e-05,0,1.33e-05,0,0,1.48e-05,1.45e-05,1.43e-05,1.34e-05,0,0,0,1.22e-05,0,1.46e-05,1.41e-05,1.49e-05,1.72e-05,1.5e-05,0,1.44e-05,0,1.36e-05,1.36e-05,1.49e-05,1.4e-05,1.56e-05,1.53e-05,0,0,0,0,1.36e-05,1.36e-05,1.49e-05,0,2.24e-05,2.02e-05,1.6e-05,1.58e-05,1.59e-05,1.52e-05,3.3e-05,1.5e-05,1.38e-05,1.6e-05,0,0,0,0,1.39e-05,1.31e-05,1.45e-05,1.58e-05,0,1.6e-05,1.55e-05,3.23e-05,2.49e-05,0.000141,1.54e-05,1.53e-05,1.54e-05,1.36e-05,1.46e-05,1.39e-05,1.31e-05,1.28e-05,1.29e-05,1.67e-05,0,0,1.51e-05,0,1.53e-05,0,1.4e-05,0,0,0,0,2.9e-05,1.34e-05,1.42e-05,0,1.56e-05,0,5.49e-05,1.34e-05,0,0,0,1.73e-05,2.33e-05,0.00953,0,0,0,0,0,0,1.29e-05,0,0,0,0.00551,0,0,1.02e-05,1.31e-05,1.42e-05,0,4.7e-05,0,0,0,0,0,0,0,1.41e-05,1.4e-05,0,0,0.000758,0,1.35e-05,0,0,0,0,0.000105,0.0118,0,7.61e-05,0,0,3.92e-05,0,1.22e-05,0,0,0,0,0,0,0,1.29e-05,1.21e-05,0,0,0.0003,0.000118,0.000101,0,0,1.34e-05,1.24e-05,1.17e-05,0.00168,0,0,0,0,0,0,0,0,0,0,7.11e-05,1.34e-05,1.35e-05,1.38e-05,0,1.29e-05,1.27e-05,1.19e-05,1.16e-05,0.00241,1.1e-05,1.17e-05,1.29e-05,0.000359,0.00667,1.29e-05,1.64e-05,0.00175,0,0,3.94e-05,1.32e-05,1.33e-05,1.31e-05,1.27e-05,1.24e-05,1.26e-05],"winrateAvg":0.408823,"leadAvg":-0.393708,"scoreMeanAvg":-0.859321,"scoreStdevAvg":6.3139,"shorttermWinlossErrorAvg":0.383707,"shorttermScoreErrorAvg":1.81502,"ownership":[-95,-94,-72,-58,3,29,70,71,63,41,5,-51,-95,-80,-34,55,88,93,92,-95,-96,-96,49,-15,85,78,80,75,71,92,-90,-91,-97,92,93,93,91,92,-95,-96,-96,-3,56,79,87,87,88,92,93,93,-98,-97,-99,-98,96,93,91,-94,-95,100,100,100,100,93,100,100,100,-98,-98,-98,-99,-99,96,95,92,85,-88,-80,-4,100,98,99,98,100,-96,-97,-97,-27,-51,-98,-59,96,96,96,-39,-66,-90,-88,100,99,99,99,98,100,100,100,39,50,28,-82,-14,-7,-86,-54,35,81,100,98,98,98,98,100,100,19,69,66,42,42,-92,-91,-90,-76,-69,72,80,100,100,98,100,100,100,-1,29,15,41,-1,47,89,88,-7,-84,-15,59,64,70,100,100,98,99,100,-4,38,81,47,33,37,22,63,96,96,14,34,12,24,100,98,98,99,100,39,24,22,31,24,84,52,94,69,48,49,-19,8,-18,100,100,100,100,49,-2,-44,50,-18,7,18,48,57,32,30,15,-50,-66,-100,-100,-100,-100,-1,-15,-36,-42,-98,-34,-19,9,58,39,32,5,-13,-76,-86,-84,-51,-46,-33,-33,-93,-93,7,-97,-48,-80,5,85,34,47,48,-56,-91,-94,-100,-44,-11,-19,9,98,97,97,-8,-12,42,85,84,84,-100,-99,-99,-96,-100,-97,-100,-34,-99,89,87,81,-34,-96,-52,-90,86,-100,-100,-100,-100,-97,-98,-99,-98,-100,-97,-99,12,98,97,98,-97,-90,-87,-99,-97,-100,-97,-98,-97,-98,-99,-97,-100,-93,-99,-99,98,98,98,98,-97,-91,-90,-93,-91,-100,-98,-98,-98,-97,-98,-93,-93,-92,-99,-99,97,98,98,-97,-81,-88,-90,-94,-100,-98,-98,-97,-97,-96,-96,-95,-94,-94,-9,24,83,66,63,-82,-82,-89,-94,-97,-98,-98],"ownershipAllowedMAE":0.0396605,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".................../............XXX..X./........X..OOOOXXO./...X..........XOOX./.X............XOOX./..O.......O.OOOXOO./...........OXXXX.../................X../..O................/..OX.......X......./..OX.........O..X../.OOX.....O.X.OX..../.XOXX...XO.O.OX.O../.XOX.X....OXXOX..../..XOXO.X..O.OX..X../.XXO.OX.....OX.X.../..XO.XXOX..OXOX..../XXOO.OOO.....OOO.../.O................./","hintLoc":"null","initialTurnNumber":109,"metadata":"7720A183AA614AC0C40989803EFF44C3:119","moveLocs":["B14","C15","E4","J8","J9","H9","H10","G9","J6","H6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.91,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1button1","komi":8.5,"policyOptimism":0.276,"pda":0.0,"policyMixture":[2.53e-06,3.22e-06,3.29e-06,3.67e-06,4.01e-06,3.65e-06,3.68e-06,3.62e-06,3.69e-06,3.66e-06,3.55e-06,3.38e-06,2.96e-06,3.11e-06,3.18e-06,2.96e-06,3.08e-06,4e-06,2.8e-06,3.32e-06,5.76e-06,7.21e-06,0.000937,0.00165,0.000101,6.65e-05,3.88e-05,1.2e-05,6.42e-06,5.35e-06,5.14e-06,0,0,0,0.000518,0.00012,0,8.22e-06,3.88e-06,6.05e-06,1.05e-05,2.09e-05,0.0405,0.0742,0.0161,0.000131,0,6.92e-06,4.2e-06,0,0,0,0,0,0,0,3.84e-05,4.33e-06,6.06e-06,3.63e-06,0,4.19e-05,0.00035,0.000625,0.00073,1.41e-05,5.32e-06,3.73e-06,2.96e-06,2.72e-06,5.09e-06,0,0,0,0,1.21e-05,5.94e-05,0,0,0.00021,8.27e-05,2.7e-05,5.37e-05,1.95e-05,8.76e-06,4.67e-06,3.34e-06,3.02e-06,2.91e-06,5.25e-06,0,0,0,0,0.00529,4.95e-06,0,0,0.00818,0.000373,1.67e-05,2.31e-05,1.68e-05,6.74e-06,4.23e-06,0,2.95e-06,0,0,0,0,0,0,7.29e-06,3.58e-06,4.12e-06,5.71e-06,1.58e-05,2.68e-05,1.8e-05,1.42e-05,9.85e-06,6.6e-06,4.79e-06,3.35e-06,0,0,0,0,0,3.41e-06,1.04e-05,3.82e-05,3.44e-06,4.37e-06,4.88e-06,5.79e-06,2.26e-05,1.1e-05,9.78e-06,7.58e-06,6.19e-06,5.03e-06,5.14e-06,1.55e-05,1.31e-05,3.98e-06,3.39e-06,3.12e-06,0,5.64e-06,2.92e-05,3.38e-06,3.3e-06,0,7.14e-06,6.33e-06,1.03e-05,6.72e-06,5.56e-06,6.56e-06,5.01e-06,5.71e-06,7.33e-06,7.56e-05,4.04e-05,5.28e-06,6.18e-06,5.28e-06,1.06e-05,9.03e-06,3.17e-06,3.17e-06,0,0,4.59e-06,6.68e-06,0.677,0,6.83e-05,2.39e-05,4.32e-06,0,8.78e-06,2.28e-05,0.0026,3.6e-05,3.02e-05,6.54e-06,3.28e-06,3.21e-06,2.78e-06,0,0,3.37e-06,5.95e-06,0,0,0,3.27e-05,4.84e-06,4.43e-06,3.82e-06,0,0.00256,8.97e-06,0,1.29e-05,3.07e-06,2.79e-05,0,0,0,2.84e-06,4.32e-06,4.33e-06,9.95e-05,0,0,3.75e-06,0,4.19e-06,0,0,3.87e-06,4.02e-06,3.76e-06,3.02e-06,6.1e-05,0,0,0,0,4.82e-06,1.45e-05,0.00505,0,0,3.35e-06,0,3.78e-06,0,0,2.87e-06,0,3.62e-06,3.33e-06,0.00011,0,0,0,4.4e-06,0,6.49e-06,0,0,3.84e-06,0,0,0,0,0,1.81e-05,4.81e-06,5.26e-06,3.62e-06,0.0135,5.98e-06,0,0,0,0,5.47e-06,0,0.125,3.78e-06,0,4.3e-06,0,0,8.23e-05,4.02e-05,0,1.49e-05,3.85e-06,2.58e-05,0,0,0,0,0,0,1.43e-05,6.11e-06,3.67e-06,2.92e-06,2.81e-06,0,0,1.03e-05,0,9.03e-05,0.0206,4.2e-06,6.89e-06,3.64e-06,0,0,3.59e-06,0,0,0,0,3.52e-06,3.07e-06,0,0,0,0,3.25e-05,0.000256,2.16e-05,3.72e-06,0,0,0,0,2.97e-06,0,0,0,3.4e-06,3.2e-06,3.16e-06,3.2e-06,2.99e-06,0,0,0,3.66e-06,4.7e-06,3.3e-06,2.84e-06,0,3.35e-06,2.86e-06,3.09e-06,2.98e-06,2.78e-06,3.03e-06,2.88e-06,3.09e-06,3e-06,2.99e-06,2.73e-06,2.77e-06,2.77e-06,2.83e-06,2.91e-06,3.04e-06,2.65e-06,3.55e-06],"winrateAvg":0.668165,"leadAvg":1.17865,"scoreMeanAvg":1.64325,"scoreStdevAvg":8.91807,"shorttermWinlossErrorAvg":0.174471,"shorttermScoreErrorAvg":1.06757,"ownership":[-60,-57,-48,-34,-15,-4,0,-4,-7,-9,-12,-31,-56,-70,-91,-96,-97,-96,-96,-64,-61,-61,-35,-22,-1,2,-5,-17,-6,2,-3,-98,-98,-98,-96,-97,-97,-94,-64,-68,-68,-65,-22,5,6,1,-54,7,27,97,97,97,97,-97,-98,-91,-94,-68,-71,-78,-92,-32,-19,-5,9,0,11,29,57,79,95,90,90,90,-92,-46,-29,-91,-91,-49,-19,-8,3,5,3,16,38,50,74,95,91,89,89,-89,53,-16,85,84,-42,-22,-11,2,5,9,24,96,88,97,97,97,-97,90,90,67,46,65,57,45,-22,-5,3,5,6,7,29,93,-97,-97,-97,-97,-55,-80,-22,64,74,57,12,-3,-1,5,7,8,8,23,-17,-26,-33,-34,-62,-97,-82,-60,78,84,93,-3,-9,1,9,13,11,10,4,-2,-4,2,1,-16,-58,-77,-69,80,87,93,-96,-36,-12,53,59,24,19,-2,-48,3,30,29,-22,-57,-82,-78,81,87,93,-96,-67,-61,-92,-92,69,33,2,-2,24,89,6,-47,-95,-86,-81,22,93,93,-97,-84,-80,-83,-84,-88,91,33,-22,61,88,-95,-86,-87,-85,-82,-43,-90,94,-97,-97,-84,-84,-82,-89,91,54,80,74,87,-95,-84,-74,-81,-80,-86,-95,94,-97,-20,-94,-52,-94,34,32,99,73,76,89,-96,-87,-86,-82,-75,-93,-94,-95,96,-23,96,4,-94,-19,33,99,92,99,-86,-86,-87,-95,-83,-43,-94,-95,-94,96,96,96,-63,-16,21,28,51,80,99,-86,-39,-91,-7,-3,-31,-95,-94,-95,97,25,-63,-63,97,9,39,50,98,95,99,-45,43,0,7,1,-95,-95,97,97,93,98,97,97,62,56,65,80,97,99,99,99,43,39,18,-35,83,81,94,96,96,94,89,76,64,69,81,91,95,93,83,71,55,38],"ownershipAllowedMAE":0.035094})%"); + lines.push_back(R"%({"sample":{"board":".............X...../......O.....X.XO.../...OO..X.O...XOXO../..O.XX........O..../.OX.........X..O.../.XX.X..XO........../.....OOXX....X..O../.XOOO.XOX..O......./X.XXXO.OXO....X..O./.XO.XO..O..X.O..X../...XO.O..O........./.OOX.O.....O.XX..../.XOXO.....XXX.OX.../..XXO.......OOO.X../....XXX...XO.XO..../..XXOO..X.XXOOXOOO./.XOO.O.OXXOO.OXXXX./.XXO.O.OXO.OOXX..../....O.....O......../","hintLoc":"null","initialTurnNumber":137,"metadata":"22EC7FE838EF241FF44AFE7FF7B8C18D:147","moveLocs":["H18","S10","R11","Q11","Q6","S7","L8","J8","J7","H7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.55,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":-4.0,"policyOptimism":0.25,"pda":0.0,"policyMixture":[3.96e-05,4.14e-05,3.9e-05,4.01e-05,4.02e-05,4.14e-05,3.94e-05,3.98e-05,4.29e-05,4.22e-05,4.24e-05,4.16e-05,3.84e-05,0,4.03e-05,5.07e-05,4.46e-05,3.96e-05,3.96e-05,4.05e-05,3.8e-05,3.98e-05,3.93e-05,4.12e-05,4.09e-05,0,0,4.59e-05,4.49e-05,4.79e-05,4.06e-05,0,0,0,0,4.14e-05,3.87e-05,4.08e-05,3.96e-05,4.41e-05,3.8e-05,0,0,4.87e-05,7.73e-05,0,5.27e-05,0,4.29e-05,0.000162,4.25e-05,0,0,0,0,4.08e-05,4.05e-05,4.53e-05,4.96e-05,0,4.96e-05,0,0,9.67e-05,9.87e-05,8.33e-05,5.13e-05,8.43e-05,5.71e-05,6.8e-05,0.000143,0,4.42e-05,3.91e-05,3.98e-05,3.98e-05,4.43e-05,0,0,5.46e-05,4.84e-05,7.46e-05,0.000413,0.000814,0.000106,0.000107,0.000129,0.000156,0,5.09e-05,4.16e-05,0,4.28e-05,4.1e-05,4.08e-05,4.2e-05,0,0,5.08e-05,0,5.09e-05,0.000425,0,0,0.000168,0.00019,0.000203,0.000178,7.17e-05,4.67e-05,4.62e-05,4.47e-05,4.39e-05,4.3e-05,4.17e-05,4.17e-05,4.09e-05,4.2e-05,4.35e-05,0,0,0,0,9.16e-05,0.00019,5.26e-05,9.68e-05,0,6.13e-05,4.81e-05,0,4.33e-05,4.38e-05,4.01e-05,0,0,0,0,4.43e-05,0,0,0,0.000203,8.43e-05,0,6.1e-05,9.9e-05,5.4e-05,5.59e-05,4.59e-05,4.23e-05,4.08e-05,0,0,0,0,0,0,0.00219,0,0,0,5.07e-05,0.000112,0.000154,0.00012,0,0,0,0,4.1e-05,3.78e-05,0,0,0.0101,0,0,0.000912,0.216,0,8.29e-05,0.000117,0,0.000167,0,0.000123,0.000127,0,0,5.36e-05,3.89e-05,3.53e-05,4.47e-05,0,0,4.18e-05,0,0.204,0.00753,0,4.36e-05,4.69e-05,0.000181,5.07e-05,4.81e-05,0.000155,4.19e-05,4.54e-05,4.16e-05,3.67e-05,0,0,0,5.57e-05,0,0.000279,0.443,0,0.0566,0,0,0.000242,0,0,0.000242,5.94e-05,4.23e-05,4.25e-05,3.91e-05,0,0,0,0,4.44e-05,0.000689,0,0,0.039,0,0,0,5.99e-05,0,0,6.54e-05,0,4.31e-05,3.59e-05,3.66e-05,0,0,0,4.66e-05,0.000197,0.00118,0.00373,0.000172,5.49e-05,4.63e-05,0,0,0,0,0,4.08e-05,4.14e-05,3.72e-05,4.52e-05,3.91e-05,4.1e-05,0,0,0,8.85e-05,9.48e-05,5e-05,0,0,3.87e-05,0,0,3.76e-05,4.23e-05,3.93e-05,4.37e-05,3.74e-05,3.92e-05,0,0,0,0,4.16e-05,5.09e-05,0,4.21e-05,0,0,0,0,0,0,0,0,0.00012,3.64e-05,0,0,0,3.93e-05,0,3.83e-05,0,0,0,0,0,3.81e-05,0,0,0,0,0,0.000363,3.85e-05,0,0,0,3.97e-05,0,3.91e-05,0,0,0,3.24e-05,0,0,0,0,3.46e-05,4.01e-05,0.000127,9.56e-05,3.87e-05,4.04e-05,4.02e-05,4.03e-05,0,3.76e-05,3.86e-05,4.29e-05,4.52e-05,4.16e-05,0,3.64e-05,4.39e-05,4.04e-05,3.82e-05,4.15e-05,3.81e-05,4.35e-05,4.22e-05,2.44e-05],"winrateAvg":0.000524521,"leadAvg":-19.0969,"scoreMeanAvg":-20.0578,"scoreStdevAvg":8.9534,"shorttermWinlossErrorAvg":0.00740186,"shorttermScoreErrorAvg":2.35166,"ownership":[75,84,89,92,93,93,91,82,69,36,-2,-44,-71,-84,-30,9,30,63,67,60,82,89,93,95,92,97,97,70,54,-18,-38,-88,-77,-78,86,71,71,73,33,88,87,97,97,-29,32,-64,-29,80,9,13,-54,-86,94,85,95,76,75,18,-7,89,-7,-95,-96,-39,-31,-13,5,-3,-15,-43,-26,94,93,83,79,76,-51,-9,-99,-51,-56,-26,-27,-27,-23,-3,-9,-16,-86,-19,22,96,81,72,72,-66,-100,-99,-58,-94,13,-17,-91,13,-18,-8,-6,-24,-25,1,43,63,71,64,-93,-64,27,16,-9,93,92,-91,-92,-20,-10,-7,-23,-85,-16,-6,90,59,51,-97,-99,94,94,93,91,80,80,-91,17,-6,48,-15,-29,-40,-3,40,58,33,-100,-98,-99,-98,-98,96,82,81,-91,77,20,0,-20,-31,-95,-95,78,79,-31,-99,-100,-96,-97,-98,97,87,64,93,71,11,-53,-12,13,-42,-83,-95,-95,-40,-98,-98,-98,-100,61,62,97,57,42,93,44,12,-16,-38,-61,-79,-83,-78,-73,-98,-97,-97,-100,-33,94,53,60,-51,1,70,70,6,-97,-96,-75,-83,-82,-76,-98,-99,-97,-100,68,40,6,-63,-15,-69,-96,-96,-96,-19,98,-85,-84,-94,-61,-99,-99,-100,-100,66,-21,-36,-33,-54,-58,-70,-39,98,98,98,98,-92,-50,-20,-99,-98,-99,-99,-100,-99,-99,-49,-57,-66,-95,83,86,96,98,90,15,-14,24,-99,-99,-100,-100,99,99,-20,23,-96,-90,-95,-96,98,98,-96,93,93,93,48,-99,-99,98,98,98,99,47,98,-96,-96,98,98,98,98,-96,-96,-96,-96,8,-97,-99,-99,98,98,98,96,98,-97,95,95,98,98,-96,-96,-94,-93,-92,-93,-96,-95,13,50,98,97,94,8,-60,64,97,94,51,17,-68,-92,-93,-92,-91],"ownershipAllowedMAE":0.0371203})%"); + lines.push_back(R"%({"sample":{"board":".X....X..........O./OOX.X.XOOOO...O.OXX/.XOX.XOO.OXOOO.OXO./.OOXOXXXOX.XXXOOXX./.OXXOX.XOXX.XO.OOX./.O.XOXOXX..XX...X../..OXOOOX..XOO.X..X./..OOXO.OXX...X...../..OXX.O..XO.OX...../.O.OX..O.XO.OOX..../..OOX.XOO.O.XX...X./..OX..X.OOOX.OXXXO./.O.X.XXOX...XOOOOX./.OXX.OXO.OOXXX...X./OOOX.XXXOO.XOX...XX/.OXX.OXO.OXXOXOOOXO/OXO.XOO.OOXOOXO..OO/XXX.XXOO..OOX.XOO../.............X...../","hintLoc":"null","initialTurnNumber":226,"metadata":"B05A56B89DE86EE30E64379A85CC83FB:236","moveLocs":["L7","K7","H19","J19","Q14","E4","J11","H11","J17","L12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.43e-06,0,9.45e-05,1.64e-05,8.63e-06,1.09e-05,0,0,0,3.69e-05,9.23e-05,4.57e-05,2.65e-05,7.44e-06,3.56e-05,0.00293,0.00333,0,2.5e-06,0,0,0,9.04e-05,0,1.38e-05,0,0,0,0,0,0.00027,0.000174,8.58e-06,0,0.00335,0,0,0,1.47e-05,0,0,0,0.000323,0,0,0,0,0,0,0,0,0,0,0,0,0,6.64e-05,5.02e-05,0,0,0,0,0,0,0,0.0611,0,0.000659,0,0,0,0,0,0,0,5.53e-06,6.26e-06,0,0,0,0,0,0.000149,0,2.56e-05,0,0,4.78e-06,0,0,3.46e-05,0,0,0,5.14e-06,5.62e-06,0,1.93e-05,0,0,0,0,0,0,3.94e-05,0.00012,0,0,0.0365,0.0188,0,0,5.06e-06,5.08e-06,5.5e-06,6.08e-06,0,0,0,0,0,0,0.000136,0.000127,0,0,0,0.000139,0,5.67e-06,5.13e-06,0,5.25e-06,5.46e-06,6.07e-06,0,0,0,0,0,0,0,0,0,1.1e-05,0.17,0,6.52e-06,5.63e-06,5.51e-06,5.31e-06,5.22e-06,5.38e-06,6.04e-06,0,0,0,0.113,0,0,0,0,0,2.18e-05,0,0,6.45e-06,5.42e-06,5.27e-06,6.04e-06,5.37e-06,5.64e-06,0,0,0,0,0.00205,0.000444,0,2.89e-05,0,0,0.0376,0,0,0,5.78e-06,5.46e-06,5.44e-06,5.26e-06,6.53e-06,7.71e-06,0,0,0,3.35e-05,0,0,0,2.52e-05,0,0.0809,0,0,0.000129,6.9e-06,5.15e-06,0,5.21e-06,8.68e-06,1.34e-05,0,0,7.34e-06,7.23e-06,0,0.0731,0,0,0,0,0.126,0,0,0,0,0,6.58e-06,9.27e-06,0,7.93e-05,0,7.68e-06,0,0,0,0,0,0,0.000604,0,0,0,0,0,0,5.7e-06,9.79e-06,0,0,0,9.58e-05,0,0,0,0,0,0,0,0,0,0.0121,0.00611,0.0118,0,3.16e-06,0,0,0,0,0.035,0,0,0,0,0,2.78e-05,0,0,0,0.0138,0.00322,0.0142,0,0,0.0003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.69e-06,0,0,0,0,0,0,0,0,0,0,0,0.000693,0.00586,0,0,0,0,0,5.77e-06,0,0,0,0,9.04e-06,0.00467,0,0,0,0.000255,0,0,0,0.00386,0.00185,5.47e-06,5.63e-06,5.26e-06,6.23e-06,1.8e-05,0.0079,0.0214,1.1e-05,1.3e-05,2e-05,1.82e-05,0.112,0.00356,0,0.000232,0.00717,3.31e-05,0.00115,2.49e-05,4.33e-05],"winrateAvg":0.00349074,"leadAvg":-1.64696,"scoreMeanAvg":-1.55118,"scoreStdevAvg":1.29586,"shorttermWinlossErrorAvg":0.0241872,"shorttermScoreErrorAvg":0.416503,"ownership":[26,-98,-97,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-21,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,-100,-29,-100,100,100,-19,100,-62,100,100,100,100,100,-100,-100,-100,100,100,100,-100,100,-100,-100,-100,-18,-100,-67,-100,-100,-100,100,100,-100,-100,-100,100,100,-100,-100,100,-100,-57,-100,-95,-100,-100,-100,-100,99,96,100,100,-100,-100,100,100,45,-100,100,-100,100,-100,-100,-100,-100,-100,-100,-40,-43,-100,-100,-100,-100,100,100,100,-100,100,100,100,-100,-100,-100,-100,100,100,-20,-100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,-100,-100,100,100,-76,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-44,100,100,-100,-100,100,91,100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,33,63,100,-10,-100,100,-17,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-97,-100,100,100,59,100,-42,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-99,-100,-76,100,100,100,-100,-89,99,-100,-100,-100,-100,-100,100,100,29,-100,-100,-100,-100,100,99,100,-56,-52,-100,99,99,99,99,-100,-100,100,100,-100,-100,-99,-99,-100,100,100,100,100,-100,-100,-100,0,75,-20,-100,-100,100,100,100,-100,68,-100,-100,-100,100,100,24,-100,100,-100,8,76,38,-100,-100,58,100,-100,-100,100,100,-100,100,100,100,-100,-100,100,-100,100,100,100,-100,100,59,-100,-100,-100,-100,100,100,100,100,100,-100,100,100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-99,-99,-99,100,100,100,100,-100,-100,-100,-100,-98,10,8,98,100,99,86,-56,-70,-99,-2,37,99,100,100],"ownershipAllowedMAE":0.0193957,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".....X.X.........../.OX.XOXXOOX......../XXOXOOOOOX.X.XOX.../OOOXXXOOXXX...X..../...OOO.X........X../.XOOXO.........OX../.OX..........OOXX../.XXOO....O.OOXOOX../X.XXO....OX...OXX../...OX..XXXOOXXXO.../.XXO.XOOOXXOO...O../XOO..OOXXOOX.XXXO../O..O...X.XO.XOOOXO./.....XX.XXOX..XXXX./....OOXXXXO...OXX../..O.OXX.O..O.OXOO../....OOX..O....XXX../.....X.OO........../.................../","hintLoc":"null","initialTurnNumber":169,"metadata":"B9B359FB5377DD7C287752303E83EDD2:179","moveLocs":["A9","C10","G2","N2","G15","E8","E7","G10","D8","H13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.69e-05,1.61e-05,1.68e-05,1.6e-05,1.68e-05,0,0,0,1.69e-05,1.65e-05,1.77e-05,1.84e-05,1.71e-05,1.63e-05,1.6e-05,1.6e-05,1.6e-05,1.65e-05,1.62e-05,1.71e-05,0,0,1.8e-05,0,0,0,0,0,0,0,1.7e-05,1.66e-05,1.75e-05,1.7e-05,1.85e-05,1.57e-05,1.61e-05,1.63e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.85e-05,0,0,0,1.72e-05,1.55e-05,1.6e-05,0,0,0,0,0,0,0,0,0,0,0,1.76e-05,1.84e-05,2.15e-05,0,1.83e-05,1.66e-05,1.61e-05,1.57e-05,0.000552,0.00384,1.84e-05,0,0,0,0,0,0.00496,3.84e-05,2.09e-05,2.03e-05,1.91e-05,1.92e-05,1.94e-05,1.78e-05,0,1.6e-05,1.6e-05,0.000778,0,0,0,0,0,1.84e-05,0.0777,0.0668,0.000451,0.000112,3e-05,1.89e-05,1.74e-05,1.71e-05,0,0,1.58e-05,1.59e-05,0.000454,0,0,1.75e-05,1.73e-05,1.75e-05,4.98e-05,0,0.0876,0.00368,0.000128,1.94e-05,1.73e-05,0,0,0,0,1.56e-05,1.58e-05,2.26e-05,0,0,0,0,1.69e-05,0.000342,0.43,0.000301,0,0.0133,0,0,0,0,0,0,1.59e-05,1.58e-05,0,1.82e-05,0,0,0,1.96e-05,0.00804,0.283,0.00269,0,0,6.3e-05,1.97e-05,1.74e-05,0,0,0,1.58e-05,1.57e-05,0.000754,9.65e-05,0,0,0,1.88e-05,0,0,0,0,0,0,0,0,0,0,1.57e-05,1.55e-05,1.58e-05,0,0,0,0,1.75e-05,0,0,0,0,0,0,0,0,8.4e-05,3.12e-05,1.61e-05,0,1.57e-05,1.64e-05,1.72e-05,0,0,0,0,0,0,0,0,0,0,0,0.000151,0,0,0,0,1.58e-05,1.6e-05,0,1.68e-05,1.72e-05,0,0,1.64e-05,1.2e-05,0,0,0,0,2.23e-05,0,0,0,0,0,0,1.66e-05,1.6e-05,1.6e-05,1.6e-05,1.74e-05,1.74e-05,0,0,0,0,0,0,0,9.04e-05,7.08e-05,0,0,0,0,1.63e-05,1.63e-05,1.61e-05,1.59e-05,1.61e-05,0,0,0,0,0,0,0,6.91e-05,0.00191,0.0081,0,0,0,1.66e-05,1.64e-05,1.63e-05,1.63e-05,0,1.64e-05,0,0,0,1.63e-05,0,2.19e-05,2.21e-05,0,1.95e-05,0,0,0,0,1.57e-05,1.59e-05,1.58e-05,1.61e-05,1.55e-05,1.59e-05,0,0,0,1.64e-05,1.71e-05,0,2.69e-05,4.86e-05,3.77e-05,0.000112,0,0,0,1.57e-05,1.56e-05,1.61e-05,1.61e-05,1.61e-05,1.53e-05,1.66e-05,0,0,0,0,1.82e-05,2.07e-05,0.000181,0,7.72e-05,1.78e-05,1.64e-05,1.58e-05,1.59e-05,1.61e-05,1.6e-05,1.61e-05,1.58e-05,1.59e-05,1.61e-05,1.68e-05,1.66e-05,1.67e-05,1.71e-05,1.79e-05,1.8e-05,1.77e-05,1.9e-05,1.79e-05,1.74e-05,1.63e-05,1.59e-05,1.59e-05,1.64e-05,1.46e-05],"winrateAvg":0.340615,"leadAvg":-1.10868,"scoreMeanAvg":-1.39916,"scoreStdevAvg":6.15213,"shorttermWinlossErrorAvg":0.422681,"shorttermScoreErrorAvg":2.30318,"ownership":[98,98,98,98,98,97,97,96,97,22,-3,-95,-95,-97,-98,-98,-98,-98,-98,98,99,97,99,98,100,97,97,100,100,-99,-96,-96,-97,-98,-98,-98,-98,-98,98,98,100,99,100,100,100,100,100,-99,-98,-100,-75,-99,-97,-99,-98,-98,-98,100,100,100,99,99,99,100,100,-99,-99,-99,-58,-40,-37,-99,-82,-98,-99,-99,16,36,89,100,100,100,100,-50,-49,-52,-41,-25,-21,6,-19,-31,-100,-99,-99,-51,-95,100,100,59,100,32,-10,-49,-24,-13,1,-17,34,35,30,-100,-100,-99,-97,-96,-97,-31,61,27,-17,-74,-13,-2,5,29,56,95,95,-100,-100,-100,-99,-97,-97,-97,99,100,56,30,69,44,98,90,99,98,-1,95,95,-100,-99,-99,-97,-97,-97,-97,100,85,86,90,91,99,92,93,9,-7,94,-100,-100,-99,-99,-56,-95,-97,100,82,87,81,82,81,83,97,97,-98,-99,-99,-97,-99,-99,-99,78,-98,-97,100,98,86,99,99,98,81,80,97,96,-2,-95,-98,-97,-98,-98,80,100,100,100,96,99,98,-100,-100,94,94,-81,-43,-99,-99,-100,-97,-99,-98,99,98,99,100,100,-58,-59,-100,-100,-100,93,-21,-98,-94,-96,-96,-100,-98,-99,98,98,98,96,-58,-100,-100,-100,-100,-100,92,-81,-57,-94,-100,-100,-100,-100,-99,99,99,98,98,100,100,-100,-100,-100,-100,94,51,5,-14,-20,-100,-100,-99,-99,99,99,100,98,100,-100,-100,-58,84,-31,-12,94,39,52,-100,-99,-99,-99,-99,99,99,99,99,100,100,-100,-4,67,94,4,-25,-28,-42,-100,-100,-100,-99,-99,99,99,98,99,99,98,99,99,99,57,-15,-31,-93,-89,-97,-99,-99,-99,-99,98,99,99,98,99,99,98,92,78,48,-5,-41,-64,-87,-94,-97,-98,-99,-99],"ownershipAllowedMAE":0.0243958})%"); + lines.push_back(R"%({"sample":{"board":"...XO............./OOO.OXX.XXOO.X..../.XOOOX.X.OX.O...../XXXXOXXOX.X.OXX.../.XOOXOOO.X..O...../.X.OXXXO.....OX.../..XO...OOX....X.X./XXXO.XX...O.O...../.OXO...OO.O..O.O../O.O.OXX.X.XX....../.OO..OXX........../....O.........O.../..X..X.......XO.../.OOOOXO........X../..XXX.....OX..OX../......X....O..OO../................../................../","hintLoc":"null","initialTurnNumber":114,"metadata":"5270EDA141ABC11915C0899CBB3728D0:124","moveLocs":["L5","N4","M5","K4","N3","M2","M13","L13","O12","N12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.06,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.184,"pda":0.0,"policyMixture":[2.16e-06,3.25e-06,3.06e-06,0,0,2.83e-06,2.84e-06,2.75e-06,2.68e-06,2.66e-06,2.78e-06,2.46e-06,2.57e-06,2.64e-06,2.85e-06,2.74e-06,2.72e-06,2.41e-06,0,0,0,2.23e-06,0,0,0,2.65e-06,0,0,0,0,3.66e-06,0,3.3e-06,3.3e-06,2.92e-06,2.78e-06,2.56e-06,0,0,0,0,0,2.47e-06,0,2.69e-06,0,0,2.91e-06,0,3.41e-06,3.36e-06,3.15e-06,3.03e-06,2.63e-06,0,0,0,0,0,0,0,0,0,2.93e-06,0,2.61e-06,0,0,0,3.28e-06,3.2e-06,2.76e-06,2.12e-06,0,0,0,0,0,0,0,3.48e-06,0,1.46e-05,0.0582,0,5.43e-06,3.4e-06,3.14e-06,3.25e-06,2.75e-06,2.8e-06,0,2.73e-06,0,0,0,0,0,3.4e-06,0.0537,0,0,0.582,0,0,3.1e-06,3.2e-06,2.76e-06,2.71e-06,1.94e-06,0,0,2.88e-06,2.78e-06,3.07e-06,0,0,0,0.0153,0.0148,0,0,0,3.24e-06,0,3.01e-06,0,0,0,0,2.6e-06,0,0,0.0136,3.84e-05,6.28e-05,0,3.8e-06,0,3.5e-05,4.96e-06,7.68e-06,4.93e-06,3.94e-06,2.93e-06,0,0,0,2.73e-06,2.68e-06,2.87e-06,0,0,1.11e-05,0,5.45e-05,0.000413,0,2.89e-05,0,0.000605,4.3e-06,0,0,0,2.69e-06,0,0,0,2.83e-06,0,3.7e-06,0,0,1.59e-05,5.05e-05,0.134,0.000128,0.00265,4.52e-06,2.47e-06,0,0,3.02e-06,3.64e-06,0,0,0,3.06e-06,3.55e-06,3.25e-06,3.79e-06,3.93e-05,0.000219,0.0576,0.0221,0.00262,3.73e-06,2.73e-06,2.7e-06,2.79e-06,3.9e-06,0,3.44e-05,3.13e-06,3.23e-06,4.01e-06,4.06e-06,4.89e-06,6.18e-06,5.4e-06,0.000115,0,1.24e-05,0.000418,3.43e-06,3.01e-06,5.63e-06,0,4.26e-06,8.55e-05,0,4.22e-06,4.5e-06,6.45e-06,5.72e-06,3.78e-06,3.66e-06,4.27e-06,0,0,4.78e-06,9.98e-06,3.21e-06,4.06e-06,0,0,0,0,0,0,4.69e-06,6.71e-06,0.0112,0,0,4.51e-05,1.49e-05,5.85e-05,0,1.41e-05,3.46e-06,4e-06,0.000208,0,0,0,3.74e-06,5.5e-06,5.93e-06,6.27e-06,0,0,0,0,0.00716,0,0,3.36e-06,3.48e-06,3.37e-06,4.32e-06,3.26e-06,2.5e-06,2.76e-06,3.25e-06,0,5.22e-06,0.000606,7.17e-06,0.000756,0,0,3.41e-06,0,0,0.00225,2.77e-06,3.25e-06,3.47e-06,3.34e-06,3.04e-06,3.02e-06,3.21e-06,3.61e-06,8.96e-06,2.76e-05,0.0175,1.29e-05,0,0.000285,3.32e-06,3.21e-06,9.72e-06,9.14e-06,4.05e-06,2.45e-06,2.8e-06,2.68e-06,2.63e-06,2.57e-06,2.58e-06,2.91e-06,3.07e-06,3.3e-06,3.37e-06,3.56e-06,3.9e-06,3.21e-06,2.89e-06,2.89e-06,2.9e-06,3.96e-06,2.31e-06,5.5e-06],"winrateAvg":0.204418,"leadAvg":-2.47618,"scoreMeanAvg":-3.62882,"scoreStdevAvg":11.9362,"shorttermWinlossErrorAvg":0.22153,"shorttermScoreErrorAvg":2.2914,"ownership":[99,98,98,98,100,58,-41,-94,-89,-31,-15,20,-13,-51,-79,-83,-82,-82,100,100,100,98,100,-100,-100,-100,-100,-100,41,37,-19,-90,-82,-82,-83,-82,-1,-98,100,100,100,-100,-100,-100,-99,-97,-98,14,42,7,-83,-85,-83,-83,-97,-97,-98,-98,100,-100,-100,87,-99,-97,-98,-20,43,-96,-96,-86,-82,-81,-97,-97,98,98,-92,87,86,86,-14,-98,-2,18,46,-61,-75,-83,-81,-79,-97,-97,28,97,-91,-90,-91,85,38,-16,61,-67,-38,-33,-96,-81,-74,-75,-97,-97,-97,97,13,-71,18,85,85,-37,27,24,91,-95,-95,-44,-86,-54,-97,-97,-97,97,30,-94,-94,-23,70,47,89,63,92,30,-7,-2,-2,-30,-32,84,-97,97,9,-63,-19,87,87,21,89,-8,27,89,51,68,5,-7,96,84,98,96,96,-96,-97,-32,-91,-45,-89,-89,-9,23,-14,6,1,-6,94,98,98,81,66,66,-97,-97,-48,-45,-48,-30,5,20,12,-1,-3,-1,93,94,90,77,86,-37,-48,-38,-8,-25,-37,-29,-6,26,88,33,13,6,87,89,80,85,-38,-90,-33,-18,-8,-16,-31,-34,-15,-38,89,47,23,16,75,96,95,95,94,-90,30,0,14,15,-71,-72,-33,35,70,14,21,26,67,-57,-93,-93,-93,-78,1,4,32,76,77,-72,24,11,97,17,41,38,9,0,-56,-67,-73,-70,-82,7,5,42,66,83,15,60,97,96,52,52,-5,-20,-49,-62,-64,-63,-49,-21,7,8,49,84,44,69,80,81,77,60,-21,-32,-43,-54,-58,-53,-40,-20,1,23,44,56,58,63,72,75,75,70],"ownershipAllowedMAE":0.0409843})%"); + lines.push_back(R"%({"sample":{"board":"................/.....OOXXXO...../OO..OXXXOOX.O.../XOOOOO.XO.OO.OO./XXOXX.OXOO.OXXX./.XXX..OXXXOOOOX./....O..OOX.X..OX/...XO..XOX....../...XO...OX.X.XX./.O..XX.......XO./.X.....X...O.XO./..XXXO....X.XOO./..O.XXOOO...XO.X/...XOO.O.O..XO../...XXOO.OXX.XXO./.....XO.......O./","hintLoc":"null","initialTurnNumber":121,"metadata":"4F816F7EB30B1B067CFF2D2E7318F068:131","moveLocs":["G6","F6","K6","L6","G5","J7","K5","H8","G10","L4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.57,"xSize":16,"ySize":16},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":5.5,"policyOptimism":0.483,"pda":0.0,"policyMixture":[5.29e-06,5.52e-06,4.85e-06,5.42e-06,6.26e-06,5.14e-06,5.47e-06,5.83e-06,4.66e-06,0.00222,0.000223,6.27e-06,5.21e-06,5.18e-06,5.46e-06,5.42e-06,5.4e-06,5.48e-06,4.81e-06,5.8e-06,5.38e-06,0,0,0,0,0,0,5.91e-06,5.3e-06,5.17e-06,5.7e-06,6.02e-06,0,0,4.96e-06,4.9e-06,0,0,0,0,0,0,0,6.16e-06,0,5.79e-06,5.56e-06,5.94e-06,0,0,0,0,0,0,5.25e-06,0,0,4.97e-06,0,0,0.000143,0,0,0.00056,0,0,0,0,0,6.43e-06,0,0,0,0,4.64e-06,0,0,0,0,0.000244,5.12e-06,0,0,0,6.26e-06,5.84e-06,0,0,0,0,0,0,0,0,0,0.000238,5.77e-06,5.96e-06,7.02e-06,0.171,0,5.13e-06,0,0,0,0,8.91e-06,0,0.000424,0.0418,0,0,5.4e-06,5.79e-05,8.79e-06,0,0,5.34e-06,5.79e-06,0,0,0,6.28e-06,7.5e-06,0.000115,0.000154,0.000112,0.0972,5.32e-06,6.36e-06,9.99e-06,0,0,1.76e-05,7.66e-06,0,0,0,4.38e-06,0,7.19e-06,0,0,1.07e-05,5.52e-06,0,1.65e-05,0.0236,0,0,0.479,6.21e-06,0,0.154,5.12e-06,5.67e-06,5.58e-06,0,0,8.67e-05,9.21e-06,0,0.000112,5.4e-06,5.43e-06,0,0,0,9.13e-06,0,0,0,5.18e-06,0,0,5.98e-06,5.67e-06,0.000232,0,0,0,0,0,6.66e-06,5.77e-06,0,0,5.17e-06,0,0,0,6.67e-06,8.65e-06,0.00213,0,0.00142,0,0,0,0,0,6.65e-05,0,5.2e-06,0,0,7.45e-06,0,5.82e-06,0.000312,0.000324,0,0,0,3.86e-06,0,5.57e-06,0,0.000195,6.94e-06,0,0,3.58e-05,2.68e-05,7.9e-06,2.83e-05,0.000249,0,0,0,0,4.73e-06,0,0,0,5.62e-06,0,0,0,6.47e-06,5.26e-06,1.67e-05,8.6e-06,1.17e-05,0.023,0,0,5.22e-06,6.52e-06,7.33e-06,6.56e-06,5.64e-06,5.28e-06,5.85e-06,0,4.34e-06,8.46e-06],"winrateAvg":0.746408,"leadAvg":0.950713,"scoreMeanAvg":1.3979,"scoreStdevAvg":4.15159,"shorttermWinlossErrorAvg":0.359798,"shorttermScoreErrorAvg":1.15037,"ownership":[99,99,98,97,94,54,-56,-72,-86,-47,-51,48,94,95,95,94,99,99,98,98,97,96,95,-100,-100,-100,96,96,97,96,95,93,100,100,99,99,100,-100,-100,-100,100,100,97,99,100,97,93,91,-98,100,100,100,100,100,33,-100,100,100,100,100,58,99,99,21,-98,-98,100,-98,-98,4,100,-100,100,100,100,100,-87,-88,-88,-4,-97,-98,-98,-98,-23,27,100,-100,-100,-100,100,100,100,100,-88,-77,-97,-97,-96,80,94,67,100,100,100,-100,32,-67,48,40,39,-87,-97,-97,-96,-98,93,9,20,-55,100,-100,-19,-33,10,-9,-55,-79,-96,-97,-97,-99,94,-41,5,-53,99,-99,-60,-99,-34,-100,-100,-75,-96,-94,-97,-96,-99,-98,45,-12,-85,2,-16,-97,-95,-100,96,-20,-97,-99,-97,-98,-98,-98,100,-54,9,90,-100,-97,-99,-100,96,51,-97,-97,-100,-100,-100,100,100,54,82,93,-100,-99,-100,96,96,92,-96,-96,-95,-97,-100,-99,100,100,100,-71,-100,-97,-100,96,95,91,-95,-95,-96,-98,100,100,100,100,81,77,-25,-96,-100,96,95,94,-95,-95,-94,-98,-98,100,100,99,99,-99,-99,-98,-100,-100,95,95,-95,-94,-93,-81,31,33,100,95,9,-19,-90,-94,-71,18,95,95],"ownershipAllowedMAE":0.026483})%"); + lines.push_back(R"%({"sample":{"board":"...X.......O......./..XXX.....O.O..X.../.XOXOOOXXXXOXXXOO../..OXOXOXOOOO..OXO../..OOXXOX....OX.XO../.X..XOO.X....X.X.../.OXXX..O.X....XOO../XOOX.XOXOX........./.XXOOOO..OX......../O.XXXO...O........./XOOOXO....O....O.../XX.OOX.X.OXXXX...../..XOXX.X.XOXXO...../.XOXX.O...OXOO..OO./..OOO...X.OOX...OX./OOO...OOX.XX.X.O.X./XXOXX.O.OXO..XO.X../.XXXOOOO.O....O..X./O.XO....O........../","hintLoc":"null","initialTurnNumber":162,"metadata":"102E7C0455453EAC0BDA7665DFB7E321:172","moveLocs":["O18","R18","O19","N13","N14","M14","M12","M13","N12","O13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.7,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.54e-06,2.43e-06,1.42e-06,0,1.97e-06,3.51e-06,3.68e-06,7.79e-06,4.26e-06,3.86e-06,2.26e-06,0,2.59e-05,0,5.03e-06,5.92e-05,0.000148,2.84e-06,1.64e-06,2.06e-06,2.35e-06,0,0,0,5.9e-06,3.03e-05,1.38e-05,6.49e-06,6.09e-06,0,0,0,0,2.4e-06,0,0,3.76e-06,1.89e-06,1.87e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.66e-06,1.95e-06,1.64e-06,1.97e-06,0,0,0,0,0,0,0,0,0,0,0.00018,4.73e-06,0,0,0,3.02e-06,1.92e-06,1.61e-06,1.83e-06,0,0,0,0,0,0,6.6e-06,3.68e-06,6.83e-05,3.15e-05,0,0,3.35e-06,0,0,2.71e-05,2.21e-06,1.59e-06,0,1.85e-06,1.66e-06,0,0,0,0.000417,0,4.07e-06,1.07e-05,0,0,0,5.36e-05,0,0.00106,6.69e-05,2.79e-06,2.16e-06,0,0,0,0,0.000309,1.01e-05,0,0.042,0,3.52e-06,0,0,0,0,0,0,4.93e-05,2.36e-06,0,0,0,0,2.9e-06,0,0,0,0,0,3.17e-06,0,0,0.266,0.677,7.44e-05,9.06e-06,3.82e-06,2.01e-06,2.22e-06,0,0,0,0,0,0,0.000304,0.000805,0,0,2.91e-06,6.65e-06,2.02e-05,6.35e-05,8.64e-06,3.1e-06,2.61e-06,1.81e-06,0,1.31e-06,0,0,0,0,2.62e-06,0.00646,0.000128,0,1.15e-05,1.02e-05,3.21e-05,1.41e-05,1.38e-05,5.15e-06,2.87e-06,2.5e-06,1.78e-06,0,0,0,0,0,0,5.99e-06,5.89e-06,0.000241,6.19e-06,0,1.9e-05,3.34e-06,3.84e-06,1.01e-05,0,3.06e-06,2.6e-06,1.82e-06,0,0,2.96e-06,0,0,0,2.26e-06,0,1.99e-05,0,0,0,0,0,9.22e-06,8.74e-06,3.02e-06,2.81e-06,2.12e-06,1.97e-06,2.16e-06,0,0,0,0,2.3e-06,0,2.67e-06,0,0,0,0,0,4e-06,2.82e-06,2.53e-06,2.82e-06,2.39e-06,2.33e-06,0,0,0,0,0.00015,0,4.73e-06,2.68e-06,5.63e-06,0,0,0,0,2.98e-06,2.36e-06,0,0,2.66e-06,2.33e-06,2.28e-06,0,0,0,0.0026,0.000137,0.000272,0,5.61e-06,0,0,0,2.61e-06,2.51e-06,2.19e-06,0,0,2.17e-06,0,0,0,3.15e-06,0.000126,0.000444,0,0,0,2.51e-06,0,0,2.19e-06,0,2.66e-06,0,2.06e-06,0,1.68e-06,0,0,0,0,0,2.26e-06,0,0,0,0,0,2.65e-06,1.97e-06,0,0,2.45e-06,0,1.43e-06,1.86e-06,1.96e-06,0,0,0,0,0,0,0,0,0,2.49e-06,2.62e-06,2.66e-06,2.55e-06,0,2.32e-06,2.04e-06,0,1.72e-06,0,2e-06,0,0,1.81e-06,1.73e-06,1.67e-06,1.67e-06,0,1.63e-06,1.9e-06,1.95e-06,1.95e-06,2.17e-06,1.86e-06,2.1e-06,2.23e-06,1.79e-06,1.33e-06,5.74e-06],"winrateAvg":0.00338598,"leadAvg":-26.373,"scoreMeanAvg":-25.6929,"scoreStdevAvg":14.812,"shorttermWinlossErrorAvg":0.0205825,"shorttermScoreErrorAvg":4.56539,"ownership":[-90,-90,-90,-92,-56,-17,-11,-35,-44,-29,-17,3,-46,-81,-46,-1,10,58,61,-90,-89,-92,-93,-94,10,-2,-42,-63,-32,2,5,2,-80,-33,-32,88,61,73,-91,-92,-85,-92,58,58,58,-92,-92,-92,-91,4,-80,-79,-78,87,88,82,78,-90,-89,-86,-93,56,-97,59,-92,3,1,0,2,-42,-78,-72,-77,89,84,80,-93,-92,-86,-87,-99,-99,58,-92,-55,-35,-14,-7,-3,-81,-78,-79,90,81,78,-96,-100,-94,-95,-100,59,58,-13,-94,-40,-30,3,-80,-80,-71,-79,17,75,72,-98,-97,-100,-100,-100,-15,38,59,-30,-94,-34,4,5,11,-73,83,86,73,66,-99,-97,-98,-100,-37,-64,62,44,50,-93,-84,-90,-89,6,-54,25,53,65,61,-96,-99,-99,66,64,64,63,55,37,55,-89,-43,-39,-62,37,28,45,55,57,-91,-94,-99,-99,-99,64,35,-8,8,54,-7,-21,-37,-35,4,34,54,59,58,-96,-89,-90,-89,-99,64,-12,-20,-24,15,44,-18,-37,-20,12,86,65,65,63,-94,-94,-90,-89,-89,-96,-58,-97,-38,19,-94,-94,-94,-93,14,37,65,70,65,-48,-60,-91,-87,-96,-96,-30,-96,-41,-87,-75,-93,-93,65,26,43,64,71,69,21,-58,91,-96,-96,-31,67,10,-44,-81,-76,-93,64,65,37,52,96,96,-8,40,55,92,92,92,-20,44,6,-93,-86,-77,-75,-86,6,8,60,96,-89,-24,92,91,92,89,89,93,100,100,-92,-13,-88,-89,-78,-89,0,94,12,-90,-86,85,84,93,84,84,93,100,98,99,-14,77,18,-27,-88,93,45,-90,-90,-89,85,85,85,86,100,100,100,100,98,99,61,30,17,-11,92,6,-77,-90,-89,85,86,86,95,94,97,98,98,100,88,62,37,26,44,61,13,-24,-88,-88],"ownershipAllowedMAE":0.0613772})%"); + lines.push_back(R"%({"sample":{"board":".................../....O.O.OOOO....X../..XX...XOXXX.XX..X./...O.OXOX.....OOO../.X..OX..X.XX...XO../..XO.O.XXOOXOO.XO../..X.....XXOOX..XO../.OXXO...OXOXX..O.X./O.OX.O...OXXOX..X../XO.XXOOOOOOO..O..../XXXXOOXO.OXOO..O.../XOOOX.XXOXXX.X...X./....X.OOX..X..XXX../.O.OOXXO.OOOXX.O.../.....X.O....OO.OX../.OOO...........OX../.OXOXX.O.X.O..OXX../OXXX..XO......O..../...XOX............./","hintLoc":"null","initialTurnNumber":169,"metadata":"DCC34D4AB5FAAA808D3B5034EFF095C8:179","moveLocs":["O13","K15","S9","S10","R9","T9","Q11","J9","Q2","J8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.99,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1button1","komi":7.0,"policyOptimism":0.276,"pda":0.0,"policyMixture":[3.1e-06,9.1e-06,1.17e-05,1.56e-05,4.43e-06,3.53e-06,3.41e-06,3.37e-06,3.35e-06,3.13e-06,3.18e-06,4.17e-06,1.33e-05,8.12e-06,1.19e-05,4.38e-06,3.71e-06,3.91e-06,3.17e-06,3.61e-06,5.72e-05,5.41e-05,0.00059,0,4.19e-06,0,5.25e-06,0,0,0,0,0.00809,1.86e-05,5.15e-06,3.82e-05,0,1.5e-05,3.99e-06,3.56e-06,6.67e-06,0,0,0.0335,7.48e-06,0.000929,0,0,0,0,0,5.63e-05,0,0,2.37e-05,0.00167,0,3.74e-06,3.54e-06,5.73e-06,0.0113,0,4.26e-06,0,0,0,0,3.04e-06,3.11e-06,3.37e-06,8.06e-06,5.52e-05,0,0,0,1.15e-05,4.11e-06,3.43e-06,0,4.77e-06,3.69e-06,0,0,0.0244,2.74e-06,0,0,0,0,4.57e-06,3.43e-06,3.7e-06,0,0,3.82e-06,4.13e-06,3.09e-06,3.94e-06,0,0,3.42e-06,0,4.8e-06,0,0,2.99e-06,3.1e-06,0,0,0,3.36e-06,0,0,4.34e-06,4.51e-06,3.04e-06,3.51e-06,0,3.59e-06,3.84e-06,3.7e-06,4.42e-06,3.59e-06,0,0,3.25e-06,3.61e-06,0,0,3.4e-06,0,0,0.00937,4.66e-06,3.07e-06,0,0,0,0,3.29e-06,4.17e-06,5.01e-06,0,0,3.63e-06,0,0,0.000145,3.69e-06,0,3.39e-05,0,3.78e-06,0,3.06e-06,0,0,3.42e-06,0,3.4e-06,3.8e-06,3.42e-06,0,0,0,0,0,4.37e-06,0,0,3.36e-06,7.54e-06,0,0,3.1e-06,0,0,0,0,0,0,0,0,0,3.84e-05,1.08e-05,0,3.35e-06,8.59e-05,0,1.04e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,6.15e-05,3.98e-06,0,0,0,0,0,0,0,0,0,0.139,0,0,0,0,0,0,0.000739,0,3.66e-06,3.23e-06,2.92e-05,0,5.53e-05,0.572,7.81e-06,6.52e-06,7.01e-05,0,0.0448,0,0,0,3.25e-06,3.14e-06,0,1.04e-05,3.86e-06,0,0,0,3.48e-05,1.78e-05,6.65e-06,0,4.37e-06,0,0,0,0,0,5.04e-06,0,0,0,0,0,2.21e-05,0,0.000274,8.27e-06,1.02e-05,4.63e-06,3.27e-06,5.31e-06,3.54e-06,0.0351,0,8.28e-06,0,3.87e-06,3.28e-06,3.2e-06,2.95e-06,0,0,3.28e-06,0,0,5.37e-06,3.77e-06,2.63e-06,0,0,0,0.0125,0.000259,0.0377,8.36e-05,5.54e-06,3.85e-06,3.3e-06,3.02e-06,2.86e-06,3.03e-06,3.03e-06,0,0,4.81e-06,5.04e-06,6.3e-06,0,0,0,0,0,0.00824,0,0.000396,0,3.55e-06,0,2.95e-06,2.99e-06,0,0,0,5.66e-06,4.25e-06,0,0,0,0,4.69e-05,4.66e-06,0,0,5.46e-06,5.39e-06,3.64e-06,3.24e-06,3.01e-06,2.87e-06,0,0,0.0121,0.0427,4.22e-06,3.43e-06,0.000121,3.49e-06,0,0,0,3.16e-06,0.00273,5.07e-06,3.62e-06,3.6e-06,3.47e-06,3.12e-06,3e-06,3.06e-06,3.8e-06,5.09e-06,1.33e-05,3.49e-06,6.04e-06],"winrateAvg":0.750704,"leadAvg":1.00109,"scoreMeanAvg":1.43183,"scoreStdevAvg":7.38455,"shorttermWinlossErrorAvg":0.256629,"shorttermScoreErrorAvg":1.32966,"ownership":[-57,-38,-22,23,48,78,88,91,91,88,77,49,21,-31,-54,-76,-88,-90,-89,-77,-52,-61,-10,82,60,95,2,94,93,93,92,-6,-49,-82,-74,-94,-89,-88,-86,-90,-94,-92,-9,50,43,-54,94,-100,-100,-100,-27,-96,-96,5,66,-92,-55,-93,-89,44,86,54,88,-67,-51,-100,-98,-79,-40,6,14,95,95,96,12,-12,-96,-99,-23,50,96,18,20,-84,-100,-100,-100,-100,-25,-13,91,87,95,49,17,-98,-98,-99,90,72,91,-17,-100,-100,-100,-100,-100,93,94,90,87,95,55,24,-98,-98,-99,-20,32,39,-21,-53,-100,-100,-100,-100,-100,93,87,86,95,11,11,-98,-98,-99,-100,92,56,6,17,60,-100,-99,-100,-100,-7,8,95,24,-86,-30,-98,-98,-98,-99,3,98,54,56,57,98,-100,-100,-2,-74,27,95,-88,-82,-63,-99,-98,-99,-99,-99,98,98,98,98,98,98,98,-3,64,95,65,-23,-93,-91,-99,-99,-99,-99,98,98,-97,98,-96,98,-97,97,96,-40,23,89,89,89,-94,-99,96,95,95,-85,12,-96,-96,-97,-97,-97,-96,34,-95,-32,-9,-2,-97,-93,69,71,75,-45,-85,-35,95,96,-96,4,0,-96,-90,-91,-99,-99,-99,-94,-93,74,97,89,96,94,-88,-89,96,-51,98,99,99,-96,-96,3,97,38,-93,-90,94,94,86,51,-22,-88,2,96,87,91,95,97,99,99,38,97,-94,-92,-88,94,98,98,98,24,-64,-30,1,88,89,92,95,97,97,96,97,-95,-88,-80,86,98,-90,98,-91,-92,4,93,89,82,92,99,97,97,99,-94,-95,-77,-69,88,-91,-92,-91,-90,-84,-84,92,83,86,90,95,96,97,99,99,-58,0,-63,4,-29,-86,-91,-87,-85,-21,4,62,82,89,93,95,97,96,78,69,16,-15],"ownershipAllowedMAE":0.0403382})%"); + lines.push_back(R"%({"sample":{"board":".................../.XOXOX.O...O.XOO.O./.X.X..XO...O.X..OO./.OXX.X.O.XXOX..XXOX/.OOO..O.OOOXX...OX./....OOX.OXXO...XOX./....OX.XXOXX......./.....OXX.O....X.XXX/.....OOX...OX.XOXOO/...O..OX.XXXO.XOO.O/...XOOXXOOXO.OXXOO./...OXXX.XOOXO.XXOXO/.OO......X.X.OXOXX./.XO...........OOX.X/X.XO...OO.......XX./.XXO...OXO...OOOOXO/..XO...OXXX.XXO..OO/.XO....OOX...XXOX../...............O.../","hintLoc":"null","initialTurnNumber":176,"metadata":"25F727DB9BCDB37C0756BB0651B58D01:186","moveLocs":["N6","O6","D2","E2","C1","M2","L4","N4","K5","M3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.93,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.872,"pda":0.0,"policyMixture":[6.19e-06,9.54e-06,1.14e-05,1.37e-05,2.38e-05,8.46e-05,0.000488,0.000114,2.77e-05,0.000412,0.000191,0.000947,0.00139,0.000334,0.00148,7.02e-05,0.00383,0.00114,7.46e-06,8.09e-06,0,0,0,0,0,0.000451,0,0.000112,0.00369,0.00331,0,0.000445,0,0,0,8.25e-06,0,7.91e-05,2.57e-05,0,1.15e-05,0,3.86e-05,2.27e-05,0,0,2.26e-05,0.000666,0.000483,0,0.000101,0,0.000166,0.000373,0,0,0.000167,7.43e-05,0,0,0,2.38e-05,0,3.96e-05,0,0.00103,0,0,0,0,2.25e-05,5.63e-05,0,0,0,0,3.44e-05,0,0,0,3.52e-05,0.00025,0,6.87e-05,0,0,0,0,0,2.04e-05,2.63e-05,0.000247,0,0,1.62e-05,1.2e-05,1.77e-05,1.37e-05,1.6e-05,0,0,0,0.000126,0,0,0,0,3.76e-05,2.76e-05,2.05e-05,0,0,0,1.72e-05,1.13e-05,2.43e-05,3.15e-05,1.92e-05,0,0,3.92e-05,0,0,0,0,0,3.75e-05,2.55e-05,1.73e-05,1.97e-05,9.28e-05,2.06e-05,1.31e-05,1.11e-05,2.73e-05,2.81e-05,3.8e-05,0.000232,0,0,0,1.04e-05,0,2.22e-05,2.99e-05,7.09e-05,2.12e-05,0,0.000221,0,0,0,1.33e-05,2.58e-05,3.08e-05,3.81e-05,0.000141,0,0,0,1.14e-05,1.94e-05,3.5e-05,0,0,5.08e-05,0,0,0,0,0,2.56e-05,4.33e-05,4.11e-05,0,5.96e-05,4.83e-05,0,0,0.000312,0,0,0,0,0.000242,0,0,0,0,0,0.000201,0.000127,0.144,0,0,0,0,0,0,0,0,0,0.00502,0,0,0,0,0,0,9.51e-05,0.000208,4.84e-05,0,0,0,0,4.81e-05,0,0,0,0,0,0.000154,0,0,0,0,0,0.0302,0,0,0.00119,0.00134,5.33e-05,5.94e-05,0.000256,0.000409,0,0.00229,0,0.000237,0,0,0,0,0,0.036,4.29e-05,0,0,0.000117,0.0509,0.0218,0.00332,0.000147,0.00856,0.000463,0.000329,7.68e-05,0,0,0,0,0,3.37e-06,0,0,9.06e-06,0,0,0.000397,0.00311,0.000352,0,0,0,2.98e-05,0.000162,4.57e-05,8.68e-06,7.59e-06,1.21e-05,0,0,1.28e-05,7.15e-06,0,0,0,0.000138,0.00165,5.46e-05,0,0,6.47e-06,0,0.441,0,0,0,0,0,0,0,7.56e-06,5.99e-06,0,0,0.00182,0.00112,5.24e-05,0,0,0,0,0,0,0,0,6.31e-06,0.192,0,0,6.17e-06,0,9.32e-06,0,0,0.0224,3.7e-05,0,0,0,0.000101,0,1.81e-05,0,0,0,0,2.36e-05,1.66e-05,6.42e-06,6.89e-06,0,3.85e-05,0.00137,5.6e-05,2.44e-05,1.28e-05,3.93e-05,2.66e-05,5.52e-05,6.81e-05,3.01e-05,7.6e-06,6.21e-06,0,1.19e-05,1.58e-05,6.17e-06,2.28e-05],"winrateAvg":0.00688016,"leadAvg":-7.45841,"scoreMeanAvg":-7.81595,"scoreStdevAvg":6.16103,"shorttermWinlossErrorAvg":0.0325331,"shorttermScoreErrorAvg":1.23322,"ownership":[-94,-96,-96,-93,-86,-72,-14,67,86,83,76,56,-30,-45,6,83,87,88,88,-92,-98,-95,-98,-79,-91,48,98,89,83,81,91,-15,-96,89,90,89,89,88,-16,-98,-98,-98,-87,-83,-87,97,91,90,89,91,-16,-96,-31,14,90,89,77,16,99,-98,-98,-30,-93,44,98,90,86,86,91,-98,-83,-63,-95,-94,89,-26,93,99,99,99,27,2,89,49,94,95,95,-98,-98,-87,-88,-92,-88,-94,-29,94,94,94,96,99,99,-79,-21,94,-97,-97,-91,-92,-90,-91,-98,-88,-94,-76,91,91,91,93,98,-17,-20,-100,-100,-89,-97,-97,-92,-89,-92,-88,-94,-92,-93,87,88,89,88,89,93,-100,-100,-95,-88,-91,-89,-81,-81,-100,-78,-100,-99,-99,83,85,86,86,89,93,93,-100,-95,-93,-91,-83,-87,-65,-100,-52,-99,-62,-64,77,82,84,90,84,88,93,-100,-92,-98,-98,-98,9,-40,-100,-56,-56,-63,-59,68,77,75,69,88,87,-100,-100,-69,-75,-98,-10,-10,46,-100,-99,-56,-56,-57,34,78,82,88,-99,-100,-100,-39,-74,-71,-78,-96,88,30,-100,-100,-59,-74,-59,-14,96,96,39,-9,-44,-35,-13,0,-95,-88,-96,29,100,-99,100,-77,-77,-74,-33,-86,96,75,20,-8,-6,27,-34,-57,-68,-57,-71,100,100,100,-77,-69,-78,-94,-84,-99,96,42,38,35,95,94,-95,-74,-40,21,55,81,68,-78,-76,42,-94,-99,-99,95,67,61,64,95,-98,-94,-98,-93,99,100,100,100,100,-77,98,-98,-99,-99,95,80,70,75,95,-98,-98,-98,82,81,80,100,98,97,97,97,-98,-99,-93,-93,84,53,78,95,95,-98,-63,81,80,80,77,100,94,96,96,-98,-96,-97,-25,7,50,76,77,8,-47,-59,52,78,91,96,100,98,96,95],"ownershipAllowedMAE":0.0374602})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...O..O.X.......X../..........X..X..XO./.OO.............OO./.XO............OOX./.XXO............XO./..XO............X../.XOX..........OOXX./.X...........XXXOO./.OXX...........OXO./.OO.......O.....XO./...O.O..O.......X../.....O.X..O......../....XOX..OXX.....X./...OOX.X.O..XXX.X../..O..X...OXXOOXXOX./..XX...X.OXO.OOXO../..........O....O.../","hintLoc":"null","initialTurnNumber":50,"metadata":"3B0A9848F0521E747CB50C08C5EAEFAC:60","moveLocs":["Q13","S7","L18","L17","K18","N17","E11","D10","J18","M18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.67,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":-0.0,"policyOptimism":0.685,"pda":0.552,"policyMixture":[2.63e-05,2.69e-05,2.63e-05,2.77e-05,2.74e-05,2.74e-05,2.75e-05,2.75e-05,2.6e-05,2.73e-05,3.45e-05,0.000757,5.67e-05,8.54e-05,3.56e-05,3.43e-05,3.55e-05,3.5e-05,2.87e-05,2.88e-05,2.88e-05,2.79e-05,2.92e-05,3.01e-05,3.23e-05,3.32e-05,3.54e-05,0,0,0,0,6.9e-05,0.000113,4.79e-05,0.000108,0.0122,0.133,4.1e-05,2.92e-05,3.12e-05,2.85e-05,0,3.18e-05,3.41e-05,0,0.000139,0,0.0615,0,4.77e-05,0,3.74e-05,0.015,5.03e-05,0,0.0421,3.57e-05,3.05e-05,2.77e-05,3.24e-05,3e-05,3.48e-05,4.17e-05,6.16e-05,0.000149,0.00751,3.83e-05,0,0.000242,4.02e-05,0,0.000266,0.00519,0,0,2.94e-05,6.26e-05,0,0,3.13e-05,3.82e-05,6.59e-05,0.000533,0.199,0.163,6.86e-05,5.52e-05,4.96e-05,5.28e-05,5.21e-05,6.28e-05,4.25e-05,0,0,2.81e-05,9.2e-05,0,0,3.63e-05,4.48e-05,5.77e-05,0.000509,0.00542,0.000434,0.00021,0.000105,9.77e-05,5.36e-05,4.62e-05,3.54e-05,0,0,0,0.000376,0.00199,0,0,0,3.53e-05,5.91e-05,0.000234,0.000434,0.000355,0.00026,0.00017,9.73e-05,5.54e-05,4.28e-05,3.23e-05,0,0,0,3.59e-05,7.11e-05,3.5e-05,0,0,4.03e-05,9.02e-05,0.000189,0.000322,0.000299,0.000255,0.000187,0.000203,0.000107,4.03e-05,3.13e-05,0.0439,0,0.0205,0.00196,3.1e-05,0,0,0,0,4.78e-05,0.000224,0.000233,0.000203,0.00019,0.000181,0.000324,0.000867,0.000129,0,0,0,0,0.00058,3.55e-05,0,0,0,5.64e-05,0.000104,0.00014,9.75e-05,8.93e-05,8.41e-05,0.000138,0.000469,0.00117,0,0,0,0,0,3.77e-05,2.98e-05,0,0,0,4.47e-05,7.13e-05,5.35e-05,5.26e-05,5.33e-05,4.68e-05,4.53e-05,0.000118,0.00129,5.46e-05,3.86e-05,0,0,0,3.27e-05,2.71e-05,0,0,3.56e-05,3.59e-05,3.82e-05,4.37e-05,4.64e-05,4.3e-05,3.86e-05,0,4.74e-05,0.000129,4.91e-05,3.81e-05,3e-05,0,0,2.64e-05,2.83e-05,2.69e-05,2.62e-05,0,2.78e-05,0,3.26e-05,4.83e-05,0,3.96e-05,3.22e-05,5.68e-05,5.88e-05,4.15e-05,3.48e-05,2.98e-05,0,0,2.9e-05,2.89e-05,2.9e-05,3.03e-05,2.89e-05,2.9e-05,0,3.18e-05,0,5.21e-05,3.63e-05,0,0.00479,3.37e-05,3.18e-05,3.07e-05,2.75e-05,2.79e-05,2.71e-05,2.71e-05,2.8e-05,2.97e-05,3.02e-05,2.99e-05,0,0,0,3.18e-05,3.87e-05,0,0,0,3.02e-05,2.77e-05,2.91e-05,2.86e-05,2.87e-05,0,2.78e-05,3.07e-05,4.18e-05,2.95e-05,0,0,0,3.14e-05,0,3.4e-05,0,0.000955,0.000147,0,0,0,2.91e-05,0,5.37e-05,3.25e-05,3.36e-05,4.92e-05,0,3.16e-05,7.75e-05,0,6.15e-05,0.000964,3.68e-05,0,0,0,0,0,0,0,0,0,5.12e-05,3.26e-05,0.259,0,0,4.33e-05,3.6e-05,7.29e-05,0,5.51e-05,0,0,0,2.44e-05,0,0,0,0,0.000682,4.71e-05,2.51e-05,2.7e-05,2.64e-05,2.68e-05,3.11e-05,3.25e-05,3.15e-05,4.28e-05,3.37e-05,3.06e-05,0,3.02e-05,3.43e-05,2.47e-05,5.39e-05,0,3.53e-05,4.29e-05,3.02e-05,2.43e-05],"winrateAvg":0.0831471,"leadAvg":-3.27307,"scoreMeanAvg":-4.55737,"scoreStdevAvg":8.98655,"shorttermWinlossErrorAvg":0.0923469,"shorttermScoreErrorAvg":0.91365,"ownership":[90,92,92,92,92,92,92,92,87,67,6,-23,-84,-79,-75,-69,-52,-39,-1,90,91,93,93,92,91,93,92,94,94,94,-96,-88,-81,-78,-76,-70,7,34,89,91,92,98,81,81,97,19,-39,36,-96,-91,-98,-83,-61,-76,-92,-12,61,88,89,89,67,59,59,32,16,-17,-45,-95,-34,-49,-96,-24,17,-90,97,77,-45,98,98,63,40,29,19,32,8,-12,-20,-13,-12,-11,1,46,97,97,93,-72,-98,98,73,35,11,5,3,1,-5,-8,-2,1,6,31,97,97,91,90,-82,-99,-98,87,26,2,-9,-6,-5,-5,-3,1,4,8,42,97,-88,92,76,-96,-98,-98,86,17,-22,-12,-5,-3,-1,2,8,-1,8,51,80,-89,58,33,-90,-99,-97,-98,47,-6,-5,-2,2,4,8,12,0,-30,90,92,-90,-90,-75,-14,-99,-98,-98,-16,-4,-3,0,6,10,16,17,-10,-96,-97,-98,-87,-89,-90,1,98,-98,-98,-29,4,-2,3,12,19,29,19,13,-23,-68,-61,-100,-89,-93,88,98,98,-10,-7,14,-3,9,31,38,84,18,-3,-35,-55,-77,-100,-89,-97,92,94,95,98,44,98,19,0,89,65,24,-7,-18,-42,-57,-72,-100,-100,-97,89,90,92,94,94,98,-15,-88,22,60,62,-28,-49,-49,-64,-77,-84,-96,-99,79,84,87,93,92,98,-95,-57,45,95,-98,-99,-65,-67,-73,-80,-90,-100,-98,65,77,81,95,95,-98,-93,-96,35,95,36,-94,-100,-100,-100,-96,-100,-98,-98,35,64,88,-18,-21,-98,-92,-65,-16,96,-95,-95,91,91,-100,-100,-16,-98,-94,9,11,-94,-95,-92,-93,-87,-94,61,96,-95,92,90,92,92,-99,-1,-62,-89,-17,-52,-54,-83,-90,-89,-80,-21,20,92,94,93,87,88,51,50,2,-32,-72],"ownershipAllowedMAE":0.0319504})%"); + lines.push_back(R"%({"sample":{"board":".X.OX.....O......../O.XOXOOXXO.OXX.XX../.OXOXXOXOO.OOX..OO./OXXO.XOXX.O.OX.XXO./.OXO.XXOXXOXX.X.OX./O.OXXXOOOXX.X.X.OX./.OOO.OX.OO.XOXO.OX./..OOOOX.OX.XO.O.OX./.OXOXXX.OXXX.O.XOX./.OXOOOX.OXOXXOXXXX./.OXXXOXXOXOOXOOXO../.OOX.XOXOO.OOX.O.../.XOXXOOOXXOOXXXXOO./X.XXOOOX.X.OOOX.X../XXOO..OOXX.XO.OX.X./XO.O....OX.XO.XXX.X/.O.OOOOO.X.XOXXOOX./OO..O.OXXXOXXOOO.OX/..OO.O.O..OOO...OX./","hintLoc":"null","initialTurnNumber":308,"metadata":"130743FCE02ABE4BD7A0FFB8F6B577D0:318","moveLocs":["K1","T1","O1","P1","S1","O1","R2","P8","O5","S2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.3,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.0251,0,0.00693,0,0,5.33e-05,6.8e-05,1.8e-05,1.88e-05,1.55e-05,0,1.56e-05,1.79e-05,1.66e-05,1.74e-05,1.66e-05,1.72e-05,1.72e-05,1.61e-05,0,0.229,0,0,0,0,0,0,0,0,2.1e-05,0,0,0,1.82e-05,0,0,2.2e-05,1.82e-05,0,0,0,0,0,0,0,0,0,0,1.83e-05,0,0,0,1.78e-05,2.41e-05,0,0,1.68e-05,0,0,0,0,0.00795,0,0,0,0,1.64e-05,0,1.69e-05,0,0,1.87e-05,0,0,0,1.76e-05,0,0,0,0,0.00977,0,0,0,0,0,0,0,0,1.81e-05,0,1.86e-05,0,0,1.81e-05,0,0,0,0,0,0,0,0,0,0,0,1.88e-05,0,2.16e-05,0,1.85e-05,0,0,1.68e-05,0.00829,0,0,0,7.51e-05,0,0,0.00114,0,0,0.00103,0,0,0,0,3.46e-05,0,0,1.77e-05,9.62e-05,0.000276,0,0,0,0,0,0.000958,0,0,2.21e-05,0,0,2.25e-05,0,6.42e-05,0,0,1.74e-05,3.95e-05,0,0,0,0,0,0,0.000883,0,0,0,0,3.58e-05,0,2.33e-05,0,0,0,1.66e-05,2.08e-05,0,0,0,0,0,0,0.00172,0,0,0,0,0,0,0,0,0,0,1.77e-05,2.23e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000124,2.07e-05,3.47e-05,0,0,0,2.87e-05,0,0,0,0,0,0,0,0,0,0,0,9.85e-05,3.8e-05,2.46e-05,2.7e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.99e-05,0,3.93e-05,0,0,0,0,0,0,2.85e-05,0,0.231,0,0,0,0,2.39e-05,0,0.000124,9.34e-05,0,0,0,0,0.000786,0.000175,0,0,0,0,0.000153,0,0,0,0.000124,0,1.75e-05,0,0.000149,0,0,2.45e-05,0,1.87e-05,2.91e-05,0.00096,0.000992,0,0,0.000167,0,0,0.403,0,0,0,0.00229,0,1.75e-05,0,2.15e-05,0,0,0,0,0,0.000133,0,0.0112,0,0,0,0,0,0,0,0.0515,0,0,1.94e-05,2.21e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.68e-05,1.67e-05,0,0,0,0,0,0,2.91e-05,0,0,0,0,0,0,0,0,0,0.00175,0.000133],"winrateAvg":0.035043,"leadAvg":-20.9922,"scoreMeanAvg":-17.0753,"scoreStdevAvg":19.0457,"shorttermWinlossErrorAvg":0.157093,"shorttermScoreErrorAvg":11.7061,"ownership":[-25,-47,-43,-43,-93,-90,-93,-94,-94,-92,-90,-92,-95,-96,-96,-95,-94,-94,-93,-6,-32,-43,-43,-91,-88,-89,-100,-100,-90,-92,-90,-100,-100,-95,-98,-99,-93,-93,-6,-12,-41,-41,-91,-89,-89,-100,-91,-90,-92,-90,-90,-100,-95,-90,-90,-90,-93,42,-42,-42,-38,-63,-90,-89,-100,-100,-94,-90,-94,-90,-100,-95,-99,-99,-90,-93,47,80,-39,-36,-67,-90,-91,99,-100,-100,-91,-100,-100,-98,-100,-90,-81,-100,-95,92,82,100,-93,-91,-91,100,99,100,-100,-100,-99,-100,-97,-100,-92,-82,-100,-96,91,100,100,100,46,100,68,85,99,100,10,-100,-86,-99,-82,-88,-82,-100,-96,96,97,100,100,100,100,67,83,99,-99,-60,-100,-86,-87,-82,-90,-83,-100,-96,96,100,92,100,67,66,68,83,99,-99,-100,-100,-92,-82,-90,-100,-84,-100,-95,96,100,93,100,100,100,68,83,99,-99,88,-100,-100,-83,-99,-100,-100,-100,-94,96,100,93,93,93,100,68,69,99,-96,85,87,-100,-85,-84,-99,-85,-91,-91,95,100,100,94,97,95,100,70,99,98,84,84,88,-99,-84,-84,-85,-88,-88,95,91,100,93,94,100,100,100,24,22,83,84,-98,-99,-99,-99,-82,-80,-84,90,93,93,94,100,100,100,55,50,21,30,83,85,86,-99,-98,-100,-88,-85,90,91,100,100,97,97,100,100,21,20,27,20,83,-95,-93,-100,-97,-99,-81,90,100,99,100,98,97,95,91,93,16,29,16,80,-62,-100,-100,-100,-56,-85,95,100,98,100,100,100,100,100,60,12,36,15,72,-99,-100,54,55,-57,-9,100,100,98,99,100,99,100,23,16,13,52,12,13,51,53,53,48,50,-10,98,98,100,100,99,100,95,97,43,13,49,49,49,50,53,52,51,49,45],"ownershipAllowedMAE":0.136359})%"); + lines.push_back(R"%({"sample":{"board":".O.....X...X....../XXOO..XOX.XO.O..../..XO.XXO.OXXO.O.../..XOX..XO.XO.OO.../..XOOXXXOXXOO...../X.XO.O.XXOXXX.O.../.XO...O..OOXXO.X../.OOOOOXXX.OOOOX.../...XOXO..O.XXXOO../..OXOXXXOO.XOO..../..OXXOXX.XO...OX../.XO..OOXX.XO.OX.../.XOXXXOOX........./.XOOXOXOOOOOOO..../..XX..XXXXOXXXOO../.OOX.....OXXXXXOOO/.XXO.....OXXO.XXXO/.........OXO.O.X.X/","hintLoc":"null","initialTurnNumber":187,"metadata":"7963D770F7103C4EBA6A272847EFC4B6:197","moveLocs":["B8","O14","N15","Q17","P14","R15","R14","R13","R16","S14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.16,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":-5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.91e-05,0,2.44e-05,2.37e-05,2.45e-05,2.39e-05,3.28e-05,0,3.14e-05,2.49e-05,2.61e-05,0,3.37e-05,2.66e-05,4.4e-05,4e-05,3.44e-05,2.2e-05,0,0,0,0,2.37e-05,2.29e-05,0,0,0,5.55e-05,0,0,2.66e-05,0,0.000251,0,0.0125,3.93e-05,6.24e-05,7.98e-05,0,0,2.2e-05,0,0,0,3.7e-05,0,0,0,0,2.2e-05,0,0.113,0,0.000195,0.000398,0.000117,0,0,0,2.35e-05,2.28e-05,0,0,2.37e-05,0,0,0,0,0,0.556,0,4.98e-05,3.3e-05,6.33e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0862,0,0,0,0.000106,0,0,2.2e-05,0,2.22e-05,0,0,0,0,0,0,2.22e-05,0,0.00488,0,2.92e-05,6.81e-05,0,0,2.21e-05,2.39e-05,2.27e-05,0,0.000731,0.000879,0,0,0,0,0,2.75e-05,0,2.8e-05,0.000163,0.00486,0,0,0,0,0,0,0,0,2.14e-05,0,0,0,0,0,9.03e-05,0.0964,3.37e-05,3.36e-05,2.34e-05,2.47e-05,0,0,0,0,9.84e-05,0.000855,0,2.64e-05,0,0,0,0,0,0.00965,3.32e-05,2.32e-05,2.27e-05,0,0,0,0,0,0,0,0,2.97e-05,0,0,0,3.07e-05,4.83e-05,0.000111,2.68e-05,2.41e-05,0,0,0,0,0,0,0,2.69e-05,0,0,7.66e-05,2.98e-05,2.51e-05,0,0,3.51e-05,2.66e-05,2.47e-05,0,0,0.00018,0.000191,0,0,0,0,2.79e-05,0,0,2.7e-05,0,0,4.15e-05,3.19e-05,2.62e-05,2.38e-05,0,0,0,0,0,0,0,0,2.61e-05,4.64e-05,2.51e-05,2.69e-05,2.7e-05,5.39e-05,2.88e-05,2.81e-05,2.61e-05,2.44e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,2.63e-05,2.51e-05,2.65e-05,2.53e-05,2.45e-05,0.000602,0,0,0.0428,0.000125,0,0,0,0,0,0,0,0,0,0,2.35e-05,2.35e-05,2.74e-05,0,0,0,7.18e-05,0.000402,3.68e-05,3.11e-05,3.05e-05,0,0,0,0,0,0,0,0,0,5.94e-05,0,0,0,6.66e-05,8.83e-05,4.02e-05,0.00462,2.73e-05,0,0,0,0,0.016,0,0,0,0,2.23e-05,5.92e-05,5.54e-05,2.5e-05,2.59e-05,2.67e-05,2.65e-05,2.74e-05,2.45e-05,0,0,0,2.57e-05,0,0.00512,0,0.0391,0,2.47e-05],"winrateAvg":0.316391,"leadAvg":-2.22302,"scoreMeanAvg":-2.8309,"scoreStdevAvg":11.2907,"shorttermWinlossErrorAvg":0.374717,"shorttermScoreErrorAvg":3.55438,"ownership":[-20,93,91,53,7,-38,-83,-99,-96,-92,-87,-85,-15,13,56,47,50,56,-75,-74,99,99,-9,-61,-100,-97,-99,-93,-97,-10,-2,94,68,42,53,55,-74,-73,-75,99,50,-100,-100,-97,-97,-94,-97,-97,98,93,98,68,71,53,-73,-74,-72,99,-37,-38,-94,-100,-96,-96,-97,98,98,99,98,88,47,50,-73,-72,-72,99,99,-100,-100,-100,-96,-98,-98,99,99,-9,99,62,61,49,-74,-66,-76,99,98,98,-10,-100,-100,99,-98,-98,-98,-11,99,80,49,50,31,-69,99,98,98,95,95,-57,-5,99,99,-98,-98,99,86,55,59,58,82,99,99,99,99,99,-95,-96,-97,11,99,99,99,99,74,80,72,66,90,90,23,-72,99,-91,-89,-89,28,98,93,78,78,80,97,96,70,70,85,92,96,-71,99,-91,-90,-90,98,97,90,77,94,95,90,72,72,69,43,96,97,-71,-70,98,-90,-91,5,-77,88,73,81,81,92,62,67,70,16,-93,97,7,-19,98,98,-91,-92,-72,-72,89,70,87,65,69,67,71,-34,-93,96,-91,-92,-91,98,98,-93,7,29,60,78,77,75,72,73,74,-79,-92,97,96,-92,-91,-97,98,99,99,99,99,98,98,81,78,77,79,-90,-90,-98,-99,-86,-94,-97,-97,-97,-97,99,-88,-88,-89,90,89,84,83,-91,-87,-88,-98,-88,-85,-87,-89,-88,-79,-86,-87,-88,-89,-91,88,88,89,-90,-92,-93,-83,-86,-83,-83,-79,-82,-77,-86,-87,-88,-88,-91,-91,-91,90,-90,-88,-88,-87,-85,-84,-82,-82,-80,-77,-86,-87,-88,-88,-90,-91,30,24],"ownershipAllowedMAE":0.0459312})%"); + lines.push_back(R"%({"sample":{"board":"........O.O.O./XXX.X.XO.O.OOX/.OOXXX.XOOOXXX/..OXOOXX.OXXX./.XOXO.OX.OX..X/.O.OOOXX.OOXX./.OOOOXX.OOX..X/.X..XX.OOXXXX./.X.X.XO.O.X.OO/XO..X.O.OX.OX./.OOOXO.OXXOOO./.OXXOO.OXOOXXO/..X.XOX.XOXXX./OXXXXXXXXOX.X./OOOOX.OOO.OX.X/...OXX.O..OOX./.OOXX.XXOOOXX./.OXOO.XO.OX.X./..X...XO.O.X../","hintLoc":"null","initialTurnNumber":208,"metadata":"3371B3267593185EE745986CFEFFCAE8:218","moveLocs":["D12","G19","F19","H19","G8","O7","G9","F10","D10","C12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":14,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":7.0,"policyOptimism":0.33,"pda":0.0,"policyMixture":[0.000126,0.000127,0.000125,0.000122,0.000123,0,0,0,0,0,0,0,0,0.000141,0,0,0,0.00013,0,0.000126,0,0,0,0,0,0,0,0,0.00561,0,0,0,0,0,0.00013,0,0,0,0,0,0,0,0.00597,0.00121,0,0,0,0,0,0,0.000132,0,0,0,0,0.000129,0.00115,0,0,0,0,0.000172,0,0,0.000132,0,0,0.000124,0.00013,0,0.000594,0,0,0,0,0,0,0,0.000132,0,0,0,0,0.000129,0.00105,0,0,0,0,0,0,0.000131,0,0,0,0.000124,0.000129,0,0.000227,0,0,0,0,0,0.000131,0,0,0,0,0,0,0.000138,0.000272,0,0.906,0,0.000112,0,0,0.000125,0,0.00013,0,0.000149,0,0,0,0,0.0179,0,0,0,0,0.000318,0,0,0.000133,0,0,0.000135,0.000706,0,0,0,0,0,0,0,0,0,0,0,0,0.000228,0.000739,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00146,0.0225,0,0.000118,0,0,0,0.000224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000118,0,0.000335,0,0,0,0,0,0.000132,0,0,0,0.00024,0,0,0.000124,0,0.000124,0.000125,0.000122,0,0,0,0.000145,0,0.000122,0.000126,0,0,0,0.000126,0.000127,0,0,0,0,0.000125,0,0,0,0,0,0,0,0.000123,0.000157,0,0,0,0,0.0124,0,0,0.000581,0,0,0.000122,0,0.000122,0.00014,0.00273,0,0.00163,0.00676,0.00238,0,0,0.000659,0,0.00015,0,0.000125,0.000126,6.96e-05],"winrateAvg":0.960888,"leadAvg":1.30091,"scoreMeanAvg":1.3846,"scoreStdevAvg":1.5499,"shorttermWinlossErrorAvg":0.115516,"shorttermScoreErrorAvg":0.597745,"ownership":[-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,20,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,16,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,94,98,100,-100,100,100,-100,-100,25,100,-100,-100,-100,-100,98,99,100,-100,100,-9,-9,-100,-36,100,-100,-100,-100,-100,94,100,99,100,100,100,-100,-100,33,100,100,-100,-100,-100,12,100,100,100,100,-100,-100,-13,100,100,-100,-100,-100,-100,-70,-100,100,-100,-100,-100,-10,100,100,-100,-100,-100,-100,-59,-95,-100,-100,-100,-100,-100,100,100,100,-59,-100,-7,100,100,-97,100,-50,-100,-100,100,100,99,100,-100,-13,100,100,100,13,100,100,100,-100,100,-100,99,-100,-100,100,100,100,99,93,100,-100,-100,100,100,-100,98,-100,100,100,-100,-100,100,99,-34,-100,-100,-100,100,-100,-77,-100,100,-100,-100,-100,99,100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-83,100,100,100,100,-100,-53,100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-6,100,100,100,100,100,-100,-100,100,100,100,-100,-100,-97,-100,-100,100,100,100,-100,-100,-100,100,100,99,99,99,-66,-100,100,100,100,-96,-97,-100,-100,100,100,99,99,22,-74,-100,100,99,100,-10,-99,-99,-100],"ownershipAllowedMAE":0.0252535})%"); + lines.push_back(R"%({"sample":{"board":"................/................/................/...X..X.....O.../................/..O............./................/..XOO.........../..XXO.........../.............O../..........O...O./..O..X......OOX./..XX.XO....XOXX./....XO.....OXO../............XX../................/","hintLoc":"null","initialTurnNumber":18,"metadata":"0A7BBD055DE9C9B6405B3F5593778823:28","moveLocs":["C10","E7","F7","E6","J14","H12","F14","F13","C14","C13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.87,"xSize":16,"ySize":16},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":7.5,"policyOptimism":0.0,"pda":-2.369,"policyMixture":[6.76e-05,7.94e-05,8.95e-05,8.41e-05,8.61e-05,9.2e-05,8.29e-05,8.57e-05,8.71e-05,8.58e-05,8.65e-05,8.98e-05,9.05e-05,8.69e-05,8.58e-05,6.95e-05,8.13e-05,0.00616,0.000133,0.000405,0.0014,0.000213,0.0005,0.000146,0.000121,0.000131,0.000148,0.000179,0.000148,0.000132,0.000112,8.56e-05,9.96e-05,0.0984,0,0.492,0.00247,0,0.00127,0.000115,0,0.000144,0.000935,0.0011,0.000392,0.000395,0.000132,8.82e-05,9.99e-05,0.0565,0,0,0.000534,0,0,0.000111,0.000182,0.00172,0.00168,0.000323,0,0.000314,0.00014,9.21e-05,0.000102,0.000184,9.34e-05,0.00011,0.00114,0.000111,9.94e-05,0,0.00117,0.00229,0.00105,0.000324,0.000154,0.000406,0.000141,8.92e-05,0.000109,0.000125,0,0.000107,0.000224,0.000246,0.000375,0.000572,0.00342,0.00136,0.00089,0.000415,0.000427,0.000174,0.00013,8.4e-05,0.00011,0.00011,0,9.23e-05,0.000105,0.000141,0.00069,0.0021,0.00181,0.00112,0.000461,0.000156,0.000141,0.000133,0.000115,8.24e-05,0.000102,0.0176,0,0,0,0.000104,0.000871,0.00219,0.00162,0.000522,0.000155,0.000132,0.000121,0.000114,0.000104,8.08e-05,0.000112,0.000152,0,0,0,0.000129,0.00132,0.00144,0.000843,0.000155,0.000129,0.000114,0.000103,9.02e-05,9.15e-05,7.94e-05,9.9e-05,0.000579,0.00132,0.246,0,0,0.000138,0.00116,0.000277,0.000131,0.000101,9.4e-05,8.69e-05,0,7.58e-05,7.76e-05,8.58e-05,0.000211,0.00112,0.000125,0,0.000252,0.000229,0.000816,0.000162,0.000112,0,8.6e-05,7.77e-05,7.39e-05,0,8.45e-05,8.38e-05,9.6e-05,0,0.000104,9.62e-05,0,0.00148,0.00014,0.000142,0.000124,0.000107,0.000116,0,0,0,0.00134,7.14e-05,0.00127,0,0,9.48e-05,0,0,0.000125,0.000156,0.000164,0.00102,0,0,0,0,0.000188,8.01e-05,0.000127,0.000487,0.000133,0,0,0.000129,0.000132,0.000133,0.000152,0.000355,0,0,0,0.00811,0.000143,7.5e-05,0.000139,0.00011,0.000107,0.00046,0.000117,0.00014,0.000109,0.000112,0.000119,0.000123,0.000135,0,0,0.00322,0.000107,6.61e-05,7.41e-05,7.57e-05,8.16e-05,8.25e-05,8.85e-05,8.26e-05,8.13e-05,8.23e-05,8.32e-05,8.28e-05,8.83e-05,7.67e-05,8.03e-05,7.62e-05,6.98e-05,5.44e-05],"winrateAvg":0.018681,"leadAvg":-7.65073,"scoreMeanAvg":-8.8794,"scoreStdevAvg":10.6482,"shorttermWinlossErrorAvg":0.0285563,"shorttermScoreErrorAvg":1.05713,"ownership":[42,51,58,57,51,41,30,27,27,26,26,28,28,26,27,27,30,52,61,64,62,50,37,23,33,28,25,31,31,29,25,27,12,13,78,71,5,66,-9,-7,60,14,22,38,39,31,30,27,-16,-12,-87,-88,-59,-93,-92,-40,-7,-22,13,32,86,47,31,31,-17,-42,-35,-39,-38,-46,-58,-89,-33,-6,4,21,36,45,40,34,-1,25,51,-3,-13,-10,-15,-28,-11,-8,3,17,31,36,38,36,-1,2,55,38,19,-6,0,-4,-7,-1,7,17,28,36,42,41,-28,-26,-91,71,71,22,17,0,2,4,11,19,27,38,48,48,-45,-75,-91,-90,71,44,24,18,9,9,16,21,30,48,57,57,-66,-76,-86,-83,-96,58,11,18,12,13,22,35,42,91,71,69,-75,-78,-81,-89,-97,-10,-7,6,13,18,80,43,51,83,89,65,-81,-83,-75,-91,-91,-98,-20,0,7,8,28,31,87,87,-89,47,-85,-85,-99,-99,-94,-98,27,-2,0,12,1,-19,86,-89,-90,-60,-85,-89,-88,-89,-97,-11,-18,-2,-5,-6,-30,-9,-97,-89,-90,-86,-85,-83,-84,-85,-66,-37,-16,-10,-8,-15,-31,-50,-97,-96,-91,-91,-84,-81,-78,-70,-53,-36,-19,-8,-8,-18,-34,-55,-79,-92,-93,-91],"ownershipAllowedMAE":0.0278687})%"); + lines.push_back(R"%({"sample":{"board":"........./..XOX..../.X...O.O./.XOO...../..X..X.X./....X..../......O../....O..../........./","hintLoc":"null","initialTurnNumber":2,"metadata":"935573D7A587D046FE95A62224DADF50:12","moveLocs":["E6","D2","G6","G5","D3","D4","C2","D9","F8","H6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":9,"ySize":9},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":13.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.88e-05,4.78e-05,3.9e-05,0,7.89e-05,0.0217,0.000116,0.0033,3.39e-05,3.94e-05,0.000375,0,0,0,0,0.00082,0.152,0.000774,4.16e-05,0,0.361,0.00793,0.377,0,3e-05,0,0.026,4.71e-05,0,0,0,0,0.000859,0,0,5.24e-05,4.68e-05,0.00726,0,7.38e-05,7.46e-05,0,0,0,4.13e-05,4.87e-05,0.0116,0.0259,0,0,0.000115,3.9e-05,4.93e-05,4.3e-05,4.54e-05,0.000314,0.000923,0,0.000599,4.28e-05,0,4.84e-05,4.36e-05,4.21e-05,4.31e-05,0,0,0,4.41e-05,4.28e-05,4.15e-05,4.1e-05,3.76e-05,3.94e-05,3.63e-05,5.83e-05,3.7e-05,4.26e-05,4.05e-05,4.1e-05,3.62e-05,3.49e-05],"winrateAvg":0.551943,"leadAvg":-0.955017,"scoreMeanAvg":0.328262,"scoreStdevAvg":10.6888,"shorttermWinlossErrorAvg":0.425497,"shorttermScoreErrorAvg":4.07219,"ownership":[-75,-67,-55,-57,-4,25,31,29,28,-81,-69,-70,-17,-32,41,31,29,26,-84,-92,33,-18,39,42,16,36,-16,-75,-93,38,36,37,-57,19,-97,-43,-56,-68,-93,-52,-44,-97,-97,-97,-74,-30,-31,-20,-97,-97,-53,-49,-43,-59,-4,3,-17,45,-51,-24,21,-29,-33,16,24,55,34,59,12,9,-2,-21,26,37,47,57,44,31,18,6,-5],"ownershipAllowedMAE":0.206546})%"); + lines.push_back(R"%({"sample":{"board":".................../.....XO......O.X.../..OO..O...O..OX..O./.X....X......OXOO../.XOO.OX.......OX..X/..XX.X........OX.../..............XX.../..O...O.X........O./................O../.XX....O.X........./.OOXXX...O...X.XO../.OXOXO.O.......OO../...O.........X...../.OO..XO.........X../.OX.X....O....XX.X./.X.X.OO.XOX....OOO./....XXOX.XX..X.O.../........X........../.................../","hintLoc":"null","initialTurnNumber":44,"metadata":"5BD40AE5A03B1B26E19898752C36A989:54","moveLocs":["G8","K11","L10","J11","H12","L11","M10","M11","N13","O15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.02,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":8.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.19e-06,7.45e-06,7.54e-06,6.92e-06,6.77e-06,6.58e-06,7.28e-06,7.19e-06,7.26e-06,6.99e-06,6.83e-06,7.13e-06,6.84e-06,7.23e-06,6.9e-06,7.93e-06,8.77e-06,8.06e-06,6.41e-06,7.4e-06,8.78e-06,8.67e-06,8.02e-06,8.49e-06,0,0,1.06e-05,8.34e-06,8.16e-06,9.02e-06,7.45e-06,7.21e-06,0,9.33e-06,0,3.2e-05,0.0066,7.51e-06,6.83e-06,1.15e-05,0,0,1.24e-05,0.00578,0,0.000104,2.82e-05,4.09e-05,0,9.15e-06,7.06e-06,0,0,3.41e-05,0.00351,0,4.56e-05,6.26e-06,0,1.44e-05,1.06e-05,1.15e-05,0.00018,0,1.16e-05,0.000424,4.25e-05,1.73e-05,8.95e-06,7.04e-06,0,0,0,0,0.00297,7.12e-06,6.06e-06,0,0,0,0.000767,0,0,8.69e-06,4.95e-05,4.14e-05,1.51e-05,1.12e-05,9e-06,0,0,0,0.0214,2.52e-05,0,6.86e-06,6.89e-06,0,0,1.68e-05,0,2.78e-05,3.65e-05,8.74e-05,8.09e-05,5.82e-05,4.75e-05,9.68e-06,7.48e-06,0,0,7.51e-06,0.00112,8.14e-06,7.42e-06,8.46e-06,7.76e-06,7.84e-06,1.21e-05,1.26e-05,0.04,1.04e-05,8.99e-06,4.64e-05,0.119,1.46e-05,0,1e-05,0,0,8.54e-06,0.0124,8.73e-06,7.39e-06,7.9e-06,0,8.57e-06,9.88e-06,1.26e-05,0,0,0,1.08e-05,7.82e-06,7.96e-06,1.01e-05,0.00111,1.87e-05,8.24e-06,0.00306,0,8.04e-06,7.62e-06,7.06e-06,7.24e-06,8.51e-06,8.95e-06,9.89e-06,0.00395,1.02e-05,0,0,0,0,0.414,0.00541,0.0906,0.0759,0,1.2e-05,7.25e-06,8.35e-06,0,0,6.89e-06,6.83e-06,8.17e-06,3.09e-05,0,0.0271,0,0,0,0.048,0.0911,0.000278,0.0147,1.01e-05,5.27e-05,7.4e-06,6.8e-05,0,0,0,0,0,0.000141,0.000892,4.64e-05,0,9.46e-06,1.06e-05,2.72e-05,0,1.27e-05,0,0,7.91e-06,7.76e-06,0.000244,0,0,0,0,0,0,0,5.24e-05,1.78e-05,0.000989,2.12e-05,8.88e-06,7.55e-06,9.07e-06,0,0,8.37e-06,7.04e-06,3.36e-05,8.94e-06,8.41e-06,0,6.89e-06,9.68e-06,2.08e-05,0.0043,1.17e-05,2.54e-05,1.15e-05,1.05e-05,8.22e-06,0,7.65e-06,7.31e-06,7.63e-06,3.14e-05,7.63e-06,7.51e-06,0,0,7.76e-06,6.18e-06,0,0,9.14e-06,1.13e-05,9.28e-06,9.85e-06,8.73e-06,7.89e-06,6.98e-06,7.05e-06,6.43e-06,0,8.62e-06,7.63e-06,1.42e-05,0,0,6.23e-06,0,6.66e-06,7.41e-06,8.92e-06,9.14e-06,0,8.63e-06,7.2e-06,7.35e-06,7.53e-06,0,0,7.27e-06,0,8.12e-06,6.74e-06,0,6.07e-06,0,6.23e-06,0,0,6.69e-06,0,0,0,6.53e-06,6.82e-06,6.55e-06,6.9e-06,0,0,0,4.57e-05,7.27e-06,6.7e-06,6.47e-06,6.19e-06,0,0,0,0,5.75e-06,0,0,6.51e-06,6.32e-06,0,6.64e-06,0,5.56e-06,2.99e-05,9.21e-06,6.97e-06,6.59e-06,6.45e-06,6.33e-06,6.48e-06,6.44e-06,6.62e-06,5.99e-06,0,6.27e-06,6.24e-06,6.21e-06,6.87e-06,8.02e-06,0.000791,1.32e-05,2.73e-05,9.33e-06,1.42e-05,6.11e-06,6.71e-06,6.33e-06,6.61e-06,6.51e-06,6.43e-06,6.4e-06,6.36e-06,6.46e-06,6.42e-06,6.62e-06,6.5e-06,6.46e-06,7.41e-06,7.84e-06,8.17e-06,8.13e-06,9.01e-06,6.12e-06,7.68e-06],"winrateAvg":0.606924,"leadAvg":1.11782,"scoreMeanAvg":1.38364,"scoreStdevAvg":13.3932,"shorttermWinlossErrorAvg":0.158215,"shorttermScoreErrorAvg":1.33466,"ownership":[19,43,55,66,67,66,61,49,41,45,56,66,80,89,90,82,71,63,49,-15,32,59,68,70,56,81,49,39,43,60,70,75,99,92,74,80,43,36,-35,-11,82,83,53,59,79,-1,9,17,83,47,63,99,85,85,81,86,20,-50,-76,-15,50,33,25,-76,-25,-25,0,15,28,43,99,84,89,88,25,7,-65,-76,75,74,-5,51,-78,-36,-18,-4,9,16,25,99,98,-74,-17,-1,-20,-58,-74,-82,-82,-34,-83,-57,-22,-18,-5,3,2,3,31,98,-74,-38,22,-3,-47,-24,-45,-43,-32,-36,-17,-22,-13,15,-6,7,-62,-26,-77,-76,-4,2,26,-34,-25,8,-22,-12,-5,43,-56,-57,11,36,23,11,4,-33,-23,-5,75,45,-44,-35,-37,-12,-17,-3,20,30,86,85,84,84,-27,-29,-32,-16,76,66,61,3,-73,-73,-67,-40,-16,21,89,46,-62,-62,-66,-15,-52,-29,13,43,64,56,48,92,92,-95,-95,-94,23,36,39,59,2,-27,-60,-90,-9,-28,79,64,46,71,92,90,90,-95,-52,-70,64,33,19,-16,-23,-39,-36,8,80,80,42,29,90,91,92,91,-12,-73,-19,-5,21,8,-7,-24,-38,-87,6,13,-3,6,-7,84,92,92,19,-24,-92,8,-17,-3,-3,-18,-23,-40,-51,-54,-50,-86,-56,-37,39,92,-86,-43,-93,-47,-22,-29,-9,28,-28,-37,-41,-58,-93,-93,-16,-72,-18,19,-88,-84,-97,-55,-3,-3,-35,-80,26,-99,-56,-52,-41,-19,55,56,57,11,-53,-72,-75,-84,-96,-96,-5,-92,-78,-99,-99,-73,-63,-90,6,57,41,36,42,-68,-73,-78,-80,-83,-74,-48,-68,-97,-92,-89,-81,-76,-70,-64,41,29,26,37,-71,-75,-76,-74,-71,-61,-53,-66,-81,-89,-86,-80,-69,-57,-23,4,32,33,35],"ownershipAllowedMAE":0.0372313})%"); + lines.push_back(R"%({"sample":{"board":".................../.XXX.OO............/.OOX.OXOXOO..OOO.../.OXOOOXOOX.OOXXXOO./..XXOXXOX...X...XX./..X.XX.O......OX.../......O............/..XXOX.........X.../.OXO.O.........X.../..OO..........O..../.OXO.............../.XX............XXX./................OO./....X.X........O.../...X.....OO.O....../.....OO...X..X.XO../...XO.XOO.X.XOX.O../...XOX...XO....XO../....X............../","hintLoc":"null","initialTurnNumber":60,"metadata":"DBC44B2EFE80F14EAD3E681893982923:70","moveLocs":["E13","E11","A9","B10","H8","B13","B12","C13","D13","A12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.26,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":4.5,"policyOptimism":0.0,"pda":0.692,"policyMixture":[7.68e-06,8.36e-06,7.78e-06,8.22e-06,8.62e-06,7.86e-06,7.69e-06,7.32e-06,7.27e-06,6.87e-06,6.9e-06,6.73e-06,6.81e-06,7.14e-06,7.5e-06,7.18e-06,7.31e-06,7.55e-06,6.91e-06,1.36e-05,0,0,0,8.31e-06,0,0,1.15e-05,7.56e-06,7.11e-06,7.07e-06,6.94e-06,7.17e-06,7.81e-06,7.29e-06,8.54e-06,1.04e-05,1.63e-05,7.78e-06,0.00312,0,0,0,7.84e-06,0,0,0,0,0,0,7.45e-06,9.16e-06,0,0,0,5.61e-05,3.86e-05,8e-06,0.00128,0,0,0,0,0,0,0,0,0,7.38e-06,0,0,0,0,0,0,0,0.000202,0.551,0.239,0,0,0,0,0,0,0,7.79e-06,7.73e-06,1.14e-05,0,1.95e-05,7.79e-06,7.84e-06,0,0,7.68e-06,0.124,0.0674,0,0.00271,0,0,6.08e-06,0,8.46e-06,7.99e-06,8.5e-06,6.67e-05,1.68e-05,2.33e-05,0,0,7.79e-06,7.75e-06,7.94e-06,0.000479,0,0,0,0,2.86e-05,0,8.77e-06,8.5e-06,8.68e-06,1.01e-05,1.65e-05,0.000337,2.19e-05,9.54e-06,8.4e-06,7.5e-06,7.81e-06,7.75e-06,0,0,0,0,0,0,0.00013,1.06e-05,8.78e-06,1.09e-05,1.98e-05,7.39e-05,0.000208,1.4e-05,7.95e-06,0,7.8e-06,8.19e-06,7.92e-06,0.000141,0,0,0,0,0,1.01e-05,6.95e-05,4.18e-05,1.95e-05,4.07e-05,6.07e-05,3.42e-05,1.23e-05,8.45e-06,0,7.94e-06,8.29e-06,8.07e-06,1.01e-05,0,0,0,6.51e-06,7.89e-06,9.86e-06,4.79e-05,5.68e-05,1.95e-05,5.37e-05,5.76e-05,2.44e-05,8.4e-06,0,8.07e-06,7.58e-06,8.03e-06,8.1e-06,0,0,0,0,7.5e-06,9e-06,8.7e-06,8.53e-06,1.85e-05,5.1e-05,0.000152,6.77e-05,2.19e-05,1.37e-05,8.31e-06,7.47e-06,7.84e-06,7.76e-06,7.95e-06,7.32e-06,0,0,0.000299,9.61e-06,1.25e-05,8.82e-06,0,8.84e-06,4.91e-05,0.00014,7.92e-05,3.47e-05,1.44e-05,8.2e-06,0,0,0,7.58e-06,7.45e-06,7.78e-06,8.92e-06,1.11e-05,8.81e-06,1.03e-05,9.72e-06,8.81e-06,9.42e-06,4.45e-05,4.94e-05,1.89e-05,3.05e-05,1.73e-05,1.14e-05,1.3e-05,0,0,4.04e-05,7.63e-06,8.17e-06,1e-05,8.75e-06,0,8.44e-06,0,9.21e-06,2.02e-05,8.1e-06,8.1e-06,3.04e-05,8.91e-06,1.04e-05,0.000158,0,7.69e-06,9.46e-06,7.86e-06,7.62e-06,8.49e-06,8.88e-06,0,8.07e-06,7.91e-06,8.03e-06,0.00371,5.62e-05,0,0,9.22e-06,0,1.75e-05,7.92e-06,4.85e-05,1.26e-05,9.3e-06,7.93e-06,7.62e-06,8.09e-06,7.99e-06,7.64e-06,3.83e-05,0,0,8.11e-06,1.74e-05,7.95e-05,0,8.53e-06,9.89e-06,0,7.84e-06,0,0,8.06e-06,7.68e-06,7.64e-06,7.58e-06,8.25e-06,0,0,3.35e-05,0,0,0,7.16e-05,0,8.14e-06,0,0,0,7.3e-06,0,7.5e-06,7.45e-06,7.7e-06,7.73e-06,7.69e-06,0,0,0,3.57e-05,0.000995,0.000373,0,0,2.12e-05,8.54e-06,8.63e-06,7.21e-06,0,0,8.07e-06,7.37e-06,7.04e-06,7.75e-06,7.72e-06,7.99e-06,0,8.35e-06,8.52e-06,8.22e-06,8.14e-06,8.25e-06,9.12e-06,8.11e-06,7.62e-06,7.93e-06,8.02e-06,8.09e-06,1.19e-05,7.51e-06,7.09e-06,1.2e-05],"winrateAvg":0.602325,"leadAvg":1.01854,"scoreMeanAvg":1.02144,"scoreStdevAvg":10.8168,"shorttermWinlossErrorAvg":0.299003,"shorttermScoreErrorAvg":2.04392,"ownership":[-96,-96,-94,-66,-3,63,93,99,99,99,98,98,97,95,92,87,77,65,53,-96,-97,-97,-97,-11,99,99,99,99,99,99,98,98,97,96,91,80,57,39,-97,-95,-95,-98,-2,99,-89,100,98,100,100,98,98,99,99,99,85,54,26,-96,-96,-98,98,98,99,-90,100,100,31,76,100,100,-83,-83,-84,88,88,1,-92,-95,-98,-98,98,-92,-92,100,20,38,42,33,-38,-25,-29,-82,-93,-93,4,-30,-50,-98,-94,-94,-94,66,100,49,30,21,12,15,-23,13,-93,-77,-52,-42,57,61,57,-94,-95,74,97,54,23,15,12,9,-4,-4,-18,-49,-72,-65,-53,79,-92,-92,-93,95,44,56,24,13,7,3,0,-4,-12,-33,-97,-80,-69,-63,80,96,-93,96,96,96,35,3,2,0,-3,-3,-6,-12,-19,-97,-77,-72,-67,70,95,96,96,67,38,16,3,-1,-2,-5,-3,-2,1,39,-31,-64,-70,-64,-59,96,-88,96,38,16,6,-12,-3,-6,-8,-1,0,-3,4,-19,-62,-66,-64,-61,-89,-87,17,13,5,-14,-73,-16,-4,-6,1,5,2,2,-91,-91,-91,-13,-77,-81,-34,6,-5,-11,-31,-23,-5,1,5,7,8,3,-8,-16,85,85,-6,-84,-86,-82,-45,-90,-46,-83,3,6,24,29,15,21,8,-8,81,65,61,54,-88,-89,-89,-96,-10,6,3,-11,31,84,84,35,71,14,2,-1,57,78,66,-89,-90,-89,-3,20,83,82,48,39,-4,-91,-7,-26,-90,-57,-71,93,86,81,-89,-90,-89,-93,76,62,38,86,85,-16,-91,-70,-93,-62,-89,24,93,88,83,-88,-89,-89,-94,78,-42,52,40,15,-76,-49,-69,-81,-66,-63,-75,93,71,81,-87,-87,-85,-76,-74,-41,30,38,11,-30,-60,-72,-77,-72,-58,-14,1,69,72],"ownershipAllowedMAE":0.0345613})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../...X.............../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../","hintLoc":"null","initialTurnNumber":1,"metadata":"29ADD65F904EB3695CF5CCDFD4FC9313:11","moveLocs":["D4","Q4","Q16","R17","Q17","R16","R14","R15","Q15","S14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.82,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":6.0,"policyOptimism":0.324,"pda":0.0,"policyMixture":[4.56e-06,5.99e-06,5.89e-06,7.02e-06,6.71e-06,7.01e-06,6.73e-06,6.56e-06,6.42e-06,6.26e-06,6.34e-06,6.22e-06,6.05e-06,5.34e-06,6.74e-06,6.64e-06,7.21e-06,5.7e-06,4.89e-06,6.05e-06,1.41e-05,2.89e-05,3.45e-05,5.83e-05,9.7e-05,3.25e-05,2.38e-05,2.05e-05,1.91e-05,1.8e-05,1.69e-05,1.57e-05,1.17e-05,2.32e-05,1.62e-05,0.0046,1.12e-05,6.09e-06,5.65e-06,2.87e-05,0.142,0.00281,4.35e-05,0.058,0.00381,0.00133,0.000665,0.000391,0.000181,0.000114,3.25e-05,2.08e-05,7.64e-06,0,0,5.58e-06,6.34e-06,6.84e-06,3.91e-05,0.00259,0,5.7e-05,0.000456,0.00147,0.000588,0.000805,0.00111,0.000472,0.000219,3.01e-05,1.76e-05,6.08e-06,0,0,7.83e-06,5.83e-06,6.86e-06,8.79e-05,4.5e-05,6.03e-05,4.14e-05,0.00012,0.000156,0.000134,0.000135,0.000149,0.00011,6.03e-05,2.71e-05,1.76e-05,7.06e-06,0,0,3.03e-05,7.17e-06,6.89e-06,0.000111,0.128,0.000585,0.000117,8.57e-05,0.000101,9.42e-05,9.79e-05,9.58e-05,7.77e-05,5.12e-05,3.31e-05,2.19e-05,1.58e-05,8.69e-05,0,0,5.53e-06,6.59e-06,3.22e-05,0.00316,0.00133,0.000167,9.73e-05,0.000104,9.4e-05,9.38e-05,8.63e-05,6.64e-05,4.46e-05,3.57e-05,2.66e-05,2.36e-05,0.000462,0.00326,0.000171,6.51e-06,6.56e-06,2.34e-05,0.000444,0.000322,9.78e-05,8.14e-05,8.69e-05,9.01e-05,8.7e-05,7.74e-05,5.97e-05,4.46e-05,3.63e-05,3.22e-05,4.3e-05,3.58e-05,3.07e-05,1.42e-05,4.98e-06,6.32e-06,1.99e-05,0.000327,0.00029,7.68e-05,6.68e-05,7.67e-05,8.07e-05,7.72e-05,6.91e-05,6.02e-05,4.83e-05,3.76e-05,3.29e-05,3.42e-05,3.26e-05,3.47e-05,1.35e-05,5.11e-06,6.13e-06,1.85e-05,0.000247,0.000302,7.1e-05,5.94e-05,6.55e-05,7.08e-05,6.93e-05,6.88e-05,6.48e-05,5.32e-05,4.17e-05,3.43e-05,3.11e-05,3.16e-05,2.6e-05,1.18e-05,4.9e-06,6.02e-06,1.84e-05,0.000157,0.000224,5.61e-05,4.91e-05,5.31e-05,5.85e-05,6.73e-05,7.2e-05,6.48e-05,5.79e-05,4.67e-05,3.65e-05,3.1e-05,3.35e-05,2.82e-05,1.15e-05,4.96e-06,5.93e-06,1.96e-05,0.000215,0.000196,5.23e-05,4.23e-05,4.45e-05,5.32e-05,6.57e-05,6.88e-05,6.69e-05,6.39e-05,5.04e-05,4.07e-05,3.64e-05,4.57e-05,4e-05,1.3e-05,5.22e-06,6.32e-06,2.22e-05,0.00203,0.000767,5.61e-05,3.94e-05,4.25e-05,4.82e-05,5.53e-05,6.24e-05,6.47e-05,5.85e-05,5.84e-05,4.88e-05,5.27e-05,0.000209,0.000249,1.79e-05,5.81e-06,6.4e-06,2.62e-05,0.00534,0.00218,6.81e-05,3.82e-05,3.99e-05,4.21e-05,5.03e-05,5.76e-05,5.27e-05,4.89e-05,5.33e-05,4.24e-05,6.6e-05,0.000502,0.00535,4.13e-05,6.72e-06,6.87e-06,3.12e-05,0.000367,1.94e-05,3.14e-05,7.75e-05,5.55e-05,5.37e-05,6.01e-05,6.7e-05,5.66e-05,5.47e-05,7.4e-05,7.48e-05,2.9e-05,4.35e-05,3.51e-05,9.78e-05,7.22e-06,6.63e-06,2.04e-05,3.25e-05,0,1.87e-05,0.00214,0.000771,0.000195,0.000233,0.000288,0.000228,0.000184,0.000433,0.000321,3.53e-05,0,0.000344,4.26e-05,7.13e-06,6.15e-06,1.46e-05,6.88e-05,3.18e-05,0.000352,0.00557,0.0021,0.000216,0.000156,0.000234,0.000261,0.000312,0.00128,0.0131,3.11e-05,0.0011,0.581,2.96e-05,5.98e-06,6.52e-06,1.08e-05,1.47e-05,2.14e-05,3.25e-05,2.71e-05,2.23e-05,1.93e-05,1.8e-05,1.8e-05,1.88e-05,2e-05,2.66e-05,6.52e-05,6.69e-05,3.33e-05,2.59e-05,1.41e-05,6.3e-06,5.11e-06,6.4e-06,6.36e-06,7.06e-06,7.53e-06,6.64e-06,6.55e-06,6.15e-06,6.1e-06,6.22e-06,6.36e-06,6.66e-06,6.87e-06,7.15e-06,7.38e-06,7.12e-06,6.13e-06,6.36e-06,4.71e-06,6.9e-06],"winrateAvg":0.473054,"leadAvg":-0.216168,"scoreMeanAvg":-0.349229,"scoreStdevAvg":13.7831,"shorttermWinlossErrorAvg":0.0397962,"shorttermScoreErrorAvg":0.347942,"ownership":[6,7,9,6,6,4,2,1,1,3,7,11,14,15,9,-9,-40,-49,-61,5,9,5,3,0,8,2,0,0,2,5,8,13,13,25,-13,-41,-72,-68,4,1,3,-12,-9,-15,-8,-6,-1,-1,3,8,11,15,26,69,-87,-69,-73,0,-3,-23,-75,-33,-17,-6,-2,-1,-1,1,4,10,14,27,67,-86,-75,-70,0,-6,-16,-32,-18,-11,-4,-2,-1,-1,1,4,8,13,23,71,-88,-59,-64,3,5,-7,-18,-11,-6,-2,-1,-1,-1,0,3,6,10,14,35,73,-64,-47,4,4,-4,-2,-4,-2,0,0,0,0,0,1,4,6,12,12,-3,-28,-30,4,3,-2,0,0,0,0,1,0,0,0,1,2,3,5,2,1,-18,-16,3,2,2,1,1,1,1,1,1,0,0,0,1,1,2,0,2,-4,-6,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,1,1,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,5,6,-1,-1,3,1,2,1,0,0,0,0,0,0,-1,-1,-2,0,4,9,10,-1,-2,5,5,5,3,1,0,0,0,0,-1,-2,-4,-6,-2,6,17,13,0,-7,13,19,12,7,3,1,0,0,0,-1,-4,-9,-17,-18,-6,26,14,-2,2,14,34,19,12,5,1,-1,-1,0,-2,-6,-14,-25,-61,-12,20,13,-3,-1,18,75,33,18,4,0,-1,-1,0,-1,-5,-17,-45,-82,-4,3,10,-7,-5,-13,20,14,9,4,1,-1,0,1,-2,-4,-18,-15,-40,33,7,13,-7,-12,-5,0,3,-6,-3,-2,-2,-1,1,1,0,4,-12,-8,0,18,11,-9,-8,-7,-2,-1,-1,-2,-2,-2,-1,1,1,-1,-3,-6,-3,4,7,13],"ownershipAllowedMAE":0.0500008})%"); + lines.push_back(R"%({"sample":{"board":".O...............X./.XOOOX..X.XO.OXOX.X/..OX.X.O..XO...OOX./.OXX.XXXO.XXOOOOX.X/OXX.XOXOXXXOXXOXXXO/OOOOOOOOOOXO.OXXOOO/OXO.OOXOXXOOOO.OOX./X.XXXXXXXXXOX.OOXX./XXXOOO.X.XXOOXXXX.X/OOOOXX.XO.XO.O.OOX./.XOOXOOXXXOXXO.OXXO/.O...OX.XXOOOO.OOOO/.XOX..OXXOXX.OXXX.O/.XOXOOOOOO..XOO..X./.XOO.OXXO..X.X.OX.X/..XXOOXXX.X.XOOOOX./...XXXOX..XOOOXXX.X/......O...XOXX...X./.........X.X.X...../","hintLoc":"null","initialTurnNumber":255,"metadata":"2E42C500DA86380DE3474E21B7B14DCF:265","moveLocs":["Q19","O19","P19","M19","L19","A18","F19","L6","N5","Q6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.16,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.336,"pda":0.0,"policyMixture":[0,0,0.0139,0.00083,0.0084,0,0.000648,0.000682,0.000653,0.000621,0,0,0.0171,0,0,0,0.0142,0,0.000552,0,0,0,0,0,0,0.000626,0.000743,0,0.000626,0,0,0.0434,0,0,0,0,0.000587,0,0.0173,0.0173,0,0,0.00653,0,0.000612,0,0.000961,0.000605,0,0,0.0293,0.0155,0.00766,0,0,0,0.000561,0.0191,0,0,0,0.000906,0,0,0,0,0.000654,0,0,0,0,0,0,0,0.011,0,0,0,0,0.00198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000461,0,0,0,0,0,0,0,0,0,0.00133,0,0,0,0,0,0,0,0,0,0,0.000242,0,0,0,0.0192,0,0.000588,0,0,0,0,0,0,0,0,0,0,0,0.000654,0,0,0,0,0.000578,0,0,0,0,0,0,0.0102,0,0.000555,0,0,0,0,0,0,0,0,0.00047,0,0,0,0,0,0,0,0.0166,0,0,0.000549,0,0,0.000456,0,0.000644,0,0,0,0.0177,0.000911,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00237,0,0,0,0,0.0763,0,0.0143,0.0161,0.039,0,0,0.00064,0,0,0,0,0,0,0.0113,0,0,0,0,0.157,0,0,0,0.0129,0.013,0,0,0,0,0,0,0.000865,0,0,0,0,0.0178,0,0.000815,0,0,0,0,0,0,0,0,0,0,0.00126,0,0,0,0,0.263,0,0.00816,0.000681,0,0,0,0,0,0,0,0,0.00122,0.00962,0,0,0,0.000748,0,0,0.0136,0,0.000772,0.00278,0,0,0,0,0,0,0,0.00686,0,0.00153,0,0,0,0,0,0,0.000766,0.000626,0.000768,0.000593,0,0,0,0,0,0.000634,0.000718,0,0,0,0,0,0,0,0.000647,0,0.000584,0.000585,0.00058,0.000569,0.000574,0.000618,0,0.000635,0.000598,0.000565,0,0,0,0,0.000659,0.000624,0.000592,0,0.000609,0.000574,0.000578,0.000578,0.000588,0.00058,0.000586,0.000619,0.000608,0.000611,0,0.000648,0,0.00064,0,0.000644,0.000615,0.000587,0.000577,0.000588,0.000505],"winrateAvg":0.999872,"leadAvg":73.8662,"scoreMeanAvg":73.7469,"scoreStdevAvg":3.15621,"shorttermWinlossErrorAvg":0.00069745,"shorttermScoreErrorAvg":1.14772,"ownership":[100,100,96,70,-41,-100,-99,-99,-99,-99,-100,99,98,99,-98,-100,-100,-100,-100,100,99,100,100,100,-100,-98,-99,-100,-99,-100,99,98,99,-99,100,-100,-100,-100,100,100,100,-99,-20,-100,-98,-97,-99,-99,-100,99,98,95,81,100,100,-100,-100,100,100,-100,-100,-91,-100,-100,-100,-98,-99,-100,-100,100,100,100,100,-100,-100,-100,100,-99,-100,36,-91,100,-100,100,-100,-100,-100,100,99,99,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,-99,-100,100,100,100,100,99,100,100,100,100,99,100,99,99,100,100,100,100,84,100,100,99,99,99,99,99,99,99,99,99,99,99,99,99,100,99,99,100,100,99,99,99,99,99,99,100,100,100,100,99,99,99,99,100,100,99,99,99,99,99,99,100,100,100,100,99,99,100,99,100,99,99,100,100,100,99,100,100,99,99,99,98,100,100,99,100,100,99,99,99,100,100,100,100,89,100,99,99,100,68,100,99,99,99,100,99,99,99,99,100,100,100,100,-21,100,100,100,100,45,-99,100,99,99,100,100,99,99,100,-99,-99,39,100,-98,-98,-99,-18,100,0,-99,100,99,100,100,100,100,100,100,100,-77,-100,100,100,100,-61,-99,-30,-86,-100,100,100,100,100,-100,-100,100,40,-2,-100,-100,-100,66,100,-80,-64,-99,-98,-99,-100,-100,100,100,-100,-100,-100,-12,-100,-79,-100,100,100,100,100,-100,-99,-99,-99,-99,-100,-100,-100,-97,-100,-99,-99,-100,100,100,100,-100,-100,-100,-100,-100,-99,-99,-99,-99,-99,-99,-97,-98,-98,-98,-100,100,-100,-100,-99,-99,-99,-100,-99,-99,-99,-99,-99,-98,-98,-98,-98,-98,-100,-99,-100,-99,-99,-99,-99,-99,-99,-99],"ownershipAllowedMAE":0.0193431})%"); + lines.push_back(R"%({"sample":{"board":".................../..X................/..XO.X.......X...../...O............X../.X................./..XOO............../..XXO.X.X........../...O.O.OO........../..........OO.....X./...........X..OOOX./..O............XX../.............OX..../..O..........O.XOO./.XXOO.........OXOX./.XOXO..........OX../...XXOOOO......OX../...X.XXXO....OXOX../.........OX..XOX.X./..............O.X../","hintLoc":"null","initialTurnNumber":17,"metadata":"FF917430880F1F6EC47A3FD220127BB4:27","moveLocs":["P4","P5","O4","N3","Q1","N4","O1","M17","K17","Q17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.88,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":6.0,"policyOptimism":0.0,"pda":0.613,"policyMixture":[1.91e-06,2.19e-06,2.35e-06,2.81e-06,2.65e-06,2.69e-06,2.31e-06,2.33e-06,2.4e-06,2.66e-06,2.75e-06,2.69e-06,2.94e-06,3.39e-06,3.12e-06,3.05e-06,3.31e-06,3.01e-06,1.98e-06,2.17e-06,2.27e-06,0,4.73e-06,4.99e-06,3.02e-06,3.57e-06,3.82e-06,4.07e-06,4.2e-06,5.08e-06,1.66e-05,8.75e-06,2.42e-05,3.58e-05,1.77e-05,6.82e-06,6.34e-06,2.66e-06,2.12e-06,2.49e-06,0,0,2.78e-06,0,3.73e-06,5.53e-06,4.23e-06,0,7.13e-06,0,4.37e-05,0,7.05e-06,0,0.311,7.83e-06,2.69e-06,2.16e-06,2.6e-06,3.1e-06,0,3.35e-06,3.89e-06,7.82e-06,9.27e-06,1.04e-05,5e-06,1.19e-05,4.62e-05,0.000124,3.53e-05,0.00278,0.327,0,5.73e-06,2.77e-06,2.04e-06,0,3.17e-06,8.83e-06,2.69e-05,4.82e-06,1.54e-05,4.64e-06,1.3e-05,2.11e-05,2.32e-05,3.46e-05,4.12e-05,0.000188,0.00599,0.000181,2.18e-05,1.2e-05,2.65e-06,2.13e-06,2.46e-06,0,0,0,3.5e-06,4.08e-06,4.12e-06,4.13e-06,9.23e-06,1.98e-05,3.05e-05,3.43e-05,3.74e-05,5.58e-05,5.55e-05,4.19e-05,5.01e-06,2.55e-06,2.42e-06,2.69e-06,0,0,0,4.6e-06,0,1.91e-05,0,5.22e-06,2.18e-05,2.25e-05,6.65e-05,3.23e-05,3.02e-05,1.71e-05,1.06e-05,4.45e-06,2.47e-06,2.49e-06,4.55e-06,0.0158,0,6.64e-06,0,0.000247,0,0,0.0157,5.3e-06,9.27e-06,0.000113,0.0109,3.56e-05,6.93e-05,5.26e-06,3.31e-06,2.37e-06,2.56e-06,0.000103,0.0719,4.23e-05,0.000429,1.13e-05,9.3e-06,5.99e-06,5.14e-06,1.19e-05,0,0,0.023,0.000168,1.76e-05,4.39e-06,5.37e-06,0,2.13e-06,2.59e-06,2.18e-05,0.00222,7.91e-06,3.37e-06,3.31e-06,7.84e-06,3.98e-06,3.85e-06,3.84e-06,4.88e-06,0,3.35e-05,0.00168,0,0,0,0,2.07e-06,2.59e-06,2.22e-05,0,2.93e-05,3.57e-06,3.43e-06,3.25e-06,3.33e-06,3.37e-06,3.62e-06,3.41e-06,3.37e-06,8.58e-05,0.00694,0.00129,0,0,2.86e-05,9.31e-06,2.66e-06,9.79e-06,0.000101,9.56e-05,4.09e-06,3.4e-06,3.27e-06,3.2e-06,3.2e-06,3.36e-06,3.62e-06,4.51e-06,4.11e-06,0,0,0.00039,2.82e-06,0.000245,2.68e-06,2.38e-06,0.000341,0,0.000926,5.66e-06,4.02e-06,3.41e-06,3.19e-06,3.3e-06,3.45e-06,3.76e-06,4.7e-06,3.62e-06,0,2.43e-05,0,0,0,2.91e-06,2.13e-06,0,0,0,0,3.54e-06,3.6e-06,3.19e-06,3.32e-06,3.54e-06,4.42e-06,5.1e-06,6.72e-06,2.51e-06,0,0,0,0,2.5e-06,1.95e-06,0,0,0,0,3.75e-06,2.55e-06,2.49e-06,3.02e-06,3.8e-06,6.54e-06,6.83e-05,0.000191,0.0294,0,0,0,2.47e-06,2.59e-06,2.05e-06,2.36e-06,2.32e-06,0,0,0,0,0,0,4.22e-06,0.00913,0.000172,0,0,0,0,0,2.5e-06,2.26e-06,2.06e-06,2.47e-06,2.1e-06,0,2.22e-06,0,0,0,0,9.09e-06,0.159,4.58e-05,0,0,0,0,0,2.21e-06,2.17e-06,2.09e-06,2.31e-06,2.32e-06,2.42e-06,2.2e-06,2.26e-06,2.57e-06,3.05e-06,4.4e-06,0,0,4.51e-06,4.89e-06,0,4.19e-06,0,2.2e-06,0,2.11e-06,1.89e-06,2.14e-06,2.05e-06,2.19e-06,2.06e-06,2.2e-06,2.25e-06,2.66e-06,2.53e-06,3.27e-06,2.64e-06,2.91e-06,2.4e-06,0,2.28e-06,0,0,2.12e-06,2.3e-06,3e-06],"winrateAvg":0.233959,"leadAvg":-2.12316,"scoreMeanAvg":-3.28949,"scoreStdevAvg":10.9308,"shorttermWinlossErrorAvg":0.141191,"shorttermScoreErrorAvg":1.13935,"ownership":[-64,-54,-41,-24,-13,-23,-24,-26,-28,-27,-17,-10,-7,-5,5,8,-1,-8,-15,-79,-58,-91,32,-24,-30,-28,-23,-32,-34,-19,-2,-21,2,11,12,0,-19,-23,-84,-90,-91,89,21,-63,-20,-8,-26,-68,-14,36,-19,-69,25,40,-37,-34,-31,-87,-87,23,88,30,-5,-3,-13,-20,-18,-7,-1,-13,-26,-16,-40,-79,-50,-41,-84,-94,-10,53,49,4,-8,-2,-11,-12,0,11,-3,-9,-13,-29,-39,-51,-43,-74,-86,-91,97,97,28,6,-2,-4,1,2,5,2,-1,-4,-15,-26,-40,-42,-61,-66,-92,-91,97,39,-27,28,-35,9,10,11,3,1,3,-3,-19,-41,-43,-37,-50,21,92,89,96,7,94,94,18,41,33,21,0,10,-8,-5,-45,-53,-9,-17,-18,78,81,81,83,81,80,80,95,95,29,30,25,16,-25,-92,-66,12,4,-2,76,80,82,82,81,79,78,74,57,64,48,85,83,82,-92,-79,26,32,90,78,82,82,82,81,79,76,73,68,68,67,64,-86,-87,-84,-82,13,40,65,80,82,83,82,81,79,77,73,70,72,94,-76,-67,-74,-82,-80,-16,-27,84,81,85,84,83,81,79,76,73,69,64,95,67,-68,-63,-67,-75,-56,-96,-97,97,97,87,82,80,77,74,72,64,53,53,91,-67,-64,-82,-78,-86,-97,-95,-99,97,93,87,81,74,67,65,56,58,-2,90,90,-99,-81,-85,-93,-94,-97,-99,-99,98,98,98,98,28,56,36,83,-57,-57,89,-99,-91,-94,-93,-94,-95,-99,-95,-95,-94,-94,98,9,-59,15,83,82,-68,89,-99,-98,-97,-93,-93,-93,-91,-81,-76,-70,18,47,75,-71,-3,13,-98,-70,-100,-99,-100,-98,-93,-92,-90,-85,-73,-60,-15,5,44,22,-29,-65,-82,-99,-97,-100,-100,-99,-99],"ownershipAllowedMAE":0.0365185})%"); + lines.push_back(R"%({"sample":{"board":".................../......O.O....XO.XO./.X.XXO....X....OXO./..XOOOOXXX.....OXO./.XO..X.XOX.....OOX./.XO.X..XOOXX....X.X/..O..X..O.O...O..X./......O..O.X......./..OOX....OXOO..X.../..XO..XO.OOXXX...../.OXXXXO.X.XO......./..OOOO.O...O......./..OX....O........../..OX.XXXO.....X.X../.XXOOOOX.X.O.....X./..XXXXO.X..XXX.OXO./..XOOOOOOX.OXOXXOO./..XO...XOX..OOOOXX./.................../","hintLoc":"null","initialTurnNumber":146,"metadata":"4E40745208D065DA232F5F0064647E72:156","moveLocs":["P4","T2","B10","B11","A10","E15","H11","J10","E18","E10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.99,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.08e-06,9.2e-06,9.12e-06,9.02e-06,9.33e-06,9.49e-06,9.61e-06,1.01e-05,9.06e-06,9.69e-06,9.72e-06,9.95e-06,9.88e-06,1e-05,0.000449,5.18e-05,4.71e-05,1.01e-05,8.78e-06,8.89e-06,9.32e-06,8.73e-06,9.37e-06,0,1.23e-05,0,9.41e-06,0,1.21e-05,9.65e-06,1.02e-05,1.04e-05,0,0,0.000565,0,0,1.02e-05,9.07e-06,0,8.63e-06,0,0,0,8.54e-06,1.58e-05,9.78e-06,8.56e-06,0,1.02e-05,1.5e-05,1.44e-05,0.000957,0,0,0,9.08e-06,9.39e-06,9.18e-06,0,0,0,0,0,0,0,0,9.48e-06,1.04e-05,1.08e-05,1.19e-05,9.88e-06,0,0,0,9.79e-06,8.89e-06,0,0,6.8e-05,0,0,9.25e-06,0,0,0,9.16e-06,9.73e-06,1.07e-05,1.18e-05,1.05e-05,0,0,0,9.45e-06,9.46e-06,0,0,0.0135,0,9.37e-06,8.05e-06,0,0,0,0,0,1.04e-05,1.07e-05,1.04e-05,1.63e-05,0,8.49e-06,0,9.85e-06,1.32e-05,0,9.47e-06,8.44e-06,0,9.04e-06,1.06e-05,0,0,0,1.11e-05,1.05e-05,1.02e-05,0,1.09e-05,9.27e-06,0,8.74e-06,9.5e-06,1.87e-05,1.06e-05,1.27e-05,1.11e-05,1.31e-05,0,1.41e-05,9.55e-06,0,1.03e-05,0,1.31e-05,1.11e-05,1.01e-05,1.05e-05,1.02e-05,9.91e-06,9.21e-06,7.75e-05,0,0,0,0,0.000156,2.56e-05,0,8.33e-06,0,0,0,0,1.88e-05,1e-05,0,1.03e-05,9.72e-06,9.19e-06,0,0,0,0,0,0.815,0,0,0,0,0,0,0,0,1.01e-05,1.02e-05,9.82e-06,9.53e-06,8.87e-06,1.87e-05,0,0,0,0,0,0,0.0109,0,1.06e-05,0,0,1.02e-05,9.92e-06,1.03e-05,9.87e-06,9.5e-06,9.45e-06,9.02e-06,2.25e-05,4.95e-05,0,0,0,0,0.00492,0,1.02e-05,1.11e-05,0.000249,0,1.93e-05,1.11e-05,1.03e-05,9.98e-06,9.54e-06,9.46e-06,9.01e-06,1.35e-05,1.24e-05,0,0,0.000184,0.0075,4.79e-05,2.67e-05,0,1.58e-05,0.000963,0.000246,1.04e-05,1.03e-05,1e-05,9.51e-06,9.8e-06,9.98e-06,9.58e-06,1.34e-05,1.48e-05,0,0,0.00141,0,0,0,0,2.46e-05,0.000194,9.65e-06,1.03e-05,9.65e-06,0,9.84e-06,0,1.25e-05,1.19e-05,1.02e-05,0,0,0,0,0,0,0,9.09e-06,0,1.05e-05,0,1.03e-05,8.83e-06,9.62e-06,0.0782,0.00553,0,0.000424,1e-05,7.78e-06,0,0,0,0,0,1.07e-05,0,1.01e-05,1.05e-05,0,0,0,0,0,0,0,0.0122,9.2e-06,9.52e-06,0,0,0,0,0,0,0,0,1.1e-05,0,0,0,0,0,0,0,0.00243,1.03e-05,9.86e-06,0,0,9.97e-06,1.14e-05,1.22e-05,0,0,0,9.68e-06,2.59e-05,0,0,0,0,0,0,0,9.83e-06,9.42e-06,1.01e-05,1.16e-05,1.18e-05,1.09e-05,1.06e-05,1.3e-05,0.00677,1.12e-05,9.92e-06,9.94e-06,9.96e-06,9.57e-06,9.6e-06,2.97e-05,1.4e-05,0.035,5.67e-05,9.48e-06],"winrateAvg":0.582937,"leadAvg":0.5569,"scoreMeanAvg":1.02681,"scoreStdevAvg":10.5498,"shorttermWinlossErrorAvg":0.366022,"shorttermScoreErrorAvg":2.70257,"ownership":[-95,-94,-91,-88,-42,9,57,77,52,13,-24,-28,-22,21,46,89,94,91,78,-96,-94,-91,-92,-97,-9,93,65,86,-18,-33,-30,-15,-41,96,94,92,94,59,-96,-97,-96,-97,-97,94,81,43,-2,-40,-90,-48,-26,-5,26,98,93,94,59,-94,-95,-96,94,94,94,93,-93,-93,-93,-69,-34,-15,4,37,98,93,94,26,-90,-96,95,90,94,-49,31,-93,93,-93,-77,-34,7,5,39,98,98,-76,-14,-69,-96,94,-12,-71,-45,-48,-93,94,93,-86,-86,-19,1,38,31,-80,-73,-85,-59,46,94,25,-26,-79,5,-12,93,82,86,3,-6,5,78,14,-46,-90,-83,-52,45,74,52,15,20,78,37,54,99,49,-49,-9,-16,5,-16,-56,-83,-85,-64,91,92,92,3,56,-60,-58,39,99,31,49,39,-26,-35,-95,-85,-86,-85,-86,-86,-87,93,92,-87,-86,98,98,99,99,-90,-91,-91,-65,-77,-84,-85,-84,-36,45,-87,-87,-87,-88,95,90,83,92,81,86,5,-20,-55,-73,-81,-83,-83,28,42,98,98,98,97,85,98,88,79,82,86,25,21,-54,-68,-79,-82,-82,42,69,98,3,46,-44,-5,-7,94,49,39,10,10,-3,-32,-64,-78,-84,-82,10,23,98,8,32,-86,-85,-85,94,12,9,2,-15,-27,-98,-85,-98,-86,-81,-42,-88,-88,95,95,96,96,-85,10,-87,20,35,-27,-46,-87,-97,-86,-95,-62,-75,-78,-89,-90,-91,-92,95,-30,-92,-88,-68,-99,-99,-99,-99,-90,-87,83,-47,-70,-71,-88,95,95,95,95,95,96,-95,-58,-5,-99,92,-99,-99,85,85,73,-70,-68,-89,95,89,89,81,9,96,-94,-22,-7,92,92,92,91,86,86,85,-72,-80,-25,36,83,83,71,13,-6,-23,-22,32,52,79,88,91,90,86,85],"ownershipAllowedMAE":0.0468379})%"); + lines.push_back(R"%({"sample":{"board":".OXO........O....O./XX.XO......OXXXOOOX/OOXXO.....O.O.XOXX./..X.........OXOXOXX/..XO...XO.O.OOOXOX./.XOO..OOXXOXXXOX.../..XO....OXXOOXXX.X./..XO....OOXXOOOOOX./.X....OOXOOXXXX.O../.......XX.X..X.XX../..........XX..XO.../...O....XXXOXXO.OO./..O.O..X.XOO.XXO..O/.OXOO.X.XOXO...O.O./.OXXO...OO.O.X.XOX./..XOXOOO.XO..O..OO./.XXOXXOXX.OXXO.XXO./.XOO.XX...XXOOX..X./.X................./","hintLoc":"null","initialTurnNumber":199,"metadata":"F5E1AAA842047F8ED86274BF8BF8D1C7:209","moveLocs":["R13","R14","C18","F19","A19","E19","B15","B16","A15","B13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.33,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":7.0,"policyOptimism":0.0,"pda":-1.465,"policyMixture":[0,0,0.235,0,0,0,0.00347,6.17e-05,5.65e-05,5.3e-05,5.09e-05,5.13e-05,0,5.26e-05,5.54e-05,5.3e-05,3.74e-05,0,3.5e-05,9.75e-05,0.00153,0,0,0,0.08,0.00402,7.89e-05,6.36e-05,5.78e-05,5.13e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,7.95e-05,9.27e-05,7.41e-05,6.15e-05,5.81e-05,0,4.92e-05,0,5.57e-05,0,0,0,0,0,0.0708,0,0,0.166,0.000247,7.03e-05,6.6e-05,6.41e-05,7.02e-05,6.19e-05,5.52e-05,5.2e-05,0,0,0,0,5.11e-05,0,0,0,0,0,0,5.91e-05,5.95e-05,6.21e-05,0,0,8.56e-05,0,5.6e-05,0,0,0,0,5.26e-05,0,4.85e-05,7.33e-05,0,0,0,5.22e-05,5.56e-05,0,0,0,0,0,0,0,0,0,0,0,5.88e-05,5.86e-05,5.63e-05,0,0,0,5.18e-05,5.35e-05,5.31e-05,5.18e-05,0,0,0,0,0,0,0,0,0,0,6.16e-05,7.4e-05,5.49e-05,0,0,5.58e-05,5.51e-05,5.24e-05,5.24e-05,0,0,0,0,0,0,0,0,0,0,6.39e-05,5.59e-05,0,7.26e-05,6.88e-05,6.13e-05,6.05e-05,0,0,0,0,0,0,0,0,0,5.36e-05,0,0.00291,0.000314,5.83e-05,0.000146,0.000357,6.73e-05,6.51e-05,6.63e-05,6.41e-05,0,0,5.36e-05,0,4.84e-05,4.84e-05,0,0,0,0,0.00747,0.00119,6.08e-05,0.000223,8.32e-05,6.49e-05,6.19e-05,6.92e-05,6.1e-05,5.46e-05,5.17e-05,4.92e-05,0,0,4.95e-05,6.06e-05,0,0,6.39e-05,0.000543,0.00136,6.13e-05,0.000108,6.07e-05,0,5.51e-05,6.18e-05,6.2e-05,5.19e-05,0,0,0,0,0,0,0,5.59e-05,0,0,0.000242,5.71e-05,6.13e-05,0,4.84e-05,0,5.61e-05,6.15e-05,0,0,0,0,0,5.32e-05,0,0,0,5.03e-05,5.02e-05,0,5e-05,0,0,0,0,7.15e-05,0,5.83e-05,0,0,0,0,5.83e-05,0.00025,0.00324,0,5.1e-05,0,4.94e-05,5.41e-05,0,0,0,0,8.03e-05,7.7e-05,6.25e-05,0,0,5.44e-05,0,0.000117,0,0.00959,0,0,0,5.02e-05,5.74e-05,6.11e-05,0,0,0,0,0,0,0.00426,0,0,6.6e-05,0.0129,0,0.000338,0.01,0,0,5.08e-05,6.27e-05,0,0,0,0,0,0,0,0,0.0559,0,0,0,0,0.0142,0,0,0,6.17e-05,5.74e-05,0,0,0,0.000195,0,0,0.00536,0.00216,0.291,0,0,0,0,0,0.000192,0.00022,0,0.00387,4.99e-05,0,5.34e-05,4.98e-05,7.15e-05,0.000175,0.000139,0.000318,0.00101,0.000105,6.58e-05,7.46e-05,6.47e-05,9.5e-05,0.000423,0.000228,0.000248,0.000142,5.46e-05,4.66e-05],"winrateAvg":0.160348,"leadAvg":-4.92517,"scoreMeanAvg":-4.35304,"scoreStdevAvg":7.42005,"shorttermWinlossErrorAvg":0.320903,"shorttermScoreErrorAvg":3.45348,"ownership":[-20,-21,-19,-20,-21,-11,10,29,47,64,79,95,97,94,91,88,87,88,-25,-34,-34,-28,-65,80,46,38,41,53,66,82,99,88,88,88,89,89,89,-99,-22,-25,-69,-65,81,50,46,50,55,55,99,94,99,97,89,89,-100,-100,-98,-66,-70,-70,43,41,56,56,61,65,-19,18,5,99,96,99,-100,-99,-100,-100,-61,-63,-70,99,64,66,67,52,76,-57,65,-44,99,99,99,-100,-100,-100,-100,-78,-90,99,99,76,75,98,99,-100,-100,65,-100,-100,-100,99,-100,-100,-100,-99,-83,-91,-90,99,75,77,86,93,95,-100,-100,-81,-78,-100,-100,-100,-81,-100,-97,-83,-88,-90,99,59,68,82,92,95,95,-100,-100,-77,-78,-79,-81,-81,-100,-88,-72,-88,-31,14,30,40,96,97,-99,95,95,-100,-100,-100,-100,-94,-82,-84,-53,-47,-38,16,15,12,6,2,-99,-99,-14,-100,-100,-99,-100,-98,-100,-99,-29,12,-15,-4,-10,33,3,-4,-19,-49,-76,-68,-100,-100,-99,-99,-99,78,12,18,47,27,-8,59,96,40,-9,-16,-62,-100,-100,-100,81,-100,-100,22,22,100,100,84,55,84,95,94,96,19,-40,-99,-87,-100,81,81,-37,-100,-100,100,99,99,100,70,86,-99,97,96,11,-96,-56,-89,78,77,81,9,-41,11,100,99,100,99,37,86,-99,-99,96,25,4,27,79,78,75,81,-5,-81,-12,-32,100,98,99,-19,2,-99,-96,-99,81,78,78,27,-10,77,18,-2,67,17,46,100,100,85,-61,-99,-99,-96,-99,-98,80,-69,-67,19,74,-39,-46,67,33,-39,-40,100,40,-88,-99,-96,-97,-97,-98,-98,-63,-31,1,-34,-36,67,67,-34,-30,-23,-22,10,-94,-99,-98,-98,-96,-92,-81,-61,-34,-18,-11,18,36,34,2,-26,-18,-13,-8],"ownershipAllowedMAE":0.083989})%"); + lines.push_back(R"%({"sample":{"board":"..........X.XXO..../..O.X..OXOXX.XOOOO./..OX.XXO.OOOXXO.XO./.O.O.OX.O...OOXXXX./.XO..OX....OXOO..../.XXOOXOX.O..XXOX.../.OOXOX..X..O.XX..../.XXXO.....X.O..X.../....O............../...O.............../.................../.................../.................../..X................/.....O...........X./...X.........OOO.../.....O.X.O...OXXX../...X.............../.................../","hintLoc":"null","initialTurnNumber":94,"metadata":"41111B81AD7C3BB8E176E0EDDBC0BA49:104","moveLocs":["M14","L13","K12","N11","C9","G13","J15","K15","H13","G12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.0,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.33e-06,3.49e-06,4e-06,4.2e-06,3.89e-06,4.25e-06,4.52e-06,4.81e-06,4.48e-06,1.36e-05,0,2.44e-06,0,0,0,3.29e-06,8.94e-06,7.4e-06,3.42e-06,3.4e-06,3.36e-06,0,3.84e-06,0,3.3e-06,7.39e-06,0,0,0,0,0,2.37e-06,0,0,0,0,0,5.76e-06,3.78e-06,3.9e-06,0,0,3.5e-06,0,0,0,3e-06,0,0,0,0,0,0,3.29e-06,0,0,1.98e-05,4.5e-06,0,0,0,0.00103,0,0,3.83e-06,0,4.19e-06,9.35e-06,2.51e-05,0,0,0,0,0,0,3.74e-06,3.45e-06,0,0,0.000225,5.36e-05,0,0,3.39e-06,0,0,0.000136,0,0,0,0,1.11e-05,3.32e-06,3.52e-06,3.69e-06,3.54e-06,0,0,0,0,0,0,0,3.44e-06,0,0.000383,0,0,0,0,0,3.62e-06,3.76e-06,3.76e-06,3.54e-06,0,0,0,0,0,0,0,0,6.74e-06,0,0,1.42e-05,0,0,3.33e-06,3.84e-06,3.93e-06,3.67e-06,3.32e-06,0,0,0,0,4.64e-06,0,0.0118,3.58e-06,0,0,0.000907,0,4.26e-06,3.44e-06,0,4.45e-06,4.74e-06,3.68e-06,3.7e-06,3.42e-06,3.57e-06,3.66e-06,0,6e-06,0.0381,3.55e-05,4.06e-05,5.47e-06,5.14e-06,2.3e-05,0,5.45e-06,7.48e-06,5.34e-06,7.59e-06,5.11e-06,3.78e-06,3.81e-06,4.16e-06,4.42e-06,0,4.23e-06,5.69e-06,5.98e-06,5.33e-05,0.00019,0.015,0.258,0.024,2.32e-05,2.87e-05,2.13e-05,8.29e-05,4.69e-05,5.03e-06,3.62e-06,3.85e-06,4.45e-06,0,6.07e-06,5.2e-06,7.03e-06,3.51e-05,0.000106,0.00175,0.0721,0.558,4.41e-05,1.72e-05,2.35e-05,4.31e-05,4.85e-05,1.39e-05,5e-06,3.62e-06,3.34e-06,4.3e-06,4.6e-06,4.86e-06,8.37e-06,1.38e-05,3.96e-05,9.42e-05,0.000313,0.0148,0.000401,3.01e-05,1.43e-05,1.58e-05,1.98e-05,1.5e-05,6.52e-06,4.88e-06,3.64e-06,3.19e-06,3.56e-06,3.87e-06,4.55e-06,5.79e-06,1.16e-05,2.8e-05,6.09e-05,8.58e-05,6.62e-05,2.8e-05,1.31e-05,9.42e-06,9.14e-06,9.52e-06,6.97e-06,6.18e-06,4.9e-06,3.53e-06,3.34e-06,3.71e-06,0,4.35e-06,5.5e-06,6.06e-06,2.67e-05,3.67e-05,3.58e-05,2.36e-05,1.2e-05,7.96e-06,6.22e-06,6.03e-06,6.36e-06,1.31e-05,6.17e-06,4.37e-06,3.46e-06,3.21e-06,3.67e-06,3.78e-06,4.05e-06,4.62e-06,0,6.04e-06,3.62e-05,1.72e-05,1.04e-05,8.94e-06,6.11e-06,5.49e-06,4.26e-06,3.64e-06,4.24e-06,4.39e-06,0,3.29e-06,3.24e-06,3.69e-06,3.63e-06,0,4.87e-06,4.55e-06,1.17e-05,5.49e-06,1.71e-05,3.61e-05,1.76e-05,6.47e-06,4.37e-06,0,0,0,4.35e-06,3.81e-06,3.29e-06,3.24e-06,3.53e-06,3.94e-06,4.05e-06,4.67e-06,0,4.87e-06,0,6.28e-06,0,2.01e-05,7.43e-06,4.31e-06,0,0,0,0,3.57e-06,3.51e-06,3.29e-06,3.64e-06,3.5e-06,0,4.54e-06,6.02e-06,4.85e-06,5e-06,4.69e-06,7.07e-06,4.9e-06,5.9e-06,5.11e-06,6.23e-06,4.52e-06,3.67e-06,3.15e-06,3.44e-06,3.32e-06,3.07e-06,3.33e-06,3.23e-06,3.41e-06,3.93e-06,3.72e-06,3.91e-06,3.88e-06,3.69e-06,3.58e-06,3.65e-06,3.64e-06,3.79e-06,3.76e-06,3.95e-06,3.86e-06,3.45e-06,3.41e-06,3.13e-06,3.89e-06],"winrateAvg":0.428075,"leadAvg":-0.530537,"scoreMeanAvg":-0.954537,"scoreStdevAvg":14.6183,"shorttermWinlossErrorAvg":0.136059,"shorttermScoreErrorAvg":1.10356,"ownership":[92,90,67,21,-38,-25,21,44,3,-36,-99,-100,-100,-100,95,95,95,95,95,95,93,98,19,-85,-51,-7,91,6,93,-100,-100,-100,-100,95,94,94,94,95,95,96,99,-59,-39,-87,-88,91,71,93,94,93,-99,-99,95,16,-92,95,55,70,98,97,98,24,95,-88,40,93,91,58,80,81,81,-93,-93,-93,-92,16,51,-75,98,96,92,96,-88,-85,-86,94,15,83,-95,81,80,-1,-72,-78,-73,-63,-76,-75,99,99,90,92,-91,-9,94,-17,-93,-94,-94,81,-92,-82,-79,-74,-76,-76,-76,-82,99,92,93,-90,-90,32,93,92,25,-95,-95,-91,-81,-78,-72,-77,-83,-83,-83,99,92,94,11,-65,-90,-89,4,92,8,-34,-95,-80,-69,-59,-68,-33,5,38,99,41,-15,-28,-32,-50,-35,22,92,30,14,-22,-49,-44,-34,-61,-68,43,93,50,16,5,-11,-29,-46,-35,-2,39,22,14,31,0,-4,-8,-54,-55,-74,19,19,8,0,-10,-24,-37,-62,2,42,28,22,28,21,9,6,-46,-48,-17,7,6,4,0,-7,-19,-26,-28,-5,13,20,19,19,15,10,6,-45,-44,-12,1,5,5,1,-1,-5,-12,-14,-4,7,12,15,16,7,-2,-4,-51,-58,-84,-16,-6,10,4,8,12,9,2,3,9,14,15,10,9,-21,-24,-58,-66,-62,-8,4,65,18,12,16,18,10,11,15,31,35,21,-23,-79,-44,-64,-68,-69,-85,0,25,13,16,23,15,19,23,37,90,90,90,26,-68,-67,-67,-71,-71,-52,-7,57,14,-25,24,73,34,33,52,91,-83,-83,-84,-78,-72,-69,-70,-66,-81,-7,2,15,8,27,43,45,40,57,30,2,-65,-71,-70,-73,-69,-67,-65,-45,-26,-1,4,13,24,36,42,44,40,26,-12,-36,-60,-66,-69],"ownershipAllowedMAE":0.0332646})%"); + lines.push_back(R"%({"sample":{"board":".................../....O......XXX...X./..XXO.....OOOOXXXOX/..XOX.........OOOO./...O.O...........O./.X...............X./.............OO.X../....OOX.......X..../...OXOOX.........X./....XXXO...OX..XX../..X.......O.OXOOX../.X..O.....OO.O...O./OOXX..X..XOXO.O.O../.O.......XOXX..OXO./.OXXOO.X.XXO.XXXXX./.OOOXOX.X..OXXO..../.OXOXOOXOX.OO.OXX../OOXXXO.XOOXO.O.OX../.X...XX..X..O.O..../","hintLoc":"null","initialTurnNumber":148,"metadata":"113519AB19332824713AEB7924001AE1:158","moveLocs":["D12","D13","C12","G9","H9","J10","E14","F14","D14","H12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.59,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":-1.007,"policyMixture":[3.22e-05,3.76e-05,3.87e-05,4.15e-05,4.19e-05,3.98e-05,4.02e-05,3.94e-05,4.42e-05,4.59e-05,4.98e-05,4.02e-05,3.34e-05,3.36e-05,3.73e-05,3.98e-05,3.81e-05,3.89e-05,3.28e-05,3.5e-05,3.72e-05,4.01e-05,5.17e-05,0,5.34e-05,7.14e-05,6.48e-05,6.66e-05,0.000667,0.0265,0,0,0,3.76e-05,4.39e-05,4.01e-05,0,4.31e-05,3.41e-05,3.62e-05,0,0,0,0.000106,0.00018,9.16e-05,0.000134,5.43e-05,0,0,0,0,0,0,0,0,0,3.5e-05,3.65e-05,0,0,0,0.0148,6.04e-05,5.04e-05,4.97e-05,4.46e-05,4.03e-05,3.72e-05,3.9e-05,5.03e-05,0,0,0,0,3.78e-05,3.42e-05,4.02e-05,5.56e-05,0,0.352,0,4.33e-05,4.45e-05,4.44e-05,4.37e-05,4.26e-05,4.45e-05,4.69e-05,9.49e-05,4.77e-05,4.03e-05,4.29e-05,0,4.18e-05,3.45e-05,0,0.00026,0,0,0,4.31e-05,4.33e-05,4.25e-05,4.16e-05,4.19e-05,4.28e-05,4.52e-05,4.68e-05,6.26e-05,0.00167,4.66e-05,0,5.69e-05,3.53e-05,4.27e-05,0.000185,0,0.000477,0.00766,0.000117,4.93e-05,4.13e-05,4.19e-05,4.16e-05,4.2e-05,4.73e-05,0,0,0.00335,0,3.51e-05,5.11e-05,3.78e-05,4.35e-05,0,0,0,0,0,0,4.78e-05,4.14e-05,4.3e-05,4.49e-05,0.000445,0.0553,0,0.0343,0.000218,4.95e-05,3.94e-05,3.81e-05,4.8e-05,6.21e-05,0,0,0,0,0,0.0088,4.44e-05,4.25e-05,5.09e-05,7.88e-05,0.00887,0.0591,5.29e-05,2.99e-05,0,3.76e-05,3.88e-05,4.67e-05,5.6e-05,0.0104,0,0,0,0,0,5.22e-05,4.07e-05,0,0,0.0003,0.00527,0,0,3.05e-05,4.5e-05,3.94e-05,4.17e-05,0,0.000264,5.07e-05,0.0599,0,0,0.0132,4.82e-05,0,0,0,0,0,0,0,0.0129,4.09e-05,4.09e-05,0,4.1e-05,3.95e-05,0,0.000338,0.000646,0.000149,5.15e-05,4.65e-05,0,0,0,0,4.55e-05,0.08,0.000864,0,3.99e-05,0,0,0,0,5.52e-05,4.85e-05,0,4.1e-05,3.78e-05,0,0,0,0,5.18e-05,0,9.22e-05,0,6.18e-05,9.41e-05,3.1e-05,0,3.75e-05,3.98e-05,4.22e-05,4.7e-05,3.89e-05,3.64e-05,3.44e-05,0,0,0,0,3.8e-05,0.000544,0,0,0,0.115,0.000775,0,0,0,0,0,3.75e-05,0,3.43e-05,0,0,0,3.54e-05,0,0,0,0,0,4.36e-05,0.000779,0,0,0,0,0,0,3.38e-05,0,3.46e-05,3.47e-05,0,0,0,0,7.1e-05,3.45e-05,4.3e-05,4.88e-05,3.07e-05,0,0,0,0,0,0,0,0,0,3.58e-05,0,0,0.000285,0,0,0,0.0117,8.94e-05,0,0,0,0,0,0,3.51e-05,0,0,0,0,0,0,0,0,0,0,0.00197,0.0266,2.82e-05,0,3.11e-05,3.37e-05,3.57e-05,0,0,3.29e-05,3.65e-05,0,4.2e-05,3.8e-05,0,0,0,2.73e-05,0.0747,0.00176,3.68e-05,3.37e-05],"winrateAvg":0.92261,"leadAvg":5.44393,"scoreMeanAvg":6.59528,"scoreStdevAvg":10.8922,"shorttermWinlossErrorAvg":0.148118,"shorttermScoreErrorAvg":2.55948,"ownership":[-63,-51,-34,-3,25,51,47,39,20,-3,-40,-53,-71,-77,-77,-75,-72,-53,-44,-76,-68,-73,-25,71,55,50,42,31,20,5,-82,-81,-81,-77,-78,-70,-71,-3,-83,-85,-94,-94,69,58,53,54,53,52,97,97,97,98,-78,-78,-78,97,-6,-88,-91,-94,-8,-25,72,63,62,68,74,76,79,82,90,97,98,98,97,76,-88,-89,-38,-12,-16,93,72,69,71,73,75,75,77,76,67,59,53,97,42,-85,-95,-45,-67,-61,94,78,72,73,74,74,74,77,78,53,16,26,-42,6,-79,-73,-45,0,2,36,83,76,74,73,72,70,68,94,94,16,-52,-40,-38,-70,-73,-89,-89,88,89,77,92,76,72,68,62,52,26,-28,-7,-36,-49,-40,-56,-62,-63,-44,-78,88,89,75,80,69,68,57,38,16,4,-24,-40,-54,-33,-35,-44,-58,-48,-79,-78,-79,93,94,59,73,96,14,41,-3,-56,-54,-31,-4,-22,-49,-84,-43,-41,-54,-5,-20,19,37,100,95,99,41,94,92,-54,1,18,49,-78,-73,-47,-17,-42,-31,0,2,-3,100,100,94,99,87,17,5,89,44,94,94,-84,-83,-52,-56,-90,-37,-36,-99,100,-65,94,62,98,84,92,79,57,93,93,35,-63,-59,-62,-69,-64,-64,-99,99,-65,-64,2,-15,88,-62,79,-25,92,91,-70,-71,-46,-45,-72,-99,-90,-99,-99,69,-32,-65,-64,-62,-62,-62,-30,92,91,93,93,-94,-46,-94,-94,-100,-69,7,67,-65,-64,53,9,-51,-58,-56,93,92,-96,93,-95,-49,-46,-99,-92,-96,19,66,65,2,60,-63,-65,-60,-57,93,93,-97,-97,-96,-51,-78,-99,-92,-89,-90,65,66,63,57,53,-67,-52,-57,85,-7,-5,-84,-97,-99,-99,-97,-94,-93,-23,45,63,60,59,-1,-32,-53,-50],"ownershipAllowedMAE":0.0731496})%"); + lines.push_back(R"%({"sample":{"board":".X................./OX...X.OXO........./.OXXX.XXXXO.XX.X.../O.OOOOX.O.O.OO...../.O..O.X.O.....XXX../...OOX.XXOO..X..XXX/..OXXX.XOXX.XXXXOOX/.O.OOOXXOOXXXOXO.OO/..OXOOOXOOOOOOO.O../...XXOXOXXO.O....../.XX.OOX.OXXXXO...../.XOOOXX.XXOXO....../OOOOOX.X.O.OO....../OXOXOOXX.OO......../XXXX.OXXOXOO....O../XOOXXXXO.XXXOOOO.O./.XOOOOOOOOXXXOXXOO./.XXXXO.XOOOX.X.XXXO/...XO.OO.OXXX.X..O./","hintLoc":"null","initialTurnNumber":234,"metadata":"905696187BBB47FE5BDA691F9BB6CB09:244","moveLocs":["J7","L7","F1","F15","F17","E1","R1","F1","T1","C18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.22,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":0.762,"policyMixture":[1.42e-06,0,0.254,0.109,8.26e-05,7.82e-06,6.47e-06,6.51e-06,7.48e-06,1.21e-05,7.64e-06,7.9e-06,8.73e-06,1.02e-05,8.75e-06,9.02e-06,7.18e-06,7.18e-06,6.37e-06,0,0,0,0.588,1.53e-05,0,6.91e-06,0,0,0,1.2e-05,1.65e-05,2.31e-05,2.76e-05,4.52e-05,1.83e-05,9.88e-06,7.19e-06,6.87e-06,0,0,0,0,0,0,0,0,0,0,0,2.38e-05,0,0,6.03e-05,0,7.95e-06,7.54e-06,6.68e-06,0,0,0,0,0,0,0,7.55e-06,0,1.26e-05,0,7.11e-06,0,0,2.05e-05,7.99e-06,7e-06,6.99e-06,6.94e-06,1.5e-05,0,7.61e-06,7e-06,0,0,0,1.05e-05,0,8.05e-06,7.71e-06,1.11e-05,7.99e-06,7.31e-06,0,0,0,6.45e-06,7.09e-06,7.08e-06,7.09e-06,8.72e-06,0,0,0,2.35e-05,0,0,0,0,8.23e-06,7.05e-06,0,6.78e-06,6.35e-06,0,0,0,6.58e-06,8.7e-06,0,0,0,0,1.1e-05,0,0,0,0,6.61e-06,0,0,0,0,0,0,0,6.63e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.85e-06,1.25e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0174,0,0.000135,0.000104,7.2e-06,6.71e-06,1.17e-05,0,0,0,0,0,0,0,0,0.000152,0,8.7e-05,6.78e-05,0.0239,5.51e-05,5.41e-05,7.58e-06,6.5e-06,0,0,9.05e-06,0,0,0,1.52e-05,0,0,0,0,0,0,0.000211,8.37e-06,9.75e-06,1e-05,6.81e-06,7.82e-06,0,0,0,0,0,0,6.55e-06,0,0,0,0,0,0.000229,1.75e-05,9.58e-06,9.29e-06,8.76e-06,6.55e-06,0,0,0,0,0,0,5.99e-06,0,0,0,0,0,0,1.21e-05,8.3e-06,8.5e-06,8.91e-06,8.46e-06,6.68e-06,0,0,0,0,0,0,0,0,0.000522,0,0,7.16e-06,7.93e-06,8.63e-06,8.01e-06,7.63e-06,8.47e-06,1.76e-05,2.21e-05,0,0,0,0,0.000129,0,0,0,0,0,0,0,1e-05,7.48e-06,7.31e-06,7.72e-06,0,0.000193,0.000117,0,0,0,0,0,0,0,0,0.000506,0,0,0,0,0,0,0,0,0,0.000734,6.91e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00316,6.48e-06,0,0,0,0,0,0,0,0,0,0,0,6.26e-06,0,6.91e-06,0,0,0,0,6.31e-06,7.06e-06,6.06e-06,0,0,0,0,0,0,0,0,0,0,6.54e-06,0,6.7e-06,0,3.91e-05,0,1.56e-05],"winrateAvg":0.00203065,"leadAvg":-6.0233,"scoreMeanAvg":-5.88003,"scoreStdevAvg":2.26679,"shorttermWinlossErrorAvg":0.0143905,"shorttermScoreErrorAvg":0.70005,"ownership":[-19,-99,-98,-98,-99,-99,-99,-99,-99,-99,-99,-98,-99,-99,-99,-99,-99,-99,-99,98,-99,-98,-100,-99,-100,-99,-98,-100,-98,-99,-99,-99,-99,-99,-99,-99,-99,-99,98,100,-100,-100,-100,-100,-100,-100,-100,-100,-98,-99,-100,-100,-99,-100,-99,-99,-99,100,99,100,100,100,100,-100,-99,-98,-99,-98,-99,-98,-98,-99,-99,-99,-99,-99,99,100,100,100,100,100,-100,-98,-98,-99,-99,-99,-99,-99,-100,-100,-100,-99,-99,99,99,100,100,100,-100,-99,-100,-100,-98,-98,-99,-99,-100,-100,-100,-100,-100,-100,99,99,100,-100,-100,-100,-100,-100,100,-100,-100,-99,-100,-100,-100,-100,100,100,-100,99,100,100,100,100,100,-100,-100,100,100,-100,-100,-100,100,-100,100,99,100,100,99,99,100,98,100,100,100,-100,100,100,100,100,100,100,100,99,100,98,99,99,99,99,98,98,100,-100,-99,-100,-100,100,0,100,99,99,98,99,98,98,99,98,97,99,100,100,-100,-99,-99,-100,-100,-100,-100,100,98,98,98,98,99,99,97,100,100,100,-100,-100,-100,-100,-100,100,-100,100,99,99,98,98,98,99,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,99,99,99,99,99,99,100,-100,100,-100,100,100,-100,-100,-23,100,100,100,99,99,99,99,99,99,99,-100,-100,-100,-100,-20,100,-100,-100,95,-100,100,100,99,99,99,99,100,99,99,-100,100,100,-100,-100,-100,-100,100,49,-100,-100,-100,100,100,100,100,100,100,97,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,100,100,93,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,93,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-15,-15],"ownershipAllowedMAE":0.00873961})%"); + lines.push_back(R"%({"sample":{"board":"............./............./............./............./............./............./............./............./............./............./............./............./............./","hintLoc":"null","initialTurnNumber":0,"metadata":"46AE5FE07461451830CC18199E24625F:7","moveLocs":["K4","L10","C11","D4","J11","L7","F3"],"movePlas":["B","W","B","W","B","W","B"],"nextPla":"B","weight":0.1,"xSize":13,"ySize":13},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":7.0,"policyOptimism":0.0,"pda":1.002,"policyMixture":[2.74e-06,3.87e-06,3.69e-06,4.16e-06,3.92e-06,3.9e-06,4.01e-06,4.27e-06,4.27e-06,4.47e-06,4.13e-06,3.71e-06,2.65e-06,3.81e-06,9.18e-06,2.29e-05,2.5e-05,3.58e-05,1.98e-05,3.48e-05,2.71e-05,1.91e-05,5.93e-05,1.78e-05,7e-06,3.37e-06,3.73e-06,1.9e-05,0,0.000122,0.000237,0.000517,0.00158,5.59e-05,0,0.00533,1.76e-05,1.01e-05,3.12e-06,4.12e-06,3.78e-05,0.00291,0.08,0.000166,0.00084,0.000943,0.000728,0.000109,2.23e-05,0,7e-06,3.43e-06,4.28e-06,0.000216,0.0722,0.00943,0.000532,0.000465,0.000397,0.000155,9.53e-05,6.88e-05,1.08e-05,8.78e-06,3.34e-06,4.27e-06,4.82e-05,0.119,0.116,0.000783,0.00039,0.000333,0.000254,0.000124,2.2e-05,7.55e-06,6.96e-06,3.25e-06,4.29e-06,3.49e-05,0.123,0.0359,0.000675,0.000288,0.000319,0.000287,0.000119,1.27e-05,0,6.61e-06,3.42e-06,4.23e-06,3.5e-05,0.135,0.00312,0.000287,0.000359,0.000322,0.000397,0.000159,3.31e-05,1.27e-05,1.5e-05,3.63e-06,4.39e-06,3.55e-05,0.000341,2.21e-05,0.000147,0.000497,0.000329,0.00033,0.000147,2.65e-05,3.98e-05,2.61e-05,4.27e-06,4.19e-06,1.89e-05,2.47e-05,0,2.25e-05,0.0011,0.000599,0.0013,0.000425,0,0.000622,4.52e-05,4.38e-06,3.64e-06,1.22e-05,6.08e-05,4.2e-05,0.00693,0,0.000134,0.269,0.000327,0.001,0.000575,1.97e-05,3.94e-06,3.71e-06,8.2e-06,1.6e-05,0.000108,0.00062,2.51e-05,3.83e-05,0.000755,0.000199,4.31e-05,2.46e-05,1.01e-05,3.88e-06,2.71e-06,3.71e-06,4.2e-06,5.01e-06,4.92e-06,4.37e-06,4.44e-06,4.4e-06,4.42e-06,4.63e-06,4.22e-06,3.96e-06,2.65e-06,5.06e-06],"winrateAvg":0.827319,"leadAvg":2.07752,"scoreMeanAvg":3.22076,"scoreStdevAvg":8.88629,"shorttermWinlossErrorAvg":0.0695888,"shorttermScoreErrorAvg":0.520623,"ownership":[-48,-47,-43,-36,-28,-24,-22,-22,-18,-5,11,20,29,-45,-53,-48,-38,-28,-24,-21,-27,-26,-1,16,30,36,-39,-45,-73,-27,-17,-16,-11,-17,-60,26,25,45,42,-28,-29,-20,2,-11,-4,-4,-8,-14,2,77,53,48,-12,-12,-2,-3,5,2,0,-2,-6,-6,38,52,48,-1,-1,6,13,6,4,2,0,-1,-9,25,48,43,7,8,18,10,6,3,2,0,0,11,72,42,34,11,11,19,19,9,4,1,-1,-3,-4,2,23,20,11,13,23,25,7,-7,-3,-4,-7,-18,-18,0,6,8,9,23,72,12,1,-14,-25,-21,-69,-19,-4,-3,3,4,-1,18,14,-59,-20,7,-20,-23,-12,-9,-6,-1,-5,-4,-4,-5,-25,-20,-9,-13,-13,-12,-7,-8,-2,-5,-6,-6,-10,-16,-16,-14,-12,-12,-11,-11,-9],"ownershipAllowedMAE":0.0324947})%"); + lines.push_back(R"%({"sample":{"board":"..XO.OOOO....OOX.../OX.XOOXXOXXXXOXX.../.O.XOXX.XXOOXOOX.../OXXXOX.XX.O.OOX.X.X/.OOXOOXXOOOXO.X..X./.OXXXOOXXXXOOX.XXOX/OXXXXOOOOOOXO.XOXO./.OXOXOOXXXXX.OOOO.O/OOOOOOXO.X.XOOXXOOO/.XXOOXX.XXOXOXXOOOO/O...OOXXOO.OXXOXOXO/XOO.OXXXOOXOX.OXXXO/XXO.OXOXXOOOXXOXOXO/.X.OXXOOX...XOXOOXX/.XOOXOOXXOO.X.XXOX./..XOXXOOXOXXXXX.O.O/..XOOOOXXOXOOXOOOOX/.X.XO.X.XOOO.OXXXXX/..X.O.X..X.O.OOX.../","hintLoc":"null","initialTurnNumber":254,"metadata":"E9C95FE4990F77FB480762B7CC76E324:264","moveLocs":["D1","C6","K19","N19","M19","pass","E19","C17","J1","L6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.154,0.00144,0,0.00109,0,0,0,0,0,0,6.54e-05,0,0,0,0,0,7.07e-05,7.19e-05,6.21e-05,0,0,0.0967,0,0,0,0,0,0,0,0,0,0,0,0,0,7.52e-05,7.44e-05,7.14e-05,0,0,0,0,0,0,0,7.18e-05,0,0,0,0,0,0,0,0,8.04e-05,7.76e-05,7.63e-05,0,0,0,0,0,0,7.33e-05,0,0,0.0166,0,0,0,0,0,8.9e-05,0,9.08e-05,0,0.0145,0,0,0,0,0,0,0,0,0,0,0,0,0.043,0,8.79e-05,0.000106,0,0.0318,0.033,0,0,0,0,0,0,0,0,0,0,0,0,0,0.126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0653,0,0,0,0,5.31e-05,0,0,0,0,0,0,0,0,0,0,0,0,0.0243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.33e-05,0,0.0249,0,0,0,0,0,0,0,0,0.00381,0,0,0,0,0,0,0.000327,0,0,0,0,0,0,0,0,0,0,0,0,0.00362,6.36e-05,6.05e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.2e-05,0,0,0,0,0,0,0,0,0,0.000969,0,0,0,0,0,0,0,0,5.77e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.04e-05,0,0,0,0,0,0,0,0,0.0638,0,0.0346,0,0,0,0,0,0,0,7.13e-05,0,0,0,0,0,0,0,0,0,0,0.037,0,8.52e-05,0,0,0,0,2.98e-06,9.5e-05,0.000151,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000613,0,9.77e-06,0,7.96e-05,0.000166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7.77e-05,0,9.97e-05,0,0,0.0172,0,0.0001,0,0,0,0,0.00349,0,0,0,0,0,0,7.29e-05,9.74e-05,0,0,0,0.0253,0,0.000107,0,0,0.126,0,0.00324,0,0,0,7.57e-06,0.000311,9.28e-06,0.0452],"winrateAvg":0.0101611,"leadAvg":-2.25446,"scoreMeanAvg":-2.43338,"scoreStdevAvg":5.38592,"shorttermWinlossErrorAvg":0.0488359,"shorttermScoreErrorAvg":2.36873,"ownership":[87,89,87,91,94,100,100,100,100,-100,-100,-100,100,100,100,-100,-100,-100,-100,87,87,87,88,99,100,-100,-100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,87,90,87,87,99,-100,-100,-100,-100,-100,99,99,-100,100,100,-100,-100,-100,-100,90,86,86,88,99,-100,-100,-100,-100,-66,99,99,100,100,-100,-100,-100,-100,-100,90,91,92,87,99,100,-100,-100,99,99,99,99,100,-7,-100,-99,-100,-100,-98,94,93,88,89,92,100,100,-100,-100,-100,-100,100,100,-99,-98,-100,-100,99,-98,98,90,90,91,93,100,100,100,100,100,100,-100,100,38,-98,100,-100,100,99,98,100,92,100,94,100,100,-100,-100,-100,-100,-100,44,100,100,100,100,100,100,100,100,100,100,100,100,-100,-99,-99,-100,-77,-100,100,100,-100,-100,100,100,100,99,98,98,100,100,-100,-100,-100,-100,-100,99,-100,100,-100,-100,100,100,100,100,99,99,99,100,100,100,-100,-100,100,100,99,100,-100,-100,-99,-100,100,-100,100,-99,100,100,100,100,-100,-100,-100,100,100,99,100,-100,-100,-99,-100,-100,-100,100,-98,-98,100,100,100,-100,100,-100,-100,100,100,100,-100,-100,-99,-100,-98,-100,100,-98,-97,100,100,-100,-100,100,100,-100,3,100,22,-100,-100,-100,-98,-98,-100,-100,-98,-97,100,100,-100,100,100,-100,-100,100,100,-50,-100,-100,-100,-100,-98,-100,-99,-98,-97,-98,100,-100,-100,100,100,-100,100,-100,-100,-100,-100,-100,-99,-97,-98,-97,-99,-98,-98,100,100,100,100,-100,-100,100,-100,99,100,-100,-97,-97,-97,-97,-98,-98,-98,-98,-98,100,32,-100,-99,-100,100,100,100,99,99,-97,-97,-97,-97,-98,-99,-98,-98,-98,100,-42,-100,-99,-100,-100,-25,99,99,99,99,-97,-98,-98,-98],"ownershipAllowedMAE":0.0479477})%"); + lines.push_back(R"%({"sample":{"board":"O.O................/.OXXX..OXX....OXX../OOOO.XXOXOX.X.XXOO./OOXO...OO.OX...O.../XXXOXXXXOO..X....O./O.XXOOXOXOXXOO.OXO./.OX.XOOOXX..X...O../.OOXX.OX.XXX.....X./.XOOXOOO.X......X../..OOOXXO......XOX../...OX..O.......XO../...O.X..........O../.................../................O../......X......X...O./...X.XO.....OX.X.../....X.XO.....OOX.../.....XO............/.................../","hintLoc":"null","initialTurnNumber":148,"metadata":"809BF4EDF52BA2EDFD22EE72539FD949:158","moveLocs":["L15","F3","S4","F5","G3","G18","F18","F3","E4","S3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.84,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui0","komi":7.0,"policyOptimism":0.538,"pda":0.0,"policyMixture":[0,0,0,2.94e-05,2.26e-05,2.7e-05,2.62e-05,2.74e-05,2.69e-05,2.55e-05,2.59e-05,2.48e-05,2.59e-05,2.63e-05,2.66e-05,2.59e-05,2.57e-05,2.92e-05,2.66e-05,0,0,0,0,0,0,0,0,0,0,2.6e-05,2.51e-05,2.64e-05,2.64e-05,0,0,0,0.000101,2.98e-05,0,0,0,0,2.54e-05,0,0,0,0,0,0,2.62e-05,0,2.65e-05,0,0,0,0,2.94e-05,0,0,0,0,2.74e-05,2.49e-05,2.67e-05,0,0,2.83e-05,0,0,2.64e-05,2.83e-05,0.000336,0,0.000342,2.92e-05,3.24e-05,0,0,0,0,0,0,0,0,0,0,0,2.49e-05,0,3.1e-05,0.0158,0.000262,3.27e-05,0,2.74e-05,0,2.77e-05,0,0,0,0,0,0,0,0,0,0,0,0,4.81e-05,0,0,0,3.14e-05,2.76e-05,0,0,2.72e-05,0,0,0,0,0,0,2.62e-05,2.58e-05,0,3.36e-05,6.45e-05,0.0387,0,0.000606,3.02e-05,2.57e-05,0,0,0,0,2.71e-05,0,0,2.76e-05,0,0,0,2.81e-05,3.34e-05,3.84e-05,4.76e-05,3.47e-05,0,2.91e-05,2.62e-05,0,0,0,0,0,0,0,3e-05,0,2.61e-05,2.81e-05,3.19e-05,3.56e-05,3.51e-05,0.000473,0,2.98e-05,3.24e-05,2.7e-05,2.83e-05,0,0,0,0,0,0,3.45e-05,3.38e-05,3.34e-05,3.39e-05,3.59e-05,3.54e-05,0,0,0,3.65e-05,3.63e-05,2.75e-05,3.14e-05,2.55e-05,0,0,2.51e-05,3.04e-05,0,4.12e-05,4.51e-05,4.33e-05,4.25e-05,4.21e-05,4.07e-05,6.91e-05,0,0,5.1e-05,3.3e-05,2.87e-05,3.59e-05,3.22e-05,0,3.12e-05,0,3.88e-05,4.49e-05,6.69e-05,5.48e-05,6.61e-05,5.93e-05,7.69e-05,0.000134,0.000967,0.00481,0,4.02e-05,3.42e-05,3.04e-05,4.46e-05,0.000225,5.89e-05,4.57e-05,3.76e-05,4.31e-05,4.61e-05,6.1e-05,0.000117,0.000174,0.000222,0.0003,0.00256,0.000242,4.37e-05,3.56e-05,0.00011,3.19e-05,3.2e-05,7.46e-05,0.00047,0.000144,6.18e-05,9.88e-05,0.000242,0.000116,6.86e-05,0.000171,0.000289,0.000748,0.000594,0.000105,7.37e-05,0.000239,0,3.33e-05,3.26e-05,3.33e-05,0.000125,0.000144,3.44e-05,3.8e-05,0,0,0.00513,5.46e-05,0.000227,0.000346,0.000299,0.013,0,3.72e-05,0.0078,0.00804,0,3.16e-05,3.2e-05,4.27e-05,3.94e-05,0,0,0,0,0.000104,7.09e-05,0.000252,0.00388,0.00021,0,0,0.0367,0,0.00214,0,0.421,3.02e-05,3.59e-05,3.49e-05,2.62e-05,0,0,0.211,0,4.05e-05,0.000324,0.000466,0.000126,0.201,0,0,0,0.000137,0,2.99e-05,2.88e-05,3.34e-05,3.27e-05,3.42e-05,3.17e-05,0,0,3.53e-05,5.39e-05,4.7e-05,8.1e-05,0.000118,4.26e-05,4.06e-05,0.00593,0.00483,4.88e-05,0.000123,3.3e-05,2.63e-05,2.86e-05,2.84e-05,2.89e-05,3.17e-05,3.33e-05,3.87e-05,3.27e-05,3.19e-05,3.18e-05,3.17e-05,3.18e-05,3.25e-05,3.72e-05,3.71e-05,3.76e-05,3.13e-05,3.25e-05,2.61e-05,2.47e-05],"winrateAvg":0.921234,"leadAvg":4.45768,"scoreMeanAvg":5.66793,"scoreStdevAvg":9.18909,"shorttermWinlossErrorAvg":0.103288,"shorttermScoreErrorAvg":1.3211,"ownership":[86,57,61,-19,-74,-90,-95,-96,-97,-97,-97,-97,-97,-96,-95,-91,-63,-44,3,84,99,-93,-94,-95,-95,-93,-93,-99,-99,-97,-97,-97,-97,-94,-98,-98,-4,34,99,99,99,99,10,-95,-95,-93,-99,-97,-99,-97,-99,-73,-98,-98,92,91,64,99,99,98,99,35,-29,-94,-93,-93,-98,-97,-100,-60,-25,16,84,82,90,88,98,98,98,99,-93,-94,-94,-95,-94,-93,-100,-96,-97,-19,-14,58,86,93,87,100,100,98,98,100,100,-94,100,-100,-95,-100,-100,46,52,26,87,71,93,49,99,100,98,99,98,100,100,100,-100,-100,-99,-91,-93,-11,-4,-9,80,3,5,96,100,100,98,98,99,100,-18,-18,-100,-100,-100,-50,-24,-16,-16,-19,-83,-44,91,84,100,100,98,100,100,100,-21,-100,-61,-43,-29,-34,-47,-81,-87,-71,-54,79,89,100,100,100,13,16,100,24,-11,-13,-19,-22,-27,-86,-63,-86,1,-18,64,64,79,100,6,25,54,99,22,0,-5,-10,-10,-7,-21,-70,77,20,22,44,51,46,100,47,-24,24,22,3,0,-4,-7,-6,3,12,43,77,65,39,26,26,11,27,22,7,12,14,8,2,-3,-7,-8,2,10,26,49,53,47,7,11,-21,-1,-6,-5,1,15,12,7,1,-5,-15,-16,1,1,71,49,39,-8,-7,-7,-34,-39,12,-31,17,21,15,14,8,-4,-65,-25,-28,-7,57,11,-22,-23,-58,-87,-86,-87,75,65,34,29,27,38,68,-63,14,-81,-18,-57,-48,-32,-41,-47,-66,-88,7,1,82,46,42,46,62,47,70,72,-82,-47,-12,-34,-38,-42,-48,-55,-27,-35,49,34,51,51,57,65,52,58,26,3,-30,-28,-32,-41,-43,-45,-41,-32,-7,7,35,43,51,56,57,52,39,22,-6,-20,-27,-29],"ownershipAllowedMAE":0.0334997})%"); + lines.push_back(R"%({"sample":{"board":".................../...XO......O.OXX.../.XXXO.OO.O..OXXOO../XOOXXXXOXO.XXXO.O../XXOOO....O....O.O../.OXO......X..XXOO../..XO....O...X.OX.../..XO...OX.O....XO../..XXOO......X.XXOO./.XXO.OX.X..O.XOOX../.O.OOXX...O..X...../..O..OOXXXXO..OO.X./..OXO.OOXOX.X....../....X.XX.O....OOX../..O....X.O.....X.X./...OOO..OX.OOOOOXX./.OOXXXX.XOOOXXXX.../.XX.....XX........./.................../","hintLoc":"null","initialTurnNumber":66,"metadata":"E565A83AF1D6862E4EA3304205517106:76","moveLocs":["M7","M6","N8","O8","N6","O7","L6","J6","H4","G4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.9,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":4.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.45e-05,8.47e-05,9.93e-05,0.000241,8.52e-05,8.6e-05,8.93e-05,8.25e-05,8.07e-05,8.79e-05,9.56e-05,8.01e-05,8.11e-05,8.44e-05,9.77e-05,7.56e-05,0.000115,0.00011,7.55e-05,0.00302,7.69e-05,7.95e-05,0,0,9.37e-05,9.1e-05,8.4e-05,7.91e-05,9.75e-05,0.00011,0,0.00013,0,0,0,0.000727,0.000147,9.59e-05,0.00617,0,0,0,0,0.000107,0,0,8.14e-05,0,0.000114,0.000172,0,0,0,0,0,9.68e-05,8.97e-05,0,0,0,0,0,0,0,0,0,0,9.17e-05,0,0,0,0,7.5e-05,0,8.26e-05,8.01e-05,0,0,0,0,0,0.00011,0.000108,0.000104,9.14e-05,0,0.0217,0.00011,9.67e-05,0.0387,0,7.55e-05,0,7.96e-05,7.92e-05,0.00288,0,0,0,7.91e-05,0.000108,0.000398,0.000114,9.99e-05,0.000114,0,0.00863,0.000133,0,0,0,0,8.16e-05,8.17e-05,0.000112,0.000954,0,0,8.63e-05,0.000108,0.000117,0.000109,0,0.000248,0.0149,0.00311,0,0.00012,0,0,0.00142,8.86e-05,7.93e-05,0.000873,0.000911,0,0,8.92e-05,9.77e-05,0.000106,0,0,0.00275,0,0.0115,0.000108,0.132,0.000103,0,0,8.32e-05,8.3e-05,0.000324,9.18e-05,0,0,0,0,0.000116,0.000181,0.0164,0.000145,0.000418,0.00407,0,0.00012,0,0,0,0,9.36e-05,0.00322,0,0,0,7.83e-05,0,0,0.000113,0,0.000133,0.000102,0,8.83e-05,0,0,0,0,0.000561,0.000112,0.000112,0,0.000106,0,0,0,0,0.000118,9e-05,0.000157,0,0.000103,8.59e-05,0,9.6e-05,0.000101,0.0231,0.1,0.00013,9.2e-05,8.46e-05,0,8.43e-05,8.46e-05,0,0,0,0,0,0,0,0,0,0,0,0.000566,0,0.000106,8.19e-05,8.68e-05,0,0,0,7.08e-05,0,0,0,0,0,0,0,0,9.95e-05,9.51e-05,0.000958,0.0289,9.64e-05,8.33e-05,8.57e-05,8.42e-05,0.00011,0,0.000109,0,0,0,0,0,0,0,0.000245,0,0,0,0.000106,8.72e-05,8.92e-05,9.3e-05,0,8.05e-05,8.82e-05,0.445,8.99e-05,0,0.000232,0,6.91e-05,0.103,8.5e-05,0.000114,0.000155,0,0,0,7.85e-05,9.83e-05,9.17e-05,9.41e-05,0,0,0,0,0,0,0,0.000139,0,0,0,0,0,0,0,7.53e-05,0.000103,0,0,0,0,0,0,0.000111,0,0,0,0,0,0,0,0,0.00034,9.2e-05,7.58e-05,0.000265,0,0,9.62e-05,8.53e-05,7.33e-05,7.34e-05,8.18e-05,0,0,0.000122,0.0002,0.00406,0.00011,8.14e-05,9.55e-05,0.000198,8.75e-05,7.68e-05,7.83e-05,9.82e-05,8.8e-05,8.55e-05,7.93e-05,7.42e-05,7.35e-05,7.46e-05,7.81e-05,8.91e-05,0.0001,0.000326,0.000111,9.81e-05,9.65e-05,8.44e-05,7.89e-05,7.69e-05,7.3e-05,8.45e-05],"winrateAvg":0.0199323,"leadAvg":-4.40744,"scoreMeanAvg":-5.05346,"scoreStdevAvg":7.17249,"shorttermWinlossErrorAvg":0.0667832,"shorttermScoreErrorAvg":1.45766,"ownership":[-98,-98,-98,-71,-52,51,79,87,91,90,85,61,10,-47,-75,-83,-65,-42,9,-99,-99,-99,-100,93,88,91,94,93,94,85,91,66,66,-98,-98,-6,36,71,-99,-99,-100,-100,92,-28,99,99,85,100,53,-25,82,-98,-98,100,100,87,86,-99,96,97,-100,-100,-100,-99,99,47,100,2,-98,-98,-98,99,98,100,97,93,-99,-99,97,96,96,-26,-45,16,49,99,43,-32,-75,37,99,99,100,98,96,-98,-98,-99,96,44,6,8,24,30,8,-67,-32,-83,-98,-98,100,100,98,95,-97,-99,-99,96,57,32,30,39,85,31,3,-33,-99,-97,-95,-97,14,95,89,-87,-96,-99,96,87,59,28,84,-37,1,83,-9,-84,-93,-96,-97,98,93,75,-84,-88,-99,-99,99,99,-6,-7,-5,3,34,4,-99,-96,-97,-97,98,97,54,46,-98,-99,99,97,99,-95,-46,-96,-39,29,91,-41,-99,83,84,0,18,31,58,89,-19,99,99,-95,-95,-91,-75,-14,87,83,-13,-99,-38,61,27,1,-6,84,86,99,74,94,97,97,-99,-99,-99,-99,92,92,-98,91,92,-20,-76,-32,84,93,99,41,96,20,97,97,-99,97,-98,93,-98,-98,0,37,-31,-55,-59,79,87,65,47,-11,-8,-99,-99,-99,97,96,85,85,-41,88,88,-97,-85,-78,69,86,99,57,35,81,-72,-99,-79,97,93,90,64,45,36,-66,-64,-100,-91,58,70,95,98,98,98,-100,69,81,83,95,98,98,98,98,98,-100,-100,-98,-26,96,97,-100,-100,-100,-100,-80,-100,98,98,98,-99,-99,-99,-99,-99,-99,-99,-26,-99,-99,-99,-100,-100,-100,-99,-100,-100,50,9,-4,-81,-89,-96,-97,-98,-98,-50,-53,-94,-99,-99,-99,-99,-99,-92,-58,-21,2,-30,-50,-81,-89,-94,-96,-98],"ownershipAllowedMAE":0.0357802,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":".OX.X......X..X.../.OOXXXXXOX.XOOXX.O/..OXOOOXOXXO.OOX.X/.OOXOX.OXOOOO.O.X./.OOXOX..XXXOOXOOXO/XOXXOX..XX.X.O.OXO/.XOOX....X.XOO.OO./.XOXXOO.XOXXXXO.O./.XOOXX..XOOOOXOOXX/..XOOX.OXXX.XOXX../..OOXXXOXO.XOOX.XX/...OOXOOOXX.OXOXXO/..XOXXO.XOOOOXOOO./...OOX..XXXO.XO.OO/.O.OXXXX.OXOOOXXX./...OOXOOX..XXOOOX./....XO.OX.XXOO.OOX/......OOX.XOO...../","hintLoc":"null","initialTurnNumber":244,"metadata":"1347912026A44CE61F7295BECD440955:254","moveLocs":["M7","R18","R17","Q15","Q18","S12","S18","S15","R16","S6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.19,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":0.5,"policyOptimism":0.151,"pda":-2.019,"policyMixture":[3.39e-05,0,0,0.457,0,3.07e-05,2.98e-05,0.000119,0.203,0.016,0.0198,0,0.0179,0.0173,0,0,3.6e-06,0,0.000252,0,0,0,0,0,0,0,0,0,0.0356,0,0,0,0,0,0,2.8e-06,0.000127,3.45e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000239,0,0,0,0,0,6.8e-05,0,0,0,0,0,0,2.19e-05,0,0,0,0,9.86e-05,0,0,0,0,0,3.06e-05,4.11e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.36e-05,3.32e-05,0,0,3.79e-05,0,0.0075,0,0.000162,0,0,0,4.35e-05,0,0,0,0,4.23e-05,3.8e-05,3.39e-05,3.44e-05,0,4.12e-05,0,0,0,0.0186,0,0,0,3.44e-05,0,0,0,0,0,0,3.72e-05,0,0,0,0,0,0,0,0,0,0.0065,3.44e-05,0,0,0,0,0,4.06e-05,4.31e-05,0,0,0,0,0,0,0,0,0,0,6.63e-05,8.49e-05,0,0,0,0,3.87e-05,0,0,0,0,0.00165,0,0,0,0,0.000179,0.000103,3.54e-05,0.000315,0,0,0,0,0,0,0,0,9.57e-05,0,0,0,0,3.87e-06,0,0,4.18e-05,0.000127,5.82e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.8e-05,7.51e-05,0,0,0,0,0,3.9e-05,0,0,0,0,0,0,0,0,0,0,4.19e-05,0.000167,0.000142,0,0,0,3.94e-05,3.42e-05,0,0,0,0,1.83e-05,0,0,0.025,0,0,5.1e-05,0,0.000368,0,0,0,0,0,3.82e-05,0,0,0,0,0,0,0,0,0.0238,4.02e-05,0.000276,0.0145,0,0,0,0,0,0,4.11e-05,3.8e-05,0,0,0,0,0,0,3.47e-05,5.2e-05,0.0179,0.0195,0.0213,0,0,0,0,0,3.84e-05,0,0,0,0,3.18e-05,0,0,0,3.2e-05,0.000499,0.00735,0.0195,0.0196,0.0216,0,0,0,3.39e-05,0,0,0,3.07e-05,3.21e-05,3.23e-05,3.46e-05,3.41e-05,0.00342],"winrateAvg":0.00114459,"leadAvg":-1.51295,"scoreMeanAvg":-1.3945,"scoreStdevAvg":0.79477,"shorttermWinlossErrorAvg":0.0188449,"shorttermScoreErrorAvg":0.352458,"ownership":[100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,46,37,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,99,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,49,100,100,100,-100,100,99,99,100,100,-100,-100,-99,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,99,100,-100,-100,-99,-99,-100,-100,-100,-100,-100,-100,-100,100,100,100,34,100,99,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,-100,-100,-99,-100,-100,-100,-99,-100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-99,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-99,-100,-100,-100,-100,100,100,100,-100,-100,100,100,100,100,100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.00347493})%"); + lines.push_back(R"%({"sample":{"board":"..O............/.XXO...OX....../.XO.O.O.XX.XXX./.XXOOOOXXO.OO../X.XXOX.OOO...O./.XOXOO........./.OOOX.XOX....../......X.OX.XX../.XO..OX.X..X.X./.XXO.OX..O.OXX./.....OXOOO.OX.X/..XXO.OXOXXOOX./..XOO.OXX.XO.O./.XO..OX..XXOX.O/.O..O..X...XOO./","hintLoc":"null","initialTurnNumber":14,"metadata":"281436486BCB9805ACE9FB9C99E922C8:24","moveLocs":["A2","D5","B8","A9","B15","B4","B5","F9","C8","D8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.65,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":9.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.98e-06,0,0,0.000161,9.12e-06,1.4e-05,8.41e-06,3.44e-05,0.000117,8.85e-06,7.8e-06,8.69e-06,7.35e-06,7.37e-06,6.89e-06,6.66e-06,0,0,0,1.64e-05,0.000128,1.73e-05,0,0,8.21e-06,1.2e-05,8.77e-06,8.48e-06,7.23e-06,7.07e-06,6.26e-06,0,0,2.69e-05,0,6.33e-06,0,1.28e-05,0,0,0.0742,0,0,0,8.77e-06,5.6e-06,0,0,0,0,0,0,0,0,0,0.000356,0,0,0.00107,1.15e-05,0,6.96e-06,0,0,0,0,7.36e-06,0,0,0,8.4e-06,9.83e-06,9e-06,0,9.92e-06,3.77e-05,0,0,0,0,0,0.0743,0.000911,8.14e-06,1.12e-05,0.000113,0.00026,0.115,0.000275,1.07e-05,0,0,0,0,0,0,0,0,0,1.29e-05,0.000106,1.77e-05,1.85e-05,0.0466,1.28e-05,0.0703,0,0,0,5.85e-05,1.95e-05,0,0.000284,0,0,9.23e-06,0,0,1.15e-05,9.68e-06,7.14e-06,0,0,0.6,8.52e-06,0,0,7.27e-06,0,1.83e-05,1.03e-05,0,6.22e-06,0,8.08e-06,6.21e-06,0,0,0,7.36e-06,0,0,9.25e-06,7.45e-06,0,5.16e-05,0,0,0,6.5e-06,8.13e-06,0,0.000276,0,7.38e-06,0,0,0,0,0,0.000187,0,0,6.44e-06,0,0.00102,0,0,0,0,0.000273,0,0,0,0,0,0,0,0,9.39e-06,7.41e-06,0.00081,0,0,0,0.000259,0,0,0,4.61e-06,0,0,7.5e-06,0,7.05e-06,0,0,0,0.0118,6.49e-06,0,0,7.32e-06,7.33e-06,0,0,0,0,1.92e-05,0,1.11e-05,0,0.00024,5.13e-05,0,6.66e-06,1.02e-05,0,7.07e-06,7.99e-06,3.14e-05,0,0,0,0,9.28e-06],"winrateAvg":0.188791,"leadAvg":-0.752281,"scoreMeanAvg":-1.15324,"scoreStdevAvg":3.66577,"shorttermWinlossErrorAvg":0.270129,"shorttermScoreErrorAvg":1.00362,"ownership":[-99,-99,-6,-4,57,59,71,31,-23,-93,-95,-97,-98,-97,-96,-99,-99,-99,94,71,67,80,97,-99,-96,-98,-98,-99,-97,-96,-99,-99,32,25,100,93,100,19,-99,-99,19,-99,-99,-99,-49,-99,-99,-99,100,100,100,100,-99,-99,99,58,97,98,17,4,-99,-98,-99,-100,100,89,92,99,99,99,66,48,60,95,61,29,-97,97,-100,100,100,-54,30,22,34,16,18,-31,15,61,96,95,96,95,62,99,-99,30,-91,-5,39,-38,-23,38,25,15,-98,-98,95,61,-22,-99,-93,-85,-99,-50,-100,-100,-55,-41,-46,-98,-16,-14,69,100,-99,-63,-98,-56,-30,-100,-99,-100,-78,-82,-99,-98,99,89,100,-99,9,-3,99,47,99,-100,-99,-90,-94,-98,15,99,99,100,-99,99,99,99,21,99,-99,-86,-93,-96,-95,-98,-97,100,99,99,-99,99,-99,-99,99,99,-86,7,-97,-97,-97,100,100,99,99,-99,-99,-99,-99,99,99,99,48,-97,-97,96,96,98,99,-96,-97,-99,-99,-99,99,99,99,99,-45,95,94,97,99,55,-28,-98,-98,-76,-9,-10,100,99,99],"ownershipAllowedMAE":0.0313884})%"); + lines.push_back(R"%({"sample":{"board":".X.X..X.XXXXO....../.X.OX.XOOXOXOOOOXX./XOOOXOO.OXOOOO..OXX/OOXOXXOOXXO.XXOOXX./OXXOXOXX.XOOOX..XO./XXXOXO.XXXXOXOOOOO./.XX.XO.OXOOOXXO.XXX/X.X.XOOXXXXXXOOX..O/XX.OO.OOXX..XOOO.X./","hintLoc":"null","initialTurnNumber":159,"metadata":"137D2EC5FCE92E99F20D62CFF73D2A70:169","moveLocs":["pass","C8","pass","D3","pass","D5","pass","H9","pass","G3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.14,"xSize":19,"ySize":9},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00476,0,0,0,0.00554,0.00635,0,0,0,0,0,0,0,0.00929,0.0102,0.0112,0.0265,0.0122,0.0118,0.00474,0,0,0.00572,0,0.00785,0,0,0,0,0,0,0,0,0,0,0,0,0.0195,0,0.00598,0.00567,0.00741,0,0,0,0.00819,0,0,0,0,0,0,0.0189,0.0198,0,0,0,0.00517,0.00503,0,0.00505,0,0,0,0,0,0,0,0.0199,0,0,0,0,0,0,0.019,0.00448,0,0,0,0,0,0,0,0,0,0,0,0,0,0.021,0.0207,0,0,0.0126,0,0,0,0,0,0,0.0099,0,0,0,0,0,0,0,0,0,0,0,0.0207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0188,0,0,0,0,0,0,0.00783,0,0,0,0,0,0,0,0,0,0,0,0,0.0205,0.0221,0,0,0,0.0068,0,0,0.00847,0,0,0,0,0.00467,0.00503,0,0,0,0,0.0206,0,0.0183,0.522],"winrateAvg":0.000338989,"leadAvg":-11.6501,"scoreMeanAvg":-12.0586,"scoreStdevAvg":1.19569,"shorttermWinlossErrorAvg":0.00572943,"shorttermScoreErrorAvg":0.669294,"ownership":[-99,-100,-99,-100,-99,-98,-100,-100,-100,-100,-100,-100,100,99,98,99,98,98,98,-99,-100,-100,-98,-100,-98,-100,-98,-98,-100,100,-100,100,100,100,100,97,97,97,-100,-98,-98,-98,-100,-97,-97,-98,-98,-100,100,100,100,100,99,98,99,97,97,-98,-98,-100,-98,-100,-100,-98,-98,-100,-100,100,98,97,97,100,100,96,97,98,-99,-100,-100,-100,-100,-98,-100,-100,-99,-100,100,100,100,97,99,97,96,100,98,-100,-100,-100,-99,-100,-97,-98,-100,-100,-100,-100,100,-100,100,100,100,100,100,99,-99,-100,-100,-100,-100,-97,-100,-99,-100,100,100,100,-100,-100,100,98,96,96,96,-100,-99,-100,-98,-100,-97,-98,-100,-100,-100,-100,-100,-100,100,100,96,98,97,99,-100,-100,-98,-97,-98,-98,-98,-98,-100,-100,-99,-99,-100,100,100,100,98,96,98],"ownershipAllowedMAE":0.00933599})%"); + lines.push_back(R"%({"sample":{"board":".OX..XXOXOOOXXXXO../X.XXXXOOXOOXXXXOOO./OXXOXO.OXXOOXXXOOXX/OOOOOOOOOXOXX.XXXX./OXXX...XXXOOXXOOXXX/XXXXXXX.XOOXXOOOXOX/OXXOOOXXXO.OOX.OOOO/OXOO.OOXO.O.O.OXO../OOOOX.OOOO....OXXO./XXXOX.......OOOXXO./.OXXOO.....OXXOOXOO/..XO.O.....OOXOXXXO/..XO.OX....OXXX.X.X/..XOO.OO.OOOOXXXXXX/..XXOOX.OOX.OXOXOOO/.X.XXXXXOXXOOO.O.../XOOXOOOXXXOOXXOOO../.XXO.O.OX.XOX.XXOO./.XO.O.XX.OXXX.XXXO./","hintLoc":"null","initialTurnNumber":301,"metadata":"4B9AFCBB047B551F48640102A4FC5386:311","moveLocs":["P4","G15","M5","D1","H5","E15","R4","E2","S12","F1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.2,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":-6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00902,0,0,0.00174,0.00177,0,0,0,0,0,0,0,0,0,0,0,0,0.00161,0.00171,0,0.0103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00179,0,0,0,0,0,0,0.000156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0362,0,0,0,0.0385,0,0,0,0,0,0,0,0,0.0228,0,0,0,0,0.0423,0,0.0216,0,0.0446,0,0,0,0,0.0101,0,0,0,0,0,0.0251,0,0,0,0,0.0236,0.0122,0.0246,0.0126,0,0,0,0,0.0102,0,0,0,0,0,0.074,0.0137,0.0114,0.00995,0.0105,0.0102,0.0373,0,0,0,0,0,0,0.0101,0.00206,0,0,0,0,0,0.0128,0.00924,0.0038,0.00323,0.0104,0,0,0,0,0,0,0,0,0.00191,0.00432,0,0,0.0188,0,0.0494,0.0111,0.00651,0.00584,0.0107,0,0,0,0,0,0,0,0,0.00178,0.00178,0,0,0.0191,0,0,0.072,0.0112,0.0115,0.0115,0,0,0,0,0,0,0,0,0.00179,0.00175,0,0,0,0.0235,0,0,0.0118,0,0,0,0,0,0,0,0,0,0,0.0018,0.00181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0018,0,0.00421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0114,0.0088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0119,0.00485,0.00184,0,0,0,0,0,0.00373,0,0,0.0131,0,0,0,0.0122,0,0,0,0,0.00953,0.00169,0,0,0,0,0,0,0,0.00799,0,0,0,0,0.0119,0,0,0,0,0.00855,0.0353],"winrateAvg":4.64936e-05,"leadAvg":-14.437,"scoreMeanAvg":-14.4627,"scoreStdevAvg":0.832578,"shorttermWinlossErrorAvg":0.00293186,"shorttermScoreErrorAvg":0.405287,"ownership":[-99,-99,-100,-100,-100,-100,-100,100,-100,100,100,100,-100,-100,-100,-100,-99,-99,-99,-100,-100,-100,-100,-100,-100,100,100,-100,100,100,-100,-100,-100,-100,-99,-99,-99,-100,100,-100,-100,100,-100,100,1,100,-100,-100,100,100,-100,-100,-100,-99,-99,-100,-100,100,100,100,100,100,100,100,100,100,-100,100,-100,-100,-99,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,0,-100,-100,-100,-100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,0,-100,100,100,-100,-100,100,100,100,-100,100,-100,100,-100,-100,100,100,100,-100,-100,-100,100,99,100,100,97,99,100,100,100,100,100,-100,100,100,98,100,100,-100,100,99,100,99,100,99,100,-100,100,100,99,100,100,100,100,97,98,100,100,100,100,99,99,98,98,100,-100,-100,100,98,-100,-100,-100,100,97,99,98,98,99,99,99,99,100,100,100,-100,-100,100,99,-99,-97,-100,-100,100,100,99,99,98,99,99,100,-100,-100,100,100,-100,100,100,-98,-99,-100,100,99,100,99,99,98,98,98,100,100,-100,100,-100,-100,-100,100,-98,-98,-100,100,99,100,97,99,98,98,98,100,-100,-100,-100,-100,-100,-100,-100,-98,-98,-100,100,100,99,100,100,98,100,100,100,100,-100,-100,-100,-100,-100,-100,-98,-98,-100,-100,100,100,-100,100,100,100,-100,100,100,-100,100,-100,100,100,100,-98,-100,-99,-100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,98,99,-100,-97,-97,-100,-98,-98,-98,-100,-100,-100,100,100,-100,-100,100,100,100,98,98,-99,-100,-100,-99,-100,-98,-99,-98,-100,-99,-100,100,-100,-99,-100,-100,100,100,98,-99,-100,-99,-100,-99,-100,-100,-100,-99,-97,-100,-100,-100,-99,-100,-100,-100,100,99],"ownershipAllowedMAE":0.00467429})%"); + lines.push_back(R"%({"sample":{"board":"......X............/.OOX.XOX.O........./.OXXXXO.XXXOOX...../O.OXOOOOXO.XOX.O.../X.OOXXOOXOXXX..X.../OOOXX.XOOXXOXXX.X../OXXOXXOOOOO.O.O.XXX/XXXO.XX...OOOOOOOOO/.XOOOXXXXXXXXXOXOXO/.XOXO.OOXOX.OXXXXXX/..XXOOO.OOXOOXOXOOO/..XOOXO.OXOO.OOO.O./.XOXXX..OX.OOO.OOO./........OXXOXX..XOX/........OX.XO.X.XX./...X.XOO.X..XOX..../.....OX.OX.X..XO.O./....XX..OOXO.XOO.../.................../","hintLoc":"null","initialTurnNumber":100,"metadata":"523B20795892AD86DE71F375A9D6E6FD:110","moveLocs":["M13","O18","G6","G7","P18","M14","F5","H3","M13","P17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.83,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":56.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.22e-05,1.38e-05,1.4e-05,1.39e-05,1.44e-05,1.41e-05,0,1.4e-05,1.34e-05,1.34e-05,1.35e-05,1.46e-05,1.87e-05,0.01,6.49e-05,1.8e-05,1.52e-05,1.5e-05,1.18e-05,1.28e-05,0,0,0,1.16e-05,0,0,0,1.4e-05,0,1.6e-05,3.53e-05,0.0487,0,0,0.86,4.65e-05,3.54e-05,1.5e-05,0.000678,0,0,0,0,0,0,0.000129,0,0,0,0,0,0,0,6.94e-05,0.000146,2.75e-05,1.52e-05,0,0.000502,0,0,0,0,0,0,0,0,1.34e-05,0,0,0,0.0183,0,5.15e-05,2.44e-05,1.51e-05,0,0.00044,0,0,0,0,0,0,0,0,0,0,0,1.35e-05,1.41e-05,0,1.49e-05,1.53e-05,1.44e-05,0,0,0,0,0,9.62e-05,0,0,0,0,0,0.0189,0,0,0,1.32e-05,0,1.34e-05,1.35e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,8.48e-05,0,0.000145,0,0,0,0,0,0,0,1.11e-05,0,0,1.75e-05,1.72e-05,1.58e-05,0,0,0,0,0,0,0,0,0,1.04e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.34e-05,0,0,0,0,1.08e-05,0,0,0,0,0,1.05e-05,0,0,0,0,0,0,0,1.43e-05,2.2e-05,0,0,0,0,0,1.5e-05,0,0,0,0,0,0,0,0,0,0,0,1.43e-05,2.31e-05,0,0,0,0,0,0.000267,0,0,0,0,0,0,0,0,0,0,1.27e-05,1.28e-05,0,0,0,0,0,0,4.18e-05,0,0,1.36e-05,0,0,0,1.23e-05,0,0,0,1.32e-05,1.34e-05,1.39e-05,1.55e-05,1.36e-05,1.34e-05,1.56e-05,0,0.000386,0,0,0,0,0,0,1.54e-05,1.43e-05,0,0,0,1.26e-05,1.32e-05,1.34e-05,1.37e-05,1.36e-05,0,2.57e-05,0.000341,0,0,1.4e-05,0,0,3.99e-05,0,1.49e-05,0,0,1.46e-05,1.26e-05,1.32e-05,1.34e-05,0,1.51e-05,0,0,0,0.00537,0,1.62e-05,1.5e-05,0,0,0,1.8e-05,5.93e-05,7.91e-05,1.56e-05,1.25e-05,1.31e-05,1.33e-05,1.34e-05,5.67e-05,0,0,0,0,0,2.4e-05,0,1.75e-05,1.8e-05,0,0,4.83e-05,0,3.78e-05,1.25e-05,1.31e-05,1.31e-05,1.38e-05,0,0,0.0318,1.63e-05,0,0,0,0,0.000389,0,0,0,3.84e-05,6.18e-05,2.07e-05,1.17e-05,1.25e-05,1.22e-05,1.29e-05,1.25e-05,1.42e-05,2.38e-05,3.85e-05,1.48e-05,0.000384,0.000405,8.99e-05,1.73e-05,1.96e-05,8.41e-05,1.41e-05,1.51e-05,1.9e-05,1.23e-05,1.29e-05],"winrateAvg":0.593224,"leadAvg":0.403155,"scoreMeanAvg":1.33054,"scoreStdevAvg":14.9706,"shorttermWinlossErrorAvg":0.335801,"shorttermScoreErrorAvg":3.68916,"ownership":[95,90,31,-2,-32,-93,-96,-94,-87,-81,-76,-71,-68,-67,-68,-65,-63,-62,-62,96,98,98,-93,-77,-94,81,-99,-90,-74,-79,-71,-70,-62,-80,-77,-60,-64,-65,97,98,-93,-94,-94,-95,82,-89,-100,-100,-100,-65,-65,-88,-55,-63,-66,-67,-68,97,98,98,-94,84,83,82,83,-100,-99,-99,-100,-67,-90,-61,-53,-68,-72,-73,97,98,99,99,-18,-15,84,84,-100,-99,-100,-100,-100,-92,-89,-99,-81,-78,-83,98,99,99,-19,-17,19,18,84,86,-100,-100,-74,-100,-100,-100,-97,-100,-90,-91,98,-51,-54,99,-20,-17,86,84,85,86,86,-77,84,-87,84,-86,-100,-99,-99,-52,-52,-53,99,89,-18,-18,33,35,39,85,84,83,83,82,83,84,84,84,-53,-57,97,98,98,-17,-19,-22,-24,-23,-24,-24,-24,-23,85,-20,85,-21,86,-57,-59,96,-77,98,91,98,98,-21,98,-24,89,100,-23,-22,-22,-22,-22,-27,-64,-62,-82,-79,97,98,98,96,98,98,-24,100,100,-26,100,-25,100,100,100,-78,-80,-84,96,97,-91,97,91,97,-90,100,100,100,100,100,100,100,100,91,-80,-89,-73,-91,-92,-91,96,71,96,-89,15,100,100,100,69,100,100,100,48,-80,-80,-79,-82,-82,-80,-82,52,96,-88,-88,100,-85,-85,1,21,-85,100,-64,-80,-81,-83,-85,-84,-95,-8,54,94,-88,-84,-88,-82,-86,-92,-55,-85,-87,-66,-80,-81,-85,-96,-79,-95,89,87,-12,-88,-77,-83,-91,-77,-93,-35,-48,-45,-33,-81,-82,-85,-84,-64,-48,-51,88,88,-88,-53,-89,-64,-83,-93,12,-14,12,-7,-82,-82,-84,-85,-92,-91,-46,12,86,84,-53,5,-36,-84,12,11,5,3,4,-82,-83,-84,-85,-81,-56,-32,8,48,44,31,-9,-38,-46,-31,0,3,3,6],"ownershipAllowedMAE":0.0729323})%"); + lines.push_back(R"%({"sample":{"board":"...............X.../.X..XXX......OX.X../.OXXOXOX....OXOXX../..OOOOO....XXXOOOO./.............O...../..........XO......./..X......OO.O....../.....OOOO.XO......./....XOXXXX.OX..O.../..X.XX............./..XO..X.....O.OOO../.OO...OO.......X.X./....O.X.........X../.OOX.XOXX....OX..../O.OX.X.OX.O......../.OXXOOOOXX..O..X.../.X.XXO.XOXXXOX...../....XO..OOOOXX...../.................../","hintLoc":"null","initialTurnNumber":122,"metadata":"F83E213B75E3726AC60F13548EA00E9A:132","moveLocs":["D7","D8","F8","F7","H7","E8","F9","J17","A3","A4"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.37,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":5.5,"policyOptimism":0.5,"pda":0.0,"policyMixture":[3.5e-06,3.74e-06,3.85e-06,3.79e-06,3.6e-06,3.64e-06,4.07e-06,4.89e-06,4.78e-06,4.62e-06,4.81e-06,4.9e-06,4.89e-06,4.62e-06,3.45e-06,0,3.36e-06,3.7e-06,3.95e-06,4.48e-06,0,4.31e-06,4.04e-06,0,0,0,0.116,0.00809,0.000351,0.000608,0.000629,0.000302,0,0,3e-06,0,4.25e-06,4.62e-06,5.38e-06,0,0,0,0,0,0,0,0,0.012,0.0587,0.0554,0,0,0,0,0,6.86e-06,4.57e-06,4.29e-06,0.000125,0,0,0,0,0,0.433,0.0477,0.00117,5.69e-05,0,0,0,0,0,0,0,4.37e-06,4.05e-06,7.66e-06,4.56e-06,4.13e-06,3.89e-06,3.92e-06,4.34e-06,4.62e-06,8.84e-06,6.86e-06,6.97e-06,6.99e-06,4.2e-05,0,9.84e-06,4.3e-06,4.08e-06,4.56e-06,4.35e-06,4.36e-06,5.86e-06,5.69e-06,6.04e-06,5.14e-06,4.81e-06,4.45e-06,4.67e-06,4.9e-06,4.48e-06,0,0,1.7e-05,1.31e-05,4.42e-06,4.58e-06,4.71e-06,4.68e-06,4.13e-06,4.4e-06,5.25e-06,0,5.33e-06,5.91e-06,4.5e-06,3.73e-06,3.69e-06,4.02e-06,0,0,0,0,4.06e-06,4.1e-06,4.15e-06,4.51e-06,4.52e-06,4.12e-06,4.27e-06,4.97e-06,4.86e-06,4.75e-06,4.75e-06,0,0,0,0,4.08e-06,0,0,3.94e-06,3.68e-06,3.88e-06,4.14e-06,4.35e-06,4.41e-06,4.43e-06,4.32e-06,4.97e-06,4.81e-06,4.42e-06,0,0,0,0,0,0,4.57e-06,0,0,3.65e-06,3.89e-06,0,4.53e-06,5.33e-06,3.7e-05,4.57e-06,4.69e-06,0,4.63e-06,0,0,3.51e-06,3.7e-06,4.12e-06,4.52e-06,7.39e-06,1e-05,5.66e-06,4.11e-06,3.76e-06,3.71e-06,4.41e-06,7.63e-05,2.83e-05,4.11e-06,4.57e-06,0,0,3.58e-06,0,0,4.43e-06,4.92e-06,7.49e-06,5.21e-05,1.17e-05,0,5.26e-06,0,0,0,0.000234,4.29e-05,8.01e-06,0,0,0,0,0,0,0,8.3e-06,6.34e-05,0.00585,8.48e-05,1.2e-05,5.61e-05,1.2e-05,0,4.47e-06,0,5.06e-06,3.49e-05,1.17e-05,9.58e-05,0,0,0,0,0,4.18e-06,8.47e-06,9.23e-05,4.96e-05,1.51e-05,0.199,7.72e-05,6.2e-06,0,4.43e-06,4.28e-06,0.000132,0,0,0,3.96e-06,0,0,0,0,4.77e-06,6.45e-06,1.7e-05,0.00027,0,0,7.43e-06,5.34e-06,5.53e-06,3.98e-06,0,0,0,0,6.72e-06,0,1.37e-05,0,0,3.94e-06,0,6.58e-06,3.88e-05,0.0194,6.78e-05,6.86e-06,5.93e-06,5.02e-06,4.15e-06,0,0,0,0,0,0,0,0,0,0,3.83e-06,6.19e-06,0,0.000199,7.62e-06,0,5.11e-06,4.85e-06,4.1e-06,0,0,4.21e-06,0,0,0,3.31e-06,0,0,0,0,0,0,0,4.81e-06,5.1e-06,5.05e-06,4.52e-06,3.9e-06,3.87e-06,4.1e-06,3.83e-06,3.92e-06,0,0,5.56e-05,0.0352,0,0,0,0,0,0,4.21e-06,5.08e-06,4.56e-06,4.47e-06,4.02e-06,4.05e-06,3.96e-06,4e-06,4.63e-06,4.84e-05,0.000129,8.51e-06,0.00335,4.98e-06,5.21e-06,6.61e-06,4.29e-05,5.31e-06,3.72e-06,4.11e-06,4e-06,3.8e-06,4.12e-06,3.51e-06,6.74e-06],"winrateAvg":0.433516,"leadAvg":-0.314325,"scoreMeanAvg":-0.504457,"scoreStdevAvg":8.55027,"shorttermWinlossErrorAvg":0.214527,"shorttermScoreErrorAvg":1.20069,"ownership":[-61,-73,-86,-89,-89,-81,-65,-42,-12,-7,-18,-42,-57,-74,-78,-80,-72,-54,-32,-31,-82,-81,-92,-95,-94,-95,-26,-3,1,-29,-40,-65,-63,-81,-77,-79,-36,-13,-28,-7,-92,-93,92,-95,91,-39,55,0,-30,-70,-55,-84,98,-79,-80,-10,17,15,-9,93,93,93,92,92,-1,24,10,-16,-86,-84,-84,98,98,98,98,40,22,56,47,38,37,47,48,32,23,14,7,-1,-17,95,93,92,91,89,85,10,-6,11,3,14,31,47,41,41,45,-6,96,70,88,91,91,89,87,84,-14,-21,-71,-4,-7,31,52,59,73,99,100,95,99,90,90,91,89,85,79,-18,-20,-24,-20,-2,99,99,99,99,4,-63,99,90,89,90,91,89,83,62,-9,-24,-13,-44,-97,99,-97,-97,-97,-97,2,99,80,87,89,98,84,79,17,6,-18,-76,0,-98,-98,-95,-76,-42,-19,6,29,84,87,89,87,74,55,-3,43,6,-74,98,-6,-98,-98,-86,-42,-15,12,32,94,46,98,99,99,41,-55,69,97,97,98,98,-97,-75,-73,-71,-36,4,25,39,20,12,-56,36,-89,-70,95,94,-35,-96,98,97,-98,-97,-60,-2,8,22,37,-3,16,-36,-95,-83,-81,95,97,97,-96,3,-90,-11,-98,-98,-18,8,20,26,58,-78,-61,-78,-81,-81,96,96,97,-96,-43,-91,-5,95,-98,-33,50,12,13,-6,-19,-66,-80,-83,-80,97,96,-96,-96,94,94,95,94,-98,-98,-35,-18,36,-15,-48,-96,-82,-77,-76,-91,-91,-90,-96,-96,95,94,93,94,-98,-97,-97,34,-95,-75,-80,-73,-75,-73,-88,-88,-80,-86,-96,95,94,92,94,94,94,94,-95,-95,-83,-80,-75,-74,-73,-87,-85,-81,-80,-13,44,87,91,90,80,57,3,-27,-76,-82,-78,-75,-74,-73],"ownershipAllowedMAE":0.0302478})%"); + lines.push_back(R"%({"sample":{"board":".O.X.............../.OX.X....X.OXX...../..OX....XOX.XOXXXX./.OOX.X..XOX.XOOOOO./.XOX.O.XOO.OOO...../.OXX...XXO...XXOO../.OO.O..........XO../.XOO.......O..X.XO./.X.XO.......XX.XO.O/..X.X....XO.X.XOOO./..........XX.XOX.../...X....OX....O..../..X..OOOOOX.O.O.O../.X....XXOOX..X...../.......OXXX.XOXX.O./.OOOOO.OOO.OOOO.XO./.XXXXOXXO.....OXXXX/.....X..OX..XOXXOOX/.............O.XO.O/","hintLoc":"null","initialTurnNumber":181,"metadata":"939DC7B8CE2C80B1F21CB3E16DC6E096:191","moveLocs":["R5","F11","E12","N6","Q12","M13","M14","R12","F10","A3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.18,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":6.0,"policyOptimism":0.102,"pda":0.0,"policyMixture":[1.2e-05,0,0.00161,0,1.21e-05,1.22e-05,1.22e-05,1.54e-05,1.78e-05,1.73e-05,1.28e-05,1.22e-05,1.32e-05,1.33e-05,1.32e-05,1.28e-05,1.22e-05,1.19e-05,1.2e-05,1.18e-05,0,0,0,0,1.25e-05,1.46e-05,3.57e-05,0.000467,0,2.9e-05,0,0,0,1.34e-05,1.27e-05,1.08e-05,9.96e-06,1.12e-05,1.17e-05,1.17e-05,0,0,1.14e-05,1.32e-05,1.32e-05,2.45e-05,0,0,0,1.68e-05,0,0,0,0,0,0,0.0385,1.23e-05,0,0,0,1.53e-05,0,0.000229,0.000514,0,0,0,0.000471,0,0,0,0,0,0,1.6e-05,1.23e-05,0,0,0,0.0117,0,0.000189,0,0,0,1.48e-05,0,0,0,1.51e-05,1.22e-05,1.26e-05,1.15e-05,1.31e-05,1.29e-05,0,0,0,0.000744,0.0338,3.35e-05,0,0,0,1.49e-05,0,1.66e-05,0,0,0,0,1.21e-05,1.25e-05,1.65e-05,0,0,1.36e-05,0,2.78e-05,0.000829,4.05e-05,0.000555,2.51e-05,0.000166,0,0.0135,1.51e-05,1.22e-05,0,0,1.28e-05,1.24e-05,0.000873,0,0,0,0,2e-05,2.95e-05,6.24e-05,9.65e-05,0.000355,0.0168,0,1.95e-05,1.2e-05,0,0.392,0,0,1.24e-05,1.73e-05,0,9.2e-05,0,0,0,6.02e-05,0.00014,7.49e-05,0.106,8.83e-05,1.65e-05,0,0,0,0,0,1.18e-05,0,1.54e-05,1.72e-05,0,1.53e-05,0,0,0.000189,2.63e-05,0.000519,0,0,1.2e-05,0,0,0,0,0,0,1.22e-05,1.48e-05,5.85e-05,1.47e-05,1.55e-05,0.047,9.52e-05,1.95e-05,1.86e-05,0.0125,9.57e-06,0,0,1.2e-05,0,0,0,1.32e-05,1.23e-05,1.25e-05,1.49e-05,1.92e-05,1.27e-05,0,2.04e-05,1.54e-05,1.37e-05,1.25e-05,0,0,1.74e-05,0.00371,0.0739,3.57e-05,0,1.37e-05,1.43e-05,1.41e-05,1.32e-05,1.53e-05,1.49e-05,0,1.5e-05,3.34e-05,0,0,0,0,0,0,1.65e-05,0,7.76e-05,0,1.86e-05,0,1.4e-05,1.43e-05,2.26e-05,0,1.75e-05,0.0595,2.26e-05,1.44e-05,0,0,0,0,0,2.05e-05,0,0,0.0758,0.0734,1.62e-05,1.38e-05,1.32e-05,7.73e-05,6.78e-05,1.59e-05,1.44e-05,1.43e-05,1.24e-05,1.24e-05,0,0,0,0,0.00447,0,0,0,0,0,0,1.25e-05,2.14e-05,0,0,0,0,0,0.0019,0,0,0,0.000699,0,0,0,0,0.00554,0,0,0.00278,0,0,0,0,0,0,0,0,0,1.19e-05,1.57e-05,1.29e-05,1.19e-05,1.25e-05,0,0,0,0,0,1.29e-05,1.35e-05,1.38e-05,1.51e-05,8.65e-05,0,5.49e-05,0.00159,0,0,1.31e-05,1.36e-05,0,0,0,0,0,0,0,1.19e-05,1.42e-05,1.44e-05,1.69e-05,1.78e-05,1.53e-05,0.000502,0.013,2.83e-05,1.37e-05,1.31e-05,1.31e-05,1.27e-05,0,1.49e-05,0,0,1.86e-05,0,1.47e-05],"winrateAvg":0.366998,"leadAvg":-0.487835,"scoreMeanAvg":-0.489808,"scoreStdevAvg":3.96179,"shorttermWinlossErrorAvg":0.192197,"shorttermScoreErrorAvg":0.500544,"ownership":[99,99,81,-98,-98,-98,-98,-98,-98,-97,-98,-98,-99,-99,-99,-98,-96,-94,-86,99,99,-91,-91,-99,-98,-98,-98,-97,-98,-97,-97,-100,-100,-99,-99,-99,-89,-86,99,99,99,-99,-85,-97,-97,-98,-99,99,-99,-99,-100,100,-100,-100,-100,-100,74,99,99,99,-99,-53,-98,-94,-96,-99,99,-99,72,-100,100,100,100,100,100,76,99,99,99,-99,-16,27,-56,-99,99,99,3,100,100,100,-25,48,95,98,98,93,100,-99,-99,38,15,-10,-99,-98,99,47,100,21,-92,-91,100,100,99,98,39,100,100,33,100,49,0,-20,-1,31,-20,-56,-17,-54,-20,-21,100,99,99,15,-97,100,100,100,46,7,-9,1,17,-7,24,-33,-68,-87,21,23,100,100,-75,-98,36,-85,100,-5,14,-4,1,34,-13,-28,-99,-99,-30,-34,100,100,100,-93,-96,-99,-81,-87,82,22,-4,-12,-93,-4,-72,-100,-56,-61,100,100,100,100,-95,-96,-93,-21,36,43,23,16,7,-65,-99,-100,-59,-88,99,98,99,99,99,-95,-96,-95,-97,-6,41,49,58,100,-89,-86,-37,-18,48,99,98,98,99,98,-93,-96,-99,-26,11,100,100,100,100,100,-99,-51,-9,-43,99,74,99,97,96,-42,-98,-26,1,-32,97,96,97,100,100,-99,-82,-98,-99,18,-36,-4,95,90,20,28,31,34,16,76,97,100,-99,-99,-99,27,-98,99,-96,-96,98,98,72,22,100,100,100,100,100,31,100,100,100,-81,99,99,99,99,-50,-100,98,30,-99,-99,-99,-99,-99,100,-94,-93,100,98,98,98,98,98,99,-100,-100,-100,-100,-99,-99,-99,-99,-98,-98,-95,46,100,96,97,98,97,98,-100,-100,-100,-100,-100,-98,-98,-98,-97,-93,-67,16,69,96,97,97,97,97,98,-39,-100,-99,-100,-99],"ownershipAllowedMAE":0.0325768})%"); + lines.push_back(R"%({"sample":{"board":".................../.....X............./..XO.X..X..X.....O./..XO.XOOOO.OX..XXXO/...XOOX....O.....O./..X...X.......X.O../.....OX.......XO.../.....OX........O.X./.....OX......XXOO../.....O........OX.../..............OX.../.................../...X.............../..XOO...........OO./..XX......O.....OX./..XOOO..O.XO.OOOX../.XOO.X....O.O.XX.X./.XXO......XXX....../.................../","hintLoc":"null","initialTurnNumber":77,"metadata":"BE262EF9480B3BE08B109E6C09139F23:87","moveLocs":["K17","K12","G10","F9","L10","K10","G9","G8","H8","J9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.89e-06,5.1e-06,5.27e-06,5.49e-06,5.29e-06,5.54e-06,5.4e-06,5.37e-06,5.38e-06,5.47e-06,5.16e-06,5.42e-06,5.1e-06,5.28e-06,5.48e-06,5.43e-06,5.43e-06,5.31e-06,4.77e-06,5.01e-06,5.01e-06,5.26e-06,5.64e-06,5e-06,0,5.24e-06,5.76e-06,5.72e-06,6.08e-06,7.72e-06,6.54e-06,7.26e-06,6.03e-06,6.3e-06,6.68e-06,6.8e-06,6.62e-06,6.23e-06,4.98e-06,4.91e-06,0,0,5.01e-06,0,5.87e-06,5.95e-06,0,0,0.00167,0,9.13e-06,7.48e-06,6.19e-06,5.8e-06,6.8e-06,0,2.32e-05,4.89e-06,4.96e-06,0,0,3.29e-05,0,0,0,0,0,4.55e-05,0,0,7.07e-06,6.65e-06,0,0,0,0,4.86e-06,5.14e-06,5.56e-06,0,0,0,0,6.74e-06,8.31e-06,1.3e-05,7.9e-06,0,1.45e-05,6.72e-06,5.94e-06,5.13e-06,0.000199,0,6.04e-05,5.09e-06,5.47e-06,0,5.52e-05,1.42e-05,0.0026,0,6.19e-06,0.0249,0.0443,0.000438,2.08e-05,1.17e-05,6.27e-06,0,9.46e-06,0,8.63e-05,1.39e-05,5.2e-06,6.41e-06,1.78e-05,0.121,1.38e-05,0,0,6.11e-06,0.000134,0.126,0.000191,0.000104,2.94e-05,6.73e-06,0,0,7.65e-06,5.98e-06,6.65e-06,5.33e-06,7.34e-06,2.98e-05,0.000559,7.2e-06,0,0,5.81e-06,8.89e-05,0,0.000137,7.59e-05,7.92e-06,5.81e-06,6.3e-06,0,4.74e-06,0,5.26e-06,5.3e-06,7.35e-06,1.7e-05,4.26e-05,7.11e-06,0,0,6.21e-06,3.94e-05,0.000212,0.0103,6.63e-05,7.26e-06,0,0,0,0,4.14e-05,5.37e-06,5.26e-06,7.07e-06,8.63e-06,1.5e-05,6.4e-06,0,0,6.3e-06,0.0127,0,0,1.65e-05,2.56e-05,1.06e-05,0,0,8.78e-05,0.000182,5.37e-06,5.27e-06,6.59e-06,7.4e-06,1.13e-05,5.47e-06,0,0,0.0307,0,0.0722,0.0155,0.000164,9.1e-05,1.47e-05,0,0,8.79e-06,8.79e-06,5.46e-06,5.15e-06,5.97e-06,6.85e-06,6.79e-06,5.73e-06,0.37,0,0,0.00129,0.000189,0.000223,5.94e-05,4.7e-05,1.1e-05,0.161,1.13e-05,6.72e-06,6.26e-06,5.94e-06,5.1e-06,5.64e-06,5.54e-06,0,7.87e-06,1.2e-05,7.15e-05,6.19e-05,1.18e-05,1.66e-05,1.55e-05,1.73e-05,9.73e-06,8.6e-06,8.1e-06,7.92e-06,5.99e-06,6.47e-06,5.98e-06,5.11e-06,5.06e-06,0,0,0,1.25e-05,3.78e-05,1.26e-05,7.74e-06,7.56e-06,8.35e-06,7.37e-06,6.98e-06,6.84e-06,6.69e-06,6.52e-06,0,0,6.98e-06,4.95e-06,4.95e-06,0,0,3.13e-05,7.96e-06,7.34e-06,8.13e-06,7.5e-06,1.01e-05,0,6.87e-06,6.36e-06,5.75e-06,5.4e-06,5.9e-06,0,0,5.55e-06,5.1e-06,4.93e-06,0,0,0,0,7.26e-06,7.41e-06,0,9.12e-06,0,0,5.46e-06,0,0,0,0,4.86e-06,5.29e-06,4.6e-06,0,0,0,4.44e-06,0,5.87e-06,6.67e-06,6.75e-06,7.22e-06,0,6.64e-06,0,5.62e-06,0,0,4.75e-06,0,4.92e-06,4.66e-06,0,0,0,5.74e-06,5.42e-06,5.85e-06,6.1e-06,6.04e-06,5.56e-06,0,0,0,5.13e-06,5.19e-06,5.28e-06,4.98e-06,4.92e-06,4.85e-06,5.11e-06,4.94e-06,5.07e-06,5.3e-06,5.61e-06,5.66e-06,5.19e-06,5.35e-06,5.4e-06,5.22e-06,4.96e-06,4.82e-06,4.87e-06,5.12e-06,4.97e-06,4.96e-06,4.74e-06,4.95e-06,5.02e-06,7.35e-06],"winrateAvg":0.536886,"leadAvg":0.73634,"scoreMeanAvg":0.63021,"scoreStdevAvg":16.5983,"shorttermWinlossErrorAvg":0.17163,"shorttermScoreErrorAvg":1.851,"ownership":[-74,-69,-67,-61,-63,-62,-57,-53,-54,-54,-52,-50,-44,-35,-22,-6,16,29,38,-76,-77,-66,-59,-51,-88,-40,-54,-60,-61,-60,-55,-49,-37,-30,-10,8,45,49,-77,-80,-91,-1,-45,-88,-1,5,-75,-74,-18,-72,-40,-37,-29,-37,-13,70,68,-75,-82,-90,4,0,-88,69,70,71,71,16,74,-58,-25,-35,-72,-71,-71,80,-68,-74,-82,-83,54,54,-36,22,31,36,45,75,21,-7,-21,-25,-12,85,78,-56,-66,-89,-14,19,23,-34,8,16,10,15,30,10,-15,-68,-3,90,79,76,-39,-46,-34,-17,32,65,-32,9,24,10,33,15,7,-19,-67,92,83,81,72,-24,-28,-17,0,21,64,-30,16,36,79,24,6,-1,-25,32,91,78,61,68,-15,-17,-7,3,17,63,-30,16,40,42,20,2,-11,-59,-58,91,91,76,61,-13,-14,-3,1,11,62,-29,21,50,77,-32,-1,4,-21,29,11,59,46,54,-18,-20,-16,-8,-9,62,-29,10,76,19,5,0,5,8,32,11,33,43,45,-32,-35,-26,-29,-42,-36,77,-10,31,22,12,11,8,18,8,32,38,44,46,-52,-57,-62,-73,-11,8,65,20,22,25,22,21,23,27,33,39,53,55,58,-73,-77,-95,53,59,25,34,26,28,29,34,35,35,38,37,54,92,92,-1,-84,-91,-95,-95,-30,35,34,32,40,47,91,57,47,54,62,81,93,-60,-3,-92,-95,-95,81,81,82,38,42,91,62,45,94,79,96,96,97,-90,-62,-53,-94,-95,81,81,62,16,37,27,31,11,68,-19,91,21,-95,-95,-89,-92,-65,-92,-94,-95,80,44,35,29,20,-8,-15,-94,-94,-94,-88,-92,-91,-88,-84,-81,-91,-90,-38,-11,51,33,25,8,-14,-45,-64,-83,-89,-90,-91,-90,-89,-88,-84],"ownershipAllowedMAE":0.0388484})%"); + lines.push_back(R"%({"sample":{"board":".................../..........XOO....../...OOO.....XO....../..O.X......X.O.O.../OOXXO.......X...O../XXOOO.O........XXO./X.XXX............X./.X..XOO.OO........./.OXXOOX.XO......X../OXXOXXX.X.....XXO../..XO...O..O....OXX./...X.........OOOX../..X....XXO....XOOX./.X....XO.XX.XXXO.O./.OXX..XOOX.X.O.XOO./.OOX..XXOOXXO.X.O../..O..O..O.OOXX.XXO./....O.XXOO..OOX..../....X...X........../","hintLoc":"null","initialTurnNumber":121,"metadata":"4D3AD533992F82996924A6E6B3BE5946:131","moveLocs":["B2","F13","H15","G15","G16","G13","N9","F15","D16","S15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.68,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.73e-05,4.83e-05,4.86e-05,4.96e-05,5.11e-05,5.41e-05,5.77e-05,5.83e-05,6.16e-05,6.33e-05,8.92e-05,5.73e-05,5.23e-05,5.33e-05,5.46e-05,5.48e-05,5.59e-05,5.48e-05,4.86e-05,4.75e-05,4.86e-05,4.9e-05,5.09e-05,5.18e-05,5.65e-05,6.25e-05,7.03e-05,0.000215,0.000207,0,0,0,5.54e-05,6.07e-05,6.28e-05,6.44e-05,6.49e-05,5.88e-05,4.79e-05,4.77e-05,4.85e-05,0,0,0,5.85e-05,7.46e-05,0.000211,0.0246,0.0114,0,0,5.54e-05,6.29e-05,6.58e-05,9.04e-05,7.72e-05,6.07e-05,4.8e-05,4.93e-05,0,0,0,5.81e-05,0,8.24e-05,0.000593,0.00226,0.000232,0,0.000536,0,6.83e-05,0,7.55e-05,0.758,6.5e-05,0,0,5e-05,4.85e-05,0,0,0,0,0.000453,0.00153,0.059,0.000476,0,0.0397,0.000458,7.06e-05,0,0,6.63e-05,0,0,0,0,0,0.000137,0,0.000219,0.000669,0.000755,0.000758,0.000841,0.0011,0.0519,0.00664,0,0,0,6.16e-05,0,0,0,0,0,0,0,7.7e-05,7.32e-05,7.58e-05,0.000389,0.000698,0.00448,0.00138,0.000278,6.75e-05,6.12e-05,0,5.47e-05,0.00025,0,4.9e-05,5.02e-05,0,0,0,0.000144,0,0,7.16e-05,0.000413,0.000934,0.000698,0.00011,6.47e-05,7.99e-05,5.64e-05,5.13e-05,4.85e-05,0,0,0,0,0,0,0.00026,0,0,6.75e-05,0.000136,0.000366,0.000614,7.32e-05,7.04e-05,0,0.000692,5.45e-05,0,0,0,0,0,0,0,0.000146,0,0.000132,6.84e-05,6.86e-05,6.79e-05,0.000145,0,0,0,0.00281,0.000214,4.94e-05,4.84e-05,0,0,5.21e-05,5.27e-05,5.33e-05,0,6.41e-05,6.5e-05,0,5.71e-05,0,5.41e-05,5.81e-05,0,0,0,0.000468,5.5e-05,5.16e-05,5.01e-05,0,5.08e-05,5.3e-05,5.45e-05,5.77e-05,6.28e-05,6.59e-05,6.17e-05,6.18e-05,5.41e-05,0,0,0,0,0.000105,0.000154,5.85e-05,5.96e-05,0,5e-05,5.05e-05,5.17e-05,5.66e-05,0,0,0,6.44e-05,7.9e-05,5.79e-05,5.25e-05,0,0,0,0,6.74e-05,6.75e-05,0,5.46e-05,5.41e-05,5.07e-05,5.3e-05,0,0,5.77e-05,0,0,5.98e-05,0,0,0,0,4.86e-05,0,5.58e-05,5.3e-05,0,0,0,5.57e-05,5.6e-05,0,0,0,0,0,0,5.11e-05,0,0.00183,0,0,0,4.9e-05,4.78e-05,0,0,0,5.72e-05,5.59e-05,0,0,0,0,0,0,0,0.00309,0,0.0056,0,4.77e-05,4.98e-05,4.97e-05,4.37e-05,0,5.31e-05,5.44e-05,0,0.000568,0.000891,0,3.2e-05,0,0,0,0,0,0,0,0,5e-05,4.87e-05,0,5.17e-05,5.48e-05,0,5.77e-05,0,0,0,0,5.12e-05,5.29e-05,0,0,0,5.69e-05,9.04e-05,5.87e-05,5.47e-05,4.6e-05,5.22e-05,5.14e-05,5.4e-05,0,5.55e-05,5.07e-05,5.13e-05,0,5.6e-05,5.02e-05,5.44e-05,5.48e-05,5.04e-05,6.12e-05,5.24e-05,5.76e-05,5.66e-05,4.98e-05,3.99e-05],"winrateAvg":0.0385381,"leadAvg":-3.12251,"scoreMeanAvg":-4.14852,"scoreStdevAvg":7.68358,"shorttermWinlossErrorAvg":0.0940625,"shorttermScoreErrorAvg":1.30554,"ownership":[98,97,96,93,88,72,56,38,30,28,47,59,88,91,88,84,78,74,69,98,98,97,98,95,88,58,44,35,46,18,98,98,91,88,84,78,69,62,99,98,99,100,100,100,63,37,19,33,30,-56,98,90,86,84,74,64,34,99,99,100,100,33,38,93,36,7,-12,7,-62,7,95,46,93,68,81,-15,100,100,99,99,99,-24,-27,72,-19,-7,10,-28,-69,7,5,-51,68,-86,-48,-98,-99,100,100,100,-12,43,8,-2,-2,-3,-14,-25,13,-20,-97,-98,-85,-93,-98,-98,-100,-100,-100,-100,-100,-28,12,21,4,-9,-15,1,-16,-48,-81,-98,-90,-98,-100,-99,-99,-100,-9,-5,-7,89,89,24,-1,0,-2,-21,-45,-72,-93,-93,-99,-98,-100,-100,-11,-10,-100,-34,-98,88,34,10,6,4,-28,-58,-99,-96,-94,-96,-100,-100,-97,-100,-100,-100,-76,-99,-21,35,21,15,-7,-98,-98,-95,-95,-90,-98,-99,-100,-97,-98,-87,-73,-48,-53,0,86,50,94,49,6,97,-96,-96,-67,-97,-98,-99,-100,-94,-88,-77,-72,-27,9,31,4,35,97,97,97,-96,-81,6,-97,-98,-100,-97,-95,-92,-92,-99,-99,35,-22,1,-30,-16,-99,97,97,-78,64,-16,-99,-99,-97,-96,-94,-100,98,-14,-99,-99,-63,-100,-100,-100,97,97,97,81,8,98,-100,-100,-83,-78,-100,98,97,-99,-97,-100,-98,-94,-95,-95,97,98,94,95,98,98,-100,14,20,-100,-100,97,97,-100,-100,-96,-97,-99,18,97,95,94,97,98,98,54,61,75,-73,15,97,97,97,97,-97,-98,-97,-98,-97,94,91,97,98,88,32,92,-63,-99,-99,97,97,97,95,96,94,-98,-67,-7,-8,89,96,95,37,-24,-70,-69,-84,-64,-66,53,93,94,66,-40,-78,-61,-29,-3,28],"ownershipAllowedMAE":0.0397845})%"); + lines.push_back(R"%({"sample":{"board":".OXX........../O.OX.......XX./..OX......XO../..OX......XO../.XOX.......O../.OXXX....XXO../..OOXOX..XOX../.O..OX..XOOX../..O.OX..XO.OX./....OX.OOO.O../...XXO.XO...X./.....O.OX...../....X...X.O.../..O.........O./..OX...OXX.XX./..O.XX.XOOX.../...OOX.XXOX.O./........XOOO../.........O..../","hintLoc":"null","initialTurnNumber":96,"metadata":"9BA5655819A8E55BB3D4DD9D875342CB:106","moveLocs":["N10","N14","N12","M8","G7","N17","O17","O18","O19","O16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.2,"xSize":14,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":6.5,"policyOptimism":0.815,"pda":0.0,"policyMixture":[0,0,0,0,2.49e-06,2.61e-06,2.52e-06,2.52e-06,2.4e-06,2.55e-06,3.14e-06,2.96e-06,3.14e-06,0,0,7.6e-05,0,0,2.44e-06,2.51e-06,2.63e-06,2.62e-06,2.68e-06,7.11e-06,5.49e-06,0,0,0.733,6.2e-05,0.00276,0,0,2.38e-06,2.43e-06,2.5e-06,2.61e-06,2.69e-06,2.62e-06,0,0,0,0,7.87e-06,0.000485,0,0,2.44e-06,2.45e-06,2.47e-06,2.68e-06,2.64e-06,2.71e-06,0,0,4.37e-05,0,6.05e-06,0,0,0,2.43e-06,2.58e-06,2.56e-06,2.63e-06,2.59e-06,3.04e-06,0.00026,0,0.0029,0.00329,0.00107,0,0,0,0,3.24e-06,2.78e-06,2.74e-06,2.71e-06,0,0,0,0,0.00358,4.64e-05,0.000196,0,0,0,0,0,3.26e-06,2.89e-06,0,0,0,0.00769,0.0346,2.44e-06,0,2.36e-06,7.08e-06,0,0,2.91e-06,3.34e-06,0,0,0,0,0,3.55e-05,2.72e-06,2.49e-06,0,4.97e-06,0,0,2.9e-06,3.1e-06,0,0,4.26e-06,0,0,2.9e-06,2.68e-06,3.1e-06,2.99e-06,2.77e-06,0,0,3.39e-06,0,0,0,7.67e-06,0,0,3.24e-06,2.73e-06,3.15e-06,3.19e-06,0,0,0,0.00948,0,0,2.73e-06,9.46e-06,0.00154,0,9.54e-06,2.79e-06,3.12e-06,3.28e-06,3.2e-06,5.04e-06,0,3.34e-06,0,0,0.000187,6.95e-06,0,0.13,0.0306,2.74e-06,3.51e-06,4.57e-06,7.28e-06,0,6.06e-06,0,4.13e-06,0,3.3e-06,0,3.94e-06,0.0282,7.92e-05,2.66e-06,2.92e-06,0,4.72e-06,3.33e-06,3.2e-06,3.51e-06,3.4e-06,3.12e-06,2.93e-06,3.23e-06,3.87e-05,0,0.00805,2.78e-06,2.71e-06,0,0,3.01e-06,2.94e-06,3.15e-06,0,0,0,2.73e-06,0,0,3.25e-06,2.64e-06,2.82e-06,0,3.02e-06,0,0,2.64e-06,0,0,0,0,2.21e-06,5e-06,6.9e-06,2.59e-06,2.9e-06,3.15e-06,0,0,0,2.45e-06,0,0,0,0,1.28e-05,0,6.28e-05,2.63e-06,3.06e-06,3.83e-06,3.3e-06,4.26e-06,3.34e-06,2.78e-06,2.58e-06,0,0,0,0,0.000594,3.04e-05,2.54e-06,2.58e-06,2.81e-06,3.07e-06,2.82e-06,3.07e-06,2.74e-06,2.58e-06,2.58e-06,0,2.49e-06,0.000123,0.000341,1.19e-05,1.06e-05],"winrateAvg":0.186254,"leadAvg":-3.83105,"scoreMeanAvg":-4.66462,"scoreStdevAvg":10.4548,"shorttermWinlossErrorAvg":0.336988,"shorttermScoreErrorAvg":3.92312,"ownership":[76,76,-97,-97,-94,-92,-90,-89,-89,-89,-88,-87,-81,-87,75,76,74,-97,-92,-90,-90,-90,-89,-90,-89,-90,-90,-82,74,72,72,-96,-90,-89,-90,-89,-88,-90,-96,-6,-7,-83,72,72,73,-96,-89,-88,-88,-88,-86,-85,-96,-6,-15,-16,73,66,76,-96,-90,-86,-84,-84,-84,-89,-58,-5,-10,-19,73,85,-96,-97,-97,-82,-80,-79,-77,-98,-98,-7,-8,-17,85,87,94,94,-96,-75,-92,-49,-62,-97,93,-45,-28,-25,81,95,91,90,92,-84,3,-8,-67,93,93,-46,-44,-29,68,72,95,68,92,-82,18,40,-59,93,90,90,-43,-23,44,44,39,19,92,-81,33,93,93,93,79,89,-42,-6,31,33,18,-30,-28,46,16,4,92,30,64,50,-41,14,28,30,20,1,5,46,-19,13,-90,-27,52,88,21,36,43,41,13,-21,-68,29,-85,-46,-91,2,86,67,58,49,61,75,97,-3,-32,-48,-68,-83,-70,9,33,-12,63,13,79,89,97,-87,-67,-65,-88,-80,-88,-87,-74,-81,-81,-32,84,92,97,-2,-98,-98,-91,-97,89,88,-79,-24,2,-6,88,89,91,95,95,-98,-88,-97,-97,87,-77,2,88,57,88,88,84,88,23,-36,-77,-80,-97,86,86,87,85,86,87,85,79,53,20,-30,-51,-58,26,86,85,86,84,86],"ownershipAllowedMAE":0.0640276})%"); + lines.push_back(R"%({"sample":{"board":".................../.XO.......OOX....../.XOXXXX.XXOXXO.O.../OXXOXOOXXOXOOOO..../.OOOOX.XOOXX.X..X../X..OXOOOOXOX......./.OO.XXXXXXOO......./OO.X.....O........./OOX.O............../XXXXOX............./OOOOXX............./.X..O............../..XO.O............./.XXO..XO.........../OOX....OX........../OXXXXXXXO......O.../.OOOOXOO.........../.....O............./.................../","hintLoc":"null","initialTurnNumber":44,"metadata":"B8CD34EFDECDD4A94E5BF1CAE7D1B6C1:54","moveLocs":["G7","K5","K4","H7","J6","G5","H8","J7","K6","J8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.23,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":18.0,"policyOptimism":0.546,"pda":-0.716,"policyMixture":[1.95e-05,0.000693,0.000474,3.13e-05,1.12e-05,4.81e-06,4.38e-06,4.44e-06,4.44e-06,4.39e-06,4.58e-06,4.76e-06,4.75e-06,4.61e-06,4.32e-06,4.33e-06,4.26e-06,4.34e-06,4.1e-06,0.000854,0,0,0.000458,6.58e-05,4.88e-06,4.46e-06,4.32e-06,4.29e-06,4.39e-06,0,0,0,4.52e-06,4.42e-06,4.35e-06,4.57e-06,4.4e-06,4.51e-06,0.000452,0,0,0,0,0,0,4.4e-06,0,0,0,0,0,0,4.32e-06,0,4.55e-06,5.23e-06,4.7e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.4e-06,4.62e-06,4.91e-06,4.69e-06,0.000139,0,0,0,0,0,2.01e-05,0,0,0,0,0,0.000483,0,5.76e-06,4.76e-06,0,4.84e-06,4.56e-06,0,0.000436,4.74e-06,0,0,0,0,0,0,0,0,0,0.000594,1.91e-05,5.5e-06,5.24e-06,4.75e-06,5.3e-06,4.64e-06,1.68e-05,0,0,8.9e-05,0,0,0,0,0,0,0,0,7.75e-06,7.75e-06,5.22e-06,4.99e-06,5.26e-06,5.47e-06,4.6e-06,0,0,0.000215,0,0.0296,6.63e-06,5.76e-06,5.33e-06,5.76e-06,0,4.82e-06,4.75e-06,5.01e-06,5.15e-06,5.03e-06,5.1e-06,5.23e-06,5.51e-06,4.47e-06,0,0,0,0.000563,0,0.000196,2.38e-05,6.93e-06,6.16e-06,5.6e-06,5.78e-06,5.52e-06,5.41e-06,5.19e-06,5.01e-06,5.14e-06,5.11e-06,5.43e-06,4.41e-06,0,0,0,0,0,0,0.0461,0.00263,1.19e-05,6.72e-06,6.16e-06,6.07e-06,5.47e-06,5.19e-06,5.08e-06,5.06e-06,5.07e-06,5.43e-06,4.44e-06,0,0,0,0,0,0,0.228,0.484,0.195,9.03e-06,6.55e-06,6.32e-06,5.48e-06,5.18e-06,5.09e-06,5.03e-06,5.13e-06,5.43e-06,4.46e-06,0.00023,0,1.03e-05,0.000169,0,3.07e-05,0.00117,0,0,1.12e-05,1.02e-05,6.2e-06,5.58e-06,5.27e-06,5.14e-06,5.1e-06,5.19e-06,5.45e-06,4.51e-06,8.27e-06,4.67e-06,0,0,4.55e-06,0,0,0,0,1.38e-05,1.24e-05,7.07e-06,5.69e-06,5.31e-06,5.16e-06,5.11e-06,5.27e-06,5.48e-06,4.53e-06,0.00136,0,0,0,9.41e-06,0.0034,0,0,0,0,1.12e-05,7.45e-06,5.74e-06,5.26e-06,5.14e-06,5.19e-06,5.19e-06,5.33e-06,4.51e-06,0,0,0,5.32e-06,1.27e-05,5.06e-06,0,0,0,0,0.00136,7.16e-06,5.39e-06,5.21e-06,5.01e-06,5.27e-06,5.27e-06,5.33e-06,4.56e-06,0,0,0,0,0,0,0,0,0,0,5.65e-06,5.37e-06,5.29e-06,5.21e-06,5.31e-06,0,5.34e-06,5.36e-06,4.62e-06,7.41e-05,0,0,0,0,0,0,0,4.9e-06,4.56e-06,4.68e-06,4.84e-06,5.18e-06,5.31e-06,5.18e-06,5.45e-06,5.22e-06,5.29e-06,4.52e-06,4.52e-06,4.51e-06,4.47e-06,5.05e-06,4.81e-06,0,4.61e-06,4.89e-06,4.66e-06,5.08e-06,4.75e-06,5.06e-06,5.23e-06,5.26e-06,5.3e-06,5.31e-06,5.31e-06,5.16e-06,4.72e-06,4.35e-06,4.39e-06,4.56e-06,4.82e-06,4.84e-06,4.3e-06,4.74e-06,4.58e-06,4.57e-06,4.71e-06,4.71e-06,4.53e-06,4.5e-06,4.47e-06,4.57e-06,4.62e-06,4.6e-06,4.67e-06,4.06e-06,5.37e-06],"winrateAvg":0.549507,"leadAvg":-0.627874,"scoreMeanAvg":1.23016,"scoreStdevAvg":18.157,"shorttermWinlossErrorAvg":0.33225,"shorttermScoreErrorAvg":4.58965,"ownership":[-83,-88,-91,-94,-94,-93,-91,-84,-71,-50,-32,63,81,84,77,66,53,44,36,-79,-90,-89,-95,-96,-96,-95,-91,-80,-38,79,81,77,84,79,68,54,39,26,-81,-90,-89,-100,-100,-100,-100,-96,-100,-99,79,75,78,97,88,91,31,12,17,-79,-91,-92,-75,-100,-96,-96,-100,-100,-90,-92,96,97,97,96,36,19,11,2,-80,-78,-77,-77,-78,-98,-97,-100,-91,-90,-91,-91,13,-53,17,14,-37,-10,-2,-79,-81,-80,-76,-100,-93,-92,-91,-91,-99,50,-91,-18,-12,8,14,5,0,-2,-80,-78,-78,-88,-100,-100,-100,-100,-99,-99,53,53,5,7,6,9,12,5,2,-79,-79,-85,-98,-69,-68,-52,-39,-22,43,21,13,8,7,6,7,8,6,5,-80,-78,-97,-74,-54,-59,-10,2,0,-1,4,3,4,4,4,6,9,7,7,-97,-97,-97,-96,-51,-63,11,29,4,-9,-2,1,4,4,5,7,9,9,8,57,57,56,53,-63,-63,29,36,-13,-9,0,7,8,7,6,7,8,9,9,-37,-51,-6,53,61,21,40,60,-42,-1,18,19,14,10,8,9,9,10,10,-39,-42,-54,61,33,68,67,-44,-42,31,42,35,20,13,10,11,12,12,11,-33,-52,-53,60,8,-1,-54,88,88,88,71,14,17,13,12,16,17,15,15,85,85,-52,-8,-11,-21,-55,87,8,4,1,14,13,16,19,28,29,21,18,88,-53,-53,-52,-53,-54,-55,-55,85,85,27,14,16,20,28,78,32,23,21,88,92,92,92,92,-55,91,91,72,67,50,22,20,21,31,35,26,24,21,87,88,89,89,87,92,87,82,70,67,48,30,24,22,24,21,24,20,22,88,89,89,90,89,87,81,76,68,57,44,31,24,21,21,22,21,22,22],"ownershipAllowedMAE":0.0625881,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":".................../............X....../.....XO.....XOO..../.X.O.XXXX.O..X.XO../..X....O..XX.X.XXX./..XO.O.......OO.O../..O......OOO.....O./..........XXO....../....XXO.X...XO.X.../....OX...OXXO.O..../.....O.X..XO.OX..../...........OOOX.O../........O.....OO.../.................../...X.............../........X.....OOX../...X..........OXO../.................../.................../","hintLoc":"null","initialTurnNumber":77,"metadata":"6C74443C639F112EC769F2339AE38206:87","moveLocs":["D15","D10","C17","B13","C12","B12","C11","B11","C10","E9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.38,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1button1","komi":10.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.15e-06,5.87e-06,6.16e-06,6.3e-06,6.48e-06,6.48e-06,6.54e-06,5.77e-06,5.59e-06,5.39e-06,5.61e-06,5.64e-06,5.91e-06,5.72e-06,5.98e-06,5.45e-06,5.34e-06,5.74e-06,5.24e-06,6.84e-06,8.93e-06,6.59e-06,1.27e-05,0.000224,2.01e-05,6.76e-06,6.46e-06,5.94e-06,6.02e-06,6e-06,6.13e-06,0,6.53e-06,5.51e-06,5.98e-06,6.8e-06,1.06e-05,6.22e-06,8.85e-06,0.122,0,5.57e-06,9.15e-06,0,0,5.79e-06,5.82e-06,6.06e-06,5.75e-06,5.88e-06,0,0,0,1.18e-05,8.52e-06,7.5e-06,5.78e-06,5.52e-06,0,2.07e-05,0,5.92e-06,0,0,0,0,1.39e-05,0,7.79e-06,9.9e-06,0,2.39e-05,0,0,6.76e-06,5.63e-06,7.62e-06,8.12e-06,0,0,6.16e-06,7.85e-06,6.82e-06,0,7.87e-06,0.0288,0,0,1.41e-05,0,0.000101,0,0,0,6.26e-06,1.28e-05,2.86e-05,0,0,6.75e-06,0,7.25e-06,8.08e-06,7.13e-06,6.21e-06,5.52e-06,6.87e-06,3.12e-05,0,0,6.67e-06,0,6.86e-06,6.25e-06,6.18e-06,0,0,1.29e-05,0.0519,0.000215,0.000246,2.63e-05,7.89e-06,0,0,0,6.66e-06,6.13e-06,5.35e-06,6.81e-06,6.33e-06,0,5.96e-06,6.04e-06,0,0,6.26e-06,0.0103,0.0955,0.0521,8.55e-05,2.74e-05,1.66e-05,0,0,0,5.98e-06,5.71e-06,5.43e-06,6.03e-06,5.87e-06,5.7e-06,7.52e-06,0,0,7.69e-06,0,0,0,1.09e-05,0,7.19e-05,7.67e-06,0.000906,0,0,5.45e-06,0,5.55e-06,6e-06,5.73e-06,7.18e-06,0.261,0,0,0,0,6.8e-05,1.02e-05,3.99e-05,0,0,0,0,5.15e-06,0,5.53e-06,5.58e-06,5.53e-06,5.68e-06,6.59e-06,8.99e-05,0.206,2.05e-05,0,0,1.49e-05,0,4.67e-05,1.33e-05,0,0,5.22e-06,0,0,5.18e-06,5.43e-06,5.65e-06,5.53e-06,6.87e-06,3.31e-05,0.16,0.00258,3.41e-05,6.6e-05,2.21e-05,4.56e-05,1.78e-05,1.48e-05,1.35e-05,0,0,0,0,5.29e-06,0,5.62e-06,5.61e-06,6.74e-06,2.97e-05,0.000511,1.29e-05,1.58e-05,6.69e-05,6.03e-05,1.01e-05,0,9.78e-06,7.43e-06,5.95e-06,5.44e-06,5.47e-06,0,0,5.68e-06,5.5e-06,5.61e-06,6.46e-06,1.78e-05,7.62e-05,0.000158,3.41e-05,7.07e-05,7.25e-05,8.01e-05,1.19e-05,1.22e-05,8.68e-06,6.91e-06,5.97e-06,5.6e-06,5.71e-06,5.6e-06,5.36e-06,5.73e-06,5.46e-06,6.27e-06,4.73e-05,7.92e-05,0,9.29e-05,4.21e-05,8.22e-05,0.000114,3.48e-05,1.19e-05,9.62e-06,7.81e-06,6.64e-06,5.8e-06,5.76e-06,5.67e-06,5.6e-06,5.41e-06,5.48e-06,6.22e-06,1.19e-05,0.00092,9.19e-05,0.000259,5.02e-05,0.000123,0.000105,0,2.39e-05,1.88e-05,9e-06,6.96e-06,5.9e-06,0,0,0,5.6e-06,5.31e-06,6.12e-06,1.2e-05,0.000224,0,0.000459,5.19e-05,0.000444,8.24e-05,8.89e-05,6.75e-05,3.63e-05,1.12e-05,7.48e-06,5.86e-06,0,0,0,5.65e-06,5.42e-06,6.33e-06,9.16e-06,1.33e-05,0.00051,1.67e-05,1.76e-05,2.24e-05,5.2e-05,0.000264,7.11e-05,2.4e-05,9.32e-06,7.24e-06,6.34e-06,5.63e-06,5.44e-06,5.3e-06,5.67e-06,5.34e-06,4.99e-06,6.38e-06,6.7e-06,6.72e-06,6.68e-06,6.49e-06,6.61e-06,6.97e-06,7.12e-06,6.88e-06,6.62e-06,6.25e-06,6.11e-06,5.78e-06,5.69e-06,5.71e-06,5.24e-06,5.4e-06,4.96e-06,6.13e-06],"winrateAvg":0.414773,"leadAvg":-0.654894,"scoreMeanAvg":-1.01789,"scoreStdevAvg":10.7872,"shorttermWinlossErrorAvg":0.172834,"shorttermScoreErrorAvg":1.19577,"ownership":[37,47,47,31,1,-16,-57,-67,-78,-84,-87,-91,-94,-94,-93,-92,-91,-91,-91,21,46,57,19,13,-69,-76,-81,-85,-86,-87,-90,-99,-93,-92,-91,-92,-90,-92,-3,7,85,37,-35,-98,-75,-89,-89,-87,-84,-87,-99,-88,-89,-94,-93,-92,-92,-44,-79,40,89,-21,-98,-98,-98,-98,-82,-75,-83,-89,-99,-95,-99,-90,-93,-93,-77,-78,-83,90,21,0,-21,52,-27,18,-95,-95,-53,-99,4,-99,-99,-99,-84,-78,-83,-83,90,36,76,16,17,6,13,-7,4,-44,65,68,-53,65,-66,-50,-77,-83,83,67,-5,25,10,8,17,78,76,73,-21,21,48,54,56,77,-18,-60,-83,84,7,-16,-12,-2,5,0,20,-35,-35,87,47,53,56,61,62,61,-29,-85,84,-2,-92,-92,27,-18,-67,-9,-5,61,50,98,69,43,65,71,69,9,39,83,-83,-77,-92,-38,-37,-17,33,-43,-42,99,94,97,69,75,76,77,23,12,16,-26,-85,-11,-44,-82,-18,-14,-44,99,96,100,83,85,82,85,83,15,6,8,-16,-29,-32,-18,-12,-4,10,32,100,100,100,86,94,100,91,86,3,-3,-10,-19,-21,-13,-8,-1,56,5,20,39,52,71,100,100,92,89,87,-12,-20,-25,-28,-23,-15,-10,-11,-2,8,5,18,30,45,65,86,87,88,86,-26,-28,-54,-90,-33,-23,-20,-18,-19,-9,0,11,23,41,64,86,87,85,84,-37,-46,-51,-57,-37,-25,-26,-33,-81,-29,-12,3,17,43,99,99,79,83,82,-46,-49,-59,-90,-32,-28,-24,-37,-42,-38,-33,-3,15,45,99,78,89,80,81,-50,-54,-59,-55,-47,-32,-26,-28,-18,-21,-8,8,22,47,81,82,82,79,80,-54,-54,-53,-50,-42,-32,-27,-23,-22,-17,-8,6,26,50,68,78,80,80,80],"ownershipAllowedMAE":0.046186})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...X.........O...../.........O.....X.../...X.............../.................../.................../.................../.................../.................../.................../.................../.................../.X................./...O.............../..XO.........XX.O../..XO.........XOO.../.................../.................../","hintLoc":"null","initialTurnNumber":17,"metadata":"C8AC7404590D0F632FA6AD5B2DB0C4A4:27","moveLocs":["R6","K4","H3","Q14","R12","P17","O16","M18","M17","L17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.91,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":7.0,"policyOptimism":0.352,"pda":0.0,"policyMixture":[2.76e-06,3.04e-06,3.1e-06,3.09e-06,3.11e-06,3.05e-06,3.08e-06,3.19e-06,3.34e-06,3.45e-06,3.56e-06,4.28e-06,3.8e-06,3.57e-06,3.13e-06,3.61e-06,3.17e-06,3.13e-06,2.68e-06,3.01e-06,4.34e-06,5.61e-06,0.000152,5.47e-06,4.89e-06,4.48e-06,4.97e-06,1.06e-05,8.17e-05,0.000403,0,0.000279,3.37e-05,0.133,2.63e-05,6.38e-05,4.59e-06,3.13e-06,2.98e-06,4.85e-06,0.00012,0,0.000118,7.34e-06,1.27e-05,2.46e-05,2.96e-05,0.000425,0,0,3.86e-06,0,0,4.9e-05,0.343,5.12e-06,3.03e-06,3.06e-06,5.16e-06,0.000263,0.000111,0.000185,9.97e-06,1.37e-05,2.61e-05,5.89e-06,0,0.271,0.243,4.47e-06,0,0.000201,0,2.74e-05,1.15e-05,3.12e-06,3.1e-06,9e-06,4.46e-05,0,2.61e-05,6.83e-06,1.02e-05,1.01e-05,7.16e-06,6.32e-06,2.86e-05,0.000357,7.99e-06,4.34e-06,0.000265,9.08e-05,0.00289,3.27e-05,3.23e-06,3.09e-06,4.85e-06,1.99e-05,5.51e-05,1.05e-05,8.37e-06,8.64e-06,9.75e-06,1.08e-05,2.59e-05,2.14e-05,2.36e-05,2.81e-05,3.97e-05,2.91e-05,0,2.39e-05,3.77e-05,3.25e-06,3.05e-06,4.92e-06,2.51e-05,7.76e-06,6.61e-06,6.71e-06,7.92e-06,8.67e-06,1.07e-05,1.25e-05,1.23e-05,1.42e-05,2.55e-05,1.96e-05,6.4e-05,3.72e-05,4.59e-06,5.11e-06,3.07e-06,3.04e-06,4.35e-06,1.17e-05,6.8e-06,5.71e-06,6.07e-06,6.55e-06,6.79e-06,7.49e-06,8.22e-06,8.29e-06,8.55e-06,1.25e-05,1.75e-05,2.73e-05,4.66e-06,0,3.98e-06,3.17e-06,3.02e-06,4.24e-06,5.99e-06,5.81e-06,5.5e-06,5.83e-06,6.01e-06,6.08e-06,6.2e-06,6.39e-06,6.57e-06,6.79e-06,7.17e-06,7.34e-06,6.33e-06,5.31e-06,4.42e-06,4.09e-06,2.99e-06,2.97e-06,4.11e-06,5.58e-06,5.52e-06,5.36e-06,5.54e-06,5.7e-06,5.76e-06,5.88e-06,6.01e-06,6.19e-06,6.2e-06,6.06e-06,5.66e-06,5.22e-06,5.34e-06,4.91e-06,4.05e-06,2.97e-06,2.94e-06,4.21e-06,5.55e-06,5.51e-06,5.3e-06,5.32e-06,5.39e-06,5.51e-06,5.69e-06,5.87e-06,5.98e-06,6.02e-06,5.93e-06,5.61e-06,5.12e-06,5.21e-06,4.84e-06,3.93e-06,2.94e-06,2.93e-06,4.26e-06,5.29e-06,5.21e-06,5.15e-06,5.04e-06,5.19e-06,5.32e-06,5.51e-06,5.72e-06,5.95e-06,6.16e-06,5.96e-06,5.88e-06,5.02e-06,5.14e-06,4.29e-06,3.83e-06,2.92e-06,3.05e-06,4.04e-05,1.61e-05,5.29e-06,4.61e-06,4.82e-06,5.03e-06,5.09e-06,5.31e-06,5.56e-06,6.5e-06,7.74e-06,9.45e-06,1.76e-05,1.7e-05,5.03e-06,3.89e-06,3.7e-06,2.82e-06,3.66e-06,0,0.000769,4.36e-06,3.67e-06,4.16e-06,4.66e-06,4.9e-06,4.92e-06,5.68e-06,1.39e-05,2.41e-05,6.55e-06,9.01e-06,2.29e-05,4.39e-06,0,3.09e-06,3.04e-06,3.2e-06,6.84e-05,0.00013,0,2.74e-06,3.79e-06,4.26e-06,5.01e-06,2.01e-05,3.62e-05,7.47e-05,9.92e-05,1.2e-05,3.7e-06,3.43e-06,3.62e-06,2.9e-06,3.24e-06,2.7e-06,3.14e-06,4.77e-06,0,0,2.6e-06,3.57e-06,4.23e-06,4.48e-06,1.5e-05,0,0.000122,8.14e-05,4.68e-06,0,0,2.9e-06,0,2.96e-06,2.91e-06,3.05e-06,3.75e-06,0,0,2.74e-06,3.91e-06,3.71e-06,0,4.56e-06,7.16e-05,0.000114,9.49e-05,4.58e-06,0,0,0,2.72e-06,2.93e-06,2.74e-06,3.23e-06,4.01e-06,2e-05,4.24e-06,3.57e-06,3.27e-06,3.85e-06,3.89e-06,5.8e-06,1.73e-05,7.87e-06,3.64e-05,5.4e-06,6.35e-06,3.66e-06,3.09e-06,2.85e-06,2.88e-06,2.83e-06,2.75e-06,3e-06,3.26e-06,3.33e-06,3.17e-06,2.88e-06,2.9e-06,3.12e-06,3.06e-06,3.12e-06,3.03e-06,3.1e-06,3.17e-06,3.18e-06,3.26e-06,3.02e-06,2.74e-06,2.8e-06,2.84e-06,3.61e-06],"winrateAvg":0.53772,"leadAvg":0.297728,"scoreMeanAvg":0.436541,"scoreStdevAvg":12.971,"shorttermWinlossErrorAvg":0.0814728,"shorttermScoreErrorAvg":0.664854,"ownership":[-48,-51,-52,-51,-45,-36,-29,-23,-18,-18,-23,-21,-19,-15,-30,-34,-33,-29,-26,-45,-50,-56,-58,-48,-36,-32,-26,-18,-21,-19,-45,6,-11,-32,-45,-31,-26,-25,-41,-44,-56,-87,-34,-26,-24,-24,0,13,-35,56,9,78,-71,-51,-23,-28,-22,-32,-39,-43,-54,-34,-17,-14,1,20,71,47,47,50,79,10,-82,-55,-22,-18,-24,-21,-48,-87,-29,-16,-6,2,9,20,32,34,21,19,2,-41,-22,-8,-9,-14,-20,-29,-25,-14,-8,-4,0,5,9,11,11,9,4,-14,-76,-25,4,2,-7,-5,5,-13,-7,-4,-2,0,2,4,6,5,5,0,2,-15,-13,11,14,-4,-5,-7,-12,-6,-4,-2,-1,1,2,3,3,3,1,-1,-4,63,32,24,-6,-8,-11,-6,-5,-3,-2,-2,-1,0,1,1,1,1,3,16,23,32,27,-10,-11,-9,-6,-4,-3,-2,-2,-1,-1,0,0,0,0,2,13,20,28,26,-16,-15,-8,-4,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,1,10,21,28,27,-26,-27,-13,-4,1,0,-1,-1,-2,-2,-2,-2,-4,-6,-5,8,18,31,31,-39,-38,-24,5,4,3,1,0,-1,-4,-5,-5,-6,-6,-2,7,29,45,42,-46,-72,15,30,14,8,4,-1,-2,-10,-10,-9,-10,-9,7,21,86,64,56,-57,-52,-1,85,31,17,8,-1,1,-21,-21,-20,-15,-25,-27,-27,38,75,68,-58,-63,-75,85,44,31,33,-2,-4,-71,-30,-23,-35,-80,-79,-24,91,82,77,-57,-57,-75,84,50,38,40,73,-6,-13,-16,-28,-39,-80,87,87,82,81,79,-51,-55,-10,12,52,41,48,41,16,3,-11,-11,-37,-11,27,74,75,78,79,-43,-26,-15,16,32,42,41,35,19,2,-10,-20,-22,-10,24,44,66,73,77],"ownershipAllowedMAE":0.022687})%"); + lines.push_back(R"%({"sample":{"board":"...OO..X.........../X.XXO.OOX....OX.X../..XOOX.OX.OO.OXX.X./..XO...OX.XX.O.XXO./XX.O..XOX......XOO./.XXO.OOXXO..OOXXXO./XOOO.OXXO.O.O.OOXO./.O.OX.XOOXO.O.O.O.O/..OXXXXXOOX.O.OOXO./..O.OOX.OXXO.OXXXX./...XOXXXOXO.O.....X/...OXXO.XXOO.XXXXXO/...OOX...OX..XOOOOO/..OOXXXOO..X..XO.../.OXOOOOXXOOXX.X.O../.OXXXXXXOOXOXOOO.../OXX..OXOOXXO.XXO.../OOX....X...X.X.XOX./.OX...........XO.O./","hintLoc":"null","initialTurnNumber":229,"metadata":"9302BDC694F8722DE958E82E68D44E69:239","moveLocs":["D10","R1","K2","L2","Q1","B6","B7","R1","R3","T1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":8.0,"policyOptimism":0.0,"pda":2.003,"policyMixture":[0.00015,0.00081,0.0117,0,0,0.000142,0.000214,0,0.000158,0.000176,0.000226,0.00016,0.000155,0.000183,0.000816,0.000222,0.000146,0.000155,0.000279,0,0.00133,0,0,0,0.000139,0,0,0,0.000195,0.000179,0.000162,0.00015,0,0,0.000127,0,0.00388,0.00199,0.00032,0.000957,0,0,0,0,0.000129,0,0,0.000316,0,0,0.000161,0,0,0,0,0,0.0172,0.000141,0.000152,0,0,0.000131,0.000141,0.000139,0,0,0.000334,0,0,0.000216,0,0.000147,0,0,0,0.000194,0,0,0.00017,0,0.000133,0.000141,0,0,0,0.00063,0.000252,0.000161,0.000166,0.000165,0.000161,0,0,0,0.00014,0,0,0,0,0.00015,0,0,0,0,0,0.000146,0.000149,0,0,0,0,0,0,0.000133,0,0,0,0,0.000162,0,0,0,0,0.000162,0,0.000145,0,0.000135,0,0,0,0,0.000133,0.000163,0,0.000134,0,0,0.000146,0,0,0,0,0,0.000151,0,0.000136,0,0.000134,0,0.000143,0,0.000134,0.000135,0,0,0,0,0,0,0,0,0,0.15,0,0.000135,0,0,0,0,0.000176,0.000134,0.000129,0,0,0,0,0,7.46e-05,0,0,0,0,0.000137,0,0,0,0,0,0.00137,0.000131,0.00013,0.000142,0,0,0,0,0,0,0,0,0.000156,0,0.000167,0.000149,0.000142,0.000137,0.0018,0,0.00013,0.000133,0.000133,0,0,0,0,0.0358,0,0,0,0,0.000202,0,0,0,0,0,0,0.000133,0,0.000138,0,0,0,0.000156,0.00734,0.00401,0,0,0.0869,0.00977,0,0,0,0,0,0,0.000148,0,0,0,0,0,0,0,0,0.00283,0.0016,0,0.00214,0.0046,0,0,0.000124,0.000183,0.000152,0.000137,0,0,0,0,0,0,0,0,0,0,0,0,0.136,0,0.000267,0,0.000193,0.000201,0.000144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000122,0.00105,0.000344,0,0,0,0.000143,0.000215,0,0,0,0,0,0,0,0.000173,0,0,0,0,0.398,0.000621,0,0,0,0.000151,0.00284,0.00372,0.0313,0,0.0412,0,0,0,0.000151,0,0,0,0,0,0.000239,5.66e-05,0,0,0.000145,0.000148,0.00414,0.000514,0.0158,0.00043,0.000168,0.000163,0.000159,0.000132,0.000191,0,0,0,0,0,0.00012],"winrateAvg":0.0021925,"leadAvg":-4.61613,"scoreMeanAvg":-4.5064,"scoreStdevAvg":2.22106,"shorttermWinlossErrorAvg":0.017843,"shorttermScoreErrorAvg":0.60863,"ownership":[-99,-99,7,100,100,96,34,-91,-93,-62,-45,5,51,-4,-34,-99,-99,-99,-99,-99,-99,-100,-100,100,99,100,100,-100,-4,46,80,72,100,-100,-99,-100,-99,-99,-99,-99,-99,100,100,99,99,100,-100,1,99,99,52,100,-100,-100,-99,-99,-37,-99,-99,-100,100,99,99,99,100,-100,-80,-99,-98,4,100,-34,-100,-100,100,-3,-99,-99,29,100,99,100,99,100,-100,-38,-22,-35,75,84,-13,-100,100,100,91,-46,-99,-100,100,97,100,100,-100,-100,97,40,21,100,100,-100,-100,-100,100,98,-49,100,100,100,-21,100,-100,-100,100,99,100,60,100,100,100,100,-100,100,99,57,100,100,100,-100,-26,-100,100,100,99,100,81,100,100,100,100,100,99,99,99,100,100,-100,-100,-100,-100,-100,100,100,-99,56,100,100,100,100,-100,99,45,99,100,100,100,100,100,-100,-41,100,-100,-100,100,99,100,-100,-100,-100,-100,-47,100,100,100,100,100,-100,-100,-100,100,-100,100,99,100,46,-13,-73,-95,-97,-97,100,100,100,100,-100,-100,-99,-100,-100,-100,100,100,0,-100,-100,-100,-100,-100,99,100,100,100,100,100,-100,-100,-100,-100,-99,-100,18,-3,-100,99,99,99,99,99,100,99,100,100,-100,-100,-100,-99,-99,-100,-100,-100,-90,-99,-100,99,99,99,99,99,100,-100,100,100,100,100,-100,-100,-99,-99,-100,-100,-2,-99,1,99,99,99,99,100,-100,-100,-100,-100,-100,-100,-99,-99,-100,-100,-100,99,100,100,99,99,98,99,-100,-100,-100,-100,-99,-100,-99,-99,-100,-100,-100,-100,-100,-100,100,100,99,91,99,100,-100,-100,-100,-100,-99,-100,-100,-99,-100,-100,-100,-100,-99,-100,100,-95,64,99,100,-100,-100,-100,-100,-99,-99,-100,-100,-100,-100,-100,-100,-100,-99,-99,-94,-94],"ownershipAllowedMAE":0.0211391})%"); + lines.push_back(R"%({"sample":{"board":".................../...........OX.X..../.OOO.O.X...XOX.OXO./.X.X..OX.......XOO./..X...X........XXO./.X.XX...O......XO../.OXOOX.X....XXXOO../.XO..O......XOO..../.XOXXO.X.O........./..XXO.O............/.XXO..........O..../.OOO..O.........OO./.OX............XOX./.OX...OXX.....XOXO./.O...XXO...X.O..X../.OXX.XO...X..XX.X../.XO..X....O.O.OOO../.X.........XO....../.................../","hintLoc":"null","initialTurnNumber":89,"metadata":"3EEDB81884A932CFCF06F673ECF1E9DA:99","moveLocs":["G18","H18","N16","M16","R18","G12","J9","N10","M3","S5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.46,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":17.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.15e-06,9.76e-06,8.59e-06,9.72e-06,9.27e-06,1.07e-05,1.65e-05,0.00178,1.26e-05,1.19e-05,8.98e-06,8.28e-06,0.0214,1.68e-05,1.33e-05,9.77e-06,9.35e-06,8.1e-06,7.93e-06,8.39e-06,9.09e-06,9.56e-06,8.63e-06,1.27e-05,1.09e-05,0,0,3.74e-05,1.11e-05,1.25e-05,0,0,0.000382,0,1.04e-05,0,8.38e-06,7.64e-06,9.88e-06,0,0,0,9.65e-06,0,2.36e-05,0,1.04e-05,1.31e-05,3.31e-05,0,0,0,1.19e-05,0,7.58e-06,0,7.66e-06,1.06e-05,0,1.01e-05,0,2.73e-05,1.64e-05,0,0,1.44e-05,1.19e-05,1.4e-05,0,0,0.0757,0.0557,0,0,0,7.88e-06,1.03e-05,1.14e-05,0,1.04e-05,1.64e-05,0.0629,0,0.000723,1.29e-05,1.4e-05,2.3e-05,0.00089,0.00665,0.00222,7.04e-06,0,0,0,7.9e-06,1.32e-05,0,0.00612,0,0,0.0338,0.0203,0.000218,0,1.17e-05,0.000429,1.63e-05,9.22e-06,7.47e-06,1.74e-05,0,0,8.36e-06,8.09e-06,8.31e-06,0,0,0,0,0,1.11e-05,0,0.000172,0.000446,0.0674,2.13e-05,0,0,0,0,0,8.5e-06,8.49e-06,8.48e-06,0,0,5.95e-06,0.00488,0,0,8.85e-06,0.000221,0.000849,0.104,1.94e-05,0,0,0,9.25e-06,8.99e-06,8.94e-06,8.5e-06,8.96e-06,0,0,0,0,0,2.27e-05,0,0.000618,0,0.000184,0.0268,1.48e-05,6.96e-05,1.11e-05,1.01e-05,9.71e-06,9.27e-06,8.56e-06,9.61e-06,8.05e-06,0,0,0,8.53e-06,0,2.93e-05,0.000221,0.00344,0.00524,0.000265,0,0.000487,1.14e-05,1.04e-05,9.7e-06,9.81e-06,8.68e-06,9.72e-06,0,0,0,8.69e-06,1.03e-05,8.55e-06,1e-05,0,8.18e-05,0.111,0.0196,0.000253,3.88e-05,0,1.01e-05,9.27e-06,8.51e-06,8.63e-06,8.73e-06,0,0,0,9.81e-06,1.14e-05,0,1.11e-05,1.41e-05,4.43e-05,0.000998,0.000182,0.000132,0.000277,1.69e-05,0.000217,0,0,8.74e-06,8.35e-06,0,0,1.06e-05,2.04e-05,1.68e-05,1.3e-05,1.48e-05,1.71e-05,4.31e-05,8.39e-05,0.000139,0.000442,0.00116,0.00201,0,0,0,0.00586,8.35e-06,0,0,1.01e-05,1.21e-05,5.27e-05,0,0,0,3.25e-05,5.89e-05,6.45e-05,4.4e-05,2.58e-05,0,0,0,0,1.11e-05,8.21e-06,0,1.17e-05,9.53e-06,9.14e-06,0,0,0,1.9e-05,1.93e-05,1.44e-05,0,0.0106,0,1.34e-05,0.000166,0,0,8.01e-06,9.02e-06,0,0,0,9.14e-06,0,0,1.21e-05,1.73e-05,3.94e-05,0,1.32e-05,1.77e-05,0,0,9.96e-06,0,9.93e-06,1.11e-05,2.1e-05,0,0,1.17e-05,9.2e-06,0,1.11e-05,9.7e-05,0.000214,1.48e-05,0,0,0,9.53e-06,0,0,0,0.328,1.84e-05,1.81e-05,0,0.0112,1.79e-05,1.54e-05,1.24e-05,1.2e-05,3.1e-05,3.11e-05,1.22e-05,9.11e-06,0,0,8.44e-06,8.64e-06,9.16e-06,9.56e-06,1.44e-05,1.09e-05,8.37e-06,1.31e-05,1.19e-05,1.03e-05,9.95e-06,9.99e-06,9.13e-06,9.25e-06,9.26e-06,9.32e-06,8.45e-06,8.49e-06,7.93e-06,7.91e-06,8.22e-06,8.64e-06,8.76e-06,9.03e-06,7.73e-06,7.86e-06],"winrateAvg":0.39479,"leadAvg":-1.30441,"scoreMeanAvg":-1.52001,"scoreStdevAvg":9.45651,"shorttermWinlossErrorAvg":0.189318,"shorttermScoreErrorAvg":1.15419,"ownership":[78,82,84,82,71,54,11,-1,-70,-70,-74,-78,-71,-69,-28,19,69,96,97,80,80,86,85,74,66,73,-97,-70,-71,-79,-73,-92,-88,-93,6,98,97,98,-34,90,89,90,53,88,-56,-97,-71,-65,-69,-95,-56,-93,-22,85,85,100,99,-48,-93,10,-87,-5,6,19,-97,-54,-56,-56,-95,-52,-63,-8,-67,100,100,99,-87,-91,-98,-74,-29,1,-89,-55,-39,-45,-48,-49,-64,-61,-39,-64,-64,100,98,-91,-98,-89,-98,-97,-14,-39,-46,-3,-30,-35,-38,-58,-72,-63,-65,99,97,94,-95,-91,-93,11,15,-88,-82,-95,-30,-26,-4,-34,-97,-97,-97,98,99,87,85,-96,-98,-83,-84,16,80,-94,-68,-17,-3,18,-21,-97,64,66,63,68,73,75,-94,-98,-83,-98,-98,83,-13,-89,-13,61,20,7,-52,-16,6,31,59,66,69,-90,-97,-98,-98,76,70,91,2,-13,21,13,-8,-83,-23,-29,46,53,68,64,-2,-98,-98,95,75,70,62,29,75,8,32,9,-9,1,76,43,62,70,60,10,95,95,95,68,64,90,13,14,-5,6,3,-3,2,25,36,90,90,45,88,94,-70,31,-39,9,-15,-11,-17,-9,-5,-6,-10,-19,-4,-43,89,2,27,93,94,-68,-39,-39,-50,-1,-89,-88,-23,-14,-19,-21,-36,-79,-33,-88,4,-34,91,94,47,-43,-54,-100,-99,-4,-38,-21,-30,-78,-10,10,-49,-59,-88,-88,-50,66,94,-99,-99,-83,-100,-12,-26,-14,1,-61,29,-11,-82,-83,4,-87,-31,-27,47,-86,-85,-95,-92,-100,-58,-20,3,37,98,98,98,-27,97,97,97,35,12,16,-85,-84,-92,-83,-76,-50,-26,4,36,75,69,98,93,95,92,70,57,27,-42,-76,-86,-87,-80,-67,-48,-23,7,40,66,83,87,92,90,81,72,61,47],"ownershipAllowedMAE":0.0362307})%"); + lines.push_back(R"%({"sample":{"board":".................../.XO...........OXX../..XO.O....X..XOXO../.X.O....O.....OOX../..X........O....X../.OX.X..........OOX./.XO..............X./.XO............X.../.O................./..O................/.................../.................../..............OOO../..OO...........XX../..XO.............../..X.X..........X.../...X..O......X...../.................../.................../","hintLoc":"null","initialTurnNumber":18,"metadata":"B05DB0E58DF924A712800E084350D8F1:28","moveLocs":["L16","O18","P19","K3","K17","H4","C16","B17","G4","H5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.14,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.9e-06,4.38e-06,5.09e-06,5.74e-06,4.59e-06,4.28e-06,4.23e-06,4.32e-06,4.26e-06,4.51e-06,4.38e-06,4.61e-06,4.78e-06,4.63e-06,0,4.53e-06,4.99e-06,4.57e-06,4.29e-06,4.32e-06,0,0,7.23e-06,6.6e-06,4.19e-06,4.51e-06,4.25e-06,4.21e-06,4.46e-06,4.61e-06,4.47e-06,4.6e-06,0,0,0,0,1.49e-05,5.18e-06,4.33e-06,0,0,0,4.2e-06,0,4.48e-06,4.58e-06,3.86e-06,0,0,4.45e-06,4.29e-06,0,0,0,0,0.0716,4.94e-06,4.46e-06,0,0,0,4.37e-06,4.97e-06,5.11e-06,4.79e-06,0,4.19e-06,0,4.03e-06,4.64e-06,5.2e-06,0,0,0,6.67e-06,4.98e-06,5.53e-06,3.53e-05,0,7.49e-05,6.84e-06,5.72e-06,5.73e-06,5.25e-06,4.73e-06,4.28e-06,4.12e-06,0,5.19e-06,5.02e-06,4.36e-06,0.00585,0,3.99e-05,4.74e-06,2.34e-05,0,0,0.00952,0,6.1e-06,6.29e-06,6.05e-06,5.64e-06,5.36e-06,5.11e-06,5.62e-06,6.04e-06,6.34e-06,5.49e-06,0,0,0,4.49e-06,0.00369,0,0,6.04e-06,6.52e-06,7.23e-06,6.43e-06,6.6e-06,6.55e-06,6.36e-06,6.2e-06,6.14e-06,6.46e-06,6.53e-06,6.33e-06,5.8e-06,7.97e-06,0,4.39e-06,0.0116,0,0,5.21e-06,6.7e-06,6.75e-06,6.92e-06,6.98e-06,7.03e-06,7e-06,6.88e-06,6.93e-06,6.68e-06,7.25e-06,1.15e-05,0,6.27e-05,6.85e-06,4.46e-06,5.26e-06,0,4.63e-06,4.89e-06,6.07e-06,7.05e-06,7.24e-06,7.26e-06,7.34e-06,7.36e-06,7.23e-06,7.08e-06,7.06e-06,7.17e-06,2.06e-05,3.67e-05,3.39e-05,7.58e-06,4.88e-06,4.59e-06,4.21e-06,0,5.12e-06,6.09e-06,6.99e-06,7.38e-06,7.51e-06,7.61e-06,7.58e-06,7.39e-06,7.08e-06,6.89e-06,7.39e-06,1.08e-05,1.7e-05,1.73e-05,6.49e-06,4.65e-06,4.44e-06,4.73e-06,4.64e-06,5.51e-06,6.47e-06,7.29e-06,7.66e-06,8.02e-06,8.12e-06,8.03e-06,7.75e-06,7.54e-06,7.57e-06,6.8e-06,6.31e-06,6.35e-06,6.56e-06,5.61e-06,4.51e-06,4.39e-06,4.61e-06,5.21e-06,5.71e-06,6.69e-06,7.64e-06,8.78e-06,9.27e-06,8.95e-06,8.71e-06,1.03e-05,1.66e-05,1.16e-05,6.19e-06,4.58e-06,4.15e-06,4.41e-06,5.88e-06,4.74e-06,4.48e-06,5.78e-06,4.73e-06,4.94e-06,6.17e-06,9.47e-06,2.11e-05,1.3e-05,8.43e-06,8.88e-06,1.29e-05,2.09e-05,1.78e-05,6.06e-06,0,0,0,6.82e-06,5.34e-06,5.29e-06,1.61e-05,0,0,5.82e-06,5.25e-05,9.59e-05,7.09e-06,7.41e-06,8.04e-06,1.07e-05,1.51e-05,1.28e-05,7.71e-06,4.38e-05,0,0,0.000188,5.33e-06,5.04e-06,0.000128,0,0,0.00638,0.486,0.227,0,5.99e-06,1.03e-05,1.06e-05,1.06e-05,1.16e-05,9.11e-06,7.08e-06,8.15e-06,8.21e-06,1.23e-05,5.87e-06,5.75e-06,7.24e-06,0,0.0212,0,2.54e-05,0,0,3.06e-05,0.000868,2.38e-05,2.47e-05,3.35e-05,0.000112,0.000596,0,0.00121,2.79e-05,5.31e-06,5.27e-06,0.000278,9.34e-06,0,0.00345,6.48e-06,0,0.00639,0.00139,0,0.00104,1.26e-05,0.000105,0,0.000247,0.00477,3.52e-05,1.05e-05,4.72e-06,5.39e-06,3.76e-05,0.0173,3.22e-05,0.0958,0.005,7.53e-06,0.000289,0.0148,0.000902,1.86e-05,1.95e-05,7.48e-06,0.000111,3.02e-05,2.7e-05,9.17e-06,6.48e-06,4.97e-06,4.4e-06,5.56e-06,5.79e-06,7.74e-06,6.98e-06,5.69e-06,5.96e-06,5.28e-06,6.49e-06,5.53e-06,5.55e-06,5.08e-06,5.06e-06,4.95e-06,5.11e-06,4.93e-06,4.63e-06,4.94e-06,4.15e-06,6.81e-06],"winrateAvg":0.500267,"leadAvg":0.372877,"scoreMeanAvg":0.411813,"scoreStdevAvg":13.4591,"shorttermWinlossErrorAvg":0.133611,"shorttermScoreErrorAvg":0.981844,"ownership":[-79,-57,-50,17,51,73,77,79,80,81,79,79,79,84,92,13,-33,-47,-65,-85,-93,-3,-2,79,79,80,78,83,81,82,78,79,69,92,-87,-87,-73,-84,-92,-93,-94,88,68,91,66,69,81,97,75,81,78,69,92,-88,-84,-85,-88,-89,-94,85,87,21,24,35,44,96,64,96,83,79,77,92,92,-93,-90,-89,-72,-89,-90,7,-9,12,8,20,32,16,42,94,56,46,55,52,-92,-89,-89,-47,-26,-90,-17,-62,-6,6,9,16,16,23,28,30,12,20,82,80,-95,-87,-3,-29,81,5,-1,8,5,6,8,8,9,10,-3,4,-6,-5,-34,-95,-70,62,-22,84,20,9,5,5,5,5,5,5,4,2,-2,-15,-74,-32,-47,-51,71,90,63,6,11,6,5,4,3,3,2,0,-1,0,3,-7,-9,-18,-22,77,79,92,32,15,8,5,3,2,1,-1,-2,-2,4,9,13,6,3,-1,69,70,54,25,14,7,3,1,-1,-2,-4,-6,-6,4,9,14,17,12,14,61,60,42,30,11,5,-1,-2,-5,-5,-7,-8,0,3,22,31,35,32,15,47,67,56,37,19,7,-6,-6,-10,-10,-11,-14,-28,17,73,73,73,2,1,25,24,87,87,38,15,-17,-15,-15,-17,-17,-18,-17,2,34,-89,-90,-48,-31,-12,-20,-75,86,-17,55,17,-78,-33,-28,-24,-23,-20,-13,-15,-44,-68,-69,-53,-39,-62,-76,0,-63,25,67,-79,-32,-38,-35,-31,-32,-36,-37,-91,-66,-64,-60,-56,-61,-68,-82,-14,22,67,-7,-11,-85,-46,-45,-50,-91,-68,-68,-70,-66,-63,-62,-64,-65,-64,1,22,39,19,-2,-44,-55,-54,-63,-71,-71,-68,-67,-64,-64,-64,-64,-62,-38,-10,20,29,17,-6,-26,-44,-51,-58,-64,-66,-65,-64,-64,-64],"ownershipAllowedMAE":0.0270364})%"); + lines.push_back(R"%({"sample":{"board":".O................./.XO.OOXO.......XOO./.XXO.X.XO.X..X.XO../..XO..XOX......XXO./.....X..X.......O../.X.O.............../..X..O..........XX./..............XX..X/..X...........OOXX./..............OXOO./...O.............../...............O.../.................../................X../..O..........OX..../.....X.......O.O.O./...X...O...O.XO..../.................../.................../","hintLoc":"null","initialTurnNumber":66,"metadata":"E8A603FDD620D5834AAA9B92A9C281D9:76","moveLocs":["G17","E12","D13","E14","F11","H12","E11","J13","N10","G10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.81,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.04e-06,0,8.82e-06,7.24e-06,6.14e-06,7.39e-06,7.18e-06,7.31e-06,6.71e-06,6.65e-06,7.02e-06,7.07e-06,7.14e-06,7.23e-06,7.09e-06,2.58e-05,0.000272,3.25e-05,7.96e-06,6.6e-06,0,0,8.9e-06,0,0,0,0,7.28e-06,6.86e-06,6.92e-06,7.03e-06,6.97e-06,6.93e-06,6.57e-06,0,0,0,0.000682,6.98e-06,0,0,0,6.79e-06,0,0,0,0,7.12e-06,0,6.9e-06,6.78e-06,0,6.93e-06,0,0,1.1e-05,0.0013,6.62e-06,6.42e-06,0,0,9.08e-06,6.23e-06,0,0,0,6.75e-06,6.98e-06,7.12e-06,7.12e-06,6.86e-06,6.41e-06,0,0,0,4.13e-05,6.85e-06,6.99e-06,0.00573,5.31e-05,0.000121,0,8.02e-06,6.67e-06,0,6.93e-06,7.78e-06,8.03e-06,7.64e-06,7.08e-06,6.75e-06,1.42e-05,0,0.00248,0.000187,6.51e-06,0,7.09e-06,0,0,2.75e-05,8.96e-06,0.000375,8.7e-06,9.31e-06,9.98e-06,9.4e-06,8.34e-06,7.54e-06,7.39e-06,7.05e-06,9.49e-06,2.39e-05,6.61e-05,6.54e-06,6.5e-06,0,0,2.66e-05,0,0.000116,1.95e-05,0,1.17e-05,1.55e-05,1.21e-05,9.77e-06,7.88e-06,6.61e-06,6e-06,0,0,9.1e-06,6.64e-06,6.55e-06,6.42e-06,7.6e-06,0,0.000147,3.38e-05,0,9.85e-06,0.0116,2.6e-05,2.75e-05,1.69e-05,1.06e-05,0,0,6.22e-06,6.51e-06,0,7.04e-06,7.13e-06,0,7.51e-06,0,0,0.00133,1.54e-05,0.0597,6.61e-05,6.4e-05,2.84e-05,1.11e-05,0.000373,0,0,0,0,7.28e-06,7.44e-06,9.51e-06,9.23e-06,9.8e-06,8.97e-06,1.66e-05,0,7.7e-05,0.0309,0.0018,0.000211,1.26e-05,0,9.38e-06,0,0,0,0,4.36e-05,7.69e-06,1.27e-05,1.22e-05,0,0.0411,0.00585,4.83e-05,0.000149,0.0751,0.000757,0.000118,2.89e-05,9.59e-06,2.16e-05,2.56e-05,1.09e-05,6.35e-06,5.05e-05,8.46e-06,7.9e-06,1.39e-05,3.33e-05,2.67e-05,0.000186,0.000267,0.000214,0.000231,0.00035,0.000156,7.86e-05,4.88e-05,4.31e-05,5.44e-05,2.45e-05,0,2.46e-05,0.000175,9.02e-06,8.24e-06,1.79e-05,9.02e-05,0.000143,0.000263,0.000178,0.00019,0.000168,0.000142,9.71e-05,5.49e-05,3.42e-05,6.9e-05,8.47e-05,0.00782,9.18e-05,8.52e-06,1.35e-05,7.76e-06,8.01e-06,1.46e-05,1.62e-05,0.000181,0.000109,0.00012,0.000151,0.000126,9.21e-05,5.93e-05,2.67e-05,1.83e-05,1.22e-05,0.714,0.000753,6.34e-06,0,7.25e-06,7.54e-06,8.17e-06,1.23e-05,0,2.4e-05,1.48e-05,1.29e-05,8.75e-05,0.000131,9.29e-05,4.28e-05,3.19e-05,1.26e-05,7.69e-06,0,0,1.42e-05,8.85e-06,1.27e-05,7.09e-06,8.37e-06,0.000211,0.0275,1.21e-05,1.09e-05,0,1.38e-05,0.000306,0.000152,0.000164,0.000144,0.000178,1.86e-05,0,0.000268,0,2.39e-05,0,8.47e-06,8.12e-06,7.32e-05,1.89e-05,0,8.98e-06,1.03e-05,2.55e-05,0,6.32e-05,8.18e-05,0.000167,0,9.6e-05,0,0,7.3e-06,0.000235,1.22e-05,6.91e-06,7.79e-06,9.89e-06,1.02e-05,8.41e-06,9.76e-06,1.07e-05,1.25e-05,1.42e-05,1.31e-05,2.04e-05,1.32e-05,1.43e-05,9.45e-06,1.03e-05,7.45e-05,9.3e-06,8.57e-06,8.22e-06,7.44e-06,6.1e-06,7.02e-06,6.98e-06,7.3e-06,7.2e-06,7.32e-06,7.45e-06,7.68e-06,7.78e-06,7.79e-06,7.65e-06,7.29e-06,7.29e-06,7.34e-06,6.85e-06,7.2e-06,7.07e-06,7.57e-06,6.47e-06,9.32e-06],"winrateAvg":0.642969,"leadAvg":1.4863,"scoreMeanAvg":2.05915,"scoreStdevAvg":14.4825,"shorttermWinlossErrorAvg":0.124435,"shorttermScoreErrorAvg":1.08335,"ownership":[-24,65,63,66,61,18,5,-38,-60,-75,-78,-78,-77,-77,-71,-16,49,77,79,-50,-94,71,69,73,72,-97,-35,-75,-76,-81,-79,-79,-84,-82,-96,80,79,78,-89,-94,-94,74,2,-97,-97,-97,-68,-80,-95,-63,-64,-94,-80,-96,79,79,78,-92,-93,-94,73,19,-61,-97,-66,-97,-60,-44,-44,-45,-51,-63,-96,-96,78,75,-93,-93,-21,38,14,-91,-54,-64,-96,-27,-26,-30,-35,-38,-54,-17,55,51,26,-92,-97,-18,78,77,19,-1,-24,6,1,-10,-20,-26,-30,-36,-32,-34,-2,-25,-86,-90,-97,-97,-14,82,40,43,76,13,-2,-12,-17,-27,-43,-55,-93,-93,-69,-73,-82,-62,-36,15,-13,53,89,34,-4,1,-10,-15,-12,-90,-91,-89,-91,-92,-56,-63,-92,-47,-84,-82,21,43,10,12,5,-9,2,1,79,78,-92,-92,-60,-34,-32,-21,-23,-28,8,70,27,19,10,4,-2,-51,12,80,67,78,76,-30,-12,-14,-2,40,-28,-1,15,9,3,3,4,9,10,21,46,76,60,51,18,3,2,4,4,-13,-5,3,6,2,1,3,9,16,48,38,87,48,39,34,14,11,9,4,-9,-5,-1,1,0,0,1,1,3,10,23,41,39,41,38,20,23,18,5,-5,-7,-2,-1,0,0,2,-2,17,-23,16,34,9,38,42,17,23,55,15,-4,-13,6,0,2,3,8,23,29,90,1,50,48,46,56,4,-4,-38,-7,-20,-69,-12,-6,11,8,15,31,49,91,34,91,68,89,67,-13,-14,-28,-73,-34,-26,-12,54,19,20,28,87,66,59,94,81,79,79,78,-21,-30,-42,-46,-37,-17,-1,24,31,34,46,59,66,71,76,80,80,80,79,-27,-33,-37,-40,-33,-18,-1,14,26,34,43,53,61,68,73,76,78,79,79],"ownershipAllowedMAE":0.0305932})%"); + lines.push_back(R"%({"sample":{"board":"....X.X../OX..OX.X./.OO.OOX.X/OX..OXXXX/X.XXXOOXO/.XOOO.OOO/X.XXOOO.O/.X.XXO.../X.XOOOO.O/","hintLoc":"null","initialTurnNumber":72,"metadata":"17D695261C1100A9272C5A5BB56F81BB:82","moveLocs":["C8","D9","A7","F9","A9","pass","E9","pass","F9","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.18,"xSize":9,"ySize":9},"rules":"koSITUATIONALscoreAREAtaxNONEsui1button1","komi":6.0,"policyOptimism":0.053,"pda":0.0,"policyMixture":[0,0.04,0.052,0,0,0,0,0.0752,0.0192,0.0541,0,0,0.0634,0,0,0.0433,0,0.0432,0,0,0,0.048,0,0,0,0.0404,0,0.0569,0,0.0401,0.0427,0,0,0,0,0,0,0.0398,0,0,0,0,0,0,0,0.0624,0,0,0,0,0,0,0,0,0,0.0332,0,0,0,0,0,0.0181,0,0.0503,0,0.0342,0,0,0,0.0181,0.0201,0.0194,0,0.0663,0,0,0,0,0,0.0193,0,0.000144],"winrateAvg":0.000122217,"leadAvg":-24.6273,"scoreMeanAvg":-24.5602,"scoreStdevAvg":0.873151,"shorttermWinlossErrorAvg":0.00319984,"shorttermScoreErrorAvg":0.435961,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100],"ownershipAllowedMAE":0.00217785})%"); + lines.push_back(R"%({"sample":{"board":"....X............../.XXXOX.XOO...OX..../.OXOOX..XO...O.XO../.OOO..X.XO.....XX../...OX.X.O.....O..X./....OX..O.......O../.O.OOOX............/....OXX............/.X............OO.../...O.X......X.X..../..X...X............/.OX.XXO............/..OXXO.O.........../.OOOOOO.........O../.OX................/.X.XXXX..X....XO.../..X.OXOO.....XXXOO./...OOOXX.X.....OXO./.....X............./","hintLoc":"null","initialTurnNumber":105,"metadata":"A2E8FE25256EBA9A0D2A4B3F849C352E:115","moveLocs":["O10","O9","O11","M9","N8","O8","M12","J8","H8","S14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.96,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":5.0,"policyOptimism":0.853,"pda":0.827,"policyMixture":[2.55e-05,3.33e-05,2.64e-05,0.00414,0,4.77e-05,4.6e-05,0.000692,3.05e-05,2.58e-05,2.81e-05,2.79e-05,2.89e-05,3.62e-05,7.86e-05,4.27e-05,9.1e-05,3.06e-05,2.67e-05,5.28e-05,0,0,0,0,0,3.8e-05,0,0,0,2.65e-05,2.78e-05,2.65e-05,0,0,0.000375,0.000274,0.000137,3.01e-05,2.91e-05,0,0,0,0,0,3.09e-05,0.000151,0,0,2.62e-05,2.8e-05,2.81e-05,0,0.00013,0,0,3.99e-05,3.57e-05,2.53e-05,0,0,0,3.64e-05,3.65e-05,0,5.29e-05,0,0,2.69e-05,2.91e-05,2.94e-05,3.16e-05,3.56e-05,0,0,3.91e-05,2.97e-05,2.78e-05,2.71e-05,2.38e-05,0,0,0.000298,0,3.08e-05,0,2.79e-05,2.93e-05,3.01e-05,3.1e-05,3.23e-05,0,3.65e-05,3.11e-05,0,2.77e-05,2.73e-05,2.69e-05,2.79e-05,2.34e-05,0,0,4.05e-05,0.00185,0,3e-05,3.33e-05,3.2e-05,3.12e-05,3.32e-05,3.67e-05,3.7e-05,0,0,2.73e-05,2.96e-05,0,2.78e-05,0,0,0,0,3.66e-05,3.7e-05,4.38e-05,3.79e-05,3.2e-05,3.1e-05,3.14e-05,3.35e-05,4.02e-05,0.000324,0.000174,3.06e-05,3.23e-05,3.66e-05,3.53e-05,2.8e-05,0,0,0,3.77e-05,0.00019,7.86e-05,4.19e-05,0,2.95e-05,2.81e-05,2.76e-05,3.23e-05,0.000224,6.37e-05,3.27e-05,3.46e-05,0,4.32e-05,3.78e-05,4.91e-05,4.42e-05,5.55e-05,3.92e-05,5.45e-05,0.000126,4.99e-05,3.79e-05,4.26e-05,0,0,0,3.89e-05,4.58e-05,3.17e-05,3.72e-05,4.7e-05,0.007,0,4.32e-05,0,3.27e-05,4.71e-05,9.28e-05,6.75e-05,5.94e-05,3.16e-05,0,0,0,4.28e-05,4.2e-05,4.21e-05,3.15e-05,4.55e-05,0.00732,0,0.0111,0.000161,5.54e-05,0,0.226,0.000118,6.38e-05,4.88e-05,0,0.0203,0,3.92e-05,4.87e-05,4.77e-05,4.1e-05,3.07e-05,3.27e-05,0,0,3.85e-05,0,0,0,0,0,0.000141,0.000828,0.000964,0,0,3.63e-05,0.000126,4.83e-05,4e-05,3.01e-05,3.1e-05,2.43e-05,0,0,0,0,2.09e-05,0,0.000101,0.000298,0.00152,0.0156,0.359,0.106,0.000101,5.77e-05,4.02e-05,3.73e-05,2.93e-05,2.61e-05,0,0,0,0,0,0,3.45e-05,0.000154,0.000695,0.00535,0.000411,0.029,0.00565,0.00294,8.93e-05,0,3.19e-05,2.91e-05,3.54e-05,0,0,4.86e-05,2.75e-05,2.67e-05,3.13e-05,0.0132,0.0133,0.00858,0.000326,0.000323,0.000118,0.00733,0.000353,0.000206,3.56e-05,3.14e-05,2.81e-05,0.00177,0,0,0,0,0,0,3.79e-05,0.000134,0,0.000447,7.69e-05,0.000134,2.97e-05,0,0,3.11e-05,2.78e-05,2.68e-05,7.39e-05,0.000146,0,2.58e-05,0,0,0,0,0.125,3.74e-05,0.000459,0.000377,4.6e-05,0,0,0,0,0,2.53e-05,0.000216,0.00815,7.34e-05,0,0,0,0,0,4.75e-05,0,3.93e-05,3.79e-05,4.48e-05,3.04e-05,0.00141,0,0,0,2.52e-05,2.55e-05,3.02e-05,2.59e-05,2.47e-05,3.02e-05,0,3.55e-05,3.25e-05,3.24e-05,2.92e-05,2.85e-05,3.11e-05,3.26e-05,3.32e-05,3.49e-05,3.28e-05,3.39e-05,2.63e-05,2.57e-05,2.05e-05],"winrateAvg":0.0826176,"leadAvg":-3.55273,"scoreMeanAvg":-4.56554,"scoreStdevAvg":8.80258,"shorttermWinlossErrorAvg":0.0904596,"shorttermScoreErrorAvg":0.949294,"ownership":[-12,-34,-65,-73,-89,-88,-48,51,58,90,92,88,83,-30,-55,-86,-92,-94,-95,18,-70,-72,-73,98,-98,-82,-91,99,99,91,88,85,96,-93,-87,-94,-95,-96,34,98,-74,98,98,-98,-94,-86,-93,99,90,87,89,96,11,-99,-94,-97,-97,90,98,98,98,10,-46,-98,-46,-92,99,86,84,84,79,-9,-99,-99,-97,-97,93,95,96,99,-61,-60,-99,6,94,90,81,81,80,79,90,-12,-34,-99,-91,89,91,95,97,98,-95,-90,41,93,48,71,75,75,71,53,22,51,-98,-68,58,96,76,98,98,97,-99,-13,12,17,46,68,70,66,51,38,9,-38,-46,13,11,-28,51,98,-99,-99,-31,-5,5,15,92,65,68,57,39,16,4,-15,-43,-77,-23,25,5,-55,-48,-13,-10,-6,-5,16,6,97,98,97,47,18,6,-39,-9,-30,46,-8,-98,-40,-34,8,-10,-10,-24,-67,97,-37,36,24,23,16,5,-2,-93,15,-30,-90,-91,41,7,-7,-20,-74,-54,-88,-31,-3,11,20,18,52,81,-93,-91,-97,-96,95,95,-43,-3,0,-12,38,-88,-27,-3,12,25,25,82,81,97,-96,-97,97,94,95,32,9,2,1,5,-34,-6,7,25,40,37,86,97,97,97,97,97,97,53,20,5,4,-2,-5,-4,8,22,85,59,52,30,96,-81,58,7,1,14,27,20,-2,-11,-9,-11,-9,-18,-24,29,66,63,1,-96,-78,-99,-99,-99,-99,-49,-35,-89,-33,-25,-23,-47,-94,18,19,66,77,-89,-93,-99,-97,-96,-99,-17,-17,-24,-61,-55,-42,-53,-94,-94,-94,98,97,88,-91,-92,-97,-95,-96,-95,-99,-99,-96,-99,-74,-72,-68,-76,12,71,73,97,93,-93,-95,-96,-96,-97,-98,-97,-97,-96,-91,-84,-74,-69,-59,-39,42,83,88,92],"ownershipAllowedMAE":0.0335939})%"); + lines.push_back(R"%({"sample":{"board":"..............O..../..........O.XO.O.../.....X..O..OOXOOO../...X......XXXXXXX../..X................/..O.............O../.................O./..XX.....XO....OOX./..O......XXOO..OXX./...OX......XO.O.OX./....OO.....XXO...../...X.........OX.X../.....O......XXO..../....XO..XXX...O..X./.....X.O.OOO......./..OOO.......O.OOO../..XXXOOO....X..XXO./.....XX......X...X./.................../","hintLoc":"null","initialTurnNumber":46,"metadata":"EEFC4BF1EDD55099E1BCBA93533D2850:56","moveLocs":["D9","E11","D11","C10","F10","B12","B13","G9","F11","A11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.18,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":3.0,"policyOptimism":0.055,"pda":2.587,"policyMixture":[1.71e-06,2.39e-06,2.2e-06,2.34e-06,2.44e-06,2.93e-06,3.49e-06,4.48e-06,4.95e-06,5.69e-06,1.27e-05,4.84e-05,6.49e-06,0.000232,0,2.95e-06,2.67e-06,2.61e-06,2.02e-06,2.37e-06,2.94e-06,3.12e-06,3.3e-06,3.54e-06,4.09e-06,3.24e-05,5.72e-05,0.000217,0.000603,0,4.87e-05,0,0,0,0,2.9e-06,4.05e-06,2.49e-06,2.21e-06,3.16e-06,3.24e-06,3.13e-06,3.02e-06,0,6.62e-06,0.000467,0,0.00489,0.00204,0,0,0,0,0,0,5.1e-06,2.83e-06,2.83e-06,4.57e-06,3.07e-06,0,3.65e-06,4.48e-06,8.31e-06,5.08e-05,0.00424,1.73e-05,0,0,0,0,0,0,0,5.49e-06,3.14e-06,4.97e-06,1.47e-05,0,5.65e-06,5.79e-06,7.82e-06,1.18e-05,1.75e-05,3.19e-05,9.21e-06,4.17e-06,3.38e-06,3.1e-06,3.02e-06,3.31e-06,3.76e-06,5.03e-06,1.39e-05,5.41e-06,9.03e-06,0.258,0,0.0158,2.53e-05,2.01e-05,1.4e-05,1.22e-05,1.14e-05,9.64e-06,8.96e-06,7.27e-06,6.62e-06,7.27e-06,7.68e-06,7.45e-06,0,5.96e-06,4.69e-06,0.000498,0,0.107,4.52e-05,0.000227,0.000116,3.42e-05,1.2e-05,7.09e-06,8.59e-06,0.000241,1.09e-05,2.67e-05,1.63e-05,1.36e-05,3.19e-05,8.98e-06,0,7.18e-06,3.35e-05,0,0,0,0.00805,0.00307,0.000295,4.86e-05,4.65e-06,0,0,1.7e-05,6.8e-06,1.35e-05,5.38e-06,0,0,0,4.01e-06,0,5.77e-06,0,0,0,0,0.000104,0.000267,6.01e-06,0,0,0,0,1.02e-05,3.72e-06,0,0,0,2.19e-06,8.25e-06,0.139,0,0,0,0,0.000199,0.0248,7.84e-06,3.81e-06,3.33e-06,0,0,6.06e-06,0,7.42e-06,0,0,2.14e-06,1.43e-05,0.153,0.0252,0,0,0,0,6.85e-05,8.12e-06,5.97e-06,3.39e-06,0,0,0,2.52e-05,6.12e-05,0.000289,5.46e-06,3.44e-06,1.18e-05,0.0328,2.59e-05,0,0.000764,0.000108,5.79e-05,1.42e-05,7.31e-06,4.81e-06,3.68e-06,3.11e-06,6.31e-06,0,0,9.41e-05,0,6.26e-06,3.59e-06,6.8e-06,0.000512,0.000399,0.00068,0.0195,0,9.56e-05,3.54e-05,4.4e-06,3.18e-06,3.52e-06,4.01e-06,0,0,0,3.25e-05,8.46e-06,8.43e-06,3.71e-06,6.82e-06,0.000957,0.012,0.000252,0,0,0.00823,0.000766,0,0,0,4.83e-06,4.92e-06,5.26e-06,0,6.95e-06,2.41e-05,0,4.54e-06,7.93e-06,0.000845,0.000137,1.2e-05,0.166,0,0.000397,0,0.000393,0,0,0,8.94e-06,0.000138,6.47e-06,4.32e-06,5.38e-06,1.24e-05,4.92e-06,7.75e-06,0.00108,0,0,0,0.00247,6.6e-06,5.51e-05,6.29e-05,7.77e-06,4.64e-06,5.88e-06,0,3.87e-05,0,0,0,3.43e-05,4.4e-06,8.17e-06,0.000129,0,0,0,0,0,0,1.74e-05,2.1e-05,1.23e-05,8.62e-06,0,4.28e-06,4.92e-06,0,0,0,7e-06,3.63e-06,7.18e-06,3.77e-06,3.66e-06,3.14e-06,0,0,1.23e-05,6.26e-06,6.15e-06,5.6e-06,7.08e-06,3.61e-06,0,3.75e-06,3.78e-06,3.55e-06,0,3.94e-06,1.93e-06,2.61e-06,2.57e-06,2.59e-06,2.64e-06,2.17e-06,2.52e-06,3.2e-06,3.32e-06,3.22e-06,2.83e-06,2.78e-06,2.65e-06,2.19e-06,2.4e-06,2.53e-06,2.53e-06,2.64e-06,2.16e-06,5.61e-06],"winrateAvg":0.0153887,"leadAvg":-12.4061,"scoreMeanAvg":-13.9092,"scoreStdevAvg":13.901,"shorttermWinlossErrorAvg":0.0412286,"shorttermScoreErrorAvg":2.87014,"ownership":[-71,-71,-68,-64,-55,-37,-14,17,42,60,68,81,89,94,97,94,83,72,56,-72,-71,-72,-69,-66,-51,-22,11,47,60,86,82,83,96,96,97,84,65,38,-72,-74,-73,-76,-65,-87,-17,0,69,-2,-23,83,84,-94,98,97,98,45,15,-72,-77,-80,-95,-59,-43,-27,-12,-29,-41,-92,-93,-93,-93,-93,-94,-93,-25,-19,-69,-76,-93,-65,-50,-41,-32,-28,-30,-33,-41,-42,-40,-38,-36,-24,-23,-29,-15,-62,-65,-44,-62,-51,-44,-36,-33,-33,-30,-17,-10,-5,-5,10,7,90,32,34,-41,-79,-67,-67,-56,-46,-40,-34,-37,-41,-3,13,8,22,16,34,87,89,45,-14,21,-89,-89,-60,-50,-38,-35,-47,-96,39,36,41,38,47,94,95,-77,7,23,15,24,-89,-58,-84,-29,-24,-43,-96,-96,93,92,66,78,94,-76,-76,-48,18,18,28,28,-86,-84,16,-17,-22,-56,-82,-90,93,87,94,34,27,-76,-65,18,13,8,-16,72,73,74,13,-15,-15,-57,-90,-90,91,44,-8,-38,-72,-68,14,25,7,-16,32,51,32,8,-4,-27,-46,-60,17,90,-14,-2,-78,-69,-63,17,6,15,16,34,73,28,-3,-24,-42,-56,-51,-77,-75,88,7,-18,-46,-49,22,18,20,22,-6,73,23,12,-81,-82,-82,-4,-8,14,86,22,-20,-67,-5,21,38,38,37,15,8,47,87,-4,94,94,94,46,30,56,48,31,66,24,8,3,71,71,73,55,60,59,48,45,40,38,90,60,94,95,95,35,41,-22,-29,-83,-82,-81,91,90,91,37,22,11,-9,-71,11,11,-79,-79,39,3,-32,-62,-69,-78,-77,-79,-77,2,18,12,3,-18,-49,-80,-67,-73,-56,-60,3,-50,-64,-70,-73,-72,-60,-20,0,13,11,0,-19,-43,-60,-69,-66,-61,-46,-31],"ownershipAllowedMAE":0.0494895})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..XO............O../..OO.....O....O..../..........X...XX.../............O....../.................../.................../...............X.../.................../.................../.................../.................../.................../...X.....X.....X.../..OX..........O..../..OX......O.....X../.................../.................../","hintLoc":"null","initialTurnNumber":22,"metadata":"7A5BB0E28B046B883CE5B579FEE3EE85:32","moveLocs":["C5","O16","L16","K17","M14","J14","N13","O14","R16","Q16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.14,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":-2.719,"policyMixture":[7.62e-05,9.43e-05,0.000114,9.49e-05,9.69e-05,9.46e-05,9.49e-05,9.63e-05,0.000104,0.000108,0.000104,0.000101,9.65e-05,9.63e-05,9.13e-05,9.08e-05,9.03e-05,9.12e-05,7.5e-05,9.38e-05,0.00503,0.000177,0.0045,0.000162,0.000161,0.000142,0.000161,0.000165,0.000225,0.000213,0.000165,0.000156,0.000142,0.000141,0.000139,0.000157,0.000104,8.85e-05,0.000117,0.000214,0,0,0.000153,0.000207,0.000183,0.000241,0.000162,0,0.00637,0.000172,0.000252,0.000127,0.000102,0.000286,0,0.118,8.63e-05,0.000101,0.00503,0,0,0.000143,0.000172,0.000185,0.000534,0.000183,0,0,0.000122,0.000705,0,0,0,0,0.0057,8.9e-05,0.000103,0.00019,0.000158,0.000148,0.000177,0.000179,0.000208,0.000197,0.000768,0.00818,0,9.93e-05,0.000161,0.00582,0,0,0.468,0.0903,0.000106,0.000101,0.000181,0.000355,0.000195,0.000196,0.000208,0.000255,0.000942,0,0.00407,0.000112,0,0,0,0.000133,0.000145,0.000871,0.000184,0.000105,0.0001,0.00017,0.000431,0.000273,0.000276,0.000393,0.000713,0.00233,0.00807,0.00456,0.000313,0.000259,0,0.0042,0.000313,0.00595,0.00605,0.000185,0.000104,0.000102,0.000183,0.00141,0.00158,0.00116,0.00112,0.00124,0.00194,0.00308,0.00352,0.0023,0.00119,0.000296,0.000874,0.000355,0.000206,0.000782,0.000178,0.000105,0.000104,0.000191,0.00319,0.00662,0.0018,0.00128,0.00125,0.00132,0.00134,0.00144,0.00215,0.00152,0.00126,0.00115,0.000177,0,0.000192,0.000181,0.000104,0.000104,0.000187,0.00149,0.00307,0.00104,0.000623,0.000583,0.000518,0.000469,0.000647,0.00107,0.00116,0.00083,0.000602,0.000235,0.000182,0.000227,0.000169,0.000103,0.000104,0.000176,0.000253,0.000322,0.000229,0.000225,0.000235,0.000243,0.000271,0.000356,0.000418,0.000422,0.000335,0.000266,0.000362,0.000481,0.00023,0.000161,0.000101,9.85e-05,0.000161,0.000181,0.000185,0.000186,0.000194,0.000202,0.000207,0.000221,0.000246,0.000247,0.000249,0.000266,0.000249,0.000282,0.000569,0.00021,0.000155,0.0001,9.56e-05,0.000142,0.000159,0.00015,0.00016,0.000175,0.000186,0.000192,0.000197,0.00021,0.000212,0.000223,0.000242,0.000272,0.000276,0.000303,0.000196,0.00015,9.87e-05,0.000105,0.000177,0.000108,0.000103,0.000128,0.000156,0.000177,0.000188,0.000174,0.000157,0.00018,0.000254,0.000382,0.00133,0.000226,0.000181,0.000185,0.000151,9.81e-05,0.000115,0.000157,0,0,9.53e-05,0.000139,0.000169,0.000186,0.000165,0,0.000157,0.00115,0.00251,0.000244,0.00395,0,0.00016,0.00015,9.65e-05,9.97e-05,0.000134,0,0,8.73e-05,0.000133,0.000166,0.000213,0.000543,0.000219,0.00743,0.105,0.00515,0.000211,0,0.000182,0.000142,0.000132,9.38e-05,9.75e-05,0.000107,0,0,0.0001,0.000147,0.000177,0.00024,0.00231,0.0034,0,0.00311,0.00439,0.000616,0.000173,0.000163,0,0.000112,9.26e-05,0.000102,0.000114,0.000138,0.000149,0.00016,0.00014,0.000166,0.000181,0.000206,0.000288,0.000589,0.000367,0.00162,0.000223,0.000656,0.000186,0.000131,0.000116,8.91e-05,7.82e-05,9.68e-05,9.78e-05,0.000111,9.96e-05,9.62e-05,9.77e-05,0.000102,0.000106,0.000109,0.000108,0.000109,0.00011,0.000107,0.000105,0.000106,0.000103,9.1e-05,7.75e-05,5.83e-05],"winrateAvg":0.990016,"leadAvg":14.7617,"scoreMeanAvg":16.555,"scoreStdevAvg":15.5993,"shorttermWinlossErrorAvg":0.0112094,"shorttermScoreErrorAvg":1.30693,"ownership":[68,70,71,71,68,63,58,54,49,37,22,17,25,38,53,62,64,61,57,67,65,76,76,73,62,61,58,62,52,24,15,27,49,58,69,67,61,55,64,73,65,98,66,55,56,54,58,86,-12,-3,45,48,66,73,83,65,43,58,69,98,98,53,47,48,48,51,85,-57,-15,4,88,90,90,-63,10,19,49,54,52,47,34,36,38,42,48,9,-57,-16,34,-9,-65,-66,-62,-26,-7,35,35,27,29,26,26,27,30,80,20,-19,-56,60,60,11,-17,-27,-27,-23,24,27,23,22,19,17,17,16,14,2,-11,-20,-48,20,4,-11,-33,-31,-30,15,18,16,16,12,9,8,9,4,-5,-16,-10,-14,1,-3,-26,-37,-35,-32,8,11,9,5,6,5,4,4,2,-3,-10,-7,-8,-8,-11,-76,-41,-31,-30,2,4,6,12,5,3,2,1,-1,-3,-6,-6,-5,-6,-11,-24,-28,-27,-24,-5,-3,-2,-1,0,0,-1,-1,-3,-4,-5,-4,-4,-5,-11,-19,-16,-20,-20,-14,-13,-7,-7,-5,-4,-3,-3,-4,-5,-5,-4,-4,-5,-11,-18,-20,-21,-19,-30,-15,-17,-16,-11,-8,-7,-6,-6,-7,-4,-4,-4,-5,-13,-21,-21,-25,-23,-41,-60,-48,-38,-18,-14,-11,-10,-10,-13,-7,-5,-6,-9,-14,-35,-34,-35,-31,-38,-38,-94,-94,-36,-19,-14,-12,-17,-62,-11,-6,-8,-5,-21,-79,-49,-41,-41,-27,-31,-12,-94,-47,-22,-15,-10,4,-5,10,-18,-5,4,43,-35,-50,-53,-48,-24,-19,-12,-94,-53,-27,-14,-4,-5,14,66,35,21,13,15,10,-76,-54,-52,-22,-17,-31,-43,-62,-24,-18,-5,8,24,38,35,25,16,4,-14,-41,-50,-50,-20,-24,-27,-42,-46,-35,-18,-4,10,22,31,31,25,15,1,-18,-32,-41,-45],"ownershipAllowedMAE":0.0340231})%"); + lines.push_back(R"%({"sample":{"board":"....X......XO...OO./OX.X.XO....XO.O.XOX/X.XXXO....X.XOOOOX./OX..OO...O..XXXXXX./.OXXOX............./.OOX..OOO........../..OXOXOXOXX......../.OXXOOXXXO........./...OOX..X......X.../..O.XO.....X.OX.X../....OOXO.X....OXX../.OOOX..X...OO.OX.X./.OXXX.X...O.OXXX.X./OXO......O.OOOXOX../OXOO..X...OX.XOOX../.XXO..XO.OXXXXXOXO./.XOO..OO.OXOOXXOOO./.XXO....OXXO.OXO.X./X.X.....OXO.OOXO.../","hintLoc":"null","initialTurnNumber":73,"metadata":"E7D4FE07A08DFF4C406DF95FB4643888:83","moveLocs":["M1","H10","N2","K10","J10","J9","K8","G11","K11","J8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.31,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":4.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.49e-05,1.4e-05,1.35e-05,1.34e-05,0,1.45e-05,1.89e-05,1.52e-05,1.64e-05,1.58e-05,1.44e-05,0,0,0.00116,0.000538,0.000745,0,0,1.9e-05,0,0,1.43e-05,0,1.21e-05,0,0,7.61e-05,2.14e-05,1.84e-05,1.47e-05,0,0,0.000975,0,4.42e-05,0,0,0,0,1.5e-05,0,0,0,0,0.00101,0.00519,5.79e-05,2.05e-05,0,1.43e-05,0,0,0,0,0,0,1.52e-05,0,0,1.31e-05,2.42e-05,0,0,2.55e-05,7.09e-05,2.25e-05,0,1.96e-05,1.55e-05,0,0,0,0,0,0,1.32e-05,0.0718,0,0,0,0,0,2.34e-05,1.77e-05,1.94e-05,3.27e-05,2.45e-05,1.79e-05,1.6e-05,1.48e-05,1.45e-05,1.42e-05,1.37e-05,1.36e-05,1.34e-05,3.15e-05,0,0,0,0.00397,2.67e-05,0,0,0,2.29e-05,1.9e-05,1.93e-05,1.73e-05,1.62e-05,1.57e-05,1.49e-05,1.38e-05,1.36e-05,1.32e-05,0.000507,1.41e-05,0,0,0,0,0,0,0,0,0,1.99e-05,1.9e-05,1.73e-05,1.65e-05,1.51e-05,1.42e-05,1.38e-05,1.34e-05,1.7e-05,0,0,0,0,0,0,0,0,0,3.25e-05,2.68e-05,2.38e-05,2e-05,1.67e-05,1.57e-05,1.39e-05,1.36e-05,1.34e-05,1.52e-05,0.304,1.56e-05,0,0,0,0,1.08e-05,0,0,2.54e-05,3.06e-05,7.03e-05,0.082,1.66e-05,0,1.43e-05,1.35e-05,1.32e-05,1.52e-05,1.63e-05,0,1.37e-05,0,0,6.18e-05,0,0,0,0.000133,0,0.0774,0,0,1.38e-05,0,1.38e-05,1.33e-05,1.46e-05,1.46e-05,1.43e-05,1.5e-05,0,0,0,0,0,0,1.82e-05,5.03e-05,0.0207,0.000116,0,0,0,1.42e-05,1.38e-05,1.44e-05,0,0,0,0,0.000112,7.54e-05,0,0,0,1.37e-05,0,0,0.00666,0,0,1.5e-05,0,1.47e-05,1.56e-05,0,0,0,0,1.23e-05,0,1.47e-05,0.000621,0.000164,0,0,0,0,0,0,1.62e-05,0,1.58e-05,0,0,0,1.88e-05,1.4e-05,0.00145,1.34e-05,0.000173,4.26e-05,0,0,0,0,0,0,0,0,2.02e-05,2.08e-05,0,0,0,0,0.000406,1.51e-05,0,2.39e-05,0.00379,0.000543,0,0,1.36e-05,0,0,0,0,0.237,0.000563,1.43e-05,0,0,0,2.13e-05,0.000108,0,0,3.37e-05,0,0,0,0,0,0,0,0,0,0.000171,1.36e-05,0,0,0,3.05e-05,7.32e-05,0,0,3.2e-05,0,0,1.32e-05,1.36e-05,0,0,0,0,0,0.0326,1.05e-05,0,0,0,0.0121,0.00333,2.09e-05,1.56e-05,0,0,0,1.37e-05,0,1.43e-05,0,0,1.27e-05,0,0.0189,0,7.97e-06,0,0.000986,2.13e-05,2.28e-05,1.64e-05,1.51e-05,0,0,1.35e-05,0,1.37e-05,1.38e-05,0,0,0.00292,0.0259,0.079,1.58e-05],"winrateAvg":0.579504,"leadAvg":0.858617,"scoreMeanAvg":0.679589,"scoreStdevAvg":5.97336,"shorttermWinlossErrorAvg":0.321101,"shorttermScoreErrorAvg":1.61273,"ownership":[-81,-82,-90,-91,-92,-48,-3,12,-4,-30,-65,-90,91,92,92,92,93,93,16,-64,-90,-90,-94,-87,-88,65,1,9,-31,-54,-90,90,91,92,92,91,92,-96,-68,-68,-95,-95,-94,95,64,12,11,-2,-90,-79,-99,92,92,92,92,-100,-96,-55,-77,-68,-23,95,95,61,34,40,83,27,4,-99,-100,-100,-100,-100,-100,-97,-60,40,-90,-90,94,74,80,60,58,33,14,27,-23,-58,-71,-83,-91,-95,-96,-30,36,36,-90,-46,92,98,98,99,19,-10,-42,-50,-59,-68,-79,-88,-93,-95,-6,36,34,-91,100,92,98,-94,98,-94,-94,-59,-57,-61,-68,-81,-90,-93,-94,25,47,-93,-92,100,100,-94,-94,-94,-87,-88,-63,-55,-54,-62,-80,-91,-94,-95,51,38,74,100,100,99,100,20,-94,-94,-78,-65,-45,-39,-59,-99,-95,-96,-96,74,79,100,99,98,100,98,99,-93,-67,-69,-91,-5,42,-86,-85,-100,-98,-97,89,91,96,99,100,100,93,99,99,-71,-2,3,34,31,66,-100,-100,-99,-98,94,100,100,100,91,97,94,91,99,-67,51,100,100,-3,66,-100,-99,-100,-98,94,100,92,91,91,93,91,93,92,33,99,98,100,-100,-100,-100,-96,-100,-91,93,-98,99,94,93,92,93,94,94,100,97,100,100,99,-100,66,-96,-83,-74,86,-97,98,99,93,93,90,95,92,95,97,-100,-26,-100,67,67,-96,-29,-20,-73,-97,-97,98,94,93,90,100,94,99,-100,-100,-100,-100,-100,69,-96,64,23,-97,-97,98,98,91,94,100,100,98,99,-100,-100,-100,-100,-100,68,68,66,28,-97,-96,-97,98,42,49,78,92,99,-100,-100,-100,-100,-100,-100,66,36,-15,26,-97,-97,-97,-37,8,37,75,92,99,-100,-100,-100,-100,-100,-100,65,38,21,22],"ownershipAllowedMAE":0.0373203})%"); + lines.push_back(R"%({"sample":{"board":".................../...........OX....../...O.O.....X.XX.O../..O........OXO.X.O./..XX........OOX..../............OX.XO../........X...OXXOO../.........X..O....X./..XXO..O....OXX.X../..XO.O.OXXXXXO.O.../.XOO..XXOOOOO.OOXX./.X....XO....X.XOOO./...O..........XOX../..O.X.XXX....XOO.../..OO.OXOX.X..XXOOO./..XO.X...OOXX.OXXXO/..X.OXXOOO.OX..X.O./.X.XOX.X.O.OX...X../....O..OO.O......../","hintLoc":"null","initialTurnNumber":48,"metadata":"A3692A25B65D7C58BB47FACD8AB7DDBC:58","moveLocs":["Q11","N17","L17","O18","N16","J11","K11","N17","O8","O9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.76,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1button1","komi":7.5,"policyOptimism":0.513,"pda":0.0,"policyMixture":[4.85e-06,4.66e-06,4.63e-06,4.72e-06,4.81e-06,4.89e-06,4.82e-06,4.91e-06,4.89e-06,4.88e-06,5.27e-06,5.08e-06,0.00658,5.98e-06,8.14e-06,6.12e-06,5.07e-06,5.3e-06,4.83e-06,4.67e-06,4.95e-06,4.78e-06,4.91e-06,5.09e-06,4.94e-06,5.28e-06,5.24e-06,5.18e-06,5.24e-06,1.02e-05,0,0,0,4.65e-05,3.97e-05,9.86e-05,5.05e-05,5.06e-06,4.65e-06,4.82e-06,4.88e-06,0,5.05e-06,0,5.13e-06,5.35e-06,5.74e-06,5.42e-06,0,0,0,0,0,5.64e-05,0,7.03e-05,5.04e-06,4.54e-06,4.69e-06,0,4.82e-06,5.47e-06,5.66e-06,6.41e-06,6.4e-06,9.36e-06,1.3e-05,2.8e-05,0,0.987,0,5.82e-05,0,0.000618,0,6.09e-06,4.72e-06,4.93e-06,0,0,5.18e-06,6.24e-06,7.88e-06,1.31e-05,1.92e-05,3.15e-05,1.1e-05,6.61e-06,0,0,0,5.34e-06,0.00342,8.14e-05,1.67e-05,4.58e-06,4.75e-06,4.79e-06,4.93e-06,5.23e-06,1.06e-05,2.04e-05,2.81e-05,7.25e-06,1.21e-05,7.49e-06,5.45e-06,0,0,4.77e-06,0,0,7.53e-05,2.18e-05,4.62e-06,4.81e-06,5.03e-06,5.14e-06,5.76e-06,1.15e-05,2.86e-05,7e-06,0,4.88e-06,5.33e-06,5.19e-06,0,0,0,0,0,0.000144,1.84e-05,4.6e-06,4.86e-06,4.75e-06,5.25e-06,1.95e-05,3.59e-05,9.49e-06,5.06e-06,4.96e-06,0,4.88e-06,4.9e-06,0,5.75e-05,4.73e-06,5.94e-06,5.35e-06,0,5.51e-06,4.84e-06,4.67e-06,0,0,0,6.12e-06,1.04e-05,0,0,0,4.57e-06,5.1e-06,0,0,0,0,0,5.38e-06,3.21e-05,4.69e-06,4.63e-06,0,0,6.41e-06,0,3.08e-05,0,0,0,0,0,0,0,4.47e-06,0,2.08e-05,1.84e-05,5.21e-06,4.2e-06,0,0,0,1.05e-05,5.35e-06,0,0,0,0,0,0,0,0,0,0,0,0,1.96e-05,4.31e-06,0,1.36e-05,5.52e-06,8.13e-06,5.03e-06,0,0,7.5e-06,5.36e-06,5.49e-06,5.88e-06,0,0,0,0,0,0,0.000343,4.54e-06,4.87e-06,6.84e-06,0,4.76e-06,4.71e-06,4.84e-06,5.06e-06,4.82e-06,5.26e-06,5.82e-06,4.96e-06,4.85e-06,4.85e-06,0,0,0,0.000103,8.33e-06,4.58e-06,4.52e-06,0,4.56e-06,0,4.91e-06,0,0,0,5.01e-06,5.21e-06,5.14e-06,4.66e-06,0,0,0,5.08e-06,4.82e-06,3.71e-05,4.71e-06,4.79e-06,0,0,4.8e-06,0,0,0,0,5.3e-06,0,4.94e-06,4.83e-06,0,0,0,0,0,3.71e-05,4.74e-06,5.28e-06,0,0,5.02e-06,0,4.63e-06,4.94e-06,4.52e-06,0,0,0,0,4.79e-06,0,0,0,0,0,4.78e-06,4.52e-06,0,5.21e-06,0,0,0,0,0,0,5.03e-06,0,0,4.97e-06,4.53e-06,0,5.09e-06,0,7.11e-06,4.56e-06,0,4.27e-06,0,0,0,1.82e-05,0,6.06e-06,0,5.08e-06,0,0,4.7e-06,4.91e-06,4.62e-06,0,5.29e-06,4.82e-06,4.96e-06,4.82e-06,4.71e-06,4.67e-06,0,5.34e-06,5.37e-06,0,0,0,0,4.5e-06,4.9e-06,4.81e-06,4.82e-06,4.88e-06,4.57e-06,4.49e-06,4.78e-06,5.45e-06],"winrateAvg":0.56885,"leadAvg":0.755779,"scoreMeanAvg":1.25724,"scoreStdevAvg":25.0911,"shorttermWinlossErrorAvg":0.344232,"shorttermScoreErrorAvg":6.11216,"ownership":[54,59,62,62,57,46,31,17,6,-4,-15,-15,-27,-23,-30,-9,16,30,37,49,56,60,68,62,53,32,17,8,-3,-25,-8,-32,-15,-44,-7,27,38,37,37,51,61,81,36,78,18,9,6,-1,-49,-49,-11,-77,-79,-17,48,40,37,14,28,71,-18,-4,12,5,3,5,5,-7,34,-14,56,-43,-78,-18,43,32,-14,-21,-74,-74,-13,4,3,-1,4,7,7,18,56,56,-78,-44,-17,24,17,-33,-45,-39,-19,1,4,2,1,-8,2,9,26,60,-76,-70,-72,26,12,-6,-47,-46,-29,-12,12,8,2,-1,-43,15,18,29,63,-76,-76,29,26,-27,-31,-57,-58,-47,-5,22,-4,7,17,5,-27,11,29,65,47,-68,-27,-24,-75,-52,-66,-69,-78,-78,70,41,39,68,68,-21,2,25,68,-75,-75,-76,-76,-68,-52,-69,-75,-78,71,60,73,1,69,-18,-18,-18,-19,-21,83,23,85,15,-57,-31,-63,-76,70,70,6,3,-72,-70,84,84,85,85,83,82,84,83,-67,-68,8,-31,-76,-14,39,-14,-15,-75,5,-5,25,23,-4,-84,-83,-84,82,82,83,24,-7,-12,-6,68,-4,1,-52,-54,-23,-8,-2,-9,-27,-83,-86,81,60,65,57,21,35,69,30,-63,-38,-90,-89,-89,-45,-12,-32,-45,-94,83,82,73,68,60,20,31,70,70,-2,13,-90,12,-88,34,-53,-40,-64,-93,-93,82,81,80,65,-19,13,-72,70,24,-84,-65,17,27,83,84,-95,-95,-84,-66,-70,-70,-70,69,-46,-71,-71,9,64,-83,-83,84,82,82,82,84,-94,-76,-66,-72,-30,55,55,-69,-72,-64,-67,64,-82,-63,-67,67,82,82,84,-94,-64,-56,-58,-71,14,21,-69,-65,-56,-13,64,16,13,80,81,81,83,51,19,-39,-48,-55,-54,-47,-14],"ownershipAllowedMAE":0.0762936})%"); + lines.push_back(R"%({"sample":{"board":"...X...........O.X./..XOOXXOOXXO..O.OX./...XOXOOXXO.O.OOXO./..XXXO.O..OOOXXXX../...XO..OX...XXOOX../..XOO.OXXXX....OOX./.XO.O..OX..OOOOXXX./.XXO..OX.XXOXXXOOX./..XO..O.OX.X...OXX./.OXO....OX.XXOO.O../XXO.OOOXXXXXXXXO.O./XOOXXOOOOOO.O.XO.../.XOOOXOXOXOOOOXXO../.XX..XX.XXXOXXOOOO./.OXXX..X..XXX.X.X../.OOOXXXXOOOXXXXXX../....OXOO.OXOOXOOOO./.OXOOXO.XOXOOO...../...O.XO....X......./","hintLoc":"null","initialTurnNumber":204,"metadata":"1E4133A926B86C8272D3B95BB7BB9600:214","moveLocs":["S5","G13","F13","S10","T10","G15","H13","T11","T9","G13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.22,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000212,0.000209,0.00155,0,0.00062,0.0024,0.112,0.000272,0.000448,0.00517,0.00408,0.00272,0.000228,0.000211,0.000212,0,0.0229,0,0.00323,0.000211,0.000214,0,0,0,0,0,0,0,0,0,0,0.000212,0.00025,0,0.000224,0,0,0.00902,0.000209,0.000212,0.000233,0,0,0,0,0,0,0,0,0.000145,0,0.000313,0,0,0,0,0.00641,0.000211,0.000259,0,0,0,0,0.0022,0,0.0299,0.0116,0,0,0,0,0,0,0,0.0214,0.000915,0.000216,0.000308,0.0199,0,0,0.00727,0,0,0,0.00848,0.0132,0.0694,0,0,0,0,0,0.000255,0.000265,0.000378,0.112,0,0,0,0.316,0,0,0,0,0,0.00187,0.000231,0.000213,0.000213,0,0,0,0.000221,0.00987,0,0,0.000298,0,0,0,0,0,0.00023,0.000231,0,0,0,0,0,0,0,0.000215,0.0114,0,0,0,0.000219,0.000213,0,0,0.000218,0,0,0,0,0,0,0,0,0,0.000217,0.00156,0.00631,0,0,0.000209,0.000214,0,0.000381,0,0,0.00021,0,0.00395,0.00514,0.00353,0,0,0,0,0.00968,0,0,0,0.000219,0.000226,0.000291,0.000571,0,0,0.000208,0,0,0,0,0.000262,0,0,0,0,0,0,0.000244,0,0,0,0,0,0,0,0,0,0,0,0,0.000251,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000256,0,0.000255,0,0,0.000248,0.000237,0.000235,0.00214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000246,0.000234,0.000547,0,0,0.000246,0.000247,0,0,0.128,0,0,0,0,0,0,0,0,0,0,0.000214,0.000315,0,0,0,0,0.000222,0.000227,0,0.0108,0.000204,0,0,0,0,0,0.000254,0,0,0.000217,0.000219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000355,0.000245,0.000212,0.000215,0.000216,0.000217,0,0,0,0,0.000255,0,0,0,0,0,0,0,0,0,0.000213,0.000212,0,0,0,0,0,0,0.000227,0,0,0,0,0,0,0.000221,0.000205,0.000205,0.000206,0.000205,0.000207,0.000211,0.000219,0,0.000223,0,0,0.000223,0.000252,0.000227,0.000232,0,0.000215,0.0002,0.000201,0.000202,0.000204,0.000207,0.000207,0.000155],"winrateAvg":0.00120373,"leadAvg":-3.72389,"scoreMeanAvg":-3.69826,"scoreStdevAvg":1.93318,"shorttermWinlossErrorAvg":0.0128165,"shorttermScoreErrorAvg":0.544653,"ownership":[-100,-100,-100,-100,-100,-90,31,68,14,-72,-21,60,99,100,100,100,59,-97,-97,-100,-100,-100,-100,-100,-100,-100,98,98,-100,-99,100,100,99,100,99,99,-97,-98,-100,-100,-100,-100,-100,-100,98,98,-100,-100,100,100,100,-45,100,100,-100,-98,-98,-99,-99,-100,-100,-100,99,97,98,-61,-28,100,100,100,-100,-100,-100,-100,-99,-99,-99,-99,-99,-100,100,98,89,98,-100,-77,21,14,-100,-100,-100,-100,-100,-100,-100,-98,-97,-98,100,100,94,94,-100,-100,-100,-100,-99,-99,-99,-100,-100,-100,-100,-100,-98,-99,30,37,100,100,-40,-36,-100,-100,-100,-99,-99,-99,-99,-100,-100,-100,-100,-98,-99,-99,100,100,100,100,-89,-33,-100,-100,-99,-100,-100,-100,99,99,-100,-100,-99,-99,-99,100,100,99,100,85,98,-100,-100,-100,-100,-70,15,99,-100,-100,-100,-99,-98,-99,100,99,98,-57,-83,98,-100,-100,-100,-100,99,99,99,100,-100,100,-99,-99,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,55,100,-42,-100,100,100,100,99,-99,-100,100,100,100,-100,100,-1,100,-100,100,100,100,100,-100,-100,100,100,100,-31,-100,-100,-6,-53,-100,-100,3,-100,-100,-100,100,-100,-100,100,100,100,100,100,-6,100,-100,-100,-100,-100,-100,-100,-84,-48,-100,-100,-100,-100,-100,-26,-100,100,99,97,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-59,99,99,100,100,100,100,-100,99,99,99,100,99,100,100,-100,100,100,100,100,99,100,100,99,100,100,-100,99,99,98,100,99,100,100,100,100,100,100,100,100,100,100,100,100,11,-100,99,99,99,99,99,99,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.0205828})%"); + lines.push_back(R"%({"sample":{"board":".................../...OX.OX...OO....../..OXXO.X..XX.O.OOO./.XOOO.O.X.XO.OXXXO./........XOOXOOX.OX./........OXX.XOX.OX./....OO.O.X.X.OXOOX./....OX...XO.XXOOX../......X...O.X.X.X../........XXX..X...../....O..OO........../.O.O.O.XO.X....X.../.XXO.O.XO.OX......./XOXXO.OOX........../.OOXO.OXX.XX.X.X.../.XXOXX.X.OOOXO.XO../..XOOX.XO...OO.XX../.XO.OOOXXOO..OX..../.XOO.....XO......../","hintLoc":"null","initialTurnNumber":142,"metadata":"5F07979602D6AED00E683B787D791693:152","moveLocs":["C18","F18","D19","M14","H14","J13","M15","C8","A5","M14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.19,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.88e-06,3.75e-06,3.23e-06,0,4.46e-06,3.99e-05,2.24e-05,3.96e-06,3.47e-06,3.53e-06,3.56e-06,3.25e-06,3.38e-06,3.59e-06,3.54e-06,3.19e-06,3.14e-06,3.15e-06,3.18e-06,4.02e-06,2.64e-05,0,2.87e-06,0,0,0,0,3.78e-06,3.69e-06,4e-06,0,0,7.65e-06,1.95e-05,3.62e-06,3.32e-06,3.26e-06,3.03e-06,4.29e-06,0.015,0,0,0,0,1.42e-05,0,3.37e-06,3.12e-06,0,0,1.03e-05,0,7.22e-05,0,0,0,3.32e-06,3.45e-06,0,0,0,0,0.00394,0,6.27e-06,0,3.87e-05,0,0,3.71e-06,0,0,0,0,0,3.4e-06,3.34e-06,1.06e-05,6.7e-06,4e-06,1.35e-05,0.451,0.0761,0.00683,0,0,0,0,0,0,0,3.42e-06,0,0,3.5e-06,3.34e-06,7.7e-06,4.3e-06,4.69e-06,4.11e-06,3.11e-05,0.000718,0,0,0,0,0,0,0,0,3.4e-06,0,0,3.49e-06,3.32e-06,3.47e-06,3.57e-06,3.48e-06,0,0,0.114,0,0,0,3.26e-06,0,3.92e-06,0,0,0,0,0,3.3e-06,3.33e-06,3.49e-06,3.4e-06,3.27e-06,0,0,9.76e-05,0.000304,0.0303,0,0,3.29e-06,0,0,0,0,0,3.47e-06,3.54e-06,3.63e-06,3.35e-06,3.42e-06,3.54e-06,4.98e-06,3.61e-06,0,3.55e-06,3.57e-06,3.13e-06,0,3.32e-06,0,3.22e-06,0,9.79e-06,0,3.23e-06,3.35e-06,3.78e-06,3.41e-06,3.23e-06,3.2e-06,3.4e-06,3.31e-06,3.51e-06,4.25e-06,0,0,0,3.36e-06,3.46e-06,0,3.21e-06,3.13e-06,3.08e-06,3.28e-06,3.05e-06,3.45e-06,3.41e-06,3.12e-06,3.14e-06,0,3.13e-06,6.01e-06,0,0,3.44e-06,3.17e-06,3.36e-06,3.4e-06,3.47e-06,3.31e-06,3.26e-06,3.13e-06,3.09e-06,3.1e-06,4.14e-06,0,0,0,3.4e-06,0,3.46e-06,0,0,3.5e-06,0,3.19e-06,3.57e-06,3.64e-06,3.48e-06,0,3.22e-06,3.17e-06,3.1e-06,3.58e-06,0,0,0,3.23e-06,0,2.95e-06,0,0,1.48e-05,0,0,3.41e-06,3.86e-06,3.63e-06,3.43e-06,3.23e-06,3.08e-06,3.05e-06,0,3.15e-06,0,0,0,3.63e-06,0,0,0,6.26e-06,9.83e-06,3.88e-06,4.05e-06,3.75e-06,3.65e-06,3.57e-06,3.16e-06,3.13e-06,3.02e-06,0,2.99e-06,3.11e-06,0,0,3.38e-06,0,0,0,2.97e-05,0,0,0.00019,0,3.6e-06,0,3.19e-06,3.14e-06,3.03e-06,3.39e-06,0,0,0,0,0,3.33e-06,0,0.177,0,0,0,0,0,3.66e-06,0,0,3.05e-06,3.04e-06,3.19e-06,3.3e-06,0,0,0,0,3.15e-06,0,0,0.00185,1.49e-05,5.18e-05,0,0,3.18e-06,0,0,3.13e-06,3.09e-06,3.26e-06,0,0,0,0,0,0,0,0,0,0,0.00909,1.1e-05,0,0,3.21e-06,3.12e-06,2.97e-06,3.03e-06,3.23e-06,0,0,0,0.00144,4.75e-05,0.00189,3.37e-06,3.98e-06,0,0,3.89e-05,0.000764,0.109,3.51e-06,3.43e-06,3.23e-06,2.98e-06,2.83e-06,1.02e-05],"winrateAvg":0.198541,"leadAvg":-1.80122,"scoreMeanAvg":-2.55938,"scoreStdevAvg":6.01973,"shorttermWinlossErrorAvg":0.302958,"shorttermScoreErrorAvg":2.0867,"ownership":[11,7,2,2,24,77,61,10,-20,2,33,56,92,98,98,99,99,99,99,19,9,0,10,12,98,97,-67,-34,-11,-7,99,99,98,99,99,99,99,99,27,35,95,10,11,97,22,-66,-56,-45,-64,-67,4,100,86,100,100,100,97,40,30,96,98,98,92,96,-4,-66,-53,-66,-20,-21,100,-88,-88,-87,100,41,48,60,66,73,66,44,38,15,-64,-44,-49,-49,99,100,-87,-5,88,-98,12,56,58,69,70,72,68,71,11,76,-98,-98,-38,-51,100,-87,1,87,-98,-35,63,69,72,77,99,99,32,82,78,-98,-93,-97,19,99,-86,87,89,-98,-86,68,73,75,80,99,-46,3,-27,-26,-98,-89,-94,-100,-100,85,86,-99,-96,-95,70,76,75,79,3,-16,-82,-53,-71,-90,-88,-92,-100,-99,-99,-68,-100,-96,-96,70,76,77,66,30,24,-13,4,-99,-100,-100,-88,-89,-100,-91,-93,-95,-96,-96,-1,83,83,85,100,63,25,96,95,-5,-68,-82,-76,-75,-80,-88,-94,-95,-95,-48,100,100,100,99,100,95,93,95,-8,-92,-75,-71,-63,-69,-98,-94,-95,-95,-67,-100,-100,100,99,100,98,94,94,-1,23,-91,-45,-50,-58,-73,-93,-95,-95,-100,-100,-100,-100,99,86,100,100,-89,-51,-57,-51,-20,-35,-48,-74,-94,-95,-95,-100,-100,-100,-100,99,-41,100,-90,-89,29,-82,-81,32,-68,-22,-100,-96,-96,-95,-100,-100,-100,97,-91,-90,-35,-91,-45,95,95,95,31,95,15,-100,-95,-97,-96,-100,-100,-100,96,95,-90,8,-93,82,84,92,92,95,95,45,-100,-100,-97,-97,-100,-100,96,96,96,96,97,-94,-94,95,95,92,93,95,-93,-89,-95,-96,-96,-100,-100,95,96,95,94,10,-43,-12,-13,94,93,91,21,1,-88,-93,-95,-96],"ownershipAllowedMAE":0.0495787})%"); + lines.push_back(R"%({"sample":{"board":".................../...X...O.........../.XX..XXO..XX..X..../.O.O......OOXX..O../...OX.XO....OX.XO../...O..XO..OO..XX.../.....XO....XXOXOO../.....XO......XO..../...O.XO......XO..../......O......XO..../.O............O..../..O................/.OXX.............../OXOOX...........X../.XX..O.....O...O.../.X.XO.OO..XOX.OXX../..OXOOXOX.OXO.OOX../...X..XOX.X.....X../.................../","hintLoc":"null","initialTurnNumber":100,"metadata":"28800CABB73BD28170F44C8E34C4D980:110","moveLocs":["M2","N5","L5","D8","E7","D17","E17","B18","C18","A17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.98,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.88e-06,0.000107,1.3e-05,4.03e-06,3.9e-05,6.27e-06,5.78e-06,5.1e-06,4.69e-06,5.09e-06,4.41e-06,4.27e-06,4.14e-06,4.08e-06,4.38e-06,4.6e-06,4.92e-06,4.84e-06,4.05e-06,0.0378,0,0,0,4.53e-06,5.99e-06,2.52e-05,0,6.6e-06,5.05e-05,5.43e-06,4.54e-06,4.31e-06,4.34e-06,4.67e-06,6.49e-06,0.000144,1.05e-05,5.11e-06,0,0,0,0,0,0,0,0,1.8e-05,0.000195,0,0,3.87e-06,4.16e-06,0,5.55e-06,0.0042,8.52e-06,5.11e-06,9.97e-06,0,0.154,0,6.67e-06,5.08e-06,0.00165,4.94e-05,2.59e-05,0.000275,0,0,0,0,3.81e-06,4.84e-06,0,6.47e-06,4.9e-06,6.55e-06,3.15e-05,3.86e-06,0,0,3.99e-06,0,0,8.6e-06,8.43e-06,6.62e-06,5.76e-06,0,0,3.68e-06,0,0,7.04e-06,5.34e-06,5.44e-06,0.000164,2.45e-05,0,0.00421,5.66e-06,0,0,9.6e-06,8.53e-06,0,0,6.11e-06,4.19e-06,0,0,0.0402,5.7e-06,4.93e-06,4.83e-06,0.00438,0.00139,0.0143,6.22e-06,0,0,2.54e-05,0.000145,1.38e-05,2.67e-05,0,0,0,0,0,0,7.22e-06,5.32e-06,4.43e-06,1.21e-05,0.000364,0.559,4.72e-06,0,0,6.04e-06,6.21e-05,0.000157,6.25e-06,4.42e-06,3.95e-06,0,0,6.34e-06,6.72e-06,1.16e-05,4.73e-06,4.32e-06,5.49e-06,1.16e-05,0,7.72e-06,0,0,5.48e-06,2.16e-05,1.15e-05,6.59e-06,5.12e-06,4.09e-06,0,0,4.78e-06,7.46e-06,7.23e-06,4.69e-06,4.22e-06,6.21e-06,1.94e-05,0.000155,0.000142,0.0669,0,6.97e-06,1.04e-05,8.76e-06,7.12e-06,5.78e-06,4.72e-06,0,0,4.9e-06,8.06e-06,7.64e-06,4.79e-06,4.61e-06,0,5.63e-06,1.14e-05,0.000296,0.000136,3.51e-05,1.22e-05,9.65e-06,8.97e-06,7.74e-06,6.87e-06,6.34e-06,8.16e-06,0,7.02e-06,0.000657,4.83e-05,5.16e-06,5.75e-06,5.86e-05,0,0,0.039,3.77e-05,2.71e-05,1.56e-05,1.01e-05,1.01e-05,8.78e-06,8.28e-06,9.57e-06,9.24e-06,8.74e-06,3.9e-05,0.00166,4.24e-05,5.21e-06,2.68e-05,0,0,0,0,6.35e-06,9.09e-05,3.87e-05,1.33e-05,2.2e-05,8.71e-05,2.3e-05,1.84e-05,1.16e-05,2.43e-05,2.53e-05,9.93e-05,0.000117,5.1e-06,0,0,0,0,0,6.53e-06,0.000591,3.41e-05,1.51e-05,5.24e-05,0.0566,0.000101,7.48e-06,7.77e-05,4.43e-05,0.00026,0,7.13e-06,4.88e-06,4.89e-06,0,0,4.81e-06,1.71e-05,0,4.96e-06,6.75e-06,2.56e-05,6.9e-06,0,0,0,8.99e-06,7.69e-06,0,7.55e-06,5.56e-06,4.08e-06,4.03e-06,0,4.03e-06,0,0,0,0,0,8.86e-06,5.99e-06,0,0,0,6.72e-06,0,0,0,4.17e-06,4.44e-06,3.92e-06,4e-06,0,0,0,0,0,0,0,5.29e-06,0,0,0,5.49e-06,0,0,0,4.36e-06,4.06e-06,3.99e-06,4.17e-06,4.46e-06,0,5.8e-06,6.91e-06,0,0,0,3.82e-06,0,0,1.49e-05,7.18e-06,5.03e-06,5.96e-06,0,4.14e-06,4.23e-06,4.05e-06,4.41e-06,4.34e-06,4.7e-06,5.47e-06,6.16e-06,6.79e-06,0.00803,5.31e-06,4.13e-06,3.89e-06,4.3e-06,4.7e-06,5.23e-06,5.45e-06,5.04e-06,4.77e-06,3.99e-06,3.98e-06,5.55e-06],"winrateAvg":0.356683,"leadAvg":-0.834346,"scoreMeanAvg":-1.4184,"scoreStdevAvg":11.7744,"shorttermWinlossErrorAvg":0.212969,"shorttermScoreErrorAvg":1.5972,"ownership":[1,-51,-62,-77,-55,-30,20,56,46,5,-33,-56,-63,-66,-56,-36,-13,4,16,23,24,-84,-85,-83,-56,-8,91,35,-26,-59,-77,-75,-78,-72,-37,-1,14,26,64,-81,-81,94,-87,-87,-87,91,36,-7,-94,-95,-94,-91,-98,-19,-8,36,39,64,87,-49,94,9,-47,-2,46,44,23,85,85,-100,-100,-64,-9,77,63,54,79,81,12,94,-73,-61,-84,95,63,67,71,59,61,-100,-89,-99,77,71,68,84,85,78,94,10,-73,-84,95,50,50,90,90,24,-91,-99,-99,-74,83,70,87,85,76,43,1,-80,94,71,28,18,-8,-97,-97,-89,-99,89,90,73,72,87,86,89,-2,5,-80,93,39,8,-14,-22,-42,-55,-96,94,79,68,69,66,87,86,57,76,-19,-80,93,31,5,-9,-13,-24,-36,-96,94,67,60,56,57,88,80,50,5,-15,-15,92,24,6,-4,-9,-16,-28,-95,93,51,45,49,43,87,94,58,23,-1,0,11,8,2,-2,-4,-6,-7,7,93,29,25,36,28,84,89,93,91,-13,-6,5,5,1,-1,0,2,1,7,20,-2,16,16,7,65,88,-96,-95,-95,-17,13,10,2,-3,-2,12,16,13,5,-10,-19,-9,-21,63,-99,-91,-90,-95,19,23,19,-2,-29,-20,10,31,16,9,-21,-90,-60,-41,-82,-99,-99,-90,53,89,55,31,-1,-25,-89,84,85,52,49,52,-15,-77,-65,-96,-99,-97,-99,89,88,90,89,16,-39,-92,84,59,78,88,-93,-93,-86,-81,-97,-96,-93,-99,90,89,-9,90,-94,-91,-89,-94,62,38,88,88,-93,-90,-85,-95,-94,-94,-99,3,79,-17,90,-94,-90,-94,-94,4,11,42,19,-93,-83,-86,-93,-90,-84,-29,20,57,-17,-41,-55,-84,-83,-61,-33,-2,11,-13,-44,-80,-82],"ownershipAllowedMAE":0.0299829})%"); + lines.push_back(R"%({"sample":{"board":"............/..OXOX..OX../..XOXX.OXX../..XOOO.OOX../......XO.OX./...O.OX.O.X./..O.OXO.O.../....XXX..X../..OX....XO../..O.....OX../............/............/","hintLoc":"null","initialTurnNumber":45,"metadata":"A34F1BA5B0FD53FECFF7A5034E96AA51:55","moveLocs":["E12","B11","C8","H6","H4","B10","B9","C7","B5","C5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":12,"ySize":12},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.984,"pda":0.0,"policyMixture":[7.72e-06,0.0136,0.0172,1.55e-05,0,6.01e-06,0.000211,8.96e-06,1.53e-05,5.93e-06,5.6e-06,5.15e-06,0.00613,0,0,0,5.25e-06,0,0.000212,0.0166,0,0,5.61e-06,5.62e-06,0.00249,0,0,0,0,0,0.021,0,0,0,5.33e-06,5.38e-06,0.535,0,0,0,0,0,2.45e-05,0,0,0,5.04e-06,5.43e-06,0.00641,8.81e-06,0,9.01e-06,1.08e-05,0.00684,0,0,0,0,0,5.09e-06,1.05e-05,0.371,0,0,0.0012,0,0,5.6e-06,0,5.56e-06,0,5.25e-06,6.72e-06,2.53e-05,0,8.69e-06,0,0,0,0,0,5.74e-06,5.66e-06,5.42e-06,5.84e-06,0,0,6.1e-06,0,0,0,5.24e-06,6.08e-06,0,6.02e-06,5.69e-06,5.97e-06,6.64e-06,0,0,6.08e-06,6.21e-06,5.94e-06,0,0,0,7.01e-06,5.79e-06,6.07e-06,6.22e-06,0,0.000181,1.2e-05,7.49e-06,6.6e-06,6.95e-06,0,0,5.74e-06,5.6e-06,5.8e-06,6.25e-06,9.67e-06,0.000647,8.47e-05,1.83e-05,7.05e-06,6.21e-06,6.32e-06,6.12e-06,6.13e-06,5.75e-06,5.39e-06,5.79e-06,5.78e-06,6.22e-06,7.21e-06,6.7e-06,6.41e-06,6.13e-06,6.16e-06,5.69e-06,5.86e-06,4.73e-06,6.89e-06],"winrateAvg":0.180434,"leadAvg":-1.92994,"scoreMeanAvg":-2.58816,"scoreStdevAvg":5.68993,"shorttermWinlossErrorAvg":0.310614,"shorttermScoreErrorAvg":2.30082,"ownership":[-20,-29,-41,-52,-62,-43,-16,-6,-37,-43,-77,-82,-20,-6,-2,-63,-53,-59,20,-4,-2,-97,-82,-89,-17,-8,-28,99,-63,-62,9,97,-97,-97,-94,-92,-24,-28,-24,99,100,99,90,96,95,-98,-96,-95,-5,-2,-27,71,88,84,84,96,67,71,-98,-94,11,-4,99,100,87,93,83,90,95,-18,-98,-88,30,45,100,56,91,-97,94,95,95,39,-78,-81,48,30,99,22,-97,-97,-97,-10,4,-89,-75,-76,63,76,99,-76,-49,-49,-66,-98,-98,-62,-70,-68,73,82,98,0,-12,-28,-41,-54,-24,-73,-59,-60,75,74,65,20,3,-2,-33,-35,-37,-34,-49,-54,70,64,52,34,8,-9,-21,-30,-32,-37,-43,-49],"ownershipAllowedMAE":0.0963996})%"); + lines.push_back(R"%({"sample":{"board":".................../.O.OXXO........XXXO/.XO.XOX.XX.O.X.OXO./.OXXXOO.XOO...XXO../.OO.OXX.X..OOX.O.O./....OX..XOOXO.XOO../..X.OX.OOXXX.OXXO../...XOO.OX.OXXO.X.../...OXOOOX..XOOO.X../.X.XXXXO.X.XO.OX.../...O.XOO.XOXXO...../..XO.XO.XO..XXOOXX./..XOXXOX..OO.XOXOO./..XXOXXOOOXO.X.XXO./....O.OXX..O.OXXO../.XXOO.OOXO..X.XO.O./..O.O.XOXO.OO.X.O../.OOOXXXOX.OXX....../.......XXO........./","hintLoc":"null","initialTurnNumber":121,"metadata":"6C4A012BCA7750C66625BB88AFBD31F4:131","moveLocs":["M4","N5","P6","N16","F5","F4","G1","L3","R2","Q3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.0,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":-2.0,"policyOptimism":0.332,"pda":0.0,"policyMixture":[2.36e-05,2.7e-05,2.57e-05,2.61e-05,2.54e-05,2.56e-05,2.64e-05,2.55e-05,2.57e-05,2.74e-05,2.73e-05,2.6e-05,2.69e-05,2.84e-05,2.68e-05,2.49e-05,2.42e-05,2.57e-05,3.03e-05,2.56e-05,0,6.87e-05,0,0,0,0,2.5e-05,2.64e-05,2.85e-05,3.59e-05,5.88e-05,5.4e-05,4.12e-05,2.73e-05,0,0,0,0,2.61e-05,0,0,9.5e-05,0,0,0,2.4e-05,0,0,0.000376,0,0.0203,0,2.61e-05,0,0,0,7.72e-05,2.53e-05,0,0,0,0,0,0,2.74e-05,0,0,0,0,0,2.66e-05,0,0,0,0.000125,4.48e-05,2.42e-05,0,0,0.000393,0,0,0,2.53e-05,0,0.0437,0.000237,0,0,0,2.73e-05,0,0,0,2.4e-05,2.58e-05,2.55e-05,3.56e-05,3.38e-05,0,0,2.61e-05,2.74e-05,0,0,0,0,0,0.0388,0,0,0,2.56e-05,2.59e-05,2.64e-05,3.11e-05,0,2.77e-05,0,0,2.96e-05,0,0,0,0,0,7.57e-05,0,0,0,0,3.79e-05,2.65e-05,2.52e-05,2.77e-05,2.6e-05,0,0,0,2.84e-05,0,0,3.84e-05,0,0,0,0,2.37e-05,0,2.79e-05,2.96e-05,2.62e-05,2.49e-05,2.49e-05,2.58e-05,0,0,0,0,0,0,2.7e-05,5.83e-05,0,0,0,0,2.6e-05,0,2.69e-05,2.67e-05,2.49e-05,0,2.53e-05,0,0,0,0,0,2.48e-05,0,0.00227,0,0,0,0,0,2.49e-05,2.86e-05,2.76e-05,2.48e-05,2.46e-05,2.48e-05,0,2.42e-05,0,0,0,0.0783,0,0,0,0,0,0.000131,0.000811,0.0448,2.66e-05,2.76e-05,2.52e-05,2.49e-05,0,0,2.41e-05,0,0,2.62e-05,0,0,0.00297,0.000465,0,0,0,0,0,0,3.09e-05,2.55e-05,2.45e-05,0,0,0,0,0,0,0.0162,0.00102,0,0,2.85e-05,0,0,0,0,0,6.56e-05,2.61e-05,2.58e-05,0,0,0,0,0,0,0,0,0,0,2.67e-05,0,0,0,0,0,4.82e-05,2.52e-05,2.45e-05,2.41e-05,0.00011,0,0,0,0,0,0.015,8.19e-05,0,0,0,0,0,0,0.00283,0.0301,2.92e-05,0,0,0,0,0,0,0,0,0,6.87e-05,0,0,0.0144,0,0,0,0,3.11e-05,3.12e-05,6.15e-05,0,0,0,2.69e-05,0,0,0,0,0,0,0,0.00605,0,0,0,0.00188,3.69e-05,0.00381,0,0,0,0,0,0,0,0,0.00014,0,0,0,0.000327,0.081,0.474,0,0.0855,6.62e-05,2.4e-05,3.65e-05,2.41e-05,0.0001,0.0298,2.15e-05,0,0,0,0,5.36e-05,0.000188,2.93e-05,5.73e-05,5.04e-05,3.91e-05,3.02e-05,4.56e-05,2.58e-05,2.4e-05],"winrateAvg":0.819067,"leadAvg":2.17719,"scoreMeanAvg":2.5944,"scoreStdevAvg":8.67643,"shorttermWinlossErrorAvg":0.300716,"shorttermScoreErrorAvg":2.64995,"ownership":[97,95,94,35,-26,-87,-85,-77,-61,-29,14,34,1,-50,-77,-90,-90,-44,-16,98,98,97,97,-98,-98,-83,-87,-84,-60,5,48,-15,-45,-90,-96,-95,-96,95,99,98,98,-25,-98,-97,-97,-92,-99,-99,45,99,28,-91,-92,-93,-96,97,95,96,99,-98,-98,-98,-97,-97,-98,-99,98,99,98,99,36,-95,-95,98,97,96,69,99,99,16,98,-99,-99,-63,-99,-60,92,99,99,-91,-51,99,98,98,96,42,37,67,71,98,-99,-39,15,-99,90,93,-97,99,-51,-92,99,98,97,75,-11,-13,-92,39,98,-98,12,98,98,-97,-97,-97,78,99,-92,-92,99,54,48,-46,-83,-77,-86,99,98,75,98,-97,-96,-95,-98,-98,99,25,-92,4,-1,-1,-87,-92,-91,-85,-99,98,98,98,-97,-95,-95,-98,99,99,99,-25,-93,-54,-41,-94,-99,-96,-99,-99,-99,-99,98,-12,-97,-44,-97,99,97,99,-83,-76,-57,-57,-96,-97,-95,-94,-97,-99,98,98,-68,-97,76,-97,-98,97,96,1,-79,-72,-57,-96,-97,-99,-94,-97,-99,98,11,-69,89,74,7,-97,-97,96,96,-87,-87,-15,-95,-97,-99,-94,-99,-99,98,-38,36,64,99,99,-52,-97,96,-97,96,96,47,-90,-94,-99,-99,95,-99,-99,99,99,99,94,99,47,-97,-97,-97,-97,97,79,-78,-86,-83,-60,96,-99,96,87,86,95,94,99,99,99,-97,-97,97,96,92,-52,-96,-96,95,96,96,96,96,85,99,46,-37,-42,-43,-97,97,97,98,95,-13,-8,95,95,96,89,85,97,85,99,99,99,99,-44,-97,98,98,95,84,59,94,95,96,85,83,84,97,84,96,99,-73,-75,-74,-92,-66,-81,62,58,69,76,85,91,85,86,85,86,85,99,61,18,-56,-83,-84,-69,-29,-4,37],"ownershipAllowedMAE":0.056964})%"); + lines.push_back(R"%({"sample":{"board":"............X.XO.O./...........X.XOOOOO/.....O...X..XOOXOX./...O........X..XXX./.X............OX.../..O.........X..X.../.................../................O../..X.............X../..XOO..........X.../.OOX.............../.OXX.............../.OOX.............../XOOOXXOXO.......X../.XOXXOOO........O../.OXOXOXXO.....O.XO./..XO.X.XOX......O../..XXOX.XO........../......X............/","hintLoc":"null","initialTurnNumber":92,"metadata":"E3B76E2A5905487EF7B24646D077E382:102","moveLocs":["B14","E7","F7","F8","E8","E9","H7","E7","G7","B17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":3.5,"policyOptimism":0.376,"pda":-1.005,"policyMixture":[2.12e-05,2.52e-05,2.59e-05,2.5e-05,2.52e-05,2.5e-05,2.47e-05,2.46e-05,2.34e-05,2.28e-05,2.15e-05,2.13e-05,0,2.38e-05,0,0,0,0,0,2.54e-05,0.000118,0.00016,0.0002,0.000133,0.000144,3.45e-05,3.16e-05,2.76e-05,2.27e-05,2.27e-05,0,2.01e-05,0,0,0,0,0,0,3.77e-05,0,0.00151,0.000341,0.000383,0,0.000151,3.57e-05,2.67e-05,0,2.18e-05,2.1e-05,0,0,0,0,0,0,2.25e-05,2.58e-05,0.0429,0.00148,0,0.0076,0.000154,7.97e-05,3.35e-05,2.92e-05,2.53e-05,2.36e-05,2.21e-05,0,2.68e-05,3.34e-05,0,0,0,2.25e-05,2.26e-05,0,0.00221,0.00205,4.48e-05,4.05e-05,3.92e-05,3.37e-05,3.18e-05,2.89e-05,2.65e-05,2.44e-05,2.42e-05,2.77e-05,0,0,2.02e-05,2.18e-05,2.27e-05,2.18e-05,0,0,0.000201,0.000101,5.18e-05,4.78e-05,3.6e-05,3.29e-05,3.11e-05,2.91e-05,2.68e-05,0,2.54e-05,2.63e-05,0,2.13e-05,2.37e-05,2.26e-05,2.66e-05,4.44e-05,0.889,0.000149,0.000113,6.17e-05,5.6e-05,4.83e-05,3.52e-05,3.27e-05,3.12e-05,2.97e-05,2.76e-05,2.86e-05,2.87e-05,2.48e-05,2.5e-05,2.5e-05,2.27e-05,2.55e-05,3.32e-05,8.76e-05,8.2e-05,9.77e-05,5.1e-05,5.42e-05,5.53e-05,4.46e-05,3.49e-05,3.32e-05,3.19e-05,3.03e-05,2.99e-05,3e-05,3.42e-05,0,2.93e-05,2.25e-05,2.84e-05,2.53e-05,0,3.12e-05,3.04e-05,3.29e-05,3.5e-05,4.26e-05,4.9e-05,4.5e-05,3.95e-05,3.59e-05,3.38e-05,3.21e-05,3.07e-05,2.74e-05,0,2.76e-05,2.38e-05,2.5e-05,2.9e-05,0,0,0,2.79e-05,3.39e-05,3.72e-05,4.56e-05,5.2e-05,6.54e-05,6.59e-05,5.2e-05,3.56e-05,3.03e-05,0,2.55e-05,2.89e-05,2.35e-05,2.18e-05,0,0,1.96e-05,0,2.57e-05,3.36e-05,4.58e-05,3.69e-05,5.9e-05,9.43e-05,0.000104,7.98e-05,4.81e-05,3.19e-05,2.95e-05,3.05e-05,2.9e-05,2.37e-05,2.1e-05,0,1.96e-05,2.17e-05,2.54e-05,0,2.83e-05,2.79e-05,3.33e-05,0.000107,0.000132,0.000144,0.000114,6.24e-05,4.48e-05,3.9e-05,5.42e-05,3.08e-05,2.45e-05,2.05e-05,0,0,2.19e-05,0,0,0,0,6.67e-05,5.7e-05,0.000159,0.000198,0.00018,0.000128,8.25e-05,7.21e-05,3.31e-05,3.93e-05,2.36e-05,0,0,0,0,0,0,0,0,0,3.38e-05,0.000338,0.00034,0.000306,0.000183,0.000126,0.000124,0,0.000101,2.69e-05,2.46e-05,0,0,0,0,0,0,0,0.0114,3.46e-05,0.000552,0.000928,0.00131,0.00034,0.000314,0.00047,0,0.00117,2.42e-05,2.45e-05,0,0,0,0,0,0,0,0,3.59e-05,0.000169,0.00564,0.00123,0.00634,0,0.000125,0,0,2.64e-05,2.38e-05,2.46e-05,0,0,2.19e-05,0,2.1e-05,0,0,0,3.56e-05,0.00683,0.00383,0.000222,0.000381,8.7e-05,0,3.34e-05,2.27e-05,2.08e-05,2.2e-05,0,0,0,0,2.14e-05,0,0,0.000144,3.32e-05,9.01e-05,6.75e-05,4.18e-05,3.57e-05,3.34e-05,3.36e-05,2.57e-05,2.19e-05,2.07e-05,1.97e-05,1.99e-05,2.03e-05,2.1e-05,2.08e-05,0,2.24e-05,2.72e-05,2.41e-05,2.47e-05,2.56e-05,2.49e-05,2.44e-05,2.38e-05,2.36e-05,2.29e-05,2.22e-05,2.08e-05,1.64e-05],"winrateAvg":0.89865,"leadAvg":3.55937,"scoreMeanAvg":5.26674,"scoreStdevAvg":11.3259,"shorttermWinlossErrorAvg":0.0969123,"shorttermScoreErrorAvg":1.19908,"ownership":[65,74,76,74,65,49,26,-3,-33,-59,-76,-83,-88,20,16,100,100,100,100,57,68,80,77,75,57,27,-3,-30,-57,-76,-94,-78,-77,100,100,100,100,100,17,87,76,79,65,89,10,6,-13,-87,-54,-75,-95,99,100,-92,100,-91,60,-8,-29,33,92,37,32,14,2,-8,-24,-36,-49,-95,22,-2,-92,-92,-91,-65,-45,-66,-10,21,24,17,8,0,-7,-16,-18,-28,-7,35,58,-91,-81,-75,-73,-58,-68,47,28,16,10,5,0,-5,-10,-16,-23,-81,-8,-23,-91,-67,-69,-67,-51,-58,-66,-14,6,8,5,1,-3,-6,-8,-15,-21,-20,-31,-44,-55,-57,-63,-29,-34,-35,2,1,5,3,2,0,-2,-5,-8,-15,-18,-19,-40,-27,-62,-58,6,-25,-55,21,34,14,6,3,2,0,-3,-9,-14,-22,-28,-46,-88,-60,-55,46,19,-53,100,99,34,11,5,5,4,-1,-9,-15,-23,-31,-89,-52,-54,-44,73,100,100,99,100,43,9,-2,11,10,2,-6,-12,-17,-24,-41,-14,-29,-30,93,100,99,98,94,95,9,-5,13,21,6,-2,-9,-11,-14,-20,-17,-12,-12,88,100,100,97,96,-98,-97,-94,37,22,11,1,-7,-9,-9,-11,-6,-2,10,53,100,100,100,-99,-99,65,-92,84,33,14,6,-6,-6,2,9,-32,36,28,59,52,100,-99,-99,61,69,78,82,38,4,7,-4,5,26,36,86,53,60,9,49,-99,-98,-99,56,-99,-99,86,26,12,-5,-4,-15,87,72,64,93,74,-38,0,-100,-98,-99,-100,-99,-99,82,-29,4,-3,-7,8,25,60,93,85,85,-62,-87,-100,-100,-98,-100,-99,-99,78,-13,-3,-2,-1,10,31,51,74,79,82,-78,-88,-94,-98,-99,-99,-99,-65,-9,4,0,-1,1,10,26,47,62,73,78],"ownershipAllowedMAE":0.0498945})%"); + lines.push_back(R"%({"sample":{"board":"....XO.OOX........./OOOXO.OOXX.XX....../OXOOXOOOOX.XOXXXXX./XXO.XXXXXOXXOOOOOXX/.XXX..O.XOOXXXO..OO/...XOO.OXXOOXOX.O.O/..X.XXO.OO..OOXO.OX/...XX.XOOO.O.OXOOXX/...OXXXXO..O..OXXX./..XOXOXOO.OO..OX.../...XO.O.OOXOOOOOX../XX.XOOOOXXXX.XOXXX./OXXXO.XXXO..X.XXOOX/OOOXOOXXOXXX...OXO./..OOXOXOOX.XOOOO.OO/..OX..OOXXOOOXXOOXO/..OX....OOO.OX.XXXX/...OO....O.XOX...X./........OXXXXX...../","hintLoc":"null","initialTurnNumber":239,"metadata":"E27EA2E66F998F62290364FD4C4D8D80:249","moveLocs":["D19","F9","C11","F10","B10","B11","H3","O7","R5","E15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.18,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1","komi":2.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.00051,0.000512,0.000595,0,0.000594,0,0.000548,0,0,0,0.000495,0.000483,0.000482,0.000477,0.000483,0.000474,0.000469,0.000477,0.000475,0,0,0,0.000634,0,0.00057,0,0,0,0,0.000491,0,0,0.000459,0.000475,0.000466,0.000465,0.000473,0.00047,0,0,0,0,0,0,0,0,0,0,0.000477,0,0,0,0,0,0,0,0.000465,0,0,0,0.0308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000508,0,0,0,0,0.0011,0,0.0294,0,0,0,0,0,0,0,0.000556,0.000881,0,0,0.0021,0.00175,0.000543,0,0,0,0.16,0,0,0,0,0,0,0,0,0.00138,0,0.000679,0,0.00844,0.00557,0,0,0,0,0,0.146,0,0,0.000831,0.000917,0,0,0,0,0.000686,0,0,0.0102,0.0102,0.00726,0,0,0,0,0,0,0,0.000743,0,0.000667,0,0,0,0,0,0,0.0114,0,0,0,0,0,0,0,0,0.000545,0.000538,0,0.000517,0.000675,0,0,0,0,0.000488,0.00996,0,0,0,0,0,0,0,0,0.000686,0,0,0.00051,0.00052,0,0,0.00962,0.0104,0.000485,0.0118,0.00876,0.0679,0,0,0,0,0.000979,0,0,0,0,0,0,0,0,0,0.000455,0.000638,0,0,0.0055,0,0,0,0,0,0,0,0,0,0.038,0,0,0,0,0,0.00951,0,0,0,0,0,0.129,0,0,0,0,0.00473,0.00129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.038,0.0263,0.0273,0,0.000486,0,0.0256,0.000523,0.000533,0,0,0,0,0,0,0,0,0.0277,0,0,0,0,0,0,0,0,0.00051,0.000511,0,0,0.00282,0.0012,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000495,0.000504,0,0,0.000928,0.000525,0.000524,0,0,0,0,0.0271,0,0,0.00798,0,0,0,0,0.000499,0.000504,0.000678,0,0,0.000511,0.000507,0.00052,0.000921,0,0.0259,0,0,0,0.00899,0.00155,0.0005,0,0.000486,0.000493,0.000496,0.000495,0.000494,0.000498,0.000497,0.000513,0.000506,0,0,0,0,0,0,0.000975,0.0015,0.00109,0.00184,0.000477,0.000205],"winrateAvg":0.999681,"leadAvg":8.9188,"scoreMeanAvg":9.10693,"scoreStdevAvg":1.54769,"shorttermWinlossErrorAvg":0.00702107,"shorttermScoreErrorAvg":0.804606,"ownership":[100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,-100,100,100,100,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,-30,-100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-68,100,-44,-100,100,100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,98,100,99,100,-100,-100,100,100,-100,100,100,100,100,100,100,-99,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-99,-99,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-99,-100,-98,-99,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-99,-97,-98,-98,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-99,-98,-97,-99,100,-100,100,100,100,100,-100,100,100,100,100,100,-100,-100,-100,-99,-99,-97,-99,100,100,100,100,-100,-100,-100,-100,-35,-100,100,-100,-100,-100,-100,100,-99,-99,-99,100,67,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,100,100,100,-100,100,100,-100,-100,100,-100,-100,-100,-35,-2,55,100,100,100,78,100,100,100,100,100,100,-100,100,100,-100,-47,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,-100,-100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,68,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-46,-100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0146371})%"); + lines.push_back(R"%({"sample":{"board":"............./...OOX......./..OOXX.OO.XO./...XX..OXOOX./.OOOXX.X.XXX./..XXOOXX..XO./......XOXXO.O/...XOO.OXOOO./...XXO.OOXXOO/....OXX.OX.X./...X..XOOXXOO/....XOOOXX.XO/..........XO./","hintLoc":"null","initialTurnNumber":83,"metadata":"212DA7391E1DC5D82EE15D7580243020:93","moveLocs":["K11","N1","E1","E3","M1","M12","L12","N1","G10","G9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.93,"xSize":13,"ySize":13},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":5.0,"policyOptimism":0.0,"pda":-0.85,"policyMixture":[7.43e-06,8.48e-06,8.32e-06,8.28e-06,1.06e-05,0.000231,1.51e-05,1.21e-05,9.28e-06,9.43e-06,1.01e-05,9.02e-05,8.47e-06,8.21e-06,9.05e-06,8.1e-06,0,0,0,0.0508,1.15e-05,1.05e-05,8.8e-06,0,0,0.000882,8.44e-06,9.35e-06,0,0,0,0,1.58e-05,0,0,0,2.07e-05,0,0.033,7.92e-06,9.89e-06,0.000522,0,0,1.16e-05,0,0,0,0,0,0,0.0473,8.36e-06,0,0,0,0,0,0,0,0.0342,0,0,0,0.000454,9.76e-06,3.88e-05,0,0,0,0,0,0,0.0138,1.66e-05,0,0,1.23e-05,1.04e-05,3.11e-05,4.05e-05,0.000357,0.00024,0.000342,0,0,0,0,0,7.38e-06,0,1.03e-05,1.79e-05,0.00012,0,0,0,0.000178,0,0,0,0,0,6.9e-06,1.02e-05,3.62e-05,2.13e-05,0,0,0,1.68e-05,0,0,0,0,0,0,1.07e-05,2.03e-05,0.00336,1.78e-05,0,0,0,6.78e-06,0,0,0,0,0.0121,1.05e-05,3.96e-05,7.05e-05,0,0,1.48e-05,0,0,0,0,0,0,0,1.14e-05,5.91e-05,0.000483,1.95e-05,0,0,0,0,0,0,0,0,0,8.39e-06,1.13e-05,0.00215,0.0148,0,1.72e-05,8.51e-06,1.16e-05,6.97e-05,8.33e-06,0,0.784,0,1.32e-05],"winrateAvg":0.699437,"leadAvg":3.32216,"scoreMeanAvg":4.29667,"scoreStdevAvg":20.1662,"shorttermWinlossErrorAvg":0.29072,"shorttermScoreErrorAvg":4.44365,"ownership":[74,72,71,57,20,-50,-42,-25,-21,-19,-23,-26,-39,72,70,73,78,79,-84,-17,-21,-16,-16,-15,-50,-48,68,72,78,76,-83,-84,-35,-7,-9,-12,-32,-31,-57,61,69,2,-83,-83,-41,1,-9,-47,-14,-12,-77,-52,36,73,73,75,-83,-83,-84,-85,-48,-80,-79,-78,-1,19,-3,-80,-80,51,54,-81,-83,-79,-73,-77,86,69,-6,-26,-58,-47,-9,21,-80,78,-76,-77,94,85,90,-22,-40,-55,-91,72,74,20,81,-70,94,94,94,90,-35,-44,-61,-91,-90,74,-12,83,83,51,51,94,94,-42,-49,-45,-88,-82,-84,-83,-4,84,53,59,58,74,-44,-50,-67,-91,-90,-46,-82,85,86,53,50,74,73,-42,-38,-53,-56,-91,84,85,85,54,53,56,59,72,-38,-30,-12,9,34,35,61,61,58,58,59,58,56],"ownershipAllowedMAE":0.114829})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../....X........X.X.../..O.............X../...O...........OO../.................../................O../...............XO../................XO./..........X.....XO./...O.........O.OXX./...............OX../.X.X.....XX.OX.OOX./....O..OOXO.O..O.X./...OX.X.XO..OXX.OX./..XXOX..XO...X.OOOX/.OOXO....XOO.XO..X./.XXO.....X...XO..../...........O......./","hintLoc":"null","initialTurnNumber":9,"metadata":"8968FEE17D8248014005F5D90DF69B90:19","moveLocs":["F5","D6","B4","H8","F7","E7","G7","F9","R2","J8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.45,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":8.0,"policyOptimism":0.01,"pda":0.0,"policyMixture":[3.53e-06,4.55e-06,5.08e-06,5.14e-06,5.43e-06,5e-06,5.13e-06,5.06e-06,4.79e-06,4.53e-06,4.33e-06,4.16e-06,3.97e-06,4.21e-06,3.79e-06,3.98e-06,3.64e-06,3.78e-06,3.52e-06,4.67e-06,1.42e-05,8.77e-05,5.37e-05,1.07e-05,1.37e-05,2.12e-05,2.16e-05,1.39e-05,1.11e-05,9.46e-06,8.21e-06,8.71e-06,5.87e-06,5.67e-06,4.6e-06,4.92e-06,4.58e-06,3.92e-06,5.07e-06,1.18e-05,0.000113,1.62e-05,0,1.53e-05,0.000734,0.000593,7.2e-05,2.15e-05,1.65e-05,1.3e-05,9.61e-06,0,5.53e-06,0,4.64e-06,1.08e-05,4.59e-06,5.03e-06,1.37e-05,0,1.39e-05,2.39e-05,0.0142,0.0933,0.0784,0.000303,7.56e-05,3.31e-05,2.5e-05,1.97e-05,1.63e-05,1.12e-05,6.41e-06,0,0.000248,6.97e-06,4.9e-06,4.17e-05,8.63e-06,0,0.00384,0.000587,0.000435,0.000159,0.000119,9.72e-05,6.72e-05,5.02e-05,0.000214,0.000188,8.21e-06,0,0,0.000824,5.25e-06,4.67e-06,1.23e-05,6.98e-05,2e-05,3.22e-05,8.25e-05,0.000106,0.00014,0.000142,0.000144,0.000133,0.000101,0.000127,4.97e-05,3.81e-05,8.16e-06,5.82e-06,7.87e-06,4.82e-06,4.69e-06,1.35e-05,4.79e-05,4.85e-05,7.53e-05,6.56e-05,0.00011,0.000151,0.00017,0.000238,0.000198,0.00015,9.07e-05,3.89e-05,1.3e-05,3.44e-05,0,7.67e-06,5.35e-06,4.66e-06,1.27e-05,8.59e-05,9.07e-05,7.56e-05,9.02e-05,0.000113,0.00015,0.000127,0.000303,0.000269,0.000194,0.00011,8.4e-05,1.06e-05,0,0,9.51e-06,5.5e-06,4.93e-06,1.94e-05,0.000288,0.000127,9.86e-05,9.41e-05,0.000237,0.00196,0.00729,0.000245,1.63e-05,0.000143,0.00103,9.9e-05,9.75e-05,7.92e-06,0,0,5.4e-06,5.03e-06,1.66e-05,0.00894,7.58e-05,6.74e-05,0.000329,5.12e-05,0.00115,0.00504,3.16e-05,0,2.1e-05,0.041,0.000143,0.0128,7.96e-06,0,0,9.7e-06,5.01e-06,5.39e-05,5.08e-05,0,1.09e-05,0,0.328,8.76e-06,8.83e-06,0.00026,0.000145,0.00154,0.0119,0,1.39e-05,0,0,0,4.74e-06,4.65e-06,8.17e-06,9.81e-06,8.21e-06,0.112,0.000149,9.73e-06,0,0,8.6e-06,6.9e-06,0.0105,0.191,0.000343,5.66e-06,0,0,3.82e-06,4.02e-06,4.33e-06,0,7.21e-05,0,0,0,0,8.08e-06,7.2e-06,0,0,0.000135,0,0,6.58e-06,0,0,0,3.76e-06,4.73e-06,7.59e-06,1.05e-05,0,0,4.64e-06,4.58e-06,0,0,0,0,0.0165,0,1.57e-05,5.02e-06,0,0.000199,0,3.74e-06,4.58e-06,5.78e-06,6.03e-06,0,0,0,0,6.18e-06,0,0,0.000473,0.000338,0,0,0,2.3e-05,0,0,3.93e-06,4.48e-06,0,0,0,0,0,4.86e-06,5.44e-06,0,0,3.39e-05,9.18e-05,0.0015,0,1.24e-05,0,0,0,0,3.93e-06,0,0,0,0,5.25e-06,5.26e-06,6.23e-06,7.33e-06,0,0,0,1.48e-05,0,0,7.9e-06,4.42e-06,0,4.18e-06,3.82e-06,0,0,0,4.51e-06,4.15e-06,4.82e-06,8.37e-06,6.43e-06,0,0.000369,1.15e-05,1.24e-05,0,0,9.43e-06,0,4.07e-06,4.26e-06,3.8e-06,3.86e-06,3.94e-06,4.33e-06,4.18e-06,4.4e-06,4.43e-06,5.06e-06,6.55e-06,1.68e-05,6.92e-06,0,0.0331,0.00888,0.000682,6.83e-06,6.81e-06,4.47e-06,3.76e-06,4.82e-06],"winrateAvg":0.411395,"leadAvg":-0.706167,"scoreMeanAvg":-1.20745,"scoreStdevAvg":12.9735,"shorttermWinlossErrorAvg":0.148178,"shorttermScoreErrorAvg":1.17755,"ownership":[25,16,7,-10,-21,-24,-21,-16,-12,-10,-13,-22,-37,-53,-65,-72,-72,-69,-66,31,27,5,1,-29,-30,-21,-17,-12,-10,-13,-22,-41,-63,-75,-79,-71,-67,-60,38,40,27,25,-55,-17,-19,-14,-5,-5,-9,-11,-26,-87,-47,-88,-72,-66,-48,43,57,84,27,0,9,-18,-19,-6,-4,-5,-7,-8,-11,33,21,-81,-43,-13,43,46,55,83,13,7,0,1,2,0,-2,0,-3,0,28,81,81,21,23,35,37,30,34,18,10,3,3,3,1,-2,-1,0,3,1,26,60,63,48,27,29,28,26,17,10,7,6,5,0,-4,-5,-4,-1,6,19,81,70,62,20,21,24,23,19,15,11,10,10,1,-7,-9,-8,-4,-3,-52,81,64,61,14,14,18,24,22,21,14,13,9,6,-12,-9,-12,-5,-5,-28,-94,63,31,9,15,14,32,30,33,18,17,23,3,-54,-11,-10,10,-9,5,-95,59,-59,5,6,41,81,17,67,-23,19,28,17,16,3,15,86,33,95,-96,-96,-72,-7,8,27,45,-7,-26,-7,76,77,38,18,17,7,73,69,94,-95,-94,-92,-17,-40,28,5,54,-91,-90,12,44,-7,-8,34,94,52,73,94,94,-96,-92,-26,-15,15,55,55,-33,-28,71,73,-7,54,26,94,73,64,94,-39,-94,-93,-47,-16,-2,56,-95,-95,-94,35,-85,88,46,83,94,45,46,83,92,-94,-91,-79,-99,-99,-99,-82,-95,-86,-70,-86,88,86,81,64,44,67,92,91,91,-90,-97,-97,-97,-99,-83,-86,-79,-76,-66,-66,92,92,64,43,89,35,43,-89,-88,-97,-99,-99,-87,-88,-80,-71,-50,-51,-64,39,75,65,41,87,-15,-89,-86,-87,-97,-97,-95,-93,-87,-80,-70,-58,-42,-8,41,85,56,49,51,9,-52,-86,-86],"ownershipAllowedMAE":0.0306408})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...OOXX............/.....OX........X.../..XX.OOXX........../......XO.........../.......O.........../.................../................O../.................../.................../.................../.................../.................../.................../...O............X../.................../.................../.................../","hintLoc":"null","initialTurnNumber":19,"metadata":"81166CE7772EBAAAE5CFA6396CAF429F:29","moveLocs":["J17","K17","K18","L17","E14","C12","H18","H16","K16","E16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.69,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui0button1","komi":-6.0,"policyOptimism":0.0,"pda":2.943,"policyMixture":[2.03e-06,3.23e-06,3.04e-06,4.14e-06,1.23e-05,6.29e-06,5.06e-06,2.72e-06,2.46e-06,2.38e-06,3.03e-06,3.36e-06,3.2e-06,3.1e-06,3.2e-06,3.03e-06,2.83e-06,2.64e-06,1.89e-06,3.9e-06,3.72e-05,2.22e-05,1.12e-05,0.00275,0.00194,4.78e-06,0,2.6e-06,0,2.49e-05,1.11e-05,1.53e-05,4.73e-05,8.28e-05,3.89e-05,1.27e-05,6.8e-06,2.58e-06,3.78e-06,0.291,0.00192,0,0,0,0,2.54e-06,0,0,0,0.0377,0.0869,0.0108,0.00197,0.000301,9.81e-05,1.03e-05,2.79e-06,3.4e-06,0.00886,3.36e-05,7.27e-06,0,0,0,0,9.91e-06,0,0.173,0.0116,0.00393,0.000568,0.000311,0,0.000102,1.89e-05,2.92e-06,2.98e-06,1.84e-05,0,0,5.68e-05,0,0,0,0,5.89e-05,0.000673,0.000552,9.36e-05,7.87e-05,4.13e-05,8.16e-05,4.71e-05,2.04e-05,2.91e-06,2.97e-06,2.33e-05,7.06e-06,0.00111,0,4.31e-05,0,0,8.53e-06,0.0142,0.0046,9.67e-05,3.98e-05,2.52e-05,1.75e-05,4.33e-05,5.8e-05,1.1e-05,2.67e-06,3.02e-06,1.14e-05,0.0114,0.0595,0.00038,0.000658,0.214,0,6.67e-06,0.00481,0.000129,4.42e-05,2.01e-05,1.34e-05,1.06e-05,1.28e-05,1.42e-05,7.34e-06,2.45e-06,2.78e-06,2.33e-05,0,0.0453,0.00132,3.52e-05,1.13e-05,8.68e-06,4.45e-05,7.45e-05,4.71e-05,2.06e-05,1.32e-05,1.14e-05,9.78e-06,7.46e-06,5.36e-06,5.26e-06,2.35e-06,2.72e-06,8.69e-06,8.77e-05,0.000226,6.81e-05,2.82e-05,1.78e-05,3.34e-05,1.91e-05,1.63e-05,1.37e-05,1.16e-05,1.07e-05,1.01e-05,8.67e-06,5.43e-06,0,3.94e-06,2.43e-06,2.7e-06,8.83e-06,4.92e-05,4.73e-05,3.03e-05,1.66e-05,1.33e-05,1.4e-05,1.21e-05,1.09e-05,1.08e-05,1.03e-05,9.78e-06,8.96e-06,8.04e-06,6.27e-06,4.71e-06,4.6e-06,2.34e-06,2.59e-06,7.51e-06,2.89e-05,2.3e-05,1.23e-05,1.06e-05,1.05e-05,1.09e-05,1.06e-05,1.03e-05,1.02e-05,9.82e-06,9.23e-06,8.52e-06,7.62e-06,8.23e-06,8.21e-06,5.77e-06,2.4e-06,2.51e-06,6.84e-06,1.93e-05,1.3e-05,9.38e-06,9.18e-06,9.6e-06,1.01e-05,1.04e-05,1.04e-05,1.01e-05,9.67e-06,9.26e-06,8.93e-06,8.48e-06,1.09e-05,1.59e-05,7.02e-06,2.48e-06,2.49e-06,6.75e-06,2.3e-05,1.26e-05,8.48e-06,8.45e-06,9.32e-06,1e-05,1.05e-05,1.06e-05,1.01e-05,9.73e-06,9.35e-06,9.34e-06,9.69e-06,2.41e-05,4.71e-05,8.74e-06,2.57e-06,2.49e-06,6.87e-06,2.92e-05,1.46e-05,8e-06,8e-06,8.66e-06,9.62e-06,1.04e-05,1.06e-05,1e-05,9.46e-06,9.29e-06,9.85e-06,1.08e-05,4.97e-05,6.33e-05,1.12e-05,2.77e-06,2.59e-06,7.25e-06,1.17e-05,6.53e-06,6.95e-06,7.98e-06,8.66e-06,9.65e-06,1.07e-05,1.09e-05,1.01e-05,9.46e-06,9.27e-06,1.05e-05,1.58e-05,0.00012,0.0001,1.26e-05,2.92e-06,2.56e-06,6.34e-06,7.49e-06,0,6.82e-06,1.98e-05,1.38e-05,1.41e-05,2.32e-05,2.5e-05,1.74e-05,1.31e-05,1.26e-05,4.5e-05,0.000112,0.00251,0,1.36e-05,3.02e-06,2.42e-06,5.35e-06,8.36e-06,8.26e-06,1.85e-05,4.23e-05,2.91e-05,1.76e-05,1.84e-05,1.92e-05,1.72e-05,1.55e-05,1.57e-05,3.67e-05,0.000108,0.000232,0.000129,8.19e-06,2.78e-06,2.35e-06,4.06e-06,5.51e-06,7.12e-06,8.32e-06,7.7e-06,7.34e-06,7.13e-06,7.12e-06,7.09e-06,6.98e-06,6.96e-06,7.28e-06,8.51e-06,1.33e-05,9.54e-06,9.1e-06,6.24e-06,2.58e-06,1.87e-06,2.35e-06,2.41e-06,2.63e-06,2.61e-06,2.54e-06,2.5e-06,2.5e-06,2.51e-06,2.51e-06,2.5e-06,2.5e-06,2.51e-06,2.62e-06,2.81e-06,2.9e-06,2.7e-06,2.52e-06,1.84e-06,5.25e-06],"winrateAvg":0.815175,"leadAvg":4.77925,"scoreMeanAvg":7.43495,"scoreStdevAvg":16.7709,"shorttermWinlossErrorAvg":0.111365,"shorttermScoreErrorAvg":1.96368,"ownership":[-5,-2,2,0,-3,-15,6,35,48,40,38,29,19,7,-1,-6,-6,-7,-6,-9,-2,4,14,-13,-28,-29,67,60,61,34,26,16,7,-5,-7,-9,-5,-7,-17,-13,-18,23,24,-75,-74,-9,65,-4,-4,22,20,4,-11,-24,-12,-9,-6,-33,-38,-33,-31,-56,70,-74,-73,6,61,37,21,17,2,-15,-65,-23,-4,-6,-43,-53,-76,-75,-2,72,72,-72,-73,-5,19,17,11,5,-4,-17,-13,-4,-1,-47,-48,-39,6,77,62,50,75,-22,-19,2,9,8,5,1,-4,-7,6,5,-45,-51,-26,9,30,39,63,76,13,0,2,6,7,6,3,5,4,14,15,-40,-46,-70,4,17,21,28,25,11,6,6,7,7,7,7,5,17,28,25,-28,-30,-17,2,10,16,18,18,13,8,7,7,8,9,11,18,70,39,31,-15,-12,0,5,12,14,15,14,12,9,8,7,8,8,10,11,24,31,28,-3,-2,2,8,11,12,12,12,10,8,7,7,7,7,8,11,14,20,19,5,6,10,11,12,11,10,9,9,8,7,7,7,7,7,7,10,8,8,10,10,15,14,14,11,10,9,8,8,8,8,8,7,5,3,-5,-5,-5,13,12,19,24,18,13,10,9,8,8,8,8,9,8,5,-2,-12,-18,-18,15,18,31,37,25,17,12,10,9,9,9,10,10,9,5,-4,-25,-35,-32,16,18,30,83,36,22,13,11,11,10,10,11,11,12,12,0,-75,-48,-40,15,18,19,37,35,22,16,14,10,10,11,12,12,7,12,-26,-42,-46,-42,16,16,21,24,25,16,14,13,11,11,12,13,13,11,3,-18,-28,-39,-40,17,18,19,21,20,17,14,11,10,11,12,13,12,9,0,-12,-25,-32,-36],"ownershipAllowedMAE":0.0296497})%"); + lines.push_back(R"%({"sample":{"board":"...OOX.......XXO.O./...OXXX......XO..../..O.OXXX.....XOOOO./..OO.OXOXX.XX.XO.OO/.OXO.OXOOXXO.XXXOXX/OOXXOOOOXXXO.X..XX./.OXOOXOOOXOO.XO.XO./OXXXXXOXOOOXXX.O.../.OX...XXXXOOOX...../.OX..XXXOXX.OXOO.O./.OX.XOOOOXOOOOX.OX./.OXX.X.OXXOXOOXX.X./OOXOXX..OXX.XOOX.X./OXXOXOOO.OXXXOXXX.X/.OOOXO.OX.OOXOXOOX./.OXOXXO.OX.OOXOOX.X/OXXXXO.O.OOOX..OXX./.OX.XO.O...XO..OXO./O.XXOO..O.......O../","hintLoc":"null","initialTurnNumber":282,"metadata":"854B077FA6186517DD4AE29CA6F66852:292","moveLocs":["R16","M7","T2","S1","M8","R15","E16","E15","R16","M7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.22,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1button1","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000607,0.000607,0.00063,0,0,0,0.000214,0.00125,0.000698,0.000654,0.000625,0.000603,0.000577,0,0,0,0.0385,0,0.00076,0.000628,0.000801,0.00068,0,0,0,0,0.000605,0.0038,0.00102,0.000641,0.000594,0.000576,0,0,0.0403,0.00273,0.00443,0.00072,0.00143,0.00264,0,0,0,0,0,0,0.00917,0.00202,0.000776,0.000594,0.000636,0,0,0,0,0,0.000588,0.00106,0.00419,0,0,0,0,0,0,0,0,0.00477,0,0,0.000727,0,0,0,0,0,0.00159,0,0,0,0,0,0,0,0,0,0,0,0.0448,0,0,0,0.104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0289,0,0.000761,0.000836,0,0,0.000581,0,0,0,0,0,0,0,0,0,0,0,0,0.0305,0,0,0.000944,0,0,0.00115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000764,0,0.00145,0.00165,0.000613,0.0421,0,0,0.000557,0.000574,0.00165,0,0,0,0,0,0,0,0,0.000988,0.000862,0.000643,0.00104,0.000632,0.00088,0,0,0.000592,0.0015,0,0,0,0,0,0,0.0366,0,0,0,0,0.000918,0,0.00123,0.000604,0,0,0.000655,0,0,0,0,0,0,0,0,0,0,0,0.00097,0,0,0.000589,0.000603,0,0,0,0.000769,0,0.0448,0,0,0,0,0,0,0,0,0,0.000762,0,0.000582,0,0,0,0,0,0,0.0537,0.00265,0,0,0,0,0,0,0,0,0.000661,0,0.000664,0,0,0,0,0,0,0,0,0.0353,0,0,0,0,0,0,0,0,0.000882,0,0.000635,0,0,0,0,0,0,0,0,0.0532,0,0,0,0,0,0,0,0,0.000679,0.00144,0,0,0,0,0,0,0,0,0,0.000574,0,0,0,0,0,0,0.000658,0,0,0,0,0,0,0,0.00068,0,0.0248,0,0,0,0,0.0378,0.00624,0,0,0,0.0411,0,0,0,0.00047,0,0,0.000633,0,0.000611,0.000617,0.000612,0,0,0.0282,0.00795,0,0,0,0,0,0.145,0,0,0,0,0.000604,0.000569,0,0.000589,0.000612,0.000616,0.00723,0.00227,0.00608,0.0327,0,0,0.000455,0.0117],"winrateAvg":0.997646,"leadAvg":0.694174,"scoreMeanAvg":0.702395,"scoreStdevAvg":1.08723,"shorttermWinlossErrorAvg":0.0291956,"shorttermScoreErrorAvg":0.463064,"ownership":[100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-99,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,-44,100,100,100,100,-100,100,100,100,-100,100,100,-100,-100,100,-60,-100,-100,-100,-41,-100,-100,100,100,-100,-100,100,100,100,100,-100,-100,-100,100,6,-100,-99,-99,-100,-100,-100,100,100,-100,100,100,-100,100,100,100,-100,100,100,-28,-100,-99,-99,-100,-99,-100,100,-100,-100,-100,-100,-100,100,-100,100,100,100,-100,-100,-100,-100,-99,-99,-99,-99,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,48,100,-100,-99,-99,-100,-99,-100,100,100,-100,-100,-100,100,100,100,100,-100,100,100,100,100,-100,-100,-99,-100,-100,100,100,-100,-100,-100,-100,-42,100,-100,-100,100,57,100,100,-100,-100,-100,-100,-100,100,100,-100,100,-100,-100,-14,100,100,-100,-100,58,-100,100,100,-100,-100,-100,-100,100,-100,-100,100,-100,100,100,100,99,100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,100,100,100,99,99,100,100,-100,100,-100,100,100,-100,-100,90,100,-100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,87,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-98,-99,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,100,-100,-99,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,7],"ownershipAllowedMAE":0.00910664,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...............X.O./..X.....X...X....../................O../.................../.................../..O.........O....../.................../.....XO............/......XO.....X...../.................../.................../...X..........X..../..............OX.../...O........O.OX.../.....X......XXXOX../...............O.../.................../","hintLoc":"null","initialTurnNumber":25,"metadata":"80572C05B9DDBEA0929576CE57BECB5F:35","moveLocs":["N5","M4","Q6","S5","M3","L3","M2","L2","P7","O6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.85,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":39.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.9e-05,6.13e-05,6.25e-05,6.51e-05,6.33e-05,6.21e-05,6.16e-05,6.3e-05,6.23e-05,6.22e-05,6.1e-05,6.19e-05,6.21e-05,6.43e-05,6.43e-05,6.36e-05,6.15e-05,6.12e-05,4.89e-05,6.21e-05,9.47e-05,0.000108,0.000106,0.000113,0.000102,0.000105,0.000102,0.000101,0.000103,0.000114,0.000103,0.000105,0.000115,0.000102,9.43e-05,8.54e-05,6.93e-05,5.48e-05,6.44e-05,0.000107,0.00333,0.00341,0.00132,0.000226,0.000155,0.000131,0.000174,0.000167,0.000645,0.000352,0.00021,0.000218,0.000117,0,8.24e-05,0,5.12e-05,6.74e-05,0.000146,0,0.00834,0.0012,0.000306,0.000122,0.000166,0,0.00032,0.000336,0.000408,0,0.000206,0.000953,9.94e-05,7.56e-05,6.92e-05,5.4e-05,6.54e-05,0.000118,0.00201,0.0017,0.00013,0.00012,0.000115,0.000117,0.000142,0.000161,0.000369,0.000246,0.000135,0.000118,0.000412,9.53e-05,0,7.68e-05,5.85e-05,6.38e-05,0.000108,0.000337,0.000137,0.000112,0.000116,0.000114,0.000112,0.000112,0.000112,0.000113,0.000106,0.000107,0.000107,0.000111,0.00011,9.04e-05,8.43e-05,5.82e-05,6.1e-05,9e-05,8.68e-05,0.000104,0.000117,0.000117,0.000115,0.000112,0.000113,0.000113,0.000108,9.65e-05,8.51e-05,9.65e-05,0.000102,0.000115,0.000108,8.8e-05,5.88e-05,6.27e-05,7.6e-05,0,8.87e-05,0.000116,0.000115,0.000108,0.000104,0.000112,0.000112,0.000106,8.47e-05,0,8.56e-05,0.000107,0.000128,0.000116,9.32e-05,6.01e-05,6.06e-05,8.63e-05,8.48e-05,0.000103,0.000105,0.0181,0.00114,0.000121,9.88e-05,0.000109,0.000109,9.95e-05,8.65e-05,0.000102,0.000114,0.000222,0.000136,9.69e-05,6.11e-05,6.16e-05,9.83e-05,0.000148,0.000238,0.000679,0,0,0.00027,9.22e-05,0.000107,0.000112,0.000117,0.000113,0.000121,0.000185,0.000337,0.000246,0.0001,6.16e-05,6.31e-05,0.000107,0.000781,0.000421,0.000115,0.0046,0,0,8.46e-05,0.000111,0.000129,0.000225,0.000393,0,0.000504,0.000545,0.000458,0.000101,6.26e-05,6.35e-05,0.000111,0.000676,0.000517,0.000146,0.000158,0.00867,0.000169,0.000115,0.000122,0.000248,0.000551,0.0163,0.00258,0.000143,0.00029,0.000503,0.000109,6.27e-05,6.42e-05,0.00011,0.000138,0.000447,0.000352,0.000122,0.000309,0.000139,0.000119,0.000221,0.000573,0.00218,0.00157,0.329,0,0.00168,0.0017,0.000177,6.67e-05,6.5e-05,0.000109,0.000426,0,0.000533,0.000121,0.000114,0.000113,0.000143,0.000486,0.00358,0.043,0.152,0,0,0,0.143,0.000195,7.3e-05,6.58e-05,0.000125,0.000133,0.000109,0.000114,0.000118,0.000112,0.000104,0.000107,0.000282,0.000397,0.00164,0,8.4e-05,0,0,0.000678,0,8.6e-05,6.55e-05,0.000112,0.000111,0,9.65e-05,0.00284,0.000131,0.000107,9.47e-05,9.76e-05,0.0779,0,0,0.000129,0,0,0.00124,0.00179,7.6e-05,6.14e-05,9.4e-05,0.000145,0.000102,0.00246,0,0.000234,9.65e-05,8.64e-05,8.26e-05,0,0,0,0,0,0,0,0.058,8.19e-05,6.04e-05,7.96e-05,9.47e-05,0.000113,0.000125,0.00011,8.4e-05,8.37e-05,7.57e-05,9.57e-05,0,0,0.0481,0.000109,0.00559,0,0.00674,0.00013,7.42e-05,4.95e-05,6.04e-05,6.2e-05,6.53e-05,6.44e-05,6.14e-05,5.9e-05,5.72e-05,6.01e-05,6.46e-05,8.05e-05,0.000182,8.91e-05,0.000137,0.000106,6.42e-05,6.9e-05,7.55e-05,5.17e-05,4.58e-05],"winrateAvg":0.0131581,"leadAvg":-12.0278,"scoreMeanAvg":-15.7385,"scoreStdevAvg":14.8519,"shorttermWinlossErrorAvg":0.0235634,"shorttermScoreErrorAvg":1.64715,"ownership":[-44,-42,-37,-28,-20,-15,-15,-17,-19,-21,-24,-28,-31,-31,-26,-11,7,23,31,-46,-47,-40,-33,-20,-17,-17,-22,-22,-25,-23,-32,-35,-33,-30,-23,6,29,42,-46,-52,-51,-38,-18,-19,-18,-26,-35,-29,-22,-35,-45,-37,-30,-61,1,64,48,-42,-50,-81,-14,-18,-16,-18,-22,-75,-26,-18,-31,-79,-25,-11,-4,11,46,51,-31,-35,-30,-16,-14,-12,-12,-15,-20,-16,-14,-16,-18,-10,10,4,74,49,45,-15,-18,-22,-12,-11,-9,-8,-9,-12,-9,-7,-8,-9,-5,3,14,20,33,34,-1,-2,-5,-11,-7,-7,-6,-7,-6,-5,-4,-5,1,-4,0,7,10,17,20,8,13,45,-1,-5,-5,-4,-4,-3,-2,0,5,57,4,1,5,7,9,8,8,8,2,-11,-10,2,-1,2,1,1,1,1,7,-2,1,5,3,0,-1,2,1,-12,-14,-24,-69,44,16,5,2,1,4,6,-2,3,1,-5,-10,-12,-4,-5,-4,-16,-25,-46,-68,45,5,2,3,5,4,-45,6,3,-12,-24,-24,-10,-10,-13,-19,-20,-23,-23,-18,-4,0,3,10,17,16,19,8,-34,-37,-38,-14,-17,-24,-24,-17,-16,-17,-11,-6,-4,2,14,32,60,68,40,-19,-55,-52,-12,-19,-17,-65,-15,-12,-13,-13,-11,-12,-6,19,46,31,26,57,-30,-71,-64,-7,-4,-4,-3,-9,-7,-12,-17,-19,-29,-53,-28,59,40,53,-92,-62,-92,-73,-3,-2,14,50,8,10,-33,-25,-30,-42,-70,-89,58,-14,49,-93,-82,-78,-75,-3,-3,-12,-3,-1,-65,-32,-37,-41,-51,-94,-80,-93,-94,-94,-66,-84,-69,-70,-5,-10,-11,-16,-22,-38,-43,-44,-52,-62,-93,-81,-88,-84,-75,-68,-73,-66,-67,-8,-8,-10,-14,-21,-31,-37,-44,-52,-67,-82,-88,-84,-79,-75,-72,-69,-66,-64],"ownershipAllowedMAE":0.0339974})%"); + lines.push_back(R"%({"sample":{"board":"............./......XXOOO../.XX..XXO...O./..OXXOOXOOO../..OX.XOX...../..OOX.O....../..XO.X......./..XO.XO..O.../...XXO.O...../.OXXO.O.OO.../..O.XO.O...../..XX.XX....../....X......../","hintLoc":"null","initialTurnNumber":65,"metadata":"5DCF4AEE24A21F705BEFB738B06BD496:75","moveLocs":["E11","D11","J11","G7","H8","H7","J7","K1","J2","J1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.92,"xSize":13,"ySize":13},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000106,0.000111,0.000116,0.000125,0.000144,0.00039,0.000376,0.00158,0.000129,0.000109,0.000106,0.000105,0.000106,0.000107,0.000109,0.000113,0.000198,0.0798,0.000211,0,0,0,0,0,0.00011,0.000105,0.000107,0,0,0,0,0,0,0,0,0.000105,0.000107,0,0.000106,0.000108,0.000116,0,0,0,0,0,0,0,0,0,0.000108,0.000105,0.000116,0.000118,0,0,0,0,0,0,0.000199,9.94e-05,0.000105,0.000107,0.000107,0.000258,0.000125,0,0,0,5.97e-05,0,0,0.000339,0.000104,0.000108,0.00011,0.000109,0.000168,0.00956,0,0,0.000109,0,0,0,0,0.000104,0.00011,0.000113,0.00011,0.000298,0.0087,0,0,0.000238,0,0,0.000133,0.000114,0,0.000114,0.000119,0.000114,0.00083,0.0105,0.00376,0,0,0,0.00012,0,0.000113,0.000114,0.000123,0.000127,0.000119,0.000118,0,0,0,0,0.000119,0,0.00011,0,0,0.00014,0.000146,0.000128,0.000145,0.0302,0,0.00614,0,0,0.000123,0,0.000123,0.00014,0.000439,0.000273,0.000137,0.000148,0.00341,0,0,0,0,0,0.00168,0,0.0466,0.236,0.00126,0.000152,0.000115,0.00196,0.00012,0.000107,0,0.000109,0.000136,0.441,0,0,0.105,0.000231,0.000117,8.08e-05],"winrateAvg":0.0122711,"leadAvg":-2.76316,"scoreMeanAvg":-2.75276,"scoreStdevAvg":2.56094,"shorttermWinlossErrorAvg":0.0658223,"shorttermScoreErrorAvg":0.810805,"ownership":[-99,-99,-99,-97,-94,-78,12,52,65,96,99,100,100,-100,-100,-99,-98,-90,-88,-89,-90,100,100,100,100,100,-100,-100,-100,-100,-90,-90,-89,100,100,100,100,100,100,-99,-99,-99,-100,-100,100,99,99,100,100,100,100,100,-99,-99,-99,-100,-98,-98,100,99,99,99,99,99,99,-99,-99,-99,-99,-100,-42,100,100,99,99,99,99,99,-99,-99,-100,-99,-99,-100,-100,-100,99,98,98,98,98,-99,-99,-100,-99,-99,-100,51,-35,24,100,98,98,97,-99,-98,-100,-100,-100,77,46,97,62,90,97,97,96,-99,-98,-100,-100,33,36,95,94,100,100,96,96,94,-99,-99,-98,-99,-100,65,-14,97,78,81,94,94,92,-99,-99,-100,-100,-100,-100,-100,-81,78,24,92,86,88,-99,-99,-99,-100,-100,-99,-97,-88,-91,-84,4,61,72],"ownershipAllowedMAE":0.0213097})%"); + lines.push_back(R"%({"sample":{"board":".................../......OXX....XX..../......OXO.XX.XOOO../..OX...OX.XO.O.OX../..OO...OX.......X../.XXO...O......OOX../.XO..........OXX.../.XO........OOOXOX../.XO..OO.OOOXXX..X../.XOXXOX.OXX......../.XXO.X.XX........O./.XOOOOO.........O../.XXXOX.X.XX.X..XXO./XOXOXXXO.OO....XOX./.OXOOO.O........OO./O.OX..O...O.OO.O.../..OX.OXX.XXXOX...../X.OX.X....XO.O...../.OX................/","hintLoc":"null","initialTurnNumber":142,"metadata":"382E44FFC7C1611B54EDE8214531A5EA:152","moveLocs":["G7","G9","D13","D12","H10","E9","H8","F9","H11","G13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.0,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.25e-06,4.1e-06,3.7e-06,3.4e-06,3.46e-05,6.02e-06,0.00343,2.11e-05,4.48e-06,2.19e-06,2.12e-06,2.16e-06,2e-06,1.9e-06,2.94e-06,5.37e-06,6.3e-06,7.29e-06,2.08e-06,6.15e-06,6.51e-05,7.82e-06,1.52e-05,5.04e-05,6.3e-05,0,0,0,2.28e-06,2.56e-06,2.3e-06,2.62e-06,0,0,2.63e-05,5.95e-06,1.31e-05,5e-06,0.000575,0.0949,0.000793,6.36e-06,9.83e-06,0.000123,0,0,0,3e-06,0,0,3.92e-06,0,0,0,0,2.39e-05,4.28e-06,0.0157,0.00109,0,0,6.4e-06,0.000472,0.0147,0,0,2.42e-06,0,0,0.169,0,3.48e-06,0,0,2.86e-05,6.11e-06,0.000263,0.0001,0,0,1.07e-05,9.44e-06,6.32e-06,0,0,3.68e-06,9.34e-06,0.012,0.134,7.04e-05,9.56e-06,0.017,0,4.36e-06,3.66e-06,4.9e-06,0,0,0,1.07e-05,1.14e-05,6.23e-06,0,7.81e-05,1.19e-05,0.000192,4.73e-05,0.0484,8.23e-06,0,0,0,2.53e-06,2.51e-06,2.14e-06,0,0,0,0.00292,0.000327,0,0.0123,5.39e-05,0.194,0.0326,1.95e-05,2.83e-06,0,0,0,2.55e-06,2.72e-06,2.34e-06,1.97e-06,0,0,0,0.000272,4.1e-05,0.0119,0.0113,0.00512,6.81e-06,0.0108,0,0,0,0,0,0,2.92e-06,2.76e-06,2e-06,0,0,1.72e-05,2.15e-05,0,0,0,0,0,0,0,0,0,3.39e-06,3.57e-06,0,3.74e-06,3.51e-06,2.01e-06,0,0,0,0,0,0,0,0,0,0,2.96e-06,2.61e-06,3.22e-06,7.47e-06,2.05e-05,9.07e-06,1.85e-05,3.79e-06,1.89e-06,0,0,0,0,0,0,0,0,2.5e-06,2.41e-06,3.07e-06,3.96e-06,6.56e-06,0.000111,0.0731,7.55e-06,0,3.45e-06,1.98e-06,0,0,0,0,0,0,0,3.14e-06,2.52e-06,2.73e-06,4.27e-06,5.28e-06,2.06e-05,9.05e-05,0.0391,0,0.000118,2.89e-05,2.44e-06,0,0,0,0,0,0,0,4.6e-05,0,0,8.85e-06,0,0.000193,9.76e-06,0,0,0,8.11e-05,0,0,0,0,0,0,0,0,0.00078,0,0,0.00706,0.000121,0.00532,5.38e-06,0,0,0,2.57e-06,2.04e-06,0,0,0,0,0,0.00481,0,0.000343,0.00811,1.35e-05,0.000755,6.61e-06,5.94e-06,6.45e-06,3.27e-06,0,0,3.01e-06,0,2.54e-06,0,0,4.47e-06,1.84e-05,0,9.1e-05,4.17e-05,0.000851,0,0.0142,0,0,4.53e-06,0,2.77e-06,2.86e-06,2.2e-06,2.62e-06,3.05e-06,0,0,0.0405,0,0,0,3.08e-06,0,0,0,0,0,4.14e-06,3.01e-06,2.82e-06,2.74e-06,2.03e-06,0,2.39e-06,0,0,8.41e-06,0,3.37e-06,3.67e-06,2.99e-06,2.44e-06,0,0,1.13e-05,0,3.19e-06,3.13e-06,2.7e-06,2.79e-06,2.19e-06,1.27e-06,0,0,2.62e-06,2.74e-06,2.32e-06,2.98e-06,2.39e-06,2.23e-06,2.6e-06,3.49e-06,0.00801,8.96e-06,4.92e-06,2.71e-06,2.21e-06,1.98e-06,2.21e-06,1.94e-06,4.31e-06],"winrateAvg":0.030561,"leadAvg":-4.42833,"scoreMeanAvg":-6.07754,"scoreStdevAvg":10.4022,"shorttermWinlossErrorAvg":0.0795745,"shorttermScoreErrorAvg":2.23134,"ownership":[51,64,74,81,83,86,-32,-61,-72,-82,-92,-95,-94,-87,-55,-24,11,20,35,40,60,76,87,87,87,96,-94,-95,-82,-96,-97,-96,-98,-98,12,53,50,36,0,53,89,90,90,91,97,-95,-91,-96,-100,-100,-51,-98,84,84,84,25,21,-26,64,99,87,92,93,94,98,-94,-77,-100,14,-21,74,76,84,-98,-18,-23,-44,-1,99,99,94,93,94,98,-91,-29,-42,-21,17,32,63,-40,-98,-81,-52,-74,-100,-100,99,95,94,93,98,18,-11,-12,9,38,81,85,83,-98,-85,-67,-98,-100,97,93,95,93,97,-4,7,-25,10,27,60,89,-98,-98,-96,-61,-56,-99,-100,97,97,94,94,6,-25,-10,6,34,88,89,89,-98,-84,-99,-84,-39,-99,-100,96,95,96,98,98,-99,53,54,54,-96,-96,-96,-69,-81,-99,-48,-24,-100,-100,97,95,94,98,-99,-99,55,-97,-97,-88,-79,-66,-53,-39,-24,-20,17,-100,-100,-100,98,98,99,99,-99,-99,-94,-88,-83,-78,-67,-57,-33,8,94,39,-99,-100,98,98,98,98,99,-99,-81,-91,-87,-82,-76,-65,-63,6,92,91,72,-99,-100,-100,-100,98,-99,-99,-99,-9,-98,-97,-30,-90,-46,-50,-83,-84,97,92,-99,-94,-100,67,-99,-99,-99,80,32,84,84,13,18,-9,-16,-82,100,97,98,-95,-92,-100,65,64,63,36,79,35,28,51,43,36,29,4,26,100,100,98,-92,-91,-90,-97,5,42,74,-1,-20,-13,75,18,98,99,58,100,99,99,98,-92,-91,-90,-97,-84,44,-98,-99,-72,-97,-97,-97,98,93,96,97,98,98,98,-92,-91,-91,-97,-96,-98,-96,-95,-90,-89,-97,61,62,97,95,96,97,97,98,-91,-91,-94,-94,-95,-96,-96,-94,-87,-84,-21,-23,59,77,89,94,96,97,97],"ownershipAllowedMAE":0.0305992})%"); + lines.push_back(R"%({"sample":{"board":"......O.O........../...O..OXX.XXX.XOO../.X..XXOOXXOOX.XXX../..OOOO.OOOOX.XOOX../..OX.OX...O.X.OXXXO/..OX.XXX.O.O.XOOOOO/.O.X.X.X..XXXXO...O/O.OXXOXXO.XOXO..O../XOOOOOXXOXXOOOOO..O/.X...XXOOXO.XXXO.OO/X.XXXXO.OO.O.OXXOO./.XOOXO.OO...OOOXO.O/XO.OO.O.XOOOXXOXXOX/.XO.OOXXXXXOOXX.XXX/.X..OX.XOOOOXO...../.XXOOXX.XXOXXXXXO../.XO.OOX...XOOXOO.../X.XO.OX.XX.OX.X..../.XXO..OOO..X.X...../","hintLoc":"null","initialTurnNumber":230,"metadata":"75ADA3DBB44C1816F21B20AB3D774FC8:240","moveLocs":["T16","A10","M15","L14","O15","C10","B9","E15","E14","K19"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.16,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":-43.5,"policyOptimism":0.0,"pda":-0.974,"policyMixture":[0.000221,0.000534,0.000228,0.00023,0.000229,0.000222,0,0.000226,0,0,0.123,0.000319,0.000219,0.000213,0.000222,0.000233,0.00023,0.000222,0.000219,0.000529,0.000211,0.000903,0,0.00066,0.000215,0,0,0,0.473,0,0,0,0.000234,0,0,0,0.000234,0.000228,0.000228,0,0.000674,0.00178,0,0,0,0,0,0,0,0,0,0.000238,0,0,0,0.000245,0.000241,0.000231,0.000242,0,0,0,0,0.000373,0,0,0,0,0,0.000223,0,0,0,0,0.000251,0,0.000234,0.000236,0,0,0,0,0,0.000263,0.00112,0.000239,0,0,0,0,0,0,0,0,0,0.00024,0.000238,0,0,0,0,0,0,0.000314,0,0,0,0.000287,0,0,0,0,0,0,0.000246,0,0.00174,0,0.000204,0,0.000201,0,0.000468,0.000342,0,0,0,0,0,0.00022,0.000214,0.000215,0,0,0,0,0,0,0,0,0,0,0.000262,0,0,0,0,0.00022,0.000219,0,0.000217,0.000222,0.00192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000215,0.000215,0,0,0,0,0.00029,0.000295,0,0,0,0,0,0,0.0257,0,0,0,0,0.00022,0,0,0,0,0,0,0,0,0,0,0,0,0.00606,0,0.281,0,0,0,0,0,0,0.000237,0,0,0,0,0,0,0,0,0.000337,0.0163,0.026,0,0,0,0,0,0.00248,0,0,0,0.00202,0,0,0,0,0.000274,0,0,0,0,0,0,0,0,0,0,0,0.000232,0,0,0.000279,0,0,0,0,0,0,0,0,0,0,0,0.000273,0,0,0,0.000219,0,0.00225,0.000368,0,0,0.00022,0,0,0,0,0,0,0,0.000257,0.000262,0.000258,0.000244,0.000232,0.000218,0,0,0,0,0,0,0.000224,0,0,0,0,0,0,0,0,0,0.000244,0.000231,0.00022,0,0,0.000912,0,0,0,0.000243,0.00023,0.00023,0,0,0,0,0,0,0.000242,0.000242,0.000224,0,0.000209,0,0,0.000243,0,0,0.00237,0,0,0.000247,0,0,0.000231,0,0.00025,0.00024,0.000237,0.000218,0.00022,0,0,0,0.000425,0.00216,0,0,0,0.00273,0.000254,0,0.000231,0,0.000224,0.000225,0.000221,0.000219,0.000204,0.000196],"winrateAvg":3.57001e-05,"leadAvg":-67.3366,"scoreMeanAvg":-67.2396,"scoreStdevAvg":2.441,"shorttermWinlossErrorAvg":0.000921445,"shorttermScoreErrorAvg":0.731493,"ownership":[97,97,97,98,98,98,100,99,99,98,27,-58,-93,-99,-99,-99,-98,-98,-98,97,97,97,100,97,98,100,-99,-99,-99,-100,-100,-100,-99,-100,-97,-97,-98,-98,97,95,98,98,96,96,100,100,-99,-99,100,100,-100,-100,-100,-100,-100,-98,-97,97,98,100,100,100,100,35,100,100,100,100,-100,-100,-100,100,100,-100,-98,-98,98,98,100,-100,100,100,-100,-53,-15,72,100,-100,-100,-100,100,-100,-100,-100,100,98,98,100,-100,-100,-100,-100,-100,-9,100,100,100,-57,-100,100,100,100,100,100,98,100,29,-100,-100,-100,-100,-100,-9,29,-100,-100,-100,-100,100,99,99,99,100,100,98,100,-100,-100,100,-100,-100,100,-24,-100,100,-100,100,99,99,100,99,99,33,100,100,100,100,100,-100,-100,100,-100,-100,100,100,100,100,100,99,99,100,31,-100,100,45,-65,-100,-100,100,100,-100,98,-24,-100,-100,-100,100,99,100,100,-100,-100,-100,-100,-100,-100,100,99,100,100,97,100,-20,99,-100,-100,100,100,72,-99,-100,100,100,-100,100,99,100,100,98,97,98,99,99,99,-100,100,44,78,-99,49,53,100,100,99,100,23,-100,100,100,100,-100,-100,99,-100,-100,40,-100,-99,-100,94,68,100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-99,-100,-100,-100,-99,-100,-56,24,100,-100,-99,-100,100,100,100,100,-100,-98,-99,-98,-98,-98,-99,-100,-100,-100,100,100,-100,-100,-99,-100,-100,100,-100,-100,-100,-100,-100,-96,-98,-98,-100,-100,39,41,100,100,-100,-98,-99,-98,-99,-98,-98,-100,-96,-96,-98,-97,-98,-100,-100,-100,100,98,100,-100,-42,-100,-100,-98,-98,-100,-99,-100,-98,-98,-98,-98,-100,-100,-100,100,98,99,99,99,98,-49,-90,-100,-99,-100,-99,-98,-98,-98,-98],"ownershipAllowedMAE":0.0265827})%"); + lines.push_back(R"%({"sample":{"board":"................../................../................../................../................../................../................../................../................../................../................../................../................../................../................../................../","hintLoc":"null","initialTurnNumber":0,"metadata":"8BE277B31D1E734FB4CA393E1E373F74:5","moveLocs":["C4","D13","Q4","Q13","F3"],"movePlas":["B","W","B","W","B"],"nextPla":"B","weight":0.94,"xSize":18,"ySize":16},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0","komi":6.0,"policyOptimism":0.236,"pda":-0.122,"policyMixture":[5.63e-06,6.71e-06,6.58e-06,7.16e-06,7.01e-06,6.83e-06,6.94e-06,6.9e-06,7e-06,7.13e-06,7.03e-06,7.11e-06,7.15e-06,7.03e-06,6.88e-06,6.76e-06,6.62e-06,5.74e-06,6.74e-06,1.06e-05,1.47e-05,2.04e-05,2.54e-05,2.36e-05,2.37e-05,2.3e-05,2.47e-05,2.96e-05,3.27e-05,3.17e-05,3.28e-05,2.32e-05,1.99e-05,1.25e-05,8.73e-06,6.37e-06,6.59e-06,1.5e-05,5.08e-05,3.23e-05,0.000195,0.00453,0.00212,0.000428,0.00088,0.00355,0.00689,0.00334,0.154,0.00733,0.000339,1.44e-05,1.02e-05,6e-06,7.24e-06,2.34e-05,3.78e-05,0,2.39e-05,0.00218,0.000677,0.000226,0.000763,0.00286,0.00369,0.00151,0.0141,0.0352,3.1e-05,0,8.9e-06,6.64e-06,6.97e-06,3.29e-05,0.000337,2.62e-05,2.99e-05,5.55e-05,4.81e-05,6.56e-05,0.000123,0.000261,0.000382,0.000259,0.000125,0.000161,6.75e-05,1.61e-05,1.49e-05,6.45e-06,6.76e-06,2.39e-05,0.0276,0.00533,7.14e-05,3.89e-05,4.13e-05,5.57e-05,9.88e-05,0.000157,0.000177,0.000124,6.35e-05,3.59e-05,0.000353,7.55e-05,1.84e-05,6.37e-06,6.64e-06,2.26e-05,0.00547,0.00235,6.34e-05,4.3e-05,5.31e-05,6.99e-05,0.0001,0.000127,0.000129,9.68e-05,6.57e-05,4.75e-05,0.0002,0.000211,1.98e-05,6.49e-06,6.61e-06,1.93e-05,0.000308,0.000235,6.93e-05,5.78e-05,7.12e-05,8.81e-05,0.000104,0.00011,0.000106,8.63e-05,6.01e-05,5.45e-05,0.000291,0.000208,1.95e-05,6.48e-06,6.55e-06,1.81e-05,0.000212,0.000242,8.83e-05,8.21e-05,9.55e-05,0.000102,0.000101,9.62e-05,8.66e-05,7.33e-05,5.92e-05,6.25e-05,0.000262,0.000256,1.88e-05,6.39e-06,6.66e-06,1.95e-05,0.000319,0.000379,9.24e-05,8.11e-05,9.79e-05,0.000102,9.07e-05,7.78e-05,6.76e-05,5.85e-05,5.83e-05,7.41e-05,0.000365,0.000449,2.11e-05,6.38e-06,6.9e-06,3.08e-05,0.00055,0.00031,0.00012,8.57e-05,0.000134,9.21e-05,6.95e-05,5.67e-05,5e-05,4.52e-05,5.74e-05,5.96e-05,0.000241,0.000297,2.39e-05,6.51e-06,7.35e-06,4.51e-05,9.28e-05,0.000176,0.00115,0.000151,0.00014,7.97e-05,5.35e-05,4.91e-05,4.42e-05,4.14e-05,5.22e-05,0.000106,9.86e-05,3.68e-05,2.25e-05,6.75e-06,7.67e-06,0.000548,0,0.304,0.00093,0.00107,0.00144,0.000129,8.55e-05,0.000105,0.000113,9.29e-05,0.00421,0.0114,0.011,0,2.16e-05,6.99e-06,7.14e-06,2.35e-05,4.73e-05,8.66e-05,0.000135,0,7.8e-05,0.00025,6.69e-05,7.52e-05,0.00013,0.000119,0.000721,0.358,0.000756,5.17e-05,1.38e-05,6.76e-06,7.04e-06,1.28e-05,1.54e-05,2.32e-05,0.000235,0.00197,2.85e-05,2.42e-05,1.56e-05,1.55e-05,1.67e-05,1.89e-05,2.62e-05,6.5e-05,2.34e-05,1.94e-05,1.16e-05,6.66e-06,5.9e-06,6.81e-06,6.58e-06,6.85e-06,7.11e-06,6.91e-06,6.8e-06,6.41e-06,6.47e-06,6.48e-06,6.48e-06,6.66e-06,6.76e-06,7.28e-06,7.11e-06,6.59e-06,6.52e-06,5.65e-06,7.58e-06],"winrateAvg":0.411382,"leadAvg":-0.753566,"scoreMeanAvg":-1.19853,"scoreStdevAvg":12.3283,"shorttermWinlossErrorAvg":0.0543789,"shorttermScoreErrorAvg":0.429928,"ownership":[4,6,8,13,14,13,11,9,8,8,8,8,10,14,22,32,38,42,3,1,9,15,18,11,11,10,10,10,10,10,9,11,26,34,44,45,0,3,5,35,31,20,14,12,9,9,11,10,21,-3,35,47,51,47,-1,1,17,79,33,24,11,8,8,8,7,6,5,5,9,81,52,45,-2,-1,17,32,19,14,9,6,5,5,4,3,2,5,10,28,40,38,-5,-12,-9,14,9,7,4,3,3,2,2,1,1,1,5,17,26,26,-7,-10,-3,-5,2,2,1,1,1,1,0,0,0,1,3,12,16,15,-9,-9,-3,-3,-1,0,0,0,0,0,0,0,0,1,3,4,5,5,-13,-13,-9,-6,-2,-1,0,0,0,0,0,1,1,2,0,-2,-6,-6,-19,-19,-14,-6,-3,-2,-1,-1,-1,0,0,2,3,3,2,-11,-17,-17,-28,-27,-19,-10,-6,-3,-2,-2,-2,-1,0,2,3,3,2,-18,-28,-28,-41,-47,-17,-18,-3,-14,-8,-4,-4,-3,-1,1,3,5,3,-32,-42,-40,-51,-65,-86,14,-33,-25,-12,-9,-8,-5,-4,0,5,11,0,-80,-53,-47,-55,-63,-59,-66,-50,-82,-25,-11,-13,-7,-2,1,4,28,-31,-42,-50,-48,-56,-59,-60,-59,-56,-52,-38,-22,-15,-8,-2,3,7,4,-17,-30,-41,-44,-55,-57,-57,-56,-52,-46,-35,-23,-13,-5,0,4,5,0,-12,-26,-34,-39],"ownershipAllowedMAE":0.0256585})%"); + lines.push_back(R"%({"sample":{"board":"....X.XOOOOOO.X..../OOOOOX.XXOXOOXXX.X./XXXOXXX.XXXXOOXOXXX/OX.XO...OXXOOOOOOXO/OX.XXX..OXOX...OOOO/OXXXXXXXXOOO......./OOXOXOOOO........../.OOOO..........X.../.....X...OO......X./..O..OOOOXXOOO.O.OX/OOOOOXXO.OXXXXO.O.O/OXXOXXOXO.XXOOOXOOO/XXOXX.OXXXXOOXX.XXO/.XOX..OOXXO.OOXX..X/.X....XX.XOXOX.XXXX/..XXXX.XXOOXXXX.X.X/..OOX.XOOOOOOXXXOX./....X.XOO....OXXOOX/.....X.X.OOOO.OOO.X/","hintLoc":"null","initialTurnNumber":267,"metadata":"2FCE1FEA046B5BF35D427570EBEE7155:277","moveLocs":["Q9","Q7","O1","T3","S1","J5","J9","O19","M6","G1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.24,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":-1.5,"policyOptimism":0.0,"pda":2.579,"policyMixture":[0.000782,0.0207,0.000866,0.0212,0,0,0,0,0,0,0,0,0,0,0,0.0165,0.0163,0.0161,0.00114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0164,0,0.0174,0,0,0,0,0,0,0,0.0226,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000913,0,0,0.0194,0.0268,0.00461,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000817,0,0,0,0.0014,0.00203,0,0,0,0,0.00911,0.00084,0.000886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000897,0.000778,0.000795,0.000833,0.000815,0.000814,0.000798,0,0,0,0,0,0,0,0,0,0.00827,0.000811,0.000818,0.000787,0.000774,0.000781,0.00755,0.000789,0.000814,0.000796,0.000805,0,0,0,0,0.00878,0.000872,0.000836,0.00085,0.000837,0.000823,0.000791,0.000787,0.000783,0.00754,0,0.00787,0.00739,0.000805,0.000801,0.000849,0.00882,0.000922,0.00877,0,0.00856,0.000861,0.00851,0,0,0.00825,0.000813,0.000839,0.00083,0.00829,0.00849,0,0.0083,0.000784,0.000981,0,0.00169,0.00868,0,0,0,0,0,0,0,0,0,0.00879,0,0.00794,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00755,0,0,0,0,0,0,0,0,0,0,0.172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000857,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000786,0,0,0,0.000991,0.000874,0,0,0,0,0,0,0,0,0,0,0.000751,0.000766,0,0.000838,0,0.000829,0.00106,0.00085,0.0259,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00083,0.00142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00105,0.00106,0,0,0,0.000808,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000838,0.00703,0.000819,0.00334,0,0.00081,0,0,0,0.00696,0.00618,0.00745,0.00714,0,0,0,0,0,0,0.000775,0.000852,0.00122,0.000842,0.000778,0,0,0,0.303,0,0,0,0,0,0,0,0,0,0,0.0446],"winrateAvg":0.00018276,"leadAvg":-17.9818,"scoreMeanAvg":-17.9334,"scoreStdevAvg":1.04325,"shorttermWinlossErrorAvg":0.00363154,"shorttermScoreErrorAvg":0.484402,"ownership":[-97,-98,-98,-99,-100,-98,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-95,-94,-94,-94,-95,-100,-98,-100,-100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-95,-100,-100,-100,-95,-100,-100,-100,-100,100,100,-100,100,-100,-100,-100,100,-100,-97,-100,-95,-98,-95,-97,-93,-100,-100,100,100,100,100,100,100,-100,100,100,-100,-97,-100,-100,-100,-96,-96,-93,-100,100,96,98,95,96,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,96,96,96,96,95,95,96,100,100,-100,100,-100,100,100,100,100,97,96,96,96,96,96,98,96,95,96,97,100,100,100,100,97,95,95,96,96,96,96,96,96,98,92,97,97,95,96,96,96,95,96,90,96,95,97,100,100,97,95,95,95,97,96,90,97,96,96,100,96,97,100,100,100,100,-100,-100,100,100,100,97,100,96,100,94,100,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,96,100,100,-100,-100,100,-100,-100,-94,-100,100,-65,-100,-100,100,100,100,-100,100,100,100,-100,-100,-95,-100,-100,-97,-93,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,-96,-100,-95,-100,-95,-97,-94,-94,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-96,-100,-98,-96,-96,-94,-100,-100,-100,-100,100,-100,100,-100,-100,-100,-100,-100,-100,-96,-96,-100,-100,-100,-100,-98,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-96,-98,-93,-93,-100,-97,-100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,-96,-95,-97,-97,-100,-97,-100,100,100,98,97,97,98,100,-100,-100,100,100,-100,-96,-96,-96,-96,-97,-100,-100,-100,79,100,100,100,100,100,100,100,100,100,-100],"ownershipAllowedMAE":0.0218623})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.....X..O....O...../...O......X....O.../........O........../..O................/............X....../.................../.................../.................O./...X...........X.../...............XO../...X.....X.....XO../.................../.................../","hintLoc":"null","initialTurnNumber":18,"metadata":"072FCB68043C30FDB88C0F1024C9B5AB:28","moveLocs":["D11","C12","E12","G8","E9","E11","H12","J12","D10","F11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.5,"xSize":19,"ySize":15},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.55e-06,4.27e-06,4.36e-06,4.58e-06,4.25e-06,4.24e-06,3.96e-06,4.17e-06,4.18e-06,4.16e-06,4.03e-06,3.98e-06,3.96e-06,4e-06,3.98e-06,3.86e-06,3.83e-06,3.96e-06,3.38e-06,4.29e-06,1.5e-05,0.000696,0.000146,6.66e-05,4.9e-06,2.93e-05,6.38e-05,7.02e-05,2.59e-05,6.9e-06,5.72e-06,5.71e-06,2.69e-05,9.68e-06,9.85e-06,5.49e-06,5.28e-06,3.93e-06,3.87e-06,2.22e-05,5.67e-06,0.0898,2.7e-05,0,6.28e-06,0.000552,0,5.12e-06,5.28e-06,6.5e-06,3.1e-05,0,0.00025,9.27e-05,7.33e-05,6.88e-06,3.82e-06,4.17e-06,5.19e-06,0,0,0,9.73e-05,1.53e-05,0,0,3.73e-06,0,5e-06,2.49e-05,4e-05,0.000676,0,9.1e-05,6.09e-06,3.84e-06,4.25e-06,5.87e-06,0.632,0,0,0,0.00295,0.00835,0,4.96e-06,4.88e-06,5.7e-06,6.31e-06,6.04e-06,5.71e-06,4.25e-05,1.64e-05,7.58e-06,3.78e-06,4.23e-06,0.000124,0,0,5.32e-06,6.22e-05,0.242,4.11e-05,3.1e-05,2.47e-05,9.38e-06,5.65e-06,4.78e-06,5.36e-06,6.24e-06,8.03e-06,9.43e-06,5.45e-06,3.66e-06,3.98e-06,6.99e-06,0.0145,5.25e-06,0,9.7e-06,0.00105,0.00246,3.77e-05,3.16e-05,1.37e-05,4.95e-06,0,4.81e-06,6.24e-06,8.13e-06,6.06e-06,5.24e-06,3.62e-06,3.73e-06,5.61e-06,9.65e-06,9.46e-06,5.82e-06,3.66e-05,0,4.49e-05,2.99e-05,2.99e-05,1.4e-05,5.57e-06,4.88e-06,5.47e-06,6.35e-06,6.4e-06,5.7e-06,5.01e-06,3.49e-06,3.64e-06,5.01e-06,6.32e-06,6.04e-06,8.89e-06,1.75e-05,2.24e-05,1.76e-05,2.67e-05,1.84e-05,7e-06,5.86e-06,5.74e-06,5.56e-06,5.43e-06,6.3e-06,2.35e-05,4.16e-05,3.43e-06,3.64e-06,4.67e-06,5.22e-06,4.84e-06,5.26e-06,5.74e-06,7.12e-06,8.03e-06,1.9e-05,1.9e-05,6.09e-06,5.73e-06,5.61e-06,5.15e-06,4.59e-06,4.8e-06,0.00175,0,4.41e-06,3.58e-06,4.4e-06,4.5e-06,0,4.63e-06,5.61e-06,5.79e-06,6e-06,1.03e-05,1.2e-05,5.87e-06,5.51e-06,5.2e-06,4.76e-06,3.46e-06,0,0.000198,0.000149,3.72e-06,3.42e-06,3.92e-06,3.99e-06,3.96e-06,4.36e-06,4.98e-06,5.42e-06,5.6e-06,5.87e-06,5.48e-06,5.48e-06,5.35e-06,5.02e-06,4.35e-06,3.28e-06,0,0,5.45e-06,3.93e-06,3.39e-06,3.87e-06,3.84e-06,0,4.14e-06,4.69e-06,5.1e-06,5.23e-06,4.99e-06,0,4.96e-06,5.21e-06,5.04e-06,4.38e-06,3.56e-06,0,0,4.55e-06,3.65e-06,3.56e-06,3.57e-06,3.95e-06,4.06e-06,4.29e-06,4.36e-06,4.56e-06,4.58e-06,4.62e-06,4.64e-06,4.6e-06,4.59e-06,4.62e-06,4.21e-06,4.44e-06,5.3e-06,2.14e-05,4.61e-06,4.05e-06,3.22e-06,3.5e-06,3.28e-06,3.58e-06,3.34e-06,3.47e-06,3.41e-06,3.46e-06,3.42e-06,3.62e-06,3.47e-06,3.52e-06,3.43e-06,3.4e-06,3.65e-06,3.95e-06,3.83e-06,3.71e-06,3.36e-06,5.5e-06],"winrateAvg":0.455492,"leadAvg":-0.453607,"scoreMeanAvg":-0.554041,"scoreStdevAvg":12.0381,"shorttermWinlossErrorAvg":0.136295,"shorttermScoreErrorAvg":1.00226,"ownership":[52,51,45,34,26,22,26,32,37,32,25,25,31,39,41,37,31,29,26,54,55,49,36,24,20,24,33,45,38,22,24,34,48,47,37,33,25,24,53,63,64,37,31,6,35,34,88,35,15,16,18,79,49,48,34,24,21,45,70,82,82,21,44,41,10,87,27,-38,2,-1,22,32,84,38,23,21,8,58,-69,-81,71,72,47,41,88,25,5,4,0,7,16,21,30,26,20,-20,-50,-37,-81,-14,11,9,29,22,4,-2,-2,-10,2,5,10,15,19,19,-39,-45,-58,-56,-82,-11,1,-4,1,-1,-6,-12,-63,-10,-1,3,10,19,20,-44,-47,-44,-32,-26,-9,49,-1,-2,-2,-4,-5,-13,-3,-4,2,12,28,28,-46,-46,-43,-34,-24,-13,-1,-5,-5,-4,-4,-6,-9,-8,-7,-9,15,45,39,-49,-52,-50,-40,-26,-14,-10,-7,-7,-8,-7,-10,-12,-13,-16,-35,-34,69,46,-52,-53,-62,-89,-33,-22,-15,-11,-11,-13,-13,-14,-17,-19,-32,-84,7,52,55,-54,-58,-62,-59,-38,-25,-22,-22,-19,-14,-21,-24,-25,-26,-42,-84,71,62,55,-57,-58,-62,-89,-37,-32,-31,-28,-31,-79,-36,-34,-33,-35,-48,-84,70,54,53,-57,-59,-63,-58,-50,-39,-36,-36,-43,-51,-48,-41,-41,-36,-51,-15,13,51,49,-58,-58,-57,-54,-46,-38,-34,-34,-38,-42,-42,-40,-39,-37,-30,-13,14,25,41],"ownershipAllowedMAE":0.0233653})%"); + lines.push_back(R"%({"sample":{"board":".................O./.........XXXOO...OX/XX.X....XOO.XO.OOX./OXX.XXXXOXX.XO..X.X/OOOOOOOOO...O.OOOX./.....O.XO....OXXXX./..OXXOX.XOOXXX...O./..XOOXXX.XXX..XOOX./.......OX..OXXO.OO./....O.XOX...OXO..../..O.O.OOXX..XXOXOX./.O...OOXXOX.X.XOO.X/.OX..OXXOOX.XXX.OOX/..OOO..OOXXOXOOXXX./.O.X..O..OXOO..OX../.OX.XXO.OOXO..O.OX./.X..XOOOXXX.O.OOOX./..X..XO.....OXOXXX./....X.........X..../","hintLoc":"null","initialTurnNumber":197,"metadata":"30DE560FEE7D519D42E22E171C3BEBD3:207","moveLocs":["Q16","M3","S16","G6","H5","R16","G14","N14","O15","S16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.22,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.22e-06,3.89e-06,3.9e-06,3.92e-06,3.98e-06,3.66e-06,3.37e-06,3.54e-06,3.53e-06,4.03e-06,5.18e-06,0.00113,0.000622,6.2e-06,3.68e-06,9.2e-06,8.64e-06,0,1.69e-06,4.41e-06,4.91e-06,6.85e-06,5.8e-06,6.72e-06,6.17e-06,5.97e-06,5.46e-06,0.000165,0,0,0,0,0,3.18e-06,1.14e-05,1.09e-05,0,0,0,0,5.45e-06,0,7.29e-06,7.55e-06,5.85e-06,0.0233,0,0,0,5.34e-06,0,0,3.21e-06,0,0,0,0,0,0,0,0.0514,0,0,0,0,0,0,0,3.27e-05,0,0,2.79e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00127,0.0373,0.076,0,0,0,0,0,0,2.83e-06,3.23e-06,3.4e-06,3.89e-06,3.82e-06,3.79e-06,0,0,0,0,9.03e-05,0.00517,7.81e-06,0,0,0,0,0,0,0.0279,3.65e-06,3.79e-06,0,0,0,0,0,0.0234,0,0,0,0,0,0,6.47e-06,0.00204,0.0083,0,0.000973,3.34e-06,3.45e-06,0,0,0,0,0,0,0,0,0,0,3.1e-06,1.45e-05,0,0,0,0,0.000419,3.18e-06,3.34e-06,3.55e-06,6.15e-06,0.000512,0.139,0.119,0,0,3.39e-06,3.37e-06,0,0,0,0,3.5e-06,0,0,1.94e-05,3.13e-06,3.29e-06,3.2e-06,3.17e-06,0,0.101,0,0,0,3.35e-06,3.27e-06,3.23e-06,0,0,0,5.79e-06,9.02e-05,0.124,0.000491,2.99e-06,2.91e-06,0,3.42e-06,0,6.08e-06,0,0,0,0,3.33e-06,3.2e-06,0,0,0,0,0,0,5.64e-06,2.97e-06,0,2.92e-06,3.2e-06,3.39e-06,0,0,0,0,0,0,3.46e-06,0,0,0,0,0,0.000326,0,3.05e-06,0,0,3.2e-06,3.39e-06,0,0,0,0,0,0,0.00058,0,0,0,3.44e-06,0,0,0,3.33e-06,3.55e-06,0,0,0,7.94e-06,0,0,0,0,0,0,0,0,0,0,0,0,0.000256,6.97e-06,0,0.0013,0,0.000607,7.54e-06,0,0,1.55e-06,0,0,0,0,0.000451,0.000197,0,0,4.33e-06,8.63e-06,0.000989,0,0,0.000113,0,0,0,1.71e-06,0,0,0,0,0.000357,0.00308,0,1.31e-06,0,0,3.47e-06,0.000768,0,0.000258,8.65e-05,0,0,0,0,0,0,0,0,0,0.117,0,0,0,0,3.11e-06,5.26e-06,6.39e-06,0,7.05e-05,0.000438,0,0,1.94e-05,0.0427,1.06e-05,2.5e-05,0.00242,0,0,0,0,0,0,3.32e-06,4.5e-06,4.22e-06,3.88e-06,6.19e-06,0,8.83e-06,0.00448,8.19e-05,0.000236,0.00172,0.00282,0.0191,0.0539,1.31e-05,0,0.000824,3.74e-06,3.32e-06,2.92e-06,2.4e-05],"winrateAvg":0.987832,"leadAvg":1.17483,"scoreMeanAvg":1.31917,"scoreStdevAvg":1.8549,"shorttermWinlossErrorAvg":0.0562914,"shorttermScoreErrorAvg":0.47785,"ownership":[-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-95,-5,-5,98,100,100,100,100,39,-99,-99,-99,-99,-99,-99,-99,-99,-99,-100,-100,-100,100,100,100,100,100,99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-100,-99,-99,-100,-100,100,100,100,100,-100,-99,100,-100,-99,39,-100,-100,-100,-100,100,-99,-100,-64,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,21,-4,-31,100,100,100,100,100,-100,-95,100,100,100,100,100,100,100,37,100,85,24,-42,-100,100,-100,-100,-100,-100,-60,100,100,100,99,100,100,-100,33,-100,98,98,-100,-100,-100,-99,55,-20,99,32,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,98,99,100,100,100,100,35,-9,-21,100,-100,-100,-100,-100,-100,-100,100,100,100,100,88,100,100,100,100,100,40,-29,100,-100,-100,-100,-100,-100,-100,100,100,100,16,24,100,100,100,100,100,81,100,100,-100,-100,-100,-100,-100,-100,100,100,100,-97,-71,100,100,100,100,100,100,100,-100,-100,100,-100,-98,-100,-100,-100,100,100,16,-99,100,100,100,100,100,100,-100,-100,100,100,-100,-71,-100,-100,-100,-29,100,100,-100,100,100,100,100,100,36,-100,100,100,-100,-100,100,-100,100,100,-100,-100,-100,-100,97,100,9,-100,-43,11,100,100,100,100,-100,100,100,100,100,100,-100,-100,-100,-10,100,-100,-100,-100,-100,100,100,100,100,-100,100,99,99,100,100,100,-100,-100,-28,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,79,100,100,100,-100,-100,-100,-100,-100,-100,-99,-99,100,34,-47,-79,-39,-6,100,-93,100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-3,58,50,-42,-26,4,59,81,-93,-98,-98,-99,-100,-100],"ownershipAllowedMAE":0.0172095})%"); + lines.push_back(R"%({"sample":{"board":"............./..X..XO.OOX../.OOXXXXOOXOO./OXXO..OXOXX../..XO.XXXXO.../.XO.O.OOO.O../.X.O...OXO.O./.XO....XX.XX./.OO......X.../..OX....OOX.X/.OXX....O.OX./..XO.OO..O.X./.XXO.O.OOXXX./..OXXXOOXXOO./..X...XOXOO../.....XXXOO.O./","hintLoc":"null","initialTurnNumber":108,"metadata":"18D52FC6640C3EBD766942E9F445495D:118","moveLocs":["B12","B15","D15","A9","L10","M11","F11","A10","B16","A15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.85,"xSize":13,"ySize":16},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.34e-06,0,0.977,2.78e-06,2.9e-06,3.44e-06,1.7e-05,0.000165,0.00394,0.00182,2.51e-05,1.7e-05,3.11e-06,0,0,0,0,2.85e-06,0,0,7.26e-06,0,0,0,9.01e-05,4.53e-06,0,0,0,0,0,0,0,0,0,0,0,0,5.7e-06,0,0,0,0,3.73e-06,2.99e-06,0,0,0,0,0,0.00306,4.47e-06,0.000114,0,0,0,1.96e-05,0,0,0,0,0,3.33e-05,4.48e-06,3.83e-06,0.00355,0,0,0,0,0,0,0,0,0,0,0,3.4e-06,0,0,4.97e-06,0,4.7e-06,1.89e-05,0.000909,0,0,0,0,0,4.03e-06,0,0,0,3.16e-06,1.12e-05,4.16e-06,7.55e-06,0,0,2.48e-05,0,0,3.41e-06,0.00422,0,0,3.2e-06,3.71e-06,3.93e-06,1.07e-05,4.15e-06,3.21e-06,0,3e-06,3.23e-06,3.08e-06,0.00379,2.88e-06,0,0,3.76e-06,3.23e-05,8.7e-05,0.000125,0,0,0,2.95e-06,0,2.97e-06,0,0,0,3.47e-06,4.33e-06,7.76e-06,5.73e-05,0,0,0,0,3.08e-06,3.2e-06,3.18e-06,0,0,3.31e-06,0,0,4.52e-06,3.56e-06,0,4.27e-06,0,3.26e-06,3.47e-06,0,0,0,3.32e-06,0,0,0,0,0,0,0,3.37e-06,3.19e-06,3.03e-06,0,0,0,0,0,0,0,0,0,0,0.000105,3.18e-06,3.15e-06,0,3.25e-06,3.4e-06,3.02e-06,0,0,0,0,0,3.51e-06,2e-05,2.82e-06,2.96e-06,3.13e-06,3.23e-06,2.98e-06,0,0,0,0,0,0,0,2.85e-06,8.81e-06],"winrateAvg":0.0685333,"leadAvg":-1.80575,"scoreMeanAvg":-1.83488,"scoreStdevAvg":3.31738,"shorttermWinlossErrorAvg":0.161411,"shorttermScoreErrorAvg":1.05948,"ownership":[-100,-100,-100,-100,-99,-91,-66,-45,-2,66,93,95,96,-97,-98,-100,-100,-100,-100,11,12,98,98,95,97,97,-96,-97,-98,-100,-100,-100,-100,98,98,96,99,99,98,-40,-99,-99,97,-6,-99,-99,-100,98,97,97,97,97,-29,-99,-99,98,67,-99,-100,-100,-100,99,97,98,97,66,-99,93,93,99,-98,98,98,98,96,99,99,85,94,-99,65,99,90,94,40,97,-100,96,-100,99,-2,97,-98,99,50,-20,24,-86,-100,-100,-67,-100,-100,-20,96,99,99,-12,2,-13,-36,-28,-16,-100,-99,-99,-95,94,97,99,-100,-23,-11,-21,13,99,99,-99,-99,-100,86,97,-100,-100,-22,8,24,39,99,57,61,-100,-99,23,-12,-100,96,62,99,99,94,97,96,-28,-100,-94,-73,-100,-100,95,-2,99,99,99,99,-100,-100,-100,11,-98,-99,-99,-100,-99,-99,99,99,-100,-100,99,99,21,-99,-99,-100,-99,-99,-98,-98,99,-100,99,99,99,99,-99,-99,-99,-99,-98,-98,-98,-98,99,99,99,99,99],"ownershipAllowedMAE":0.0314506})%"); + lines.push_back(R"%({"sample":{"board":".XXXXO.....O.OOOX../.OXOX.X.OXXO.OXOOX./.OOOOXX.O.OX.OXOXX./XXOO.OX..OOX.OXXO../..XOOX.OOXX.XO.XX../XX.XOX.OX....O.O.../.XXOOX.OXXO......../XOXOXXOO.......X.../O.OX.X...X........./.OOX...........X.../.O.X.....OOX.X.X.X./.OX.....XXXXO.OOXOX/.XOX.............../.XOX.......OOOOOOO./.OOOXOXX.OOXXXOXOOX/.OOXXXO..OXX.XX.XOO/..O.XO..O.XXOXXXXXO/...O.O..OXXOOOOXOOO/...........O.OXXXXO/","hintLoc":"null","initialTurnNumber":221,"metadata":"C30865254EE8A4AFD0F80F610E24BE43:231","moveLocs":["K3","L1","Q4","N18","N17","Q5","C14","N4","B15","B11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.94,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":-0.555,"policyMixture":[0.00401,0,0,0,0,0,1.19e-05,4.98e-05,7e-06,9.15e-06,6.47e-06,0,8.19e-06,0,0,0,0,6.65e-06,6.76e-06,9.78e-05,0,0,0,0,0.000658,0,7.82e-06,0,0,0,0,0,0,0,0,0,0,7.27e-06,0.0749,0,0,0,0,0,0,7.32e-06,0,7.96e-06,0,0,0,0,0,0,0,0,7.11e-06,0,0,0,0,7.03e-06,0,0,6.94e-06,7.44e-06,0,0,0,1.52e-05,0,0,0,0,1.11e-05,7.41e-06,0.000227,0,0.0585,0,0,0,7.94e-05,0,0,0,0,8.5e-06,0,0,8.76e-06,0,0,0.00109,8.37e-06,0,0,0,5.44e-06,0,0,6.77e-06,0,0,7.95e-06,8.18e-06,3.19e-05,6.95e-06,0,7.09e-06,0,0.00307,0.000223,9.45e-06,0,0,0,0,0,0,7.25e-06,0,0,0,0,6.96e-06,6.85e-06,7.24e-06,6.57e-06,1.71e-05,1.92e-05,2.18e-05,7.8e-06,0,0,0,0,0,0,0,0,1.22e-05,2.28e-05,1.14e-05,7.13e-06,7.03e-06,7.1e-06,6.73e-06,0,6.88e-06,7.27e-06,6.99e-06,0,0,0,0,6.47e-06,0,6.66e-06,6.92e-06,2.13e-05,0,1.3e-05,7.16e-06,6.82e-06,6.99e-06,6.61e-06,6.88e-06,6.8e-06,7.5e-06,7.1e-06,0.684,0,0,0,6.62e-06,6.46e-06,6.5e-06,1.32e-05,7.18e-06,6.82e-06,6.96e-06,7.55e-06,6.92e-06,7.09e-06,6.58e-06,0,6.88e-06,7.41e-06,7.48e-06,1.13e-05,0,6.72e-06,0,6.83e-06,7.25e-06,7.09e-06,6.62e-06,6.97e-06,0,0,0,6.89e-06,0,6.62e-06,0,7.47e-06,0,7.32e-06,6.73e-06,0,0,9.79e-06,9.38e-06,6.96e-06,6.97e-06,6.92e-06,0,0,0,0,0,6.99e-06,0,0,0,0,0,7.33e-06,0,0,0,6.54e-06,6.78e-06,6.63e-06,6.59e-06,6.39e-06,6.67e-06,6.9e-06,6.69e-06,7.15e-06,7e-06,7.77e-06,7.37e-06,1.02e-05,6.97e-06,8.72e-06,6.62e-06,0,0,0,1.12e-05,1.41e-05,6.52e-06,6.75e-06,1.06e-05,7.07e-06,7.02e-06,0,0,0,0,0,0,0,8.44e-06,6.85e-06,0,0,0,0,0,0,0,7.01e-06,0,0,0,0,0,0,0,0,0,0,6.98e-06,0,0,0,0,0,0,6.46e-06,7.81e-06,0,0,0,0,0,0,0.154,0,0,0,6.82e-06,6.82e-06,0,6.85e-06,0,0,6.87e-06,7.17e-06,0,0,0,0,0,0,0,0,0,0,0,6.59e-06,7.03e-06,7.12e-06,0,6.78e-06,0,7.42e-06,7.31e-06,0,0,0,0,0,0,0,0,0,0,0,6.42e-06,6.7e-06,6.73e-06,6.95e-06,7.38e-06,7.54e-06,7.46e-06,7.49e-06,6.81e-06,0.0179,0,0,0,0,0,0,0,0,0,9.95e-06],"winrateAvg":0.637476,"leadAvg":1.31578,"scoreMeanAvg":1.498,"scoreStdevAvg":9.29064,"shorttermWinlossErrorAvg":0.419902,"shorttermScoreErrorAvg":3.90331,"ownership":[-30,-85,-86,-85,-84,-62,-61,17,72,89,92,98,98,99,99,99,19,21,-25,8,40,-84,40,-84,-83,-89,-15,96,88,90,97,98,99,-70,99,99,-68,-42,37,41,42,40,38,-89,-89,-7,95,92,94,-55,99,99,-71,99,-67,-67,-63,26,26,41,40,-49,-57,-89,-12,89,94,94,-59,53,99,-71,-69,-67,-68,-65,33,42,38,43,43,-99,-15,93,94,-72,-72,-59,-62,99,19,-69,-70,-67,-61,32,34,48,41,43,-100,-19,93,-77,-66,-8,34,20,98,51,64,13,-42,-50,51,34,34,46,44,-100,8,93,-78,-79,31,3,13,33,12,16,-11,-31,-39,56,68,36,46,-100,-100,93,94,14,-55,-32,-11,-8,-4,-4,-83,-36,-44,-44,86,67,96,-99,-97,-99,-2,18,-36,-85,-26,-29,-14,-16,-21,-50,-56,-59,-58,87,95,95,-99,-70,-54,-29,-13,-33,-44,-41,-38,-29,-32,-39,-96,-69,-72,-73,88,95,-45,-99,-67,-56,-43,-42,-55,-15,-16,-98,-9,-80,16,-96,-82,-93,-81,91,95,-92,-85,-60,-61,-53,-52,-98,-98,-98,-98,70,-9,93,92,-84,-29,-84,95,93,100,-93,-71,-68,-56,-36,-15,-23,-22,-14,33,46,76,61,17,-26,2,97,94,100,-93,-81,-69,-63,-33,49,39,26,96,96,96,96,96,95,95,68,98,100,100,100,-86,-67,-86,-85,8,91,92,-98,-98,-98,96,13,96,95,82,99,100,100,-86,-86,-85,56,-21,42,91,-98,-98,-98,-98,-98,10,-98,95,95,99,99,100,12,-86,86,51,24,90,91,-98,-98,-98,-99,-99,-98,-98,-98,96,98,97,95,97,-33,86,66,64,90,-98,-98,-98,-98,-98,-98,-98,97,96,96,97,96,94,83,74,73,66,57,4,-50,-98,-98,-98,-98,-98,-98,-98,-98,96],"ownershipAllowedMAE":0.0753682})%"); + lines.push_back(R"%({"sample":{"board":".................../.......OXX....O..../.OXO...OO.XX..XXO../OOXO.....OOX...XX../XXOO.......X......./X.XO.....OOX......./.XXXO...OXXO....X../...O...OOX.....X.../.XX.....X..OXX.XOX./.OOO.....XXXO.OOX../............O....../..X............OO../...O............XO./..O.O......O.X.X.X./..OOXX...OO.O....../..OXXO....XO.OO.X../.XXXOO.XOOXXOOXX.../....XO.O....XX...../....X............../","hintLoc":"null","initialTurnNumber":119,"metadata":"63F3757899FF682E1DCCB4C70984E1FE:129","moveLocs":["H11","H10","J9","J10","G10","F7","E8","F9","G9","F8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.86,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":33.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.49e-05,1.52e-05,1.66e-05,1.63e-05,1.72e-05,1.64e-05,1.53e-05,1.63e-05,1.71e-05,1.67e-05,1.6e-05,1.52e-05,1.48e-05,1.51e-05,1.51e-05,1.57e-05,7.04e-05,3.66e-05,1.47e-05,1.53e-05,1.59e-05,1.62e-05,1.67e-05,1.6e-05,1.63e-05,1.61e-05,0,0,0,1.69e-05,1.57e-05,1.54e-05,1.58e-05,0,0.00107,0.00176,0.000864,0.000197,1.36e-05,0,0,0,1.57e-05,1.5e-05,1.62e-05,0,0,1.88e-05,0,0,1.54e-05,1.55e-05,0,0,0,0.000733,3.62e-05,0,0,0,0,1.51e-05,1.55e-05,1.53e-05,1.52e-05,1.5e-05,0,0,0,1.49e-05,1.55e-05,1.48e-05,0,0,0.00164,1.65e-05,0,0,0,0,1.47e-05,1.55e-05,1.6e-05,1.57e-05,1.54e-05,1.57e-05,1.62e-05,0,1.47e-05,1.54e-05,1.52e-05,1.54e-05,1.6e-05,1.92e-05,1.57e-05,0,0,0,0,1.56e-05,1.59e-05,1.63e-05,1.61e-05,1.55e-05,0,0,0,1.61e-05,1.56e-05,1.54e-05,1.58e-05,1.62e-05,1.63e-05,1.61e-05,0.000168,0,0,0,0,1.71e-05,1.62e-05,1.57e-05,0,0,0,0,0.00283,2.38e-05,1.68e-05,1.66e-05,0,1.65e-05,1.65e-05,2.53e-05,2.81e-05,0.000115,0,2.02e-05,2.04e-05,1.8e-05,0,0,0,0.185,0.00224,0.00182,4.09e-05,2.55e-05,0,1.58e-05,1.83e-05,1.8e-05,0.000131,0,0,0.000911,3.56e-05,3.54e-05,2.2e-05,0,0,2.58e-05,0.000108,0,0,0,0.0613,0,0,0,2.03e-05,2.06e-05,0,0,0,5.81e-05,0.000547,0,0,0,0,0,0,0,5.21e-05,0,0,0,0.0462,1.96e-05,2.26e-05,2e-05,2.2e-05,2.69e-05,0.0823,0,0,0.334,0,0.00113,2.73e-05,0.0043,0,1.75e-05,1.81e-05,1.57e-05,0.000138,0.000225,1.9e-05,2.19e-05,0.000599,0,0.0507,0,0,0.000145,6.62e-05,3.56e-05,7.67e-05,0.000732,0.000102,2.15e-05,2.11e-05,2.03e-05,0,0,2.95e-05,2.15e-05,2.23e-05,4.03e-05,2.29e-05,0,2.24e-05,0,2.32e-05,9.43e-05,4.15e-05,2.6e-05,2.32e-05,2.1e-05,3.6e-05,4.87e-05,0.000329,0.0173,0,0,2.31e-05,2.19e-05,2.38e-05,0,1.51e-05,0,0.136,2.89e-05,4.03e-05,2.33e-05,1.84e-05,1.62e-05,0,2.06e-05,0,0.000993,0,1.99e-05,0,3.6e-05,2.36e-05,2.16e-05,0,0,0,0,0.000227,2.71e-05,2.05e-05,0,0,1.47e-05,0,1.95e-05,2.14e-05,0.00601,6.22e-05,0.0366,1.71e-05,2.13e-05,0.00454,0,0,0,0,1.88e-05,2.45e-05,1.8e-05,2.13e-05,0,0,1.5e-05,0,0,0.00239,0,2.86e-05,1.73e-05,2.05e-05,0,0,0,0,0,1.79e-05,0,0,0,0,0,0,0,0,0,2.26e-05,2.01e-05,1.61e-05,1.67e-05,2.4e-05,4.48e-05,0.000488,0,0,1.63e-05,0,1.8e-05,2.71e-05,0.000835,2.85e-05,0,0,2.11e-05,2.27e-05,2.21e-05,1.83e-05,1.69e-05,1.69e-05,2.98e-05,0.00208,2.59e-05,0,0.00693,1.79e-05,1.61e-05,1.75e-05,2.13e-05,2.14e-05,2.18e-05,1.92e-05,1.81e-05,1.72e-05,1.68e-05,1.65e-05,1.66e-05,1.45e-05,1.82e-05],"winrateAvg":0.219143,"leadAvg":-1.28572,"scoreMeanAvg":-2.4624,"scoreStdevAvg":8.46505,"shorttermWinlossErrorAvg":0.198551,"shorttermScoreErrorAvg":1.27354,"ownership":[91,92,92,93,92,92,92,-51,-58,-89,-98,-98,-98,-97,-95,-94,-93,-93,-93,90,92,91,94,93,93,93,99,-98,-99,-98,-99,-98,-98,-95,-94,-93,-92,-93,90,91,90,99,94,94,95,99,100,41,-100,-100,-99,-98,-100,-100,-92,-93,-93,92,91,90,99,94,93,94,95,96,98,98,-100,-98,-98,-98,-100,-100,-95,-95,-97,-97,99,99,93,92,92,94,95,90,-63,-100,-97,-97,-97,-97,-97,-97,-95,-97,-97,-97,99,92,89,89,93,95,97,97,-100,-95,-95,-96,-97,-97,-96,-95,-96,-97,-97,-98,95,77,82,91,99,-91,-92,-87,-91,-94,-94,-97,-100,-97,-93,-95,-95,-14,52,41,47,63,99,99,-92,-88,-92,-92,-92,-88,-100,-97,-92,-86,-37,-97,-98,-57,24,24,70,99,-94,-93,-92,-89,-98,-97,48,-100,-62,-95,-35,-3,92,92,91,2,-14,93,-92,-94,-94,-94,-94,83,-14,81,81,-61,14,-11,66,69,72,48,4,-67,92,42,67,-5,-26,20,83,55,62,65,44,35,17,59,68,44,58,77,-66,19,22,14,-9,-37,28,33,33,46,83,84,-10,10,56,64,74,89,-21,-63,-9,-3,8,8,1,32,22,15,15,44,-89,-8,-35,30,72,91,69,67,-11,-35,-4,10,33,53,97,21,-71,-37,-94,-84,-93,-44,11,47,91,90,-95,-93,-13,-1,30,97,98,94,96,-1,-13,-25,-75,-81,-80,-34,22,91,-95,-95,84,-2,23,45,21,-92,94,90,91,90,-3,-98,-93,-88,-66,-95,-94,-95,84,84,51,6,96,96,-92,-92,91,91,-99,-99,-96,-94,-92,-84,-84,-91,-73,-75,83,64,89,79,21,-20,-92,-98,-98,-98,-98,-96,-95,-93,-83,-83,-72,-71,-73,42,69,78,69,36,-16,-50,-77,-93,-97,-97,-96,-95,-95],"ownershipAllowedMAE":0.0254074})%"); + lines.push_back(R"%({"sample":{"board":".......OXX........./OO...O.OOX.XOO.X.../XO.OXOO.OX.XO.OXOXX/XOOOOXXOOX.OXO.XXXO/XXOXOXXOOX.OXXOXXOO/X.XXXXXXOOX.OXXXO../.XXOOOXXOOOXXOOOOO./XXOO.OX.XXX..XXXO.O/OXOOOXXX.XX..X..XOO/OOOXXX...XOX..XXXXX/.OXXXOX.XXOOXXXOOOX/OXXXOOXXXXOXX.XO.OO/.OXXXOOOXOOOXXOOO../.OOXOO.OOOOOOOXXOO./.OOXOXX..X.OXXXOO.O/..OOXO.O.XOOX.OXXOO/.OXXXO.OOOXXX.OX.XO/OXX.XXOX.OOXXOOX.XX/...OOX...OOOXXX..../","hintLoc":"null","initialTurnNumber":229,"metadata":"942BC509C8282F73D6E738AC6C53BAE8:239","moveLocs":["G1","N10","B1","M14","C1","R18","D2","N19","E18","P18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":15.5,"policyOptimism":0.709,"pda":0.0,"policyMixture":[0.00247,0.00233,0.0023,0.00239,0.00254,0.00241,0.00232,0,0,0,0.00291,0.00454,0,0.00426,0.00448,0.00375,0.00314,0.00327,0.00215,0,0,0.0028,0.0135,0,0,0.0137,0,0,0,0.00917,0,0,0,0,0,0,0.00291,0.00215,0,0,0.00421,0,0.0135,0,0,0.0133,0,0,0.00888,0,0,0.0046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0046,0,0,0,0.00415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00433,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0147,0.00456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0146,0,0,0,0,2.83e-05,0,0,0,0,0,0,0.00357,0.00366,0,0,0,0,2.57e-05,0,0,0,0,0,0,0,0,0,0.00223,0,0,0.00328,0.00372,0,0.00214,0.00204,0,0,0,0,0,0,0,0,0,0.002,0.0038,0.00281,0,0,0,0,0,0,0,0,0,0,0.0137,0,0,0,0,0,0,0.00201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00278,0,0,0.0142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00611,0.00297,0.00294,0,0,0,0,0,0.0131,0,0,0,0,0,0,0,0,0,0,0,0.0145,0.00237,0,0,0,0,0,0,0.0127,0.0137,0,0.0131,0,0,0,0,0,0,0.0133,0,0.00219,0.0133,0,0,0.013,0,0.0131,0,0.0132,0,0,0,0,0.00449,0,0,0,0,0,0.0141,0,0.0135,0.0133,0.00382,0,0.013,0,0,0,0,0,0,0.00465,0,0,0.00282,0,0,0,0.0135,0.0038,0,0.00503,0.0134,0,0,0.0137,0,0,0,0,0,0,0,0.00532,0,0,0.015,0,0,0,0,0.014,0,0.0141,0.00422,0,0,0,0,0,0,0.00562,0.00465,0.00258,0.00194,0.421],"winrateAvg":0.999538,"leadAvg":17.6968,"scoreMeanAvg":17.6269,"scoreStdevAvg":0.991251,"shorttermWinlossErrorAvg":0.00609557,"shorttermScoreErrorAvg":0.515244,"ownership":[100,100,100,100,100,100,100,100,-100,-100,-99,-99,-100,-99,-99,-99,-99,-99,-100,100,100,100,100,100,100,100,100,100,-100,-99,-100,-99,-99,-100,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,100,-100,-99,-100,-99,-99,-99,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,100,100,-100,-98,-99,-100,-99,-99,-100,-100,-100,100,-100,-100,100,-100,100,-100,-100,100,100,-100,-99,-99,-100,-100,-99,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,-100,-100,100,100,100,-100,-100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-99,-99,-100,-100,-100,100,100,100,100,-100,100,100,100,-100,-100,-100,-99,-100,-100,-99,-99,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-99,-99,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,100,-100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,-100,100,-100,-100,-100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,100,100,100,-100,100,100,100,-100,-100,100,100,100,100,100,100,100,100,-100,100,100,99,100,100,100,100,100,100,100,-100,-100,100,100,100,100,100,100,-100,100,98,97,98,98,98,99,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,98,100,98,98,100,100,-100,-99,-99,-100,-100,100,100,100,100,100,99,100,100,99,100,100,100,-100,-100,-100,-99,-99,-100,-100,-100,100,100,100,100,100,100,99,100,99,99,100,100,-100,-100,-99,-99,-100,-99,-100,-100,100,100,100,100,100,99,100,99,99,100,100,100,-100,-100,-100,-100,-99,-100,-100],"ownershipAllowedMAE":0.00394237})%"); + lines.push_back(R"%({"sample":{"board":".................../.......OOOX...XOO../..OOOXXXOXXO.X.XO../..XO.O.XOX.....XO../..X...OOXX......XO./..XOO..X..XO....XO./.OOXO.....OX....XO./XXXXX.....OX....X../XOX..X....OX......./O.OOX....OXOO....../.OOOXX...OX.XX.XXX./OXOXO.O..OX.X..O.O./.XXXO...O.OOXO.O.../XX.XO..OX.XOXO...O./OOXO...OOX.OOX.XXXX/.OXO..XXOX.OX.XX..X/.OXO.X.OXX.O.X.X.X./.OO.O.XO..O..XOOXOX/................O../","hintLoc":"null","initialTurnNumber":141,"metadata":"A771B055F6C93D3B9D3F8DE79FB57BBF:151","moveLocs":["S12","S11","C6","C5","C4","D11","C6","G7","H7","C5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.58e-06,3.47e-06,3.62e-06,3.52e-06,4.39e-06,8.7e-06,5.29e-05,4.44e-06,3.18e-06,1.06e-05,0.000402,8.36e-05,0.00442,9.65e-05,0.00134,7.87e-06,3.02e-06,2.49e-06,2.18e-06,6.58e-06,2.35e-05,4.59e-06,4.3e-06,6.44e-06,0.0114,0.000498,0,0,0,0,0.0633,0.000744,0.000421,0,0,0,2.83e-06,2.57e-06,1.47e-05,0.000271,0,0,0,0,0,0,0,0,0,0,0.000438,0,0.000805,0,0,2.96e-06,2.32e-06,8.41e-06,0.00143,0,0,3.69e-06,0,0.0147,0,0,0,5.59e-06,7.89e-05,0.000121,0.000747,0.013,0,0,2.72e-06,2.74e-06,8.7e-06,3.67e-05,0,3.23e-05,3.95e-06,4.16e-06,0,0,0,0,0.000144,0.00552,0.000251,0.000156,0.00124,0.02,0,0,2.37e-06,3.92e-06,3.23e-05,0,0,0,6.53e-06,8.27e-05,0,1.69e-05,0.00289,0,0,0.0566,0.000182,0.000179,6.09e-05,0,0,2.3e-06,3.7e-06,0,0,0,0,8.99e-06,6.04e-05,0.000122,0.019,0.000726,0,0,0.258,9.11e-05,0.000125,2.23e-05,0,0,2.76e-06,0,0,0,0,0,7.17e-06,7.01e-05,0.00018,0.0181,2.14e-05,0,0,1.38e-05,5.77e-05,4.61e-05,0.00016,0,0,6.83e-06,0,0,0,0,0,0,8.54e-06,4.82e-05,0.000268,0.000206,0,0,0.000124,4.76e-05,7.92e-05,0.00443,0.319,0,0.132,0,1.65e-06,0,0,0,3.23e-06,8.99e-06,1.07e-05,6.44e-06,0,0,0,0,0.0134,0.0102,4.71e-05,2.36e-05,0.0023,4e-05,4.77e-06,0,0,0,0,0,1.41e-05,6.52e-06,4.21e-06,0,0,2.36e-05,0,0,0.00244,0,0,0,0.000112,0,0,0,0,0,4.46e-05,0,5.58e-06,3.43e-06,0,0,0.000459,0,1.12e-05,2.01e-05,0,3.77e-06,0,3.32e-06,3.13e-06,0,0,0,0,7.94e-06,0,0,0,3.09e-06,0,0,0,0,3.56e-06,0,3.01e-06,3.23e-06,2.64e-06,0,0,0,0,0,4.1e-06,5.52e-06,0,0,3.29e-06,0,0,0,0,3.3e-06,3.13e-06,3.22e-06,0,3e-06,0,0,0,0,3.37e-06,3.81e-06,3.44e-06,0,0,0,3.17e-06,0,0,0,0.000698,0,0,0,0,2.44e-06,0,0,0,2.95e-06,3.19e-06,0,0,0,0,2.9e-06,0,0,0,0,0,2.67e-06,3.27e-06,0,2.43e-06,0,2.45e-06,0,2.85e-06,0,2.51e-06,0,0,0,3.66e-06,0,0.0101,0,3.38e-06,0,3.91e-06,0,0,2.43e-06,0,0,2.61e-06,0,3.41e-06,0,0,3.67e-06,4.19e-06,0,5.32e-06,0.00453,0,0,0,0,0,0,2.3e-06,2.42e-06,2.37e-06,2.4e-06,2.99e-06,3.1e-06,3.21e-06,3.66e-06,3.39e-06,3.69e-06,4.94e-06,8.48e-06,1.9e-05,1.29e-05,4.15e-06,2.61e-06,0,3.04e-06,3.07e-06,1.01e-05],"winrateAvg":0.986896,"leadAvg":4.74259,"scoreMeanAvg":5.70033,"scoreStdevAvg":6.83504,"shorttermWinlossErrorAvg":0.0432768,"shorttermScoreErrorAvg":1.24391,"ownership":[57,71,83,89,92,89,81,51,-1,-45,-68,-76,-72,-77,-20,21,92,96,97,23,80,79,92,93,92,92,96,96,95,-97,-74,-81,-83,-94,99,99,98,98,3,-41,100,100,100,89,91,91,96,-97,-97,-70,-83,-97,-92,-96,99,98,98,-42,-44,-91,100,94,99,98,90,95,-97,-88,-83,-82,-85,-85,-96,99,99,98,-67,-82,-92,8,75,62,99,98,-97,-97,-87,-78,-84,-86,-88,-89,-98,99,97,-90,-92,-93,98,97,47,-28,-76,-57,-33,-93,-75,-91,-88,-88,-89,-98,99,91,-97,-89,-89,-99,98,18,4,-14,-10,-4,82,-95,-87,-89,-90,-91,-98,99,84,-99,-100,-99,-99,-100,-44,-10,-7,4,41,82,-95,-92,-92,-91,-92,-99,99,31,-99,23,-100,-99,-97,-99,-34,-1,25,73,85,-95,-90,-92,-91,-95,-88,-94,19,57,18,75,78,-99,-70,-27,-7,27,99,-95,-80,-82,-90,-93,-93,-94,-91,-72,62,73,76,75,-99,-99,-31,6,38,100,-93,-89,-99,-99,-95,-99,-99,-99,-91,80,75,79,75,99,-74,61,35,67,100,-93,41,-99,-93,-94,-88,-94,-87,-91,75,75,76,76,99,52,24,100,100,98,100,100,-99,-88,-92,-88,-92,-91,-91,79,76,88,76,99,64,70,100,92,95,92,100,-99,-89,-94,-94,-94,-87,-95,100,100,83,100,93,92,95,100,100,92,96,100,100,-98,-95,-100,-100,-100,-100,97,100,100,100,94,94,90,91,100,92,96,100,-87,-86,-100,-100,-95,-96,-100,97,100,97,100,95,89,94,97,92,92,97,100,44,-98,-93,-100,-92,-100,-97,97,100,100,97,100,96,90,97,94,96,99,24,-21,-98,-84,-85,-96,-92,-99,98,97,96,97,96,95,95,95,94,95,63,26,-53,-84,-88,-90,-89,-95,-95],"ownershipAllowedMAE":0.0296767})%"); + lines.push_back(R"%({"sample":{"board":"............./..........O../.....OX.XO.O./.XXOOOX..XOO./.OOXXOX..XXO./.OXXXO......./.XXXO.....X../...O........./.....O......./..O........../.OX........../............./.........X.../.O........O../..X........../...X..X..O.../.......XO..../......X.XO.../.......X...../","hintLoc":"null","initialTurnNumber":55,"metadata":"610626DA70D9B8C1403B57258B39456D:65","moveLocs":["L7","B11","C11","B12","F13","B10","B8","D8","D7","E7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.05,"xSize":13,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.85e-06,9.74e-06,9.73e-06,9.54e-06,9.44e-06,9.4e-06,8.93e-06,8.54e-06,8.65e-06,8.55e-06,8.63e-06,8.55e-06,8.6e-06,1.04e-05,6.39e-05,0.000202,1.09e-05,9.46e-06,9.73e-06,9.48e-06,9.75e-06,4.56e-05,8.54e-06,0,8.26e-06,8.29e-06,2.73e-05,0.000164,0.0127,1.73e-05,8.8e-06,0,0,9.74e-06,0,0,7.4e-06,0,8.01e-06,6.61e-05,0,0,0,0,0,0,8.7e-06,2.2e-05,0,0,0,8.38e-06,1.04e-05,0,0,0,0,0,0,9.88e-06,1.26e-05,0,0,0,8.54e-06,8.7e-06,0,0,0,0,0,9.88e-06,1.43e-05,1.09e-05,0.000134,0.0004,3.33e-05,9.31e-06,8.58e-06,0,0,0,0,0,8.63e-06,1.14e-05,4.03e-05,0.000183,0,1.29e-05,9.42e-06,8.64e-06,0,8.45e-06,0,8.29e-06,8.42e-06,9.04e-06,1.01e-05,3.94e-05,0.00049,6.79e-05,1.1e-05,9.36e-06,8.7e-06,0,0,7.88e-06,8.61e-06,0,9.41e-06,1.03e-05,2.04e-05,6.23e-05,4.87e-05,1.07e-05,9.05e-06,9.02e-06,0,0,9.66e-06,9.72e-06,9.68e-06,1e-05,1e-05,1.09e-05,1.84e-05,2.51e-05,1.07e-05,8.92e-06,9.5e-06,0,0,0.00556,1.34e-05,1.19e-05,1.11e-05,1.03e-05,1.02e-05,1.19e-05,1.07e-05,1.01e-05,8.77e-06,8.81e-06,0,0.0142,0,0.00234,1.44e-05,1.18e-05,1.05e-05,1e-05,1.01e-05,9.55e-06,9.48e-06,8.68e-06,1e-05,9.56e-06,0.00027,0,0,4.05e-05,1.31e-05,1.07e-05,9.9e-06,0,0,8.81e-06,8.67e-06,9.76e-06,0,0.0822,0.747,0.0124,1.77e-05,1.1e-05,1.06e-05,1.03e-05,9.48e-06,0,8.72e-06,8.76e-06,1.22e-05,0.0235,0,0.000993,1.43e-05,1.12e-05,1.06e-05,1.14e-05,9.92e-06,8.52e-06,8.99e-06,8.81e-06,8.81e-06,1.86e-05,0.0293,0.0521,0,2.73e-05,1e-05,0,9.86e-06,9.45e-06,0,8.83e-06,9.04e-06,8.69e-06,1.13e-05,0.00025,0.0136,0.000144,1.08e-05,1e-05,8.96e-06,0,0,8.42e-06,8.62e-06,8.76e-06,8.65e-06,1.02e-05,1.47e-05,1.42e-05,1.15e-05,1.13e-05,9.69e-06,0,0,0,0,8.87e-06,9.12e-06,9.04e-06,8.67e-06,9.96e-06,9.19e-06,9.17e-06,9.28e-06,9.01e-06,8.91e-06,0,9.94e-06,9.4e-06,9.19e-06,9.07e-06,8.58e-06,1.12e-05],"winrateAvg":0.353957,"leadAvg":-0.884167,"scoreMeanAvg":-1.87173,"scoreStdevAvg":12.1179,"shorttermWinlossErrorAvg":0.197301,"shorttermScoreErrorAvg":1.49042,"ownership":[-37,-15,4,32,41,28,-1,-2,7,49,69,83,83,-49,-55,7,39,51,37,-9,-24,43,37,85,83,85,-65,-75,0,41,71,93,-75,-19,-45,59,56,88,86,-83,-91,-90,93,93,94,-75,-49,-33,-79,89,88,81,-92,-91,-91,-98,-98,94,-75,-36,-42,-78,-78,89,57,-95,-91,-98,-98,-98,94,8,-4,-18,-33,-20,6,30,-94,-98,-98,-99,93,94,30,0,-9,-21,-72,-11,1,-91,-98,-25,71,71,54,14,6,-4,1,-19,-13,-7,-81,-98,53,39,40,82,15,5,1,1,-4,-5,-6,-28,-98,50,-29,4,9,-7,-5,-3,-2,1,4,2,-8,61,-63,-42,-15,-13,-14,-13,-9,-14,5,15,14,46,62,31,-78,-58,-57,-25,-18,-13,-8,11,36,30,54,50,42,64,-72,-25,-24,-17,-10,-47,85,56,48,43,63,18,56,33,7,-4,-8,1,15,86,68,56,26,-27,-77,9,12,8,-11,-12,-5,14,56,61,57,-6,-19,-49,-87,-7,-21,-90,-42,-7,75,57,54,53,-19,-35,-51,-62,-44,-44,-73,-92,55,49,36,48,47,-30,-38,-52,-58,-63,-64,-93,-84,-85,59,29,39,44,-38,-45,-50,-58,-65,-76,-84,-90,-36,-4,23,34,40],"ownershipAllowedMAE":0.0313931})%"); + lines.push_back(R"%({"sample":{"board":".................../..XO........X.OO.../.XXO.......XOX.XO../X.X.O........OX..../.XOO..O......OX.OO./XO..X.OX.....X.XXO./.OOX..O.........XXO/.OX...OX.X.....OXO./..X.OO..O......XO../.....XOO.O.....X.O./...XX.XOOX......XXO/....O.X.X.X.X..XXO./...XO.X...X.....O.O/..OO.OOXXXO.O.XX.O./...O...OOOOO..XOO../...OOOO..OX.OOOXOX./..OO.X.OXX.XOXXXXO./..XOX.XXO.XXO....X./...X.............../","hintLoc":"null","initialTurnNumber":156,"metadata":"85C8CEAEF8A1BED31369B810AA53B7B6:166","moveLocs":["L10","K14","J16","N15","N14","M15","M14","L15","K16","L11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.37,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":4.5,"policyOptimism":0.176,"pda":0.0,"policyMixture":[1.33e-06,1.65e-06,1.95e-06,3.04e-06,2.59e-06,2.72e-06,2.68e-06,2.84e-06,2.53e-06,2.24e-06,2.06e-06,2.17e-06,2.14e-06,2.47e-06,2.5e-06,2.25e-06,2.23e-06,1.93e-06,1.27e-06,1.99e-06,1.83e-06,0,0,9.17e-06,4.48e-05,3.57e-05,6.06e-05,2.38e-05,6.35e-06,1.04e-05,3.65e-06,0,7.57e-05,0,0,5.67e-05,3.75e-06,1.78e-06,1.56e-06,0,0,0,1.01e-05,0.000816,0.000938,0.000607,5.16e-06,3.85e-06,4.57e-06,0,0,0,0.02,0,0,1.68e-05,1.77e-06,0,1.26e-06,0,0.000738,0,0.00032,0.000147,0.000132,0,0,7.83e-06,4.29e-06,9.59e-05,0,0,5.1e-06,0.00116,8.74e-06,2.11e-06,2.28e-06,0,0,0,0.000161,1.71e-05,0,0.000103,8.18e-06,9.87e-06,0,0,0,0,0,2.3e-06,0,0,2.52e-06,0,0,1.03e-05,4.85e-05,0,2.4e-06,0,0,0.181,0,0.0236,0,0,0,2.32e-06,0,0,0,0.00146,3e-06,0,0,0,2.44e-06,2.07e-06,0,0.000454,0.000878,0.317,0.00182,6.69e-06,2.89e-06,2.63e-06,2.26e-06,2.12e-06,0,0,0,2.53e-06,0,0,3.29e-05,5.76e-06,2.27e-06,0,0,0.0395,0,0.0421,0.00112,1.06e-05,3.76e-06,3.05e-06,0,0,0,0.0012,2.41e-06,3.11e-05,0,1.67e-05,0,0,3.83e-06,3.18e-05,0,0.345,0,0.000254,1.49e-05,3.18e-06,2.47e-06,0,0,0.000929,0.000335,2.27e-06,3.95e-06,3.85e-06,3.3e-06,2.54e-06,0,0,0,0,0,0,3.16e-05,3.67e-06,2.58e-06,1.8e-06,0,0.0158,0,0.000643,2.25e-06,4.31e-06,6.01e-06,0,0,2.27e-06,0,0,0,0,4.43e-06,2.78e-06,2.39e-06,2.27e-06,1.82e-06,1.51e-06,0,0,0,2.03e-06,4e-06,3.75e-06,2.99e-06,0,1.94e-06,0,3.29e-06,0,1.92e-06,0,1.87e-06,0,2.29e-06,2.14e-06,0,0,0,0,1.78e-06,3.23e-06,3.16e-06,0,0,1.85e-06,0,2.03e-06,1.76e-06,1.83e-06,0,1.99e-06,2.78e-06,2.51e-06,2.01e-06,5.43e-06,0,0,0,1.76e-06,2.46e-06,0,0,1.88e-06,0,0,0,0,0,0,1.55e-06,0,2.2e-06,0,0,3.1e-05,0,2.31e-06,1.71e-06,2.19e-06,1.63e-06,0,1.72e-06,1.73e-06,1.72e-06,0,0,0,0,0,2.13e-06,2.02e-06,0,0,0,0.000115,5.88e-06,1.71e-06,2.37e-06,1.7e-06,0,0,0,0,1.95e-06,1.78e-06,0,0,2.05e-06,0,0,0,0,0,0,3.74e-06,1.92e-06,3.03e-06,0,0,1.7e-06,0,2.28e-06,0,0,0,1.43e-06,0,0,0,0,0,0,0,8.94e-06,2.26e-06,4.37e-06,0,0,0,1.48e-06,0,0,0,2.05e-06,0,0,0,2.96e-06,2.34e-06,2.04e-06,1.78e-06,0,1.69e-06,1.43e-06,2.25e-06,2.18e-06,0,1.72e-06,1.49e-06,1.32e-06,1.37e-06,1.84e-06,1.57e-06,1.46e-06,1.95e-06,2.4e-06,2.28e-06,2.41e-06,2.29e-06,2.1e-06,1.63e-06,1.38e-06,4.59e-06],"winrateAvg":0.0145599,"leadAvg":-7.30201,"scoreMeanAvg":-8.37146,"scoreStdevAvg":8.72353,"shorttermWinlossErrorAvg":0.0519137,"shorttermScoreErrorAvg":1.68414,"ownership":[-90,-90,-46,-8,31,22,8,-15,-39,-56,-64,-64,-37,4,37,86,94,96,96,-90,-91,-92,64,32,25,7,-18,-37,-58,-71,-73,-85,-21,96,97,95,96,96,-89,-91,-91,65,45,19,-2,-16,-47,-61,-47,-88,-36,-72,59,-18,98,97,96,-89,-85,-91,-9,92,35,28,-12,-89,-88,-47,-16,-40,16,-96,-3,32,83,96,-79,-85,89,88,66,65,98,36,-27,-17,10,10,10,11,-97,4,97,98,95,-78,88,84,48,20,62,98,-34,-11,28,-45,-97,-98,-98,-95,-98,-98,97,93,58,88,88,14,44,67,98,39,22,-43,-35,-50,-62,-69,-69,-90,-98,-98,92,42,87,-62,25,54,76,98,-44,-11,-80,-32,-40,-51,-65,-82,-80,-98,91,89,15,-12,-65,-3,96,96,86,14,55,-18,4,-34,-55,-63,-74,-98,88,87,88,1,-3,-24,-30,42,-92,88,87,30,27,-91,-32,-54,-60,-73,-98,-53,90,87,1,4,-20,-96,-96,-90,-98,86,87,-96,-90,-57,-63,-65,-69,-90,-98,-97,90,13,17,-8,-13,98,-31,-98,-5,-97,-94,-99,-68,-96,-47,-59,-98,-98,88,88,36,45,19,-40,99,18,-98,-93,-93,-96,-99,-1,-9,17,-35,-44,80,82,88,54,73,100,100,98,100,100,-96,-97,-97,100,60,99,23,-90,-92,-20,88,77,60,76,90,100,99,99,99,100,100,100,100,100,83,-7,-91,88,89,68,34,52,77,89,100,100,100,100,56,35,100,-60,32,99,99,99,-95,87,-87,-21,35,64,100,100,29,-96,2,73,-98,-98,-58,-98,99,-95,-95,-95,-94,-87,-90,12,4,-24,100,-97,-96,-99,-99,-98,-98,-99,-99,99,-11,-47,-76,-91,-94,-91,10,-3,-25,-72,-74,-91,-95,-98,-98,-96,-66,13,61,56,-7,-26,-84,-90,-91],"ownershipAllowedMAE":0.0355136})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..XO...........XO../..XO......X....XO../..XO...........XO../.XO.............XO./.XO................/..O................/.................../.................../.................../............O....../..........OX......./.......XXXXX.O..O../...X..OOXOOOO....X./...X....OOXXXOO.X../..XOO..O.XXOOX.OOX./..X.....XOX..X...../.................../","hintLoc":"null","initialTurnNumber":41,"metadata":"09B6D689B49F3C635D39CB73D057A176:51","moveLocs":["M8","R13","S13","R12","P14","R7","S6","S7","Q6","R10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.92,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.62e-05,1.85e-05,2.04e-05,2.1e-05,1.87e-05,1.83e-05,1.89e-05,1.96e-05,1.97e-05,1.97e-05,1.97e-05,1.92e-05,1.99e-05,1.98e-05,1.81e-05,1.99e-05,2.28e-05,1.89e-05,1.52e-05,1.97e-05,2.1e-05,0.00359,3.29e-05,3.36e-05,2.23e-05,3.07e-05,3.61e-05,5e-05,4.47e-05,4.7e-05,3.77e-05,4.15e-05,3.51e-05,2.47e-05,5e-05,9.82e-05,2.39e-05,1.71e-05,1.78e-05,2.08e-05,0,0,1.69e-05,2.61e-05,3.63e-05,0.000133,0.000579,6.76e-05,4.43e-05,9.12e-05,0.0564,0.000566,1.91e-05,0,0,1.63e-05,1.63e-05,1.99e-05,2.29e-05,0,0,1.59e-05,2.43e-05,3.52e-05,0.000151,0.000906,0.000188,0,0.00194,0.00398,0.0168,2.07e-05,0,0,1.66e-05,1.83e-05,1.83e-05,2.64e-05,0,0,1.65e-05,2.58e-05,3.55e-05,7.68e-05,0.000264,0.00027,0.000853,0.000525,0.000431,7.41e-05,2.56e-05,0,0,1.59e-05,1.71e-05,1.75e-05,0,0,1.68e-05,2.32e-05,2.84e-05,4.01e-05,0.000111,0.000264,0.000634,0.000754,0.0113,0.000773,3.47e-05,0,0.000574,0,0,1.43e-05,1.77e-05,0,0,1.57e-05,2.48e-05,3.36e-05,4.95e-05,0.000179,0.000357,0.000558,0.000844,0.00233,0.000503,0.000124,3.29e-05,1.63e-05,0,0,1.52e-05,1.84e-05,6.46e-05,0,1.85e-05,2.86e-05,3.83e-05,9.14e-05,0.000264,0.000482,0.000558,0.000579,0.000812,0.000477,0.000298,0.00115,2.4e-05,0,0.00339,1.75e-05,1.86e-05,2.63e-05,2.43e-05,2.86e-05,3.48e-05,4.96e-05,0.000156,0.000311,0.000509,0.000505,0.000597,0.000403,0.000364,0.000634,0.000101,0.0438,2.55e-05,2.95e-05,1.77e-05,1.92e-05,2.89e-05,4.24e-05,4.48e-05,4.82e-05,0.000107,0.000194,0.00035,0.00131,0.000345,0.000178,8.82e-05,5.88e-05,7.26e-05,6.47e-05,0.00019,0,2.95e-05,1.93e-05,1.93e-05,3.23e-05,0.000121,0.000154,0.000114,0.00018,0.000204,0.0176,0.159,0.000746,5.08e-05,2.17e-05,2.08e-05,3e-05,0.000107,0.000441,0.000141,5.75e-05,2.07e-05,1.94e-05,3.49e-05,0.00974,0.000285,0.000201,0.00019,0.000162,0.000341,0.000733,4.56e-05,3.05e-05,0,0,2.28e-05,2.94e-05,0.00127,3.09e-05,2.68e-05,2.53e-05,1.88e-05,5.24e-05,0.0923,0.00031,0.0153,0.276,7.5e-05,2.02e-05,1.86e-05,2.15e-05,0,0,1.92e-05,1.89e-05,1.95e-05,5.25e-05,0,0,0.156,1.87e-05,3.96e-05,0.00213,0.000152,0.000173,5.8e-05,0.000461,0,0,0,0,0,1.58e-05,0,1.66e-05,0,0,0,0.0948,1.81e-05,0.000179,2.58e-05,0,2.37e-05,2.44e-05,0,0,0,0,0,0,0,1.48e-05,1.58e-05,1.53e-05,1.99e-05,0,0.000635,1.65e-05,2.72e-05,2.23e-05,0,2.33e-05,2.1e-05,1.65e-05,1.51e-05,0,0,0,0,0,0,0,1.71e-05,0,1.76e-05,2.09e-05,1.66e-05,2e-05,0,0,0,1.93e-05,1.91e-05,0,2.81e-05,0,0,0,0,0,1.86e-05,0,0,0,1.71e-05,1.74e-05,1.79e-05,0,2.07e-05,1.87e-05,2.03e-05,1.92e-05,2e-05,0,0,0,1.8e-05,2.09e-05,0,1.96e-05,1.99e-05,2.14e-05,3.32e-05,1.76e-05,1.57e-05,1.59e-05,1.75e-05,1.87e-05,1.9e-05,1.83e-05,1.8e-05,1.85e-05,2.07e-05,1.79e-05,1.94e-05,2e-05,2.12e-05,2.06e-05,1.89e-05,1.93e-05,1.82e-05,1.87e-05,1.49e-05,1.38e-05],"winrateAvg":0.157794,"leadAvg":-3.79959,"scoreMeanAvg":-5.65647,"scoreStdevAvg":13.0427,"shorttermWinlossErrorAvg":0.0769578,"shorttermScoreErrorAvg":0.827425,"ownership":[-51,-27,-15,16,27,29,20,9,-3,-14,-23,-28,-30,-33,-28,-15,18,32,54,-63,-64,-11,11,45,24,19,7,-3,-17,-25,-29,-30,-28,-51,-18,16,67,69,-70,-63,-81,84,43,23,12,4,-6,-22,-36,-36,-14,-25,-45,-82,82,72,74,-72,-73,-82,84,40,20,13,1,-6,-17,-74,-22,-19,-11,-34,-83,82,77,77,-71,-72,-82,84,32,18,11,6,1,-2,-8,-6,-14,-19,-14,-84,81,75,74,-60,-76,84,58,18,16,10,7,5,3,-1,5,2,-4,35,-38,-86,77,61,-28,-75,84,38,17,11,8,6,6,6,6,8,4,-6,-7,-35,-86,75,18,-6,-9,84,27,13,7,5,3,4,5,7,9,7,3,-1,-27,-87,-9,-7,9,13,27,14,6,2,-1,-3,1,4,7,10,8,-4,-5,2,-41,-38,-28,18,18,18,10,2,-3,-8,-10,-11,0,5,11,9,3,-8,-18,-80,-49,-36,21,20,16,8,1,-5,-12,-20,-27,-4,-4,24,25,4,-6,-13,-34,-37,-26,21,20,19,6,2,-1,-8,-18,-12,-2,30,82,83,20,-3,-1,-23,-26,-11,12,13,20,-10,4,26,-5,-23,-24,-12,33,-59,20,28,13,20,-57,-56,30,-2,-4,-11,-22,6,19,0,-64,-65,-64,-64,-63,33,96,52,87,87,87,37,-27,-21,-28,-84,-16,17,90,90,-65,97,97,97,97,93,74,53,45,-26,10,-51,-61,-71,-84,-17,-5,29,85,97,97,-97,-97,-97,96,96,44,-25,-24,-12,-67,-72,-84,53,54,21,39,96,34,-97,-97,-94,-94,-95,41,92,92,-28,-13,-72,-75,-84,-9,19,23,16,20,-91,-87,-97,-96,-94,-95,14,64,5,-3,-15,-73,-74,-59,-32,1,10,10,-7,-55,-90,-94,-93,-87,-54,-4,23,-3,-6,-7],"ownershipAllowedMAE":0.0274281,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".X...X............./.OXXX.XXO.O..XX..../.OOOOX.OOO.O.OO.X../.X.OXX.OXOO....OX../X.XO....XX.XXOOXX../O.XO.XXX.X.XOXX.XX./...OOOOOXOOXOOXXXO./.X.OXX.OO.OOXOOOOX./..X.X..OXO.OXO.OXX./.XX...O.XXOOX..OOO./..OX.XOX.XXXXOOO.../..OX.XXXOOXOXOXXOO./.OXO.OOOOXO.OX.XO../.OXO.XXOXX.OOX.XXX./..XO.OOXOO.O.XX..../..OO.OXXXOO...X.X../......OX.XO......../......OXXXXOX....../...........O......./","hintLoc":"null","initialTurnNumber":207,"metadata":"59548203B954F4702C27B19E3A49DE84:217","moveLocs":["L15","L14","J14","H15","J13","N18","N17","Q17","M18","N3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.87,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":8.0,"policyOptimism":0.154,"pda":-1.235,"policyMixture":[4e-06,0,8.64e-05,6.44e-06,3.61e-06,0,3.15e-06,0.000246,5.14e-06,3.8e-06,3.72e-06,3.83e-06,3.88e-06,3.64e-06,3.63e-06,3.48e-06,3.36e-06,3.35e-06,3.21e-06,3.98e-06,0,0,0,0,0,0,0,0,2.85e-06,0,0,0,0,0,8.41e-06,4.12e-06,3.35e-06,3.43e-06,7.82e-06,0,0,0,0,0,2.08e-05,0,0,0,2.42e-06,0,0,0,0,0,0,3.35e-06,3.31e-06,0.000101,0,0.000909,0,0,0,0.000442,0,0,0,0,3.78e-06,3.88e-06,3.76e-06,3.73e-06,0,0,3.38e-06,3.45e-06,0,6.9e-05,0,0,0.00759,0.00031,5e-06,0,0,0,0,0,0,0,0,0,0,3.36e-06,3.41e-06,0,0.000109,0,0,7.74e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,3.6e-06,4.6e-06,0.00153,0.0423,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.38e-06,5.55e-05,0,0.000305,0,0,0,3.82e-06,0,0,2.34e-06,0,0,0,0,0,0,0,0,7.33e-06,5.55e-06,1.12e-05,0,0.0042,0,3.94e-06,3.75e-06,0,0,0,2.13e-06,0,0,0,2.72e-06,0,0,0,6.14e-05,3.96e-06,0,0,6.68e-05,4.98e-05,0.0022,0,2e-05,0,0,0,0,0,3.94e-06,3.79e-06,0,0,0,3.53e-06,8.02e-06,7.96e-06,0,0,6.68e-05,0,0,0,3.04e-06,0,0,0,0,0,0,0,3.21e-06,3.46e-06,3.2e-06,5.71e-06,5.47e-06,0,0,0.00348,0,0,0,0,0,0,0,0,0,0,0,0,0,3.59e-06,3.45e-06,0,0,0,4.65e-06,0,0,0,0,0,0,3.76e-06,0,0,3.34e-06,0,0,3.56e-06,1.3e-05,3.31e-06,0,0,0,3.45e-06,0,0,0,0,0,3.45e-06,0,0,0,3.38e-06,0,0,0,1.32e-05,3.73e-06,3.74e-06,0,0,3.4e-06,0,0,0,0,0,3.8e-06,0,3.54e-06,0,0,3.31e-06,3.22e-06,3.44e-06,4.12e-06,3.49e-06,3.81e-06,0,0,3.71e-06,0,0,0,0,0,0,3.56e-06,9.61e-06,3.57e-06,0,3.37e-06,0,3.28e-06,3.34e-06,3.24e-06,3.34e-06,3.23e-06,3.32e-06,3.36e-06,4.01e-06,0,0,0,0,0,0.935,0,7.08e-06,3.22e-06,3.33e-06,3.45e-06,3.44e-06,3.36e-06,3.49e-06,3.53e-06,3.22e-06,3.06e-06,3.62e-06,3.57e-06,0,0,0,0,0,0,0,3.17e-06,3.65e-06,3.47e-06,3.58e-06,3.6e-06,3.52e-06,2.99e-06,3.38e-06,3.09e-06,3.09e-06,3.17e-06,3.43e-06,8.36e-06,5.52e-05,3.41e-06,3.53e-06,3.2e-05,0,3.42e-05,3.44e-06,3.34e-06,3.27e-06,3.3e-06,3.48e-06,3.17e-06,8.33e-06],"winrateAvg":0.81607,"leadAvg":0.998592,"scoreMeanAvg":0.983074,"scoreStdevAvg":2.76072,"shorttermWinlossErrorAvg":0.331856,"shorttermScoreErrorAvg":1.10175,"ownership":[17,-99,-98,-99,-100,-100,-95,19,35,99,91,5,-24,-44,-93,-99,-100,-100,-100,85,100,-100,-100,-100,-100,-100,-100,100,100,100,100,-99,-100,-100,-100,-100,-100,-100,85,100,100,100,100,-100,-24,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-1,-97,37,100,-100,-100,9,100,-100,100,100,35,8,92,-31,-23,-100,-100,-100,-97,-96,-99,100,9,-90,-59,-100,-100,-100,100,-100,-100,98,98,-100,-100,-100,-100,-97,-98,-99,100,44,-100,-100,-100,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-99,-98,73,100,100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-99,-99,-99,-100,-9,100,-99,-99,48,100,100,100,100,100,-100,100,100,100,100,-99,-87,-98,-99,-100,48,-99,-47,72,100,-100,100,100,100,-100,100,99,100,-99,-99,77,-80,-100,-100,-91,-88,40,99,-3,-100,-100,100,100,-100,-63,96,100,100,100,93,-41,-57,73,-99,-93,-100,99,-100,-61,-100,-100,-100,-100,100,100,100,100,100,98,41,36,89,-99,-9,-100,-100,-100,100,100,-100,-17,-100,100,-100,-100,100,100,76,62,99,90,100,20,100,100,100,100,99,99,-22,100,-100,-100,-100,100,17,-31,95,99,97,100,99,99,99,100,100,100,99,100,100,-100,-100,-100,-100,-100,-97,98,99,98,100,99,100,100,-99,100,100,100,100,-15,-100,-100,-99,-99,-99,-99,99,99,100,100,98,100,-99,-99,-99,100,100,75,46,-64,-100,-97,-100,-99,-99,98,98,98,97,96,98,98,-99,-99,-99,100,99,-95,-85,-90,-93,-96,-98,-98,97,96,95,93,91,86,97,-99,-99,-99,-99,99,-93,-70,-82,-87,-92,-95,-96,96,95,93,90,82,65,49,-94,-98,-95,32,99,-5,-36,-53,-78,-87,-92,-94],"ownershipAllowedMAE":0.0345967})%"); + lines.push_back(R"%({"sample":{"board":".O................/X.O.XO...OX..XO.O./OOXXXO.O...X.XO.../.XX..X...O.XO...O./..OX..X......O.OX./.OOX..X.XXXXXO.OX./.XOOO.XOOOO.OXXXX./.XXXO.OX....OOXOX./.....O.O......OOX./...XX.....X.X.OXX./..XXO.........OOX./.OOX......O.O.XOX./.........O.....XOX/.......OOX..OOOXO./..O.OO.OX.X.X.XOO./....X.XX....X.XO../...X.........XOO../................../","hintLoc":"null","initialTurnNumber":119,"metadata":"B0584BD0F4CB4E3E723539B2729466B8:129","moveLocs":["F18","D18","E18","G15","H13","L16","L15","A15","A14","B17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.03,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.56e-06,0,0,0,0,0,9.97e-06,9.28e-06,8.37e-06,8.79e-06,8.03e-06,8.53e-06,8.04e-06,8.36e-06,7.47e-05,9.98e-06,1.66e-05,6.78e-06,0,0,0,0.00108,0,0,3.73e-05,9.37e-06,7.5e-06,0,0,8.26e-06,8.81e-06,0,0,1.5e-05,0,1.96e-05,0,0,0,0,0,0,7.32e-06,0,8e-06,1.73e-05,0,0,8.29e-06,0,0,6.6e-05,4.73e-05,2.38e-05,0,0,0,7.06e-06,2.08e-05,0,0,1.01e-05,7.54e-06,0,0,0,0,4.62e-05,3.55e-05,0.00307,0,0.0102,0,0.46,0,0,0.000893,5.48e-05,0,7.66e-06,7.07e-06,7.49e-06,7.12e-06,7.34e-06,9.4e-06,0,2.39e-05,0,0,8.98e-06,0.000168,0,0,0,0.00108,2.71e-05,0,0,0,0,0,0,0,0,0.000218,0,0,7.57e-06,1.46e-05,0,0,0,0,0.00772,0,0,0,0,0,0.0712,0,0,0,0,0,7.14e-06,7.05e-06,0,0,0,0,1.43e-05,0,0,0.0461,1.05e-05,6.78e-05,9.43e-06,0,0,0,0,0,7.41e-06,7.91e-06,7.92e-06,7.38e-06,7.09e-06,1.27e-05,0,8.28e-06,0,5.2e-05,0.000963,1e-05,8.59e-06,8.18e-06,3.45e-05,0,0,0,7.23e-06,8.38e-06,9.42e-06,7.15e-06,0,0,0.0139,3.74e-05,0.000392,0.00122,1.06e-05,0,6.99e-06,0,1.13e-05,0,0,0,7.29e-06,8.98e-06,4.24e-05,0,0,0,0.000288,0.29,1.63e-05,1.01e-05,9.17e-06,8.32e-06,7.31e-06,7.86e-06,3.68e-05,0,0,0,7.01e-06,9.05e-06,0,0,0,1.43e-05,5.46e-05,0.00017,2.22e-05,1.03e-05,2.88e-05,0,9.38e-06,0,9.11e-06,0,0,0,8.03e-06,9.38e-06,8.75e-06,0.00138,0.000347,3.7e-05,0.000145,2.31e-05,1.16e-05,1.24e-05,0,7.32e-05,1.1e-05,7.88e-06,7.22e-06,1.67e-05,0,0,0,9.53e-06,7.52e-05,8.52e-05,0.00275,1.31e-05,1.34e-05,1.03e-05,0,0,0,8.63e-06,1.37e-05,0,0,0,0,0,7.91e-06,9.18e-06,5.2e-05,0,3.33e-05,0,0,0.000113,0,0,8.97e-06,0,8.08e-06,0,7.92e-06,0,0,0,7.72e-06,9.43e-06,0.0344,0.0493,0.000322,0,6.55e-05,0,0,7.51e-06,8.21e-06,8.04e-06,7.24e-06,0,7.1e-06,0,0,7.12e-06,7.01e-06,8.95e-06,7.62e-05,8.21e-05,0,9.78e-06,1.13e-05,8.56e-06,8.13e-06,8.33e-06,8.05e-06,8e-06,7.57e-06,6.96e-06,0,0,0,7.13e-06,6.93e-06,7.17e-06,9.4e-06,9.43e-06,7.94e-06,7.64e-06,7.39e-06,7.85e-06,7.9e-06,8.02e-06,7.66e-06,7.64e-06,7.78e-06,7.88e-06,7.96e-06,8.6e-06,7.92e-06,6.88e-06,6.84e-06,7.88e-06],"winrateAvg":0.526248,"leadAvg":0.154236,"scoreMeanAvg":0.39621,"scoreStdevAvg":10.4367,"shorttermWinlossErrorAvg":0.259452,"shorttermScoreErrorAvg":1.7866,"ownership":[72,68,64,61,-94,-94,-78,-69,-65,-67,-72,-70,-62,15,38,89,91,91,74,69,70,43,-95,-61,-66,-66,-63,-59,-87,-72,-71,-87,93,91,93,89,71,70,-93,-94,-94,-63,-68,-59,-63,-69,-68,-98,-19,-86,93,90,89,62,71,-91,-92,-87,-88,-93,-65,-77,-71,-63,-98,-98,63,16,68,84,90,-35,-48,-40,93,-86,-55,-34,-98,-86,-84,-83,-90,-52,-5,89,76,88,-97,-49,40,93,93,-78,25,-19,-98,-98,-99,-99,-99,-99,-98,88,-55,87,-97,-93,-25,-90,93,93,94,-21,-98,89,90,89,89,-66,87,-97,-97,-97,-96,-96,-69,-90,-90,-90,93,63,91,79,80,72,71,78,89,89,-97,95,-96,-96,-68,-76,-78,-46,14,93,61,92,78,68,70,71,77,82,97,97,-96,-96,-44,-60,-79,-91,-91,8,14,43,60,66,54,68,62,75,97,-96,-96,-96,-11,-30,-92,-92,-4,-25,-30,34,51,67,75,78,81,78,97,97,-96,-94,16,62,61,-92,-42,-10,2,16,44,65,96,84,99,90,89,98,-97,-80,42,47,2,-27,-10,2,7,30,61,93,46,64,78,92,98,97,100,-81,46,51,36,7,19,29,42,88,89,-86,13,13,99,100,100,97,100,53,39,49,86,57,85,86,2,90,-88,-85,-92,-16,-92,65,-60,100,100,96,21,6,11,42,-83,50,-91,-91,-81,-86,-86,-85,-92,-61,-64,100,99,99,4,-16,-11,-83,-79,-82,-86,-88,-85,-86,-85,-83,-82,-87,100,100,99,99,-11,-26,-42,-49,-67,-75,-81,-85,-86,-86,-85,-82,-78,7,38,96,98,98],"ownershipAllowedMAE":0.0428881})%"); + lines.push_back(R"%({"sample":{"board":".................../....XOO.........OO./...X.XOOXO...OOO.XO/..XO.X.XO...O..O.X./..X....XO.O.XOOXX.X/........XOXX.XX.XX./........XOXOXXOXXXX/........XO.OOOOOXO./........XO.....OO.O/.XXXO...X........O./.XOOX..XOOO......../.O.X....XXO......../.XXO...XXO........./.OOOX..XOO........./XXXX.XXO.........OO/.OXOXX.OOX...O.OOXX/X.OOX.XXO......OX.X/.O.OXOOO......OXXX./..XOX..........O.../","hintLoc":"null","initialTurnNumber":151,"metadata":"28CED2FAA754B7D8E9841F0293FBE35C:161","moveLocs":["H10","G10","H11","J18","K18","R1","P1","J2","K2","G16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.25,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":6.0,"policyOptimism":0.0,"pda":-1.702,"policyMixture":[1.07e-05,1.12e-05,1.26e-05,1.91e-05,0.000317,0.0359,5.87e-05,0.000342,0.0351,1.56e-05,1.21e-05,1.18e-05,1.18e-05,1.2e-05,1.22e-05,1.23e-05,1.19e-05,1.25e-05,1.16e-05,1.14e-05,1.12e-05,1.24e-05,6.16e-05,0,0,0,9.12e-05,0,0,1.19e-05,1.25e-05,1.24e-05,1.21e-05,1.21e-05,1.25e-05,0,0,1.71e-05,1.12e-05,1.1e-05,1.5e-05,0,0.000114,0,0,0,0,0,1.22e-05,1.26e-05,1.25e-05,0,0,0,1.3e-05,0,0,1.08e-05,1.15e-05,0,0,2.31e-05,0,0,0,0,1.15e-05,1.23e-05,1.19e-05,0,1.26e-05,1.21e-05,0,1.36e-05,0,1e-05,1.08e-05,1.1e-05,0,1.15e-05,1.17e-05,1.26e-05,1.35e-05,0,0,1.27e-05,0,0.0212,0,0,0,0,0,0,0,1.06e-05,1.11e-05,1.15e-05,1.2e-05,1.29e-05,1.34e-05,2.05e-05,0.000509,0,0,0,0,0,0,0,0,0,0,0,1.07e-05,1.13e-05,1.15e-05,1.23e-05,1.34e-05,1.5e-05,6.95e-05,6.89e-05,0,0,0,0,0,0,0,0,0,0,0,1.1e-05,1.14e-05,1.18e-05,1.26e-05,1.38e-05,1.48e-05,0.000211,0.000284,0,0,0.00812,0,0,0,0,0,0,0,2.81e-05,1.11e-05,1.13e-05,1.17e-05,1.3e-05,1.45e-05,1.56e-05,0.000244,0,0,0,1.23e-05,1.31e-05,1.18e-05,1.17e-05,1.15e-05,0,0,1.32e-05,0,1.19e-05,0,0,0,0,1.75e-05,0,0,0,0.00021,1.36e-05,1.27e-05,1.21e-05,1.18e-05,1.16e-05,1.17e-05,1.27e-05,0,1.33e-05,1.39e-05,0,0,0,0,0.00118,0.224,0,0,0,0,1.16e-05,1.19e-05,1.17e-05,1.15e-05,1.19e-05,1.16e-05,1.23e-05,1.24e-05,2.46e-05,0,0.000114,0,0.0115,1.76e-05,0.000277,4.96e-05,0,0,0,1.18e-05,1.2e-05,1.17e-05,1.17e-05,1.18e-05,1.21e-05,1.28e-05,1.24e-05,0.000219,0,0,0,0.000883,0.000112,5.3e-05,0,0,0,1.24e-05,1.24e-05,1.2e-05,1.18e-05,1.19e-05,1.18e-05,1.27e-05,1.24e-05,1.3e-05,0.00212,0,0,0,0,3.44e-05,0.162,0,0,0,1.23e-05,1.25e-05,1.22e-05,1.2e-05,1.2e-05,1.18e-05,1.35e-05,1.34e-05,1.3e-05,0,0,0,0,0,0,0,0,1.28e-05,1.32e-05,1.28e-05,1.24e-05,1.22e-05,1.22e-05,1.3e-05,1.34e-05,1.28e-05,0,0,5.48e-05,0,0,0,0,0,0.0368,0,0,0,1.23e-05,1.24e-05,1.27e-05,0,1.32e-05,0,0,0,0,0,0.119,0,0,0,0.0248,0,0,0,1.08e-05,1.2e-05,1.26e-05,1.28e-05,1.32e-05,1.23e-05,0,0,0,0,0.277,0,1.64e-05,0,0,0,0,0,0,0,1.23e-05,1.26e-05,1.28e-05,1.31e-05,0,0,0,0,0.000334,1.18e-05,0.000238,0,0,0,0.0337,1.28e-05,1.29e-05,1.24e-05,1.28e-05,1.22e-05,1.24e-05,1.3e-05,1.29e-05,0,0,0,1.1e-05,1.02e-05,2.98e-05],"winrateAvg":0.686286,"leadAvg":-0.290791,"scoreMeanAvg":1.50343,"scoreStdevAvg":7.47381,"shorttermWinlossErrorAvg":0.359734,"shorttermScoreErrorAvg":2.48468,"ownership":[-98,-97,-97,-96,-68,-13,39,80,93,95,97,98,98,98,99,99,99,98,98,-98,-97,-97,-97,-99,88,88,89,88,100,97,98,98,99,99,99,100,100,98,-98,-98,-98,-100,-98,-100,89,90,89,100,97,98,98,100,100,100,40,-100,97,-98,-98,-100,-96,-97,-100,-100,-100,99,97,97,98,100,99,99,100,-40,-100,-85,-98,-98,-100,-97,-97,-97,-98,-100,99,98,100,80,-91,100,100,-100,-100,-100,-100,-98,-98,-98,-97,-97,-97,-96,-97,-99,100,-90,-91,-91,-97,-98,-98,-100,-100,-100,-98,-98,-97,-97,-96,-96,-96,-96,-99,100,-89,100,-96,-96,100,-100,-100,-100,-100,-98,-98,-97,-97,-96,-96,-95,-95,-99,100,77,100,100,100,100,100,-100,82,-65,-98,-98,-97,-97,-95,-95,-96,-94,-99,100,94,97,97,97,98,100,100,82,94,-98,-100,-100,-100,-93,-95,-97,-94,-99,-47,92,97,97,97,96,96,95,98,94,-97,-100,-97,-96,-98,-94,-93,-97,100,100,100,97,97,97,96,95,94,94,95,-96,-96,-97,-98,-92,-94,-94,-96,-98,-98,100,97,97,96,96,95,94,94,95,-95,-99,-99,-92,-94,-94,-94,-98,-98,100,97,97,97,96,96,95,94,95,95,-93,-92,-92,-92,-99,-95,-93,-98,100,100,97,97,96,96,95,95,95,95,94,-99,-99,-99,-99,-97,-99,-98,100,98,97,97,97,96,96,95,94,92,96,96,-97,-92,-99,-89,-99,-98,32,100,100,95,97,97,96,99,97,99,99,-99,-99,-96,-91,-90,-89,-99,3,-54,-53,100,96,97,96,96,96,96,99,-99,-99,-99,-91,-90,-90,-90,-98,98,98,99,98,100,97,97,96,95,97,-99,-99,-99,-99,-90,-90,-91,-89,-98,20,65,87,98,98,97,97,96,95,97,97,-99,-99,-99],"ownershipAllowedMAE":0.0273115})%"); + lines.push_back(R"%({"sample":{"board":".....X.XOOX...../..X..OXO.OX.OXO./..XOO.XXOOXXXO../.X.X...OXXX.OOO./OX.X.X.XO.XXXXXO/.OX..XOX.OOXOOO./.OX..OO.X.OO.O../.O..X...XO.XO.../..OX...OOXO.X.../O.OXOOOOXXXO..X./XOOO.OXXXXO.OO.O/XXX......XOOXOO./.OXXXX..XXXOXXXX/O.OOOX.XOOOOX.O./.O.OX.XXXO.OXXOO/.....X..O...O.X./","hintLoc":"null","initialTurnNumber":162,"metadata":"E918BD4909D17D7D437EDB51E6A643DB:172","moveLocs":["E10","E8","M8","L9","D9","F9","Q3","M1","O1","G12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.84,"xSize":16,"ySize":16},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.22e-05,6.07e-05,6.21e-05,6.41e-05,6.37e-05,0,7.15e-05,0,0,0,0,6.69e-05,0.000175,6.57e-05,6.78e-05,5.96e-05,6.29e-05,6.04e-05,0,6.42e-05,6.69e-05,0,0,0,0.000152,0,0,8.64e-05,0,0,0,5.95e-05,6.11e-05,6.04e-05,0,0,0,7.17e-05,0,0,0,0,0,0,0,0,6.01e-05,8.68e-05,6.8e-05,0,6.16e-05,0,6.81e-05,0.000113,0.846,0,0,0,0,6.06e-05,0,0,0,0.0101,0,0,5.94e-05,0,6.25e-05,0,0,0,0,6.34e-05,0,0,0,0,0,0,5.2e-05,0,0,6.12e-05,5.99e-05,0,0,0,0.000317,0,0,0,0,0,0,0.00196,5.86e-05,0,0,5.83e-05,0,0,0,6.42e-05,0,6.24e-05,0,0,0,0,6.49e-05,0.000259,6.19e-05,0,6.35e-05,0,0,0,6.83e-05,7.41e-05,0,0,0,0,0,0.00659,0.000379,6.71e-05,0.000159,6.01e-05,0,0,0,6.11e-05,6.1e-05,0,0,0,0,0,0,0.000513,0.000422,6.86e-05,0,8.21e-05,0,0,0,0,0,0,0,0,0,0,0.0994,0.00282,0,0.000167,0,0,0,0,0.000161,0,0,0,0,0,0,0,0,0,0.000458,0,0,0,0,6.26e-05,0.00221,5.79e-05,6.28e-05,6.28e-05,5.48e-05,0,0,0,0,0,0,0.0176,0.00198,0,0,0,0,0,6.22e-05,6.35e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.09e-05,0,0,0,0,0,0,4.6e-05,0,0,6.38e-05,0,5.83e-05,0,0,6.33e-05,0,0,0,0,6.56e-05,0,0,0,0,0,6.67e-05,0.000206,0.00287,0.00021,6.77e-05,0,6.21e-05,9.81e-05,0,0.000193,0.000129,0,0,0,0,4.84e-05,5.4e-05],"winrateAvg":0.856208,"leadAvg":0.411127,"scoreMeanAvg":0.703017,"scoreStdevAvg":3.88588,"shorttermWinlossErrorAvg":0.261562,"shorttermScoreErrorAvg":1.16638,"ownership":[-99,-99,-99,-98,-97,-98,-98,-98,-98,-98,-99,-44,-15,98,99,99,-99,-99,-100,-98,-98,-97,-99,-98,-98,-98,-99,-69,96,97,99,99,-99,-99,-100,-97,-96,-98,-99,-100,-98,-98,-99,-99,-99,100,99,99,-63,-100,-100,-100,-98,-98,-99,-98,-100,-99,-99,-7,100,100,100,98,61,-100,-100,-100,-98,-99,99,-98,87,57,-99,-99,-99,-99,-99,99,59,99,-100,-99,-98,-99,99,-98,-62,100,100,-99,100,100,100,99,92,99,-100,-99,-99,100,99,-29,-97,7,100,100,99,100,99,98,98,99,-10,-99,-99,100,96,-56,-97,100,100,98,100,98,98,98,98,99,100,-99,100,99,98,100,100,-100,100,98,97,98,98,98,98,98,100,-99,100,100,100,100,-99,-100,-100,99,98,98,96,98,-100,100,100,100,97,100,-99,-99,-99,-99,99,99,99,99,98,98,-100,-100,-100,-14,-68,35,-97,-99,-99,-99,99,99,-99,99,99,-58,-17,94,-100,-100,-100,-100,-99,-99,-99,-99,-99,99,-99,-99,-99,-99,99,94,99,99,99,-100,-99,-100,99,99,99,99,-99,-1,97,-99,98,99,99,99,-94,-94,-100,-100,-100,99,96,99,-99,-100,97,97,99,98,98,92,-5,-97,-94,-80,43,39,91,99,99,-100,-100,2],"ownershipAllowedMAE":0.0246029})%"); + lines.push_back(R"%({"sample":{"board":".............../...........XO../....X......XO../...X.......XO../...........X.../............O../..XOX........O./.OOXX........../.XOOO.......X../X.X............/.XOO......X.X../.OXO.......O.../.OXO.....X..O../...........X.../.............../","hintLoc":"null","initialTurnNumber":41,"metadata":"790BE53CCAA670F018ADDF517E4297E9:51","moveLocs":["L9","M5","K2","L3","J3","D10","J4","J11","B9","B10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.0,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.13e-06,7.44e-06,6.54e-06,7.13e-06,6.64e-06,6.59e-06,6.03e-06,6.27e-06,6.31e-06,8.17e-06,7.94e-06,0.000132,1.14e-05,6.15e-06,5.55e-06,7.53e-06,1.02e-05,8.55e-05,0.000246,0.00183,9.65e-06,1.03e-05,8.42e-06,1.14e-05,9.88e-06,8.33e-06,0,0,5.84e-06,5.85e-06,7.01e-06,2.04e-05,0.00876,7.97e-05,0,0.00014,9.27e-06,1.26e-05,1.6e-05,1.53e-05,6.89e-06,0,0,5.57e-06,5.58e-06,8.98e-06,1.21e-05,1.83e-05,0,1.61e-05,1.01e-05,8.75e-06,1.02e-05,1.66e-05,1.41e-05,7.42e-06,0,0,5.63e-06,6.31e-06,1.02e-05,0.00452,0.0921,1.14e-05,0.000654,1.14e-05,1.09e-05,5.06e-05,0,0.0491,3.03e-05,0,7.1e-06,6.43e-06,5.79e-06,0.000121,0,8.58e-06,0,9.25e-06,0.000279,0.00102,0.279,0.000649,0.000165,0.00106,9.89e-06,0,5.68e-06,5.77e-06,8.33e-06,0,0,0,0,9.5e-06,0.0844,0.00904,9.71e-05,1.09e-05,0,6.71e-06,6.66e-06,0,6.64e-06,6.51e-06,0,0,0,0,0.0245,0.235,0.000268,2.22e-05,1.06e-05,7.92e-06,8.32e-06,2.56e-05,2.6e-05,2.31e-05,5.93e-06,0,0,0,0,2.11e-05,8.5e-05,4.71e-05,2.1e-05,1.31e-05,1.07e-05,9.81e-06,0,7.49e-05,3.2e-05,0,0,0,5.49e-06,5.59e-06,8.07e-06,1.17e-05,2.19e-05,4.48e-05,1.22e-05,6.92e-06,7.25e-06,9.32e-06,0.0695,4.24e-05,6.3e-06,0,0,0,6.05e-06,6.96e-06,8.76e-06,1.12e-05,1.74e-05,0.0302,0,0,0,0.00127,1.68e-05,6.06e-06,0,0,0,5.8e-06,6.6e-06,7.54e-06,6.7e-06,0,1.61e-05,0.000686,0,9.09e-06,0.000234,8.63e-06,6e-06,0,0,0,5.82e-06,6.35e-06,6.91e-06,6.6e-06,0,0,0,5.91e-06,0,7.94e-06,6.87e-06,6.02e-06,5.5e-06,5.51e-06,5.92e-06,5.71e-06,6.31e-06,6.76e-06,3.4e-05,2.15e-05,0,0.0959,0,0.00709,1.22e-05,6.98e-06,5.5e-06,5.45e-06,6e-06,6.22e-06,5.92e-06,5.91e-06,5.81e-06,6.5e-06,8.23e-06,7.67e-06,7.96e-06,7.04e-06,7.66e-06,8.1e-06,5.32e-06,7.64e-06],"winrateAvg":0.585073,"leadAvg":0.288409,"scoreMeanAvg":0.646547,"scoreStdevAvg":7.81164,"shorttermWinlossErrorAvg":0.134638,"shorttermScoreErrorAvg":0.627318,"ownership":[-79,-80,-81,-82,-82,-79,-77,-76,-75,-72,-70,10,14,58,63,-78,-79,-82,-87,-85,-81,-77,-78,-77,-78,-72,-93,91,61,75,-78,-78,-79,-86,-96,-68,-71,-76,-76,-71,-72,-93,90,86,79,-74,-78,-83,-96,-59,-47,-59,-72,-73,-60,-50,-93,90,87,83,-73,-70,-68,-76,-44,-27,-35,-61,-90,-8,-15,-93,-16,84,78,14,-88,-86,-96,-44,-5,-2,14,-5,2,28,13,93,80,73,49,97,-89,-85,-91,-21,15,19,10,22,81,31,23,88,45,88,97,98,-92,-91,-8,35,14,6,3,15,-2,-1,-11,23,88,87,98,98,98,20,21,5,-3,-4,-6,-18,-85,-40,-16,86,89,89,94,54,35,24,12,-4,-14,-29,-42,-63,-52,-42,89,87,99,99,58,43,34,31,18,10,-97,-97,-96,-74,-55,90,93,88,99,66,53,53,50,88,3,-79,-67,-80,-67,-63,91,93,87,99,73,68,65,69,88,-92,-93,-83,-58,-65,-65,90,93,87,89,82,72,72,75,58,58,4,-92,-64,-64,-65,90,90,89,87,81,75,71,66,53,12,-40,-56,-65,-64,-63],"ownershipAllowedMAE":0.0294195})%"); + lines.push_back(R"%({"sample":{"board":"...........XXOX.O./...........XOO.OOX/...X......X.XOOOX./............XOXX../...X.........XO.X./.............XO.X./............XOOOX./.............X..O./...............O../................../................../................../................../................../...O..........O.../................../................../................../","hintLoc":"null","initialTurnNumber":39,"metadata":"E4EF9349976DB7EC6B5173E686DF40BA:49","moveLocs":["N11","M12","S12","S13","S11","S16","R15","Q14","S15","S14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.81,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.86e-06,5.47e-06,6.3e-06,6.75e-06,6.68e-06,5.79e-06,5.59e-06,5.65e-06,5.57e-06,5.51e-06,6.44e-06,0,0,0,0,3.46e-06,0,6.93e-06,5.33e-06,9.24e-06,1.7e-05,0.0174,3.42e-05,1.65e-05,8.79e-06,8.86e-06,9.44e-06,8.47e-06,7.6e-06,0,0,0,3.38e-06,0,0,0,5.51e-06,1.14e-05,0.000206,0,0.000268,2.75e-05,2.03e-05,1.95e-05,1.7e-05,1.65e-05,0,1.22e-05,0,0,0,0,0,0,5.52e-06,1.09e-05,0.000272,0.000108,0.000243,2.3e-05,1.92e-05,1.7e-05,2.22e-05,8.71e-05,4.69e-05,1.76e-05,0,0,0,0,0.156,0.18,5.52e-06,1.73e-05,6.97e-05,0,6.84e-05,3.07e-05,4.44e-05,2.19e-05,1.29e-05,0.0001,9.24e-06,2.74e-05,0.00061,0,0,0,0,0,5.32e-06,1.21e-05,5.66e-05,0.000284,0.00038,0.000103,0.000109,6.11e-05,2.34e-05,1.23e-05,2.93e-05,7.15e-06,1.42e-05,0,0,0.0155,0,0,5.24e-06,1.25e-05,0.000121,9.66e-05,0.000152,0.000142,0.000135,0.000117,0.00011,8.42e-05,1.25e-05,0,0,0,0,0,0,0,5.2e-06,1.05e-05,6.97e-05,8.63e-05,0.000125,0.000106,0.000117,0.000121,0.000145,0.000119,1.05e-05,0.606,0,0,8.23e-06,5.47e-06,0,0,5.23e-06,1.03e-05,5.01e-05,6.84e-05,5.87e-05,7.13e-05,7.73e-05,8.07e-05,9.41e-05,7.46e-05,2.56e-05,0.000489,0.0012,0.0126,1.4e-05,0,4.86e-06,5.14e-06,5.27e-06,1.02e-05,3.98e-05,5.07e-05,2.85e-05,3.47e-05,4.37e-05,5.11e-05,5.34e-05,5.04e-05,8.2e-05,0.000194,3.84e-05,3.21e-05,1.78e-05,6.92e-06,6.49e-06,5.46e-06,5.26e-06,1.02e-05,3.54e-05,3.47e-05,1.81e-05,1.88e-05,2.31e-05,3.03e-05,3.4e-05,3.35e-05,3.58e-05,3.69e-05,3.52e-05,1.3e-05,1.33e-05,1.25e-05,7.76e-06,5.48e-06,5.22e-06,1.03e-05,5.93e-05,4.92e-05,1.57e-05,1.53e-05,1.79e-05,2.07e-05,2.4e-05,2.3e-05,2.15e-05,1.94e-05,1.46e-05,1.16e-05,1.54e-05,1.73e-05,8.71e-06,5.42e-06,5.27e-06,1.02e-05,8.96e-05,6.18e-05,1.46e-05,1.38e-05,1.52e-05,1.77e-05,1.91e-05,1.87e-05,1.67e-05,1.42e-05,1.22e-05,1.18e-05,3.03e-05,2.43e-05,9.01e-06,5.24e-06,5.33e-06,1.09e-05,3.27e-05,1.02e-05,1.23e-05,1.49e-05,1.63e-05,1.71e-05,1.81e-05,1.76e-05,1.62e-05,1.63e-05,1.72e-05,1.4e-05,1.14e-05,2.32e-05,9.15e-06,5.37e-06,5.39e-06,9.46e-06,1.18e-05,0,1.01e-05,5.93e-05,4.46e-05,2.95e-05,3.4e-05,3.45e-05,3.24e-05,7.56e-05,0.000175,1.93e-05,0,1.56e-05,9.13e-06,5.56e-06,4.98e-06,7.81e-06,1.23e-05,1.16e-05,3.06e-05,8.56e-05,5.6e-05,2.96e-05,2.58e-05,2.99e-05,4.9e-05,0.000114,0.000682,0.000371,8.92e-05,6.04e-05,8.56e-06,5.29e-06,5.15e-06,6.33e-06,7.78e-06,9.58e-06,1.07e-05,1.01e-05,1e-05,9.87e-06,9.82e-06,1.01e-05,1.09e-05,1.25e-05,1.54e-05,3.32e-05,1.56e-05,1e-05,7.38e-06,5.31e-06,4.8e-06,5.2e-06,5.12e-06,5.42e-06,5.36e-06,5.21e-06,5.24e-06,5.19e-06,5.16e-06,5.14e-06,5.26e-06,5.36e-06,5.45e-06,5.57e-06,5.7e-06,5.31e-06,5.33e-06,4.84e-06,7.42e-06],"winrateAvg":0.430519,"leadAvg":-0.553693,"scoreMeanAvg":-0.96377,"scoreStdevAvg":13.1203,"shorttermWinlossErrorAvg":0.0926616,"shorttermScoreErrorAvg":0.718215,"ownership":[-55,-56,-56,-56,-50,-45,-42,-46,-56,-68,-83,-96,-97,67,54,63,68,-15,-53,-55,-62,-56,-57,-44,-43,-47,-55,-67,-80,-96,68,68,59,67,66,-88,-50,-53,-61,-91,-44,-39,-38,-41,-45,-57,-96,-94,-96,65,66,66,-89,-89,-44,-50,-55,-61,-44,-33,-34,-36,-39,-46,-64,-74,-96,69,-88,-87,-84,-76,-39,-40,-56,-90,-36,-29,-27,-30,-37,-41,-67,-74,-87,-96,96,-88,-86,-86,-31,-36,-38,-34,-14,-15,-16,-23,-34,-47,-59,-79,-90,-95,97,85,-87,-87,-23,-24,-25,-24,-11,-5,-8,-14,-28,-64,-91,-96,-96,96,97,97,-87,97,-16,-18,-18,-22,-4,-1,-2,-6,-15,-20,32,72,87,80,85,95,97,96,-12,-14,-13,-10,-5,0,1,0,-3,-1,7,21,64,89,80,97,85,86,-9,-11,-9,-6,-3,0,2,2,2,3,9,25,39,53,51,65,74,75,-7,-8,-5,-4,-1,0,1,2,3,4,9,18,29,39,44,55,63,63,-4,-6,-2,-1,1,1,2,2,3,4,7,13,22,31,41,49,53,53,0,-4,-1,11,7,5,4,3,3,4,7,11,20,31,42,46,47,45,4,7,19,26,15,11,6,5,5,5,8,12,23,35,49,54,44,37,8,10,24,77,29,18,8,7,6,7,8,12,27,48,87,56,30,30,10,13,15,32,28,13,10,8,6,6,10,12,27,29,24,8,23,21,11,10,16,18,17,10,8,7,6,6,7,8,9,14,12,14,12,17,11,12,14,15,14,11,8,6,5,5,6,8,10,10,11,10,12,15],"ownershipAllowedMAE":0.0366734})%"); + lines.push_back(R"%({"sample":{"board":"..OX.X.........X../.O.OXO.......OOOX./.OOX.......XXXOXX./.XX.X.......XOXX../..OX.X....XOXOOOO./...XOX.X..XOX...O./.....OX.OOXOXXO.X./..X..O.XXOXXOOOO../.O....XXO.OXXXXOOO/....OO...O..OXOOX./....OXX.XXOOOOXXX./...OX.......XOXXO./...OX.OO.O.O.XXOX./...OX..XO..OXXOOX./.XOOOOO..OXXXO.O../..OXXX.XXO.OXOO.O./.XOOOX.XOO.OXXXO../.OOOX.X.XO.X..XXO./.OXXX..X........../","hintLoc":"null","initialTurnNumber":189,"metadata":"45288DC74315DBAB41F976601343A4DD:199","moveLocs":["E19","L6","L7","D19","G4","G3","E19","J8","J7","D19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.87,"xSize":18,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.01e-06,3.23e-06,0,0,0,0,0.00182,3.57e-06,3.77e-06,4.07e-06,5.36e-06,6.71e-06,5.08e-06,3.22e-06,3.72e-05,0,0.00072,3.63e-06,3.69e-06,0,2.81e-06,0,0,0,3.94e-06,3.77e-06,3.64e-06,3.85e-06,4.72e-06,0.000134,0.0325,0,0,0,0,5.66e-06,3.7e-06,0,0,0,8.12e-06,8.85e-05,3.77e-06,3.65e-06,3.62e-06,3.64e-06,3.63e-06,0,0,0,0,0,0,4.5e-06,4.63e-06,0,0,0,0,3.77e-06,3.73e-06,3.81e-06,3.77e-06,3.75e-06,7.49e-06,3.77e-06,0,0,0,0,1.16e-05,3.99e-06,3.77e-06,4.95e-06,0,0,3.46e-06,0,4.24e-06,3.66e-06,4.27e-06,5.73e-06,0,0,0,0,0,0,0,3.79e-06,4.1e-06,3.85e-06,3.81e-06,0,0,0,1.53e-05,0,6.59e-06,3.7e-06,0,0,0,3.94e-06,3.33e-06,3.64e-06,0,3.53e-06,4.17e-06,3.89e-06,5.28e-06,1.09e-05,4.07e-06,0,0,0.0782,0,0,0,0,0,0,0,3.7e-06,0,3.7e-06,3.87e-06,4.12e-06,0,3.81e-06,3.58e-06,0,0.000124,0,0,0,0,0,0,0,0,0,3.79e-06,3.62e-06,3.66e-06,0,4.35e-06,3.89e-06,3.68e-06,3.39e-06,0,0,0,3.5e-06,0,0,0,0,0,0,0,0,3.7e-06,3.62e-06,3.63e-06,3.71e-06,0,0,1.59e-05,6.59e-06,3.55e-06,0,3.47e-06,3.95e-06,0,0,0,0,0,0.0603,3.74e-06,3.57e-06,3.58e-06,3.83e-06,0,0,0,3.24e-06,0,0,0,0,0,0,0,0,0,6.11e-05,3.74e-06,3.83e-06,3.89e-06,0,0,3.61e-06,3.48e-06,3.83e-06,0,3.92e-06,3.18e-06,3.09e-06,0,0,0,0,0,0.00132,3.71e-06,3.81e-06,3.72e-06,0,0,3.47e-06,0,0,0,0,0,0,3.96e-06,0,0,0,0,1.26e-05,3.6e-06,3.69e-06,3.67e-06,0,0,3.48e-06,3.38e-06,0,0,3.38e-06,0,0,0,0,0,0,0,0.0767,3.75e-06,0,0,0,0,0,0,3.69e-06,3.18e-06,0,0,0,0,0,2.72e-06,0,7.1e-05,0.0749,3.64e-06,3.74e-06,0,0,0,0,0,0,0,0,3.59e-06,0,0,0,0,3.68e-06,0,4.17e-06,3.6e-06,0,0,0,0,0,0,0,0,0,3.94e-06,0,0,0,0,0,3.66e-06,3.57e-06,3.72e-06,0,0,0,0,0.00021,0,0,0,0,0.0142,0,0.133,4.09e-06,0,0,0,4.07e-06,3.58e-06,0,0,0,0,0.354,1.09e-05,0,0.000881,0.129,0.00144,0.0365,0.000263,0.00166,4.05e-06,0.00116,5.1e-06,4.04e-06,8.42e-06],"winrateAvg":0.740246,"leadAvg":1.36105,"scoreMeanAvg":2.0887,"scoreStdevAvg":7.35003,"shorttermWinlossErrorAvg":0.295774,"shorttermScoreErrorAvg":2.08598,"ownership":[41,42,42,42,43,31,32,7,-12,-31,-51,-70,-84,-82,-73,-71,-65,-51,39,45,44,47,15,43,1,-19,-26,-39,-57,-84,-81,-74,-71,-70,-68,-22,11,41,46,-42,13,-8,-17,-24,-33,-44,-60,-100,-100,-99,-71,-72,-69,8,-13,-76,-78,-45,-95,-42,-31,-36,-36,-44,-59,-97,-100,97,-73,-72,46,41,-54,-52,-44,-98,-76,-99,-53,-43,-49,-39,-99,-97,-100,97,97,97,97,75,-50,-59,-75,-98,5,-99,-86,-94,-1,-31,-99,-97,-100,-20,75,88,97,88,-42,-56,-64,-33,3,43,-91,24,82,83,-99,-98,-100,-99,97,88,83,88,-24,-36,-88,-32,6,46,-57,-81,-84,83,-99,-99,97,97,97,97,92,91,-6,25,-49,-28,44,-12,-82,-82,82,81,86,-99,-99,-99,-99,97,97,97,18,13,3,8,90,89,15,-64,-27,86,82,11,97,-99,97,97,-97,37,35,37,29,63,91,-76,-76,-61,-77,-77,97,97,97,97,-97,-97,-97,-66,52,59,58,100,7,9,6,41,-79,12,77,45,10,97,-97,-97,-92,-92,66,73,76,100,9,50,100,100,100,100,100,100,14,-97,-98,86,-91,-74,77,84,89,100,4,65,49,-11,100,29,-96,99,-97,-97,81,82,-88,-2,85,81,100,100,100,100,100,-9,-24,81,-97,-97,-97,82,79,80,-9,43,92,94,100,-88,-87,-86,99,-84,-82,82,-38,77,-97,82,80,78,80,67,96,94,100,100,100,-86,-85,-83,86,84,55,78,-97,-97,-96,77,73,70,98,100,100,100,-87,-88,-84,-83,-81,86,34,-72,-72,-92,-96,-95,75,60,99,100,-84,-86,-86,-84,-84,-83,-76,55,47,1,-73,-87,-86,-53,-46,34],"ownershipAllowedMAE":0.0667387})%"); + lines.push_back(R"%({"sample":{"board":".................../...........X.XXO.../.....OO..O.X.OXOO../..OOO..O.OX...OXO../.O.XXOO.XXOXX....O./..X.XXXX..OXOXXXXXO/..XXO.O.XX.O.OXOO../.OOOO.O.OXO.OOOXX../.OXX.X.O.XXO..XX.../..OX.XX.XXO.XOOOO../.OOOOOX.XO.OO....O./.XO..O..XO......XO./X.XXOOOXXXO..XXX.../..XXXXXOXOOO.XOOO../.OX.O.XOX.X.OX...../.X.OXOOO.X..OXXXXO./..XO.O.X...XX.OXOO./.X.XO.OX........XO./..X.XX............./","hintLoc":"null","initialTurnNumber":187,"metadata":"A2BBD889986CFDD447B5B44AE934BA3F:197","moveLocs":["S13","B14","D8","L13","L17","M16","L18","C15","B16","A9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.38,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.59e-05,4.52e-05,4.45e-05,4.4e-05,4.35e-05,4.38e-05,4.43e-05,4.5e-05,4.52e-05,4.55e-05,4.81e-05,4.74e-05,4.39e-05,5.75e-05,0.000131,4.52e-05,4.4e-05,4.62e-05,4.58e-05,4.55e-05,4.36e-05,4.3e-05,4.28e-05,4.36e-05,4.34e-05,4.36e-05,4.4e-05,4.43e-05,4.37e-05,0,0,0.000109,0,0,0,4.3e-05,4.31e-05,4.47e-05,4.51e-05,4.34e-05,4.34e-05,4.39e-05,4.39e-05,0,0,4.5e-05,4.71e-05,0,0,0,4.34e-05,0,0,0,0,4.5e-05,4.54e-05,4.82e-05,0,0,0,0,4.32e-05,4.4e-05,0,4.34e-05,0,0,0,4.27e-05,5.07e-05,0,0,0,4.67e-05,4.48e-05,0.000291,0,0,0,0,0,0,4.45e-05,0,0,0,0,0,8.09e-05,3.82e-05,9.55e-05,4.43e-05,0,4.5e-05,0.00391,0,0,0,0,0,0,0,4.64e-05,4.31e-05,0,0,0,0,0,0,0,0,0,0.39,0.135,0,0,0,4.46e-05,0,4.6e-05,0,0,0,0,0.000108,0,0,0,0,0,4.7e-05,0.0357,0,0,0,0,4e-05,0,4.14e-05,0,0,0,7.01e-05,0,0,0,0,0,4.79e-05,4.61e-05,0.000143,0,0,0,0.0334,0,4.7e-05,0,4.8e-05,0,0,0,4.37e-05,4.77e-05,0,0,4.46e-05,4.34e-05,4.54e-05,0.316,0.000114,0,0,0.0311,0,0,0.026,0,0,0,4.6e-05,0,0,0,0,0,4.47e-05,4.55e-05,0,0,0,0,0,0,0,0.00528,0,0,4.29e-05,0,0,4.56e-05,4.57e-05,4.64e-05,4.59e-05,0,4.55e-05,0,0,0,0,3.57e-05,0,4.04e-05,4.05e-05,0,0,4.32e-05,4.72e-05,4.51e-05,4.51e-05,4.19e-05,4.33e-05,0,0,4.56e-05,0,0.00823,0,0,0,0,0,0,0,0,0,4.49e-05,4.43e-05,0,0,0,4.74e-05,4.78e-05,4.72e-05,0.000404,0.00536,0,0,0,0,0,0,0,0,0,0,4.14e-05,0,0,0,0,4.81e-05,4.78e-05,4.02e-05,0,0,4.53e-05,0,4.61e-05,0,0,0,4.47e-05,0,4.34e-05,0,0,4.34e-05,4.26e-05,4.7e-05,4.72e-05,4.82e-05,0.000122,0,0.000177,0,0,0,0,0,4.69e-05,0,5.18e-05,4.41e-05,0,0,0,0,0,0,4.61e-05,4.56e-05,8.89e-05,0,0,3.99e-05,0,4.44e-05,0,0.000143,4.37e-05,4.34e-05,0,0,0.000117,0,0,0,0,4.49e-05,4.4e-05,0,0,0,0,4.37e-05,0,0,8.53e-05,4.1e-05,4.16e-05,4.21e-05,4.39e-05,0.000163,0.000289,0.00063,0,0,4.65e-05,4.34e-05,4.42e-05,0,0,0,0,5.09e-05,4.28e-05,4.22e-05,4.23e-05,4.18e-05,4.16e-05,4.2e-05,4.24e-05,8.57e-05,5.49e-05,0.000106,4.69e-05,4.77e-05,3.77e-05],"winrateAvg":0.00166684,"leadAvg":-7.09157,"scoreMeanAvg":-7.49851,"scoreStdevAvg":6.46829,"shorttermWinlossErrorAvg":0.017404,"shorttermScoreErrorAvg":2.49714,"ownership":[99,99,99,99,99,99,98,97,96,95,14,-26,-83,-55,30,51,95,95,95,98,99,99,99,99,99,99,97,97,97,99,-100,-91,-97,-97,99,97,95,96,98,99,99,99,100,100,100,98,96,98,98,-100,-90,-66,-97,98,98,97,96,94,100,100,100,100,100,99,100,-32,98,-100,-100,-83,-64,29,29,98,96,95,5,100,-100,-100,-100,100,100,-8,-100,-100,-99,-100,-100,-74,-49,39,-36,94,93,-40,-99,-100,-99,-100,-100,-100,-100,-100,-99,-99,-100,0,-96,-95,-96,-96,-95,89,33,2,-100,-100,93,-16,91,-45,-100,-100,-100,31,3,97,-96,87,86,87,90,50,95,94,94,93,70,90,81,87,-100,-5,1,98,97,96,86,85,88,90,85,95,-96,-96,-25,-99,-4,90,-45,-100,-100,98,96,94,89,87,93,92,91,34,92,93,-96,-14,-99,-99,28,-100,-100,96,96,95,100,100,100,100,97,95,-26,92,91,92,92,94,-99,-87,-100,92,92,99,99,12,20,15,38,100,97,-24,-73,92,92,93,92,9,-64,-100,92,88,85,-3,-28,-36,-49,-84,100,97,-79,-70,-96,-97,92,92,92,-100,-100,-100,93,49,-72,-99,-99,-99,-59,92,96,-77,-87,-96,-97,-98,-98,-98,-97,-100,94,94,94,5,-99,97,97,97,95,95,-88,-85,-97,-95,-95,-96,-99,-96,-100,-43,-97,33,91,-99,-62,28,-26,91,95,-95,-100,-95,-94,-97,-95,-96,-97,-99,-100,-87,2,91,-99,-99,-99,-99,98,94,-98,-99,-100,-95,-96,-96,-98,-100,-99,-99,-99,-100,-100,-98,-94,-99,99,98,86,-99,-100,-99,-100,-96,-98,-97,-100,-99,-99,-99,-99,-98,-97,-94,-70,-61,98,61,-99,-99,-100,-99,-100,-100,-99,-99,-98,-98,-98,-98,-97,-92,-77,-64,-5,8,51],"ownershipAllowedMAE":0.062627})%"); + lines.push_back(R"%({"sample":{"board":".O.....O..XXO./O....OO..XXO../XOOOOXOOXXOOO./XXXXXXXX.XXO../........XOX.../.....X..OOXOO./XXOX.XOO.OOO../XO..X.OXX..XX./OXXXO..XOOOX../OOXOO.OXX.OX../.OOOXXO...OX../...OOXXX..OX../.OX.OOX..XX.../............../","hintLoc":"null","initialTurnNumber":104,"metadata":"1B23A0DAA33F2F88F7E12A0F259C0F73:114","moveLocs":["J14","H10","J11","G10","F10","O8","G6","F5","K3","H13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":14,"ySize":14},"rules":"koSIMPLEscoreAREAtaxSEKIsui0button1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,1.81e-05,2.77e-05,4.95e-05,5.34e-05,2.61e-05,0,0,1.6e-05,0,0,0,0.000375,0,0.000338,0.000145,5.71e-05,0.000218,0,0,0,0.00139,0,0,0,0.00038,2.04e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,1.69e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.62e-05,1.65e-05,1.76e-05,1.64e-05,1.75e-05,1.65e-05,1.61e-05,0,0,0,0,0,0,0.218,1.53e-05,1.87e-05,1.88e-05,1.73e-05,1.72e-05,1.64e-05,1.64e-05,0,0.0335,1.92e-05,0,0,0,0,0,2.23e-05,0,0,0,0,1.76e-05,0,0,0,6.21e-05,0,0,0,0.129,0,0,0,1.96e-05,1.83e-05,0,0.00143,0,0,0,0.00173,0.00255,0,0,0.418,0,0,0,0,0,2.77e-05,0,0,0,0,0,0,1.91e-05,2.17e-05,0,0,0,0,0,0,0,0,0,2.15e-05,0,0,1.83e-05,1.79e-05,1.66e-05,0,0,0,0,0,0,0.0522,0.000868,0.000648,0,0,1.7e-05,1.78e-05,0.000178,0.00129,4.66e-05,0,0,0,0,0,2.35e-05,0,0,0,1.79e-05,1.8e-05,0.00034,0,0,1.66e-05,0,0,0,1.93e-05,1.92e-05,0,0,1.67e-05,1.74e-05,1.78e-05,1.88e-05,0.000643,1.98e-05,1.64e-05,1.61e-05,0.0801,0.0554,2.29e-05,1.76e-05,1.75e-05,1.69e-05,1.74e-05,1.74e-05,1.64e-05,2.35e-05],"winrateAvg":0.473345,"leadAvg":-0.0262683,"scoreMeanAvg":-0.0369332,"scoreStdevAvg":1.99984,"shorttermWinlossErrorAvg":0.22779,"shorttermScoreErrorAvg":0.453979,"ownership":[100,100,100,100,99,99,99,100,-88,-90,-100,-100,100,99,100,100,100,100,99,100,100,100,-4,-100,-100,100,100,100,-100,100,100,100,100,-100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,99,-99,-99,-99,-99,-99,-100,99,99,-100,100,-100,-87,100,99,-99,-99,-98,-99,-99,-100,-55,98,100,100,-100,100,100,92,-99,-99,-98,-100,-99,-100,100,100,-1,100,100,100,-67,90,-99,-98,-98,-100,-100,16,100,-100,-100,21,-1,-100,-100,-51,100,-100,-100,-100,100,2,-100,-100,100,100,100,-100,-100,-99,100,100,-100,100,100,100,100,-100,-100,3,100,-100,-100,-99,100,100,100,100,-100,-100,100,-67,48,58,100,-100,-100,-100,99,99,99,100,100,-100,-100,-100,-49,-100,100,-100,-100,-100,99,99,99,99,100,100,-100,-99,-99,-100,-100,-100,-100,-100,99,99,99,99,99,7,3,-99,-99,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0191091})%"); + lines.push_back(R"%({"sample":{"board":".................../....X............../...OX.XXX...XX.OO../..O...O.OXX.O.O.XO./......O.OOX.....XO./...O.XX...OXXX...../.....O...OOO.OXX.O./...O...XXOX.O.O.XX./.....O.XOO...OO..../..XXXO.XXO....O..../..XOOXX..O..XXOX.../..X....XXXX.XOXXXX./.XOOOXXOOOO.O.OX.O./.XO..XOO....OOOOO.O/.X......X.....OXXO./.XOOOOOOX.O.XX.XOX./XXXXXOXXOOOX...XOX./.XOOOXX.XO.OX.OXOX./..X.....O........../","hintLoc":"null","initialTurnNumber":179,"metadata":"1EA5D084092A6AA437A3711104546D89:189","moveLocs":["G13","H14","E16","J14","E15","O7","L9","M8","O8","C5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.8,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.317,"pda":0.0,"policyMixture":[6.8e-06,7.88e-06,7.24e-06,7.53e-06,7.07e-06,7.09e-06,7.05e-06,7.13e-06,6.93e-06,6.75e-06,6.89e-06,7.22e-06,7.25e-06,7.24e-06,7.19e-06,7.18e-06,7.08e-06,7.21e-06,6.95e-06,7.48e-06,7.16e-06,7.81e-06,1.98e-05,0,7.67e-05,6.88e-06,6.79e-06,6.92e-06,7.17e-06,9.67e-06,2.6e-05,3.36e-05,2.08e-05,9.4e-06,7.5e-06,7.35e-06,7.37e-06,7.17e-06,7.19e-06,7.31e-06,7.11e-06,0,0,0.000127,0,0,0,9.84e-06,1.13e-05,0.00016,0,0,7.37e-06,0,0,7.09e-06,7.15e-06,7.21e-06,7.23e-06,0,6.96e-06,0,7.35e-06,0,6.97e-06,0,0,0,6.25e-05,0,0.000166,0,7.88e-06,0,0,6.93e-06,7.12e-06,7.21e-06,7.14e-06,7.56e-06,0,7.86e-06,0,7.27e-06,0,0,0,2.29e-05,2.14e-05,2.27e-05,0.000169,7.76e-06,0,0,7.17e-06,7.1e-06,7.28e-06,7.34e-06,0,7.15e-06,0,0,0,0,7.94e-06,0,0,0,0,4.01e-05,1.28e-05,6.32e-05,8.46e-06,7.18e-06,7.35e-06,7.22e-06,7.32e-06,7.77e-06,7.2e-06,0,0,2.46e-05,2.5e-05,0,0,0,7.22e-06,0,0,0,7.03e-05,0,7.24e-06,7.42e-06,1.59e-05,8.61e-06,0,6.68e-06,6.96e-06,6.75e-06,0,0,0,0,7e-06,0,6.55e-06,0,3.06e-05,0,0,8.79e-06,7.43e-06,1.3e-05,1.36e-05,7.11e-06,7.03e-06,0,6.59e-06,0,0,0,7.75e-06,6.93e-06,6.49e-06,0,0,6.87e-06,0.000255,4.64e-05,8.27e-06,7.3e-06,7.26e-06,0,0,0,0,7.19e-06,0,0,0,6.79e-06,6.78e-06,7.13e-06,6.83e-06,0,1.09e-05,6.14e-05,4.5e-05,8.78e-06,7.28e-06,7.26e-06,0,0,0,0,0,7.32e-06,1.07e-05,0,0,7.06e-06,0,0,0,0,6.64e-06,1.96e-05,7.52e-06,6.98e-06,6.63e-06,0,6.91e-06,8.54e-06,1.85e-05,6.29e-06,0,0,0,0,0,0,0,0,0,0,0,1.03e-05,6.72e-06,0,0,0,0,0,0,0,0,0,0,7.19e-06,0,3.06e-05,0,0,7.43e-06,0,7.64e-06,6.65e-06,0,0,8.92e-06,0.00532,0,0,0,7.19e-06,7e-06,7.05e-06,7.16e-06,0,0,0,0,0,6.92e-06,0,6.64e-06,0,0,0.99,7.25e-06,5.8e-06,6.75e-06,7.13e-06,0,6.8e-06,6.73e-06,6.67e-06,7.15e-06,7.04e-06,0,0,0,0,7.78e-06,6.63e-06,0,0,0,0,0,0,0,0,6.97e-06,0,1.7e-05,0,0,0.00152,0,0,0,7.72e-06,0,0,0,0,0,0,0,0,0,0,0,0,8.28e-06,7.79e-05,7.47e-05,0,0,0,6.96e-06,6.74e-06,0,0,0,0,0,0,3.19e-05,0,0,6.98e-06,0,0,5e-05,0,0,0,0,6.84e-06,7.14e-06,7.87e-06,0,7.11e-06,1e-05,1.98e-05,2.83e-05,7.58e-06,0,7.06e-06,7.18e-06,7.76e-06,2.17e-05,8.12e-06,1.58e-05,5.29e-05,0.000104,7.33e-06,6.54e-06,4.97e-06],"winrateAvg":0.443593,"leadAvg":-0.369449,"scoreMeanAvg":-0.0746316,"scoreStdevAvg":10.3033,"shorttermWinlossErrorAvg":0.280527,"shorttermScoreErrorAvg":1.79632,"ownership":[33,20,13,-43,-51,-70,-81,-87,-88,-85,-79,-65,-50,-22,11,44,71,80,87,40,34,10,57,-89,-81,-89,-93,-93,-89,-82,-77,-66,-44,2,68,89,89,91,51,51,62,92,-89,-3,-98,-98,-98,-94,-84,-67,-85,-84,17,96,96,94,93,58,77,98,91,98,34,97,-35,96,-98,-98,-74,57,42,92,63,-23,95,91,58,66,78,90,99,39,97,44,96,97,-98,-72,0,15,35,4,-26,95,79,44,48,67,98,-24,-90,-90,-90,-90,29,98,-93,-92,-91,-48,-43,11,74,64,23,25,37,79,59,90,90,-61,12,98,98,98,-25,61,-91,-91,-27,80,9,-2,-3,29,92,44,61,2,-95,-94,97,58,82,97,64,96,-28,-93,-94,-35,-32,-22,-5,-18,-11,88,0,-95,98,97,63,44,63,96,96,50,61,-76,-76,-60,-64,-99,-99,-98,87,-53,-95,-95,97,36,-26,9,-5,96,-21,48,-79,-74,-78,-86,-99,91,90,-94,-95,-76,-44,97,96,-37,-95,-94,96,-92,-38,-64,-64,-92,-98,-99,12,47,13,-88,-96,-95,-95,-95,-96,-95,-73,-94,-93,-92,-91,-8,-98,-100,97,97,96,-91,-91,99,99,99,99,-44,99,-72,99,-93,3,97,38,-99,-100,98,95,-63,-89,99,100,97,94,83,67,99,99,99,99,99,94,96,-100,-100,-100,99,34,-7,26,97,95,96,84,34,-2,34,99,-98,-98,94,5,-100,-100,100,100,100,100,99,99,96,97,100,60,-68,-69,73,-99,-98,-99,-44,-100,-100,-100,-100,-99,99,-52,-53,100,99,99,-45,-44,-50,-92,-99,-99,-99,-95,-100,-100,-54,-56,-56,-55,-52,81,83,99,76,77,-60,-42,-43,-99,-99,-99,-97,-99,-98,-98,-85,-65,-41,61,82,96,91,81,49,33,-48,-69,-93,-98,-99,-98],"ownershipAllowedMAE":0.0508509})%"); + lines.push_back(R"%({"sample":{"board":"..............X..../...........XXX.XO../.....O....O.OXXO.../...O........OOOOO../..........OXXO.XO../..........OXOX.XX../...X.......X.X...../................O../............X....../................X../.................../.X.O..........O.O../X.XOXO............./.X.XO............../..X.............OO./.OOO.X........X.X../..X.OX.X.......X.../....OOX............/.................../","hintLoc":"null","initialTurnNumber":68,"metadata":"12AEBB18FD750C236F7EACE8834FFBE1:78","moveLocs":["L16","K16","M16","M17","K17","J16","L18","H18","J18","J17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.75,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":2.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.47e-06,2.97e-06,2.82e-06,2.83e-06,2.79e-06,2.76e-06,2.88e-06,2.91e-06,3.03e-06,4.06e-06,2.92e-06,2.65e-06,3.12e-06,3.08e-06,0,3.17e-06,3.11e-06,2.62e-06,2.48e-06,2.95e-06,3.72e-06,3.63e-06,3.66e-06,3.62e-06,3.44e-06,4.22e-06,0,0,0.978,0,0,0,0,2.6e-06,0,0,3.3e-06,2.79e-06,2.97e-06,1.21e-05,3.35e-05,3.22e-05,1.41e-05,0,3.57e-06,3.05e-06,0,0,0,0,0,0,0,0,2.43e-06,3.77e-06,2.71e-06,3.12e-06,1.77e-05,9.97e-05,0,3.26e-05,3.61e-06,3.35e-06,3.03e-06,0,0,0,0,0,0,0,0,0,2.55e-06,2.63e-06,3.04e-06,2.79e-05,4.48e-05,3.47e-05,3.47e-06,3.56e-06,3.64e-06,3.42e-06,3.19e-06,3.88e-06,0,0,0,0,2.84e-06,0,0,4.11e-06,2.76e-06,2.92e-06,7.54e-06,1.52e-05,3.35e-06,3.78e-06,3.85e-06,3.87e-06,3.74e-06,1e-05,3.4e-06,0,0,0,0,2.53e-06,0,0,5.72e-06,3.01e-06,2.91e-06,3.91e-06,3.64e-06,0,3.56e-06,4.2e-06,4.33e-06,1.12e-05,6.13e-06,4.68e-06,7.55e-05,0,3.09e-06,0,2.71e-06,2.79e-06,3.61e-06,4.85e-06,3.38e-06,2.9e-06,3.85e-06,4.32e-06,3.53e-06,3.86e-06,5.06e-06,2.26e-05,1.93e-05,1.38e-05,3.32e-05,4.93e-06,3.21e-06,3.14e-06,2.79e-06,3.12e-06,3.52e-06,0,4.78e-06,3.21e-06,2.9e-06,3.8e-06,1.27e-05,9.14e-06,6.42e-06,2.13e-05,2.27e-05,1.85e-05,1.53e-05,1.43e-05,4.42e-06,3.46e-06,0,3.15e-06,3.62e-06,5.72e-06,4.06e-06,3.72e-06,3.21e-06,2.92e-06,3.98e-06,8.55e-06,1.05e-05,2.2e-05,2.11e-05,2.3e-05,2.03e-05,1.77e-05,1.08e-05,4.03e-06,3.68e-06,3.43e-06,3.67e-06,1.27e-05,7.84e-06,0,1.19e-05,3.32e-06,2.96e-06,3.12e-06,3.82e-06,1.92e-05,2.43e-05,2.3e-05,2.13e-05,2.74e-05,2.3e-05,4.65e-06,4.26e-06,4.04e-06,4.1e-06,4.28e-06,7.23e-06,0.000186,0.000116,2.11e-05,3.11e-06,2.54e-06,0,3.48e-06,0,2.75e-05,1.7e-05,2.96e-05,3.98e-05,1.01e-05,6.24e-06,4.92e-06,5.4e-06,9.18e-06,1.73e-05,0,5.32e-05,0,0.000203,3.12e-06,0,2.18e-06,0,0,0,0,3.19e-05,1.79e-05,1.81e-05,1.31e-05,1.15e-05,1.42e-05,1.45e-05,2.7e-05,2.94e-05,0.000862,0.000129,0.000106,3.22e-06,2.86e-06,0,2.52e-06,0,0,0.000159,1.68e-05,1.68e-05,2.53e-05,1.97e-05,1.81e-05,1.72e-05,1.26e-05,3e-05,3.31e-05,2.73e-05,7.83e-06,3.77e-06,3.04e-06,3.52e-06,3.33e-06,0,2.36e-05,0.0179,3.4e-06,3.61e-06,4e-06,1.16e-05,1.67e-05,2.24e-05,1.86e-05,1.33e-05,5.16e-06,3.51e-06,3.56e-05,0,0,2.98e-06,7.26e-06,0,0,0,6.31e-06,0,2.81e-06,3.24e-06,3.83e-06,1.13e-05,2.67e-05,2.07e-05,7.22e-06,3.65e-06,0,2.69e-06,0,2.35e-05,3.26e-06,3.36e-06,9.75e-06,0,3.86e-06,0,0,2.53e-06,0,3.24e-06,4.73e-06,6.48e-06,4.59e-06,3.99e-06,3.69e-06,2.9e-06,0,2.85e-06,4.1e-06,3.05e-06,3.2e-06,3.44e-06,3.58e-06,3.57e-06,0,0,0,2.63e-06,3.24e-06,3.64e-06,3.7e-06,3.74e-06,3.55e-06,3.47e-06,3.42e-06,3.28e-06,3.24e-06,3.17e-06,3.14e-06,2.61e-06,3.25e-06,3.34e-06,3.1e-06,3.22e-06,3.25e-06,3.21e-06,2.87e-06,2.94e-06,2.73e-06,2.81e-06,2.8e-06,2.79e-06,2.75e-06,2.78e-06,2.92e-06,2.77e-06,2.82e-06,2.44e-06,5.21e-06],"winrateAvg":0.440164,"leadAvg":-0.31217,"scoreMeanAvg":-0.372961,"scoreStdevAvg":12.4283,"shorttermWinlossErrorAvg":0.15255,"shorttermScoreErrorAvg":1.06082,"ownership":[34,37,40,46,48,40,18,-35,-55,-90,-95,-97,-97,-96,-95,-35,26,74,78,30,34,44,50,55,59,20,61,-95,-97,-98,-98,-97,-97,-92,-92,87,79,82,27,31,46,56,58,90,55,53,86,-96,88,89,90,-98,-98,93,89,88,81,24,24,31,88,41,42,39,47,86,87,-94,-95,92,93,93,93,93,83,61,20,26,53,16,24,21,21,22,37,47,56,-95,-95,92,14,-87,93,18,34,13,15,18,6,10,11,12,14,11,17,54,-95,-89,-95,-44,-86,-85,-4,-9,3,5,-7,-48,-1,5,6,7,9,4,-2,-95,-90,-96,-56,-46,-46,-50,-26,-4,-4,-2,-3,6,3,2,3,2,-6,-16,-32,-43,-44,-33,-29,15,-4,-27,-14,-6,2,11,6,7,5,2,-1,-2,-16,-27,-82,-30,-24,-24,-23,-21,-20,-28,-20,-4,7,7,9,5,1,-1,-3,-6,-10,-16,-5,-6,-4,-56,-19,-9,-50,-35,9,13,17,8,5,1,-2,-3,-4,-5,-7,0,14,4,11,9,13,-72,-82,-15,70,58,26,4,-4,-4,-4,-4,-5,-4,8,67,36,77,40,34,-82,-78,-78,70,40,70,10,-5,-7,-5,-5,-7,-8,-10,5,11,35,46,43,-62,-80,-52,-52,65,13,-14,-11,-15,-8,-9,-11,-14,-21,-19,-13,21,48,48,-3,-23,-72,0,-18,-17,-9,-18,-16,-13,-15,-15,-18,-17,-35,-28,64,67,39,55,92,91,92,-16,-85,-27,-29,-17,-15,-29,-23,-27,-39,-90,-54,-80,-54,34,81,84,81,88,91,-85,-77,-86,-37,-23,-16,-24,-29,-34,-63,-91,-51,1,-1,84,83,85,87,90,90,-83,-59,-42,-32,-27,-27,-31,-40,-49,-66,-35,-22,-11,84,85,85,84,63,-3,-32,-56,-40,-32,-26,-26,-29,-36,-45,-43,-37,-27,-20],"ownershipAllowedMAE":0.0291668})%"); + lines.push_back(R"%({"sample":{"board":"...............X.../.X.XOXO...O..OX..../X.XXXOO...XO..OXXX./.XOOOXOXXXOOO.OOXO./.O...XOOX.X....XOO./...O.OXXOX..X..XO../....OX..O......X.../...OXX...........O./...O............XO./.OOXX...........XO./.XX................/.................../.........X......XX./................XO./....X..........XO.O/..O.XO....OX...XOO./...OO......X...XO../................XO./.................../","hintLoc":"null","initialTurnNumber":101,"metadata":"D680D1913E3E87A6011CAFF7233C6D60:111","moveLocs":["E15","H12","J12","H11","M12","L13","J11","J10","K10","K11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.18,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":4.5,"policyOptimism":0.0,"pda":2.168,"policyMixture":[2.25e-06,2.8e-06,2.9e-06,3.24e-06,3.37e-06,3.51e-06,2.46e-06,2.59e-06,2.71e-06,2.72e-06,2.5e-06,2.71e-06,4.21e-06,5.88e-05,7.39e-06,0,5.47e-06,8.91e-05,3.15e-06,2.64e-06,0,2.31e-06,0,0,0,0,2.99e-06,3.92e-06,4.15e-06,0,3.27e-06,5.57e-06,0,0,1.02e-05,1.84e-05,5.19e-05,1.14e-05,0,0,0,0,0,0,0,4.4e-06,4.81e-06,9.28e-06,0,0,3.39e-06,4.38e-06,0,0,0,0,0.00122,3.68e-06,0,0,0,0,2.13e-06,0,0,0,0,0,0,0,4.27e-06,0,0,0,0,5.58e-06,3.82e-06,0,2.25e-06,2.11e-06,0,2.27e-06,0,0,0,0,0,9.03e-06,6.75e-06,1.04e-05,3.19e-05,0,0,0,2.89e-06,2.99e-06,3.17e-06,2.78e-06,0,2.34e-06,0,0,0,0,0,4.77e-06,0.000261,0,0.00418,4.73e-05,0,0,2.77e-06,2.96e-06,2.64e-06,4.13e-06,3.25e-06,3.45e-06,0,0,0.00417,0.152,0,3.35e-06,0,0.00013,0.00305,0.000511,7.37e-05,0,0.000178,6.15e-06,2.9e-06,2.9e-06,4.92e-06,3.63e-06,0,0,0,6.07e-05,0,0,0.424,4.29e-05,0,7.57e-05,0.000843,0.0002,0.00185,0.0232,0,2.11e-06,3.33e-06,4.5e-06,4.64e-06,0,0.0171,5.57e-05,3.46e-05,0,0,0,0.000347,8.64e-06,3.65e-05,0.000119,0.0107,0.000158,0,0,1.91e-06,3.78e-06,0,0,0,0,5.95e-05,1.46e-05,0.139,0,0,0.000195,7.25e-05,5.78e-05,9.82e-05,0.000706,0.00012,0,0,3.06e-06,5.16e-06,0,0,0.000381,5.35e-05,2.82e-05,1.72e-05,3.62e-05,0.0146,0.0091,0.000307,9.59e-05,9.58e-05,0.000149,0.0888,0.000213,0.0899,6.22e-05,4.68e-06,3.6e-06,8.59e-06,1.21e-05,0.000191,6.99e-05,3.46e-05,2.07e-05,2.68e-05,5.47e-05,0.000298,0.00011,0.000141,9.76e-05,0.00015,0.000384,0.000644,9.96e-05,1.52e-05,3.71e-06,3.44e-06,1.21e-05,4.27e-05,3.81e-05,7.38e-05,4.53e-05,4.03e-05,3.34e-05,0.000155,0,0.000565,0.000122,8.41e-05,8.23e-05,0.000139,5.03e-05,0,0,4.27e-06,3.28e-06,1.12e-05,2.48e-05,4.45e-05,1.4e-05,2.45e-05,0.000114,8.67e-05,0.000101,0.000483,0.000891,7.83e-05,8.27e-05,3.82e-05,0.00019,6.49e-05,0,0,3.11e-06,3.05e-06,7.58e-06,6.47e-06,6.56e-06,0,8.72e-05,8.57e-05,0.00016,0.00015,0.000128,0.00037,0.00179,6.73e-05,4.22e-05,1.18e-05,0,0,1.97e-06,0,2.94e-06,4.44e-06,0,4.14e-06,0,0,3.6e-05,0.000178,0.000184,1.73e-05,0,0,4.19e-05,4.16e-05,6.68e-06,0,0,0,2.09e-06,2.23e-06,3.62e-06,2.5e-06,0,0,7.91e-06,2.18e-05,5.82e-05,0.000131,5.5e-05,0.000361,0,1.45e-05,4.95e-05,9.13e-06,0,0,2.36e-06,2.27e-06,2.27e-06,2.9e-06,2.87e-06,2.64e-06,3.48e-06,6.01e-06,9.68e-06,1.54e-05,2.76e-05,4.64e-05,2.12e-05,3.09e-05,1.22e-05,1.33e-05,5.93e-05,0.000104,0,0,2.26e-06,1.74e-06,2.17e-06,2.01e-06,2.14e-06,2.49e-06,2.97e-06,3.34e-06,3.84e-06,4.07e-06,4.23e-06,4.04e-06,3.81e-06,3.65e-06,3.42e-06,3.85e-06,4.47e-06,5.35e-06,3.17e-06,2.15e-06,7.95e-06],"winrateAvg":0.985504,"leadAvg":13.9145,"scoreMeanAvg":14.1517,"scoreStdevAvg":13.7174,"shorttermWinlossErrorAvg":0.035702,"shorttermScoreErrorAvg":2.59969,"ownership":[-97,-97,-97,-82,-48,42,65,63,44,56,77,84,72,44,8,-32,-30,-29,-30,-96,-98,-98,-98,0,-1,100,60,26,47,93,87,75,84,-23,-24,-32,-32,-32,-96,-92,-98,-98,-98,100,100,34,-3,-5,-4,97,89,81,92,-31,-34,-36,-3,-35,-92,100,100,100,99,100,-77,-76,-76,96,96,97,65,92,91,-31,87,29,-3,88,89,96,100,96,100,99,-76,-77,-79,5,11,8,21,-77,86,87,67,55,70,85,99,91,96,-37,-35,47,-79,-58,-36,-79,-27,-30,-77,86,84,78,63,69,73,85,93,-72,-35,20,49,-9,-75,-28,-40,-34,-36,-77,5,85,83,51,59,64,90,-73,-73,-38,-60,48,39,-6,31,-12,-23,-28,-41,25,89,83,34,49,48,87,9,-42,-33,-65,46,-1,18,-3,-14,-19,-22,-35,-72,89,77,-1,59,58,-78,-78,-44,-49,-46,-89,18,-14,-20,-16,-22,-26,-36,-72,89,48,-19,-64,-64,-41,-35,-35,-37,-47,-72,-38,-29,-19,-21,-22,-18,-41,-8,1,22,-32,-26,-21,-18,-24,-23,-26,-30,-41,-42,-29,-24,-25,-26,-25,-21,-35,-25,-26,-17,-13,-7,-11,-15,-17,-18,-23,-32,-81,-31,-28,-29,-31,-32,-41,-84,-85,-33,-2,5,1,4,-10,-9,-9,-15,-21,-26,-22,-31,-34,-38,-39,-69,-86,86,39,23,20,25,10,-43,6,0,-9,-17,-22,-27,-32,-42,-44,-51,-94,94,85,90,41,68,94,33,-41,72,11,-9,-15,-20,10,-90,-54,-56,-62,-93,93,93,91,66,75,86,96,96,57,14,-2,-14,-23,-26,-90,-68,-61,-70,-93,93,91,91,73,79,82,87,75,51,26,3,-15,-27,-46,-64,-69,-61,-71,-8,-8,90,85,76,79,80,75,66,46,24,4,-12,-27,-43,-56,-60,-58,-43,-27,28,31,74],"ownershipAllowedMAE":0.0368625})%"); + lines.push_back(R"%({"sample":{"board":"...XXXOOX........../...XXOOXXXX.....XX./....XOOXOOX....X..X/...X.O.OO.XX..XX.X./...XOOOXXX..XXOX.XX/..XXXXOO.XXX.OOOXXO/...OOXO.OXOXOOXXOO./.X...XOOOOOOO.XOOO./...X.XXOX.X.X.XOO.O/..OXOOXOX.X.X.XO.OO/.OOXXXOOOOXOOXOOOOX/..X...X.OXXOOOXXOXX/...XXXXXXOXOXOOXX.X/.XXOOXOOOOOOXX.X.XX/XOO..O..XO.OOXXX.XO/.XOO.O.O.XOOXXOXXOO/.XXO..OX.XXOOXOOOO./.XOO...O.....O...../.XXO.............../","hintLoc":"null","initialTurnNumber":258,"metadata":"B53BC36D88B9F755E616D215895297EC:268","moveLocs":["T13","G16","E16","N14","H8","P6","T14","T12","K16","J14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":11.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000721,0.000713,0.000713,0,0,0,0,0,0,0.000728,0.000726,0.000708,0.000712,0.000717,0.000714,0.000696,0.000717,0.000711,0.000702,0.000717,0.000716,0.000721,0,0,0,0,0,0,0,0,0.000717,0.000716,0.000724,0.000713,0.00818,0,0,0.00816,0.000713,0.000715,0.000706,0.001,0,0,0,0,0,0,0,0.000781,0.000713,0.00071,0.000866,0,0.00891,0.0094,0,0.000722,0.000714,0.000716,0,0,0,0,0,0,0,0,0,0.0087,0.0089,0,0,0.00901,0,0.00909,0.000721,0.000712,0.000767,0,0,0,0,0,0,0,0.000854,0.00927,0,0,0,0,0.00891,0,0,0.000717,0.000733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000712,0.00074,0.00901,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000729,0,0.00151,0.00863,0.009,0,0,0,0,0,0,0,0,0.0431,0,0,0,0,0,0.000715,0.00107,0.00901,0,0.00903,0,0,0,0,0.00713,0,0.00998,0,0.00625,0,0,0,0,0,0.000736,0.0081,0,0,0,0,0,0,0,0.00641,0,0.00334,0,0.035,0,0,0,0,0,0.00793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000717,0.0091,0,0.00907,0.00835,0.00854,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000736,0.00208,0.00915,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000111,0,0.00904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00137,0,0,0,0,0,0.0445,0.0877,0,0.000751,0.000869,0,0,0,0,0,0,0,0,0.00134,0,0,0.00964,0,0,0,0.00206,0,0.000789,0,0.00114,0,0,0,0,0,0,0,0,0,0,0.000717,0,0,0,0.00314,0.000752,0,0,0.000747,0,0,0,0,0,0,0,0,0,0.00073,0.0007,0,0,0,0.000714,0.000744,0.00218,0,0.00463,0.000709,0.000731,0.00378,0.11,0,0.0623,0.0411,0.00175,0.00165,0.000775,0.000718,0,0,0,0.000699,0.0007,0.00071,0.000761,0.000715,0.000717,0.000719,0.000756,0.00239,0.00883,0.0132,0.00658,0.00148,0.000891,0.000715,0.221],"winrateAvg":0.999833,"leadAvg":11.4173,"scoreMeanAvg":11.3805,"scoreStdevAvg":1.06637,"shorttermWinlossErrorAvg":0.0052467,"shorttermScoreErrorAvg":0.480611,"ownership":[-99,-99,-99,-100,-100,-100,100,100,-100,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-100,-100,100,100,-100,-100,-100,-100,-99,-99,-99,-99,-99,-100,-100,-99,-99,-99,-99,-99,-100,100,100,-100,100,100,-100,-99,-99,-99,-99,-100,-99,-99,-100,-99,-99,-99,-100,-100,100,100,100,100,-100,-100,-100,-99,-99,-100,-100,-99,-100,-99,-99,-99,-99,-100,100,100,100,-100,-100,-100,-100,-99,-100,-100,100,-100,-99,-100,-100,-99,-99,-100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-99,-99,-99,-97,-97,-100,100,99,100,-100,100,-100,100,100,98,98,100,100,-100,-99,-100,-99,-99,-98,-100,100,100,100,100,100,100,100,99,98,100,100,100,100,-99,-98,-99,-100,-99,-100,-100,100,98,99,98,99,98,99,98,100,100,99,100,-98,-98,-97,-100,-98,-98,-100,100,98,99,98,99,98,99,98,100,99,100,100,-99,-97,-97,-100,-100,-100,100,100,100,100,98,100,100,99,100,100,100,100,-100,-99,-99,-100,-99,-99,-99,-100,-100,100,98,98,100,100,100,-100,-100,100,-100,-100,-99,-98,-99,-100,-100,-100,-100,-100,-100,100,97,100,-100,100,100,-100,-100,-100,-100,-99,-100,-100,100,100,-100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,100,100,98,98,100,98,98,96,100,99,100,100,-100,-100,-100,-100,-100,100,-99,-100,100,100,98,100,98,100,98,97,100,100,-100,-100,100,-100,-100,100,100,-99,-100,-100,100,98,98,100,98,99,97,97,100,100,-100,100,100,100,100,99,-98,-100,100,100,98,98,98,100,98,98,98,99,97,100,99,98,99,98,99,-99,-100,-100,100,99,99,99,99,99,99,99,98,98,98,99,98,99,99,99],"ownershipAllowedMAE":0.0111081})%"); + lines.push_back(R"%({"sample":{"board":".................X./.X..........X.XOX.X/.O..X..O.X.OX.XOOX./.XOOO...OX.XXOXO.OX/X.XO.....OO.O.OXXX./.XXXO......OO.OOX.X/..XOO.......XOOOOX./.XOX.........O.XX.X/..OXXO..........XX./...XOO.......O.X.XO/..X............OXO./....OO..XO.....OXO./..OO.XO.O.OO.XO.O../.X.XOXO..X...XXOO../...X.XX..XO..OOX.../.........X.O.OXX.../..OX......XO.XO.X../..............X..../.................../","hintLoc":"null","initialTurnNumber":144,"metadata":"60615E89F09E85F5B3A3070F10F348C7:154","moveLocs":["B4","D2","E3","E2","F2","C18","A17","E7","B7","E5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":6.0,"policyOptimism":0.093,"pda":1.97,"policyMixture":[2.11e-06,2.34e-06,2.93e-06,2.44e-06,2.66e-06,2.48e-06,2.67e-06,2.75e-06,2.69e-06,2.47e-06,2.15e-06,2.05e-06,2.1e-06,2.13e-06,2.06e-06,2.06e-06,2.08e-06,0,2.01e-06,2.4e-06,0,0,1.74e-05,3.05e-06,2.63e-05,8.67e-06,5.37e-05,3.23e-06,2.51e-06,2.33e-06,2.2e-06,0,2.11e-06,0,0,0,2.1e-06,0,0,0,0.00394,2.56e-06,0,1.39e-05,0.000103,0,0.000408,0,2.36e-06,0,0,2.4e-06,0,0,0,0,2.09e-06,2.21e-06,0,0,0,0,0.00158,6.02e-06,7.02e-06,0,0,2.31e-06,0,0,0,0,0,2.05e-06,0,0,0,2.15e-06,0,0,7.82e-06,0.000195,3.49e-06,4.43e-06,6.15e-06,0,0,2.2e-06,0,2.36e-06,0,0,0,0,2.08e-06,2.06e-06,0,0,0,0,3.97e-06,2.91e-06,2.74e-06,2.55e-06,2.32e-06,2.28e-06,0,0,2.04e-06,0,0,0,2.11e-06,0,2.1e-06,2.22e-06,0,0,0,5.8e-06,2.9e-06,2.49e-06,2.35e-06,2.25e-06,2.19e-06,2.13e-06,0,0,0,0,0,0,2.08e-06,2.01e-06,0,0,0,3.59e-05,0.000239,2.91e-06,2.5e-06,2.28e-06,2.19e-06,2.18e-06,2.14e-06,2.44e-06,0,2.23e-06,0,0,2.02e-06,0,1.96e-06,2.29e-06,0,0,0,0,2.43e-06,2.33e-06,2.24e-06,2.19e-06,2.21e-06,2.41e-06,1.91e-05,0.000122,2.68e-06,2.09e-06,0,0,2.29e-06,2.03e-06,2.36e-06,2.6e-06,0,0,0,2.16e-06,2.41e-06,2.55e-06,2.32e-06,2.32e-06,2.31e-06,7e-06,0,0.000741,0,4.02e-06,0,0,2.18e-06,2.39e-06,0,2.87e-06,3.04e-06,2.52e-06,2.51e-06,2.91e-06,3.46e-06,4.68e-06,2.5e-06,2.43e-06,2.67e-06,2.87e-05,3.87e-05,0,0,0,2.37e-06,2.3e-06,2.46e-06,2.72e-06,1.97e-06,0,0,4.9e-05,1.25e-05,0,0,3.67e-06,3.29e-06,4.57e-06,1.65e-05,3.17e-05,0,0,0,2.09e-06,2.11e-06,0,0,0,0,0,0,2.67e-05,0,0.00106,0,0,2.88e-06,0,0,0,0,2.51e-06,2.18e-06,2.13e-06,0,2.4e-06,0,0,0,0,0.00136,8.08e-05,0,0.000305,1.78e-05,6.34e-05,0,0,0,0,2.8e-06,2.38e-06,2.16e-06,2.34e-06,2.66e-06,0,0,0,0,0.000165,2.43e-06,0,0,0.00564,0.000253,0,0,0,3.27e-06,3.36e-06,2.46e-06,2.34e-06,0,7.68e-06,0.0634,0.294,0.336,1.62e-05,5.7e-06,2.57e-06,0,0.000189,0,2.83e-05,0,0,0,2.27e-06,2.94e-06,2.62e-06,2.38e-06,3.76e-06,0,0,0,0.288,0.00112,7.11e-06,2.88e-06,2.58e-06,0,0,1.03e-05,0,0,2.95e-06,0,2.57e-06,2.39e-06,2.42e-06,2.67e-06,3.34e-06,0,0,0,6.7e-06,4.65e-06,2.73e-06,3.23e-06,4.11e-06,3.37e-05,4.44e-06,2.7e-06,0,2.26e-06,2.26e-06,2.41e-06,2.08e-06,2.06e-06,2.5e-06,2.3e-06,2.45e-06,4.28e-06,3.02e-06,2.32e-06,2.37e-06,2.27e-06,2.37e-06,2.58e-06,2.38e-06,2.37e-06,2.55e-06,2.22e-06,2.18e-06,2.08e-06,2.16e-06,1.86e-06,3.5e-06],"winrateAvg":0.135278,"leadAvg":-2.10031,"scoreMeanAvg":-3.29107,"scoreStdevAvg":7.24226,"shorttermWinlossErrorAvg":0.166581,"shorttermScoreErrorAvg":1.35628,"ownership":[-36,29,37,54,50,49,27,3,-40,-59,-71,-86,-94,-97,-97,-98,-98,-100,-98,-78,-78,77,49,60,54,74,-38,-50,-73,-78,-93,-100,-97,-99,-96,-100,-99,-100,-95,57,57,83,51,74,75,94,-31,-94,-87,-84,-100,-64,-99,-96,-96,-100,-99,-93,-98,97,97,97,80,84,86,94,-94,62,-99,-100,76,-99,-96,-99,-97,-100,-99,-96,-100,97,95,86,86,89,92,99,100,26,100,77,100,-100,-100,-100,-99,-98,-99,-100,-99,97,88,89,91,92,94,96,100,100,97,100,100,-100,-99,-100,-98,-98,-100,97,97,88,90,92,93,94,94,96,92,100,100,100,100,-100,-99,-97,-99,-94,-98,-8,81,91,93,94,94,94,94,95,100,8,-100,-100,-99,-100,-96,-97,-94,-97,-97,99,93,93,94,94,94,93,93,39,-12,-75,-100,-100,-87,-93,-95,-97,-97,99,99,93,93,93,94,94,94,93,98,-45,-96,-59,-100,64,-92,-93,-98,67,78,93,92,90,93,94,93,93,92,91,90,98,-60,96,63,-91,-89,62,71,100,100,91,89,81,97,93,93,92,91,92,98,-2,96,82,-92,-98,99,99,99,-94,93,79,88,-58,98,98,92,86,97,96,98,89,77,-92,-98,33,-94,99,-95,93,17,-14,-97,-29,87,90,86,88,98,98,76,56,-92,-91,-77,-96,98,-96,-96,3,-45,-97,80,69,87,95,95,-95,21,-8,23,-88,-96,-82,-68,-22,-72,-81,-80,-69,-96,-33,96,77,95,-95,-96,-52,-1,-35,-85,-79,-76,-98,-98,-95,-81,-80,-77,-80,-92,96,49,-68,-68,-93,-96,-89,-54,-82,-80,-82,-78,-79,-97,-86,-84,-79,-72,-53,39,32,17,-91,-87,-90,-83,-80,-83,-81,-81,-83,-90,-90,-88,-82,-72,-51,0,33,32,-9,-40,-84,-86,-86,-83],"ownershipAllowedMAE":0.0351693})%"); + lines.push_back(R"%({"sample":{"board":".............X...../....OOOOX..XX.XOOO./.O.X.XOXX.OOXXOXXXO/.XX..XXO.X..XOOOOX./.......O..X.OX..XO./............O....../................O../..O................/.....O........XXX../............X.OOX../..O......XXX..OX.X./..........OXO.OXX../...O......OX...XOO./..XO.....XOOXXOO.../....X...X.O.OX.X.../...O.O.OOX.OOXX.XX./..O..O.XXX.OOXOXX.X/...X.X....O.XOOOOXO/.................../","hintLoc":"null","initialTurnNumber":127,"metadata":"6BE3A3971F447B2DA6543A8380DA3FCD:137","moveLocs":["B15","C15","B14","C14","A16","B18","C13","E2","E4","A18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.8,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1button1","komi":32.5,"policyOptimism":0.901,"pda":0.0,"policyMixture":[2.2e-05,3.06e-05,2.2e-05,1.88e-05,1.91e-05,1.95e-05,1.72e-05,2.15e-05,2.22e-05,2.07e-05,2.06e-05,2.1e-05,1.86e-05,0,3.25e-05,2.12e-05,1.95e-05,1.73e-05,1.73e-05,0,0,0.0115,0.000366,0,0,0,0,0,2.61e-05,4.14e-05,0,0,0,0,0,0,0,1.75e-05,2.07e-05,0,0.00235,0,0.000174,0,0,0,0,4.05e-05,0,0,0,0,0,0,0,0,0,0,0,0,0.000456,6.29e-05,0,0,0,0.000295,0,2.38e-05,3.68e-05,0,0,0,0,0,0,4.42e-05,2.19e-05,0,0,3.96e-05,0.152,0.000271,0.0153,0,2.49e-05,0.000343,0,0.000215,0,0,2.12e-05,2.32e-05,0,0,1.9e-05,1.87e-05,0,0,0.0677,0.000212,0.0704,0.00036,2.76e-05,0.00014,0.00204,0.000195,2.19e-05,0,5.55e-05,0.000272,7.32e-05,3.46e-05,2.19e-05,1.91e-05,2.21e-05,2.22e-05,0,2.55e-05,6.64e-05,0.000417,0.000333,0.000172,9.6e-05,0.00018,3.98e-05,3.41e-05,2.84e-05,0.0332,0.0377,0.000526,0,2.95e-05,2.13e-05,1.97e-05,2.61e-05,0,2.23e-05,3.03e-05,3.45e-05,0.000137,0.0003,0.000175,6.17e-05,3.44e-05,3.3e-05,3.16e-05,0.000185,3.56e-05,2.17e-05,2.78e-05,2.75e-05,2.08e-05,1.78e-05,1.99e-05,2.07e-05,2.37e-05,2.56e-05,0,3.83e-05,0.000419,0.000134,4.07e-05,3.12e-05,2.87e-05,2.54e-05,0.000185,0,0,0,2.07e-05,2.16e-05,1.81e-05,2.04e-05,2.05e-05,2.38e-05,2.68e-05,2.87e-05,0.000101,0.00136,0.000117,2.49e-05,2.05e-05,2.12e-05,0,2.19e-05,0,0,0,1.7e-05,2.07e-05,1.84e-05,2e-05,0,2.33e-05,2.75e-05,3.76e-05,0.000267,0.000617,9.93e-05,0,0,0,1.95e-05,1.55e-05,0,0,0,0,1.93e-05,1.78e-05,1.92e-05,1.98e-05,2.18e-05,2.55e-05,3.51e-05,0.000276,0.0102,0.0102,2.68e-05,0,0,0,1.63e-05,0,0,0,3.78e-05,1.81e-05,1.82e-05,1.94e-05,2.11e-05,0,2.26e-05,3.29e-05,0.000133,0.000376,0.00162,2.6e-05,0,0,2.25e-05,1.92e-05,0.00026,0,0,0,1.72e-05,1.81e-05,1.95e-05,0,0,2.25e-05,2.87e-05,0.000112,9.66e-05,2.24e-05,0,0,0,0,0,0,0,2.1e-05,1.87e-05,1.82e-05,1.84e-05,1.97e-05,2.17e-05,2.4e-05,0,2.56e-05,2.87e-05,0.00593,0,0.11,0,1.72e-05,0,0,1.81e-05,0,1.86e-05,1.92e-05,1.83e-05,1.86e-05,2.15e-05,1.9e-05,0,0,0,6.3e-05,0,0,0,1.96e-05,0,0,0,0,0,0,0,3.17e-05,1.96e-05,2.34e-05,0,1.78e-05,1.71e-05,0,0.0775,0,0,0,1.68e-05,0,0,0,0,0,0,0,0,1.95e-05,2.85e-05,0.0223,0,0,0,0.000266,2.19e-05,2.79e-05,0.046,0,2.04e-05,0,0,0,0,0,0,0,1.71e-05,2.13e-05,2.11e-05,1.65e-05,2.1e-05,2.4e-05,3.69e-05,0.142,0.159,0.00637,2.45e-05,1.95e-05,2.26e-05,1.66e-05,1.75e-05,1.69e-05,1.87e-05,0.000837,1.59e-05,1.87e-05],"winrateAvg":0.12791,"leadAvg":-3.00418,"scoreMeanAvg":-3.77841,"scoreStdevAvg":9.13991,"shorttermWinlossErrorAvg":0.14049,"shorttermScoreErrorAvg":1.28255,"ownership":[-95,-94,-93,-93,-93,-93,-93,-94,-96,-97,-97,-97,-97,-97,-49,70,96,98,98,-97,-97,-92,-94,-91,-91,-90,-91,-99,-95,-95,-99,-99,-95,-94,99,99,99,98,-86,-82,-93,-98,-91,-98,-89,-99,-99,-94,-87,-86,-99,-99,99,98,98,98,99,-21,-98,-98,-68,-63,-97,-97,32,-12,-98,-92,-90,-99,98,99,99,99,97,98,-17,87,-98,-24,2,-18,-8,31,-7,-24,-97,-21,51,22,46,54,21,97,80,63,88,-97,-3,-1,15,-4,-2,-4,0,-25,-1,53,35,10,31,39,13,56,86,89,97,28,14,14,9,2,0,2,-7,-9,-1,0,13,-16,71,6,15,89,92,97,48,34,28,15,8,1,-2,-6,-9,-14,-19,-36,-36,-31,-18,-22,89,89,76,55,47,84,23,7,-3,-11,-14,-20,-32,-22,-100,-100,-100,-63,-53,88,89,76,54,41,22,-10,-4,-12,-33,-42,-52,-99,-96,-94,-94,-100,-87,-77,88,89,97,50,32,16,-1,-10,-29,-99,-100,-100,-97,-96,-94,-99,-99,-99,-93,86,87,84,54,33,16,5,4,-10,-38,91,-100,-95,-96,-94,-99,-99,-95,-95,85,85,87,97,40,20,9,7,2,6,93,-100,-97,-97,-96,-99,-94,-93,-94,84,84,79,97,47,28,13,5,-11,-50,93,93,-99,-99,-94,-94,-96,-94,-93,83,83,84,69,24,50,20,-2,-45,-1,92,92,97,-99,-97,-99,-97,-95,-93,81,83,82,98,98,97,52,72,66,-92,-9,98,98,-99,-99,-99,-99,-99,-91,74,80,95,2,-1,97,6,-93,-93,-93,-10,98,98,-99,95,-99,-99,-58,-90,58,55,-30,-89,-89,-90,-83,-85,-59,-49,96,95,93,95,95,94,94,-58,-37,25,-20,-45,-66,-83,-84,-77,-52,-23,24,56,90,93,88,59,39,-2,-6,-40],"ownershipAllowedMAE":0.0315187})%"); + lines.push_back(R"%({"sample":{"board":"..O................/.OX.XXOOX..OXX...../..OXOO.O..X.OXXOXX./.XO.X.OO.X..OOOXXO./.OO..XXO.......XO../..OXX..XX......XO../.XXXXO........XXO../.XOXOX...X.XX.OXXO./OO.OO.XOOX..OO..XO./XXO..XX.XO.O...OXO./.XOXX.OXXOOXX.OXXO./.XXO..OOXO.X..XOXXO/.XOOO.OXXO..X.XOXOO/..XXXOOX.OO..XXOOO./.X.X.XO.XXOXX.XXO../.XOXXOOOOOOOOXOOXX./.OOOO...XXOXXXOXOX./..........OOXOO.OX./............O....O./","hintLoc":"null","initialTurnNumber":211,"metadata":"75FD77DB32455B9E3D9319FA6696B6B6:221","moveLocs":["D16","S15","S14","T16","K18","L18","J17","K17","P10","M6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":-7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000172,0.000184,0,0.000179,0.000186,0.000187,0.000186,0.000204,0.312,0.00247,0.000282,0.000197,0.000326,0.000212,0.000192,0.000179,0.000175,0.000177,0.000175,0.00018,0,0,0.000233,0,0,0,0,0,0,0,0,0,0,0.000203,0.000205,0.000178,0.00018,0.000181,0.000183,0.000188,0,0,0,0,0.000195,0,0,0,0,0.000186,0,0,0,0,0,0,0.000207,0.000186,0,0,0,0,0.00204,0,0,0.000204,0,0.000172,0.000169,0,0,0,0,0,0,0,0.000229,0,0,0.000247,0.000231,0,0,0,0.043,0.00552,0.000177,0.000173,0.000169,0.000171,0.000176,0,0,0,0.000175,0.000288,0.00026,0,0,0,0.0002,0.000207,0,0,0.00019,0.000182,0.000173,0.000165,0.000165,0.000172,0,0,0,0.0163,0.000597,0,0,0,0,0,0.000233,0.000608,0.000224,0.000192,0.000176,0.000173,0.000172,0.000792,0,0,0,0.000419,0.000511,0.000198,0,0,0,0,0,0.00805,0.00905,0.00025,0,0.000191,0,0,0.172,0,0,0,0,0.00021,0,0,0.000183,0,0,0.00132,0,0,0,0,0.00558,0.000315,0,0,0.000203,0.000208,0,0,0.000154,0,0,0,0.000182,0.00357,0,0,0.014,0,0,0.000255,0,0.000262,0.000193,0,0,0,0,0.000175,0.000182,0,0,0,0,0.169,0,0,0,0,0,0,0,0.103,0,0,0,0,0.000307,0.000192,0,0,0,0.0015,0.000201,0,0,0,0,0.000292,0,0.000176,0.00334,0,0,0,0,0,0.000194,0,0,0,0,0.000227,0,0,0,0,0.000897,0.000692,0,0.00019,0,0,0,0,0,0.000371,0.000749,0,0,0,0,0,0,0.0386,0,0,0,0,0,0,0,0,0,0.000148,0.000226,0,0.000288,0,0.00026,0,0,0.049,0,0,0,0,0,0.00525,0,0,0,0.000216,0.000209,0.00348,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000198,0.00267,0,0,0,0,0.000183,0.000176,0.00018,0,0,0,0,0,0,0,0,0,0,0.000173,0.000237,0.000229,0.000225,0.000186,0.000182,0.000181,0.000178,0.000177,0.000182,0.000181,0,0,0,0,0,0.000179,0,0,0.000192,0.000196,0.000228,0.000195,0.000184,0.000179,0.000176,0.000176,0.000174,0.000176,0.000176,0.000178,0.000184,0,0.000186,0.00018,0.00017,0.000194,0,0.000165,0.000155],"winrateAvg":0.000715837,"leadAvg":-11.5575,"scoreMeanAvg":-11.5328,"scoreStdevAvg":3.22173,"shorttermWinlossErrorAvg":0.00933069,"shorttermScoreErrorAvg":0.959426,"ownership":[96,96,100,96,96,96,96,93,95,-29,-72,-79,-91,-94,-95,-96,-96,-96,-96,95,100,97,99,93,93,100,100,80,87,-99,-74,-100,-100,-96,-96,-96,-95,-96,94,95,100,97,99,99,96,100,100,-100,-100,-96,-92,-100,-100,-95,-100,-100,-95,94,90,100,100,-89,-62,100,100,8,-100,-95,-96,-93,-92,-91,-100,-100,-93,-99,95,100,100,37,-53,-100,-100,100,28,-95,-95,-95,-96,-96,-96,-100,98,-96,-72,4,-4,100,-100,-100,-96,-96,-100,-100,-94,-95,-95,-95,-96,-96,-100,97,97,-68,-71,-100,-100,-100,-100,-92,-96,-95,-95,-94,-95,-94,-95,-98,-100,-100,97,97,40,-96,-100,-94,-100,-93,-99,-95,-96,-96,-100,-95,-100,-100,63,87,-100,-100,98,87,-93,-93,-97,-93,-93,-96,-100,-93,-93,-100,-68,33,99,99,60,-40,-100,98,90,-100,-100,-94,-96,-98,-100,-100,-99,-99,100,97,99,-6,27,97,97,-100,98,93,-96,-100,-94,-99,-99,64,100,-99,-99,100,100,-100,-100,37,97,-100,-100,98,95,-96,-100,-100,98,-76,44,100,100,-99,100,24,-100,-99,-99,-100,99,-100,-100,98,-96,-100,99,98,99,98,100,-99,-99,100,35,-86,-100,-99,-100,98,-100,98,98,-97,-99,-100,-100,-100,100,100,-99,3,100,100,-100,-99,-100,-100,99,98,98,92,-93,-100,20,-100,-21,-25,100,46,-28,-26,100,-100,-100,2,-100,-100,98,92,92,-66,-100,100,-100,-100,100,100,100,100,100,100,100,100,-9,100,100,90,89,92,-60,100,100,100,100,97,96,96,91,91,100,56,56,53,100,95,100,89,93,76,81,95,95,96,96,95,95,95,95,100,100,58,100,100,97,100,90,95,76,89,92,95,95,95,95,95,95,95,95,95,100,95,95,96,97,99,94],"ownershipAllowedMAE":0.040313})%"); + lines.push_back(R"%({"sample":{"board":"...OO.OX.XXXO....../..OXOOX..X.OOXOOOO./..OXOXXX.XXXOOXO..O/..OXXXOOXXOXXXXXOO./.OOX.O.OOOOOOOXOOXO/.OXXXOOOXXXX.OXXOX./O.OOXOO.O.XOOO.XX.X/.OOXXOXO.OXXOXX.X../OXXOOOXOO.XOXX...../....OXXXXXX.OOX.O../...XOOOXOOOO.OOX.../..OXOOX.X...OXX.X../..OOXX...XXXXX.XXO./.OXX.XXXXXOO.OXX.X./OOX.X...XOO.OOX.XO./XOOOOOOOOXOOOXX..X./XOXXXXOXXXOOOOXXX.X/XX.XXOO..O.OXXX..X./..X.XXO....OOX...../","hintLoc":"null","initialTurnNumber":211,"metadata":"30B92E505E94CE6AE56754D68549E9F4:221","moveLocs":["C19","T14","T16","F19","D5","E6","G19","P13","F19","E15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.16,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.769,"pda":0.0,"policyMixture":[0.000804,0.000821,0,0,0,0,0,0,0.0182,0,0,0,0,0.135,0.000977,0.000831,0.00081,0.000805,0.000794,0.000805,0.000808,0,0,0,0,0,0.0192,0.0191,0,0.000247,0,0,0,0,0,0,0,0.00229,0.000806,0.000815,0,0,0,0,0,0,0.0192,0,0,0,0,0,0,0,0.00584,0.0072,0,0.00082,0.000832,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000833,0,0,0,0,0,0.000615,0,0,0,0,0,0,0,0,0,0,0,0,0.00186,0,0,0,0,0,0,0,0,0,0,0,0.204,0,0,0,0,0,0,0,0.00903,0,0,0,0,0,0.00286,0,0.0531,0,0,0,0,0,0,0,0.0199,0,0.00873,0,0,0,0,0,0,0,0.000252,0,0,0,0,0,0,0.000829,0,0.0204,0.0201,0,0,0,0,0,0,0,0,0,0.0687,0,0,0,0,0.000907,0.00086,0.000832,0.000948,0.000819,0.000831,0.00577,0.00707,0.00903,0,0,0,0,0,0,0,0.0157,0,0,0,0.0011,0,0.000851,0.000818,0.000811,0.000838,0.00897,0,0,0,0,0,0,0,0,0,0.000824,0,0,0,0.000829,0.000837,0.000804,0.000822,0.000873,0,0,0,0,0,0.0202,0,0.000826,0.000816,0.000819,0,0,0,0,0,0.000839,0.000811,0.000835,0.00865,0,0,0,0,0.0183,0.0167,0.000835,0,0,0,0,0,0,0,0,0,0.000804,0.00086,0,0,0,0,0,0,0,0,0,0,0,0.0485,0,0,0,0,0,0.000802,0,0,0,0,0,0.0391,0.0381,0.0374,0,0,0,0.000724,0,0,0,0.0008,0,0,0.000791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00081,0.000805,0,0.000779,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00859,0.00879,0,0.00752,0,0,0,0,0.000785,0.000782,0,0.000763,0.00078,0.000775,0,0,0,0,0,0.000825,0.000804,0.000827,0.000823,0,0,0,0.000774,0.000784,0.000758,0.000762,0.000767,0.014],"winrateAvg":0.00019172,"leadAvg":-13.033,"scoreMeanAvg":-13.0141,"scoreStdevAvg":0.921789,"shorttermWinlossErrorAvg":0.00426207,"shorttermScoreErrorAvg":0.398475,"ownership":[99,99,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,99,99,100,-100,100,100,-100,-100,-100,-100,-80,100,100,100,100,100,100,100,100,99,99,100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,100,100,100,100,99,99,100,-100,-100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,99,100,100,-100,-100,100,100,100,100,100,100,100,100,100,-100,100,100,-100,100,99,100,-100,-100,-100,100,100,100,-100,-100,-100,-100,75,100,-100,-100,100,-100,-100,100,99,100,100,-100,100,100,100,100,41,-100,100,100,100,-100,-100,-100,-99,-100,99,100,100,-100,-100,100,-100,100,100,100,-100,-100,100,-100,-100,-98,-100,-99,-99,100,95,95,100,100,100,-100,100,100,-9,-100,-99,-100,-100,-98,-98,-98,-98,-98,97,97,97,97,100,-100,-100,-100,-100,-100,-100,-99,-98,-98,-100,-98,-96,-97,-98,97,97,97,95,100,100,100,-100,-97,-97,-97,-97,-99,-98,-98,-100,-97,-97,-98,98,98,100,96,100,100,-100,-99,-100,-98,-98,-98,-98,-100,-100,-99,-100,-98,-98,98,98,100,100,-100,-100,-99,-100,-99,-100,-100,-100,-100,-100,-99,-100,-100,-97,-98,98,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-35,100,-100,-100,-99,-100,-98,100,100,-100,100,-100,-6,27,-29,-100,100,100,100,100,100,-100,-100,-100,-98,-98,-100,100,100,100,100,100,100,100,100,97,100,100,100,-100,-100,-100,-100,-100,-99,-100,100,-100,-100,-100,-100,100,96,96,96,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,97,97,100,98,100,-100,-100,-100,-100,-99,-100,-99,-100,-100,-100,-100,-100,-100,100,98,98,98,99,100,100,-100,-100,-99,-100,-100,-100],"ownershipAllowedMAE":0.0147088})%"); + lines.push_back(R"%({"sample":{"board":".........X.O.XOX.X./.XXXX.XOOOOOX.OXXOO/OOOX.X.XXOOXOOOXXO./OXXOX.XXO.OXXXO.XXO/O.XOXXOOXOOOOXOOXO./.XXOOOO.XXXOXXXXOOO/OXOO...OOOXO.XOOOO./.OXXO..XXOXOXXOXOX./.OOX.OOOOXXX.XOXXX./.OX.OX.XOX.XXXOX.X./.OO.XX.OXXXXOOOOX.X/.XO....OXOOOOX..OX./.OXX.X.OXXXO..X..X./.XX.XOOOOX..OX...../.X.XOOXOXX..O.XXX../.XXOOX.OXXOO.XXO.../XOOX.XOOOX...OX.O../...O..OXOXOO.OXX.../........X....OOX.../","hintLoc":"null","initialTurnNumber":120,"metadata":"886BE427E28F78B7E68291AF25709BB1:130","moveLocs":["A2","A4","B2","A7","H1","K1","G10","Q7","Q8","H19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.77,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1button1","komi":-44.5,"policyOptimism":0.276,"pda":0.0,"policyMixture":[6.43e-05,6.81e-05,6.34e-05,6.08e-05,6.02e-05,0.000232,0.00314,0,0.884,0,0.000312,0,0.000727,0,0,0,0,0,3.27e-05,0.000385,0,0,0,0,6.17e-05,0,0,0,0,0,0,0,3.31e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.52e-05,0,0,0,0,0,0,0,0,0,0.000223,0,0,0,0,0,3.11e-05,0,0,0,0,5.66e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.43e-05,6.21e-05,0,0,0,0,0,0,0.000164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.45e-05,6.16e-05,6.98e-05,0,0,0,0,0,5.81e-05,0,0,0,0,0,7.21e-05,6.3e-05,0,0,0,0,6.23e-05,6.99e-05,0,0,0,0,0,0,0,0,0,0,0,0.000107,6.34e-05,0,0,0,6.03e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,6.6e-05,6.62e-05,0,0,6.62e-05,0,0,0,6.28e-05,0,0,0,0,0,0,0,0,0,0,6.07e-05,0.000206,0,0,0.00213,0,0,0.000111,0,0,0,0,0,0,0,0,0,0,0,0,8.83e-05,0,0,0.0601,0.0101,0.00095,0.0002,0,0,0,0,0,0,0,0.00129,0,0,0,5.81e-05,0,0,0,0,0.000389,0,0.000225,0,0,0,0,0,0.000163,0.000586,0,0,0.027,0,5.75e-05,6.53e-05,0,0,0,0,0,0,0,0,0,7.52e-05,8.98e-05,0,0,6.48e-05,6.32e-05,0.000292,6.34e-05,5.84e-05,5.83e-05,0,0,0,0,0,0,0,0,0,0.0005,6.55e-05,0,7.91e-05,0,0,0,6.11e-05,5.85e-05,0,0,0,0,0,0,6.26e-05,0,0,0,0,0,0.00113,0,0,0,5.93e-05,6.26e-05,6e-05,0,0,0,0,6.16e-05,0,0,0,0,0,0.000359,6.56e-05,8.02e-05,0,0,5.78e-05,0,6.06e-05,6.09e-05,0,0,6.4e-05,0,6.09e-05,6.2e-05,0,6.48e-05,0,0,0,0,6.74e-05,0,0,0,6.62e-05,6.17e-05,6.25e-05,6.07e-05,6.21e-05,6.06e-05,6.19e-05,6.09e-05,6.14e-05,5.99e-05,0,0,0,0.000276,7.12e-05,6.83e-05,0,0,0,5.89e-05,6.35e-05,6.09e-05,5.04e-05],"winrateAvg":0.249342,"leadAvg":-0.74121,"scoreMeanAvg":-1.03338,"scoreStdevAvg":3.31786,"shorttermWinlossErrorAvg":0.239671,"shorttermScoreErrorAvg":1.00899,"ownership":[-34,-53,-93,-99,-99,-99,-91,-95,97,94,98,100,98,98,99,98,98,98,99,-1,-100,-100,-100,-100,-100,-100,99,99,100,100,100,98,98,99,98,98,99,99,99,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,100,99,99,98,98,99,99,99,99,99,100,-100,-100,-100,-100,-15,-19,100,-100,-100,-100,100,99,98,98,100,99,99,99,100,-100,-100,100,100,-100,100,100,99,99,-100,100,99,98,100,99,99,99,99,100,100,100,100,-64,-100,-100,-100,99,-100,-100,-100,-100,100,100,100,100,99,100,100,100,100,100,100,100,100,-100,99,-74,-100,100,100,100,100,38,99,100,100,99,100,100,100,100,100,100,-100,99,-100,-100,100,-100,100,-100,-9,99,100,100,99,100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-80,92,100,100,100,100,-99,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-99,43,100,100,-56,-99,-99,34,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-6,-93,100,19,-81,-57,8,100,-100,100,100,100,100,-95,-23,100,100,-100,-100,-98,-94,-100,-100,-99,-99,35,100,-100,-100,-100,100,72,-45,-100,-100,45,-100,-100,-98,-100,-100,-99,-100,100,100,100,100,-100,-67,14,100,-98,-97,-97,-98,-100,-100,-99,-100,-100,-100,100,100,100,100,-100,-100,9,81,100,-17,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,22,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-54,82,40,99,-100,-100,-99,-100,-100,100,100,100,100,100,100,100,99,100,-100,99,99,97,99,-100,-100,-100,-100,-100,100,100,100,100,100,100,98,99,-100,-100,-56,70,93,99,99,-100,-100,-100,-100],"ownershipAllowedMAE":0.0149037})%"); + lines.push_back(R"%({"sample":{"board":".................../..O.OXX.OOX...XOO../.X.XOXO.OX...OXXO../...XOX...X.....X.O./....O.X........X.O./..X.........X..X.X./....O.X...X...OX.../.XXO........O.OOX../.OO...........OXX../....O.......OXXOOX./............O....O./...............O.../.................../.X................./...O.............../..XO...X.XX...O.O../..XO...O..OX..OX.../.................../.................../","hintLoc":"null","initialTurnNumber":40,"metadata":"C9036433F535D34BB85607D9116FDC80:50","moveLocs":["G3","C17","C16","B18","B16","D15","D11","D10","D14","F15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.12,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.38e-06,4.24e-06,6.65e-06,9.6e-06,6.6e-05,1.41e-05,5.29e-06,4.27e-06,4.74e-06,4.76e-06,4.04e-06,3.79e-06,3.67e-06,3.83e-06,3.7e-06,1.16e-05,3.34e-06,3.82e-06,3.34e-06,4.89e-06,0,0,0.134,0,0,0,7.42e-06,0,0,0,3.79e-06,3.88e-06,3.63e-06,0,0,0,8.4e-06,4.11e-06,3.98e-06,0,0,0,0,0,0,0.000981,0,0,4.05e-06,4.24e-06,3.75e-06,0,0,0,0,3.61e-06,3.89e-06,3.32e-06,0,0,0,0,0,0.183,0.417,0.0946,0,4.01e-06,4.12e-06,3.88e-06,3.58e-06,3.43e-06,0,3.42e-06,0,3.42e-06,4.02e-06,4.46e-06,2.83e-05,0,0,0,0,0.085,5.38e-05,6.05e-06,4.29e-06,4.2e-06,3.95e-06,3.75e-06,3.31e-06,0,3.34e-06,0,4.94e-06,6.93e-06,1.4e-05,0,0,0.0469,8.97e-06,0.00366,0.000322,7.63e-06,5.07e-06,4.41e-06,4.1e-06,0,3.77e-06,4.06e-06,0,3.51e-06,0,3.78e-06,4.09e-06,7.26e-06,3.78e-06,0.0302,0,3.92e-05,0,5.56e-06,6.24e-06,4.41e-06,0,3.98e-06,3.9e-06,4.02e-06,0,0,3.38e-06,3.35e-06,3.69e-06,6.87e-06,0,0,0,0.00126,2.05e-05,4.39e-06,4.79e-06,4.59e-06,4.38e-06,4.24e-06,3.98e-06,0,4.4e-06,0,0,0,3.94e-06,4.04e-06,2.41e-05,0,0,0,3.63e-05,5.25e-05,4.34e-06,4.41e-06,4.41e-06,4.36e-06,4.39e-06,1.11e-05,5.22e-06,2.2e-05,0,0,0,3.85e-06,3.89e-06,3.71e-06,8.68e-06,4.99e-06,0,0,4.53e-06,4.19e-06,4.34e-06,4.27e-06,4.34e-06,4.38e-06,3.79e-06,0,0,0,0,0,0,3.9e-06,3.85e-06,4.28e-06,4.04e-06,3.93e-06,3.92e-06,4.19e-06,4.33e-06,4.32e-06,4.29e-06,4.33e-06,4.4e-06,3.92e-06,0,4.73e-06,4.48e-06,7.59e-05,0.000117,0,4.56e-06,3.66e-06,5.71e-06,5.06e-06,4.51e-06,4.45e-06,4.5e-06,4.38e-06,4.32e-06,4.29e-06,4.34e-06,4.35e-06,4.26e-06,6e-06,2.49e-05,0.000191,0,3.34e-05,1.4e-05,3.71e-06,3.53e-06,4.47e-06,1.95e-05,6.5e-06,4.37e-06,4.46e-06,4.35e-06,4.3e-06,4.35e-06,4.35e-06,4.46e-06,4.45e-06,4.55e-06,1.62e-05,1.32e-05,7.57e-05,4.14e-06,4.26e-06,3.68e-06,3.32e-06,0,5.32e-06,4.95e-06,4.25e-06,4.37e-06,4.37e-06,4.37e-06,4.28e-06,4.3e-06,4.27e-06,4.48e-06,4.7e-06,4.86e-06,8.73e-06,1.07e-05,4.69e-06,4.19e-06,3.55e-06,3.64e-06,3.69e-06,3.95e-06,0,3.58e-06,4.35e-06,4.84e-06,4.54e-06,3.98e-06,3.68e-06,3.65e-06,4.2e-06,4.55e-06,4.5e-06,9.83e-06,2.81e-05,1.17e-05,4.41e-06,3.63e-06,3.73e-06,3.7e-06,0,0,3.31e-06,7.71e-06,4.74e-06,0,3.94e-06,0,0,4.04e-06,4.74e-06,3.92e-06,0,0.000103,0,5.16e-06,3.68e-06,3.67e-06,3.6e-06,0,0,3.55e-06,4.97e-06,0,0,5.03e-06,4.05e-06,0,0,4.41e-06,4.19e-06,0,0,2.22e-05,4.24e-06,3.63e-06,3.6e-06,3.94e-06,7.69e-06,5.13e-06,4.36e-06,4.44e-06,4.54e-06,5.45e-06,3.86e-06,3.85e-06,3.94e-06,4.1e-06,4.44e-06,4.69e-06,1.23e-05,5.21e-06,4.09e-06,4.25e-06,3.87e-06,3.19e-06,3.58e-06,3.77e-06,3.51e-06,3.36e-06,3.64e-06,3.61e-06,3.43e-06,3.49e-06,3.42e-06,3.45e-06,3.63e-06,3.69e-06,3.71e-06,3.8e-06,4e-06,3.67e-06,3.7e-06,3.3e-06,5.8e-06],"winrateAvg":0.386159,"leadAvg":-0.917215,"scoreMeanAvg":-1.45845,"scoreStdevAvg":12.5233,"shorttermWinlossErrorAvg":0.24101,"shorttermScoreErrorAvg":2.15176,"ownership":[6,42,65,75,59,-26,-68,-76,-74,-75,-76,-77,-77,-78,-55,-44,65,80,82,-28,67,68,-57,88,-89,-89,-75,-66,-65,-86,-77,-77,-73,-97,85,84,83,80,-40,-82,70,-81,90,-89,-72,-77,-65,-93,-79,-77,-73,-58,-97,-97,84,83,81,-72,-82,-82,-82,90,-89,-84,-83,-74,-93,-73,-70,-70,-71,-78,-97,-1,85,77,-78,-76,15,91,91,89,-89,-61,-56,-58,-60,-65,-67,-58,-56,-97,-13,84,19,-76,-77,-83,-83,35,49,7,-26,-29,-40,-52,-46,-85,-9,11,-97,-57,-75,-2,-69,-71,-65,-43,89,58,-54,-10,-14,-21,-79,-8,15,11,76,-97,-85,-47,-48,-25,-81,-80,83,68,21,5,-1,0,-7,0,16,80,51,76,77,-88,-70,-47,11,88,89,75,84,19,6,5,5,4,2,9,54,52,76,-86,-87,-10,-29,39,40,57,94,94,27,11,6,5,5,10,28,88,43,45,87,87,-12,19,21,28,29,38,33,15,8,5,4,4,8,26,88,65,57,66,64,72,32,4,5,13,18,18,12,6,3,1,1,3,8,27,46,26,88,59,45,46,-19,-12,-4,20,18,12,6,1,-2,-4,-3,1,14,19,31,49,55,58,52,-37,-62,30,35,20,13,5,-6,-8,-11,-9,-3,6,20,33,48,57,59,57,-55,-51,-23,78,29,12,11,-20,-25,-34,-28,-1,9,22,40,68,63,66,57,-60,-68,-78,78,32,1,22,-80,-54,-90,-89,-27,5,30,89,37,84,57,53,-62,-60,-79,77,30,-7,-58,-7,-48,-63,-28,-71,19,39,89,23,37,44,44,-57,-61,-16,5,35,-3,-15,-24,-32,-40,-38,-23,2,51,40,36,34,38,41,-48,-29,-21,11,17,10,-9,-21,-31,-35,-29,-15,12,32,39,36,37,37,39],"ownershipAllowedMAE":0.0402058})%"); + lines.push_back(R"%({"sample":{"board":".................../..X................/....X........X.X.../..O..X.XXO......X../...O.O..OO..X..OO../......O............/................O../...............XO../.............OOXXO./..O.......X...XOXO./...O.OX.....OOXOXX./.......OO..OXXOOX../.X.XOXX..XXOOX.OOX./...OO..OOXO.OX.O.X./...OXXX.XO..OXX.OX./.XXXOX..XO...X.OOOX/.OOXO....XOOXXO..X./.XXO.....X.OOXO.X../...........OXXX..../","hintLoc":"null","initialTurnNumber":50,"metadata":"8968FEE17D8248014005F5D90DF69B90:60","moveLocs":["G8","M13","K17","F8","Q2","Q1","E8","F10","E9","K9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.07,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":8.0,"policyOptimism":0.345,"pda":-2.819,"policyMixture":[2.17e-05,2.42e-05,2.47e-05,2.45e-05,2.46e-05,2.4e-05,2.35e-05,2.41e-05,2.41e-05,2.45e-05,2.42e-05,2.42e-05,2.38e-05,2.42e-05,2.36e-05,2.38e-05,2.32e-05,2.32e-05,2.15e-05,2.42e-05,6.79e-05,0,8.61e-05,3.32e-05,5.68e-05,3.51e-05,0.000115,2.71e-05,2.63e-05,2.66e-05,2.61e-05,2.63e-05,2.64e-05,5e-05,2.72e-05,2.68e-05,2.55e-05,2.37e-05,2.44e-05,2.88e-05,4.45e-05,0.000129,0,2.64e-05,6.37e-05,2.48e-05,2.67e-05,0,2.34e-05,2.56e-05,3.52e-05,0,7.53e-05,0,3.22e-05,2.79e-05,2.32e-05,2.47e-05,2.63e-05,0,2.29e-05,4.13e-05,0,2.84e-05,0,0,0,2.31e-05,2.52e-05,2.78e-05,4.62e-05,6.97e-05,7.82e-05,0,5.08e-05,2.55e-05,2.4e-05,2.62e-05,2.4e-05,0,2.67e-05,0,2.67e-05,2.75e-05,0,0,2.38e-05,2.62e-05,0,2.7e-05,2.56e-05,0,0,2.96e-05,2.49e-05,2.34e-05,2.55e-05,2.53e-05,2.6e-05,2.56e-05,2.48e-05,0,2.7e-05,2.64e-05,2.46e-05,2.54e-05,2.78e-05,3.05e-05,2.94e-05,2.81e-05,2.52e-05,2.22e-05,2.78e-05,2.51e-05,2.32e-05,2.59e-05,2.57e-05,2.65e-05,2.61e-05,2.59e-05,2.63e-05,2.79e-05,2.83e-05,2.9e-05,2.77e-05,0,2.96e-05,7.37e-05,3.12e-05,3.41e-05,0,2.77e-05,2.55e-05,2.32e-05,2.55e-05,2.52e-05,2.61e-05,2.68e-05,2.77e-05,2.8e-05,3.02e-05,3.66e-05,3.53e-05,0.000106,3.73e-05,2.95e-05,2.53e-05,3.26e-05,0,0,2.68e-05,2.86e-05,2.33e-05,2.54e-05,2.4e-05,2.53e-05,2.71e-05,3e-05,8.82e-05,8.53e-05,0.000157,0.000236,8.75e-05,0.000109,2.86e-05,0,0,0,0,0,2.42e-05,2.37e-05,2.51e-05,0,2.33e-05,2.84e-05,0,0.000349,0.0273,0.0327,9.37e-05,0,0.000394,2.79e-05,2.8e-05,0,0,0,0,2.53e-05,2.45e-05,2.51e-05,2.28e-05,0,0,0,0,0.000194,0.000135,0,0.384,0.25,0,0,0,0,0,0,0.000171,2.36e-05,2.34e-05,2.37e-05,2.41e-05,0,0,0,0,0,0.264,0.000328,0,0,0,0,0,0,2.36e-05,6.02e-05,2.38e-05,0,2.45e-05,0,0,0,0,2.91e-05,5.33e-05,0,0,0,0,0,2.5e-05,0,0,0,2.27e-05,2.42e-05,2.56e-05,2.35e-05,0,0,0.000417,0.000333,0,0,0,0,2.35e-05,0,0,2.42e-05,0,2.5e-05,0,2.33e-05,2.27e-05,3.54e-05,2.87e-05,0,0,0,0,0.0059,0,0,6.13e-05,0.000122,0,0,0,2.64e-05,0,0,0.00281,2.6e-05,0,0,0,0,0,3.86e-05,0.000362,0,0,3.16e-05,3.06e-05,2.97e-05,0,2.89e-05,0,0,0,0,2.56e-05,0,0,0,0,0.000442,0.000591,0.00061,0.000684,0,0,0,0,0,0,1.97e-05,0.019,0,0.000412,2.43e-05,0,0,0,2.95e-05,3.15e-05,2.83e-05,0.000803,0.000103,0,2.51e-05,0,0,0,0,0,0,0.000424,0.000173,2.23e-05,2.38e-05,2.41e-05,2.41e-05,2.46e-05,2.37e-05,2.4e-05,2.55e-05,2.63e-05,3.09e-05,2.56e-05,0,0,0,0,0,3.3e-05,2.72e-05,2.24e-05,1.97e-05],"winrateAvg":0.0654919,"leadAvg":-6.72578,"scoreMeanAvg":-8.2033,"scoreStdevAvg":12.7058,"shorttermWinlossErrorAvg":0.0985447,"shorttermScoreErrorAvg":2.13404,"ownership":[-36,-48,-56,-66,-60,-45,-16,9,32,39,29,6,-23,-48,-66,-75,-77,-73,-68,-29,-27,-77,-61,-72,-39,-19,25,20,52,25,5,-27,-60,-75,-83,-77,-72,-63,-9,-22,6,-14,-82,-50,-24,-10,29,84,31,4,-15,-91,-45,-92,-80,-70,-51,10,56,84,16,15,-68,-28,-54,-52,83,25,-10,-34,-26,6,13,-87,-55,-12,37,46,64,89,42,85,15,23,84,84,11,-16,-81,-13,11,67,66,26,19,45,52,50,52,41,49,87,36,19,9,-9,-24,-21,-6,-9,12,45,51,41,50,53,52,44,32,22,16,0,-26,-30,-32,-82,-17,10,-1,-5,66,56,52,52,57,51,40,31,17,5,-8,-21,-27,-23,-26,-1,25,-12,-96,67,49,49,54,58,57,35,32,20,13,-10,-18,-16,-25,-6,10,94,94,-97,-98,49,22,38,74,94,60,37,-14,10,-7,-5,-22,-61,-19,18,93,93,95,-98,42,-59,31,30,62,95,95,96,3,50,17,-38,53,68,96,96,94,94,-98,-98,-74,7,21,37,68,95,-80,91,92,93,70,71,98,-91,-96,94,94,-98,-97,-93,-12,-24,22,17,95,-80,-80,37,76,55,51,98,98,-96,50,94,93,-98,-95,-20,-3,23,94,95,3,-20,90,91,55,91,87,98,-97,-56,95,6,-98,-96,-51,10,27,94,-96,-96,-95,37,-87,93,80,85,98,-97,-97,56,92,-98,-95,-75,-99,-99,-99,-90,-96,-89,-77,-90,93,85,72,8,-97,-27,91,92,92,-96,-98,-98,-98,-99,-91,-92,-88,-79,-77,-80,88,88,-98,-97,69,61,46,-96,-95,-98,-99,-99,-92,-94,-90,-83,-70,-70,-79,19,88,87,-97,71,70,-96,-95,-95,-98,-98,-97,-96,-93,-89,-82,-74,-63,-19,15,87,-97,-97,-97,-97,-96,-96,-95],"ownershipAllowedMAE":0.0584995})%"); + lines.push_back(R"%({"sample":{"board":"............OOX..../.......X..O.OXXXX../.X..X.X.XXXOOXXOX../X.X....XO..OXOOOX../.XOXXX.O.OOOXX.O.../.OOOO.XO.OX.X....../....OXXOOXX.OX.X.../.OXXXO.OXOX.XX...../OOOXO.OOXO.O....O../XOX...XXX...O....../.XXXXXXO.O.O.O...../XOOOOOOO.XO.OXO.O../XX......XOO.X....../.XO....O.......O.../......X.....X.XXX../.XXXXX.......XO.X../..OO.OO........OXO./......O.......O.OX./.................O./","hintLoc":"null","initialTurnNumber":161,"metadata":"38035AA4201EB8BAF660150741CBF323:171","moveLocs":["S13","O3","R15","S15","S14","P14","A9","B13","C13","A13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.2,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.01e-05,3.02e-05,3e-05,3e-05,3.03e-05,3.09e-05,3.23e-05,3.4e-05,3.57e-05,3.86e-05,3.42e-05,3.5e-05,0,0,0,3e-05,3.9e-05,3.89e-05,3.12e-05,3e-05,3.14e-05,3.03e-05,3.04e-05,3.07e-05,3.21e-05,3.33e-05,0,3.15e-05,3.61e-05,0,2.75e-05,0,0,0,0,0,3.88e-05,3.56e-05,3.99e-05,0,4.71e-05,3.3e-05,0,3.4e-05,0,0,0,0,0,0,0,0,0,0,0,3.06e-05,3.6e-05,0,0,0,8.69e-05,3.29e-05,3.54e-05,3.54e-05,0,0,3.31e-05,3.33e-05,0,0,0,0,0,0,0.0548,3.99e-05,5.18e-05,0,0,0,0,0,0.000213,0,3.02e-05,0,0,0,0,0,3.46e-05,0,0,0,5.68e-05,0.58,0,0,0,0,3.91e-05,0,0,2.53e-05,0,0,0.000733,0,0,0,3.68e-05,6.08e-05,0,3.26e-05,0,0,0,0.00119,0,0,0,0,0,0,0,0.0648,0,0,3.11e-05,0,0.00011,0,3.43e-05,5.39e-05,0,0,0,0,0,3.39e-05,0,0,0,0,0.000144,0,0,0.00463,0.0005,9.15e-05,5.32e-05,3.87e-05,0,0,0,0,0,5.75e-05,0,0,0,0,3.67e-05,0,3.25e-05,3.74e-05,7.81e-05,0.000211,0,5.47e-05,3.98e-05,2.54e-05,0,0,0.00763,0.000656,8.17e-05,0,0,0,0.00334,3.22e-05,3.29e-05,0,3.61e-05,4.38e-05,5.12e-05,6.01e-05,5.16e-05,3.89e-05,0,0,0,0,0,0,0,0,0.000137,0,3.14e-05,0,3.2e-05,0,4e-05,4.43e-05,4.57e-05,5.02e-05,3.76e-05,0,0,0,0,0,0,0,0,3.21e-05,0,0,3.22e-05,0,0,0,4.32e-05,0,7.85e-05,4.3e-05,0,0,0.126,3.25e-05,3.27e-05,3.32e-05,3.28e-05,3.29e-05,0,0,0,3.82e-05,0,4.5e-05,4.11e-05,4.45e-05,4.87e-05,0.00013,4.31e-05,5.9e-05,0,0,3.58e-05,3.83e-05,3.74e-05,3.64e-05,0,3.84e-05,4e-05,4.11e-05,9.4e-05,3.85e-05,0.0922,4.86e-05,0,9.04e-05,0.000116,4.1e-05,0.0028,0.013,0.00953,3.32e-05,3.41e-05,3.59e-05,0,8.39e-05,4.62e-05,5.2e-05,6.92e-05,5.03e-05,0,3.31e-05,0,0,0,3.58e-05,4.27e-05,4.32e-05,0,0,0,0,0,4.36e-05,4.92e-05,0.00011,0.000184,0.000235,0.0211,3.88e-05,0,0,4.01e-05,0,4.5e-05,3.79e-05,3.88e-05,5.82e-05,0,0,3.6e-05,0,0,4.39e-05,7.39e-05,0.000314,0.00195,0.00265,0.000201,0,0.000657,0,0,0,4.68e-05,4.02e-05,4.09e-05,3.78e-05,3.55e-05,3.83e-05,3.17e-05,0,4.08e-05,6.96e-05,0.000137,0.000267,0.00038,0.000229,0.000924,0,0.000135,0,0,0.00118,3.16e-05,3.76e-05,3.61e-05,3.53e-05,3.31e-05,3.35e-05,3.42e-05,3.86e-05,4.03e-05,4.23e-05,4.28e-05,4.4e-05,4.5e-05,4.39e-05,3.67e-05,3.7e-05,2.93e-05,0,3.08e-05,4.39e-05],"winrateAvg":0.172289,"leadAvg":-8.16368,"scoreMeanAvg":-7.5385,"scoreStdevAvg":14.9857,"shorttermWinlossErrorAvg":0.210206,"shorttermScoreErrorAvg":3.35757,"ownership":[-95,-96,-96,-96,-97,-96,-95,-85,-57,41,81,88,92,92,-71,-65,-66,-59,-63,-95,-95,-96,-97,-98,-97,-96,-98,-74,-45,87,87,92,-71,-72,-74,-75,-66,-66,-94,-98,-95,-97,-100,-82,-98,-76,-97,-97,-96,92,92,-74,-73,56,-76,-73,-61,-95,-94,-97,-95,-87,-60,-1,-75,87,-35,41,93,-76,60,55,53,-77,-10,-33,-76,-95,-44,-99,-99,-99,21,95,86,94,94,93,-79,-79,-40,56,55,-11,17,-40,-44,-44,-44,-41,-89,-94,95,94,94,-62,-5,-79,-78,-84,-37,27,71,36,-45,-41,-44,-52,-44,-93,-94,95,94,-59,-58,26,23,-81,-69,-80,10,69,58,-48,-49,-74,-70,-70,88,16,95,-73,94,-57,17,-81,-82,-42,-31,-39,55,60,-52,-51,-54,-73,82,81,95,95,-74,94,43,95,4,-20,-3,-24,74,62,59,-70,-55,-78,-71,-28,30,-74,-74,-74,16,24,79,99,38,15,20,32,54,54,-74,-80,-77,-75,-75,-74,-74,99,50,98,80,100,92,97,47,34,44,54,49,-95,97,99,99,99,99,99,99,79,74,100,74,97,38,88,38,85,53,39,-95,-95,32,49,41,33,36,59,37,100,100,37,-17,41,18,18,34,27,19,-92,-94,77,20,6,-1,-8,89,44,42,34,26,1,52,-19,46,-1,-8,-4,-89,-83,-34,-29,-34,-51,-81,7,19,18,13,1,-58,-11,-59,-58,-58,-32,-19,-77,-94,-93,-93,-93,-92,-14,-4,14,9,3,8,-33,-66,1,-26,-58,-30,1,-63,23,67,68,-35,84,84,24,14,13,5,-30,-26,-68,-30,82,-56,77,54,-30,-15,39,64,70,75,83,50,33,18,7,-2,-4,-6,84,81,84,78,80,-8,24,36,54,63,70,67,55,34,19,5,-1,3,22,48,76,81,83,81],"ownershipAllowedMAE":0.0667647})%"); + lines.push_back(R"%({"sample":{"board":".X....XXO........../.OX...XO.........../.OX.X.XO.........../.XOXXXO........O.O./OXOOOO.O.........../.OXO..........X.X../.................../.OO.............O../OXO................/.XO............X.../.XO.............O../.XO.OO............./OXXO.X..........X../.OOXX............../...............X.../.OOXX.....X......../XOXO...........XO../.XXX...........X.../.................../","hintLoc":"null","initialTurnNumber":75,"metadata":"C6C089858224DF82AECC2E858DE480A8:85","moveLocs":["Q9","R10","Q7","R6","P10","S9","P4","Q4","P11","S11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.9,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1button1","komi":7.5,"policyOptimism":0.235,"pda":0.0,"policyMixture":[4.02e-06,0,1.85e-05,5.21e-05,4.18e-06,1.13e-05,0,0,0,3.66e-06,3.62e-06,2.94e-06,2.77e-06,2.83e-06,2.87e-06,2.74e-06,2.46e-06,2.49e-06,2.07e-06,2.89e-06,0,0,5.76e-05,0.0189,5.74e-05,0,0,1.31e-05,0.000962,1.79e-05,9.01e-06,8.6e-06,8.57e-06,9.01e-06,6.53e-06,4.16e-06,3.76e-06,2.46e-06,2.84e-06,0,0,2.55e-05,0,1.71e-05,0,0,7.15e-06,8.63e-06,1.31e-05,2.51e-05,5.06e-05,0.000159,0.000142,8.66e-06,6.27e-06,3.43e-06,2.34e-06,2.9e-06,0,0,0,0,0,0,3.4e-06,4.12e-06,6.18e-06,1.08e-05,3.36e-05,0.00013,0.0382,7.74e-05,0,5.07e-06,0,2.56e-06,0,0,0,0,0,0,2.61e-06,0,3.96e-06,6.26e-06,1.1e-05,3.9e-05,8.8e-05,0.000322,0.000262,4.08e-05,5.38e-05,6.99e-06,3.72e-06,2.37e-06,0,0,0,2.16e-06,2.29e-06,2.43e-06,3.01e-06,4.27e-06,7.74e-06,1.67e-05,6.72e-05,0.00019,6.47e-05,0,2.01e-05,0,0.000107,3.73e-06,2.12e-06,2.29e-06,2.08e-06,2.2e-06,2.23e-06,2.46e-06,2.8e-06,3.67e-06,5.43e-06,9.49e-06,3.52e-05,0.000139,0.00063,0.000727,1.8e-05,7.39e-05,2.02e-05,1.24e-05,4.22e-06,2.49e-06,0,0,2.26e-06,2.4e-06,2.72e-06,3.28e-06,4.35e-06,6.84e-06,1.28e-05,6.46e-05,0.000273,0.000901,0.000113,1.22e-05,5.21e-06,0,0.000384,3.63e-06,0,0,0,2.25e-06,2.4e-06,2.8e-06,3.56e-06,5.2e-06,8.71e-06,2.5e-05,0.00012,0.000491,0.000638,5.75e-06,0,1.24e-05,8.04e-06,0,3.54e-06,3.92e-06,0,0,2.18e-06,2.29e-06,2.67e-06,3.74e-06,6.5e-06,1.43e-05,6.16e-05,0.000194,0.000545,0.000201,4.78e-06,0,0,0,2.18e-05,1.19e-05,3.69e-06,0,0,2.12e-06,2.22e-06,2.47e-06,4.03e-06,1.08e-05,6.49e-05,0.000142,0.000272,0.00131,0.000184,4.2e-05,7.03e-06,0,0,0,6.61e-06,3.68e-06,0,0,2.72e-06,0,0,8.4e-06,0.00014,0.000322,0.000484,0.000747,0.00189,0.000303,6.67e-05,6.44e-06,3.89e-06,1.07e-05,5.9e-06,2.95e-06,0,0,0,0,5.92e-06,0,0.0015,0.00197,0.0207,0.0248,0.0425,0.00299,0.000545,0.0011,6.88e-06,0,0,3.14e-06,2.53e-06,2.95e-06,0,0,0,0,3.04e-06,1.56e-05,0.000731,0.00206,0.3,0.475,0.000652,0.000112,0.000133,4.92e-05,3.36e-06,0,2.91e-06,2.43e-06,2.89e-06,3.2e-06,6.73e-06,4.98e-06,2.61e-06,3.65e-06,1.14e-05,6.9e-05,0.000732,0.000545,0.00511,0.00011,2.88e-05,7.51e-06,7.33e-06,0,2.64e-06,3.34e-06,2.43e-06,3.55e-06,0,0,0,0,4.56e-06,1.03e-05,4.52e-05,0.00058,0.00557,0,0.000135,4.03e-05,4.87e-06,0,0,2.96e-06,2.87e-06,2.35e-06,0,0,0,0,4.93e-06,0.000242,9e-06,5.65e-05,0.0347,0.000529,0.00365,7.72e-05,3.38e-05,6.68e-06,4e-06,0,0,2.59e-06,2.5e-06,4.06e-06,0,0,0,4.14e-06,6.29e-06,5.5e-06,7.18e-06,1.92e-05,0.000189,0.000627,2.05e-05,9.61e-06,6.06e-06,4.1e-06,0,3.43e-06,2.79e-06,2.63e-06,2.15e-06,2.2e-06,2.13e-06,2.21e-06,2.42e-06,2.61e-06,2.55e-06,2.7e-06,3.05e-06,3.37e-06,3.63e-06,3.2e-06,2.89e-06,2.89e-06,2.76e-06,2.87e-06,2.6e-06,2.57e-06,2.33e-06,3.84e-06],"winrateAvg":0.836562,"leadAvg":2.97564,"scoreMeanAvg":4.71284,"scoreStdevAvg":11.9797,"shorttermWinlossErrorAvg":0.0941177,"shorttermScoreErrorAvg":0.943208,"ownership":[-9,-83,-84,-85,-85,-87,-91,-91,8,-8,4,5,9,18,31,45,54,59,62,21,95,-89,-86,-85,-89,-91,85,4,21,10,8,11,18,37,49,58,60,62,93,96,-90,-89,-91,-89,-91,87,50,31,12,9,8,15,43,59,59,61,63,97,95,100,-90,-90,-91,92,81,6,18,10,6,3,14,23,86,52,80,46,98,96,100,100,100,100,81,96,33,19,10,5,2,4,4,15,16,4,26,98,99,96,100,81,63,49,41,23,14,9,4,-2,-10,-55,-15,-53,-5,-5,98,97,97,78,67,58,47,36,23,15,9,2,-8,11,-1,3,1,-22,-10,97,100,100,76,65,56,45,34,24,17,14,14,14,14,19,16,55,10,-24,98,78,100,74,62,53,41,31,23,17,15,19,22,31,82,16,1,-91,-43,93,79,100,74,61,49,35,25,19,15,14,18,21,34,82,-87,-90,-89,-65,86,80,100,84,68,52,32,18,15,11,10,12,17,14,46,53,51,-92,-79,81,80,99,95,99,99,20,14,12,9,7,-1,6,8,18,14,-36,-86,-87,81,80,79,95,-63,-92,-11,-3,9,12,11,3,0,8,8,48,-99,-95,-92,60,82,81,-96,-96,-57,-22,-6,3,17,35,6,1,-2,-10,-44,-100,-97,-94,-28,65,-9,-61,-82,-49,-27,-20,-22,-15,-9,-7,-10,-15,-33,-100,-98,-96,-95,-68,79,77,-96,-97,-52,-38,-31,-32,-28,-82,-18,-21,-19,10,-100,-97,-96,-95,-90,80,-95,-88,-88,-44,-46,-40,-33,-42,-44,-43,-36,-35,-42,-100,-94,-96,-96,-90,-96,-96,-96,-78,-61,-51,-45,-40,-39,-39,-45,-43,-52,-64,-100,-96,-96,-96,-92,-93,-94,-89,-80,-64,-52,-42,-36,-34,-36,-38,-45,-54,-75,-87,-95,-95,-95],"ownershipAllowedMAE":0.0249986})%"); + lines.push_back(R"%({"sample":{"board":".....XX.....XOO..../.....XOX....XXOOOO./....XOOX.....XOXX../XXX.X.OOX.O.XXXOX../XOOXOOOXXXXXO.OOO../XXO..OXXOO.XOO.OO../XXOOOX..XO.XXXXOO.O/OO.OXXXX.OOXOOXO.OX/...OX.OOOOXXXOXOOXX/OOOXX.OXXOOXXO.OXX./OXX..XX....XOO.OX../OX.X.XOX.OOXXX.OXX./.O.X.XOOO.XXOO.OOX./OOOO.XX..X.XO.O.XO./OXXOOXOOOXXXXXOXXXX/X.XO.OXO.XOOXXXOOO./..XXOO.O.XO.XOXOOOO/.X..XXO..OOXXOOOXXX/...X.O...O.O.X.OXO./","hintLoc":"null","initialTurnNumber":223,"metadata":"800988DA6386DDDBA7CDF843F395D5EA:233","moveLocs":["E6","E7","J12","H13","C7","C8","G1","E1","J3","N1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":-6.0,"policyOptimism":0.985,"pda":-1.638,"policyMixture":[0.000539,0.000602,0.000592,0.000774,0.00218,0,0,0.0062,0.00646,0.000943,0.00117,0.000953,0,0,0,0.000566,0.000559,0.000545,0.000539,0.000585,0.000666,0.000668,0.0108,0.0157,0,0,0,0.00328,0.00207,0.0133,0.00685,0,0,0,0,0,0,0.000563,0.000555,0.000588,0.00064,0.00132,0,0,0,0,0.00355,0.0016,0.00144,0.00301,0.000657,0,0,0,0,0.000617,0.000551,0,0,0,0.0124,0,0.000161,0,0,0,0.000558,0,0.0165,0,0,0,0,0,0.000619,0.000544,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0129,0,0,0,0.000569,0.000595,0,0,0,0.0592,0.0116,0,0,0,0,0,0.00476,0,0,0,0.00843,0,0,0.000624,0.000593,0,0,0,0,0,0,0,0,0,0,0.00446,0,0,0,0,0,0,0.000716,0,0,0,0.000647,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000319,0,0,0.000627,0.000628,0.000625,0,0,0.004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0046,0,0,0,0,0,0,0,0,0.0186,0,0,0,0.000521,0,0,0,0.000548,0.000531,0,0,0.000883,0.0251,0.0117,0.0255,0,0,0,0.00725,0,0,0.000522,0.000564,0,0,0,0,0.000524,0,0,0,0.143,0,0,0,0,0,0.0116,0,0,0,0.000555,0.000634,0,0,0,0,0,0,0,0,0.00702,0,0,0,0,0.01,0,0,0,0.00077,0,0,0,0,0,0,0,0.00701,0.00603,0,0,0,0,0.01,0,0.0136,0,0,0.000589,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0142,0,0,0.000639,0,0,0,0.00616,0,0,0,0,0,0,0,0,0,9.31e-05,0.0191,0.00515,0,0,0,0,0.000628,0,0,0,0,0.000653,0,0,0,0,0,0,0,0.0132,0,0.00839,0.0138,0,0,0,0.00662,0.0225,0,0,0,0,0,0,0,0,0,0,0.0013,0.0137,0.0184,0,0,0,0,0.00183,0.00387,0,0.286,0,0,0,7.96e-05,0,0,0,0.0192,0.0027],"winrateAvg":0.000170682,"leadAvg":-17.9312,"scoreMeanAvg":-17.9376,"scoreStdevAvg":1.09108,"shorttermWinlossErrorAvg":0.00284922,"shorttermScoreErrorAvg":0.443054,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-99,-99,-100,-100,100,99,99,100,100,-100,-100,-100,-100,-100,-14,100,100,-100,-100,-99,-99,-100,-100,-100,100,99,100,100,-100,100,100,-100,100,100,100,-100,-100,-100,-100,-100,100,11,100,100,100,100,100,-100,-100,100,28,100,100,-100,-100,100,100,-72,-100,100,100,35,100,100,100,100,-100,-100,100,100,100,-100,-100,-100,-100,100,43,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,100,100,-100,100,100,100,-100,100,100,100,100,-100,-31,100,100,100,100,-100,-100,-100,100,-100,100,100,-100,-100,100,100,100,-100,-100,-48,100,-100,-100,100,100,-100,-100,100,38,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-62,81,-1,-100,100,100,26,100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,-100,48,100,100,-100,-100,-100,-53,100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,-16,-100,-100,100,100,93,100,100,-100,-100,100,100,100,100,100,-100,-100,62,-5,-100,-100,-100,100,-5,100,-14,-100,-100,-100,100,-100,-100,100,100,-100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,3,-100,100,100,-100,-100,-100,100,100,100,13,-100,-100,-100,-100,100,100,100,100,100,-100,100,-45,-100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,98,98,-100,-100,-4,100,100,100,100],"ownershipAllowedMAE":0.0195705})%"); + lines.push_back(R"%({"sample":{"board":".................../....X............../..OOXOXO....X....../..OXOXX........O.../...XOO...........X./...O............O../.........X.....X.../.....X..........O../...............O.../...X..........XOX../..........X....X.X./.............X.XXO./........O.O..XOOO.O/..XX..O..O...XO..OX/..XO...XOXO..XXOOX./..XO..XX.X.OOOOXOO./..OO..OOX.XX...XO../.............X.XO../..............XO.../","hintLoc":"null","initialTurnNumber":93,"metadata":"739D37ECFAED9A59B324707AEDDFA454:103","moveLocs":["R13","M6","R17","F3","F2","G2","H2","F5","E3","J9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.19,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":-26.0,"policyOptimism":0.0,"pda":-2.619,"policyMixture":[8.13e-05,9.07e-05,8.98e-05,0.000102,0.000116,0.000113,0.000109,0.000117,0.000104,0.000106,0.000111,0.000113,0.000114,0.000109,0.000108,0.000103,9.86e-05,9.38e-05,7.99e-05,8.75e-05,8.85e-05,9.12e-05,0.000136,0,0.00016,0.00209,0.000187,0.000308,0.000152,0.000269,0.000204,0.000186,0.000171,0.000141,0.000131,0.00011,0.000101,9.03e-05,8.56e-05,8.14e-05,0,0,0,0,0,0,0.000141,0.000503,0.000957,0.00103,0,0.000183,0.000157,0.000113,0,9.61e-05,9.12e-05,8.89e-05,8.36e-05,0,0,0,0,0,0.000159,0.000376,0.000409,0.000697,0.00218,0.000992,0.000248,0.000143,0,9.63e-05,0.000108,9.25e-05,9.4e-05,9.84e-05,0.000138,0,0,0,0.00265,0.000463,0.000516,0.0004,0.000636,0.00088,0.000916,0.000442,0.000155,0.000124,0.000116,0,9.31e-05,9.96e-05,0.000119,0.000112,0,0.000123,0.000141,0.00121,0.0166,0.000673,0.000847,0.000641,0.00091,0.000786,0.000294,0.000169,0.000158,0,0.000102,9.46e-05,0.000106,0.000143,0.000158,0.00014,0.000142,0.000263,0.000342,0.0005,0.000727,0,0.000937,0.000713,0.000844,0.000675,0.000154,0,0,9.25e-05,9.41e-05,0.00011,0.000176,0.00038,0.000338,0.00022,0,0.000388,0.000378,0.000403,0.000757,0.000542,0.000751,0.000796,0.000889,0.000178,0.000133,0,0.000102,9.9e-05,0.000111,0.00019,0.000329,0.000362,0.00174,0.000741,0.000426,0.000378,0.000595,0.000455,0.000831,0.000801,0.00134,0.000916,0.00423,0,0.000111,0.000118,0.000101,0.00011,0.000191,0.000325,0,0.00153,0.000522,0.00156,0.000659,0.000468,0.000771,0.00083,0.00141,0.0608,0.000575,0,0,0,9.92e-05,9.91e-05,0.000108,0.000182,0.000393,0.00148,0.00158,0.00284,0.0242,0.311,0,0.00056,0,0.13,0.00228,0.00182,0.000214,0,0,0,9.99e-05,0.000106,0.000158,0.000487,0.000814,0.0109,0.00368,0.0133,0.000349,0.000138,0.000247,0.000156,0.000535,0.000152,0,0.0016,0,0,0,7.81e-05,0.000104,0.000134,0.000128,0.000133,0.00107,0.00122,0.000211,9.18e-05,0,7.01e-05,0,0.0273,0.000127,0,0,0,0,8.11e-05,0,0.000109,0.000105,0,0,0.205,0.000933,0,0.000481,0.00296,0,0.00917,0,0.000466,0,0,7.75e-05,7.81e-05,0,0,0.000109,0.00011,0,0,0.000144,0,9.89e-05,0,0,0,0,0.000125,0.000123,0,0,0,0,0,8.49e-05,0.000104,0.000136,0,0,8.12e-05,0.00125,0,0,0.000104,0,0.000137,0,0,0,0,0,0,0,8.26e-05,0.000102,0.000112,0,0,0,0,0,0,0,0.00011,0,0,0.000216,0.00511,0.0033,0,0,8.5e-05,8.33e-05,8.77e-05,9.19e-05,8.15e-05,8.19e-05,8.22e-05,0,0,0,0.000433,0.000379,0.000148,0.000242,0.0349,0,0.00875,0,0,9.37e-05,9.32e-05,8.01e-05,8.57e-05,8.32e-05,8.46e-05,8.35e-05,8.01e-05,9.52e-05,9.8e-05,0.00012,0.00014,0.000266,0.000276,0.000253,0.000194,0,0,0.0382,0.000714,8.65e-05,8.64e-05],"winrateAvg":0.000427602,"leadAvg":-42.5894,"scoreMeanAvg":-43.4174,"scoreStdevAvg":16.7975,"shorttermWinlossErrorAvg":0.00312853,"shorttermScoreErrorAvg":2.27466,"ownership":[63,53,36,7,-27,-56,-53,-38,-29,-23,-24,-27,-26,-17,1,24,41,55,61,72,66,70,20,-68,-71,-46,-37,-23,-25,-25,-30,-34,-20,-4,19,53,65,67,75,81,92,91,-69,-69,-83,-6,-29,-24,-18,-24,-66,-16,-14,23,91,70,71,73,80,92,80,87,-82,-82,-45,-26,-22,-19,-9,-17,-1,20,89,74,72,70,59,65,83,79,87,86,-37,-27,-25,-22,-16,-13,-11,-2,15,47,70,56,65,38,33,49,88,47,1,-9,-13,-21,-24,-20,-13,-10,-4,10,26,88,75,64,14,11,10,18,3,-11,-18,-21,-28,-82,-25,-18,-11,-6,0,-28,88,72,58,-6,-7,-7,-7,-11,-73,-27,-29,-34,-37,-29,-20,-14,-10,0,21,87,58,27,-23,-27,-28,-24,-14,-22,-26,-38,-43,-42,-37,-28,-21,-18,-15,66,8,-17,-2,-37,-41,-49,-82,-27,-29,-22,-57,-71,-56,-52,-45,-29,-35,-71,67,-75,-40,-40,-48,-52,-53,-41,-33,-28,-26,-14,-91,-68,-92,-43,-53,-61,-58,-81,-74,-76,-31,-55,-57,-51,-41,-28,-39,-41,-50,-56,-59,-59,-66,-64,-97,3,-81,-82,95,19,-59,-62,-59,-44,-39,-43,-45,-45,-31,-45,-35,-52,-72,-98,99,99,99,94,96,-60,-70,-85,-85,-3,-59,-24,-67,-45,-35,-63,-90,-80,-98,99,98,97,98,93,-43,-68,-84,96,-12,-87,-73,-97,-44,-98,-55,-75,-79,-97,-97,99,100,95,96,-18,-7,-85,97,44,43,-97,-96,-92,-98,-78,-58,-57,-57,-59,-83,100,100,95,26,21,97,97,98,44,91,88,-97,-79,-98,-98,-85,-69,-70,-84,99,93,92,45,78,86,94,93,96,85,89,-21,-33,-73,-87,-85,-92,-80,-84,99,80,88,66,79,87,91,92,91,87,64,27,-16,-50,-74,-83,-83,-86,48,49,69,77],"ownershipAllowedMAE":0.0483044})%"); + lines.push_back(R"%({"sample":{"board":"....X............../..OX.XX...X......../...OXOX........X.../..O.OOX...O......../....OX.........X.../...O.............../...OX......O.O.X.../..OX.............../..OX...........X.../..XX....O........../.......X.........../..OX..OX........O../...OXXXOO.......OX./.....XO.........OX./.X...O.OO......OX../..XXXXO....O...OX../OXOOOXXX.......OX../.O...OO............/.................../","hintLoc":"null","initialTurnNumber":80,"metadata":"E23DAD5091AD3EDB6E178C9327383D30:90","moveLocs":["H10","M18","J11","Q18","P17","R14","R17","S11","N14","O14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.81,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":6.5,"policyOptimism":0.207,"pda":0.0,"policyMixture":[3.05e-06,3.15e-06,2.28e-05,3.38e-06,0,3.19e-06,3.01e-06,3.25e-06,3.41e-06,3.68e-06,3.84e-06,4.06e-06,3.52e-06,3.58e-06,3.15e-06,3.14e-06,2.94e-06,3.04e-06,2.86e-06,3.21e-06,1.03e-05,0,0,3.5e-06,0,0,3.15e-06,5.38e-06,1.41e-05,0,0,1.13e-05,4.95e-06,4.06e-06,0,3.28e-06,3.11e-06,3.09e-06,3.01e-06,0.000176,4.77e-05,0,0,0,0,3.21e-06,4.75e-06,7.3e-06,0.000278,0.000235,5.5e-05,5.51e-06,0,0,0,3.35e-06,3.2e-06,2.99e-06,3.87e-06,0,5.51e-05,0,0,0,3.55e-06,5.47e-06,6.04e-06,0,5.42e-05,0.00174,7.96e-06,3.58e-06,3.01e-06,3.12e-06,4.21e-06,3.48e-06,3.07e-06,3.97e-06,4.17e-06,5.2e-06,0,0,5.01e-06,4.72e-06,6.29e-06,3.16e-05,8.12e-05,6.51e-05,0.374,0.0103,1.36e-05,0,9.4e-06,5.58e-06,3.55e-06,3.12e-06,1.31e-05,9.16e-06,0,0.000124,4.99e-06,4.57e-06,5.02e-06,7.35e-06,6.15e-05,0.000143,0.000341,0,0,2.67e-05,0.433,0,5.64e-05,3.65e-06,3.37e-06,5.33e-05,0.0137,0,0,3.85e-06,4.29e-06,4.64e-06,5.89e-06,2.09e-05,6.15e-05,0,0.041,0,0.000145,0,0.118,5.72e-05,4.11e-06,3.26e-06,5.98e-05,0,0,3.3e-06,3.72e-06,3.83e-06,4.47e-06,5.41e-06,1.7e-05,3.12e-05,6.3e-05,5e-05,4.85e-05,5.57e-06,6.67e-06,3.12e-05,0.000136,3.81e-06,3.64e-06,3.9e-05,0,0,2.92e-06,3.34e-06,3.54e-06,4.16e-06,0,1.78e-05,4.77e-05,4.92e-05,0.000104,4.42e-05,5.16e-06,0,0.00114,0,3.94e-06,3.67e-06,9.87e-06,0,0,3.02e-06,3.32e-06,3.12e-06,0,0,8.62e-06,4.03e-05,4.13e-05,4.28e-05,2.9e-05,9.75e-06,5.11e-06,8.97e-05,0.000132,3.59e-06,3.28e-06,4.28e-06,3.69e-06,3.39e-06,3.36e-06,3.48e-06,3.28e-06,0,4.62e-06,1.51e-05,3.28e-05,2.82e-05,2.43e-05,1.41e-05,1.32e-05,2.27e-05,6.93e-05,1.32e-05,3.68e-06,3.22e-06,3.65e-06,0,0,3.27e-06,3.37e-06,0,0,4.22e-06,2.72e-05,2.06e-05,1.59e-05,8.94e-06,8.69e-06,9.98e-06,5.06e-06,0,0.00278,3.45e-06,3.25e-06,3.75e-06,3.89e-06,0,0,0,0,0,0,4.53e-06,8.1e-06,6.62e-06,5.87e-06,5.8e-06,6.91e-06,3.81e-06,0,0,2.99e-06,3.47e-06,3.28e-06,3.38e-06,4.25e-06,3.74e-06,0,0,3.67e-06,3.56e-06,4.28e-06,1.32e-05,5.54e-06,5.58e-06,5.18e-06,8.58e-06,5.2e-06,0,0,2.75e-06,3.22e-06,0,2.93e-06,3.26e-06,4.65e-06,0,0,0,0,4.89e-06,2.06e-05,1.59e-05,5.41e-06,4.94e-06,4.12e-06,0,0,2.94e-06,3.16e-06,6.6e-06,5.09e-06,0,0,0,0,0,3.72e-06,4.19e-06,5.4e-05,3.06e-05,0,7.58e-06,4.84e-06,3.38e-06,0,0,3.04e-06,3.27e-06,0,0,0,0,0,0,0,0,3.75e-06,9.97e-06,5.39e-06,6.57e-06,5.17e-06,5.06e-06,3.71e-06,0,0,3.11e-06,3.1e-06,3.75e-06,0,3.67e-06,3.52e-06,5.82e-06,0,0,4.74e-06,3.83e-06,4.35e-06,4.41e-06,4.38e-06,4.46e-06,4.42e-06,5.28e-06,5.58e-05,5.76e-06,3.57e-06,3.11e-06,2.94e-06,3.28e-06,3.17e-06,3.28e-06,3.2e-06,3.2e-06,3.36e-06,3.21e-06,3.15e-06,3.2e-06,3.19e-06,3.16e-06,3.17e-06,3.1e-06,3.01e-06,3.37e-06,3.7e-06,3.26e-06,2.78e-06,3.83e-06],"winrateAvg":0.413597,"leadAvg":-0.525996,"scoreMeanAvg":-0.83697,"scoreStdevAvg":9.72439,"shorttermWinlossErrorAvg":0.132038,"shorttermScoreErrorAvg":0.834259,"ownership":[61,29,-13,-24,-65,-63,-75,-69,-50,-34,-10,-1,4,-13,-27,-46,-57,-65,-67,72,77,90,-37,4,-89,-90,-64,-50,-31,-57,34,-5,-14,-50,-32,-67,-70,-67,80,80,88,94,1,94,-90,-48,-20,-8,8,12,13,-17,-97,-97,-97,-74,-56,83,87,96,91,95,95,-91,-36,-8,10,60,18,3,-3,-35,-62,-57,-44,-44,82,86,89,89,96,-45,-31,-21,-8,0,8,6,-10,3,-21,-87,-38,-26,-22,75,80,83,94,2,9,-15,-13,-6,-3,2,12,-35,64,-7,-39,20,-9,-3,60,75,72,94,-66,-5,-13,-11,-8,0,5,57,1,63,-1,-71,-35,12,12,41,59,74,-96,-57,-32,-23,-21,-17,-4,1,9,18,10,-4,-30,6,18,28,21,34,74,-96,-61,-45,-39,-47,-79,7,-1,5,4,6,-11,-64,-22,59,33,-17,19,-96,-96,-70,-63,-60,-93,12,-12,0,4,6,4,4,-7,10,15,31,-41,-78,-79,-69,-75,-76,-83,-94,-37,-3,4,8,10,10,7,10,31,22,17,-60,-61,-53,-82,-72,-83,-78,-94,14,3,12,16,17,17,18,29,90,-10,0,-61,-64,-67,-57,-95,-95,-95,87,88,32,28,27,26,27,27,44,91,-81,-28,-57,-62,-70,-71,-63,-95,65,62,62,36,39,35,33,35,41,71,91,-82,-65,-32,-85,-77,-57,-5,40,36,87,88,28,31,39,40,42,49,94,-86,-80,-79,-2,26,-96,-96,-96,-96,59,-13,4,-23,19,86,51,47,57,94,-87,-82,-81,75,26,94,93,93,-96,-96,-96,-25,-1,16,37,45,49,58,94,-86,-76,-78,74,91,91,91,88,89,87,-10,-7,-1,16,29,39,34,62,4,-33,-67,-71,85,87,90,90,85,65,20,-6,-14,-7,8,23,33,36,27,12,-20,-36,-58],"ownershipAllowedMAE":0.029412})%"); + lines.push_back(R"%({"sample":{"board":"............X....../.XXO......OX.XOO.../..X.......OOX.XXO../.XOOOO.OOOXXXXXO.../...OX..OXXX..X.OOO./.XXO...XOOO......X./..OXXXXOOX....X.X../..OOXOOOX.X.X....X./...OOX.OX.O...X.OO./...OXX.O.....O.O.../...OOOO...O......../..XXXX....X......../.......XX.X.X.OXOO./..X.O..OOO...OOOX../.XOX.XO...X.XOXXXXO/..OX.X.OOOX..X.XO../.XOXOXXO..OX...OX../..XOOOXXOOOX....X../...........OX....../","hintLoc":"null","initialTurnNumber":161,"metadata":"2823D44D15454624C7B44C8C71915B29:171","moveLocs":["T4","T6","Q12","Q13","P12","S6","O13","P14","M13","M9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui0button1","komi":5.0,"policyOptimism":0.688,"pda":1.279,"policyMixture":[6.13e-06,1.05e-05,7.4e-05,8.52e-06,8e-06,7.53e-06,6.7e-06,6.62e-06,6.59e-06,1.22e-05,0.00268,7.14e-06,0,6.17e-06,8.11e-06,6.58e-06,6.7e-06,6.95e-06,6.14e-06,1.49e-05,0,0,0,8.44e-06,7.77e-06,6.78e-06,6.99e-06,7.76e-06,7.35e-06,0,0,0,0,0,0,6.5e-06,9.32e-06,6.99e-06,7.72e-05,1.15e-05,0,1.21e-05,8.74e-06,6.48e-06,6.47e-06,6.5e-06,6.58e-06,7.24e-06,0,0,0,0,0,0,0,6.62e-06,6.81e-06,7.51e-05,0,0,0,0,0,6.45e-06,0,0,0,0,0,0,0,0,0,6.51e-06,6.92e-06,7.09e-06,1.13e-05,0.000241,1.64e-05,0,0,6.21e-06,6.23e-06,0,0,0,0,8.07e-06,6.41e-06,0,9.93e-06,0,0,0,7.99e-06,2.91e-05,0,0,0,6.52e-06,6.3e-06,6.61e-06,0,0,0,0,7.65e-06,1.03e-05,0.076,0,6.23e-06,6.78e-06,0,9.01e-06,3.88e-05,0.0164,0,0,0,0,0,0,0,0,8.38e-06,0,9.38e-06,0,0,0,0,6.04e-06,7.05e-06,7.01e-06,6.93e-06,0,0,0,0,0,0,0,7.62e-06,0,0.00106,0,9.63e-06,0,0,7.92e-06,0,7.84e-06,7.02e-06,6.74e-06,6.08e-06,0,0,0,6.23e-06,0,0,9.58e-06,0,0.37,0.000369,1.11e-05,0,7.68e-06,0,0,8.75e-06,7.77e-06,8.45e-06,6.92e-06,0,0,0,6.49e-06,0,8.3e-05,0.000176,0.0402,0.307,0.0823,0,9.36e-06,0,7.92e-06,8.29e-06,8.19e-06,7.58e-06,9.57e-06,9.36e-06,0,0,0,0,7.03e-06,1.53e-05,0.02,0,0,0.00919,6.39e-05,1.89e-05,1.07e-05,9.47e-06,2.6e-05,8.87e-06,7.4e-06,9.01e-06,0,0,0,0,8.14e-06,7.15e-06,9.34e-06,1.35e-05,0,2.13e-05,4.05e-05,0.00315,0.000102,0.0098,1.05e-05,9.12e-06,1.01e-05,7.01e-06,7.8e-06,7.52e-06,6.73e-06,6.67e-06,6.81e-06,1.22e-05,0,0,9.82e-06,0,7.73e-06,0,7.51e-06,0,0,0,0,9.6e-05,6.61e-06,7.68e-06,0,8.55e-06,0,6.59e-05,8.08e-06,0,0,0,1e-05,1.24e-05,0.0361,0,0,0,0,0,0,6.29e-06,0,0,0,0.001,0,0,5.13e-06,6.42e-06,8.04e-06,0,1.13e-05,0,0,0,0,0,0,0,7.09e-06,8.02e-06,0,0,0.000117,0,7.55e-06,0,0,0,0,2.63e-05,0.0184,0,3.25e-05,0,0,0.000103,0,5.75e-06,0,0,0,0,0,0,0,7.24e-06,6.38e-06,0,0,0.000122,3.11e-05,4.05e-05,0,0,7.21e-06,6.5e-06,5.6e-06,0.000184,0,0,0,0,0,0,0,0,0,0,1.8e-05,7.64e-06,7.62e-06,7.19e-06,0,6.69e-06,6.64e-06,6.12e-06,5.66e-06,0.000264,5.64e-06,5.57e-06,6.52e-06,6.46e-05,0.00104,7.53e-06,9.3e-06,0.00246,0,0,9.81e-06,7.04e-06,6.76e-06,6.56e-06,6.32e-06,6.38e-06,9.34e-06],"winrateAvg":0.520968,"leadAvg":0.0935813,"scoreMeanAvg":0.30908,"scoreStdevAvg":5.40922,"shorttermWinlossErrorAvg":0.340796,"shorttermScoreErrorAvg":1.38621,"ownership":[-96,-95,-76,-63,-1,24,69,69,60,34,-9,-43,-96,-76,-41,50,91,95,94,-96,-97,-97,43,-22,85,76,78,75,68,93,-93,-93,-98,93,95,95,94,94,-96,-96,-97,-4,59,80,86,86,87,92,93,93,-99,-98,-99,-99,97,95,94,-94,-96,100,100,100,100,92,100,100,100,-99,-99,-99,-99,-99,97,96,94,89,-90,-82,-2,100,97,99,98,100,-98,-99,-99,-48,-67,-99,-80,97,97,97,-53,-66,-92,-90,100,99,99,99,98,100,100,100,10,-27,53,-97,-39,3,-94,-62,34,82,100,97,98,98,98,100,100,52,88,99,80,94,-97,-97,-97,-84,-76,73,81,100,100,98,100,100,100,34,59,53,78,46,73,97,96,-8,-91,-17,61,65,70,100,100,98,99,100,28,63,92,73,63,63,48,81,99,98,12,34,10,22,100,98,98,99,100,46,20,15,33,14,87,63,98,71,52,54,-20,9,-23,100,100,100,100,50,5,-43,31,-74,-13,7,50,62,25,28,15,-50,-65,-100,-100,-100,-100,-1,-15,-37,-45,-98,-61,-22,15,68,37,25,-5,-16,-76,-86,-84,-52,-48,-31,-31,-93,-93,11,-98,-52,-85,12,94,34,37,37,-57,-90,-94,-100,-43,-11,-19,7,98,98,98,-7,-14,40,94,94,93,-100,-99,-99,-96,-100,-98,-100,-34,-99,88,87,83,-37,-97,-54,-89,94,-99,-100,-100,-100,-97,-98,-99,-98,-100,-97,-100,11,99,99,99,-97,-91,-86,-99,-97,-100,-97,-98,-97,-98,-100,-97,-100,-94,-100,-100,99,99,99,99,-97,-92,-91,-93,-91,-100,-98,-98,-98,-97,-99,-93,-94,-93,-99,-99,99,99,99,-97,-83,-88,-91,-94,-100,-98,-98,-98,-97,-96,-97,-95,-95,-95,-9,26,85,64,62,-84,-83,-90,-94,-97,-98,-98],"ownershipAllowedMAE":0.0389132})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../........O....OOOX../...X.......OOXXXX../...........OX....../............X....../.................../.................../.................../...X............X../..X........X......./.....O..O..XO....../.X.O.OX....XO....../..XX.OXO...X......./OXXX.XOXX........../.OXO.XOXOO.....X.../..O..XOO.....X...../.O.OX.XO.........../.................../","hintLoc":"null","initialTurnNumber":59,"metadata":"DD438B547B80B1CFA2AB7782A54722E7:69","moveLocs":["R8","R6","Q10","Q11","Q6","R7","R9","P10","Q9","H7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.18,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui0","komi":49.0,"policyOptimism":0.041,"pda":0.0,"policyMixture":[3.58e-06,3.9e-06,3.94e-06,3.91e-06,3.8e-06,3.73e-06,3.65e-06,3.68e-06,3.78e-06,3.64e-06,3.59e-06,3.65e-06,3.66e-06,3.63e-06,3.94e-06,3.88e-06,3.96e-06,3.86e-06,3.57e-06,3.84e-06,4.59e-06,4.45e-06,4.5e-06,4.48e-06,4.5e-06,4.45e-06,4.27e-06,4.25e-06,4.09e-06,4.11e-06,4.41e-06,4.13e-06,3.71e-06,3.9e-06,4.12e-06,4.02e-06,4.28e-06,4.05e-06,3.87e-06,4.3e-06,8.78e-06,7.55e-06,4.82e-06,6.65e-06,4.64e-06,4.38e-06,0,4.4e-06,4.44e-06,4.14e-06,3.76e-06,0,0,0,0,4.31e-06,3.94e-06,3.92e-06,5.24e-06,1.64e-05,0,9.6e-06,7.1e-06,4.6e-06,4.25e-06,4.45e-06,4.42e-06,4.08e-06,0,0,0,0,0,0,4.04e-06,3.91e-06,3.82e-06,5.3e-06,1.12e-05,1.21e-05,6.3e-06,4.46e-06,4.44e-06,4.49e-06,4.33e-06,4.4e-06,3.91e-06,0,0,4.22e-06,3.92e-06,3.93e-06,4.03e-06,4.24e-06,3.8e-06,3.76e-06,4.55e-06,8.69e-06,5.68e-06,4.69e-06,4.54e-06,4.44e-06,4.47e-06,4.52e-06,4.43e-06,4.27e-06,4.93e-06,0,4.29e-06,4.39e-06,4.32e-06,4.26e-06,4.17e-06,3.81e-06,3.72e-06,4.6e-06,4.71e-06,4.49e-06,4.65e-06,4.56e-06,4.48e-06,4.45e-06,4.46e-06,4.43e-06,4.79e-06,4.42e-06,4.44e-06,4.4e-06,4.28e-06,4.29e-06,4.16e-06,4.18e-06,3.75e-06,3.76e-06,4.55e-06,4.54e-06,4.57e-06,4.9e-06,5.05e-06,4.83e-06,4.49e-06,4.4e-06,4.49e-06,4.41e-06,4.34e-06,4.32e-06,4.14e-06,4.39e-06,5.89e-06,4.68e-06,4.6e-06,3.69e-06,3.78e-06,4.35e-06,4.45e-06,4.92e-06,1.12e-05,5.89e-06,5.59e-06,4.51e-06,4.33e-06,4.46e-06,4.42e-06,4.42e-06,4.11e-06,4.39e-06,3.82e-05,0,9.36e-05,5.39e-06,3.64e-06,3.83e-06,4.38e-06,4.79e-06,0,6.98e-06,7.35e-06,6e-06,4.74e-06,4.45e-06,4.21e-06,4.31e-06,4.21e-06,4.07e-06,1.09e-05,0,0,0,6.75e-06,3.88e-06,4.03e-06,6.14e-06,0,8.39e-06,4.05e-06,4.37e-06,4.76e-06,5.28e-06,4.08e-06,4.69e-06,4.02e-06,0,4.35e-06,3.98e-06,6.26e-06,0,0,4.11e-06,4.11e-06,4.03e-06,0.000982,0.00126,3.98e-06,3.91e-06,0,2.04e-05,2.51e-05,0,5.88e-06,3.76e-06,0,0,3.76e-06,4e-06,3.87e-06,0,4.44e-06,4.2e-06,1.7e-05,0,3.28e-05,0,3.65e-06,0,0,0,0.787,0.000544,4.33e-06,0,0,3.8e-06,4.47e-06,0.000153,0,5.68e-06,4.04e-06,1.12e-05,4.91e-06,0,0,0.0039,0,0,0,0.0246,0.138,1.19e-05,0,4.44e-06,4.1e-06,4.42e-06,0,0,4.24e-06,4.15e-06,0,0,0,0,0.00241,0,0,0,0,0.0388,1.01e-05,5.38e-06,6.3e-06,4.79e-06,4.05e-06,1.68e-05,2.13e-05,4.51e-06,4.11e-06,4.22e-06,0,0,0,8.28e-05,0,0,0,0,0,4.68e-06,1.07e-05,1.78e-05,1.6e-05,2.11e-05,0,1.48e-05,4.3e-06,3.98e-06,4.47e-06,4.44e-06,0,0.000512,4.18e-05,0,0,0,4.07e-06,4.06e-06,9.55e-06,1.76e-05,2.46e-05,0,2.03e-05,1.02e-05,4.68e-06,4.25e-06,3.95e-06,4.04e-06,0,3.82e-06,0,0,0.000145,0,0,4.2e-06,6.27e-06,5.34e-06,5.82e-06,5.32e-06,7.15e-06,4.47e-06,4.45e-06,4.35e-06,4.37e-06,4e-06,4.24e-06,4.04e-06,4.3e-06,4.25e-06,1.09e-05,1.46e-05,0.000799,4.37e-06,4.1e-06,4.32e-06,4.23e-06,4.24e-06,4.18e-06,4.14e-06,4.06e-06,3.97e-06,3.93e-06,3.96e-06,3.46e-06,5e-06],"winrateAvg":0.555892,"leadAvg":1.2792,"scoreMeanAvg":-0.236636,"scoreStdevAvg":15.4354,"shorttermWinlossErrorAvg":0.37952,"shorttermScoreErrorAvg":3.73209,"ownership":[-27,-28,-27,-25,-21,-13,-1,15,32,44,52,57,57,52,29,13,-25,-37,-62,-28,-28,-32,-29,-25,-14,-3,19,40,51,54,60,62,59,58,-4,-14,-78,-76,-27,-33,-41,-42,-35,-21,-15,0,76,46,48,62,69,73,73,73,-98,-85,-83,-26,-26,-38,-85,-35,-21,-14,-7,5,28,43,86,85,-99,-99,-98,-98,-91,-84,-24,-26,-42,-33,-25,-18,-13,-8,-2,-3,24,85,-90,-81,-75,-76,-81,-84,-81,-24,-26,-27,-25,-19,-13,-9,-6,-4,-1,4,-3,-89,-59,-60,-66,-73,-79,-76,-26,-28,-27,-24,-17,-11,-8,-6,-5,-5,-5,-15,-32,-41,-52,-63,-70,-74,-68,-31,-34,-30,-27,-16,-10,-7,-6,-5,-6,-6,-12,-22,-34,-48,-65,-69,-69,-55,-41,-42,-36,-34,-14,-13,-9,-7,-6,-6,-9,-14,-17,-31,-48,-88,-66,-51,-32,-55,-56,-59,-91,-28,-13,-13,-12,-6,-10,-16,-28,-21,-15,-65,55,-65,-3,-7,-66,-76,-94,-38,-16,-4,-11,-3,4,-7,-30,-93,-28,-2,18,57,52,23,16,-68,-70,-41,-16,14,63,51,51,77,9,-28,-93,43,12,17,34,56,13,14,-59,-94,-44,38,24,64,28,25,64,21,-26,-93,43,11,16,31,-81,-17,-14,-42,-82,-94,-94,-10,66,33,56,33,43,-21,-93,-23,-6,-4,41,-81,-64,-37,42,-94,-94,-95,-71,-86,89,11,8,26,-10,-33,-18,-12,-22,-64,-65,-66,-56,45,68,-94,62,-65,-86,89,15,80,77,7,-12,-13,-26,-40,-92,-71,-65,-61,56,65,72,60,-1,-87,91,89,56,33,5,-6,-22,-83,-58,-70,-65,-65,-62,59,72,66,73,-81,-68,-68,88,50,28,12,-12,-32,-55,-62,-63,-64,-61,-62,63,61,64,40,-2,-38,29,39,45,30,13,-7,-29,-45,-55,-59,-60,-61,-61],"ownershipAllowedMAE":0.047622})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..............O..../...O............X../.................../.................../.................../.................../.................../.................../....X.X............/......OX.........../.OOXX.OOXX........./...XOOO.O.......X../.O.XOXXO.........../.OOOXOX...X......../.XXXXOXXXXOXO..X.../..XOOOOXOOOO......./...X.O.O.........../","hintLoc":"null","initialTurnNumber":0,"metadata":"4D6E91C0DA455FA9A81DD553146659A7:0","moveLocs":[],"movePlas":[],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":-5.0,"policyOptimism":0.311,"pda":0.0,"policyMixture":[2.06e-06,2.17e-06,2.11e-06,2.11e-06,2.06e-06,2.04e-06,2.06e-06,2.07e-06,2.08e-06,2.08e-06,2.06e-06,2.07e-06,2.07e-06,2.07e-06,2.12e-06,2.1e-06,2.16e-06,2.12e-06,1.97e-06,2.15e-06,2.54e-06,2.5e-06,2.55e-06,2.52e-06,2.52e-06,2.58e-06,2.56e-06,2.56e-06,2.55e-06,2.56e-06,2.56e-06,2.56e-06,2.55e-06,2.56e-06,2.35e-06,2.5e-06,2.31e-06,2e-06,2.09e-06,2.48e-06,3.48e-06,5.3e-06,3.32e-06,3.9e-06,2.62e-06,2.51e-06,2.53e-06,2.55e-06,2.66e-06,3.75e-06,4.04e-06,3.12e-06,0,4.83e-06,2.35e-06,2.22e-06,2.06e-06,2.12e-06,2.55e-06,5.08e-06,0,5.64e-06,2.85e-06,2.46e-06,2.51e-06,2.54e-06,2.53e-06,2.61e-06,2.89e-06,2.92e-06,5.52e-06,7.53e-06,2.5e-06,0,2.4e-06,2.06e-06,2.11e-06,2.53e-06,3.32e-06,6.01e-06,2.83e-06,2.48e-06,2.56e-06,2.59e-06,2.6e-06,2.61e-06,2.58e-06,2.59e-06,2.53e-06,2.49e-06,2.94e-06,4.21e-06,2.4e-06,2.43e-06,2.06e-06,2.13e-06,2.55e-06,3.64e-06,2.85e-06,2.51e-06,2.55e-06,2.54e-06,2.54e-06,2.57e-06,2.56e-06,2.56e-06,2.57e-06,2.59e-06,2.49e-06,2.55e-06,3.62e-06,2.64e-06,2.48e-06,2.06e-06,2.17e-06,2.64e-06,2.58e-06,2.52e-06,2.51e-06,2.5e-06,2.52e-06,2.53e-06,2.51e-06,2.53e-06,2.53e-06,2.56e-06,2.59e-06,2.59e-06,2.52e-06,2.79e-06,2.69e-06,2.53e-06,2.07e-06,2.18e-06,2.56e-06,2.48e-06,2.54e-06,2.53e-06,2.54e-06,2.59e-06,2.52e-06,2.52e-06,2.51e-06,2.52e-06,2.55e-06,2.58e-06,2.59e-06,2.57e-06,2.55e-06,2.53e-06,2.67e-06,2.08e-06,2.22e-06,2.62e-06,3.03e-06,2.72e-06,2.66e-06,2.57e-06,2.6e-06,2.35e-06,2.57e-06,2.53e-06,2.5e-06,2.53e-06,2.54e-06,2.56e-06,2.56e-06,2.49e-06,2.57e-06,2.65e-06,2.09e-06,2.4e-06,1.24e-05,3.39e-05,4.29e-06,2.79e-06,2.81e-06,3.23e-06,5.44e-06,2.6e-06,2.67e-06,2.49e-06,2.51e-06,2.5e-06,2.51e-06,2.53e-06,2.49e-06,2.57e-06,2.65e-06,2.09e-06,2.92e-06,0.00168,0.0013,1.79e-05,0,3.05e-06,0,5.23e-05,2.46e-05,2.52e-06,2.54e-06,2.51e-06,2.45e-06,2.48e-06,2.51e-06,2.52e-06,2.53e-06,2.58e-06,2.07e-06,3.59e-06,0.000469,0.0724,7.18e-06,2.92e-06,5e-05,0,0,4.27e-06,2.55e-06,2.5e-06,2.49e-06,2.47e-06,2.49e-06,2.52e-06,2.5e-06,2.52e-06,2.47e-06,2.05e-06,3.35e-06,0,0,0,0,1.33e-05,0,0,0,0,3.25e-06,2.74e-06,2.45e-06,2.47e-06,2.48e-06,2.39e-06,2.35e-06,2.37e-06,2e-06,2.51e-05,0.000755,0.000783,0,0,0,0,0,0,0.00758,4.31e-06,2.8e-06,2.5e-06,2.39e-06,2.49e-06,2.4e-06,0,2.38e-06,2.05e-06,3.43e-06,0,1.47e-05,0,0,0,0,0,0.00274,0.76,2.11e-05,2.69e-06,2.36e-06,2.4e-06,2.48e-06,2.33e-06,2.23e-06,2.31e-06,2e-06,1.41e-05,0,0,0,0,0,0,3.63e-06,1.39e-05,0.00236,0,1.52e-05,6.75e-06,2.44e-06,2.35e-06,2.28e-06,2.28e-06,2.26e-06,2.05e-06,1.86e-05,0,0,0,0,0,0,0,0,0,0,0,0,2.72e-06,2.22e-06,0,2.22e-06,2.3e-06,2e-06,5.38e-05,2.49e-06,0,0,0,0,0,0,0,0,0,0,2.49e-06,3.05e-06,2.39e-06,2.2e-06,2.14e-06,2.18e-06,2.06e-06,2.16e-06,0.000329,0.036,0,4.3e-06,0,0,0,0.112,9.07e-06,3.03e-06,2.31e-06,2.21e-06,2.13e-06,2.08e-06,2.07e-06,1.99e-06,2.08e-06,2.04e-06,5.79e-06],"winrateAvg":0.215805,"leadAvg":-8.74775,"scoreMeanAvg":-8.53788,"scoreStdevAvg":20.0676,"shorttermWinlossErrorAvg":0.352251,"shorttermScoreErrorAvg":7.74863,"ownership":[19,20,19,18,13,8,4,1,1,2,6,11,16,21,20,9,-6,-15,-24,19,19,22,19,17,6,3,1,0,2,6,11,16,25,28,3,-8,-23,-28,19,22,25,32,25,5,5,2,0,0,4,8,9,17,60,-9,-22,-35,-34,17,19,32,77,23,11,4,2,1,0,2,5,7,8,12,-10,-71,-45,-38,12,16,25,24,13,7,2,0,-1,-1,0,1,1,2,-4,13,-33,-41,-36,6,6,11,11,6,1,-1,-2,-2,-2,-2,-1,-1,-1,-2,-2,-21,-32,-29,-1,0,1,0,-2,-4,-5,-5,-5,-4,-3,-3,-3,-3,-3,-5,-22,-24,-22,-7,-6,-6,-7,-8,-9,-9,-9,-8,-7,-6,-5,-4,-4,-5,-10,-13,-18,-17,-11,-10,-11,-13,-16,-16,-19,-17,-13,-11,-9,-7,-6,-6,-6,-9,-10,-14,-13,-12,-14,-19,-15,-33,-32,-55,-34,-23,-17,-13,-10,-9,-8,-8,-10,-12,-14,-13,-7,-8,-16,-10,-61,35,-75,-31,-39,-28,-17,-13,-12,-10,-10,-12,-15,-18,-16,7,15,-4,-18,7,44,74,-71,-63,-47,-24,-17,-15,-13,-11,-13,-15,-23,-22,27,53,54,-39,-33,19,74,72,-81,-82,-22,-21,-16,-14,-15,-16,-22,-35,-31,41,49,0,-40,72,71,74,52,52,-11,-46,-15,-15,-15,-18,-26,-80,-45,-39,43,55,2,-49,72,-71,-76,58,-35,-77,-53,-13,-9,-10,-14,-31,-39,-45,-42,37,55,57,59,14,76,-77,-30,-47,-71,-76,-3,14,-1,-11,-30,-38,-43,-43,18,5,10,8,13,77,-77,-76,-78,-77,92,-4,84,29,-8,-74,-47,-45,-45,14,6,4,75,76,77,77,-76,91,90,90,90,70,22,-4,-39,-44,-44,-45,12,15,14,12,57,78,75,86,86,88,85,75,55,29,-2,-24,-37,-42,-44],"ownershipAllowedMAE":0.0583445})%"); + lines.push_back(R"%({"sample":{"board":".................../.X.XXOX.OOX.OX..XXO/.OX.OOX.OX.....X.O./.OOO.OOOXXX...O.XXO/......XXO.....OXXOO/O.OOOX.OOXX...OXO../.OXXO.OOXO.XXXXO.O./XX.XO.XOX...OOOOO../.XXXOX..X...XXXXO../OOOOX.X.XOOXXOOXO../XO.XXXO.XXOXOOX.XX./.X.X.OO.XOOXO..XX../.X..X...XO.O.O.X.../.OX..O..O....OX..X./......OO.X.....OOX./.XOOOOXO.OO...OOXX./.XXXXOXO.XOOOO..OX./.....XXXX.XOXOX.OO./.........X.X.X...../","hintLoc":"null","initialTurnNumber":204,"metadata":"D651F3BC12BEF1A695B194EEB355200F:214","moveLocs":["L19","N1","T12","S10","T10","T11","S11","T13","N2","C5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.53,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1button1","komi":7.5,"policyOptimism":0.0,"pda":1.413,"policyMixture":[0.000198,0.00116,0.00313,7.26e-05,0.00712,0.00137,0.000542,0.00175,0.0146,0.0111,0,7.83e-05,9.49e-05,9.31e-05,9.03e-05,8.98e-05,8e-05,9.99e-05,7.5e-05,0.00722,0,7.29e-05,0,0,0,0,0.00027,0,0,0,8.35e-05,0,0,0.000459,8.36e-05,0,0,0,0.000393,0,0,0.00331,0,0,0,0.00373,0,0,8.78e-05,9.31e-05,0.000104,0.000702,0.000154,0,0.000272,0,0,7.96e-05,0,0,0,8.46e-05,0,0,0,0,0,0,8.28e-05,9.12e-05,0.000107,0,7.02e-05,0,0,0,7.82e-05,0.000303,7.2e-05,7.45e-05,8.13e-05,9.47e-05,0,0,0,0.000215,7.83e-05,7.93e-05,8.51e-05,8.9e-05,0,0,0,0,0,0,0.00109,0,0,0,0,7.57e-05,0,0,0,0,7.54e-05,7.72e-05,8.74e-05,0,0,0,0.00686,8.31e-05,0.000258,0,0,0,0,0.00124,0,0,0,0,9.29e-05,0,0,0,0,0,0,0,0,0,0,4.43e-05,0,0,0.00616,0,0,0,0.000101,0.000557,0.00247,0,0,0,0,0,6.68e-05,0,7.05e-05,0,0,0,0,0,0.000129,0.000533,0,0.000108,0.00168,0.000113,0,0,0,0,0,0,9.94e-05,0,0,0,0,0,8.19e-05,0,8.63e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,9.07e-05,0,0,0,0,8.47e-05,0,0,0,0,0,0,0,9.81e-05,0,0,0.000133,9.14e-05,0,8.23e-05,0,8.31e-05,0,0,8.32e-05,0,0,0,0,0,0.000148,8.92e-05,0,0,7.41e-05,7.9e-05,9.01e-05,0,0.000111,9.56e-05,0,0.00325,0.00179,0.000118,0,0,9.59e-05,0,0.00458,0,9.04e-05,0,8.23e-05,8.51e-05,8.21e-05,0.00011,0,0,0.000825,0.000128,0,8.38e-05,0.000283,0,0.000343,0.000101,8.62e-05,0.00282,0,0,8.79e-05,0.000104,0,7.67e-05,9.5e-05,0.771,0,8.36e-05,0.000374,0.000115,0,0,0.000188,0,7.64e-05,8.21e-05,9.03e-05,0.000368,0.00103,0,0,0,7.04e-05,8.4e-05,0,0,0,0,0,0,0,9.34e-05,0,0,7.05e-05,7.57e-05,7.79e-05,0,0,0,0,7.79e-05,7.51e-05,0,0,0,0,0,0,0,0.000322,0,0,0,0,0,8.87e-05,0.000147,0,0,9.92e-05,7.25e-05,7.27e-05,7.21e-05,7.16e-05,7.39e-05,0,0,0,0,9.09e-05,0,0,0,0,0,0.000564,0,0,0.000105,7.11e-05,7.19e-05,7.11e-05,7.09e-05,7.13e-05,7.03e-05,6.94e-05,7.41e-05,8.11e-05,0,0.000109,0,0.124,0,0.000153,8.27e-05,8.18e-05,8.51e-05,7.44e-05,7.22e-05],"winrateAvg":0.933763,"leadAvg":2.47892,"scoreMeanAvg":3.19467,"scoreStdevAvg":5.58708,"shorttermWinlossErrorAvg":0.114234,"shorttermScoreErrorAvg":0.919409,"ownership":[97,96,97,97,97,98,96,89,23,-33,-98,-94,-91,-90,-89,-83,-69,13,43,97,96,97,96,96,100,95,96,99,99,-98,-93,-89,-94,-91,-90,-96,-96,93,98,100,97,98,100,100,94,98,99,-99,-98,-91,-93,-92,-96,-97,-86,91,94,97,100,100,100,100,100,100,100,-99,-99,-99,-94,-94,-96,-95,-95,-97,-97,100,95,94,97,99,99,99,98,98,99,15,-93,-95,-95,-96,-95,-97,-97,100,100,94,87,100,100,100,96,98,99,99,-99,-99,-96,-96,-96,-95,-97,98,98,99,-49,87,-99,-99,100,96,99,99,-99,-17,-58,-99,-99,-99,-99,100,99,100,100,-99,-99,-99,-99,100,34,-73,99,-99,-38,8,-34,100,100,100,100,100,97,-15,-99,-99,-99,-99,100,-94,-45,10,-99,-9,53,45,-98,-97,-97,-97,100,-11,-16,-98,-98,-98,-98,-100,-94,-98,-68,-99,99,100,-98,-98,99,98,-98,100,100,-92,-99,-98,-99,-100,-100,-100,95,-7,-99,-99,100,-98,98,98,-95,-96,-99,-99,-93,-98,-100,-98,-100,-31,95,95,6,-99,100,100,-98,99,48,-13,-99,-99,-95,-93,-95,-100,-94,-44,-90,6,37,-16,-99,100,99,100,98,100,23,-99,-75,-89,-90,-90,-84,-96,34,-2,99,74,25,98,97,97,97,97,100,-86,-38,14,-98,-87,-90,-89,97,34,34,98,100,100,95,95,97,97,96,89,-40,100,100,-99,-86,-93,-100,98,99,99,99,-100,100,63,100,100,98,96,95,100,100,-98,-98,-73,-99,-100,-100,-100,-100,99,-100,100,1,-66,100,100,100,100,84,96,98,-98,15,-99,-100,-100,-100,-100,-100,-100,-100,-100,-47,-68,100,51,99,47,75,98,98,20,-100,-100,-100,-100,-100,-99,-98,-95,-83,-81,-3,-6,51,49,52,78,87,76,61],"ownershipAllowedMAE":0.0344118,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":"...O.O...O........./..OX.XOOOOXXO.X..../.OOX.XOXOX.X.OXX.X./.XX...XXX.X..OOOX../.OX.........O..OOX./.OX.X.....XOOXXOX.X/.XX......OOOXOXO.X./.OXO.OOO..OXX....../.XOO..XOXOX..X.X.../.XXO.XOXO..X...XOO./..X.O...OXXOOOX.XX./...XOXXXOXOXXX.XOO./.O.XXOOOXXO..X.XXO./....OXOOX.O.O...OO./.OOO.XOXOOO.O..X.../.XX.OOOX..XO.XX.O../...XO.XXXOOOXXOO.../....XX.O.XXOXO...../...........X..O..../","hintLoc":"null","initialTurnNumber":187,"metadata":"FB97BF9C4407D7C41DF88D93E83CC725:197","moveLocs":["A4","A3","A5","C3","T9","A16","K15","K16","F15","A18"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.61,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":13.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.5e-05,0.000195,0.000111,0,0.000482,0,0.000157,3.63e-05,2.41e-05,0,0.0152,0.00297,8.73e-05,5.09e-05,3.18e-05,3.2e-05,3.06e-05,2.99e-05,2.96e-05,0,2.85e-05,0,0,0.000178,0,0,0,0,0,0,0,0,0.000119,0,3.18e-05,0.00112,3.03e-05,3.01e-05,0.874,0,0,0,0.000152,0,0,0,0,0,0,0,0.000386,0,0,0,0.00178,0,2.99e-05,0,0,0,0.00149,0.000104,0.086,0,0,0,0,0,0.000506,3.18e-05,0,0,0,0,0.00238,3.46e-05,2.97e-05,0,0,3.61e-05,0.000129,0,7.35e-05,3.55e-05,3.39e-05,0,4.08e-05,3.42e-05,0,3.26e-05,3.41e-05,0,0,0,3.12e-05,2.98e-05,0,0,3.44e-05,0,5.99e-05,4.97e-05,3.59e-05,3.22e-05,3.37e-05,0,0,0,0,0,0,0,0,0,3.03e-05,0,0,3.27e-05,3.24e-05,3.24e-05,3.32e-05,3.47e-05,3.33e-05,0,0,0,0,0,0,0,2.99e-05,0,3.1e-05,3.17e-05,0,0,0,3.25e-05,0,0,0,3.16e-05,3.12e-05,0,0,0,3.13e-05,3.59e-05,3.52e-05,3.04e-05,3.11e-05,3.36e-05,3.24e-05,0,0,0,3.08e-05,3.16e-05,0,0,0,0,0,0.000958,3.38e-05,0,2.95e-05,0,3.21e-05,3.21e-05,3.38e-05,3.24e-05,0,0,0,3.27e-05,0,0,0,0,0.00195,0.000177,0,4.29e-05,3.09e-05,3.32e-05,0,0,0,3.3e-05,3.34e-05,3.26e-05,0,8.43e-05,0,3.2e-05,3.07e-05,3.22e-05,0,0,0,0,0,0,0,4.13e-05,0,0,0,3.37e-05,3.53e-05,3.12e-05,0,0,0,0,0,0,0,0,0,0,0,3.16e-05,0,0,0,3.19e-05,3.37e-05,0,3.13e-05,0,0,0,0,0,0,0,0,3.22e-05,3.1e-05,0,3.11e-05,0,0,0,3.03e-05,3.27e-05,2.97e-05,3.2e-05,3.18e-05,0,0,0,0,0,0.000668,0,3.22e-05,0,3.15e-05,6.44e-05,6.34e-05,0,0,3.05e-05,0,0,0,0,3.01e-05,0,0,0,0,0,0,2.58e-05,0,3.35e-05,3.54e-05,0,3.15e-05,3.3e-05,3.08e-05,0,0,0,3.13e-05,0,0,0,0,3.34e-05,3.21e-05,0,0,3.25e-05,0,0,5.67e-05,0,3.19e-05,3.14e-05,0,0.000123,0,0,0,0.000144,0,0,0,0,0,0,0,0,0,0,3.18e-05,3.2e-05,3.1e-05,8.81e-05,0.000227,0.00181,0.00167,0,0,0.000153,0,0.000206,0,0,0,0,0,2.93e-05,3.04e-05,3.18e-05,3.14e-05,3.05e-05,2.92e-05,3.06e-05,2.94e-05,3.07e-05,3.04e-05,3.12e-05,3.13e-05,3.08e-05,3.22e-05,3.77e-05,8.05e-05,0,6.51e-05,3.59e-05,0,3e-05,3.07e-05,3.09e-05,2.99e-05,3.47e-05],"winrateAvg":0.158142,"leadAvg":-1.68351,"scoreMeanAvg":-1.98434,"scoreStdevAvg":5.53792,"shorttermWinlossErrorAvg":0.261926,"shorttermScoreErrorAvg":1.73374,"ownership":[-19,-64,93,91,87,90,87,83,63,90,-14,-60,-37,-49,-72,-94,-94,-97,-98,-66,6,92,-98,-69,-98,91,90,90,89,-97,-97,89,-52,-99,-95,-95,-97,-98,90,92,92,-98,-88,-98,92,-98,91,-98,-96,-97,72,99,-99,-98,-96,-99,-98,-100,-100,-100,-88,-55,-40,-98,-98,-98,-98,-98,-17,52,99,99,99,-97,-96,-97,-100,-99,-100,-65,-9,68,23,-23,-19,57,-16,25,100,43,26,99,99,-98,-97,-100,-99,-100,-62,-94,3,36,4,-9,24,-37,100,100,-98,-98,99,-68,-69,-98,-100,-100,-100,7,-38,7,44,38,34,100,100,100,-100,-97,-98,99,44,-96,-70,-100,-99,-100,99,7,100,100,100,96,97,100,-100,-100,-98,-86,2,0,5,-22,-95,-100,99,98,93,97,96,100,95,98,-97,-97,-98,-100,-89,-100,-23,8,22,-65,-100,-100,99,96,94,98,96,98,30,-94,-98,-97,-98,-95,-100,90,92,80,-40,-43,-100,-41,97,96,96,97,98,-96,-96,-94,-95,-96,-100,-53,-50,-1,96,23,-6,-48,-97,97,94,94,94,98,-96,99,-100,-100,-100,-93,-100,99,99,95,52,96,30,-97,-98,99,99,99,-96,-96,99,-57,-21,-100,-45,-100,-100,99,97,88,84,-11,-11,99,99,100,100,-96,47,98,90,98,19,-20,-36,99,99,97,99,100,100,100,99,99,100,-98,99,98,98,97,98,30,-51,-97,-41,96,97,99,-97,-97,-16,100,100,100,-98,-51,95,96,98,30,-98,-98,-6,97,96,96,-92,-93,-97,-97,100,-11,-98,-98,-98,99,99,98,-98,-98,94,95,94,94,95,-92,-93,-95,-97,-99,-99,-95,-89,-90,-91,-90,98,-97,76,76,87,91,92,93,-93,-94,-96,-97,-97,-96,-94,-92,-89,-85,-78,-81,-67,-26,82,82,87,90,92],"ownershipAllowedMAE":0.0456729})%"); + lines.push_back(R"%({"sample":{"board":"..X.O..XO..XX....../.XXXOOO.OXXOX.XOO../XOXOXXOOXXO.OX.XO../.OXO.XXXOOO.OO.XO.X/.OXO...XXX..X..XO../.XOX.O.OO..XO.X.O../.OOOOXXXO..XO.X.OX./.....XOOXX.XO....X./....XO.....X.XX..../...OO.O.....XOOX.../....XXO..OO.XXO.X../..XXOOXXOXO.O.OOX../........OX.OO.O.OX./.OXOOOOOO.XXOX.O.X./...O.XXXOOXXXOXOO../.OO.OOXOXX.OOOX.X../.XOXXXOOX.X.XX.X.../.XX.XOO.OX........./....XXO............/","hintLoc":"null","initialTurnNumber":195,"metadata":"D653F8084DB0F7CD70BA8867B6DB4D83:205","moveLocs":["T17","G19","A19","A18","D19","T15","S16","H11","G11","G14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.95,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":8.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,1.72e-06,0,0,0,1.76e-06,0,0,0,2.12e-06,6.83e-05,0,0,5.93e-06,5.58e-06,3.87e-06,2.57e-06,3.08e-06,3.12e-06,0,0,0,0,0,0,0,4.66e-06,0,0,0,0,0,0.000459,0,0,0,4.39e-06,3.78e-06,0,0,0,0,0,0,0,0,0,0,0,0.000377,0,0,0.00169,0,0,2.26e-06,0,2.22e-06,0,0,0,1.58e-06,0,0,0,0,0,0,4.81e-06,0,0,5.87e-05,0,0,0,0,3.9e-06,0,0,0,3.69e-06,9.23e-06,3.08e-05,0,0,0,5.31e-06,4.25e-06,0,2.93e-06,2.17e-05,0,0,4.02e-06,0,0.00338,0,0,0,3.9e-06,0,0,0,0,3.93e-06,3.33e-06,0,0,3.04e-06,0,0.000261,0,3.27e-05,0.000174,2.86e-06,0,0,0,0,0,0,0,0,3.51e-06,3.07e-06,0,0,3.07e-06,0,3.55e-06,0,0,3.17e-06,2.8e-06,2.82e-06,2.62e-06,3.35e-06,0.89,0,0,0,0,0,4.19e-06,0,0,9.22e-06,9.74e-05,0.000286,0.028,0,2.84e-06,2.7e-06,2.83e-06,2.73e-06,4.86e-06,0,0,0,0,0.00206,2.79e-05,8.22e-06,0,0.000296,0,0,0.000113,0.000394,1.59e-05,2.98e-06,2.78e-06,2.87e-06,2.77e-06,0,0,3.26e-06,0,2.25e-05,0.000647,5.26e-06,3.46e-06,0.0167,0,0,0,0,2.58e-05,1.49e-05,2.87e-06,2.85e-06,2.88e-06,2.86e-06,2.81e-06,0,0,0,3.82e-06,4.25e-06,0,0,3.24e-06,0,0,0,6.3e-06,0,4.89e-06,2.93e-06,2.92e-06,3.1e-06,0,0,0,0,0,0,0,0,0,3.1e-06,0,3.38e-06,0,0,0,4.23e-06,3.11e-06,2.95e-06,2.99e-06,3.07e-06,3.13e-06,2.94e-06,2.76e-06,3.14e-06,3.1e-06,0,0,1.14e-05,0,0,9.77e-06,0,2.81e-06,0,0,3.02e-06,3.11e-06,0,0,0,0,0,0,0,0,5.88e-06,0,0,0,0,0.00166,0,3.37e-06,0,3.01e-06,3.31e-06,2.92e-06,3.13e-06,0,5.62e-06,0,0,0,0,0,0,0,0,0,0,0,0,0.0506,3.4e-06,3.66e-06,0,0,3.54e-06,0,0,0,0,0,0,2.5e-06,0,0,0,0,0.000193,0,0.000223,3.08e-06,0.00105,0,0,0,0,0,0,0,0,0,0,5.55e-06,0,0,5.9e-06,0,9.27e-06,4.8e-06,3.05e-06,0.00018,0,0,2.67e-06,0,0,0,2.96e-06,0,0,4.28e-06,8.59e-06,2.87e-06,2.95e-06,3.46e-06,3.28e-06,2.99e-06,3.41e-06,3.35e-06,2.66e-06,4.09e-06,3.86e-06,3.41e-06,0,0,0,3.21e-06,3.86e-06,2.45e-05,4.13e-06,3.33e-06,2.6e-06,2.64e-06,2.64e-06,2.81e-06,2.91e-06,3.09e-06,2.8e-06,5.48e-06],"winrateAvg":0.912056,"leadAvg":3.31521,"scoreMeanAvg":3.1474,"scoreStdevAvg":4.35486,"shorttermWinlossErrorAvg":0.207215,"shorttermScoreErrorAvg":1.51863,"ownership":[98,97,98,99,99,56,-81,-86,-82,-96,-97,-100,-100,-78,-13,20,92,98,97,97,97,98,98,99,99,98,-72,-81,-99,-99,-98,-100,-98,-99,99,99,98,97,98,100,98,100,-100,-100,98,97,-100,-100,-97,-99,-97,-99,-99,-100,99,97,97,100,100,98,100,-69,-100,-100,-100,-94,-97,-97,-98,-97,-97,-98,-100,99,99,-65,100,100,97,100,-65,-39,-99,-100,-100,-100,-98,-98,-99,-98,-98,-100,99,77,-75,100,100,100,99,99,99,-99,-96,-95,-97,-97,-100,-96,-98,-100,14,99,-84,-76,100,100,100,100,100,-99,-99,-98,-95,-97,-90,-100,-96,-98,-100,15,99,-98,-85,99,98,97,95,96,-98,99,99,-99,-99,-70,-100,-96,-97,-42,15,46,-98,-93,98,98,98,95,89,99,99,-14,-12,-36,-15,-100,-97,-100,-99,-45,-68,-95,-96,98,98,98,100,100,99,99,45,-33,7,28,11,-98,99,100,-91,-82,-96,-97,98,98,98,98,97,96,99,24,44,99,100,-3,-97,-97,100,2,-99,-97,-96,97,97,97,97,100,100,32,28,100,-42,100,83,100,47,100,100,-99,-97,-93,97,97,98,99,98,82,62,79,100,-46,39,100,100,73,100,90,93,-98,-64,92,99,97,100,100,100,100,100,100,2,-99,-99,100,-23,42,99,24,-97,17,67,96,98,100,99,98,98,99,100,100,-99,-99,-99,-27,-98,100,99,85,63,-49,99,99,9,99,99,98,99,-99,-99,-99,-44,-39,-39,-99,16,-91,-66,60,-67,-99,99,-98,-99,-99,99,99,-99,-99,-100,-92,-100,-100,-98,-100,-82,-40,-33,-98,-99,-99,-99,-99,99,99,43,37,-99,-98,-98,-99,-99,-97,-94,-84,-66,-44,-99,-99,-99,-99,-99,-98,99,68,-4,-69,-97,-98,-98,-97,-95,-90,-82,-71,-60],"ownershipAllowedMAE":0.0394329,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":"............O....../.X.X.XXOO.OOOX..XX./..OX..OXOOX.XXXXOX./..OX...X.OX.XOXOOOX/...X....XXO..O.O.X./.O........XX...OX../.OX.........O..OX../.OX...........OX.X./.OOX..........OOXX./.OXX............OO./.X.............O.../.................../..........X.X.XOX../...............OOX./........O........O./..XXXXX........O.../..OOOXOXO....XO..../.....OOO.........../.................../","hintLoc":"null","initialTurnNumber":103,"metadata":"42EB28FEBC3EF7754B3185EF215C28A3:113","moveLocs":["C15","C18","A16","P2","Q2","J8","L11","L10","M6","L6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.28,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.56e-06,2.78e-06,2.61e-06,2.55e-06,2.79e-06,3.04e-06,3.31e-06,2.84e-06,3.32e-06,2.93e-06,3e-06,2.11e-06,0,3.13e-06,3.07e-06,2.9e-06,2.85e-06,2.8e-06,2.58e-06,2.9e-06,0,0,0,3.23e-06,0,0,0,0,2.31e-06,0,0,0,0,2.96e-06,2.77e-06,0,0,2.8e-06,3.13e-06,3.13e-06,0,0,3e-06,3.53e-06,0,0,0,0,0,4.11e-06,0,0,0,0,0,0,0.000769,0,3.19e-06,0,0,2.78e-06,2.9e-06,3.77e-06,0,5.51e-06,0,0,3.98e-06,0,0,0,0,0,0,0,2.71e-06,2.69e-06,0,0,3.53e-06,3.44e-06,3.51e-06,2.24e-05,0,0,0,3.48e-06,3.51e-06,0,3.19e-06,0,2.05e-05,0,0.000163,2.62e-06,0,1.14e-05,0.0744,6.66e-06,5.38e-06,3.59e-06,3.64e-06,4.22e-06,4.34e-06,0,0,3.22e-06,3.02e-06,3.18e-06,0,0,1.75e-05,7.41e-06,2.72e-06,0,0,8.71e-06,3.53e-05,7.16e-06,3.79e-06,4.04e-06,5.44e-06,7.24e-06,2.58e-05,7.71e-06,0,2.83e-06,2.83e-06,0,0,3.75e-06,2.99e-06,2.76e-06,0,0,0.000642,2.13e-05,4.06e-06,4.02e-06,4.73e-06,1.7e-05,0.149,0.0821,0.0223,3.55e-06,2.93e-06,0,0,3.38e-06,0,3.07e-06,2.68e-06,0,0,0,4.41e-06,4.3e-06,4.31e-06,4.84e-06,0.000114,0.208,0,0.00251,5.12e-06,3.3e-06,0,0,0,0,2.99e-06,2.97e-06,0,0,0,4.81e-06,4.74e-06,4.82e-06,5.28e-06,6.53e-06,0.0325,0,0.0495,6.52e-06,3.81e-06,2.76e-06,2.62e-06,0,0,3.33e-06,6.68e-06,0,5.49e-05,5.81e-06,6.22e-06,5.69e-06,6.45e-06,6.45e-06,8.08e-05,3.73e-05,3.21e-05,0.000131,2.03e-05,4.73e-06,3.33e-06,0,2.83e-06,3.03e-06,3.09e-06,3.73e-06,0.0335,6.04e-05,1.02e-05,6.36e-06,7.49e-06,1.52e-05,0.000276,0,0.00639,6.22e-05,0.00175,3.36e-05,7.06e-06,4.11e-06,2.87e-06,2.46e-06,2.92e-06,2.78e-06,3.7e-06,1.5e-05,5.55e-05,1.6e-05,1.59e-05,1.69e-05,1.13e-05,0.000634,0.0707,4.24e-05,0,0.000212,0,4.99e-06,0,0,0,2.81e-06,2.86e-06,3.57e-06,2.85e-05,2.9e-05,1.78e-05,1.53e-05,1.94e-05,0.000107,0.213,3.62e-05,6.71e-06,0,0,0.000132,4.13e-05,5.36e-06,0,0,0,2.78e-06,3.81e-06,2.05e-05,4.66e-06,3.74e-06,3.63e-06,4.04e-06,7.55e-06,0.000167,0,5.72e-06,0.0129,0.0301,0.000107,0.000175,5.84e-06,2.93e-06,2.5e-06,0,2.68e-06,3.75e-06,7.91e-05,0,0,0,0,0,1.47e-05,3.54e-06,5.28e-06,3.33e-05,0.00195,8.58e-05,0.00388,5.01e-06,0,2.59e-06,2.46e-06,2.54e-06,3.99e-06,7.13e-06,0,0,0,0,0,0,0,4.06e-06,8.28e-06,1.79e-05,5.74e-06,0,0,3.09e-06,2.72e-06,2.72e-06,2.43e-06,3.09e-06,3.89e-06,3.35e-06,2.81e-06,2.67e-06,0,0,0,2.92e-06,3.9e-06,4.72e-06,4.89e-06,4.77e-06,5.37e-06,0,0,2.76e-06,2.75e-06,2.55e-06,2.45e-06,2.73e-06,2.85e-06,2.79e-06,2.72e-06,2.55e-06,2.48e-06,2.58e-06,2.66e-06,2.95e-06,2.93e-06,2.95e-06,2.94e-06,3.13e-06,3.81e-06,3.03e-06,2.73e-06,2.61e-06,2.53e-06,4.15e-06],"winrateAvg":0.791428,"leadAvg":1.72626,"scoreMeanAvg":2.52806,"scoreStdevAvg":7.97974,"shorttermWinlossErrorAvg":0.153155,"shorttermScoreErrorAvg":0.994226,"ownership":[-85,-93,-98,-99,-97,-82,-13,-14,93,94,95,95,95,54,-91,-94,-98,-99,-99,-71,-100,-100,-100,-97,-99,-99,95,95,95,95,95,95,-100,-96,-98,-100,-100,-98,41,-71,98,-100,-89,-79,-75,-97,95,95,-97,54,-100,-100,-100,-100,95,-100,-97,97,92,98,-100,-74,-72,-77,-97,-42,95,-98,-80,-100,70,-100,95,95,95,-97,97,98,99,-99,-60,-60,-56,-62,-99,-99,-82,-80,11,70,-44,95,3,-97,-95,98,99,50,40,-39,-54,-52,-44,-41,-50,-98,-97,-6,31,18,94,-96,-95,-94,98,99,-84,-15,-64,-52,-50,-39,-19,-9,-16,12,83,50,79,94,-96,-93,-92,98,99,-84,-73,-59,-53,-49,-42,-17,20,28,30,29,53,99,7,11,-94,-84,92,99,99,-96,-61,-52,-49,-43,-33,-1,56,-7,5,35,99,99,-95,-95,-53,53,99,-96,-96,-57,-51,-48,-43,-34,-19,-67,-6,-4,8,17,93,99,99,-47,28,-63,-59,-60,-51,-49,-47,-44,-36,-31,-30,-18,-9,7,22,99,95,92,90,-5,3,-62,-57,-53,-49,-46,-43,-85,-32,-42,-27,-19,0,9,45,94,93,91,-23,-33,-42,-51,-50,-46,-52,-9,-4,-33,-88,-27,-70,-21,-49,100,92,95,93,-39,-33,-45,-46,-41,-30,18,40,18,-15,-89,26,-15,1,25,100,100,92,95,-36,-62,-62,-58,-50,-38,-19,26,84,9,-22,-6,-3,4,27,56,95,98,95,-23,-11,-94,-94,-95,-95,-95,-38,58,11,-17,3,3,10,-2,99,95,95,95,14,14,96,96,97,-95,99,-35,94,30,7,2,-1,-30,97,96,95,95,94,22,73,81,93,96,99,99,99,78,21,13,3,-12,15,17,97,92,92,93,56,74,83,89,94,96,94,85,63,35,11,-2,-3,7,38,41,86,90,92],"ownershipAllowedMAE":0.0352886})%"); + lines.push_back(R"%({"sample":{"board":".................../..XXOOX............/..X.X..X.O..O....../..X.X.O........O.../..XXO............../..OOO............../.................../.................../...............XO../...............XXO./.............OOXO../.............X.OXX./.....O.O....XOO.OX./..X.XXXXO.......OX./..........X.O.XXOX./..X.OO.X.OX..X.OX../...XXO..XOOO...OX../.......X.XO...O.OX./........X........O./","hintLoc":"null","initialTurnNumber":83,"metadata":"DFD2D1A6E0380A8227B7CDF0D70D80F2:93","moveLocs":["Q12","R12","S11","R13","Q13","R14","Q14","Q7","Q6","P6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.6,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.56e-06,1.65e-06,1.74e-06,1.67e-06,1.63e-06,1.68e-06,2.05e-06,1.8e-06,1.66e-06,1.61e-06,1.63e-06,1.62e-06,1.64e-06,1.62e-06,1.67e-06,1.62e-06,1.62e-06,1.75e-06,1.5e-06,1.76e-06,1.75e-06,0,0,0,0,0,2.68e-06,2.14e-06,2.24e-06,2.01e-06,1.92e-06,1.99e-06,1.88e-06,1.88e-06,1.98e-06,1.96e-06,1.88e-06,1.73e-06,1.8e-06,1.78e-06,0,1.78e-06,0,1.39e-05,3.66e-05,0,2.28e-06,0,2.19e-06,1.96e-06,0,1.85e-06,1.97e-06,2.16e-06,2.97e-06,2.37e-06,1.72e-06,1.84e-06,1.92e-06,0,1.82e-06,0,2.41e-06,0,5.42e-05,3.58e-06,2.55e-06,2.31e-06,2.11e-06,2.05e-06,1.98e-06,1.97e-06,0,9.06e-06,8.22e-06,1.79e-06,1.79e-06,1.91e-06,0,0,0,2.17e-06,3.15e-06,3.89e-06,1.42e-05,3.1e-06,2.45e-06,2.28e-06,2.22e-06,2.01e-06,2.06e-06,3.48e-06,0.0561,7.27e-06,1.97e-06,1.82e-06,2.32e-06,0,0,0,1.86e-06,5.8e-06,5.88e-06,4.44e-06,2.91e-06,2.51e-06,2.35e-06,2.31e-06,2.16e-06,1.8e-06,0,0,2.92e-06,2.04e-06,1.77e-06,2.06e-06,1.81e-06,1.69e-06,1.77e-06,2.17e-06,2.47e-06,3.66e-06,3.29e-06,2.78e-06,2.56e-06,2.46e-06,2.43e-06,2.36e-06,1.66e-06,0,0,2.31e-06,2.01e-06,1.74e-06,2.13e-06,2.26e-06,2.26e-06,2.33e-06,2.45e-06,2.77e-06,3.23e-06,3.23e-06,2.83e-06,2.57e-06,2.53e-06,3.24e-06,4.21e-06,2.78e-06,0,0,7.02e-06,1.77e-06,1.76e-06,2.42e-06,4.11e-06,4.99e-06,3.43e-06,3.85e-06,4.37e-06,4.57e-06,4.1e-06,3.05e-06,2.64e-06,2.7e-06,3.67e-06,1.27e-05,0.181,0,0,0,1.57e-06,1.81e-06,2.47e-06,1.35e-05,1.7e-05,9.48e-06,7.92e-06,5.7e-06,6.03e-06,5.19e-06,3.24e-06,2.88e-06,2.84e-06,3.14e-06,2.12e-06,0.000205,0,0,0,1.59e-06,1.83e-06,2.47e-06,1.19e-05,1.07e-05,4.83e-06,8.97e-06,3.12e-06,5.82e-06,4.14e-06,3.05e-06,2.7e-06,3.12e-06,2.9e-06,0,0,0,0,0.0757,1.73e-06,1.81e-06,2.5e-06,6.99e-06,8.46e-06,2.5e-06,2.39e-06,2.31e-06,4.25e-06,5.87e-06,2.42e-06,2.37e-06,2.55e-06,8.1e-06,0,0.00379,0,0,0,1.68e-06,1.81e-06,2.41e-06,6.49e-06,3.23e-06,2.28e-06,0,4.01e-06,0,5.69e-06,3.08e-06,2.3e-06,2.41e-06,0,0,0,0.682,0,0,1.8e-06,1.8e-06,3.43e-06,0,5.75e-06,0,0,0,0,0,2.17e-06,2.08e-06,2.11e-06,3.79e-06,9.39e-06,0,0,0,0,1.66e-06,1.78e-06,2.13e-06,7.73e-06,7.29e-06,1.68e-06,1.5e-06,5.01e-06,3e-05,2.84e-05,2.29e-06,0,2.05e-06,0,1.98e-06,0,0,0,0,1.66e-06,1.75e-06,2.15e-06,0,1.85e-05,0,0,2.01e-06,0,2.27e-06,0,0,2.02e-06,2.22e-06,0,1.99e-06,0,0,1.85e-06,1.63e-06,1.71e-06,1.87e-06,1.22e-05,0,0,0,2.2e-06,2.05e-06,0,0,0,0,2.05e-06,1.97e-06,1.89e-06,0,0,4.02e-06,1.91e-06,1.75e-06,1.89e-06,1.91e-06,1.85e-06,1.87e-06,2.07e-06,1.88e-06,0,0,0,0,1.68e-06,1.8e-06,1.77e-06,0,1.65e-06,0,0,1.95e-06,1.57e-06,1.76e-06,1.72e-06,1.72e-06,1.7e-06,1.7e-06,1.9e-06,1.62e-06,0,1.89e-06,1.79e-06,1.83e-06,1.65e-06,1.73e-06,1.65e-06,1.55e-06,1.65e-06,0,1.74e-06,5.06e-06],"winrateAvg":0.859349,"leadAvg":4.58964,"scoreMeanAvg":6.53239,"scoreStdevAvg":13.6333,"shorttermWinlossErrorAvg":0.224998,"shorttermScoreErrorAvg":3.33518,"ownership":[-93,-96,-95,-63,-44,-11,-10,-2,16,30,43,52,57,56,51,44,37,34,29,-91,-95,-99,-99,4,7,-34,-11,12,40,50,58,64,60,52,47,39,29,24,-85,-93,-99,-97,-98,-12,26,-34,20,79,43,43,88,53,53,52,33,24,19,-62,-86,-99,-97,-98,-27,73,26,9,16,33,33,39,47,50,86,38,14,12,-33,-30,-99,-99,88,16,31,24,16,20,23,27,33,37,45,43,8,-3,3,13,18,88,88,88,38,25,22,15,18,21,26,29,35,44,91,-38,-10,-8,29,44,44,44,37,24,21,19,16,16,19,23,27,32,42,93,-36,-20,-13,27,17,26,19,22,20,17,15,14,14,17,22,27,33,39,92,-36,-19,-23,19,20,20,16,18,17,15,13,12,13,16,20,26,39,43,-47,1,-5,-31,8,7,14,11,12,12,12,12,12,13,16,21,31,42,48,-45,-48,1,-45,-7,-7,-2,2,3,8,7,10,11,14,18,25,35,94,94,-48,-39,-54,-60,-22,-24,-10,-4,-8,4,2,11,11,16,20,26,34,36,89,92,-95,-94,-77,-42,-42,-31,-24,-31,34,-34,45,7,19,22,26,-3,92,91,43,38,-93,-89,-57,-71,-95,-55,-97,-97,-97,-96,76,43,32,31,32,34,13,43,42,-93,-89,-75,-84,-84,-82,-83,-84,-84,10,33,56,7,38,70,35,16,17,40,-93,-84,-83,-91,-98,-82,-68,-68,-72,-85,14,95,8,60,34,11,41,89,-84,-82,-63,-88,-91,-93,-98,-97,-69,-76,-81,-86,95,95,95,52,47,54,90,-82,-8,-33,-90,-91,-92,-94,-90,-87,-79,-89,-76,-76,95,85,82,56,92,87,89,-12,3,-91,-91,-91,-91,-89,-86,-85,-84,-85,-16,40,77,76,80,82,85,79,81,26],"ownershipAllowedMAE":0.0451863})%"); + lines.push_back(R"%({"sample":{"board":"................../................../..O.X..........O../...OX...O........./..OX............../.OXX............../.O................/................../................../................../................../................../...X............../..O.............../....X.........X.../...X............../................../................../","hintLoc":"null","initialTurnNumber":7,"metadata":"2A8D1C6137A4D1145C2CEAFC6ED15E92:17","moveLocs":["Q6","N3","F14","G16","P12","C11","C8","F11","G11","G10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":2.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.69e-05,2.01e-05,2.15e-05,2.06e-05,1.95e-05,2.01e-05,2.05e-05,2.15e-05,2.39e-05,2.34e-05,2.24e-05,2.24e-05,2.21e-05,2.13e-05,2.08e-05,2.03e-05,1.87e-05,1.76e-05,1.91e-05,2.34e-05,2.47e-05,4.78e-05,2.19e-05,2.58e-05,2.95e-05,0.000218,0.00376,0.000226,4.79e-05,4.56e-05,4.16e-05,3.91e-05,3.21e-05,2.41e-05,2.27e-05,1.87e-05,1.84e-05,1.79e-05,0,2.37e-05,0,2.16e-05,0,0.0292,9.22e-05,0.00101,0.000521,0.000404,0.000258,6.53e-05,3.65e-05,0,2.36e-05,2.03e-05,1.89e-05,2.18e-05,2.59e-05,0,0,3.27e-05,0.000276,4.59e-05,0,4.5e-05,0.000668,0.000998,0.000304,0.000148,7.07e-05,3.44e-05,2.96e-05,2.02e-05,1.95e-05,1.89e-05,0,0,8.02e-05,0,3.26e-05,0.000726,4.21e-05,9.8e-05,0.000514,0.000317,8.95e-05,4.55e-05,0.000114,4.47e-05,3.27e-05,2.02e-05,1.65e-05,0,0,0,2.39e-05,2.71e-05,4.55e-05,0.00025,0.00137,0.00133,0.000511,0.000353,0.000219,5.09e-05,3.81e-05,4.66e-05,3.26e-05,2.11e-05,1.72e-05,0,6.25e-05,2.01e-05,3.72e-05,0.121,0.00134,0.000501,0.00044,0.00144,0.000852,0.000647,0.000279,3.96e-05,0,3.73e-05,3.36e-05,2.14e-05,2.19e-05,7.49e-05,0,4.34e-05,4.51e-05,0,0,0.452,0.000297,0.0016,0.000722,0.000404,0.000246,5.44e-05,3.89e-05,4.34e-05,3.25e-05,2.13e-05,2.08e-05,3.05e-05,3.54e-05,5.53e-05,3.73e-05,0.175,0,0.171,8.28e-05,0.000327,0.000375,0.000288,0.000125,8.72e-05,7.99e-05,4.8e-05,3.3e-05,2.11e-05,2.2e-05,3.58e-05,3.17e-05,4.72e-05,4.87e-05,3.59e-05,3.79e-05,2.82e-05,0.000107,0.000259,0.000314,0.000274,0.000173,8.65e-05,0.000175,5.75e-05,3.45e-05,2.15e-05,2.18e-05,3.14e-05,0,3.39e-05,9.73e-05,6.59e-05,7.94e-05,0.000108,0.000156,0.000276,0.000318,0.000268,0.000181,6.72e-05,9.38e-05,5.72e-05,3.37e-05,2.09e-05,2.09e-05,4.18e-05,3.43e-05,3.46e-05,0.000215,0.000107,8.72e-05,0.000154,0.000258,0.000316,0.000378,0.000364,0.000297,0.000177,7.33e-05,3.41e-05,3.4e-05,2.08e-05,2.1e-05,3.53e-05,0.00215,0,4.04e-05,0.000245,7.2e-05,0.000134,0.000239,0.000307,0.000356,0.000426,0.000237,0.0018,4.09e-05,0,3.22e-05,2.22e-05,2.16e-05,2.97e-05,0,0.000153,2.82e-05,4.53e-05,9.28e-05,0.000105,0.000193,0.000232,0.000279,0.000194,5.94e-05,0.000203,3.84e-05,3.29e-05,0.000189,2.17e-05,2.09e-05,0.000296,3.73e-05,2.97e-05,0,4.53e-05,8.86e-05,0.000251,0.000313,0.000325,0.000314,0.00139,5.63e-05,0.000225,0,0.000249,0.000326,2.23e-05,2.03e-05,5.82e-05,0.000652,0,2.8e-05,0.000185,7.32e-05,0.000248,0.000342,0.000441,0.000623,0.000683,0,4.56e-05,5.15e-05,0.00012,8.29e-05,2.11e-05,2.1e-05,3.78e-05,3.77e-05,3.65e-05,4.91e-05,3.44e-05,3.61e-05,3.61e-05,3.9e-05,4.13e-05,5.16e-05,5.3e-05,9.95e-05,4.45e-05,4.27e-05,3.31e-05,3.07e-05,1.99e-05,1.78e-05,2.09e-05,2.2e-05,2.17e-05,2.13e-05,2.13e-05,2.12e-05,2.14e-05,2.2e-05,2.2e-05,2.24e-05,2.24e-05,2.13e-05,2.19e-05,2.06e-05,2.01e-05,2.03e-05,1.75e-05,1.4e-05],"winrateAvg":0.132239,"leadAvg":-4.54104,"scoreMeanAvg":-6.47035,"scoreStdevAvg":13.1657,"shorttermWinlossErrorAvg":0.0592333,"shorttermScoreErrorAvg":0.804908,"ownership":[41,24,0,-30,-44,-46,-35,-15,2,12,16,19,23,30,39,49,52,55,51,52,-13,-32,-59,-55,-40,-11,5,16,17,21,24,30,42,54,60,55,57,55,74,-26,-81,-51,-71,16,23,22,21,21,22,22,34,82,58,53,62,52,61,64,-81,-20,-17,9,72,28,19,20,15,17,12,44,49,46,61,63,73,-82,-33,34,-3,8,28,22,18,15,13,13,24,32,38,39,51,69,-82,-81,-31,-10,-2,11,21,19,15,13,12,18,21,37,36,32,10,70,-3,-42,-27,-12,12,19,19,18,14,12,14,17,78,38,30,28,-8,-28,-73,-39,-39,-75,60,51,27,21,11,8,9,14,23,26,26,22,-15,-16,-27,-27,-30,-38,-74,-16,2,8,5,4,5,8,16,14,19,20,-6,-3,-15,-21,-25,-30,-40,-23,-7,-3,-1,1,2,6,14,18,19,19,0,7,33,-20,-22,-25,-26,-19,-11,-7,-4,-3,0,3,9,11,19,20,4,-2,-18,-35,-24,-25,-22,-18,-12,-9,-6,-5,-3,1,7,17,25,21,7,11,-16,-73,-35,-26,-23,-19,-14,-11,-9,-8,-9,8,2,58,27,19,7,13,29,-18,-47,-33,-25,-20,-16,-14,-12,-15,-18,-15,-16,-27,4,11,1,1,-20,-36,-90,-42,-28,-22,-19,-17,-17,-16,-34,-32,-80,-22,-2,0,-10,-14,-22,-89,-58,-30,-30,-23,-17,-17,-17,-25,-83,-51,-48,-34,-12,-8,-19,-26,-43,-58,-51,-40,-33,-26,-22,-22,-27,-38,-51,-53,-43,-35,-22,-15,-26,-33,-40,-47,-47,-39,-30,-23,-19,-20,-26,-36,-45,-46,-41,-34,-28,-22],"ownershipAllowedMAE":0.0242609})%"); + lines.push_back(R"%({"sample":{"board":".................../..O................/.O...X.O.X.O..XXX../OXXX......XO...OO../.O...X.O..XO.O...../..O.......X.X..O.../.....O.OX...OX.XOO./..O....OXO.XX...X../.................../..X................/.............OXO.../..X....X......X.X../..........X.....XO./.X.O.O.X.O.OO.OXXO./....XO.....XO..XO../..OOOXX.XO.XO..XO../...OX...X...O..XO../....X.........X.XO./................O../","hintLoc":"null","initialTurnNumber":62,"metadata":"7F3FB8929CA45E3E7A44CF812544033F:72","moveLocs":["Q11","J11","P14","S12","S11","P12","Q12","S17","S18","P13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.62,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.75e-06,3.18e-06,3.18e-06,3.09e-06,3.09e-06,3.33e-06,3.51e-06,3.31e-06,3.39e-06,3.37e-06,3.12e-06,3.11e-06,3.04e-06,3.12e-06,2.97e-06,2.94e-06,3.05e-06,2.96e-06,2.77e-06,1.3e-05,3.35e-05,0,8.62e-06,3.93e-06,3.64e-06,4.26e-06,2.05e-05,6.39e-06,5.05e-06,4.77e-06,3.6e-06,3.8e-06,4.23e-06,2.96e-06,3e-06,2.88e-06,0,3.26e-06,7.48e-05,0,0.00035,3.07e-06,3.29e-06,0,4e-06,0,4.58e-06,0,3.61e-06,0,3.82e-06,3.78e-06,0,0,0,0,3.98e-06,0,0,0,0,3.05e-06,3.15e-06,5.58e-06,2.72e-05,9.36e-06,3.05e-06,0,0,3.87e-06,0.000219,1.92e-05,0,0,1.83e-05,3.04e-06,0.00012,0,0.000112,2.92e-06,3.29e-06,0,3.96e-06,0,3.89e-06,3.17e-06,0,0,7.53e-05,0,0.00523,0.139,3.46e-06,8.8e-06,2.99e-06,1.08e-05,5.96e-05,0,1.86e-05,4.62e-06,3.6e-06,6.65e-05,0.000142,0.00124,3.23e-06,0,4.15e-06,0,0.457,0,0,0.247,3.88e-06,3.06e-06,3.24e-06,1.13e-05,6.13e-06,8.96e-06,2.62e-05,0,5.24e-06,0,0,4.69e-06,3.49e-06,8.67e-06,0,0,0,0,0,0,3.12e-06,3.07e-06,4.79e-06,0,1.28e-05,1.48e-05,1.95e-05,4.27e-06,0,0,0,3.86e-06,0,0,0.00217,0,0,0,0,3.63e-06,3.12e-06,3.98e-06,3.91e-06,4.11e-06,9.21e-06,4.29e-06,4.94e-06,3.2e-05,0,7.6e-06,4.24e-06,3.44e-06,3.53e-06,6.66e-06,0.143,0,3.1e-06,0,3.12e-06,3.16e-06,3.4e-06,0,3.67e-06,4.32e-06,4.43e-06,4.25e-06,5.97e-06,1.57e-05,9.52e-06,5.31e-06,4.67e-06,4.68e-06,1.67e-05,1.53e-05,3.98e-06,3.09e-06,3.26e-06,3.23e-06,2.98e-06,3.31e-06,3.19e-06,3.86e-06,6.22e-06,5.13e-06,4.4e-06,4.1e-06,4.78e-06,1.07e-05,4.38e-05,2.35e-05,4.83e-06,0,0,0,3.53e-06,3.56e-06,3.22e-06,3.05e-06,3.43e-06,0,4.06e-06,1.63e-05,7.05e-06,3.98e-06,0,4.42e-06,1.5e-05,2.76e-05,6.12e-05,1.97e-05,2.09e-05,0,3.45e-06,0,3.75e-06,3.23e-06,3e-06,3.67e-06,3.78e-06,3.91e-06,0.000355,4.11e-06,3.78e-06,3.72e-06,4.12e-06,4.33e-05,0,5.14e-06,3.89e-06,6.81e-06,4e-06,2.72e-06,0,0,3.13e-06,2.95e-06,0,3.67e-06,0,6.46e-06,0,3.31e-06,0,4.11e-06,0,0.00108,0,0,3.29e-06,0,0,0,0,3.03e-06,3.4e-06,3.75e-06,0.000126,2.64e-05,0,0,3.18e-06,3.22e-06,4.04e-06,8.69e-06,6.07e-06,0,0,3.25e-06,3.75e-06,0,0,4.11e-06,3.13e-06,3.33e-06,1.57e-05,0,0,0,0,0,3.07e-06,0,0,6.39e-06,0,0,3.25e-06,3.27e-06,0,0,3.21e-06,3.11e-06,3.33e-06,2.76e-05,2.87e-06,0,0,2.89e-06,2.95e-06,3.04e-06,0,3.44e-05,0.000376,0.000159,0,4.24e-06,3.36e-06,0,0,3.59e-06,3.1e-06,3.34e-06,3.86e-06,1.47e-05,9.45e-06,0,2.83e-06,3.22e-06,3.24e-06,3.63e-06,6.07e-06,0.000504,1.83e-05,1.07e-05,4.34e-06,0,9.93e-06,0,0,3.2e-06,2.81e-06,3.46e-06,3.36e-06,3.43e-06,3.09e-06,3.02e-06,2.98e-06,3.07e-06,3.23e-06,3.37e-06,3.38e-06,3.38e-06,3.45e-06,3.94e-06,3.61e-06,3.69e-05,0,4.5e-06,2.81e-06,3.95e-06],"winrateAvg":0.381255,"leadAvg":-0.938142,"scoreMeanAvg":-1.51468,"scoreStdevAvg":15.0154,"shorttermWinlossErrorAvg":0.184808,"shorttermScoreErrorAvg":1.73942,"ownership":[80,80,64,43,21,14,15,15,1,-9,-2,6,-5,-27,-47,-58,-60,-54,-45,82,82,87,23,19,6,19,32,0,-24,-6,18,-4,-35,-52,-65,-60,-61,-22,84,87,8,13,9,-19,24,68,5,-79,-11,51,3,-13,-75,-72,-73,25,-14,88,-12,-14,-14,5,8,30,26,-3,-41,-87,48,15,5,19,71,72,24,34,84,91,29,23,18,-13,37,78,21,-26,-87,48,-17,50,12,28,55,64,46,71,79,93,31,33,32,39,47,2,-24,-87,-1,-78,-42,-71,51,31,42,47,56,67,62,42,32,83,48,86,-53,-31,-35,-64,-51,-83,-35,-93,47,49,34,36,41,88,27,29,23,29,84,-55,20,-35,-94,-94,-62,-40,-94,-93,48,-5,3,3,2,5,-1,8,-1,-4,43,0,-18,-33,-40,-42,-62,-94,-75,-77,-25,-26,-36,-70,-16,-6,-1,-3,-10,-3,-5,-9,-13,-13,-23,-37,-62,-53,-24,-33,-45,-48,-42,-14,-2,-3,-7,-17,-8,-5,-9,-6,-5,34,-90,-38,-60,-43,-20,-52,-59,-74,-5,9,0,-16,-77,-15,-7,-12,-6,5,-4,-89,-64,-94,1,2,-51,-51,-4,17,-17,7,-8,-33,-11,-8,-59,3,21,0,-20,-62,-94,81,29,-32,-63,8,77,63,70,-3,-83,-29,39,-6,64,64,20,38,-94,-94,83,68,-9,-7,-1,68,59,68,2,-31,-41,-11,2,-37,63,14,-17,-94,87,82,80,12,17,79,79,78,-91,-92,-60,-95,23,-18,-39,64,7,-36,-94,87,84,83,14,5,49,79,-82,-78,-81,-79,-95,-25,-35,17,64,-22,-50,-93,87,83,83,10,11,-2,43,-82,-69,-66,-77,-68,-48,-32,1,12,4,-74,23,22,83,79,10,-1,-4,-31,-46,-60,-65,-67,-60,-42,-20,-3,5,-16,-22,-6,61,61,74],"ownershipAllowedMAE":0.0340933})%"); + lines.push_back(R"%({"sample":{"board":"..........OOX...XX./..OXXOXO..OXXO.XXO./.OOOX.OOO.OXXX.XOOO/..OXX.XXXOOOXOXXXXO/.O.OX.X.....XOOO.O./O.OXXOOOOOOOOXXOO.O/XOOX..OXOXXXX.XXXO./XXX.XXXXX..XX.O.O.O/.OX..XX...XX....O.O/.OXXX.OXXXOOXX.XXO./.OX.OOXXXO..OX.X.X./.OXO..OOO.O.OXOOX../.OXXOOO...O..OOXX../OXXOX.XXOOXO.OXXO../.OX.X.XOOXX..OXOX../..OXXOXOOOXX.OOOXX./.OOOXXXXXXXOO.XXX.X/..OXOOOX.XO.O.XOOXX/......O...O.O.OO.O./","hintLoc":"null","initialTurnNumber":75,"metadata":"90AF86E3CC3A2B230612A9FECACF450D:85","moveLocs":["C15","P11","Q12","O13","M15","P18","T9","T8","T10","F10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":-10.0,"policyOptimism":0.144,"pda":0.0,"policyMixture":[6.36e-06,1.01e-05,0.00166,9.03e-06,1.03e-05,0.0012,3.55e-05,7.35e-06,6.45e-06,5.91e-06,0,0,0,0.000559,6.71e-06,5.7e-06,0,0,7.17e-06,6.7e-06,7.15e-06,0,0,0,0,0,0,6.62e-06,6.57e-06,0,0,0,0,0,0,0,0,2.3e-05,6.75e-06,0,0,0,0,0.0027,0,0,0,6.63e-06,0,0,0,0,0,0,0,0,0,6.74e-06,6.49e-06,0,0,0,2.46e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,7.05e-06,0,0,0,0,0.124,0,9.47e-06,0.000376,9.67e-06,7.51e-06,0,0,0,0,0,0.0231,0,2.12e-05,0,6.96e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.12e-05,0,0,0,0,0,7.72e-06,0.000326,0,0,0,0,0,0,0,0,0,0,0,0,3.78e-06,0,0,0,8.13e-06,0,0,0,0,0,6.03e-06,5.7e-06,0,0,0.102,0,0,0,7.19e-06,0,0.0342,0,0,6.39e-06,6.14e-06,0,0,5.67e-06,5.81e-06,6.05e-06,0,0,6.17e-06,4.79e-05,0,7.38e-05,0,6.93e-06,0,1.4e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,7.47e-06,0,0,0,0,5.53e-06,0,0,0.553,0,0,0,0,0,0,7.42e-06,7.25e-06,0,0,0.0343,0,0,0,0,6.58e-06,0,0,0,0.000145,7.25e-06,0,0,0,8.99e-06,0,6.6e-06,0,0,0,0,0,0.000357,0,7.81e-06,0,0,0,0,0,0,0.0225,0.000515,1.23e-05,0,7.21e-06,7.38e-06,0,0,0,0,0.000447,0.00173,0,0,0,0,0,0.0916,0,0,0,0,0,0,1.24e-05,0,0,0,0,7.35e-05,1.48e-05,7.62e-06,0,0,4.57e-06,0,6.92e-06,0,0,0,0,0,1.47e-05,0.00273,0,0,0,0,8.02e-06,4.06e-05,7.28e-06,7.01e-06,0,0,0,0,0,0,0,0,0,0,0.00122,0,0,0,0,0,2.01e-05,6.76e-06,0,0,0,0,0,0,0,0,0,0,0,0,1.21e-05,0,0,0,0,0,5.95e-06,6.47e-06,0,0,0,0,0,0,6.95e-06,0,0,7.04e-06,0,9.25e-06,0,0,0,0,0,5.99e-06,6.19e-06,7.01e-06,7.34e-06,7.44e-06,5.04e-06,0,0.000106,4.73e-05,9.42e-05,0,6.7e-06,0,4.25e-05,0,0,1.54e-05,0,6.53e-06,1.14e-05],"winrateAvg":0.917851,"leadAvg":0.767666,"scoreMeanAvg":1.04418,"scoreStdevAvg":1.54977,"shorttermWinlossErrorAvg":0.145864,"shorttermScoreErrorAvg":0.323719,"ownership":[100,100,-19,-48,-64,53,99,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-75,100,100,100,-100,-100,99,99,100,100,100,100,-100,-100,-100,-100,-100,-100,100,-7,100,100,100,100,-100,-53,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-86,-100,-100,-100,100,100,100,-100,100,-100,-100,-100,-100,100,100,100,100,100,-100,51,-100,3,-4,51,86,100,-100,100,100,100,-87,100,100,100,100,100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,100,100,-100,-60,5,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,46,100,100,100,100,100,-85,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-90,-100,-14,100,100,100,99,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-74,-100,-100,100,100,100,100,-100,80,100,100,-100,-100,-100,100,100,100,100,-100,6,-100,-100,-100,100,100,100,-100,97,96,100,100,100,100,100,100,100,100,-100,100,100,-100,-99,-99,100,100,-100,-100,100,100,100,-26,-25,100,100,100,100,100,100,-100,-100,-100,-99,100,-100,-100,-100,-100,30,-100,-100,100,100,-100,100,99,100,-100,-100,-99,-100,-99,100,100,-100,-100,-100,-94,-100,100,100,-100,-100,-47,-85,100,-100,100,-100,-100,-99,100,100,100,-100,-100,-94,-100,100,100,100,-100,-100,-15,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,53,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-77,-100,100,100,100,18,-100,100,100,-100,-100,100,100,100,100,100,100,100,-25,-22,16,100,100,100,99,100,100,31,32,-92],"ownershipAllowedMAE":0.0162553})%"); + lines.push_back(R"%({"sample":{"board":".....OXXOO...O..O../....OOX.XOO..O.O.OO/...OOXX.XXO.O...OOO/..OXXX.XXXO.O.O...O/..OOX..XXO...OO.OOO/.OOXX.O.XO.OO.OOXXX/.OXXXXOX.XO.OOXXOX./OOXOXOXX.XXOOOXX.X./XXOOOOOXX.XOXO.X.XX/X.XO.OXXOXXXX.OXOOO/.XXXO.O.O.OXXXXOOX./.XOXOOOOOOOOOXXXOX./XXOOOXXXXOOXXOOOX../OOOXXXXOXXXXXXOXX../...OOOOOOX...OOOX../........OOXXXO.X.../...O.O..OXXXOO...../....OXOOOXOO.OXX.../...OXXXXXXX.OXX..../","hintLoc":"null","initialTurnNumber":265,"metadata":"85B1910DA0CFEA5D48C02FAE9B413F4E:275","moveLocs":["P11","O10","H9","K9","D2","N5","C17","P3","L14","P4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.16,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":7.0,"policyOptimism":0.0,"pda":-0.455,"policyMixture":[0.000915,0.000928,0.000948,0.000975,0.00993,0,0,0,0,0,0.00818,0.000964,0.000995,0,0.00207,0.0243,0,0.0248,0.00358,0.000932,0.000966,0.00146,0.0103,0,0,0,0.00102,0,0,0,0.00733,0.0272,0,0.0297,0,0.0264,0,0,0.000947,0.00106,0,0,0,0,0,0.00109,0,0,0,0.03,0,0.035,0.0108,0.034,0,0,0,0.000953,0.00151,0,0,0,0,0.000999,0,0,0,0,0.0294,0,0.0242,0,0.0109,0.014,0.0109,0,0.000956,0.0103,0,0,0,0.000982,0.00554,0,0,0,0.0278,0.0115,0.0335,0,0,0.0287,0,0,0,0.00113,0,0,0,0,0.00584,0,0.00547,0,0,0,0,0,0.0246,0,0,0,0,0,0.00987,0,0,0,0,0,0,0,0.00105,0,0,0.0113,0,0,0,0,0,0,0.000983,0,0,0,0,0,0,0,0,0.00105,0,0,0,0,0,0,0,0.0116,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0119,0,0,0,0,0,0,0.011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.013,0,0,0,0,0.0111,0,0,0,0,0,0,0,0,0,0,0,0,0.000964,0.000948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00105,0.000969,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00101,0.000967,0.000967,0.00103,0.0348,0,0,0,0,0,0,0,0.00117,0.00139,0,0,0,0,0,0.000981,0.000945,0.000948,0.000945,0.00096,0.0302,0.0107,0.0278,0.0101,0.0106,0,0,0,0,0,0,0,0,0.000983,0.000963,0.000934,0.000935,0.000941,0.00105,0,0.033,0,0.0399,0.0104,0,0,0,0,0,0,0,0.00113,0.000965,0.000957,0.000918,0.000925,0.000953,0.00099,0,0,0,0,0,0,0,0,0,0.000871,0,0,0,0.000975,0.000953,0.000937,0.000923,0.000936,0.000974,0,0,0,0,0,0,0,0,0.00104,0,0,0,0.000982,0.000945,0.000946,0.000916,0.122],"winrateAvg":5.83088e-05,"leadAvg":-6.13184,"scoreMeanAvg":-6.05368,"scoreStdevAvg":0.580016,"shorttermWinlossErrorAvg":0.00483209,"shorttermScoreErrorAvg":0.304418,"ownership":[100,100,100,100,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,100,-100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.00119228})%"); + lines.push_back(R"%({"sample":{"board":"..X......O....X..../.X.XO..OOXXXOOOX.../..XO.O.O.OX..OX..../.XXO...XOOOX.O.X.../X.XO..X...XXO....../.XOO...XX.XOO.XX.X./OXXO..OO.XOX.O...../.OOO.O..X.O..O.O.../..XXXX.XXOO..XO..O./...OOX.XOXO..X...../.X...XX..XO......X./.OX.OOOXXXO...X.X../......XOOXO......../..O..OOOXOOO.X.X.../.....OXXXOOX...OO../...O..O.XXXX..XXX../.....X.OO......XOO./...O.....OOX..XXXO./................O../","hintLoc":"null","initialTurnNumber":63,"metadata":"35B9709236C794CDA82118E3F9AA8F33:73","moveLocs":["C9","D9","C10","E9","B10","D8","A9","E12","F14","G12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.07,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":7.5,"policyOptimism":0.0,"pda":1.28,"policyMixture":[4.34e-06,4.98e-06,0,5.28e-06,5.78e-06,5.31e-06,4.9e-06,4.86e-06,5.27e-06,0,6.56e-06,1.59e-05,5.05e-06,0.000415,0,1.39e-05,1.92e-05,1.89e-05,4.32e-06,4.89e-06,0,0,0,0,4.85e-06,4.82e-06,0,0,0,0,0,0,0,0,0,0.00091,1.99e-05,8.23e-06,5.23e-06,4.52e-06,0,0,4.74e-06,0,5.34e-06,0,4.97e-06,0,0,5.01e-05,9.63e-06,0,0,8.07e-06,0.01,0.000567,6.29e-06,5.25e-06,0,0,0,5.43e-06,6.11e-06,9.58e-06,0,0,0,0,0,9.47e-06,0,7.97e-05,0,2.31e-05,0.0125,8.13e-06,0,0,0,0,5.43e-06,6.99e-06,0,6.5e-06,6.99e-06,9.25e-05,0,0,0,5.64e-06,0.000249,2.51e-05,0.00132,0.0568,6.73e-06,5.59e-06,0,0,0,5.45e-06,0,5.86e-06,0,0,1.18e-05,0,0,0,5.88e-06,0,0,9.61e-06,0,6.08e-06,0,0,0,0,6.88e-06,1.12e-05,0,0,0.000173,0,0,0,5.16e-06,0,5.71e-06,7.1e-06,0.0111,0.0443,8.87e-06,5.75e-06,0,0,0,0,0,0,2e-05,0,0.000113,0,6.1e-06,6.34e-06,0,5.21e-06,0,1.35e-05,1.13e-05,6.9e-06,5.43e-06,6.07e-06,0,0,0,0,6.72e-06,0,0,0,0,6.24e-06,5.14e-05,0,0,6.64e-06,8.31e-06,0,6.63e-06,4.92e-06,0,0,0,0,0,4.4e-06,0,0,0,0,5.82e-06,6.26e-06,0,0.0219,0.000165,9.22e-05,0.000208,8.83e-06,0,4.76e-06,0,0,0,0,0,0.000284,0.000977,0,0,5.51e-06,8.45e-06,9.61e-06,0.000157,0.162,1.05e-05,0,1.37e-05,5.19e-06,0,0,0,0,0,0,0,0,0,0,5.48e-06,1.31e-05,3.33e-05,0,5.77e-06,0,9.34e-06,7.24e-06,5.05e-06,6.71e-06,0.000209,6.71e-05,0.000302,6.08e-06,0,0,0,0,0,5.14e-06,1.09e-05,0.0156,1.81e-05,1.11e-05,9.39e-06,0.113,6.25e-06,5.13e-06,5.83e-06,0,0.00143,1.32e-05,0,0,0,0,0,0,0,0.143,0,8.56e-06,0,0.000239,0.000199,5.7e-06,4.86e-06,5.34e-06,5.23e-06,6.51e-06,5.68e-06,0,0,0,0,0,0,0,0.000203,8.46e-06,8.19e-06,0,0,7.59e-06,7.17e-06,4.84e-06,5.18e-06,5.18e-06,0,5.74e-06,9.6e-06,0,7.34e-06,0,0,0,0,6e-06,5.28e-06,0,0,0,0.000218,5.07e-06,4.74e-06,5.15e-06,4.89e-06,4.94e-06,5.86e-06,0,5.9e-06,0,0,5.83e-06,4.73e-06,0.000155,8.11e-06,5.68e-06,3.97e-06,0,0,0,5.69e-06,5.12e-06,5.16e-06,5.11e-06,0,5.77e-06,6.01e-06,6.2e-06,6.32e-06,5.97e-06,0,0,0,0.399,5.9e-06,0,0,0,0,6.31e-06,4.47e-06,4.85e-06,4.69e-06,5.21e-06,5.59e-06,5.57e-06,5.47e-06,5.73e-06,5.69e-06,4.56e-06,8.23e-06,3.2e-05,5.29e-06,4.88e-06,4.98e-06,5.09e-06,0,7.28e-06,4.42e-06,7.7e-06],"winrateAvg":0.741858,"leadAvg":0.763864,"scoreMeanAvg":1.60515,"scoreStdevAvg":7.96651,"shorttermWinlossErrorAvg":0.220667,"shorttermScoreErrorAvg":1.16887,"ownership":[-99,-99,-99,6,55,95,94,88,55,56,-8,29,72,67,-75,-77,-83,-84,-85,-99,-100,-97,-96,99,96,96,99,100,-96,-96,-96,99,99,99,-92,-83,-85,-86,-100,-100,-100,100,94,99,64,100,98,98,-96,-96,9,99,-88,-88,-83,-86,-87,-99,-100,-100,100,10,0,38,-50,98,98,98,-99,27,99,37,-94,-88,-87,-87,-99,-99,-100,100,19,-31,-96,-51,-16,-10,-99,-99,99,62,31,-73,-87,-85,-86,-84,-99,100,100,62,94,28,-99,-99,-98,-99,99,99,15,-93,-94,-64,-93,-58,97,-99,-99,100,26,-10,81,80,-45,-99,98,95,98,99,-13,15,-15,-16,-24,96,100,100,100,-100,-12,-98,-2,-100,-16,98,95,82,99,90,98,62,8,39,94,-57,-100,-100,-100,-100,-98,-100,-100,98,98,-9,-32,-85,92,51,50,86,49,97,99,99,99,99,-100,-99,-100,-98,-99,98,18,-49,-86,1,20,20,9,6,99,97,98,-100,-100,-100,-100,-99,-98,-98,98,28,-9,-53,-54,13,-26,-96,-46,97,98,-99,-100,91,92,93,-99,-98,-98,99,38,1,-45,-96,-61,-97,-91,-87,94,90,-57,-52,-25,92,92,98,98,-99,99,59,21,-5,-69,-87,-93,-88,-89,94,95,98,0,30,98,98,98,-99,98,98,98,54,-96,-86,-97,-93,-91,-91,94,94,94,89,85,98,-98,-99,-98,99,99,-98,-39,-70,-92,-88,-89,-91,-91,94,95,95,99,95,87,91,-9,-99,-99,-99,-98,-68,-72,-99,-99,-99,-93,-91,95,95,96,95,95,87,90,94,94,-31,-24,-76,-55,-55,-91,-99,-92,-91,-92,95,95,95,98,94,91,91,92,92,93,92,-88,14,-57,-99,-99,-99,-91,-93,96,96,96,96,95,93,93,91,89,79,41,37,8,-63,-89,-97,-93,-94,-93],"ownershipAllowedMAE":0.0295166})%"); + lines.push_back(R"%({"sample":{"board":"............./............./............./..X.O....O.../............./..XX........./.XOO...X...../XOO........../.XO........../O..OOO......./..XXX......../...........X./............./","hintLoc":"null","initialTurnNumber":22,"metadata":"A2DAF3BE3E6F63134A3383DF5463881C:32","moveLocs":["B4","E8","D10","E11","L8","K5","H5","L3","H3","G6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.47,"xSize":13,"ySize":13},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.93e-06,3.82e-06,4.19e-06,4.16e-06,3.96e-06,3.9e-06,3.99e-06,4.1e-06,4.15e-06,4.33e-06,4.16e-06,4.5e-06,2.96e-06,3.5e-06,5.02e-06,7.76e-06,8.46e-05,8.46e-06,7.82e-06,1.02e-05,1.76e-05,4.05e-05,3.24e-05,2.35e-05,1.12e-05,4.5e-06,3.36e-06,4.5e-06,5.46e-06,1.03e-05,0,6.34e-06,4.2e-05,0.00132,9.07e-05,0.0327,0.0426,0.000164,4.8e-06,3.69e-06,4.02e-06,0,0,0,6.61e-06,3.71e-05,0.000221,0.0357,0,0.275,0.00948,5.73e-06,4.08e-06,5.75e-06,4.79e-06,5.96e-06,1.18e-05,1.36e-05,8.72e-05,6.58e-05,0.0449,0.00109,1.7e-05,0.00343,4.99e-06,4.64e-06,4.61e-06,0,0,0,0.00898,1.33e-05,8.23e-06,6.1e-05,2.54e-05,0,1.28e-05,5.09e-06,4.71e-06,0,0,0,9.12e-05,3.1e-05,0.0222,0,2.34e-05,0.0108,6.16e-05,7.16e-05,5.02e-06,0,0,0,3.54e-06,5.92e-06,3.53e-05,0,0.268,0.00059,0.000236,0.0838,0.011,5.54e-06,3.84e-06,0,0,3.27e-06,3.71e-06,6.53e-06,0.0547,0,0.024,0,0.00575,0.0181,5.75e-06,0,0,1.86e-05,0,0,0,5.5e-06,5.51e-06,9.26e-06,0.000845,5.13e-05,6.74e-05,5.04e-06,3.9e-06,3.65e-06,0,0,0,2.12e-05,0.000146,0,9.77e-06,0.0368,0,0.000137,4.19e-06,3.31e-06,3.3e-06,3.26e-06,3.86e-06,4.29e-06,6.29e-06,2.5e-05,6.04e-05,1.76e-05,4.93e-05,0.00577,0,3.82e-06,3.12e-06,3.56e-06,3.32e-06,3.46e-06,4.07e-06,4.03e-06,4.18e-06,4.59e-06,4.93e-06,5.27e-06,4.78e-06,4.02e-06,3.09e-06,6.89e-06],"winrateAvg":0.223394,"leadAvg":-1.65149,"scoreMeanAvg":-2.50586,"scoreStdevAvg":8.77036,"shorttermWinlossErrorAvg":0.137504,"shorttermScoreErrorAvg":0.829976,"ownership":[-21,-8,1,27,35,36,27,19,14,10,6,3,0,-30,-26,6,0,53,39,25,18,16,11,8,-1,-5,-41,-35,-37,23,88,39,17,14,21,4,12,-8,-11,-57,-65,-88,-87,88,34,9,4,19,65,-17,-18,-16,-71,-79,-75,9,44,26,-1,-5,-10,1,-7,-22,-21,-77,-73,-84,-82,86,8,-1,-20,-14,-20,-69,-30,-21,-84,-84,88,88,64,23,-11,-68,-21,-5,-7,-17,-12,-87,89,88,75,58,37,68,-15,-16,8,15,7,0,-86,-92,88,78,60,31,-15,-66,-1,65,34,11,10,-84,-93,30,90,90,90,16,-26,0,20,24,19,12,-87,-84,-95,-95,-94,49,-4,-74,-9,3,53,13,6,-82,-81,-79,-73,-47,-22,-19,-45,-25,-6,3,-20,-1,-79,-76,-70,-58,-43,-24,-23,-28,-26,-14,-9,-8,-7],"ownershipAllowedMAE":0.0312145})%"); + lines.push_back(R"%({"sample":{"board":".................../..XXO.........O..../..OXO..OO.XX.OXXXX./...OXO.X.X.O.OOOX.X/.OO.X....XO.X..XOX./.XX.X.X..OX..XXXOO./.....O.......XOO.O./...O........OXOXOO./....X........XOXXO./...O.OO......XO..X./.....OXXX....XO.O../...X.OOOX...OOOX.../....XOOXOOXO...OXO./...XOOXXXOXO.OO.O../...XXXO.XOXXOXOOXO./..X..OO.XOXOO..XXO./..XO.X.OXXXOO.X..X./..O.O....XO.OX...../...........O......./","hintLoc":"null","initialTurnNumber":150,"metadata":"091840B508F9DED45A9AD0EF62CE290F:160","moveLocs":["B17","D15","C16","B18","A18","A16","A17","B19","D19","A15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.79e-05,0,1.72e-05,0,0.677,2.46e-05,2.62e-05,2.72e-05,2.89e-05,3.34e-05,3.34e-05,3.22e-05,3.13e-05,2.7e-05,2.74e-05,3.79e-05,3.48e-05,4.56e-05,2.48e-05,0,0,0,0,0,2.36e-05,2.76e-05,2.71e-05,2.95e-05,3.85e-05,0.00024,8.49e-05,3.64e-05,2.77e-05,0,8.27e-05,3.59e-05,5.71e-05,3.64e-05,0,0,0,0,0,2.85e-05,3.28e-05,0,0,6.66e-05,0,0,2.77e-05,0,0,0,0,0,2.72e-05,0,1.67e-05,0,0,0,0,0.00113,0,0.000357,0,4.58e-05,0,0.000651,0,0,0,0,0,0,0,0,0,0,0,3.26e-05,9.11e-05,0.000131,0.000116,0,0,3.39e-05,0,2.96e-05,2.41e-05,0,0,0,4.47e-05,0.000104,0,0,2.54e-05,0,5.05e-05,0,9.73e-05,0.000306,0,0,0.0778,3.62e-05,0,0,0,0,0,3.66e-05,2.9e-05,3.08e-05,3.45e-05,0.00147,0.0001,0,0.0366,0.000175,0.000105,0.000538,0.0546,3.79e-05,3.43e-05,0,0,0,2.34e-05,0,2.9e-05,2.97e-05,9.61e-05,3.27e-05,0,3.49e-05,3.46e-05,0.000104,0.000535,0.000316,0.000146,0.00124,3.68e-05,0,0,0,0,0,0,2.37e-05,3e-05,8.67e-05,9.61e-05,4.64e-05,0,3.4e-05,2.94e-05,8.82e-05,0.000367,0.00204,0.000276,0.000115,3.42e-05,0,0,0,0,0,2.39e-05,3.06e-05,0.000534,0.000913,0,3.36e-05,0,0,0.0038,0.000869,0.000362,0.000344,0.00147,4.08e-05,0,0,2.33e-05,2.32e-05,0,2.33e-05,3.19e-05,0.0544,0.026,0.00191,2.43e-05,0,0,0,0,5.4e-05,0.000749,0.00101,4.99e-05,0,0,2.38e-05,0,2.36e-05,2.34e-05,3.04e-05,0.000226,0.00399,0,3.76e-05,0,0,0,0,0.00601,6.63e-05,3.33e-05,0,0,0,0,2.39e-05,2.39e-05,2.4e-05,3.07e-05,6.88e-05,0.000914,3.51e-05,0,0,0,0,0,0,0,0,2.4e-05,2.42e-05,2.43e-05,0,0,0,2.48e-05,3.04e-05,3.73e-05,3.35e-05,0,0,0,0,0,0,0,0,0,2.39e-05,0,0,2.37e-05,0,2.43e-05,2.49e-05,3.02e-05,3.29e-05,2.73e-05,0,0,0,0,2.21e-05,0,0,0,0,0,0,0,0,0,0,2.46e-05,2.96e-05,3.11e-05,0,2.95e-05,2.99e-05,0,0,2.4e-05,0,0,0,0,0,2.38e-05,2.75e-05,0,0,0,2.62e-05,3.12e-05,0.000108,0,0,2.91e-05,0,2.85e-05,0,0,0,0,0,0,2.75e-05,0,2.54e-05,3.26e-05,0,9.8e-05,3.28e-05,6.56e-05,0,2.3e-05,0,2.98e-05,2.93e-05,3.43e-05,2.69e-05,0,0,2.48e-05,0,0,2.73e-05,0.0249,5.5e-05,0.00946,3.37e-05,2.41e-05,2.97e-05,2.5e-05,2.58e-05,2.41e-05,2.67e-05,2.62e-05,2.93e-05,2.66e-05,2.73e-05,2.53e-05,0,2.66e-05,5.19e-05,2.88e-05,2.95e-05,2.7e-05,2.52e-05,2.28e-05,3.26e-05],"winrateAvg":0.113495,"leadAvg":-6.10902,"scoreMeanAvg":-7.17475,"scoreStdevAvg":14.7261,"shorttermWinlossErrorAvg":0.141188,"shorttermScoreErrorAvg":2.48736,"ownership":[59,60,79,89,88,80,71,61,40,3,-35,-61,-72,-75,-77,-83,-88,-89,-91,61,61,61,62,88,76,70,67,50,6,-51,-82,-78,-72,-72,-85,-91,-93,-92,61,62,62,59,87,16,27,77,76,-5,-93,-94,-80,-68,-96,-94,-94,-95,-92,-81,1,62,61,-93,26,-26,-72,7,-94,-79,-62,-76,-67,-69,-68,-94,-89,-92,-85,63,63,-92,-93,-50,-49,-45,-49,-95,-55,-71,-90,-83,-83,-93,99,-90,-70,-84,-87,-87,-76,-94,-27,-85,-39,-37,-8,-73,-54,-66,-93,-93,-93,100,100,73,-54,-31,-11,14,-15,46,-19,-21,-24,-24,-31,-39,-44,-93,100,100,99,100,95,-29,-7,2,48,17,23,12,-26,-16,-19,-18,-27,0,-93,100,96,100,100,98,-8,-2,9,21,-5,27,16,-5,-14,-15,-21,-26,-37,-94,100,97,97,100,98,0,5,18,59,23,60,61,9,-28,-30,-20,-8,-25,-93,100,98,98,96,98,-11,-3,0,3,22,60,-93,-94,-94,-51,-36,-10,34,-94,100,98,100,98,97,-31,-48,-55,-86,8,60,58,58,-94,-82,-42,33,100,100,100,96,98,97,97,-54,-64,-63,-68,-67,59,60,-99,-87,-85,-98,99,96,97,98,99,96,99,96,-66,-73,-75,-93,62,60,-98,-98,-98,-85,-98,99,98,100,100,97,99,96,93,-69,-76,-83,-93,-93,-94,41,-61,-98,-84,-98,-98,100,73,100,100,-33,98,74,-54,-80,-91,-28,2,48,43,-46,-98,-85,-98,100,100,69,46,-38,-36,97,48,-36,-27,-91,72,49,-2,-2,5,-99,-98,-98,100,100,44,-38,-34,-36,-38,1,-9,-16,70,70,73,49,39,-48,-67,-98,90,89,99,-32,-25,-28,-40,-31,-25,15,63,65,68,64,51,17,-7,-54,-34,13,97,67,33,-20,-30,-36,-36,-33],"ownershipAllowedMAE":0.0452877})%"); + lines.push_back(R"%({"sample":{"board":"......X.XXX./.XXOOX.XOOXO/.OXX..XO..O./.XOOO.XOOOOO/X.XOXXXXOOO./.X.OXOXXXOOO/.XXXO.OOOXOX/.OOXOOXXOXX./.XXOOOO.OOXX/.X.XXOO..OX./.X.XXXO..O../..X.OO....../","hintLoc":"null","initialTurnNumber":124,"metadata":"C7E0B65ECE003B4ED5C533ED699FA84A:134","moveLocs":["E10","F6","H12","G1","D1","M10","M12","M5","A5","L2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":12,"ySize":12},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":6.0,"policyOptimism":0.469,"pda":0.0,"policyMixture":[0.00971,0.0128,0.0133,0.075,0.0535,0.0361,0,0,0,0,0,0,0.013,0,0,0,0,0,0.0345,0,0,0,0,0,0.13,0,0,0,0,0.0334,0,0,0.00992,0.00991,0,0,0.0291,0,0,0,0,0.0624,0,0,0,0,0,0,0,0.0283,0,0,0,0,0,0,0,0,0,0,0.0347,0,0.0523,0,0,0,0,0,0,0,0,0,0.0339,0,0,0,0,0,0,0,0,0,0,0.0396,0,0.0316,0.0322,0,0,0,0,0,0,0,0,0,0.0355,0,0,0,0,0,0,0.00553,0,0,0,0,0.0133,0,0.0349,0,0,0,0,0.00506,0.00409,0,0,0.00337,0.0133,0,0.0311,0,0,0,0,0.00411,0.00464,0,0,0.00525,0.0115,0.0349,0,0,0,0,0,0.00337,0.00349,0.00351,0.00382,0.00331,0.000303],"winrateAvg":0.000159501,"leadAvg":-4.08271,"scoreMeanAvg":-4.06799,"scoreStdevAvg":0.560699,"shorttermWinlossErrorAvg":0.00831267,"shorttermScoreErrorAvg":0.359758,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.00172355})%"); + lines.push_back(R"%({"sample":{"board":"......XXO...OOOOXX./.....XXOO...O.OXO../...X.XOO.....OXXOX./..O..XOXOOOOOO.XXX./.X.O.XXXXXO..OOXX.X/....XOXXXXXOOXOXX.X/XXX.XOOOXOOOOXXX..X/OOXXXXOXXXXXXOXX..X/.OOXOOOOX..XOOOOX.X/.O.OOOOOOXXXOOXXXXX/.OOOXXXOXXOOOOOOOXO/..OXXXOXX.XXXOO.OOO/OO.OXXOO..XOXXXO.O./XXOOXXXX.XXOOOOO.O./.XXOOOXXX.XXXXXXOO./..OXOXXOOXXOXXXXXO./.XXXOXXOOXOOOOXOO../.OXOOOXO.O..OXO..../.XXXO.O.O........../","hintLoc":"null","initialTurnNumber":285,"metadata":"733F487C0FBFEC5AF79BD8F22AB59B35:295","moveLocs":["P16","B16","O1","C17","pass","E15","pass","A2","pass","B4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":24.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.0013,0.00127,0.00122,0.00124,0.00125,0.00128,0,0,0,0.00188,0.00179,0.00247,0,0,0,0,0,0,0.00611,0.00127,0.00127,0.00127,0.00124,0.00124,0,0,0,0,0.00852,0.00216,0.00929,0,0.0294,0,0,0,0.00823,0.00164,0.00123,0.00132,0,0,0.00124,0,0,0,0.0285,0.00938,0.00798,0.00973,0.0278,0,0,0,0,0,0.00131,0.0013,0,0,0.00142,0.0012,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00132,0.00128,0,0.00148,0,0,0,0,0,0,0,0,0.0297,0.0289,0,0,0,0,0.00135,0,0.00128,0.00126,0.00126,0.00139,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00128,0,0,0,0,0.00127,0,0,0,0,0,0,0,0,0,0,0,0,0.00129,0.00131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00142,0.00127,0,0.00915,0,0,0,0,0,0,0,0,0.0015,0.00159,0,0,0,0,0,0,0.00133,0,0.00945,0,0.00883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00962,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00976,0.0277,0,0,0,0,0,0,0,0.00144,0,0,0,0,0,0.0095,0,0,0,0,0,0.0373,0,0,0,0,0,0.00279,0.00157,0,0,0,0,0,0,0.00994,0,0.00933,0,0,0,0,0,0,0,0,0.00956,0,0,0,0,0,0,0,0.01,0,0.00924,0.00136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00785,0.00132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00554,0.00137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0368,0.00181,0,0,0,0,0,0,0,0,0.0268,0,0.0318,0.00931,0,0.0273,0,0.0288,0.00585,0.00216,0.00145,0,0,0,0,0,0.0322,0,0.0306,0,0.0249,0.00339,0.00234,0.0255,0,0.0243,0.00226,0.00143,0.00141,0.00158,0.226],"winrateAvg":0.00136977,"leadAvg":-0.939376,"scoreMeanAvg":-1.01895,"scoreStdevAvg":0.615219,"shorttermWinlossErrorAvg":0.032363,"shorttermScoreErrorAvg":0.315082,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,-100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,-100,-100,100,100,-100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.000581949})%"); + lines.push_back(R"%({"sample":{"board":".................../.O...O.....O.O.O.OO/.XOO..O..XXOOXOOOXX/..XXX.X.XX.XXXOXXO./........OX..XXXXOOX/.XO......OXX.XXOOO./.XOXX.O.XOOXXXOOOXO/..XO.XX....OOOXXXX./.X.O.XO.O.OOXOX..X./.XO..X...XO.XOXO.X./XO.OO.....OX.XOOO../..O.O.XXXO.X.XXXO../XXXOOX.OOO.XOOOOOXO/.OOXXXO....X.XXXXO./OO.O.OX.XXX......XO/.X.O.OX.OXOX.O.X.../.OO..XX.XOOO.OX..../.X.OX..OO........../.................../","hintLoc":"null","initialTurnNumber":204,"metadata":"7441DE78A327FF5C20FF683B6391B65D:214","moveLocs":["T6","N5","N6","S6","T9","S8","S4","S9","T10","T12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.76,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":7.5,"policyOptimism":0.74,"pda":0.626,"policyMixture":[7.6e-06,1.02e-05,7.18e-06,6.84e-06,6.78e-06,7e-06,6.97e-06,7.36e-06,7.22e-06,7.48e-06,7.58e-06,7.03e-06,7.23e-06,7.01e-06,7.06e-06,7e-06,6.91e-06,6.94e-06,7.69e-06,1.66e-05,0,7.04e-05,4.11e-05,3.71e-05,0,7.34e-06,7.78e-06,7.59e-06,7.46e-06,7.3e-06,0,7.04e-06,0,6.62e-06,0,6.71e-06,0,0,7.24e-06,0,0,0,0.000178,9.5e-06,0,7.95e-06,6.98e-06,0,0,0,0,0,0,0,0,0,0,8e-06,9.94e-06,0,0,0,7.61e-06,0,7.73e-06,0,0,6.9e-06,0,0,0,0,0,0,0,1.79e-05,7.39e-06,7.9e-06,7.4e-06,7.17e-06,7.18e-06,7.51e-06,8.15e-06,1.06e-05,0,0,6.95e-06,7.01e-06,0,0,0,0,0,0,0,6.92e-06,0,0,7.68e-06,7.4e-06,7.83e-06,8.42e-06,8.65e-06,0.000148,0,0,0,7.15e-06,0,0,0,0,0,0.00123,7.12e-06,0,0,0,0,7.94e-06,0,1.35e-05,0,0,0,0,0,0,0,0,0,0,0,6.92e-06,7.01e-06,0,0,6.65e-06,0,0,6.99e-05,0.00147,0.000569,7.92e-06,0,0,0,0,0,0,0,0,6.83e-06,0,7.48e-06,0,6.58e-06,0,0,1.62e-05,0,0.00144,0,0,0,0,0,0.000105,6.67e-06,0,0.0132,7.95e-06,0,0,6.73e-06,1.89e-05,0,9.69e-05,0.00169,0.00496,0,0,7.7e-06,0,0,0,0,6.02e-05,0,0,0,0,0,0,0,1.91e-05,2.19e-05,1.04e-05,0.0043,0.00546,0,0,7.26e-06,0,0,0,0,0,0,1.35e-05,0.00011,0,0,0,8.13e-06,0,0,0,0,1.28e-05,0,0.000524,0,0,0,0,0,0.928,0,0,0,0,0,0,0.000359,0,0,0,7.7e-06,0,0,0,0,0,0,0,0,7.56e-06,0,0,0,0,0,0,9.86e-06,7.3e-06,7.94e-06,7.95e-06,0,0,0,0,0,0,0,0,0,0,1.27e-05,0,4.29e-05,0,0,7.6e-06,0,0,0,1.07e-05,0,8.56e-06,6.96e-06,7.2e-06,7.19e-06,0,0,1.86e-05,0,8.08e-06,0,3.23e-05,0,0,7.48e-06,0,0,0,0,1.1e-05,0,6.72e-06,0,7.14e-06,0,0.0345,7.71e-06,0,0,1.02e-05,2.45e-05,0,0,8.12e-06,0,0,0,0,1.88e-05,0,0,6.73e-06,6.52e-06,6.91e-06,7.56e-06,7.64e-06,0,4.62e-05,0,0,7.08e-06,7.31e-06,0,0,6.78e-06,6.95e-06,7.34e-06,6.83e-05,0.000248,9.4e-06,7.21e-06,6.76e-06,7.19e-06,7.56e-06,7.61e-06,7.2e-06,7.74e-06,9.89e-05,7.65e-06,7.75e-06,7.56e-06,7.18e-06,6.85e-06,6.84e-06,6.71e-06,6.98e-06,7.13e-06,7.09e-06,7.75e-06,7.21e-06,6.92e-06,7.25e-06,7.5e-06,8.67e-06],"winrateAvg":0.61182,"leadAvg":1.05062,"scoreMeanAvg":1.26423,"scoreStdevAvg":10.3403,"shorttermWinlossErrorAvg":0.415361,"shorttermScoreErrorAvg":3.71729,"ownership":[40,52,59,60,60,51,32,5,-14,-25,14,48,84,94,98,99,100,99,99,9,60,54,61,56,69,39,8,-21,-61,-45,95,95,99,99,100,100,100,100,4,-16,69,68,-52,-11,61,-10,-56,-100,-100,96,97,-100,100,100,100,99,99,-37,-17,-99,-99,-99,-45,-84,-33,-100,-100,-100,-100,-100,-100,100,-99,-99,99,99,-66,-73,-91,-84,-60,-41,-25,-18,34,-100,-100,-100,-100,-100,-100,-100,99,99,95,-84,-96,-82,-89,-58,-33,-24,2,23,88,-100,-100,-100,-100,-100,99,99,100,91,-89,-96,-80,-97,-97,-27,19,1,-22,89,89,-100,-100,-100,99,99,99,-60,92,-91,-88,-89,67,-55,-97,-97,0,37,70,87,97,96,96,-58,-62,-63,-63,82,-87,-93,37,67,-3,-98,25,13,90,81,97,97,-81,95,-62,-23,-38,-64,19,-74,-92,68,55,-4,-97,-49,-7,75,56,96,27,-92,95,-64,-12,-24,-62,-64,-75,65,63,68,69,-26,-39,-23,0,68,96,-100,-90,-99,-11,-11,-16,-18,-64,-52,-3,65,67,69,-21,-77,-75,-74,92,20,-100,-91,-99,-99,-98,-19,-19,-69,-51,-52,-51,70,70,-68,-9,89,90,91,-24,-100,-23,-23,-23,-20,-19,-35,-28,57,95,94,-68,-67,-67,69,25,12,-27,-82,-100,-100,-100,-100,-100,-100,-46,-81,96,95,94,95,11,84,-81,-56,-92,-93,-95,57,79,-42,-13,-72,-97,-100,-76,92,91,94,95,42,85,-83,-42,30,-92,95,54,67,92,30,-99,-93,-100,-97,89,95,95,47,-30,-84,-84,59,28,96,96,95,77,91,-92,-85,-88,-92,-96,85,68,75,86,-75,-47,3,95,95,94,92,85,73,16,-27,-81,-84,-89,-93,79,73,68,-7,-24,-37,7,45,87,91,87,78,54,24,-16,-50,-74,-83,-89],"ownershipAllowedMAE":0.0557078})%"); + lines.push_back(R"%({"sample":{"board":".............../..O..X.XO..OOX./.O.OOXX.XO.X.X./.OOXXXOX...X.../.OXX..OXX...OO./..OOX.OOXXOOX../.OOOX..OOOXOXX./.XXOX.OXXXXXXO./.XOOOO....X.O../XOXO.X...OOO.O./.OX.XXOOOXXXOO./XOXX.OXXO.OOXO./.XOX..OXO.OXXXO/.......XXXX.XO./............O../","hintLoc":"null","initialTurnNumber":124,"metadata":"DA3579147D8BC707DDCB80FA81ABA167:134","moveLocs":["M2","N13","N12","O12","L14","M11","L13","K14","N15","K12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.63,"xSize":15,"ySize":15},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0","komi":51.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.78e-06,3.64e-06,4.04e-06,4.78e-06,6.09e-06,4.6e-06,4.39e-06,5.96e-06,0.000738,0.00134,0.000496,0.00334,0,4.1e-06,4.33e-06,3.55e-06,3.88e-06,0,4.12e-06,0.000342,0,3.54e-06,0,0,0,0,0,0,0,4.52e-06,3.54e-06,0,0,0,0,0,0,6.44e-06,0,0,0,0,0,0,0.000154,3.49e-06,0,0,0,0,0,0,0,4.09e-06,0,0.00968,0,0,0,0.00402,3.57e-06,0,0,0,4.27e-06,0.0012,0,0,0,0.0316,0.761,0,0,0,0.00105,3.88e-06,3.68e-06,0,0,0,0.000423,0,0,0,0,0,0,0,0.00401,0.0274,4.19e-06,0,0,0,0,0.000396,0.000146,0,0,0,0,0,0,0,7.51e-05,3.59e-06,0,0,0,0,0.00041,0,0,0,0,0,0,0,0,0.0162,4.14e-06,0,0,0,0,0,0.00123,0.134,1.38e-05,3.11e-06,0,2.94e-06,0,3.18e-05,2.69e-05,0,0,0,0,3.74e-06,0,0.000174,1.33e-05,3.93e-06,0,0,0,0,0,4.44e-06,5.49e-06,0,0,4.3e-06,0,0,0,0,0,0,0,0,0,0,3.73e-06,0,0,0,0,4.51e-06,0,0,0,0,4.82e-06,0,0,0,0,5.03e-06,3.79e-06,0,0,0,4.35e-06,4.25e-06,0,0,0,1.81e-05,0,0,0,0,0,3.85e-06,3.9e-06,3.78e-06,4.09e-06,4.03e-06,3.88e-06,3.86e-06,0,0,0,0,0,0,0,5.79e-06,3.9e-06,3.91e-06,3.83e-06,3.96e-06,3.74e-06,3.75e-06,3.78e-06,3.88e-06,3.92e-06,3.96e-06,3.95e-06,4.55e-06,0,4.96e-06,4.06e-06,7.86e-06],"winrateAvg":0.0612952,"leadAvg":-2.36785,"scoreMeanAvg":-2.25004,"scoreStdevAvg":3.12856,"shorttermWinlossErrorAvg":0.176797,"shorttermScoreErrorAvg":1.22668,"ownership":[100,100,96,88,12,-46,-92,-98,-99,-99,-99,-100,-100,-100,-100,100,100,100,93,79,-100,-97,-100,-98,-98,-100,-100,-100,-100,-100,100,100,99,99,98,-100,-100,-100,-100,-98,-100,-100,-100,-100,-99,100,100,100,-100,-100,-100,98,-100,-99,-98,-98,-100,-100,-97,-99,100,100,-99,-99,-96,30,99,-100,-100,-98,-98,-98,-98,-97,-98,99,100,100,100,-97,-9,99,99,-100,-100,-98,-98,-99,-99,-96,89,100,100,100,-96,1,98,98,99,98,-99,-98,-99,-99,7,73,-96,-96,100,-96,35,99,-98,-99,-99,-99,-99,-99,90,50,-85,-97,100,100,100,100,80,-4,30,26,-99,38,99,92,90,-99,-97,-100,100,6,-99,12,23,77,100,100,100,99,100,95,-99,-98,-100,33,-99,-99,100,100,100,99,99,99,100,100,98,-99,-99,-100,-100,-99,-99,-100,-100,100,99,99,99,-100,100,98,-99,-100,-99,-100,-100,-100,-99,-100,100,-61,99,-100,-100,-100,98,-99,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,96,96,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-95,-26,-30,58],"ownershipAllowedMAE":0.0285046})%"); + lines.push_back(R"%({"sample":{"board":".................../....O............../.............X...../..X.O.X........O.../..OO..........X..../................X../..X................/................X../.....X...O........./....OX............./....X.O............/.................../......X............/..O.X.........O..../................O../..XX.O....X.XXXXO../..OO........OOOO.../.................../.................../","hintLoc":"null","initialTurnNumber":38,"metadata":"0FF188AD5D1CA44382A28E21BF839DA0:48","moveLocs":["E4","E3","F5","D12","G4","D13","Q18","F3","C10","K16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0","komi":5.0,"policyOptimism":0.0,"pda":-2.863,"policyMixture":[6.59e-05,0.000102,0.000101,0.000105,0.000139,9.87e-05,0.000105,0.000101,0.000108,0.000107,0.00011,0.000104,9.95e-05,9.84e-05,8.31e-05,7.69e-05,7.62e-05,7.96e-05,6.4e-05,9.4e-05,0.00015,0.00026,0.00101,0,0.000427,0.000247,0.000636,0.000392,0.00108,0.000676,0.000806,0.000203,0.000159,0.000135,0,9.82e-05,9.87e-05,7.98e-05,8.64e-05,0.000215,0.000129,0.00407,0.00946,0.00588,0.000184,0.000879,0.00114,0.00414,0.00655,0.0324,0.000226,0,0.000123,0.000111,0.00011,0.000102,7.81e-05,0.000103,0.000274,0,0.000237,0,0.000204,0,0.000195,0.00596,0,0.019,0.0155,0.000259,0.000176,0.000157,0,0.000107,0.000109,7.79e-05,9.7e-05,0.0459,0,0,0.000192,0.000245,0.000185,0.000549,0.0176,0.0716,0.00255,0.00198,0.00104,0.000192,0,0.00013,0.000109,0.000117,7.91e-05,0.000107,0.000463,0.000367,0.000134,0.0013,0.000365,0.0237,0.0071,0.0372,0.0576,0.00993,0.00183,0.000662,0.000199,0.000146,0.00012,0,0.000104,8.45e-05,0.000106,0.0248,0,0,0.000188,0.00479,0.00865,0.00684,0.0309,0.0152,0.00866,0.00242,0.000771,0.000234,0.000172,0.00013,9.65e-05,0.000116,8.02e-05,9.9e-05,0.000676,0.0382,0,0.000185,0.000191,0.00117,0.00338,0.0113,0.00752,0.00581,0.00147,0.000847,0.000265,0.000201,0.000143,0,0.000114,8.91e-05,9.58e-05,0.00174,0.00018,0.000314,0.00417,0,0.00014,0.00687,0.00198,0,0.000737,0.00166,0.000992,0.000365,0.000243,0.000199,0.000156,0.000159,9.09e-05,9.77e-05,0.000172,0,0.000216,0,0,0.000144,0.00192,0.000932,0.000556,0.000746,0.00151,0.00124,0.000565,0.000271,0.00054,0.000256,0.000188,9.4e-05,8.73e-05,0.000152,0.000136,0.000189,0,0.000185,0,0.000184,0.000644,0.00117,0.00135,0.00171,0.00136,0.00091,0.000521,0.00135,0.0011,0.000196,9.63e-05,8.92e-05,0.000124,0.000133,0.000116,0.000108,0.000101,0.000113,0.000174,0.000242,0.00052,0.00118,0.00185,0.00157,0.00182,0.00111,0.00177,0.000783,0.000187,9.47e-05,8.68e-05,0.000129,0.000119,0.000108,9.29e-05,8.88e-05,0,0.000129,0.000194,0.000307,0.000615,0.00116,0.000812,0.00213,0.00066,0.000334,0.000373,0.000174,9.32e-05,8.57e-05,0.00012,0,9.76e-05,0,8.02e-05,9.74e-05,0.000128,0.000177,0.000234,0.000253,0.000235,0.000303,0.000525,0,0.00249,0.000348,0.000154,9.01e-05,9.25e-05,0.000379,0.000109,6.62e-05,7.6e-05,0,0.000122,0.000145,0.000173,0.00019,0.000165,0.00016,0.000124,9.09e-05,0.000104,0.000194,0,0.000116,9e-05,0.000115,0.109,0,0,0,0,0,0.000152,0.000187,0.000148,0,0.000132,0,0,0,0,0,0.000116,8.77e-05,9.71e-05,0.237,0,0,0,0,0.00205,0.000204,0.000186,0.000161,0.000133,0.000857,0,0,0,0,0.000405,0.000166,8.17e-05,7.01e-05,0.000137,7.68e-05,6.56e-05,6.86e-05,8.13e-05,0.000114,0.000146,0.000154,0.000144,0.000145,0.000116,8.83e-05,7.63e-05,7.24e-05,9.44e-05,0.000124,0.000131,7.76e-05,6.46e-05,7.84e-05,6.96e-05,7.34e-05,7.32e-05,7.27e-05,7.64e-05,8.16e-05,8.79e-05,9.06e-05,9.01e-05,8.57e-05,7.86e-05,8e-05,8.22e-05,7.46e-05,7.55e-05,7.55e-05,6.3e-05,6.15e-05],"winrateAvg":0.985237,"leadAvg":10.8379,"scoreMeanAvg":12.7118,"scoreStdevAvg":13.0783,"shorttermWinlossErrorAvg":0.016235,"shorttermScoreErrorAvg":1.04833,"ownership":[42,47,51,63,63,55,38,32,25,19,8,-7,-28,-48,-62,-66,-66,-64,-63,41,43,51,58,90,44,40,28,29,19,12,-3,-25,-52,-61,-85,-62,-61,-62,40,42,49,56,60,33,17,30,31,34,19,12,-1,-88,-64,-63,-60,-61,-61,40,40,33,68,95,35,-19,17,27,74,16,4,-21,-38,-68,-46,-61,-62,-61,44,40,97,97,50,26,12,22,13,6,5,1,-11,-29,-89,-70,-61,-64,-64,42,58,53,62,25,15,2,2,4,3,2,-1,-6,-16,-35,-48,-91,-71,-65,35,28,6,90,27,3,-2,0,-3,3,3,0,-3,-9,-19,-25,-58,-69,-62,19,23,37,90,14,-8,2,-3,-5,8,3,3,0,-5,-14,-28,-86,-58,-52,-2,6,39,29,-11,-70,-18,-3,5,63,13,7,4,0,-5,-7,-23,-37,-37,-24,-37,-71,8,30,-71,-15,-12,1,13,8,7,6,4,3,1,-5,-18,-20,-41,-48,-53,-61,-87,-20,29,-6,1,7,6,4,4,5,6,6,0,0,-3,-50,-53,-57,-59,-52,-32,-21,-14,-4,1,3,0,1,2,9,10,15,16,12,-56,-57,-58,-63,-61,-44,-82,-17,-11,-6,-4,-1,2,5,14,20,21,33,29,-59,-55,-40,-67,-96,-60,-40,-12,-11,-11,-12,-8,-2,6,71,27,40,52,48,-58,-73,-72,-79,-91,-93,-56,-22,-16,-16,-21,-7,-14,-5,12,35,98,76,66,-54,-66,-95,-95,-95,91,-69,-27,-10,-18,-67,-16,-58,-56,-53,-55,98,90,78,-29,-45,90,91,91,92,8,45,17,9,-13,3,97,97,97,98,90,89,85,-5,62,68,83,85,72,59,41,30,13,8,27,54,81,89,92,91,89,87,34,55,69,74,71,67,53,36,21,10,9,24,47,64,78,87,89,89,89],"ownershipAllowedMAE":0.0341249,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".XOOOOOOO........../OOO.O....OOOOO...../XOOO..OOOOXXO.O..../XXOXOOO.X...XO.O.../XOOXXOOX.OXO.XO..../XXXX.XOXOOXOO.OOO../XO.XXXOO.OO.OOXXO../X.OOXO......OOOXXO./XO.XOO.OOO.OOOXXO.O/XXXXO.OOOOOXXOXXOO./...XOOXXXOOOXXXXO../.XXXXOOXXOOXOOXXOOO/XXOOXOXX.XXX..XOXXX/OOOOOOOX..XO.X.O.../XXXXOXOX..XO.O.OX.O/..XXXXXXOXX.....XXO/.XXXOXX.X..X.OO.XXX/..XOOO......XX.OOX./..XX.............X./","hintLoc":"null","initialTurnNumber":278,"metadata":"B1751849EDE37FFA851FB09D12876233:288","moveLocs":["J5","L16","E1","M16","G2","pass","F1","pass","P2","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.15,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":12.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0,0,0,0,0,0,0,0.000923,0.00101,0.00104,0.00104,0.00107,0.00125,0.0012,0.00121,0.00279,0.00109,0,0,0,0,0,0.000842,0.000876,0.00089,0.00087,0,0,0,0,0,0.00113,0.0115,0.0109,0.0126,0.00333,0,0,0,0,0.000797,0.000847,0,0,0,0,0.000919,0.000933,0,0,0,0.00113,0.0165,0.0119,0.00122,0,0,0,0,0,0,0,0.00141,0,0.00188,0,0,0,0,0,0,0.00681,0.0118,0.00114,0,0,0,0,0,0,0,0,0.00231,0,0.000955,0,0.00259,0,0,0.000929,0.00172,0.0127,0.00113,0,0,0,0,0.000787,0,0,0,0,0,0.00093,0,0,0.00139,0,0,0,0.00201,0.00117,0,0,0.0112,0,0,0,0,0,0.000961,0,0,0.000928,0,0,0,0,0,0.00133,0.00119,0,0.0119,0,0,0,0,0.00178,0.00106,0.00174,0.00101,0.00136,0.000905,0,0,0,0,0,0,0.00124,0,0,0.0113,0,0,0,0.00185,0,0,0,0.000864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000896,0.000745,0.00143,0.000818,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000843,0.000865,0.000825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0127,0,0,0,0.0252,0.0261,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00372,0.00311,0,0,0.0256,0,0.0211,0,0.0224,0.00942,0.0026,0,0,0,0,0,0,0,0,0,0.0131,0,0,0.0172,0,0.018,0,0,0.0157,0,0.000883,0.0011,0,0,0,0,0,0,0.0139,0,0,0.0195,0.0134,0.0159,0.0218,0.0217,0,0,0,0.000972,0,0,0,0.00113,0,0,0.0134,0,0.0137,0.0139,0,0.0167,0,0,0.0181,0,0,0,0.000931,0.00103,0,0.000961,0.000847,0.0082,0,0.00114,0.00131,0.00117,0.00116,0.0137,0,0,0,0,0,0,0.00111,0.00101,0.000922,0,0,0,0,0.0124,0.00106,0.00114,0.00117,0.00111,0.00112,0.00117,0.00121,0.00388,0.0176,0.0158,0,0.00102,0.307],"winrateAvg":0.000395451,"leadAvg":-10.079,"scoreMeanAvg":-10.0098,"scoreStdevAvg":1.14146,"shorttermWinlossErrorAvg":0.00762775,"shorttermScoreErrorAvg":0.506724,"ownership":[99,97,100,100,100,100,100,100,100,98,98,98,97,97,97,97,97,97,98,100,100,100,100,100,99,99,99,99,100,100,100,100,100,97,97,97,96,97,-100,100,100,100,99,99,100,100,100,100,99,99,100,99,100,97,97,97,97,-100,-100,100,-100,100,100,100,96,93,96,100,100,94,100,99,100,97,97,97,-100,100,100,-100,-100,100,100,93,95,100,98,100,95,93,100,98,98,97,97,-100,-100,-100,-100,-100,-100,100,94,100,100,99,100,100,95,100,100,100,98,98,-100,-96,-97,-100,-100,-100,100,100,99,100,100,99,100,100,-100,-100,100,98,98,-100,-97,-95,-97,-100,100,99,98,98,98,99,99,100,100,100,-100,-100,100,98,-100,-96,-97,-100,100,100,99,100,100,100,99,100,100,100,-100,-100,100,99,100,-100,-100,-100,-100,100,99,100,100,100,100,100,-100,-100,100,-100,-100,100,100,99,-100,-100,-99,-100,100,100,-100,-100,-100,100,100,100,-100,-100,-100,-100,100,99,99,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,-100,-98,-98,-100,-100,100,100,100,-100,-100,100,100,-100,100,-100,-100,-99,-100,-100,-100,-98,-98,-100,-97,-100,-100,-100,100,100,100,100,100,100,100,-100,-99,-99,-100,-96,-97,-100,-97,-97,-98,-97,-97,-100,-100,-100,-100,100,-100,100,-100,-100,-99,-100,-96,-97,-96,-97,-97,-100,-97,-96,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-97,-96,-96,-97,-97,-100,-100,-97,-99,-100,-100,-100,-100,-100,-100,-99,-100,-98,-98,-100,-97,-96,-96,-97,-100,-100,-100,-99,-99,-100,-100,-100,-100,-100,-99,-99,-98,-98,-98,-100,-100,-100,-96,-96,-100,-99,-100,-99,-100,-100,-100,-100,-99,-99,-99,-98,-98,-98,-98,-97,-97,-97,-97,-100,-100],"ownershipAllowedMAE":0.00974975})%"); + lines.push_back(R"%({"sample":{"board":"XOOX.OO............/.X.XXXO............/XXXXOXOO.......X.../.OOOOOX.......X..../......O.........O../..X............X.../................O../..OO.............../..XOO.........X.X../..XXOX............./.O.OXOO............/...OXXO........O.../...OX.XO........O../..OX.XXX......X..../..X.X.X..O.O..XO.../..XXOXX.XO...X..O../..XOO..OOX.O..X..../......X.........XO./.................../","hintLoc":"null","initialTurnNumber":94,"metadata":"8815BD0D9157EFC8D2B35EA2ACD9143D:104","moveLocs":["R3","S3","Q4","R5","K2","N2","P8","P9","O8","O9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.14,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":2.145,"policyMixture":[0,0,0,0,2.07e-06,0,0,2.71e-06,2.97e-06,3.08e-06,3.22e-06,3.19e-06,3.07e-06,2.89e-06,2.83e-06,3.17e-06,3.1e-06,2.98e-06,2.06e-06,2.06e-06,0,3.42e-06,0,0,0,0,2.94e-06,6.13e-06,1.05e-05,1.59e-05,1.6e-05,1.12e-05,6.87e-06,6.84e-06,5.87e-06,1.1e-05,1.17e-05,3.69e-06,0,0,0,0,0,0,0,0,8.48e-06,0.000146,0.00103,0.00018,2.93e-05,9.4e-06,4.16e-06,0,6.8e-05,0.000259,4.58e-06,0.000193,0,0,0,0,0,0,0.00207,0.00247,0.000644,0.000936,0.000172,3.65e-05,7.43e-06,0,4.99e-06,0.0123,0.000363,4.27e-06,4.55e-06,6.98e-06,3.46e-06,3.49e-06,4.13e-06,5.96e-06,0,4.05e-05,8.9e-05,0.000163,0.000145,7.81e-05,3.14e-05,1.04e-05,8.84e-06,0.000309,0,1.33e-05,4.93e-06,5.35e-06,0.0069,0,4.49e-06,6.37e-06,6.71e-06,4.45e-05,4.1e-05,7.09e-05,8.44e-05,0.000106,9.67e-05,6.51e-05,0.000104,2.79e-05,0,0.0755,8.63e-06,5.1e-06,5.28e-06,0.000184,9.08e-06,7.38e-06,7.41e-06,8.3e-06,8.93e-06,1.9e-05,4.74e-05,8.03e-05,0.000105,0.000112,9.4e-05,0.000153,9.37e-05,0.128,0,2.81e-05,4.79e-06,3.62e-06,0.018,0,0,4.2e-06,1.18e-05,1.29e-05,1.5e-05,3.4e-05,6.8e-05,0.000103,0.000142,0.000156,0.000194,5.22e-05,3.13e-05,2.76e-05,0.000104,4.28e-06,8.43e-06,1.96e-05,0,0,0,9.02e-05,1.24e-05,1.91e-05,2.42e-05,4.81e-05,8.33e-05,0.000101,0.000189,1.2e-05,0,6.65e-06,0,1.17e-05,4.21e-06,6.21e-06,3.3e-05,0,0,0,0,6.2e-05,6.44e-05,3.24e-05,3.62e-05,4.76e-05,5.08e-05,1.28e-05,6.01e-06,5.71e-06,3.69e-05,9.72e-06,1.66e-05,3.57e-06,5.32e-06,0,0.000853,0,0,0,0,1.32e-05,6.33e-05,3.91e-05,4.16e-05,9.05e-05,0.438,0,0,0.11,0.000884,1.33e-05,3.79e-06,4.54e-06,3.95e-05,3.24e-06,0,0,0,0,7.09e-05,1.49e-05,4.86e-05,8.53e-05,0.0325,0.0453,0,0,0,7.02e-06,3.31e-05,3.65e-06,5.21e-06,6.59e-05,0.00349,0,0,2.36e-06,0,0,0.00481,0.000244,0.000754,0.0753,5.63e-05,5.04e-06,4.38e-06,4.93e-05,0,9.05e-06,3.48e-06,4.84e-06,0.018,0,0,2.32e-06,0,0,0,7.31e-06,1.8e-05,0.00135,6.24e-05,6.17e-05,5.85e-06,0,0.00192,1.06e-05,3.53e-05,3.57e-06,3.35e-06,5.88e-06,0,2.31e-06,0,2.36e-06,0,2.71e-06,4.58e-06,0,8.13e-06,0,7.36e-05,3.19e-06,0,0,0,2.47e-05,3.56e-06,2.58e-06,2.83e-06,0,0,0,0,0,6.83e-06,0,0,4.22e-05,1.77e-05,8.97e-05,0,2.19e-06,0,0,1.12e-05,3.73e-06,2.25e-06,2.49e-06,0,0,0,2.99e-06,4.76e-06,0,0,0,0.00026,0,1.43e-05,5.34e-06,0,2.93e-06,0,0,3.18e-06,2.31e-06,2.44e-06,2.64e-06,2.69e-06,2.92e-06,2.9e-06,0,1.22e-05,0.00377,0,0.00012,1.05e-05,0,0.00729,7.01e-06,6.1e-06,0,0,3.85e-06,2.04e-06,2.34e-06,2.3e-06,2.42e-06,2.56e-06,2.67e-06,5.1e-06,3.2e-05,2.13e-05,9.72e-06,5.24e-06,5.09e-06,4.9e-06,5.61e-06,5.06e-06,4.27e-06,4.3e-06,7.09e-06,2.37e-06,4.97e-06],"winrateAvg":0.149488,"leadAvg":-4.06501,"scoreMeanAvg":-5.78316,"scoreStdevAvg":11.9566,"shorttermWinlossErrorAvg":0.110251,"shorttermScoreErrorAvg":1.36955,"ownership":[-78,-76,-77,-79,0,90,90,76,61,43,23,3,-15,-30,-42,-45,-39,-33,-28,-76,-79,-78,-79,-79,-79,90,76,53,40,21,3,-15,-30,-47,-55,-46,-33,-21,-78,-79,-77,-78,94,-78,90,90,43,28,13,2,-17,-24,-55,-88,-22,-9,-15,-6,93,94,94,93,94,52,53,23,18,6,0,-15,-35,-89,-39,-29,-10,-4,18,57,61,65,65,66,85,28,17,11,3,-5,-12,-25,-40,-24,17,1,0,32,39,28,59,56,51,33,19,12,7,1,-5,-11,-19,-36,-75,-45,5,-2,51,65,60,61,54,42,30,17,10,5,0,-4,-9,-18,-36,-44,12,-4,-6,66,66,97,97,65,42,27,16,8,3,0,-4,-7,-18,-34,-33,-20,-14,-14,71,75,69,97,97,51,31,16,6,3,1,-1,-6,-10,-76,-43,-72,-30,-20,74,76,68,69,96,22,32,12,4,3,2,2,10,11,-3,23,-5,-12,-13,60,82,74,76,-99,52,52,10,8,4,3,1,-21,74,74,29,11,8,6,36,36,45,73,-99,-99,52,-6,1,6,6,1,1,-79,-79,82,47,30,31,-1,10,4,74,-100,-99,-100,10,-25,9,3,-16,-28,-46,-42,4,89,66,53,-33,-36,2,-100,-99,-100,-100,-100,-20,14,5,10,-14,-51,-91,-24,62,78,71,-63,-72,-100,-98,-100,-99,-100,-67,2,77,40,73,-4,-53,-92,90,91,85,81,-78,-90,-100,-100,-91,-100,-100,-60,-76,76,59,37,-11,-91,-85,-86,91,87,84,-85,-94,-100,-90,-90,-95,-66,-32,-31,-47,51,76,9,-48,-90,-78,-80,89,81,-89,-92,-94,-93,-92,-90,-94,-68,-34,-46,45,58,71,-46,-16,-34,-79,89,55,-91,-93,-93,-92,-91,-89,-84,-69,-52,-27,34,53,38,17,-12,-30,-4,16,47],"ownershipAllowedMAE":0.031961})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../....O....O..XXOXXX./..O.OX.....XOOOOOX./......X.OO..O.X.XO./..O.XOOXXO....X.XX./....XXOX..O....OOX./.XOOOOOOXX.O.....O./.XOXOOOXXOOOOO..O../..XX.XOOOXXOXXX.XX./...X.XXXXX.XO..X.O./..O.XOOOO..XO....../....OXX....OX...O../.....OX............/..........XO....O../XXXXXXX.XXOXXXO.XX./XOOOOXOO.OO..OXX.../OOX.XOO............/.O................./","hintLoc":"null","initialTurnNumber":154,"metadata":"54463609A61D450E999A24E3CDF73062:164","moveLocs":["P18","M6","K6","O7","O8","P5","N3","Q6","P7","N6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.45,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":14.0,"policyOptimism":0.633,"pda":0.0,"policyMixture":[4.79e-06,4.65e-06,4.5e-06,4.45e-06,4.4e-06,4.49e-06,4.45e-06,4.66e-06,4.89e-06,4.63e-06,4.53e-06,4.84e-06,4.79e-06,4.84e-06,4.66e-06,5.08e-06,4.72e-06,4.72e-06,5.08e-06,4.61e-06,4.42e-06,4.34e-06,4.4e-06,4.3e-06,4.43e-06,4.4e-06,4.72e-06,5.06e-06,1.09e-05,6.01e-06,4.58e-06,4.98e-06,4.76e-06,0,4.71e-06,4.67e-06,4.53e-06,4.49e-06,4.68e-06,4.37e-06,4.55e-06,4.48e-06,0,4.55e-06,4.41e-06,4.73e-06,5.48e-06,0,6.67e-06,4.66e-06,0,0,0,0,0,0,4.7e-06,4.54e-06,4.97e-06,0,4.61e-06,0,0,4.19e-06,4.63e-06,5.83e-06,5.93e-06,4.89e-06,0,0,0,0,0,0,0,4.55e-06,5e-06,4.47e-06,4.95e-06,4.76e-06,4.78e-06,5.16e-06,0,4.49e-06,0,0,4.6e-06,4.74e-06,0,4.4e-06,0,4.56e-06,0,0,4.49e-06,4.97e-06,5.62e-06,0,4.45e-06,0,0,0,0,0,0,4.99e-06,4.83e-06,5.1e-06,4.75e-06,0,4.98e-06,0,0,5.12e-06,5.13e-06,7.84e-06,0.00068,5.08e-05,0,0,0,0,4.67e-06,4.53e-06,0,4.96e-06,5.41e-06,5.29e-06,5.96e-06,0,0,0,5.07e-06,4.69e-06,0,0,0,0,0,0,0,0,0,4.88e-06,0,4.67e-06,5.78e-06,8.05e-06,6.51e-06,5.01e-06,0,8.05e-06,4.69e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,1.91e-05,2.53e-05,0,9.86e-06,7.19e-06,5e-06,4.52e-06,0,0,6.34e-06,0,0,0,0,0,0,0,0,0,0,5.66e-06,0,0,6.52e-05,4.61e-06,4.49e-06,4.52e-06,0,4.22e-06,0,0,0,0,0,4.81e-06,0,0,0.41,1.45e-05,0,2.27e-05,0,4.69e-05,4.73e-06,4.27e-06,0,4.74e-06,0,0,0,0,0,5.44e-06,5.01e-06,0,0,0,0.308,0.00195,6.84e-05,0.0101,6.99e-06,4.62e-06,4.28e-06,4.36e-06,4.32e-06,0,0,0,5.09e-06,4.63e-06,5.44e-06,5.49e-06,0,0,0,0,0.0112,0,0.0309,1.19e-05,4.77e-06,4.33e-06,4.32e-06,4.63e-06,4.53e-06,0,0,4.43e-06,5.1e-06,0,4.95e-06,0,0,0.0103,0.126,0,5.41e-06,0.0382,7.94e-06,4.87e-06,4.46e-06,4.25e-06,4.46e-06,4.53e-06,4.6e-06,4.15e-06,4.46e-06,4.63e-06,4.49e-06,0,0,5.32e-06,0.0241,0,5.02e-06,0,0.00858,7.25e-06,0,0,0,0,0,0,0,4.53e-06,0,0,0,0,0,0,0,0.0185,0,0,5.64e-06,0,0,0,0,0,0,0,0,2.34e-05,0,0,4.55e-06,0,0,0,0,5.24e-06,5.03e-06,5.22e-06,0,0,0,0.000522,0,0,0,4.65e-06,9.61e-06,4.98e-06,5.14e-06,4.86e-06,5.16e-06,4.96e-06,5.2e-06,4.76e-06,4.72e-06,4.98e-06,4.95e-06,0,0,0.000145,1.51e-05,6.33e-06,4.43e-06,4.55e-06,4.9e-06,4.71e-06,4.65e-06,5.25e-06,5.7e-06,5.39e-06,4.89e-06,4.81e-06,5.07e-06,4.9e-06,4.95e-06,5.06e-06,8.53e-06],"winrateAvg":0.435416,"leadAvg":-0.264353,"scoreMeanAvg":-2.11116,"scoreStdevAvg":19.7686,"shorttermWinlossErrorAvg":0.396123,"shorttermScoreErrorAvg":6.39649,"ownership":[87,89,90,91,90,88,85,81,75,29,13,-21,-48,-67,-83,-91,-95,-97,-98,84,88,91,93,93,90,88,86,83,80,-17,-27,-56,-83,-88,-89,-96,-98,-98,79,86,91,93,99,90,89,89,86,95,32,-43,-86,-85,86,-99,-100,-100,-99,64,87,98,91,99,85,89,91,88,53,15,-44,86,86,86,87,87,-100,-99,50,72,80,88,91,90,86,94,100,100,34,20,86,12,-95,-34,-98,-98,-98,24,50,93,84,80,99,99,91,91,100,62,27,15,-28,-95,-46,-98,-99,-87,-5,2,18,85,79,78,99,91,92,95,100,50,25,-2,-8,63,61,-98,-42,-25,-84,97,98,98,99,99,99,89,90,96,99,65,46,35,33,38,42,-8,-69,-86,96,-96,98,99,99,87,89,99,99,99,99,99,8,-5,46,-24,-15,-79,-85,-96,-97,-13,-97,99,98,98,-98,-98,99,-91,-90,-89,-57,-84,-82,-36,-81,-82,-84,-97,-86,-97,-97,-97,-98,-98,-92,-94,-56,-82,-77,-88,-39,6,-21,-82,-79,-74,-78,-90,-53,-52,-52,-54,-66,-59,-94,-45,-87,-59,-49,-6,-8,-1,-84,-84,-82,-83,-77,-94,-93,-69,-67,-64,-52,-32,-47,-34,-68,-18,20,7,-1,-88,-84,-85,-82,-84,-79,-92,-68,-65,-94,-48,-34,-30,-45,-17,18,7,-15,-17,-92,-88,-87,-87,-87,-88,-78,-71,-74,-86,-90,-31,-60,-54,4,-15,14,-15,-38,-98,-98,-98,-98,-98,-98,-98,5,-92,-92,89,-95,-96,-96,4,-49,-96,-96,-62,-98,88,88,88,90,-98,97,97,-9,90,89,-2,-95,-90,-98,-98,-91,-87,-81,89,88,85,87,86,96,97,91,86,83,56,34,-68,-89,-93,-92,-92,-89,-85,89,89,88,89,92,92,90,85,76,63,46,5,-43,-80,-89,-91,-91,-89,-88],"ownershipAllowedMAE":0.0395045})%"); + lines.push_back(R"%({"sample":{"board":"................./................./...........OOO.../...X.......XX..../..............X../..O............../................./................./................./................./................./..XX............./..OX............./..O..........X.../...O.O.........../................./................./","hintLoc":"null","initialTurnNumber":16,"metadata":"5BD91F7C207401DB1F1EC22E0B2E3BC2:26","moveLocs":["L14","L15","K14","B14","C11","D11","C10","D12","C15","D10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":17,"ySize":17},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.12e-06,4.6e-06,4.57e-06,4.64e-06,4.71e-06,4.82e-06,4.79e-06,5.05e-06,5.52e-06,5.36e-06,4.67e-06,4.44e-06,4.48e-06,4.66e-06,4.97e-06,5.21e-06,4.31e-06,4.63e-06,5.52e-06,5.2e-06,5.64e-06,5.83e-06,6.35e-06,7.26e-06,4.59e-05,0.000203,3.09e-05,5.33e-06,4.29e-06,4.25e-06,4.92e-06,7.03e-06,7.97e-06,5.08e-06,4.66e-06,1.55e-05,0,4.59e-06,7.21e-06,2.41e-05,2.31e-05,4.41e-05,5.13e-05,0.0095,0,0,0,0,1.36e-05,0.000113,5.34e-06,4.49e-06,0,6.04e-06,0,6.36e-06,4.66e-05,2.84e-05,7.53e-06,6.17e-06,0,0,0,0,6.5e-06,8.04e-06,2.74e-05,4.93e-06,4.29e-06,2.08e-05,6.42e-06,5.58e-06,1.68e-05,4.46e-05,1.84e-05,7.27e-06,5.71e-06,4.45e-06,3.98e-06,3.91e-06,4.29e-06,4.83e-06,0,5.97e-06,4.76e-06,4.81e-06,0.0503,0,0,5.62e-06,1.26e-05,1.34e-05,8.16e-06,6.87e-06,6.11e-06,5.5e-06,5.35e-06,5.76e-06,5.57e-06,5.17e-06,5.82e-06,4.47e-06,5.22e-06,2.18e-05,0,0,4.77e-06,1.92e-05,2.06e-05,1.22e-05,8.31e-06,7.44e-06,6.98e-06,6.79e-06,6.67e-06,6.56e-06,7.03e-06,6.14e-06,4.66e-06,6.23e-06,3.17e-05,0,0,5.61e-06,1.81e-05,3.06e-05,2.2e-05,1.37e-05,9.74e-06,8.38e-06,7.81e-06,7.37e-06,7.39e-06,8.06e-06,6.38e-06,4.72e-06,5.49e-06,8.33e-05,0.0982,0.0105,7.21e-06,2.84e-05,3.46e-05,2.58e-05,2.02e-05,1.67e-05,1.3e-05,9.74e-06,8.55e-06,1.69e-05,1.12e-05,6.72e-06,4.69e-06,5.4e-06,6.78e-05,0.688,6.5e-05,2.08e-05,2.61e-05,3.28e-05,2.49e-05,2.01e-05,1.95e-05,2e-05,1.76e-05,1.74e-05,3.34e-05,2.57e-05,6.93e-06,4.7e-06,5.14e-06,5.01e-05,5.84e-06,5.54e-06,7.03e-06,1.16e-05,3.7e-05,2.52e-05,1.62e-05,1.46e-05,1.58e-05,1.38e-05,1.61e-05,4.63e-05,5.59e-05,7.11e-06,4.81e-06,5.07e-06,1.41e-05,0,0,4.92e-06,8.83e-06,4.55e-05,3.71e-05,1.4e-05,1.05e-05,9.43e-06,8.91e-06,1.12e-05,4.76e-05,6.96e-05,7.63e-06,4.76e-06,5.1e-06,2.33e-05,0,0,4.69e-06,1.16e-05,5.99e-05,4.25e-05,1.42e-05,9.97e-06,9.47e-06,9.66e-06,7.38e-06,7.4e-06,4.82e-05,8.32e-06,4.98e-06,5.62e-06,6.39e-06,0,0.13,0.00826,0.000204,9.27e-05,2.55e-05,1.56e-05,1.45e-05,2.53e-05,2.74e-05,7.2e-06,0,9.6e-06,7.39e-06,4.82e-06,5.04e-06,7.85e-06,2.03e-05,0,0.000116,0,0.000183,2.68e-05,1.39e-05,1.56e-05,2.63e-05,3.5e-05,1.2e-05,7.74e-06,7.91e-06,6.02e-06,4.63e-06,4.86e-06,5.71e-06,9.96e-06,2.5e-05,0.000174,5.92e-05,7.48e-06,7.18e-06,6.71e-06,6.71e-06,6.66e-06,6.72e-06,6.91e-06,6.81e-06,5.97e-06,5.23e-06,4.6e-06,4.37e-06,4.75e-06,4.76e-06,4.87e-06,5.26e-06,4.92e-06,4.71e-06,4.74e-06,4.69e-06,4.66e-06,4.69e-06,4.64e-06,4.77e-06,4.75e-06,4.6e-06,4.63e-06,4.24e-06,4.17e-06],"winrateAvg":0.532124,"leadAvg":0.332244,"scoreMeanAvg":0.278425,"scoreStdevAvg":12.3561,"shorttermWinlossErrorAvg":0.0918806,"shorttermScoreErrorAvg":0.650352,"ownership":[-9,-24,-33,-38,-33,-24,-13,-3,7,22,43,55,64,63,56,48,41,12,-20,-37,-42,-36,-27,-15,6,5,23,48,72,76,72,56,47,29,30,20,-65,-45,-27,-31,-13,-10,6,-50,84,84,84,84,46,15,15,45,67,19,-69,-21,-4,-9,-10,-23,-90,-90,-90,-90,-4,-14,17,-13,46,55,47,10,-10,-9,-2,-6,-12,-30,-39,-42,-45,-42,-81,-44,-26,30,6,88,87,17,7,4,-2,-8,-14,-16,-19,-22,-29,-33,-35,-31,-4,-16,-58,87,32,8,7,1,-7,-10,-13,-15,-17,-19,-21,-27,-26,-30,-44,-60,87,35,13,6,1,-7,-10,-11,-12,-14,-15,-19,-22,-20,-49,-59,-7,47,25,8,4,-2,-6,-8,-8,-9,-10,-12,-15,-17,-16,-57,-62,-74,4,6,4,0,-3,-5,-6,-6,-7,-8,-8,-13,-15,-15,-52,-57,-57,-25,-5,-4,-4,-5,-5,-5,-6,-7,-9,-9,-13,-17,-16,-31,-33,-87,-86,-27,-10,-8,-7,-5,-5,-7,-10,-14,-18,-28,-22,-23,7,16,84,-86,-32,-3,-7,-9,-6,-6,-9,-15,-22,-36,-46,-35,-28,34,71,85,-39,-20,13,-4,-2,-3,-5,-10,-23,-36,-86,-43,-35,-31,60,70,79,89,34,84,13,0,1,-5,-11,-19,-35,-42,-36,-33,-30,68,74,78,80,70,56,34,13,5,-2,-8,-13,-22,-27,-29,-28,-29,73,76,76,73,63,48,30,15,5,-2,-8,-14,-20,-24,-26,-28,-28],"ownershipAllowedMAE":0.0276507})%"); + lines.push_back(R"%({"sample":{"board":"..OOX............O./..OXX.......XXX.O.O/..OX......XXOO.XXO./..OX.....XOX...XO../..OX....X..OOO.XOO./..OX...X..OOXXXX.X./.OX.O.XOXX.OXOX.XO./.OX.OXX.OX.OOOX..X./.OX.XOXOO...OXX.OO./.X.XOOO...XXOOX..O./...X.......XO.OOO.X/..XOX...O.X.....XO./....XO.O.OXOXXXXXO./...OX...XXXXOOOOXOO/.XXXOOO...XOO.OXXX./.XOOXX.OO..XXOOOX../X.XOOX...OXXOX.XOX./.XOOXO...OX.OO.OOX./.O................./","hintLoc":"null","initialTurnNumber":90,"metadata":"0744C0DCB6C06F7AF1A82FCC8861D09D:100","moveLocs":["D11","B3","O8","O9","C3","N8","M8","B3","G9","H10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":12.5,"policyOptimism":0.085,"pda":0.0,"policyMixture":[3.11e-05,3.2e-05,0,0,0,3.08e-05,3.13e-05,3.17e-05,3.18e-05,3.15e-05,3.23e-05,3.3e-05,3.21e-05,3.21e-05,3.68e-05,3.74e-05,3.54e-05,0,0,3.42e-05,3.31e-05,0,0,0,3.14e-05,3.14e-05,3.21e-05,3.18e-05,3.18e-05,3.19e-05,3.35e-05,0,0,0,3.87e-05,0,0,0,3.43e-05,3.35e-05,0,0,3.04e-05,3.1e-05,3.1e-05,3.13e-05,3.22e-05,3.19e-05,0,0,0,0,3.62e-05,0,0,0,3.26e-05,3.46e-05,3.28e-05,0,0,3.07e-05,3.07e-05,3.12e-05,3.14e-05,3.2e-05,0,0,0,0.000102,4.74e-05,3.47e-05,0,0,3.49e-05,4.08e-05,3.85e-05,4.93e-05,0,0,3.08e-05,3.11e-05,3.74e-05,3.25e-05,0,3.45e-05,3.75e-05,0,0,0,3.63e-05,0,0,0,5.05e-05,3.97e-05,0.000193,0,0,3.29e-05,3.56e-05,3.56e-05,0,3.35e-05,3.53e-05,0,0,0,0,0,0,4.16e-05,0,3.79e-05,3.97e-05,0,0,3.25e-05,0,3.8e-05,0,0,0,0,3.22e-05,0,0,0,0,3.19e-05,0,0,4.17e-05,4.36e-05,0,0,3.21e-05,0,0,0,0.000122,0,0,3.76e-05,0,0,0,0,3.57e-05,7.74e-05,0,4.2e-05,0.000123,0,0,0,0,0,0,0,0,4.18e-05,3.78e-05,3.67e-05,0,0,0,3.78e-05,0,0,0.00044,3.76e-05,0,3.34e-05,0,0,0,0,0,4.7e-05,0.000143,0,0,0,0,0,0.0096,3.13e-05,0,4.68e-05,3.44e-05,3.26e-05,3.62e-05,0,6.18e-05,0.00168,0,0.00226,0.000493,5.84e-05,3.08e-05,0,0,0,0,0,0,0.000518,0,3.58e-05,3.66e-05,0,0,0,0.204,0.223,0.000192,0,4.38e-05,0,0,0,0,3.6e-05,3.74e-05,0,0,0.00116,3.54e-05,3.63e-05,3.66e-05,3.67e-05,0,0,0.00926,0,0.000257,0,0,3.28e-05,0,0,0,0,0,0,3.83e-05,3.58e-05,3.55e-05,3.76e-05,0,0,0.00922,0.000245,0.000965,0,0,0,0,0,0,0,0,0,0,0,3.42e-05,0,0,0,0,0,0,4.32e-05,4.1e-05,3.28e-05,0,0,0,0,0,0,0,0,0.0051,3.85e-05,0,0,0,0,0,3.29e-05,0,0,0.000154,3.73e-05,0,0,0,0,0,0,3.34e-05,3.65e-05,0,0,0.463,0,0,0,3.41e-05,3.4e-05,3.26e-05,0,0,0,0,0,0.000504,0,0,0,3.22e-05,0.0368,0,0,0,0,0,0.000556,3.6e-05,7.48e-05,0,0,3.64e-05,0,0,6.01e-05,0,0,0,3.64e-05,3.91e-05,0,0.000188,3.65e-05,3.55e-05,7.68e-05,3.52e-05,0.000187,4.69e-05,0.0247,8.96e-05,4.05e-05,3.8e-05,3.63e-05,3.83e-05,7.96e-05,0.000156,6e-05,3.57e-05,2.44e-05],"winrateAvg":0.842893,"leadAvg":1.03887,"scoreMeanAvg":1.3325,"scoreStdevAvg":4.1003,"shorttermWinlossErrorAvg":0.249709,"shorttermScoreErrorAvg":0.941057,"ownership":[100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-99,-98,-88,-25,7,86,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,76,100,100,100,99,100,100,-100,-100,-100,-100,-100,-100,-99,-100,-100,97,96,-72,-100,-99,100,98,99,100,100,-100,-100,-100,-100,-100,-99,-100,4,-100,10,70,-30,-100,98,98,76,99,99,100,-100,-100,-99,-99,-99,-100,4,8,100,100,99,-25,-100,98,98,21,97,98,100,-100,-99,-99,-99,-100,-69,51,100,100,-100,-100,-99,-100,-40,-87,-12,89,98,-100,-99,-99,-99,-99,81,-99,-99,14,100,-100,100,-100,-79,-98,-59,-68,57,98,-100,-99,-99,-99,-99,82,98,-99,-9,100,100,100,-99,-8,19,-88,-18,10,97,-100,-100,-100,98,-99,98,98,22,-56,29,100,-100,-99,25,99,100,39,6,-92,-93,-100,98,98,98,98,57,-37,-99,-100,100,100,-99,-30,33,100,98,-60,-83,-95,-100,-27,4,-37,41,53,5,-75,-100,100,100,100,100,100,99,97,-81,-93,-100,-98,-99,-36,13,65,97,-3,-100,-100,100,-99,-18,19,-99,99,98,-89,-92,-97,-99,-99,63,28,98,6,59,-100,-99,-100,-99,-99,-99,-99,99,98,-91,-94,-97,-97,-99,-22,36,25,-99,-99,-100,-100,100,100,100,100,-99,99,99,-87,-98,-98,-98,100,100,100,46,-9,-43,-100,100,100,100,100,-99,-99,-99,-2,-74,-98,98,98,97,97,99,100,100,42,-96,-97,-97,100,100,100,-99,-97,-84,-77,-6,-5,98,98,97,98,96,96,99,-97,-97,100,99,100,99,99,-98,-87,-59,-63,97,98,97,98,91,91,83,99,-95,21,100,100,99,100,99,-98,-66,-16,55,56,92,96,95,90,81,78,-14,-19,4,58,90,87,56,40,3,-52],"ownershipAllowedMAE":0.0360473,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":"XOOX.OO....O.O...../.X.XXXO...O.OXOX.../XXXXOXOO...OX..X.../XOOOOOX....OX.X..../.X....O...O.OX..O../..X........O...XX../............OOOXOX./..OO..O..XO.OXOOOX./..XOO.XOOOX.OXXXXX./..XXOX.X..X.XO.OOX./.OOOXOOXOO..XOOOX../...OXXOX.XO.OXXOX../...OX.X.X.XOO..OO../.XOX.XXX...OX.X..../..X.X.X..O.OX.XOO../..XXOXX.XO...X.XO../..XOO..OOXOO..X.XO./......XXOXO.OX.OXO./......X.XX...OXX.../","hintLoc":"null","initialTurnNumber":188,"metadata":"8815BD0D9157EFC8D2B35EA2ACD9143D:198","moveLocs":["E14","P17","Q15","F14","S7","S6","E13","F13","L9","M8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.03,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0,0,3.92e-05,0,0,3.8e-05,3.76e-05,3.86e-05,4.15e-05,0,0,0,4.69e-05,0.0119,5.22e-05,4.25e-05,3.78e-05,3.28e-05,0,4.2e-05,0,0,0,0,3.63e-05,3.71e-05,3.78e-05,0,0,0,0,0,0,4.75e-05,4.4e-05,4.02e-05,0,0,0,0,0,0,0,0,3.96e-05,3.66e-05,3.71e-05,0,0,3.39e-05,0,0,4.57e-05,4.06e-05,3.91e-05,0,0,0,0,0,0,0,4.01e-05,3.88e-05,3.72e-05,3.71e-05,0,0,0.558,0,4.09e-05,4.15e-05,4e-05,3.96e-05,4.44e-05,0,4.75e-05,4.47e-05,0.000108,5.41e-05,0,4.13e-05,3.88e-05,3.84e-05,0,0,0,0,4.31e-05,0,0,4.08e-05,4.01e-05,6.06e-05,5.16e-05,0,4.26e-05,0,0,4.11e-05,3.92e-05,4.09e-05,3.83e-05,3.9e-05,0,7.9e-05,4.61e-05,4.53e-05,0,0,3.97e-05,4e-05,0.000223,0.221,9.55e-05,5.22e-05,0,0,6.89e-05,5.19e-05,7.36e-05,4.92e-05,5.01e-05,3.94e-05,0,0,0,0,0,0,3.87e-05,0.000199,0.0011,0,0,0.00027,0.00322,0,0.0655,0.000101,0,0,5.47e-05,0,0,0,0,0,0,3.84e-05,0.000451,0.000238,0,0,0,0.000401,0,0,0,0,0,3.95e-05,0,0,0,0,0,0,3.86e-05,0.00399,9.81e-05,0,0,0,0,0.000522,0,0.106,0.000213,0,3.9e-05,0,0,4.32e-05,0,0,0,3.92e-05,9.22e-05,0,0,0,0,0,0,0,0,0,0,4.1e-05,0,0,0,0,0,6.74e-05,4.54e-05,5.43e-05,0.00275,4.12e-05,0,0,0,0,0,0.00127,0,0,0,0,0,0,0,0,0.00217,0.000209,4.73e-05,5.42e-05,0.00497,0,0,4.08e-05,0,4.06e-05,0,4.48e-05,0,0,0,0.000129,0.000313,0,0,0,0.000489,4.37e-05,0,0,0,4.06e-05,0,0,0,4.21e-05,4.51e-05,0.00108,0,0,0.000145,0,0.00159,5.44e-05,0,5.14e-05,4.37e-05,4.34e-05,0,4.12e-05,0,4.11e-05,0,4.21e-05,6.11e-05,0,4.96e-05,0,0,3.61e-05,0,0,0,4.35e-05,4.58e-05,4.24e-05,4.24e-05,0,0,0,0,0,4.16e-05,0,0,0.000128,0.00353,8.75e-05,0,3.67e-05,0,0,4.83e-05,4.97e-05,4.02e-05,3.96e-05,0,0,0,4.07e-05,3.99e-05,0,0,0,0,0,0.000165,4.08e-05,0,4.29e-05,0,0,4.45e-05,3.99e-05,3.82e-05,3.92e-05,3.93e-05,3.95e-05,3.84e-05,0,0,0,0,0,3.83e-05,0,0,4.35e-05,0,0,0,4.21e-05,3.8e-05,3.93e-05,3.91e-05,3.9e-05,3.98e-05,3.88e-05,0,5.47e-05,0,0,5.11e-05,4.37e-05,0.000537,0,0,0,4.48e-05,0.00142,3.64e-05,4.54e-05],"winrateAvg":0.758579,"leadAvg":0.998726,"scoreMeanAvg":1.17851,"scoreStdevAvg":3.84044,"shorttermWinlossErrorAvg":0.270761,"shorttermScoreErrorAvg":1.07413,"ownership":[-99,-99,-99,-99,4,100,100,99,99,99,98,98,85,85,52,40,-69,-76,-80,-99,-100,-99,-99,-99,-99,100,99,99,99,100,96,96,-17,69,-96,-78,-82,-83,-99,-99,-99,-99,99,-99,100,100,99,99,99,100,-84,-14,59,-96,-89,-88,-87,-99,99,99,99,99,99,98,99,99,99,99,100,-84,-85,-99,-96,-93,-91,-91,-97,-98,-41,-23,24,92,100,98,98,98,100,94,95,-96,-49,-99,-92,-95,-94,-47,-61,-96,-68,-89,100,98,97,97,98,99,100,55,-23,26,-99,-99,-98,-97,18,-51,34,13,-88,100,96,97,96,97,98,99,100,100,100,-100,100,-100,-98,48,93,100,100,7,79,98,93,96,96,99,98,100,-99,100,100,100,-100,-98,86,96,95,100,100,88,-95,97,97,97,88,96,100,-100,-100,-100,-100,-100,-98,87,97,95,96,100,-97,-95,-100,-79,93,88,95,94,100,30,100,100,-100,-93,62,98,98,98,-100,-96,-96,-100,91,93,89,96,95,100,100,100,-93,-95,-64,26,11,50,98,-100,-100,-96,-100,-70,-98,99,100,100,-19,-18,100,-93,-19,-7,-21,-69,68,98,-100,-100,-100,-99,-100,-65,-67,100,100,22,16,100,100,-16,41,-70,-96,64,-100,-99,-100,-100,-100,-15,32,-9,100,-97,-43,-98,-47,80,99,71,-95,-96,-100,-99,-100,-99,-100,-50,69,99,72,100,-97,-94,-98,100,100,98,96,-97,-99,-100,-100,-97,-100,-100,-94,-95,98,94,37,-20,-98,-97,-97,100,98,97,-98,-99,-100,-97,-97,-98,-96,-91,-90,-95,98,98,19,-62,-98,-96,-96,98,96,-99,-99,-98,-98,-98,-97,-99,-99,-91,-95,98,69,73,-97,-96,-90,-95,99,80,-99,-99,-98,-98,-98,-98,-99,-97,-97,-96,89,56,-38,-39,-97,-96,19,64,77],"ownershipAllowedMAE":0.0313767})%"); + lines.push_back(R"%({"sample":{"board":".................../............OO...../............XXOOO../...X.........OXXX../.................../.................../.................../..XO.....X........./..XXOO............./...OX....X........./..XOXXO............/XX.X.XO..X.O..O..../XOXXXOO......XO..../OOXXO......OXOXOO../OOOXOO..X.XOOOXXO../.OOOXO....XXOXXOXX./OOXXXO.O.XXOXXOOOX./OXXOXXO..OOOOXO.X../.XX.XOO....O.XX..../","hintLoc":"null","initialTurnNumber":81,"metadata":"1BF95D7463D9B7FFCEC15AEE2BE831EE:91","moveLocs":["O15","R12","R14","Q14","Q13","R13","P14","S14","Q15","R15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.84,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.93e-06,1.17e-05,1.19e-05,1.28e-05,1.19e-05,1.18e-05,1.17e-05,1.16e-05,1.12e-05,1.1e-05,1.04e-05,9.55e-06,9.44e-06,8.97e-06,9.75e-06,9.91e-06,9.57e-06,9.73e-06,8.78e-06,1.12e-05,1.94e-05,7.67e-05,0.000513,0.002,0.000442,6.78e-05,2.53e-05,1.86e-05,1.52e-05,1.28e-05,1.1e-05,0,0,9.07e-06,9.15e-06,9.89e-06,1.16e-05,1.02e-05,1.09e-05,2.35e-05,0.0142,0.228,0.0315,0.475,0.00487,0.000213,8.57e-05,2.49e-05,1.8e-05,2.54e-05,0,0,0,0,0,1.42e-05,1.22e-05,1.07e-05,1.91e-05,0.001,0,0.00013,0.0269,0.000453,0.000204,0.00014,8.24e-05,3.2e-05,1.82e-05,1.29e-05,0,0,0,0,0.000238,1.13e-05,1.05e-05,1.84e-05,3.19e-05,4.51e-05,3.02e-05,6.7e-05,0.000112,0.000128,0.000151,0.000147,7.52e-05,3.01e-05,1.14e-05,0,1.41e-05,0,0,2.27e-05,1.11e-05,1.07e-05,1.58e-05,2.03e-05,3.41e-05,2.39e-05,4.36e-05,9.11e-05,0.000147,0.000825,0.00905,0.00021,3.53e-05,1.72e-05,1.15e-05,0,3.29e-05,0,0,1.24e-05,1.04e-05,1.22e-05,1.55e-05,2.11e-05,1.76e-05,2.09e-05,4.02e-05,0.000128,0.000198,0.00472,0.000135,7.94e-05,2.04e-05,1.68e-05,1.3e-05,0,0,4.73e-05,1.12e-05,9.94e-06,1.06e-05,0,0,1.23e-05,1.22e-05,1.76e-05,6.09e-05,9.3e-05,0,0.000152,0.000137,5.28e-05,2.25e-05,1.81e-05,0.00644,0,1.58e-05,1.08e-05,9.6e-06,9.94e-06,0,0,0,0,1.25e-05,4.12e-05,0.047,0.00235,0.00956,0.000278,0.000125,5.88e-05,5.92e-05,0.000144,5.25e-05,3.06e-05,1.11e-05,9.27e-06,1.36e-05,1.52e-05,0,0,0.000712,1.31e-05,5.31e-05,1.94e-05,0,3.71e-05,0.00806,5.81e-05,2.69e-05,2.17e-05,4.06e-05,0.000201,6e-05,1.12e-05,1.03e-05,1.1e-05,0,0,0,0,0,1.12e-05,0.00136,0.00236,0.00054,2.57e-05,3.21e-05,1.54e-05,1.32e-05,1.44e-05,2.05e-05,1.85e-05,1.1e-05,0,0,0,0,0,0,0,1.06e-05,1.95e-05,0,3.63e-05,0,1.17e-05,5.15e-05,0,1.08e-05,1.43e-05,1.37e-05,1.08e-05,0,0,0,0,0,0,0,1.11e-05,0.000501,0.0489,3.43e-05,4.95e-05,0.0626,0,0,9.81e-06,1.02e-05,1.16e-05,1.09e-05,0,0,0,0,0,9.37e-06,9.08e-06,1.39e-05,1.52e-05,3.34e-05,0.00253,0,0,0,0,0,0,1.08e-05,1.13e-05,0,0,0,0,0,0,9.32e-06,1.2e-05,0,1.02e-05,0,0,0,0,0,0,0,1.1e-05,1.07e-05,6.36e-06,0,0,0,0,0,8.95e-06,9.82e-06,1.16e-05,8.38e-06,0,0,0,0,0,0,0,0,1.02e-05,0,0,0,0,0,0,9.13e-06,0,1.09e-05,0,0,0,0,0,0,0,0,0,9.93e-06,0,0,0,0,0,0,0,9.52e-06,9.47e-06,0,0,0,0,0,0,1.23e-05,0,9.29e-06,9.13e-06,7.02e-06,0,0,0,0,0,0,9.38e-06,9.49e-06,9.66e-06,8.79e-06,0,2.75e-05,0,0,6.12e-05,9.29e-06,8.82e-06,9.46e-06,8.99e-06],"winrateAvg":0.329706,"leadAvg":-1.27264,"scoreMeanAvg":-1.67759,"scoreStdevAvg":11.7441,"shorttermWinlossErrorAvg":0.145629,"shorttermScoreErrorAvg":1.00092,"ownership":[-10,-9,-8,-9,-4,4,11,15,20,30,42,57,67,83,88,86,82,73,58,-11,-8,-10,-10,-11,14,17,17,21,28,41,55,92,92,90,88,80,74,30,-12,-15,-10,-6,-31,39,16,13,18,24,32,42,30,31,93,93,93,5,16,-17,-20,-26,-79,-20,8,11,11,15,22,29,34,47,80,-80,-80,-80,-13,-25,-23,-28,-36,-26,-7,5,5,6,8,17,16,18,33,81,-11,18,-80,-70,-50,-33,-35,-29,-11,-1,5,5,6,-1,-11,5,13,16,37,75,-14,-13,-83,-69,-49,-52,-38,-19,8,8,6,2,0,-11,2,6,13,15,28,55,-83,-69,-65,-68,-75,-99,24,17,23,4,-1,-14,-67,-12,3,10,12,11,-12,-83,-52,-48,-82,-89,-99,-99,76,77,21,1,7,-36,-6,-2,6,10,10,3,-15,-22,-24,-91,-93,-98,-96,-96,49,42,-10,-26,-78,-23,9,7,9,17,8,18,5,1,-97,-97,-99,-96,-96,-97,97,20,-3,-41,2,13,9,27,31,21,27,20,15,-99,-99,-99,-99,-96,-97,98,24,-27,-76,-10,88,57,79,92,46,20,23,20,-99,95,-99,-99,-99,98,98,22,-20,-27,2,53,90,78,92,71,45,24,10,96,95,-99,-99,99,91,28,10,-17,-26,-16,93,87,93,-98,75,75,29,-10,96,95,96,-99,99,99,35,5,-58,-40,-58,93,93,93,-98,-99,76,-14,-44,95,96,95,96,-96,99,35,5,-8,-38,-58,-58,94,-98,-98,-98,-99,-99,-74,97,95,-96,-96,-96,99,96,98,-3,-55,-59,94,-98,-98,-98,-98,-98,-99,-95,96,-97,-97,-90,-96,-96,99,95,92,95,94,94,94,-98,-98,-99,-99,-98,-98,1,-97,-97,-92,-96,99,99,97,95,95,94,94,38,-98,-98,-98,-98,-99,-98],"ownershipAllowedMAE":0.0261502,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":".OX.............O../.O.OOX.O.......O.OX/..OXXX.XO..OOXX.OX./.OXXX..OO...XOXOOX./OXOOOXXO....OOOXXX./.XX.XOO...O....XO../.X.X....O.OXXOX..../..XOOOO..XX.XX...../...XXOXO....O.X..../....OXXO..OO....XX./.....XO....X...XO../.XX.XXO..OOX.X.XOO./XOOXXO..X.X..OXO.O./.OXOOO....X...XO.O./.XX.....XXOO....OO./.OOO.O.OXO.OOOOXXO./....XXXOOOOXXOXX.O./.OXOX..XXXXXO.OX.X./..O..........O...../","hintLoc":"null","initialTurnNumber":182,"metadata":"4F7E5673520FC3877905CE02AF139929:192","moveLocs":["P18","P19","O19","Q19","S19","T19","J12","T17","H12","H7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.37,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000116,0,0,0.00021,0.00743,0.000428,0.000154,0.00135,0.000272,0.000186,0.000122,0.000122,0.000118,0,0,0,0,0,0,0.000281,0,0.000348,0,0,0,0.000198,0,0.000457,0.000172,0.000122,0.000135,0.000131,0.00113,0,0,0,0,0,0.00255,0.00183,0,0,0,0,0.000184,0,0,0.000123,0.000131,0,0,0,0,0.00175,0,0,0,0.0016,0,0,0,0,0.000143,0.000153,0,0,0.000129,0.000142,0.000146,0,0,0,0,0,0,0.000956,0,0,0,0,0,0,0,0,0.000135,0.000173,0.000295,0.00263,0,0,0,0,0,0,0.000119,0.00261,0,0,0.000167,0,0,0,0.000884,0.00144,0.00168,0,0.0862,0.000178,0.000166,0.000161,0,0,0.000124,0.000122,0.000122,0,0.000125,0,0.000465,0.00213,0.00283,0.0113,0,0.0453,0,0,0,0,0,0.000121,0.000124,0.000123,0.000122,0.000123,0.000123,0,0,0,0,0,0,0,0,0,0.000143,0,0,0.000128,0.000128,0.000122,0.000122,0.000123,0.000121,0.000123,0.000121,0,0,0,0,0,0.00109,0.000152,0.000139,0.000158,0,0.000155,0,0.000126,0.000124,0.000121,0.000122,0.000121,0.000119,0.000127,0.000129,0,0,0,0,0.0486,0.0925,0,0,0.000266,0.000241,0.000144,0.000128,0,0,0.000137,0.000119,0.000119,0.000116,0.000116,0.000114,0,0,0.0137,0.105,0.00282,0.18,0,0.000187,0.000168,0.000143,0,0,0.000143,0.000148,0.000123,0,0,0.000118,0,0,0,0.00221,0.0591,0,0,0,0.000165,0,0.00015,0,0,0,0.000138,0,0,0,0,0,0,0.000411,0,0,0.000615,0,0.00022,0.000533,0,0,0,0.000144,0,0.000119,0.000154,0,0,0,0,0,0.00123,0.193,0.000435,0.000207,0,0.000258,0.00283,0.000496,0,0,0.000146,0,0.000116,0.000148,0,0,0.000166,0.000132,0.00016,0.000402,0.00484,0,0,0,0,0.000134,0.000161,0.0513,0.000139,0,0,0.000115,0.000198,0,0,0,0.000179,0,0.0356,0,0,0,0,0,0,0,0,0,0,0,0.000117,0.000151,0.000138,0.000264,0.00388,0,0,0,0,0,0,0,0,0,0,0,0,0.000135,0,0.000122,0.000156,0,0,0,0,0.000122,0.000125,0,0,0,0,0,0,0,0,0,0.00011,0,0.00013,0.00012,0.00153,0,0.000131,0.000164,0.00013,0.000128,0.00012,0.000116,0.000114,0.000127,0.000147,0.000355,0,0.00256,0.000132,0.000141,0.000126,0.00012,0.000111],"winrateAvg":0.998688,"leadAvg":18.1402,"scoreMeanAvg":17.6487,"scoreStdevAvg":5.65079,"shorttermWinlossErrorAvg":0.013289,"shorttermScoreErrorAvg":2.26871,"ownership":[98,98,80,77,-40,-62,-19,43,94,96,97,98,98,96,100,99,99,98,99,97,98,98,98,98,-99,-14,98,96,97,98,98,98,98,97,99,97,99,96,94,96,98,-99,-99,-99,-6,-1,100,96,96,100,100,97,96,98,99,-99,94,83,96,-99,-99,-99,-6,81,100,100,86,88,95,96,100,97,99,99,-100,-76,80,-100,-98,-98,-95,-95,-90,100,74,73,81,75,99,100,100,-100,-100,-100,-96,-88,-100,-100,-99,-99,96,97,92,29,58,93,-44,-18,-10,-13,-100,-97,-98,-97,-97,-100,-98,-99,-32,51,48,-31,47,-65,91,-100,-100,-18,-100,-98,-98,-98,-98,-97,-96,-98,95,94,93,93,-98,-98,-98,-98,-86,-100,-100,-98,-98,-98,-98,-98,-97,-96,-95,-97,-97,94,-99,41,-35,-18,-7,12,54,-35,-100,-98,-98,-98,-97,-97,-96,-96,-96,-95,-100,-99,47,1,11,56,57,14,-36,-60,-97,-100,-100,-94,-97,-97,-96,-96,-97,-100,95,42,26,53,-36,-94,-18,-38,-65,-99,100,20,-28,-98,-100,-100,-98,-100,-100,96,49,27,74,70,-94,-64,-97,-91,-99,100,100,59,-100,-97,-97,-100,-100,100,89,95,-55,15,-86,-70,-48,4,-93,100,99,100,94,-98,-97,-98,100,100,100,15,-39,-36,-59,-85,12,-10,-8,-89,100,99,100,99,-39,-98,-98,43,54,41,5,27,-73,-70,99,99,51,21,-21,97,100,100,99,3,100,100,100,-6,80,-35,89,-74,95,94,99,99,100,100,94,94,100,99,97,98,98,-16,-99,-99,-99,94,95,95,96,-99,-99,100,94,94,97,100,98,97,99,93,95,-99,-98,-99,-99,-99,-99,-99,-99,98,98,98,94,96,94,97,97,96,97,-9,-44,-97,-97,-99,-99,-98,-96,-58,10,98,96,95,95,96,97],"ownershipAllowedMAE":0.0316511})%"); + lines.push_back(R"%({"sample":{"board":".................../........O........../..XXO..OXXX.OXXXO../..XOO...OX...OXOX../.XOO....OX...XOOOO./.X.XOO..X....XX.OX./...XXO.........OX.X/...............OXX./...............OOX./......O..........O./..X..........XO..X./.X...........XO..../XOOO..X......XO..../.X...........XOXO../..XO.OX......XOOX../..OO.OX......XXXOO./....OXX...XXXOOOXX./.....OX..XOOO...OO./.................../","hintLoc":"null","initialTurnNumber":42,"metadata":"AD23C417DF20F76AE8A103E01FB7EB29:52","moveLocs":["R10","T11","R18","N16","D10","C11","H8","G17","H18","H16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.3,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":6.5,"policyOptimism":0.054,"pda":0.0,"policyMixture":[8.48e-06,8.47e-06,9.29e-06,9.6e-06,1.03e-05,9.65e-06,9.13e-06,7.95e-06,8.29e-06,9e-06,8.83e-06,9.56e-06,8.74e-06,1.4e-05,1.02e-05,1.01e-05,8.65e-06,8.14e-06,8.49e-06,8.66e-06,1.08e-05,1.47e-05,0.0285,2.67e-05,0.000361,0.101,0,0,1.76e-05,9.46e-06,8.69e-06,9.1e-06,9.72e-06,9.34e-06,1.05e-05,0,7.67e-06,8.27e-06,8.6e-06,2.45e-05,0,0,0,4.65e-05,0,0,0,0,0,8.95e-06,0,0,0,0,0,8.4e-06,8.89e-06,8.33e-06,1.93e-05,0,0,0,1.37e-05,0.447,0,0,0,7.65e-06,8.93e-06,0,0,0,0,0,7.64e-06,3.61e-05,8.49e-06,0,0,0,8.43e-06,9.48e-06,0.00155,0.362,0,0,8.27e-06,8.64e-06,8.88e-06,0,0,0,0,0,0.00842,8.79e-06,0,0.000993,0,0,0,1.07e-05,1.14e-05,0,9.01e-06,9.7e-06,9.46e-06,9.09e-06,0,0,1.01e-05,0,0,1.37e-05,8.34e-06,2.41e-05,7.43e-05,0,0,0,1.06e-05,0.00072,2.81e-05,1.18e-05,1.13e-05,1.12e-05,1.13e-05,1.01e-05,9.5e-06,0,0,0,0,8.67e-06,2.14e-05,0.000488,3.59e-05,0.000125,6.39e-05,0.000116,0.000154,8.32e-05,2.36e-05,1.32e-05,1.32e-05,1.9e-05,1.44e-05,8.62e-06,0,0,0,0,8.59e-06,2.17e-05,0,0.0169,1.31e-05,4.36e-05,1.66e-05,4.21e-05,0.000132,6.54e-05,2.34e-05,1.81e-05,4.08e-05,1.8e-05,9.27e-06,0,0,0,0,1.04e-05,3.3e-05,0.00322,0,1.16e-05,1.19e-05,0,1.44e-05,9.92e-05,9.5e-05,4.01e-05,1.8e-05,3.9e-05,3.5e-05,9.53e-06,8.18e-06,0,0,0.0224,1.3e-05,6.58e-05,0,0.000298,1.17e-05,1.2e-05,1.2e-05,1.19e-05,3e-05,0.000125,5.46e-05,1.43e-05,1.07e-05,0,0,8.12e-06,1.05e-05,0,9.45e-06,2.91e-05,0,7.34e-05,9.38e-06,1.16e-05,1.21e-05,0.000129,0,1.87e-05,0.000237,4.01e-05,1.33e-05,9.13e-06,0,0,7.98e-06,1.01e-05,1.1e-05,9.78e-06,0,0,0,0,9.51e-06,1.11e-05,0,0.000365,0.000115,5.34e-05,1.39e-05,1.2e-05,8.87e-06,0,0,8.7e-06,9.71e-06,1.03e-05,9.02e-06,1.1e-05,0,1.41e-05,8.43e-06,8.41e-06,1.11e-05,1.93e-05,0.000155,1.66e-05,1.3e-05,1.19e-05,1.07e-05,8.61e-06,0,0,0,0,1.02e-05,8.9e-06,1.09e-05,1.34e-05,0,0,7.85e-06,0,0,9.94e-06,1.17e-05,1.35e-05,1.12e-05,1.21e-05,8.36e-06,0,0,0,0,8.4e-06,8.95e-06,1.02e-05,9.89e-06,0,0,7.55e-06,0,0,8.29e-06,1.95e-05,6.39e-05,1.46e-05,8.87e-06,1.53e-05,0,0,0,0,0,8.84e-06,9.07e-06,9e-06,8.22e-06,7.91e-06,0,0,0,8.61e-06,3.53e-05,0.000982,0,0,0,0,0,0,0,0,8.94e-06,8.42e-06,8.91e-06,8.29e-06,9.66e-06,1.12e-05,0,0,9.69e-06,0.000114,0,0,0,0,7.71e-06,8.11e-06,7.75e-06,0,0,7.9e-06,8.4e-06,8.43e-06,8.3e-06,8.78e-06,1.05e-05,9.95e-06,8.6e-06,8.89e-06,8.95e-06,1.03e-05,8.81e-06,8.07e-06,8.1e-06,8.53e-06,7.96e-06,7.47e-06,7.57e-06,7.67e-06,8e-06,1.02e-05],"winrateAvg":0.396528,"leadAvg":0.188364,"scoreMeanAvg":-0.520892,"scoreStdevAvg":9.55531,"shorttermWinlossErrorAvg":0.25584,"shorttermScoreErrorAvg":1.53227,"ownership":[-70,-63,-32,-11,36,56,51,40,6,-19,-42,-45,-43,-9,-7,30,49,87,89,-81,-72,-80,1,30,69,46,52,52,-39,-74,-69,-57,-74,-52,-41,95,89,92,-87,-89,-97,-97,95,65,-8,52,-99,-99,-100,-80,-55,-99,-99,-98,95,94,93,-94,-96,-97,95,95,46,8,-77,-40,-99,-87,-78,-99,-98,-99,94,93,94,88,-95,-99,94,95,86,21,1,-42,-40,-99,-65,-63,-67,-99,94,95,95,95,51,-93,-99,33,-92,93,92,12,-25,-83,-58,-43,-43,-43,-99,-99,-61,95,-94,-88,-91,-87,-72,-93,-93,91,25,7,-18,-25,-28,-26,-18,-21,-14,92,-96,-95,-95,-88,-85,-51,-30,-18,15,21,5,-6,-13,-16,-15,-4,10,25,93,-96,-95,-95,-87,-86,-91,16,1,16,16,6,0,-6,-9,-9,-5,3,17,93,93,-95,-95,-85,-87,0,53,12,17,75,19,5,-1,-7,-12,-18,-23,-15,45,93,92,-9,-83,-83,-90,-17,2,3,9,27,12,6,-8,-18,-35,-97,97,60,51,-3,1,-76,-88,29,21,-5,-1,-12,66,21,0,-17,-24,-45,-98,97,64,53,43,18,-77,89,90,89,11,-1,-75,10,-20,-26,-32,-35,-53,-98,97,87,67,47,42,-55,-57,56,71,29,15,-38,-36,-33,-41,-44,-47,-61,-98,97,86,90,64,59,-16,-23,-37,97,57,93,-97,-50,-50,-53,-56,-56,-73,-98,97,97,67,63,76,28,-21,97,97,87,93,-97,-65,-58,-68,-65,-70,-85,-98,-98,-98,96,97,90,35,72,72,80,92,-97,-97,-70,-52,-67,-95,-94,-95,99,99,99,96,96,97,43,37,60,59,-1,-5,-97,-74,-43,-82,96,96,96,95,97,98,100,100,98,48,51,49,38,16,-46,-60,-72,-37,7,25,53,88,95,97,98,99,99,98],"ownershipAllowedMAE":0.0355441})%"); + lines.push_back(R"%({"sample":{"board":"................/..........O..O../...X...X..XOOXX./....X...OOOXXO../..XXO.....X..O../..XOOX......X.../.OOXX.........../.O.OX.........../..OX.X........../.OXOX.........../.OX.O.........../.OXXX.......O.../..XO........XO../..XO..O...O...../.XOO............/.X............../","hintLoc":"null","initialTurnNumber":44,"metadata":"83379865DC00F90B8BD52E711F4CE310:54","moveLocs":["N15","M15","C9","B4","B8","B3","O11","P15","A7","O8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.74,"xSize":16,"ySize":16},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":3.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.25e-06,1.51e-06,1.41e-06,1.57e-06,1.59e-06,1.67e-06,1.87e-06,2.46e-06,2.7e-06,2.64e-06,2.61e-06,2.47e-06,2e-06,2.19e-06,2.15e-06,1.62e-06,1.48e-06,1.82e-06,1.78e-06,1.94e-06,2.28e-06,2.67e-06,4.26e-06,5.11e-06,0.0468,8.18e-06,0,0,0,0,0,2.44e-06,1.38e-06,1.73e-06,1.68e-06,0,1.99e-06,3.01e-06,4.17e-06,0,8.23e-05,5.75e-06,0,0,0,0,0,8.95e-06,1.4e-06,1.66e-06,1.55e-06,1.56e-06,0,2.46e-06,4.29e-06,2.17e-05,0,0,0,0,0,0,0.108,1.17e-05,1.45e-06,1.7e-06,0,0,0,2.4e-06,4.14e-06,4.82e-06,5.7e-06,1.63e-05,0,2.94e-06,0.0229,0,0.00817,2.45e-05,1.51e-06,1.78e-06,0,0,0,0,2.91e-06,6.54e-06,0.000116,0.00252,1.11e-05,4.05e-06,0,0,0.000374,3.95e-06,1.51e-06,0,0,0,0,1.78e-06,2.5e-06,5.17e-06,2.52e-05,0.000344,0.000951,1.6e-05,4.4e-06,3.34e-06,2.1e-05,2.8e-06,1.62e-06,0,0,1.65e-06,0,1.69e-06,2.38e-06,4.45e-06,1.22e-05,9.33e-05,0.000435,0.00261,0.00456,0.00429,0.000119,3.87e-06,4.24e-06,0,1.69e-06,0,1.54e-06,0,2.47e-06,4.83e-06,1.27e-05,6.43e-05,0.0002,0.0211,0.0292,0,0.000656,3.92e-06,0,0,0,0,0,2.03e-06,3.13e-06,6.18e-06,2.55e-05,7.51e-05,8.84e-05,0.000386,0.00266,0.00199,0.000284,3.68e-06,0.0123,0,0,1.8e-06,0,2.49e-06,4.63e-06,1.38e-05,6.35e-05,6.49e-05,5.07e-05,3.76e-05,8.5e-05,5.93e-05,5.4e-05,2.87e-06,0.000138,0,0,0,0,3.84e-06,8.17e-06,5.85e-05,8.75e-05,4.6e-05,2.25e-05,0.0139,0,0.0148,1.04e-05,2.69e-06,1.02e-05,0,0,0,0.000722,0.000149,0.0183,0.000182,6.63e-05,3.83e-05,2.32e-05,0.0167,0,0,1.02e-05,2.84e-06,4.33e-05,0,0,0,0.000164,0.0712,0,0.00206,1.63e-05,5.95e-05,0,0.0268,0.000263,0.562,7.6e-06,2.54e-06,5.75e-05,0,0,0,6.37e-05,2.59e-05,0.000214,7.04e-06,7.66e-06,5.89e-06,2.26e-05,8.21e-06,7.16e-06,6.43e-06,5.1e-06,2.63e-06,1.59e-06,0,3.64e-06,4.08e-06,3.18e-06,3.48e-06,2.43e-06,2.48e-06,2.36e-06,2.48e-06,2.47e-06,2.47e-06,2.48e-06,2.34e-06,2.43e-06,1.52e-06,6.73e-06],"winrateAvg":0.0555571,"leadAvg":-4.07389,"scoreMeanAvg":-5.08579,"scoreStdevAvg":7.48029,"shorttermWinlossErrorAvg":0.0783762,"shorttermScoreErrorAvg":0.968383,"ownership":[-96,-94,-92,-88,-82,-71,-57,-30,6,45,74,95,99,98,96,95,-96,-96,-95,-93,-84,-77,-67,-56,-32,55,99,100,98,99,99,92,-96,-97,-97,-99,-83,-59,-58,-79,-2,71,72,100,100,79,79,89,-97,-98,-97,-98,-99,-45,10,55,88,87,89,-72,-73,79,77,66,-97,-98,-100,-100,-48,-49,5,20,27,0,-69,-57,-46,79,32,9,-96,-97,-100,-52,-51,-88,-18,-6,-7,-19,-28,-37,-80,-80,-36,-27,-94,-93,-93,-100,-100,-60,-26,-12,-8,-9,-19,-11,-26,-28,-29,-25,-93,-92,-99,-99,-100,-68,-29,-13,-6,-1,-2,-9,14,5,11,-2,-93,-97,-97,-100,-93,-99,-35,-15,-7,-1,3,0,12,77,40,23,-94,79,-100,-74,-95,-48,-22,-13,-7,0,7,12,23,36,46,40,-64,80,-100,-79,-30,-31,-16,-11,-7,1,9,18,28,44,49,48,-43,80,-100,-100,-99,-29,-9,-7,-5,4,12,21,79,56,60,52,-8,79,-99,92,-39,0,7,7,9,14,17,3,2,89,59,52,65,77,-98,92,26,7,85,33,27,32,83,57,74,47,55,48,79,77,93,92,67,69,60,51,43,49,59,56,57,55,49,48,78,76,88,80,72,63,58,49,44,45,49,51,48,49,48,47],"ownershipAllowedMAE":0.041607})%"); + lines.push_back(R"%({"sample":{"board":"..XXXXO............/.X.XOOO...OXXXO..../..XO.....O.OXOXXX../..XO...XOX.OOO.X.../.X.O.O..O.....XOO../.XO.XO.OOXX.O.O.XX./.OOX.OX.XOX....XO../..O...X.XO.X...XO../................X../...O..X............/...XOOOX..X......../..OOXXXX..OX......./..OX......O......../..OX...........OXO./..OX.....OO...O.OO./..O.....OXXOO.OOXO./....X..XXXOXX.XXX../.................../.................../","hintLoc":"null","initialTurnNumber":123,"metadata":"42C93D4DC841ACDC07E414D302064FD4:133","moveLocs":["M9","N9","M10","N10","L10","N7","K9","K11","Q14","M5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.47,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":5.0,"policyOptimism":0.228,"pda":0.0,"policyMixture":[1e-05,0.000601,0,0,0,0,0,1.07e-05,1.08e-05,1.1e-05,1.24e-05,3.97e-05,2.4e-05,1.9e-05,2.9e-05,1.47e-05,1.26e-05,1.29e-05,1.12e-05,1.17e-05,0,0,0,0,0,0,1.08e-05,1.12e-05,1.12e-05,0,0,0,0,0,0.00017,6.89e-05,2.41e-05,1.29e-05,1.1e-05,1.04e-05,0,0,1.07e-05,1.06e-05,1.06e-05,1.07e-05,1.03e-05,0,1.08e-05,0,0,0,0,0,0,6.24e-05,1.18e-05,1.07e-05,1.09e-05,0,0,1.06e-05,1.07e-05,1.05e-05,0,0,0,1.08e-05,0,0,0,1.26e-05,0,1.14e-05,0.000939,1.28e-05,1.05e-05,0,1.05e-05,0,1.08e-05,0,1.08e-05,1.01e-05,0,1.16e-05,1.13e-05,1.11e-05,1.08e-05,1.17e-05,0,0,0,0.000251,1.51e-05,1.04e-05,0,0,1.07e-05,0,0,1.09e-05,0,0,0,0,1.14e-05,0,1.23e-05,0,0,0,0,1.38e-05,1.1e-05,0,0,0,1.06e-05,0,0,0.000418,0,0,0,1.2e-05,1.32e-05,1.27e-05,2.9e-05,0,0,1.52e-05,1.3e-05,1.05e-05,1.07e-05,0,1.11e-05,1.1e-05,1.1e-05,0,0.000101,0,0,8.79e-05,0,3.22e-05,3.79e-05,8.75e-05,0,0,1.43e-05,1.25e-05,1.1e-05,1.05e-05,1.06e-05,1.03e-05,1.19e-05,1.5e-05,1.34e-05,1.23e-05,2.87e-05,0,0.000596,4.3e-05,0.0304,6.82e-05,0.0001,0.000974,0,2.94e-05,1.17e-05,1.06e-05,1.06e-05,1.09e-05,0,1.11e-05,1.13e-05,0,1.88e-05,2.41e-05,4.39e-05,0,0,0,5.62e-05,6.7e-05,5.27e-05,8.7e-05,1.27e-05,1.19e-05,1.07e-05,1.05e-05,1.19e-05,0,0,0,0,0,1.22e-05,0,9.88e-06,0,0,1.6e-05,3.7e-05,2.32e-05,3.05e-05,1.33e-05,1.22e-05,1.09e-05,1.08e-05,0,0,0,0,0,0,3.43e-05,1.08e-05,0,0,3.84e-05,0.0303,1.46e-05,1.43e-05,1.35e-05,1.3e-05,1.21e-05,1.08e-05,1.06e-05,0,0,1.25e-05,1.12e-05,1.16e-05,1.35e-05,4.69e-05,1.38e-05,0,0.0615,0,2.23e-05,1.36e-05,1.26e-05,1.24e-05,1.19e-05,1.17e-05,1.07e-05,1.05e-05,0,0,1.1e-05,1.28e-05,1.29e-05,3.1e-05,3.79e-05,1.23e-05,1.22e-05,0.18,0.197,4.31e-05,1.15e-05,0,0,0,1.13e-05,1.07e-05,1.07e-05,0,0,1.26e-05,1.3e-05,1.26e-05,1.26e-05,1.23e-05,0,0,0,0.292,1.93e-05,0,1.08e-05,0,0,1.1e-05,1.09e-05,1.09e-05,0,4.06e-05,2.89e-05,1.24e-05,1.31e-05,1.31e-05,0,0,0,0,0,0.192,0,0,0,0,1.11e-05,1.1e-05,1.1e-05,1.21e-05,2.59e-05,0,1.29e-05,1.25e-05,0,0,0,0,0,0,0.0091,0,0,0,1.25e-05,1.1e-05,1.12e-05,1.12e-05,1.26e-05,1.85e-05,1.36e-05,1.18e-05,1.14e-05,1.09e-05,1.05e-05,1.07e-05,1.17e-05,1.46e-05,1.68e-05,2.53e-05,1.26e-05,1.09e-05,1.16e-05,1.2e-05,1.13e-05,1.09e-05,1.21e-05,1.24e-05,1.17e-05,1.13e-05,1.14e-05,1.11e-05,1.06e-05,1.05e-05,1.04e-05,1.13e-05,1.14e-05,1.17e-05,1.19e-05,1.19e-05,1.23e-05,1.21e-05,1.17e-05,1.17e-05,1.09e-05],"winrateAvg":0.277041,"leadAvg":-1.49212,"scoreMeanAvg":-2.12237,"scoreStdevAvg":8.4404,"shorttermWinlossErrorAvg":0.257611,"shorttermScoreErrorAvg":1.83829,"ownership":[-96,-95,-95,-95,-95,-95,100,98,97,95,82,66,31,-74,-87,-89,-86,-80,-72,-96,-96,-95,-95,100,100,100,98,97,96,98,-86,-87,-88,-85,-90,-86,-77,-60,-97,-97,-96,100,99,98,97,98,97,98,90,98,-85,98,-93,-93,-93,-76,-37,-96,-96,-97,100,97,97,97,95,99,-78,-72,98,98,98,5,-92,-8,-23,-26,-84,-97,41,100,72,100,96,97,99,11,-65,-1,63,59,-8,69,70,-22,-24,21,-97,100,78,56,100,-54,99,99,-98,-98,9,90,31,71,69,-84,-85,-37,44,100,100,41,70,100,-98,39,-98,-94,-98,-32,21,-34,18,-89,-70,-77,-61,95,97,100,56,38,-47,-98,-80,-98,-92,-93,-96,2,-6,-19,-89,-68,-78,-65,94,94,85,42,18,14,-46,-60,-37,-95,13,-1,29,-27,-24,-36,-89,-57,-55,94,94,91,97,5,-36,-90,-68,-6,-3,76,75,-76,-28,-34,-27,-20,-27,-31,95,96,95,81,84,69,69,-99,-9,76,73,74,-73,-31,-24,-18,-11,-5,1,95,97,100,100,-99,-99,-99,-99,-29,31,76,-22,-24,-19,-10,-1,4,23,32,95,98,100,-93,-79,-65,-47,-32,-14,36,76,48,-67,-14,-1,28,34,56,63,92,97,100,-92,-62,-45,-36,-9,5,33,45,21,-8,2,33,92,36,95,81,87,94,100,-92,-57,-51,-42,-22,17,69,68,-29,11,38,92,90,95,95,89,75,86,100,32,-59,-58,-53,-40,19,-100,-100,58,58,29,92,92,-88,95,78,63,60,57,-32,-96,-70,-72,-100,-100,-100,-94,-94,-93,8,-88,-89,-89,7,68,48,51,0,12,-69,-75,-83,-91,-95,-96,-94,-93,-89,-90,-83,-83,-55,-5,35,41,25,14,-27,-37,-65,-76,-85,-90,-93,-92,-91,-89,-86,-82,-69,-52,-35,3],"ownershipAllowedMAE":0.0377378})%"); + lines.push_back(R"%({"sample":{"board":".................../....XOX..OX..O...../..OO.X..OOXO..O.X../..XXX...OX.X.XXX.O./........X.X.X....../.......X.XXO..O.O../.OOOOOOXOX.O..XXO../.XXXOXXO.XO..X.OX../.XOXX...OO..OX.OO../.OOOX.XXXOOXXX.XO../..O.X..OOO.O...XX../..OOOX.XXO..X.O.XO./.XO.X.OXO..O..OXXO./.XO.XO.O.O..XXOOX../..XO..OXO.XX.OXXX../OXXO...X..XOOOOOX../.OXO...X..XXOX.OOX./O.O.........XOOO.OX/.O...........X..O../","hintLoc":"null","initialTurnNumber":45,"metadata":"35BF2DF0DF226BE8CA6E19E82D0D8F1E:55","moveLocs":["F7","F15","E5","G4","G8","F11","G11","G9","F9","G6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.24,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":0.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.55e-06,1.86e-06,1.79e-06,1.83e-06,1.78e-06,2.15e-06,1.91e-06,1.97e-06,2.09e-06,2.37e-06,2.12e-06,1.89e-06,1.72e-06,1.65e-06,1.65e-06,1.75e-06,1.91e-06,1.77e-06,1.48e-06,1.9e-06,2.37e-06,2.33e-06,2.33e-06,0,0,0,2.65e-06,2.64e-06,0,0,2.03e-06,1.97e-06,0,1.92e-06,1.91e-06,2.14e-06,2.2e-06,2.01e-06,2.2e-06,4.53e-06,0,0,4.44e-06,0,1.69e-05,4.91e-06,0,0,0,0,1.86e-06,2e-06,0,2.08e-06,0,3.41e-06,2.07e-06,4.76e-06,0.0002,0,0,0,0.13,0.00731,0.0002,0,0,1.85e-06,0,1.86e-06,0,0,0,2.46e-06,0,2.2e-06,0.00138,0.00871,8.18e-06,3.72e-06,0.0151,0,0.158,0.000114,0,1.92e-06,0,1.95e-06,0,1.9e-06,1.89e-06,2.14e-06,4.94e-06,6.08e-06,2.12e-06,0.000236,0.193,0.0477,0.00425,0.00178,0.243,0.166,0,2.24e-06,0,0,0,1.91e-06,1.99e-06,0,1.98e-06,0,2.68e-06,1.98e-06,0.00456,0,0,0,0,0,0,0,0,0,2.07e-06,0,2.02e-06,1.99e-06,0,0,0,2.47e-06,2.04e-06,0.00108,0,0,0,0,0,0,0,2.56e-06,0,0,2.13e-06,1.9e-06,0,2.07e-06,0,0,4.13e-06,2.13e-06,5.55e-05,0,0,0,0,0,0,1.63e-06,0,0,2.26e-06,2.77e-06,0,0,2.16e-06,0,0,3.58e-06,2.2e-06,4.67e-05,0,0,0,0,0.000355,0,0,0,0,0,0,0,0,1.98e-06,0,0,5.55e-06,2.29e-06,5.91e-06,2.63e-06,0,1.42e-06,0,0,0,0,0,0,1.78e-06,0,2.05e-06,2.18e-06,1.98e-06,0,0,2.59e-05,2.38e-06,2.8e-06,3.06e-06,0,0,0,0,0,0,0,0,2.12e-06,2.18e-06,0,2.16e-06,0,1.99e-06,0,0,1.78e-06,1.9e-06,0,0,1.3e-06,0,0,0,0,0,0.000217,0.000415,0,2.23e-06,2.05e-06,0,0,0,0,1.67e-06,1.82e-06,0,0,3.58e-06,0,0,0,0,0,0,3.25e-06,2.04e-06,0,0,0,0,0,1.84e-06,1.76e-06,4.91e-05,3.65e-06,0,0,0,3.09e-06,0,0,0,2.01e-06,0,0,1.98e-06,0,0,0,0,2.14e-06,1.83e-06,0,0,0,0,0.0121,0.000766,0,0,2.14e-06,2.02e-06,0,0,0,0,0,0,0,2.2e-06,2.05e-06,0,0,0,0,9.55e-06,0.00048,0.00318,0,1.93e-06,1.83e-06,0,0,0,0,1.73e-06,0,0,0,1.83e-06,0,0,0,2.25e-06,2.56e-06,3.84e-06,3.24e-06,2.33e-06,1.95e-06,1.86e-06,2.18e-06,2.71e-06,0,0,0,0,0,0,0,0,0,1.83e-06,1.84e-06,1.89e-06,1.98e-06,1.94e-06,1.98e-06,1.69e-06,1.69e-06,1.88e-06,2.21e-06,1.97e-06,0,1.87e-06,1.77e-06,0,3.51e-06,1.79e-06,5.39e-06],"winrateAvg":0.0242239,"leadAvg":-45.4231,"scoreMeanAvg":-45.5703,"scoreStdevAvg":19.7572,"shorttermWinlossErrorAvg":0.0890843,"shorttermScoreErrorAvg":7.41484,"ownership":[-39,-44,-50,-60,-74,-84,-80,-75,-69,-69,-70,-66,-49,-45,-43,-42,-42,-38,-24,-45,-43,-47,-57,-86,-81,-90,-74,-71,-60,-94,-53,-51,-33,-41,-47,-44,-44,-4,-49,-49,-41,-36,-67,-95,-76,-76,-64,-61,-97,-49,-72,-72,-37,-67,-91,10,13,-58,-67,-97,-96,-96,-75,-69,-82,-66,-99,-97,-100,-90,-100,-100,-99,14,70,35,-68,-71,-85,-88,-83,-64,-79,-90,-99,-98,-100,-47,-100,-58,-33,-6,35,58,62,-66,-78,-84,-84,-81,-74,-84,-99,-80,-100,-100,82,-19,-21,27,-11,90,80,74,-55,-58,-61,-64,-66,-65,-65,-99,7,-100,27,82,4,-30,-88,-88,91,87,82,-65,-86,-86,-85,-62,-83,-84,86,10,-99,87,-7,-50,-99,-24,88,85,85,77,-10,-86,94,-87,-86,-81,-83,63,91,92,80,-41,-16,-99,5,89,89,78,60,59,98,98,97,-86,-84,-84,-81,-77,91,91,-98,-99,-99,-65,-97,88,52,33,92,94,99,53,-87,-86,89,92,92,92,64,71,34,-48,-71,-98,-98,2,17,92,94,99,98,95,-85,-84,-79,-78,92,39,-16,-84,-75,-59,-85,-98,25,6,93,91,99,58,-85,-85,93,-78,91,85,43,75,25,-76,-60,-98,-98,21,-13,94,91,99,66,-81,93,93,93,89,92,-4,6,-92,-92,-62,-62,-98,-47,-38,95,95,94,100,-77,52,94,-67,90,1,-95,-95,-33,95,-97,-98,-98,-69,-43,98,95,94,100,57,66,95,-70,13,-26,-95,93,94,95,95,95,-98,-5,-30,98,99,94,100,74,44,16,-71,-42,-56,-95,-95,94,91,94,95,95,-4,8,99,98,99,84,60,34,-5,-39,-56,-63,-78,-15,-20,95,95,95,86,86,-1,98,99,94,79,55,30,-2,-28,-48,-61,-55,-43,8,0,75,88,90,71,55],"ownershipAllowedMAE":0.106899})%"); + lines.push_back(R"%({"sample":{"board":".X...OOO....../.OX.XOXXOXXX../.OX.XXXXOOXO../..OXX.XOXOOXX./..OOXXOO.O..../....OOXOO..O../..XO..XXXOO.../.OOXX....XXO../.OX.........../.OX.......XO../..OX....X.XO../..OX.....XOO../.OX.X....XO.../...X....XO..../","hintLoc":"null","initialTurnNumber":87,"metadata":"EC5FB66561CA94E083CF5918BB7FC2F6:97","moveLocs":["L1","H2","F8","F7","J7","J6","G7","H7","G6","H6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.36,"xSize":14,"ySize":14},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":7.0,"policyOptimism":0.815,"pda":-0.55,"policyMixture":[3.76e-06,0,0.000337,6.73e-06,0.000128,0,0,0,9.4e-05,0.00967,5.13e-06,2.06e-05,6.76e-06,3.54e-06,5.7e-05,0,0,5.38e-06,0,0,0,0,0,0,0,0,0.00699,8.84e-06,4.67e-06,0,0,3.36e-06,0,0,0,0,0,0,0,0,0.0108,3e-05,7.94e-06,1.66e-05,0,0,0,0,0,0,0,0,0,0,0,1.94e-05,3.97e-06,6.98e-06,0,0,0,0,0,0,2.73e-06,0,5.36e-06,0.0218,0.292,0.0144,3.37e-06,4.1e-06,4.29e-06,1.09e-05,0,0,0,0,0,2.99e-06,3.97e-06,0,0.0159,0.00337,3.12e-06,4.42e-06,0,0,1.57e-06,0,0,0,0,0,0,5.45e-06,0.00944,4.01e-05,3.34e-06,0,0,0,0,0,0,0,0,0,0,0,6.22e-06,6.5e-06,2.44e-06,0,0,0.0549,0.000292,0.00157,0,0,0,5.53e-06,0.000706,0.00015,1e-05,4.33e-06,3.1e-06,0,0,0.16,0.000211,8.3e-05,0.000172,8.29e-06,3.79e-06,5.85e-06,0,0,3.6e-06,3.42e-06,4.38e-06,1.13e-05,0,0,3.41e-05,2.2e-05,5.41e-06,3.47e-06,0,4.44e-06,0,0,3.19e-06,3.06e-06,8.44e-06,6.84e-05,0,0,2.42e-05,5.58e-06,4.22e-06,3.18e-06,5.04e-06,0,0,0,2.78e-06,2.65e-06,2.93e-05,0,0,0,0,5.54e-06,3.39e-06,0,0.00275,0,0,2.56e-06,2.82e-06,2.71e-06,6.3e-06,0.392,6.8e-06,0,4.28e-06,3.2e-06,2.76e-06,0.00231,0,0,0,2.55e-06,2.78e-06,2.5e-06,1.92e-05],"winrateAvg":0.99604,"leadAvg":2.76562,"scoreMeanAvg":2.93355,"scoreStdevAvg":2.27872,"shorttermWinlossErrorAvg":0.0282113,"shorttermScoreErrorAvg":0.777484,"ownership":[-42,-98,-98,-91,12,99,99,99,98,-35,-80,-96,-97,-96,-35,98,-100,-99,-100,99,-100,-100,100,-99,-99,-99,-97,-97,75,99,-100,-100,-100,-100,-100,-100,100,100,-99,-97,-98,-94,97,99,100,-100,-100,-100,-100,100,100,100,100,-98,-98,-58,99,99,100,100,-100,-100,100,100,100,100,60,-49,17,-22,99,99,99,99,99,99,-100,100,100,99,87,100,43,23,100,100,99,99,-24,99,-100,-100,-100,100,100,97,96,62,100,100,100,-99,-99,-99,-99,-100,-100,-100,-99,99,94,91,100,100,-97,-97,-98,-99,-99,-100,-100,-99,-52,-25,97,95,100,100,-97,-97,-98,-99,-99,-99,-100,-99,-100,100,99,98,99,99,100,-99,-98,-99,-99,-100,-100,-100,-100,100,99,99,98,98,100,-99,-99,-99,-99,-99,-100,-100,100,100,100,99,94,98,-98,-98,-100,-99,-99,-100,-99,-100,100,100,100,100,63,14,-22,-99,-99,-99,-99,-99,-99,100,100,100,100,100],"ownershipAllowedMAE":0.0268094})%"); + lines.push_back(R"%({"sample":{"board":"............O....../.......O..XXXOO..../...XXO.XOO.XOX..O../..X.OO.O..OXOO.OXO./..XO.....XXO.O..XO./..XX...XXXOOOXX..X./..OXO.X.OOXO.O.OX../..OXXXXO..XXOOOXX../.OXOOXOOXX..XXXOXO./.OXXOOOO..X...OOXO./..O.O.XO.OOX..OXXO./..O.XO..OXXO..OX.XX/.XO..XOO.......OXO./.XOXXXX.X.X.XOX.OO./..XO.O.XOX.O.OOOXXX/.XXO......XO.OXX.../X.XO...X.OXX.OOX.O./OX.X...........X.X./.OX.X............../","hintLoc":"null","initialTurnNumber":189,"metadata":"51E9AFA4FA22DED42E9A05671115EFD2:199","moveLocs":["Q14","Q15","P15","R14","P13","N9","R8","O7","P7","R7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.18,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":8.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.4e-06,5.81e-06,5.82e-06,5.91e-06,5.72e-06,6.28e-06,5.88e-06,5.57e-06,5.41e-06,5.33e-06,5.32e-06,5.33e-06,0,5.51e-06,5.51e-06,5.33e-06,5.52e-06,5.61e-06,5.5e-06,5.6e-06,5.65e-06,8.48e-06,6.19e-06,6.47e-06,5.5e-06,5.76e-06,0,5.25e-06,5.11e-06,0,0,0,0,0,5.84e-06,5.81e-06,1.5e-05,5.61e-06,5.54e-06,5.73e-06,6.26e-06,0,0,0,5.3e-06,0,0,0,5.41e-06,0,0,0,6.24e-06,5.68e-06,0,8.74e-05,7.83e-06,5.86e-06,5.24e-06,0,5.95e-06,0,0,5.65e-06,0,5.53e-06,5.31e-06,0,0,0,0,5.74e-06,0,0,0,5.91e-06,5.92e-06,5.54e-06,0,0,5.27e-06,5.4e-06,5.28e-06,5.32e-06,5.04e-06,0,0,0,5.04e-06,0,0,0,0,0,6.1e-06,5.98e-06,5.78e-06,0,0,5.41e-06,5.43e-06,5.5e-06,0,0,0,0,0,0,5.13e-06,5.39e-06,0,0,0,0.00332,6.1e-06,5.69e-06,0,0,0,5.27e-06,0,7.07e-06,0,0,0,0,4.97e-06,0,0,0,0,8.17e-06,0.00853,5.91e-06,5.54e-06,0,0,0,0,0,0,5.52e-06,1.13e-05,0,0,0,0,0,0,0,0.00581,5.8e-05,5.5e-06,0,0,0,0,0,0,0,0,0,5.86e-06,0.178,0,0,0,0,0,0,5.95e-06,5.68e-06,0,0,0,0,0,0,0,5.61e-06,0.000122,0,0.000397,0.024,0.00799,0,0,0,0,5.92e-06,5.7e-06,5.78e-06,0,5.57e-06,0,5.22e-06,0,0,5.53e-06,0,0,0,0,0.00784,0,0,0,0,1.28e-05,5.52e-06,5.33e-06,0,5.18e-06,0,0,4.92e-06,5.3e-06,0,0,0,0,0.212,0.135,0,0,0,0,0,5.59e-06,0,0,5.17e-06,5.54e-06,0,0,0,6.4e-05,0.0191,0.0141,0.24,0.0111,0,0,0,0,0,0.00997,5.33e-06,0,0,0,0,0,0,0.0289,0,3.05e-05,0,0.000273,0,0,0,0.000288,0,0,0.0626,5.57e-06,5.32e-06,0,0,5.78e-06,0,0.000176,0,0,0,0.00346,0,6.34e-06,0,0,0,0,0,0,5.83e-06,0,0,0,5.5e-06,5.78e-06,5.93e-06,5.91e-06,5.51e-06,0.000136,0,0,5.1e-06,0,0,0,0.0195,3.25e-05,9.24e-05,0,0,0,0,5.38e-06,5.48e-06,5.58e-06,0,5.58e-06,0,0,0,5.41e-06,0,0,0,0.000165,0,6.71e-06,0,0,0,0,5.28e-06,5.34e-06,5.45e-06,5.35e-06,5.59e-06,5.93e-06,6.78e-06,8.49e-06,5.88e-06,5.63e-06,9.1e-06,0,0.00042,0,0.00572,4.88e-06,0,0,0,0,5.35e-06,5.4e-06,5.51e-06,5.45e-06,5.87e-06,5.56e-06,5.81e-06,6.24e-06,5.99e-06,5.98e-06,6.25e-06,7.32e-06,0.000584,4.93e-06,8.69e-06],"winrateAvg":0.680588,"leadAvg":1.56717,"scoreMeanAvg":2.88929,"scoreStdevAvg":10.6438,"shorttermWinlossErrorAvg":0.432722,"shorttermScoreErrorAvg":4.38135,"ownership":[-89,-86,-79,-38,-21,32,67,89,93,90,88,87,94,92,88,80,76,74,73,-90,-90,-86,-91,-13,12,79,97,93,91,82,81,81,96,96,61,72,77,71,-91,-92,-94,-98,-98,96,92,91,98,98,86,81,100,87,86,20,82,61,64,-89,-95,-99,-17,97,97,40,94,-3,-61,86,80,100,100,41,33,-61,61,49,-73,-91,-99,68,41,26,-21,-7,-54,-96,-96,100,100,100,100,-60,-62,60,1,-35,-26,-99,-99,0,-13,-63,-97,-96,-96,100,100,100,100,100,100,-63,-62,-24,16,14,80,-99,8,-63,-99,-41,93,93,-53,100,100,100,100,100,-59,-50,-43,56,68,82,-99,-99,-99,-99,99,76,2,-50,-46,100,100,100,-56,-58,-39,-43,76,92,75,99,99,-99,99,99,-55,-52,-47,-33,-41,-41,-45,97,-55,-26,-40,69,92,76,77,99,99,100,99,31,-15,-49,-46,-21,26,97,97,-53,-26,-37,40,55,91,84,99,94,93,99,88,90,85,-56,-58,33,97,-54,-54,-28,-40,-17,3,91,-12,-53,93,92,96,98,-78,-77,31,-2,36,97,-53,-22,-43,-44,-62,-99,92,24,-54,-88,98,98,47,-8,-50,3,-5,-15,98,98,-23,84,15,-96,-100,92,-88,-87,-86,-86,63,-89,-76,-92,-32,-68,97,94,91,91,86,24,-99,-99,-100,-86,-87,-79,-82,-92,-79,-97,12,86,17,97,97,97,-40,-41,-40,-99,-100,-100,-86,-89,-87,-86,-88,-89,-82,-89,87,58,97,-71,-70,-41,-37,-37,-100,-100,-100,-87,-93,-90,-91,-98,-87,-72,-90,-91,16,96,95,-71,-62,-29,-47,-99,-100,-100,-100,-96,-93,-93,-92,-85,-78,-80,-53,-2,57,33,-72,-65,-68,-56,-99,-99,-100,-99,-99,-96,-93,-89,-83,-74,-58,-28,12,32,8,-41,-62,-64,-64],"ownershipAllowedMAE":0.0470352})%"); + lines.push_back(R"%({"sample":{"board":".................../....O............../..O.......O......../..OX.O....XXX.X.X../..XX........O....X./...............OOO./......X.....O.OX.../.O...O.........XO../.XO...........X.O../.XOX.........X...../.OX................/.O.X.......X...OOX./..OOX.....OX.XX.XX./.XOXX....XXOOOX.XO./..XO.X....O..OOOXO./..XOOOO.X..OOOOXO../.XOXO..OOXXXXOOXO../...XX..XXOOOOXXXO../.........XX..O.O.../","hintLoc":"null","initialTurnNumber":116,"metadata":"9000FC2A5F7827200E27744C0E677966:126","moveLocs":["C12","D11","B13","D12","C13","E8","F8","E10","E9","D9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":1.401,"policyMixture":[4.35e-06,1.07e-05,1.31e-05,1.19e-05,2.2e-05,9.37e-06,9.22e-06,8.56e-06,8.02e-06,7.28e-06,6.33e-06,5.81e-06,5.59e-06,5.59e-06,5.26e-06,5.35e-06,5e-06,5.11e-06,3.12e-06,1.4e-05,0.000191,0.00068,0.00746,0,0.113,0.000316,7.63e-05,3.92e-05,2.15e-05,1.65e-05,1.44e-05,1.51e-05,1.31e-05,1.63e-05,1.26e-05,1.11e-05,9.25e-06,5.19e-06,1.35e-05,0.000139,0,0.0954,0.0965,0.00281,0.00021,0.000255,0.00024,0.000109,0,1.31e-05,1e-05,3.14e-05,4.28e-05,4.43e-05,1.42e-05,1.61e-05,6.05e-06,1.8e-05,0.000199,0,0,2.32e-05,0,0.000193,0.000201,0.000125,4.31e-05,0,0,0,0.00032,0,4.88e-05,0,1.24e-05,7.98e-06,1.63e-05,7.01e-05,0,0,1.28e-05,7.81e-05,9.92e-05,8.71e-05,6.69e-05,3.43e-05,1.58e-05,3.03e-05,0,0.11,0.0136,8.15e-05,1.41e-05,0,1.18e-05,6.43e-06,1.06e-05,5.8e-06,8.27e-06,2.27e-05,3.46e-05,2.71e-05,3.81e-05,6.29e-05,9.27e-05,0.000185,0.0299,0.000157,0.00215,0.000206,0,0,0,7.07e-05,4.74e-06,0,0,1.81e-05,5.54e-05,5.16e-05,0,3.24e-05,0.00012,0.000179,0.000313,0.000283,0,0.00137,0,0,0.0046,0.000401,1.65e-05,1.08e-05,0,0,0,3.85e-05,0,0.000327,9.14e-05,0.000139,0.000198,0.000296,0.000425,0.000216,0.0111,0.000556,0,0,8.91e-05,6.06e-05,6.23e-06,0,0,0,0.000329,0.00175,0.000276,0.000275,0.000182,0.000177,0.000209,0.000182,0.000178,1.94e-05,0,8.99e-05,0,0.0001,2.8e-05,5.47e-06,0,0,0,0,0.0577,0.000169,0.000164,0.000141,0.000117,9.19e-05,5.32e-05,2.65e-05,0,2.02e-05,0.000193,0.000253,0.00472,2.04e-05,7.16e-06,0,0,0,0,2.48e-05,8.19e-05,0.000122,0.000114,8.66e-05,3.3e-05,1.64e-05,1.82e-05,3.06e-05,7.27e-05,2.16e-05,0.000126,0.000179,1.62e-05,5.17e-06,0,6.65e-06,0,5.55e-05,0,1.62e-05,6.37e-05,9.34e-05,8.89e-05,4.16e-05,0,1.35e-05,1.66e-05,1.63e-05,0,0,0,6.38e-06,5.98e-06,9.24e-06,0,0,0,7.94e-06,1.5e-05,5.67e-05,0.000328,8.3e-05,0,0,1.53e-05,0,0,8.58e-06,0,0,5.96e-06,5.57e-06,0,0,0,0,7.94e-06,1.7e-05,0.00956,0.00648,0,0,0,0,0,0,6.5e-06,0,0,1.35e-05,5.6e-06,7.95e-06,0,0,4.67e-05,0,0.0229,0.011,0.000355,5.62e-05,0,7.72e-06,5.02e-06,0,0,0,0,0,1.04e-05,4.07e-06,7.59e-06,0,0,0,0,0,0.0207,0,0.105,6.52e-06,0,0,0,0,0,0,1.94e-05,8.64e-06,4.18e-06,0,0,0,0,5.82e-05,0.0127,0,0,0,0,0,0,0,0,0,0,1.37e-05,5.84e-06,4e-06,6.05e-06,8.29e-06,0,0,0.0197,0.0749,0,0,0,0,0,0,0,0,0,0,5.43e-06,4.54e-06,3.35e-06,4.35e-06,5.22e-06,4.58e-06,1.69e-05,0.000144,0.00024,1.44e-05,1.24e-05,0,0,0.0837,0.0654,0,0,0,6.31e-06,4.26e-06,3.86e-06,1.14e-05],"winrateAvg":0.00422111,"leadAvg":-16.9553,"scoreMeanAvg":-18.0368,"scoreStdevAvg":14.3115,"shorttermWinlossErrorAvg":0.016447,"shorttermScoreErrorAvg":2.01493,"ownership":[38,44,43,45,37,31,18,9,-3,-13,-23,-34,-43,-49,-53,-56,-58,-58,-58,31,35,45,39,61,19,13,2,-7,-16,-25,-39,-44,-54,-54,-59,-58,-58,-56,20,37,51,-32,-3,18,8,-6,-12,-29,-7,-54,-63,-58,-65,-59,-68,-51,-55,2,3,52,-93,-20,56,1,-8,-17,-29,-94,-94,-94,-50,-88,-44,-86,-61,-50,-34,-17,-94,-94,-26,-10,-10,-12,-13,-22,-34,-22,43,-26,-5,2,2,-76,-16,-66,-75,-70,-30,-7,-6,-16,-13,-12,-12,-11,-23,15,31,37,66,65,66,6,-89,-95,-95,-22,-10,-10,-68,-19,-14,-13,-10,5,57,18,52,-59,6,46,35,-84,-84,-95,46,15,46,-7,-15,-14,-14,-13,-14,6,-13,-15,-59,62,48,31,-77,-85,43,45,11,1,-9,-17,-15,-17,-20,-15,-3,-34,-84,-6,62,29,18,-21,-82,43,10,33,-20,-12,-18,-19,-20,-24,-27,-34,-86,-41,0,19,-18,-12,-8,15,8,11,-67,-31,-17,-23,-24,-27,-31,-37,-38,-47,-36,-9,-14,-18,-46,1,15,17,-37,-39,-82,-32,-26,-27,-35,-51,-83,-58,-59,-35,18,18,-87,-63,-23,-17,18,18,-82,-54,-29,-25,-25,-37,-22,-82,63,-89,-89,-69,-87,-88,-54,-58,-86,15,-84,-82,-47,-22,-16,-4,-49,-50,99,100,100,-89,28,-88,91,-33,-84,-84,-96,66,-12,-68,-11,-10,5,37,96,93,97,100,100,100,-86,93,63,-91,-93,-96,66,66,68,68,16,-24,21,62,100,100,100,100,97,100,93,92,-93,-96,-89,-93,66,12,25,65,64,21,19,20,20,100,100,97,100,97,96,-93,-92,-90,-93,-92,-38,-6,-16,-13,97,97,97,98,96,97,97,100,97,97,-92,-92,-90,-85,-62,-45,-24,-11,4,2,12,47,85,99,98,100,98,98,97],"ownershipAllowedMAE":0.0450816})%"); + lines.push_back(R"%({"sample":{"board":".......O........O../.OO...OXXX.X...O.O./OOXO.O.OX..XOOO.OX./OXXO..OO..OXOXOOX../OXXO...XXXXOXXOXX../XXOOO.X....O.XXOX../X.XXOX...O..OX.OX../.XXOOXO........X.../.XOX.X...O...X.OX../XXO...OOOX.OOOOXX../.OO.OO...OXX..OO.../....OXOOOXXX.OXX.../....X..XX...XO...../.....XOXXX.XXXXO.../......OOOOX..OX..../..OOOO.X.X.XOXX.X../.OXXX.OO..X.O..OX../.O....XO.X........./.................../","hintLoc":"null","initialTurnNumber":180,"metadata":"4CDC031BFEFB88C8CAAFE12224912CCC:190","moveLocs":["R9","G7","L10","L11","A9","B8","L14","N12","A8","B7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.67,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":19.0,"policyOptimism":0.54,"pda":0.0,"policyMixture":[5.78e-05,6.12e-05,6.13e-05,6.42e-05,6.56e-05,0.000109,0.000754,0,0.000398,5.28e-05,5.96e-05,7.35e-05,0.000193,0.000145,0.000211,5.83e-05,0,6.56e-05,5.88e-05,5.79e-05,0,0,7.06e-05,9.34e-05,6.47e-05,0,0,0,0,5.46e-05,0,0.00606,0.000103,7.15e-05,0,0,0,7.27e-05,0,0,0,0,6.28e-05,0,0,0,0,5.9e-05,6.35e-05,0,0,0,0,0,0,0,0.000492,0,0,0,0,6.28e-05,7.37e-05,0,0,8.17e-05,6.67e-05,0,0,0,0,0,0,0,0.0589,0.00585,0,0,0,0,5.91e-05,7.84e-05,8.66e-05,0,0,0,0,0,0,0,0,0,0,0.00012,7.72e-05,0,0,0,0,0,8.7e-05,0,6.88e-05,6.95e-05,6.78e-05,0,0,0.000323,0,0,0,0,5.75e-05,6.03e-05,0,2.3e-05,0,0,0,0,0.000115,0.000897,0.000863,0,0.444,0.127,0,0,6.93e-05,0,0,5.84e-05,5.98e-05,5.61e-05,0,0,0,0,0,0,0.00201,0.0553,8.25e-05,8.12e-05,0.0118,0,0.00134,7.46e-05,0,5.97e-05,5.82e-05,5.77e-05,5.93e-05,0,0,0,0.000153,0,0.0227,8.58e-05,9.33e-05,0,0,0.00334,0.0223,0,0.000992,0,0,5.69e-05,5.89e-05,0,0,0,7.63e-05,7.32e-05,7.91e-05,0,0,0,0,0,0,0,0,0,0,0,5.64e-05,5.88e-05,0,0,0,7.23e-05,0,0,5.71e-05,6.03e-05,7.59e-05,0,0,0,0.00935,0.000337,0,0,0,5.79e-05,5.89e-05,0,0,5.58e-05,6.1e-05,0,0,0,0,0,0,0,0,7.69e-05,0,0,0,6.14e-05,6.02e-05,5.71e-05,0.169,0,6.08e-05,5.8e-05,0,5.64e-05,0,0,0,5.9e-05,5.78e-05,5.76e-05,0,0,7.84e-05,6.86e-05,5.95e-05,6.03e-05,5.72e-05,0.000121,0.000154,6.9e-05,6.16e-05,5.72e-05,0,0,0,0,0,5.81e-05,0,0,0,0,0,5.87e-05,6.03e-05,5.74e-05,9.62e-05,0.00015,6.5e-05,5.69e-05,5.61e-05,5.49e-05,0,0,0,0,0,5.86e-05,5.76e-05,0,0,5.63e-05,5.64e-05,5.85e-05,5.69e-05,9.73e-05,9.17e-05,0,0,0,0,6.45e-05,0,0.00025,0,6.07e-05,0,0,0,0,5.61e-05,0,5.84e-05,5.8e-05,8.25e-05,0,0,0,0,0.000141,0,0,7.28e-05,6.66e-05,0,5.82e-05,0,5.65e-05,5.68e-05,0,0,5.81e-05,5.62e-05,7.25e-05,0,0.000113,6.46e-05,9e-05,0.00119,0,0,0.0357,0,5.97e-05,5.99e-05,5.79e-05,5.87e-05,5.91e-05,6.11e-05,5.99e-05,6.11e-05,5.66e-05,6.18e-05,8.21e-05,7.32e-05,7.79e-05,0.00021,0.000104,0.00036,0.00258,0.00224,0.00199,6.28e-05,6.16e-05,5.98e-05,5.85e-05,5.82e-05,5.59e-05,5.68e-05,5.57e-05,5.52e-05,4.73e-05],"winrateAvg":0.952545,"leadAvg":2.02246,"scoreMeanAvg":2.19228,"scoreStdevAvg":3.48684,"shorttermWinlossErrorAvg":0.111199,"shorttermScoreErrorAvg":0.894773,"ownership":[100,100,100,99,99,97,61,65,-77,-94,-95,-53,-13,51,70,95,99,91,74,100,100,100,100,99,99,100,-100,-99,-99,-98,-99,31,65,93,100,99,99,29,100,100,-100,100,97,100,99,100,-100,-99,-99,-99,100,100,100,99,99,-41,18,100,-100,-100,100,76,81,100,100,41,-99,-98,-99,100,-99,100,100,-100,-47,-63,100,-100,-100,100,63,30,-2,-100,-100,-100,-100,61,-99,-99,100,-100,-100,-99,-85,-100,-100,100,100,100,-13,-99,-62,-20,-27,-99,64,2,-99,-99,-98,-100,-99,-99,-100,-100,-100,-100,100,-97,-41,18,14,75,-72,-2,98,-99,-98,-98,-100,-100,-99,-100,-100,-100,100,100,-97,53,27,10,43,10,23,98,65,34,-100,-100,-100,-99,-100,-100,100,4,5,-97,-51,34,93,100,100,95,52,-38,-17,-10,-100,-100,-99,-100,-100,100,21,28,5,100,100,100,-100,-100,99,99,99,99,-100,-100,-100,-99,-100,100,100,80,100,100,98,64,8,14,-100,-100,8,95,99,99,-100,-100,-99,-100,100,100,99,100,99,100,100,100,-100,-100,-100,-71,96,-99,-99,-99,-99,-99,-81,100,99,99,99,100,100,-100,-100,-99,-100,-100,-100,94,43,-99,-99,-99,-99,93,97,99,99,99,99,100,-100,-100,-100,-100,-100,-100,-100,-100,-98,-99,-99,-99,97,98,99,99,100,100,100,100,100,100,-100,-100,-100,-99,-100,-99,-99,-99,-99,98,99,100,100,100,100,29,-4,-3,-99,-99,-100,-99,-100,-100,-99,-100,-99,-99,99,100,98,98,98,99,100,100,52,-85,-100,-99,-99,-99,-99,-99,-100,-99,-99,99,100,99,99,99,99,98,100,-59,-100,-99,-99,-99,-99,-99,-99,-99,-99,-99,99,99,99,99,99,99,98,96,57,-72,-99,-99,-99,-99,-99,-99,-99,-99,-99],"ownershipAllowedMAE":0.0244775})%"); + lines.push_back(R"%({"sample":{"board":".................../.............XOO.../..XO.O....X..X.XO../...O...........X.O./..O...........X.XXO/..............XOOO./...........X.OXXO../.........X..O.OOXX./.....O.......OOXO../......X.X..X.OXXO../..O.OOX...X..O.XX../.....XOOO.OXXXO.X../.XXX.XXXO.OO......./.XOO..XOX...X.O..../.O...OXO.O..OO...../...O..XO.O..XOXOX../..O..XXOXO...XX..../..OX...XXO........./.................../","hintLoc":"null","initialTurnNumber":62,"metadata":"076267E3B21451957C8F1070C849C0D1:72","moveLocs":["P9","B9","D1","H12","H16","J15","J16","M11","S18","R18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.06,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui0","komi":11.5,"policyOptimism":0.0,"pda":2.7,"policyMixture":[1.95e-06,3.1e-06,3.25e-06,3.21e-06,3.35e-06,3.18e-06,3.03e-06,2.84e-06,2.49e-06,2.31e-06,2.45e-06,2.42e-06,2.85e-06,3.79e-06,0.000293,3.79e-06,1.35e-05,0.00322,4.24e-06,3.07e-06,6.88e-06,6.27e-06,1.75e-05,8.48e-06,5.9e-06,6.89e-06,5.27e-06,4.11e-06,3.6e-06,3.36e-06,3.96e-06,3.71e-06,0,0,0,0,0,2.88e-05,3.2e-06,5.32e-06,0,0,5.54e-06,0,9.13e-06,3.69e-06,3.51e-06,3.57e-06,0,4.2e-06,4.36e-06,0,0.00704,0,0,9.42e-06,8.31e-06,3.44e-06,2.42e-05,3.34e-05,0,5.72e-06,1.5e-05,6.64e-06,0,0,5.68e-06,6.29e-06,1e-05,3.16e-05,0.000295,1.7e-05,0,0.495,0,0.00251,3.35e-06,0.000259,0,6.24e-06,7.12e-06,8.71e-06,4.03e-05,6.39e-05,0,9.15e-05,9.49e-05,0.00163,0.0116,2.64e-05,0,0.0327,0,0,0,3.36e-06,1.09e-05,6.93e-05,1.31e-05,8.75e-06,1.39e-05,9.59e-05,0.000132,5.8e-05,0.000228,0.00145,0.00145,0.0582,2.63e-05,0,0,0,0,9.3e-06,2.83e-06,1.03e-05,1.85e-05,1.6e-05,2.06e-05,6.34e-05,7.86e-05,0.000683,0.00238,0.028,0.0405,0,0.00135,0,0,0,0,1.43e-05,7.28e-05,2.77e-06,7.34e-06,2.12e-05,2.95e-05,2.42e-05,8.01e-05,0.000382,0,0.126,0,0.00252,0.0163,0,0,0,0,0,0,2.91e-06,3.17e-06,8.77e-06,2.67e-05,4.59e-05,0.000102,0,0.00294,3.85e-05,4.52e-05,0.000731,0.0988,0,3.65e-06,0,0,0,0,3.72e-06,2.62e-06,3.8e-06,5.39e-06,6.82e-06,4.11e-05,1.4e-05,0.000184,0,4.86e-06,0,0.0467,0.00016,0,0.00065,0,0,0,0,3.64e-06,2.63e-06,4.13e-06,0,0,0.000128,0,0,0,3.7e-06,0.000196,0.00724,0,4.16e-06,3.26e-06,0,0,0,0,2.98e-06,2.37e-06,4.71e-06,4.2e-06,3.73e-06,3.17e-05,7.92e-06,0,0,0,0,0.000209,0,0,0,0,0,4.93e-06,0,2.9e-06,2.36e-06,2.66e-06,0,0,0,4.03e-06,0,0,0,0,1.71e-05,0,0,8.33e-05,8.54e-06,0.000455,6.28e-06,4.23e-06,3.78e-06,2.34e-06,5.32e-06,0,0,0,6.2e-05,3.87e-06,0,0,0,5.25e-06,5.62e-06,1.52e-05,0,0.000158,0,1.37e-05,5.7e-06,4.55e-06,2.37e-06,3.04e-05,0,8.54e-05,5.3e-06,6.41e-06,0,0,0,6.56e-06,0,4.19e-06,0.000994,0,0,0.000269,0.000112,6.63e-06,4.6e-06,2.43e-06,5.86e-06,0.00189,5.7e-06,0,2e-05,3.77e-06,0,0,1.21e-05,0,4.63e-06,0.000102,0,0,0,0,0,4.23e-06,2.5e-06,4.07e-06,5.4e-06,0,0.000138,8.21e-06,0,0,0,0,0,4.05e-06,7.78e-05,1.14e-05,0,0,8.65e-06,4.82e-06,3.74e-06,2.3e-06,3.92e-06,9.26e-06,0,0,9.71e-06,2.09e-05,2.78e-06,0,0,0,5.74e-06,1.44e-05,8.54e-06,3.37e-06,3.05e-06,3.51e-06,3.79e-06,3.24e-06,2.19e-06,2.16e-06,4.04e-06,0.00139,0,2.36e-06,7.77e-06,3.55e-06,2.26e-06,3.75e-06,5.5e-06,3.7e-06,4e-06,2.96e-06,2.7e-06,2.43e-06,2.34e-06,2.29e-06,2.2e-06,1.73e-06,3.76e-06],"winrateAvg":0.0652568,"leadAvg":-8.78347,"scoreMeanAvg":-10.7079,"scoreStdevAvg":14.8647,"shorttermWinlossErrorAvg":0.0965925,"shorttermScoreErrorAvg":2.61675,"ownership":[62,63,63,66,63,45,20,-11,-35,-55,-65,-62,-56,-26,-4,16,19,23,20,63,61,66,70,72,56,7,-11,-46,-61,-71,-73,-68,-92,35,34,35,-1,20,64,64,57,97,68,86,5,-22,-55,-64,-92,-62,-69,-93,8,-91,30,12,23,68,66,78,96,40,10,-19,-85,-85,-39,-47,-54,-62,-72,-69,-92,-65,28,27,72,71,95,63,37,24,6,-8,34,-20,-33,-49,-57,-72,-98,-55,-79,-78,25,74,78,68,59,47,36,21,12,-3,-20,-39,-51,-65,-65,-98,22,20,21,22,74,74,71,62,54,41,27,11,-11,-39,-41,-79,-51,-36,-97,-97,18,-37,-30,73,74,72,66,57,47,31,63,-28,-86,-58,-48,-32,-40,-36,-38,-96,-96,-50,72,73,68,64,59,81,5,-3,-35,-46,-49,-33,-42,-33,-34,-99,-92,-94,-81,70,72,67,63,57,2,-58,-31,-84,-62,-61,-88,-53,-35,-99,-99,-92,-94,-85,48,86,86,5,82,81,-58,14,-6,-19,-88,-82,-66,-34,-99,-99,-99,-88,-76,-10,0,-12,-42,-18,-95,93,94,95,28,95,-90,-91,-91,2,-53,-99,-62,-57,-52,-76,-76,-76,-44,-95,-95,-95,95,91,95,95,41,-15,-3,18,-10,-39,-36,-34,-77,76,77,34,-21,-95,94,90,93,66,48,-6,28,77,25,-9,-26,-27,19,72,68,52,20,49,-95,95,92,97,64,55,85,83,8,-9,-23,-36,-33,53,62,71,77,-13,-31,-95,94,7,97,48,27,-32,82,-89,-1,-83,-56,-46,67,73,77,-4,-35,-95,-95,94,-87,96,44,6,-22,-89,-89,-72,-68,-64,-58,64,53,77,-85,-81,-87,-89,-90,-88,96,44,4,-33,-63,-77,-77,-73,-68,-64,45,31,-14,-84,-82,-83,-83,-72,6,42,55,21,-15,-48,-66,-72,-72,-70,-67],"ownershipAllowedMAE":0.0611226})%"); + lines.push_back(R"%({"sample":{"board":".................../....XO............./..O.XOXXXX...XO..../.OXXXXOXOO...XO.O../..O..OOO.....X...../.OXX...........X.X./.OOX..OX.........../.OXX.XOX.O........./..OO.OX..OX......../.....OX.XXO......../..X.OXO...X.O.O.X../....OX.O..O......../....OX.....X..X.X../.....X..O.OOOO..OX./..........XXXO...X./..XXX..X..XOOXXXXO./..OO......X..O..OO./.....O....XOO.O..../.................../","hintLoc":"null","initialTurnNumber":109,"metadata":"263C71398A1E279F11127557928F4E61:119","moveLocs":["M10","K8","G4","H5","H6","G3","F3","F4","G2","H3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.24,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":4.5,"policyOptimism":0.0,"pda":0.472,"policyMixture":[2.83e-05,2.93e-05,7.37e-05,5.41e-05,8.05e-05,3.6e-05,3.09e-05,3.27e-05,3.17e-05,3.04e-05,3.14e-05,3.22e-05,3.29e-05,3.37e-05,3.51e-05,3.51e-05,3.3e-05,3.32e-05,2.82e-05,3.05e-05,3.28e-05,3.2e-05,0.000791,0,0,4.89e-05,3.48e-05,3.32e-05,4.09e-05,3.64e-05,4.07e-05,4.03e-05,0.000122,4.4e-05,3.87e-05,3.57e-05,3.7e-05,3.32e-05,3.1e-05,3.22e-05,0,3.03e-05,0,0,0,0,0,0,0.000136,4.05e-05,3.68e-05,0,0,3.4e-05,3.58e-05,3.94e-05,3.3e-05,2.97e-05,0,0,0,0,0,0,0,0,0,0.000117,9.24e-05,3.41e-05,0,0,3.41e-05,0,4.08e-05,3.69e-05,3.07e-05,3.74e-05,0,4.9e-05,6.84e-05,0,0,0,5.49e-05,4.11e-05,0.0002,7.54e-05,4.03e-05,0,9.3e-05,3.83e-05,4.15e-05,4.29e-05,3.41e-05,2.89e-05,0,0,0,6.55e-05,3.86e-05,0.000188,0.0126,0.0699,0.137,0.000293,0.000156,0.00012,4.62e-05,4.58e-05,0,4.45e-05,0,3.37e-05,2.84e-05,0,0,0,3.85e-05,0.0843,0,0,0.0466,0.000955,0.0114,0.000259,0.000182,0.000122,4.64e-05,4.2e-05,6.56e-05,3.85e-05,3.15e-05,2.82e-05,0,0,0,0.00147,0,0,0,3.78e-05,0,0.00328,0.000948,0.000142,9.42e-05,5.9e-05,4.54e-05,4.14e-05,3.84e-05,3.22e-05,3e-05,3.12e-05,0,0,3.44e-05,0,0,0.341,0.00127,0,0,0.000412,6.2e-05,4.52e-05,4.85e-05,4.92e-05,4.28e-05,4.03e-05,3.17e-05,3.18e-05,3.53e-05,3.46e-05,3.2e-05,3.15e-05,0,0,0.00032,0,0,0,0,4.04e-05,4.18e-05,4.01e-05,4.97e-05,0.00029,4.22e-05,3.26e-05,3.18e-05,3.45e-05,0,3.33e-05,0,0,0,0.000781,0.000619,0.00146,0,0.142,0,3.77e-05,0,0.000141,0,6.54e-05,3.26e-05,3.19e-05,3.9e-05,3.88e-05,3.19e-05,0,0,3.46e-05,0,0.0016,0,0,0.00107,0.000121,4.98e-05,0.000148,0.00155,0.000415,0.000242,3.32e-05,3.33e-05,3.93e-05,4.66e-05,3.36e-05,0,0,3.24e-05,3.36e-05,4.06e-05,0.0131,0.0192,0,4.81e-05,4.87e-05,0,0.00427,0,0.000309,3.37e-05,3.27e-05,3.76e-05,3.94e-05,3.63e-05,4.31e-05,0,0.0834,0,0,4.81e-05,0,0,0,0,0.000101,0.00714,0,0,3.43e-05,3.18e-05,3.66e-05,3.21e-05,3.06e-05,4.15e-05,4.48e-05,0.000132,0,5.11e-05,5.86e-05,0,0,0,0,3.87e-05,4.46e-05,3.55e-05,0,3.58e-05,3.27e-05,4.2e-05,0,0,0,0,0,0,5.25e-05,3.54e-05,0,0,0,0,0,0,0,0,3.09e-05,3.32e-05,3.78e-05,0,0,3.23e-05,0,0,0,8.68e-05,3.37e-05,0,3.05e-05,2.9e-05,0,3.03e-05,3.1e-05,0,0,2.86e-05,3.27e-05,3.43e-05,3.12e-05,3.06e-05,3.1e-05,0,0,0.00011,3.89e-05,3.5e-05,0,0,0,2.82e-05,0,3.03e-05,2.96e-05,2.86e-05,2.94e-05,2.8e-05,3.08e-05,3.06e-05,2.99e-05,2.91e-05,2.85e-05,2.97e-05,3.12e-05,3.41e-05,3.34e-05,3.25e-05,3.03e-05,2.93e-05,2.84e-05,2.88e-05,2.96e-05,2.87e-05,2.87e-05,2.77e-05,2.82e-05],"winrateAvg":0.0653592,"leadAvg":-8.19087,"scoreMeanAvg":-9.17088,"scoreStdevAvg":13.5244,"shorttermWinlossErrorAvg":0.142407,"shorttermScoreErrorAvg":3.40357,"ownership":[45,25,7,-52,-83,-92,-93,-88,-79,-70,-57,-48,-39,-29,0,16,23,24,23,66,47,13,-5,-97,-90,-95,-92,-86,-72,-62,-44,-59,-30,2,29,18,21,20,77,72,72,-42,-96,-90,-97,-97,-97,-97,-32,-39,-50,-93,48,24,20,26,13,82,89,-95,-96,-96,-96,36,-97,34,36,-17,-16,-42,-93,47,7,46,0,1,85,68,70,-67,-51,37,37,40,16,6,-6,-15,-33,-93,-18,-29,-24,-11,-29,89,96,-88,-89,-37,-20,-6,-7,2,16,3,-4,-11,-30,-37,-83,-46,-77,-45,92,96,96,-88,-28,28,55,-50,6,8,14,8,-1,-8,-16,-28,-30,-42,-50,87,97,-86,-86,18,-3,57,-41,19,75,47,26,9,0,-6,-15,-26,-42,-43,70,87,94,94,48,87,-61,8,20,74,30,49,20,10,3,-9,-25,-37,-44,47,24,53,49,57,85,-63,-51,-62,-63,85,84,47,21,17,-2,-11,-53,-53,13,2,-31,16,66,-96,0,-24,-34,-30,-27,34,87,37,68,-2,-89,-72,-68,-13,-6,-8,16,65,-97,-35,33,-23,-53,35,19,46,13,-3,-24,-60,-82,-78,-30,-28,-7,0,64,-96,-21,9,15,34,12,-3,52,3,-77,-53,-90,-84,-84,-47,-32,-27,-20,-7,-96,18,71,74,54,85,84,85,85,-7,-39,-43,-91,-78,-50,-66,-58,-48,-48,-84,-91,-96,-7,-9,-94,-94,-93,85,32,-41,-79,-91,-3,-37,-44,-98,-98,-98,-98,-90,-96,-63,-57,-94,88,89,-83,-83,-83,-84,96,22,-2,28,82,82,-41,82,-96,-96,-60,-71,-94,-48,89,97,13,6,96,96,91,29,69,75,79,81,81,81,15,-49,-52,-94,97,98,97,98,94,96,95,93,53,70,76,76,75,65,44,12,-13,-50,-17,10,84,93,96,96,96,95,94],"ownershipAllowedMAE":0.0403636})%"); + lines.push_back(R"%({"sample":{"board":".............O.X.../....X.......O.OXOO./..XX.XX.....OOXXOXO/.XOOX.......OXXXXX./....OX......OXO.XX./....O.......OOO.OO./....O.......X....../.OO................/.......O.........../.XXXX.XXX.......X../.XOOO............../.OO............XO../..X.OO........OX.../.XX.OX.O........X../.OXO..O.O.......XX./.OOXXXO.O....X.XOX./..OX.XXO.....XX.OOX/..OOX.X....OXOXO.OO/....OX......O.OOXX./","hintLoc":"null","initialTurnNumber":64,"metadata":"8072EB8C0821D04BBD3C4CCD2AD5C19A:74","moveLocs":["B15","O1","F10","F11","O2","C15","D15","O1","T15","T16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":9.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.43e-06,4.89e-06,4.63e-06,4.67e-06,4.65e-06,4.81e-06,4.81e-06,4.72e-06,4.79e-06,4.95e-06,4.91e-06,4.81e-06,4.98e-06,0,4.03e-05,0,2.32e-05,1.12e-05,1.51e-05,4.55e-06,5.22e-06,4.84e-06,4.66e-06,0,4.73e-06,5.19e-06,5.7e-06,6.22e-06,5.52e-06,5.17e-06,4.85e-06,0,4.97e-06,0,0,0,0,7.3e-05,4.89e-06,4.94e-05,0,0,0,0,0,5.49e-06,2.21e-05,8.12e-06,4.87e-06,4.64e-06,0,0,0,0,0,0,0,5.55e-06,0,0,0,0,4.92e-06,5.03e-06,6.01e-06,9.75e-06,5.47e-06,5.02e-06,4.73e-06,0,0,0,0,0,0,0,4.79e-06,0,0,0,0,0,6.92e-06,5.88e-06,6.69e-06,5.47e-06,5.06e-06,4.64e-06,0,0,0,4.68e-05,0,0,0,4.67e-06,5.1e-06,5.8e-06,4.53e-06,0,8.07e-06,3.07e-05,2.17e-05,1.09e-05,5.66e-06,5.28e-06,5.03e-06,0,0,0,4.94e-06,0,0,3.1e-05,4.66e-06,4.6e-06,4.68e-06,4.55e-06,0,8.45e-06,0.000148,7.73e-05,2.8e-05,1.51e-05,6.92e-06,5.36e-06,0,5.18e-06,4.9e-06,4.98e-06,5.26e-06,5.36e-06,5.74e-06,4.72e-06,0,0,5.47e-06,1.4e-05,7.43e-05,7.78e-05,2.65e-05,2.16e-05,3.21e-05,1.3e-05,5.73e-06,5.36e-06,5.61e-06,5.58e-06,5.45e-06,7.88e-06,9.38e-06,5.05e-06,4.81e-06,4.65e-06,4.79e-06,5.64e-06,3.71e-05,0,5.37e-05,0,4.74e-05,3.91e-05,2.8e-05,1.33e-05,1.16e-05,7.71e-06,1.09e-05,2.48e-05,3.94e-05,1.73e-05,4.93e-06,4.51e-06,0,0,0,0,0,0,0,0,2.72e-05,3.32e-05,2e-05,1.38e-05,1.39e-05,1.61e-05,4.83e-05,0,2.55e-05,4.95e-06,4.78e-06,0,0,0,0,0.0106,5.2e-06,4.56e-06,4.97e-06,1.82e-05,2.8e-05,1.74e-05,9.02e-06,1.17e-05,1.1e-05,7.5e-05,6.45e-05,5.05e-06,4.99e-06,4.85e-06,0,0,4.48e-06,4.5e-06,4.75e-06,4.86e-06,5.12e-06,5.62e-06,7.55e-06,1.61e-05,1.15e-05,5.7e-06,5.31e-06,8.96e-06,0,0,5.42e-06,4.96e-06,5.01e-06,5.09e-06,0,5.14e-06,0,0,4.7e-06,4.93e-06,4.99e-06,5.31e-06,9.04e-06,1.26e-05,6.85e-06,5.23e-06,0,0,5.38e-06,5.16e-06,4.95e-06,4.74e-06,0,0,5.17e-06,0,0,4.93e-06,0,4.66e-06,4.94e-06,5.36e-06,9.1e-06,5.61e-06,5.32e-06,5.29e-06,5.15e-06,0,4.87e-06,5.15e-06,4.87e-06,0,0,0,4.92e-06,5.37e-06,0,4.83e-06,0,4.79e-06,5.28e-06,6.31e-06,5.73e-06,5.12e-06,4.99e-06,4.97e-06,0,0,5.07e-06,4.88e-06,0,0,0,0,0,0,4.83e-06,0,4.85e-06,5.34e-06,5.77e-06,4.81e-06,0,4.49e-06,0,0,0,4.93e-06,4.48e-06,4.57e-06,0,0,0,0,0,0,4.88e-06,4.96e-06,5.94e-06,7.17e-06,8.26e-06,0,0,5.46e-06,0,0,0,4.68e-06,4.68e-06,0,0,0,0,0,5.2e-06,5.57e-06,5.15e-06,5.41e-06,0,0,0.987,0,0,4.82e-06,0,0,4.64e-06,4.62e-06,4.79e-06,5.38e-06,0,0,3.16e-05,5.07e-06,5.2e-06,5.1e-06,5.62e-06,1.09e-05,0,0,0,0,0,0,4.6e-06,5.31e-06],"winrateAvg":0.644539,"leadAvg":0.811897,"scoreMeanAvg":1.35213,"scoreStdevAvg":9.57614,"shorttermWinlossErrorAvg":0.359529,"shorttermScoreErrorAvg":2.47209,"ownership":[-50,-63,-77,-88,-91,-85,-69,-45,-18,10,37,66,89,95,15,-97,-96,-95,-93,-31,-62,-74,-93,-99,-90,-69,-42,-19,2,26,61,99,87,88,-96,-95,-94,-96,-16,-1,-98,-98,-89,-99,-99,-34,1,-7,15,51,99,99,-97,-96,-94,-97,-95,16,-6,91,93,-89,-66,-39,-15,-7,4,13,46,99,-96,-96,-96,-96,-97,-97,18,68,59,93,93,-74,-13,-11,0,4,11,42,99,-95,99,32,-97,-96,9,49,50,71,76,93,10,1,-2,2,4,11,29,99,99,99,68,83,82,6,70,72,74,62,93,17,2,-1,2,2,-2,4,-37,31,36,1,24,30,32,69,92,92,29,13,-4,-17,0,-1,-1,0,-1,1,12,12,2,4,1,15,53,58,62,45,28,-45,8,43,-12,-6,-3,-1,0,3,0,-7,-5,-17,-9,32,26,27,27,25,86,-59,-59,-64,-17,-6,-5,-2,0,-9,-21,-82,-44,-31,40,22,98,98,99,84,18,-7,-12,-4,-9,-8,-5,-6,-18,-33,-63,-59,-51,39,98,98,93,90,59,25,7,3,0,-4,-6,-8,-14,-31,-98,-56,-65,-65,86,87,80,90,99,99,34,31,10,6,-2,-3,-10,-14,13,-98,-81,-76,-77,82,78,79,87,99,-27,49,97,48,11,4,-1,-11,-22,-27,-59,-99,-90,-88,89,97,77,88,-58,-13,97,94,98,32,5,-4,-13,-37,-49,-78,-99,-99,-90,93,97,97,-99,-99,-99,98,89,98,36,7,-11,-38,-96,-80,-96,-50,-99,-74,94,95,97,-99,-99,-99,-99,89,43,12,6,-12,-39,-96,-97,-73,-52,-52,-78,93,93,97,97,-98,-98,-99,8,3,20,6,33,-70,-55,-95,-53,-51,-50,-51,93,92,80,-27,-23,-98,-81,-38,-5,4,-3,-33,-34,-55,-54,-52,-52,-52,-51],"ownershipAllowedMAE":0.065608})%"); + lines.push_back(R"%({"sample":{"board":".............X.X.../...........OX.XXO../...X......O.OXXXOO./.....X....XOOOXOOX./..O........XOOOXX../............OXXX.X./..O..........XO.OO./.................../..X.......O......../.................../.................../..O.O........O...../............XOX..../............XOOOO../..X.XX....O.XXXXOX./..O.OXO.X.....OOX.X/....OO....OOX.OX.X./...........XOX.X.../.................../","hintLoc":"null","initialTurnNumber":88,"metadata":"F45B59640E543500052DE0B93795EAF7:98","moveLocs":["J6","B5","R10","Q10","R11","Q11","Q12","R12","Q13","R9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.25,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":-8.0,"policyOptimism":0.0,"pda":2.02,"policyMixture":[2.77e-05,4.9e-05,4.85e-05,5.1e-05,5.02e-05,5.34e-05,5.76e-05,5.99e-05,5.89e-05,5.68e-05,5.6e-05,6.56e-05,5.38e-05,0,9.07e-06,0,4.4e-05,4.22e-05,2.24e-05,5.51e-05,7.8e-05,7.82e-05,6.44e-05,7.69e-05,8.39e-05,0.000103,0.000136,0.000154,0.000173,7.85e-05,0,0,1.4e-05,0,0,0,4.82e-05,4.15e-05,6.1e-05,0.000334,0.000137,0,7.42e-05,8.38e-05,0.000157,0.000695,0.000933,0.000366,0,0,0,0,0,0,0,0,4.19e-05,6.17e-05,0.000662,0.0041,9e-05,8.43e-05,0,9.08e-05,0.000409,0.000498,0.00111,0,0,0,0,0,0,0,0,4.43e-05,6.23e-05,0.000177,0,0.000243,9.93e-05,9.14e-05,0.000113,0.000149,0.00017,0.00023,0.000604,0,0,0,0,0,0,4.27e-05,3.85e-05,6.43e-05,0.000588,0.000193,0.000868,0.000289,0.000324,0.000224,0.00015,0.000142,0.000183,0.000193,0.000673,0,0,0,0,4.96e-05,0,4.37e-05,6.41e-05,0.000374,0,0.000498,0.000386,0.000453,0.000317,0.000198,0.000169,0.000218,0.000683,0.00189,0.00916,0,0,0,0,0,6.25e-05,6.29e-05,0.000112,0.000347,0.000532,0.000691,0.000548,0.000396,0.000278,0.000213,0.00018,0.000353,0.00133,0.000108,5.69e-05,4.81e-05,0,0,4.96e-05,5.12e-05,6.22e-05,8.93e-05,0,0.000115,0.00119,0.000649,0.000452,0.000338,0.00026,0.000222,0,0.000133,8.87e-05,7.16e-05,8.43e-05,0,0,0.0547,7.84e-05,5.92e-05,0.000119,9.43e-05,0.000323,0.000533,0.000666,0.000471,0.000375,0.000295,0.000251,0.00016,0.000124,8.85e-05,7.84e-05,5.73e-05,0,0,9.74e-05,4.67e-05,6.31e-05,0.000147,0.00111,0.00334,0.000848,0.000584,0.00042,0.000416,0.00035,0.000297,0.000196,0.000236,8.04e-05,6.18e-05,5.41e-05,0.000285,0,0.502,3.54e-05,6.39e-05,0.00165,0,0.00128,0,0.000979,0.000467,0.000401,0.000449,0.000612,0.000375,0.000149,0.000113,0,4.77e-05,4.37e-05,5.77e-05,4.38e-05,4.04e-05,6.13e-05,0.000303,0.00677,0.00204,0.000651,0.000502,0.000433,0.000246,0.000148,0.00139,0.00067,7.66e-05,0,0,0,4.59e-05,5.45e-05,6e-05,4.82e-05,5.81e-05,0.0612,0.00304,0.00221,7.71e-05,7.59e-05,0.000231,0.000145,0,0.000473,0.000486,6.1e-05,0,0,0,0,0,5.67e-05,4.9e-05,7.46e-05,0,0,0.238,0,0,0.00194,0.00023,8.25e-05,0.000113,0,6.99e-05,0,0,0,0,0,0,3.92e-05,5.3e-05,0.00692,0,0.0335,0,0,0,0.000603,0,0.000112,7.25e-05,0.000196,6.35e-05,5.41e-05,0,0,0,3.49e-05,0,5.04e-05,9.12e-05,0.000215,0.000159,0,0,0.00468,0.00666,0.00148,0.000203,0,0,0,5.78e-05,0,0,3.52e-05,0,2.88e-05,4.65e-05,6.9e-05,6.92e-05,6.82e-05,7.1e-05,7.9e-05,0.000352,0.00126,0.0018,0.000155,0.00021,0,0,0,5.25e-05,0,3.34e-05,3.21e-05,3.02e-05,2.63e-05,4.63e-05,4.83e-05,5.37e-05,5.91e-05,6.06e-05,6.03e-05,6.42e-05,6.45e-05,5.95e-05,5.28e-05,4.57e-05,0.000106,3.43e-05,3.06e-05,3.03e-05,2.8e-05,3.08e-05,2.43e-05,3.93e-05],"winrateAvg":0.000776871,"leadAvg":-27.3213,"scoreMeanAvg":-28.0227,"scoreStdevAvg":13.6189,"shorttermWinlossErrorAvg":0.00545253,"shorttermScoreErrorAvg":2.15547,"ownership":[-24,-31,-39,-46,-43,-32,-14,7,29,46,61,42,-75,-89,-88,-94,-90,-86,-85,-16,-27,-44,-51,-49,-33,-18,4,24,40,58,82,-86,-84,-94,-95,-82,-86,-84,-7,-8,-25,-80,-47,-46,-25,-2,6,35,83,79,83,-94,-94,-95,-83,-82,-86,11,1,-40,-7,-18,-76,-21,-9,4,25,-8,83,83,83,-96,-83,-84,-94,-86,29,33,68,27,6,2,-6,-3,3,12,21,6,83,83,81,-99,-98,-93,-90,38,47,37,15,9,4,2,2,3,7,18,40,82,-99,-99,-99,-82,-97,-80,35,42,71,21,13,6,3,2,3,4,7,7,0,-98,-51,-99,-52,-50,-72,24,25,21,16,7,4,0,1,2,4,7,-7,-19,-37,-46,-98,-51,-55,-56,15,8,-25,9,1,2,-1,0,3,9,66,7,-3,3,-5,69,-57,-50,-45,17,16,15,16,10,2,-2,-1,-1,1,10,4,7,5,22,70,-55,-43,-25,27,31,24,21,19,8,3,-3,-3,0,7,2,14,31,48,59,85,-48,2,38,41,79,37,75,9,1,-5,-10,-4,2,-1,9,88,68,68,84,-14,29,42,45,22,24,20,4,-1,-12,-23,-17,8,-23,-91,88,59,74,69,52,23,49,42,21,15,9,0,-9,-8,-72,-18,-10,-31,-92,87,89,90,90,5,-18,59,78,-18,7,-34,-35,7,-4,-31,-18,32,-11,-92,-92,-92,-92,88,-95,-63,70,70,91,25,93,-35,60,4,-63,-17,8,-29,-30,-75,-68,-69,-96,-93,-97,73,78,77,75,93,93,44,12,-4,-7,33,31,-92,-86,-68,-99,-95,-98,-95,75,77,78,79,79,68,44,24,1,-7,-18,-69,-65,-96,-87,-99,-95,-95,-95,74,75,75,73,68,59,42,21,4,-8,-22,-46,-77,-84,-92,-94,-95,-95,-95],"ownershipAllowedMAE":0.0409115})%"); + lines.push_back(R"%({"sample":{"board":"..O....X.O........./.OX.X.X.XOX...XX.../..OX..XXOOXOOOOOX../..O...XOO.OXOX.OX../..OXX.OXXO.XX..OX../...OXXOOXOO.X..OXO./...O.OXXXX.....OOX./.....O..XX.XXOOXX../.....X.X....O....X./........OOO......../...O.....XOX.O...../.OO....O..X....O.../.OXOOO..O....OXXX../.XXXXOX.OXX......../.X...XXXXOX..O.OX../OOXX.XOOOOX.X.OXX../.O.XXXOOXX.X.O.OX../O.OOXOOXX.OX..O.O../.X.OOOOX.O.X...O.../","hintLoc":"null","initialTurnNumber":179,"metadata":"399C9D9C7AE91A620A09A268E0F038EE:189","moveLocs":["N5","N8","O8","N7","R10","S10","M6","K8","M7","M8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.27,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":7.0,"policyOptimism":0.0,"pda":2.91,"policyMixture":[2.06e-06,2.63e-06,0,2.58e-06,2.72e-06,2.51e-06,2.22e-06,0,2.43e-06,0,3.2e-06,2.81e-06,2.72e-06,2.86e-06,3.78e-06,4.36e-06,1.1e-05,6.65e-06,2.14e-06,2.12e-06,0,0,7.02e-06,0,2.87e-06,0,0,0,0,0,4.78e-06,2.77e-06,4.53e-06,0,0,0.000339,8.8e-05,3.23e-06,2.33e-06,2.48e-06,0,0,3.24e-06,2.68e-06,0,0,0,0,0,0,0,0,0,0,0,4.89e-05,3.02e-06,2.11e-06,2.41e-06,0,3.75e-06,3.56e-06,2.78e-06,0,0,0,2.89e-06,0,0,0,0,3e-06,0,0,2.95e-05,3.83e-06,2.04e-06,2.25e-06,0,0,0,2.34e-06,0,0,0,0,2.85e-06,0,0,3.94e-06,3.41e-06,0,0,0.000158,3.76e-06,2.02e-06,2.43e-06,2.51e-06,0,0,0,0,0,0,0,0,1.21e-05,0,1.23e-05,3.11e-06,0,0,0,3.15e-06,2.11e-06,2.54e-06,2.64e-06,0,4.13e-06,0,0,0,0,0,0.00164,0.000248,0.0047,0.061,3.18e-06,0,0,0,0.000187,2.13e-06,2.81e-06,3.33e-06,5.93e-06,4.8e-06,0,6.59e-06,3.25e-06,0,0,0.000122,0,0,0,0,0,0,0.000181,0.000123,2.19e-06,2.84e-06,3.5e-06,1.84e-05,0.00396,0,0.00204,0,3.38e-06,3.62e-06,1.75e-05,0.00252,0,9.36e-06,7.11e-06,0.000475,5.81e-06,0,2.95e-06,2.21e-06,2.82e-06,3.08e-06,4.35e-06,3.86e-05,0.000428,0.0607,0.203,0,0,0,0.0298,4.89e-05,1.76e-05,1.9e-05,8.84e-06,0,0,3.76e-06,2.3e-06,2.51e-06,2.59e-06,0,4.09e-06,2.09e-05,1e-05,0.000989,5.88e-05,0,0,0,3.74e-06,0,6.23e-06,0.000213,0.000394,0.0382,5.04e-06,2.05e-06,0,0,2.56e-06,2.68e-06,3.66e-06,4.5e-06,0,8.63e-06,0,0,0,0,0,2.75e-05,0,0.0613,0.00017,5.79e-06,2.42e-06,0,0,0,0,0,5.01e-05,3.68e-06,0,0.000566,0.000725,0,0,0,0,0,0,1.49e-05,4.1e-06,2.95e-06,0,0,0,0,0,0,2.62e-06,0,0,0,0,0.305,0.000185,9.51e-06,7.88e-06,2.14e-05,0.0062,3.77e-06,3.2e-06,0,1.98e-06,0.000378,0.000616,0,0,0,0,0,0,0.177,0,0,4.54e-06,0,0,9.55e-06,4.39e-06,0,0,0,0,2e-06,0,0,0,0,0,0,3.95e-06,0,4.55e-06,0,0,0,7.88e-06,5.89e-06,1.2e-06,0,3.51e-06,0,0,0,0,0,0,0,0.00221,0,0.0021,0,2.26e-06,0,0,0.000781,5.56e-06,0,4.25e-06,0,0,0,0,0,0,0,0.0297,0,0,4.2e-06,2.92e-06,0,1.93e-06,0,9.54e-05,7.4e-06,3.1e-06,0,3.59e-06,0,0,0,0,0,3.26e-05,0,0.000994,0,2.86e-06,3.06e-06,2.36e-06,0,2.55e-06,4.58e-06,2.56e-06,7.45e-06],"winrateAvg":0.978601,"leadAvg":22.6212,"scoreMeanAvg":22.2607,"scoreStdevAvg":24.7133,"shorttermWinlossErrorAvg":0.104056,"shorttermScoreErrorAvg":10.9208,"ownership":[83,65,69,-27,-67,-94,-96,-99,-28,88,85,76,45,11,-16,-78,-92,-94,-93,90,95,-8,-12,-96,-92,-100,-95,-95,87,82,88,54,9,-94,-94,-94,-94,-94,95,95,99,-75,-62,-82,-100,-100,86,86,82,93,93,93,93,91,-97,-95,-94,95,97,99,19,-68,-80,-100,85,87,83,84,-76,93,-12,67,92,-97,-95,-94,93,95,99,-99,-100,-99,-99,-100,-100,85,-37,-73,-73,-14,27,93,-97,-95,-93,89,91,91,93,-100,-100,-99,-99,-100,83,83,-28,-74,-12,29,92,-97,-91,-92,84,85,82,92,-23,64,-100,-100,-100,-100,-21,-63,-30,30,65,91,90,-93,-90,81,79,73,61,40,66,-7,-70,-100,-99,-68,-92,-91,85,84,-93,-94,-92,-84,82,80,75,39,23,-28,-10,-89,-19,13,3,31,81,49,25,-15,-26,-95,-76,85,84,76,48,21,14,-3,29,92,92,91,35,18,37,38,10,49,-95,-65,88,88,86,97,38,27,23,23,45,-19,90,-16,30,95,51,34,12,-17,-52,86,97,97,91,55,49,50,92,25,-21,-15,-24,-17,95,-6,66,16,-67,-59,-13,97,-99,95,96,96,16,53,83,24,11,88,-21,95,-85,-87,-88,-76,-70,-50,-99,-99,-99,-99,96,-98,-32,81,-16,-19,89,63,45,-20,-40,-70,-77,-71,-57,-99,-99,-99,-98,-98,-98,-97,-89,97,-22,44,97,98,49,48,-84,-77,-69,98,98,-99,-99,-99,-98,99,99,99,98,-18,9,-15,58,97,-82,-84,-75,-49,95,98,72,-98,-98,-98,99,99,-15,-13,-7,-19,20,97,95,97,-84,-21,-34,97,39,99,99,-98,99,99,-15,-15,-10,-1,-21,33,70,98,95,96,-10,-9,64,32,71,99,99,99,99,-12,-12,-7,-18,-22,7,40,85,97,89,79,24],"ownershipAllowedMAE":0.0789316})%"); + lines.push_back(R"%({"sample":{"board":".O.OX..XOO.O......./X.OXXXX.XOO.OOOOX../.OOOXXXXXOXOOX.O.../..XXXOOX.OXXXXXO.O./.XXOOOOOOOO.OOXO.X./XOXXXXXXO..OOXXOOOO/.OX....XX.XXOX.X.X./OOX...OOX.X.X.X.XX./OOXX...XOOX..X.XOXO/OXX..XXXOXXXX.XXOOO/OOOX.OX.OOOOOXXOOXO/X.OOXOXXO..O.OOOXXX/.XOX.XOOOOOO.OOOXX./OOXXXXXXOO...O.OOX./.OOOXXXXO.OO...OOX./O.O.XOXOXXXO.OOOXO./OOXXXOOOOX.OOXOOXX./XXOX.XXOX.X.OXXOX../..OX..XOOOOO..XX.X./","hintLoc":"null","initialTurnNumber":313,"metadata":"CDB8D2C9CE9CAB281ECDAD3EDDA48799:323","moveLocs":["R13","K13","N1","A15","A7","A13","B8","Q12","M15","R1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.42,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.0012,0,0.00111,0,0,0.00116,0.0117,0,0,0,0.00716,0,0.00836,0.00129,0.00128,0.00128,0.0132,0.00121,0.00125,0,0.00114,0,0,0,0,0,0,0,0,0,0.0089,0,0,0,0,0,0.0115,0.00116,0.00122,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0373,0,0.0117,0.00125,0.00119,0.00132,0.00119,0,0,0,0,0,0,0.0315,0,0,0,0,0,0,0,0.0103,0,0.00128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0113,0,0.0116,0,0,0,0,0,0,0,0,0,0.113,0.119,0,0,0,0,0,0,0,0,0,0,0,0.00115,0.00121,0.00131,0.0011,0,0,0,0,0,0,0,0,0,0,0,0.118,0,0,0,0.00116,0.00155,0.00114,0,0,0,0.0288,0,0.00117,0,0,0,0,0,0,0.0746,0,0,0,0,0.00153,0.00223,0.00121,0,0,0,0,0.00118,0.00121,0,0,0,0,0,0,0,0,0,0.0114,0.0122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0116,0,0,0.0275,0,0,0,0,0,0,0,0,0,0,0,0.00163,0,0,0,0,0,0,0,0,0.00115,0.00119,0,0.00986,0,0,0,0,0,0,0,0.0015,0,0,0,0,0,0,0,0,0,0,0.0107,0,0,0,0,0,0.00129,0,0,0,0,0,0,0,0,0,0,0.00998,0.00955,0.00125,0,0.00121,0,0,0,0.00149,0.0016,0,0,0,0,0,0,0,0,0.0115,0,0,0.00125,0.00602,0.00119,0,0,0,0.00646,0,0.0017,0,0.0307,0,0,0,0,0,0,0,0,0.0112,0,0,0,0,0,0.00204,0,0,0,0,0,0,0,0,0,0,0.0129,0,0,0,0,0,0,0,0.00793,0,0,0,0,0.0115,0,0,0,0,0.012,0,0.00984,0,0,0,0,0,0.00132,0.00209,0.0118,0.0115,0,0,0.00226,0.0117,0,0,0,0,0,0,0,0.0443,0,0,0,0,0.00125,0.00844],"winrateAvg":0.000891064,"leadAvg":-1.28938,"scoreMeanAvg":-1.29851,"scoreStdevAvg":0.554147,"shorttermWinlossErrorAvg":0.0234819,"shorttermScoreErrorAvg":0.331712,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,100,-100,35,100,100,100,100,-100,-100,-100,-100,-100,100,100,-100,18,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,100,54,55,100,100,-100,-100,100,100,100,100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,-100,60,100,100,-100,-100,-100,-100,-100,-100,-100,-65,-100,-100,-100,-100,-100,-100,-100,-100,-42,100,100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-44,100,100,100,100,100,-100,-100,100,100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,-35,-100,100,-100,100,100,99,100,100,100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,99,100,100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-51,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0158179})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.X.X.O...X...O...../..XO.OX........X.../OXOXXXOO........X../.OOOOO.........XO../.................../...X.............../..O................/.................../......X............/...XX............../....O.O............/..XO............X../..OX.............../..X..X.O.......O.../...X.............../.................../.................../","hintLoc":"null","initialTurnNumber":12,"metadata":"67CAA90FA648DC3D9C84C6D3BC4725D2:22","moveLocs":["Q13","P14","S13","E18","B16","P18","F18","R12","R13","R10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.23,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0button1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.46e-06,4.57e-06,3.92e-06,4.79e-06,5.75e-06,5.46e-06,3.89e-06,4e-06,3.92e-06,4e-06,4.12e-06,4.29e-06,4.2e-06,4.28e-06,5.16e-06,3.92e-06,3.81e-06,3.65e-06,3.04e-06,4.75e-06,5.61e-06,2.83e-05,4.87e-06,0,0,4.09e-06,5.35e-06,6.84e-06,7.74e-06,1.31e-05,2.35e-05,9.17e-06,0.0284,0,8.4e-06,9.07e-06,5.55e-06,3.36e-06,5.89e-06,0,0.000166,0,7.98e-05,0,3.88e-06,4.62e-06,5.98e-06,0,2.23e-05,0.0096,9.37e-06,0,0.0382,1.38e-05,1.29e-05,4.07e-06,3.35e-06,3.61e-06,0,0,0,5.58e-06,0,0,4.07e-06,6.17e-06,1.04e-05,0.105,0.000226,0.000966,7.63e-06,1.97e-05,0,4.92e-06,4.19e-06,3.61e-06,0,3.2e-06,0,0,0,0,0,0,5.98e-06,2e-05,9.75e-05,0.000243,0.000274,0.000178,2.9e-05,5.1e-06,0,0.323,5.03e-06,3.42e-06,0,0,0,0,0,3.38e-06,3.86e-06,6.47e-06,1.56e-05,0.000136,0.000307,0.0108,5.91e-05,0,0,0,3.35e-06,4.02e-06,3.18e-06,3.27e-06,3.24e-06,3.33e-06,3.52e-06,3.76e-06,4.34e-06,5.67e-06,8.61e-06,1.67e-05,6.42e-05,0.000136,0.000236,7.11e-05,0.00672,0,0,0,3.4e-06,3.38e-06,3.98e-06,4.29e-06,0,4.8e-06,5.85e-06,6.52e-06,8.81e-06,1.27e-05,2.23e-05,6.61e-05,0.000129,0.000193,0.000522,4.6e-05,0.00014,0,1.13e-05,3.74e-06,3.53e-06,4.68e-06,0,6.28e-06,6.68e-06,8.61e-06,1.05e-05,1.27e-05,1.91e-05,4.24e-05,7.19e-05,0.000105,0.000147,0.000538,0.0498,0.14,0.000408,5.59e-05,4.76e-06,3.51e-06,6.34e-06,6.89e-06,8.39e-06,1.11e-05,9.18e-06,1.06e-05,2.68e-05,4.15e-05,6.95e-05,7.54e-05,9.25e-05,0.000111,0.000187,0.00439,0.0398,0,3.96e-05,5.03e-06,3.67e-06,6.66e-06,8.2e-06,5.65e-06,6.16e-06,1.19e-05,0,2.86e-05,8.71e-05,9.23e-05,8.12e-05,8.98e-05,0.000102,0.000133,0.000297,0.000118,5.25e-05,1.68e-05,4.52e-06,3.53e-06,6.56e-06,5.81e-06,0,0,0.000241,9.89e-06,6.35e-05,0.000129,0.000125,0.000102,9.69e-05,0.000106,0.000132,0.000161,0.00886,0.00869,2.62e-05,4.39e-06,3.64e-06,4.81e-06,0.0497,1.18e-05,0,5.02e-06,0,9.79e-06,0.000246,0.000154,0.000129,0.000108,0.000113,0.000124,0.00016,0.000167,2.72e-05,1.62e-05,4.27e-06,3.53e-06,8.73e-06,0,0,4.9e-06,5.93e-06,7.38e-06,1.88e-05,8.57e-05,0.000114,0.000127,0.000113,0.000105,0.000143,0.000203,0.000154,0,1.48e-05,4.39e-06,3.52e-06,8.71e-05,0,0,2.24e-05,1.09e-05,1.19e-05,8.6e-06,1.61e-05,0.000138,0.000209,0.000188,0.00014,0.000147,0.000124,1.49e-05,0.000535,0.000321,4.69e-06,3.15e-06,4.29e-06,0,3.86e-06,1.39e-05,0,1.49e-05,0,1.08e-05,0.000343,0.0582,0.000709,0.00151,0.00135,1.52e-05,0,2.71e-05,0.000106,4.74e-06,3.16e-06,3.62e-06,3.77e-06,0,7.5e-06,2.69e-05,1.29e-05,1.06e-05,2.97e-05,0.000284,0.000849,0.0347,0.00363,0.0606,0.000161,1.8e-05,4.74e-05,1.27e-05,4.09e-06,3.32e-06,3.61e-06,4.15e-06,5.38e-06,6.14e-06,7.93e-06,1.03e-05,1.17e-05,1.37e-05,1.45e-05,1.83e-05,1.91e-05,1.87e-05,2.09e-05,2.93e-05,1.5e-05,1e-05,6.69e-06,3.81e-06,3.13e-06,3.4e-06,3.46e-06,3.53e-06,3.78e-06,3.81e-06,3.86e-06,4e-06,4.02e-06,4.11e-06,4.19e-06,4.26e-06,4.3e-06,4.33e-06,4.51e-06,4.4e-06,3.91e-06,3.9e-06,3.07e-06,5.07e-06],"winrateAvg":0.574784,"leadAvg":0.599881,"scoreMeanAvg":0.875336,"scoreStdevAvg":12.1863,"shorttermWinlossErrorAvg":0.0991619,"shorttermScoreErrorAvg":0.769653,"ownership":[17,16,14,16,30,42,57,37,22,10,4,0,-1,-12,-25,-50,-59,-64,-65,19,19,14,19,16,95,50,37,20,1,2,0,0,6,-57,-47,-69,-65,-66,42,18,32,17,79,95,60,37,18,-25,11,0,0,32,-11,-72,-68,-65,-64,66,94,36,86,85,95,33,49,25,14,30,2,-6,-8,-29,-93,-80,-83,-23,97,95,99,83,83,82,97,96,18,10,-5,0,-7,-9,-29,-81,-90,16,-6,91,100,100,100,100,100,55,27,9,5,0,-1,-10,-31,-90,-90,52,22,23,77,64,46,39,43,37,21,14,5,2,0,-1,-8,-15,-6,52,50,52,31,58,56,11,-28,13,7,8,3,1,0,0,1,0,-4,5,20,-22,13,24,42,46,69,5,0,1,-1,-2,-1,-2,-1,0,1,2,2,25,5,-12,0,24,25,-3,-5,-5,-9,-11,-3,-4,-4,-3,-2,-2,-3,-6,-27,-71,-38,-21,7,3,-9,-20,-27,-27,-66,-9,-6,-4,-4,-3,-4,-5,-13,-24,-38,-42,-35,-5,-4,-13,-70,-72,-11,-12,0,1,-2,-3,-4,-4,-6,-10,-20,-29,-40,-38,-17,-15,16,-3,46,13,57,12,12,2,-2,-4,-5,-5,-9,-23,-35,-43,-37,-44,-26,-63,37,3,-5,10,6,7,1,-3,-5,-6,-3,-7,-4,-70,-41,-29,-61,-79,-57,-87,-13,-20,-1,8,0,1,-3,-6,-7,-1,-4,5,8,-8,-15,-75,-79,-94,-66,-39,-76,-2,54,9,-4,7,-9,-13,2,12,62,21,1,-1,-79,-82,-86,-95,-58,-28,-9,8,3,2,0,-3,-11,-22,10,25,15,8,6,-80,-81,-79,-80,-56,-38,-16,-5,0,-3,-4,-8,-12,-12,2,10,14,10,9,-80,-79,-75,-62,-51,-30,-14,-4,0,-1,-4,-7,-9,-6,1,8,12,12,11],"ownershipAllowedMAE":0.0297377})%"); + lines.push_back(R"%({"sample":{"board":".................../....OOX.....XX...X./.OOOOX.......O.XXO./.OXXOX.....O..OOO../.XOXXO.X.....O...../.XO.XX......OXO..X./.XO.......X.OXO.XO./.XO...O..O..OXXX.X./.XO..X...OXOXOXXO../..O..X.O.O.XXOOXXX./.X....XXOOX.X..OOX./......X.XXOOO.O.OOO/..X....X.OXOO.OX.X./...X..XOO.XXO..X.X./.O...XO.O.OXXXXXO../..OX...OO.O.XOXOOO./..OX..X.OXX.XOXXO../........OX.XOOOO.../........OOX.XO...../","hintLoc":"null","initialTurnNumber":172,"metadata":"673FED13DC135AF111BA3CB0FB05EBD1:182","moveLocs":["G4","M1","R2","S2","N1","F6","H5","M1","G5","L2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.96,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":5.0,"policyOptimism":0.57,"pda":-1.312,"policyMixture":[5.17e-06,5.22e-06,5.17e-06,5.33e-06,5.22e-06,5.46e-06,5.84e-06,5.78e-06,5.7e-06,5.72e-06,5.54e-06,5.52e-06,5.22e-06,5.5e-06,6.42e-06,6.48e-06,6.3e-06,5.9e-06,5.12e-06,5.17e-06,5.46e-06,5.24e-06,5.15e-06,0,0,0,6.05e-06,6.67e-06,6.79e-06,6.8e-06,6.19e-06,0,0,7.83e-06,6.7e-06,6.53e-06,0,5.92e-06,5.35e-06,0,0,0,0,0,5.8e-06,6.92e-06,6.96e-06,1.07e-05,1.57e-05,1.87e-05,0.000103,0,1.64e-05,0,0,0,6.24e-06,5.19e-06,0,0,0,0,0,6.01e-06,6.85e-06,7.81e-06,4.01e-05,0.00011,0,0.00011,5.72e-06,0,0,0,7.35e-06,6.01e-06,5.46e-06,0,0,0,0,0,6.48e-06,0,1.46e-05,0.000236,0.00365,0.00237,0.0988,0,7.06e-06,5.72e-06,5.85e-06,5.71e-06,5.69e-06,5.27e-06,0,0,5.25e-06,0,0,6.12e-06,9.14e-06,0.000119,0.00185,0.000163,0.000404,0,0,0,5.97e-06,5.68e-06,0,5.87e-06,5.57e-06,0,0,5.67e-06,5.7e-06,6.09e-06,6.95e-06,4.55e-05,7.71e-05,0.0106,0,0.00044,0,0,0,5.74e-06,0,0,5.95e-06,5.05e-06,0,0,5.38e-06,5.89e-06,6.46e-06,0,1.17e-05,1.83e-05,0,0.000116,0.396,0,0,0,0,5.52e-06,0,5.95e-06,5.52e-06,0,0,5.41e-06,5.87e-06,0,6.86e-06,1.09e-05,8.41e-06,0,0,0,0,0,0,0,0,5.95e-06,5.63e-06,5.27e-06,6.59e-06,0,5.43e-06,5.75e-06,0,5.86e-06,0,6.01e-06,0,0.00368,0,0,0,0,0,0,0,5.88e-06,5.46e-06,0,5.43e-06,5.16e-06,5.33e-06,5.52e-06,0,0,0,0,0,7e-06,0,0.373,1.88e-05,0,0,0,6.19e-06,5.47e-06,5.39e-06,5.65e-06,5.33e-06,5.37e-06,5.43e-06,0,5.86e-06,0,0,0,0,0,0.0198,0,5.57e-06,0,0,0,5.93e-06,5.7e-06,0,5.57e-06,5.46e-06,5.34e-06,5.24e-06,0,0.0863,0,0,0,0,0.000246,0,0,5.63e-06,0,5.47e-06,5.9e-06,5.49e-06,5.49e-06,0,5.41e-06,0,0,0,0,1.06e-05,0,0,0,1.24e-05,5.42e-06,0,5.35e-06,0,5.27e-06,5.35e-06,0,5.28e-06,5.21e-06,5.54e-06,0,0,0,0,6.46e-06,0,0,0,0,0,0,0,5.45e-06,5.52e-06,5.57e-06,5.49e-06,0,0,5.44e-06,5.56e-06,0,0,0,0.000101,0,5.55e-06,0,0,0,0,0,0,5.32e-06,5.49e-06,5.44e-06,0,0,5.61e-06,5.61e-06,0,5.68e-06,0,0,0,1.92e-05,0,0,0,0,0,5.02e-06,5.19e-06,5.84e-06,5.39e-06,1.76e-05,1.02e-05,6.99e-06,5.54e-06,5.62e-06,5.23e-06,0,0,0,0,0,0,0,0,0,0,5.17e-06,5.16e-06,5.76e-06,5.88e-06,6.58e-06,6.12e-06,5.68e-06,6.02e-06,5.21e-06,0,0,0,0,0,0,4.96e-06,1.14e-05,5.32e-06,1.02e-05,5.04e-06,9.11e-06],"winrateAvg":0.535034,"leadAvg":1.26451,"scoreMeanAvg":0.63528,"scoreStdevAvg":15.8542,"shorttermWinlossErrorAvg":0.323348,"shorttermScoreErrorAvg":4.1346,"ownership":[98,98,98,98,92,53,34,-1,-9,-15,-17,-26,-36,-42,-44,-49,-57,-56,-51,98,98,98,98,99,99,-28,1,-13,-10,-15,-16,-61,-62,-28,-50,-57,-68,-35,96,99,99,99,99,-49,-5,-16,-10,-7,1,14,5,59,-16,-72,-73,-12,-36,46,99,-76,-78,99,-53,-28,-19,-6,0,13,73,46,52,73,73,72,-19,-8,36,-28,13,-77,-77,-43,-48,-72,-7,5,12,45,54,71,59,36,17,30,-15,-7,-25,14,-41,-77,-77,-28,-16,5,31,11,31,70,-94,62,-8,3,-89,-52,-13,-24,13,-30,-38,-33,2,2,27,13,-15,17,69,-95,58,-34,-94,-87,-90,-20,-24,12,-27,-53,13,62,29,39,84,34,2,72,-95,-95,-95,-94,-95,-92,-22,-28,13,-32,-49,-97,-8,26,53,85,6,21,19,88,-95,-95,-92,-93,-90,-26,10,14,-36,-60,-97,-38,67,65,85,78,14,19,90,91,-95,-95,-95,-64,-30,-59,-37,-45,-55,-80,-100,-100,85,85,69,72,17,28,93,95,93,-95,11,-22,-15,-33,-48,-61,-77,-100,-98,-98,-97,92,93,94,67,95,64,93,92,92,-14,-31,-90,-70,-73,-85,-96,-99,-33,-11,-45,93,94,76,94,-31,34,-20,46,8,-34,-31,-95,-83,-76,-100,-8,-11,-26,-44,-43,93,42,23,-31,24,-22,30,31,56,-7,-38,-78,-100,-100,-99,-10,-15,-13,-42,-38,-37,-33,-33,98,58,60,50,51,57,-95,-82,-89,-100,-13,-9,-16,-10,-29,-40,93,-33,97,98,98,86,48,48,58,-96,-75,-78,-99,-61,-10,-33,-32,-33,-42,96,-32,-30,98,97,95,45,45,2,-26,-69,-59,-61,-56,-9,-32,-22,-25,95,95,96,97,96,98,96,39,32,14,-27,-47,-51,-45,-33,-8,-4,-18,26,36,95,95,96,97,97,97],"ownershipAllowedMAE":0.129172})%"); + lines.push_back(R"%({"sample":{"board":".........../.........../...O......./..XO...XX../.OOX..XOO../...X..OX.../..O.....X../......OO.X./.X.....X.../.........../.........../","hintLoc":"null","initialTurnNumber":21,"metadata":"8505C4DCBA1CB56B96DB5DED1A01293E:31","moveLocs":["E3","F6","C4","D3","E4","E2","F2","D2","J3","G5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.4,"xSize":11,"ySize":11},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":1.0,"policyOptimism":0.0,"pda":0.607,"policyMixture":[3.8e-06,4.68e-06,4.49e-06,5e-06,5.56e-06,6.17e-06,6.27e-06,5.47e-06,5.29e-06,5.24e-06,3.92e-06,4.82e-06,5.16e-06,5.68e-06,6.5e-06,1.62e-05,0.000232,0.00268,2.62e-05,8.42e-06,6.85e-06,5.16e-06,4.68e-06,5.91e-06,7.02e-06,0,7.96e-06,0.000153,0.24,1.17e-05,9.81e-06,6.91e-06,5e-06,4.6e-06,6.18e-06,0,0,7.2e-06,6.85e-05,8.92e-06,0,0,1.37e-05,4.74e-06,4.37e-06,0,0,0,0.000291,6.49e-06,0,0,0,6.77e-06,5.21e-06,4.19e-06,5.96e-06,1.04e-05,0,2.02e-05,0,0,0,1.95e-05,7.42e-06,4.93e-06,5.82e-06,0.000112,0,0.00012,0.134,1.81e-05,0,0.000165,0,6.11e-06,5.16e-06,0.000112,0.354,0,0.0171,0,8.68e-06,0,0,0.000429,0,5.32e-06,7.75e-06,0,0.101,0,0,7.2e-06,0.00334,0,0,0.0423,5.45e-06,1.22e-05,0.0055,5.43e-06,0,0,0,1.46e-05,0.0215,3.68e-05,1.35e-05,5.68e-06,4.19e-06,0.000131,7.24e-06,4.72e-06,0.0756,5.07e-05,7.07e-06,6.42e-06,6.15e-06,5.67e-06,3.78e-06,8.32e-06],"winrateAvg":0.880379,"leadAvg":2.01133,"scoreMeanAvg":2.97522,"scoreStdevAvg":6.20947,"shorttermWinlossErrorAvg":0.153319,"shorttermScoreErrorAvg":1.02018,"ownership":[75,69,63,54,43,28,9,-15,-38,-52,-60,81,76,69,60,39,31,8,-30,-48,-61,-66,86,84,89,95,34,12,43,-22,-69,-72,-73,89,92,86,95,26,6,-21,-95,-95,-84,-81,85,97,97,-84,-19,-45,-97,-85,-85,-88,-85,70,87,-34,-85,-49,-97,-90,-97,-92,-88,-86,46,85,94,48,-5,-9,-91,15,-97,-84,-82,9,62,94,-13,94,44,95,95,-2,-87,-58,-27,-43,8,-47,95,81,84,46,77,5,-34,-38,-36,-43,-47,-48,86,48,55,41,15,-3,-38,-39,-37,-35,4,23,45,50,44,32,14],"ownershipAllowedMAE":0.0504891})%"); + lines.push_back(R"%({"sample":{"board":".............O...../.X.X...O....O.OOXXO/.XXOOO.......OXXX.X/OXOX.OXX....OXXOOXX/.OOOO.OX....XOO..O./..X..O...O........./...XXXX............/.XXOXO.X........O../.XOOOO.XO......O.O./XOO....OOO.....XOO./.X....O.X......XXX./..XOX.XO........O../...X...........XO../..O...........XXX../..OX...........O.X./.XX.X.X.XX.XOO.O.../......O.XOOO.X..O../......XXOO........./.................../","hintLoc":"null","initialTurnNumber":123,"metadata":"839762C58D152E65C1811DFC6EBA027A:133","moveLocs":["N14","M15","M14","J14","J13","H13","J15","H14","P10","P9"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.98,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui0","komi":8.0,"policyOptimism":0.945,"pda":0.0,"policyMixture":[4.87e-06,6.22e-05,0.0124,3.94e-05,0.0224,0.000668,7.91e-06,6.59e-06,6.81e-06,6.26e-06,6.06e-06,5.67e-06,5.4e-06,0,4.96e-06,0.00243,0.00014,0.000173,5.47e-06,1.12e-05,0,4.59e-06,0,0.123,0.00676,8.12e-06,0,2.26e-05,1.15e-05,7.78e-06,6.21e-06,0,5.02e-06,0,0,0,0,0,2.16e-05,0,0,0,0,0,7.26e-06,6.09e-06,0.0172,0.000235,2.11e-05,8.59e-06,8.02e-06,0,0,0,0,0,0,0,0,0,0,5.18e-06,0,0,0,0.0791,0.000196,0.000258,0.0842,0,0,0,0,0,0,0,6.09e-06,0,0,0,0,5.07e-06,0,0,0,0.000235,0.014,0,0,0,0,0.00137,0.00171,0,0.00514,5.69e-06,6.68e-06,0,5.66e-06,5.52e-06,0,5.96e-06,0,0,0,2.29e-05,0,0,1.09e-05,7.23e-06,2.47e-05,0.000122,1.03e-05,8.84e-06,6.04e-06,1.48e-05,1e-05,0,0,0,0,0,0,3.97e-05,1.24e-05,6.6e-06,6.62e-06,8.19e-05,8.94e-06,7.92e-06,6.75e-06,9.74e-06,6.71e-06,5.61e-06,0,0,0,0,0,4.84e-06,0,1.44e-05,9.02e-06,8.94e-06,1.01e-05,9.54e-06,8.77e-06,7.29e-06,5.46e-06,0,5.81e-06,6.23e-06,7.78e-05,0,0,0,0,0,7.36e-06,0,0,6.08e-06,9.5e-06,1.09e-05,1.11e-05,1.3e-05,1.59e-05,0,4.64e-06,0,6.04e-06,0,0,0,4.98e-06,4.95e-06,7.86e-06,6.84e-06,0,0,0,9.12e-06,1.42e-05,1.84e-05,0.556,0,0,0,0,6.54e-06,3.76e-05,0,0.000328,0.00468,1.35e-05,2.23e-05,0,7.64e-06,0,1.26e-05,1.24e-05,2.22e-05,2.84e-05,0.00132,0,0,0,0,0.000577,8.39e-06,1.07e-05,0,0,0,0.0456,0,0,1.17e-05,1.4e-05,5.03e-05,3.02e-05,3.01e-05,9.24e-06,1.46e-05,8.35e-06,0,3.33e-05,8.13e-06,5.32e-06,5.07e-06,5.57e-06,0,8.28e-06,1.13e-05,0.00285,2.9e-05,5.76e-05,4.6e-05,3.66e-05,2.28e-05,1.38e-05,9.91e-06,4.89e-06,0,0,5.95e-06,1.62e-05,5.14e-06,4.86e-06,0,7.85e-06,7.37e-06,7.25e-06,7.85e-06,1.26e-05,2.46e-05,2.5e-05,1.24e-05,1.19e-05,2.11e-05,9.08e-06,0,0,0,6.74e-06,5.32e-06,4.8e-06,4.84e-06,0,0,6.41e-06,6.68e-06,8.25e-06,8.95e-06,7.64e-06,8.09e-06,8.28e-06,8.96e-06,7.97e-06,7.31e-06,5.94e-06,0,7.64e-06,0,6.04e-06,5.01e-06,0,0,6.07e-06,0,7.92e-06,0,8.17e-06,0,0,3.1e-05,0,0,0,6.44e-06,0,6.2e-06,0.0122,8.04e-06,4.86e-06,5.09e-06,5.34e-06,6.61e-06,5.92e-06,0.000821,0,0.00138,0,0,0,0,6.16e-06,0,6.42e-06,5.76e-06,0,8.88e-06,7.52e-06,5.01e-06,5.05e-06,5.36e-06,5.21e-06,5.53e-06,1.13e-05,0,0,0,0,4.91e-06,5.09e-06,5.67e-06,6.19e-06,5.8e-06,6.45e-06,6.78e-06,7.61e-06,6.02e-06,5.08e-06,4.98e-06,4.77e-06,4.86e-06,5.02e-06,5.73e-06,9.37e-06,0.000117,5.55e-06,4.77e-06,5.19e-06,5.61e-06,5.39e-06,5.59e-06,5.45e-06,5.37e-06,5.46e-06,5.58e-06,4.93e-06,5.88e-06],"winrateAvg":0.482864,"leadAvg":-0.356281,"scoreMeanAvg":-0.146866,"scoreStdevAvg":8.49794,"shorttermWinlossErrorAvg":0.247694,"shorttermScoreErrorAvg":1.40956,"ownership":[-54,-55,-52,-37,61,79,77,57,33,24,34,56,89,95,86,27,-22,-91,-94,-54,-57,-50,-52,43,88,62,87,13,25,32,55,95,92,94,93,-95,-94,-94,-23,-59,-57,98,98,98,-7,-21,-10,3,19,35,90,92,-95,-95,-94,-94,-94,76,-59,97,96,98,98,-98,-99,-37,-1,20,23,90,-95,-95,65,66,-93,-93,76,98,97,98,98,89,89,-99,25,16,28,2,3,95,95,52,55,61,-20,42,-27,-98,2,27,96,-60,-99,-99,77,47,94,95,80,81,56,59,37,25,-26,-35,-97,-99,-100,-100,-100,-100,2,-4,26,37,51,62,67,68,73,58,52,-62,-99,-99,91,-99,91,-36,-99,-70,2,12,30,39,54,68,76,98,83,77,-95,-99,91,91,91,91,12,-99,97,42,23,25,33,47,73,94,94,97,81,-96,90,90,50,27,49,84,97,97,96,34,20,22,54,81,-96,97,97,36,-95,-96,17,11,-17,-14,95,39,-19,38,15,2,5,-7,-95,-95,-95,-95,18,-94,-94,-97,10,-89,-9,-54,53,7,10,3,-7,-8,-15,-40,-89,-74,-80,-75,-94,-94,-93,-98,-65,-29,-17,-4,1,-2,-3,-7,-7,-16,-58,-96,-74,-82,-71,-95,-94,-90,-90,-61,-36,-32,-24,-12,-11,-4,-6,3,-20,-96,-96,-96,-83,-78,-96,-95,-90,-99,-70,-53,-41,-34,-37,-28,-11,-17,16,8,-25,94,-7,-92,-53,-97,-99,-99,-97,-99,-81,-95,-73,-98,-97,16,-49,97,97,78,96,-28,-4,-31,-98,-98,-97,-96,-94,-91,-85,-92,-98,95,95,96,89,86,90,87,91,-10,20,-98,-97,-96,-96,-95,-93,-97,-96,95,95,93,93,92,90,89,87,74,63,24,-97,-97,-96,-95,-94,-91,-81,-15,10,81,91,92,92,90,88,83,74,61,50],"ownershipAllowedMAE":0.0370984})%"); + lines.push_back(R"%({"sample":{"board":".XOO..O....O....O../X.XO..OXXXOOXXXO.O./.XXO..OXOOX.OX.XOO./XXO.O.XXOOOOOX.XOXO/.XXO..XOOXX.OOXXXXX/XOO.OOXXXXXOOXOOX../XXOO..OX.OXXOXXOOX./.XOXOOOX.OOXOX.OOXX/.OOXXXXXOOXXOOO..OO/..OXO.XOOXXXO..OOO./.OXX.XO.OXOOO.OXXO./.OOXXO.O.XXXXO.OXO./.O.OXOO.OOOX.XO.XOO/O.OOOOXXXXOX.XOX.XO/OOXXOOOOX.XXX.XXXXO/..OXXX.OOX.....O.XX/OOOOX.XXX......XO../XXOXX.........X.X../.XX............X.../","hintLoc":"null","initialTurnNumber":261,"metadata":"E9458F4FAC3E3F7FA4327781580CA903:271","moveLocs":["T17","F15","D16","F16","F17","P19","Q19","N19","J8","H19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.15,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui0button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0,0,0.000694,0.000695,0,0,0.00071,0.129,0.0154,0,0,0,0,0,0,0.00687,0.000731,0,0,0,0,0.000694,0.00069,0,0,0,0,0,0,0,0,0,0,0.000166,0,0.000677,0,0,0,0,0.00188,0,0,0,0,0,0,0.0474,0,0,0.000713,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000711,0,0,0,0,0,0,0,0,0.023,0,0,0,0,0,0,0.0225,0,0,0,0,0,0,0,0,0,0,0.000911,0,0,0,0,0,0,0,0,0,0,0,0,0,0.016,0.000717,0,0,0,0,0.00709,0.00614,0,0,0.0218,0,0,0,0,0,0,0,0,0,0.0159,0.00636,0,0,0,0,0,0,0,0.0221,0,0,0,0,0,0.00459,0,0,0,0,0.268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000965,0.000892,0,0,0.00385,0.00162,0,0,0,0.00105,0,0,0,0,0,0,0,0.000756,0.00691,0,0,0,0.000691,0.000719,0,0,0,0.00124,0,0,0.000731,0,0,0,0,0,0.00663,0,0,0,0,0.000689,0.000699,0,0,0,0,0,0.000841,0,0,0,0,0,0,0,0.21,0,0,0,0.000686,0.00079,0,0.000815,0,0,0,0,0.0351,0,0,0,0,0.000715,0,0,0.000181,0,0,0,0,0.000875,0,0,0,0,0,0,0,0,0,0,0.000721,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000704,0,0,0,0,0,0.00622,0.00698,0,0,0,0,0.0229,0,0,0,0.000705,0.000679,0.000683,0.000717,0.00069,0,0.000704,0,0,0,0,0,0,0,0.00072,0,0,0,0.000703,0.000699,0.00069,0.000698,0.000705,0.00729,0,0,0.000715,0.000688,0,0,0,0,0,0.00071,0.000688,0.000697,0.000697,0.000699,0.000696,0.000698,0.000696,0.000731,0,0,0,0.000752,0.000693,0,0,0,0.0158,0.000847,0.0007,0.000684,0.000688,0.000683,0.000685,0.000687,0.000687,0.000694,0.000702,0.000711,0,0.000726,0.000702,0.000704,0.0116],"winrateAvg":8.60525e-05,"leadAvg":-14.4842,"scoreMeanAvg":-14.534,"scoreStdevAvg":0.743344,"shorttermWinlossErrorAvg":0.00367853,"shorttermScoreErrorAvg":0.362393,"ownership":[-100,-100,100,100,100,100,100,-100,-100,-71,-17,100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,100,100,100,100,100,-100,-100,-100,100,100,100,-100,-100,100,100,100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,100,-100,100,-100,-100,-100,100,59,-100,-100,100,100,-100,-100,53,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-75,100,-100,-100,100,100,100,100,100,-100,-100,39,-100,100,-100,100,100,100,-100,72,100,100,-100,100,100,100,100,100,-100,-100,86,100,100,-100,-100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,100,-100,-100,100,100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,100,100,100,100,100,100,-100,100,100,75,100,100,100,-100,-100,-100,100,-98,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,100,-100,-100,-100,100,100,100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-28,100,100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0124224})%"); + lines.push_back(R"%({"sample":{"board":".................../..OOOO.......O...../.XXOX...O.X..OXXXO./...XX.O......OOXOO./...X....OO..XOOOXO./.......XX.X.XXXOXO./........OX...OOXXX./.XXXO....XO....XX../XXOO..X.X.O..O.X.../..XO.O............./XXX....X.O...O..XX./OOOO..X......OXXOX./...X.X.......O..OO./OXX..........OXX.../.OX.......X....XO../.OXOX.O.....O..XO../..OXX.......XX.OXO./..OO...........XXO./.................O./","hintLoc":"null","initialTurnNumber":127,"metadata":"251C52AF31061998B6AF270FB295470D:137","moveLocs":["E2","D9","E8","E9","M4","E7","F15","K4","K6","M6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.17,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui0button1","komi":12.5,"policyOptimism":0.816,"pda":0.0,"policyMixture":[2.09e-05,2e-05,1.89e-05,1.95e-05,1.97e-05,1.99e-05,2.02e-05,2.05e-05,2.22e-05,2.22e-05,2.23e-05,2.21e-05,2.18e-05,2.21e-05,2.25e-05,2.38e-05,2.2e-05,2.28e-05,2.04e-05,2.06e-05,2.32e-05,0,0,0,0,2.08e-05,2.18e-05,2.2e-05,2.37e-05,2.41e-05,2.36e-05,2.33e-05,0,9.17e-05,2.47e-05,6.77e-05,2.5e-05,2.24e-05,2.11e-05,0,0,0,0,2.37e-05,2.21e-05,2.18e-05,0,2.32e-05,0,3.59e-05,2.1e-05,0,0,0,0,0,2.05e-05,2.06e-05,2.52e-05,2.68e-05,0,0,2.21e-05,0,2.3e-05,2.15e-05,2.12e-05,3.36e-05,0.00125,2.57e-05,0,0,0,0,0,1.86e-05,2.07e-05,2.33e-05,2.25e-05,0,2.45e-05,0,2.16e-05,2.7e-05,0,0,0.0945,4.86e-05,0,0,0,0,0,0,1.83e-05,1.95e-05,2.16e-05,2.56e-05,4.19e-05,0.000493,4.05e-05,3.77e-05,0,0,0.000344,0,4.24e-05,0,0,0,0,0,0,2.08e-05,1.89e-05,1.9e-05,1.95e-05,2.14e-05,2.7e-05,0.00216,0.000226,2.69e-05,0,0,6.72e-05,6.7e-05,0.000103,0,0,0,0,0,2.27e-05,1.77e-05,0,0,0,0,2.19e-05,2.72e-05,2.45e-05,2.17e-05,0,0,2.74e-05,3.24e-05,2.44e-05,2.22e-05,0,0,1.89e-05,2.28e-05,0,0,0,0,1.97e-05,2.24e-05,0,2.41e-05,0,4.81e-05,0,2.46e-05,2.77e-05,0,4.04e-05,0,1.8e-05,2.18e-05,2.04e-05,1.99e-05,1.97e-05,0,0,1.99e-05,0,2.41e-05,0.000104,0.000224,2.81e-05,2.88e-05,2.98e-05,2.92e-05,2.42e-05,0.000945,0.000134,2.58e-05,2.04e-05,1.92e-05,0,0,0,0,0,4.37e-05,2.23e-05,0,3.61e-05,0,5.49e-05,7.16e-05,2.49e-05,0,0.00204,6.95e-05,0,0,1.87e-05,0,0,0,0,0,6.49e-05,0,2.72e-05,0.000146,0.000101,0.000494,0.000228,2.45e-05,0,0,0,0,0,2.23e-05,5.4e-05,1.72e-05,1.8e-05,0,0,0,2.44e-05,0.000111,0.000151,0.000201,0.0169,0.177,2.18e-05,0,0.000173,0.000151,0,0,2.13e-05,0,0,0,1.97e-05,1.99e-05,2.34e-05,4.73e-05,0.000151,0.000107,0,0.674,0,0.000197,0,0,0,2.35e-05,1.97e-05,2e-05,2.67e-05,0,0,2.85e-05,0.000124,2.48e-05,2.74e-05,0.000199,0.000216,0.000206,0,2.7e-05,0.000127,0.000884,2.08e-05,0,0,2.12e-05,2.01e-05,1.95e-05,0,0,0,0,2.95e-05,0,7.87e-05,0.000389,0,9.03e-05,0,0,0.00377,3.85e-05,0,0,2.02e-05,2.06e-05,2.33e-05,2.48e-05,0,0,0,0.000417,0.00013,0.000297,0.000398,0.000604,0.000234,0.0123,0,0,0.000235,0,0,0,1.9e-05,2.26e-05,2.58e-05,0,0,0,3.03e-05,0.000114,0.000126,0.000271,0.000594,0.000346,3.53e-05,2.56e-05,2.73e-05,0.000473,0,0,0,2.1e-05,2.03e-05,1.89e-05,1.84e-05,1.92e-05,2e-05,2.23e-05,2.43e-05,2.7e-05,2.61e-05,2.64e-05,2.49e-05,2.32e-05,2.27e-05,2.41e-05,2.4e-05,3.16e-05,2.73e-05,0,1.85e-05,1.66e-05],"winrateAvg":0.0797325,"leadAvg":-3.91606,"scoreMeanAvg":-4.73694,"scoreStdevAvg":8.92205,"shorttermWinlossErrorAvg":0.116028,"shorttermScoreErrorAvg":1.35508,"ownership":[20,49,73,92,95,95,91,73,49,23,8,12,34,64,89,92,92,91,88,-42,47,98,98,98,98,92,88,51,25,0,17,37,97,94,93,90,87,89,-52,-94,-94,98,-97,-1,84,86,95,11,-34,2,-1,98,90,90,88,93,85,-77,-86,-94,-98,-98,38,97,70,69,32,5,-10,-50,98,98,91,93,92,68,-88,-91,-94,-98,10,89,21,-2,91,91,33,-35,-94,98,98,98,-99,92,37,-94,-94,-88,-24,13,-24,-11,-70,-71,1,-93,-61,-93,-93,-93,98,-99,93,-17,-97,-94,-78,-33,-26,-25,-29,-51,-43,-98,-45,-25,-31,52,54,-100,-99,-99,-40,-99,-100,-100,-100,-13,-42,-49,-57,-79,-98,83,3,9,31,-24,-99,-99,-96,-93,-100,-100,-35,-36,-42,-53,-95,-69,-98,-6,85,49,46,88,5,-99,-92,-95,-95,-100,-100,-100,-37,-72,-40,-66,-60,-15,-16,52,64,63,61,22,-40,-79,-96,-96,-100,-100,-100,-100,-100,-69,-79,-98,-19,80,65,73,74,96,44,-68,-99,-99,-93,1,2,1,4,5,-71,-99,-45,-5,25,63,67,67,96,-98,-98,95,-99,-58,6,-33,-84,-100,-100,-99,-50,-10,1,41,64,70,37,96,-11,-66,95,96,-40,68,-99,-99,-89,-60,-37,-15,-7,10,81,72,-72,9,95,-99,-99,-5,86,56,67,95,-99,-93,-32,-20,-3,-9,-9,-4,-80,-66,-6,-14,-52,-99,96,94,88,89,95,-99,-86,-88,-3,54,1,-21,-87,-38,18,19,-24,-65,-99,96,97,96,94,95,98,-89,-87,-15,3,3,-24,-37,-29,-20,-97,-98,-94,-88,-93,97,97,94,96,98,98,98,17,24,10,-8,-29,-30,-45,-67,-82,-30,-91,-91,96,97,95,95,96,92,74,55,32,13,-6,-19,-29,-42,-60,-55,-19,14,51,97,96],"ownershipAllowedMAE":0.0432481,"maxHistory":0})%"); + lines.push_back(R"%({"sample":{"board":"......X..O...XXO.O./....XX.XO.OOOXOOOXX/...X..XOO.OXXXXXO../.O.XXX....OOO.XOOOO/........X.XOX.XXXXX/..O.X.....XOOX.XOO./........XX.XXX.OXO./..OOOX.OXO.XOXO.XO./...XO.XXO..OOOO.OO./.O.XXX..O.O....XXX./..OO..XO...XOX...../......XO.X..X..O.../.OXXOO.O..O.XXXXX../.O.XXO......OOOX.O./.XX.......O.O..X.../...OOOO.O.OXOX.O.O./..XXOXXO.OX.XXO..../...XX.XXOXXX.XO..../.....XXOO.....XO.../","hintLoc":"null","initialTurnNumber":182,"metadata":"AA05C8C65BB530924A34BDEB4D4FBA0F:192","moveLocs":["O1","R2","R5","S5","M7","L6","K9","S7","S8","B17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.05,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":5.0,"policyOptimism":0.474,"pda":0.0,"policyMixture":[4.03e-06,9.98e-06,1.03e-05,6.23e-06,4.17e-06,3.5e-06,0,5.26e-06,4.24e-06,0,5.19e-06,1.13e-05,0.000381,0,0,0,0,0,0.0166,5.73e-06,1.83e-05,0.16,7.01e-06,0,0,3.99e-06,0,0,4.86e-06,0,0,0,0,0,0,0,0,0,4.12e-06,0,9.18e-06,0,3.75e-06,3.75e-06,0,0,0,7.12e-06,0,0,0,0,0,0,0,8.1e-06,1.66e-05,3.91e-06,0,7.37e-06,0,0,0,7.9e-06,0.000431,8.3e-06,0.00347,0,0,0,6e-06,0,0,0,0,0,4.09e-06,1.07e-05,0.274,6.87e-06,5.07e-06,4.87e-06,7.24e-06,1.34e-05,0,8.12e-06,0,0,0,1.59e-05,0,0,0,0,0,4.06e-06,7.1e-06,0,0.000348,0,5.79e-06,6.3e-06,6.41e-06,4.91e-06,4.59e-06,0,0,0,0,4.63e-06,0,0,0,9.86e-06,3.97e-06,8.71e-06,0.000187,1.84e-05,5.24e-05,1.11e-05,6.64e-06,5.84e-06,0,0,1.21e-05,0,0,0,0.000243,0,0,0,4.54e-06,4.2e-06,8.39e-06,0,0,0,0,5.93e-06,0,0,0,0.274,0,0,0,0,9.1e-06,0,0,4.45e-06,4.77e-06,3.11e-05,0.0018,0,0,1.35e-05,0,0,0,0.000434,0.000114,0,0,0,0,0.000148,0,0,1.51e-05,5.86e-06,0,9.36e-05,0,0,0,5.75e-06,0.0156,0,0.000109,0,7.95e-06,0.000987,5.63e-06,1.88e-05,0,0,0,3.98e-05,1.09e-05,1.59e-05,0,0,1.66e-05,4.9e-06,0,0,5.2e-06,0,2.07e-05,0,0,0,8.98e-06,6.75e-06,5.82e-06,6.3e-06,2.31e-05,1.31e-05,0.00184,2.38e-05,1.4e-05,0.000101,8.15e-06,0,0,5.11e-06,0,6.39e-05,1.12e-05,0,3.48e-06,8.92e-06,0,1.19e-05,0,0.000241,1.24e-05,0,0,0,0,0,0.000564,0,0.000191,0.0294,0,0,0,0,0,0,0,0,1.22e-05,0.000297,0,6.76e-05,0,0,0,1.15e-05,7.41e-06,1.78e-05,6.05e-06,0,0.000156,0,0,0,0,4.76e-06,0,4.87e-06,0.000279,0,0,5.66e-06,7.87e-06,1.53e-05,8.86e-06,1.31e-05,9.79e-06,6.4e-06,0,7.32e-05,0,6.24e-06,0.00368,0,0,0,3.84e-06,4.31e-06,7.07e-06,6.48e-05,0,0,0,0,1.27e-05,0,1.56e-05,0,0,0,0,0.00054,0,0.154,0,3.85e-06,5.13e-06,6.3e-06,0,0,0,0,0,0,0,0,0,4.44e-06,0,0,0,1.13e-05,6.9e-06,7.09e-06,3.88e-06,4.12e-06,5.22e-06,3.91e-06,0,0,3.9e-06,0,0,0,0,0,0,2.86e-06,0,0,3.61e-05,0,6.93e-06,3.96e-06,3.32e-06,3.77e-06,3.7e-06,4.52e-06,4.55e-06,0,0,0,0,0.0579,3.02e-06,3.89e-06,4.64e-06,0,0,0,0.000257,5.17e-06,3.47e-06,5.88e-06],"winrateAvg":0.0919301,"leadAvg":-2.20775,"scoreMeanAvg":-2.64624,"scoreStdevAvg":5.05278,"shorttermWinlossErrorAvg":0.116058,"shorttermScoreErrorAvg":0.898952,"ownership":[27,-6,-24,-72,-90,-95,-96,-2,49,98,96,90,-21,-99,-99,47,-10,7,-25,55,34,-46,-75,-100,-100,-93,-93,98,98,99,99,98,-99,51,49,51,-54,-58,75,98,-16,-100,-99,-99,-99,99,99,96,99,-98,-99,-100,-100,-99,48,5,5,93,98,11,-100,-100,-100,-70,-45,74,23,99,99,99,-5,-100,51,47,49,50,97,97,-49,-24,-56,-80,-83,-70,-97,10,-98,99,3,5,-100,-100,-100,-99,-99,97,97,97,-31,-94,-86,-90,-94,-92,-62,-99,99,99,-100,-88,-100,98,98,7,96,95,62,19,22,-84,-95,-98,-100,-100,-99,-100,-100,-100,-3,94,94,98,65,96,97,99,98,98,-98,-97,-96,-100,23,-67,-99,99,-99,99,95,95,98,82,96,94,-30,-98,98,-3,-99,-99,99,24,31,99,99,99,99,28,98,98,43,96,99,26,-98,-98,-98,-83,10,99,55,96,40,52,31,-8,-98,-98,-98,-9,94,96,99,99,11,-13,-96,99,59,-94,-37,-96,51,-96,-90,-96,-95,-90,-79,91,89,72,48,-36,6,-95,99,4,-93,-20,-85,-100,-96,-97,-92,-94,-95,-20,73,90,-96,-97,99,99,-20,99,-8,-64,99,-99,-100,-100,-100,-100,-99,98,38,-19,90,-57,-97,-96,99,94,95,91,94,99,16,96,97,96,-100,-28,98,89,-47,-98,-98,-24,-18,62,95,96,94,95,99,77,96,7,-6,-99,-99,98,96,-91,-94,65,99,99,99,99,97,99,97,99,-78,97,-99,-28,89,-76,98,97,-96,-97,-100,-100,99,-93,-91,98,98,98,-99,-78,-99,-99,97,90,97,98,98,-97,-98,-98,-99,-99,-91,-91,-90,98,-99,-99,-99,-99,-99,96,93,99,97,97,-97,-98,-98,-97,-93,-92,-91,94,95,-77,-97,-98,-98,-99,-99,92,93,96,96],"ownershipAllowedMAE":0.0430217})%"); + lines.push_back(R"%({"sample":{"board":".................../....OX............./.OO.OX.XO.....X..../.XOOOOX.X.......X../...X.X............./.XX.XX............./.OX.O...........X../.X.O.......O.OO..../.OO.......XO.XO.OO./..XO.....OOO.XXO.../..XO....OXXOX.OXX../.XOXO..OXXOX..O..../X..X.O.OX.O...OX.X./OXX.O.OOXO.O..O.X../.OO.OOXXOXXX...XOXX/.XOOOXX......OOO.O./.XXXOX......XO..O../....XOX....X.XOO.../............X....../","hintLoc":"null","initialTurnNumber":113,"metadata":"98F9295876B88CD0D0ED22A247B2E132:123","moveLocs":["J4","K17","N17","H18","E19","H15","G15","D19","H14","F19"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":2.5,"policyOptimism":0.179,"pda":-2.294,"policyMixture":[3.19e-06,3.48e-06,3.68e-06,0,0,0,0.00242,6.3e-06,5.9e-06,5.22e-06,4.98e-06,5.58e-06,5.55e-06,4.67e-06,4.8e-06,4.35e-06,4.12e-06,4.45e-06,3.29e-06,3.89e-06,4.02e-06,3.57e-06,3.81e-06,0,0,0.000124,0,9.64e-05,2.17e-05,0.00392,0.00161,1.16e-05,9.39e-06,6.59e-06,6.58e-06,6.53e-06,5.89e-06,4.58e-06,5.04e-06,0,0,3.21e-06,0,0,0.000387,0,0,0,7.81e-05,3.46e-05,0,6.23e-06,0,8.76e-06,9.57e-06,1.04e-05,4.63e-06,1.48e-05,0,0,0,0,0,0,5.4e-06,0,0.000232,4.88e-05,1.82e-05,9.51e-06,1.16e-05,2.03e-05,3.53e-05,0,4.95e-05,6.71e-06,4.86e-06,5.59e-06,7.67e-06,0,3.83e-06,0,0,0,4.04e-05,2.27e-05,6.5e-05,3.15e-05,9.65e-05,0.000156,0.00112,0.00434,0.000744,0.0666,6.97e-06,3.71e-06,0,0,3.26e-06,0,0,4.15e-06,0,0.000216,0.00703,2.82e-05,1.72e-05,2.93e-05,0.000213,0.0534,0.0227,0.000155,0.413,7.82e-06,4.73e-06,0,0,1.33e-05,0,0.0517,0.000111,4.88e-05,0.000902,5.38e-05,1.59e-05,8.39e-06,2.63e-05,7.68e-06,2e-05,1.13e-05,0,0.0037,1.02e-05,4.63e-06,0,6.15e-06,0,6.23e-06,0.000147,0.201,0.0677,7.82e-05,8.06e-06,6.03e-06,0,6.15e-06,0,0,1.6e-05,4.8e-06,1.34e-05,5.01e-06,4.67e-06,0,0,4.18e-06,0.000408,6.72e-06,0.000695,2.74e-05,1.18e-05,6.06e-06,0,0,4.4e-06,0,0,8.79e-06,0,0,4.24e-06,1.05e-05,0.00023,0,0,7.55e-06,5.55e-06,5.95e-06,7.38e-06,0.000136,0,0,0,3.92e-06,0,0,0,0.0301,0.0062,7.38e-06,4.71e-05,3.89e-05,0,0,7.25e-06,4.67e-06,4.43e-06,2.99e-05,0,0,0,0,0,4.25e-06,0,0,0,2.1e-05,3.25e-05,3.83e-06,0,0,0,0,5.15e-06,3.96e-06,0,0,0,0,0,0.000414,5.32e-06,0,0.00232,7.49e-06,5.34e-06,6.38e-06,0,3.31e-06,1.34e-05,0,5.98e-06,0,3.64e-06,0,0,3.61e-06,0,0.00333,3.9e-05,9.08e-06,0,0,3.65e-06,0,4.2e-06,0,0,0,4.51e-06,0,0,0,0,0,0,0.000167,0,0.00208,4.31e-05,0,0.000641,0,3.46e-06,3.96e-06,0.0461,0,0,3.4e-06,0,0,0,0,4.33e-06,0,0,0,0.00155,1.34e-05,4.42e-06,0,0,0,0,4.97e-06,0,0,0,0,0,0,3.48e-06,0,3.46e-06,3.64e-06,4.36e-06,6.74e-06,0,0,0,0.000101,0,1.75e-05,3.54e-06,0,0,0,0,0,3.5e-06,3.5e-06,3.43e-06,3.48e-06,3.63e-06,3.85e-06,0,0,3.47e-06,3.69e-06,0,9.51e-06,4.37e-06,3.83e-06,4.33e-06,4.66e-06,4.35e-06,0,0,0,3.5e-06,3.57e-06,3.56e-06,3.64e-06,0,3.93e-06,0,0,0,3.92e-06,4.84e-06,4.04e-06,3.27e-06,4.11e-06,4.11e-06,4.26e-06,4.13e-06,4.62e-06,3.54e-06,3.34e-06,3.28e-06,3.24e-06,3.38e-06,3.49e-06,0,4.35e-06,4.37e-06,3.82e-06,3.54e-06,3.55e-06,3.23e-06,7.01e-06],"winrateAvg":0.339304,"leadAvg":-0.528381,"scoreMeanAvg":-1.06381,"scoreStdevAvg":8.00679,"shorttermWinlossErrorAvg":0.235168,"shorttermScoreErrorAvg":1.25054,"ownership":[83,92,95,97,88,89,77,82,70,52,27,-8,-32,-60,-70,-76,-76,-75,-74,77,83,95,96,99,-77,42,90,83,56,18,3,-55,-64,-79,-82,-79,-74,-72,47,99,99,98,99,-76,-73,-88,92,92,29,-14,-89,-56,-96,-78,-79,-77,-69,0,-22,99,99,99,99,-97,-50,-59,11,9,-6,-19,-12,-39,-51,-96,-64,-64,-41,-12,-43,-95,-12,-97,-97,10,2,13,7,2,-4,-2,-12,-32,-44,-62,-53,-72,-95,-96,-74,-97,-97,-60,-77,-18,-6,8,10,9,10,-3,-7,-33,-49,-25,-78,-69,-96,1,78,-43,-17,-3,-8,3,12,30,14,34,24,3,-66,-13,11,-27,-76,39,94,51,24,6,3,6,19,40,99,56,99,99,36,24,26,51,50,94,95,86,37,38,33,27,26,43,8,100,95,89,99,90,98,98,62,29,28,-68,95,59,55,45,46,38,99,99,100,93,88,88,94,-36,-32,22,-48,-42,-83,95,88,72,62,61,83,-97,-96,99,88,93,99,-87,-88,-52,-24,-81,-95,-83,-95,97,84,78,99,-97,-97,90,85,90,92,99,71,-77,-84,-47,-95,-94,-93,-95,7,99,92,99,-97,-6,90,88,85,83,99,-39,-42,-89,-79,0,-96,-96,3,99,98,99,99,-98,-3,-64,92,19,49,99,49,-83,-85,-85,9,98,98,60,99,99,-100,-100,-98,-100,-100,-100,-33,18,53,-2,29,-87,-86,14,-93,99,99,99,-100,-100,-99,-100,-98,-96,-92,54,100,100,100,24,79,-21,-6,-92,-92,-93,99,-100,-99,-99,-99,-98,-96,-93,-96,100,99,98,99,64,55,-23,-32,-90,-88,-96,-96,-100,-99,-99,-99,-98,-99,-94,-95,100,100,93,85,73,-44,-73,-85,-92,-94,-97,-98,-99,-99,-98,-98,-97,-97,-12,60,95,95,89,83],"ownershipAllowedMAE":0.0357459})%"); + lines.push_back(R"%({"sample":{"board":"..X...........X..../.X.XO......XOOOX.../..XO.O.O.O...OX..../..XO...X.O.X.O.X.../...O......X......../.XO....XX.XOO..X.X./.X....OO.XOX.O...../..........O..O.O.../.......XXOO..XO..../.......XOXO..X...../.....XX..XO......../....OOOXXXO...X.X../......XOOXO......../..O..OOOXOOO.X.X.../.....OXXXOOX...OO../...O..O.XXXX..XXX../.....X.OO......XOO./...O......OX..XXXO./................O../","hintLoc":"null","initialTurnNumber":24,"metadata":"2411F0651D8FDC6B7DAC823DF5C27BC4:34","moveLocs":["J12","D10","G15","C12","C13","D13","C11","B12","D11","J13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":11.0,"policyOptimism":0.0,"pda":-0.996,"policyMixture":[1.58e-05,1.6e-05,0,1.75e-05,1.87e-05,1.68e-05,2.81e-05,1.72e-05,1.82e-05,1.7e-05,1.92e-05,1.71e-05,2.23e-05,1.86e-05,0,1.67e-05,1.6e-05,1.6e-05,1.54e-05,1.57e-05,0,1.52e-05,0,0,4.06e-05,0.000363,0.000297,0.000138,0.000181,5.09e-05,0,0,0,0,0,1.6e-05,1.63e-05,1.63e-05,1.59e-05,1.59e-05,0,0,2.62e-05,0,0.000698,0,0.00229,0,8.84e-05,5.81e-05,1.63e-05,0,0,1.59e-05,1.62e-05,1.57e-05,1.6e-05,1.57e-05,1.66e-05,0,0,3.56e-05,3.14e-05,1.84e-05,0,9.88e-05,0,1.83e-05,0,3.78e-05,0,1.72e-05,0,1.7e-05,1.64e-05,1.63e-05,1.65e-05,1.63e-05,3.35e-05,0,2.24e-05,2.66e-05,0,1.54e-05,1.56e-05,2.15e-05,0,1.55e-05,0.000228,0.000333,7.98e-05,1.59e-05,1.61e-05,1.64e-05,1.62e-05,1.57e-05,0,0,5.25e-05,0.000208,0.00116,5.62e-05,0,0,8.64e-05,0,0,0,0.000137,8.15e-05,0,1.63e-05,0,1.57e-05,1.55e-05,0,0,0,0.000241,0.00106,0,0,0,0,0,0,2.04e-05,0,9.3e-05,1.49e-05,1.65e-05,1.58e-05,1.62e-05,1.59e-05,0,0,0.00897,0.000358,0.000472,5.23e-05,1.91e-05,0,0.977,0,0.000114,0.000119,0,4.55e-05,0,1.61e-05,1.64e-05,1.58e-05,1.61e-05,1.91e-05,0,0,0.000149,3.56e-05,1.74e-05,0,0,0,0,0.000135,0.000545,0,0,1.53e-05,3.12e-05,1.65e-05,1.57e-05,1.59e-05,1.63e-05,2.72e-05,0,6.71e-05,1.66e-05,1.66e-05,0,0,0,0,1.5e-05,3.86e-05,0,1.66e-05,1.65e-05,1.74e-05,1.7e-05,1.55e-05,1.58e-05,1.54e-05,1.55e-05,3.68e-05,3.29e-05,0,0,1.61e-05,1.75e-05,0,0,1.53e-05,1.52e-05,1.62e-05,1.59e-05,1.59e-05,1.64e-05,1.68e-05,1.58e-05,1.54e-05,1.57e-05,1.65e-05,1.66e-05,0,0,0,0,0,0,0,1.51e-05,1.57e-05,1.62e-05,0,1.69e-05,0,1.63e-05,1.58e-05,1.6e-05,1.6e-05,1.65e-05,1.65e-05,1.81e-05,1.71e-05,0,0,0,0,0,1.45e-05,1.54e-05,1.64e-05,1.6e-05,1.65e-05,1.61e-05,1.62e-05,1.57e-05,1.57e-05,1.58e-05,0,1.65e-05,1.67e-05,0,0,0,0,0,0,0,1.62e-05,0,1.61e-05,0,1.62e-05,1.7e-05,1.57e-05,1.55e-05,1.6e-05,1.6e-05,1.6e-05,1.67e-05,0,0,0,0,0,0,0,1.64e-05,1.59e-05,1.63e-05,0,0,1.65e-05,1.53e-05,1.49e-05,1.56e-05,1.56e-05,0,1.62e-05,7.99e-05,0,1.6e-05,0,0,0,0,1.63e-05,1.61e-05,0,0,0,1.57e-05,1.55e-05,1.46e-05,1.51e-05,8.79e-05,9.07e-05,1.7e-05,0,5.06e-05,0,0,1.64e-05,1.62e-05,1.5e-05,1.56e-05,1.54e-05,1.51e-05,0,0,0,1.53e-05,1.55e-05,1.5e-05,1.51e-05,0,1.65e-05,1.6e-05,1.81e-05,1.66e-05,1.64e-05,2.43e-05,0,0,1.58e-05,1.6e-05,0,0,0,0,1.51e-05,1.45e-05,1.54e-05,1.52e-05,1.57e-05,1.49e-05,1.64e-05,1.63e-05,1.66e-05,1.57e-05,1.57e-05,1.6e-05,1.59e-05,1.6e-05,1.59e-05,1.56e-05,1.59e-05,0,1.54e-05,1.43e-05,1.29e-05],"winrateAvg":0.793295,"leadAvg":2.61003,"scoreMeanAvg":3.82851,"scoreStdevAvg":11.3086,"shorttermWinlossErrorAvg":0.198487,"shorttermScoreErrorAvg":1.8848,"ownership":[-94,-93,-93,-24,24,67,68,72,64,52,23,26,59,66,-67,-69,-76,-77,-78,-94,-95,-91,-89,93,76,70,81,63,53,43,-28,94,94,94,-85,-76,-78,-80,-87,-94,-95,97,90,96,42,89,-2,86,-1,-19,25,94,-76,-75,-78,-80,-80,-75,-71,-95,97,38,6,0,-77,-20,85,-5,-79,20,94,38,-89,-81,-80,-78,-52,-43,-61,97,31,-8,-88,-66,-15,29,-92,-13,46,32,10,-46,-65,-73,-72,-13,-55,86,83,36,13,-21,-93,-93,-93,-93,97,97,35,-25,-85,-47,-84,-45,42,-51,-48,95,33,18,52,52,44,-95,98,92,96,98,5,16,13,3,-19,40,85,89,82,-4,-9,-7,-44,-98,-93,98,94,82,98,86,95,53,-5,4,13,-33,-80,-82,-70,-41,-39,-97,-97,98,97,7,-20,-70,90,40,0,4,1,-1,-1,-6,55,10,-46,-64,-97,-94,-94,97,24,-30,-69,17,15,4,-19,-13,12,18,19,21,-2,-93,-95,-94,-94,-94,97,32,-3,-36,-29,4,-29,-43,-40,30,39,40,46,98,99,99,-94,-94,-94,97,37,3,-37,-91,-45,-93,-74,-59,54,61,56,67,74,97,97,99,99,-93,97,54,9,-16,-65,-79,-83,-80,-73,67,84,97,80,84,99,99,99,-99,97,97,97,49,-94,-80,-95,-86,-80,-77,81,89,90,89,90,99,-98,-98,-98,98,97,-98,-37,-63,-87,-77,-77,-84,-83,86,91,93,99,91,80,80,-24,-99,-99,-99,-99,-71,-75,-100,-100,-100,-90,-87,90,92,92,93,91,73,76,83,84,-10,-61,-74,-82,-86,-95,-100,-88,-87,-89,92,93,94,98,90,83,79,73,59,1,4,-89,-75,-88,-100,-100,-99,-88,-90,93,94,94,94,91,84,76,63,36,8,-36,-47,-76,-90,-95,-96,-90,-90,-90],"ownershipAllowedMAE":0.0358698})%"); + lines.push_back(R"%({"sample":{"board":".O...OX............/.XO.OOXO...OO....../.XXO..OX.O..XOO..../X.XO..OX.OXXXOXXX../.XOXXXX.XXOOOX...../.OOOX..XXX.OXX...../...XO.OX..XOO....../...O.O..XXXXO....../..OX...OOXOO..OOOX./.......XXO....OXXXX/..O...OOX....OXOOX./......OX.X...OX..../......XOX.....X..../.......OX........../......XOX...OX..X../...O.OOX....XO.X.../.......X.....X...../.................../.................../","hintLoc":"null","initialTurnNumber":147,"metadata":"A044E164790E3904215002B4117B4F0A:157","moveLocs":["J8","N11","N10","H8","O6","P4","J8","F16","H19","H8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.43,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.01e-06,0,2.92e-06,2.42e-06,2.51e-06,0,2.53e-06,0,2.83e-06,2.87e-06,2.79e-06,2.81e-06,2.75e-06,3.13e-06,4.19e-06,4.44e-06,3.93e-06,3.8e-06,3.01e-06,0.00225,0,0,2.3e-06,0,0,2.57e-06,0,2.78e-06,2.81e-06,2.74e-06,0,0,3.32e-06,4.8e-06,0.00591,0.000419,1.57e-05,4.02e-06,4.11e-06,0,0,0,2.7e-06,2.71e-06,0,0,2.8e-06,0,2.62e-06,3.04e-06,0,0,0,0.000237,1.59e-05,0.000205,3.87e-06,0,0,0,0,2.84e-06,0,0,0,3.14e-06,0,0,0,0,0,0,0,0,0.0141,4.48e-06,1.28e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,4.71e-06,3.91e-06,0.000226,0.0948,4.3e-06,0.0211,0,0,0,0,2.82e-06,3.42e-06,0,0,0,2.56e-06,0,0,0,4.29e-06,0.0334,0.0632,0.00516,4.04e-06,3.33e-06,2.66e-06,5.63e-06,0,0,3.64e-06,0,0,3.84e-06,3.7e-06,0,0,0,3.58e-06,3.91e-06,4.24e-06,0.0143,0.00349,3.58e-06,2.97e-06,3.34e-06,3.32e-06,0,3.73e-06,0,0.0996,6.8e-05,0,0,0,0,0,2.66e-06,3e-06,2.99e-06,4.03e-06,0.000158,3.78e-06,3.07e-06,3.07e-06,0,0,4.63e-06,8.66e-06,0.234,0,0,0,0,0,0,4.92e-06,0,0,0,0,3.05e-06,2.94e-06,3.13e-06,3.09e-06,4.83e-06,4.38e-06,5.28e-06,0.103,0,0,0,0.0244,0.000234,0,2.67e-06,0,0,0,0,0,3.19e-06,3.5e-06,0,4.42e-06,8.2e-06,3.94e-06,0,0,0,0.000718,0.0322,3.32e-06,2.67e-06,0,0,0,0,0,3.3e-06,3.19e-06,4.15e-06,4.54e-06,1.58e-05,0.00213,6.41e-06,0,0,0,0,3.61e-06,3.61e-06,3.04e-06,0,0,4.86e-06,0.000198,1.16e-05,3.26e-06,3.32e-06,4.88e-06,1.59e-05,0.0034,0.00202,0.000646,0,0,0,3.62e-06,3.82e-06,3.54e-06,3.48e-06,6.23e-06,0,0.00315,7.64e-05,4.66e-06,3e-06,3.49e-06,5.75e-06,0.000709,0.0118,0.0476,6.52e-05,1.52e-05,0,0,3.07e-06,3.59e-06,3.7e-06,3.82e-06,0,0.137,9.22e-06,9.28e-06,3.84e-06,3.03e-06,3.68e-06,1.32e-05,0.000218,1.51e-05,1.74e-05,1.07e-05,0,0,0,3.25e-06,3.59e-06,9.6e-06,0,0,3.77e-06,4.02e-06,0,4.77e-06,3.03e-06,3.69e-06,8.36e-06,3.16e-05,0,4.45e-06,0,0,0,2.87e-06,3.38e-06,3.64e-06,4.76e-06,0,0,0,0,3.47e-06,3.88e-06,2.92e-06,3.44e-06,5.85e-06,8.04e-05,3.1e-05,1e-05,4.26e-06,1.8e-05,0,3.33e-06,3.52e-06,3.42e-06,3.5e-06,3.71e-06,0,3e-06,3.12e-06,5.42e-06,3.65e-06,3.03e-06,3.46e-06,4.57e-06,6.84e-06,4.59e-05,0.00174,0.00104,0.0338,8.88e-05,4.91e-06,3.67e-06,3.52e-06,3.34e-06,3.44e-06,3.41e-06,4.5e-06,3.18e-06,3.95e-06,3.44e-06,3.66e-06,3.04e-06,3.57e-06,3.59e-06,3.88e-06,4.27e-06,4.31e-06,3.92e-06,3.82e-06,3.5e-06,3.3e-06,3.12e-06,2.94e-06,2.99e-06,2.98e-06,2.96e-06,2.92e-06,3.03e-06,3.45e-06,3.23e-06,1.44e-05],"winrateAvg":0.783342,"leadAvg":1.90948,"scoreMeanAvg":2.50796,"scoreStdevAvg":8.68533,"shorttermWinlossErrorAvg":0.247639,"shorttermScoreErrorAvg":2.15139,"ownership":[27,91,90,95,97,100,99,100,96,96,96,96,92,79,45,12,-18,-32,-38,11,6,96,95,100,100,94,100,92,95,96,99,99,91,64,4,-30,-40,-43,9,8,8,98,14,-57,94,-89,-29,99,96,96,92,96,96,-12,-51,-47,-46,9,18,12,97,-38,-95,90,-93,-13,98,93,93,93,96,-78,-79,-79,-55,-36,11,13,96,-94,-95,-95,-96,-92,-97,-97,99,99,99,-46,-40,-30,-22,-16,-26,77,95,95,95,-94,-28,-59,-97,-97,-97,-23,99,-46,-46,-3,13,1,-13,-15,81,85,93,89,92,41,77,-97,-95,-96,-97,99,99,29,31,20,12,-17,-18,78,82,81,95,73,94,46,-33,-97,-97,-97,-97,99,63,54,48,22,-25,-38,75,78,90,30,51,46,22,42,30,-97,75,82,80,89,99,99,99,-95,-70,67,69,51,55,38,34,-9,-94,-95,-18,-17,64,97,95,99,-94,-95,-95,-95,58,64,86,40,34,30,71,72,-96,-68,-3,17,52,98,-56,-49,-54,-95,-91,49,52,37,31,22,8,68,-76,-71,-97,-20,9,45,98,-53,-52,-77,-84,-86,42,44,36,28,8,-10,-78,-67,-98,-59,-9,8,33,44,-50,-17,-65,-81,-83,39,42,37,33,24,-15,-76,-67,-99,-48,-18,-4,-3,76,53,2,-33,-82,-84,37,45,47,37,13,8,-75,-68,-99,-50,-28,-17,11,-91,-6,-42,-99,-90,-87,35,34,49,89,43,79,75,-97,-81,-60,-53,-57,-98,-88,-100,-100,-95,-94,-90,32,34,39,49,26,32,-21,-97,-74,-71,-75,-82,-89,-100,-97,-96,-94,-94,-92,32,31,33,29,26,6,5,-53,-66,-71,-76,-82,-87,-95,-94,-96,-95,-94,-93,32,31,29,27,22,13,-7,-20,-50,-61,-72,-78,-85,-89,-92,-93,-94,-94,-94],"ownershipAllowedMAE":0.0466158})%"); + lines.push_back(R"%({"sample":{"board":"...............O.X./.........XXXXXXXO../........XOOOOOXXOO./...O.........XOOXX./.............X.OOXX/..............XO.X./...............OOOX/.................X./................OXX/................OX./................OX./...............OX../............O..OX../...........X.....O./...O...........OO../...........XOOOX.../..OX.......X.XX.X../.................../.................../","hintLoc":"null","initialTurnNumber":69,"metadata":"7EAC1E0F5AB638F09093F7B87ED88D95:79","moveLocs":["J16","K16","M15","K15","H17","J18","N15","F4","H16","C7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.65,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui1","komi":6.5,"policyOptimism":0.0,"pda":-1.602,"policyMixture":[1.55e-05,1.88e-05,1.82e-05,1.86e-05,1.9e-05,1.94e-05,2.03e-05,1.75e-05,1.66e-05,1.49e-05,1.4e-05,1.42e-05,1.41e-05,1.5e-05,1.56e-05,0,0.00278,0,2.61e-05,1.83e-05,2.3e-05,2.66e-05,3.11e-05,3.46e-05,3.32e-05,3.14e-05,2.84e-05,0,0,0,0,0,0,0,0,0,0.00121,0.0454,1.81e-05,2.81e-05,3.53e-05,3.5e-05,4.74e-05,5.03e-05,2.28e-05,0,0,0,0,0,0,0,0,0,0,0,0.00661,1.91e-05,3.48e-05,3.94e-05,0,3.22e-05,4.17e-05,2.05e-05,0,0,0,1.68e-05,1.56e-05,1.99e-05,0,0,0,0,0,0.000806,1.9e-05,4.05e-05,8.96e-05,3.42e-05,3.51e-05,3.57e-05,3.15e-05,2.25e-05,3.14e-05,0,2.1e-05,0,0,0,1.87e-05,0,0,0,0,1.9e-05,3.93e-05,0.000242,0.000124,4.72e-05,4.63e-05,4.71e-05,0.00013,0.00128,5.55e-05,6.88e-05,2.26e-05,4.3e-05,3.73e-05,0,0,0.00155,0,0,1.89e-05,4.21e-05,0.0003,0.000238,8.63e-05,8e-05,0.000175,0.000313,0.000327,0.00109,0.000311,0.000867,0.000155,0.000177,2.24e-05,0,0,0,0,1.87e-05,4.44e-05,0.000421,0.000365,0.000211,0.000215,0.000296,0.000414,0.000576,0.00186,0.00462,0.000434,7.21e-05,3.24e-05,2.07e-05,2.01e-05,0.00178,0,0,1.87e-05,4.41e-05,0.00063,0.00073,0.000294,0.00032,0.000397,0.000477,0.000651,0.0014,0.000415,9.01e-05,3.74e-05,2.89e-05,2.45e-05,2.03e-05,0,0,0,1.87e-05,4.39e-05,0.000972,0.000891,0.000318,0.000355,0.000423,0.000472,0.00048,0.000461,0.000226,5.38e-05,3.47e-05,2.7e-05,2.35e-05,1.7e-05,0,0,1.64e-05,1.91e-05,5.39e-05,0.00148,0.00102,0.000317,0.000317,0.000356,0.000399,0.0004,0.00037,0.000262,5.05e-05,3.25e-05,2.49e-05,2.24e-05,1.89e-05,0,0,0.0012,1.96e-05,4.51e-05,0.000286,0.00256,0.000331,0.000248,0.000259,0.000273,0.000275,0.00026,0.00488,4.58e-05,2.68e-05,2.31e-05,1.76e-05,0,0,4.89e-05,0.00113,1.9e-05,0.000136,0,0.0878,0.000496,0.000314,0.000168,0.000159,0.00012,7.58e-05,4.24e-05,0.000366,0,2.06e-05,1.82e-05,0,0,0.000158,4.84e-05,1.89e-05,0.00027,0.0629,5.32e-05,0.129,0.000342,0.000178,7.76e-05,5.05e-05,4.39e-05,3.33e-05,0,2.79e-05,2.16e-05,1.93e-05,1.68e-05,0.000306,0,2.34e-05,1.87e-05,7.07e-05,5.06e-05,0,4.25e-05,0.124,0.000155,6.29e-05,3.83e-05,3.29e-05,7.9e-05,3.07e-05,2.68e-05,1.77e-05,1.83e-05,0,0,1.9e-05,1.96e-05,1.82e-05,0.000112,0.167,0.131,0.000109,0,0.000174,3.85e-05,3.27e-05,2.97e-05,2.96e-05,0,0,0,0,0,0.000343,2.23e-05,2.05e-05,1.85e-05,2.83e-05,0,0,0.0293,6.06e-05,3.61e-05,3.63e-05,2.95e-05,2.8e-05,3.02e-05,0,0.000213,0,0,3.55e-05,0,6.33e-05,1.84e-05,1.69e-05,6.23e-05,0.116,0.0413,5.86e-05,3.67e-05,2.88e-05,2.6e-05,2.45e-05,2.49e-05,0.000128,3.04e-05,2.24e-05,1.91e-05,2.49e-05,0.000123,2.98e-05,2.79e-05,1.95e-05,1.43e-05,1.8e-05,2.06e-05,1.9e-05,1.84e-05,1.76e-05,1.76e-05,1.75e-05,1.75e-05,1.7e-05,1.78e-05,1.97e-05,1.98e-05,1.75e-05,1.7e-05,1.79e-05,1.79e-05,2.02e-05,1.58e-05,1.33e-05],"winrateAvg":0.17518,"leadAvg":-4.42396,"scoreMeanAvg":-6.00013,"scoreStdevAvg":14.2,"shorttermWinlossErrorAvg":0.103508,"shorttermScoreErrorAvg":1.33574,"ownership":[24,26,26,25,19,5,-14,-47,-72,-95,-98,-99,-99,-99,-97,-89,-86,-87,-82,24,24,29,29,25,14,-1,3,-99,-100,-100,-100,-100,-100,-100,-100,-71,-80,-73,22,26,33,41,34,24,26,75,-99,83,83,83,83,84,-100,-100,-73,-73,-74,19,21,35,81,31,23,27,75,75,2,38,62,60,45,91,91,-82,-83,-77,14,17,27,22,18,13,12,27,25,-3,37,87,87,42,66,91,91,-81,-82,8,6,2,12,8,8,9,5,28,26,32,47,50,54,32,91,62,-81,-79,2,2,7,6,6,6,6,7,10,14,18,29,40,47,47,90,90,87,-84,-3,-2,5,3,4,3,3,1,0,0,3,12,21,22,35,59,31,-83,-81,-9,-9,-7,-3,0,1,1,-1,-4,-5,-3,5,13,18,30,49,89,-82,-82,-13,-14,-14,-6,-2,-1,-1,-2,-5,-7,-6,1,10,18,25,49,89,-82,-65,-17,-17,-12,-7,-2,-1,-1,-2,-5,-7,-8,0,9,18,35,64,89,-82,-40,-18,-22,-16,-11,-3,-1,-2,-3,-4,-5,-1,2,8,27,42,91,-68,-66,-3,-13,-21,-53,1,3,2,-2,-4,-7,-8,-15,-22,65,34,51,91,-68,32,46,-1,0,7,13,3,5,-4,-8,-12,-16,-27,-78,-5,24,45,72,59,88,71,13,13,22,66,15,9,-20,-20,-22,-23,-29,-44,-19,31,66,91,91,69,62,23,26,24,23,-7,-70,-32,-32,-32,-34,-45,-93,71,71,73,-79,51,18,33,25,24,49,-63,-25,-38,-40,-39,-40,-42,-55,-93,17,-89,-89,-78,-86,7,-1,21,17,-4,-21,-33,-36,-40,-41,-45,-48,-59,-75,-80,-82,-84,-72,-67,-61,-23,16,9,2,-14,-25,-32,-36,-39,-42,-49,-59,-67,-74,-80,-79,-76,-69,-60,-47],"ownershipAllowedMAE":0.0278464,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":"................../.........O..OOXX../.....X..X...XXOX../..XX......O.OOOX../.O............OXX./...............OO./....X.X.........../..OOOX............/....XOO.........../..X.X............./.....O............/................../..O......X......../...............X../...O............../.....O........X.../................../................../","hintLoc":"null","initialTurnNumber":42,"metadata":"BC82F6146C08443261EF5600C074ABA7:52","moveLocs":["D7","C7","F7","B9","B10","D9","D10","C10","D8","B8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.83,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.94e-06,3.37e-06,3.3e-06,3.28e-06,3.3e-06,3.36e-06,3.49e-06,3.42e-06,3.28e-06,3.52e-06,3.7e-06,3.89e-06,4.39e-06,4.39e-06,3.42e-06,3.35e-06,3.43e-06,3.24e-06,3.51e-06,3.61e-06,3.71e-06,3.66e-06,3.56e-06,3.57e-06,3.85e-06,4.32e-06,5.79e-06,0,6.55e-06,1.09e-05,0,0,0,0,3.2e-06,3.45e-06,3.53e-06,4.24e-06,3.39e-06,3.49e-06,3.19e-06,0,3.78e-06,4.16e-06,0,7.82e-05,1.13e-05,0.00569,0,0,0,0,3.09e-06,3.34e-06,3.87e-06,1.12e-05,0,0,3.59e-06,3.73e-06,4.04e-06,4.41e-06,4.32e-06,3.17e-05,0,7.4e-06,0,0,0,0,2.7e-06,3.36e-06,3.58e-06,0,6.09e-06,3.58e-06,3.75e-06,4.01e-06,4.41e-06,4.77e-06,5.46e-06,7.17e-06,0.000117,0.000825,5.64e-06,3.64e-06,0,0,0,3.56e-06,3.66e-06,0.000117,0.073,7.37e-06,3.85e-06,3.66e-06,4.04e-06,4.94e-06,6.06e-06,7.69e-06,5.61e-06,2.54e-05,4.88e-06,6.22e-06,3.95e-05,0,0,4.19e-06,4.18e-06,0.11,0.00764,0.00212,0,4.4e-06,0,5.5e-06,9.3e-06,9.62e-06,7.01e-06,5.75e-06,5.81e-06,6.35e-06,2.09e-05,5.18e-06,4.42e-06,3.63e-06,3.8e-06,0.27,0,0,0,0,6.22e-06,7.72e-06,1.24e-05,1.11e-05,8.32e-06,7.14e-06,6.85e-06,7.44e-06,7.43e-06,7.88e-06,5.73e-06,3.73e-06,3.55e-06,0,0,0,0,0,0,6.95e-06,2.17e-05,1.5e-05,1.32e-05,9.97e-06,1.04e-05,1.4e-05,4.15e-05,3.45e-05,5.85e-06,3.54e-06,3.33e-06,0,0,2.93e-06,0,0.363,4.42e-06,1.29e-05,1.17e-05,1.95e-05,1.76e-05,1.2e-05,1.27e-05,1.49e-05,4.91e-05,4.17e-05,6.33e-06,3.52e-06,3.41e-06,0,3.75e-06,0,5.98e-06,0,0.00503,0.000134,1.66e-05,1.44e-05,1.36e-05,8.48e-06,9.33e-06,8.9e-06,2.31e-05,2.63e-05,6.29e-06,3.54e-06,3.26e-06,3.67e-06,0,0,5.84e-06,0,0.0845,0.0453,1.13e-05,5.97e-06,6.77e-06,7.94e-06,7.32e-06,6.73e-06,7.56e-06,7.52e-06,5.61e-06,3.51e-06,3.49e-06,4.33e-06,0,0.000152,2.59e-05,3.99e-05,0.003,7.41e-05,6.76e-06,0,5.65e-06,7.27e-06,6.79e-06,6.26e-06,5.45e-06,5.21e-06,4.98e-06,3.43e-06,3.6e-06,5.54e-06,2.16e-05,0.0166,2.21e-05,0.000196,9.55e-05,6.51e-05,1.1e-05,6.07e-06,6.39e-06,6.42e-06,6.3e-06,5.95e-06,5.24e-06,0,4.23e-06,3.52e-06,3.58e-06,5.49e-06,8.01e-05,0,0.000707,0.000193,0.00581,0.000139,5.55e-05,2.8e-05,1.15e-05,6.74e-06,6.05e-06,5.07e-06,4.35e-06,3.92e-06,3.88e-06,3.23e-06,3.47e-06,5.55e-06,2.73e-05,0.00179,0.00083,0,0.000174,0.000181,0.000118,4.55e-05,1.5e-05,7.8e-06,6.02e-06,4.43e-06,0,3.75e-06,3.7e-06,3.25e-06,3.78e-06,5.03e-06,7.01e-06,2.21e-05,2.45e-05,6.71e-05,9.94e-06,1.55e-05,8.91e-06,6.94e-06,6.24e-06,5.69e-06,5.11e-06,4.54e-06,3.82e-06,3.94e-06,3.4e-06,3.27e-06,2.92e-06,3.84e-06,3.63e-06,3.85e-06,4e-06,3.93e-06,3.92e-06,3.91e-06,3.83e-06,3.69e-06,3.59e-06,3.5e-06,3.42e-06,3.37e-06,3.53e-06,3.18e-06,3.29e-06,2.86e-06,4.17e-06],"winrateAvg":0.395846,"leadAvg":-0.648158,"scoreMeanAvg":-1.23135,"scoreStdevAvg":10.6406,"shorttermWinlossErrorAvg":0.156503,"shorttermScoreErrorAvg":1.097,"ownership":[-46,-52,-57,-62,-63,-53,-35,-9,27,47,70,72,65,13,-5,-81,-87,-86,-37,-46,-60,-69,-71,-66,-47,-28,-5,75,64,77,84,84,-91,-90,-88,-84,-26,-37,-67,-75,-71,-92,-37,-32,-67,1,75,76,76,79,96,-90,-88,-83,7,-54,-94,-95,-57,-45,-32,-23,-9,24,93,76,96,96,96,-90,-85,-83,24,45,-22,-46,-41,-36,-29,-16,-9,1,20,14,37,58,95,-92,-92,-15,43,15,9,-19,-30,-34,-33,-19,-8,-4,6,5,18,17,37,71,71,29,63,47,43,-2,-70,-60,-82,-10,-9,-3,1,5,9,18,21,28,38,41,80,83,93,93,90,-73,-3,-6,-1,-1,0,1,3,8,13,19,22,29,90,85,92,-73,-75,20,24,-7,1,-2,-3,-2,-2,-2,-9,0,10,16,91,98,-55,-54,-77,-59,-22,-17,-9,-6,-5,-3,-4,-5,-12,-7,-2,2,92,98,33,-79,-51,-25,-41,-13,-11,-8,-6,-2,-4,-4,-4,-11,-14,-11,88,93,98,-78,-43,-77,-36,-24,-14,-16,-6,-5,-4,-4,-6,-14,-27,-25,82,83,97,9,-5,-17,-19,-19,-20,-72,-15,-9,-6,-8,0,-29,-41,-38,72,74,62,9,11,-2,-7,-10,-10,-16,-11,-9,-11,-20,-39,-89,-57,-51,62,63,63,91,34,21,-2,-4,-2,-8,-9,-10,-13,-30,-46,-65,-68,-58,55,57,55,54,56,84,19,1,10,-3,-11,-15,-12,-12,-90,-69,-65,-61,53,51,50,49,56,50,34,18,9,0,-8,-15,-22,-34,-50,-63,-62,-62,50,49,48,48,48,43,31,18,8,1,-6,-13,-21,-33,-45,-54,-59,-61],"ownershipAllowedMAE":0.0338755,"maxHistory":2})%"); + lines.push_back(R"%({"sample":{"board":".OX..O..X..XOO...../XOXOO.OOXO.OXOXX.../.X.OXOX......OOX.../XOOOXXXXXX.XX.OX.../.XXXOOOOO...O.O..../..XXXX....O....OX../XXOOOXO.........X../.O...O.O.........../...XO............../.................../.................../.................../.................../.................../.................../...X...........O.../.................../.................../.................../","hintLoc":"null","initialTurnNumber":71,"metadata":"945A58FA06C05EE33A811381F7CB055C:81","moveLocs":["K17","L17","L16","Q13","R12","Q12","Q15","R11","D19","S12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.18,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":4.0,"policyOptimism":0.0,"pda":-1.963,"policyMixture":[1.62e-05,0,0,0,9.06e-06,0,1.29e-05,1.47e-05,0,2.69e-05,7.41e-05,0,0,0,1.61e-05,1.46e-05,1.59e-05,1.64e-05,1.31e-05,0,0,0,0,0,1.38e-05,0,0,0,0,1.62e-05,0,0,0,0,0,1.54e-05,1.83e-05,1.58e-05,1.49e-05,0,1.51e-05,0,0,0,0,1.35e-05,1.33e-05,0,0,5.05e-05,0.000198,0,0,0,1.4e-05,1.84e-05,1.53e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,1.36e-05,0,0,1.62e-05,1.9e-05,1.59e-05,1.3e-05,0,0,0,0,0,0,0,0,2.16e-05,1.49e-05,4.31e-05,0,2.37e-05,0,0,2.89e-05,0.000151,1.62e-05,1.28e-05,1.1e-05,0,0,0,0,0.00453,1.62e-05,1.79e-05,0.000986,0,0.000492,6.73e-05,0.0606,0.000125,0,0,3.01e-05,1.83e-05,0,0,0,0,0,0,0,2.16e-05,0.000148,2.7e-05,0.000623,8.91e-05,0.000105,6.87e-05,1.36e-05,0,0,0.147,2.67e-05,1.74e-05,0,0.0997,1.66e-05,1.89e-05,0,1.53e-05,0,2.63e-05,3.95e-05,6.78e-05,6.67e-05,3.27e-05,2.67e-05,1.53e-05,0,0,0,1.38e-05,1.56e-05,3.92e-05,2.59e-05,0,0,2.17e-05,0.234,3.02e-05,3.58e-05,4.49e-05,4.79e-05,4.68e-05,4.54e-05,2.85e-05,2.81e-05,0.212,0,0.000203,1.49e-05,1.6e-05,2.31e-05,0.000228,0.00107,0.0013,2.37e-05,2.41e-05,3.16e-05,7.45e-05,9.96e-05,0.000105,0.000122,8.76e-05,5.35e-05,7.64e-05,4.71e-05,0.000144,3.28e-05,1.47e-05,1.58e-05,2.54e-05,3.38e-05,0.000248,4.51e-05,5e-05,7.7e-05,6.03e-05,0.000138,0.000206,0.000274,0.000356,0.000339,0.000303,0.000307,0.000122,0.000134,2.95e-05,1.54e-05,1.59e-05,2.79e-05,4.54e-05,7.9e-05,6.93e-05,7.94e-05,0.000144,0.000178,0.000253,0.000363,0.000565,0.00137,0.00254,0.0036,0.00567,0.000468,0.000153,3.22e-05,1.58e-05,1.6e-05,3.14e-05,8.31e-05,0.00018,9.76e-05,0.000103,0.000186,0.000245,0.000331,0.000491,0.00101,0.00934,0.0305,0.0113,0.00449,0.000915,0.000257,3.33e-05,1.54e-05,1.59e-05,3.42e-05,0.0003,0.0003,0.0001,8e-05,0.000159,0.000248,0.000345,0.000498,0.00107,0.00931,0.0095,0.000699,0.000538,0.000616,0.0131,4.51e-05,1.55e-05,1.63e-05,4.13e-05,0.000108,3.62e-05,4.62e-05,0.000119,0.000181,0.000263,0.000319,0.000391,0.000515,0.00122,0.0447,0.00241,0.000221,0.000246,5.34e-05,8.02e-05,1.57e-05,1.66e-05,3.57e-05,4.18e-05,0,3.72e-05,0.000833,0.00111,0.00044,0.000418,0.000415,0.000367,0.000393,0.000671,0.0195,0.000129,0,0.0106,8.24e-05,1.65e-05,1.56e-05,2.95e-05,5.52e-05,5.08e-05,0.000305,0.0164,0.000919,0.000369,0.000287,0.000259,0.000229,0.000214,0.000296,0.000869,5e-05,0.000251,0.0106,4.84e-05,1.54e-05,1.57e-05,2.16e-05,3.11e-05,4.21e-05,5.95e-05,4.15e-05,4.15e-05,4.12e-05,4.03e-05,3.94e-05,3.84e-05,3.83e-05,4.16e-05,6.63e-05,5.65e-05,4.4e-05,4.21e-05,2.95e-05,1.55e-05,1.28e-05,1.57e-05,1.57e-05,1.67e-05,1.65e-05,1.63e-05,1.64e-05,1.62e-05,1.6e-05,1.58e-05,1.57e-05,1.56e-05,1.56e-05,1.53e-05,1.52e-05,1.54e-05,1.48e-05,1.54e-05,1.22e-05,1.22e-05],"winrateAvg":0.785308,"leadAvg":4.30379,"scoreMeanAvg":5.88723,"scoreStdevAvg":15.5314,"shorttermWinlossErrorAvg":0.120128,"shorttermScoreErrorAvg":1.53464,"ownership":[-97,-96,-97,-97,-90,-76,-79,-79,-83,3,57,57,96,96,47,-51,-68,-68,-68,-98,-96,-97,-76,-75,-79,-75,-73,-83,61,55,79,42,96,-81,-82,-71,-65,-66,-97,-97,-93,-76,-90,-79,-89,-82,-82,-86,62,13,47,96,96,-82,-72,-66,-62,-98,-79,-79,-78,-89,-88,-87,-87,-86,-85,-84,-83,-82,44,96,-82,-73,-54,-53,-97,-99,-99,-99,86,87,87,86,86,31,22,33,81,59,95,-83,-73,-65,-27,-95,-96,-99,-99,-98,-97,-27,51,51,41,87,39,46,48,74,90,-75,6,-4,-96,-97,44,47,47,-96,85,61,40,43,40,40,41,53,58,88,-70,24,27,-44,8,-8,-1,49,81,64,90,42,34,31,30,34,41,41,89,-69,68,46,-22,-17,7,-34,79,32,-6,42,29,25,24,25,26,28,20,26,90,66,61,-8,-2,-6,5,18,24,17,22,18,17,17,18,20,23,29,46,73,65,61,1,0,4,5,14,13,12,14,13,12,11,11,14,17,23,34,42,52,53,2,3,3,5,8,9,9,10,10,8,7,6,8,12,17,27,37,44,43,0,0,0,1,4,7,8,9,8,7,5,3,4,10,18,26,33,36,35,-4,-4,-7,-11,-1,5,9,10,9,8,6,5,6,13,21,32,31,33,31,-9,-13,-23,-21,-4,4,9,11,11,11,10,10,6,20,24,38,43,34,28,-13,-14,-29,-71,-14,0,14,14,13,13,13,14,19,31,39,87,45,29,26,-13,-15,-19,-22,-13,20,15,15,16,15,15,17,21,28,35,33,24,27,23,-13,-11,-12,-8,-2,13,17,17,17,16,16,17,18,19,24,23,23,20,22,-12,-12,-10,-6,1,8,14,16,16,15,15,15,16,19,20,20,20,20,20],"ownershipAllowedMAE":0.0438965})%"); + lines.push_back(R"%({"sample":{"board":".................../....O....X........./.XXO.X......O....../.XO.O..........O.O./XO.O..O............/.XO..X..X......XX../...............O.../.................../...............X.../..O.O............../.................../.................../...X...........X.../....O.......X.OX.../..X...........OX.X./..XO..OO.......OXXO/..XO...XX..X.O.OOX./.................OX/.................../","hintLoc":"null","initialTurnNumber":55,"metadata":"5E9A328881A37FB4372817E3C8935561:65","moveLocs":["C15","C18","D18","O14","L17","K17","L16","K16","B8","E5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.92,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":-3.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.24e-06,4.62e-06,3.86e-06,3.34e-06,3.42e-06,3.98e-06,4.45e-06,4.32e-06,3.59e-06,3.35e-06,3.84e-06,3.9e-06,4.13e-06,3.77e-06,3.74e-06,3.68e-06,3.5e-06,3.65e-06,2.87e-06,4.17e-06,3.58e-06,0,0,0,6.01e-06,7.8e-06,8.14e-06,4.76e-06,0,7.46e-06,5.93e-06,5.14e-06,5.86e-06,6.34e-06,5.37e-06,4.67e-06,4.42e-06,3.76e-06,2.68e-06,0,0,0,3.46e-06,0,1.31e-05,3.22e-05,4.39e-06,0,0,3.84e-06,0,6.32e-06,9.33e-06,6.21e-06,5.86e-06,4.3e-06,3.49e-06,4.99e-06,0,0,2.97e-06,0,7.2e-06,1.54e-05,0.00114,5.28e-06,0,0,4.29e-06,6.32e-06,1.06e-05,8.02e-06,0,5.49e-06,0,3.84e-06,0,0,0,0,3.77e-06,7.96e-06,0,1.29e-05,8.43e-06,0.000163,0.000205,9.8e-06,1.05e-05,9.62e-06,5.88e-05,5.5e-06,6.37e-06,7.99e-06,5.09e-06,4.27e-06,0,0,3.63e-06,5.29e-06,0,6.76e-05,5.47e-05,0,2.66e-05,0.011,8.77e-05,4.27e-05,0,1.68e-05,0,0,5.72e-05,4.84e-06,3.68e-06,2.18e-05,2.07e-05,9.46e-06,1.04e-05,8.51e-06,1.22e-05,0.0133,8.32e-05,2.28e-05,6.75e-05,0.0001,6.84e-05,0.000115,0.000214,0,6.39e-05,4.23e-05,4.87e-06,4.34e-06,1.87e-05,0.000272,5.99e-05,4.03e-05,7.23e-05,6.62e-05,6.36e-05,7.11e-05,7.41e-05,6.63e-05,6.74e-05,4.88e-05,2.95e-05,1.69e-05,2.76e-05,1.23e-05,1.59e-05,3.81e-06,4.19e-06,8.86e-06,7.86e-06,9.57e-06,8.24e-06,1.52e-05,5.11e-05,9.66e-05,7.97e-05,7.16e-05,6.34e-05,5.16e-05,4.06e-05,2.49e-05,0.000167,0,8.6e-05,7.57e-06,3.66e-06,4.28e-06,6.27e-06,0,5.48e-06,0,8.38e-06,3.39e-05,7.59e-05,7.99e-05,7.25e-05,6.68e-05,5.31e-05,3.8e-05,4.53e-05,4.35e-05,0.00015,9.71e-06,6.79e-06,3.55e-06,3.8e-06,5.22e-06,5.99e-06,6.74e-06,8.1e-06,1.65e-05,4.99e-05,7.65e-05,8.32e-05,7.81e-05,7.08e-05,5.77e-05,4.93e-05,5.83e-05,1.75e-05,8.34e-06,7.64e-06,5.68e-06,3.48e-06,3.41e-06,0,6.73e-06,8.78e-06,2.91e-05,7.39e-05,9.8e-05,0.000113,0.000103,8.87e-05,7.59e-05,6.72e-05,6.16e-05,5.46e-05,6.56e-06,5.49e-06,5.66e-06,5.22e-06,3.42e-06,4e-06,5.88e-06,8.31e-06,0,2.35e-05,4.49e-05,0.000177,0.000168,0.000128,0.000102,8.62e-05,7.7e-05,0.000116,0.000313,0.011,0,4.26e-06,4.54e-06,3.47e-06,4.08e-06,8.12e-06,6.11e-06,4.68e-05,0,0.000111,0.000265,0.000129,0.000108,0.000156,0.000127,6.83e-05,0,8.93e-06,0,0,4.14e-06,4.34e-06,3.49e-06,4.18e-06,4.02e-06,0,0.413,0,0.000177,5.36e-06,5.97e-06,2.59e-05,0.00109,0.000117,0.00299,0.000161,7.53e-06,0,0,3.65e-06,0,3.68e-06,4.02e-06,3.7e-06,0,0,8.82e-06,1.07e-05,0,0,0.168,0.000446,0.000119,0.00248,0.000102,7.17e-06,4.35e-06,0,0,0,0,3.85e-06,5.03e-06,0,0,4.19e-06,5e-05,0.0935,0,0,1.47e-05,3.69e-05,0,8.98e-05,0,3.44e-06,0,0,0,9.77e-06,4.44e-06,7.05e-06,0.215,0.00018,0.0545,9.96e-06,3.98e-05,8.33e-06,6.87e-06,1.11e-05,4.46e-05,0.00294,0.000172,7.54e-06,5.06e-06,5.06e-06,5.49e-06,0,0,2.82e-06,4.22e-06,3.72e-06,4.69e-06,4.1e-06,4.59e-06,4.81e-06,4.81e-06,4.71e-06,4.44e-06,4.67e-06,4.8e-06,4.98e-06,4.89e-06,3.66e-06,4.89e-06,5.04e-06,7.15e-06,4.14e-06,3.48e-06],"winrateAvg":0.595029,"leadAvg":0.999981,"scoreMeanAvg":1.39682,"scoreStdevAvg":13.9051,"shorttermWinlossErrorAvg":0.105011,"shorttermScoreErrorAvg":0.865421,"ownership":[65,66,71,83,71,44,8,-20,-48,-51,-34,1,19,35,41,46,48,49,49,65,64,64,97,97,19,5,-22,-43,-76,9,30,44,42,44,49,51,48,46,64,63,66,97,45,-22,1,-8,-39,-76,72,45,78,33,46,57,46,42,46,67,64,97,96,96,46,-3,-2,-38,-77,72,29,20,21,24,81,41,69,26,68,96,97,97,41,4,45,-9,-36,-29,-11,18,6,-7,0,-9,0,-26,5,74,71,97,55,11,-36,-4,-26,-75,-25,16,2,-12,-74,-40,-81,-81,-30,-25,67,79,53,39,22,6,-2,15,-16,-10,-3,-2,-11,-20,-29,-9,-47,-49,-34,64,50,51,34,26,14,7,3,-6,-5,-2,-2,-9,-17,-24,-40,-47,-47,-45,61,58,40,32,29,12,5,1,-2,-3,-3,-5,-9,-16,-24,-82,-55,-54,-49,61,63,86,41,79,13,5,1,-1,-3,-3,-5,-9,-15,-27,-44,-55,-57,-54,57,53,25,17,17,8,3,2,0,-3,-5,-7,-9,-14,-27,-43,-57,-60,-59,38,68,5,-8,3,3,3,3,0,-3,-6,-10,-12,-1,-41,-56,-65,-68,-68,17,-4,-10,-66,-7,2,9,7,3,-4,-8,-13,-6,4,-3,-96,-75,-80,-78,-17,-15,-41,-53,42,9,16,14,5,-5,-13,-19,-66,3,63,-96,-86,-86,-87,-43,-58,-82,24,-13,27,27,29,14,-3,-14,-22,-2,15,64,-96,-94,-97,-93,-59,-71,-82,66,22,33,81,79,35,-21,-25,-22,-12,20,58,70,-97,-97,-89,-61,-64,-82,65,32,26,45,-72,-74,-42,-49,-82,-5,65,56,69,71,-97,-89,-57,-57,-4,20,38,24,-4,-34,-59,-59,-58,-48,-16,35,48,60,-1,-2,-89,-48,-29,-16,16,26,25,4,-25,-44,-52,-49,-36,-7,22,41,37,21,-12,-37],"ownershipAllowedMAE":0.0284754})%"); + lines.push_back(R"%({"sample":{"board":".................../OXX..X............./.OXX..X............/..OOO.........X.X../.O................./..XO..O............/..X..XXX.........../...OXOOOO........../..XXXOX.X........../....OXO............/..OXO.O............/..OX.............../....X.O............/..O.............X../...X.............../.OX.XXXOO....O.O.../.O.XOOO............/...X.............../.................../","hintLoc":"null","initialTurnNumber":62,"metadata":"6A968574AF5001E056B8C281798891B4:72","moveLocs":["D10","E14","J13","K12","K13","J16","G15","C15","L12","N17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.74,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9e-06,2.05e-06,1.77e-06,1.81e-06,1.84e-06,1.64e-06,2.04e-06,2.49e-06,3.04e-06,3.87e-06,4.21e-06,4.05e-06,4.17e-06,4.69e-06,4.63e-06,3.25e-06,2.27e-06,2.04e-06,1.35e-06,0,0,0,1.94e-06,2.46e-06,0,2.46e-06,1.59e-05,0.000109,0.000948,0.0326,0.000231,8.99e-05,0.153,0.00567,1.33e-05,5.92e-06,3.53e-06,1.85e-06,2.59e-05,0,0,0,2.89e-06,2.52e-06,0,5.43e-06,1.64e-05,0.0506,0.198,0.000155,0,0.0746,0.000179,1.94e-05,5.51e-06,4.14e-06,1.79e-06,0.00348,1.75e-05,0,0,0,8.02e-06,3.46e-06,5.63e-06,0,1.22e-05,0.00287,0.000218,0.000205,1.91e-05,0,5.95e-06,0,4.07e-06,2e-06,6.56e-06,0,0,2.41e-06,2.22e-05,0.0596,0,6.33e-06,6.36e-06,1.23e-05,4.22e-05,5.67e-05,0.000188,9.72e-05,1.02e-05,7.52e-06,5.75e-06,6.06e-06,1.94e-06,7.11e-05,0.0959,0,0,0,0.00626,0,3.31e-06,2.15e-06,2.98e-06,9.15e-06,1.97e-05,3.94e-05,5.75e-05,3.71e-05,1.39e-05,1.41e-05,7.77e-06,2.04e-06,1.97e-05,0.000353,0,2.85e-06,3.2e-06,0,0,0,0,0,1.11e-05,3.05e-05,2.15e-05,4.72e-05,4.35e-05,3.77e-05,3.25e-05,9.46e-06,2.11e-06,5.15e-06,2.84e-05,2.43e-06,0,0,0,0,0,0,0,0,4.17e-05,3.77e-05,5.11e-05,5.76e-05,8.65e-05,5.33e-05,1.09e-05,2.19e-06,3.53e-06,5.31e-06,0,0,0,0,0,0.0071,0,0.00032,0.249,0.000193,0.000115,6.74e-05,7.76e-05,0.000135,8.3e-05,1.21e-05,2.32e-06,6.35e-06,0.00522,3.83e-06,0,0,0,0,2.98e-06,4.26e-06,8.9e-06,0.000296,0.00187,0.000133,9.69e-05,9.92e-05,0.000265,0.000168,1.54e-05,2.47e-06,6.6e-06,0.00144,0,0,0,3.08e-06,0,3.28e-06,5.01e-06,9.31e-06,4.62e-05,0.000105,9.61e-05,0.000115,0.000117,0.000348,0.000297,1.89e-05,2.48e-06,1.24e-05,6.04e-05,0,0,5.41e-06,1.2e-05,5.56e-06,6.45e-06,6.44e-06,1.02e-05,2.57e-05,7.28e-05,8.58e-05,9.97e-05,9.02e-05,0.000136,0.000134,1.37e-05,2.34e-06,4.52e-06,0.000472,0.0031,1.73e-05,0,3.11e-06,0,7.47e-06,1.12e-05,1.26e-05,2.28e-05,5.64e-05,9.21e-05,0.000113,0.00011,7.23e-05,1.03e-05,1.01e-05,2.26e-06,4.62e-06,2.35e-05,0,4.76e-05,2.81e-06,3.07e-06,6.62e-06,2.58e-05,2.02e-05,1.97e-05,4.42e-05,6.25e-05,9.4e-05,6.1e-05,0.000112,1.03e-05,0,7.92e-06,2.71e-06,3.59e-06,0.00181,0.000329,0,1.85e-06,2.17e-06,4.26e-06,9.98e-06,7.98e-06,4.23e-05,0.000121,0.000109,8.77e-05,8.26e-05,0.0157,3.23e-05,1.13e-05,7.78e-05,2.71e-06,2.82e-06,0,0,2.14e-06,0,0,0,0,0,6.86e-05,5.47e-05,6.07e-05,0.000278,0,2.13e-05,0,0.000124,8.39e-05,3.12e-06,4.2e-06,0,7.95e-06,0,0,0,0,1.43e-05,1.39e-05,0.00031,0.000241,0.000395,0.000148,0.000106,0.000214,5.01e-05,0.000132,2.53e-05,2.67e-06,3.52e-06,0.0182,4.7e-06,0,3.67e-06,3.37e-06,5.22e-06,7.77e-05,0.000202,4.82e-05,1.39e-05,1.54e-05,2.51e-05,0.000142,0.000154,7.85e-05,1.42e-05,7.95e-06,2.3e-06,1.69e-06,4.33e-06,3.39e-06,2.33e-06,2.51e-06,2.98e-06,4.01e-06,3.3e-06,3.34e-06,2.91e-06,2.6e-06,2.57e-06,2.87e-06,3.03e-06,3.27e-06,2.69e-06,2.37e-06,2.32e-06,1.43e-06,2.95e-06],"winrateAvg":0.0708671,"leadAvg":-6.20656,"scoreMeanAvg":-9.08864,"scoreStdevAvg":14.1703,"shorttermWinlossErrorAvg":0.0664472,"shorttermScoreErrorAvg":1.3499,"ownership":[4,-24,-75,-80,-83,-80,-75,-64,-53,-44,-31,-20,-15,-21,-32,-39,-48,-52,-55,84,-84,-84,-82,-81,-92,-77,-61,-57,-51,-39,-19,-10,-34,-29,-45,-51,-57,-57,85,87,-83,-83,27,-12,-93,-56,-41,-55,-48,-16,23,-33,-51,-49,-64,-63,-59,86,88,89,88,89,16,-43,-44,1,-30,-17,-17,-9,-29,-88,-57,-88,-65,-57,85,90,89,88,81,-29,-79,-34,-33,-34,-26,-15,-10,-13,-37,-42,-45,-54,-50,37,-56,-87,88,88,30,41,-26,-41,-43,-24,-18,-13,-17,-29,-32,-37,-41,-39,-23,-59,-86,20,-14,-92,-93,-93,-94,-93,-43,-19,-15,-17,-25,-29,-32,-33,-30,-41,-52,-54,20,-97,87,87,88,88,88,-79,-32,-17,-17,-21,-24,-25,-25,-23,-45,-65,-97,-98,-97,89,71,76,5,29,-39,-30,-15,-14,-16,-19,-18,-20,-18,-20,-24,-40,-97,74,68,93,54,31,16,-3,-13,-11,-10,-12,-16,-14,-17,-16,11,26,69,-97,70,66,93,45,22,13,4,-3,-4,-6,-8,-15,-14,-16,-15,39,54,68,-97,-45,-19,33,31,23,16,9,3,1,0,-2,-8,-9,-15,-15,55,60,25,-27,-95,-6,80,32,23,18,12,8,5,4,1,-2,-12,-19,-16,65,69,75,-35,-57,-7,11,24,28,20,15,12,12,14,4,2,-51,-20,-13,68,65,24,-92,-64,-30,-8,21,39,27,20,19,21,27,10,21,25,2,-5,66,73,-86,-87,-92,-91,-92,91,90,40,27,27,33,84,51,83,32,6,5,43,73,7,-91,74,75,76,76,46,25,23,16,35,48,45,50,26,12,9,35,-19,-8,-90,6,25,49,52,36,28,24,22,29,31,37,34,28,17,14,-3,-16,-46,-58,-47,-9,10,36,35,29,24,23,26,31,32,31,26,22,18],"ownershipAllowedMAE":0.0320626})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...X.........XOO.../....X..X.O...XX.O../..O................/...X.....O......O../..OX.........X...../..........X......../.................../.................../.................../.....O............./..OO.............../...X..O.X........../..OX...O..X......../..O...X.OOX....X.../....X.OO.X..X....../.................../.................../","hintLoc":"null","initialTurnNumber":39,"metadata":"AD5C7A3B617932991562CC95FEE7F74E:49","moveLocs":["C12","D12","D11","C6","B6","C14","B14","C11","B11","C3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.95e-06,3.27e-06,3.37e-06,3.34e-06,3.28e-06,3.25e-06,3.25e-06,3.29e-06,3.34e-06,3.41e-06,3.48e-06,3.58e-06,3.57e-06,3.6e-06,3.74e-06,3.41e-06,3.05e-06,3.11e-06,2.98e-06,3.12e-06,3.61e-06,3.76e-06,4.11e-06,4.17e-06,4.31e-06,4.99e-06,4.39e-06,7.42e-06,5.58e-06,5.9e-06,1.93e-05,5.46e-06,7.21e-06,4.14e-06,3.54e-06,3.26e-06,3.23e-06,3.08e-06,3.03e-06,3.47e-06,3.8e-06,0,3.9e-06,6.57e-06,7.45e-06,5.78e-05,1.61e-05,4.42e-06,8.45e-06,3.97e-05,4.3e-06,0,0,0,3.07e-06,3.3e-06,2.94e-06,3.22e-06,4.52e-05,4.79e-06,3.44e-06,0,4.48e-06,1.86e-05,0,6.24e-06,0,3.97e-06,8.28e-06,3.93e-06,0,0,3.58e-06,0,3.32e-06,3.17e-06,3.36e-06,4.23e-06,0,9.51e-05,1.47e-05,4.27e-06,6.57e-06,2.2e-05,3.84e-06,3.36e-06,4.13e-06,8.34e-06,2.45e-05,4.15e-06,3.92e-06,4.56e-06,3.58e-06,3.77e-06,3e-06,3.06e-06,0,0,0,4.29e-06,4.77e-06,5.09e-06,5.45e-06,4.09e-06,0,3.86e-06,2.31e-05,1.12e-05,3.51e-05,6.64e-05,5.32e-06,0,3.74e-06,3.29e-06,3.28e-06,3.5e-06,0,0,3.4e-06,5.72e-06,4.85e-06,8.52e-06,1.01e-05,4.21e-06,2.26e-05,4.15e-05,2.9e-05,0,2.24e-05,2.5e-05,4.43e-06,4.57e-06,3.23e-06,3.13e-06,3.85e-06,0,0,5.08e-06,4.83e-06,4.92e-06,4.93e-06,1.21e-05,1.79e-05,0,1.77e-05,1.58e-05,1.97e-05,9.94e-06,2.35e-05,6.75e-06,4.63e-06,3.42e-06,2.86e-06,0,0,0,1.37e-05,4.67e-06,4.83e-06,4.65e-06,4.94e-06,6.13e-06,6.02e-06,5.11e-06,7.22e-06,5.28e-06,5.82e-06,2.54e-05,1.76e-05,4.91e-06,3.38e-06,2.89e-06,3.42e-06,0.000225,3.89e-06,3.79e-06,4.23e-06,4.5e-06,4.72e-06,4.79e-06,5.18e-06,5.29e-06,4.95e-06,5.05e-06,5.1e-06,5.96e-06,2.22e-05,1.99e-05,4.92e-06,3.39e-06,2.99e-06,3.25e-06,3.54e-06,3.43e-06,3.51e-06,3.63e-06,4.07e-06,4.54e-06,5.09e-06,5.31e-06,5.12e-06,5.01e-06,5.05e-06,5.09e-06,5.62e-06,1.92e-05,2.31e-05,4.88e-06,3.39e-06,3.05e-06,3.33e-06,3.2e-06,3.24e-06,3.32e-06,0,3.97e-06,4.6e-06,7.1e-06,5.67e-06,5.14e-06,5.03e-06,4.98e-06,5.01e-06,5.25e-06,1.35e-05,2.34e-05,4.83e-06,3.42e-06,3.2e-06,3.03e-06,0,0,3.55e-06,3.58e-06,3.8e-06,4.19e-06,4.66e-06,6.02e-06,5.21e-06,4.89e-06,4.9e-06,4.89e-06,5.01e-06,1.04e-05,2.44e-05,5.03e-06,3.39e-06,2.98e-06,0,0,0,4.75e-06,4.07e-06,0,3.9e-06,0,1.07e-05,5.37e-06,4.43e-06,4.61e-06,4.7e-06,5.01e-06,1.39e-05,3.37e-05,1.07e-05,3.51e-06,3.47e-06,3.87e-05,0,0,4.56e-06,4.16e-06,3.46e-06,0,3.58e-06,5.14e-06,0,3.84e-06,4.38e-06,5.13e-06,5.86e-06,3.22e-05,4.6e-05,3.14e-05,3.64e-06,5.23e-06,0.00014,0,0.0549,5.53e-06,4.15e-06,0,3.23e-06,0,0,0,6.17e-06,2.31e-05,7.51e-06,3.74e-05,0,0.00011,2.39e-05,3.75e-06,4.7e-06,0.801,0,0.000278,0,7.11e-06,0,0,4.07e-06,0,3.41e-05,6.14e-05,0,4.18e-05,1.3e-05,6.78e-05,7.79e-05,9.9e-06,3.57e-06,4.42e-06,3.58e-05,0.000895,0.139,8.46e-05,0.000154,4.2e-06,3.74e-06,3.86e-06,1.27e-05,1.55e-05,5e-06,2.04e-05,4.47e-06,7.66e-06,4.44e-06,4.73e-06,4.78e-06,3.47e-06,3.01e-06,4.35e-06,4.29e-06,4.26e-06,5.21e-06,4.48e-06,4.27e-06,3.68e-06,3.58e-06,3.51e-06,3.36e-06,3.32e-06,3.23e-06,3.19e-06,3.21e-06,3.21e-06,3.25e-06,3.29e-06,2.93e-06,6.15e-06],"winrateAvg":0.578457,"leadAvg":0.66874,"scoreMeanAvg":1.02781,"scoreStdevAvg":14.0711,"shorttermWinlossErrorAvg":0.151726,"shorttermScoreErrorAvg":1.32986,"ownership":[-31,-41,-49,-56,-59,-52,-41,-25,-12,-6,-9,-21,-33,-26,7,31,53,60,66,-22,-33,-47,-69,-63,-57,-50,-28,-12,-9,-10,-13,-47,-33,15,63,62,66,67,-10,-24,-40,-91,-71,-55,-61,-9,-8,12,-4,6,-38,-86,78,77,72,70,69,5,7,-23,-44,-92,-54,-49,-78,5,47,7,-13,-30,-86,-86,-34,83,73,65,22,17,22,-15,-51,-36,-28,-13,-6,16,-11,-10,-14,-38,-34,-14,35,60,55,35,54,-80,-80,-40,-25,-15,-10,5,46,1,-11,-23,-35,-17,11,76,48,38,53,50,79,-79,-31,-14,-11,-6,-17,-4,-19,-17,-27,-84,-29,-34,16,21,20,61,65,81,-79,-18,-13,-8,-9,-16,-17,-80,-35,-33,-34,-26,-24,-18,1,4,64,80,41,59,-6,-1,-4,-9,-18,-25,-30,-27,-26,-27,-24,-20,-14,-8,-5,65,62,48,37,15,7,0,-6,-11,-18,-21,-22,-23,-24,-23,-20,-17,-13,-10,67,64,54,43,30,18,7,-3,-9,-15,-19,-21,-22,-23,-23,-20,-18,-16,-13,72,73,66,57,50,86,18,2,-8,-13,-18,-21,-23,-23,-23,-21,-19,-18,-16,78,78,95,95,58,56,24,6,-10,-14,-20,-23,-25,-26,-26,-24,-23,-22,-19,79,90,38,39,61,56,90,9,-61,-21,-33,-30,-31,-31,-31,-31,-30,-29,-24,74,84,92,40,53,54,60,86,14,-23,-93,-48,-41,-39,-42,-43,-56,-28,-28,64,64,92,58,44,46,38,69,88,87,-93,-62,-48,-49,-50,-87,-26,-30,-28,48,66,20,47,23,53,88,88,29,-71,-70,-64,-90,-52,-53,-41,-38,-33,-28,41,32,33,37,39,50,66,54,4,-17,-53,-64,-66,-58,-49,-42,-37,-30,-29,35,33,32,32,39,45,51,38,13,-20,-41,-57,-60,-56,-48,-40,-34,-32,-30],"ownershipAllowedMAE":0.0312058})%"); + lines.push_back(R"%({"sample":{"board":".................../..OX..........OX.../.OXX.X.O.X.O.OX.X../.OOXX...O.XXX.OXX../.OXXOX.O......OO.../..OOOX.XO.......X../.....OXXO..X..O..../.....O...O.OX..X.../.......X.XO......../..X......X........./.OXO.............../.OO.O............../..XOO............../.X................./...O....X.....XXX../..XO......OXOOXOXX./..XO....O..OOXOOOX./..XXO......OXXXXOO./.................../","hintLoc":"null","initialTurnNumber":105,"metadata":"C0D24C59E4F8EB33AA3C2368EC37E48F:115","moveLocs":["N13","N17","Q17","L13","L12","P17","N18","O16","Q17","J12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.31,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":-5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.86e-05,6.42e-05,5.89e-05,6.15e-05,5.78e-05,5.9e-05,5.81e-05,6.2e-05,6.56e-05,6.55e-05,6.63e-05,6.43e-05,5.15e-05,5.48e-05,5.08e-05,8.57e-05,5.59e-05,5.26e-05,4.68e-05,5.61e-05,6.74e-05,0,0,6.67e-05,6.54e-05,8.24e-05,7.25e-05,0.00035,0.000561,0.000775,0.000181,0,6.54e-05,0,0,0.000192,6.24e-05,5.36e-05,4.71e-05,0,0,0,4.66e-05,0,5.85e-05,0,6.83e-05,0,0.000445,0,0,0,0.0776,0,0,6.92e-05,5.5e-05,4.34e-05,0,0,0,0,0.000396,0.0442,4.69e-05,0,0.000338,0,0,0,0,0,0,0,0.000113,5.79e-05,4.39e-05,0,0,0,0,0,0.0799,0,6.27e-05,0.000179,0.000315,7.38e-05,6.54e-05,6.31e-05,0,0,0.00255,0.000112,6.2e-05,4.61e-05,4.76e-05,0,0,0,0,0.000898,0,0,0.000334,0.00856,0.00178,0.00799,6.45e-05,5.21e-05,6.47e-05,0,0.000323,6.13e-05,4.62e-05,4.89e-05,4.74e-05,4.54e-05,5e-05,0,0,0,0,0.683,0,0,0,8.57e-05,0,0.000132,0.000263,9.39e-05,5.77e-05,4.62e-05,4.87e-05,4.92e-05,5.07e-05,4.87e-05,0,0.0104,0.000229,0,0,0,0,0,0.00095,0.000275,0,9.29e-05,7.3e-05,5.43e-05,4.67e-05,4.91e-05,4.84e-05,5.01e-05,5.26e-05,5.63e-05,8.59e-05,0,0.00113,0,0,6.44e-05,0.00639,0.000329,0.000186,0.000149,7.49e-05,7e-05,5.33e-05,4.62e-05,4.89e-05,0,5.07e-05,5.35e-05,5.65e-05,6.51e-05,6.95e-05,0.035,0,0.00241,0.000164,0.000238,0.000165,0.000121,9.95e-05,7.72e-05,6.8e-05,5.23e-05,4.62e-05,0,0,0,4.97e-05,5.55e-05,6.22e-05,6.62e-05,7.5e-05,0.000318,0.000204,0.000177,0.000118,8.55e-05,7.68e-05,7.44e-05,7.17e-05,6.56e-05,5.15e-05,5.04e-05,0,0,4.67e-05,0,5.1e-05,5.98e-05,6.68e-05,7.58e-05,9.76e-05,0.000105,9.26e-05,7.77e-05,7.33e-05,7.33e-05,7.11e-05,7e-05,6.41e-05,5.1e-05,5.68e-05,6.56e-05,0,0,0,5.06e-05,5.78e-05,6.46e-05,7.1e-05,7.07e-05,7.03e-05,7.05e-05,7.15e-05,7.16e-05,7.05e-05,6.92e-05,6.78e-05,6.13e-05,5.04e-05,7.09e-05,0,5.99e-05,5.16e-05,5.03e-05,5.15e-05,5.61e-05,6.09e-05,6e-05,6.78e-05,6.4e-05,6.28e-05,6.61e-05,7.07e-05,6.08e-05,5.55e-05,5.56e-05,5.92e-05,5.05e-05,5.59e-05,0.000789,0.00328,0,4.79e-05,5.27e-05,5.56e-05,5.58e-05,0,5.65e-05,5.57e-05,5.48e-05,5.29e-05,5.94e-05,0,0,0,4.89e-05,5.05e-05,5.65e-05,6.88e-05,0,0,4.85e-05,5.18e-05,5.5e-05,5.51e-05,5.52e-05,5.17e-05,0,0,0,0,0,0,0,0,5.33e-05,5.26e-05,5.59e-05,0,0,5.23e-05,5.64e-05,5.38e-05,5.31e-05,0,5.1e-05,4.9e-05,0,0,0,0,0,0,0,0.000432,5.66e-05,5.7e-05,0,0,0,5.49e-05,5.48e-05,5.31e-05,5.13e-05,5.06e-05,4.79e-05,0,0,0,0,0,0,0,0.00589,4.58e-05,5.06e-05,5.24e-05,5.87e-05,5.53e-05,5.23e-05,4.91e-05,4.96e-05,4.89e-05,4.84e-05,4.78e-05,5.76e-05,0.0027,0.00119,0.000595,0.00114,0.000416,0.000677,0.000169,4.75e-05],"winrateAvg":0.0165897,"leadAvg":-9.66433,"scoreMeanAvg":-11.0888,"scoreStdevAvg":11.5939,"shorttermWinlossErrorAvg":0.0563536,"shorttermScoreErrorAvg":2.24627,"ownership":[32,10,-28,-43,-57,-44,-19,-4,-11,-25,-31,-22,-18,-11,-17,-23,-42,-50,-55,71,8,6,-83,-63,-53,-22,15,-14,-44,-33,-36,-2,-12,-1,-41,-41,-55,-58,76,96,-84,-83,-74,-80,-7,51,-5,-88,-70,-33,-95,-6,-5,-1,-69,-59,-58,87,96,96,-81,-82,-56,31,44,51,-22,-95,-95,-95,-95,43,-70,-69,-57,-59,92,97,-81,-83,97,-65,30,54,39,-60,-44,-49,-42,-14,46,48,25,-64,-53,93,94,97,97,97,-63,-48,-69,71,21,-11,-30,-28,-17,10,-10,-65,-47,-49,91,90,87,85,88,92,-68,-67,74,75,-49,-52,16,-21,41,-8,-27,-51,-43,89,87,85,82,76,92,64,-61,-70,82,80,78,-51,-15,-7,-71,-39,-39,-39,88,86,82,77,67,32,-17,-77,-55,-70,81,34,1,-9,-16,-27,-35,-38,-35,90,85,72,79,51,16,-8,-27,-16,-72,7,12,6,-6,-13,-25,-32,-35,-34,92,99,71,97,48,12,1,-10,-10,-15,-3,5,2,-5,-15,-26,-34,-38,-35,82,99,99,96,99,31,10,3,0,-2,0,3,1,-5,-14,-25,-35,-44,-41,46,48,-47,100,99,40,20,17,14,8,5,3,2,-5,-15,-25,-38,-52,-52,11,-82,-17,50,60,39,30,30,18,23,11,9,-2,-2,-29,-46,-57,-63,-64,-60,-76,14,97,59,43,37,30,-11,25,27,28,27,-18,-99,-99,-98,-82,-81,-81,-86,-90,97,63,45,43,42,39,36,87,25,96,96,-98,-73,-99,-98,-91,-85,-87,-89,97,72,57,47,52,93,66,78,96,96,-71,-71,-72,-75,-98,-92,-85,-87,-90,-91,82,41,55,65,79,83,84,97,-73,-72,-72,-72,-74,-74,-82,-86,-87,-84,-21,17,38,54,65,75,81,86,84,76,53,2,-60,-73,-77,-80],"ownershipAllowedMAE":0.0531821})%"); + lines.push_back(R"%({"sample":{"board":".................../......OO.........../.OO..OX.O.XO..XXXX./O.OX...X.OXXXXOXOO./.OXOOO..XOO...OO.O./OXXXXOXXOX..XX.OO../...XOXXOO..XOOX..../...XO.....O..XO.O../...XO...XX........./.......X.OXXXXXX.../.........OOOO.OX.../......XO....X.OXX../.........X.XOOXOOO./..X....X..XOXOX..../.X..XXX...OO.O.O.../.XXOO.O.O..O...O.../.OXXO..O.X.XO....../..OXOX.O.........../...XXO............./","hintLoc":"null","initialTurnNumber":140,"metadata":"1608808C07E9F3B06312979F71C90099:150","moveLocs":["J6","M8","K4","K5","L2","M2","J5","E10","D10","J3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.27,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":4.5,"policyOptimism":0.138,"pda":0.743,"policyMixture":[1.99e-06,2.13e-06,2.08e-06,2.19e-06,2.34e-06,2.51e-06,2.43e-06,2.5e-06,3.18e-06,3.21e-06,3.14e-06,2.54e-06,2.24e-06,2.29e-06,2.22e-06,2.25e-06,2.14e-06,2.39e-06,2.03e-06,2.27e-06,2.47e-06,2.66e-06,3.13e-06,3.73e-06,1.5e-05,0,0,3.44e-06,0.000677,3.82e-06,2.98e-06,2.63e-06,2.43e-06,2.25e-06,2.1e-06,2.53e-06,2.46e-06,2.38e-06,2.88e-06,0,0,5.04e-06,0.000143,0,0,0.000306,0,3.23e-06,0,0,2.42e-06,2.12e-06,0,0,0,0,3.11e-06,0,0,0,0,6.95e-06,0.0437,0.000225,0,5.28e-05,0,0,0,0,0,0,0,0,0,4.05e-06,0,0,0,0,0,0,3.39e-05,0.000209,0,0,0,2.56e-06,2.45e-06,2.4e-06,0,0,0,0,2.88e-06,0,0,0,0,0,0,0,0,0,0,0.0656,3.12e-06,0,0,2.95e-06,0,0,3.18e-06,3.46e-06,0.00417,0.0011,2.72e-06,0,0,0,0,0,0,0.161,5.91e-05,0,0,0,0,0.000126,2.87e-06,3.74e-05,3.39e-06,9.44e-05,9.28e-06,2.62e-06,0,0,4.95e-06,0.000225,0.000146,4.11e-06,3.96e-06,0,2.94e-06,3.53e-06,0,0,5.06e-06,0,4.55e-05,4.62e-06,4.9e-06,9.86e-06,2.71e-06,0,0,6.19e-06,7.57e-05,3.29e-06,0,0,2.98e-06,2.36e-06,2.68e-06,2.48e-06,3.21e-06,2.88e-06,3.8e-06,0.00161,6.67e-06,3.18e-06,4.44e-06,2.82e-06,0,0,3.48e-06,3.82e-06,0,3.87e-06,0,0,0,0,0,0,0,2.69e-06,3.75e-06,6.72e-06,2.49e-06,3.14e-06,2.69e-06,2.66e-06,4.95e-06,2.87e-06,4.23e-06,6.35e-06,1.74e-05,0,0,0,0,0.000368,0,0,2.25e-06,3.25e-06,2.97e-06,2.28e-06,2.61e-06,2.48e-06,2.4e-06,2.44e-06,2.56e-06,0,0,2.87e-05,3.53e-06,2.47e-06,0,0,1.61e-05,0,0,0,5.06e-06,3.58e-06,2.21e-06,2.28e-06,2.27e-06,2.3e-06,2.31e-06,2.35e-06,2.79e-06,3.09e-06,2.74e-06,0,3.1e-06,0,0,0,0,0,0,0,3.74e-06,2.19e-06,2.18e-06,0,2.8e-06,2.29e-06,2.28e-06,2.44e-06,0,0,2.59e-06,0,0,0,0,0,3.26e-06,3.57e-06,3.08e-06,3.07e-06,2.05e-06,0,2.78e-06,0.00151,0,0,0,3.13e-06,0,0,0,0,2.25e-06,0,2.41e-06,0,2.68e-06,4.47e-06,2.59e-06,2.03e-06,0,0,0,0,0.151,0,0.00109,0,0,3.49e-06,0,2.83e-06,2.44e-06,2.65e-06,0,3.25e-06,3.92e-06,2.27e-06,2.06e-06,0,0,0,0,0.00042,0.00919,0,0,0,0.000224,0,0,3.29e-06,3.01e-06,4.9e-06,6.51e-05,4.5e-05,2.32e-06,2.07e-06,2.13e-06,0,0,0,0,0.00492,0,0.002,0.185,0,0,0.000835,7.36e-06,1.75e-05,1.19e-05,6.55e-05,3.68e-06,2.68e-06,1.92e-06,2.16e-06,2.14e-06,0,0,0,0.314,0.0433,0.00257,0.00199,3.09e-06,0.0011,3.06e-06,2.68e-06,2.47e-06,2.38e-06,2.39e-06,2.63e-06,1.88e-06,5.15e-06],"winrateAvg":0.0745931,"leadAvg":-3.2749,"scoreMeanAvg":-4.30855,"scoreStdevAvg":7.35916,"shorttermWinlossErrorAvg":0.152095,"shorttermScoreErrorAvg":1.82804,"ownership":[95,96,96,95,95,95,93,80,61,33,17,-59,-68,-83,-90,-92,-90,-87,-70,94,95,97,95,94,93,98,98,66,29,-78,-71,-82,-87,-94,-96,-95,-69,-68,92,99,99,95,89,93,-25,38,96,15,-100,-70,-89,-96,-100,-100,-99,-99,32,92,87,99,91,92,25,9,-90,62,94,-100,-100,-100,-100,97,-100,96,96,47,78,88,-97,93,93,92,-18,-83,-86,94,93,14,-59,12,97,97,96,96,89,79,-97,-98,-98,-98,91,-96,-96,-69,-83,-17,-41,-100,-100,16,97,97,95,92,60,-39,-70,-98,-86,-97,-96,-72,-69,-77,-50,-95,-67,-60,-77,37,82,88,82,55,-27,-58,-98,-86,-92,-86,-87,-84,-76,-44,-78,-67,-74,39,24,95,83,45,28,-53,-66,-98,-86,-91,-88,-88,-98,-98,-73,-77,-81,-34,-34,-7,25,-8,10,-8,-65,-75,-98,-84,-90,-88,-97,-13,99,-100,-100,-100,-100,-100,-100,-21,-30,-31,-53,-68,-84,-88,-90,-88,-87,48,42,99,99,99,99,-55,97,-100,-68,-35,-30,-73,-78,-84,-88,-88,-87,-93,61,13,5,37,99,95,97,97,-99,-99,-39,34,-83,-85,-88,-89,-87,-83,-53,-15,-57,-92,10,9,100,100,94,99,99,99,63,-91,-93,-100,-93,-90,-83,-80,-98,-99,0,-36,100,97,100,94,97,96,95,93,-97,-100,-83,10,-99,-99,-99,-67,-99,100,100,100,99,100,98,100,96,95,94,-98,-100,-100,37,35,-57,51,-11,73,70,92,100,97,97,96,100,96,95,94,-99,-98,-100,-100,35,11,28,74,76,71,91,91,99,95,95,96,94,94,94,-99,-99,-98,-100,38,-78,-14,74,68,69,70,96,92,93,94,94,93,93,93,-99,-99,-99,-100,-100,-76,-70,-24,57,69,81,87,92,93,93,93,93,93,93],"ownershipAllowedMAE":0.0310173})%"); + lines.push_back(R"%({"sample":{"board":".O.OX......OOO..../.OOOXOOO..XOXXOO../O.OX.XOXXOXOOXXO../XOXXXXX.XXXXOXXO../XXX........OXXOO../..O.........XOXO../............XOX.../....XOX.XX..XO..../..XXO.XXOOX.XO..../...OXX.......O..../..XOOOO....XO...../.X.XXO.OO.......O./...XO.OX..O...OO.O/..XOO.OXO.....XXO./XXXXOXXXOX.XX.XOX./XXOOXXOO.OXOO.XOX./XOOOXXO..OO......./.O.OX............./","hintLoc":"null","initialTurnNumber":160,"metadata":"D97FCC96C5CA778103CE4194BC148888:170","moveLocs":["N7","O7","N9","O8","O2","L4","J9","L8","M7","L7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.53,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":48.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.21e-05,0,0,0,0,3.77e-05,4.13e-05,4.06e-05,3.89e-05,4.22e-05,0.0357,0,0,0,0.011,4.49e-05,3.9e-05,3.85e-05,4.83e-05,0,0,0,0,0,0,0,4.05e-05,4e-05,0,0,0,0,0,0,3.83e-05,3.99e-05,0,0.291,0,0,3.92e-05,0,0,0,0,0,0,0,0,0,0,0,3.92e-05,3.93e-05,0,0,0,0,0,0,0,4.07e-05,0,0,0,0,0,0,0,0,3.88e-05,3.98e-05,0,0,0,3.92e-05,3.84e-05,3.86e-05,3.87e-05,3.87e-05,3.85e-05,3.85e-05,4e-05,0,0,0,0,0,3.89e-05,3.94e-05,4.01e-05,3.96e-05,0,3.93e-05,3.81e-05,3.84e-05,3.82e-05,3.81e-05,3.85e-05,3.84e-05,3.83e-05,4.02e-05,0,0,0,0,3.91e-05,3.9e-05,3.97e-05,3.86e-05,3.85e-05,3.85e-05,3.85e-05,4.01e-05,3.92e-05,3.89e-05,3.97e-05,3.94e-05,4.02e-05,3.94e-05,0,0,0,3.84e-05,3.85e-05,3.85e-05,3.93e-05,3.92e-05,3.88e-05,4e-05,0,0,0,4.23e-05,0,0,4.16e-05,4.11e-05,0,0,3.82e-05,3.89e-05,3.87e-05,3.86e-05,3.98e-05,3.83e-05,0,0,0,4.54e-05,0,0,0,0,0,4.34e-05,0,0,3.82e-05,3.93e-05,3.93e-05,3.87e-05,3.95e-05,4.48e-05,5.38e-05,0,0,0,0.000435,5.59e-05,0,0.0834,0.502,0.00067,0,0,3.84e-05,3.97e-05,3.96e-05,3.93e-05,4.02e-05,4.1e-05,0,0,0,0,0,4.72e-05,4.66e-05,0.0146,0,0,0,0,3.92e-05,4.03e-05,4.03e-05,4.05e-05,4.04e-05,0,4.09e-05,0,0,0,0,0,0,4.41e-05,0,0,0,0,4.07e-05,4.12e-05,0,4.64e-05,3.92e-05,3.96e-05,3.98e-05,0,0,3.59e-05,0,0,0.000143,4.28e-05,0,0.000182,0.000133,4.69e-05,0,0,0,0,3.86e-05,3.89e-05,0,0,0,0.000429,0,0,0,5.13e-05,0.000398,0.000881,0.000124,5.49e-05,0,0,0,4.02e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,5.01e-05,0,0,0,0.00265,0,0,0,0,0,0,0,0,0.000524,0,0,0,0,5.3e-05,0,0,0,4.87e-05,0,0,0,0,0,0,0,0.000205,0.000232,0,0,4.62e-05,0.0271,0,0.000207,0.00256,6.66e-05,4.71e-05,0.00093,0,0,0,0,4.12e-05,0.0187,0.000105,6.45e-05,4.29e-05,4.72e-05,0.000128,0.000137,4.79e-05,4.73e-05,7.23e-05,4.95e-05,4.37e-05,4.77e-05],"winrateAvg":0.835852,"leadAvg":0.561263,"scoreMeanAvg":0.551606,"scoreStdevAvg":1.73792,"shorttermWinlossErrorAvg":0.260665,"shorttermScoreErrorAvg":0.512828,"ownership":[99,99,99,99,-100,-99,-100,-100,-100,-100,-80,99,99,99,99,100,100,100,98,99,99,99,-100,-99,-99,-99,-100,-100,-100,99,-100,-100,100,100,100,100,98,-24,99,-100,-100,-100,-100,-100,-100,-100,-100,99,99,-100,-100,100,100,100,-100,-23,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,99,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-99,-100,-100,-100,-100,-100,-100,-100,-88,-89,-100,-94,-100,100,100,100,100,100,-99,-99,72,100,-100,-100,83,-36,-98,-86,-89,-88,-100,100,100,100,100,100,-99,-99,-99,100,100,100,100,41,16,66,100,-96,100,100,100,100,99,99,-99,-100,-99,-99,-99,100,100,100,100,78,100,-94,-94,100,100,99,100,99,-100,-100,-99,-99,100,100,100,-99,71,92,100,42,25,58,100,100,97,98,-100,-100,-100,100,100,86,100,-100,100,98,53,13,-23,-10,-100,-100,97,37,-100,-100,-100,-100,100,-100,-100,-100,100,98,99,-85,-87,-45,-100,-99,-99,18,-100,-100,-100,-100,-100,-100,100,100,100,100,98,99,99,16,-100,-99,-99,-26,-100,-100,-100,-100,-100,-100,100,98,99,100,100,73,33,-99,-99,-97,-98,-28,-100,-100,-100,-100,-100,-28,5,97,98,98,86,69,7,-26,-92,-98,-94,-67],"ownershipAllowedMAE":0.017557})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../......X...OX......./...X........X..X.O./..........O...X..../..........OX..O.O../........OOX......../.........X....OX.../.....X.....O..O..../.................../...........X.O...../..X..O......XOX..../............OXOO.../...O.OX......XXOO../......X......X...../...............O.../...O..X......XO..../.............X...../.................../","hintLoc":"null","initialTurnNumber":48,"metadata":"62860A6B0D47A6AD90972BE34C6FEEED:58","moveLocs":["J12","M15","M12","N14","L18","D9","R15","S14","O10","P9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.83,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0button1","komi":7.5,"policyOptimism":0.99,"pda":0.0,"policyMixture":[4.95e-06,5.32e-06,5.1e-06,5.19e-06,5.37e-06,5.21e-06,5.36e-06,5.09e-06,5e-06,5.13e-06,4.79e-06,5.25e-06,5.04e-06,5.04e-06,5.4e-06,5.49e-06,5.38e-06,5.15e-06,4.72e-06,5.41e-06,6.62e-06,7.39e-06,7.84e-06,7.77e-06,7.58e-06,6.83e-06,7.24e-06,8.07e-06,9.34e-06,0,5.6e-06,6.83e-06,6.08e-06,7.04e-06,8.76e-06,8.96e-06,7.33e-06,5.13e-06,5.38e-06,8.2e-06,1.11e-05,1.02e-05,1.01e-05,7.66e-06,0,7.76e-06,1.47e-05,0.000171,0,0,5.12e-06,6.41e-06,7.09e-06,8.99e-06,3.01e-05,1.03e-05,5.35e-06,5.77e-06,1.09e-05,1.54e-05,0,9.67e-06,1.05e-05,9.52e-06,1.09e-05,1.03e-05,1.1e-05,8.45e-06,5.9e-06,0,6.83e-06,5.5e-06,0,1.23e-05,0,6.22e-06,6.03e-06,2.02e-05,8.7e-05,1.19e-05,1.17e-05,1.4e-05,1.5e-05,1.26e-05,2.28e-05,6.41e-06,0,0,1.2e-05,1.15e-05,0,5.88e-06,0,0.0306,5.11e-06,5.91e-06,1.76e-05,0.000131,5.28e-05,1.55e-05,1.66e-05,2.2e-05,1.15e-05,7.61e-06,8.39e-06,0,0,0,0.184,0,0.0223,0,0,5.87e-06,5.8e-06,1.6e-05,0.000106,4.9e-05,1.78e-05,1.68e-05,3.14e-05,0.00286,0,0,0,1.22e-05,3.04e-05,0.00315,2.18e-05,8.74e-06,5.71e-06,6.2e-06,5.47e-06,5.85e-06,2.89e-05,0.0002,7.55e-05,1.34e-05,9.41e-06,1.48e-05,3e-05,0,0,1.72e-05,0,0.0568,8.43e-06,0,0,5.55e-06,6.17e-06,5.28e-06,5.99e-06,0.000237,0.0212,0.000151,9.01e-06,0,8.75e-06,1.07e-05,6.34e-06,6.19e-06,0.000493,0,0.0768,6.64e-06,0,6.9e-06,6.06e-06,6e-06,5.07e-06,6.22e-06,0.000324,0.0456,9.55e-06,1.06e-05,9.47e-06,1.25e-05,1.26e-05,1.48e-05,1.87e-05,1.37e-05,1.17e-05,0.000212,0,0.102,6.49e-06,6.91e-06,5.94e-06,4.99e-06,5.78e-06,4.85e-05,0.0389,0,1.38e-05,2.48e-05,9.01e-05,3.09e-05,2.97e-05,3.21e-05,8.93e-06,0,0.201,0,0,8.6e-06,6.04e-06,5.93e-06,4.93e-06,6.05e-06,1.78e-05,0,0.0809,1.9e-05,0,0.0002,0.000904,4.96e-05,1.6e-05,8.92e-06,1.66e-05,0,0,0,6.55e-06,6.37e-06,5.44e-06,4.8e-06,5.43e-06,0.00239,1.33e-05,6.96e-05,0.00965,2.73e-05,0.000165,3.67e-05,1.32e-05,1.11e-05,9.54e-06,3.4e-05,0,0,0,0,4.69e-06,5.74e-06,4.9e-06,5.93e-06,5.62e-05,0.00135,0,1.8e-05,0,0,6.14e-06,9.46e-06,9.18e-06,8.89e-06,9.07e-06,7.78e-06,0,0,0,0,6.25e-06,5.06e-06,5.82e-06,0.000755,0.0487,0.000612,0.0252,0.00083,0,5.78e-06,8.29e-06,8.26e-06,7.94e-06,8.22e-06,5.55e-06,0,5.65e-06,9.32e-05,2.39e-05,6.7e-06,5.14e-06,5.55e-06,3.77e-05,0.0363,0.000959,0.000506,1.55e-05,6.43e-06,7.33e-06,7.57e-06,7.95e-06,7.67e-06,6.88e-06,6.92e-06,6.76e-06,7.66e-05,0,1.72e-05,6.74e-06,4.88e-06,5.33e-06,1.48e-05,5.06e-05,0,3.68e-05,1.12e-05,0,7.34e-06,8.75e-06,7.92e-06,7.81e-06,7.52e-06,5.64e-06,0,0,8.29e-06,2.49e-05,7.18e-06,4.94e-06,5.57e-06,9.28e-06,1.31e-05,2.18e-05,7.57e-05,2e-05,8.36e-06,8.22e-06,7.15e-06,7.23e-06,6.88e-06,6.99e-06,5.32e-06,0,0.0001,4.33e-05,8.35e-06,6.74e-06,5.23e-06,4.79e-06,5.58e-06,5.57e-06,5.98e-06,5.95e-06,5.94e-06,5.72e-06,5.17e-06,5.19e-06,5.2e-06,5.29e-06,5.32e-06,5.26e-06,5.36e-06,6.4e-06,6.5e-06,6.13e-06,5.58e-06,4.84e-06,6.74e-06],"winrateAvg":0.62821,"leadAvg":1.23925,"scoreMeanAvg":1.55414,"scoreStdevAvg":11.3123,"shorttermWinlossErrorAvg":0.106369,"shorttermScoreErrorAvg":0.809177,"ownership":[-26,-27,-28,-31,-35,-38,-37,-32,-28,-37,-46,-59,-58,-52,-40,-24,-6,5,16,-26,-24,-30,-33,-37,-44,-46,-34,-29,-29,-71,-59,-61,-52,-45,-26,-5,18,25,-26,-29,-27,-38,-43,-38,-79,-14,-1,-20,32,-80,-60,-53,-43,-41,1,25,37,-30,-31,-43,-86,-38,-29,-17,-4,6,14,18,14,-78,-44,-42,-74,-15,60,47,-31,-37,-43,-34,-25,-15,-11,0,11,34,81,80,1,15,-63,-7,-55,-30,59,-29,-30,-28,-23,-17,-13,-11,1,12,46,81,33,75,6,80,17,79,81,63,-26,-27,-23,-16,-12,-13,-12,-24,58,59,-55,35,17,21,62,69,59,64,64,-26,-27,-22,-12,-7,-14,-14,-14,-75,-75,-50,-65,-4,29,91,47,64,66,64,-25,-30,-24,1,2,-65,-17,-22,-24,-21,-3,40,3,37,92,70,66,67,66,-26,-26,-20,11,6,-1,-5,-8,-15,-15,-13,-8,14,-9,45,68,71,72,69,-25,-33,4,59,20,15,1,-3,-11,-19,-21,-75,-12,96,96,84,77,76,73,-25,-33,-53,-11,40,72,9,-8,-14,-22,-29,-47,-66,96,92,94,83,81,77,-17,-22,4,20,18,20,-1,-23,-26,-29,-35,-36,-29,-76,99,99,91,84,80,-9,-8,22,77,27,60,-85,-39,-35,-37,-39,-42,-54,-77,-78,99,99,89,77,0,-2,9,34,6,-20,-85,-50,-43,-44,-44,-46,-56,-79,7,53,79,76,73,9,11,10,32,12,12,-46,-50,-48,-50,-51,-50,-60,13,30,92,66,67,62,20,21,34,72,16,-5,-80,-53,-53,-55,-56,-58,-61,-81,81,58,48,53,53,26,30,37,40,15,-10,-44,-52,-54,-57,-59,-62,-63,-82,32,16,35,38,46,31,33,33,29,15,-10,-29,-44,-50,-55,-58,-60,-63,-49,-34,4,17,30,38],"ownershipAllowedMAE":0.0310581})%"); + lines.push_back(R"%({"sample":{"board":".................../......OO.........../.OO..OX.O.XO..XXXX./O.OX...X.OXXXXOXOO./.OXOOO..XOO...OO.O./OXXXXOXXOX..XX.OO../...XOXXOO..XOOX..../...XO.....O..XO.O../...XO...XX........./...XO..X.OXXXXXX.../.........OOOO.OX.../......XO...OX.OXX../.........X.XOOXOOO./..XX...XX.XOXOX..../.X.OXXX.XOOO.O.O.../.XXOOXO.OX.O...O.../.OXXOO.OOX.XO....../..OXOX.O.XXO......./...XX.X.O........../","hintLoc":"null","initialTurnNumber":157,"metadata":"1608808C07E9F3B06312979F71C90099:167","moveLocs":["G3","A13","H9","G9","G7","G11","L14","K18","G16","H17"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.34,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.36e-05,2.37e-05,2.38e-05,2.42e-05,2.53e-05,2.75e-05,2.5e-05,2.55e-05,2.93e-05,2.74e-05,2.48e-05,2.39e-05,2.28e-05,2.3e-05,2.32e-05,2.4e-05,2.39e-05,2.36e-05,2.43e-05,2.38e-05,2.42e-05,2.43e-05,2.45e-05,4.21e-05,4e-05,0,0,0.628,0,0.000214,2.38e-05,2.34e-05,2.4e-05,2.32e-05,2.24e-05,2.32e-05,2.54e-05,2.36e-05,2.47e-05,0,0,3.53e-05,6.36e-05,0,0,0,0,0.000189,0,0,2.29e-05,2.37e-05,0,0,0,0,2.42e-05,0,2.53e-05,0,0,3.34e-05,0.00829,0,0,0.0739,0,0,0,0,0,0,0,0,0,2.38e-05,0.0001,0,0,0,0,0,0.00276,0.00628,0,0,0,2.42e-05,6.3e-05,9.76e-05,0,0,1.77e-05,0,2.5e-05,0,0,0,0,0,0,0,0,0,0,0,0.00011,0,0,6.09e-05,0,0,2.31e-05,2.48e-05,0,0.000112,2.27e-05,0,0,0,0,0,0,0.00019,0.00496,0,0,0,0,0.000133,2.33e-05,2.64e-05,2.53e-05,2.79e-05,2.27e-05,2.29e-05,0,0,0.000637,0.237,0.0042,3.4e-05,0.000107,0,0.00129,0.0111,0,0,2.83e-05,0,2.68e-05,2.56e-05,2.24e-05,2.5e-05,2.44e-05,0,0,0.000306,0,3.24e-05,0,0,3.78e-05,0.000127,8.01e-05,0.000138,2.5e-05,3.31e-05,3.14e-05,3.13e-05,2.58e-05,2.33e-05,2.61e-05,2.82e-05,0,0,0.00369,0.00291,0,0.000253,0,0,0,0,0,0,0,2.56e-05,2.88e-05,2.49e-05,2.41e-05,2.6e-05,2.92e-05,0.000179,4.75e-05,0.00252,0,0,2.55e-05,0,0,0,0,2.53e-05,0,0,2.26e-05,3.11e-05,2.5e-05,2.35e-05,2.43e-05,2.55e-05,2.58e-05,6.28e-05,0.000839,0,0,2.48e-05,2.43e-05,2.4e-05,0,0,2.46e-05,0,0,0,2.98e-05,2.48e-05,2.28e-05,2.31e-05,2.33e-05,2.5e-05,0.0004,0.000811,0,0.00375,2.46e-05,0,2.58e-05,0,0,0,0,0,0,0,2.47e-05,2.27e-05,2.27e-05,0,0,0.000172,9.6e-05,2.84e-05,0,0,2.53e-05,0,0,0,0,0,2.32e-05,2.42e-05,2.5e-05,2.66e-05,2.3e-05,0,1.8e-05,0,0,0,0,2.45e-05,0,0,0,0,2.27e-05,0,2.35e-05,0,2.34e-05,2.43e-05,2.52e-05,2.27e-05,0,0,0,0,0,0,2.28e-05,0,0,2.49e-05,0,2.39e-05,2.43e-05,2.36e-05,0,2.36e-05,2.43e-05,2.45e-05,2.35e-05,0,0,0,0,0,0,0,0,0,2.66e-05,0,0,2.39e-05,2.39e-05,2.34e-05,2.45e-05,2.44e-05,2.41e-05,2.37e-05,2.25e-05,0,0,0,0,2.45e-05,0,2.56e-05,0,0,0,2.43e-05,2.4e-05,2.36e-05,2.54e-05,2.49e-05,2.4e-05,2.46e-05,2.29e-05,2.38e-05,2.35e-05,0,0,0,0,2.25e-05,0,2.5e-05,2.68e-05,2.51e-05,2.37e-05,2.43e-05,2.39e-05,2.39e-05,2.39e-05,2.46e-05,2.31e-05,2.74e-05],"winrateAvg":0.215883,"leadAvg":-0.860508,"scoreMeanAvg":-1.38259,"scoreStdevAvg":5.42077,"shorttermWinlossErrorAvg":0.281577,"shorttermScoreErrorAvg":1.45077,"ownership":[94,96,97,97,98,98,97,83,36,-24,-89,-94,-96,-97,-97,-97,-92,-87,-68,93,95,97,97,97,97,99,99,97,-95,-90,-96,-97,-98,-99,-98,-96,-67,-65,90,98,99,96,94,97,-91,-90,99,47,-100,-96,-99,-99,-100,-100,-99,-99,45,92,75,99,93,94,89,88,-92,73,98,-100,-100,-100,-100,98,-100,98,98,57,69,79,-99,95,96,95,-17,-91,-92,97,97,10,-65,14,99,98,98,98,91,67,-98,-99,-99,-99,95,-99,-98,-66,-78,97,1,-100,-100,24,98,98,97,94,-83,-84,-91,-99,-93,-98,-98,-68,-70,-81,84,-93,-77,-72,-83,39,81,92,83,-84,-88,-91,-99,-93,-97,-84,-83,-83,-83,85,-23,-79,-84,46,35,97,85,44,-88,-91,-93,-99,-94,-96,-99,-91,-99,-99,4,-24,-71,-39,-37,0,25,1,8,-90,-93,-94,-99,-94,-96,-98,-99,0,99,-99,-100,-100,-100,-100,-100,-25,-21,-36,-93,-94,-95,-95,-96,-95,-99,95,64,100,100,100,100,-59,98,-100,-71,-46,-36,-95,-95,-95,-96,-95,-94,-99,94,42,-25,28,100,97,98,98,-100,-99,-7,24,-97,-97,-97,-96,-95,-94,78,80,-52,-91,7,9,100,100,96,99,99,99,71,-98,-99,-100,-100,-97,-58,-13,-97,-97,-1,-30,100,99,100,97,98,97,96,95,-99,-100,-83,95,-99,-98,-98,-78,-97,100,100,100,99,100,99,100,96,96,95,-100,-100,-100,94,94,-99,93,-2,93,92,97,100,98,98,97,100,96,95,94,-100,-99,-100,-100,94,93,93,94,94,92,98,97,99,96,96,96,94,94,94,-100,-100,-99,-100,94,-99,-15,93,94,92,92,98,94,95,94,93,93,93,93,-100,-100,-100,-100,-100,-99,-98,-66,93,91,94,94,95,94,94,93,93,93,93],"ownershipAllowedMAE":0.0583215})%"); + lines.push_back(R"%({"sample":{"board":"............XO.O/.........OOOO.O./......X..OXOOOXO/...OOOXOOXXXXX../.OO.XXXXX.....X./.XX...........O./.......XO......./......OOXO....X./.XOOO..XXX...OX./.XOXO...X.XX..../.OXXO.O.XOXOO.../.X.XXOOXO.OXXO../..XXXXO..OO.XO../..XOOXO..OX.XX../..XO.O..O.OX..../..XXO....O.OX.../","hintLoc":"null","initialTurnNumber":121,"metadata":"28F78A1686417064EB4EC6ECFEFA3EDC:131","moveLocs":["O10","O9","N9","P10","O11","Q12","N7","O7","N8","O6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.77,"xSize":16,"ySize":16},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":33.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000101,0.000116,0.000118,0.000127,0.000136,0.000126,0.000127,0.000122,0.000113,0.000104,9.94e-05,0.0001,0,0,9.77e-05,0,0.00012,0.000128,0.000134,0.000175,0.000478,0.000464,0.000139,0.000325,0.00012,0,0,0,0,9.97e-05,0,0.000103,0.000117,0.000135,0.000137,0.000124,0.000128,0.000162,0,0.000116,0.000122,0,0,0,0,0,0,0,0.000125,0.000127,0.000123,0,0,0,0,0,0,0,0,0,0,0,0.00111,0.000109,0.000135,0,0,0.000224,0,0,0,0,0,0.00011,0.000111,0.000109,0.000108,0.00153,0,0,0.000138,0,0,0.000395,0.000125,0.000116,0.00012,0.000617,0.000105,0.000167,0.000128,0.000235,0.000123,0,0,0.000463,0.000124,0.000131,0.000142,0.00018,0.000189,0.000192,0.0117,0,0,0.0577,0.396,0.00171,0.00122,0,0,0.000367,0.000119,0.000707,0.000123,0.000121,0.000117,0.000119,0,0,0,0,0.00207,0.000217,0,0,0,0.000183,0.000139,0,0,0,0,0.000118,0.000132,0,0,0,0.000299,0.000127,0,0,0,0.000641,0.000126,0,0,0,0,0.000106,0.000112,0.000108,0,0.000103,0,0,0,0,0.00406,0.00122,0.000115,0,0,0,0,0.0001,0,0.000137,0,0,0,0,0,0,0.00848,0.0043,0.000107,0,0,0,0,0,0,0,0,0.000118,0,0,0,0,0.297,0.00144,9.94e-05,0.0001,0,0,0,0,0,0.000109,0.000105,0,0,0.000324,0,0,0.000802,0.000572,9.71e-05,9.91e-05,0,0,0,0,0,0.000105,0.000104,0,0,0.0719,0,0,0.11,0.00017,9.65e-05,9.77e-05,0,0,0.000114,0,0.000218,0.000147,0,0.000105,0,0,0.000614,0.0024,0.000861,0.000382,9.71e-05,9.68e-05,0,0,0,0.000114,0.000142,0.000113,0.000103,0,0.000117,0,0,0.0055,0.000503,0.000116,0.000104],"winrateAvg":0.0459601,"leadAvg":-14.844,"scoreMeanAvg":-13.8833,"scoreStdevAvg":9.55909,"shorttermWinlossErrorAvg":0.142707,"shorttermScoreErrorAvg":3.81625,"ownership":[76,74,70,57,31,-16,-25,-3,51,78,96,99,99,99,99,99,75,74,72,65,37,-8,-65,30,50,100,100,100,100,99,99,94,73,74,76,68,33,-38,-100,-46,24,99,-100,100,100,100,23,94,70,75,80,87,86,84,-100,24,27,-100,-100,-100,-100,-100,25,-44,-5,86,85,-47,-100,-100,-100,-100,-100,-95,-95,-95,-95,-95,-98,-98,-33,-89,-89,-44,-37,-30,-40,-78,-91,-91,-91,-92,-93,-87,-86,-93,-41,-39,-6,-14,7,15,50,-84,-63,-80,-80,-90,-91,-90,-99,-95,-20,9,11,39,47,57,85,83,-91,-76,-88,-88,-85,-99,-99,-95,-18,-93,99,99,99,60,-28,-91,-93,-93,-88,-89,-86,-85,-99,-95,-75,-94,98,-100,99,65,48,4,-93,-45,-92,-93,-85,-99,-98,-94,-96,-95,-100,-100,99,97,100,38,-91,80,-92,-83,-84,-99,-96,-93,-98,-100,-100,-100,-100,100,100,33,94,80,100,-98,-98,-89,-85,-89,-99,-100,-100,-100,-100,-100,100,77,84,100,100,25,-98,-88,-87,-85,-100,-100,-100,-90,-91,-100,100,93,94,100,71,72,-97,-97,-78,-83,-100,-100,-100,-91,-89,86,88,96,100,97,98,-43,-44,-72,-83,-76,-99,-100,-100,-100,4,4,80,94,97,99,60,58,-57,-54,-69,-75],"ownershipAllowedMAE":0.0468931})%"); + lines.push_back(R"%({"sample":{"board":".................../...OXOO...X......../..X.OXX.OOX.X...O../..XO.OX...OX.X.X.O./...X.OX.O.OO.XO..../..X..X......OXO.O../...........XXO.O.../..........XXO....../...........O.OO..../..........XXOO.XX../.XX.........XOXXO../.OOXX......X.XXOX../...OOX.........O.O./..O.OX....O......../..OO.X.X....OOO..../.X.XXXO.XOO.X.XOO../.O.XOO.O.XO...XXO../.X...OX.OOXX....XO./................X../","hintLoc":"null","initialTurnNumber":119,"metadata":"32BA909C85CD3E3CF02978B89DC553B9:129","moveLocs":["P18","N15","M14","O18","P17","O17","J12","S9","R7","G12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.98,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.38e-06,8.51e-06,7.85e-06,7.24e-06,0.00423,6.7e-06,6.8e-06,8.38e-06,8.39e-06,3.48e-05,1.09e-05,1.55e-05,1.91e-05,1.74e-05,8.42e-06,7.34e-06,7.72e-06,7.43e-06,7.17e-06,8.47e-06,1.06e-05,1.84e-05,0,0,0,0,9.51e-06,8.7e-06,0.00144,0,0.026,8.53e-06,0,0,7.48e-06,7.52e-06,7.17e-06,7.11e-06,8.14e-06,9.11e-06,0,0.000375,0,0,0,1.05e-05,0,0,0,4.49e-05,0,0,0,7.63e-06,0,6.98e-06,7.22e-06,7.56e-06,7.66e-06,0,0,3.32e-05,0,0,7.97e-06,6.96e-06,7e-06,0,0,0,0,9.28e-06,0,7.33e-06,0,7.19e-06,7.3e-06,7.96e-06,8.23e-06,0,7.34e-06,0,0,9.77e-06,0,8e-06,0,0,0,0,0,7.22e-06,7.57e-06,7.26e-06,7.42e-06,7.12e-06,7.93e-06,0,8.29e-06,1.43e-05,0,1.84e-05,0.0173,1.29e-05,1.07e-05,8.11e-06,0,0,0,0,6.75e-06,0,7.75e-06,7.62e-06,7.36e-06,8e-06,8.81e-06,8.74e-06,8.5e-06,0.000128,0.196,0.000127,0.000111,0.00116,9.96e-06,0,0,0,7.08e-06,0,7.65e-06,8.3e-06,8.04e-06,7.52e-06,8.96e-06,9.83e-06,9.91e-06,1.04e-05,1.2e-05,0,0.0429,0,0.000633,0,0,0,7.03e-06,7.38e-06,7.45e-06,8.71e-06,9.33e-06,7.73e-06,8.79e-06,9.33e-06,1.14e-05,1.25e-05,1.22e-05,1.24e-05,0.0465,0.225,0.0424,1.02e-05,0.000959,0,7.28e-06,0,0,7.99e-06,8.1e-06,1.45e-05,7.52e-06,1.23e-05,1.73e-05,1.28e-05,8.65e-05,8.45e-05,9.42e-05,8.56e-05,0.00148,0.189,2.9e-05,0,0,0,0,6.32e-06,0,0,7.23e-06,7.8e-06,0.00659,0,0,0.0495,1.72e-05,0.000204,3.91e-05,8.58e-05,0.000941,0.00771,0.00787,9.18e-06,0,0,0,0,0,0,7.73e-06,1.93e-05,0,0,0,0,0.000693,2.63e-05,4.43e-05,9e-05,0.000114,0.000216,0,8.73e-06,0,0,0,0,8.17e-06,7.29e-06,8.58e-06,7.11e-06,6.46e-06,0,0,0,9.65e-06,8.67e-05,0.00012,0.000425,1.32e-05,9.31e-06,0.00353,7.89e-06,7.31e-06,0,0,0,6.87e-06,8.86e-06,8.2e-06,0,4.91e-06,0,0,8.31e-06,1.58e-05,3.97e-05,1.14e-05,0,8.59e-06,7.89e-06,7.26e-06,7.04e-06,6.97e-06,7.22e-06,6.91e-06,7.02e-06,9.4e-06,1e-05,0,0,6.59e-06,0,3.66e-05,0,1.05e-05,9.5e-06,8.43e-06,8.76e-06,0,0,0,7.45e-06,7.44e-06,7.28e-06,7.3e-06,9.97e-06,0,0.000111,0,0,0,0,1.05e-05,0,0,0,1.44e-05,0,0.00412,0,0,0,8.81e-06,8.23e-06,8.82e-06,0,8.66e-06,0,0,0,8.59e-06,0,1.7e-05,0,0,6.57e-05,0.0012,2.87e-05,0,0,0,9.07e-06,8.91e-06,8.38e-06,0,9.47e-06,0.000197,6.89e-06,0,0,1.01e-05,0,0,0,0,0.0235,0.0385,0.000365,0.000213,0,0,8.77e-06,6.61e-06,8.45e-06,7.97e-06,7.56e-06,8.46e-06,7.38e-06,9.35e-06,8.41e-06,7e-06,1.42e-05,0.00105,1.03e-05,2.31e-05,6.3e-05,0.034,1.08e-05,0,0.0201,7.44e-06,6.89e-06],"winrateAvg":0.407473,"leadAvg":-0.294002,"scoreMeanAvg":-0.438206,"scoreStdevAvg":11.9032,"shorttermWinlossErrorAvg":0.194967,"shorttermScoreErrorAvg":1.40983,"ownership":[-25,20,36,61,73,79,73,49,6,-27,-72,-92,-88,-59,-47,63,82,89,91,-64,-40,-4,72,48,84,85,72,68,2,-96,-93,-95,-97,93,78,92,92,94,-77,-78,-99,-65,51,-91,-90,18,91,91,-95,-95,-96,-96,91,34,98,96,95,-84,-94,-99,-12,-28,-16,-90,-16,37,86,91,-95,-95,-96,-4,-5,25,98,92,-88,-93,-97,-99,-73,-18,-89,-5,85,60,91,91,-96,-96,97,32,39,79,80,-88,-93,-99,-81,-72,-93,-42,-1,24,29,41,91,91,-97,98,79,98,66,54,-85,-87,-79,-70,-65,-53,-4,3,29,18,-19,-80,-80,91,92,98,38,5,22,-81,-81,-76,-68,-63,-61,-83,17,79,8,-79,-80,82,80,72,-6,-9,-16,-16,-75,-80,-77,-65,-59,-50,-27,32,33,-35,-62,31,29,94,94,-3,-44,-30,-41,-68,-76,-74,-68,-54,-35,-7,22,30,-23,-92,-93,94,94,-6,-93,-93,-67,-64,-18,-89,-90,-65,-50,-31,-6,7,5,0,-13,-88,-92,94,-93,-93,-61,-90,-48,10,89,89,-91,-91,-46,-15,-5,-2,-15,-22,-93,-87,-93,-93,99,-61,19,-1,72,80,90,90,89,-98,-38,-11,0,-14,19,-20,59,-35,-20,99,99,99,44,66,85,90,91,90,-99,-45,-34,-3,21,90,35,50,30,35,90,95,93,88,38,19,89,89,-2,-99,-5,-83,-24,10,57,56,99,99,99,96,95,93,90,-24,-78,26,-99,-99,-99,77,-7,-71,94,94,29,-49,40,-80,99,99,94,88,-70,-62,-88,-99,80,80,72,88,-13,-7,94,-2,-34,-49,-81,-82,99,77,81,-79,-93,-80,6,22,80,54,84,88,88,-78,-77,-63,-55,-75,-56,-57,77,70,-83,-82,-66,-27,23,49,64,76,74,35,7,-50,-58,-58,-42,-48,-59,44,55],"ownershipAllowedMAE":0.0402064})%"); + lines.push_back(R"%({"sample":{"board":"................./.....O.........../..OO............./..XXX........X.../................./................./................./................./................./................./................./................./................./................./...O........OOO../.............XX../...........X...../................./","hintLoc":"null","initialTurnNumber":14,"metadata":"778C420BEB75ADE2488C9425DD0218CA:24","moveLocs":["C4","C3","C5","D3","D5","C9","B16","P13","F5","G3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.85,"xSize":17,"ySize":18},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":10.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.54e-05,2.45e-05,1.85e-05,1.94e-05,1.82e-05,1.81e-05,1.76e-05,1.8e-05,1.87e-05,1.97e-05,2.01e-05,1.98e-05,2.01e-05,1.99e-05,1.9e-05,1.9e-05,1.66e-05,2.14e-05,0.0179,4.09e-05,2.86e-05,0.0113,0,4.49e-05,4.43e-05,3.65e-05,3.73e-05,3.78e-05,4.27e-05,4.33e-05,3.68e-05,3.07e-05,2.42e-05,1.86e-05,1.72e-05,0,0,0,0.0977,0.00541,0.00267,0.000103,0.000269,0.000307,0.00911,0.0559,0.000158,4.48e-05,0.000157,3.79e-05,1.89e-05,1.85e-05,2.36e-05,0,0,0,2.58e-05,5.46e-05,8.16e-05,0.000181,0.000235,0.00133,0.0123,3.69e-05,0,0.000102,0.000207,2.07e-05,1.89e-05,0.000303,1.85e-05,1.6e-05,1.82e-05,2.79e-05,4.14e-05,6.21e-05,7.92e-05,0.000101,0.000139,0.000151,0.000193,3.54e-05,0.0288,0.00117,2.02e-05,1.85e-05,2.82e-05,3.48e-05,2.94e-05,3.21e-05,3.83e-05,5.17e-05,6.31e-05,7.5e-05,9.12e-05,9.96e-05,0.000198,0.000303,0.000251,0,3.3e-05,1.9e-05,1.94e-05,6.65e-05,0.000169,6.5e-05,5.78e-05,8.67e-05,9.09e-05,9.26e-05,8.95e-05,0.000104,0.000139,0.000172,8.25e-05,0.000132,6.1e-05,4.69e-05,2.03e-05,1.99e-05,7.45e-05,0.0437,0.0013,0.000395,0.000349,0.000215,0.000145,0.000114,0.00012,0.000158,0.000241,0.000374,0.00388,0.205,6.81e-05,2.09e-05,1.94e-05,4.42e-05,8.98e-05,0.000663,0.037,0.0013,0.000333,0.000188,0.000132,0.000138,0.000182,0.000245,0.000333,0.00813,0.0556,5.09e-05,2.04e-05,1.99e-05,3.58e-05,0,0.00116,0.141,0.00426,0.000538,0.000211,0.000141,0.000152,0.000206,0.000266,0.00045,0.0437,0.0718,5.02e-05,2.04e-05,1.96e-05,9.08e-05,0.00016,0.000145,0.0325,0.00486,0.000465,0.000188,0.000145,0.000164,0.000237,0.000288,0.00039,0.00609,0.064,4.78e-05,2.03e-05,2.06e-05,5.18e-05,0.000178,5.25e-05,4.83e-05,0.000184,0.000167,9.49e-05,0.000102,0.00015,0.000224,0.000262,0.000349,0.00034,0.00201,4.75e-05,2.03e-05,1.98e-05,2.51e-05,2e-05,2.08e-05,3.06e-05,3.06e-05,4.14e-05,6.08e-05,8.65e-05,0.000106,9.08e-05,5.79e-05,6.4e-05,7.21e-05,0.000266,4.57e-05,2.04e-05,2.18e-05,2.63e-05,0,0,2.57e-05,0,2.92e-05,6.18e-05,6.45e-05,6.89e-05,5.17e-05,4.11e-05,2.13e-05,1.88e-05,1.99e-05,3.32e-05,1.89e-05,2.29e-05,2.42e-05,0,0,4.62e-05,3.14e-05,0.00156,0.000398,4.86e-05,4.89e-05,6.27e-05,3.89e-05,0,0,0,5.54e-05,1.89e-05,2.02e-05,0.000898,0,0,1.74e-05,0.0041,0,4.42e-05,4.64e-05,4.19e-05,0.000254,3.77e-05,3.03e-05,0,0,0.000147,2.27e-05,2e-05,2.12e-05,2.08e-05,2.17e-05,2.35e-05,2.49e-05,4.38e-05,3.63e-05,2.89e-05,3.22e-05,2.79e-05,0,1.96e-05,1.98e-05,1.7e-05,2.62e-05,1.75e-05,1.65e-05,2.36e-05,1.87e-05,1.86e-05,1.88e-05,2.03e-05,1.96e-05,1.97e-05,1.92e-05,1.79e-05,1.77e-05,1.59e-05,1.72e-05,1.84e-05,1.79e-05,1.72e-05,1.6e-05,1.35e-05],"winrateAvg":0.847299,"leadAvg":3.5187,"scoreMeanAvg":5.29971,"scoreStdevAvg":12.5618,"shorttermWinlossErrorAvg":0.0612456,"shorttermScoreErrorAvg":0.689998,"ownership":[-7,-1,2,2,8,6,10,9,9,10,9,6,1,-1,-2,-2,1,-17,6,1,8,0,32,3,6,6,8,10,9,1,-3,-3,1,1,-16,-33,28,24,-48,-25,-10,-2,2,5,3,10,-11,-18,-2,3,2,-32,-25,-88,-90,-90,-36,-15,-6,-3,0,3,-23,-25,-69,-21,4,3,-32,-44,-42,-41,-33,-18,-10,-6,-3,-2,-2,-12,-8,-13,-17,2,8,-23,-20,-17,-16,-14,-10,-7,-5,-3,-1,-1,-4,2,0,53,19,11,-7,-9,1,-6,-8,-8,-5,-4,-2,-1,0,0,2,6,7,11,9,7,9,0,12,-7,-7,-5,-4,-3,-2,-1,0,-1,-2,-16,-1,2,19,21,20,4,-6,-7,-6,-4,-3,-2,-2,-1,-2,-2,-5,-4,-2,24,32,63,13,-15,-8,-7,-5,-3,-2,-2,-2,-3,-4,-4,-4,-2,16,16,19,0,-8,-9,-7,-4,-3,-1,0,0,-2,-3,-9,-1,2,-1,3,25,-4,-7,-15,-10,-5,-2,0,2,3,3,5,2,10,10,-22,-20,-24,-25,-17,-25,-13,-7,-3,2,6,9,12,14,15,16,20,-31,-53,-74,-74,-29,-73,-23,-9,-2,4,9,14,28,34,38,38,19,-23,-17,-74,82,12,-3,-9,-8,0,2,13,32,78,78,78,9,9,9,5,83,83,48,10,78,22,2,-3,-12,32,-14,-75,-75,-21,-19,23,62,65,73,63,64,48,29,5,-14,-31,-65,-52,-64,-58,-57,-32,47,58,65,66,62,52,40,22,2,-17,-33,-45,-55,-59,-59,-55,-46],"ownershipAllowedMAE":0.0319337})%"); + lines.push_back(R"%({"sample":{"board":"...............X.../....OOX.......XOOO./.O.OXXX.....X.XXO../..XO........XOOX.../..XOXXO..O.....XOOO/.XOOXO.OOXXXXO.XXXX/.OXX.XOOXO.XOO.XOOX/...OXOOXXO.....O.OX/....XXOXXOX...O.OOO/..XXX.XOXXO....OXO./...OO..O.X....O.XXX/......O..........XO/.O.O............OO./.XO......X.O.O.O.../X.XO........XO...../.XXO.....X.OOXOOX../..XO...X.....X.XX../.XO.........X....../.................../","hintLoc":"null","initialTurnNumber":121,"metadata":"5A56D386D14A7630B390FF9ED6972A3A:131","moveLocs":["E13","C12","B12","F13","F9","F10","E13","C11","J17","F13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.23,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.4e-06,3.83e-06,3.59e-06,3.92e-06,3.64e-06,3.66e-06,1.27e-05,3.77e-05,2.68e-05,4.72e-06,4.54e-06,4.5e-06,4.49e-06,4.28e-06,3.85e-06,0,4.33e-06,3.8e-06,3.86e-06,3.76e-06,3.96e-06,7.81e-06,6.32e-06,0,0,0,0.25,1.97e-05,0.0163,0.0381,0.00337,0.000952,0.00022,0,0,0,0,3.48e-06,3.9e-06,0,1.21e-05,0,0,0,0,0.000929,0,0.000101,0.0087,0.0167,0,0.0105,0,0,0,3.74e-06,3.66e-06,4.02e-06,4.54e-06,0,0,4.1e-05,3.47e-06,2.17e-05,0.26,0.00273,4.52e-06,0.00296,0.000413,0,0,0,0,3.52e-06,3.75e-06,3.63e-06,4.37e-06,0.000849,0,0,0,0,0,3.66e-06,4.41e-05,0,8.49e-06,4.46e-05,0.0105,6.46e-06,3.97e-06,0,0,0,0,6.14e-06,0,0,0,0,0,2.96e-06,0,0,0,0,0,0,0,3.85e-06,0,0,0,0,3.85e-06,0,0,0,0,0,0,0,0,0,3.1e-06,0,0,0,3.65e-06,0,0,0,0,3.79e-06,0,0,0,0,0,0,0,0,0,0.00221,0.000987,7.29e-06,4.81e-06,3.61e-06,0,3.42e-06,0,0,3.94e-06,1.69e-05,0,2.84e-06,0,0,0,0,0,0,0,0.00995,2.43e-05,3.89e-06,0,3.45e-06,0,0,0,3.99e-06,4.35e-06,0,0,0,0,0,0,0,0,0,0.000264,4.28e-06,3.55e-06,3.51e-06,0,0,0,3.71e-06,4.31e-06,5.73e-06,3.93e-06,0,0,0,3.68e-06,0,9.32e-06,0,0.00155,6.04e-06,4.05e-06,3.68e-06,0,3.56e-06,0,0,0,4.05e-06,3.85e-06,3.54e-06,3.63e-06,3.44e-06,3.6e-06,0,3.7e-06,4.77e-06,0.0693,2.28e-05,4.41e-06,3.8e-06,3.51e-06,3.51e-06,3.35e-06,3.33e-06,0,0,3.9e-06,0,3.54e-06,0,3.78e-06,3.9e-06,3.98e-06,4.13e-06,4.63e-06,1.63e-05,4.86e-06,3.89e-06,3.54e-06,3.57e-06,3.49e-06,3.57e-06,0,0,3.75e-06,4.09e-06,0,0,3.47e-06,3.8e-06,3.99e-06,4.28e-06,4.12e-06,4.06e-06,0,4.01e-06,0,3.52e-06,0,3.39e-06,0,3.67e-06,3.99e-06,4.06e-06,0,0,0,0,3.65e-06,4.06e-06,4.44e-06,4.36e-06,4.52e-06,3.91e-06,3.91e-06,3.62e-06,0,0,3.36e-06,3.39e-06,3.84e-06,4.11e-06,4.11e-06,3.57e-06,0,0,0,3.51e-06,4.05e-06,4.17e-06,4.03e-06,4.8e-06,0,4.29e-06,0,0,0,0,0,0,3.9e-06,4.04e-06,3.97e-06,3.72e-06,0,0,3.53e-06,4.22e-06,3.98e-06,0,5.13e-06,5.64e-06,1.08e-05,3.94e-06,0.00175,0,0.288,0,0,3.94e-06,3.76e-06,3.83e-06,0,0,3.61e-06,3.81e-06,3.9e-06,4.29e-06,4.07e-06,4.47e-06,4.5e-06,4.39e-06,1.02e-05,0,0.00158,0.000391,5.52e-06,4.09e-06,3.86e-06,3.91e-06,3.17e-06,3.82e-06,3.39e-06,3.54e-06,3.56e-06,3.61e-06,3.73e-06,3.78e-06,3.67e-06,3.79e-06,3.68e-06,3.9e-06,3.98e-06,1.22e-05,4.75e-06,3.67e-06,3.61e-06,3.89e-06,3.32e-06,6.07e-06],"winrateAvg":0.713109,"leadAvg":2.36403,"scoreMeanAvg":3.60494,"scoreStdevAvg":13.6924,"shorttermWinlossErrorAvg":0.25881,"shorttermScoreErrorAvg":2.93909,"ownership":[71,69,62,44,17,-28,-44,-27,0,-1,-13,-31,-51,-62,-51,-48,39,44,53,73,69,61,45,43,41,-82,7,6,-2,-9,-32,-51,-64,-88,61,61,58,51,73,81,63,88,-79,-81,-82,-22,38,-2,-21,-36,-94,-28,-88,-88,60,56,58,63,59,24,88,9,-59,-35,-7,12,-19,-31,-48,-94,38,42,-87,-49,59,56,48,25,19,88,-78,-78,9,-1,7,15,-48,-66,-27,6,1,-88,59,59,57,24,18,88,90,-79,-18,-20,20,21,-97,-96,-97,-96,85,15,-88,-88,-88,-88,8,17,-92,-92,-52,-48,16,18,-95,-69,-84,-96,86,86,-5,-89,99,99,-89,-25,18,-91,-90,-91,12,12,-96,-95,-70,-70,-11,17,67,75,100,99,100,-89,-40,-37,-91,-90,-91,-92,9,-95,-95,-70,-78,7,21,50,100,99,100,100,100,-28,-52,-91,-92,-92,-92,-92,75,-94,-94,3,-9,17,38,74,100,83,100,94,-1,5,12,88,89,89,10,75,-7,-94,-54,-15,14,41,99,92,84,83,83,25,13,12,46,60,64,87,32,-1,17,-3,5,21,42,70,89,90,82,86,14,61,53,88,47,37,24,-2,1,-9,9,24,28,52,74,87,98,98,79,-47,-83,77,69,18,27,1,-2,-18,-73,8,93,85,98,85,97,42,59,50,-87,-83,-90,85,36,22,2,-8,-19,-39,1,77,77,98,85,24,-3,-20,2,-86,-89,-89,85,38,10,7,-20,-37,-79,-8,86,87,-65,91,90,-84,-61,-40,-86,-87,-89,86,42,4,-12,-74,-42,-41,-2,30,36,-70,61,-84,-83,-75,-61,-80,-86,17,18,47,9,-10,-39,-42,-30,-22,3,-74,-61,-70,-76,-80,-74,-69,-70,-27,-24,27,33,19,-8,-27,-34,-29,-16,-20,-34,-55,-64,-73,-77,-76,-73],"ownershipAllowedMAE":0.0414673})%"); + lines.push_back(R"%({"sample":{"board":".O.OOO.O......X.O../..O.O.OOXO.X..XO.O./..O..OXOXOOXXX.XO../...OOXXOXO.XOO.XOO./.OO.OXXXOOOOXX.XO.O/OOXXOO.XOXOXO.OXXO./OX..OXX.XXXXXXOX.X./X.XO.O.X..XOOOXX..X/.XXOO.O.XOOO..OXXXO/X.XO.XOOXXXOOOOOOOO/.XOOXXOX.XXXXXXOO../XOOXXOX.XOOOOOOXXOO/.XXXOOXX.OXXXXXOXXX/..XOO.O.XOXOOXXO.X./.XOO.O.OOXXO.OX..../..XO.XO.OOO.OOXX.O./..XOOOXOO..OOX.XX../.XXXOXX.....OX.X.../..XOO.......OXX..../","hintLoc":"null","initialTurnNumber":266,"metadata":"DCEEF1BAFD954A130CA72341ECF8BCC0:276","moveLocs":["T13","T14","Q19","R18","F11","G12","L19","L18","K12","E12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.17,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000709,0,0,0,0,0,0,0,0.000456,0.0411,0,0.0747,0.000719,0.000727,0,0,0,0.000696,0.000703,0.000706,0.000693,0,0.000702,0,0,0,0,0,0,0,0,0.000758,0.000988,0,0,0,0,0.000708,0.000696,0.000696,0,0.000729,0.0139,0,0,0,0,0,0,0,0,0,0.00573,0,0,0.000696,0.0132,0.00071,0.000722,0.000731,0,0,0,0,0,0,0,0.0356,0,0,0,0.0078,0,0,0,0.0144,0.000708,0,0,0.00013,0,0,0,0,0,0,0,0,0,0,0.00804,0,0,0,0,0,0,0,0,0,0,2.91e-05,0,0,0,0,0,0,0.00858,0,0,0,0,0,0,0,0.21,0.0356,0,0,0,0.153,0,0,0,0,0,0,0,0,0.00736,0,0,0,0.00175,0,0,0,0,0,0,0.00235,0,0,0,0,0,0,0,0.000786,0.00644,0,0.00139,0,0,0,0,0,0,0.07,0,0,0,0,0.000731,0.000704,0,0,0,0,0,0,0.00118,0,0,0.0357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00549,0,0,0,0,0,0,0,0.00401,0,0,0,0,0,0,0,0,0.014,0.014,0,0,0,0,0,0,0,0.00162,0,0,0,0,0,0,0,0,0,0,0,0.00689,0,0,0,0,0,0,0,0.00981,0,0,0,0,0,0,0,0,0,0,0.000745,0.00693,0,0,0,0,0,0.0878,0,0,0,0,0,0,0,0,0.007,0,0.000756,0.000744,0,0,0,0.000734,0,0,0,0,0,0,0,0,0,0,0.00639,0.000771,0.00608,0.000737,0.000748,0.00656,0,0,0.000733,0,0,0,0,0,0,0,0,0,0,0,0.0056,0,0.00175,0.000719,0.000762,0,0,0,0,0,0,0,0.000698,0.0007,0,0,0,0.00128,0,0,0.00407,0.000716,0.000723,0,0,0,0,0,0,0.000723,0.00072,0.000727,0.000726,0.000707,0,0,0.00151,0,0.000761,0.000727,0.000713,0.000736,0.000732,0,0,0,0.000741,0.000729,0.000752,0.000726,0.000715,0.000715,0.000715,0,0,0,0.00162,0.000721,0.000718,0.000717,0.0182],"winrateAvg":0.000294195,"leadAvg":-14.0498,"scoreMeanAvg":-14.0088,"scoreStdevAvg":0.879192,"shorttermWinlossErrorAvg":0.00680341,"shorttermScoreErrorAvg":0.399658,"ownership":[100,100,100,100,100,100,100,100,100,64,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,100,100,100,34,-100,-100,-99,-99,-100,100,100,100,100,100,100,69,100,-100,-100,-100,100,100,100,100,-100,-100,-99,-100,100,100,100,100,100,-100,-100,100,100,11,-100,100,-100,100,-100,-99,-99,-99,-100,-100,100,100,100,-100,-100,-31,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,100,-30,-100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,-100,100,29,-100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-100,-100,100,100,100,100,19,-100,-100,-100,100,100,-100,-100,-99,-99,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,100,100,-100,-99,-99,-99,-99,-100,-100,-100,100,99,99,100,100,100,100,100,100,100,100,-100,-100,-99,-99,-99,-100,-100,-100,100,100,100,98,100,100,100,100,100,100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-100,100,98,98,99,99,99,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,99,99,99,99,99,100,100,100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.00822734})%"); + lines.push_back(R"%({"sample":{"board":"......O.O.O..../.....OXO..O.X../....XXXXOO...../...X..XXX..X.../............X../.........X.XO../......O.O....../.............../...O...O......./...........X.../........O.XOX../...O.........../...OX.X.O..X.../.............../.............../","hintLoc":"null","initialTurnNumber":38,"metadata":"8A1F40EBF66375367E13E2EBE716E139:48","moveLocs":["K14","C10","F6","M2","C5","D5","L2","C8","C6","D6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.11,"xSize":15,"ySize":15},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":42.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.81e-06,2.87e-06,2.82e-06,2.99e-06,3.17e-06,2.46e-06,0,0,0,2.2e-06,0,1.88e-06,2.26e-06,2.36e-06,1.78e-06,3.22e-06,5.98e-06,5.23e-06,4.77e-06,3.78e-06,0,0,0,3.02e-06,0,0,2.96e-06,0,3.16e-06,2.39e-06,3.9e-06,2.92e-05,1.3e-05,3.62e-06,0,0,0,0,0,0,2.47e-06,3.17e-06,3.16e-06,3.19e-06,2.22e-06,4.75e-06,0.00152,3.63e-05,0,2.48e-06,2.24e-06,0,0,0,3.03e-06,2.57e-06,0,3.28e-06,3.27e-06,2.24e-06,3.81e-06,0.0331,0.0116,5.67e-06,4.59e-06,3.47e-06,2.8e-06,2.61e-06,2.97e-06,2.94e-06,2.84e-06,2.75e-06,0,3.4e-06,2.39e-06,3.36e-06,6.32e-05,0,0.000478,0.000102,1.45e-05,1.06e-05,7.1e-06,5.46e-06,0,4.04e-06,0,0,3.85e-06,2.24e-06,4e-06,0.00451,3.52e-05,0.00244,0.000198,0.00471,0,1.19e-05,0,3.14e-05,9.4e-06,6.45e-06,4.88e-06,3.42e-06,2.16e-06,3.83e-06,0.000308,0,6.18e-06,0.000236,0.000428,0.00303,0.0346,9.66e-05,0.000337,6.35e-05,7.31e-06,4.7e-06,3.61e-06,2.12e-06,3.7e-06,1.01e-05,6.32e-06,0,7.19e-06,3.99e-05,0.000907,0,0.00136,0.0423,2.14e-05,5.75e-06,4.27e-06,3.51e-06,2.12e-06,3.73e-06,4.09e-06,0,0,3.19e-06,0,1.12e-05,0.00538,0.0213,0.000115,4.61e-06,0,3.25e-06,3.48e-06,2.21e-06,3.77e-06,4e-06,0,0,3.64e-06,1.06e-05,0.0163,0.0074,0,3.24e-05,0,0,0,3.25e-06,2.38e-06,3.36e-06,8.66e-06,6.71e-06,0,6.03e-06,3.18e-05,1.19e-05,0.000136,0.0426,4.41e-05,6.47e-06,4.67e-06,2.92e-06,3.12e-06,2.15e-06,4.1e-06,0.00432,2.05e-05,0,0,3.43e-06,0,0.000407,0,0.00268,0.00164,0,4.17e-06,3.38e-06,2.12e-06,3.47e-06,0.00107,0.589,0.0334,3.73e-05,0.00012,9.24e-06,0.00171,0.126,0.00269,0,0,1.31e-05,3.26e-06,2.25e-06,2.19e-06,3.79e-06,4.48e-06,5.04e-06,4.25e-06,4.18e-06,4.44e-06,6.15e-06,7.38e-06,2.14e-05,7.16e-06,5.72e-06,2.6e-06,2.37e-06,1.66e-06,4.79e-06],"winrateAvg":0.0767107,"leadAvg":-4.71172,"scoreMeanAvg":-6.18431,"scoreStdevAvg":8.91848,"shorttermWinlossErrorAvg":0.109037,"shorttermScoreErrorAvg":1.49334,"ownership":[-23,-30,-49,-73,-87,-90,-84,-83,-81,-81,-80,-85,-88,-88,-88,-11,-18,-33,-72,-95,-88,-99,-81,-82,-83,-79,-88,-95,-88,-88,-1,-6,-6,-59,-100,-100,-100,-100,-81,-79,-88,-91,-88,-88,-87,6,4,-38,-94,-62,-66,-100,-100,-100,-89,-86,-99,-92,-89,-83,22,3,-5,-17,-21,-20,-26,-32,-40,-70,-78,-88,-98,-76,-77,41,51,82,3,0,3,7,1,13,-90,-56,-95,-56,-70,-67,56,63,54,26,21,20,79,38,72,-4,-30,-51,-61,-58,-59,56,69,96,58,35,45,45,38,26,1,-6,-36,-48,-56,-55,45,52,67,99,55,46,46,80,21,-18,-16,-34,-53,-58,-56,28,24,1,99,58,11,40,38,9,-8,-36,-93,-66,-67,-62,10,5,-2,98,60,40,35,33,63,-17,-90,-69,-93,-73,-65,-4,2,49,99,51,40,27,32,8,-9,-54,-75,-73,-70,-64,-11,-20,54,98,10,25,-6,29,59,-34,-63,-94,-61,-64,-61,-12,-16,-19,73,35,22,13,27,5,8,-80,-41,-58,-55,-58,-10,-13,18,33,39,26,19,14,9,-15,-32,-47,-48,-54,-56],"ownershipAllowedMAE":0.0637544})%"); + lines.push_back(R"%({"sample":{"board":".........X...O...../...X..OXXOXXXOOOOX./..X.XOX.OOX.XOXOXO./..OX..X.OXXXOOXOXX./..O....XOOOOOXXXOX./..OX...XO.OXO..X.../..O.....OO.XOX...../..OX...XXO.X..OXX../.........XX.XXOO.../..OOO...X....OX..../..XX....XOO..OXX.../........OXO..OOX.../.....O.XXXO.X.X.XX./..XXXXXOOOO..X.X.OX/..XOXOOXX...XOXXOOX/.XOOOXOX.X..XOXOOX./.OXXOXOOX..OOOO.OX./..O.O...OO.O..OO.OX/...........O.OOO.O./","hintLoc":"null","initialTurnNumber":191,"metadata":"B19EE6AED20A72878D1E213B8F0CEB85:201","moveLocs":["E9","A3","B2","B9","B10","E8","G9","F8","D15","E15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.24,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":-7.5,"policyOptimism":0.049,"pda":2.084,"policyMixture":[0.000138,0.000164,0.00017,0.000167,0.000161,0.000934,0.000281,0.00089,0.0047,0,0.0048,0.000196,0.0002,0,6.77e-05,0.000121,0.000163,0.0116,0.000147,0.000176,0.000243,0.000213,0,0.00103,0.0251,0,0,0,0,0,0,0,0,0,0,0,0,0.0015,0.000307,0.00835,0,0,0,0,0,0.00468,0,0,0,0,0,0,0,0,0,0,0.000283,0.000314,0.012,0,0,0.00022,0.00295,0,0.000413,0,0,0,0,0,0,0,0,0,0,0.000197,0.000183,0.000188,0,0,0,0.137,0.000243,0,0,0,0,0,0,0,0,0,0,0,0.000165,0.000152,0.000138,0,0,0.235,0.00449,0.000986,0,0,5.3e-05,0,0,0,0.0187,0.000258,0,0.00781,0.000878,0.000148,0.000148,0.000139,0,0.00139,0.000613,0.00347,0.00141,0.0679,0,0,0.000152,0,0,0,0.000689,0.00177,0.000801,0.00019,0.000139,0.000147,0.000142,0,0,0.000315,0.00189,0.09,0,0,0,0.00023,0,0.00678,0.000939,0,0,0,0.000192,0.000133,0.000151,0.000147,0.000143,0.000172,0.000191,0.000932,0.031,0.00501,0.000192,0,0,0.000155,0,0,0,0,0.000198,0.000146,0.000132,0.000222,0,0,0,0,0.00033,0.00143,0.000307,0,0.000151,0.000175,0.11,0.000269,0,0,0.000131,0.000143,0.000142,0.00013,0.0253,0,0,0,0,0.00123,0,0.00027,0,0,0,0.000223,0.000185,0,0,0,0.000137,0.000142,0.000132,0.000214,0.00364,0.000221,0.00606,0,0,0.00629,0.00365,0,0,0,0.000196,0.000928,0,0,0,0.000129,0.000131,0.000186,0.000186,0.000231,0.000173,0.000142,0.000136,0,0.0673,0,0,0,0,0.000168,0,0.000112,0,0,0,0,0.00382,0.000168,0.000194,0,0,0,0,0,0,0,0,0,0.031,0.000184,0,0,0,0.00014,0,0,0.000152,0.00325,0,0,0,0,0,0,0,0.000182,0.000265,0.00704,0,0,0,0,0,0,0,0.000167,0,0,0,0,0,0,0,0,0,0.00032,0.00385,0,0,0,0,0,0,0.00691,0,0,0,0,0,0,0,0,0,0.00014,0.000155,0,0,0,0,0.000125,0,0,0.000155,0.000168,0,0,0.000129,0,0.00013,0.000124,0.00013,0,0,0.000127,0,0.000127,0.000127,0,0,0.00013,0,0,0.000138,0.000134,0.000129,0.000122,0.000126,0.000123,0.000122,0.000124,0.000123,0.000125,0.000127,0,0.000129,0,0,0,0.000131,0,0.000202,0.000124],"winrateAvg":0.000992512,"leadAvg":-16.3965,"scoreMeanAvg":-16.7823,"scoreStdevAvg":5.70269,"shorttermWinlossErrorAvg":0.0118616,"shorttermScoreErrorAvg":1.70631,"ownership":[-53,-69,-85,-94,-96,-95,-95,-95,-96,-97,-95,-42,43,100,99,98,78,65,-24,-31,-57,-86,-99,-95,-94,-92,-98,-97,99,-97,-97,-98,100,100,100,100,-86,-81,6,-51,-97,-95,-99,-87,-99,15,100,100,-97,-96,-98,100,-99,100,-99,-84,-91,45,36,99,-95,-91,-86,-99,3,100,-98,-97,-98,100,100,-100,99,-100,-100,-94,70,91,99,99,-92,-53,-73,-94,100,100,100,100,100,-99,-100,-100,-98,-100,-97,86,93,99,50,61,-65,-39,-93,100,100,100,-95,100,59,-6,-100,-98,-99,-98,89,94,99,75,55,-12,-6,32,100,100,58,-93,100,-98,-95,-96,-98,-99,-98,86,93,99,18,34,-1,-1,-92,-94,99,-33,-92,-5,-95,-94,-100,-100,-99,-98,83,88,87,56,41,19,22,-7,-83,-99,-98,-13,-99,-99,-96,-96,-98,-99,-98,32,99,99,99,98,28,-12,-34,-99,-38,24,62,-36,31,-100,-98,-98,-98,-98,20,-94,-94,-94,97,-56,16,-30,-99,97,98,-8,-12,25,-100,-100,-99,-99,-98,-57,-64,-87,-90,-97,-96,-43,-68,-72,-95,98,26,-37,25,30,-100,-99,-99,-98,-69,-79,-88,-90,-80,-58,-64,-96,-96,-96,98,6,-99,-47,-100,-99,-100,-100,-98,-63,-90,-99,-100,-99,-99,-99,99,98,98,98,27,-91,-99,-98,-100,-5,100,-98,-45,-4,-99,100,-99,100,100,94,94,95,-6,-19,-91,100,-100,-100,100,100,-96,11,-9,100,100,100,98,100,93,94,81,85,-12,-88,100,-100,100,100,2,-6,8,100,98,98,100,98,100,100,88,93,89,100,100,100,100,99,100,3,30,64,100,100,99,100,99,99,98,100,100,95,100,99,99,100,100,99,100,30,83,91,98,99,99,99,99,99,99,99,99,100,99,100,100,100,99,100,95],"ownershipAllowedMAE":0.0319263})%"); + lines.push_back(R"%({"sample":{"board":"........OXXO.X...../.XOOOX.XOXOXXXOO.../.XOXX.X.O.O..XO.O../..XXX.XX.OOOOOXOOX./.....X..XOXXOXXXXOO/.OOXXO.OXXOXXO.XO.O/.XXOO..OXOO.XXXXOOO/.OO.O.OXOX.O..OXO.X/.OXXXXXXO.O..O.XOOX/.OXO..XOO....OXXXXX/..XO..XXX.O..O..OXO/..O.X......OOXXXOOO/........XXXXXOXOOXO/...X....XOOOOOXXOXX/..O....OO.XO.XOOOX./..XX.....XOOXX.OX.O/.......O.OXXX..OXXX/........O.OOXXOOOX./............XO.OXXX/","hintLoc":"null","initialTurnNumber":174,"metadata":"BD82BE58395DE92DA1000011A0D32AE8:184","moveLocs":["B9","D8","P3","E3","M1","Q9","K5","O3","N5","P1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":8.5,"policyOptimism":0.0,"pda":-0.517,"policyMixture":[0.000217,0.000284,0.000229,0.000215,0.000218,0.00412,0.00153,0.0107,0,0,0,0,0.000106,0,0.000238,0.000201,0.000208,0.000205,0.000199,0.000243,0,0,0,0,0,0.000403,0,0,0,0,0,0,0,0,0,0.000209,0.000233,0.000197,0.000268,0,0,0,0,0.000219,0,0.000251,0,0.000855,0,0.000237,0.000232,0,0,0.000193,0,0.000486,0.000211,0.00259,0.00596,0,0,0,0.000216,0,0,0.0427,0,0,0,0,0,0,0,0,0,0.000218,0.00107,0.00539,0.00123,0.00247,0.00151,0,0.000235,0.0642,0,0,0,0,0,0,0,0,0,0,0,0.000241,0,0,0,0,0,0.000279,0,0,0,0,0,0,0,0.00018,0,0,0.000131,0,0.000334,0,0,0,0,0.000359,0.00031,0,0,0,0,0.000231,0,0,0,0,0,0,0,0.000206,0,0,0.000304,0,0.000366,0,0,0,0,0.000245,0,0.000369,0.000233,0,0,0,0.000157,0,0.000211,0,0,0,0,0,0,0,0,0.000271,0,0.000229,0.000241,0,0.000231,0,0,0,0,0.000212,0,0,0,0.000219,0.000217,0,0,0,0.000348,0.000268,0.000264,0.00022,0,0,0,0,0,0,0.00024,0,0,0,0.000226,0.000239,0,0,0,0.00149,0,0.000226,0.000222,0,0.00021,0,0,0,0,0.000285,0.00192,0,0,0,0.000271,0.00025,0.000245,0.000268,0.000261,0.000266,0,0,0,0,0,0,0,0,0.000373,0.00793,0.0887,0.00104,0.000576,0.00029,0.000309,0.000281,0,0,0,0,0,0,0,0,0,0,0,0.000665,0.0199,0.00323,0,0.000313,0.000336,0.000414,0.000343,0,0,0,0,0,0,0,0,0,0,0,0.00143,0.0364,0,0.00209,0.00146,0.000567,0.000304,0,0,0,0.000192,0,0,0,0,0,0,0,0.000495,0.000885,0.493,0,0,0.000425,0.000687,0.000297,0.000237,0.000221,0,0,0,0,0,9.73e-05,0,0,0.00211,0,0.0011,0.0309,0.0239,0.00086,0,0.00355,0.000304,0,0.000218,0,0,0,0,0,0,0,0,0,0,0.000322,0.0228,0.00554,0.0476,0.0187,0.00789,0.000799,0.000262,0,0.000218,0,0,0,0,0,0,0,0,0,0.000221,0.0003,0.000353,0.000604,0.00156,0.000678,0.000329,0.00026,0.000226,0.00021,0.000195,0,0,0,0,0,0,0,0,0.000226],"winrateAvg":0.000644742,"leadAvg":-20.2248,"scoreMeanAvg":-19.9543,"scoreStdevAvg":5.84933,"shorttermWinlossErrorAvg":0.00698269,"shorttermScoreErrorAvg":1.84902,"ownership":[-95,-96,-97,-97,-97,-93,-87,-12,98,93,92,92,89,89,96,97,97,97,96,-92,-99,-95,-94,-94,-100,-94,-98,98,94,98,88,88,88,99,99,97,97,96,-79,-99,-95,-100,-100,-99,-100,-45,98,98,98,94,93,88,99,97,98,97,96,-39,-74,-100,-100,-100,-99,-100,-100,-39,98,98,98,98,98,-100,98,98,95,96,15,31,-4,-43,-93,-100,-65,-48,-91,98,-98,-100,98,-100,-100,-100,-100,95,96,76,98,98,-97,-97,12,-40,74,-90,-92,91,-100,-100,-98,-99,-100,94,93,95,98,98,96,97,97,18,52,78,-90,93,93,-40,-100,-100,-100,-100,95,94,94,98,99,99,-34,96,2,54,-100,94,91,93,95,-35,-1,67,-100,95,13,-100,97,99,-100,-100,-100,-100,-100,-100,94,92,96,90,83,95,9,-100,95,92,-100,96,99,-100,-97,-98,-97,-100,93,94,23,83,93,92,95,-100,-100,-100,-100,-100,87,99,-100,-97,-98,-93,-100,-100,-100,-63,94,91,93,94,-55,-100,-97,-100,-96,71,56,57,-100,-100,-65,-60,-67,-80,-43,-12,94,93,-100,-100,-100,-97,-97,-96,52,21,-10,-45,-53,-41,-34,-41,-99,-99,-100,-100,-99,99,-100,-97,-97,-100,-97,41,24,-26,-94,-38,-20,-4,38,-99,100,100,100,100,100,-100,-99,-97,-100,-100,43,48,60,-37,-27,-1,29,100,100,100,99,100,100,-96,-97,-96,-97,-100,-99,35,65,-97,-97,-51,-10,10,53,98,96,100,100,-95,-96,-97,-97,-100,-99,-98,33,10,-8,-60,-95,-28,29,99,97,99,-93,-95,-96,-96,-96,-97,-100,-100,-100,20,18,-15,-30,-52,3,5,65,100,98,99,99,-96,-96,-96,-96,-97,-100,-99,12,3,-5,-19,-11,-1,24,61,86,97,97,99,-95,-94,-96,-96,-100,-100,-100],"ownershipAllowedMAE":0.0508311})%"); + lines.push_back(R"%({"sample":{"board":"................../.....O............/.OOOOXO......X..../..XXXX.........O../................../..............O.../................../................../................../...............X../...XXX............/...XOXO.........../..XOOOXO........../..XO.X........X.../..O.O.XO........../...O..X..O....X.../................../................../","hintLoc":"null","initialTurnNumber":40,"metadata":"94DF9F63ECD11CF8EC63D1581EF3BF17:50","moveLocs":["G5","H7","J2","J3","K2","L2","H5","J5","J6","K5"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.46,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreAREAtaxSEKIsui1button1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.48e-06,2.66e-06,2.68e-06,2.56e-06,2.98e-06,4.13e-06,4.52e-06,3.08e-06,2.75e-06,2.7e-06,2.68e-06,2.71e-06,2.66e-06,2.81e-06,2.73e-06,2.75e-06,2.68e-06,2.44e-06,2.59e-06,2.71e-06,2.65e-06,3.12e-06,2.52e-05,0,0.000176,4.06e-05,3.3e-06,3.25e-06,3.25e-06,3.26e-06,3.04e-06,3.05e-06,3.26e-06,3.59e-06,3.09e-06,2.73e-06,2.94e-06,0,0,0,0,0,0,9.06e-05,3.19e-06,3.27e-06,3.34e-06,3.45e-06,3.01e-06,0,3.25e-06,1.19e-05,3.26e-06,2.79e-06,2.79e-06,3.57e-06,0,0,0,0,9.14e-05,3.28e-06,3.29e-06,3.32e-06,3.36e-06,3.32e-06,3.37e-06,3.12e-06,1.04e-05,0,3.42e-06,2.79e-06,2.89e-06,3.33e-06,2.84e-06,2.4e-06,2.42e-06,2.6e-06,2.91e-06,3.35e-06,3.31e-06,3.32e-06,3.36e-06,3.36e-06,3.37e-06,3.27e-06,3.33e-05,2.84e-05,3.32e-06,2.71e-06,2.98e-06,3.22e-06,3.34e-06,3.21e-06,3.24e-06,3.3e-06,3.44e-06,3.48e-06,3.42e-06,3.42e-06,3.39e-06,3.4e-06,3.36e-06,3.33e-06,0,3.86e-06,3.47e-06,2.71e-06,2.83e-06,3.29e-06,3.51e-06,3.53e-06,3.66e-06,3.58e-06,3.6e-06,3.7e-06,3.67e-06,3.51e-06,3.48e-06,3.44e-06,3.36e-06,3.26e-06,3.44e-06,3.75e-06,3.4e-06,2.7e-06,2.78e-06,3.25e-06,3.44e-06,3.63e-06,3.73e-06,3.71e-06,3.96e-06,4.97e-06,4.62e-06,3.88e-06,3.55e-06,3.51e-06,3.4e-06,3.33e-06,3.39e-06,3.65e-06,3.38e-06,2.72e-06,2.75e-06,3.1e-06,3.31e-06,3.47e-06,3.63e-06,3.7e-06,4.16e-06,1.19e-05,1.24e-05,6.95e-06,3.95e-06,3.56e-06,3.46e-06,3.42e-06,3.24e-06,2.94e-06,3.08e-06,2.67e-06,2.76e-06,2.99e-06,3.03e-06,2.98e-06,2.85e-06,3.22e-06,4.35e-06,1.92e-05,2.42e-05,2.39e-05,5.69e-06,3.86e-06,3.56e-06,3.39e-06,3.05e-06,0,2.96e-06,2.7e-06,2.76e-06,3.11e-06,2.93e-06,0,0,0,8.51e-06,1.1e-05,0.0012,6.51e-05,1.48e-05,3.92e-06,3.53e-06,3.32e-06,3.22e-06,2.94e-06,2.95e-06,2.65e-06,2.74e-06,3.15e-06,2.97e-06,0,0,0,0,0,0.0918,0.0277,3.73e-05,5.43e-06,3.47e-06,3.31e-06,3.22e-06,3.14e-06,2.98e-06,2.65e-06,3.18e-06,3.88e-06,0,0,0,0,0,0,0,0.0573,0.00231,5e-06,3.31e-06,3.1e-06,3e-06,3.14e-06,2.93e-06,2.66e-06,4.67e-06,3.04e-05,0,0,0.000214,0,0,0,0,0,2.18e-05,3.42e-06,3.31e-06,2.95e-06,0,2.96e-06,3e-06,2.64e-06,4.97e-06,0.000903,0,0,0,3.03e-06,0,0,2.99e-05,1.09e-05,8.14e-06,3.82e-06,3.39e-06,2.91e-06,2.79e-06,2.87e-06,2.83e-06,2.63e-06,4.04e-06,5.6e-05,5.79e-06,0,4.51e-06,5.44e-06,0,0.183,0,0,0.0149,4.99e-06,3.45e-06,2.88e-06,0,2.68e-06,2.8e-06,2.58e-06,3.78e-06,2.39e-05,0.224,8.64e-05,0.0691,0.00106,0.162,0.164,0,0,0,0.000126,3.27e-06,3.03e-06,2.81e-06,2.66e-06,2.63e-06,2.63e-06,2.48e-06,3.57e-06,3.71e-06,7.25e-06,1.01e-05,5.85e-06,7.07e-06,1.5e-05,3.01e-06,4.18e-06,5.35e-06,2.89e-06,2.9e-06,2.76e-06,2.69e-06,2.56e-06,2.62e-06,2.36e-06,4.08e-06],"winrateAvg":0.330452,"leadAvg":-1.37858,"scoreMeanAvg":-2.97566,"scoreStdevAvg":14.6868,"shorttermWinlossErrorAvg":0.192671,"shorttermScoreErrorAvg":2.09002,"ownership":[75,81,84,85,82,72,57,42,23,8,-4,-13,-19,-17,-6,8,16,23,73,77,86,86,81,83,70,40,19,7,-3,-11,-22,-23,-1,9,24,30,47,89,89,89,90,-80,79,35,8,3,-6,-6,-16,-56,32,19,42,36,38,-41,-81,-80,-80,-80,-1,0,4,0,-2,-5,-5,-8,10,77,46,41,0,0,-29,-38,-38,-34,-24,-5,-2,0,0,1,0,4,22,40,42,36,-10,-22,-27,-26,-23,-19,-11,-4,0,1,1,1,3,9,73,36,23,24,-23,-27,-28,-28,-25,-16,-7,-1,1,1,0,0,0,4,13,12,10,9,-31,-35,-36,-33,-27,-17,-4,4,2,0,-2,-3,-3,-1,-1,-1,-9,-7,-37,-40,-42,-37,-23,-16,0,11,3,-2,-4,-6,-6,-6,-6,-15,-26,-23,-42,-46,-42,-49,-42,-25,13,22,8,-4,-7,-9,-9,-12,-18,-73,-42,-34,-44,-46,-59,-91,-90,-90,-26,24,8,-3,-10,-10,-11,-13,-16,-33,-42,-37,-40,-52,-60,-90,77,-91,64,62,-4,-6,-10,-11,-10,-13,-24,-32,-38,-38,-25,-39,-62,76,75,76,-69,62,-28,3,-8,-5,-7,-16,-31,-43,-44,-41,-6,-1,-63,79,-20,-71,-70,-70,71,71,18,6,-7,-21,-83,-55,-46,-45,25,28,79,73,77,-10,-72,28,26,46,20,15,-1,-6,-45,-54,-53,-48,44,54,59,79,34,-17,-72,-35,69,69,33,30,1,-18,-81,-57,-54,-52,48,49,32,69,-27,-35,-62,-61,-67,-65,48,9,-4,-27,-48,-55,-54,-53,48,45,38,16,-8,-40,-52,-53,-43,2,10,14,-4,-22,-38,-47,-51,-53],"ownershipAllowedMAE":0.0337503})%"); + lines.push_back(R"%({"sample":{"board":".................../..OOX............../..OXX..XOOO..O...../.O.OX..OX.X....X.../.XOXX...X........../.XOOX............../.XOX............X../..XXOO......O....../..OXOXO........O.../.X...XXOO........../...OOOOX.........../..XXX............../.....XO............/..O.OX............./.................../...X..X..X.....X.../..X..........X...../.................../.................../","hintLoc":"null","initialTurnNumber":61,"metadata":"C0F43C1DE067367B69CE33259C28D566:71","moveLocs":["C16","H18","D19","Q9","L3","K3","N3","N4","O2","N2"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.8,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":77.0,"policyOptimism":0.413,"pda":0.0,"policyMixture":[2.51e-06,2.63e-06,1.97e-06,0,3.95e-06,3.26e-06,3.03e-06,3.84e-06,2.95e-06,2.64e-06,2.54e-06,2.41e-06,2.5e-06,2.78e-06,2.89e-06,3.1e-06,2.76e-06,2.64e-06,1.99e-06,2.81e-06,2.79e-06,0,0,0,7.01e-06,2.92e-05,0,2.38e-05,2.65e-06,2.8e-06,3.41e-06,4.22e-06,4.54e-06,3.66e-05,4.78e-05,1.09e-05,4.51e-06,2.61e-06,2.8e-06,2.1e-06,0,0,0,3.7e-06,6.7e-05,0,0,0,0,4e-06,4.43e-06,0,5.96e-06,9.22e-05,5.54e-05,5.94e-06,2.63e-06,2.73e-06,0,0,0,0,3.63e-06,0.000355,0,0,0.00356,0,4.64e-05,1.53e-05,5.07e-06,4.13e-05,0,6.83e-05,9.58e-06,2.73e-06,2.98e-06,0,0,0,0,4.58e-06,0.00363,0.000112,0,8.57e-06,2.92e-05,5.63e-06,8.75e-06,1.81e-05,0.000849,0.00014,7.89e-05,7.88e-05,2.82e-06,2.6e-06,0,0,0,0,1.92e-05,0.000131,0.000125,4.49e-05,9.72e-06,1.83e-05,5.71e-06,5.54e-06,6.26e-06,9.77e-05,0.000248,0.00011,3.17e-05,2.95e-06,2.8e-06,0,0,0,0.0223,4e-06,3.58e-05,0.000104,1.65e-05,5.37e-06,5e-06,4.25e-06,3.69e-06,4.79e-06,1.54e-05,0.000298,0,5.24e-05,2.81e-06,3.25e-06,0.000334,0,0,0,0,2.98e-06,3.73e-06,3.86e-06,4.21e-06,4.62e-06,3.6e-06,0,4e-06,1.21e-05,5.7e-06,0.000174,2e-05,2.87e-06,2.94e-06,1.66e-05,0,0,0,0,0,2.37e-06,2.6e-06,3.43e-06,4.21e-06,4.22e-06,3.78e-06,5.16e-06,4.47e-06,0,6.95e-06,4.12e-05,2.81e-06,2.99e-06,0,0.00196,2e-05,2.91e-06,0,0,0,0,3.09e-06,4.15e-06,4.82e-06,5.68e-06,7.93e-06,5.56e-06,7.8e-06,2.26e-05,1.5e-05,2.94e-06,2.87e-06,8.31e-06,0.0366,0,0,0,0,0,2.92e-06,3.45e-06,4.33e-06,5.71e-06,1.03e-05,1.76e-05,4.17e-05,0,6.29e-05,1.42e-05,2.99e-06,2.68e-06,5.12e-06,0,0,0,3.51e-06,2.61e-06,3.24e-06,3.38e-06,4.03e-06,4.78e-06,6.78e-06,1.04e-05,1.38e-05,2.82e-05,9.23e-05,7.46e-05,1.7e-05,2.98e-06,2.66e-06,3.6e-06,2.75e-06,2.44e-06,2.96e-06,0,0,3.26e-06,4.11e-06,4.79e-06,5.46e-06,5.87e-06,6.47e-06,6.59e-06,1.28e-05,3.13e-05,0.000162,2.18e-05,2.88e-06,2.7e-06,2.72e-06,0,2.25e-06,0,0,1.24e-05,4.31e-06,4.2e-06,4.1e-06,4.67e-06,4.18e-06,3.93e-06,4.75e-06,7.82e-06,1.82e-05,0.000174,6.33e-05,2.91e-06,2.57e-06,2.29e-05,3.41e-06,5.45e-05,3.03e-06,9.86e-06,3.83e-05,4.24e-06,3.93e-06,3.64e-06,2.96e-06,3.03e-06,3.19e-06,3.62e-06,4.98e-06,0.00116,0.032,0.000901,3.22e-06,2.93e-06,2.97e-05,0.00289,0,9.21e-05,3.6e-06,0,1e-05,3.23e-06,0,3.59e-06,3.76e-06,0,0.00324,1.71e-05,0,0.0113,4.8e-05,3.09e-06,2.64e-06,0.000429,0,0.00107,5.78e-05,3.14e-06,4.43e-06,3.41e-06,2.75e-06,0,0,0.834,0,0,0.038,0.000119,0.00044,3.83e-05,2.86e-06,2.98e-06,3.73e-06,0.000197,8.45e-06,4.88e-06,3.02e-06,2.77e-06,2.83e-06,2.44e-06,2.45e-06,2.51e-06,5.63e-05,0,0,9.01e-06,5.05e-06,4.22e-06,4.5e-06,2.79e-06,2.09e-06,2.98e-06,2.51e-06,2.63e-06,2.4e-06,2.33e-06,2.28e-06,2.12e-06,2.03e-06,1.98e-06,2.21e-06,2.36e-06,3.85e-06,2.59e-06,2.81e-06,2.47e-06,2.41e-06,2.62e-06,2.04e-06,2.47e-06],"winrateAvg":0.672354,"leadAvg":1.33623,"scoreMeanAvg":2.04722,"scoreStdevAvg":12.3605,"shorttermWinlossErrorAvg":0.137278,"shorttermScoreErrorAvg":1.05799,"ownership":[61,58,68,90,29,-32,-52,-41,-14,21,36,47,47,34,14,-9,-20,-26,-32,56,78,89,90,-93,-58,-66,-88,13,41,57,58,54,49,3,-19,-27,-31,-35,66,70,90,-93,-93,-76,-74,-89,72,73,74,44,38,77,-39,-38,-40,-40,-38,23,90,91,90,-93,-73,-71,-63,-84,44,-33,0,13,19,-9,-81,-51,-44,-41,-35,-91,91,-93,-93,-52,-47,-68,-84,-47,-1,3,6,5,-3,-34,-47,-43,-41,-65,-91,91,91,-93,-10,-23,-30,-26,-13,-5,1,4,-1,-8,-30,-40,-46,-39,-85,-91,91,-92,47,33,2,2,-7,-3,2,4,10,0,-12,-17,-77,-42,-33,-89,-88,-92,-92,93,94,38,19,14,6,5,12,64,10,-7,-9,-12,-25,-23,-90,-85,-15,-91,94,87,92,44,27,10,5,5,8,1,3,41,-11,-15,-17,-90,-96,-22,-3,89,86,85,94,94,15,4,2,0,-5,-8,-14,-22,-23,-18,-90,-87,59,94,94,95,95,-1,36,-2,0,0,-3,-15,-17,-76,-35,-28,-22,-90,-93,-98,-98,-99,4,38,28,16,3,1,1,-4,-11,-17,-29,-36,-32,-25,-89,-90,-91,-91,-93,-98,61,11,5,4,5,4,-2,-9,-18,-27,-28,-30,-28,-88,-88,-84,-88,-84,-98,-14,-3,1,2,10,4,-3,-14,-21,-30,-33,-32,-31,-89,-89,-89,-88,-87,-82,-35,-19,-7,-2,20,8,17,-21,-29,-37,-38,-39,-35,-90,-91,-91,-96,-85,-83,-93,-40,-37,-83,-13,10,-30,6,-43,-91,-56,-44,-41,-91,-92,-97,-87,-82,-81,-75,-59,-55,-84,36,33,32,-88,-73,-71,-61,-54,-47,-91,-91,-91,-86,-82,-78,-72,-61,-64,-14,2,9,-59,-54,-85,-73,-67,-58,-53,-91,-90,-89,-85,-80,-74,-66,-56,-39,-26,-6,-12,-37,-70,-72,-72,-67,-61,-57],"ownershipAllowedMAE":0.0466372})%"); + lines.push_back(R"%({"sample":{"board":"........XOO..OXX.../........XXO.OOOXXX./XXX...XXXXO.OXXX..X/OXOXX..XOOO..OOOXXX/OOOOXOX.XOXOOOXOOXO/OXXXX...XOXXXXXO.OO/OOXX.....XX.XOOOO.O/OXX.OXXXXXOX.XXXOOX/OOXXXOOOOOOX..XOOXX/.OXOOOO...OOXX.XOX./OOOXOOOOOOXXXOXXOX./O.OXXXO.O.OOXOXOXX./OOX.X....OOXX..O.X./XXXXOO....OOXXXOOX./OOOO.O....O.OXOXXXX/OXOOO.....OOOOOXXX./XXXXOOOO......OOX../...XXXXO....OOOXXX./XXX.XOOO....OXXXX../","hintLoc":"null","initialTurnNumber":300,"metadata":"EB3851664BD632703740D049757BA51D:310","moveLocs":["F16","F7","F14","D7","E13","pass","D12","pass","P7","pass"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.3,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":7.5,"policyOptimism":0.184,"pda":-2.629,"policyMixture":[0.000956,0.00088,0.000882,0.000912,0.00091,0.000905,0.000884,0.000914,0,0,0,0.000845,0.000852,0,0,0,0.00118,0.00122,0.000941,0.000902,0.000938,0.00276,0.0017,0.000919,0.000878,0.00112,0.00128,0,0,0,0.00117,0,0,0,0,0,0,0.0249,0,0,0,0.0288,0.00241,0.0237,0,0,0,0,0,0.00194,0,0,0,0,0.0263,0.0269,0,0,0,0,0,0,0,0.0241,0,0,0,0,0.00103,0.000875,0,0,0,0,0,0,0,0,0,0,0,0.0214,0,0.0258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0214,0.00644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0226,0.00154,0.00204,0.0258,0,0,0.0246,0,0,0,0,0,0,0,0,0,0,0,0.0216,0,0,0,0,0,0,0,0.0257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.026,0.0246,0,0,0,0,0,0,0,0,0,0,0,0,0.000729,0.000691,0.000712,0,0,0,0,0.025,0,0,0,0.00088,0,0,0,0.000826,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000815,0,0,0,0.000834,0.000861,0.000842,0,0.000832,0,0,0,0,0,0,0,0,0,0,0.000822,0,0,0.000835,0,0.000839,0,0.000843,0.000902,0.000844,0,0,0,0,0.0247,0,0,0.0264,0,0.000849,0.000866,0.000836,0.000839,0.000865,0,0,0.000864,0.000887,0.000883,0.000821,0,0,0,0,0,0,0,0,0.00114,0,0,0,0,0,0,0.000855,0.000897,0.000883,0.000853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000828,0.000848,0.000864,0.000901,0.000869,0,0,0,0,0,0,0,0,0.00144,0,0,0,0,0,0,0,0,0.000862,0.000909,0.000863,0.00085,0.000799,0.000847,0,0,0,0.00602,0.000869,0.00208,0.00433,0.00317,0,0,0,0,0,0.000854,0.000883,0.000879,0.000839,0,0,0,0,0,0,0.000971,0,0,0,0.000149,0,0,0,0,0.000808,0.000807,0.000808,0.00082,0,0,0,0,0,0.00103,0.000932,0.427],"winrateAvg":0.999915,"leadAvg":5.52651,"scoreMeanAvg":5.59853,"scoreStdevAvg":0.74635,"shorttermWinlossErrorAvg":0.005329,"shorttermScoreErrorAvg":0.341821,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,-100,100,100,100,-100,100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,-100,100,100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,100,100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,-100,-100,-100,-100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.000551158})%"); + lines.push_back(R"%({"sample":{"board":"..O.OX...X...OO.O../XOOOX.XX.OOOOX.OXX./.XXXOXX.OOXXXOOOOX./.OXOOO.XXOXOOXOXX../.OO..OX..XXOXXOOXX./......XXXXXOXXXXOX./...X..XOOXOOOX.XOO./..OXOOOO.OOO.OX.OXX/OO.OXXO.O.XOOOXXX../XOOXX.OOXX.XXOOOOXX/XXXXXO..OX.X.XOOXX./XO.XO.....X.X.XOXO./.XXO.O.OOOOXOXXOO../.XXO.OOXXXXX..OXOO./XXO.OOX.......XXOXO/XOOO.OX.X.....XOXXO/OO...OXXOXX.OXXOXX./.....OXO.X...XOOOX./.....OO.O...X.X.XO./","hintLoc":"null","initialTurnNumber":283,"metadata":"9E1602B8183243098DE78B776FC126D6:293","moveLocs":["Q12","T13","F18","E13","G19","E14","C13","C11","F13","F14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.63,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":8.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.77e-05,1.82e-05,0,1.64e-05,0,2.02e-05,0,2.91e-05,2.87e-05,0,1.73e-05,1.7e-05,1.53e-05,0,0,1.72e-05,0,3.62e-05,1.71e-05,0,0,0,0,1.77e-05,0,0,0,5.24e-05,0,0,0,0,0,2.3e-05,0,0,0,1.78e-05,1.69e-05,0,0,0,0,0,0,0.000775,0,0,0,0,0,0,0,0,0,0,1.74e-05,1.68e-05,0,0,0,0,0,0.0011,0,0,0,0,0,0,0,0,0,0,1.62e-05,1.71e-05,1.63e-05,0,0,2.3e-05,1.98e-05,0,0,2.05e-05,1.91e-05,0,0,0,0,0,0,0,0,0,1.66e-05,1.87e-05,3.67e-05,4.13e-05,5.59e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.7e-05,0,1.7e-05,4.1e-05,0.000263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.76e-05,1.77e-05,0,2.68e-05,0.000185,0,0,0,0,0,0,1.67e-05,0,0,0,1.67e-05,0,0,1.79e-05,1.76e-05,0,0,0,0,0,0.98,0,0,0,1.7e-05,0,2.7e-05,0,0,0,0,0,0,0,1.65e-05,1.7e-05,0,0,0,0,0,1.95e-05,0,0,0,0,1.82e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.97e-05,2.02e-05,0,0,1.78e-05,0,0,0,0,0,0,0,1.84e-05,0,0,0,0,0,1.75e-05,1.98e-05,2.14e-05,3.6e-05,5.55e-05,0,0,0,0,0,0,0,0,2.81e-05,1.76e-05,0,0,0,1.77e-05,0,1.81e-05,0,0,0,0,0,0,0,0,0,0,1.87e-05,1.95e-05,1.67e-05,0,0,0,1.7e-05,0,0,0,0,0,0,0,0.000102,0.00699,0,0,0,0,2.16e-05,0,0,0,1.7e-05,0,0,0,0.00202,8.66e-05,1.7e-05,1.74e-05,1.8e-05,2.2e-05,2.43e-05,0,0,0,0,0,0,0,0,0,1.64e-05,0,0,0.0015,0,6.06e-05,1.71e-05,1.76e-05,1.78e-05,1.82e-05,0,0,0,0,0,0,0,1.63e-05,1.67e-05,1.64e-05,0,0,0,0,0,0,1.68e-05,0,0,0,0,0,0,0.00235,1.76e-05,1.78e-05,1.72e-05,1.79e-05,1.74e-05,0,0,0,7.45e-05,0,1.72e-05,1.82e-05,1.71e-05,0,0,0,0,0,0.00131,1.85e-05,1.87e-05,1.79e-05,1.79e-05,1.76e-05,0,0,2.24e-05,0,4.91e-05,2.03e-05,1.71e-05,0,0,0,0.000637,0,0,1.68e-05,2.32e-05],"winrateAvg":0.835925,"leadAvg":3.43424,"scoreMeanAvg":3.38667,"scoreStdevAvg":6.79393,"shorttermWinlossErrorAvg":0.418866,"shorttermScoreErrorAvg":4.73229,"ownership":[99,99,100,99,99,69,71,-51,-23,-22,72,98,99,100,99,63,62,-21,-67,99,100,100,100,98,97,-78,-76,7,100,100,100,100,99,99,99,-99,-100,-85,99,99,99,99,100,-80,-79,-45,100,100,-91,-90,-89,99,99,99,99,-100,-99,99,100,99,100,100,100,-7,-89,-90,100,-91,100,100,-100,99,-100,-100,-100,-100,91,100,100,29,5,100,-93,-90,-90,-92,-92,100,-100,-100,99,99,-100,-100,-100,69,86,-25,-10,-95,-94,-94,-94,-93,-92,-92,100,-100,-100,-100,-100,-100,-100,-100,19,25,73,-96,-94,100,-95,100,100,-92,100,100,100,-100,-100,-100,-100,-100,-100,-42,-50,44,-96,99,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-50,-53,-87,-85,-100,-100,100,100,100,53,-76,100,100,100,-100,-100,-100,-100,-100,-100,-51,-47,-100,-100,3,100,100,-99,-100,-77,-99,-99,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,99,84,63,59,-100,-96,-99,-81,-79,100,100,-100,-100,-61,-100,-100,-100,-100,97,93,83,66,-9,-6,-99,-96,-96,-56,-55,100,-99,64,-19,-100,-100,-100,100,96,100,97,99,99,99,99,-100,-57,-60,-54,100,100,66,68,-100,-100,-100,100,99,100,100,-100,-100,-100,-100,-100,-81,-42,-45,-96,100,100,95,-100,-100,100,100,100,100,-88,-86,-91,-95,-96,-92,-80,-56,-98,-97,100,38,97,-100,100,100,100,100,100,-87,-84,-98,-96,-96,-93,-91,-79,-99,42,45,50,96,100,100,100,100,100,100,-86,-87,-54,-100,-100,-95,-89,-100,-99,41,46,50,89,100,100,100,100,100,100,-86,87,-69,-100,-96,-95,-93,-100,34,41,42,45,68,99,100,100,100,100,100,100,91,92,4,-92,-94,-99,-76,-79,13,21,50,47],"ownershipAllowedMAE":0.0952984})%"); + lines.push_back(R"%({"sample":{"board":".......X.X.OOXO..../.X.X...X.XXXXXOO.O./..XO.XXX..XXXOOX.O./.O.O.X..X..XOXOXXOO/...OX.XX.XXOOXXOOXX/.X.O.O..XO.OXX.OOOX/..XOO.O..OOOXO..OXX/.XO.XOOO.OXXXO.OXX./.XO.XOXOOOOOXOXOXXO/.XO.XXXOXOXXXOOXOO./.XO.X.XOXXX..OXX.X./...X.XOXOO..XO...../..X.XOOXXO.X.O...../...OOOXX.O.XOXO..../...OXX.XOOXXO.XOOO./..O.X.XOXXOX..XXXO./..X.X.OO..OX.....X./..........O......../.................../","hintLoc":"null","initialTurnNumber":0,"metadata":"798DF1ECDB824E3BE7C21FC824593009:9","moveLocs":["P2","M2","R2","Q2","S2","Q1","L8","M8","O3"],"movePlas":["W","B","W","B","W","B","W","B","W"],"nextPla":"W","weight":0.99,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0button1","komi":83.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.01e-05,1.95e-05,1.95e-05,1.98e-05,2e-05,1.96e-05,1.98e-05,0,2.01e-05,0,2.06e-05,0,0,0,0,0.00405,1.82e-05,1.95e-05,2.02e-05,1.97e-05,0,1.99e-05,0,2.05e-05,2.03e-05,2e-05,0,2.04e-05,0,0,0,0,0,0,0,0.00205,0,1.95e-05,1.94e-05,1.98e-05,0,0,2.12e-05,0,0,0,1.96e-05,1.96e-05,0,0,0,0,0,0,2.84e-05,0,1.96e-05,1.97e-05,0,3.28e-05,0,1.96e-05,0,2.02e-05,2.01e-05,0,2.03e-05,1.98e-05,0,0,0,0,0,0,0,0,2.03e-05,2.26e-05,1.99e-05,0,0,2.08e-05,0,0,2.05e-05,0,0,0,0,0,0,0,0,0,0,2.09e-05,0,2.15e-05,0,2.08e-05,0,2.64e-05,2.16e-05,0,0,2.1e-05,0,0,0,0.0191,0,0,0,0,2.01e-05,2.1e-05,0,0,0,0,0,1.98e-05,0.000164,0,0,0,0,0,0.00023,0.00254,0,0,0,1.99e-05,0,0,2.59e-05,0,0,0,0,1.74e-05,0,0,0,0,0,0.00247,0,0,0,0,2e-05,0,0,2.03e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.98e-05,0,0,2.02e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.17e-05,2.09e-05,0,0,2.14e-05,0,1.94e-05,0,0,0,0,0,1.86e-05,0.0256,0,0,0,0.000106,0,1.98e-05,2.08e-05,2.2e-05,2.23e-05,0,2.12e-05,0,0,0,0,0,0,0,0,0,1.89e-05,1.89e-05,1.92e-05,1.93e-05,1.89e-05,2.19e-05,2.39e-05,0,2.8e-05,0,0,0,0,0,0,0.000195,0,0.00343,0,2.92e-05,1.86e-05,1.85e-05,1.84e-05,1.9e-05,2.32e-05,2.31e-05,2.8e-05,0,0,0,0,0,1.55e-05,0,9.97e-05,0,0,0,0,8.81e-05,1.95e-05,1.92e-05,1.97e-05,2.27e-05,2.91e-05,2.33e-05,0,0,0,2.1e-05,0,0,0,0,0,0,0.000607,0,0,0,0,2.01e-05,2.16e-05,2.73e-05,0,3.59e-05,0,1.75e-05,0,0,0,0,0,0,0.0979,0.522,0,0,0,0,2.08e-05,2.48e-05,0.000153,0,3.03e-05,0,0.000193,0,0,4.57e-05,6.22e-05,0,0,0.000115,0,0.00913,0.00274,0.00777,0,2.09e-05,2.36e-05,3.33e-05,5.35e-05,0.000173,0.000618,0.0184,0.000791,0.000101,0.000831,0.00916,0,0,2.75e-05,0.0788,0,0,0,0,4.4e-05,1.92e-05,2.26e-05,2.33e-05,2.48e-05,3.36e-05,6.43e-05,7.97e-05,0.000165,0.000319,0.000875,0.183,0.00321,2.9e-05,7.75e-05,8.56e-05,0,2.12e-05,2.31e-05,1.97e-05,1.81e-05],"winrateAvg":0.676662,"leadAvg":12.1753,"scoreMeanAvg":10.7185,"scoreStdevAvg":44.3816,"shorttermWinlossErrorAvg":0.417793,"shorttermScoreErrorAvg":13.1762,"ownership":[-81,-84,-90,-90,-91,-94,-97,-100,-99,-100,-99,-98,-98,-100,96,95,97,97,98,-77,-91,-90,-91,-89,-96,-98,-100,-99,-100,-100,-100,-100,-100,96,97,95,99,98,-72,-70,-90,-46,-84,-100,-100,-100,-99,-99,-100,-100,-100,96,96,94,97,100,99,-70,-59,-67,-44,-82,-100,-99,-99,-100,-99,-99,-100,-38,-78,96,94,95,99,99,-75,-75,-64,-43,-95,-81,-99,-100,-95,-100,-100,-40,-37,-76,-77,98,98,94,94,-83,-92,-65,-42,-71,-44,-79,-82,-94,-39,-71,-38,-76,-77,-19,98,98,98,94,-89,-90,-91,-40,-41,-39,-39,-65,-55,-37,-35,-34,-77,98,16,81,98,93,93,-90,-93,-61,-69,-93,-40,-36,-36,-46,-34,-77,-75,-76,99,90,98,93,92,93,-91,-93,-60,-72,-93,-42,-92,-36,-34,-34,-34,-33,-78,99,92,98,92,92,94,-90,-92,-60,-78,-93,-93,-92,-35,-78,-33,-78,-79,-80,99,99,80,93,93,91,-85,-94,-58,-81,-93,-80,-93,-36,-77,-77,-80,-80,68,99,81,80,85,81,87,-75,-74,-69,-93,-71,-79,-29,-90,66,69,75,-82,-82,99,91,88,87,86,86,-56,-66,-93,-50,-72,-17,-25,-90,-90,66,6,-79,-1,99,90,88,87,87,87,-33,-33,-52,-2,-8,-14,-90,-90,20,67,-16,-78,59,32,93,87,87,89,87,-12,-11,-14,-2,-89,-90,-89,-90,66,66,-76,-77,57,30,-49,93,92,92,87,-2,0,7,-47,-88,-50,-88,70,66,67,67,-76,-20,-41,-49,-45,-40,92,82,-4,3,-79,-65,-87,-19,70,71,71,70,67,-75,-51,0,-28,6,42,48,75,-11,-12,-69,-62,-57,-21,34,54,50,39,71,-75,-39,-29,-3,-22,72,75,69,-16,-31,-43,-51,-40,-12,22,39,33,17,-20,-35,-42,-28,-18,-20,34,48,63],"ownershipAllowedMAE":0.0797546})%"); + lines.push_back(R"%({"sample":{"board":".................../....X.O.O.......OX./...OX...XOO....OX../..X.X..X.X.....OXX./.......XO....O.OX.X/........X....OXXOX./..X............OOOO/...OX........OOX.../.X.O....XO..O.OXXXX/...OXX.OXO..XOXXOOO/.XXXOXX.OXX.OOOX.X./..OXOOXOOOX..OOXX.X/..XO.OOX.OX.XOX.XOO/....XOXXOX.XOOOXXXO/.XOOO....OXXXOOOXO./..XXOO...OO.XXXXOOO/...XXO..O.OOXOOO.../.....O...XXX.XO.O.O/............X.XX.../","hintLoc":"null","initialTurnNumber":177,"metadata":"22435426D0E6D590195268B63C11436A:187","moveLocs":["L6","S3","S2","K6","J12","H11","L6","R3","T3","K6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.81,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.69e-06,4.9e-06,4.56e-06,4.5e-06,4.35e-06,4.55e-06,4.56e-06,4.72e-06,4.38e-06,4.52e-06,4.47e-06,4.21e-06,4.26e-06,4.36e-06,4.58e-06,5.79e-06,4.23e-06,4.56e-06,4.53e-06,4.84e-06,4.41e-06,4.23e-06,4.38e-06,0,4.04e-06,0,4.4e-06,0,4.01e-06,4.39e-06,4.28e-06,4.4e-06,4.36e-06,6.15e-06,1.5e-05,0,0,4.7e-06,4.48e-06,4.2e-06,4.52e-06,0,0,4.38e-06,4.53e-06,7.24e-06,0,0,0,4.41e-06,4.35e-06,4.25e-06,4.22e-06,0,0,4.66e-06,6.3e-06,4.49e-06,4.65e-06,0,1.46e-05,0,4.71e-06,5.02e-06,0,4.4e-06,0,4.68e-06,4.44e-06,4.51e-06,4.82e-06,4.45e-06,0,0,0,4.55e-06,4.43e-06,4.55e-06,6.07e-06,7.69e-06,5.75e-06,5.73e-06,5.17e-06,0,0,4.63e-06,4.66e-06,4.69e-06,4.81e-06,0,4.45e-06,0,0,0,0,4.46e-06,4.71e-06,4.69e-06,5.28e-06,5.49e-06,5.83e-06,8.58e-06,9.74e-06,0,5.66e-06,4.81e-06,4.93e-06,5.06e-06,0,0,0,0,0,4.8e-06,4.58e-06,4.58e-06,0,5.95e-06,1.41e-05,8.06e-06,1.8e-05,4.54e-05,1.88e-05,7.71e-06,5.08e-06,4.89e-06,4.78e-06,5.18e-06,4.44e-06,0,0,0,0,4.53e-06,5.08e-06,4.68e-06,0,0,8.25e-05,0.000422,0.0148,0,1.58e-05,6.75e-06,4.88e-06,5.2e-06,0,0,0,8.66e-06,7.09e-06,9.38e-06,4.66e-06,0,4.71e-06,0,0.000689,0.000295,0.872,0,0,0,4.98e-06,4.96e-06,0,4.63e-06,0,0,0,0,0,4.75e-06,3.52e-05,3.76e-05,0,0,0,8.54e-06,0,0,0,5.25e-06,1.05e-05,0,0,0,0,0,0,0,4.87e-06,0,0,0,0,0,0,7.7e-05,0,0,0,5.01e-06,0,0,0,0,2.54e-05,0,0.0033,4.95e-06,1.01e-05,0,0,0,0,0,0,0,0,0,5.56e-06,6.19e-06,0,0,0,0,0.00112,0,4.68e-06,1.58e-05,0,0,4.94e-06,0,0,0,9.47e-05,0,0,7.07e-06,0,0,0,9.99e-06,0,0,0,4.87e-06,6.73e-05,1.25e-05,5.06e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.71e-06,0,0,0,0,4.74e-06,0.00313,0.0023,0.00166,0,0,0,0,0,0,0,0,0,0.0992,4.72e-06,7.63e-05,0,0,0,0,5.07e-06,7e-06,1.09e-05,0,0,4.97e-06,0,0,0,0,0,0,0,4.96e-06,3.07e-05,4.59e-06,0,0,0,4.52e-06,5.01e-06,0,4.72e-06,0,0,0,0,0,0,8.9e-06,4.98e-06,0,4.81e-06,4.51e-06,5.73e-06,4.66e-06,5.02e-06,0,4.63e-06,5.54e-06,1.23e-05,0,0,0,0,0,0,1.77e-05,0,0,0,4.73e-06,5.11e-06,4.95e-06,5.14e-06,4.85e-06,5.05e-06,4.98e-06,4.88e-06,4.59e-06,4.07e-06,4.66e-06,4.93e-06,0,0,0,0,9.21e-06,5.84e-06,3.79e-06,1.31e-05],"winrateAvg":0.839787,"leadAvg":6.30733,"scoreMeanAvg":6.60262,"scoreStdevAvg":13.5668,"shorttermWinlossErrorAvg":0.344353,"shorttermScoreErrorAvg":5.96644,"ownership":[-91,-92,-92,-92,-79,-38,35,65,66,76,78,76,72,66,52,32,-38,-59,-77,-92,-92,-92,-92,-99,-18,59,-1,73,74,83,78,74,71,84,28,26,-85,-85,-91,-92,-92,-86,-99,-34,-13,-2,-65,92,92,68,65,70,78,98,-85,-86,-85,-89,-91,-97,-86,-99,-54,-34,-95,-57,-77,-6,38,50,63,81,98,-85,-86,-82,-87,-87,-77,-65,-57,-51,-58,-95,-24,-38,-15,8,39,100,95,98,-85,-67,-81,-86,-86,-72,-52,-40,-40,-48,-63,-85,-26,-4,12,39,100,96,96,99,-64,32,-87,-88,-94,-30,-25,-28,-47,-44,-52,-25,1,18,39,81,99,99,99,99,99,-88,-81,-38,16,-40,0,-32,-80,-30,-36,-5,21,57,100,100,-80,5,14,10,-90,-96,-35,17,20,21,34,-78,-79,8,-15,27,99,98,100,-78,-76,-78,-78,-91,-88,-39,18,-4,-1,20,50,-79,10,-39,29,27,99,-77,-75,79,77,74,-80,-96,-95,-95,82,-1,0,30,70,-78,-79,1,99,99,99,-75,-4,-73,-6,-52,-68,-46,-96,80,79,-4,72,70,68,-78,-35,34,99,99,-74,-74,-67,-71,-15,-22,-48,78,72,80,82,37,47,66,-79,-61,-64,99,-13,-20,-75,86,89,-4,23,26,74,64,80,32,33,65,20,12,-79,99,99,99,-73,-73,-73,92,-19,-66,97,96,96,74,46,55,53,88,-78,-78,-78,99,99,98,-74,95,90,-56,-65,-80,-81,97,97,63,62,66,88,89,-14,-76,-77,-76,-78,95,94,95,-64,-67,-68,-82,-81,97,70,55,87,16,89,89,-76,90,89,92,93,94,95,-60,-54,-45,-53,2,98,59,43,-21,-74,-73,-72,-76,-74,89,44,95,95,95,-55,-49,-32,-5,41,67,58,12,-25,-52,-66,-69,-72,-64,-57,-28,42,92,95],"ownershipAllowedMAE":0.089621})%"); + lines.push_back(R"%({"sample":{"board":".................../....OOOO.........../...OXOXXXXX.X....../..O.XXXXOOOO...X.../..OX..OO.........../..XX.............../...O..OOOO......X../..XXO.XOXXO......../.XXOO.OXXO........./OOOX.OX.X........../OXXX..OX..X......../.OOX.XXX.........../O.OX.....X........./.O.XO.O......OOOO../...XO.....OO.O..O../.OOOXOOOOOX.OXOOX../.XXXXOXXXX.XOXOXO../....XXO.....XXX..../.................../","hintLoc":"null","initialTurnNumber":106,"metadata":"CB294ADD8BACC90D59822B73D1F544DD:116","moveLocs":["N16","H10","A3","A4","G10","R11","S15","H10","N14","Q17"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.36,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":-2.996,"policyMixture":[2.52e-05,3.19e-05,3.13e-05,3.17e-05,2.81e-05,2.7e-05,2.64e-05,3e-05,3.25e-05,3.4e-05,3.46e-05,3.42e-05,3.74e-05,4.29e-05,3.87e-05,3.92e-05,3.65e-05,4.02e-05,2.74e-05,3.66e-05,4.3e-05,0.000923,0.000853,0,0,0,0,3.55e-05,3.63e-05,3.95e-05,5.49e-05,0.000165,0.00494,0.00213,0.000134,8.09e-05,0.000149,4.73e-05,3.65e-05,0.000434,0.000129,0,0,0,0,0,0,0,0,6.21e-05,0,7.59e-05,0.00753,0,0.307,0.00214,4.61e-05,4.66e-05,7.02e-05,0,0.000695,0,0,0,0,0,0,0,0,0,4.99e-05,0.204,0,0.425,0.000383,3.87e-05,4.15e-05,0.000768,0,0,2.89e-05,3.37e-05,0,0,3.38e-05,3.37e-05,3.3e-05,5.89e-05,4.97e-05,0.000137,0.000647,0.00708,0.000267,0,3.21e-05,3.59e-05,5.67e-05,0,0,3.42e-05,3.63e-05,2.97e-05,2.7e-05,2.76e-05,3.49e-05,7.65e-05,4.19e-05,0,0.000136,0.000452,0.000244,5.46e-05,4.68e-05,3.32e-05,3.18e-05,3.82e-05,3.31e-05,0,3.88e-05,3.67e-05,0,0,0,0,0.000289,0.000128,5.19e-05,0.000275,0.000898,0.000147,0,4.92e-05,3.43e-05,2.76e-05,2.79e-05,0,0,0,3.58e-05,0,0,0,0,0,0.000117,0.000125,0.000244,0.000368,0.000372,0.000193,6.89e-05,3.49e-05,0.00203,0,0,0,0,3.13e-05,0,0,0,0,0.000129,6.29e-05,8.25e-05,0.000177,0.000204,0.00053,0,0.000159,3.39e-05,0,0,0,0,3.39e-05,0,0.0122,0,0,4.87e-05,3.48e-05,7.03e-05,0.000124,0.000156,0.000128,0.000193,0.000112,4.82e-05,3.24e-05,0,0,0,0,2.63e-05,3.76e-05,0,0,3.03e-05,3.21e-05,0,3.82e-05,9.04e-05,8.78e-05,5.75e-05,5.52e-05,5.54e-05,4.25e-05,3.1e-05,0,0,0,0,2.64e-05,0,0,0,3.02e-05,3.02e-05,3.38e-05,3.77e-05,4.66e-05,4.6e-05,4.29e-05,4.2e-05,4.11e-05,3.63e-05,2.95e-05,0,0,0,0,3.22e-05,3.08e-05,3.22e-05,3.35e-05,3.66e-05,0,3.36e-05,3.85e-05,3.75e-05,3.45e-05,3.04e-05,3.02e-05,3.14e-05,3.11e-05,2.85e-05,0.000211,0,0.000792,0,0,4.32e-05,0,6.04e-05,0.0025,0.00124,0.000661,3.33e-05,3.96e-05,0,0,0,0,2.85e-05,2.76e-05,0.000336,0.000565,0.00114,0,0,3.81e-05,3.29e-05,3.71e-05,5.18e-05,0.000113,0,0,3.82e-05,0,3.25e-05,3.18e-05,0,2.77e-05,2.79e-05,0,0,0,0,0,0,0,0,0,0,0,4.05e-05,0,0,0,0,0,3.04e-05,2.87e-05,0,0,0,0,0,0,0,0,0,0,2.95e-05,0,0,0,0,0,0,3.7e-05,2.91e-05,2.62e-05,2.59e-05,2.59e-05,2.59e-05,0,0,0,2.82e-05,2.77e-05,2.88e-05,2.86e-05,2.9e-05,0,0,0,4.82e-05,4.19e-05,3.02e-05,2.94e-05,2.61e-05,2.68e-05,2.64e-05,2.65e-05,2.73e-05,2.7e-05,2.81e-05,2.73e-05,2.78e-05,2.87e-05,2.85e-05,2.95e-05,2.85e-05,2.68e-05,2.9e-05,3.2e-05,2.99e-05,2.89e-05,2.65e-05,2.04e-05],"winrateAvg":0.916297,"leadAvg":4.59842,"scoreMeanAvg":6.14909,"scoreStdevAvg":12.5095,"shorttermWinlossErrorAvg":0.102001,"shorttermScoreErrorAvg":1.56304,"ownership":[88,91,93,94,94,93,89,63,39,2,-17,-53,-64,-64,-61,-58,-60,-64,-66,84,89,90,94,96,96,96,96,-26,-53,-79,-67,-74,-69,-56,-60,-62,-66,-71,74,84,89,94,-96,96,-97,-97,-97,-96,-96,4,-96,-65,-61,-49,-75,-74,-75,48,85,94,-13,-97,-97,-97,-97,95,95,95,95,-95,-63,-55,-93,-82,-80,-80,14,36,94,-95,-64,2,97,98,93,70,38,5,-32,-40,-46,-58,-67,-93,-77,-27,-32,-95,-95,2,1,45,86,88,62,25,-5,-80,-29,-26,-38,-52,-61,-62,-53,-49,-59,20,17,54,98,99,98,98,38,14,-7,-3,-7,-12,-82,-22,-36,-67,-73,-86,-86,89,82,50,98,-86,-85,69,15,6,6,10,3,9,1,-4,-66,-86,-85,90,89,42,46,-86,-86,37,22,18,10,9,15,14,79,39,22,93,92,90,-87,-1,62,1,-8,-87,23,-10,18,6,10,19,36,51,59,46,96,-89,-88,-87,-45,-36,14,-92,-80,-36,-74,-20,-3,10,22,38,56,65,60,96,97,97,-87,-67,-91,-91,-91,-67,-53,-28,-11,-1,13,25,39,58,69,68,97,98,97,-88,11,-19,-16,-24,-21,-74,-11,-4,11,34,49,59,70,78,76,97,98,21,-89,90,39,90,1,-18,33,11,34,36,100,100,100,100,90,85,97,95,-19,-89,90,89,75,40,46,90,99,99,85,100,99,99,100,94,89,97,96,96,96,-100,96,96,96,96,97,-90,25,92,-93,100,100,88,92,87,-100,-100,-100,-100,-100,96,-98,-98,-97,-97,-92,-96,88,-94,99,13,90,80,77,-99,-99,-99,-100,-100,-100,-97,-97,-96,-95,-89,-92,-93,-94,-94,14,54,53,67,-99,-99,-99,-99,-99,-99,-98,-97,-96,-94,-93,-92,-86,-58,-27,-5,25,46,56],"ownershipAllowedMAE":0.0309996})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../..XX.XO....X....O../.XOO.X..O.X....XXX./.XX.O.XO..XO......./.OXOO.X..OOXXX...O./..OXOX..OXX..X.XO../..XXOX..OXOXXOOO.../...XOX..OX..X...O../...XXOXO.O.X...X.../..O.OOO........XOO./.....O.........XXO./.....O.........XO../................X../...XXO.....O......./..X.O.O...XO...X.../....XO....XO.XO..../....XO....XO..X..../.................../","hintLoc":"null","initialTurnNumber":104,"metadata":"C9188F36581628B5C7B9EBD18BB72558:114","moveLocs":["L5","L6","M6","N5","N2","L1","K1","M1","J2","L7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.49,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxALLsui0","komi":83.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.84e-06,1.78e-06,1.75e-06,1.78e-06,1.79e-06,2.13e-06,2.04e-06,2.07e-06,2.07e-06,2.12e-06,2.13e-06,2.15e-06,1.91e-06,1.89e-06,1.92e-06,1.82e-06,1.89e-06,1.96e-06,1.77e-06,1.84e-06,1.89e-06,1.9e-06,1.96e-06,2.04e-06,2.31e-06,2.78e-06,2.62e-06,2.75e-06,2.62e-06,2.71e-06,2.4e-06,2.33e-06,2.18e-06,2.22e-06,2.1e-06,2.05e-06,2.18e-06,2.13e-06,1.78e-06,1.85e-06,0,0,1.86e-06,0,0,5.16e-06,4.29e-06,2.86e-06,2.24e-06,0,2.08e-06,2.08e-06,2.06e-06,2.16e-06,0,2.12e-06,2.04e-06,1.75e-06,0,0,0,1.97e-06,0,7.15e-06,0.000179,0,2.82e-06,0,1.89e-06,2.02e-06,2.12e-06,2.21e-06,0,0,0,2.62e-06,1.71e-06,0,0,2.07e-06,0,2.08e-06,0,0,9.58e-05,0.00719,0,0,1.97e-06,2e-06,2.22e-06,2.43e-06,2.48e-06,5.43e-06,1.89e-05,1.77e-06,0,0,0,0,2.16e-06,0,0.00013,0.00116,0,0,0,0,0,2.43e-06,3.19e-06,0.000136,0,2.38e-05,1.72e-06,2.02e-06,0,0,0,0,2.63e-06,2.78e-05,0,0,0,1.91e-06,1.77e-06,0,2.55e-06,0,0,2.78e-05,1e-05,1.86e-06,2.09e-06,0,0,0,0,2.54e-06,2.43e-06,0,0,0,0,0,0,0,0,3.7e-06,0.00181,2.86e-06,1.91e-06,2.12e-06,1.85e-06,0,0,0,2.73e-06,2.48e-06,0,0,1.95e-06,1.87e-06,0,2.1e-06,1.95e-06,2.54e-06,0,4.32e-05,2.81e-06,1.96e-06,2.32e-06,2.33e-06,0,0,0,0,0,3.1e-06,0,2.51e-06,0,2e-06,1.98e-06,1.97e-06,0,0.00172,3.5e-05,2.49e-06,2.07e-06,2.72e-06,0,0.000332,0,0,0,2.7e-06,4.4e-06,4.12e-06,3.02e-06,2.56e-06,2.11e-06,1.99e-06,1.94e-06,0,0,0,2.63e-06,2.07e-06,3.09e-06,1.26e-05,1.01e-05,2.66e-06,0,2.04e-06,2.88e-06,3.75e-06,1.37e-05,7.35e-05,0.00446,3.95e-06,2.34e-06,1.93e-06,0,0,0,2.91e-06,2.16e-06,6.79e-06,3.98e-05,3e-05,4.61e-06,0,2.53e-06,3.37e-06,2.17e-05,1.33e-05,0,0.257,0.0289,6.36e-06,2.3e-06,0,0,0.00111,2.47e-06,2.16e-06,3.04e-06,3.64e-06,2.42e-06,3.46e-06,6.85e-05,0.000449,8.66e-06,0.00134,0.0624,0,0,0.143,0.128,2.55e-06,2.22e-06,0,2.45e-06,2.18e-06,2.09e-06,2.77e-06,2.25e-06,0,0,0,5.13e-06,0.00118,0.00709,9.39e-05,0,0,0,7.57e-05,2.96e-06,2.3e-06,2e-06,2.18e-06,1.99e-06,2.27e-06,2.5e-06,0,3.33e-05,0,0,0,3.76e-05,0.00403,2.8e-06,0,0,2.47e-06,3.58e-06,2.75e-06,0,2.26e-06,2.16e-06,1.95e-06,2.07e-06,2.4e-06,2.52e-06,2.77e-06,0,0,2.56e-06,0.0035,3.82e-05,2.86e-06,0,0,2.8e-06,0,0,2.26e-06,2.13e-06,2.16e-06,1.95e-06,2.11e-06,2.55e-06,2.92e-06,2.5e-06,0,0,0.293,0.000166,0,2.39e-06,0,0,0,2e-06,0,2.22e-06,2.19e-06,2.19e-06,1.97e-06,1.77e-06,2.28e-06,2.38e-06,2.63e-06,3.77e-06,1.48e-05,1.28e-05,0.05,1.77e-06,0,0,0,2.41e-06,1.87e-06,1.84e-06,1.92e-06,1.88e-06,1.98e-06,1.72e-06,3.91e-06],"winrateAvg":0.125916,"leadAvg":-5.42582,"scoreMeanAvg":-7.00882,"scoreStdevAvg":13.2808,"shorttermWinlossErrorAvg":0.172556,"shorttermScoreErrorAvg":3.04272,"ownership":[-96,-94,-91,-81,-64,-35,-6,8,12,-4,-34,-54,-76,-79,-78,-76,-73,-72,-71,-98,-97,-97,-94,-84,-55,-15,9,4,-6,-37,-82,-83,-82,-83,-77,-74,-72,-71,-99,-99,-100,-100,-93,-99,31,3,32,15,-31,-98,-84,-84,-83,-82,-68,-70,-74,-99,-100,-94,-94,-96,-99,-15,22,78,-7,-96,-90,-82,-77,-81,-98,-98,-98,-72,-98,-100,-100,-96,-90,-96,-97,79,43,-46,-96,-80,-84,-65,-53,-47,-25,-8,-26,-96,-93,-100,-90,-90,-92,-97,30,34,33,24,-100,-100,-100,-32,33,33,83,39,-86,-94,-94,-97,-89,-92,29,42,96,-92,-93,-94,-99,-100,-2,-34,85,78,71,-58,-65,-97,-97,-88,-91,-27,48,97,-92,-28,-100,-100,84,84,84,81,74,76,-28,-33,-42,-97,-87,-91,15,61,97,-92,-32,-78,-100,-18,24,-5,85,83,77,-3,-15,-13,-97,-96,99,17,98,73,76,-18,-98,-68,-44,-22,-99,-52,82,76,11,8,44,-20,99,99,99,74,41,23,-6,-38,-43,-41,-51,-99,83,84,64,15,4,9,37,65,99,79,52,43,33,12,-13,-37,-33,-58,-99,-99,83,34,10,10,26,25,34,99,63,45,39,48,77,-28,-33,-29,-56,-99,-4,-3,13,1,-1,24,3,13,52,47,35,27,24,77,-49,-22,-34,-42,-71,-93,-55,-17,-17,-10,-23,-57,-56,90,61,28,7,15,-66,14,17,-22,-42,-61,-68,-58,-42,-28,-45,-64,-34,61,58,92,34,3,-6,-65,17,-17,-32,-63,-95,-75,-68,-55,-36,-37,-38,-17,-34,88,50,10,-22,-31,-65,19,-34,-86,-46,-77,-77,-71,-65,-34,-32,-18,-13,-37,88,-10,-22,-63,-56,-66,22,-83,-81,-88,-78,-77,-72,-69,-29,-23,-11,0,30,49,26,-7,-31,-59,22,22,-20,-58,-69,-77,-77,-75,-71],"ownershipAllowedMAE":0.0421503})%"); + lines.push_back(R"%({"sample":{"board":"..............X..../..OXO..X.X...XOXO../...X.OOOX..X.XOO.../.OX.X..XOOOX...O.../..O..OOX.........../..OXXO.X..O....OO../...XOXO.......O.X../..OOO...O....O.O.../.......OX....XOX.../.XOO...OX.OOOXO..O./.XOX....X..XXXXOOO./.OX....O.X.....XXOX/..X...O..O......XX./...X..OXXX......O../..X.X...OX......X../..O..O..OX.....XO../....X.O.OX...X..XO./...X.....X.......X./.................../","hintLoc":"null","initialTurnNumber":120,"metadata":"DDC61B515F48549AD2351AD4DACD3659:130","moveLocs":["K12","K13","B17","B14","L12","M15","N15","N16","O16","N14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.33,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.19e-06,0.00781,0.000249,0.00271,0.000264,0.0048,0.108,9.87e-06,6.87e-06,6.34e-06,7.47e-06,7.86e-06,6.73e-06,8.92e-06,0,7.59e-06,3.25e-05,6.54e-06,5.98e-06,1.3e-05,0.0144,0,0,0,2.75e-05,0.105,0,1.11e-05,0,4.81e-05,1.1e-05,7.9e-06,0,0,0,0,8.12e-06,6.15e-06,8.12e-06,0,0.000161,0,0.000649,0,0,0,0,1.55e-05,8.97e-05,0,0.353,0,0,0,7.69e-06,6.34e-06,6.07e-06,0.0347,0,0,8.03e-06,0,0.000344,0.000437,0,0,0,0,0,0,0,6.78e-06,0,6.83e-06,6.74e-06,5.97e-06,5.29e-05,5.6e-05,0,6.85e-05,0.000431,0,0,0,7.22e-06,8.74e-05,0.000217,0,0,0.17,7.14e-06,7.52e-06,6.97e-06,6.58e-06,6.36e-06,8.04e-06,0,0,0,0,0,1.05e-05,0,6.47e-06,8.96e-06,0,7.16e-06,0,7.43e-06,6.69e-06,0,0,7.95e-06,6.62e-06,7.38e-06,0.000127,0.0196,0,0,0,0,1.15e-05,0.00049,0,8.17e-05,0.00479,9.12e-06,8.07e-06,0,6.41e-06,0,8.23e-06,7.5e-06,8.43e-06,0.00169,0,0,0,8.09e-05,1.46e-05,0.0178,0,0,0,0.00036,0.0298,0,0,0,1.22e-05,1.03e-05,8.23e-06,1.33e-05,0.0455,0.00294,3.14e-05,8.49e-06,0.00104,8.76e-06,0,0,8.14e-06,7.73e-06,8.5e-06,5.79e-05,0,0,0,4.34e-05,0.000974,7.73e-06,6.93e-06,0,0,0,0.000124,7.78e-05,3.81e-05,0,0,7.43e-06,0,0,0,0,0,0.0361,6.71e-06,0,1.41e-05,6.28e-06,0,0,0,0.00743,0.00134,1.44e-05,0.0194,0,6.62e-06,7.24e-06,0,0,0,0,0,0,0,1.63e-05,7.59e-06,0,0,9.13e-06,7.32e-05,0.000482,0.000847,0,1.01e-05,0,6.07e-06,5.75e-06,5.67e-06,5.56e-06,5.65e-06,0,0,0,0,6.45e-06,7.28e-06,0,7.08e-06,1.28e-05,1.47e-05,0,1.1e-05,7.41e-06,0,6.45e-06,5.69e-06,5.74e-06,5.76e-06,5.67e-06,5.75e-06,0,0,8.95e-06,6.3e-06,6.08e-06,5.89e-06,0,8.13e-06,3.7e-05,0,0,0,0,5.89e-06,5.83e-06,5.78e-06,5.79e-06,5.77e-06,5.8e-06,0,6e-06,6.43e-06,6.22e-06,6.5e-06,0,6.17e-06,0,4.43e-05,0.000106,0.0031,0,0,5.8e-06,5.72e-06,5.8e-06,5.87e-06,5.8e-06,5.99e-06,0,6.33e-06,6.09e-06,6.22e-06,6.59e-06,0,7.09e-06,8.73e-06,0,1.36e-05,1.09e-05,0,0,5.76e-06,5.75e-06,5.79e-06,5.76e-06,5.78e-06,0,0,6.23e-06,6.17e-06,6.08e-06,6.07e-06,6.46e-06,6.32e-06,0,3.36e-05,0,8.47e-06,0,0,6.07e-06,5.81e-06,5.74e-06,0,5.86e-06,6.18e-06,0,0,6.04e-06,6.5e-06,6.72e-06,6.56e-06,0,7.13e-06,7.68e-06,7.92e-06,8.52e-06,8.11e-06,0,6.26e-06,6.06e-06,6.04e-06,6.05e-06,5.96e-06,6.12e-06,5.89e-06,0,5.86e-06,5.71e-06,6.26e-06,6.37e-06,6.49e-06,6.61e-06,6.71e-06,7.06e-06,7.03e-06,6.9e-06,6.55e-06,6.56e-06,6.29e-06,6.2e-06,6.23e-06,5.96e-06,5.7e-06,6.17e-06,6.02e-06,5.94e-06,8.99e-06],"winrateAvg":0.474513,"leadAvg":-0.0203919,"scoreMeanAvg":-0.276052,"scoreStdevAvg":7.84603,"shorttermWinlossErrorAvg":0.29358,"shorttermScoreErrorAvg":1.6901,"ownership":[82,82,85,86,88,54,3,-30,-58,-77,-85,-87,-82,-52,-52,17,88,93,94,81,81,87,78,97,88,-21,-79,-76,-87,-82,-88,-87,-93,99,23,98,94,95,83,79,82,78,86,99,99,99,-81,35,-38,-94,-84,-93,99,99,96,96,95,83,94,80,83,78,89,92,83,97,97,97,-92,-57,-94,-10,99,96,96,96,90,93,98,88,88,99,99,82,88,89,91,92,-53,-20,7,54,96,96,95,84,98,98,81,81,99,91,81,87,88,97,59,87,7,46,100,100,96,95,70,74,88,82,100,86,98,90,86,92,11,-22,37,48,100,96,89,93,93,47,42,100,100,100,84,85,85,93,-62,-62,7,11,97,96,99,92,93,89,25,10,44,72,54,52,76,95,-95,-50,-29,-9,-19,-99,97,88,91,84,84,7,-53,98,98,18,42,59,95,-95,-53,8,11,13,-99,95,90,92,96,64,-49,-58,98,-52,-25,-4,49,13,-96,-85,-40,-99,-99,-99,-99,95,95,95,10,-72,-61,-98,-48,-32,-15,63,94,56,-97,-90,-92,-94,-96,-97,-99,-99,95,-84,-84,-83,-98,-52,6,30,95,10,29,38,-89,-93,-94,-96,-96,-96,-99,-99,-84,-87,-89,-93,-98,-21,36,95,-99,-100,-100,-93,-94,-96,-96,-96,-96,-93,-94,-91,-88,-87,-97,-88,-93,51,38,-63,51,-100,-95,-95,-96,-96,-96,-95,-98,-94,-94,-85,-85,-80,-89,18,89,50,-8,52,-100,-96,-96,-97,-96,-96,-99,-94,-95,-94,-84,-84,-85,-89,-96,-7,87,22,53,-100,-97,-97,-97,-100,-96,-95,-98,-93,-95,-84,-84,-83,-96,-62,22,36,20,19,-100,-96,-97,-97,-97,-96,-96,-94,-96,-94,-84,-84,-84,-77,-45,0,25,16,-22,-43,-94,-95,-96,-96,-96,-95,-95,-94,-94],"ownershipAllowedMAE":0.0387909})%"); + lines.push_back(R"%({"sample":{"board":"........OX.OXX...../.XXOOXXXO.X.XOXX.../.XOO.OOXOOXXXOOOXX./.XXOO.OXXOOOO.XOXO./.XO.OOX.XO.....OOX./.XOO.OXOXO...OOOOX./.OX.OXXXOXOOOXXXOX./.O.X.XOOOXXO.XOXOX./.O.X.XOX.OXOOXOO.O./.OX..XO.OOXXOX.OOO./.OXXXOOO.X.XXXOOXOX/.OOXOXXOOOXXXXXXXXX/.OXOOX.XO.OOO.OOX.O/...OOX..XOO.OOOXXXX/.OOOXX.X.XXXXOXXOXO/..XOOOOOX...XOOOOOO/.OXXXOXX.X...XXOXXO/.O.XOX.XX....X.XXXO/......X.......X.XXX/","hintLoc":"null","initialTurnNumber":264,"metadata":"693B0888936BDBA178D29AC3A45EA747:274","moveLocs":["B1","C2","C1","B4","E1","D13","K18","A13","C12","A14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":6.5,"policyOptimism":0.49,"pda":0.0,"policyMixture":[4.61e-05,0.000149,0.0155,0.00698,0.00658,0.000129,1.95e-05,6.52e-05,0,0,1.82e-05,0,0,0,1.88e-05,1.95e-05,1.98e-05,1.88e-05,1.67e-05,0.00826,0,0,0,0,0,0,0,0,0,0,1.86e-05,0,0,0,0,2.2e-05,2.2e-05,1.75e-05,8.65e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.69e-05,0.00011,0,0,0,0,0,0,0,0,0,0,0,0,2.13e-05,0,0,0,0,1.79e-05,0.459,0,0,0,0,0,0,3.09e-05,0,0,1.43e-05,0.000156,5.39e-05,2.16e-05,1.93e-05,0,0,0,1.81e-05,0,0,0,0,0,0,0,0,0,0,0.0149,0.000205,0.0152,0,0,0,0,0,1.66e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.93e-05,1.79e-05,0,0,0,6.1e-05,0,0,0,0,0,0,0,0.000164,0,0,0,0,0,0.00214,1.66e-05,0,2.49e-05,0,2.74e-05,0,0,0,0.066,0,0,0,0,0,0,0,0,0,0.0216,1.63e-05,0,0,1.78e-05,2.22e-05,0,0,0.0599,0,0,0,0,0,0,0.00962,0,0,0,0.0304,1.58e-05,0,0,0,0,0,0,0,0.000723,0,0.0626,0,0,0,0,0,0,0,0,1.63e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.62e-05,0,0,0,0,0,1.17e-05,0,0,0,0,0,0,0.102,0,0,0,0.000472,0,1.51e-05,1.67e-05,1.66e-05,0,0,0,3.91e-05,4.47e-05,0,0,0,0.116,0,0,0,0,0,0,0,1.62e-05,0,0,0,0,0,5.44e-05,0,2.1e-05,0,0,0,0,0,0,0,0,0,0,1.64e-05,0,0,0,0,0,0,0,0,1.85e-05,2.1e-05,2.23e-05,0,0,0,0,0,0,0,1.81e-05,0,0,0,0,0,0,0,1.64e-05,0,1.63e-05,1.87e-05,2.02e-05,0,0,0,0,0,0,2.76e-05,0,0,0,1.62e-05,0,1.59e-05,0,0,1.77e-05,1.79e-05,1.79e-05,1.77e-05,0,1.9e-05,0,0,0,0,2.26e-05,0,0,2.72e-05,0,1.56e-05,0,1.65e-05,1.62e-05,1.65e-05,1.64e-05,1.61e-05,1.67e-05,1.64e-05,0,1.66e-05,0,0,0,4.85e-05],"winrateAvg":0.00168182,"leadAvg":-17.2334,"scoreMeanAvg":-17.5115,"scoreStdevAvg":3.49654,"shorttermWinlossErrorAvg":0.00968848,"shorttermScoreErrorAvg":1.52314,"ownership":[-99,-99,-7,45,73,6,-25,41,100,-100,-99,-99,-100,-100,-99,-100,-100,-100,-100,-99,-100,-100,100,100,-100,-100,-100,100,-100,-100,-99,-100,100,-100,-100,-100,-100,-100,-99,-100,100,100,100,100,100,-100,100,100,-100,-100,-100,100,100,100,-100,-100,-100,-99,-100,-100,100,100,100,100,-100,-100,100,100,100,100,100,99,100,-100,-100,-100,-99,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,100,-100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-99,100,100,-100,100,100,-100,-100,-100,97,-100,100,100,100,-100,-100,-100,100,-100,-98,100,100,-100,-100,82,-100,96,96,96,-100,-100,100,80,-100,100,-100,100,-100,9,100,100,-28,-100,-99,-100,97,79,79,95,-100,100,100,-100,100,100,100,100,32,100,100,-100,-100,-100,-100,96,81,95,95,-100,-100,100,-100,64,100,100,100,86,100,100,-100,-100,-100,96,96,96,4,-98,-95,-100,-100,-100,100,100,-100,100,-100,100,100,100,-100,100,-100,-100,96,95,96,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,96,95,97,96,97,-27,97,98,-100,-93,-92,100,100,100,100,100,-100,-100,-100,-100,96,96,-82,97,97,97,-100,-100,-100,-100,100,100,100,100,-100,-100,66,-100,-100,-100,-100,-100,-100,97,-100,-100,98,-100,99,100,100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,98,98,98,99,99,99,99,100,-100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,99,-100,-100,99,66,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,99,21,-99,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0269227})%"); + lines.push_back(R"%({"sample":{"board":"..O.......O.X....../.OX.X.O....OOX...../..OX...OOOOXXXXX.../..OX..XOX.OOXOOX.../...X....X..XOO.OX../..O.X..X.O.X..O.X../.OO.XOX..XX.X..X.../.XOX.OO.........O../X.XOX...O........../.XX.X.....O......../.OX.............O../.OXO..........XO.../.OOXX............../.O.OXXXX.......O.../.OO.OOO.XOO..X...../.XOOOXO.OX.X.O.O.../X.XXOX..OX.O.XO..../.X..XX..X....O...../.................../","hintLoc":"null","initialTurnNumber":128,"metadata":"82F1E689C0956399B93C10090B6F367A:138","moveLocs":["L8","O12","Q12","N10","O13","L4","Q10","R10","K6","N8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.12,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1button1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.95e-06,9.62e-06,0,0.00451,3.22e-06,3.19e-05,4.98e-05,5.11e-05,1.96e-05,5.72e-06,0,4.42e-06,0,2.36e-05,2.74e-06,2.67e-06,2.61e-06,2.74e-06,2.66e-06,4.15e-06,0,0,0.0276,0,7.62e-06,0,3.54e-06,5.35e-05,8.14e-05,5.4e-05,0,0,0,2.73e-06,2.7e-06,2.66e-06,2.77e-06,2.79e-06,3.9e-06,6.46e-06,0,0,2.97e-06,3.55e-06,5.36e-06,0,0,0,0,0,0,0,0,0,2.7e-06,2.72e-06,2.73e-06,4.12e-06,3.05e-05,0,0,3.03e-06,3.67e-06,0,0,0,2.58e-06,0,0,0,0,0,0,2.75e-06,2.77e-06,2.7e-06,2.93e-05,2.19e-05,0.000286,0,2.94e-06,3.86e-06,5.22e-06,5.16e-06,0,3.94e-06,3.88e-06,0,0,0,0,0,0,2.84e-06,2.74e-06,7.31e-06,4.67e-06,0,3.28e-06,0,4.41e-06,4.62e-06,0,4.48e-06,0,3.29e-06,0,2.9e-06,2.96e-06,0,2.83e-06,0,3.15e-06,2.98e-06,8.74e-05,0,0,3.48e-06,0,0,0,4.3e-06,4.93e-06,0,0,2.87e-06,0,0,3.38e-06,0,3.77e-06,3.85e-06,3.15e-06,3.66e-06,0,0,0,3.15e-06,0,0,1.07e-05,7.72e-06,5.29e-06,4.64e-06,5.05e-06,7.66e-06,0,4.8e-06,0,0,5.03e-06,3.46e-06,0,2.86e-06,0,0,0,3.57e-06,4.15e-06,8.49e-06,0,0.000848,0.00118,0.00697,1.04e-05,7.43e-06,1.98e-05,0.0238,0.00922,5.87e-06,3.62e-06,3.05e-06,0,0,2.82e-06,0,3.38e-06,5.75e-06,8.99e-06,4.9e-05,0.000978,0,1.71e-05,0,0.000238,2.08e-05,0,0,4.42e-06,3.52e-06,3.01e-06,0,0,2.76e-06,2.97e-06,3.5e-06,4.55e-06,8.79e-06,0.000236,2.52e-05,2.9e-05,0.267,1.45e-05,0.000627,0.0229,0.119,0,4.36e-06,3.43e-06,2.83e-06,0,0,0,3.03e-06,2.98e-06,3.55e-06,4.96e-06,9.81e-06,2.59e-05,0,9.08e-05,0,8.62e-05,0,0,4.62e-06,6.38e-06,3.34e-06,2.57e-06,0,0,0,0,2.6e-06,2.82e-06,3.29e-06,4.38e-06,7.4e-06,2.46e-05,0.000772,0.03,4.51e-05,0.00018,0.000103,1.25e-05,6.64e-06,3.16e-06,3.03e-06,0,0,0,0,0,0,0,3.73e-06,0,0.243,0.00557,1e-05,4.27e-06,0.000506,0,4.48e-05,0.000135,3.16e-06,3.09e-06,0,0,0,0,0,0,3.58e-06,0,0,0,1.14e-05,5.05e-06,0,7.31e-06,0.000116,0.0229,0.00243,3.44e-06,3.11e-06,0,0,0,0,0,0,1.03e-05,0,0,0,0,0.00353,0,4.98e-06,0,0.000167,5.15e-05,3.26e-06,0,2.83e-06,0,0,0,0,3.65e-06,5.6e-05,0,0,0.203,0,1.42e-05,0,0,4.93e-06,0.000564,6.15e-05,3.32e-06,2.8e-06,0,3.06e-06,2.9e-06,0,0,3.5e-06,4.04e-06,0,7.62e-06,4.91e-06,4e-06,5.02e-06,0,4.71e-06,8.83e-06,9.45e-06,9.92e-06,3.67e-06,2.82e-06,2.74e-06,2.73e-06,2.92e-06,2.75e-06,3.01e-06,3.21e-06,3.52e-06,3e-06,3.45e-06,3.07e-06,3.04e-06,2.98e-06,3.28e-06,3.14e-06,3.1e-06,3.08e-06,4e-06,2.72e-06,4.42e-06],"winrateAvg":0.233882,"leadAvg":-2.09016,"scoreMeanAvg":-3.24315,"scoreStdevAvg":11.9237,"shorttermWinlossErrorAvg":0.167107,"shorttermScoreErrorAvg":1.53692,"ownership":[74,59,59,-38,-46,-2,56,88,90,89,93,17,-95,-96,-97,-97,-96,-94,-92,76,81,-52,-55,-89,4,94,91,93,92,89,90,83,-100,-98,-97,-96,-93,-91,77,80,84,-97,-58,-12,32,95,95,95,96,-99,-100,-100,-100,-100,-95,-92,-87,75,79,82,-97,-48,-17,-50,95,-80,48,95,95,-99,-77,-76,-100,-96,-91,-77,65,75,-12,-97,-56,-24,-5,-3,-81,-4,23,-96,-80,-77,-81,-78,-100,-89,-67,60,71,78,-37,-98,-25,-37,-90,-65,8,-54,-96,-89,-86,-74,-90,-100,-74,-48,-6,78,77,-48,-97,23,-70,-25,2,-93,-93,-47,-94,-94,-77,-99,-60,-8,-26,-33,-81,78,-95,-25,25,25,-11,-5,-12,-13,3,-13,41,-26,-99,30,7,7,-92,-81,-98,-92,-98,-38,-8,1,42,2,12,12,20,7,-29,-53,-21,47,35,-50,-98,-98,-96,-98,-36,-12,-14,-2,20,67,47,72,16,-16,-78,88,64,58,34,100,-98,-82,-61,-27,-22,-12,-4,4,12,-33,-7,10,-18,-32,90,80,70,89,100,-98,-73,-77,-42,-28,-23,-21,-19,-76,-13,49,-1,-50,91,80,80,75,97,100,100,-96,-96,-70,-49,-39,-9,-33,-37,-16,-4,2,12,49,79,80,78,94,100,100,100,-96,-96,-96,-95,-60,-75,-23,-7,3,8,23,93,82,80,78,59,100,100,100,100,100,100,21,-72,84,85,58,15,-23,28,60,78,79,78,-8,-96,100,100,100,-97,100,65,87,-12,85,29,48,83,56,97,85,81,79,-98,-97,-99,-99,100,-98,35,3,87,-13,7,89,74,70,98,89,84,82,80,-98,-99,-99,-98,-98,-98,-56,-8,-39,-10,11,36,69,95,90,89,85,83,82,-98,-99,-99,-98,-93,-73,-60,-41,-21,-4,21,46,67,82,89,87,85,83,83],"ownershipAllowedMAE":0.0464058})%"); + lines.push_back(R"%({"sample":{"board":"....X........O.O.../.XOOX.OOXXXO.XOXOO./..OXX.OXOOOXXXXXXO./XO.OXO....XOX.X.O../.XOXO.O..O.OXXOO.../.X.X.XOX....O....XO/..X.XOOO...O.OOXXO./...X.XXX.OOXXXXOOOO/....X..XO.OOXX.XXO./.....OXOO...X.XXO.O/","hintLoc":"null","initialTurnNumber":113,"metadata":"4C407538C28F0EF3EA56690E5A5CA090:123","moveLocs":["B10","C7","J10","O5","P5","N4","D7","S1","R5","C7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.51,"xSize":19,"ySize":10},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.5,"policyOptimism":0.264,"pda":0.0,"policyMixture":[1.13e-05,0,1.37e-05,1.96e-05,0,5.14e-05,1.3e-05,1.38e-05,0,0.00167,0.00282,0.000397,0.00032,0,7.13e-05,0,2.02e-05,1.26e-05,1.28e-05,0.00316,0,0,0,0,5.26e-05,0,0,0,0,0,0,3.44e-05,0,0,0,0,0,1.25e-05,0.000133,0.0324,0,0,0,3.64e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.19e-05,0,0,0,0,0,0,1.21e-05,1.28e-05,1.33e-05,2.75e-05,0,0,0,0,0,1.33e-05,0,1.13e-05,1.22e-05,0.000155,0,0,0,0,1.81e-05,0,1.35e-05,1.41e-05,0,0.000554,0,0,0,0,0,1.21e-05,1.79e-05,1.31e-05,1.28e-05,0,8e-06,0,9.75e-06,0,0,0,1.37e-05,3.09e-05,0.000227,0.957,0,0,0,1.83e-05,0,0,0,1.27e-05,1.32e-05,0,0,0,0,0,0,1.38e-05,2.68e-05,0.000125,0,0,0,0,0,0,0,1.2e-05,1.29e-05,1.24e-05,1.2e-05,0,0,0,0,0,2.28e-05,0,0,0,0,0,0,0,0,0,0,1.34e-05,1.3e-05,1.23e-05,1.22e-05,0,1.28e-05,6.96e-05,0,0,1.31e-05,0,0,0,0,0,0,0,0,7.91e-06,1.45e-05,1.32e-05,1.32e-05,1.34e-05,1.93e-05,0,0,0,0,1.41e-05,1.29e-05,1.28e-05,0,0,0,0,1.9e-05,0,0,2.9e-05],"winrateAvg":0.826107,"leadAvg":0.834243,"scoreMeanAvg":1.34623,"scoreStdevAvg":3.75683,"shorttermWinlossErrorAvg":0.36998,"shorttermScoreErrorAvg":1.79806,"ownership":[-80,-74,-78,-77,-80,40,73,92,93,59,-54,-87,-86,-25,-25,78,79,93,96,-81,-82,-72,-71,-78,51,100,100,-73,-75,-77,-78,-96,-99,-25,-99,99,99,98,-85,-81,-70,-79,-77,60,100,91,93,93,94,-99,-99,-99,-99,-99,-99,99,99,-95,-69,-72,-72,-78,100,98,94,89,87,86,91,-99,-99,-99,-1,99,99,99,-95,-100,-80,-100,94,93,100,95,91,97,90,92,-99,-99,100,100,99,99,98,-98,-100,-95,-100,-89,-88,100,91,92,91,88,91,92,-99,100,98,99,97,99,-99,-99,-100,-100,-100,100,100,99,89,91,88,91,-100,100,100,97,97,97,97,-99,-99,-99,-100,-99,-100,-99,-99,-48,96,96,-100,-100,-100,-100,97,97,97,97,-99,-98,-98,-97,-100,-73,48,-99,95,93,96,96,-100,-100,-100,-100,-100,97,8,-98,-97,-95,-95,6,53,54,95,95,87,73,-58,-100,-100,-100,-100,-85,-82,5],"ownershipAllowedMAE":0.0509241})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../................X../...O..........XOX../.................../...............O.../.................../..........X.OO...../............OXXX.X./........OXXXXOX..../.......XXOOOXOX.O../........OO.XOOOOO../...........XXO.XX../.......X...XOO.O.X./.......OX..XXO..O../...O....O.X.XXOOXX./.........O.OOOXXOX./...............XOX./.................../","hintLoc":"null","initialTurnNumber":9,"metadata":"BF5C9A5ACB38B8DFE65B23B7A22376E9:19","moveLocs":["J6","K5","G5","J7","H8","G6","F6","G7","R13","R12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.58,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":6.0,"policyOptimism":0.425,"pda":-0.397,"policyMixture":[7.13e-06,7.85e-06,7.7e-06,7.81e-06,7.82e-06,7.8e-06,7.81e-06,7.83e-06,7.84e-06,7.87e-06,7.92e-06,7.96e-06,7.97e-06,7.92e-06,7.85e-06,8.08e-06,7.88e-06,7.76e-06,7.19e-06,7.81e-06,8.7e-06,8.77e-06,9.64e-06,9.57e-06,9.87e-06,1e-05,1.02e-05,1.03e-05,1.04e-05,1.05e-05,1.06e-05,1.06e-05,1.05e-05,1.07e-05,9.96e-06,9.51e-06,8.34e-06,7.76e-06,7.62e-06,8.73e-06,9.19e-06,9.56e-06,9.71e-06,1.04e-05,1.05e-05,1.08e-05,1.11e-05,1.14e-05,1.14e-05,1.14e-05,1.14e-05,1.1e-05,2.03e-05,3.72e-05,0,8.21e-06,7.85e-06,7.81e-06,9.6e-06,9.81e-06,0,9.63e-06,1.06e-05,1.1e-05,1.16e-05,1.22e-05,1.27e-05,1.29e-05,1.28e-05,1.29e-05,2.74e-05,0,0,0,9.34e-06,8.04e-06,7.75e-06,9.54e-06,9.83e-06,9.6e-06,9.93e-06,1.1e-05,1.18e-05,1.27e-05,1.52e-05,2.06e-05,3.04e-05,3.46e-05,3.54e-05,3.9e-05,9.04e-05,2.99e-05,3.25e-05,9.14e-06,8.01e-06,7.69e-06,9.78e-06,1.04e-05,1.07e-05,1.08e-05,1.16e-05,1.25e-05,1.67e-05,3.4e-05,6.99e-05,0.000339,0.00172,0.000365,0.000153,2.12e-05,0,1.02e-05,0.0109,8.53e-06,7.74e-06,9.99e-06,1.04e-05,1.08e-05,1.12e-05,1.2e-05,1.42e-05,2.83e-05,0.000279,0.000361,0.000392,0.000387,9.5e-06,1.07e-05,0.0175,0.000334,0,0.509,6.66e-05,7.7e-06,9.93e-06,1.03e-05,1.08e-05,1.16e-05,1.26e-05,1.79e-05,0.000121,0.00395,0.0148,0,1.32e-05,0,0,0.000398,0.0402,0,1.52e-05,1e-05,7.71e-06,1e-05,1.05e-05,1.1e-05,1.21e-05,1.31e-05,3.52e-05,0.000525,0.0816,0.000285,0.00011,1.04e-05,0,0,0,0,7.54e-06,0,8.81e-06,7.74e-06,1.01e-05,1.08e-05,1.13e-05,1.27e-05,2.35e-05,4.78e-05,0.0285,0,0,0,0,0,0,0,8.21e-06,0.0132,0.000745,1e-05,7.78e-06,1.02e-05,1.1e-05,1.22e-05,2.57e-05,0.000112,0.137,0,0,0,0,0,0,0,0,8.43e-06,0,0.000144,2.41e-05,7.79e-06,1.02e-05,1.1e-05,1.45e-05,0.00035,0.0348,0.000523,0,0,0,8.17e-06,0,0,0,0,0,0,0.00727,0.00057,7.8e-06,1.02e-05,1.09e-05,1.32e-05,4.67e-05,0.0603,0,0.00287,0,0.000246,3.75e-05,0,0,0,4.19e-05,0,0,0.0173,0.000121,7.77e-06,1.02e-05,1.09e-05,1.18e-05,1.51e-05,0,0,0,0,9.05e-05,4.32e-05,0,0,0,7.66e-06,0,9.36e-05,0,2.18e-05,7.81e-06,9.89e-06,1.03e-05,9.82e-06,1.18e-05,1.49e-05,0,0,0,0,1.08e-05,0,0,0,4.91e-05,8.95e-06,0,0.000503,1.16e-05,7.88e-06,9.71e-06,9.76e-06,0,9.32e-06,9.91e-06,8.38e-06,8.69e-06,0,3.24e-05,0,7.58e-06,0,0,0,0,0,0,9.72e-06,7.71e-06,9.01e-06,9.35e-06,9.13e-06,9.16e-06,9.2e-06,9.15e-06,8.8e-06,8e-06,0,9.21e-06,0,0,0,0,0,0,0,7.93e-06,7.7e-06,8.53e-06,9e-06,9.15e-06,8.86e-06,8.9e-06,8.7e-06,8.59e-06,8.61e-06,8.75e-06,8.75e-06,7.74e-06,8.09e-06,7.69e-06,0.00441,0,0,0,7.43e-06,7.02e-06,7.57e-06,7.74e-06,7.78e-06,7.7e-06,7.55e-06,7.51e-06,7.31e-06,7.45e-06,8.02e-06,6.87e-06,7.7e-06,7.78e-06,7.91e-06,0.00366,8.03e-05,0.00033,1.14e-05,7.44e-06,9.32e-06],"winrateAvg":0.296795,"leadAvg":-4.71129,"scoreMeanAvg":-5.35703,"scoreStdevAvg":19.0056,"shorttermWinlossErrorAvg":0.264401,"shorttermScoreErrorAvg":4.32319,"ownership":[24,25,24,24,21,17,13,10,8,7,6,4,0,-7,-16,-29,-38,-40,-40,25,24,28,25,25,17,14,11,8,7,5,3,0,-8,-18,-33,-42,-42,-39,26,29,29,37,31,20,14,10,7,5,4,3,1,-4,-11,-8,-57,-44,-32,26,28,40,81,30,19,13,9,5,3,1,1,-1,-1,-45,25,-57,-31,-21,24,28,35,32,20,14,10,6,1,-2,-4,-4,-3,-3,3,5,-10,-12,0,21,22,23,21,16,11,7,1,-6,-14,-18,-10,-5,-6,1,48,19,18,14,18,20,19,18,15,12,7,-1,-11,-26,-37,-21,-8,-10,-23,-1,43,29,12,16,18,17,17,16,14,11,6,-14,-41,-86,-35,25,28,-2,-46,-73,-22,-20,15,17,15,16,17,18,18,19,19,-21,-59,-38,24,-79,-78,-77,-64,-74,-42,14,16,15,15,17,21,32,42,55,-86,-88,-89,-91,-15,-77,-59,-60,-42,-38,14,16,14,12,12,17,56,33,35,59,59,55,-91,-13,-77,-41,-4,-16,-23,16,17,13,8,-3,-6,-4,59,59,59,17,-91,-11,-12,-11,-9,-7,-28,-26,19,21,17,13,3,-26,-78,16,-80,0,-15,-91,-91,-10,-38,-75,-76,-46,-47,23,25,26,24,21,60,-79,-82,-73,-81,-61,-91,-10,-10,-23,-19,-57,-85,-71,27,32,36,38,40,46,81,80,-89,-90,-79,-91,-91,-9,-22,-27,-21,-51,-85,28,30,42,83,52,56,64,55,70,-12,-87,-24,-92,-92,-19,-19,-99,-99,-91,27,31,29,49,51,52,61,56,58,78,-32,63,63,62,-95,-96,-94,-99,-96,28,28,34,38,48,51,56,59,62,68,62,57,54,-28,-40,-95,-95,-98,-96,27,30,32,38,43,49,54,58,63,63,60,54,32,5,-28,-81,-95,-97,-97],"ownershipAllowedMAE":0.0435997})%"); + lines.push_back(R"%({"sample":{"board":".................../................O../..OX.........XXXO../..OX.....X..XO.O.../..OX.........O..O../.OX............O.O./.OX...........XXO../..X............OX../.................../......O..........X./...............XXO./................OO./................OX./..............XXOX./...............OX../..XXX.......O..OXX./..OOOXXX.......OX.X/.....OO.........OXO/.................O./","hintLoc":"null","initialTurnNumber":0,"metadata":"5E9BF945AC1D1B6405434A7B2F413258:5","moveLocs":["T1","R11","Q2","R10","P12"],"movePlas":["B","W","B","W","B"],"nextPla":"B","weight":1.05,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":9.0,"policyOptimism":0.0,"pda":1.478,"policyMixture":[1.09e-06,1.68e-06,2.2e-06,1.9e-06,1.76e-06,1.61e-06,1.51e-06,1.47e-06,1.52e-06,1.59e-06,1.63e-06,1.7e-06,1.68e-06,2.23e-06,1.81e-06,1.63e-06,1.34e-06,1.11e-06,1.08e-06,1.32e-06,2.46e-06,1.19e-05,4.47e-05,5.95e-06,4.24e-06,3.64e-06,4.23e-06,5.81e-06,1.2e-05,1.66e-05,1.62e-05,4.08e-06,2.13e-06,1.71e-06,1.8e-06,0,1.19e-06,1.17e-06,1.34e-06,1.71e-06,0,0,2.5e-06,5.35e-06,8.23e-06,1.91e-05,2.69e-05,4.34e-05,5.63e-05,3.41e-05,1.85e-05,0,0,0,0,1.27e-06,1.16e-06,1.44e-06,1.84e-06,0,0,2.05e-06,4.52e-06,4.73e-06,1.09e-05,3.24e-05,0,6.58e-05,3.92e-05,0,0,1.63e-06,0,1.25e-06,1.29e-06,1.14e-06,1.46e-06,1.63e-06,0,0,2.7e-06,4.11e-06,6.55e-06,1.22e-05,2.19e-05,3.17e-05,3.6e-05,1.19e-05,4.51e-05,0,1.47e-06,1.32e-06,0,1.32e-06,1.18e-06,1.2e-06,0,0,4.51e-06,2.7e-05,6.11e-06,1.27e-05,1.39e-05,1.32e-05,9.81e-06,1.99e-05,2.87e-05,4.89e-06,2.6e-06,1.92e-06,0,1.33e-06,0,1.31e-06,1.49e-06,0,0,2.21e-06,8.48e-06,1.66e-05,2.63e-05,2.42e-05,1.28e-05,1.07e-05,1.12e-05,1.29e-05,9.83e-06,3.24e-06,0,0,0,1.77e-06,1.42e-06,1.93e-06,3.17e-05,0,2.94e-06,9.39e-06,2.22e-05,3.02e-05,2.9e-05,9.43e-06,1.11e-05,1.21e-05,1.37e-05,1.04e-05,2.79e-06,0,0,0,0.336,1.59e-06,1.89e-06,3.9e-06,7.23e-06,1.11e-05,1.02e-05,5.06e-06,3.53e-06,9.31e-06,2.33e-05,1.78e-05,1.47e-05,1.37e-05,8.66e-06,1.81e-05,1.34e-05,0.266,0,0.000203,1.75e-06,1.65e-06,3.56e-06,1.29e-05,1.54e-05,1.77e-05,3.29e-06,0,3.55e-06,2.66e-05,2.06e-05,1.71e-05,1.64e-05,1.44e-05,4.87e-05,0.142,0.1,0,0,2.4e-06,1.51e-06,3.52e-06,1.07e-05,2.22e-05,2.13e-05,7.53e-06,3.46e-06,7.06e-06,2.5e-05,2.04e-05,1.78e-05,2e-05,2.15e-05,9.09e-05,0.092,0,0,0,1.44e-06,1.47e-06,3.42e-06,6.49e-06,1.36e-05,1.03e-05,2.75e-05,3.1e-05,2.7e-05,1.15e-05,1.52e-05,1.62e-05,2.26e-05,2.27e-05,4.29e-05,0.000585,0.0013,0,0,1.54e-06,1.53e-06,3.6e-06,7.35e-06,6.37e-06,9.94e-06,2.36e-05,2.67e-05,2.25e-05,1.7e-05,1.94e-05,1.95e-05,4.03e-05,5.56e-05,0.000168,0.000315,4.21e-06,0,0,1.7e-06,1.54e-06,3.72e-06,6.25e-06,6.02e-06,4.75e-06,7.5e-06,1.46e-05,1.94e-05,2.03e-05,2.16e-05,1.58e-05,4.26e-05,7.66e-05,0.00018,0,0,0,0,1.55e-06,1.72e-06,5.61e-06,2.47e-06,2.12e-06,2.81e-06,3.94e-05,1.05e-05,1.45e-05,1.57e-05,2.87e-05,2.56e-05,9.85e-06,3.1e-06,3.35e-05,7.04e-06,0,0,1.77e-06,1.77e-06,1.85e-06,3.09e-05,0,0,0,5.36e-06,2.26e-06,2.92e-06,1.85e-05,2.8e-05,2.47e-05,3.01e-06,0,4.29e-06,2.36e-06,0,0,0,1.47e-06,2.26e-06,9.03e-06,0,0,0,0,0,0,1.1e-05,2.98e-05,1.86e-05,3.73e-06,2.82e-06,1.03e-05,3.77e-06,0,0,0,0,1.69e-06,2.5e-06,1.78e-06,1.82e-06,1.66e-06,0,0,2.67e-05,3.71e-06,3.69e-06,3.44e-06,3.07e-06,3.15e-06,3.13e-06,0.0571,0,0,0,5.56e-06,1.14e-06,1.33e-06,1.38e-06,1.47e-06,1.52e-06,1.21e-06,1.48e-06,1.85e-06,1.74e-06,1.67e-06,1.6e-06,1.55e-06,1.61e-06,1.8e-06,2.22e-06,3.3e-06,2.42e-06,0,0,3.17e-06],"winrateAvg":0.893131,"leadAvg":4.9984,"scoreMeanAvg":7.02513,"scoreStdevAvg":12.5885,"shorttermWinlossErrorAvg":0.0851903,"shorttermScoreErrorAvg":1.27918,"ownership":[59,43,25,-9,-27,-35,-35,-36,-38,-41,-40,-37,-27,7,21,56,68,91,93,71,67,37,-8,-53,-34,-37,-36,-41,-41,-42,-37,-35,-41,-13,-1,99,94,96,75,73,84,-86,-51,-39,-33,-34,-43,-51,-44,-39,-45,-55,-54,-55,99,98,97,76,79,84,-87,-45,-31,-30,-31,-36,-82,-30,-23,-62,96,16,99,98,98,98,72,75,84,-88,-35,-28,-24,-22,-22,-22,-17,-7,14,96,62,84,100,98,97,56,76,-88,-60,-18,-20,-17,-15,-14,-14,-6,-2,15,34,23,98,94,99,93,13,75,-86,-39,-16,-12,-11,-10,-11,-10,-9,-6,3,7,-38,-36,96,88,90,-6,-19,-87,-27,-11,-2,1,-6,-11,-10,-10,-8,-2,-4,-39,72,72,86,85,-17,-18,-32,-12,-5,0,10,-7,-10,-10,-10,-9,-4,1,6,47,96,88,86,-17,-19,-19,-10,1,11,59,0,-10,-11,-11,-10,-6,2,19,31,95,82,86,-20,-20,-17,-9,0,0,7,-9,-12,-11,-10,-10,-6,-1,15,-22,-22,90,67,-24,-24,-21,-14,-8,-1,-1,-8,-12,-10,-9,-6,-3,1,6,7,89,89,-25,-28,-28,-21,-17,-12,-8,-8,-9,-10,-8,-6,0,6,7,-1,14,88,-94,-52,-32,-29,-28,-21,-19,-14,-15,-10,-9,-5,-2,8,9,7,-52,-51,86,-94,-87,-28,-49,-46,-39,-29,-11,-18,-15,-8,-1,3,2,19,18,-28,13,-96,-94,-93,-14,-12,-83,-83,-84,-57,-38,-27,-10,-2,5,18,65,15,-12,8,-96,-96,-95,18,20,82,83,82,-83,-82,-83,-27,-2,9,13,18,3,-35,3,-97,-95,-95,33,65,68,75,72,76,75,-4,-6,0,5,6,-4,-30,-71,-90,-89,-95,-93,53,66,72,73,70,58,23,4,-4,0,3,2,-11,-35,-61,-77,-92,-89,-92],"ownershipAllowedMAE":0.032199})%"); + lines.push_back(R"%({"sample":{"board":".................../..X...OOX........../..XOOOXOX..X......./..XX.X.XXO.X...X.../.X...XX..XO..O...../.OOOOOOXXOO.O....../..OXXXXOOX........./.XO...O..X..X....../..XOO..O.........../..XXOOXO.......X.../....XOOX.........../.OO.XOXX.........../.XOX.XOOO........../XOXX..X............/.OO..X.......O...../.O.O..X.O....XOOOX./..O.........OOXXXO./............OX...X./.................../","hintLoc":"null","initialTurnNumber":108,"metadata":"E7774D8ADD74996B618105D378BB3D60:118","moveLocs":["O11","O17","Q14","L18","M18","L17","L19","K19","M19","K18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.79,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":2.0,"policyOptimism":0.773,"pda":2.26,"policyMixture":[1.79e-06,1.9e-06,2.11e-06,2.19e-06,2.29e-06,2.59e-06,2.76e-06,2.94e-05,0.0114,0,0,0,2.53e-06,5.95e-06,4.63e-06,3.13e-06,2.43e-06,2.18e-06,1.63e-06,1.88e-06,2.09e-06,0,3.38e-06,3.33e-06,2.61e-05,0,0,0,0,0,0,2.57e-06,0.00011,0.0214,8.62e-05,6.67e-06,2.59e-06,2.11e-06,2e-06,2.12e-06,0,0,0,0,0,0,0,2.13e-05,0,0,2.69e-06,0,0.00141,7.66e-05,1.08e-05,2.64e-06,2.13e-06,2.22e-06,2.26e-06,0,0,0.00107,0,4.02e-06,0,0,0,0.847,0,0.000426,6.95e-05,0.00442,0,3.55e-06,2.65e-06,2.11e-06,2.49e-06,0,2.75e-06,0.000151,0.00019,0,0,0.000449,7.18e-05,0,0,0.00627,0.000163,0,4.86e-06,2.74e-06,2.69e-06,2.47e-06,2.07e-06,2.98e-06,0,0,0,0,0,0,0,0,0,0,0.000221,0,6.45e-06,2.77e-06,0,2.53e-06,2.49e-06,1.97e-06,2.76e-06,2.64e-06,0,0,0,0,0,0,0,0,3.23e-06,1.94e-05,3.02e-06,2.55e-06,2.68e-06,2.59e-06,2.58e-06,2.4e-06,1.93e-06,2.64e-06,0,0,3.03e-06,2.69e-06,7.17e-06,0,0.003,0.00139,0,2.32e-06,2.54e-06,0,2.49e-06,2.46e-06,2.56e-06,2.4e-06,2.4e-06,1.91e-06,2.56e-06,2.54e-06,0,0,0,4.11e-06,4.02e-06,0,0.0994,2.43e-06,3.06e-06,2.55e-06,2.51e-06,0,2.49e-06,2.6e-06,2.5e-06,2.42e-06,1.93e-06,2.5e-06,2.65e-06,0,0,0,0,0,0,6.66e-06,2.93e-06,2.65e-06,2.58e-06,2.4e-06,2.57e-06,2.38e-06,0,2.51e-06,2.58e-06,1.95e-06,2.51e-06,3.25e-06,2.63e-06,2.56e-06,0,0,0,0,2.57e-06,2.74e-06,2.47e-06,2.44e-06,2.44e-06,2.41e-06,2.38e-06,2.4e-06,2.58e-06,2.51e-06,1.94e-06,2.62e-06,0,0,4.67e-06,0,0,0,0,2.59e-06,1.99e-05,2.85e-06,3.11e-06,2.46e-06,2.49e-06,2.44e-06,2.48e-06,2.55e-06,2.65e-06,1.93e-06,2.69e-06,0,0,0,2.38e-06,0,0,0,0,3.14e-06,2.83e-06,3.37e-06,3.72e-06,2.49e-06,2.46e-06,2.52e-06,2.58e-06,2.71e-06,2e-06,0,0,0,0,2.46e-06,2.57e-06,0,2.8e-06,3.25e-06,2.87e-06,3.01e-06,3.23e-06,4.29e-06,3.91e-06,2.5e-06,2.52e-06,2.82e-06,2.69e-06,2.04e-06,2.15e-06,0,0,2.48e-06,2.85e-06,0,2.22e-06,3.38e-06,4.03e-06,4.48e-06,4.61e-06,4.34e-06,5.76e-06,0,3.06e-06,2.52e-06,2.99e-06,5.96e-06,2.12e-06,2.12e-06,0,0,0,2.59e-06,2.36e-06,0,2.82e-06,0,2.92e-06,5.66e-06,1.42e-05,1.85e-05,0,0,0,0,0,2.34e-06,2.05e-06,2.23e-06,0,2.3e-06,2.83e-06,3.16e-06,2.63e-06,3.08e-06,5.1e-06,2.86e-06,2.78e-06,3.15e-06,0,0,0,0,0,0,2.43e-06,2e-06,2.29e-06,2.55e-06,2.5e-06,2.78e-06,2.62e-06,2.82e-06,2.67e-06,2.81e-06,2.78e-06,2.94e-06,2.8e-06,0,0,2.41e-06,2.19e-06,2.14e-06,0,1.99e-06,1.88e-06,2.01e-06,2.1e-06,2.29e-06,2.31e-06,2.29e-06,2.23e-06,2.23e-06,2.17e-06,2.15e-06,2.19e-06,2.24e-06,2.25e-06,2.25e-06,2.4e-06,2.21e-06,1.93e-06,1.98e-06,1.8e-06,5.03e-06],"winrateAvg":0.148475,"leadAvg":-6.97167,"scoreMeanAvg":-8.34779,"scoreStdevAvg":15.548,"shorttermWinlossErrorAvg":0.249189,"shorttermScoreErrorAvg":4.76442,"ownership":[-92,-93,-89,-82,-75,-69,-68,-71,-80,-56,-85,-84,-64,-53,-45,-43,-42,-41,-43,-92,-93,-97,-78,-70,-68,-64,-65,-94,-56,-52,-85,-41,-14,-44,-44,-45,-43,-43,-89,-93,-97,-62,-63,-66,-81,-64,-96,-58,-54,-86,-33,4,-29,-42,-48,-46,-44,-85,-86,-97,-98,-72,-92,-79,-95,-96,-32,-79,-86,-35,-17,-40,-84,-53,-46,-45,-15,-91,16,13,-38,-93,-94,-90,-39,-37,4,-45,-22,9,-31,-50,-47,-47,-44,40,96,96,96,96,95,95,-84,-82,7,7,-10,10,-19,-34,-85,-55,-46,-43,50,56,96,85,84,83,78,85,82,-65,-27,-32,-35,-31,-36,-47,-49,-46,-40,4,-16,97,94,92,91,97,83,19,-65,-31,-35,-86,-48,-38,-43,-43,-40,-37,-5,-15,-24,99,99,94,95,98,-26,-9,-6,-28,-47,-89,-46,-49,-45,-39,-33,5,4,-19,-23,99,99,94,98,26,9,-6,-12,-11,-34,-38,-85,-44,-28,-26,32,22,26,-11,-32,99,99,28,40,13,-3,-7,-10,-14,-18,-21,-23,-21,-15,56,85,85,-3,-33,99,36,28,53,-3,6,0,0,-3,-4,-7,-10,-8,-6,86,81,86,-34,-26,-32,90,88,88,31,17,11,6,9,5,3,0,-3,-3,82,99,-34,-35,-18,-26,-32,24,48,32,25,21,19,19,19,14,10,-10,-5,94,100,100,44,37,-38,5,53,47,37,33,32,38,77,36,24,14,6,-24,96,100,96,97,34,-2,-35,11,83,50,43,43,58,54,77,75,74,-85,-55,94,94,99,64,29,17,-4,11,23,55,50,57,88,87,-87,-88,-90,-82,-87,91,87,84,59,42,25,18,16,34,48,56,63,88,1,2,-70,-83,-90,-87,86,81,69,55,35,20,14,17,30,44,54,63,51,36,-25,-57,-79,-85,-87],"ownershipAllowedMAE":0.110691})%"); + lines.push_back(R"%({"sample":{"board":"...XXXOOOX.O.X...../..OX.XXOOXOOXXXXOXX/..OX..XXOX.OOXOXXO./.O.OX.X.OOOOOOOOO.O/OXO.X.X.XXOXX....O./OXXXX.X.X.XOX..OXO./OXOOOXXO.XOOXO.OXX./.OO.O.....X.XXXXX../.XX.O.OX.........../.OXO.OX............/..O.OXOX...XOO.OX../..O.O.OXO.OXX.OXX../.OXO...X...XO.OXO../..XO....X..X.O.OXX./.O...O.....XO.OOOX./XOXXXO.....X.OXXXX./.XOOOXXX....O.OOOX./X.X.OOO.....OOXO.../.X................./","hintLoc":"null","initialTurnNumber":18,"metadata":"F1DA33EAB3A9EB282BA08144BABC5C2F:28","moveLocs":["H10","H2","J3","A5","A3","Q10","R10","J2","L3","K3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.09,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.08e-05,1.05e-05,3.87e-05,0,0,0,0,0,0,0,9.72e-06,0,1.04e-05,0,9.91e-06,1.2e-05,1.19e-05,1.15e-05,8.98e-06,1.15e-05,1.18e-05,0,0,1.13e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000418,1.07e-05,0,0,1.08e-05,1.09e-05,0,0,0,0,9.41e-06,0,0,0,0,0,0,0,0.00701,0.000513,0,0,0,0,1.1e-05,0,1.2e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.89e-05,0,1.12e-05,0,1.17e-05,0,0,0,0,0,1.24e-05,5.31e-05,6.15e-05,0.000205,0,9.27e-06,0,0,0,0,0,1.08e-05,0,1.1e-05,0,1.38e-05,0,0,0,1.16e-05,4.16e-05,0,0,0,0.0101,0,0,0,0,0,0,0,0,1.08e-05,0,0,0,0,0,1.19e-05,0,0,0,1.17e-05,0.0141,0,0,1.05e-05,0,1.49e-05,1.22e-05,1.15e-05,1.06e-05,1.04e-05,0,3.53e-05,0,0,0,0,0,1.11e-05,1.14e-05,0.00012,0,0,1.08e-05,0,1.6e-05,0,0,1.07e-05,1.05e-05,1.08e-05,1.11e-05,1.17e-05,1.19e-05,1.26e-05,1.29e-05,1.16e-05,1.08e-05,1.09e-05,0.000249,0,0,0,0,0,0,0,1.08e-05,1.1e-05,1.06e-05,1.11e-05,2.6e-05,1.12e-05,6.8e-05,0,0,1.12e-05,1.11e-05,1.12e-05,0.000322,0,1.14e-05,0,0,0,0,1.11e-05,1.12e-05,1.17e-05,0,0,0,2.24e-05,0,0,1.1e-05,1.09e-05,3.65e-05,0.000394,0,1.25e-05,0,1.15e-05,0,0,0,1.11e-05,0,0,0,1.3e-05,0,0,0,1.12e-05,1.09e-05,0.000225,0,0,0,1.08e-05,1.76e-05,3.59e-05,0,1.18e-05,1.13e-05,1.2e-05,0,0,1.33e-05,0,0,0,1.09e-05,1.08e-05,0.000359,0.000425,0,0,2.92e-05,0.0208,1.19e-05,1.19e-05,0,1.2e-05,1.13e-05,0,1.28e-05,0,0,0,0,0,1.07e-05,0,0,0.00107,2.27e-05,9.37e-05,0,0.000279,0.000177,2.19e-05,2.89e-05,1.19e-05,0,0,0,0,0,0,0,1.07e-05,0,0,0,0,0,0,4.15e-05,1.26e-05,0.000122,0.939,1.42e-05,0,1.39e-05,0,0,0,0,0,1.1e-05,0,0,0,0,0,0,0,0,0,0,0,1.24e-05,0,0,0,0,0,0,1.1e-05,0,8.3e-06,0,1.12e-05,0,0,0,0,0,0.00173,0.000105,1.27e-05,0,0,0,0,1.22e-05,2.26e-05,1.17e-05,7.76e-06,0,1.07e-05,1.1e-05,1.08e-05,1.06e-05,1.04e-05,1.06e-05,1.06e-05,1.19e-05,1.23e-05,1.14e-05,1.11e-05,1.17e-05,1.16e-05,1.16e-05,1.22e-05,1.23e-05,1.11e-05,1.05e-05],"winrateAvg":0.439256,"leadAvg":-0.0973935,"scoreMeanAvg":-0.252461,"scoreStdevAvg":3.32521,"shorttermWinlossErrorAvg":0.423589,"shorttermScoreErrorAvg":1.05111,"ownership":[21,-15,-57,-100,-100,-100,100,100,100,43,73,100,27,-99,-99,-99,-99,-99,-99,55,64,96,-100,-100,-100,-100,100,100,40,100,100,-99,-99,-99,-99,-99,-99,-99,70,75,97,-100,-100,-100,-100,-100,100,41,73,100,100,-99,99,-99,-99,70,-71,97,98,90,90,-100,-100,-100,30,100,100,100,100,100,100,99,99,98,69,84,99,-100,90,-79,-100,-100,-100,-20,-100,-100,100,-100,-100,-5,14,26,16,95,66,99,-100,-100,-100,-100,-100,-100,-91,-100,-4,-6,-6,-100,-10,3,63,-100,95,-10,99,-100,100,100,100,-100,-100,-86,-92,-98,-6,-9,-100,33,-30,62,-100,-100,-21,98,100,100,100,100,-56,67,-91,-91,-92,-98,-60,-100,-100,-100,-100,-100,-96,-92,99,99,98,99,100,82,88,-100,-95,-95,-84,-38,-17,-29,-42,9,-61,-95,-93,99,99,99,100,97,97,-100,-100,-98,-97,-96,-4,11,39,10,95,-100,-98,-97,99,99,100,100,100,47,50,-100,-98,-98,-98,-100,98,99,95,96,-100,-99,-98,99,99,100,100,100,48,47,-100,-98,-98,-97,-100,-100,-16,100,-100,-100,-100,-99,99,99,97,100,55,6,-29,-100,-99,-99,-99,-100,73,55,100,-100,-100,-100,-99,99,99,97,100,49,-12,-13,-55,-100,-97,-96,-100,-42,100,99,100,-100,-100,-99,99,99,98,98,97,99,23,19,-66,-88,-90,-100,99,99,100,100,100,-100,-98,-99,99,97,97,97,99,29,-22,-79,-97,-86,-100,-19,100,-100,-100,-100,-100,-96,-99,-99,100,100,100,-94,-95,-95,-95,93,-94,5,100,100,100,100,100,-100,-62,-99,-99,-99,-46,100,100,100,100,100,94,-3,28,100,100,99,100,50,1,-55,-99,-99,-98,51,81,93,96,94,85,57,30,43,68,95,99,85,36,-9,-19],"ownershipAllowedMAE":0.0348139})%"); + lines.push_back(R"%({"sample":{"board":".........../..OO......./..OXX....../..XOXX.O.../...O...XX../..OOX....../.OX.XO..O../.X.XOX.O.../...XOX...../.....XO..../.........../","hintLoc":"null","initialTurnNumber":13,"metadata":"D42188E9C227B291DA81153C11182012:23","moveLocs":["K5","B8","D5","E7","C4","C3","A4","B9","B10","C5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":11,"ySize":11},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":11.0,"policyOptimism":0.684,"pda":0.0,"policyMixture":[1.29e-05,1.27e-05,1.12e-05,1.21e-05,1.22e-05,1.27e-05,1.32e-05,1.38e-05,1.3e-05,1.32e-05,1.14e-05,4.61e-05,0,0,0,0.000744,3.36e-05,3.53e-05,2.88e-05,1.49e-05,1.44e-05,1.33e-05,0.000114,0,0,0,0,1.18e-05,3.95e-05,1.57e-05,1.94e-05,3.3e-05,1.28e-05,3.08e-05,0,0,0,0,0,3.68e-05,0,6.51e-05,1.78e-05,1.28e-05,5.92e-05,0.253,1.95e-05,0,0,1.23e-05,9.07e-05,0,0,3.27e-05,1.25e-05,0.000495,0.00173,0,0,0,1.36e-05,1.29e-05,1.31e-05,1.31e-05,1.2e-05,1.33e-05,1.45e-05,0,0,0,0,0,1.29e-05,1.22e-05,0,0,1.27e-05,0,0,0,0,0,0,1.39e-05,0,1.29e-05,1.27e-05,1.29e-05,1.56e-05,0.74,0,0,0,0,2.42e-05,1.38e-05,1.34e-05,1.39e-05,1.24e-05,1.4e-05,1.3e-05,3.42e-05,5.16e-05,0.00217,0,0,1.5e-05,1.48e-05,1.3e-05,1.24e-05,1.2e-05,1.3e-05,1.26e-05,1.29e-05,1.31e-05,3.34e-05,1.29e-05,1.26e-05,1.27e-05,1.29e-05,1.12e-05,1.25e-05],"winrateAvg":0.35639,"leadAvg":-1.06152,"scoreMeanAvg":-1.24195,"scoreStdevAvg":7.57536,"shorttermWinlossErrorAvg":0.40729,"shorttermScoreErrorAvg":2.35821,"ownership":[59,52,40,15,-7,-35,-41,-42,-42,-42,-44,58,66,65,64,-37,-59,-49,-44,-41,-43,-43,62,48,67,-99,-99,-78,-56,-49,-45,-39,-44,64,52,54,80,-100,-100,-68,-32,-51,-59,-41,61,72,67,80,-100,-68,-38,-87,-88,-48,-30,44,60,81,81,-100,-44,-24,-9,3,-6,5,6,63,-30,79,-100,0,-6,23,75,75,34,17,-52,-37,-94,-88,-96,1,73,61,61,60,-18,-19,-91,-93,-88,-95,-15,20,50,57,57,-30,-46,-60,-85,-87,-95,19,-8,51,50,54,-42,-51,-63,-76,-82,-62,-41,8,31,46,51],"ownershipAllowedMAE":0.0644197})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../.................../","hintLoc":"null","initialTurnNumber":0,"metadata":"42276DAF8E72E49B9DB0440D9AB999EB:6","moveLocs":["E16","D4","F4","Q17","Q4","C17"],"movePlas":["B","W","B","W","B","W"],"nextPla":"B","weight":0.34,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":-6.5,"policyOptimism":0.736,"pda":0.0,"policyMixture":[5.49e-06,1.4e-05,1.51e-05,1.89e-05,2.09e-05,1.76e-05,1.63e-05,1.54e-05,1.53e-05,1.51e-05,1.48e-05,1.44e-05,1.41e-05,1.45e-05,1.6e-05,1.73e-05,1.44e-05,1.24e-05,5.6e-06,1.36e-05,6.59e-05,0.000111,0.000845,0.00065,0.000107,0.000105,0.00012,0.000119,0.000115,0.000114,0.000117,0.000122,0.00016,0.00015,0.000207,0.000105,7.6e-05,1.29e-05,1.35e-05,8.69e-05,0,0.00306,0.000108,0.000197,0.00146,0.00299,0.00333,0.00266,0.0025,0.00266,0.00308,0.00271,0.000653,0,0.000894,0.000114,1.36e-05,1.68e-05,0.000183,0.0651,0.000163,0,7.36e-05,0.0019,0.00338,0.00347,0.00291,0.00254,0.00252,0.00284,0.00355,0.00263,0.0262,0.00939,0.000118,1.82e-05,1.65e-05,0.000646,0.385,0.0698,0.000132,0.00019,0.00137,0.0016,0.00179,0.0014,0.0013,0.00147,0.00161,0.0015,0.00197,0.0129,0.0135,0.000452,1.76e-05,1.51e-05,0.000194,0.00302,0.0301,0.00279,0.00206,0.00122,0.00107,0.000961,0.000879,0.000888,0.001,0.00112,0.00109,0.000887,0.00515,0.00258,0.000128,1.61e-05,1.44e-05,0.000144,0.00346,0.00438,0.00275,0.00198,0.00123,0.00115,0.000906,0.000824,0.000858,0.000887,0.000779,0.000625,0.000586,0.00156,0.00163,0.000115,1.5e-05,1.43e-05,0.000123,0.00295,0.00306,0.00194,0.00164,0.0012,0.00105,0.000959,0.000905,0.000894,0.000873,0.000771,0.000613,0.000734,0.00196,0.00205,0.000114,1.47e-05,1.44e-05,0.000114,0.00239,0.00242,0.00134,0.00114,0.0011,0.00107,0.00105,0.00102,0.000964,0.000914,0.000834,0.000739,0.000978,0.00239,0.00213,0.000112,1.45e-05,1.47e-05,0.000111,0.00217,0.00227,0.00111,0.000957,0.00108,0.00115,0.00115,0.00112,0.00107,0.00098,0.00088,0.000848,0.00115,0.00262,0.00208,0.000112,1.48e-05,1.53e-05,0.000113,0.00219,0.00219,0.00114,0.00109,0.00126,0.00124,0.00122,0.00121,0.00113,0.000987,0.000813,0.000701,0.000988,0.00247,0.00199,0.000113,1.5e-05,1.6e-05,0.00012,0.0024,0.00211,0.00141,0.00155,0.00159,0.00131,0.00127,0.00125,0.00112,0.000881,0.000574,0.000405,0.000677,0.00199,0.00228,0.000118,1.54e-05,1.84e-05,0.000151,0.00379,0.00337,0.00189,0.00213,0.00189,0.00125,0.00132,0.00124,0.00104,0.000649,0.000371,0.000226,0.000415,0.0027,0.00353,0.000127,1.55e-05,2.13e-05,0.00169,0.0189,0.0119,0.00278,0.00254,0.00162,0.000555,0.00104,0.00118,0.000961,0.000473,0.00023,0.00017,0.000335,0.00276,0.00376,0.00013,1.68e-05,2.47e-05,0.00251,0.0029,0.00651,0.000263,9.32e-05,0.000186,0.001,0.00149,0.00176,0.00132,0.000755,0.000375,0.000284,0.000133,0.000104,0.00157,0.000136,1.73e-05,2.32e-05,0.00156,0.00256,0,0.000103,0,9.13e-05,0.00247,0.00329,0.00327,0.00278,0.00202,0.00255,0.00268,0.000104,0,0.000121,0.00011,1.68e-05,1.75e-05,0.000269,0.00319,0.00504,0.00042,0.000264,0.000538,0.00224,0.00293,0.00298,0.00228,0.00233,0.00355,0.00376,0.00161,0.000127,0.00018,8.29e-05,1.26e-05,1.45e-05,0.000103,0.000349,0.000624,0.00337,0.00158,0.000136,0.000118,0.000121,0.000122,0.000118,0.000121,0.000132,0.000133,0.000134,0.000108,8.29e-05,5.54e-05,1.26e-05,5.87e-06,1.46e-05,1.92e-05,2.65e-05,2.61e-05,2.13e-05,1.73e-05,1.65e-05,1.6e-05,1.62e-05,1.59e-05,1.63e-05,1.65e-05,1.78e-05,1.87e-05,1.8e-05,1.35e-05,1.3e-05,5.85e-06,2.28e-05],"winrateAvg":0.015348,"leadAvg":-11.5126,"scoreMeanAvg":-14.0271,"scoreStdevAvg":14.0103,"shorttermWinlossErrorAvg":0.0200839,"shorttermScoreErrorAvg":1.05621,"ownership":[29,30,29,26,16,8,1,-2,-3,0,4,9,17,26,36,42,42,39,34,25,32,34,26,17,11,1,-3,-3,-1,2,9,17,25,39,48,44,36,31,15,21,55,14,28,-14,-10,-8,-5,-2,0,5,14,17,28,75,38,27,24,1,1,-9,25,-63,-27,-16,-8,-4,-2,-1,1,2,5,8,4,27,18,13,-13,-18,-47,-22,-23,-19,-12,-7,-4,-3,-3,-2,-2,-2,0,-9,-4,0,2,-16,-20,-17,-16,-14,-11,-9,-6,-4,-3,-4,-4,-4,-5,-5,-7,-1,-6,-4,-15,-17,-13,-11,-10,-9,-6,-5,-4,-4,-4,-4,-5,-6,-7,-7,-7,-7,-6,-13,-15,-12,-10,-8,-6,-5,-4,-4,-4,-4,-4,-5,-6,-7,-7,-7,-7,-6,-11,-12,-10,-8,-6,-5,-4,-4,-4,-4,-4,-4,-5,-5,-5,-6,-5,-6,-5,-10,-11,-9,-6,-5,-4,-4,-4,-4,-4,-5,-5,-5,-5,-5,-6,-4,-4,-3,-9,-11,-9,-7,-6,-5,-5,-5,-5,-5,-5,-5,-5,-5,-6,-6,-5,-4,-2,-8,-10,-9,-7,-5,-6,-6,-5,-5,-5,-5,-5,-6,-7,-8,-8,-8,-5,-3,-5,-9,-7,-8,-3,-5,-7,-7,-6,-6,-6,-6,-7,-9,-11,-11,-13,-5,-4,-1,-6,-8,17,3,-7,-8,-8,-8,-7,-7,-8,-10,-13,-17,-23,-14,-5,-5,4,6,14,14,3,-4,-10,-11,-11,-9,-8,-10,-13,-18,-24,-36,-25,-12,-7,10,11,21,67,5,-61,-19,-16,-13,-11,-10,-11,-14,-24,-35,-80,-24,-9,-7,13,14,19,14,2,-9,-20,-11,-15,-13,-10,-13,-16,-20,-29,-30,-4,-7,-5,15,13,14,10,1,-11,-14,-12,-13,-12,-11,-10,-10,-10,-18,-13,-10,-4,-5,14,14,13,9,0,-7,-11,-12,-12,-10,-8,-8,-8,-10,-11,-11,-8,-6,-7],"ownershipAllowedMAE":0.0284236})%"); + lines.push_back(R"%({"sample":{"board":".................../............XXXXXOO/..XO.O.X.O..X....XO/..XXXXX....OOXXXXOO/...O..X......OX.XXO/.X...OXO..XO.X...O./.XOO.OOX..XXXOXXO../XO.OXOXX.X.OOOOXOOO/X.OXXXO.O...XO.OOXX/XXXXOOO.O.OOOXXXOX./OOOOXX.X...OXOXOX../.OO.OX.X.X.OX.XOXX./.OX.OO......O..OOX./OOXXXO.OOO...OOOX../OXXOX...X...O..XXX./X.XO.OXO..X.O.OXOXO/.XOO.OXO.O.XOXXO.O./XXO...OX.OX.XXOOOOO/.X.............O.X./","hintLoc":"null","initialTurnNumber":211,"metadata":"38C30D8787BF882D2B9C4EDFDFAD1B27:221","moveLocs":["K11","L12","J12","J13","S19","L3","M1","L1","O1","L5"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.68,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.4e-06,6.58e-06,6.21e-06,6.77e-06,6.45e-06,6.69e-06,6.54e-06,6.17e-06,6.6e-06,6.96e-06,6.76e-06,6.64e-06,6.27e-06,6.18e-06,6.36e-06,7.52e-06,1.67e-05,0,4.84e-06,6.55e-06,6.55e-06,7.34e-06,6.9e-06,7.58e-06,8.06e-06,9.92e-06,5.6e-05,6.98e-06,7.1e-06,7.58e-06,6.8e-06,0,0,0,0,0,0,0,6.47e-06,6.82e-06,0,0,7.9e-06,0,1.13e-05,0,8.67e-06,0,6.85e-06,7.02e-06,0,5.75e-06,6.12e-06,7.01e-06,0.000108,0,0,6.79e-06,8.03e-06,0,0,0,0,0,7.35e-06,7.25e-06,7.16e-06,6.69e-06,0,0,0,0,0,0,0,0,1.32e-05,0.000255,5.44e-05,0,6.14e-06,5.82e-06,0,7.1e-06,8.63e-06,8.85e-06,9.1e-06,8.25e-06,7.26e-06,0,0,6.42e-06,0,0,0,1.04e-05,0,3.71e-05,6.22e-06,6.44e-06,0,0,0,0.00134,1.73e-05,0,0,0.00418,0,5.68e-05,0.00117,0.0237,0,1.07e-05,9.48e-05,0,0,0,1.51e-05,0,0,0,0,1.06e-05,0,0,0,0,0,0,0,8.22e-06,1.26e-05,0,0,6.48e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.14e-06,0,0,0,0,0,0.00073,0,0,6.12e-05,0.00029,0,0,2.83e-05,0,0,0,0,0,0,0,0,0,0,0,9.02e-06,0,7.98e-06,0,0,0,0,0,0,0,0,9.41e-05,0,0,0,0,0,0,8.09e-06,0,7.82e-06,7.6e-06,7.13e-06,0,0,0,0,0,0,0.00011,0.00123,7.24e-06,0,0,8.41e-06,0,0,8.16e-06,0,7.51e-06,0,7.26e-06,0,0,1.69e-05,0,0,0,0,9.48e-06,7.33e-06,0,0,0.000164,0,0,7.43e-06,7.86e-06,6.87e-06,7.69e-06,8.37e-06,6.92e-06,0,7.52e-06,1.24e-05,0,0,0,8.9e-06,0,0,0,0,0,0,1.01e-05,0,0,0,0.0757,8.01e-06,7.29e-06,0,0,0,0,1.02e-05,0.000214,0,0,0,0,0,0.282,0.000204,1.73e-05,0,0.312,0,0.00135,0,7.77e-06,0.00222,0,0,0,0.00224,0,0,0,0,0.000745,0,0,0,1.25e-05,0.233,0,0.000498,0,0.016,0,0,0,0,0,0,0,0,0,1.05e-05,0,0,0,9.33e-06,0,0,0,0,0,0,0,6.71e-06,0,4.95e-06,0,0,0,1e-05,1.36e-05,1.44e-05,0,0,1.89e-05,0,0,8.49e-06,0,0,0,0,0,0,0,0,0,0.0086,3.13e-05,1.07e-05,1.09e-05,1.05e-05,1.77e-05,8.69e-06,0.0303,0,0,0.000195,0,1.92e-05,0,5.13e-06,0,4.68e-06,1.47e-05],"winrateAvg":0.794874,"leadAvg":1.15921,"scoreMeanAvg":1.60779,"scoreStdevAvg":5.77078,"shorttermWinlossErrorAvg":0.242582,"shorttermScoreErrorAvg":1.43839,"ownership":[-97,-97,-96,-95,-94,-94,-93,-93,-92,-93,-94,-96,-97,-96,-89,-58,38,99,98,-97,-97,-96,-96,-95,-94,-94,-92,-92,-92,-93,-95,-100,-100,-100,-100,-100,99,99,-97,-97,-100,-93,-96,-91,-94,-98,-93,-87,-93,-94,-100,-98,-97,-83,-50,-51,99,-96,-97,-100,-100,-100,-100,-100,-95,-93,-92,-92,-88,-87,-100,-100,-100,-100,99,99,-95,-93,-96,-89,-95,-96,-100,-96,-94,-93,-93,-91,-94,-92,-100,-93,-100,-100,99,-94,-96,-92,-92,-93,-88,-100,-91,-91,-94,-98,-90,-90,-97,-95,-84,-82,99,98,-94,-96,-87,-87,-92,-88,-89,-97,-97,-96,-98,-98,-97,99,-98,-98,99,97,97,-95,-88,-89,-87,-96,-88,-96,-97,100,-98,-98,99,99,99,99,-98,100,99,99,-95,-93,-88,-95,-95,-95,99,10,100,100,35,97,97,99,97,99,99,-96,-97,-95,-95,-95,-95,99,99,99,98,100,98,100,100,100,95,95,95,99,-97,-96,99,99,99,99,93,93,96,93,97,97,97,100,97,99,95,100,-99,-97,-97,97,99,99,97,100,94,96,93,97,94,97,100,97,98,95,100,-98,-98,-98,97,99,-98,-1,100,100,97,97,97,97,98,98,100,98,98,100,100,-99,-98,99,99,-98,-98,-97,100,96,100,100,100,97,97,98,100,100,100,-99,-98,-98,99,-98,-98,99,-97,50,96,97,95,98,90,98,100,68,-19,-99,-99,-99,-99,-99,-99,-98,99,2,100,95,100,98,97,90,98,100,98,99,-99,-73,-99,-78,-99,-99,99,99,94,100,94,100,98,100,88,86,99,85,82,87,-77,88,-81,-99,-99,99,93,94,95,98,94,97,99,87,85,85,83,88,85,87,86,89,-99,-99,-69,90,91,96,96,97,97,97,87,86,85,88,87,87,85,83,85],"ownershipAllowedMAE":0.0333525})%"); + lines.push_back(R"%({"sample":{"board":".................../.O......X........../.XO.X...OX....XXX../.X.OO.O.OOX...XOO../.O.X......O...O..../XX.X.X..........X../.O.OX.X............/.XOOOO.X........O../.....O..X........../.OO.XOX.XO........./.X..OOXXOO........./.X.OXXXO.........../....OX.O.O........./.XXX.OX....X......./.OOXX....O........./O..OXXOO.OX...XXX../.OOOX.XO.XXX...OO../...OOXX...O..O...../.................../","hintLoc":"null","initialTurnNumber":108,"metadata":"48BB3283E1CDABA7E5A7082991188CB7:118","moveLocs":["L17","H18","A13","B11","C16","D17","C13","D10","O15","R9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.82,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1button1","komi":1.0,"policyOptimism":0.0,"pda":-1.668,"policyMixture":[4.63e-06,6.5e-06,5.93e-06,5.39e-06,5.49e-06,5.33e-06,6.06e-06,1.03e-05,7.63e-06,7.7e-06,6.16e-06,5.29e-06,5.45e-06,5.27e-06,5.34e-06,5.38e-06,5.29e-06,5.22e-06,4.74e-06,7.89e-06,0,9.3e-05,1.66e-05,6.27e-06,6.83e-06,8.91e-06,0,0,1.52e-05,7.84e-06,6.44e-06,6.72e-06,5.82e-06,5.64e-06,5.49e-06,5.59e-06,5.46e-06,5.2e-06,5.25e-06,0,0,0,0,2e-05,4.01e-05,8.92e-06,0,0,0,6.12e-06,6.74e-06,5.86e-06,0,0,0,6.59e-06,5.44e-06,5.23e-06,0,0,0,0,5.55e-05,0,7.8e-06,0,0,0,7.73e-06,7.86e-06,6.19e-06,0,0,0,1e-05,5.81e-06,5.54e-06,0,5.28e-06,0,7.44e-06,3.02e-05,9.03e-06,7.39e-06,6.97e-06,9.53e-06,0,0.000303,8.75e-06,0,0,4.63e-05,7.25e-06,9.19e-06,5.97e-06,0,0,5.89e-06,0,5.53e-06,0,5.92e-06,6.74e-06,7.45e-06,8.67e-06,9.72e-06,9.36e-06,1.03e-05,2.43e-05,0.584,1e-05,0,5.34e-05,7.05e-06,0,5.13e-06,0,0,0,5.8e-06,0,5.93e-06,7.19e-06,8.23e-06,9.68e-06,1.07e-05,1.2e-05,3.91e-05,0.000963,0.000117,0.0842,0.0102,7.49e-06,6.13e-06,0,0,0,0,0,5.8e-06,0,6.14e-06,7.8e-06,1.53e-05,2.2e-05,1.91e-05,3.06e-05,8.87e-05,0.00033,0,0.00174,6.85e-06,6.73e-06,0,4.97e-06,0.00245,0.00223,0,5.99e-06,5.35e-06,0,9.27e-06,1.25e-05,3.49e-05,3.55e-05,4.55e-05,8.06e-05,0.0149,0.00017,0.00152,7.49e-06,6.45e-06,0,0,0,0,0,0,5.28e-06,0,0,8.1e-06,8.67e-05,5.2e-05,5.31e-05,9.74e-05,0.00126,0.000672,0.000124,6.81e-06,5.93e-06,0,1.14e-05,6.78e-06,0,0,0,0,0,0,8.03e-06,7.91e-05,9.03e-05,6.16e-05,7.82e-05,0.000875,0,0.00043,6.47e-06,5.91e-06,0,6.02e-06,0,0,0,0,0,7.31e-06,7.76e-06,0.000138,7.51e-05,7.81e-05,5.44e-05,8.68e-05,0.000227,0.0486,0.0001,6.65e-06,6.06e-06,5.7e-06,5.75e-06,7.07e-06,0,0,6.96e-06,0,7.1e-06,0,1.17e-05,9.81e-06,1.56e-05,2.18e-05,2.93e-05,6.81e-05,0.000332,0.000108,6.63e-06,6.5e-06,0,0,0,6.73e-06,0,0,0.0138,2.19e-05,9.72e-06,1.45e-05,0,8.22e-06,9.97e-06,1.07e-05,1.09e-05,1.66e-05,1.04e-05,6.09e-06,5.4e-06,0,0,0,0,6.45e-06,5.88e-05,7.53e-06,1.04e-05,0,8.84e-06,6.88e-06,7.65e-06,8.35e-06,6.19e-06,5.97e-06,6.6e-06,3.17e-05,6.77e-06,0,5.33e-06,5.24e-06,0,0,0,0,0,8.71e-06,0,0,5.44e-06,9.15e-06,1.01e-05,0,0,0,0.00137,7.47e-06,5.26e-06,0,0,0,0,4.99e-06,0,0,1.05e-05,0,0,0,1.73e-05,0.191,6.14e-05,0,0,0.0344,9.16e-06,5.44e-06,5.05e-06,5.13e-06,0,0,0,0,3.72e-05,1.15e-05,7.23e-06,0,1.08e-05,1.98e-05,0,0.000377,9.67e-06,1.01e-05,9.3e-06,6.1e-06,5.25e-06,5.17e-06,5.24e-06,5.93e-06,6.17e-06,5.87e-06,6.06e-06,6.56e-06,6.73e-06,6.02e-06,5.92e-06,5.76e-06,6.93e-06,6.35e-06,5.79e-06,6.13e-06,5.62e-06,6.48e-06,4.81e-06,8.91e-06],"winrateAvg":0.55844,"leadAvg":0.336832,"scoreMeanAvg":0.642754,"scoreStdevAvg":9.8159,"shorttermWinlossErrorAvg":0.186512,"shorttermScoreErrorAvg":0.973606,"ownership":[45,70,82,86,87,83,65,40,28,-19,-36,-62,-72,-80,-87,-90,-90,-89,-85,-29,77,78,92,90,86,83,92,-12,-10,-75,-71,-77,-80,-91,-95,-92,-88,-81,-42,-91,97,97,85,89,87,84,97,-83,-83,-64,-48,-69,-99,-99,-99,-81,-77,-79,-91,-90,97,97,64,95,55,97,97,-83,-2,-27,-57,-99,-51,-52,-71,-68,-93,-89,-91,-98,14,-24,1,3,29,41,70,18,8,-89,-53,-68,-69,-67,-54,-97,-97,-96,-98,-57,-96,-47,-5,4,11,9,10,-3,-24,-73,-33,-84,-39,-24,-97,-92,-96,99,-65,19,-95,-38,-1,0,3,1,-1,-8,-8,5,4,-8,3,-77,-94,99,99,99,99,2,-94,-39,-10,2,-2,-1,-1,2,15,75,38,25,55,99,98,98,98,99,44,-28,-94,12,9,0,0,1,5,13,38,42,38,67,99,99,99,98,99,-96,-84,-95,92,29,5,2,3,7,16,36,46,41,10,-95,0,86,99,99,-96,-96,93,93,24,6,1,3,7,21,78,40,35,-59,-95,-20,87,-97,-97,-97,90,86,42,-5,-4,-3,0,0,4,6,22,17,-76,-89,-10,16,20,-97,11,90,73,91,14,-12,-4,-9,-11,-7,10,-3,-4,-2,-97,-98,-98,-79,-42,-66,-11,61,46,-10,-78,-24,-21,-21,-18,-22,-15,-24,47,100,100,-98,-98,-68,27,36,62,89,7,-41,-34,-33,-39,-41,-45,-48,-26,100,100,99,100,-98,-98,88,88,49,89,-90,-61,-40,-43,-88,-89,-89,0,-13,100,100,100,100,-98,-94,-94,88,2,-90,-90,-89,-1,-15,24,86,86,28,25,100,100,100,100,100,-95,-93,20,-24,-38,17,-15,23,76,65,77,71,66,41,99,100,100,94,20,-8,-52,-12,-10,-14,-10,0,19,39,64,71,71,65,55],"ownershipAllowedMAE":0.0286392})%"); + lines.push_back(R"%({"sample":{"board":"XXO................/XOOO..OOO......O.../XOXX.OXXXO.....OX../.XOO.OXXOOO....OX../.XOXOX.X.XXO....XO./..XXXX.XXXOOOOO.OO./.XOOO.X..XXXOXXOOX./XOXXO.XXXXOOOXO.XO./.OXX......X.XXOOXOO/.XOXO.X.XOXXXXO.XO./..OX.X.X.XOO.OOOOXO/....XOXXXXXOOOXOXX./....XOOXO.OO.OXX..X/.XXXXXOOOO.O.OOXXX./.XOOOOOXOX..OOXX.../XXXXXXOXOXOOOXX..../XOOOOOOXOOXXXO.X.../O.O..OXXXX..XO...../.....OOOX.XX......./","hintLoc":"null","initialTurnNumber":239,"metadata":"D114BFAECC4630B54AF14A37393A646E:249","moveLocs":["E16","A16","T13","J15","T10","T8","M11","K7","N9","K11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":5.5,"policyOptimism":0.422,"pda":0.0,"policyMixture":[0,0,0,0.0018,0.000805,0.000818,0.000822,0.000834,0.000813,0.000837,0.000828,0.000891,0.000906,0.000883,0.00088,0.000877,0.00085,0.000875,0.000944,0,0,0,0,0.0059,0.0143,0,0,0,0.0146,0.000838,0.00087,0.00091,0.000895,0.000877,0,0.0136,0.000908,0.000886,0,0,0,0,0.0164,0,0,0,0,0,0.00486,0.000841,0.000866,0.000881,0.00088,0,0,0.0136,0.000889,0,0,0,0,0,0,0,0,0,0,0,0.0147,0.000852,0.000876,0.000905,0,0,0.0132,0.000862,0.0555,0,0,0,0,0,0.000818,0,0,0,0,0,0.000922,0.000875,0.001,0.0138,0,0,0.000897,0.0547,0.0479,0,0,0,0,0.000829,0,0,0,0,0,0,0,0,0.0132,0,0,0.0127,0.0805,0,0,0,0,0.000843,0,0.00083,0.000838,0,0,0,0,0,0,0,0,0.0127,0,0,0,0,0,0,0.000841,0,0,0,0,0,0,0,0,0,0.0136,0,0,0.0118,0.00424,0,0,0,0.00103,0.00101,0.000818,0.000856,0.000824,0,0,0,0,0,0,0,0,0,0,0.0036,0,0,0,0,0.0057,0,0.000815,0,0,0,0,0,0,0,0.0139,0,0,0,0.000883,0.00623,0,0,0.00692,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000851,0.000877,0.000807,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000877,0.000843,0.000833,0.000833,0,0,0,0,0,0,0,0,0.000936,0,0,0,0.000841,0.000827,0,0.000837,0,0,0,0,0,0,0,0,0,0.0134,0,0.00244,0,0,0,0,0,0.000809,0.000843,0,0,0,0,0,0,0,0,0,0.0137,0.00884,0,0,0,0,0.000804,0.000823,0.000853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000778,0.000921,0.000905,0.000835,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00178,0,0.011,0.00204,0.000846,0,0.0141,0,0.000886,0.000887,0,0,0,0,0,0.0527,0.000852,0,0,0.00095,0.0172,0.00406,0.003,0.000874,0.00247,0.000825,0.000829,0.000841,0.000858,0,0,0,0,0,0,0,0.000866,0.000904,0.00142,0.000866,0.000905,0.000882,0.000845,0.304],"winrateAvg":0.999848,"leadAvg":6.50524,"scoreMeanAvg":6.45443,"scoreStdevAvg":0.805849,"shorttermWinlossErrorAvg":0.00713329,"shorttermScoreErrorAvg":0.386054,"ownership":[-100,-100,100,100,100,100,99,99,99,99,100,99,99,99,99,99,99,99,99,-100,100,100,100,100,100,100,100,100,100,100,99,99,99,99,100,99,99,99,-100,100,100,100,100,100,-100,-100,-100,100,100,100,99,99,99,100,99,100,100,-100,-100,100,100,100,100,-100,-100,100,100,100,100,99,99,99,100,99,100,99,-100,-100,100,-100,100,-100,-99,-100,-100,-100,-100,100,99,99,99,99,99,100,100,-99,-100,-100,-100,-100,-100,-99,-100,-100,-100,100,100,100,100,100,99,100,100,99,-99,-100,-99,-99,-99,-99,-100,-100,-100,-100,-100,-100,100,-100,-100,100,100,99,100,-100,-99,-100,-100,-99,-100,-100,-100,-100,-100,100,100,100,-100,100,99,99,100,99,-99,-99,-100,-100,-99,-99,-99,-99,-100,-100,-100,100,-100,-100,100,100,99,100,100,-99,-100,-99,-100,-99,-99,-100,-99,-100,-100,-100,-100,-100,-100,100,99,99,100,100,-100,-99,-99,-100,-99,-100,-99,-100,-100,-100,100,100,100,100,100,100,100,-100,100,-100,-99,-100,-99,-100,100,-100,-100,-100,-100,-100,100,100,100,-100,100,-100,-100,-100,-100,-100,-99,-100,-100,100,100,-100,100,-100,100,100,99,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,99,100,100,100,100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,100,99,99,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,99,100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-99,-100,-100,-100,-100,-100,100,100,100,99,100,100,-100,-100,-100,-100,-100,-100,-100,-99,-100,-99,-100,-99,-99,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-99,-99],"ownershipAllowedMAE":0.00323513})%"); + lines.push_back(R"%({"sample":{"board":".................../.XXXXOO.OXO.OX..X../.OOOOXO..OXO..XXOX./.XXXXXO.O.X.XOXOOO./...XOOOX.X..XXOO.../.XOO.OXX....OXXO.../..OXOOOOX..OXXXOXO./..O.O..X.X.XOOOXOO./....XXXOOXX.OXXXX.O/..X.XO.OXOOO.O.XOO./...OOO..XXOXO.OXX../..OXOX....X.X.XX.O./.XOX.....XOX.X...O./.O.OX.....OOXX.OOX./.XO.O......OOX..XX./OOOOO..........X.../OXXXXOOO...X.X...../X....XXO.........../.X................./","hintLoc":"null","initialTurnNumber":164,"metadata":"21E600B09E0A3BCA371171BDAD6E772B:174","moveLocs":["M8","G10","H9","M9","N17","M8","O17","J12","G12","J6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.99,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui0","komi":4.5,"policyOptimism":0.955,"pda":0.0,"policyMixture":[6.63e-06,6.22e-06,6.12e-06,6.54e-06,6.82e-06,7.06e-06,7.01e-06,6.62e-06,6.92e-06,8.8e-06,7.19e-06,7e-06,7.07e-06,9.84e-06,7.48e-06,7.27e-06,6.12e-06,6.95e-06,6.34e-06,6.64e-06,0,0,0,0,0,0,6.88e-06,0,0,0,6.56e-06,0,0,1.02e-05,7.43e-06,0,1.02e-05,7.2e-06,7.21e-06,0,0,0,0,0,0,6.83e-06,7.01e-06,0,0,0,0,0,0,0,0,0,7.43e-06,7.56e-06,0,0,0,0,0,0,6.87e-06,0,0.00044,0,0.00139,0,0,0,0,0,0,7.37e-06,7.42e-06,1.12e-05,7.2e-06,0,0,0,0,0,0.000149,0,0.0268,0.00119,0,0,0,0,6.31e-06,6.53e-06,6.6e-06,6.8e-06,0,0,0,6.4e-06,0,0,0,1.16e-05,2.41e-05,7.97e-05,7.76e-05,0,0,0,0,6.46e-06,6.95e-06,6.6e-06,6.57e-06,6.55e-06,0,0,0,0,0,0,0,7.42e-06,1.29e-05,0,0,0,0,0,0,0,6.53e-06,6.43e-06,6.63e-06,0,6.31e-06,0,6.78e-06,0,0,0,0,1.21e-05,0,0,0,0,0,0,0,6.73e-06,6.89e-06,6.39e-06,6.85e-06,7.2e-06,0,0,0,0,0,0,0,1.12e-05,0,0,0,0,0,6.89e-06,0,6.84e-06,6.56e-06,0,7.18e-06,0,0,0,0,0,0,0,0,7.32e-06,0,6.73e-06,0,0,0,6.69e-06,6.83e-06,6.56e-06,6.64e-06,0,0,0,0.145,0,0,0,0,0,0,6.91e-06,0,0,0,7.26e-06,6.44e-06,6.83e-06,6.51e-06,0,0,0,0,0.000452,0.619,0.000435,4.61e-05,0,0,0,8.48e-06,0,0,6.6e-06,0,6.76e-06,6.84e-06,0,0,0,1.16e-05,0.000583,0.00136,0.113,0.00102,0,0,0,0,0,6.38e-06,7.35e-06,1.01e-05,0,6.44e-06,6.65e-06,0,6.49e-06,0,0,3.64e-05,0.0663,0.0168,0,8.5e-05,0,0,0,0,6.03e-06,0,0,0,6.6e-06,6.47e-06,0,0,6.49e-06,0,1.04e-05,4.3e-05,0.000691,0.000223,2.59e-05,6.57e-06,0,0,0,6.49e-06,7.11e-06,0,0,6.94e-06,0,0,0,0,0,7.71e-06,7.29e-06,7.6e-06,8.21e-05,0.00158,7.34e-05,7.97e-06,7.71e-06,7.11e-06,6.94e-06,0,6.59e-06,6.76e-06,6.69e-06,0,0,0,0,0,0,0,0,8.28e-06,0.00181,0.000222,0,1.53e-05,0,7e-06,6.66e-06,6.69e-06,6.57e-06,6.53e-06,0,5.8e-05,1.91e-05,9.83e-06,1.05e-05,0,0,0,7.23e-06,3.07e-05,5.85e-05,1.17e-05,2.53e-05,7.2e-06,6.7e-06,6.63e-06,6.29e-06,6.46e-06,6.76e-06,0,0,6.24e-06,6.9e-06,7.19e-06,7.67e-06,7.32e-06,7.63e-06,7.37e-06,7.61e-06,7.72e-06,7.4e-06,7.48e-06,7e-06,6.63e-06,6.35e-06,6.36e-06,6.68e-06,7.13e-06,5.85e-06],"winrateAvg":0.328522,"leadAvg":-0.74446,"scoreMeanAvg":-1.19388,"scoreStdevAvg":6.06133,"shorttermWinlossErrorAvg":0.344545,"shorttermScoreErrorAvg":1.71719,"ownership":[-98,-98,-98,-91,-1,0,90,96,96,96,92,91,88,87,82,79,78,76,81,-98,-99,-99,-99,-99,100,100,84,99,91,96,93,97,84,84,80,75,84,82,-98,-98,-98,-98,-97,-98,100,56,84,95,-94,96,97,97,80,80,99,82,85,-85,-98,-98,-98,-98,-98,100,-30,96,21,-95,-69,-99,98,83,99,99,99,92,-65,-16,36,-98,100,100,100,-87,45,-87,-81,-85,-99,-99,99,99,97,96,95,-24,-55,100,100,99,100,-90,-89,-89,-84,-89,-95,-95,-99,-99,99,98,96,96,17,63,100,96,100,100,100,100,-100,-93,-95,-93,-99,-99,-99,99,97,99,96,52,88,100,97,100,97,100,-99,-100,-100,-97,-99,-96,-96,-96,-100,99,99,95,72,89,94,94,92,93,93,98,98,-100,-100,-98,-96,-100,-100,-100,-100,-53,97,84,89,87,95,92,100,93,98,-99,-95,-95,-96,-97,-96,-98,-100,60,92,91,89,91,93,100,100,100,95,98,-98,-99,-95,-100,-96,-98,-97,-100,-100,-80,91,93,95,100,79,100,42,65,80,15,-96,-100,-100,-100,-98,-100,-100,-37,86,80,96,93,100,78,78,61,22,-24,-16,-99,-64,-100,-99,-100,-63,-36,8,83,-5,97,100,99,100,39,41,16,-32,-96,-81,-63,-64,-100,-100,-46,11,9,-99,-44,99,98,100,99,100,58,3,0,-8,-72,-70,-63,-63,-100,-51,-15,-99,-99,-93,100,100,100,100,100,86,40,26,4,-50,-76,-79,-78,-84,-86,-99,-97,-96,-96,100,-98,-97,-97,-98,97,97,96,17,-34,-50,-97,-86,-99,-94,-95,-95,-96,-95,-97,-97,-97,-95,-90,-90,-87,97,40,14,-27,-73,-82,-92,-92,-93,-94,-94,-95,-96,-97,-97,-95,-88,-33,64,76,64,30,-6,-39,-69,-82,-89,-91,-93,-94,-94],"ownershipAllowedMAE":0.0282062})%"); + lines.push_back(R"%({"sample":{"board":".............../.............../...........OX../...........OX../.............../.............../.............../.............../.............../.............../............O../...........OX../...........XX../.............../.............../","hintLoc":"null","initialTurnNumber":9,"metadata":"39995538DE187FE065585B9D5BB6DECF:19","moveLocs":["M11","N10","L4","D12","L3","O5","N6","O6","D4","D3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.01,"xSize":15,"ySize":15},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":7.0,"policyOptimism":0.467,"pda":0.76,"policyMixture":[1.62e-06,2.24e-06,2.3e-06,2.44e-06,2.44e-06,2.27e-06,2.17e-06,2.1e-06,2.02e-06,1.95e-06,2e-06,2.3e-06,2.22e-06,2.12e-06,1.62e-06,2.22e-06,5.79e-06,2.2e-05,4.31e-05,7.08e-05,2.76e-05,7.12e-06,5.27e-06,4.52e-06,3.32e-06,4.14e-06,4.5e-06,1.8e-05,4.12e-06,2.24e-06,2.3e-06,2.03e-05,0.0031,0.000974,0.000421,0.000156,7.27e-05,2.26e-05,6.52e-06,4.23e-06,2.2e-06,0,0,3.83e-06,2.14e-06,2.43e-06,3.11e-05,0.000851,0,0.000429,0.000126,5.33e-05,1.67e-05,5.65e-06,3.78e-06,1.96e-06,0,0,3.56e-06,2.56e-06,2.37e-06,5.7e-05,0.000267,0.000433,0.000139,3.46e-05,1.32e-05,7.4e-06,5.53e-06,4.23e-06,2.34e-06,0,0.0464,3.95e-06,2.57e-06,2.2e-06,1.71e-05,0.00014,8.69e-05,3.41e-05,1.74e-05,1.06e-05,7.52e-06,6.18e-06,5.22e-06,4.18e-06,0.000336,0,7.62e-06,2.86e-06,2.11e-06,6.86e-06,7.6e-05,5.76e-05,2.34e-05,1.52e-05,1.04e-05,7.72e-06,6.81e-06,6.4e-06,1.24e-05,8.27e-06,2.01e-05,8.52e-06,2.07e-06,2.1e-06,5.91e-06,4.84e-05,3.85e-05,1.6e-05,1.15e-05,9.44e-06,7.89e-06,7.03e-06,7.13e-06,1.01e-05,2.66e-05,0.000467,4.38e-06,2.15e-06,2.07e-06,5.53e-06,4.24e-05,3.47e-05,1.31e-05,1.01e-05,9.23e-06,7.93e-06,7.41e-06,7.79e-06,9.19e-06,5.4e-05,0.000207,1.82e-05,2.37e-06,2.03e-06,5.96e-06,4.66e-05,4.05e-05,1.43e-05,1.36e-05,8.97e-06,7.57e-06,6.57e-06,5.09e-06,6.38e-06,3.13e-06,0,0,3.04e-06,2.09e-06,7.56e-06,6.14e-05,1.85e-05,2.25e-05,1.98e-05,1.44e-05,7.9e-06,5.14e-06,3.35e-06,2.38e-06,2.46e-06,0,0,2.65e-06,2.17e-06,8.3e-06,0.00104,0,0.00457,0.000182,5.29e-05,1.29e-05,4.85e-06,2.22e-06,0,0,0,4.98e-06,2.34e-06,2.14e-06,5.61e-06,0.53,0,0.407,0.000159,7.27e-05,1.92e-05,5.3e-06,2.25e-06,0,0,0,6.67e-06,2.03e-06,2.05e-06,4.76e-06,9e-06,2.67e-05,1.83e-05,2.01e-05,9.47e-06,5.82e-06,4.06e-06,4.87e-06,7.78e-06,1.6e-05,4.04e-06,3.04e-06,2.18e-06,1.65e-06,2.07e-06,2.34e-06,2.3e-06,2.38e-06,2.26e-06,2.13e-06,2.11e-06,2.09e-06,2.24e-06,2.55e-06,2.52e-06,2.38e-06,2.37e-06,1.91e-06,3.75e-06],"winrateAvg":0.882065,"leadAvg":3.24457,"scoreMeanAvg":4.93935,"scoreStdevAvg":10.4268,"shorttermWinlossErrorAvg":0.0742253,"shorttermScoreErrorAvg":0.764711,"ownership":[-13,-14,-13,-13,-9,-2,7,15,23,31,32,23,1,-11,-23,-14,-13,-17,-14,-11,2,8,15,23,26,46,27,-4,-30,-33,-14,-17,-20,-27,-24,-2,4,13,17,25,43,82,-47,-38,-39,-15,-17,-32,-78,-26,-13,3,9,15,20,38,81,-49,-44,-49,-13,-16,-27,-25,-14,-7,0,6,10,16,30,83,47,-66,-49,-8,-7,-9,-12,-6,-2,1,4,7,8,17,0,-67,-52,-51,-4,-3,-3,-1,-1,0,1,3,4,6,2,-1,-20,-51,-40,-1,0,2,3,3,3,2,3,5,8,8,4,8,-24,-32,2,1,7,11,9,6,4,5,8,15,17,23,3,-22,-32,4,1,14,26,16,9,6,7,12,21,19,27,64,-83,-40,7,2,13,41,24,10,8,10,17,15,37,54,64,-84,-66,11,10,20,81,38,14,8,9,15,31,82,83,-85,-81,-78,16,18,24,-54,5,12,6,4,11,39,83,-84,-84,-80,-76,19,22,29,8,12,9,7,11,12,44,21,-21,-71,-68,-72,19,22,23,16,12,10,10,13,22,27,15,-21,-45,-60,-66],"ownershipAllowedMAE":0.0466122})%"); + lines.push_back(R"%({"sample":{"board":".................../...X....XOXOOO...../...X.XO.XOXOXX.OO../..XO.XO..XXXOOOOX../....OOOXX..XXOX.X../..X...OXOX..OX.OX../.....XXOOOXO.OXX.../..XXXXOO......O.X../.XOOOXO.X....O.O.../.XO.XOXXXO...OX.OOO/.XOOOOXOX......XXX./.OO.OOOOX......XOO./OXOOXOXXX...OOOOXO./.XOXXXXOOO..OXXXXX./X.XO..OOX.OX......./..XO..OXX.OXO.O.X../..XO.OXOX.XO..OX.../.XOOO.X...X......../.XX................/","hintLoc":"null","initialTurnNumber":27,"metadata":"0B654EAC2E64A1536F6A74E99D072886:37","moveLocs":["L12","S13","T9","M6","M7","N3","N5","M2","P2","L6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0","komi":-3.5,"policyOptimism":0.629,"pda":0.0,"policyMixture":[2.8e-06,2.71e-06,2.73e-06,2.74e-06,2.8e-06,2.79e-06,2.72e-06,3e-06,2.89e-06,3.33e-06,6.03e-06,2.97e-06,2.87e-06,2.79e-06,2.75e-06,2.8e-06,2.85e-06,2.77e-06,2.75e-06,2.68e-06,2.79e-06,3.07e-06,0,2.73e-06,3.15e-06,2.88e-06,2.94e-06,0,0,0,0,0,0,2.88e-06,2.85e-06,2.92e-06,3.03e-06,3.08e-06,2.66e-06,2.82e-06,2.11e-05,0,2.83e-06,0,0,3.06e-06,0,0,0,0,0,0,2.82e-06,0,0,1.11e-05,3.04e-06,2.61e-06,2.73e-05,0,0,2.77e-06,0,0,3.7e-06,3.23e-06,0,0,0,0,0,0,0,0,7.87e-06,2.96e-06,2.63e-06,1.55e-05,9.26e-05,3.12e-06,0,0,0,0,0,3.42e-06,2.95e-06,0,0,0,0,3.21e-06,0,3.22e-06,2.77e-06,2.61e-06,9.1e-06,0,7.88e-06,2.77e-06,2.91e-06,0,0,0,0,9.46e-05,2.85e-06,0,0,6.28e-06,0,0,2.72e-06,3.06e-06,2.67e-06,1.15e-05,2.87e-06,2.82e-06,2.89e-06,0,0,0,0,0,0,0,2.85e-06,0,0,0,0,0,2.86e-06,2.78e-06,7.01e-06,0,0,0,0,0,0,3.87e-06,3.73e-06,0,3.03e-06,2.72e-06,2.97e-06,0,9.19e-06,0,3.61e-06,5.33e-06,3.03e-06,0,0,0,0,0,0,3.14e-06,0,1.74e-05,3.08e-06,2.95e-06,2.97e-06,0,3.46e-06,0,3.18e-06,3.43e-06,2.95e-06,2.83e-06,0,0,3.17e-06,0,0,0,0,0,0,2.87e-06,3.03e-06,2.98e-06,0,0,3.5e-06,0,0,0,2.94e-06,0,0,0,0,0,0,0,0,4.03e-06,3.14e-06,3.11e-06,2.89e-06,2.94e-06,3.31e-06,0,0,0,0,4.03e-06,0,0,2.54e-06,0,0,0,0,0,1.04e-05,1.57e-05,3.81e-06,2.99e-06,2.96e-06,3.3e-06,0,0,0,3.25e-06,0,0,0,0,0,0,0,0,0,0.0371,0.937,0,0,0,0,0,0,0,2.71e-06,8.37e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.81e-06,0,0.000261,0,0,4.31e-06,3.4e-06,0,0,0,3.45e-06,0,0,0,2.84e-06,2.98e-06,3.04e-06,3.28e-06,3.71e-06,3.1e-06,0.00087,0.000334,0,0,4.11e-06,5.02e-06,0,0,0,2.73e-06,0,0,0,2.87e-06,0,3.62e-06,0,3.72e-06,3.61e-06,0.000866,0.00324,0,0,2.82e-06,0,0,0,0,3.63e-06,0,0,0,3.18e-06,0,0,3.93e-06,5.67e-06,3.55e-06,0.000192,0,0,0,0,0.0144,0,0.00434,0.000152,3.03e-06,0,0,2.91e-06,3.03e-06,0,4.18e-06,0.000235,4.94e-06,3.5e-06,3.42e-06,0,0,4.89e-06,2.92e-06,3.79e-05,9.03e-05,3.05e-05,3.36e-06,2.76e-06,2.79e-06,2.91e-06,3.11e-06,3.11e-06,3.27e-06,3.04e-06,3.76e-06,3.89e-06,3.27e-06,3.86e-06],"winrateAvg":0.631449,"leadAvg":1.57128,"scoreMeanAvg":1.50561,"scoreStdevAvg":8.22607,"shorttermWinlossErrorAvg":0.471682,"shorttermScoreErrorAvg":3.01309,"ownership":[-96,-96,-97,-97,-96,-95,-95,-96,-96,-96,-17,10,94,98,98,97,95,91,80,-96,-96,-96,-98,-96,-95,-95,-95,-98,-96,-99,100,100,100,99,99,95,91,60,-96,-96,-96,-98,-96,-97,-91,-95,-99,-97,-99,100,99,99,100,100,100,31,30,-95,-96,-98,-92,-95,-97,-91,-95,-97,-99,-99,-99,100,100,100,100,-95,2,-26,-96,-96,-95,-95,-91,-91,-91,-98,-98,-71,-80,-99,-98,100,-55,-32,-95,-87,-54,-96,-97,-99,-95,-96,-95,-93,-98,98,-73,-63,-22,96,33,26,21,-95,-92,-80,-96,-96,-97,-97,-97,-99,-99,98,98,99,-63,97,93,98,-85,-92,-92,-95,-70,-94,-96,-99,-99,-99,-99,98,98,96,97,99,95,94,94,98,-50,-94,-64,-10,-79,-97,100,100,100,-99,99,95,92,97,97,97,96,100,95,98,-13,-27,41,-44,-97,100,100,100,100,92,92,92,99,97,97,97,100,92,96,98,98,98,-33,-96,100,100,100,100,92,100,93,96,97,96,97,97,96,93,92,90,99,93,100,100,100,100,100,100,100,92,96,95,97,97,98,97,92,94,94,93,95,-73,100,100,92,100,92,92,92,93,97,100,100,100,100,100,-88,93,27,34,-91,100,90,90,91,92,97,96,95,-96,-96,100,-88,-88,-88,-88,-87,-60,-97,-88,-97,96,93,94,96,96,-99,-13,-10,-96,100,41,-4,-1,-67,-84,-83,-95,-95,-97,95,94,94,96,-99,-99,-53,-10,-98,100,71,97,20,-88,-83,-82,-93,-97,-97,95,92,93,-97,-96,-99,-77,-100,-98,-99,8,97,-79,-67,-75,-78,-94,-97,95,96,95,51,-97,-97,-98,-98,-100,-100,-51,-2,97,-62,-37,-72,-67,-95,-97,-97,-34,26,-6,-50,-91,-98,-98,-95,-64,-26,36,68,57,-35,-39,-57],"ownershipAllowedMAE":0.0343234})%"); + lines.push_back(R"%({"sample":{"board":".....O.......O.OOO./.X.XO.OOOXO.O.OXXX./X.XXXOO.XO...OX...X/.XOOOXXXXO....XXXX./.OOXXXXX.XOOOOOX.X./..OOX..XXO.OXXO.X.X/.O.OX.X..OOOXO.OOX./.OOOXX.X..OXXXOO.../XOXXOOXXOOX.X.X.OX./XX.XXO.XOXXX..X.OX./.O.XO.OXOOOX.....X./...XO.OOO.XO...XX../.XX.OOXOOX....XOX../XXOOOXXXOX...XOOOX./OXXOXO.XOX...XO.OX./.OOXXXO.XXXX..OOXO./.OXO.XXX.OOXOOOXXO./.O.O..XOO.OOX....O./....O..XO........../","hintLoc":"null","initialTurnNumber":103,"metadata":"441C32D6EB99A90A1E9D898AB6E0E11A:113","moveLocs":["G1","J3","O16","N16","A4","A12","B8","J13","H13","A15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.81,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.54e-05,4.55e-05,0.000135,0.261,2.33e-05,0,2.92e-05,2.45e-05,2.4e-05,2.35e-05,2.51e-05,2.4e-05,3.98e-05,0,0,0,0,0,0.000167,3.3e-05,0,2.21e-05,0,0,0,0,0,0,0,0,2.7e-05,0,0,0,0,0,0,2.72e-05,0,0.000119,0,0,0,0,0,2.53e-05,0,0,0.00116,0.00016,0.000374,0,0,2.48e-05,2.45e-05,2.51e-05,0,0.448,0,0,0,0,0,0,0,0,0,0.000871,2.19e-05,0,0,0,0,0,0,2.48e-05,0,0,0,0,0,0,0,0,2.74e-05,0,0,0,0,0,0,0,2.52e-05,0,2.51e-05,2.27e-05,2.36e-05,0,0,0,2.28e-05,2.35e-05,0,0,0,0,0,0,0,0,0.000157,0,2.54e-05,0,2.22e-05,0,0,0,0,2.38e-05,0,0,0,0,0,0,0,0,0.00205,0,0,0,2.48e-05,0,0,0,0,0,0,1.69e-05,0,0.267,2.99e-05,0,0,0,0,0,0,2.36e-05,4.17e-05,2.5e-05,0,0,0,0,0,0,0,0,0,0,0,2.61e-05,0,2.51e-05,0,3.38e-05,0,0,2.51e-05,0,0,2.81e-05,0,0,0,0.00829,0,0,0,0,0,2.39e-05,2.44e-05,0,8.7e-05,0,0,2.45e-05,2.71e-05,0,2.52e-05,0,0,0.00296,0,0,0,0,0,0,2.48e-05,2.52e-05,2.61e-05,5.42e-05,6.66e-05,0,2.42e-05,2.79e-05,0,2.46e-05,0,0,2.53e-05,0,0,0,6.96e-05,0,0,2.55e-05,2.85e-05,2.68e-05,0,0,3.43e-05,2.71e-05,2.38e-05,0,0,0.00108,0,0,0,0,0,0,2.63e-05,2.71e-05,2.68e-05,2.72e-05,0,0,0,0.000152,4.1e-05,0,0,0,0,0,0,0,0,0,0,2.4e-05,2.37e-05,2.54e-05,0,0,0,0,0,2.82e-05,3.65e-05,0,0,0,0,0,2.58e-05,0,0,0,2.5e-05,2.36e-05,2.94e-05,0,0,0,0,0,5.02e-05,0,0,0,0,0,0,0,2.52e-05,0,0,0,0,0.00129,2.45e-05,0,0,0,0,0.000333,0.001,0,0,0,2.88e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,2.37e-05,7.91e-05,0,0.00022,0,0.000144,2.51e-05,0,0,0,2.38e-05,0,0,0,8.45e-05,0.000183,2.94e-05,3.62e-05,0,2.43e-05,2.4e-05,0.000182,0.000147,2.97e-05,0,3.55e-05,0,0,0,2.46e-05,2.49e-05,3.4e-05,2.66e-05,3.29e-05,2.51e-05,2.98e-05,3.22e-05,4.12e-05,2.26e-05,2.23e-05],"winrateAvg":0.669547,"leadAvg":0.573081,"scoreMeanAvg":0.586829,"scoreStdevAvg":1.90747,"shorttermWinlossErrorAvg":0.141167,"shorttermScoreErrorAvg":0.335839,"ownership":[-99,-99,-99,-55,22,99,99,99,100,100,100,100,99,100,99,99,99,99,0,-99,-99,-99,-99,98,98,100,100,100,99,100,99,100,99,100,-100,-100,-100,-80,-99,-99,-99,-99,-100,100,100,11,-100,100,99,99,99,100,-100,-100,-100,-100,-100,-52,-99,100,100,100,-100,-100,-100,-100,100,99,100,100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-48,-49,100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,100,55,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,100,100,100,100,-100,13,14,99,99,-100,-100,100,100,100,100,-100,-100,-100,-100,-70,100,100,-100,-100,-100,99,99,23,-21,-100,-99,100,-100,-100,100,100,-100,-100,100,100,-100,-100,-100,-100,-100,32,99,-100,-100,-99,-100,-100,-100,-100,100,-55,-100,100,-100,-100,-100,-100,-100,-100,19,99,-100,-100,-99,-99,-99,-100,100,99,100,-100,100,100,100,-100,-99,-100,-100,90,-35,-100,-100,-100,-100,-100,-100,100,100,100,100,100,90,-100,-99,-99,-99,-99,-100,-100,-100,-100,-100,-100,-100,63,100,100,-100,100,100,-100,-100,-99,-99,-99,-100,100,-100,-99,-98,-100,-100,100,100,100,-100,-100,-100,100,-100,-100,-99,-99,-100,100,100,100,-100,-36,-73,-100,-100,100,-100,-100,-100,-100,100,-100,-100,-99,-100,-100,100,100,100,-99,89,-74,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,94,16,100,100,100,100,94,1,100,99,100,61,-100,-100,-100,100,100,100,-100,100,100,100,100,100,100,99,99,100,100,100,-4,-53,-100,100,100,100,100,100,100,100,99,100,100,100,100,100,100,100,99,99,14,-100,-100,100,100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.0196413})%"); + lines.push_back(R"%({"sample":{"board":".XX....XOO..X.X.O../OOX.XXX.XOO.XX.XXO./.OOX.OXXOOXXXOXXXXO/XXOXOOOXOXX..OOOOO./OOXXXO.OOOXO....XXO/..OXOOOOXXOO.OX.XO./.OOOX.OX..OX.OX..O./...XX....XXXOO.X.../..OOO.X.X.XO.OOX.O./.XXXOOOOX.XOO.OXXX./XOOX..XX.XXXOOXOOO./.XOXOOX.O...XXXX.../XXOO.O.X.OOX...O.../..XXOOOX.OX......X./..XOOOXXXX.....O.../..XOOXXXOOO...OOX../..XOXXOO....OOXOX../..XXOO......OXXXX../.................../","hintLoc":"null","initialTurnNumber":242,"metadata":"CD81D55F2D9B5412DE524BB680D35308:252","moveLocs":["H11","F12","T10","H18","B12","C12","J18","R5","S5","H18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":4.0,"policyOptimism":0.0,"pda":1.513,"policyMixture":[0.000157,0,0,1.03e-05,7.28e-06,1.46e-05,8.61e-06,0,0,0,4e-06,3.88e-06,0,2.77e-06,0,3.89e-06,0,4.9e-06,3.65e-06,0,0,0,3.9e-06,0,0,0,0,0,0,0,3.98e-06,0,0,2.78e-06,0,0,0,0.00875,0,0,0,0,0.00278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5e-06,0.0354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0441,0.0353,0.0107,4.22e-06,0,0,0,0.0267,0.0398,0,0,0,0,0,0,0,0,0,0,0.0233,0,0,4.98e-06,0,0,0.00826,1.1e-05,0,0,0,0,0,0,0,4.09e-06,4.34e-06,0,0,0.0101,0,0,4.32e-06,1.85e-05,0,4.35e-06,4.55e-06,0,0,0,0,0,4.05e-06,4.33e-06,4.29e-06,0,0,0,0,0,3.98e-06,0,4.15e-06,4.63e-06,3.8e-06,4.28e-06,3.87e-06,0,0,0,4.11e-06,0,0,0,3.96e-06,0,0,0,0,0,0,4.15e-06,0,3.69e-06,4.36e-06,0,0,0,0,0,0,0,0,4.15e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,1.78e-05,2.44e-05,0,0,4.11e-06,0,0,0,0,0,0,0,0,0,4.17e-06,4.38e-06,0,0,0,0,0,0,4.29e-06,0,3.84e-06,4.14e-06,3.52e-06,0,0,0,0,4.46e-06,4.46e-06,3.9e-06,0,0,0,0,7.81e-06,0,4.79e-06,0,4.32e-06,0,0,0,3.54e-06,3.83e-06,4.03e-06,0,7.85e-06,4.54e-06,4.1e-06,4.18e-06,3.84e-06,0,0,0,0,0,0,4.4e-06,0,0,1.04e-05,5.14e-06,4.87e-06,4.52e-06,5.33e-06,7.82e-06,0,3.75e-06,3.85e-06,3.94e-06,0,0,0,0,0,0,0,0,0.00162,0.0525,0.0698,0.0023,5.29e-06,0,0,0,3.66e-06,3.71e-06,3.79e-06,0,0,0,0,0,0,0,0,0,0.0357,0.000211,0.186,0,0,0,3.62e-06,3.84e-06,3.68e-06,3.92e-06,0,0,0,0,0,0,0.29,1.78e-05,1.92e-05,0.000493,0,0,0,0,0,4e-06,3.74e-06,3.65e-06,3.77e-06,0,0,0,0,0.00452,0.0666,0.00448,0.0396,2.94e-05,0.000281,0,0,0,0,0,3.78e-06,3.73e-06,3.36e-06,3.63e-06,3.57e-06,3.95e-06,1.09e-05,5.06e-06,8.08e-06,7.1e-06,1.55e-05,4.27e-06,7.41e-06,5.11e-06,0.000107,4.19e-06,3.76e-06,3.54e-06,3.61e-06,3.59e-06,3.28e-06,9.22e-06],"winrateAvg":0.185846,"leadAvg":-3.70827,"scoreMeanAvg":-3.57124,"scoreStdevAvg":7.76237,"shorttermWinlossErrorAvg":0.241643,"shorttermScoreErrorAvg":2.18453,"ownership":[62,21,25,27,32,28,28,32,99,100,72,-34,-99,-99,-99,-98,-23,-28,47,98,98,26,33,28,25,21,34,37,100,100,-46,-99,-99,-99,-99,-99,68,68,98,98,98,28,72,99,20,21,100,100,-99,-99,-99,97,-99,-99,-99,-98,83,97,97,98,27,100,100,100,20,100,-99,-99,-23,-11,97,97,97,96,95,82,99,99,37,30,32,100,100,100,100,100,-99,93,53,80,18,32,-76,-74,83,94,98,100,33,100,100,100,100,-94,-95,94,94,57,100,-89,-47,-76,78,77,79,100,100,100,99,100,100,-42,-29,-48,93,-100,-18,100,-91,-61,4,78,51,62,21,100,99,99,100,25,19,-76,-100,-100,-100,100,100,9,-97,9,24,8,7,31,100,100,100,28,-100,-100,-100,-99,-100,100,100,100,100,-97,-56,37,-38,-77,-85,-84,-85,100,100,100,100,-100,-99,-100,100,100,100,100,-97,-97,-97,-97,-92,37,33,-83,60,61,-96,-96,-92,-100,-100,-100,100,100,-100,-89,-87,-86,-92,-92,-98,35,-81,99,99,-96,-92,-80,-93,-93,-96,-100,-100,-100,-100,-94,-90,-73,-98,-98,40,64,65,99,67,-96,-83,-76,-72,-98,-60,-51,-38,24,26,6,-50,-98,-98,-100,-100,99,99,99,-96,-88,-73,-87,-76,-34,-21,-19,7,-34,-97,-57,-98,-99,-100,99,99,99,-95,-96,-95,-96,69,-15,-2,3,9,34,35,-97,-86,-99,-99,-100,99,99,-96,-95,-95,91,91,92,35,37,29,33,32,-100,-97,-96,-99,-100,-100,98,-95,-96,71,72,70,76,76,71,92,90,-99,33,-100,-99,-98,-99,-99,-100,-100,59,61,58,63,81,74,79,75,92,-99,-100,-100,-100,-99,-99,-99,-99,-98,-69,-52,30,55,68,72,76,75,70,-11,-34,-88,-98,-99,-99,-99],"ownershipAllowedMAE":0.0605623})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...............XO../...O...........XO../...............XO../................XO./.................../.................../.................../.................../.................../........X........../.X................./X.X................/.XOO.............../.OXO...........X.../.OXO.............../.................../.................../","hintLoc":"null","initialTurnNumber":24,"metadata":"636BA7E0E64EFB925DD6243E31A608E2:34","moveLocs":["R18","S18","S15","T15","S13","S16","R13","P14","M16","R3"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":9.0,"policyOptimism":0.828,"pda":-0.754,"policyMixture":[2.57e-05,3.15e-05,3.05e-05,3.15e-05,3.11e-05,3.08e-05,3.08e-05,3.1e-05,3.09e-05,3.05e-05,3.04e-05,3.05e-05,3.01e-05,2.95e-05,2.84e-05,3.25e-05,2.7e-05,3.23e-05,2.36e-05,3.09e-05,4.63e-05,8.08e-05,0.000148,0.000295,0.000178,5.27e-05,4.64e-05,4.41e-05,4.1e-05,3.99e-05,3.99e-05,3.92e-05,3.48e-05,6.36e-05,4.43e-05,0,0,3.11e-05,3.05e-05,8.28e-05,0.00536,0.0027,0.0011,0.00106,0.000454,0.000239,9.94e-05,5.38e-05,4.78e-05,4.33e-05,4.42e-05,4.05e-05,2.68e-05,0,0,2.43e-05,3.06e-05,3.16e-05,0.000162,0.00136,0,0.000997,0.000641,0.000412,0.000256,0.000215,8.07e-05,4.4e-05,0,3.93e-05,4.09e-05,2.52e-05,0,0,0,2.84e-05,3.13e-05,0.000312,0.000969,0.00102,0.000699,0.000293,0.000213,0.000135,8.21e-05,8.07e-05,5.39e-05,4.44e-05,4.5e-05,4.55e-05,3.42e-05,0,0,0,0,3.13e-05,0.000172,0.0011,0.000737,0.000277,0.000163,0.00016,0.00011,7.72e-05,5.79e-05,0.000161,0.000141,0.000107,4.74e-05,0,6.51e-05,0,0,3.15e-05,3.1e-05,4.97e-05,0.00039,0.000392,0.00016,0.000112,0.000119,0.000107,0.000114,0.000114,0.0002,0.000259,9.88e-05,0.000181,5.41e-05,3.24e-05,0,0,3.91e-05,3.09e-05,4.45e-05,0.000124,0.000129,5.7e-05,5.8e-05,6.3e-05,8.35e-05,0.00012,0.000158,0.000212,0.000252,0.00023,0.000142,0.000236,4.51e-05,2.75e-05,2.95e-05,3.09e-05,3.11e-05,4.29e-05,5.28e-05,5.07e-05,4.99e-05,5.22e-05,5.37e-05,5.89e-05,8.65e-05,0.000116,0.00016,0.000236,0.000253,0.000262,0.000238,6.23e-05,4.52e-05,4.23e-05,3.11e-05,3.08e-05,3.99e-05,5.09e-05,4.89e-05,4.78e-05,4.99e-05,5.15e-05,5.28e-05,5.4e-05,5.64e-05,6.5e-05,0.000146,0.000186,0.000194,0.000191,0.00019,0.000136,4.17e-05,3.13e-05,2.98e-05,3.96e-05,4.37e-05,4.71e-05,4.64e-05,4.88e-05,4.99e-05,4.56e-05,4.01e-05,4.88e-05,5.53e-05,8.75e-05,0.00012,0.000113,9.75e-05,0.000159,0.000129,4.43e-05,3.05e-05,2.82e-05,2.99e-05,3.7e-05,4.18e-05,4.62e-05,4.99e-05,5.01e-05,3.93e-05,0,3.97e-05,5.32e-05,6.24e-05,6.67e-05,6.15e-05,7.29e-05,0.000145,0.000152,4.42e-05,3e-05,2.31e-05,0,2.64e-05,3.9e-05,6.35e-05,5.23e-05,5.12e-05,4.62e-05,3.87e-05,4.57e-05,5.19e-05,5.28e-05,5.26e-05,5.33e-05,7.98e-05,0.000199,0.000259,4.85e-05,2.94e-05,0,1.99e-05,0,0.000284,5.29e-05,5.01e-05,5.08e-05,5.17e-05,5.09e-05,5.09e-05,5.13e-05,5.18e-05,5.13e-05,5.47e-05,9.22e-05,0.000383,0.000537,0.000223,2.89e-05,2.59e-05,0,0,0,4.37e-05,4.94e-05,5.21e-05,5.29e-05,5.4e-05,5.31e-05,5.22e-05,5.35e-05,5.69e-05,6.31e-05,8.54e-05,9.43e-05,0.00113,0.000594,3.08e-05,2.89e-05,0,0,0,3.41e-05,4.96e-05,4.91e-05,5.28e-05,7.91e-05,0.000135,0.000111,0.00012,0.000138,0.000207,4.19e-05,0,0.648,0.000141,2.69e-05,2.91e-05,0,0,0,0.000151,6.01e-05,5.63e-05,4.91e-05,6.22e-05,0.000113,0.000127,0.000151,0.000169,0.000209,0.000562,0.0111,0,3.87e-05,2.61e-05,2.86e-05,4.54e-05,0.292,7.45e-05,0.000198,0.00333,4.03e-05,4.34e-05,4.31e-05,4.46e-05,4.58e-05,4.55e-05,4.45e-05,6.09e-05,0.000179,5.39e-05,3.6e-05,3.45e-05,2.75e-05,2.47e-05,2.93e-05,3.31e-05,3.32e-05,4.12e-05,3.23e-05,3.06e-05,3.04e-05,3.09e-05,3.12e-05,3.13e-05,3.09e-05,3e-05,2.91e-05,2.94e-05,2.73e-05,2.62e-05,2.79e-05,2.39e-05,1.42e-05],"winrateAvg":0.913541,"leadAvg":5.77318,"scoreMeanAvg":8.14487,"scoreStdevAvg":13.2273,"shorttermWinlossErrorAvg":0.0477157,"shorttermScoreErrorAvg":0.840953,"ownership":[17,15,13,9,2,-7,-12,-14,-17,-22,-29,-35,-39,-41,-33,-17,25,28,70,17,16,16,13,2,-13,-16,-15,-17,-22,-31,-37,-42,-38,-54,-7,-8,84,79,17,20,27,27,25,-29,-10,-12,-16,-17,-32,-44,-41,-41,-47,-78,87,84,84,17,21,33,81,24,8,-10,-10,-14,-17,-27,-79,-32,-25,-37,-78,86,85,83,14,15,31,29,15,2,-3,-5,-6,-9,-10,-15,-21,-24,-19,-79,86,79,83,7,4,12,22,10,2,-2,-3,-3,-3,-6,-12,-12,-15,18,-25,-80,79,42,0,-2,2,-2,2,-1,-2,-2,-2,-2,-3,-7,-11,-18,-16,-34,-80,-78,-16,-7,-7,-6,-5,-2,-3,-3,-4,-3,-3,-4,-6,-10,-14,-23,-22,-36,-41,-40,-15,-14,-10,-7,-5,-4,-4,-4,-5,-4,-3,-5,-7,-13,-10,-22,-28,-39,-37,-26,-21,-13,-8,-6,-4,-3,-5,-6,-4,-3,-4,-6,-10,-16,-25,-34,-35,-35,-38,-34,-20,-15,-6,-4,-4,-6,-11,-3,-4,-5,-6,-10,-15,-23,-30,-33,-32,-53,-47,-11,-14,-4,-4,-5,-12,-66,-11,-7,-6,-7,-10,-16,-22,-29,-31,-31,-64,-74,-37,-10,16,-2,-2,-4,-12,-5,-5,-6,-8,-13,-19,-25,-29,-32,-30,-70,-64,-68,-18,10,5,1,-2,-5,-4,-4,-7,-11,-18,-25,-29,-38,-30,-30,-22,-66,95,95,23,14,4,0,-3,-4,-5,-8,-15,-28,-35,-42,-38,-38,-21,30,84,81,95,42,18,9,4,-1,-2,-4,-7,-17,-35,-73,-80,-75,4,-1,60,83,82,95,45,27,11,7,1,-2,-2,-6,-6,-48,62,82,84,36,32,64,83,83,84,70,18,17,8,3,0,2,12,27,70,61,76,72,68,48,75,82,83,78,55,35,16,8,2,1,4,13,27,45,60,70,70,63,57],"ownershipAllowedMAE":0.033646,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":"..............X..../.XOOOXO.O..X.OXO.../XXXXXOO..X.X.OX.O../.XOOOXXXOX.O.O.X.X./OX.O.OOO..X.X.O.X../.XXOXXX..OX..O.OXX./..XOOXOO.OOXXX.OOX./XXO.OXO.X....O.XOO./OXXOOXO.XOO.XXX.O../OOOX.X.OOXOO.....X./.OXX.XXXXXXO....OO./.OOO.O..XXOO.XXXO.O/OXO..O....XO.OOXXO./...XXOX.O.XO.XO.XOX/.OOOX....XOOOOXO.X./.OXX.XXXXXXXXX.XX../OXX..XOOOXO...X..../.OX.XO.O.O.O......./....O.O.O........../","hintLoc":"null","initialTurnNumber":54,"metadata":"1D455BB04654D5CF003933C44FADA6FF:64","moveLocs":["N16","O19","Q15","Q17","M15","N14","M14","T5","P13","P12"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.46,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":1.853,"policyMixture":[2.54e-05,0.0746,3.43e-05,2.5e-05,2.53e-05,2.77e-05,2.61e-05,2.61e-05,3.22e-05,7.53e-05,0.000334,3.95e-05,0.00266,0,0,3.83e-05,3.06e-05,3.04e-05,2.49e-05,2.2e-05,0,0,0,0,0,0,2.55e-05,0,0.246,0.000104,0,0.00029,0,0,0,8.7e-05,5.22e-05,2.97e-05,0,0,0,0,0,0,0,3.21e-05,5.86e-05,0,0.000341,0,3.04e-05,0,0,0,0,0.000287,3.02e-05,1.9e-05,0,0,0,0,0,0,0,0,0,0.00566,0,0,0,0.0359,0,0.0594,0,3.17e-05,0,0,2.56e-05,0,3.18e-05,0,0,0,3.21e-05,0.0341,0,0,0,0.0658,0,0,0,2.73e-05,3.23e-05,0.045,0,0,0,0,0,0,0.00234,3.32e-05,0,0,0,0,0,1.5e-05,0,0,0,4.24e-05,0.00445,4.77e-05,0,0,0,0,0,0,3.21e-05,0,0,0,0,0,0,0,0,0,0.000198,0,0,0,2.78e-05,0,0,0,2.53e-05,0,2.83e-05,2.63e-05,0.00566,3.88e-05,0,0,0,0,0,0.000524,0,0,0,0,0,0,0,2.83e-05,0,0,0,2.99e-05,0,0,0,3.07e-05,0,4.03e-05,5.94e-05,0,0,0,0,2.92e-05,0,3.33e-05,0,0,0,0,0,3.94e-05,4.81e-05,0.0459,0.14,0.00226,0,0.000744,2.52e-05,0,0,0,3.25e-05,0,0,0,0,0,0,0,3.55e-05,0.00507,0.000124,0.00312,0,0,2.51e-05,2.51e-05,0,0,0,2.73e-05,0,5.25e-05,2.83e-05,0,0,0,0,3.54e-05,0,0,0,0,2.13e-05,0,0,0,0,2.72e-05,2.76e-05,0,0.00377,0.0695,3.2e-05,9.01e-05,0,0,3.2e-05,0,0,0,0,0,0.00147,2.44e-05,2.63e-05,2.85e-05,0,0,0,0,4.34e-05,0,0.00244,0,0,2.83e-05,0,0,2.45e-05,0,0,0,2.42e-05,0,0,0,0,3.32e-05,0.00109,2.97e-05,2.43e-05,0,0,0,0,0,0,0,1.86e-05,0,0,2.62e-05,0,0,0,2.56e-05,0,0,0,0,0,0,0,0,0,0.0229,0,0,2.58e-05,2.53e-05,0,0,0,2.51e-05,3.31e-05,0,0,0,0,0,0,2.89e-05,3e-05,2.78e-05,0,2.6e-05,2.57e-05,2.6e-05,2.56e-05,2.78e-05,0,0,0.000877,0,0,2.57e-05,0,2.54e-05,0,2.77e-05,0,3.5e-05,0.0947,3.2e-05,2.73e-05,2.59e-05,2.56e-05,2.58e-05,2.47e-05,2.47e-05,6.43e-05,2.7e-05,0,2.71e-05,0,2.52e-05,0,2.51e-05,2.72e-05,3.1e-05,3.38e-05,0.00056,0.0175,2.92e-05,2.57e-05,2.63e-05,2.41e-05,2.09e-05],"winrateAvg":0.299105,"leadAvg":-0.965745,"scoreMeanAvg":-1.06761,"scoreStdevAvg":6.88601,"shorttermWinlossErrorAvg":0.308793,"shorttermScoreErrorAvg":1.64738,"ownership":[-40,41,34,68,91,98,97,94,82,51,-6,-83,-94,-99,-99,-98,-98,-98,-98,-77,-97,97,97,97,97,100,96,98,72,9,-97,-13,96,-99,-98,-98,-98,-98,-97,-97,-97,-96,-96,100,100,99,18,-91,-64,-96,38,95,-99,-99,-96,-97,-98,-97,-97,99,99,99,97,98,96,97,-92,-48,95,95,95,55,-99,-97,-98,-96,-95,-96,-26,99,14,99,99,99,0,4,-80,95,-96,26,96,96,-98,-96,-90,-95,-97,-96,99,-98,-98,-98,-75,4,99,-76,95,-96,73,74,96,-98,-98,-73,-94,-95,-97,99,99,-98,98,98,96,99,99,-95,-95,-96,96,96,96,-98,-21,-94,-95,32,32,99,-98,97,95,92,96,67,46,-96,-94,-97,-98,96,96,17,99,-95,-94,99,99,-98,97,93,92,99,99,-18,-98,-98,-98,-3,95,89,72,100,100,100,-92,-36,-98,-30,94,94,-97,99,99,13,-57,-47,56,90,76,77,99,100,-94,-92,-34,-98,-98,-98,-98,-97,-97,99,21,-39,-55,3,92,92,82,99,100,100,99,64,95,65,8,-98,-98,99,99,-26,-99,-99,-99,92,70,87,99,98,100,39,33,95,-8,41,-91,-95,-95,99,20,84,85,-99,-99,71,-64,98,99,-49,-99,-99,95,-97,-96,-88,-95,-95,99,86,78,84,-35,-99,22,-99,96,99,99,99,-99,-17,-45,-92,-95,-100,98,98,98,97,2,39,-76,-99,-99,87,99,-99,-99,-97,-100,-100,-100,-100,-100,-100,-100,-100,-100,1,-100,-100,-98,-98,87,-99,-99,-72,-25,-100,99,99,99,-100,89,-71,-47,-77,-99,-93,-94,-95,-96,57,58,-98,22,-19,94,94,99,99,99,89,96,-33,-16,-81,-82,-89,-90,-93,24,-14,-17,7,73,71,98,98,99,97,94,79,64,-4,-29,-70,-77,-85,-89],"ownershipAllowedMAE":0.0376683})%"); + lines.push_back(R"%({"sample":{"board":"..OXXXXO.X.../.O.OX.XOOX.X./...OXXO.OXXXX/..OOXXOXOOOXO/..OXOXOOO.OOO/..XXOXXXXX.XX/OXOXOO.OXXX../.O.O..OOOOXO./OXOO..XOX.OXX/.XXO...XOO.OO/..XO.XXXO..../...XX.OOXO.../............./","hintLoc":"null","initialTurnNumber":83,"metadata":"57BE8BA5D1D87DAFC50E802AE3F3A459:93","moveLocs":["C6","N6","L8","C7","F2","B8","A4","F5","G1","J1"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":13,"ySize":13},"rules":"koSIMPLEscoreAREAtaxNONEsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000647,0.0359,0,0,0,0,0,0,0.0112,0,0.00063,0.000649,0.000652,0.000659,0,0.0406,0,0,0.000232,0,0,0,0,0.000507,0,0.000653,0.000645,0.000629,0.000641,0,0,0,0,0,0,0,0,0,0,0.000646,0.000632,0,0,0,0,0,0,0,0,0,0,0,0.000651,0.000642,0,0.00064,0,0,0,0,0,0.0101,0,0,0,0.000773,0,0.00063,0.000631,0,0,0,0,0,0,0,0,0,0,0,0,0.000635,0,0,0.000371,0,0,0,0,0.000358,0.00041,0.0117,0,0,0,0.000682,0.000848,0,0,0,0,0,0,0,0,0,0,0,0.00983,0,0,0,0,0,0,0.0027,0.00173,0,0,0,0,0.0207,0.0877,0.0174,0,0,0,0.000664,0,0,0.000701,0.000738,0,0,0.0117,0,0,0,0,0.00063,0.000647,0.000649,0.000638,0.00197,0.0126,0.0143,0,0,0,0,0,0,0,0.000647,0.000639,0.000637,0.000649,0.0017,0.00862,0.000582,0.000708,0.672,0,0.000726,0,0.000881,0.000653,0.000648,0.000662,0.000605],"winrateAvg":0.999742,"leadAvg":6.16366,"scoreMeanAvg":6.22716,"scoreStdevAvg":1.29697,"shorttermWinlossErrorAvg":0.00817151,"shorttermScoreErrorAvg":0.478469,"ownership":[100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,72,100,-100,-100,-100,32,78,61,100,100,100,98,99,100,100,100,100,-100,100,100,61,-100,100,100,91,100,-2,100,100,100,100,100,100,-100,-100,-100,100,59,81,-13,-100,100,100,100,100,100,-100,-100,-100,100,-26,-100,-100,-100,100,100,100,100,100,-100,-99,-100,-100,-100,-100,94,100,100,100,100,100,100,-99,-100,-100,-100,-100,-99,-99,-32,100,100,100,100,100],"ownershipAllowedMAE":0.0156679})%"); + lines.push_back(R"%({"sample":{"board":"................X../.....XXO..OOX..XXX./.O.X.XOO.X.X...OXO./..XX.X...O.X...OXO./.XXOOX.OO......OXO./.OO..X.OXX..OXXXOX./...OO.XO.....O..OX./.OOXOOXO.O...XX.OO./...XXO.XO.O......../..X..XX.X.OX......./...............OO../...X.....OO.X...X../..O.XX...X.O.X.X.../...OXO.XX.....X..../..OXOO.OOX.OOX.OOO./..OXXX.OXOO.XOO.X../..OOX.OOX.X.XXXXOO./..OX..OXX.......XO./.................../","hintLoc":"null","initialTurnNumber":147,"metadata":"EECCF0B40F4ED96E127F9ACDCF592210:157","moveLocs":["G5","E2","N12","E14","B10","B9","A10","N11","K3","K2"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.02,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":7.5,"policyOptimism":0.0,"pda":1.991,"policyMixture":[2.31e-06,4.43e-06,2.95e-06,2.94e-06,2.93e-06,3.07e-06,3.51e-06,3.57e-06,3.77e-06,3.87e-06,3.19e-06,3.4e-06,1.53e-05,4.14e-06,4.09e-06,2.51e-06,0,3.1e-06,2.51e-06,3.67e-06,4.34e-06,7.99e-06,5.1e-06,3.44e-06,0,0,0,4.15e-06,1.22e-05,0,0,0,0.000551,0.00193,0,0,0,0.000794,7.49e-06,0,3.29e-06,0,2.99e-06,0,0,0,4.63e-06,0,3.29e-05,0,0.00813,0.0201,0.00021,0,0,0,5.41e-06,6.8e-06,5.76e-06,0,0,3.09e-06,0,3.12e-06,2.88e-06,3.35e-06,0,1.93e-05,0,0.00671,0.000308,4.25e-06,0,0,0,3.37e-06,0.0114,0,0,0,0,0,2.81e-06,0,0,4.68e-06,1.47e-05,0.00172,0.129,0.00398,3.91e-06,0,0,0,4.04e-06,0.00033,0,0,5.82e-05,0,0,4.86e-06,0,0,0,6.15e-06,7.67e-06,0,0,0,0,0,0,7.58e-06,4.64e-06,2.66e-06,3.26e-06,0,0,4.8e-06,0,0,3.17e-06,3.52e-06,5.84e-06,6.05e-06,0.0269,0,0.000169,3.6e-06,0,0,6.89e-06,3.11e-06,0,0,0,0,0,0,0,2.7e-06,0,3.76e-06,1.01e-05,0,0,0,4.92e-06,0,0,2.67e-06,2.9e-06,3.35e-06,0.00483,0,0,0,0.000547,0,0,2.94e-06,0,0.0859,0,0.00778,2.73e-05,1.48e-05,4.1e-06,3.36e-06,2.98e-06,0,0,0,4.87e-06,3.54e-05,0,0,6.07e-06,0,9.99e-06,0,0,7.42e-05,0.000849,0.000628,6.15e-06,4.54e-06,6.09e-06,3.36e-06,5.2e-06,0,9.49e-05,6.31e-06,5.47e-06,4.22e-06,5.13e-06,0.012,5.35e-05,5.96e-06,5.35e-06,0.000626,1.23e-05,0.00541,2.86e-05,0,0,1.88e-05,4.38e-06,4.49e-06,5.32e-05,2.35e-05,0,3.5e-06,4.87e-06,4.05e-05,0.0996,0.000546,0,0,1.32e-05,0,1.49e-05,0.000846,2.1e-05,0,7.82e-06,3.96e-06,3.72e-06,5.76e-06,0,6.42e-06,0,0,0.0393,7.15e-05,8.94e-06,0,2.77e-05,0,5.19e-05,0,3.79e-06,0,7.63e-06,1.3e-05,3.74e-06,3.09e-06,4.21e-06,3.49e-06,0,0,0,7.46e-06,0,0,1.41e-05,0.000226,4.26e-06,5.48e-06,4.69e-06,0,6.09e-06,4.53e-06,4.29e-06,3.51e-06,2.91e-06,3.13e-06,0,0,0,0,0,0,0,0,0.0635,0,0,0,0.00691,0,0,0,3.15e-06,2.74e-06,2.72e-06,0,0,0,0,6.25e-06,0,0,0,0,4.12e-06,0,0,0,2.93e-05,0,4.26e-06,2.77e-06,2.67e-06,3.34e-06,0,0,0,5.26e-06,0,0,0,0,0,0.000274,0,0,0,0,0,0,2.64e-06,3.11e-06,3.47e-06,0,0,0,0.00328,0,0,0,0,0.382,1.11e-05,3.03e-06,3.03e-06,4.44e-06,0.000634,0,0,2.68e-06,2.37e-06,3.64e-06,0.0346,0.0106,0.000146,0.0244,1.81e-05,3.09e-05,3.55e-06,3e-06,3.46e-06,2.52e-06,2.68e-06,2.85e-06,3.25e-06,4e-06,5.04e-06,3.83e-06,2.44e-06,5.77e-06],"winrateAvg":0.914274,"leadAvg":4.95323,"scoreMeanAvg":6.00242,"scoreStdevAvg":11.3322,"shorttermWinlossErrorAvg":0.127081,"shorttermScoreErrorAvg":1.98972,"ownership":[-82,-85,-88,-92,-94,-88,-7,29,61,24,8,-20,-34,-64,-80,-88,-92,-88,-80,-76,-82,-87,-94,-95,-98,-98,97,51,4,17,17,-83,-62,-79,-93,-92,-93,-74,-69,-69,-90,-98,-86,-98,97,97,32,-44,-36,-91,-74,-71,-83,-73,-92,78,-67,-71,-78,-98,-98,-39,-98,-28,74,63,88,-8,-90,-22,-79,-82,-75,-93,80,-28,44,-98,-98,-22,-21,-98,16,99,99,40,11,-13,34,-19,-85,-75,-94,81,64,72,93,93,-25,-98,-98,-13,99,1,5,31,24,71,-92,-92,-92,94,82,86,90,92,88,89,89,-33,-95,99,52,55,42,43,57,57,-59,-6,95,84,91,91,94,94,-87,88,87,-94,99,88,99,72,47,69,-89,-89,-15,95,95,88,90,84,23,-86,-87,87,-7,-78,89,60,98,59,-70,-53,-28,-1,46,78,78,90,92,-79,-72,-85,-96,-95,-51,-60,22,98,-64,-45,-42,-13,18,54,73,51,2,-75,-68,-82,-85,-78,-46,-8,13,41,55,-13,-43,-22,9,85,85,26,26,-2,5,-39,-95,-87,-74,-53,8,7,95,95,3,-80,-39,4,3,-69,-30,-9,19,35,95,-30,-95,-96,-66,-41,-34,-85,44,91,-4,-80,-57,-77,-34,-13,-6,39,42,92,94,-95,91,-63,-87,-87,-79,9,62,15,-52,-80,-2,27,30,34,64,75,97,44,90,90,91,91,89,-80,36,87,87,-59,60,90,91,91,70,80,89,97,43,43,46,67,90,-94,81,81,4,-98,76,77,-28,-24,28,84,88,93,97,97,44,63,90,90,-95,81,-97,-93,-97,-97,-97,-96,89,90,85,92,92,97,47,44,76,91,-95,-95,-94,-92,-95,-95,-91,-84,-5,-2,89,80,92,94,92,86,61,69,31,1,-62,-88,-94,-95,-92,-88,-67,-28,37,48,71],"ownershipAllowedMAE":0.0644775})%"); + lines.push_back(R"%({"sample":{"board":"......XXX.O...OOX../.....XOOOO.O.O.X.X./....OXXXOO.O.OOOX../XXXXX.X.XXOO...XXX./OOXOX.X.X.XXOOO.OOX/O.O.OO.X..OOX.XO.X./.OOO...XOOOX.XOXXX./.X..OOOOXX.OXOOX..X/.XXXOXXXO.XXXO.OXX./.X..XOX.OOOOO.OOX.X/..X.XOXOOXXX.X..OOO/..X.XOXXXOOX.XOOXX./.X..XOX.XO.OOOOOOXO/XXXXOOOXXO....XXOOX/.OXOOOX..XOOX...XXX/.OO.OX.X..OX.X.X.OX/....OX....OOXX.XOOX/....OOX.X.OX..OOOX./....OXX............/","hintLoc":"null","initialTurnNumber":246,"metadata":"BAA7A94D2DA8335CA89C31C7D42434D7:256","moveLocs":["Q15","M1","O1","P1","O2","O6","O5","T2","T1","R1"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.67,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1button1","komi":6.5,"policyOptimism":0.602,"pda":0.0,"policyMixture":[7.22e-05,7.04e-05,7.02e-05,7.08e-05,7.14e-05,8.77e-05,0,0,0,4.55e-05,0,6.84e-05,6.74e-05,8.9e-05,0,0,0,7.3e-05,7.39e-05,7.09e-05,7.35e-05,7.4e-05,7.28e-05,6.88e-05,0,0,0,0,0,6.89e-05,0,6.56e-05,0,7.46e-05,0,0.00011,0,6.99e-05,6.88e-05,6.98e-05,6.86e-05,7.16e-05,0,0,0,0,0,0,7.15e-05,0,6.81e-05,0,0,0,0,7.21e-05,7.04e-05,0,0,0,0,0,7.38e-05,0,6.98e-05,0,0,0,0,7.03e-05,8.03e-05,0.000102,0,0,0,7e-05,0,0,0,0,0,9.41e-05,0,7.29e-05,0,0.204,0,0,0,0,0,0,0,0,0,0,0,0,0.000335,0,0,9.28e-05,0,0.000684,0.00109,0,0,0,0.000142,0,0,0.205,0,6.98e-05,8.42e-05,0,0,0,7.24e-05,0.000104,0.0141,0,0,0,0,0,0.00137,0,0,0,0,0,7.07e-05,0.013,0,7.8e-05,0.000224,0,0,0,0,0,0,0.00865,0,0,0,0,0,6.95e-05,7.41e-05,0,0.000115,0,0,0,0,0,0,0,0,0.000183,0,0,0,0,0,0,0,0,7.45e-05,7.13e-05,0,7.24e-05,7.07e-05,0,0,0,0.00297,0,0,0,0,0,0.00712,0,0,0,9.44e-05,0,7.05e-05,7.18e-05,0,7.16e-05,0,0,0,0,0,0,0,0,0.00012,0,0.000119,0.000263,0,0,0,7.12e-05,7.14e-05,0,7.08e-05,0,0,0,0,0,0,0,0,7.27e-05,0,0,0,0,0,0.00359,6.99e-05,0,7.2e-05,7.14e-05,0,0,0,4.21e-05,0,0,0.00109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.012,8.49e-05,0.000184,0,0,0,0,0,0,0.019,0,0,0,0,0,0,8.22e-05,9.23e-05,0,0,0,0,0,0.0078,0.0038,0,0,0,0.00378,0,0,0.00046,0,0,8.1e-05,0,0.000143,0.187,0,0,4.88e-05,0,6.11e-05,0,0.0355,0,0,0.000376,0.00177,0.00583,0.00133,0,0,9.15e-05,0.000115,0.000384,7.89e-05,0,0,0,0,0.0318,0,0,0,0,0.000631,0.00304,0.0148,0.000588,0,0,0,8.51e-05,0,0.000486,0,0,0.00271,0,0,0,0,0,0.0126,9.9e-05,0.000611,0.000458,0.000317,0,0,0,7.64e-05,0.000104,0.00116,8.6e-05,0,0.18,0,0,0,0,3.55e-05,0,6.06e-05],"winrateAvg":0.904815,"leadAvg":1.67207,"scoreMeanAvg":2.34136,"scoreStdevAvg":4.60256,"shorttermWinlossErrorAvg":0.188457,"shorttermScoreErrorAvg":1.37681,"ownership":[-99,-99,-99,-99,-99,-97,-97,-95,-94,77,100,100,100,99,99,99,-99,-98,-99,-99,-99,-99,-99,-99,-100,100,100,100,100,100,100,99,100,85,-95,-96,-100,-99,-100,-99,-99,-99,-99,-100,-100,-100,100,100,100,100,97,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-55,-100,-99,-100,-100,100,100,88,42,-50,-100,-100,-100,-100,97,97,-100,20,-100,11,-100,-98,-100,-29,-30,-18,100,100,100,-100,-98,-99,-100,97,97,100,17,99,99,-30,-99,-23,17,98,99,95,98,-8,-5,-97,-100,-100,90,99,100,100,98,88,-49,-99,99,99,99,97,98,96,100,-100,-100,-100,-100,-74,-100,-21,46,100,100,100,100,97,97,97,98,96,100,100,-100,-100,-100,-100,-97,-100,-100,-100,100,-100,-100,-100,99,98,96,96,96,100,99,100,-100,-100,-74,-100,-100,-100,-100,-100,99,-100,-11,99,99,99,99,99,98,100,100,-100,9,-76,-100,-100,-100,-100,-100,99,-100,99,99,97,98,98,99,98,99,99,100,100,100,-100,-100,-100,-100,-100,98,-100,-100,-100,99,99,98,99,98,100,100,99,98,97,-100,-100,-100,-100,-100,98,-100,-99,-100,99,99,100,100,100,100,100,100,98,98,-100,-100,-100,-100,98,98,99,-100,-100,99,97,98,80,100,-85,-86,100,100,-96,-64,97,-100,98,98,98,-98,-97,-51,-54,100,100,-93,-94,-81,-88,-97,-96,-96,91,98,98,97,98,-97,-98,-99,-40,-31,100,35,38,-96,-92,-97,-92,-82,-96,95,96,96,96,98,-97,-97,-97,-26,19,100,100,-95,-96,-94,-96,-82,-82,-97,95,96,95,96,98,98,-98,-93,-96,27,100,78,79,-96,-84,-83,-82,-96,-97,95,95,95,96,98,-98,-97,-82,-49,-7,83,98,36,-96,-85,-84,-83,-90,-97],"ownershipAllowedMAE":0.0206008})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../...XO........X...../..XO...........O.../.................../.................../.................../.................../..X.X............../.................../.................../...O.............../......O............/.................X./.X.............O.../..XXX..........OX../.XOO..O........OX../.O...O............./.................../","hintLoc":"null","initialTurnNumber":26,"metadata":"08EE59E9C84C53BC111BE7643DE24D69:36","moveLocs":["E16","D15","F17","E18","C17","F18","E15","E14","D14","C15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.77,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":7.5,"policyOptimism":0.0,"pda":-1.424,"policyMixture":[2.3e-05,2.57e-05,2.69e-05,2.56e-05,2.58e-05,2.6e-05,2.68e-05,2.48e-05,2.28e-05,2.28e-05,2.31e-05,2.31e-05,2.28e-05,2.32e-05,2.28e-05,2.34e-05,2.34e-05,2.33e-05,2.16e-05,2.4e-05,2.71e-05,2.61e-05,5.32e-05,0,0,0.000418,0.000313,3.92e-05,2.66e-05,2.61e-05,2.59e-05,2.61e-05,2.63e-05,3.14e-05,4.39e-05,2.64e-05,2.74e-05,2.34e-05,2.47e-05,2.56e-05,0,0,0,0,0.0964,0.001,0.000149,3.67e-05,3.17e-05,2.76e-05,2.62e-05,0,2.54e-05,9.68e-05,0.000136,2.69e-05,2.34e-05,2.66e-05,4.23e-05,0,0,0,0.00211,0.00756,0.000532,4.75e-05,2.74e-05,2.76e-05,2.74e-05,2.68e-05,2.78e-05,4.97e-05,0,9.49e-05,2.74e-05,2.3e-05,2.98e-05,0.0681,0,0,0,0.00505,0.00373,8.18e-05,2.7e-05,2.77e-05,2.76e-05,2.74e-05,2.75e-05,4.2e-05,0.000117,0.0001,4.52e-05,2.74e-05,2.24e-05,2.71e-05,0.000105,0.332,0,0,0.445,0.000108,2.71e-05,2.78e-05,2.78e-05,2.79e-05,2.79e-05,2.81e-05,2.69e-05,2.66e-05,0.000103,0.000149,2.77e-05,2.23e-05,2.49e-05,3.15e-05,6.1e-05,6.16e-05,0.0257,6.59e-05,2.9e-05,2.73e-05,2.77e-05,2.8e-05,2.8e-05,2.82e-05,2.83e-05,2.77e-05,2.69e-05,3.36e-05,5e-05,2.73e-05,2.26e-05,2.46e-05,2.66e-05,2.57e-05,2.58e-05,2.56e-05,2.71e-05,2.76e-05,2.76e-05,2.77e-05,2.79e-05,2.81e-05,2.81e-05,2.82e-05,2.81e-05,2.76e-05,2.72e-05,2.77e-05,2.75e-05,2.3e-05,2.43e-05,2.59e-05,0,2.48e-05,0,2.61e-05,2.78e-05,2.78e-05,2.79e-05,2.82e-05,2.85e-05,2.83e-05,2.84e-05,2.82e-05,2.78e-05,2.75e-05,2.8e-05,2.77e-05,2.31e-05,2.34e-05,2.69e-05,2.53e-05,2.57e-05,2.56e-05,2.74e-05,2.79e-05,2.8e-05,2.83e-05,2.86e-05,2.87e-05,2.87e-05,2.86e-05,2.82e-05,2.78e-05,2.76e-05,2.82e-05,2.79e-05,2.34e-05,2.37e-05,2.69e-05,2.73e-05,2.64e-05,3.27e-05,4.36e-05,3.29e-05,2.79e-05,2.86e-05,2.85e-05,2.86e-05,2.86e-05,2.86e-05,2.84e-05,2.79e-05,2.72e-05,2.78e-05,2.68e-05,2.32e-05,2.4e-05,2.79e-05,2.63e-05,0,5.19e-05,0.000111,5.42e-05,3.09e-05,3.02e-05,2.94e-05,2.88e-05,2.84e-05,2.83e-05,2.84e-05,2.76e-05,2.71e-05,2.75e-05,2.71e-05,2.25e-05,2.46e-05,2.78e-05,2.73e-05,2.68e-05,0.000103,7.82e-05,0,4.95e-05,3.85e-05,3.3e-05,3.32e-05,3.17e-05,2.94e-05,2.82e-05,2.75e-05,4.99e-05,0.00011,2.77e-05,2.24e-05,2.43e-05,2.57e-05,2.68e-05,2.67e-05,2.69e-05,3.32e-05,7.37e-05,0.000113,4.42e-05,4.09e-05,4.41e-05,4.18e-05,3.15e-05,2.81e-05,2.77e-05,3.15e-05,3.35e-05,0,2.24e-05,2.2e-05,0,2.15e-05,2.28e-05,2.38e-05,2.92e-05,0.000111,9.64e-05,7.29e-05,4e-05,4.57e-05,4.81e-05,3.28e-05,2.83e-05,2.49e-05,0,2.52e-05,2.49e-05,2.26e-05,2.32e-05,2.17e-05,0,0,0,3.81e-05,0.000141,0.000105,7.33e-05,3.81e-05,6.48e-05,8.54e-05,3.24e-05,2.77e-05,2.35e-05,0,0,2.35e-05,2.37e-05,2.26e-05,0,0,0,0.00022,0.000106,0,2.76e-05,5.33e-05,4.13e-05,3.87e-05,5.63e-05,9.52e-05,6.03e-05,2.48e-05,0,0,2.19e-05,2.32e-05,7.28e-05,0,3.17e-05,3.12e-05,0.000181,0,2.89e-05,2.68e-05,2.77e-05,2.78e-05,2.72e-05,2.74e-05,2.89e-05,2.99e-05,6.05e-05,0.000124,7.17e-05,2.48e-05,2.29e-05,2.14e-05,2.53e-05,2.51e-05,2.5e-05,2.4e-05,2.41e-05,2.33e-05,2.33e-05,2.32e-05,2.32e-05,2.28e-05,2.28e-05,2.33e-05,2.35e-05,2.35e-05,2.35e-05,2.44e-05,2.33e-05,2.16e-05,1.44e-05],"winrateAvg":0.933905,"leadAvg":7.62239,"scoreMeanAvg":10.2742,"scoreStdevAvg":15.0141,"shorttermWinlossErrorAvg":0.0841598,"shorttermScoreErrorAvg":2.33114,"ownership":[-14,-3,10,29,44,51,46,38,26,12,1,-6,-10,-7,0,5,4,4,5,-28,-17,-13,21,63,62,44,36,21,9,0,-6,-12,-12,12,5,5,2,4,-41,-49,-68,-71,63,-15,26,28,17,7,-2,-1,-8,-44,34,36,5,6,4,-54,-59,-69,-48,-91,-13,-7,8,8,3,1,0,-4,9,25,79,19,6,5,-58,-52,-46,-48,-92,-54,-27,-3,2,2,2,4,5,13,17,33,20,7,5,-58,-53,-75,-81,-40,-71,-24,-7,0,2,4,5,7,12,18,25,6,1,3,-56,-58,-58,-54,-47,-35,-16,-5,0,3,5,5,6,7,10,7,7,1,2,-53,-56,-56,-47,-44,-24,-9,-3,2,4,5,6,6,7,8,7,5,1,1,-45,-52,-82,-39,-79,-15,-5,1,3,5,6,6,7,7,7,6,4,1,-1,-33,-36,-19,-7,-14,-1,3,6,6,7,7,7,7,8,8,7,3,-1,-3,-23,-21,-13,0,-6,4,11,12,9,8,8,8,8,9,11,10,5,-3,-8,-22,-20,-3,40,8,8,19,17,14,11,10,10,10,12,15,9,3,-12,-16,-27,-21,-14,-6,-5,18,74,28,18,13,12,12,13,16,19,20,7,-31,-29,-38,-32,-11,-14,-2,6,19,15,15,14,14,15,17,21,25,40,10,-67,-43,-38,-65,-41,-28,-17,6,13,17,14,16,16,18,21,25,39,87,2,-53,-55,-27,-18,-68,-68,-69,-14,8,30,22,21,18,20,24,29,45,87,-74,-64,-59,13,-18,82,83,2,9,89,45,27,23,22,23,22,33,49,86,-73,-59,-59,11,61,61,78,73,90,71,55,37,29,26,26,30,30,49,16,-30,-56,-55,41,48,64,70,75,74,67,52,39,28,24,25,28,32,29,11,-20,-34,-47],"ownershipAllowedMAE":0.0390131})%"); + lines.push_back(R"%({"sample":{"board":"......O............/.XXXXXXOXO........./.O.OOXXXOOXX......./...O.OOO..OO..X.XX./...O....O......XO../....X..X........O../..O............XXX./..XX..........XOXO./....X...........OX./...OX.........O.OO./...OX............../...O.............../....O............../...OX.......X..XX../.OO.......X.....O../.OXX......XOO..O.../OXX..X...XOX.O...../.OX......XOO......./.................../","hintLoc":"null","initialTurnNumber":87,"metadata":"155682BA904FF3AE230DB7C209500387:97","moveLocs":["O8","R8","M9","O7","P8","N8","N9","M8","L9","L8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.85,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.18e-06,2.74e-06,2.61e-06,2.13e-06,2.75e-06,2.9e-06,0,0.000123,0.0589,2.88e-06,2.65e-06,2.84e-06,3.33e-06,3.16e-06,2.88e-06,2.49e-06,2.3e-06,2.35e-06,1.97e-06,1.8e-05,0,0,0,0,0,0,0,0,0,3.23e-06,3.95e-06,6.11e-06,7.98e-06,6.05e-06,3.82e-06,3.2e-06,2.85e-06,2.45e-06,3.13e-06,0,3.85e-06,0,0,0,0,0,0,0,0,0,0.000103,0.0425,4.88e-06,3.81e-06,3.03e-06,2.78e-06,2.38e-06,3.09e-06,3.99e-06,3.15e-06,0,2.36e-06,0,0,0,2.06e-06,2.24e-06,0,0,1.44e-05,8.59e-06,0,2.91e-06,0,0,2.46e-06,2.98e-06,4.93e-06,3.19e-06,0,3.35e-06,3.46e-06,3.05e-06,2.9e-06,0,2.72e-06,2.89e-06,3.32e-06,5.95e-06,6.18e-06,4.27e-06,0,0,2.55e-06,2.54e-06,3.08e-06,6.85e-06,4.39e-06,5.76e-06,0,1.26e-05,2.27e-05,0,6.35e-06,4.25e-06,4.85e-06,6.06e-06,6.93e-06,6.38e-06,1.16e-05,5.68e-06,0,2.92e-06,2.71e-06,3.65e-06,2.72e-05,0,0.000211,6.69e-06,4.84e-05,9.32e-05,1.75e-05,2.69e-05,2e-05,8.14e-06,9.33e-06,1.07e-05,8.41e-06,4.09e-06,0,0,0,2.77e-06,3.41e-06,3.74e-05,0,0,4.97e-06,0.000136,0.000206,0.000364,0.000139,5.71e-05,1.73e-05,1.79e-05,2.4e-05,4.48e-05,0,0,0,0,3.52e-06,3.57e-06,0.000199,6.01e-06,4.59e-06,0,5.65e-06,0.00111,0.0052,0.000307,6.93e-05,2.35e-05,1.08e-05,1.18e-05,6.8e-06,7.04e-06,5.93e-06,0,0,6.27e-06,3.66e-06,7.3e-06,4.14e-06,0,0,4.92e-06,0.0794,0.24,0.114,0.000113,5.13e-06,3.14e-06,3.28e-06,3.49e-06,0,2.9e-06,0,0,2.5e-06,3.05e-06,4.83e-06,3.11e-06,0,0,1.09e-05,0.000749,0.00175,0.0317,0.119,0,0,0,2.91e-06,2.46e-06,4.23e-06,4.55e-06,3.62e-06,3.32e-06,2.58e-06,3.31e-06,2.58e-06,0,5.09e-06,0.0142,0.00182,0.000192,0.000229,0.0583,0,0,0,0,0,9.11e-06,0,6.22e-06,3.32e-06,2.57e-06,3.07e-06,2.97e-06,2.83e-06,0,8.4e-05,0.0018,0.000176,5.23e-05,8.03e-06,4.48e-06,8.58e-06,1.29e-05,0,0.000194,1.44e-05,4.74e-06,8.42e-06,3.2e-06,2.45e-06,2.57e-06,2.44e-06,0,0,0.213,7.65e-05,6.37e-05,2.69e-05,8.1e-06,1.35e-05,6.15e-05,0,5.88e-06,1.01e-05,0,0,7.81e-05,3.12e-06,2.01e-06,0,0,6.51e-06,0.000219,7.82e-06,3.27e-05,1.93e-05,2.13e-05,1.12e-05,0,6.92e-05,4.9e-06,0.0105,1.41e-05,4.3e-06,0,3.26e-05,4.26e-06,2.93e-06,0,0,0,1.03e-05,4.43e-05,5.32e-05,3.69e-05,0.000793,0.000228,0,0,0,2.57e-06,3.17e-06,0,3.48e-06,5.84e-06,3e-06,0,0,0,2.71e-06,9.3e-06,0,3.54e-05,1.67e-05,1.24e-05,0,0,0,2.46e-06,0,2.92e-06,3.02e-06,3.28e-06,3.38e-06,2.4e-06,3.89e-06,0,0,4.36e-06,3.57e-06,5.07e-06,5.47e-06,7.2e-06,2.6e-05,0,0,0,2.45e-06,2.71e-06,2.71e-06,2.88e-06,2.93e-06,3.03e-06,2.37e-06,2.45e-06,2.84e-06,5.05e-06,3.15e-06,2.88e-06,2.41e-06,2.69e-06,3.67e-06,4.2e-06,2.63e-05,3.52e-06,2.56e-06,2.4e-06,2.42e-06,2.39e-06,2.31e-06,2.18e-06,2.46e-06,2e-06,3.72e-06],"winrateAvg":0.857403,"leadAvg":2.85784,"scoreMeanAvg":4.62705,"scoreStdevAvg":12.1895,"shorttermWinlossErrorAvg":0.0912022,"shorttermScoreErrorAvg":0.991247,"ownership":[-84,-88,-93,-92,-90,-57,45,42,82,82,72,45,19,-13,-37,-55,-67,-75,-82,-74,-94,-93,-92,-93,-93,-93,66,64,99,51,23,-2,-21,-43,-64,-75,-82,-87,-42,62,1,97,97,-93,-93,-93,99,99,-11,-13,-14,1,-62,-72,-81,-88,-92,5,-1,42,97,88,99,99,99,95,82,94,93,35,-31,-96,-85,-99,-99,-94,20,42,53,97,-25,23,37,33,97,41,34,25,9,-11,-44,-96,-81,-91,-94,16,23,17,15,-59,1,8,-46,15,20,13,7,-3,-12,-29,-82,-81,-90,-92,-5,9,48,-16,-32,-14,-13,-8,8,7,7,1,-5,-20,-52,-98,-98,-98,-74,-27,-33,-84,-83,-50,-16,-13,-3,6,8,5,1,-6,-8,-89,-32,-98,0,-33,-28,-30,-29,-12,-82,-28,-14,-1,5,8,11,4,9,4,25,-29,84,0,35,-5,14,6,96,-81,-24,5,22,11,23,18,27,32,42,86,51,84,84,52,28,33,50,97,-81,-11,-2,4,-2,-26,84,85,86,71,52,19,16,26,34,56,74,77,97,21,18,12,6,2,-12,-89,-89,-90,82,83,21,-70,-8,-7,76,79,85,87,94,28,6,5,-3,-19,-40,-49,-84,-89,-24,-15,-49,-40,-21,84,86,86,91,-36,41,7,-2,-10,-25,-52,-36,-91,-37,-47,-87,-86,-16,-10,88,93,93,-24,-22,-1,-4,-10,-18,-33,-88,8,3,34,-3,-13,89,53,26,82,93,-94,-93,-39,-26,-20,-20,-23,-55,-87,97,97,56,28,93,74,70,50,85,-93,-93,-86,-77,-93,-55,-45,-45,-86,94,93,96,98,83,70,63,57,55,71,70,-94,-86,-86,-85,-77,-67,-62,-86,94,94,86,91,78,71,64,58,56,12,-77,-83,-88,-85,-82,-76,-67,-60,-6,49,76,84,85,80,70,65,61,60],"ownershipAllowedMAE":0.037423,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":"..O.X..O...O.X...X./..OX.XXO..O.OOXXX.X/..OOXX....OOXXXOOXX/..O.OXOOO.OOOOOOOOO/OOOO.OXX.OOXXOOXXO./OXXOO.OXXXO.XXX.XOX/OOXXXOOOX.XX..O.XOX/XXX.O.OX...XX.OXXX./...XX..XXX..XXXO.X./.XOOX.X..OXXXOOOOOO/..XXOOOXX.OOXOXXXO./.XXO.O.OXOXXOOXX.O./XXOO.O.OXXXXO.OXO.O/OOO.O..OXOXO.OXX.OX/.XXXO.OXXOO.OOX.XXX/XX.XXOOOO..O.OXXX.X/..XOXXO.....OX...../XXOO.XO...OOXXXXX.X/....OO....OXX..X.X./","hintLoc":"null","initialTurnNumber":298,"metadata":"93B85DC364046EC89A8697E74DD0C050:308","moveLocs":["O7","B1","A1","D1","P7","C1","T12","F10","F11","G11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.17,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0button1","komi":-7.0,"policyOptimism":0.465,"pda":-2.175,"policyMixture":[0.000339,0.000322,0,0.0159,0,0.000372,0.0211,0,0.000363,0.000344,0.000529,0,0.00038,0,0.0141,0.00035,0.000364,0,0.000332,0.000325,0.000327,0,0,0.000312,0,0,0,0.014,0.00035,0,0,0,0,0,0,0,0.000353,0,0.000326,0.000322,0,0,0,0,0.000396,0.0173,0.00318,0.00033,0,0,0,0,0,0,0,0,0,0.000324,0.000323,0,0,0,0,0,0,0,0.000345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00327,0,0,0,0,0,0,0,0,0,0.00261,0,0,0,0,0,0,0,0,0,0,0,0.0036,0,0,0,0.0039,0,0,0,0,0,0,0,0,0,0,0,0,0.000381,0,0,0.000377,0.000405,0,0.000433,0,0,0,0,0,0,0.00426,0,0.333,0,0,0.000382,0.000353,0.000348,0,0,0.000398,0,0,0,0,0,0.000342,0.000384,0.000468,0,0,0,0,0,0,0,0.000379,0.000344,0,0,0,0,0.00278,0,0.00297,0.00034,0,0,0,0,0,0,0.274,0.0125,0,0,0,0,0,0,0,0,0,0,0.000347,0.000394,0,0,0,0,0,0,0,0.000576,0,0,0,0,0,0,0,0,0.000326,0.000352,0,0,0,0.000363,0,0.000327,0,0,0,0,0,0,0,0,0,0.00317,0,0.00473,0,0,0,0,0.000362,0,0.000345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0026,0,0.000327,0.000337,0,0,0,0,0,0,0,0,0,0.128,0,0,0.00351,0,0,0,0,0.00033,0,0,0,0,0,0,0,0,0,0.000342,0,0,0,0,0,1.12e-05,0,0,0,0,0,0,0.000333,0.000318,0,0,0,0,0,0,0.000344,0,0.000405,0.000401,0,0,0,0,0,0.000315,0.000323,0.000312,0.0143,0.0161,0,0,0.000362,0.000369,0.000362,0.000348,0.000374,0,0,0,0,0.0539,0,0,0.000313,0.000328,0.000316,0,0,0,0,0,0,0,0.000368,0,0,0,0,0,0,0,0.0145,0.00328,0.000332,0.000323,0,0,0,0.000343,0.000337,0,0.000365,0,0.00038,0.00055],"winrateAvg":0.000337275,"leadAvg":-7.85569,"scoreMeanAvg":-7.6362,"scoreStdevAvg":0.96272,"shorttermWinlossErrorAvg":0.00981504,"shorttermScoreErrorAvg":0.513433,"ownership":[100,100,100,100,100,100,100,100,100,100,100,100,96,-99,-99,-100,-100,-100,-100,100,100,100,100,100,99,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,99,99,100,100,100,100,100,100,-100,-100,-100,100,100,-100,-100,100,100,100,100,100,99,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,28,100,100,-100,-100,100,100,-100,-100,100,51,100,-100,-100,100,100,99,99,-100,-100,-100,100,-59,-100,-100,-100,-100,-100,100,-100,100,100,-100,-100,-100,99,99,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-96,-17,-13,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,99,-100,-100,-100,-100,-100,-100,-100,-100,100,15,-100,-9,-100,-100,-100,-100,-100,100,2,-8,-98,-98,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,100,100,-100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,100,100,-100,-100,11,100,100,-100,-100,100,100,100,100,100,100,-100,-100,-100,-100,100,-100,-100,-100,100,99,100,100,100,100,58,100,100,100,100,-100,100,-100,100,100,100,-100,-100,-77,99,-100,-53,-100,-100,-100,100,100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-24,-100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100],"ownershipAllowedMAE":0.0174789})%"); + lines.push_back(R"%({"sample":{"board":".................../...............XO../..XO....XO.X..XOO../..X.O...XO....XXO../..OO.....O...XXOX../............OXOO.../..X........OXO.O.../.................../..OO.............../...X.............../.................../.................../.....X..........X../.................../...............O.../..XX.............../..OX...........X.../.................../.................../","hintLoc":"null","initialTurnNumber":44,"metadata":"21E7C46812FE70D818CFC5665AD2F872:54","moveLocs":["N12","M14","E11","E10","E12","P18","D9","O12","K18","L18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":-6.0,"policyOptimism":0.138,"pda":0.0,"policyMixture":[9.31e-07,1.6e-06,2.34e-06,3.05e-06,2.8e-06,1.99e-06,1.61e-06,1.96e-06,6.01e-05,0.000174,5.75e-05,1.78e-06,1.56e-06,2.26e-06,1.15e-05,1.03e-05,1.73e-06,1.17e-06,9.47e-07,1.41e-06,7.39e-06,0.00067,0.00504,0.000105,0.000494,2.67e-06,0.627,0.00669,0,0,6.32e-05,1.85e-06,0.136,0,0,0,1.41e-06,1.11e-06,1.84e-06,3.67e-06,0,0,7.06e-05,0.00612,6.77e-06,1.9e-06,0,0,5.89e-06,0,2.06e-06,2.83e-06,0,0,0,1.42e-06,1.11e-06,3.69e-06,0.000135,0,0.142,0,3.84e-05,7.94e-06,1.85e-06,0,0,1.44e-06,1.84e-06,8.82e-06,1.11e-06,0,0,0,1.89e-06,1.1e-06,3.04e-06,0.011,0,0,4.27e-05,0.000204,1.51e-05,3.77e-06,6.76e-05,0,4.23e-06,2.56e-06,2.01e-06,0,0,0,0,2.38e-06,1.24e-06,2.27e-06,3.8e-05,2.96e-06,3.65e-06,0.000723,3.85e-05,2.09e-05,3.58e-05,9.95e-06,9.18e-06,1.78e-05,0,0,0,0,0,4.25e-06,2.96e-06,1.21e-06,2.48e-06,0.00581,0,1.06e-05,1.12e-05,9.57e-06,1.91e-05,3.1e-05,1.4e-05,1.42e-05,6.46e-06,0,0,0,2.73e-06,0,1.15e-05,3.53e-06,1.28e-06,1.44e-06,1.85e-05,7.17e-06,3.97e-05,0,2.18e-06,2.52e-05,2.6e-05,2.57e-05,2.55e-05,4.1e-05,0.000103,0,0,1.4e-05,0.000247,6.25e-05,3.74e-06,1.27e-06,1.4e-06,8.07e-06,0,0,0,2.43e-06,1.24e-05,2.06e-05,2.77e-05,2.62e-05,3.46e-05,3.13e-05,0.000146,0.0532,3.36e-05,2.04e-05,4.37e-05,4.2e-06,1.27e-06,1.31e-06,5.81e-06,4.41e-06,0,0,3.46e-05,8.04e-06,1.34e-05,2.15e-05,2.18e-05,2.24e-05,1.25e-05,5.31e-05,1.74e-05,3.33e-05,3.94e-05,5.63e-05,4.61e-06,1.28e-06,1.19e-06,3.23e-06,1.98e-06,0,3.81e-06,3.04e-06,3.97e-06,6.95e-06,1.58e-05,2.25e-05,1.99e-05,1.53e-05,1.95e-05,1.95e-05,1.54e-05,3.41e-05,4e-05,4.27e-06,1.29e-06,1.04e-06,2.32e-06,2.61e-06,2.18e-06,2.7e-06,2.4e-06,3.27e-06,5.98e-06,1.69e-05,2.74e-05,2.72e-05,2.46e-05,2.59e-05,2.79e-05,2.62e-05,2.06e-05,3.69e-06,3.67e-06,1.24e-06,9.65e-07,1.93e-06,2.05e-06,2.23e-06,1.9e-06,0,2.84e-06,6.05e-06,2.29e-05,3.33e-05,3.55e-05,3.31e-05,3.07e-05,3.05e-05,5.19e-05,5.27e-06,0,3.14e-06,1.4e-06,9.62e-07,1.67e-06,1.74e-06,1.8e-06,1.93e-06,2.21e-06,3.04e-06,5.16e-06,1.79e-05,3.61e-05,4.38e-05,4.09e-05,3.46e-05,1.42e-05,6.48e-05,1.61e-05,3.26e-06,5.45e-06,1.37e-06,8.98e-07,1.56e-06,1.27e-06,1.28e-06,1.76e-06,2.34e-06,3.13e-06,4.61e-06,1.61e-05,3.8e-05,5.25e-05,4.96e-05,3.47e-05,2.51e-05,1.49e-05,0,3.56e-05,7.39e-06,1.39e-06,9.85e-07,1.43e-06,0,0,1.38e-06,2.24e-06,3.21e-06,5.7e-06,3.24e-05,8.45e-05,0.000101,7.18e-05,5.3e-05,6.04e-05,1.2e-05,8.9e-06,1.27e-05,3.77e-06,1.33e-06,8.99e-07,1.3e-06,0,0,1.47e-06,2.42e-06,3.56e-06,5.46e-06,2.13e-05,6.44e-05,0.000105,8.3e-05,8.32e-05,6.39e-05,4.3e-06,0,4.15e-06,3.49e-06,1.25e-06,9.22e-07,1.33e-06,1.35e-06,1.54e-06,1.93e-06,2.28e-06,2.85e-06,3.56e-06,4.36e-06,5.98e-06,9.36e-06,9.12e-06,7.16e-06,4.92e-06,5.17e-06,3.02e-06,3.08e-06,2.24e-06,1.2e-06,7.88e-07,9.08e-07,9e-07,1.01e-06,9.87e-07,1.04e-06,1.11e-06,1.19e-06,1.28e-06,1.39e-06,1.44e-06,1.42e-06,1.36e-06,1.3e-06,1.27e-06,1.29e-06,1.12e-06,1.14e-06,8.39e-07,3.92e-06],"winrateAvg":0.0648142,"leadAvg":-7.40399,"scoreMeanAvg":-10.2489,"scoreStdevAvg":14.3825,"shorttermWinlossErrorAvg":0.0704062,"shorttermScoreErrorAvg":1.48769,"ownership":[-8,-5,-3,7,6,-5,-20,-23,-16,25,32,53,56,65,76,90,91,91,90,-8,-13,-2,13,19,-5,-14,-44,-21,-22,85,54,59,52,88,87,97,91,90,-7,-14,-26,47,34,2,-2,-22,-47,92,80,48,59,57,52,97,97,92,88,-2,-4,-25,-8,64,15,-1,-13,-50,91,71,65,62,57,50,51,97,85,83,13,8,61,62,-1,-2,0,-5,1,91,67,71,72,50,51,96,69,77,73,13,25,15,9,-10,-1,-5,-6,12,29,48,91,91,52,97,96,76,67,60,0,-16,-53,-4,-15,-7,-8,-7,6,16,29,90,-17,94,87,96,57,52,44,-12,-20,-29,-48,-82,-25,-18,-8,-1,7,14,14,-17,92,39,44,35,33,28,-20,-20,-3,-6,-82,-32,-22,-11,-6,-1,4,0,14,-10,40,30,20,16,13,-30,-38,-44,-86,-19,-32,-19,-12,-8,-4,-4,-4,-2,1,16,10,1,2,-1,-40,-42,-58,-87,-45,-31,-18,-12,-9,-7,-6,-5,-4,-3,3,-2,-6,-10,-11,-45,-52,-52,-54,-34,-30,-21,-14,-11,-9,-8,-6,-5,-3,-3,-9,-16,-22,-19,-51,-55,-55,-51,-43,-77,-20,-17,-14,-11,-9,-8,-6,-3,-5,-4,-61,-28,-21,-58,-58,-56,-51,-45,-35,-27,-19,-16,-14,-12,-9,-7,-3,-5,-5,-9,-15,-14,-65,-70,-66,-57,-43,-36,-29,-23,-20,-17,-16,-13,-10,-5,1,42,-5,-7,-8,-70,-74,-98,-98,-53,-38,-32,-26,-22,-22,-22,-17,-14,-14,-10,-7,-7,-9,-8,-70,-74,-68,-98,-58,-38,-34,-29,-23,-18,-24,-24,-27,-22,-19,-68,-7,-14,-13,-70,-65,-73,-71,-61,-45,-39,-30,-24,-22,-23,-25,-27,-30,-37,-41,-37,-23,-18,-69,-69,-67,-64,-57,-45,-34,-27,-22,-19,-20,-22,-25,-28,-33,-36,-31,-27,-24],"ownershipAllowedMAE":0.0436319})%"); + lines.push_back(R"%({"sample":{"board":"............../............../...OX........./..X.X..XX.O.../.......O....../..........O.../............../............../............../..X..X......../............../.....XX......./..O..O..X...../.X....O.XO.O../.......OXO..../..XXXX.XOXO.../.OOOO..XOX..../......O.O...../............../","hintLoc":"null","initialTurnNumber":41,"metadata":"B6D231CB6863D39280E0BE838A1C9CAF:51","moveLocs":["B7","G5","H6","F6","E6","F5","B4","K7","K2","M7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.69,"xSize":14,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":10.0,"policyOptimism":0.537,"pda":0.0,"policyMixture":[4.57e-06,5.88e-06,5.46e-06,6.22e-06,5.62e-06,6.38e-06,6e-06,6.34e-06,6.52e-06,6.99e-06,7.09e-06,6.41e-06,6.14e-06,4.5e-06,6.27e-06,8.53e-06,1.1e-05,8.71e-06,0.000103,1.12e-05,0.000585,2.02e-05,2.76e-05,0.000452,0.00178,1.77e-05,9.04e-06,5.98e-06,6.34e-06,1.46e-05,0.000676,0,0,1.26e-05,3.6e-05,9.31e-06,1.24e-05,0.285,0.000141,0.00022,1.16e-05,6.17e-06,6.95e-06,0.000686,0,0.00251,0,8.47e-06,9.3e-05,0,0,9.05e-06,0,2.21e-05,1.41e-05,6.65e-06,7.33e-06,8.87e-05,5.38e-05,7.7e-06,9.45e-06,2.67e-05,1.67e-05,0,0.0643,1.79e-05,9.09e-06,4.42e-05,1.32e-05,7.19e-06,6.29e-06,3.73e-05,0.000417,0.000124,2.62e-05,1.51e-05,1.77e-05,1.14e-05,0.000254,4.8e-05,0,2.06e-05,2.06e-05,6.85e-06,6.38e-06,1.43e-05,0.000242,3.73e-05,2.56e-05,2.31e-05,3.31e-05,0.0013,0.00882,0.000234,2.13e-05,0.000839,2.52e-05,6.74e-06,6.4e-06,0.000133,0.00399,0.00147,3.49e-05,1.94e-05,4.49e-05,7.87e-05,0.000182,0.000287,0.065,0.0635,2.16e-05,6.4e-06,7.28e-06,0.000214,0.116,0.000298,7.21e-05,0.000227,1.35e-05,1.86e-05,2.75e-05,7.68e-05,0.00148,0.00719,1.81e-05,6.11e-06,8.45e-06,0.00082,0,0.00418,0.000336,0,1.26e-05,9.76e-06,1.21e-05,1.65e-05,4.47e-05,0.000104,1.48e-05,5.92e-06,7.79e-06,5.24e-05,6.9e-05,3.29e-05,1.56e-05,8.23e-06,7.39e-06,6.92e-06,8.42e-06,9.86e-06,1.6e-05,3.43e-05,1.31e-05,5.84e-06,6.76e-06,7.23e-06,6.62e-06,1.51e-05,0.00668,0,0,8.68e-06,7.82e-06,7.66e-06,9.14e-06,4.59e-05,1.27e-05,5.85e-06,7.24e-06,0,0,0.105,0.00351,0,1.73e-05,8.94e-06,0,0,0.00355,0,0.187,5.8e-06,8.47e-06,0,0.0379,0.000218,0,0,0,0,0,0,0.000521,0,0.000323,6.56e-06,7.37e-06,2.45e-05,0.0177,6.72e-06,5.55e-06,0,0,0,0,0,7.86e-06,7.32e-06,1.04e-05,5.85e-06,6.09e-06,0,0,0,0,0,6.95e-06,0,0,0,0,6.56e-06,6.75e-06,5.46e-06,5.03e-06,0,0,0,0,6.41e-06,7.81e-06,0,0,0,7.12e-06,6.03e-06,6.03e-06,5.32e-06,4.87e-06,4.93e-06,4.93e-06,5.13e-06,5.29e-06,5.46e-06,0,6.82e-06,0,0,5.65e-06,5.74e-06,5.69e-06,5.24e-06,4.72e-06,5.02e-06,4.99e-06,5.17e-06,5.39e-06,5.28e-06,5.41e-06,5.49e-06,5.31e-06,4.91e-06,5.16e-06,5.1e-06,5.14e-06,4.56e-06,6.86e-06],"winrateAvg":0.495594,"leadAvg":-0.215015,"scoreMeanAvg":-0.135193,"scoreStdevAvg":9.23904,"shorttermWinlossErrorAvg":0.150733,"shorttermScoreErrorAvg":0.866522,"ownership":[-46,-45,-46,-45,-50,-49,-40,-23,-4,13,21,22,22,23,-47,-45,-43,-48,-49,-66,-37,-30,-13,17,24,24,22,23,-48,-50,-44,-34,-95,-60,-52,-44,-10,46,43,32,26,22,-53,-59,-89,-50,-95,-53,-46,-86,-85,0,86,55,21,22,-53,-62,-58,-66,-47,-35,-34,10,-24,-9,46,43,23,23,-49,-50,-46,-41,-37,-31,-25,-22,-13,1,85,47,22,21,-43,-45,-41,-36,-33,-29,-23,-19,-10,17,33,30,20,16,-40,-40,-37,-31,-29,-27,-21,-13,-4,9,23,19,9,8,-36,-45,-22,-33,-31,-28,-23,-15,-8,-2,3,2,-1,-2,-27,-45,-84,-32,-34,-88,-33,-25,-17,-13,-9,-9,-11,-12,-13,-29,-30,-30,-29,-50,-50,-35,-28,-23,-19,-20,-20,-20,20,4,1,-9,-17,-99,-99,-56,-47,-43,-37,-45,-27,-23,43,63,62,29,0,-4,-92,-92,-98,-97,-24,-79,-13,-21,48,-2,4,0,38,-96,-88,-87,-98,78,1,51,-16,-7,63,47,0,-26,-43,-95,-95,-85,-98,82,51,24,16,7,81,99,-94,-94,-95,-95,-60,-91,97,78,90,53,36,24,97,99,99,99,99,-21,33,-90,97,84,85,68,49,39,98,98,98,97,94,83,92,-22,97,96,82,71,57,50,97,97,97,95,90,83,79,77,83,86,82,73,66,59],"ownershipAllowedMAE":0.0348945})%"); + lines.push_back(R"%({"sample":{"board":"..O................/.OXXX.......OXXO.O./..OX..X........OXO./.OOO..X.XX.XXX.OXX./.XXOOOOOO...OO.OX.X/...OX.....X...XOOX./..X.O........X..OX./.O.XXX.X........OX./...OX........O..OO./.O.OX.X........O.../...X........O.XOXO./.......X....OX.XOX./.........OO....XO../.OOO....XXXOOX..XX./OXX.......OX.X..XOO/...O.O..OOOXX...XO./O.X.O.O.XXXOOXXXO.O/XX.XXO...OO..OOXOO./...............XXXO/","hintLoc":"null","initialTurnNumber":147,"metadata":"13E17FFB490962F4F84CABF0F210BF4E:157","moveLocs":["B13","C14","C9","K9","K10","C11","C10","C12","B11","L10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.54,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0button1","komi":6.5,"policyOptimism":0.0,"pda":2.968,"policyMixture":[3.02e-06,1.31e-05,0,3.59e-05,1.42e-05,6.54e-06,5.47e-06,4.36e-06,4.14e-06,3.68e-06,3.8e-06,3.66e-06,5.58e-06,6.75e-05,0.000126,6.18e-05,3.92e-06,3.55e-06,2.75e-06,2.97e-06,0,0,0,0,0.000661,3.72e-05,2.99e-05,6.38e-05,1.48e-05,1.51e-05,7.14e-06,0,0,0,0,4.48e-06,0,5.66e-06,4e-06,2.91e-06,0,0,5.29e-05,0.00244,0,1.05e-05,2.21e-05,1.41e-05,4.97e-05,5.76e-06,5e-06,0.0172,9.39e-06,0,0,0,0.0192,5.03e-06,0,0,0,5.24e-06,7e-06,0,0.00104,0,0,8.83e-05,0,0,0,0.00475,0,0,0,5.55e-06,5.54e-06,0,0,0,0,0,0,0,0,8.66e-05,0.000169,5.78e-05,0,0,2.95e-05,0,0,0,0,4.27e-06,4.36e-06,0,0,0,4.82e-06,3.92e-06,3.82e-06,4.95e-06,2.76e-05,0,5.24e-05,8.48e-06,6.52e-06,0,0,0,0,1.56e-05,3.91e-06,0,0,4.1e-06,0,7.14e-06,5.71e-06,8.31e-06,2.6e-05,2.73e-05,8.29e-05,0.00128,0.000437,0,9.26e-06,3.6e-06,0,0,2.18e-05,3.17e-06,0,0,0,0,0,4.64e-06,0,3.93e-05,3.49e-05,4.54e-05,0.00339,0.00128,8.32e-06,4.53e-06,3.49e-06,0,0,0.000504,3.03e-06,0,0,0,0,2.99e-06,4.37e-06,6.54e-06,6.42e-05,0.0178,0.0631,0.00495,7.01e-05,0,4.43e-06,3.35e-06,0,0,3.93e-06,2.89e-06,0,0,0,0,3.94e-06,0,5.55e-06,0.000219,0,0,0.000162,9.77e-06,1.08e-05,1.88e-05,0,0.0579,3.59e-06,3.62e-06,2.93e-06,3.12e-06,0,0,9.88e-06,9.2e-06,7.59e-06,1.98e-05,0.0549,0,0.433,5.66e-06,0,5.12e-05,0,0,0,0,4.06e-06,2.98e-06,3.27e-06,3.8e-06,7.69e-06,8.74e-06,2.61e-05,1.39e-05,0,0.000268,2.76e-05,5.78e-06,5e-06,0,0,6.16e-06,0,0,0,3.95e-06,2.84e-06,3.05e-06,3.59e-06,4.28e-06,6.2e-06,1.03e-05,1.12e-05,1.12e-05,0.281,0,0,4.87e-06,7.75e-06,0.000151,6.9e-06,0,0,3.5e-06,3.49e-06,3.8e-06,0,0,0,4.11e-06,5.63e-06,9.97e-06,8.44e-06,0,0,0,0,0,0,3.94e-06,3.07e-06,0,0,3.66e-06,0,0,0,3.8e-06,3.47e-06,4.05e-06,5.17e-06,6.41e-06,3.07e-06,2.5e-06,0,0,9.42e-05,0,3.49e-06,3.2e-06,0,0,0,0.000121,5.89e-06,5.31e-06,0,3.17e-06,0,3.79e-06,4.59e-06,0,0,0,0,0,8.46e-05,6.69e-06,3.42e-06,0,0,2.34e-06,0,3.53e-06,0,8.8e-06,0,2.91e-06,0,6.79e-06,0,0,0,0,0,0,0,0,0,2.46e-06,0,0,0,4.22e-06,0,0,0,3.1e-06,3.88e-06,6.25e-06,0,0,4.28e-06,4.3e-06,0,0,0,0,0,0.0286,3.03e-06,0.000196,0.00218,1.67e-05,0.000763,4.42e-06,3.28e-06,3.11e-06,3.27e-06,3.04e-06,2.87e-06,3.16e-06,3.89e-06,3.59e-06,2.91e-06,0,0,0,0,5.76e-06],"winrateAvg":0.86123,"leadAvg":2.4919,"scoreMeanAvg":3.29631,"scoreStdevAvg":7.95742,"shorttermWinlossErrorAvg":0.164732,"shorttermScoreErrorAvg":1.38274,"ownership":[90,82,80,-32,-63,-80,-90,-93,-94,-93,-91,-87,-81,-75,-32,63,86,87,84,91,96,-95,-95,-95,-83,-94,-95,-94,-94,-92,-92,-80,-89,-87,99,-56,89,78,94,96,98,-95,-32,-46,-98,-95,-95,-95,-94,-93,-93,-70,-20,99,-97,89,74,68,98,98,98,55,7,-97,62,-99,-99,-67,-99,-99,-99,62,99,-97,-97,-96,-12,-98,-98,98,98,98,98,98,97,20,-28,-41,32,35,28,99,-97,-97,-97,-36,-44,-98,98,14,47,29,29,29,-9,-91,-44,-17,-11,-34,99,100,-97,-97,14,99,-98,-15,50,-54,-13,-4,15,0,-22,-26,-9,-50,28,62,99,-97,-96,82,99,-99,-98,-98,-98,-56,-89,-19,-7,-8,0,5,23,27,64,99,-97,1,96,100,-98,99,-98,-85,-72,-47,-23,-21,13,17,33,93,55,77,99,99,21,98,100,100,100,-98,-72,-96,-51,-25,17,-45,13,37,41,1,98,77,66,62,98,98,100,-35,-36,-47,-60,-52,-26,-70,16,15,95,29,-81,97,23,71,17,97,97,36,17,-13,-16,-39,-89,-24,-8,-10,58,95,-88,-79,-97,21,-52,-5,96,92,48,26,5,2,-20,-58,37,78,81,69,35,-12,-79,-97,-10,-46,-45,96,100,100,100,30,15,-2,12,-12,-8,-10,88,89,-98,-91,-94,-99,-98,-17,96,-96,-95,-14,28,35,16,39,22,55,97,-94,23,-98,-95,-95,-99,45,44,88,-53,-44,96,70,100,70,46,98,98,98,-94,-95,-94,-96,-97,-99,42,42,88,-86,-97,10,98,97,100,97,95,95,95,98,98,-99,-99,-99,31,33,39,-97,-97,-97,-97,-96,98,95,97,97,99,98,91,83,85,77,-99,33,32,32,-97,-97,-96,-95,-2,13,89,94,96,92,71,48,12,-35,-81,-99,-99,-98,36],"ownershipAllowedMAE":0.0430972})%"); + lines.push_back(R"%({"sample":{"board":"O.......O........../.OX..XOO.O........./.OXXX.XXO.OO.OO..../OOOOOXX.X.OX.OX..O./.OXXXX.X..OXO.O.O../OOX..O.OO..X.O...../.XX.......X.XXX.XX./.X...O.OOXXO...XXOO/.OOO.XXOX.XXOO..OO./.OXXX....X..XO.O.../.O..OOX.O..OX.OXOO./.OXX.XOO.OO...OXXXX/..OOX..XO.OXX.XOOX./..OXXX.XO.XOOX.O.OX/..XO....O.XX...OOXX/..XOXXOO..O...X.X.X/.X.XOOOX..XX.....X./.X.XO...X........../..X................/","hintLoc":"null","initialTurnNumber":184,"metadata":"6A47122515A6511EF3080D08DEC87579:194","moveLocs":["M10","N8","O8","T9","R6","M8","O9","O7","N7","E11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":23.5,"policyOptimism":0.0,"pda":1.856,"policyMixture":[0,2.73e-05,1.02e-05,8.44e-06,8.55e-06,8.86e-06,7.18e-06,6.9e-06,0,6.85e-06,6.81e-06,6.42e-06,6.32e-06,6.14e-06,6.27e-06,6.25e-06,6.4e-06,6.85e-06,6.34e-06,5.47e-05,0,0,7.64e-06,8.07e-06,0,0,0,0,0,6.5e-06,6.39e-06,6.39e-06,6.5e-06,6.42e-06,6.68e-06,6.52e-06,6.7e-06,6.85e-06,6.94e-06,0,0,0,0,7.38e-06,0,0,0,4.89e-05,0,0,7.18e-06,0,0,6.59e-06,6.89e-06,6.97e-06,6.79e-06,0,0,0,0,0,0,0,5.44e-06,0,7.69e-06,0,0,6.62e-06,0,0,7.49e-06,7.38e-06,0,7.28e-06,0,0,0,0,0,0,9.02e-06,0,0.0307,3.34e-05,0,0,0,0,0,7.69e-06,0,1.53e-05,1.52e-05,0,0,0,6.32e-06,0.00605,0,0.0127,0,0,0.0003,7.69e-06,0,6.73e-06,0,6.72e-06,6.83e-06,1.13e-05,1.5e-05,1.76e-05,7.07e-06,0,0,0.00472,0.0011,0.00027,2.05e-05,1.15e-05,1.67e-05,7.04e-06,0,6.58e-06,0,0,0,6.87e-06,0,0,9.82e-06,7.28e-06,0,8.16e-06,6.26e-05,0.00787,0,0.00238,0,0,0,0,0,7.18e-06,6.69e-06,6.81e-06,0,0,0,0,8.04e-06,0,0,0,0,0,0,0,0,7.62e-06,0,0,0,0,7.5e-06,0.00889,0,0,7.01e-06,7.44e-06,0,0,0,0,0.394,0.0848,0.289,0.000165,0,7e-06,0,0,0,0.00119,0,6.45e-06,7.71e-06,3.75e-05,7e-06,0,8.35e-06,0.00858,0,0,0,1.4e-05,0,8.34e-06,6.63e-06,0,0,0,0,0,0,0,0,8.68e-06,0,0,0,0.0534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.77e-05,0.000142,0,0,0,1.48e-05,1.28e-05,0,0,5.82e-06,0,6.52e-06,0,9.95e-06,0,0,0,0,7.44e-06,0.00154,0.00178,0,0,0,0,7.79e-06,0,0,8.5e-06,0,0,0,0,7.08e-06,0,0,7.34e-06,0,7.56e-05,0.0884,0,0,7.1e-06,6.76e-06,7.16e-06,9.56e-06,0,6.8e-06,0,0,0.000239,7.55e-06,7.05e-06,0,0,0,0,8.65e-06,8.03e-06,0,0,0,0,0,0,1.21e-05,7.73e-06,0,7.71e-06,8.32e-06,6.96e-06,0,6.93e-06,0,6.75e-06,0,7.17e-06,0,7.02e-06,0,0,0,0,0,8.75e-06,6.81e-06,0,0,7.02e-06,6.74e-06,6.8e-06,6.57e-06,6.43e-06,0,6.82e-06,6.93e-06,0,6.86e-06,0,0,5.71e-06,9.1e-06,7.27e-06,0,6.78e-06,7.23e-06,6.96e-06,6.87e-06,6.65e-06,6.67e-06,6.49e-06,6.49e-06,6.73e-06,6.94e-06,7.14e-06,7.17e-06,0,7e-06,6.87e-06,7.16e-06,6.61e-06,7.01e-06,6.59e-06,6.7e-06,6.91e-06,6.88e-06,6.61e-06,6.76e-06,6.68e-06,6.67e-06,6.7e-06,6.96e-06,6.41e-06,1.18e-05],"winrateAvg":0.283678,"leadAvg":-1.67193,"scoreMeanAvg":-2.69961,"scoreStdevAvg":13.3941,"shorttermWinlossErrorAvg":0.381066,"shorttermScoreErrorAvg":4.13112,"ownership":[96,43,-6,-52,-68,-8,25,87,99,99,99,99,98,98,98,98,97,96,95,97,98,-82,-75,-76,-81,98,98,97,99,99,99,99,99,99,98,97,96,94,98,98,-83,-81,-80,-80,-82,-83,97,66,100,100,37,100,100,98,97,95,91,98,98,98,98,96,-81,-82,-71,-73,-1,100,-99,-23,100,96,97,94,98,75,98,98,-84,-83,-82,-81,-42,-79,-24,31,100,-99,89,86,99,45,96,-10,49,98,98,-83,-42,-3,78,47,90,91,-17,-9,-99,-44,95,1,-14,-23,-61,24,-8,-84,-83,5,18,40,43,64,14,-46,-100,-84,-98,-98,-98,-75,-98,-99,40,-22,-84,-5,20,39,80,9,88,88,-100,-100,11,18,-29,-53,-98,-98,91,91,14,91,91,91,90,-86,-86,86,-47,-52,-100,-100,53,51,18,-18,92,92,89,82,91,-91,-91,-92,-85,-56,-41,30,-89,-64,-100,-100,51,30,80,83,88,87,86,92,37,-79,-54,-51,-62,54,77,16,23,83,-100,-100,22,-98,89,88,88,77,92,-91,-93,-84,-91,74,75,76,80,83,84,84,-99,-2,-98,-98,-98,-98,57,55,56,57,-99,-55,-2,-84,78,56,82,73,-75,-78,-98,-86,-86,-98,-97,21,10,55,-100,-100,-99,-58,-85,79,11,-85,71,71,-96,-89,-85,-93,-93,-99,-33,-27,-99,-97,-97,-37,-8,45,81,10,-85,-85,52,15,-87,-84,-85,-99,-99,-75,-81,-99,-97,-98,-97,79,78,16,-3,7,-64,-42,-15,-96,-90,-98,-98,-99,-92,-100,-99,-100,80,80,79,-87,-37,-30,-98,-98,-79,-83,-88,-92,-95,-99,-98,-98,-100,-99,-100,80,58,8,-27,-93,-86,-93,-92,-89,-88,-90,-92,-94,-97,-98,-99,-99,-100,-54,17,42,20,-17,-46,-79,-87,-89,-88,-88,-89,-92,-94,-96,-97],"ownershipAllowedMAE":0.043291})%"); + lines.push_back(R"%({"sample":{"board":"...X.............../..X.X............../.X.XO.OX..X..OXX.../.XXOO.OOX..O.OOX.X./OXOO...........OX../.OXX.OXXX.X.XXOOX../..OXOX..OO.XOOXOOO./.OOOOOX.XO...XXXXO./..X..OX.XO..X..OXO./.....XO.O.O.....XO./.....XO..O........./....X.XO.OX......O./.......OO....X...../.XXX.X..X...X.X..../.OOOOX......X.X..../...OXXXXX....XOXXX./.OOXOOOXOO..XXOOOX./OXXXXO.O...OXOO..OO/.................../","hintLoc":"null","initialTurnNumber":98,"metadata":"9EE2E235AF472FD380E0868526DBFD38:108","moveLocs":["F1","G1","G2","B4","A6","A7","A5","J2","K2","A3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.25,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxALLsui1","komi":2.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.55e-06,4.77e-06,4.51e-06,0,4.32e-06,5.44e-06,6.79e-06,7.26e-06,6.24e-06,5.28e-06,5.35e-06,5.09e-06,5.8e-06,5.96e-06,5e-06,6.38e-06,5.17e-06,5.2e-06,4.08e-06,4.45e-06,5.91e-06,0,0,0,8.67e-06,4.94e-05,0.00255,4.88e-05,2.04e-05,7.35e-06,1.61e-05,4.06e-05,5.08e-05,0.000365,6.07e-05,7.07e-05,1.28e-05,5.08e-06,5.25e-06,0,0,0,0,4.73e-06,0,0,0.00195,1.99e-05,0,4.75e-05,4.89e-06,0,0,0,9.88e-05,2.07e-05,4.82e-06,4.49e-06,0,0,0,0,4.53e-06,0,0,0,0.000185,0.0063,0,5.02e-06,0,0,0,5.43e-06,0,4.83e-06,0,0,0,0,4.44e-06,4.55e-06,4.78e-06,8.92e-06,0.000282,0.000339,0.000209,3.48e-05,5.13e-06,5.42e-06,4.22e-06,0,0,5.21e-06,4.95e-06,4.78e-06,0,0,0,4.52e-06,0,0,0,0,0.0212,0,9.99e-06,0,0,0,0,0,1.3e-05,4.81e-06,4.44e-06,4.5e-06,0,0,0,0,1.81e-05,4.77e-06,0,0,1.74e-05,0,0,0,0,0,0,0,4.82e-06,4.79e-06,0,0,0,0,0,0,5.65e-06,0,0,4.48e-06,0.000214,1.82e-05,0,0,0,0,0,4.64e-06,4.51e-06,5.06e-06,0,5.04e-06,4.59e-06,0,0,4.57e-06,0,0,4.8e-06,6.43e-06,0,4.49e-06,4.44e-06,0,0,0,4.48e-06,4.91e-06,5.05e-06,4.66e-06,4.88e-06,4.55e-06,0,0,5.61e-06,0,4.14e-06,0,4.91e-06,4.92e-06,4.72e-06,4.77e-06,4.8e-06,0,0,4.52e-06,4.76e-06,7.47e-06,5.97e-06,4.83e-06,4.25e-06,0,0,4.15e-06,4.84e-06,0,4.96e-06,5.21e-06,5e-06,5.04e-06,5.22e-06,4.66e-06,1.27e-05,5.1e-06,4.62e-06,6.95e-06,7.12e-06,1.35e-05,4.65e-06,0,4.62e-06,0,0,4.23e-06,0,0,4.62e-06,4.79e-06,4.91e-06,5.01e-06,5.02e-06,4.66e-06,0,4.37e-06,0,0.00244,4.54e-06,1.07e-05,3.29e-05,1.26e-05,5.08e-06,0,0,5.04e-06,6.28e-06,4.73e-06,4.22e-06,0,4.38e-06,4.82e-06,4.72e-06,4.73e-06,4.48e-06,0,0,0,0,0.000702,0,4.3e-06,4.57e-06,0,4.76e-06,4.63e-06,4.68e-06,0,4.24e-06,0,4.21e-06,5.36e-06,4.92e-06,4.62e-06,0,0,0,0,0,0,4.01e-06,4.34e-06,4.59e-06,4.32e-06,4.61e-06,4.28e-06,0,4.25e-06,0,4.63e-06,4.27e-06,4.51e-06,4.59e-06,0.962,0,2.05e-05,0,0,0,0,0,0,4.47e-06,4.55e-06,4.24e-06,4.13e-06,0,0,0,0,0,4.61e-06,0,0,0,0,0,0,0,0,0,0,4.23e-06,4.31e-06,0,0,0,0,0,0,4.71e-06,0,0,0,0,0,0,0,0,0,0,4.24e-06,0,0,0,0,4.61e-06,4.33e-06,0,0,5.46e-06,6.19e-06,4.2e-06,3.32e-06,6.59e-06,0,0,4.6e-06,5.51e-06,4.2e-06,4.32e-06,4.61e-06,5.04e-06,4.66e-06,4.45e-06,4.64e-06,4.38e-06,4.24e-06,4.21e-06,8.61e-06],"winrateAvg":0.702021,"leadAvg":2.50298,"scoreMeanAvg":2.07026,"scoreStdevAvg":8.42816,"shorttermWinlossErrorAvg":0.399252,"shorttermScoreErrorAvg":2.97519,"ownership":[-98,-98,-98,-98,-62,-10,13,1,-15,-25,-18,12,44,38,-7,-45,-67,-75,-77,-98,-98,-99,-98,-97,0,38,-5,-20,-36,-37,-1,50,53,-33,-74,-74,-77,-78,-96,-99,-99,-98,99,38,98,-35,-13,-42,-80,-16,55,97,-87,-87,-80,-78,-76,-79,-99,-99,99,99,79,98,98,-76,-32,-17,77,50,97,97,-87,-75,-86,-47,84,-99,99,99,89,53,18,1,-54,-63,-24,11,-6,-34,92,99,-71,-2,-2,84,96,95,97,98,98,-88,-89,-89,-10,-92,-61,-96,-96,99,99,-59,38,49,88,94,100,97,100,2,3,-67,94,94,-17,-97,-93,-94,-99,99,99,99,75,70,100,100,100,100,100,-78,-64,-72,95,18,-16,-94,-99,-99,-99,-99,99,94,43,5,-46,28,63,99,-81,1,-74,96,36,5,-99,-74,-74,-59,-99,99,96,-9,-12,-17,-8,19,-93,95,68,97,95,97,19,-19,-55,-58,-71,-99,98,94,-48,-47,-38,-33,-43,-94,95,95,95,97,38,-4,-30,-45,-48,-58,-1,72,91,-66,-91,-70,-67,-97,-59,-59,98,96,98,-65,-34,-36,-48,-46,-26,-1,92,74,-85,-81,-83,-79,-71,-45,41,97,97,42,17,-16,-55,-100,-59,-23,-7,32,45,71,-97,-96,-95,-23,-98,4,28,-79,-10,-7,-29,-100,-99,-100,-48,14,-14,7,74,78,79,80,79,-99,-54,-25,-41,-19,-7,-33,-100,-99,-100,-89,-52,-38,-38,80,59,69,80,-98,-99,-99,-98,-98,-7,5,-16,-66,-100,96,-95,-94,-94,-49,60,74,72,0,98,98,98,-98,99,99,18,-22,-99,-100,96,96,95,-94,27,62,-6,-4,-4,-3,98,98,98,98,99,54,70,-99,97,96,93,92,93,92,28,2,17,22,60,98,97,98,97,91,57,9,-2,37,48,91,91,91,91],"ownershipAllowedMAE":0.0499183})%"); + lines.push_back(R"%({"sample":{"board":"................../..O.............../..XO....O.X.O.OO../..X.O.......XXXX../..X.XOO.........../...O.X............/..X.............../................../....O............./................../................../................../...............O../................../...X..X.....XX.O../............XOO.../................../................../","hintLoc":"null","initialTurnNumber":31,"metadata":"6CABFEF547792B562A4307D727810EE3:41","moveLocs":["N17","J15","H16","H15","G15","J13","H12","Q8","K11","G16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.46,"xSize":18,"ySize":18},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.78e-06,5.48e-06,4.38e-06,4.89e-06,4.26e-06,4.54e-06,4.64e-06,5.38e-06,5.67e-06,5.32e-06,5.44e-06,5.18e-06,4.36e-06,3.94e-06,4.37e-06,4.09e-06,4.31e-06,3.82e-06,6.02e-06,0.0022,0,7.04e-06,2e-05,6.14e-06,0.281,8.93e-06,8.35e-06,1.58e-05,0.0104,5.4e-06,0,4.3e-06,4.63e-06,4.52e-06,7.37e-06,5.07e-06,4.39e-06,8.7e-06,0,0,4.89e-06,0.000212,0,0,0,0.152,0,0.000662,0,5.47e-06,0,0,0.00151,6.37e-06,4.29e-06,5.14e-06,0,5.25e-06,0,5.06e-06,0,0,0,0.242,9.48e-06,0.00172,0,0,0,0,0.000774,5.45e-06,4.63e-06,5.33e-06,0,0.00101,0,0,0,0.000535,2.71e-05,1.18e-05,0.00853,4.03e-05,7.04e-06,4.71e-06,4.57e-06,4.61e-06,7.08e-06,4.14e-06,5.44e-06,7.44e-06,3.88e-05,0,0.135,0,0.00932,0.0222,0,1.91e-05,0.0042,0.000231,2.81e-05,1.56e-05,1.22e-05,1.66e-05,9.69e-06,4.38e-06,5.54e-06,2.74e-05,0,0.00136,1.05e-05,5.93e-05,1.01e-05,0,0.000142,1.12e-05,0.0035,0.000924,0.000111,3.48e-05,2.4e-05,3.35e-05,1.08e-05,4.43e-06,5e-06,0.000733,0.000504,2.14e-05,9.85e-06,1.65e-05,2.09e-05,1.08e-05,7.85e-06,0,1.14e-05,0.000185,0.000254,0.000108,0.000121,5.8e-05,1.1e-05,4.37e-06,4.9e-06,4.2e-05,0.0481,1.28e-05,0,8.92e-06,1.74e-05,2.22e-05,1.13e-05,9.43e-06,2.12e-05,0.000233,0.000938,0.000149,0.0001,0.000194,1.47e-05,4.6e-06,4.69e-06,1.43e-05,0.000109,1.6e-05,9.13e-06,1.34e-05,2.5e-05,4.26e-05,4.65e-05,6.91e-05,0.000112,0.000136,0.000243,0.000153,0.000332,2.12e-05,1.47e-05,4.71e-06,4.61e-06,1.17e-05,3.33e-05,2.78e-05,2.6e-05,3.17e-05,4.58e-05,8.18e-05,0.00015,0.000266,0.000229,0.000137,0.00188,0.0005,0.000504,0,1.7e-05,4.71e-06,4.66e-06,1.38e-05,9.64e-05,6.94e-05,4.6e-05,6.11e-05,7.69e-05,0.000128,0.000227,0.000404,0.000199,0.000131,0.000755,0.0109,0.00405,1.72e-05,1.35e-05,4.5e-06,4.85e-06,2.55e-05,0.00829,0.000153,5.55e-05,7.51e-05,6.51e-05,0.000115,0.000174,0.000166,0.000119,3.92e-05,6.62e-05,0.000403,1.63e-05,0,6.85e-06,4.42e-06,5.11e-06,3.28e-05,1.84e-05,2.31e-05,2.78e-05,4.19e-05,6.08e-05,0.000624,0.000337,0.000179,6.02e-05,2.62e-05,7.74e-06,6.15e-06,1.06e-05,5.05e-06,6.16e-06,3.81e-06,5.27e-06,2.68e-05,0.000292,0,2.14e-05,1.98e-05,0,0.000912,0.000254,0.000138,0.000102,8.3e-06,0,0,5.74e-06,0,4.41e-06,4.08e-06,4.76e-06,2.21e-05,0.025,0.000118,6.55e-05,0.00264,7.9e-05,0.00015,0.00223,0.000109,0.000155,6.84e-06,0,0,0,3.81e-06,4.57e-06,3.71e-06,4.64e-06,1.11e-05,2.22e-05,2.12e-05,0.000652,0.000213,2.43e-05,1.59e-05,1.85e-05,1.26e-05,5.16e-05,8.65e-06,1.49e-05,9.02e-06,5.25e-06,4.51e-06,4.29e-06,3.91e-06,3.68e-06,4.66e-06,4.9e-06,5.04e-06,5.24e-06,5.1e-06,4.96e-06,4.8e-06,4.61e-06,4.62e-06,4.9e-06,4.86e-06,5.12e-06,5.62e-06,4.7e-06,4e-06,3.88e-06,3.83e-06,6.82e-06],"winrateAvg":0.554221,"leadAvg":0.433743,"scoreMeanAvg":0.437365,"scoreStdevAvg":11.8015,"shorttermWinlossErrorAvg":0.127413,"shorttermScoreErrorAvg":0.910262,"ownership":[-1,22,30,55,66,71,65,53,32,17,14,35,49,69,74,71,65,56,-17,-10,51,52,72,72,73,65,42,10,10,28,83,78,79,72,69,41,-33,-38,-77,83,72,66,62,79,77,-4,-65,0,83,-41,81,81,5,16,-47,-62,-77,-8,90,83,93,-55,-56,-22,-43,-36,-92,-92,-91,-91,-34,-26,-52,-64,-78,-2,-14,93,93,14,-28,-31,-29,-36,-41,-46,-50,-58,-61,-42,-49,-56,-7,52,28,-20,31,-7,-65,-18,-18,-18,-20,-22,-29,-37,-40,-44,-38,-50,-74,-11,7,12,18,64,-10,10,-4,-6,-10,-16,-25,-31,-41,-40,-24,-24,-14,-4,11,7,6,13,20,64,11,-1,-5,-12,-21,-32,-36,-36,-9,-8,9,13,65,12,6,6,8,10,1,2,0,-9,-19,-26,-33,-32,-2,-2,4,4,12,4,2,2,3,1,-1,-3,-5,-14,-17,-28,-33,-28,-1,-3,-3,0,2,-1,-2,-1,0,-1,-3,-7,-9,-35,-21,-69,-27,-18,-5,-6,-7,-5,-5,-5,-5,-4,-3,-5,-8,-10,-10,-8,2,0,2,0,-13,-13,-20,-16,-13,-10,-11,-6,-6,-10,-12,-14,-15,-5,5,80,30,24,-19,-27,-39,-38,-29,-25,-22,-12,-13,-16,-18,-16,-29,-28,-6,43,49,48,-20,-21,-47,-87,-45,-43,-81,-25,-20,-24,-24,-35,-84,-84,-28,86,70,61,-16,-17,-11,-32,-39,-36,-42,-28,-21,-26,-27,-46,-85,81,82,75,71,68,-14,-11,-16,-15,-17,-23,-26,-28,-24,-29,-27,-52,-25,24,68,67,69,69,-13,-13,-12,-15,-19,-23,-24,-24,-25,-28,-33,-34,-19,15,38,58,65,68],"ownershipAllowedMAE":0.0284177})%"); + lines.push_back(R"%({"sample":{"board":"........O..../.X....XO.O.../.OXX..XO.O.../..O.X.XXO.O../.O.O....O..../.XXO.O......./...X........./.XO........../............./..X......X.../............./............./............./","hintLoc":"null","initialTurnNumber":15,"metadata":"2160E56230762F109B72632DCCF680C2:25","moveLocs":["A12","B13","H3","F6","E4","G4","G3","F4","F3","E7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":13,"ySize":13},"rules":"koSIMPLEscoreAREAtaxALLsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.84e-06,0,4.65e-05,9.51e-06,8.42e-06,8.26e-06,9.54e-06,8.7e-06,0,7.52e-06,7.42e-06,7.51e-06,7.86e-06,0,0,9.47e-05,1.38e-05,9.84e-06,8.7e-06,0,0,7.49e-06,0,7.23e-06,7.46e-06,7.5e-06,7.72e-06,0,0,0,9.28e-06,9.05e-06,0,0,7.05e-06,0,7.35e-06,7.38e-06,7.63e-06,7.83e-06,7.45e-06,0,8.1e-06,0,1.59e-05,0,0,0,7.28e-06,0,7.74e-06,7.82e-06,7.83e-06,0,8.6e-06,0,1.64e-05,0.0642,0.0424,1.57e-05,0,7.57e-06,7.87e-06,8.53e-06,7.95e-06,1.01e-05,0,0,0,0.0654,0,2.05e-05,0.000181,1.09e-05,9.93e-06,1.02e-05,1.03e-05,8.2e-06,9.8e-06,1.28e-05,0.138,0,0,0.0349,0.000251,9.5e-05,3.09e-05,1.66e-05,1.88e-05,1.38e-05,8.74e-06,1.07e-05,0,0,1.82e-05,1.26e-05,0,0.0945,3.67e-05,8.52e-05,0.000133,0.000116,2.83e-05,9.54e-06,8.45e-06,0.000405,0.0285,0.000456,0.0022,3.3e-05,1.84e-05,3.04e-05,0.35,0.00783,3.44e-05,6.29e-05,9.62e-06,8.58e-06,1.58e-05,0,0.000314,0,0,0,0.0641,0.000132,0,3.85e-05,5.28e-05,9.42e-06,8.63e-06,1.31e-05,0.0962,0.000466,1.21e-05,0,0,0,1.47e-05,0.000114,6.53e-05,1.66e-05,9.16e-06,8.66e-06,1.1e-05,1.49e-05,1.56e-05,1.06e-05,8.16e-06,7.91e-06,8.91e-06,1.8e-05,0.00758,4.39e-05,1.44e-05,8.67e-06,7.67e-06,8.53e-06,8.81e-06,9.08e-06,8.85e-06,8.55e-06,8.43e-06,9.2e-06,9.82e-06,1.06e-05,9.68e-06,9.12e-06,7.2e-06,8.65e-06],"winrateAvg":0.523048,"leadAvg":-0.115601,"scoreMeanAvg":0.113292,"scoreStdevAvg":8.82853,"shorttermWinlossErrorAvg":0.173275,"shorttermScoreErrorAvg":0.930248,"ownership":[-54,-87,-82,-77,-61,-15,46,65,99,98,97,94,91,10,-86,-84,-83,-71,-71,-90,99,99,100,96,92,86,6,16,-90,-90,-80,-72,-89,99,98,100,95,88,78,1,12,15,-33,-88,-31,-89,-89,99,85,99,82,63,-35,15,-22,18,-17,9,-9,34,99,48,48,51,47,-51,-91,-90,18,-14,50,11,6,24,16,17,30,27,-78,-80,-59,-90,-89,7,4,10,4,2,0,13,9,-77,-88,-29,-50,-50,-82,2,-8,3,-5,-8,0,-5,-75,-74,-62,-33,-20,-30,-10,4,27,-19,-21,-13,-14,-66,-69,-90,-16,40,-66,-63,19,7,-68,-36,-20,-20,-53,-51,-28,-26,27,78,79,79,7,-26,-25,-25,-21,-42,-35,-22,1,28,54,61,48,16,-2,-15,-18,-21,-34,-24,-13,6,28,44,47,38,19,-1,-11,-16,-18],"ownershipAllowedMAE":0.0383878})%"); + lines.push_back(R"%({"sample":{"board":"...XXXOOOX.O.X...../..OX.XXOOXOOXXXXOXX/..OX..XXOX.OOXOXXO./.O.OX.X.OOOOOOOOO.O/OXO.X.X.XXOXX....O./OXXXX.X.X.XOX..OXO./OXOOOXXO.XOOXO.OXX./.OO.O.....X.XXXXX../.XX.O.OX.........../.OXOX.X............/..O.OXOX....O..OX../..O.O...O.OXX.OXX../.OXO...X...XO.OXO../..XO....X..X.O.OXX./.O...O.....XO...O../XOXXXO.....X.OXXX../.XOOOXXX....O.OOOX./X.X.OOO.....OOXO.../.X................./","hintLoc":"null","initialTurnNumber":9,"metadata":"F1DA33EAB3A9EB282BA08144BABC5C2F:19","moveLocs":["O9","M9","G8","H8","P5","S5","Q5","S4","F10","H10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.17,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.94e-06,7.11e-06,2.56e-05,0,0,0,0,0,0,0,6.04e-06,0,3.63e-05,0,6.32e-06,0.000131,0.0048,0.000478,6.56e-06,7.55e-06,8.15e-06,0,0,5.95e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.01e-06,6.85e-06,0,0,5.63e-06,5.7e-06,0,0,0,0,6.23e-06,0,0,0,0,0,0,0,0.00096,6.68e-06,0,6.58e-06,0,0,5.7e-06,0,6.76e-06,0,0,0,0,0,0,0,0,0,6.15e-06,0,0,0,0,5.27e-06,0,5.63e-06,0,3.24e-05,0,0,0,0,0,1.82e-05,9.33e-06,7.99e-06,0.000322,0,6.07e-06,0,0,0,0,0,5.6e-06,0,9.51e-06,0,0.00369,0,0,0,0.00121,0.00165,0,0,0,0.0076,0,0,0,0,0,0,0,0,6.51e-06,0,0,0,0,0,7.41e-05,0,0,0,0.000109,5.76e-06,0,0,5.8e-06,0,7.07e-06,0.000547,9.57e-06,6.38e-06,6.74e-06,0,6.46e-06,0,0,0,0,0,6.42e-06,8.36e-06,5.83e-06,0,0,6.07e-06,0,6.54e-06,0,0,6.09e-06,6.42e-06,6.9e-06,2.1e-05,1.42e-05,7.5e-06,7.24e-06,7.79e-06,7.81e-06,7.42e-06,6.96e-06,5.99e-06,0,0,0,5.7e-06,0,0,0,5.79e-06,5.93e-06,7.43e-06,0.000744,5.03e-05,1.84e-05,5.16e-05,0.199,1.31e-05,6.42e-06,6.06e-06,6.35e-06,6.16e-06,0,6.1e-06,0,0,0,0,5.81e-06,5.51e-06,6.11e-06,0,0,0,9.12e-06,0,0,6.56e-06,5.64e-06,5.89e-06,5.96e-06,0,5.87e-06,0,6.7e-06,0,0,0,5.79e-06,0,0,0,7.26e-06,0,0,0,6.46e-06,5.87e-06,5.64e-06,0,0,0,6.26e-06,6.76e-06,4.09e-05,0,6.5e-06,5.93e-06,6.27e-06,0,0,6.97e-06,0,0,0,6.18e-06,6.19e-06,5.43e-06,5.05e-06,0,0,6.08e-06,6.48e-06,8.22e-06,7.53e-06,0,7.66e-06,6.47e-06,0,6.93e-06,0,5.68e-06,0,0,0,5.93e-06,0.0747,0,2.09e-05,9.97e-06,2.21e-05,0,8.58e-06,0.0111,2.7e-05,2.86e-05,7.49e-06,0,0,5.7e-06,0,0,0,0,5.96e-06,0,0,0,0,0,0,1.36e-05,7.78e-05,0.00313,0.000912,1.17e-05,0,6.58e-06,0,0,0,0,0,6.18e-06,0,0,0,0,0,0,0,0,0.133,0.0428,0.0146,1.44e-05,0,5.71e-06,0,0,0,0,6.62e-06,0,0,0,6.69e-06,0,0,0,0.491,0.00484,0.00151,0.000133,7.83e-06,0,0,0,0,6.7e-06,1.88e-05,6.33e-06,0,0,7.18e-06,0.000189,6.55e-06,5.71e-06,6.51e-06,9.6e-06,8.99e-06,8.67e-06,7.42e-06,6.68e-06,6.29e-06,5.8e-06,5.65e-06,6.7e-06,6.64e-06,7.19e-06,5.67e-06,7.59e-06],"winrateAvg":0.734958,"leadAvg":0.682266,"scoreMeanAvg":0.776305,"scoreStdevAvg":3.48405,"shorttermWinlossErrorAvg":0.32468,"shorttermScoreErrorAvg":0.998764,"ownership":[28,-10,-50,-100,-100,-100,100,100,100,49,76,100,31,-99,-99,-99,-99,-99,-99,57,68,97,-100,-100,-100,-100,100,100,50,100,100,-99,-99,-99,-99,-99,-99,-99,73,78,97,-100,-100,-100,-100,-100,100,51,77,100,100,-99,99,-99,-99,82,-57,97,98,92,93,-100,-100,-100,35,100,100,100,100,100,100,100,99,99,81,91,99,-100,92,-81,-100,-100,-100,-16,-100,-100,100,-100,-100,-13,25,33,13,98,71,99,-100,-100,-100,-100,-100,-100,-91,-100,1,0,-4,-100,5,14,69,-100,98,6,99,-100,100,100,100,-100,-100,-88,-94,-98,0,-2,-100,43,-34,68,-100,-100,-15,98,100,100,100,100,-59,65,-93,-91,-93,-98,-59,-100,-100,-100,-100,-100,-86,-80,98,98,98,99,100,84,88,-100,-95,-94,-86,-38,-15,-21,-36,-18,-48,-70,-74,98,99,99,100,97,98,-100,-100,-97,-96,-95,-14,12,41,17,67,-60,-85,-82,98,99,100,100,100,63,65,-100,-98,-97,-98,-100,97,97,77,79,-99,-92,-89,98,98,100,100,100,62,62,-100,-96,-97,-96,-100,-100,-1,99,-100,-99,-98,-93,96,99,96,100,62,16,-18,-100,-98,-97,-97,-100,71,57,99,-100,-99,-99,-98,82,96,96,100,62,18,-14,-54,-99,-88,-80,-100,-44,100,99,100,-100,-100,-99,71,99,98,99,98,99,23,8,-40,-38,-49,-100,99,99,100,100,100,-100,-98,-89,99,97,97,97,99,16,-27,-37,-27,-26,-100,-21,100,-100,-100,-100,-100,-96,-90,-94,99,98,98,-92,-92,-93,-48,-9,13,-30,100,100,100,100,100,-100,-63,-94,-94,-96,-42,98,98,97,29,21,12,24,52,100,100,99,100,49,3,-53,-95,-95,-95,-28,-9,26,20,8,8,16,31,60,80,97,99,85,34,-9,-21],"ownershipAllowedMAE":0.0345256})%"); + lines.push_back(R"%({"sample":{"board":".................../.XXOOX........OX.../XOXXOXX..O.O..O.X../O.OOOXOXXX...OOX.X./.O.XO.OOOXX.XXX.OX./..OXOOXX.O......OX./.X..XOXOOOO...O..O./..XX.XOO.X........./....XXXXO.XX....OO./..OXX.OOXXO...OOXX./...O......OX.XXX.X./...O.....XOX..X.XO./........OXXOOOXXOO./...OX....X.X....XO./..........X.OOX..../..OO.XX...XX..XOOO./.....OOO.X.XOOOXXX./........OOXOOXX..../.........XO.OO.X.X./","hintLoc":"null","initialTurnNumber":170,"metadata":"EE34DC6FEB1EA1B8FD41B4BCD7412B35:180","moveLocs":["N13","Q15","O18","N18","N16","N17","P19","O17","T13","Q13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.98,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":6.5,"policyOptimism":0.0,"pda":-1.822,"policyMixture":[0.000433,7.78e-05,0.000489,0.00104,0.00281,9.18e-05,9.75e-05,0.000114,0.00012,0.000118,0.000106,0.000113,9.91e-05,0.00117,0,0.000222,0.000105,0.00011,7.21e-05,7.95e-05,0,0,0,0,0,8.82e-05,0.000663,0.00754,0.0169,0.00201,8.8e-05,0,0,0,0,0.000705,0.0214,9.59e-05,0,0,0,0,0,0,0,0.000125,0.0399,0,0.000274,0,0,0,0,0.00758,0,8.89e-05,9.28e-05,0,0.00703,0,0,0,0,0,0,0,0,0.000108,0.000114,0,0,0,0,0.0612,0,7.81e-05,0.000767,0,0.000101,0,0,0.000885,0,0,0,0,0,9.71e-05,0,0,0,0,0,0,8.06e-05,9.06e-05,9.62e-05,0,0,0,0,0,0,5.3e-05,0,9.73e-05,0.000114,0.000104,9.3e-05,0.116,0.000104,0,0,0.000119,8.05e-05,0,8.94e-05,0.00472,0,0,0,0,0,0,0,0.000287,0,0.00043,0,0,0.00011,0,0,8.57e-05,8.27e-05,0,0,7.08e-05,0,0,0,8.75e-05,0,9.7e-05,0.000115,0.000189,0.0375,0.000352,0.000167,0.0606,0.409,0.000327,9.36e-05,0.000105,0.000105,7.03e-05,0,0,0,0,0,8.44e-05,0,0,0.000123,0.00354,0.00587,0.000509,0,0,0.0885,9.91e-05,0.000131,0,0,0,9.19e-05,0,0,0,0,0,9.1e-05,0.0001,0.000183,0,0,0,0,0.000223,9.83e-05,0.000138,0.000123,0,0.000124,0.000121,9.81e-05,9.92e-05,8.84e-05,8.57e-05,0,0,8.68e-05,0,0,0,0.000105,0,0.000158,9.14e-05,0.000129,0.000127,0,0.000131,0.000187,0.000117,0.000104,9.58e-05,0,0,0,8.78e-05,8.74e-05,0,7.22e-05,0,0,0.000348,8.56e-05,0.000127,0.000303,0.000991,0.00176,0.000128,0.00012,0.000102,0,0,0,0,0,0,0,0,0,0,9.22e-05,8.34e-05,0.000116,0.000673,0,0,0.000111,0.000116,0.000111,0.000101,0,7.6e-05,0,0.000175,0.00144,0.00274,0.00111,0,0,0.000101,8.19e-05,0.00011,0.000266,0.00352,0.000111,0.000102,0.000103,0.000115,0.000101,8.14e-05,0,8.74e-05,0,0,0,0.000605,0.0034,9.36e-05,0.000345,8.16e-05,0.000126,0,0,0.00577,0,0,0.000143,9.31e-05,8.01e-05,0,0,0.000824,0.000729,0,0,0,0,0.000131,8.16e-05,0.000109,0.000116,0.000115,0.000285,0,0,0,0.00109,0,0.0011,0,0,0,0,0,0,0,0.000104,8.11e-05,9.94e-05,9.94e-05,0.000103,0.000104,9.17e-05,8.13e-05,0.000145,0,0,0,0,0,0,0,7.8e-05,8.47e-05,7.68e-05,8.46e-05,7.05e-05,8e-05,7.73e-05,7.61e-05,7.82e-05,7.62e-05,7.97e-05,8.97e-05,8.18e-05,0,0,0.0572,0,0,9.48e-05,0,6.65e-05,0,5.87e-05,6.94e-05],"winrateAvg":0.988232,"leadAvg":14.2039,"scoreMeanAvg":14.938,"scoreStdevAvg":12.2699,"shorttermWinlossErrorAvg":0.0439824,"shorttermScoreErrorAvg":2.97111,"ownership":[89,88,90,91,37,-3,-37,-17,10,40,61,76,78,44,-12,-14,-48,-60,-65,89,87,87,99,99,-67,-50,-23,8,42,67,80,89,45,89,-53,-48,-61,-68,88,88,87,87,99,-68,-68,-65,-7,70,47,89,89,90,89,24,-85,-74,-73,92,87,98,99,99,-67,97,-80,-81,-82,-18,15,-86,89,89,-56,-39,-82,-74,84,96,84,-82,99,30,96,97,97,-83,-82,-48,-88,-87,-87,40,43,-82,-67,8,10,92,-89,99,99,95,95,96,98,26,-9,-47,-39,-24,15,40,-82,-43,-45,-93,-45,-87,-94,99,96,98,98,98,98,-31,-87,-23,50,50,32,36,-43,-56,-65,-97,-97,-94,-98,98,98,16,-89,1,-38,-16,-18,22,37,45,4,0,-27,-19,-46,-80,-98,-98,-98,-97,13,-69,-99,-98,-40,-19,11,32,49,50,4,9,5,69,-97,-98,-60,-5,-6,-97,-97,-80,-83,-43,-24,38,37,-92,-91,-55,39,64,70,90,-13,-23,-28,-39,-49,-89,-80,-94,-60,-98,-98,-98,-91,-91,-50,63,72,77,90,18,-5,-26,-38,-57,-99,-82,-94,-2,-43,-98,-93,-94,10,-24,73,79,80,31,-21,-16,-30,-35,-10,-99,-99,74,74,73,-98,-98,13,12,2,79,82,77,85,-53,-23,-34,-38,-52,-99,-93,-94,35,-2,-73,-24,-21,10,1,83,86,72,26,9,-26,-31,-38,-23,-65,-99,-31,79,78,-86,-38,-1,3,-1,86,91,98,98,-14,-62,-62,35,-5,-52,-99,-98,19,24,-85,9,10,8,-22,88,91,92,89,84,98,98,98,-15,-89,-53,-98,81,82,83,-86,-84,-85,-65,89,90,91,90,92,94,95,93,95,95,-53,82,81,-57,-76,-72,-82,-84,-84,90,89,89,89,91,93,93,92,91,79,78,72,81,80,30,-83,-82,-86,-85],"ownershipAllowedMAE":0.0416509})%"); + lines.push_back(R"%({"sample":{"board":"......OO.O..X.X../..OXXXXO...OOXO../.OXO.XOOOO.OXXOX./.X.O.XOOXXXOOXX../...OXXXX....OO.X./.OOOOOOX.X.OX.X../.OXOXXXX..OOX..X./...O...OX.XXOO.../............XO.../....OOOX....XO.../...OXXXX....XOX../..OXO......X.XOO./...X......O..X.../..OXXX.X.XOX.XO../..OOOX.XOXOXOXO../.....OOOX.OXO.O../...........X...../","hintLoc":"null","initialTurnNumber":30,"metadata":"3F35CF2F177A8239DBEDD8C6ED24ECC1:40","moveLocs":["K11","H9","Q9","C7","D8","C5","B6","B5","B7","B16"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.6,"xSize":17,"ySize":17},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":4.0,"policyOptimism":0.51,"pda":0.0,"policyMixture":[9.82e-05,0.000107,0.000139,9.78e-05,0.000101,0.000105,0,0,7.99e-05,0,7.76e-05,0.000129,0,0,0,0.000811,9.98e-05,0.000102,0,0,0,0,0,0,0,0.000107,8.87e-05,9.91e-05,0,0,0,0,0.000126,9.94e-05,0.000136,0,0,0,8.73e-05,0,0,0,0,0,0.00012,0,0,0,0,0,0.000113,0.000108,0,0.611,0,8.65e-05,0,0,0,0,0,0,0,0,0,0,0.000113,0.000103,0.000111,0.000105,9.85e-05,0,0,0,0,0,0.000276,0.000135,0.000189,0.000102,0,0,0.000109,0,0.000103,0.000105,0,0,0,0,0,0,0,0.000363,0,0.00011,0,0,0.000175,0,0.000105,0.000107,0.0001,0,0,0,0,0,0,0,0.00458,0,0,0,0,0.000112,0.000112,0,0.000113,0.000105,0.000101,0.0001,0,0.000106,0.000102,0.000369,0,0,0.133,0,0,0,0,0.000115,0.000118,0.000119,0.000108,0.00011,0.000106,0.000104,0.000105,0.000107,0.000106,0,0.00224,0.00248,0.00325,0.00418,0,0,0.000106,0,0.000116,0.000115,0.000117,0.00012,0,0,0,0,0,0.000377,0.00246,0.00112,0.000221,0,0,0.000108,0.000107,0.000108,0.000116,0,0,0,0,0,0,0,0.000114,0.000146,0.000169,0.00026,0,0,0,0.00011,0.000104,0.000131,0,0,0,0,9.76e-05,0.000103,0.000106,0.000116,0.000135,0.000568,0,0.00329,0,0,0,0.000101,0.000138,0,0,0,9.52e-05,0.0001,0.00011,0.000118,0.00549,0.00341,0,0.00912,0.00695,0,0.000141,0.000103,9.84e-05,0.000134,0.000465,0,0,0,0,0.00382,0,0.00453,0,0,0,0.0616,0,0,9.93e-05,9.97e-05,0.000145,0.000127,0,0,0,0,0.0227,0,0,0,0,0,0,0,0,0.000103,0.000102,0.000121,0.000128,0.000108,0.000106,0.000106,0,0,0,0,0.00822,0,0,0,0.00237,0,9.85e-05,0.000108,0.000109,0.000111,0.000105,0.000106,0.00011,0.0001,0.000101,0.0128,0.0654,0.0058,0.0031,0,0.000814,0.000128,0.000111,0.000103,0.000102,7.16e-05],"winrateAvg":0.00321242,"leadAvg":-5.32114,"scoreMeanAvg":-5.49391,"scoreStdevAvg":3.65556,"shorttermWinlossErrorAvg":0.021222,"shorttermScoreErrorAvg":0.984924,"ownership":[-13,-34,-53,-65,-49,16,99,100,99,99,94,79,-25,-22,-97,-97,-99,18,-37,36,-99,-100,-100,-100,100,98,98,95,100,100,-100,-98,-99,-99,24,50,38,100,-37,-100,100,100,100,100,-9,100,-100,-100,-98,-100,-100,45,37,96,100,34,-100,100,100,-98,-97,-98,100,100,-100,-100,-100,-100,75,76,93,100,-100,-100,-100,-100,-95,-80,48,92,100,99,-16,-100,-99,91,100,100,100,100,100,100,-100,-7,-92,-8,99,-67,3,-100,-99,-98,97,100,98,100,-100,-100,-100,-100,39,98,99,99,-69,-50,-73,-100,-74,93,93,97,100,-1,-30,-69,-63,-97,53,-97,-98,98,98,-34,-53,-11,76,86,91,82,-3,13,-25,-100,-95,-96,-95,-98,-100,99,49,95,62,48,49,96,100,100,100,100,-100,-97,-96,-97,-98,-100,99,97,92,90,25,89,87,100,-100,-100,-100,-100,-98,-98,-98,-99,-100,99,97,98,96,-11,87,91,-100,-99,-100,-99,-99,-99,-99,-99,-100,-99,-100,100,100,98,-74,-100,-100,-100,-100,-99,-99,-99,-99,-99,-98,-98,-46,-100,-8,98,98,-39,54,99,-100,-100,-100,-97,-100,-100,-100,-97,-100,-6,-99,100,99,98,19,72,98,98,99,-100,16,-100,-99,-100,-97,-100,29,-99,99,98,97,43,67,94,97,98,98,98,98,-99,-98,-97,-100,30,32,99,91,95,60,80,91,95,95,93,75,24,-8,-70,-96,-100,-40,24,49,89,90],"ownershipAllowedMAE":0.0518369})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.........O...O...../...X...........X.../.......X.........../..X................/.................../.......X....X...O../..X................/.................../..O................/.................../.........O........./......XX...O..X..../......XOO....OX..../...X.X.XO....OXO.../.....O.XO..XOXOXX../.......XO.....OOX../.................../","hintLoc":"null","initialTurnNumber":39,"metadata":"70C63C341EC574930061CAE70A6F34B3:49","moveLocs":["R5","R7","R4","O6","N6","O8","C4","C5","B5","B4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.82,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxALLsui1","komi":41.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.19e-05,2.56e-05,2.61e-05,2.64e-05,2.68e-05,2.63e-05,2.63e-05,2.59e-05,2.59e-05,2.68e-05,2.62e-05,2.59e-05,2.62e-05,2.72e-05,2.68e-05,2.71e-05,2.68e-05,2.54e-05,2.22e-05,2.57e-05,3.26e-05,3.53e-05,3.76e-05,6.62e-05,4.05e-05,3.75e-05,3.65e-05,3.36e-05,3.07e-05,3.26e-05,3.41e-05,3.4e-05,3.42e-05,4.45e-05,7.03e-05,3.63e-05,3.41e-05,2.52e-05,2.54e-05,3.28e-05,0.000128,0.000238,0.000157,0.000134,0.000182,0.000162,3.41e-05,0,3.28e-05,4.33e-05,3.45e-05,0,3.41e-05,0.000124,0.000102,3.55e-05,2.6e-05,2.57e-05,3.58e-05,0.000253,0,0.000245,4.8e-05,0.000119,7.2e-05,3.69e-05,3.45e-05,3.96e-05,5.31e-05,7.2e-05,3.86e-05,0.000178,0,0.000185,5.84e-05,2.63e-05,2.63e-05,3.74e-05,0.00283,0.0118,3.62e-05,3.81e-05,4.6e-05,0,4.55e-05,4.15e-05,4.04e-05,3.72e-05,5.64e-05,0.00017,0.000221,0.000229,0.000176,0.000122,2.72e-05,2.6e-05,0.000503,0,0.000421,3.5e-05,3.87e-05,3.96e-05,4.66e-05,4.21e-05,3.92e-05,3.95e-05,3.88e-05,4.47e-05,5.41e-05,4.28e-05,0.000175,0.000241,7.81e-05,2.63e-05,2.74e-05,0.000267,0.00226,0.00023,3.8e-05,3.93e-05,4.45e-05,6.29e-05,3.87e-05,3.85e-05,3.82e-05,3.82e-05,4.64e-05,0.000114,7.83e-05,3.83e-05,3.31e-05,3.46e-05,2.61e-05,2.84e-05,0.000596,0.103,0.000326,4.93e-05,3.88e-05,0.000132,0,4.98e-05,3.76e-05,3.82e-05,3.68e-05,0,9.09e-05,7.06e-05,3.34e-05,0,3.07e-05,2.69e-05,2.69e-05,0.0274,0,0.0437,4.88e-05,8.36e-05,0.000119,0.000143,4.26e-05,3.8e-05,3.82e-05,3.72e-05,4.18e-05,5.97e-05,4.73e-05,3.58e-05,3.17e-05,3.34e-05,2.61e-05,2.73e-05,3.25e-05,0.000172,4.76e-05,0.000101,0.000105,0.000134,9.69e-05,4.83e-05,3.83e-05,3.8e-05,3.75e-05,3.84e-05,4.24e-05,5.88e-05,6.79e-05,0.000114,3.66e-05,2.63e-05,2.74e-05,2.93e-05,0,3.14e-05,7.1e-05,9.81e-05,0.000118,8.08e-05,3.84e-05,3.68e-05,3.58e-05,3.54e-05,8.69e-05,0.00016,0.000175,0.000478,0.000462,0.00116,2.88e-05,2.61e-05,2.96e-05,2.84e-05,3.24e-05,3.85e-05,4.15e-05,5.99e-05,6.82e-05,5.84e-05,3.15e-05,3.08e-05,3.3e-05,4.16e-05,0,0.000416,0.000567,0.00218,0.00694,3.32e-05,2.57e-05,3.2e-05,3.29e-05,3.26e-05,3.21e-05,3.23e-05,2.96e-05,3.06e-05,3.28e-05,0,2.61e-05,2.65e-05,3.17e-05,0.000492,0.000353,0.00554,0,0.00345,3.32e-05,2.68e-05,3.87e-05,0.000118,2.97e-05,2.67e-05,2.61e-05,0,0,2.81e-05,2.57e-05,2.53e-05,0,0,0,0,0.000131,0.0247,0.000202,3.05e-05,2.69e-05,0,0,5.85e-05,2.83e-05,2.79e-05,0,0,0,2.42e-05,2.52e-05,2.39e-05,2.43e-05,0,0,2.25e-05,0,3.7e-05,3.24e-05,2.6e-05,0,0,0,2.7e-05,0,8.17e-05,0,0,2.28e-05,2.51e-05,2.56e-05,2.31e-05,0,0,0,0,0.000147,3.59e-05,2.48e-05,2.75e-05,0.745,2.52e-05,2.26e-05,0,0.000119,0,0,2.45e-05,2.5e-05,0,0,0,0,0,0,0.000205,3.17e-05,2.22e-05,2.47e-05,2.47e-05,2.36e-05,2.37e-05,2.37e-05,7.72e-05,0,0,2.45e-05,2.68e-05,2.52e-05,3.12e-05,3.29e-05,0,0,0,9.87e-05,3.22e-05,2.02e-05,2.24e-05,2.23e-05,2.25e-05,2.27e-05,2.74e-05,2.92e-05,0.000127,2.92e-05,2.6e-05,2.49e-05,2.44e-05,2.45e-05,2.43e-05,2.18e-05,2.39e-05,3.3e-05,3.14e-05,2.33e-05,1.77e-05],"winrateAvg":0.0841552,"leadAvg":-5.51045,"scoreMeanAvg":-9.92283,"scoreStdevAvg":14.404,"shorttermWinlossErrorAvg":0.0884176,"shorttermScoreErrorAvg":1.88039,"ownership":[-44,-41,-38,-35,-30,-23,-14,-7,3,11,12,12,13,12,4,-6,-11,-16,-17,-47,-45,-44,-40,-35,-24,-19,-8,1,15,11,9,13,19,-1,-9,-17,-18,-19,-50,-53,-52,-52,-45,-30,-15,-29,-7,44,3,-16,6,49,-16,-28,-26,-23,-20,-55,-58,-62,-90,-41,-35,-30,-31,-18,-7,-14,-11,-3,-9,-18,-73,-36,-21,-19,-61,-66,-63,-53,-45,-37,-37,-81,-25,-16,-15,-17,-12,-5,-11,-26,-28,-18,-12,-64,-69,-90,-50,-43,-36,-35,-35,-24,-18,-16,-15,-15,-12,-12,-12,-15,-3,-3,-62,-66,-48,-44,-40,-36,-35,-35,-25,-18,-17,-17,-19,-9,-9,-11,0,8,7,-59,-64,-53,-46,-37,-35,-32,-81,-25,-19,-18,-22,-74,-15,-8,-1,45,17,11,-54,-60,-86,-37,-37,-31,-27,-22,-18,-13,-13,-15,-19,-12,-10,-10,2,6,7,-48,-52,-48,-44,-36,-31,-23,-19,-12,-8,-7,-9,-14,-15,-13,-11,-11,-6,-5,-47,-43,-22,-45,-39,-32,-25,-22,-12,-5,-5,-8,-10,-22,-21,-16,-11,-16,-19,-50,-51,-50,-50,-42,-36,-28,-17,-6,4,4,-3,-12,-81,-32,-34,-34,-35,-35,-58,-62,-57,-55,-50,-43,-46,-34,6,78,17,21,-2,-38,-54,-41,-84,-56,-46,-63,-77,-81,-63,-52,-57,-96,-96,-17,52,54,88,88,-84,-85,-59,-41,-44,-42,-57,-41,-89,-2,-46,-52,-95,88,89,65,66,76,76,88,-84,-42,11,-19,-25,-28,-49,32,-24,3,-89,-82,-85,89,69,67,72,71,91,-85,14,14,5,-5,-13,1,32,14,-2,17,-40,-85,88,70,69,53,93,87,92,3,1,2,1,-4,5,13,11,1,-13,-24,-84,88,64,67,73,81,91,93,92,1,8,7,1,6,8,6,-3,-15,-39,-22,-4,57,63,71,81,82,78,54,32,19,14],"ownershipAllowedMAE":0.0373009,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":".....XXOXOO......../...OX.XO.OXX..X..X./.....XOOOXO..OX..XO/...O.XXOXX...OXXXO./......OXO..OXXXOO../...O.XOX....OOOO.O./.....OOX.......X.../.....XOX..OOOX...../..X..O.OO.XXOX.X.../......X..OOOXO..X../...X....XXXXXOOX.../..O.......OOOO.OX../....OX..XO.XO..OX../........XO.X..XOX../..XX.O.OO....O.X.../..X.XO...O.XO..X.../...XO..X.X.X.O...../...O.O....X.XO...../.................../","hintLoc":"null","initialTurnNumber":140,"metadata":"347487D025F02ADA35E8FB873D5DDF04:150","moveLocs":["E8","F8","F9","G8","D7","E6","E9","B10","B11","C10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.88,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxALLsui1","komi":31.5,"policyOptimism":0.0,"pda":1.018,"policyMixture":[1.27e-05,1.4e-05,1.39e-05,1.45e-05,1.37e-05,0,0,0,0,0,0,1.37e-05,1.33e-05,1.34e-05,1.35e-05,1.29e-05,1.29e-05,1.31e-05,1.37e-05,1.39e-05,1.49e-05,1.49e-05,0,0,1.29e-05,0,0,1.59e-05,0,0,0,1.35e-05,1.42e-05,0,1.34e-05,1.3e-05,0,1.39e-05,1.37e-05,1.51e-05,1.8e-05,1.5e-05,1.34e-05,0,0,0,0,0,0,1.45e-05,1.39e-05,0,0,1.3e-05,1.3e-05,0,0,1.39e-05,1.57e-05,1.5e-05,0,1.4e-05,0,0,0,0,0,1.33e-05,1.45e-05,1.4e-05,0,0,0,0,0,1.35e-05,1.38e-05,2.27e-05,6.91e-05,1.99e-05,1.48e-05,1.7e-05,0,0,0,1.37e-05,1.45e-05,0,0,0,0,0,0,1.5e-05,1.35e-05,1.42e-05,4.79e-05,3.91e-05,0,1.76e-05,0,0,0,1.37e-05,1.42e-05,3.5e-05,2.47e-05,0,0,0,0,1.23e-05,0,1.29e-05,1.45e-05,4.19e-05,4.42e-05,2.89e-05,8.23e-05,0,0,0,1.31e-05,1.36e-05,1.4e-05,2.12e-05,2.33e-05,1.38e-05,1.28e-05,0,1.45e-05,1.43e-05,1.35e-05,1.41e-05,1.47e-05,1.51e-05,6.85e-05,0.00014,0,0,0,1.36e-05,0.000281,0,0,0,0,1.33e-05,1.4e-05,1.41e-05,1.44e-05,1.36e-05,1.51e-05,0,0,0.283,0.00142,0,0.000331,0,0,0.00022,0,0,0,0,1.35e-05,0,1.35e-05,1.43e-05,1.35e-05,4.25e-05,0,0,0.624,2.16e-05,1.87e-05,0,1.77e-05,0.0295,0,0,0,0,0,1.37e-05,1.28e-05,0,1.39e-05,1.34e-05,1.77e-05,0.000106,0.0551,0,0,0,3.43e-05,1.58e-05,0,0,0,0,0,0,0,0,1.31e-05,1.35e-05,1.27e-05,1.78e-05,0.000145,0,6.4e-05,0,0,0,2.61e-05,1.37e-05,8.34e-05,0,0,0,0,1.52e-05,0,0,1.34e-05,1.28e-05,1.57e-05,6.42e-05,0.000431,0,0,0,0.000146,1.55e-05,0,0,1.71e-05,0,0,1.59e-05,4.58e-05,0,0,1.32e-05,1.29e-05,1.45e-05,1.87e-05,1.6e-05,1.92e-05,0,1.93e-05,3.36e-05,1.5e-05,0,0,1.31e-05,0,0.000161,0.000104,0,0,0,1.34e-05,1.32e-05,1.45e-05,1.41e-05,0,0,5.24e-05,0,1.62e-05,0,0,3.34e-05,0.000176,1.5e-05,1.79e-05,0,1.54e-05,0,1.35e-05,1.36e-05,1.34e-05,1.4e-05,1.4e-05,0,1.23e-05,0,0,1.63e-05,1.42e-05,1.46e-05,0,1.4e-05,0,0,1.47e-05,1.61e-05,0,1.43e-05,1.44e-05,1.36e-05,1.38e-05,1.41e-05,1.42e-05,0,0,3.82e-05,0.00153,0,1.45e-05,0,1.18e-05,0,1.39e-05,0,1.5e-05,1.52e-05,1.48e-05,1.45e-05,1.37e-05,1.39e-05,1.53e-05,4.34e-05,0,6.28e-05,0,1.49e-05,1.38e-05,1.5e-05,1.38e-05,0,1.16e-05,0,0,2.05e-05,3.83e-05,1.58e-05,1.45e-05,1.37e-05,1.25e-05,1.44e-05,1.39e-05,1.49e-05,1.4e-05,1.33e-05,1.33e-05,1.34e-05,1.4e-05,1.39e-05,1.25e-05,1.38e-05,1.39e-05,1.59e-05,1.42e-05,1.52e-05,1.4e-05,1.37e-05,1.25e-05,1.25e-05],"winrateAvg":0.716639,"leadAvg":2.83404,"scoreMeanAvg":3.35287,"scoreStdevAvg":12.7421,"shorttermWinlossErrorAvg":0.249099,"shorttermScoreErrorAvg":2.74746,"ownership":[32,26,15,-18,-64,-99,-99,-98,-98,-87,-83,-81,-58,-68,-83,-93,-89,-70,-61,34,30,13,53,-97,-96,-99,-98,-98,-87,-90,-87,-36,-46,-98,-94,-91,-96,-20,37,37,41,16,-37,-99,-98,-98,-98,-99,40,18,-20,3,-98,-96,-96,-96,40,38,40,53,79,-34,-99,-99,-97,-99,-98,-7,19,-35,5,-98,-98,-98,88,39,30,38,39,45,-1,-2,84,-98,11,-22,17,83,-98,-98,-98,98,98,88,77,19,15,52,86,25,-22,85,-97,-30,-4,21,78,98,98,98,98,59,97,76,1,0,6,39,45,85,86,-97,-15,1,34,74,66,0,33,-62,-7,36,62,-22,-15,0,8,50,41,85,-96,16,38,98,98,98,-86,-30,-46,9,1,23,-41,-61,-60,17,34,76,4,95,95,85,84,83,98,-87,-41,-94,-63,-16,-16,-43,-25,-28,-67,-29,-19,-85,-5,-26,87,86,85,-71,97,21,-50,-97,-79,-41,-42,-38,-74,-94,-94,-94,-62,-43,-74,-71,-71,-71,-72,97,97,-91,-90,-78,-69,-47,-44,-36,-82,-93,36,38,2,-31,-7,96,97,97,97,75,75,-98,-91,-80,-51,-50,-49,-85,89,23,26,9,-44,96,66,-45,97,45,-14,75,-98,-91,-82,-52,-55,-61,17,88,71,46,40,-38,96,15,-47,29,48,-35,73,-98,-85,-74,-47,-62,-80,-80,14,96,68,97,97,75,-37,-29,37,88,-21,-92,-89,-57,-57,-31,-43,-79,-26,-40,96,14,19,25,88,7,-71,86,65,-28,-91,-35,-36,-32,-9,9,-32,-48,85,56,-46,-66,-48,-68,-38,-70,10,87,0,-46,6,-12,-14,7,17,11,78,75,89,23,-10,-9,-59,-71,-65,-68,86,10,6,9,2,-4,18,26,49,54,73,65,44,8,-21,-49,-60,-60,-3,35,48,30,19,11,5],"ownershipAllowedMAE":0.038637})%"); + lines.push_back(R"%({"sample":{"board":"OX.OX.X.XX.X....OX./OXXXXX....X.X.XXOXO/OOXOXOXXX..X.XOXOO./O.OOXOOXX.X.OO.OXOX/.O..OXOXXXX.O..OXX./..OOO.OO.XOO..OOX.X/..O.......XXOOOXXX./.......XO.XOO.XOXOX/..O...XO..OO.XOOOOO/.OOX...X....OOX..O./.OXX....O.XXX.X.XO./.X.....X.X.OX..XOO./...XOX..XO.O...X.../....XO..X...X..XOO./..XX......XXO.OOXX./.XXOOO...OXOO.OXX../.OO....O..OOXXOX.X./..........OXXXXOX../..............OO.../","hintLoc":"null","initialTurnNumber":217,"metadata":"9E9772068FB3F2C3C7DB996F638F286F:227","moveLocs":["J11","J13","G7","E8","K5","K6","H5","O6","A3","G6"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":6.5,"policyOptimism":0.507,"pda":0.0,"policyMixture":[0,0,5.54e-05,0,0,0,0,6.4e-05,0,0,0,0,6.33e-05,0.000162,0.000315,8.08e-05,0,0,0.00273,0,0,0,0,0,0,6.24e-05,6.36e-05,6.19e-05,6.21e-05,0,0,0,0.000792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.18e-05,6.45e-05,0,0.000665,0,0,0,0,0,9.17e-05,0,6.67e-05,0,0,0,0,0,0,0,6.15e-05,0,7.18e-05,0,0,0.000108,0,0,0,0,6.47e-05,0,6.74e-05,6.6e-05,0,0,0,0,0,0,0,8.17e-05,0,6.61e-05,7.54e-05,0,0,0,0,6.81e-05,6.69e-05,0,0,0,7.71e-05,0,0,7.55e-05,0,0,0,7.03e-05,6.59e-05,0,0,0,0,0,6.64e-05,6.65e-05,0,6.97e-05,8.25e-05,0.0001,8.91e-05,0.000453,0,0.000655,0,0,0,0,0,0,0,0,0.00194,6.61e-05,7.12e-05,6.92e-05,9.62e-05,0.000206,0.000705,0.0371,0,0,0.000242,0,0,0,6.68e-05,0,0,0,0,0,6.67e-05,6.75e-05,0,0.000416,0.000659,0.00217,0,0,0,0.0392,0,0,7.18e-05,0,0,0,0,0,0,6.7e-05,0,0,0,8.82e-05,0.000208,0.0414,0,0.000676,8.49e-05,7.55e-05,8.18e-05,0,0,0,0.000232,8.88e-05,0,6.01e-05,0.000117,0,0,0,7.14e-05,9.64e-05,0.000167,0.0282,0,0.000775,0,0,0,0.00176,0,9.18e-05,0,0,6.45e-05,0.0273,0,0.000477,5.98e-05,0,7.87e-05,0.00032,0,0.000453,0,7.61e-05,0,0,0.000128,6.77e-05,0,0,0,6.34e-05,8.8e-05,0.00065,0.00015,0,0,0,0,5.84e-05,0,0,6.52e-05,0,0.000133,0.000152,9.47e-05,0,8.32e-05,6.93e-05,6.97e-05,0.000146,0.000699,7.47e-05,6.84e-05,0,0,0,0.781,0,0,0.00342,0.00154,0,0,0.00259,0,0,0,8.47e-05,8.65e-05,7.64e-05,0,0,7.33e-05,0.000293,0.00692,0,0.000435,0,0,0,0,7.76e-05,0,0,0,0,0.00032,0.000633,0,0,0,0,0,8.41e-05,8.59e-05,8.22e-05,0,0,0,0,0.000254,0,0,0,7.13e-05,8.7e-05,0,0,0,6.99e-05,7.14e-05,7.22e-05,7.86e-05,0,7.9e-05,8.64e-05,0,0,0,0,0,0,0,0,8.4e-05,6.46e-05,6.71e-05,6.78e-05,6.86e-05,7.08e-05,7.19e-05,7.44e-05,7.69e-05,8.53e-05,7.93e-05,0,0,0,0,0,0,0,0.000163,6.38e-05,6.43e-05,6.72e-05,6.46e-05,6.53e-05,6.48e-05,6.55e-05,6.8e-05,7.31e-05,7.27e-05,7.5e-05,0.000235,0.00156,0.000127,8.3e-05,0,0,0.000129,0.000114,6.71e-05,4.9e-05],"winrateAvg":0.0554431,"leadAvg":-2.38022,"scoreMeanAvg":-2.68779,"scoreStdevAvg":4.06202,"shorttermWinlossErrorAvg":0.124843,"shorttermScoreErrorAvg":0.950659,"ownership":[95,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-99,-96,-90,-91,55,40,53,95,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-96,-99,-100,52,48,49,95,95,-100,100,-100,98,-100,-100,-100,-100,-100,-100,7,-97,10,-100,48,49,-14,95,95,100,100,-100,98,98,-100,-100,-100,-100,-32,100,100,10,100,-94,44,-86,94,100,99,100,100,91,97,-100,-100,-100,-100,-60,100,94,71,100,-94,-93,-85,97,98,100,100,100,91,97,97,-40,-100,88,93,93,97,100,100,-94,-84,-93,97,98,100,61,28,-8,19,-13,-97,-86,-86,-87,100,100,100,-94,-95,-94,65,96,97,60,19,12,-3,10,-47,96,13,-85,100,100,100,100,100,-95,100,54,93,96,99,-4,-16,-31,-88,97,97,88,100,100,99,98,100,100,100,100,100,80,98,99,-100,-48,-50,-51,-70,6,50,-11,-40,98,98,-98,7,72,100,100,21,98,-100,-100,-71,-53,-44,-3,45,-3,-100,-100,-100,9,-98,-91,-91,100,99,-6,-92,-93,-98,-100,-66,-57,-94,-41,-99,-98,-95,-100,-92,-92,-98,100,100,95,-49,-84,-92,-100,-97,-97,50,40,-99,-96,-98,-94,-96,-91,-86,-98,-49,91,88,-56,-69,-88,-98,-99,-32,-47,90,-99,-99,-95,-95,-98,-98,47,-98,94,94,9,-70,-85,-100,-100,-5,-68,51,95,-9,97,-96,-95,99,5,96,96,-100,-100,-4,32,-100,-100,99,99,99,78,88,89,98,-95,99,99,72,96,-100,-100,-98,-95,98,98,98,97,97,98,98,99,96,97,99,99,-97,-97,97,-100,-100,-100,-97,97,97,98,97,97,98,98,97,96,92,99,-97,-97,-97,-97,-97,-100,-99,-99,97,97,98,97,97,97,97,95,92,80,19,2,-60,-95,-97,-97,-99,-99,-99],"ownershipAllowedMAE":0.0299844,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":".................../............X....../...O.......O..X..../.....O.......O..X../..X.............OX./.................../..O.O............../.................../..X................/...X.............../.................../.................../.................../.................../.................../..XXX...........O../..OOX........O...../.................../.................../","hintLoc":"null","initialTurnNumber":22,"metadata":"2F10A02313403BF2F1E37BE704C9E00C:32","moveLocs":["R14","Q15","S13","M18","B13","B12","C12","B14","D13","C14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.71,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":4.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.05e-07,1.21e-06,1.24e-06,1.2e-06,1.23e-06,1.15e-06,1.13e-06,1.15e-06,1.15e-06,1.27e-06,1.32e-06,1.55e-06,1.12e-06,1.1e-06,1.21e-06,1.08e-06,1.07e-06,1.05e-06,8.05e-07,1.17e-06,1.57e-06,2.08e-06,4.72e-05,4.14e-06,3.22e-06,1.9e-06,1.92e-06,2e-06,2.43e-06,2.33e-06,0,0,1.93e-06,1.66e-06,1.54e-06,1.47e-06,1.3e-06,1.05e-06,1.12e-06,1.49e-06,4.29e-05,0,6.74e-05,1.15e-05,2.77e-06,5.52e-06,7.51e-06,1.17e-05,5.21e-06,0,0.00195,4.09e-06,0,1.61e-06,1.62e-06,1.43e-06,9.7e-07,1.17e-06,1.47e-06,1.44e-06,2.66e-05,5.03e-05,0,8.93e-06,3.19e-06,9.3e-06,6.83e-06,1.18e-05,5.35e-05,9.62e-05,0,8.72e-06,5.02e-06,0,1.4e-06,9.86e-07,1.41e-06,3.07e-06,0,3.34e-06,7.36e-06,4.96e-06,2.64e-06,4.16e-06,5.63e-06,7.49e-06,1e-05,2.55e-05,6.98e-06,3.01e-06,1.81e-06,0,0,0,9.2e-07,1.27e-06,0,0,0.996,6.49e-06,2.07e-06,2.31e-06,2.88e-06,5.17e-06,6.4e-06,7.91e-06,7.24e-06,5.92e-06,6.64e-06,1.83e-06,2.31e-06,0,1.06e-06,8.87e-07,1.61e-06,0,0,0,0,5.46e-06,2.35e-06,3.41e-06,5.1e-06,5.93e-06,5.97e-06,6.07e-06,4.04e-06,3.59e-06,2.57e-06,1.5e-06,1.24e-06,0,9.39e-07,1.46e-06,0,0,4.08e-06,5.03e-06,2.61e-06,2.59e-06,3.45e-06,4.7e-06,4.86e-06,4.46e-06,3.72e-06,2.74e-06,2.35e-06,1.91e-06,1.76e-06,1.46e-06,1.38e-06,1.02e-06,1.44e-06,3.85e-06,0,1.23e-06,1.63e-06,2.09e-06,3.56e-06,4.42e-06,4.34e-06,3.93e-06,3.23e-06,2.63e-06,2.3e-06,2.15e-06,2.01e-06,1.93e-06,1.7e-06,1.62e-06,1.11e-06,1.2e-06,1.59e-06,1.15e-06,0,1.59e-06,2.28e-06,4.51e-06,4.62e-06,4.23e-06,3.61e-06,2.82e-06,2.43e-06,2.25e-06,2.14e-06,2.04e-06,1.99e-06,1.95e-06,1.75e-06,1.11e-06,1.08e-06,1.48e-06,1.43e-06,1.59e-06,1.76e-06,2.23e-06,3.6e-06,4.32e-06,4.24e-06,3.57e-06,2.77e-06,2.39e-06,2.25e-06,2.14e-06,2.04e-06,2.23e-06,2.1e-06,1.9e-06,1.09e-06,1.1e-06,1.6e-06,1.72e-06,1.81e-06,1.94e-06,1.96e-06,2.12e-06,3.11e-06,4.01e-06,3.66e-06,2.84e-06,2.43e-06,2.3e-06,2.18e-06,2.16e-06,3.61e-06,2.76e-06,1.94e-06,1.08e-06,1.09e-06,1.62e-06,1.69e-06,1.8e-06,1.88e-06,2e-06,2.04e-06,2.24e-06,3.29e-06,3.52e-06,2.95e-06,2.54e-06,2.29e-06,2.2e-06,2.35e-06,5.51e-06,6.02e-06,1.96e-06,1.1e-06,1.07e-06,1.51e-06,1.53e-06,1.49e-06,1.66e-06,1.81e-06,2e-06,2.04e-06,2.38e-06,3.13e-06,3.12e-06,2.73e-06,2.52e-06,2.29e-06,3.27e-06,6.78e-06,1.06e-05,2.25e-06,1.15e-06,1.18e-06,1.79e-06,1.3e-06,1.1e-06,1.2e-06,1.53e-06,1.87e-06,1.99e-06,2.15e-06,3.28e-06,4.02e-06,4.52e-06,3.42e-06,3.13e-06,1.96e-05,2.67e-05,2.39e-05,3.82e-06,1.21e-06,1.33e-06,2.05e-06,0,0,0,1.26e-06,1.71e-06,2e-06,2.65e-06,6.17e-06,7.56e-06,7.45e-06,1.72e-05,3.58e-05,3.08e-05,8.62e-05,0,1.64e-05,1.31e-06,1.15e-06,1.6e-06,0,0,0,1.36e-06,1.72e-06,1.92e-06,2.27e-06,4.13e-06,7.12e-06,1.2e-05,2.15e-05,0,4.66e-05,3.16e-05,4.24e-05,2.56e-06,1.27e-06,1.12e-06,1.41e-06,1.32e-06,1.69e-06,2.75e-06,3.4e-06,1.63e-06,1.8e-06,1.93e-06,1.95e-06,1.92e-06,2.27e-06,3.38e-06,1.87e-05,8.13e-06,3.65e-06,1.88e-06,1.87e-06,1.24e-06,8.47e-07,1.21e-06,1.11e-06,1.19e-06,1.37e-06,1.23e-06,1.04e-06,1.07e-06,1.1e-06,1.1e-06,1.12e-06,1.16e-06,1.2e-06,1.22e-06,1.27e-06,1.16e-06,1.17e-06,1.16e-06,8.39e-07,2.48e-06],"winrateAvg":0.102424,"leadAvg":-5.07951,"scoreMeanAvg":-7.52256,"scoreStdevAvg":12.8701,"shorttermWinlossErrorAvg":0.082184,"shorttermScoreErrorAvg":1.30384,"ownership":[59,60,61,61,58,50,44,41,41,43,50,35,23,-14,-32,-51,-61,-67,-71,59,62,65,67,63,54,47,42,42,46,50,76,-35,-16,-45,-58,-66,-71,-76,61,60,64,89,59,54,42,34,35,36,33,75,-10,4,-73,-51,-72,-78,-80,62,64,65,61,31,84,29,23,20,19,15,13,34,58,0,-21,-92,-87,-86,64,68,38,64,-2,8,6,9,9,10,14,5,11,12,6,31,29,-94,-86,71,81,82,-86,-70,-24,-6,-1,2,3,6,6,7,6,1,-10,-92,-90,-84,68,61,80,-83,-8,-32,-11,-4,-2,-1,1,2,3,4,7,-22,-36,-94,-70,36,58,-92,-65,-45,-19,-11,-6,-4,-3,-2,-1,1,1,0,-12,-13,-43,-55,-16,9,-91,-62,-26,-17,-11,-6,-4,-3,-3,-2,-1,0,-1,-9,-15,-30,-34,-34,-57,-66,-90,-32,-17,-10,-5,-3,-3,-3,-2,-1,0,-1,-5,-10,-17,-21,-42,-42,-32,-42,-22,-14,-8,-4,-2,-2,-3,-3,-2,-1,-1,-3,-6,-9,-9,-43,-44,-42,-36,-23,-12,-7,-2,0,-2,-3,-3,-3,-2,-1,0,1,-1,-1,-46,-48,-41,-35,-24,-15,-8,-2,0,-1,-3,-4,-3,-1,0,2,7,7,8,-52,-46,-44,-35,-26,-17,-10,-5,-2,-2,-3,-4,-2,2,2,6,0,16,18,-55,-75,-64,-54,-40,-20,-13,-8,-5,-3,-4,-6,2,12,13,18,23,35,31,-45,-41,-97,-97,-97,-41,-20,-12,-8,4,-1,-1,-1,27,30,26,84,51,42,-29,-35,-16,-15,-97,-53,-19,-14,-11,-1,4,-9,12,80,40,44,52,54,46,-26,-20,-21,-37,-43,-71,-26,-22,-11,-3,3,9,25,37,43,46,49,49,48,-23,-23,-27,-31,-43,-49,-38,-22,-12,-3,4,12,23,34,39,43,45,47,47],"ownershipAllowedMAE":0.0258114})%"); + lines.push_back(R"%({"sample":{"board":"X.X.O............../.XOO.O.OX.X..O...../..XXOO.OXXOOO..OOO./.X..XO.X..XOX.XXXOO/.XO.XO....X..OXOO../.OX.XXXO...XOXXO.OO/.OX...OXX..XX..XO../.OO.OO.O....OXX.XOO/.XO.OXOO....OXXXXXO/.XX.XXXOO.O.OOX..XX/......XXO.....X..../...X.OOXOX..OXXO.../.XX.OXX.XOO...OXX../.O.O.XO.X..OOOOOX../..OOXOOX.X.X.XOOX../...XOOX..X.X.XXOX../..OOX.X.X.O.OOOXX../.OOX.X.XOO....OOX../.OX.X............../","hintLoc":"null","initialTurnNumber":149,"metadata":"CA925ECDE00AEE8390D9B816BD93A28E:159","moveLocs":["E8","K12","M18","R1","K11","L12","L19","P17","P18","M15"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.69,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":10.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0,0.0043,0,5.78e-06,6.24e-06,7.33e-06,0.256,9.07e-06,0,6.59e-06,6.04e-06,6.26e-06,5.92e-06,6.14e-06,6.36e-06,6.34e-06,6.18e-06,9.51e-05,0,0,0,5.16e-06,0,6.17e-06,0,0,0.0619,0,0,6.49e-06,0,0,5.79e-06,6.02e-06,6.17e-06,6.07e-06,0.000242,5.31e-05,0,0,0,0,6.75e-06,0,0,0,0,0,0,0.013,0,0,0,0,6.03e-06,7.46e-06,0,6.56e-06,7.05e-06,0,0,0.000342,0,0.21,8.26e-06,0,0,0,1.42e-05,0,0,0,0,0,1.62e-05,0,0,7.54e-06,0,0,0.00231,0.00611,9.89e-06,6.25e-06,0,0,8.35e-06,0,0,0,0,5.85e-06,5.98e-06,1.02e-05,0,0,0.0158,0,0,0,0,9.64e-05,6.31e-06,5.77e-06,0,0,0,0,0,5.89e-06,0,0,6.96e-06,0,0,0.000112,0.000215,1.08e-05,0,0,0,6.81e-06,6.27e-06,0,0,6.81e-06,9.23e-05,0,0,6.26e-06,6.34e-06,1.01e-05,0,0,0.00362,0,0,6.57e-06,0,0.0132,0,0,1.14e-05,0,0,0,0,0,0,0,0.000207,0,0,1.97e-05,0,0,0,0,6.12e-06,0,1.55e-05,8.47e-06,0,0,0,0,0,0,0,8.48e-06,0,0,0.00372,0,0,0,0,0,6.26e-06,0,7.18e-06,0,0,0,5.84e-06,5.7e-06,0,0,3.09e-05,1.13e-05,7.32e-06,0.157,5.9e-05,6.66e-06,0,0,0,6.3e-06,6.62e-06,7.69e-06,1.09e-05,0.000149,0,5.86e-06,5.87e-06,5.75e-06,5.73e-06,3.34e-05,0.0621,6.89e-05,0,0,0,0,0,0,0,6.65e-06,7.05e-06,0,0,0,0,5.81e-06,5.78e-06,5.74e-06,0.0776,0,0,0.000792,0,0,0,8.3e-06,0,0,0,7.25e-06,9.42e-06,2.26e-05,0,0,0,5.66e-06,5.81e-06,0.00164,0,0.000121,0,0.0548,0,0,6.65e-06,0,7.75e-06,8.33e-06,0,0,0,0,0,0,5.75e-06,5.68e-06,9.15e-06,7.08e-06,0,0,0,0,0,0,6.56e-06,0,9.1e-06,0,1.61e-05,0,0,0,0,5.77e-06,5.67e-06,6.73e-06,6.17e-06,8.17e-06,0,0,0,0,6.45e-06,6.05e-06,0,4.69e-05,0,1.67e-05,0,0,0,0,5.81e-06,5.64e-06,6.11e-06,6.41e-06,0,0,0,6.77e-06,0,9.05e-06,0,0.000379,0,0.0368,0,0,0,0,0,5.74e-06,5.67e-06,6.03e-06,0,0,0,0,0,6.41e-06,0,0,0,7.06e-06,4.83e-05,7.36e-06,6.06e-06,0,0,0,5.8e-06,5.5e-06,6.03e-06,0,0,0.0136,0,6.61e-06,6.83e-06,5.09e-05,0.00242,5.63e-06,6.26e-06,6.36e-06,6.87e-06,6.68e-06,6.81e-06,5.09e-05,0,5.55e-06,5.68e-06,1.46e-05],"winrateAvg":0.708876,"leadAvg":0.397854,"scoreMeanAvg":0.580897,"scoreStdevAvg":2.76154,"shorttermWinlossErrorAvg":0.283896,"shorttermScoreErrorAvg":0.752768,"ownership":[-99,-96,-96,93,100,99,99,62,40,45,95,95,98,99,100,100,100,100,100,-98,-99,99,99,99,100,98,100,-99,53,57,100,99,100,100,100,100,100,100,-98,-99,-100,-100,100,100,51,100,-99,-99,100,100,100,69,-100,100,100,100,100,-94,-100,-99,-99,-100,100,16,-98,-96,-99,-100,100,-99,-97,-100,-100,-100,100,100,3,-100,-98,-99,-100,100,-6,-97,-98,-98,-100,-100,-99,-97,-100,99,99,99,100,13,100,-98,-96,-100,-100,-100,-97,-98,-99,-99,-100,-99,-100,-100,99,98,100,100,73,100,-97,-35,33,-38,99,-99,-99,-99,-99,-100,-100,-100,-99,-99,99,98,99,-2,100,100,80,100,100,99,100,21,-100,-100,-28,99,-100,-100,-99,-100,99,99,-20,-99,100,23,100,-100,100,100,61,99,-3,-15,99,-100,-100,-100,-100,-100,99,-87,-99,-99,-68,-100,-100,-100,100,100,99,100,85,99,99,-100,-100,-100,-100,-100,-91,-92,-74,17,17,-26,-100,-100,100,99,99,96,46,-4,-100,-100,-100,-100,-100,-86,-81,-59,-61,100,100,100,-100,100,99,99,97,98,-100,-100,-100,-100,-100,-100,0,-97,-97,49,100,-99,-99,-99,-100,100,100,91,21,-21,99,-100,-100,-100,-100,49,96,-23,100,97,-99,99,-56,-100,-13,18,99,99,99,99,100,-100,-100,-100,82,84,100,100,98,99,99,-100,-100,-100,-63,-100,-13,-99,99,99,-100,-100,-100,95,98,100,99,99,99,-100,-100,-99,-100,-25,-100,-19,-99,-99,100,-100,-100,-100,99,100,100,100,-98,-47,-100,-99,-100,-44,97,-4,99,99,99,-100,-100,-100,-100,100,100,100,-97,-96,-100,-98,-100,98,98,96,97,96,97,99,99,-100,-100,-100,100,100,36,37,-98,-96,-95,-34,-18,84,95,95,95,96,85,-75,-100,-100,-100],"ownershipAllowedMAE":0.0234455})%"); + lines.push_back(R"%({"sample":{"board":"............../..OOX........./..OX.X....XOX./..OX......XOX./..........XXO./.OX.......OO.O/..X.......O.O./........X.XOO./..X......X.XOX/.OO........XX./...OO....OO.../..X.XO...OXX../....XO...O..../............../","hintLoc":"null","initialTurnNumber":27,"metadata":"9145BBEF7D2F4DC7561BE28FF472DB78:37","moveLocs":["B2","G6","F1","H8","N2","D10","C10","E10","F11","F10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.88,"xSize":14,"ySize":14},"rules":"koSIMPLEscoreAREAtaxALLsui0button1","komi":7.5,"policyOptimism":0.0,"pda":-1.601,"policyMixture":[3.3e-05,3.47e-05,3.6e-05,3.91e-05,3.69e-05,3.56e-05,3.57e-05,3.54e-05,3.62e-05,3.57e-05,3.62e-05,3.66e-05,3.5e-05,3.32e-05,3.36e-05,4e-05,0,0,0,3.56e-05,3.85e-05,3.94e-05,3.88e-05,3.94e-05,3.59e-05,3.49e-05,3.61e-05,3.61e-05,3.45e-05,4.37e-05,0,0,3.59e-05,0,3.73e-05,5.79e-05,4.18e-05,3.84e-05,0,0,0,3.52e-05,4.85e-05,0.00252,0,0,3.96e-05,0,4.56e-05,0.000108,4.21e-05,3.63e-05,0,0,0,3.81e-05,4.34e-05,0.594,0,0,0,0,0.196,5.97e-05,4.38e-05,4e-05,0,0,0,4.38e-05,3.72e-05,0,0,4e-05,4.61e-05,0.000122,0.000242,5.91e-05,4.47e-05,4.1e-05,0,0,0,0,3.38e-05,4.25e-05,0,3.88e-05,0.000873,0.000859,0.000124,0,4.35e-05,3.83e-05,0,0,0,3.54e-05,3.48e-05,3.6e-05,3.71e-05,0.00011,0.00187,0.000317,0.000361,0.000116,0,3.56e-05,0,0,0,3.42e-05,3.74e-05,5.17e-05,0,0.045,0.0273,0.00155,0,0.000135,3.79e-05,0,3.39e-05,0,0,0,3.9e-05,0,0,9.02e-05,0.000119,0.00263,0.000586,0.000462,0.000181,3.85e-05,3.5e-05,0,0,3.5e-05,4.07e-05,4.36e-05,5.31e-05,0,0,0.117,0.000271,0.000472,5.1e-05,0,0,3.6e-05,3.64e-05,3.43e-05,3.95e-05,3.73e-05,0,4.32e-05,0,0,0.000524,0.000807,4.18e-05,0,0,0,3.19e-05,3.43e-05,3.6e-05,0,3.34e-05,3.64e-05,0,0,0.000748,0.000211,4.07e-05,0,3.79e-05,3.65e-05,0,3.38e-05,3.29e-05,3.43e-05,3.47e-05,3.46e-05,3.97e-05,0,6.89e-05,4.47e-05,3.88e-05,3.58e-05,3.63e-05,3.66e-05,3.49e-05,3.42e-05,3.06e-05],"winrateAvg":0.89268,"leadAvg":4.82686,"scoreMeanAvg":6.04654,"scoreStdevAvg":11.0291,"shorttermWinlossErrorAvg":0.143549,"shorttermScoreErrorAvg":1.70668,"ownership":[42,43,37,-4,-24,-48,-48,-48,-48,-54,-60,-59,-53,-43,40,42,50,51,-73,-57,-54,-49,-39,-60,-63,-49,-48,-33,39,42,50,-68,-63,-78,-44,-34,-27,-42,-85,-48,-50,-23,21,58,49,-68,27,-75,-13,-9,-9,-28,-84,-48,-51,12,0,-54,-47,81,82,82,-9,8,3,7,-85,-85,95,55,-23,-14,-47,16,37,46,53,31,19,33,99,99,96,97,-19,-37,-47,5,20,38,47,86,2,33,99,98,98,94,0,-8,-14,9,17,39,42,1,-79,-29,-80,98,98,61,38,-12,-36,-4,29,59,90,13,-33,-88,-77,-91,98,-71,58,88,87,46,48,50,50,14,-8,-5,6,-90,-90,-70,26,12,34,88,88,55,59,30,27,81,80,29,-86,-85,-17,-48,-63,27,-61,74,49,40,49,81,-87,-88,-87,-87,-58,-64,-60,-61,-64,73,27,34,53,80,42,-79,-89,-87,-58,-59,-59,-58,-44,-44,9,31,57,59,13,-29,-84,-86],"ownershipAllowedMAE":0.055487})%"); + lines.push_back(R"%({"sample":{"board":".................../.............X...../........X......XX../..X.X..XO.....OOX../.......O.......XOO./...........X.O.X.../..............X..../................OO./..............X..X./..O...........O.O../.................../.................../.................../................X../...O.............../...............O.../...O.............../.................../.................../","hintLoc":"null","initialTurnNumber":30,"metadata":"24EB5BF84E4653AB56254934C08C8E14:40","moveLocs":["O10","P9","G16","R3","R8","R9","K13","L4","E11","D9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.84,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.29e-06,4.93e-06,4.66e-06,4.81e-06,4.87e-06,5.01e-06,5.04e-06,4.84e-06,5.05e-06,4.71e-06,4.9e-06,4.66e-06,4.67e-06,4.57e-06,4.8e-06,4.85e-06,4.62e-06,4.7e-06,4.68e-06,4.9e-06,5.18e-06,5.73e-06,5.68e-06,5.92e-06,5.69e-06,5.79e-06,5.77e-06,5.23e-06,6.07e-06,5.96e-06,5.96e-06,5e-06,0,5.04e-06,4.93e-06,4.4e-06,4.73e-06,4.86e-06,4.66e-06,6.48e-06,5.33e-06,5.92e-06,5.83e-06,5.88e-06,5.32e-06,5.3e-06,0,6.84e-06,7.08e-06,6.44e-06,6.36e-06,5.7e-06,6.25e-06,0,0,5.28e-06,4.93e-06,5.41e-06,7.03e-06,0,6.13e-06,0,5.91e-06,0,0,0,1.48e-05,8.08e-06,7.93e-06,8.35e-06,1.02e-05,0,0,0,2.9e-05,6.2e-06,5.24e-06,1.23e-05,9.9e-06,9.39e-06,8.39e-06,8.41e-06,1.47e-05,0,1.61e-05,1.06e-05,8.28e-06,7.39e-06,8.47e-06,1.33e-05,8.94e-06,0,0,0,7.43e-06,5.63e-06,1.57e-05,2.87e-05,1.83e-05,1.83e-05,1.78e-05,1.85e-05,1.26e-05,1.35e-05,1.02e-05,8.71e-06,0,9.79e-06,0,6.06e-06,0,2.63e-05,1.02e-05,6.41e-06,5.82e-06,2.22e-05,0.000121,8.32e-05,3.57e-05,3.68e-05,4.43e-05,0.00021,1.68e-05,0,1.03e-05,1.36e-05,2.48e-05,0.00235,0,9.89e-06,8.97e-05,2.89e-05,6.83e-06,6.07e-06,2.96e-05,0.0584,0.00149,1.64e-05,3.03e-05,0.000244,0.00164,0.000121,1.58e-05,1.99e-05,0.000124,0.00741,2.18e-05,9.22e-06,0.000101,0,0,6.81e-06,6.3e-06,1.93e-05,0.000289,2.23e-05,0,1.82e-05,0.000251,0.000528,0.000381,0.00016,0.000164,0.00125,0.00134,0.000862,0,0.000299,0.0001,0,5.64e-06,5.79e-06,1.68e-05,0,3.01e-05,1.75e-05,0.00469,0.0274,0.00968,0.00102,0.000579,0.000956,0.00163,0.000324,0,0,9.39e-06,0,8.43e-06,6.52e-06,5.63e-06,2.28e-05,1.27e-05,0,0.0718,0.0187,0.00637,0.00122,0.00125,0.000719,0.00044,0.000503,0.000262,0.000432,0,9.32e-06,0,0.00067,6.34e-06,5.35e-06,1.42e-05,7.41e-05,3.38e-05,0.000179,0.000627,0.000474,0.00163,0.0016,0.000754,0.000493,0.00507,0.00227,1.79e-05,2.1e-05,1.64e-05,0,1.15e-05,7.31e-06,5.42e-06,2.09e-05,0.000226,2.88e-05,0.00208,0.000157,0.000301,0.000939,0.00167,0.00236,0.00242,0.00216,0.0168,0.119,0.0408,0.000944,5.74e-06,4.31e-05,5.61e-06,5.55e-06,2.13e-05,0.000217,0.0214,0.0308,0.000266,0.000239,0.000393,0.000442,0.00331,0.00386,0.00243,0.00109,0.0323,0.0141,1.15e-05,0,7.48e-06,6.68e-06,5.8e-06,5.59e-05,0.000287,0,0.000206,5.09e-05,0.000122,0.000185,0.000248,0.000123,0.000151,0.00146,0.00612,0.0054,0.0681,0.0184,1.66e-05,0.0152,6.67e-06,6.36e-06,2.98e-05,0.00418,0.000134,0.000117,5.5e-05,6.88e-05,0.000216,0.000922,0.000153,0,0.00145,0.000274,0.000148,3.57e-05,0,1.3e-05,0.0498,6.77e-06,5.85e-06,3.9e-05,0.00936,0,0.000372,5.84e-05,8.1e-05,0.000158,0.204,6.24e-05,0.000107,5.02e-05,0.0358,0.000109,3.82e-05,9.61e-06,0,1.07e-05,6.76e-06,5.81e-06,1.63e-05,2.91e-05,0.0325,3.51e-05,2.62e-05,1.67e-05,1.94e-05,4.82e-05,0.000138,0.000263,3.15e-05,2.16e-05,1.55e-05,1.46e-05,1.83e-05,1.33e-05,1.13e-05,6.26e-06,4.49e-06,6e-06,6.69e-06,6.85e-06,6.45e-06,6.17e-06,5.84e-06,5.89e-06,6.24e-06,6.71e-06,6.99e-06,6.26e-06,5.8e-06,5.56e-06,5.44e-06,5.65e-06,5.57e-06,6.08e-06,4.58e-06,7.12e-06],"winrateAvg":0.528397,"leadAvg":0.235299,"scoreMeanAvg":0.507756,"scoreStdevAvg":14.5663,"shorttermWinlossErrorAvg":0.0747202,"shorttermScoreErrorAvg":0.647269,"ownership":[-52,-53,-55,-59,-64,-68,-70,-71,-68,-65,-64,-66,-73,-78,-84,-84,-80,-74,-66,-50,-51,-55,-60,-66,-71,-75,-76,-74,-66,-64,-67,-72,-92,-85,-88,-82,-68,-56,-49,-54,-52,-67,-72,-73,-78,-80,-89,-55,-62,-62,-65,-65,-75,-93,-93,-72,-38,-46,-53,-89,-60,-92,-62,-96,-96,-28,-57,-60,-60,-60,-63,-51,-54,-93,-16,-9,-37,-42,-33,-35,-40,-36,-45,-13,-43,-47,-55,-58,-61,-61,-64,-82,69,68,23,-22,-21,-19,-20,-26,-27,-33,-33,-38,-46,-52,-86,-58,-39,-64,-81,10,57,57,-5,-7,-3,-13,-20,-21,-22,-28,-31,-82,-40,-40,-42,-58,-82,-1,24,70,71,11,13,-10,-1,-23,-17,-16,-16,-17,-20,-23,-25,-35,-34,-32,10,89,89,76,28,27,14,-9,-62,-14,-9,-8,-8,-12,-13,-17,-23,-23,-59,-2,75,59,70,39,51,79,16,-6,18,1,-3,-4,-5,-6,-8,-13,-47,93,49,94,82,58,44,49,55,79,4,-2,1,2,1,0,0,2,13,49,93,55,94,37,43,44,47,42,37,22,9,5,4,4,4,4,4,13,21,28,27,-13,19,14,45,46,43,34,17,11,9,7,6,7,7,4,2,-1,11,19,4,-2,4,47,50,49,38,24,16,13,11,10,14,15,9,7,11,22,10,-20,-4,3,50,51,61,89,36,23,17,15,15,18,25,16,16,20,20,27,14,12,12,53,56,59,59,39,23,19,17,17,25,81,32,33,40,45,89,34,20,35,56,58,60,89,30,23,23,18,3,41,42,40,37,45,50,67,89,74,50,56,58,61,54,45,30,25,19,18,27,31,38,40,47,56,65,75,72,64,57,57,55,51,42,31,22,18,18,22,29,33,38,44,53,62,68,70,68],"ownershipAllowedMAE":0.0334298})%"); + lines.push_back(R"%({"sample":{"board":".................../.X.X.O.XXO........./..OX.O.XO.O....OO../..OXX.OXOOX....OX../..O..O.OXO......X../..OXX...X.O....OX../.OX............O.../XOX.....X......XX../.X..........X....X./.X...X.........O.../.OX.OX..........X../O.OO.......O..OOX../.O...O.......OXXO../..O..........XOXO../.X..X........O.XO../...X..X........XO../...........XXXXOX../............OOOO.../.................../","hintLoc":"null","initialTurnNumber":94,"metadata":"F5F19684825E6C5674E2D0E572DD5C06:104","moveLocs":["P5","N6","K3","J5","K7","N10","M11","L6","H4","M2"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.94,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui0","komi":17.0,"policyOptimism":0.0,"pda":-1.924,"policyMixture":[1.2e-05,1.28e-05,1.3e-05,1.31e-05,0.0185,0.000143,4.21e-05,1.31e-05,1.21e-05,3.78e-05,1.46e-05,1.39e-05,1.22e-05,1.23e-05,1.26e-05,1.29e-05,1.31e-05,1.4e-05,1.13e-05,1.19e-05,0,1.21e-05,0,1.27e-05,0,1.43e-05,0,0,0,9.97e-05,1.83e-05,1.59e-05,1.5e-05,1.54e-05,1.44e-05,1.47e-05,1.6e-05,1.37e-05,1.28e-05,1.28e-05,0,0,1.16e-05,0,1.99e-05,0,0,0,0,0.000472,1.49e-05,1.67e-05,1.52e-05,0,0,3.6e-05,1.32e-05,1.26e-05,1.16e-05,0,0,0,4.53e-05,0,0,0,0,0,1.78e-05,2.38e-05,2.32e-05,1.55e-05,0,0,1.49e-05,1.41e-05,1.21e-05,1.16e-05,0,1.22e-05,1.38e-05,0,1.44e-05,0,0,0,2.03e-05,2.37e-05,0.000134,0.000508,1.59e-05,9.67e-05,0,1.4e-05,1.38e-05,1.24e-05,1.45e-05,0,0,0,1.62e-05,0.0013,0.00209,0,0.000169,0,4.24e-05,0.00373,0.00531,1.64e-05,0,0,1.25e-05,1.25e-05,1.37e-05,0,0,1.3e-05,1.38e-05,1.52e-05,1.5e-05,1.47e-05,1.52e-05,1.63e-05,2.57e-05,7.67e-05,0.000102,7.72e-05,1.95e-05,0,1.4e-05,1.29e-05,1.22e-05,0,0,0,1.32e-05,1.57e-05,1.6e-05,1.65e-05,1.56e-05,0,1.68e-05,1.85e-05,1.55e-05,1.65e-05,2.39e-05,2.13e-05,0,0,1.23e-05,1.2e-05,1.35e-05,0,1.44e-05,1.63e-05,1.63e-05,1.64e-05,1.6e-05,1.67e-05,1.64e-05,1.82e-05,1.83e-05,0,0,7.05e-05,0.000144,1.5e-05,1.27e-05,0,1.21e-05,1.44e-05,0,1.58e-05,1.69e-05,2.48e-05,0,1.42e-05,1.77e-05,1.93e-05,2.32e-05,2.17e-05,0.00191,0,0.000924,6.75e-05,0,1.37e-05,1.29e-05,1.25e-05,1.67e-05,0,0,1.39e-05,0,0,1.46e-05,1.96e-05,2.97e-05,0.000172,0.000245,2.21e-05,4.39e-05,9.72e-05,1.86e-05,0.000518,0,1.65e-05,1.45e-05,0,0,0,0,1.65e-05,0.000118,1.82e-05,2.61e-05,4.47e-05,2.34e-05,1.85e-05,0,1.92e-05,0.0473,0,0,0,3.38e-05,1.78e-05,1.14e-05,0,1.08e-05,1.7e-05,0.000186,0,3.41e-05,0.000486,3.13e-05,0,0.00188,2.13e-05,0.000205,0,0,0,0,0.037,1.8e-05,1.36e-05,1.49e-05,0,2.18e-05,2.2e-05,2.04e-05,5.04e-05,0.00013,3.99e-05,0.00301,0,2.68e-05,0,0,6e-06,0,0,1.89e-05,2.88e-05,1.31e-05,0,2.23e-05,1.38e-05,0,1.45e-05,1.56e-05,1.86e-05,0,7.01e-05,8.99e-05,0.354,0.000326,0,0,0,0,2e-05,2.16e-05,1.35e-05,1.54e-05,1.66e-05,0,1.33e-05,1.46e-05,0,0,4.19e-05,0.000117,0.0029,2.59e-05,1.49e-05,1.76e-05,0.052,0,0,0.000229,1.81e-05,1.34e-05,1.55e-05,1.38e-05,1.36e-05,1.39e-05,1.42e-05,1.4e-05,1.47e-05,1.65e-05,0,0.00767,0,0,0,0,0,0,0.0355,1.8e-05,1.29e-05,1.36e-05,1.4e-05,1.42e-05,1.37e-05,1.43e-05,1.52e-05,1.61e-05,1.93e-05,2.31e-05,0.416,0,0,0,0,0,9.56e-05,0.000133,1.36e-05,1.07e-05,1.31e-05,1.25e-05,1.29e-05,1.3e-05,1.3e-05,1.33e-05,1.39e-05,1.41e-05,1.38e-05,1.07e-05,1.15e-05,1.13e-05,1.13e-05,1.15e-05,1.2e-05,1.31e-05,1.39e-05,1.14e-05,1.03e-05],"winrateAvg":0.777016,"leadAvg":2.67996,"scoreMeanAvg":3.64399,"scoreStdevAvg":11.7851,"shorttermWinlossErrorAvg":0.13141,"shorttermScoreErrorAvg":1.07876,"ownership":[-83,-85,-89,-86,-53,39,84,85,90,92,91,84,81,79,82,83,81,73,58,-76,-86,-71,-95,-11,89,85,82,82,98,90,86,79,80,84,89,83,77,30,-76,-76,-69,-94,-35,88,86,81,98,97,98,73,74,74,77,95,95,-2,15,-76,-75,-71,-95,-94,-16,89,81,98,98,52,64,61,59,61,95,-92,-19,-23,-79,-76,-71,-85,1,86,83,87,-68,97,76,46,37,29,42,-2,-92,-81,-43,-79,-82,-73,-96,-96,-6,-8,-8,-71,1,94,25,7,2,26,63,-92,-88,-73,-83,-80,-96,-69,-54,-29,-16,-30,-41,-9,9,-11,-7,10,0,62,3,-90,-84,-90,-80,-95,-26,-40,-31,-30,-33,-82,-24,-14,-27,-29,-31,-29,-97,-97,-93,-91,-82,-94,-55,2,-30,-37,-31,-28,-26,-18,-21,-83,-83,-3,-10,-23,-42,-97,-92,-24,-93,-27,6,2,-85,-35,-23,-20,-8,-3,22,69,17,21,50,16,-84,-88,54,90,-29,54,82,-85,-27,-18,-15,-11,4,28,41,46,39,-27,-91,-86,-73,92,90,93,93,37,-3,-7,-12,-10,-5,25,86,63,58,74,71,-92,-55,-55,79,93,80,48,10,69,8,-16,-13,-59,1,50,55,76,-87,-87,90,-28,-12,20,35,89,27,-2,3,-6,-4,6,7,73,24,76,9,10,-88,91,77,36,-29,-83,-10,-16,-90,-13,-33,-8,56,15,14,-34,4,49,-89,-88,91,76,62,-62,-65,-73,-95,-79,-74,-96,-96,-3,-26,17,-29,-30,-37,-88,-88,90,89,80,-64,-67,-66,-81,-76,-78,-80,-78,-68,-93,-65,-94,-94,-94,-94,98,88,88,86,-66,-65,-70,-70,-76,-76,-75,-71,-67,-57,-35,96,97,97,97,97,94,92,90,-67,-68,-68,-70,-71,-72,-70,-63,-49,-35,11,37,80,89,93,95,95,93,91],"ownershipAllowedMAE":0.0363457})%"); + lines.push_back(R"%({"sample":{"board":"X.XX.............../.XOX....XOOXO..XXO./OOOX....XOXOOO.X.X./..OX.....XXOX.OOXX./..OX.....XO.O..XOO./.OX..X...XO.OO.O.O./.OX.XOXXXO.OXO..OX./.OX..OOX.X......OX./.OX..O.OX.XX.XXXX../.....OOOXXXOXOOOXX./.XX..X.OOO.OX..XOOO/.OO.X..XX.O.XOOXXXO/...OOX...O..X.O..O./....XOX.XO....O.O../...OOOX.XXO.XXX..O./..O.OX..OXO.OOXXXX./...OX.XXXO..OOOXO../..OOX...XO...OX.X../..OXX....O...OXX.../","hintLoc":"null","initialTurnNumber":206,"metadata":"E86A1A616520D838EC8ECE3F477195ED:216","moveLocs":["N12","A9","A10","A8","B10","D8","T5","R5","D9","G7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.83,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,8.34e-05,0,0,7.32e-05,7.55e-05,7.75e-05,7.85e-05,0.000107,0.0592,8.37e-05,9.24e-05,8.83e-05,0.000194,0.000118,8.58e-05,8.64e-05,9.39e-05,8.26e-05,5.88e-05,0,0,0,7.46e-05,7.67e-05,7.65e-05,7.52e-05,0,0,0,0,0,9.98e-05,0.000538,0,0,0,9.4e-05,0,0,0,0,7.47e-05,7.54e-05,7.59e-05,7.57e-05,0,0,0,0,0,0,0.000114,0,5.31e-05,0,9.53e-05,0.00222,9.07e-05,0,0,7.39e-05,7.61e-05,7.6e-05,7.57e-05,7.77e-05,0,0,0,0,8.14e-05,0,0,0,0,0.000154,0.00255,0.00493,0,0,7.93e-05,7.75e-05,7.48e-05,7.6e-05,7.6e-05,0,0,8.42e-05,0,7.15e-05,0.000101,0,0,0,0.000117,0.00213,0,0,8.68e-05,8.45e-05,0,7.87e-05,7.33e-05,7.65e-05,0,0,9.81e-05,0,0,8.71e-05,0,0,0,0.000104,0.000159,0,0,8.74e-05,0,0,0,0,0,0,0.00304,0,0,0,0.000136,9.68e-05,0,0,0.000113,0.000107,0,0,9.64e-05,0.000393,0,0,0,7.44e-05,0,8.56e-05,9.72e-05,0,9.82e-05,9.89e-05,0.000118,0,0,8.2e-05,0.00814,0,0,9.82e-05,8.8e-05,0,0,0,0,7.14e-05,0,0,8.06e-05,0,0,0,0,8.38e-05,9.18e-05,0,0,8.61e-05,9.45e-05,0.000405,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0275,0,0,0,0,0.00567,0,0.000274,0,0,0,0.0121,0,0,0.00146,0.000128,0,0,0,0,0,0,0,0,0,0.134,0.469,0,0,0.00944,0,0.000387,0,0,0,0,0,0,0,7.23e-05,7.18e-05,7.15e-05,0,0,0,0,0.00339,0.011,0,0.00582,0.0476,0,0.000107,0,0.00016,0.00186,0,0.0117,7.18e-05,6.9e-05,7.89e-05,7.74e-05,0,0,0,9.15e-05,0,0,0.00452,0.00423,0.000105,0.000112,0,0.00391,0,0.000121,0.04,7.19e-05,7.09e-05,7.17e-05,0,0,0,0,7.89e-05,0,0,0,0.0551,0,0,0,0.019,0,0,0,7.13e-05,7.2e-05,0,0,0,0,7.76e-05,7.79e-05,0,0,0,0.00939,0,0,0,0,0,0,0.00237,7.11e-05,7.08e-05,7.2e-05,0,0,7.5e-05,0,0,0,0,0.0188,0.000613,0,0,0,0,0,7.92e-05,9.88e-05,7.05e-05,7.08e-05,0,0,0,7.36e-05,7.57e-05,7.66e-05,0,0,0.000813,0.00486,8.53e-05,0,0,7.92e-05,0,7.69e-05,7.74e-05,6.97e-05,7.01e-05,0,0,0,7.44e-05,8.04e-05,8.61e-05,0.000382,0,8.99e-05,9.18e-05,8.61e-05,0,0,0,7.63e-05,7.46e-05,7.22e-05,6.62e-05],"winrateAvg":0.912941,"leadAvg":1.55198,"scoreMeanAvg":1.83854,"scoreStdevAvg":2.94337,"shorttermWinlossErrorAvg":0.146681,"shorttermScoreErrorAvg":0.697424,"ownership":[-97,-97,-100,-100,-100,-100,-99,-99,-87,-84,74,98,86,43,-12,-44,-95,-98,-97,64,-97,100,-100,-100,-99,-99,-99,-100,96,97,97,100,50,3,-99,-99,-97,-97,99,99,100,-100,-100,-99,-99,-99,-100,97,-100,100,100,100,27,-99,-99,-98,-92,99,99,100,-100,-99,-99,-99,-99,-99,-100,-100,100,100,100,100,100,-98,-98,-9,99,99,100,-100,-99,-99,-99,-99,-99,-100,100,100,100,100,99,99,99,99,76,99,99,-100,-95,-96,-100,-100,-99,-99,-100,100,91,100,100,79,100,99,99,37,98,100,-100,-60,-95,100,-100,-100,-100,1,6,90,-98,100,13,54,99,-98,-16,97,100,-100,-44,52,100,100,-100,-100,-100,-56,7,-99,-8,-51,1,97,-98,-78,-61,100,-100,-20,57,100,100,100,-100,-100,-100,-100,-99,-100,-100,-100,-100,-98,-86,-99,-99,-89,-19,18,100,100,100,-100,-100,-100,35,-100,99,99,100,-100,-100,-62,100,-99,-99,-99,-60,-95,18,100,100,100,2,38,-100,-29,99,98,99,99,99,100,100,100,100,-91,-45,-82,-98,-98,78,99,-24,-100,100,100,99,99,98,99,100,100,100,100,100,-55,-34,-68,2,99,65,-64,-100,8,100,99,99,99,98,100,100,100,100,99,100,-100,-81,-100,99,94,-16,-66,-14,99,39,99,66,-26,100,100,100,100,100,100,-100,-99,-100,-100,99,-60,-100,-100,-100,-23,99,99,-91,100,100,100,100,100,-99,-99,-100,-99,-100,100,61,100,100,-100,-100,-100,-100,-90,100,100,100,100,-100,-99,-100,-100,-100,99,99,98,100,100,100,-100,-99,-100,-98,100,100,100,100,-100,-99,-98,-97,-100,99,99,99,99,100,-100,-100,-100,-100,-99,100,100,100,-100,-100,-98,-96,-95,48,99,99,99,99,100,-99,-100,-99,-100,-99],"ownershipAllowedMAE":0.0251792})%"); + lines.push_back(R"%({"sample":{"board":"............O...XX./..OXO.O.OX.OXXX.OXO/..OOXO.....OOOXXXO./..XXXO..X....XOOO../.....XO...X..X...O./.....XO.......X.XO./....X.X.......O..../.....X........XOO../.............O.XO../..X..........XX..../..............OXO../..........XO..OXXX./..O.......OXX.OOOX./..OX...........XXO./....OO.......XXXOO./.OOOXO.......XOXXOO/..XXXOOO...X.OOXOXO/....XXOXX......OOXX/......X..........O./","hintLoc":"null","initialTurnNumber":124,"metadata":"0BE24BB665F44A47BF513CE45FF518B8:134","moveLocs":["J17","M15","M14","M16","O13","P11","Q10","O12","L16","K19"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.32,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.12e-06,3.51e-06,3.98e-06,3.34e-06,0.000246,1.88e-05,3.61e-06,5.08e-06,2.3e-05,0,0.123,5.1e-06,0,0.0118,3.38e-06,3.18e-06,0,0,2.57e-06,3.37e-06,4.85e-06,0,0,0,0.000385,0,0.591,0,0,0.233,0,0,0,0,0.000223,0,0,0,3.41e-06,1.2e-05,0,0,0,0,8e-06,5.35e-06,0,5.32e-06,2.86e-05,0,0,0,0,0,0,0,0.000687,3.57e-06,4.24e-06,0,0,0,0,0.000137,4.36e-06,0,3.8e-06,0,0,3.59e-06,0,0,0,0,0.000842,1.53e-05,3.32e-06,3.85e-06,3.54e-06,3.31e-06,3.29e-06,0,0,4.17e-06,4.08e-06,3.52e-06,0,0,1.3e-05,0,4e-06,3.35e-06,3.47e-06,0,3.11e-06,3.33e-06,3.43e-06,3.44e-06,3.42e-06,3.46e-06,0,0,5.09e-06,4.64e-06,4.67e-06,1.85e-05,0,4.44e-05,4.43e-06,0,3.91e-06,0,0,3.29e-06,3.32e-06,3.52e-06,3.49e-06,3.47e-06,0,3.06e-06,0,4.12e-06,4.57e-06,4.95e-06,4.65e-05,0.0103,0.0199,0,0,3.35e-05,9.77e-05,4.86e-05,3.56e-06,3.32e-06,3.56e-06,3.63e-06,3.44e-06,3.29e-06,0,3.29e-06,3.82e-06,4.38e-06,4.97e-06,9.15e-06,0.000248,9.46e-05,0,0,0,0,4.53e-06,3.63e-06,3.22e-06,3.62e-06,3.62e-06,3.77e-06,3.58e-06,3.66e-06,3.73e-06,4.02e-06,4.42e-06,4.77e-06,7.43e-06,0.000131,0.00469,0,0,0,0,4.56e-06,4e-06,3.37e-06,3.88e-06,0,4e-06,4.1e-06,4.15e-06,4.22e-06,4.34e-06,4.61e-06,4.88e-06,5.47e-06,2.63e-05,3.62e-05,0,0,0,3.81e-06,3.97e-06,3.88e-06,3.47e-06,4.36e-06,4.27e-06,4.65e-06,5.06e-06,4.63e-06,4.57e-06,4.56e-06,4.69e-06,6e-06,0.000517,9.18e-05,7.04e-06,6.37e-06,0,0,0,3.57e-06,3.55e-06,3.39e-06,4.24e-06,4.55e-06,1.41e-05,1.61e-05,6.22e-06,4.77e-06,4.71e-06,4.68e-06,7.79e-05,0,0,2.64e-05,4.42e-06,0,0,0,0,3.23e-06,3.44e-06,3.99e-06,0,2.52e-05,3.51e-05,1.91e-05,5.1e-06,4.72e-06,4.69e-06,1.69e-05,0,0,0,4.27e-06,0,0,0,0,3.38e-06,3.39e-06,3.81e-06,0,0,6.82e-06,4.71e-06,4.43e-06,4.53e-06,4.7e-06,4.59e-06,4.63e-05,4.04e-06,3.8e-06,3.95e-06,3.78e-06,0,0,0,0.000544,3.34e-06,3.74e-06,4.41e-06,1.91e-05,0,0,3.66e-06,4.29e-06,4.6e-06,4.58e-06,4.75e-06,4.44e-06,3.8e-06,0,0,0,0,0,5.79e-05,3.28e-06,0,0,0,0,0,2.89e-06,3.62e-06,4.19e-06,4.78e-06,4.28e-06,4.17e-06,4.16e-06,0,0,0,0,0,0,3.34e-06,4.24e-06,0,0,0,0,0,0,4.91e-06,4.35e-06,3.99e-06,0,4.98e-06,0,0,0,0,0,0,3.78e-06,3.96e-06,3.48e-06,3.31e-06,0,0,0,0,0,3.77e-06,4.17e-06,3.66e-06,4.5e-06,3e-05,4.11e-05,0,0,0,0,3.36e-06,3.52e-06,3.53e-06,3.51e-06,3.16e-06,3.65e-06,0,3.44e-06,3.05e-06,3.53e-06,3.53e-06,3.59e-06,3.78e-06,3.96e-06,3.9e-06,1.17e-05,5.05e-06,0,2.27e-06,3.66e-06],"winrateAvg":0.293488,"leadAvg":-2.12133,"scoreMeanAvg":-3.00949,"scoreStdevAvg":11.6189,"shorttermWinlossErrorAvg":0.294934,"shorttermScoreErrorAvg":2.86929,"ownership":[68,75,86,87,81,73,55,50,21,30,17,23,18,-49,-67,-67,-65,-66,-24,53,77,89,85,86,80,84,1,30,-48,-27,46,-72,-70,-69,-71,-66,-65,85,44,35,89,89,-93,83,35,7,-80,-39,-25,45,47,50,-68,-67,-68,89,83,-6,21,-93,-92,-93,81,26,-10,-81,-58,-83,46,0,-55,94,95,95,90,90,-41,-77,-73,-79,-88,-97,38,-12,-30,-45,-85,47,-22,-55,7,25,52,96,92,-58,-62,-74,-73,-86,-97,37,-24,-24,-33,-57,-82,-37,-24,-45,12,2,96,92,-62,-68,-69,-70,-98,-88,-90,-24,-25,-27,-32,-24,-18,-37,79,28,55,90,86,-62,-67,-68,-57,-63,-96,-39,-27,-19,-19,-18,-4,14,76,74,96,96,87,73,-53,-65,-65,-46,-30,-32,-18,-15,-14,-13,-14,-5,-9,76,77,-92,95,68,37,-29,-47,-85,-24,-15,-14,-11,-10,-9,-11,-15,-23,-41,-93,-92,-91,-3,12,-2,-3,9,1,3,-5,-4,-5,-5,-6,-9,-17,-29,-50,-74,-48,-90,19,-30,-47,34,33,34,10,7,1,2,1,-3,-18,-61,-9,-28,-61,-49,-90,-90,-90,-68,60,65,95,45,16,9,8,8,4,-1,21,-83,-84,-64,-49,-50,-51,-90,-60,72,83,95,14,36,31,17,14,8,-3,-21,-34,-45,-64,-68,-86,-86,94,-48,77,84,79,71,92,92,37,23,10,2,-10,-22,-45,-86,-85,-85,94,95,72,62,95,94,94,-87,92,64,38,18,0,-12,-26,-15,-87,86,-86,-86,94,94,51,6,-86,-87,-86,93,92,92,4,-12,-25,-77,5,86,86,-86,97,95,95,13,-22,-50,-69,-86,-87,92,-80,-80,-43,-36,-27,-4,49,84,97,97,95,95,-14,-41,-53,-65,-77,-78,-80,-73,-62,-50,-41,-27,3,35,69,83,94,97,96],"ownershipAllowedMAE":0.0453497})%"); + lines.push_back(R"%({"sample":{"board":".....XOO.........../..XOX.XOOOO..OX..../..XOX.XOXX.O.OXXXX./..XO...OXOO.XXOOOX./.XOO.XXOXOX.XOO.XO./.OXX.XOXX....XO.XO./.X....OOXXX...XOO../........OOX..X.XO../..........OXXOX..../...O.X.OO.OOOO..X../....OXXX......O..../...OX..OXXX.....X../...OX..OOOX..X.X.../..OX..........X..../..O..XX.O.O.O...O../...O.OX..O...X...../.....OX.XXOO.X.X.../...XOX.......OOX.../....O............../","hintLoc":"null","initialTurnNumber":143,"metadata":"CDCF1CE5A7E71B9C35BE4AB3039DEA8A:153","moveLocs":["N14","O13","M14","R11","G11","F12","F8","E10","D9","G8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.62,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":5.0,"policyOptimism":0.0,"pda":-2.475,"policyMixture":[0.000104,0.000402,0.0126,0.000228,0.000335,0,0,0,8.98e-05,9.49e-05,9.49e-05,9.88e-05,0.000106,0.000614,0.0029,0.000222,0.000175,0.000167,9.52e-05,0.00015,0.000927,0,0,0,0.00112,0,0,0,0,0,0.000105,0.000102,0,0,9.92e-05,0.000166,0.000158,0.000114,0.000173,0.000512,0,0,0,0.00021,0,0,0,0,0.000318,0,0.000211,0,0,0,0,0,0.000103,0.000139,0.00312,0,0,0.000146,0.000207,0.00597,0,0,0,0,0.000202,0,0,0,0,0,0,0.000167,0.000416,0,0,0,0.000133,0,0,0,0,0,0,0.0191,0,0,0,5.88e-05,0,0,0.000131,0.000342,0,0,0,0.000326,0,0,0,0,0.000195,0.052,0,0,0,0,0.000113,0,0,0.000103,0.00014,0,0.000631,0.00103,0.00074,0.0405,0,0,0,0,0,0.000248,0.000285,0,0,0,0,0.000151,0.000133,0.000122,0.000213,0.000736,0.000641,0.00331,0,0.24,0.000121,0,0,0,0.118,0.163,0,0,0,0,0.00157,0.000153,0.000135,0.00163,0.00237,0.000394,0.00153,0.00855,0,0.000103,0.000145,0.000107,0,0,0,0,0,0.000849,0,0.00294,0.000143,0.000133,0.000188,0.000141,0,0,0,0.000139,0,0,0.000114,0,0,0,0,0.000281,0.00631,0,0.000139,0.000126,0.000123,0.000146,0.000116,0,0,0,0,0,0.0204,0.000188,0.000171,0.000137,0.000138,0.00011,0,0.000341,0.00133,0.00155,0.000128,0.000115,0.000128,0.000106,0,0,0,0,0,0,0,0,0.000867,0.0942,0.00118,0.000301,0.00517,0,0.000379,0.000122,0.000107,0.000118,0.000107,0,0,0.0947,0.00061,0,0,0,0,0.000382,0.00653,0,0.000138,0,0.000346,0.000369,0.00012,0.000105,0.000108,0,0,0.00219,0.000242,0.000163,0.000191,0.000114,0.00017,0.00408,0.00194,0.00156,0.0002,0,0.000144,0.000165,0.000191,0.000116,0.000103,0.000107,0,0.000141,0.000207,0,0,0.000141,0,0.000111,0,0.000173,0,0.00349,0.000321,0.000144,0,0.000146,0.000128,0.000101,0.000109,0.000109,0,0.000443,0,0,0.000132,0.000147,0,9.67e-05,0.000131,0.000167,0,0.00013,0.000303,0.000179,0.000276,0.000124,9.58e-05,0.000108,0.000126,0.000256,0.000224,0,0,0.000122,0,0,0,0,0.000346,0,0.00209,0,0.00175,0.00199,0.000129,0.0001,0.000109,0.000127,0,0,0,0.00241,0.00017,0.000133,0.000467,0.000153,0.00114,0.00773,0,0,0,0.0139,0.00932,0.000164,8.43e-05,0.000103,0.000109,0.000122,0,0.00016,0.000118,0.000122,0.000137,0.000145,0.00015,0.000162,0.000169,0.000127,0.000145,0.000779,0.000163,0.000275,9.81e-05,8.49e-05],"winrateAvg":0.00261748,"leadAvg":-12.419,"scoreMeanAvg":-12.5199,"scoreStdevAvg":9.77061,"shorttermWinlossErrorAvg":0.0164879,"shorttermScoreErrorAvg":2.14093,"ownership":[-95,-95,-93,-94,-93,-94,99,99,99,98,95,87,72,53,31,-89,-88,-92,-92,-96,-94,-97,-91,-98,-93,-96,100,99,99,99,95,81,98,-97,-89,-94,-94,-93,-96,-96,-97,-91,-99,-90,-96,100,-96,-96,43,99,93,98,-97,-97,-97,-97,-90,-96,-95,-97,-92,-95,-91,59,99,-97,98,98,90,79,81,95,95,95,-97,-43,-96,-98,-92,-92,-96,-99,-99,99,-97,98,23,83,77,95,94,92,90,91,-21,-97,-96,-99,-99,-81,-99,92,-97,-97,-11,28,82,81,-98,94,93,89,91,40,-88,-99,-47,-31,-40,15,93,92,-97,-97,-97,-61,-66,-98,-98,92,92,85,37,-66,-54,-18,-12,-27,-71,46,90,96,95,-96,1,-1,-98,-97,-98,93,22,13,-38,-23,4,33,-23,-2,93,89,93,94,96,4,4,94,-98,-95,-100,-38,-29,-5,19,33,98,-97,-98,-8,96,96,62,95,96,95,94,18,-6,-99,-91,-60,31,45,59,98,98,-98,-98,-98,-28,-24,6,25,41,52,84,4,-61,-89,-83,56,70,76,98,7,18,-98,86,-95,-95,-94,-15,13,-16,15,-12,-99,-95,-91,76,84,92,99,4,17,-70,86,87,89,-94,-41,-25,-96,-62,-99,-94,-93,-93,86,93,99,0,23,-38,-56,-25,46,67,-29,-20,4,-36,-99,-95,-93,-93,-92,90,94,99,37,-36,-97,-97,6,93,86,95,63,81,11,-85,-93,-88,-90,-91,90,92,93,98,30,93,-97,-15,5,94,92,64,-26,-97,-90,-92,-92,-91,-90,89,89,90,89,87,94,-97,-75,-94,-93,95,95,41,-96,-46,-98,-92,-89,-88,88,87,88,84,92,-30,-26,-75,-75,-4,29,83,68,70,65,-98,-76,-84,-85,87,87,87,88,92,42,-26,-56,-50,-16,40,67,70,47,-26,-41,-72,-78,-82],"ownershipAllowedMAE":0.038767})%"); + lines.push_back(R"%({"sample":{"board":".XOOO......./.XX.OXO...../..XOOOXOOO../..XXOXXOX.../.OXOOXO.O.O./.X.XOX.O.OX./..X.X...OXO./.XXX.X...XOX/.OOOX..XXXX./O..O.X.OXO../.OXOX...O.../OX.OX......./","hintLoc":"null","initialTurnNumber":85,"metadata":"0FF2BFBFD9ABC2B9F7E3F4C353CB824C:95","moveLocs":["M7","A2","B3","G6","L3","L2","H5","H6","G4","G3"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.09,"xSize":12,"ySize":12},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":5.5,"policyOptimism":0.0,"pda":-1.928,"policyMixture":[2.41e-06,0,0,0,0,1.05e-05,3.06e-06,3.27e-06,2.92e-06,2.59e-06,2.63e-06,2.34e-06,2.69e-06,0,0,1.13e-06,0,0,0,2.96e-06,3.07e-06,2.69e-06,2.92e-06,2.66e-06,2.74e-06,2.95e-06,0,0,0,0,0,0,0,0,2.8e-06,2.58e-06,2.76e-06,2.89e-06,0,0,0,0,0,0,0,2.52e-06,2.68e-06,2.58e-06,2.93e-06,0,0,0,0,0,0,2.82e-06,0,2.74e-06,0,2.76e-06,1.2e-05,0,0,0,0,0,0.132,0,0.000257,0,2.94e-06,0,2.32e-05,3.17e-06,0,0,0,0,0,0,0,0,0,0.138,0.00105,0,0,0,0,0,0.00844,0,0.476,0,0,0,3.3e-06,0,0,0,0,2.76e-06,0,0,0,0,0,0.00672,0,0,3.32e-06,0,0.0832,0,0,0,0,0,0,0.113,0,0,0,0,0,0.000117,5.77e-06,0.00197,0,0.0216,0,0.0157,6.62e-06,0,7.47e-06,0,0,3.86e-06,3.32e-06,4.54e-06,7.45e-06,1.09e-05,0.000945,3.42e-06,2.26e-05],"winrateAvg":0.993404,"leadAvg":2.56834,"scoreMeanAvg":2.65507,"scoreStdevAvg":1.94003,"shorttermWinlossErrorAvg":0.0420126,"shorttermScoreErrorAvg":1.0343,"ownership":[-100,-100,98,98,98,98,99,99,99,100,100,100,-100,-100,-100,-58,98,98,99,99,100,100,100,100,-100,-100,-100,98,98,98,-98,100,100,100,100,100,-100,-100,-100,-100,98,-98,-98,100,100,100,100,100,-100,-99,-100,99,99,-98,96,97,100,100,100,99,-99,-100,-100,-100,99,-99,79,100,99,100,99,100,-99,-100,-100,-100,-100,-99,-100,-99,98,-99,99,66,-88,-100,-100,-100,-99,-100,82,97,96,-100,99,-92,-59,99,99,99,-100,-79,82,-100,-100,-100,-99,-95,99,99,99,98,40,-100,-100,-98,-99,-97,-95,-95,98,99,99,98,-99,-99,-99,-99,-96,-97,-97,-95,99,99,99,99,-99,-99,-99,-98,-97,-97,-96,-96],"ownershipAllowedMAE":0.0368092})%"); + lines.push_back(R"%({"sample":{"board":".X...O...X........./X.XOOX..XO....XO.../.XOXOX..XO.O.OXO.../..OXOX.XO.O..OXO.O./..OXO.OX....XXOOOXO/...XO.O.XXXX..XXX../...X...OOOO.XX...X./..X.XXX....XOO.OX../.....O..O.OO..O.OO./.......O.XX......../......XO.XO.XXO.O../......XX.....OX..../.........XOOO...X../.........XXXXOOOO../..XX.X.....O.XXXO../..OX...OOXX..X..X../..OOXXXXOOOOOOXXX../..O.OX.OO...XOX..../...O......OX.X...../","hintLoc":"null","initialTurnNumber":156,"metadata":"9B9264A2222A7E65BE32D003E2C362C2:166","moveLocs":["G19","D19","C19","G18","H19","L19","G17","G10","H11","J10"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.78,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.07e-05,0,0,0,2.05e-05,0,0,0,1.87e-05,0,0,2.26e-05,1.28e-05,1.3e-05,1.32e-05,1.32e-05,1.27e-05,1.28e-05,1.17e-05,0,1.13e-05,0,0,0,0,0,1.53e-05,0,0,0.000193,1.48e-05,0.000111,0.00329,0,0,1.28e-05,1.22e-05,1.27e-05,1.2e-05,0,0,0,0,0,0,1.11e-05,0,0,1.16e-05,0,8.72e-05,0,0,0,1.26e-05,1.3e-05,1.29e-05,1.19e-05,1.19e-05,0,0,0,0,1.13e-05,0,0,1.47e-05,0,0.000254,0.00144,0,0,0,1.29e-05,0,1.57e-05,1.22e-05,1.19e-05,0,0,0,0.00272,0,0,1.49e-05,1.35e-05,1.31e-05,1.23e-05,0,0,0,0,0,0,0,1.2e-05,1.19e-05,1.22e-05,0,0,0.000194,0,0.0108,0,0,0,0,1.07e-05,1.2e-05,0,0,0,1.39e-05,4.58e-05,1.21e-05,1.22e-05,1.24e-05,0,1.22e-05,1.17e-05,0.00021,0,0,0,0,0.000401,0,0,1.26e-05,1.44e-05,1.13e-05,0,1.28e-05,1.26e-05,1.23e-05,0,1.21e-05,0,0,0,1.86e-05,2.4e-05,1.67e-05,1.39e-05,0,0,0,1.53e-05,0,0,1.24e-05,1.4e-05,1.23e-05,1.28e-05,1.29e-05,1.27e-05,1.41e-05,0,6.9e-05,0,0,0.736,0,0,0.000116,1.77e-05,0,1.39e-05,0,0,1.42e-05,1.25e-05,1.29e-05,1.3e-05,1.46e-05,0.000334,0.0939,0,0,0,0,0,0.014,1.21e-05,1.65e-05,0.0123,2.45e-05,1.5e-05,1.36e-05,1.32e-05,1.28e-05,1.32e-05,1.34e-05,1.42e-05,2.57e-05,3.14e-05,0,0,4.96e-05,0,0,1.25e-05,0,0,0,0.00106,0,1.43e-05,1.3e-05,1.3e-05,1.33e-05,1.31e-05,1.37e-05,1.41e-05,1.28e-05,0,0,2.11e-05,2.34e-05,0.0116,1.21e-05,0.00813,0,0,2.24e-05,2.02e-05,1.49e-05,1.35e-05,1.31e-05,1.31e-05,1.31e-05,1.29e-05,1.34e-05,1.31e-05,1.32e-05,1.3e-05,1.25e-05,0,0,0,0,0.000352,0.000328,7.1e-05,0,0.00931,1.56e-05,1.37e-05,1.65e-05,1.26e-05,1.27e-05,1.27e-05,1.31e-05,1.32e-05,1.33e-05,1.27e-05,0,0,0,0,0,0,0,0,8.18e-05,1.91e-05,1.58e-05,0.00062,0,0,1.22e-05,0,1.4e-05,1.38e-05,1.38e-05,1.3e-05,1.23e-05,0,1.22e-05,0,0,0,0,0.00107,1.73e-05,1.4e-05,0.000692,0,0,1.2e-05,1.23e-05,1.28e-05,0,0,0,0,1.28e-05,1.31e-05,0,1.15e-05,1.16e-05,0,3.07e-05,2.35e-05,1.28e-05,1.28e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.33e-05,1.35e-05,1.4e-05,1.35e-05,0,0,0,0,1.54e-05,0,0,1.58e-05,0.0051,4.03e-05,0,0,0,1.15e-05,1.17e-05,1.2e-05,1.2e-05,1.15e-05,1.36e-05,1.29e-05,0,1.35e-05,0.000813,5.25e-05,1.93e-05,1.31e-05,0.0174,0,0,0.0348,0,0.0296,1.22e-05,1.22e-05,1.17e-05,1.16e-05,1.27e-05],"winrateAvg":0.583702,"leadAvg":0.618881,"scoreMeanAvg":0.654385,"scoreStdevAvg":8.45664,"shorttermWinlossErrorAvg":0.363265,"shorttermScoreErrorAvg":2.37076,"ownership":[-99,-99,-99,93,27,22,-94,-94,-8,-19,70,71,83,92,96,97,96,95,95,-100,-99,-99,92,92,-96,-94,-94,-95,93,74,86,89,94,94,99,96,95,93,-99,-99,-96,-99,92,-96,-96,-95,-95,93,90,95,85,96,94,99,95,93,90,-98,-98,-96,-99,91,-96,-37,-97,80,80,94,5,-16,96,93,99,96,95,86,-97,-97,-97,-99,91,-4,95,-97,-77,-5,-9,-40,-95,-95,99,99,99,-11,84,-96,-97,-98,-99,92,69,95,1,-97,-97,-97,-97,-93,-92,-94,-93,-93,-14,-39,-93,-95,-96,-99,-33,-26,46,98,99,99,98,13,-95,-95,-8,-33,-53,-83,-32,-89,-92,-98,-86,-98,-98,-98,-7,72,62,80,16,98,97,56,95,-60,12,10,-84,-86,-81,-75,-53,44,11,-51,92,-82,94,95,70,72,98,92,99,99,55,-80,-82,-79,-73,-61,-51,86,87,89,-88,-87,1,45,37,40,59,78,91,87,-77,-80,-79,-74,-64,-58,-95,88,-34,-90,60,28,10,12,92,86,98,91,89,-74,-78,-78,-74,-69,-66,-95,-95,-52,-34,23,45,28,93,82,90,91,88,85,-68,-76,-78,-74,-70,-62,-41,-27,-46,-97,92,93,94,92,90,88,77,79,74,-57,-80,-79,-76,-71,-61,-24,18,-10,-97,-97,-97,-97,96,96,96,96,86,50,-4,-32,-97,-97,-81,-94,5,42,25,-27,-42,12,-20,-99,-100,-99,96,18,15,36,45,92,-97,-93,-52,34,97,97,-93,-93,-23,29,-99,-99,-99,-100,-28,-39,65,81,92,91,-96,-96,-96,-95,96,96,96,96,96,96,-100,-100,-100,-89,-60,75,89,91,82,84,-96,-5,96,97,95,88,93,-70,95,-100,-98,-95,-88,-82,84,87,88,88,53,-42,-14,37,89,88,88,-68,-72,-95,-95,-96,-95,-92,-86],"ownershipAllowedMAE":0.0368974})%"); + lines.push_back(R"%({"sample":{"board":".................../............X....../.............X.XX../...X.........OOOO../............O....../.................../.............X...../...............X.../.................../.................../.................../...............X.../...............XO../.O..............O../...X..........XO.../..OX......O...XXO../..OX........O.XOXX./..............XOOO./.................../","hintLoc":"null","initialTurnNumber":37,"metadata":"BB1A228410CE39B68C7D94A367C4952B:47","moveLocs":["R8","Q9","H4","C2","B2","B5","C5","C6","D6","C7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.01,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":4.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.7e-06,6.17e-06,6.1e-06,6.12e-06,6.07e-06,5.94e-06,5.94e-06,6.02e-06,6.09e-06,6.05e-06,5.99e-06,5.62e-06,5.54e-06,9.22e-06,9.42e-06,6.2e-06,6.53e-06,7.1e-06,6.19e-06,6.25e-06,7.14e-06,6.97e-06,7.33e-06,7.34e-06,7.14e-06,6.9e-06,6.85e-06,6.82e-06,6.82e-06,6.7e-06,6.37e-06,0,4.76e-05,5.21e-05,2.27e-05,1.35e-05,7.53e-06,6.31e-06,6.11e-06,7.14e-06,4.71e-05,4.03e-05,2.47e-05,3.6e-05,1.23e-05,7.23e-06,7.17e-06,6.87e-06,1.98e-05,2.64e-05,7.76e-05,0,0.000759,0,0,3.45e-05,6.05e-06,6.18e-06,9.35e-06,4.55e-05,0,3.05e-05,2.3e-05,8.68e-06,7.14e-06,7.08e-06,7.67e-06,7.75e-06,6.29e-06,5.36e-06,0,0,0,0,6.36e-06,6.36e-06,6.03e-06,1.4e-05,3.58e-05,3.24e-05,1.52e-05,6.9e-06,7e-06,7.2e-06,7.17e-06,7.38e-06,7.51e-06,6.34e-06,0,4.9e-06,5.2e-06,5.2e-06,5.44e-06,6.69e-06,6.22e-06,6.04e-06,7.89e-06,4.17e-05,2.93e-05,7.66e-06,7.02e-06,7.07e-06,7.19e-06,7.15e-06,7.7e-06,7.95e-06,8.84e-06,6.45e-06,6.66e-06,6.27e-06,6.63e-06,6.66e-06,6.4e-06,6e-06,6.01e-06,6.98e-06,2.65e-05,1.53e-05,7.11e-06,7.02e-06,7.07e-06,7.07e-06,7.23e-06,7.52e-06,7.96e-06,1.61e-05,1.5e-05,0,1.95e-05,9.05e-06,8.69e-06,6.93e-06,6.24e-06,6e-06,6.77e-06,1.34e-05,9e-06,7.03e-06,7.02e-06,7.11e-06,7.05e-06,7.51e-06,7.74e-06,7.43e-06,8.11e-06,1.09e-05,1.08e-05,3.66e-05,0,1.58e-05,6.78e-06,6.09e-06,5.97e-06,6.73e-06,1.31e-05,1.05e-05,7.1e-06,7.09e-06,7.06e-06,7.51e-06,7.64e-06,7.2e-06,7.19e-06,7.34e-06,9.03e-06,2.86e-05,2.54e-05,3.94e-05,3.48e-05,1.28e-05,5.83e-06,6.02e-06,6.68e-06,1.3e-05,1.26e-05,7.61e-06,7.09e-06,7.2e-06,7.44e-06,7.09e-06,7.04e-06,7.13e-06,7.16e-06,7.49e-06,8.6e-06,1.85e-05,2.04e-05,4.07e-05,2.19e-05,6.07e-06,5.86e-06,6.54e-06,1.23e-05,1.18e-05,8.32e-06,6.92e-06,7.07e-06,6.76e-06,6.96e-06,7.04e-06,7.27e-06,7.28e-06,7.72e-06,8.02e-06,6.32e-06,0,2.68e-05,6.41e-06,5.88e-06,5.85e-06,6.59e-06,3.43e-05,9.98e-06,8.12e-06,6.52e-06,6.64e-06,6.87e-06,6.95e-06,7.4e-06,9.61e-06,1.15e-05,8.74e-06,1.69e-05,5.76e-06,0,0,5.42e-06,5.92e-06,5.88e-06,5.49e-05,0,3.97e-05,8.82e-06,7.93e-06,7.1e-06,7.35e-06,7.03e-06,7.98e-06,1.83e-05,2.96e-05,1.98e-05,2.89e-05,6.15e-06,0,0,5.26e-06,5.77e-06,6.38e-06,0,0,0,2.46e-05,7.32e-06,8.62e-06,7.04e-06,6.88e-06,7.3e-06,1.11e-05,2.58e-05,2.21e-05,6.76e-05,4.35e-05,2.13e-05,0,5.27e-06,5.55e-06,0.00243,0,0,0,1.76e-05,7.37e-06,6.63e-06,6.44e-06,6.49e-06,6.39e-06,6.26e-06,6.86e-06,2.88e-05,6.47e-06,0,0,7.45e-06,6.15e-06,5.88e-06,0.00013,0.524,0,0,6.07e-06,1.31e-05,6.3e-06,0,6.3e-06,5.95e-06,0,5.99e-06,6.82e-06,5.83e-06,0,0,0,5.86e-06,5.95e-06,2.06e-05,5.32e-05,0,0,9.92e-06,1.55e-05,1.02e-05,6.53e-06,6.65e-06,6.4e-06,6.35e-06,5.9e-06,0,5.59e-06,0,0,0,0,6.01e-06,6.45e-06,0,0,0.469,2.16e-05,6.5e-06,6.42e-06,6.44e-06,6.25e-06,6.28e-06,6.22e-06,6.29e-06,6.38e-06,6.46e-06,0,0,0,0,5.65e-06,5.59e-06,5.81e-06,0.000167,5.81e-06,5.71e-06,5.95e-06,6.22e-06,6.17e-06,6.16e-06,6.05e-06,6.12e-06,6.08e-06,6.51e-06,6.38e-06,6.45e-06,5.43e-06,5.39e-06,5.82e-06,6.02e-06,4.29e-06],"winrateAvg":0.284668,"leadAvg":-2.13796,"scoreMeanAvg":-3.32842,"scoreStdevAvg":13.8999,"shorttermWinlossErrorAvg":0.0828605,"shorttermScoreErrorAvg":0.778313,"ownership":[-25,-24,-22,-21,-18,-14,-11,-10,-11,-16,-24,-41,-56,-70,-73,-74,-70,-63,-49,-25,-23,-27,-25,-20,-13,-11,-11,-13,-14,-24,-34,-84,-80,-80,-78,-69,-63,-26,-24,-29,-28,-39,-36,-19,-14,-12,-11,-11,-5,-11,7,-83,44,-81,-81,-16,-9,-24,-27,-43,-86,-40,-25,-14,-11,-10,-7,-2,11,30,81,81,81,82,23,22,-21,-26,-36,-35,-23,-18,-12,-10,-8,-7,0,16,75,40,33,33,41,47,32,-16,-15,-17,-19,-14,-11,-8,-8,-8,-8,-7,-17,9,0,0,8,3,19,24,-13,-13,-12,-10,-9,-6,-6,-7,-8,-8,-10,-11,-10,-69,-16,-20,-5,4,9,-13,-13,-12,-9,-6,-4,-4,-5,-6,-7,-9,-11,-16,-28,-34,-78,-29,-6,-3,-17,-17,-13,-9,-5,-3,-3,-4,-5,-7,-8,-9,-13,-16,-31,-34,-14,-1,-7,-23,-21,-18,-9,-3,-1,-2,-3,-4,-5,-6,-9,-14,-19,-30,-45,-14,3,-1,-30,-29,-19,-7,0,0,-1,-3,-4,-4,-5,-8,-11,-18,-38,-90,-43,17,13,-39,-37,-31,-11,4,2,-1,-3,-3,-3,-3,-5,-8,-10,-40,-90,91,39,34,-42,-58,-73,-7,5,0,-4,-3,-3,-1,1,1,-5,-11,-42,-90,91,65,52,-24,-7,-71,39,27,-10,-10,-5,-1,3,7,2,-6,-7,-61,-33,91,79,69,6,-7,85,-39,1,-20,-17,-3,12,11,18,10,8,-21,-83,87,87,76,82,37,33,84,-41,-10,-11,-19,68,33,33,75,24,-2,-27,-82,-82,91,84,85,54,42,87,-39,-9,-8,0,17,33,36,41,32,58,-23,-82,87,83,83,86,63,81,51,51,-7,-2,0,8,19,27,25,30,8,-16,-82,86,85,85,80,67,61,63,34,11,-1,0,8,18,24,24,13,-3,-34,-41,-14,26,51,70],"ownershipAllowedMAE":0.0300279})%"); + lines.push_back(R"%({"sample":{"board":".X.XX......X.XXXXOO/X..X.X....X.X..XOO./XX..XX...XOXXXXXO.O/..X..X.XXXOXOXXOOOX/XXXX.XXOOOOOOOXXOXX/..XX.XOX...O.OOXOOX/.XXX.XO..OXO.OOXXXX/.X..XXOO.OXOOOXX.XX/X.X.XXOOOOO...OOX.O/.X.XXXXOXXO...OXXXX/.X..XO.XXXO....OXXO/XXXX.XX..XO....OOOO/.X...XXXXOO....OO../X.XX.X.XXOO...O.O../.XXOXXXOO..O..OO.../XOOOOOXOOOO.OO..O../XOO...OXOO.O.O.OO../XXXOOOOXX.O.O.OO.../.XXXXO.....O......./","hintLoc":"null","initialTurnNumber":295,"metadata":"EB2E24BC7022782A583E97C4246E4029:305","moveLocs":["L14","G9","R5","pass","K2","pass","J1","pass","H1","pass"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.17,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui1","komi":-10.0,"policyOptimism":0.34,"pda":0.0,"policyMixture":[0,0,0.000857,0,0,0.000864,0.000897,0.000878,0.000886,0.000883,0.000868,0,0,0,0,0,0,0,0,0,0.000883,0.00908,0,0,0,0.000914,0.00107,0.00505,0.000955,0,0,0,0.000465,0.000423,0,0,0,5.45e-05,0,0,0.000877,0.000872,0,0,0.0011,0.00146,0.000874,0,0,0,0,0,0,0,0,4.52e-05,0,0.000872,0.000884,0,0.00088,0.000883,0,0.000899,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000873,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000863,0.000865,0,0,0.000862,0,0,0,0.146,0.0204,0,0,0.00373,0,0,0,0,0,0,0.00086,0,0,0,0.00085,0,0,0.0398,0.0128,0,0.0183,0,0.0042,0,0,0,0,0,0,0.00086,0,0.000849,0.00085,0,0,0,0,0.0122,0,0.0185,0,0,0,0,0,0,0,0,0,0,0,0.000862,0,0,0,0,0,0,0,0.0209,0.00818,0.0258,0,0,0,0.000225,0,0.000863,0,0.000846,0,0,0,0,0,0,0,0,0.00111,0.000891,0.00137,0,0,0,0,0,0.000854,0,0.000875,0.0008,0,0,0,0,0,0,0,0.000957,0.000888,0.000891,0.0261,0,0,0,0,0,0,0,0,0.000483,0,0,0.000321,0.000367,0,0,0.000967,0.000877,0.000889,0.00176,0,0,0,0,0,0,0.000415,0.000388,0.000409,0,0,0,0,0,0,0.000986,0.000882,0.000895,0.0104,0,0,0.00879,0.000921,0,0,0,0,0.00041,0,0,0,0,0,0,0.0242,0.000952,0.00197,0,0.00748,0,0.00108,0.000898,0,0,0,0,0,0,0,0,0,0.0225,0.0243,0,0.0248,0.0237,0,0,0,0.000983,0.000893,0,0,0,0,0,0,0,0,0,0,0,0.0239,0,0,0.0239,0.0112,0,0.000976,0.000886,0,0,0,0.0237,0.0263,0.0237,0,0.0234,0,0,0.0207,0,0.0227,0,0.022,0,0,0.000972,0.000872,0,0,0,0,0,0,0,0.0263,0.0228,0,0,0.0233,0,0.0242,0,0,0.00762,0.000911,0.000871,0,0,0,0,0,0,0.0212,0,0,0.0223,0.0231,0,0.0216,0.00102,0.000987,0.000916,0.00091,0.000871,0.000816,0.000329],"winrateAvg":1.24789e-05,"leadAvg":-11.0687,"scoreMeanAvg":-11.0783,"scoreStdevAvg":0.658745,"shorttermWinlossErrorAvg":0.00199116,"shorttermScoreErrorAvg":0.318339,"ownership":[-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,-100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,100,-100,-100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,100,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-100,-100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,-100,-100,-100,-100,-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100],"ownershipAllowedMAE":0.000543563})%"); + lines.push_back(R"%({"sample":{"board":"..................O/....X.X.....OO...O./...OX.O.XXXXXXOOOXO/..O.XO..XOOOOOXXXX./...OOXO.X..XXX.X.X./...OXXOOXOOOOOXXO../.OOXX.XOX.....OX.../.OX...O.....O.OX.../...........X..O..X./..O.............O../...........X......./...........XO.OO.../..X.....X.XOO..XX../...X...OX.X.X.X..../..OX...O..OX..XO.../.......OXXXOX.O.O../...X.OOXOOOO.XXO.../...X..OX.........../.................../","hintLoc":"null","initialTurnNumber":126,"metadata":"F570CA69303CE51402B383CA345DE43C:136","moveLocs":["M18","Q18","R19","N19","T16","R18","E11","F10","E10","E9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.73,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":4.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.9e-06,2.26e-06,2.13e-06,2.12e-06,2.14e-06,2.26e-06,2.03e-06,2.18e-06,2.13e-06,2.15e-06,2.28e-06,2.21e-06,0,2.35e-06,0.00563,8.62e-05,0,2.84e-05,0,2.21e-06,2.23e-06,2.62e-06,2.52e-06,0,2e-06,0,2.18e-06,2.36e-06,2.17e-06,2.16e-06,0,0,0,1.71e-05,0,0,0,0.0347,2.25e-06,2.43e-06,2.98e-06,0,0,0.00319,0,7.97e-06,0,0,0,0,0,0,0,0,0,0,0,2.1e-06,2.75e-06,0,3.97e-06,0,0,0.0689,4.06e-06,0,0,0,0,0,0,0,0,0,0,0,2.12e-06,2.44e-06,3.3e-06,0,0,0,0,2.51e-06,0,2.47e-06,2.64e-06,0,0,0,2.17e-06,0,2.1e-06,0,1.97e-06,2.08e-06,2.31e-06,7.04e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.2e-06,2.15e-06,2.14e-06,0,0,0,0,3.57e-06,0,0,0,3.58e-06,2.83e-06,3.36e-06,3.03e-06,2.64e-06,0,0,2.46e-06,2.54e-06,2.26e-06,2.14e-06,0,0,3.88e-06,3.83e-06,0.0136,0,0.0147,1.24e-05,7.38e-06,2.74e-05,7.79e-05,0,3.36e-06,0,0,2.9e-06,3.08e-06,2.4e-06,2.3e-06,4.58e-06,0.00029,2.93e-06,0,0.0636,0.142,1.88e-05,4.23e-06,4.95e-06,4.51e-06,0,0.00054,1.89e-05,0,0.00206,2.13e-05,0,2.26e-06,2.36e-06,1.08e-05,0,3.23e-05,0,0,7.47e-06,3.5e-06,3.09e-06,3.08e-06,3.13e-06,4.56e-06,1.32e-05,0.0318,2.26e-05,4.44e-05,0,1.38e-05,2.41e-06,2.36e-06,3.58e-06,5.21e-06,0.363,0,0.245,4.14e-06,2.96e-06,2.73e-06,2.63e-06,2.46e-06,0,6.45e-05,2.25e-05,4.09e-06,7.38e-06,4.45e-05,3.68e-06,2.4e-06,2.43e-06,2.89e-06,2.95e-06,3.02e-06,3.21e-06,3.77e-06,2.98e-06,2.54e-06,2.35e-06,2.18e-06,2.35e-06,0,0,3.7e-06,0,0,4.61e-06,3.75e-06,2.49e-06,2.33e-06,2.57e-06,0,2.43e-06,2.52e-06,2.84e-06,2.76e-06,2.7e-06,0,1.96e-06,0,0,0,6.09e-06,2.87e-06,0,0,3.24e-05,2.92e-06,2.21e-06,2.34e-06,2.31e-06,0,2.25e-06,2.65e-06,2.51e-06,0,0,2.1e-06,0,2.24e-06,0,2.18e-06,0,2.67e-06,3.7e-06,0.000356,6.46e-06,2.19e-06,2.3e-06,0,0,2.31e-06,2.7e-06,2.32e-06,0,2.25e-06,2.14e-06,0,0,2.09e-06,2.09e-06,0,0,3.21e-06,0.000657,4.24e-06,2.16e-06,2.26e-06,2.42e-06,2.33e-06,2.56e-06,2.35e-06,2.17e-06,0,0,0,0,0,0,2.96e-06,0,0,0,2.94e-05,5.33e-06,2.23e-06,2.32e-06,2.18e-06,0,2.29e-06,0,0,0,0,0,0,0,3.26e-06,0,0,0,4.6e-06,0.00553,3.51e-06,2.3e-06,2.38e-06,2.32e-06,0,2.24e-06,3.73e-06,0,0,0.000112,1.39e-05,2.85e-06,3.83e-06,2.87e-06,8.14e-06,0.000144,0.000261,3.09e-05,3.61e-05,3.85e-06,1.86e-06,2.22e-06,2.19e-06,2.29e-06,0.000279,0.00248,4.22e-05,3.55e-06,2.35e-06,2.56e-06,2.68e-06,2.45e-06,2.43e-06,4.71e-06,5.32e-05,2.1e-05,5.45e-06,5.6e-06,1.88e-06,4.97e-06],"winrateAvg":0.173309,"leadAvg":-3.51394,"scoreMeanAvg":-4.81665,"scoreStdevAvg":12.995,"shorttermWinlossErrorAvg":0.200891,"shorttermScoreErrorAvg":2.47401,"ownership":[40,26,14,-31,-47,-70,-80,-85,-86,-80,-80,47,84,83,81,83,82,81,81,49,43,17,55,-87,-80,-89,-82,-91,-91,-88,-98,83,83,83,82,84,86,-34,61,60,61,83,-87,-57,44,-66,-98,-98,-98,-98,-98,-98,84,84,85,-97,-32,73,85,96,26,-87,37,35,-11,-98,85,86,85,84,83,-98,-97,-97,-97,-97,85,90,92,97,96,-43,50,-17,-98,-18,76,-84,-85,-91,-91,-97,-93,-97,-93,91,94,95,97,-45,-45,49,49,-98,87,88,88,88,88,-98,-97,-86,-89,-89,93,98,98,-46,-47,13,10,48,-98,-22,15,28,68,86,89,-97,-91,-88,-81,84,98,-8,-3,-25,-9,54,11,-9,-9,2,7,82,56,88,-97,-35,-71,-60,70,65,26,-8,-63,2,-6,11,-9,-9,-13,-70,-14,12,88,-18,25,-82,-15,46,44,76,-1,-61,48,18,1,-7,-12,-20,-33,0,-21,65,56,75,25,6,17,6,-7,-39,51,-3,15,-1,-11,-18,-36,-85,-23,4,39,51,19,7,5,-14,-15,-22,-7,23,6,4,-7,-33,-45,-71,-86,63,39,80,80,7,-15,-19,-30,-51,-86,-37,-1,3,10,-5,-96,-65,-97,65,63,-5,16,-92,-92,-55,-38,-46,-52,-69,-89,-21,4,25,95,-96,-88,-97,21,-95,-39,-95,-57,-42,-32,-32,-53,-53,-45,-90,-23,4,34,95,11,-91,-90,-95,-91,-75,-95,59,16,-6,2,-56,-56,-51,-62,-8,24,58,95,-92,-92,-92,91,-95,-53,38,41,68,56,24,-62,-63,-67,-86,-8,94,95,87,92,92,93,93,-30,-92,-92,67,57,43,45,-66,-65,-72,-86,0,49,95,86,91,83,70,41,10,-55,-37,30,57,49,48,-69,-70,-73,-61,-28,12,75,88,86,71,49,24,-14,-39,-29,15,43,50,51],"ownershipAllowedMAE":0.0385685})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../.................../.................../.................../.................../.................../.................../","hintLoc":"null","initialTurnNumber":0,"metadata":"938AD468734876994EDCF2928CEED453:3","moveLocs":["Q6","D6","C4"],"movePlas":["B","W","B"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":9},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.7e-06,9.37e-06,9.3e-06,9.67e-06,9.69e-06,9.37e-06,9.42e-06,9.56e-06,9.65e-06,9.7e-06,9.71e-06,9.69e-06,9.57e-06,9.73e-06,9.87e-06,9.76e-06,9.4e-06,9.54e-06,8.57e-06,9.28e-06,1.06e-05,1.33e-05,1.54e-05,1.64e-05,1.59e-05,1.6e-05,1.62e-05,1.66e-05,1.69e-05,1.69e-05,1.69e-05,1.75e-05,2.2e-05,2.76e-05,2.17e-05,1.9e-05,1.36e-05,9.44e-06,9.65e-06,1.64e-05,3.02e-05,1.75e-05,3.67e-05,0.000164,0.000135,0.000101,9.52e-05,0.000123,0.000128,0.000122,0.000152,0.000258,0.000102,0.000183,0.000304,1.97e-05,9.26e-06,1.08e-05,0.000223,4.37e-05,0,1.69e-05,0.000206,0.000161,0.000127,0.000149,0.000178,0.000153,0.000113,0.000106,9.53e-05,6.31e-05,0,0.00032,2.91e-05,9.52e-06,1.07e-05,0.00387,0.000543,3.02e-05,0.000178,0.000104,5.63e-05,5.87e-05,6.87e-05,8.67e-05,7.93e-05,5.86e-05,4.54e-05,4.02e-05,3.6e-05,0.000304,0.000548,8.4e-05,9.7e-06,1.02e-05,2.15e-05,0,0.445,0.0385,0.00029,8.88e-05,9.15e-05,0.000113,0.000141,0.000143,0.000129,0.000115,0.000104,0.000316,0.0112,0.487,7.17e-05,9.4e-06,1e-05,1.78e-05,6.91e-05,0.000219,0.000464,0.00017,0.00011,8.24e-05,8.15e-05,9.01e-05,9.31e-05,9.95e-05,0.000111,0.000145,0.000259,0.00256,0.000982,1.72e-05,8.99e-06,9.99e-06,1.34e-05,1.91e-05,1.89e-05,3.32e-05,1.88e-05,1.65e-05,1.58e-05,1.6e-05,1.63e-05,1.63e-05,1.64e-05,1.65e-05,1.71e-05,1.9e-05,1.64e-05,1.45e-05,1.13e-05,9.44e-06,8.7e-06,9.52e-06,9.37e-06,9.71e-06,9.52e-06,9.2e-06,9.28e-06,9.45e-06,9.73e-06,9.84e-06,9.82e-06,9.71e-06,9.5e-06,9.44e-06,9.57e-06,9.73e-06,9.26e-06,9.31e-06,8.67e-06,9.51e-06],"winrateAvg":0.341792,"leadAvg":-0.79081,"scoreMeanAvg":-1.32895,"scoreStdevAvg":9.21788,"shorttermWinlossErrorAvg":0.0638409,"shorttermScoreErrorAvg":0.349524,"ownership":[0,3,7,10,10,6,1,-2,-4,-4,-4,-4,-6,-10,-13,-16,-13,-11,-7,-5,-2,9,14,13,5,1,-3,-5,-4,-4,-4,-6,-9,-18,-19,-15,-6,-4,-13,-10,5,28,21,11,3,-3,-5,-4,-3,-5,-7,-13,-27,-35,-18,-1,3,-23,-24,-4,73,23,13,1,-3,-4,-3,-4,-5,-8,-19,-31,-81,1,10,11,-38,-39,-49,12,8,4,0,-2,-4,-4,-3,-5,-7,-13,-24,-30,21,22,22,-47,-57,-78,34,1,0,-2,-3,-4,-3,-3,-4,-6,-13,-35,-40,51,37,30,-49,-53,-35,-14,-4,-2,-1,-1,-2,-3,-3,-4,-6,-9,-11,7,37,36,33,-45,-41,-29,-17,-6,-2,-1,-1,-1,-2,-4,-5,-7,-8,-5,8,23,32,31,-40,-34,-26,-15,-7,-3,0,0,-1,-2,-3,-5,-6,-6,-1,9,20,26,28],"ownershipAllowedMAE":0.0767231})%"); + lines.push_back(R"%({"sample":{"board":".................../.OX.X..........OO../.O.XXO..X...OO.XO../.XX.OO.....OX..XO../...XX...X......X.../.OXO.X......X..XOO./.OXO........XO.XOX./..OO.X.....XO..OX.X/..XO.........O.O.X./...OX.......XXO.X../............XO.OX../...OX.......X.O..../...OX.........OX.../..O.OO......X.OX.../..........XXO.OX.../..XX.......O.OOOX../..OX.....XO...XXX../.........X....OX.../.................../","hintLoc":"null","initialTurnNumber":98,"metadata":"B8D39805734D8B7B0A4227E48B520287:108","moveLocs":["O16","N15","O14","O6","M7","O3","P17","O15","P18","K16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxSEKIsui0","komi":61.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.83e-06,6.83e-06,6.69e-06,7.03e-06,7.28e-06,7.45e-06,7.71e-06,8.05e-06,7.91e-06,7.93e-06,8.36e-06,8.89e-06,9.88e-06,9.1e-06,8.53e-06,2.83e-05,8.57e-06,7.81e-06,6.65e-06,6.96e-06,0,0,6.45e-06,0,8.16e-06,9.42e-06,0.000472,6.73e-05,0.000214,0.00216,0.00315,9.4e-06,1.52e-05,0,0,0,3.25e-05,1.83e-05,7.09e-06,0,6.78e-06,0,0,0,1.13e-05,0.000145,0,0.09,0.107,1.51e-05,0,0,0,0,0,0.000121,4.68e-05,6.9e-06,0,0,7.02e-06,0,0,8.43e-06,9.23e-05,0.69,0,3.11e-05,0,0,0,0.000371,0,0,0.000116,0.00026,7.42e-06,7.27e-06,7.43e-06,0,0,7.84e-06,1.05e-05,3.1e-05,0,0.00024,0.000183,3.96e-05,0,0,4.07e-05,0,0.022,7.11e-05,0.000172,6.87e-06,0,0,0,7.02e-06,0,8.24e-06,2.09e-05,1.41e-05,1.8e-05,9.32e-05,1.4e-05,0,0,7.09e-06,0,0,0,0.0357,7.18e-06,0,0,0,6.63e-06,7.29e-06,7.63e-06,8.44e-06,9.06e-06,9.42e-06,1.27e-05,8.72e-06,0,0,1.33e-05,0,0,0,9.93e-06,7.15e-06,7.05e-06,0,0,6.89e-06,0,7.93e-06,8.28e-06,8.12e-06,8.04e-06,7.55e-06,0,0,8.53e-06,1.76e-05,0,0,6.67e-06,0,7.12e-06,7.08e-06,0,0,7.42e-06,7.72e-06,7.51e-06,8.01e-06,7.92e-06,7.67e-06,7.23e-06,7.14e-06,2.47e-05,0,8.01e-06,0,7.46e-06,0,6.47e-06,6.8e-06,7.17e-06,7.56e-06,0,0,7.43e-06,8e-06,8.02e-06,7.85e-06,7.65e-06,7.26e-06,6.9e-06,0,0,0,8.56e-06,0,7.28e-06,7.16e-06,6.99e-06,7.61e-06,0.000121,0.000201,7.3e-06,7.75e-06,7.92e-06,8.02e-06,7.91e-06,7.62e-06,7.11e-06,6.66e-06,0,0,0,0,0,7.12e-06,7.01e-06,7e-06,7.13e-06,8.53e-06,0,0,7.08e-06,8.67e-06,8.12e-06,7.86e-06,7.64e-06,7.1e-06,6.71e-06,0,7.54e-06,0,7.83e-06,6.66e-06,6.71e-06,7.03e-06,6.9e-06,7.8e-06,7.17e-06,0,0,7.46e-06,1.24e-05,7.81e-06,7.77e-06,7.53e-06,7.1e-06,0,6.93e-06,6.19e-06,0,0,6.71e-06,6.62e-06,6.88e-06,6.67e-06,8.59e-06,0,8.41e-05,0,0,8.07e-06,7.68e-06,7.68e-06,7.28e-06,6.76e-06,6.75e-06,0,0,0,0,6.82e-06,6.68e-06,6.91e-06,7.26e-06,1.25e-05,6.49e-06,0.02,7e-06,7.45e-06,1.11e-05,7.66e-06,7.62e-06,7.36e-06,0,0,0,0,0,0,6.73e-06,6.54e-06,6.77e-06,7.16e-06,7.24e-06,0,0,7.15e-06,8.08e-06,7.53e-06,7.74e-06,7.65e-06,8.69e-06,0.0209,0,6.91e-05,0,0,0,0,6.61e-06,6.94e-06,6.89e-06,6.78e-06,0,0,7.05e-06,7.49e-06,7.56e-06,7.48e-06,7.05e-06,0,0,0.000249,7.6e-05,0,0,0,0,6.34e-06,6.69e-06,6.87e-06,6.61e-06,6.5e-06,6.95e-06,7.13e-06,7.16e-06,7.43e-06,7.48e-06,6.74e-06,0,0.000249,0.000504,0.00292,2.52e-05,0,0,6.37e-06,6.15e-06,6.78e-06,6.47e-06,6.97e-06,6.77e-06,6.92e-06,6.84e-06,6.95e-06,6.97e-06,7e-06,6.9e-06,7.02e-06,7.21e-06,7.65e-06,8.06e-06,7.46e-06,7.46e-06,6.83e-06,6.35e-06,6.82e-06,6.54e-06,7.83e-06],"winrateAvg":0.645838,"leadAvg":0.535989,"scoreMeanAvg":1.04435,"scoreStdevAvg":13.3439,"shorttermWinlossErrorAvg":0.213831,"shorttermScoreErrorAvg":1.77578,"ownership":[-88,-90,-91,-93,-90,-84,-76,-63,-36,-4,17,23,21,-21,-42,-7,71,75,74,-86,-84,-95,-95,-97,-79,-78,-78,-47,-12,26,27,41,36,-93,87,87,79,71,-86,-84,-91,-98,-97,-65,-75,-76,-92,48,29,51,70,69,-94,-94,86,81,76,-81,-97,-98,-78,-63,-64,-73,-75,-74,67,37,75,3,-15,-14,-94,86,82,78,-36,49,11,-94,-95,-78,-74,-68,-91,1,12,24,53,49,-36,-94,-51,83,55,45,97,5,99,4,-94,-62,-55,-40,-17,-12,-18,-95,-96,-77,-94,83,84,-15,87,97,28,99,26,-31,-48,-40,-35,-29,-37,-71,-95,43,-36,-94,84,-80,-36,92,94,99,99,38,-82,-43,-36,-34,-34,-40,-88,58,36,23,89,-76,-76,-84,86,89,86,99,20,1,-37,-32,-34,-36,-44,-52,-36,77,76,89,57,-88,-81,77,81,91,99,-54,-19,-25,-29,-34,-37,-43,-57,-98,-98,93,11,-89,-86,-83,65,71,83,42,-5,-20,-22,-31,-33,-37,-41,-59,-97,89,88,93,-89,-85,-85,43,71,81,98,-49,-7,-11,-27,-28,-33,-42,-72,-97,0,97,-50,-72,-82,-84,29,47,81,98,-47,46,-4,-6,-19,-30,-45,-96,-57,40,97,-94,-82,-81,-85,-7,60,96,82,94,93,32,-2,-14,-24,-39,-84,-89,97,97,-94,-88,-88,-88,-24,-22,-2,-41,24,28,-11,-7,-15,-34,-95,-94,93,94,97,-93,-92,-93,-91,-39,-52,-93,-93,-10,5,-10,-20,-23,-45,-37,89,91,97,97,97,-97,-95,-94,-51,-64,-61,-93,-37,-19,-27,-30,-40,-89,84,73,79,97,-97,-97,-98,-96,-94,-57,-58,-72,-70,-59,-37,-38,-45,-56,-88,3,39,37,20,19,-98,-95,-94,-94,-61,-65,-65,-61,-53,-42,-41,-46,-57,-45,-14,21,40,38,-27,-48,-93,-93,-93],"ownershipAllowedMAE":0.038958})%"); + lines.push_back(R"%({"sample":{"board":"................./....XO...X......./....XXO.OX.XXO.../.X.O.O....XO.O.O./.X..X......O.OXO./X.XO.....X....X../.XO..X.X.XO..X.../..X.X......O...../...O....O.XXO..../....OOOO..OOOO.../..OOXXXX.XXXOXO../OOOXO...X..XXXO../XXXXOOOOO..OX..O./XOXX.XOX.OOX.X.../OOOXXOO.OXX.XXO../XXOOXXO.OOXX..O../..OX.X.........../","hintLoc":"null","initialTurnNumber":133,"metadata":"8C7D9D94B14A317C8758112475CB8FB7:143","moveLocs":["E14","G16","E1","K10","G10","D1","G11","G12","E1","G13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.87,"xSize":17,"ySize":17},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.59e-06,7.27e-06,7.6e-06,1.54e-05,2.17e-05,0.00377,2.94e-05,1.25e-05,8.27e-06,7.33e-06,6.88e-06,7.06e-06,7.01e-06,7.86e-06,6.9e-06,6.48e-06,5.85e-06,7.24e-06,9.88e-06,2.57e-05,0.0673,0,0,0,0.0401,2.24e-05,0,8.7e-06,8.93e-06,0.000193,3.67e-05,1.07e-05,6.99e-06,6.34e-06,6.58e-06,1.45e-05,7.74e-05,0.00186,0,0,0,1.34e-05,0,0,1.3e-05,0,0,0,7.86e-06,7.19e-06,6.23e-06,6.28e-06,0,9.13e-06,0,0,0,0.0851,1.6e-05,0.0046,5.14e-05,0,0,7.18e-06,0,8.47e-06,0,5.75e-06,5.97e-06,0,3.82e-05,0.000559,0,0.00272,0,0.000742,0.0012,0.000427,0.18,0,6.34e-06,0,0,0,6.17e-06,0,0,0,0,0.0204,0.157,0,0.00081,1.21e-05,0,4.46e-05,7.53e-06,6.94e-06,7.41e-06,0,7.44e-06,6.42e-06,6.29e-06,0,0,8.36e-05,0.0817,0,0,0,1.6e-05,0,0,7.88e-06,5.09e-05,0,6.9e-06,7.32e-06,6.58e-06,7.17e-06,1.05e-05,0,0.000866,0,0.0293,0,1.16e-05,7.8e-06,0,3.51e-05,0,6.78e-05,9.03e-06,7.72e-06,7.29e-06,6.55e-06,7.11e-06,2.43e-05,7.59e-05,0,7.72e-06,5.67e-06,6.02e-06,6.67e-06,0,1.51e-05,0,0,0,6.66e-06,8.16e-06,7.08e-06,6.47e-06,7.16e-06,9.89e-06,6.43e-06,6.2e-06,0,0,0,0,0.000299,0.0272,0,0,0,0,8.09e-06,7.48e-06,6.22e-06,6.46e-06,6.07e-06,0,0,0,0,0,0,1.14e-05,0,0,0,0,0,0,6.51e-06,6.21e-06,0,0,0,0,0,6.35e-06,6.15e-06,6.76e-06,0,7.2e-06,5.81e-06,0,0,0,0,6.34e-06,6.19e-06,0,0,0,0,0,0,0,0,0,6.47e-06,1.11e-05,0,0,5.8e-06,6.43e-06,0,5.94e-06,0,0,0,0,0.146,0,0,0,5.78e-06,0,0,0,0,0,7.13e-06,6.74e-06,6.11e-06,0,0,0,0,0,0,0,5.82e-06,0,0,0,0,0,0,0,6.3e-06,5.73e-06,0,0,0,0,0,0,0,5.74e-06,0,0,0,0,6.76e-06,8.79e-06,0,5.82e-06,5.94e-06,0.000224,0.000203,0,4.6e-06,0,0,0.146,6.23e-06,5.92e-06,6.33e-06,6.33e-06,6.29e-06,6.76e-06,6.56e-06,6.32e-06,6e-06,5.51e-06,1.09e-05],"winrateAvg":0.646823,"leadAvg":1.1012,"scoreMeanAvg":1.53297,"scoreStdevAvg":10.0293,"shorttermWinlossErrorAvg":0.325875,"shorttermScoreErrorAvg":2.52606,"ownership":[-75,-70,-66,-64,-68,-69,-60,-55,-63,-70,-66,-44,-20,19,44,52,59,-78,-72,-68,-60,-76,-64,-66,-44,-60,-86,-69,-63,-9,21,66,49,62,-84,-75,-67,-54,-76,-76,-37,-46,-30,-86,-63,-78,-78,92,67,61,63,-90,-97,-67,-40,-39,-38,-58,-55,-45,-46,-67,87,-21,93,35,73,62,-95,-97,-72,-62,-84,-66,-95,-66,-53,-61,60,88,66,92,23,72,57,-96,-92,-92,-15,-54,-50,-94,-72,-70,-96,-32,47,55,56,24,48,53,-84,-95,-32,-39,-34,-63,75,-80,-44,-96,63,45,54,23,40,49,51,-50,-55,-79,19,-63,33,76,-10,13,-96,-43,63,41,45,55,56,56,-9,-12,12,87,17,37,53,48,82,-10,-88,-87,89,66,66,65,63,31,19,24,83,88,88,88,88,32,-20,88,89,90,90,74,73,71,63,59,89,89,-83,-82,-82,-82,-61,-99,-100,-100,89,-99,93,83,79,87,88,88,-39,97,39,9,-8,-91,-39,-66,-100,-100,-100,93,86,82,-35,-36,-36,-36,98,99,98,98,98,21,-23,-19,-100,-63,-10,91,82,-37,-32,-37,-38,60,62,99,95,94,94,92,-99,-99,-100,-40,77,81,-36,-35,-34,-37,-38,99,99,97,98,-99,-99,-99,-100,-100,83,80,80,-41,-36,-36,-38,-41,-38,98,95,98,98,-99,-99,-70,-36,82,70,77,-39,-34,-36,-40,-38,-39,52,89,85,6,-15,-80,-59,4,45,68,71],"ownershipAllowedMAE":0.0464279,"maxHistory":3})%"); + lines.push_back(R"%({"sample":{"board":".................../.....X.....OX....../..OOX...O..OX.OXX../..OX...X..OX...OX../...X......OX...X.../..OX....O.OX......./..OX......OX......./...OX...OOX....XX../........XX.....OX../...............O.../................O../..O................/.................../.................../.............O...X./...O.........OXXXO./............XXOOO../............XO...../.................../","hintLoc":"null","initialTurnNumber":61,"metadata":"29BFB647071A36FEE232873638B2F7A1:71","moveLocs":["S3","Q6","S6","S7","R5","Q8","N8","O9","N9","O8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.19,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":7.0,"policyOptimism":0.55,"pda":0.0,"policyMixture":[3.47e-06,3.79e-06,4.06e-06,5.62e-06,4.72e-06,4.14e-06,4.18e-06,4.31e-06,4.2e-06,4.04e-06,4.1e-06,4.88e-06,3.56e-05,4.66e-06,4.45e-06,3.66e-06,3.54e-06,3.54e-06,3.56e-06,3.93e-06,4.38e-06,5.24e-06,2.26e-05,1.29e-05,0,7.26e-06,9.8e-06,5.43e-06,5.19e-06,4.05e-06,0,0,7.83e-06,4.42e-06,4.21e-06,3.91e-06,3.48e-06,3.55e-06,3.89e-06,4.49e-06,0,0,0,8.09e-06,1e-05,1.03e-05,0,4.06e-06,4.02e-06,0,0,9.16e-06,0,0,0,3.68e-06,3.48e-06,4.34e-06,4.21e-06,0,0,1.85e-05,0.000141,6.72e-06,0,4.76e-06,3.73e-06,0,0,0.00562,0.000112,4.62e-06,0,0,3.67e-06,3.44e-06,3.81e-06,5.08e-06,5.99e-06,0,5.21e-06,2.68e-05,5.19e-05,6.15e-06,4.03e-06,3.35e-06,0,0,7.26e-06,6.27e-06,4.73e-06,0,4.18e-06,3.7e-06,3.46e-06,4.12e-06,4.37e-06,0,0,4.78e-06,5.67e-05,1.57e-05,4.8e-06,0,3.28e-06,0,0,4.9e-06,5.35e-06,4.27e-06,4.39e-06,3.95e-06,3.82e-06,3.44e-06,3.7e-06,4.35e-06,0,0,1.55e-05,5.08e-05,7.75e-06,4.84e-06,3.53e-06,3.56e-06,0,0,5.96e-06,4.71e-06,4.42e-06,4.36e-06,4.05e-06,3.83e-06,3.58e-06,3.57e-06,4.91e-06,4.12e-05,0,0,1.67e-05,1.02e-05,6.43e-06,0,0,0,0.0326,8.22e-06,5.3e-06,5.51e-06,0,0,4.06e-06,3.61e-06,3.7e-06,4.51e-06,8.91e-06,7.68e-05,0.0263,8.29e-06,1.14e-05,0.000161,0,0,0.00712,0.000219,0.000325,9.4e-06,4.8e-06,0,0,4.24e-06,3.68e-06,3.71e-06,4.55e-06,5.13e-06,6.27e-06,7.06e-06,8.34e-06,9.71e-06,8.1e-06,6.51e-06,5.98e-06,2.39e-05,0.000139,0.0639,0.106,4.17e-06,0,4.43e-06,4.86e-06,4.04e-06,3.66e-06,4.65e-06,4.68e-06,6.05e-06,6.87e-06,8.05e-06,9.82e-06,1.29e-05,3.75e-05,4.71e-05,3.93e-05,5.28e-06,0,0,5.83e-06,5.52e-06,0,6.81e-06,4.83e-06,3.88e-06,4.53e-06,0,5.55e-06,7.05e-06,7.98e-06,9.22e-06,1.77e-05,3.88e-05,4.2e-05,6.47e-05,5.54e-06,0,0,7.97e-06,0,0.000168,0.0445,5.36e-06,3.82e-06,4.91e-06,5.07e-06,5.81e-06,7.08e-06,7.7e-06,8.7e-06,1.34e-05,3.04e-05,4.48e-05,4.87e-05,6.35e-05,0.0944,0.537,0.016,6.23e-06,0.004,0,1.66e-05,3.84e-06,5.56e-06,6.76e-06,7.33e-06,7.03e-06,7.64e-06,8.26e-06,1.06e-05,2.47e-05,4.22e-05,6.83e-05,0.000542,0.00763,9.52e-06,5.65e-05,0,0.00424,0,4.92e-06,3.96e-06,6e-06,8.97e-06,6.88e-06,7.17e-06,7.77e-06,8.52e-06,1.1e-05,2.64e-05,4.8e-05,9.2e-05,0.0127,5.72e-06,0,4.77e-06,0.0156,0,0,1.24e-05,3.99e-06,6.32e-06,7.79e-06,0,7.68e-06,2.82e-05,1.64e-05,2.29e-05,4.91e-05,0.000363,0.000124,0.0135,9e-06,0,0,0,0,0,3.77e-06,3.84e-06,5.82e-06,1.08e-05,1.63e-05,4.64e-05,5.77e-05,4.19e-05,3.97e-05,8.07e-05,0.00277,0.000582,3.24e-05,0,0,0,0,0,0,3.44e-06,3.87e-06,5.1e-06,6.37e-06,7.76e-06,1.03e-05,8.99e-06,8.13e-06,8.44e-06,1.17e-05,2.92e-05,7.18e-05,7.33e-06,0,0,4.75e-06,4.15e-06,3.58e-06,3.72e-06,3.58e-06,3.4e-06,3.92e-06,3.97e-06,4.19e-06,4.22e-06,4.13e-06,4.14e-06,4.1e-06,4.22e-06,4.37e-06,4.63e-06,4.5e-06,4.64e-06,4.44e-06,4.87e-06,4.31e-06,3.81e-06,3.83e-06,3.64e-06,4.03e-06],"winrateAvg":0.465122,"leadAvg":-0.249199,"scoreMeanAvg":-0.414043,"scoreStdevAvg":12.1321,"shorttermWinlossErrorAvg":0.134776,"shorttermScoreErrorAvg":0.982295,"ownership":[41,27,-6,-15,-47,-52,-36,1,26,35,35,26,18,-67,-76,-86,-90,-92,-94,55,33,61,-31,-48,-80,-31,-2,54,29,46,76,-87,-72,-80,-88,-95,-94,-95,64,69,76,76,-84,-55,-34,3,83,66,75,77,-88,-77,-67,-99,-99,-97,-95,74,72,77,-86,-71,-44,-36,-63,4,51,92,-94,-80,-80,-82,-82,-99,-97,-94,75,85,-67,-86,-46,-30,-3,-4,17,47,91,-94,-73,-73,-74,-98,-93,-93,-92,74,82,88,-86,-40,-12,4,20,86,74,91,-94,-61,-62,-67,-73,-89,-91,-88,69,78,88,-85,-50,-17,2,19,47,83,91,-94,-42,-50,-62,-73,-89,-90,-84,60,62,70,78,-69,-31,-3,14,87,87,-64,-30,-33,-41,-51,-98,-98,-91,-77,51,55,47,31,28,-3,-8,8,-59,-58,-17,-17,-24,-36,-49,-20,-98,-79,-67,45,46,38,26,14,1,-1,-8,-9,-9,-3,5,-15,-46,-45,-23,-55,-59,-54,43,48,36,22,12,6,3,1,-1,2,5,12,58,-83,-58,-57,-21,-42,-38,43,50,78,20,14,8,5,4,6,7,12,18,59,-82,-50,-86,-58,-29,-18,38,42,32,22,14,10,7,5,6,7,9,22,4,21,-29,-49,-33,-55,4,33,34,32,27,18,12,9,7,7,7,5,5,0,6,-19,-75,-32,67,40,29,33,43,39,27,17,13,10,9,7,3,5,15,62,18,-17,60,56,77,24,25,43,85,37,24,17,13,11,12,0,9,2,60,-22,-24,-23,95,84,18,22,10,32,33,27,21,17,13,11,1,-4,-46,-45,95,95,95,95,91,18,13,18,18,23,19,19,16,9,3,-14,-21,-46,15,13,80,90,91,91,16,15,14,17,19,19,17,14,7,-3,-12,-22,-19,-7,33,69,86,88,90],"ownershipAllowedMAE":0.0291972})%"); + lines.push_back(R"%({"sample":{"board":"...OX.O.OX.XO.O.X.O/..O.OXXO.OXXXOO.XO./XOOOX.O.O.OXXOXXXXO/XXOXOOO..OOOXXO.OOO/..XXXOOX...XOOOOOXO/..OOXXXOO...O.OXXX./..OXX.XXO..O.OO..X./.O.OOX.XO..OXOXOOX./..OXO.X..X...XXXX../.....OOOO..XXX..OO./..X.X...XOXXOOOO.../OXX...XO..XO.OX.OX./...O.OX...XOOX.XOX./.XXO.....X.XOOXO.OX/.OOXX.....X.OXX.OX./.OX....X..XO.OX.XX./.OX.X....XOO.OXOX../..X......XXOO.OX.../..............OX.../","hintLoc":"null","initialTurnNumber":228,"metadata":"B80BD87CEC41696A8B2CC1E929CA7F4E:238","moveLocs":["M5","F17","N4","P7","F11","Q8","E10","B14","C12","B15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.38,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui1","komi":12.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.11e-05,1.98e-05,2.1e-05,0,0,1.83e-05,0,0,0,0,1.76e-05,0,0,0.0283,0,0.00186,0,0.00118,0,2.61e-05,2.06e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00198,0,0,0,0,0,0,0,0,0,0,2.13e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.1e-05,2.03e-05,0,0,0,0,0,0,1.98e-05,0,0,0,2.19e-05,0,0,0,0,0,0,0,1.97e-05,1.96e-05,2.01e-05,0,0,0,0,0,0,0,0,2.16e-05,0,0,0,0,0,0,0,0,1.9e-05,1.91e-05,2.05e-05,0,0,0,0,0,0,2.18e-05,2.23e-05,2.09e-05,0,0,0,1.97e-05,0,0,0,1.92e-05,1.97e-05,0,2e-05,0,0,4.36e-05,2e-05,0,2.07e-05,2.09e-05,0,0,3.9e-05,2.29e-05,0,1.96e-05,0,0,2.28e-05,2.06e-05,0,0,0,0,0,0,0,2.18e-05,2.24e-05,0.0002,0,0,2.1e-05,0,0,2.97e-05,0.936,0,2.55e-05,2.25e-05,2.17e-05,0,0,0,0,2.14e-05,2.25e-05,2.1e-05,6.64e-05,0.00015,2.07e-05,0,0,0,0,0,6.38e-05,1.97e-05,0,0,0,2.1e-05,2.29e-05,0,0,2.61e-05,1.98e-05,2.09e-05,0,2.09e-05,0,2.1e-05,2.24e-05,2.5e-05,0,0,0,0,0,0,0,0,2.06e-05,2.47e-05,2.1e-05,0,0,0,2.03e-05,2.06e-05,2.05e-05,0,0,2.2e-05,2.73e-05,0,0,0,0,0,0,0,0,1.97e-05,2.05e-05,1.89e-05,2.07e-05,0,2.06e-05,0,0,2.1e-05,2.12e-05,2.14e-05,0,0,0,0,0,0,0,0,2.2e-05,2.08e-05,0,0,0,2.01e-05,1.94e-05,2.08e-05,2.07e-05,2.11e-05,0,2.06e-05,0,0,0,0,0,5.61e-05,0,0,2.06e-05,0,0,0,0,2.03e-05,2.04e-05,2.04e-05,2.03e-05,2.03e-05,0,0,0,0,0,1.68e-05,0,0,2.12e-05,2.02e-05,0,0,2.05e-05,2.03e-05,1.98e-05,2e-05,0,1.98e-05,2.01e-05,0,0,0,0,0,2.57e-05,0,0,1.84e-05,2.02e-05,0,0,2.03e-05,0,1.99e-05,1.98e-05,1.96e-05,1.96e-05,0,0,0,5.53e-05,0,0,0,0,1.99e-05,2.15e-05,2.01e-05,2e-05,0,2.02e-05,2.03e-05,2.01e-05,1.99e-05,2e-05,2e-05,0,0,0,0,0.0232,0,0,2.01e-05,2.01e-05,2.01e-05,1.96e-05,1.99e-05,2.07e-05,1.98e-05,2.02e-05,1.99e-05,2.01e-05,2.01e-05,2.05e-05,2.1e-05,2.12e-05,0.000396,0.000417,0.00288,0,0,2.02e-05,2.15e-05,2.19e-05,2.15e-05],"winrateAvg":0.638435,"leadAvg":0.542,"scoreMeanAvg":0.722888,"scoreStdevAvg":4.33346,"shorttermWinlossErrorAvg":0.424615,"shorttermScoreErrorAvg":1.54988,"ownership":[99,99,99,100,99,99,100,99,100,93,92,88,88,88,85,84,81,87,95,98,99,100,100,100,99,99,100,99,100,90,88,87,86,85,83,81,94,95,97,100,100,100,100,100,100,99,100,99,100,89,87,86,80,81,82,83,100,97,97,100,-100,100,100,100,98,98,100,100,100,89,88,100,93,100,100,100,98,99,-100,-100,-100,100,100,97,97,94,94,91,100,100,100,100,100,-97,100,95,98,98,98,-100,-100,-100,98,98,90,90,95,100,100,100,-97,-97,-97,12,93,96,98,-100,-100,-100,-100,-100,98,67,52,100,66,100,100,77,-16,-97,-50,82,97,31,27,-68,-100,-100,-100,98,-54,4,100,-70,100,-100,76,74,-97,-66,53,43,88,-93,-86,-100,-100,-97,-98,-98,46,26,-72,-100,-100,-100,-100,-86,-19,20,14,-44,-64,-100,-93,-93,-94,-93,-96,-66,-100,-100,-100,-25,14,100,100,55,-29,-50,-100,-87,-100,-96,-96,-95,-98,-95,-100,-100,100,100,100,100,90,34,70,-35,-100,-100,-97,-98,-98,-100,-95,-96,-97,-100,100,100,100,100,100,100,-39,20,-84,-93,-95,-95,-97,-96,-100,-97,-97,-98,-100,100,100,100,100,96,100,-40,-36,-92,-98,-98,-95,-98,-98,-98,-98,-98,-100,-99,-100,100,100,-87,96,83,78,-62,-93,-91,-93,-100,-100,-98,-99,-98,-98,-99,-100,-100,100,-87,-87,34,88,-86,-58,-93,-92,-100,-99,-99,-99,-99,-100,-99,-99,-100,97,97,97,-86,-86,-86,-86,-78,-95,-92,-100,-99,-100,-99,-99,-99,-99,-100,97,97,96,97,-85,-83,-87,-82,-79,-96,-96,-100,-99,-99,-99,-99,-99,-99,-100,-100,97,97,94,95,-84,-72,-72,-78,-98,-98,-99,-99,-99,-99,-99,-99,-98,-95,-7,8,93,93,95,-80,-76,-74,-76],"ownershipAllowedMAE":0.0383047})%"); + lines.push_back(R"%({"sample":{"board":"................XX./............XX..OXO/..XXXX.....OOOXXXO./..O.OO.O..X.XXOOO../...O..O.....XO...../....X.....X.XO...../...O.......OOXO..../..XXX........XO..../.............XO..../.............XO.X../.............XO..../................O../.................../..OO...........XX../..XO.O.........XO../..XXXO......O...O../...XO..O...OXOX..../...XO............../.................../","hintLoc":"null","initialTurnNumber":78,"metadata":"761ACFBDAC0683E4B5199D36C5582F1B:88","moveLocs":["D16","E15","C15","O8","F14","H13","L13","H11","Q8","M11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.62,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui1","komi":5.5,"policyOptimism":0.0,"pda":-1.072,"policyMixture":[1.02e-05,1.15e-05,1.12e-05,1.13e-05,1.14e-05,1.2e-05,1.19e-05,1.18e-05,1.21e-05,1.25e-05,1.22e-05,1.15e-05,1.12e-05,1.08e-05,1.13e-05,1.11e-05,0,0,8.33e-06,1.1e-05,1.08e-05,1.12e-05,1.1e-05,1.15e-05,1.24e-05,1.42e-05,1.66e-05,1.71e-05,1.69e-05,1.46e-05,1.42e-05,0,0,1.1e-05,1.11e-05,0,0,0,1.14e-05,1.19e-05,0,0,0,0,1.97e-05,1.58e-05,3.36e-05,2.13e-05,1.97e-05,0,0,0,0,0,0,0,1.29e-05,1.17e-05,1.44e-05,0,0,0,0,1.11e-05,0,1.73e-05,1.67e-05,0,1.3e-05,0,0,0,0,0,0.00163,1.19e-05,1.15e-05,1.51e-05,0,0,0,1.27e-05,0,1.34e-05,0.0227,1.45e-05,1.26e-05,1.18e-05,0,0,3.55e-05,1.48e-05,2.47e-05,0.000348,1.18e-05,1.17e-05,1.65e-05,1.71e-05,0.00347,0,0,0.000103,4.57e-05,0.00102,1.41e-05,0,5.57e-05,0,0,0.00709,0.000102,5.63e-05,4.5e-05,1.18e-05,1.22e-05,1.4e-05,1.4e-05,0,1.26e-05,1.38e-05,2.51e-05,0,0.00292,1.56e-05,0,0,0,0,0,1.54e-05,0.000782,2.29e-05,1.23e-05,1.27e-05,1.4e-05,0,0,0,1.63e-05,0.0424,0.152,0.0399,0.00493,0.0666,0.000779,1.33e-05,0,0,1.38e-05,7.49e-05,1.94e-05,1.2e-05,1.25e-05,1.53e-05,1.28e-05,1.2e-05,1.34e-05,2.06e-05,4.19e-05,0,0.000993,0.00207,0.14,0,1.58e-05,0,0,1.25e-05,1.77e-05,2.14e-05,1.23e-05,1.26e-05,1.78e-05,1.91e-05,1.85e-05,2.1e-05,5.54e-05,0.000103,0.000152,0.000127,0.00168,0.00922,0.167,1.29e-05,0,0,1.2e-05,0,1.62e-05,1.28e-05,1.27e-05,2.15e-05,6.25e-05,5.73e-05,8.3e-05,0.000157,9.9e-05,7.15e-05,4.82e-05,2.87e-05,3.13e-05,0.132,0.00255,0,0,0.000466,3.67e-05,1.67e-05,1.29e-05,1.29e-05,2.19e-05,4.05e-05,6.96e-05,5.98e-05,8.9e-05,5.87e-05,3.51e-05,2.75e-05,2.21e-05,1.96e-05,2.69e-05,0.0144,0,0.091,0,0,6.45e-05,1.32e-05,1.22e-05,1.72e-05,1.46e-05,1.49e-05,2.22e-05,0.00596,5.58e-05,2.42e-05,2.28e-05,2.17e-05,2.09e-05,2.66e-05,6.35e-05,2.45e-05,1.65e-05,1.43e-05,1.99e-05,2.1e-05,1.33e-05,1.34e-05,2.76e-05,0,0,1.98e-05,0.000171,5.29e-05,2.12e-05,2.19e-05,2.13e-05,2.13e-05,3.15e-05,7.81e-05,9.35e-05,1.47e-05,0,0,3.86e-05,1.51e-05,1.44e-05,1.75e-05,0,0,0.000195,0,1.83e-05,2.05e-05,2.12e-05,1.99e-05,2.01e-05,2.53e-05,6.57e-05,0.00607,1.72e-05,0,0,2.38e-05,1.35e-05,1.38e-05,1.28e-05,0,0,0,0,2.37e-05,9.15e-05,2.07e-05,2.01e-05,2e-05,1.69e-05,0,6.29e-05,0.00114,0.000114,0,1.3e-05,1.33e-05,1.22e-05,1.32e-05,9.22e-06,0,0,0.00015,0.000141,0,6.32e-05,1.79e-05,1.84e-05,0,0,0,0,0.000173,5.61e-05,1.49e-05,1.31e-05,1.3e-05,1.39e-05,1.23e-05,0,0,4.07e-05,0.000119,2.37e-05,1.6e-05,1.67e-05,1.52e-05,1.39e-05,0.0705,3.64e-05,0.00114,0.000441,3.76e-05,1.69e-05,1.34e-05,1.05e-05,1.31e-05,1.2e-05,1.48e-05,1.8e-05,1.51e-05,1.27e-05,1.17e-05,1.21e-05,1.18e-05,1.17e-05,1.12e-05,1.16e-05,1.15e-05,1.3e-05,1.3e-05,1.34e-05,1.3e-05,1.05e-05,1.28e-05],"winrateAvg":0.786968,"leadAvg":3.9826,"scoreMeanAvg":5.67294,"scoreStdevAvg":15.6629,"shorttermWinlossErrorAvg":0.136541,"shorttermScoreErrorAvg":1.6273,"ownership":[-84,-85,-84,-78,-64,-44,-16,0,-6,-24,-47,-65,-77,-87,-90,-91,-93,-93,-62,-84,-85,-88,-88,-82,-56,-18,-1,-4,-29,-52,-70,-94,-93,-91,-92,-90,-93,-1,-81,-84,-94,-94,-94,-94,-6,21,-3,-31,-61,-52,-52,-51,-93,-93,-93,3,-7,-69,-82,-65,-94,69,69,32,73,19,-16,-84,-67,-86,-87,83,83,83,-3,23,-54,-43,-64,69,70,21,76,46,-9,-12,-43,-48,-86,81,76,67,60,63,36,-37,-34,13,5,-57,-57,20,40,8,-18,-81,-18,-86,80,64,61,60,47,47,-38,-38,-22,22,-21,-8,27,79,15,-10,-81,44,44,-8,92,60,47,46,42,-38,-53,-81,-81,-81,-13,0,27,9,-6,2,15,25,-5,92,54,40,37,34,-29,-29,-35,-32,-21,5,20,79,25,15,-2,61,25,-3,92,44,29,29,19,-11,-13,-8,-7,-4,6,13,28,20,12,15,6,19,-2,92,35,-23,3,4,9,4,-4,0,0,1,13,19,17,14,12,2,32,-4,92,12,7,-4,-8,29,17,13,10,12,11,16,17,18,17,18,19,31,78,2,-45,22,-8,-19,45,52,43,31,22,14,19,20,21,21,20,20,24,32,7,-25,-36,-39,-28,43,65,88,87,49,33,25,26,26,25,23,19,15,1,-16,-75,-74,-23,-25,8,-10,-63,88,-2,92,40,38,33,31,29,28,20,-7,-25,-75,23,-6,-8,-27,-49,-62,-62,-62,93,58,44,42,38,36,45,83,20,-8,-38,24,12,1,-46,-47,-52,-62,83,78,70,91,51,49,49,81,37,71,-47,-12,0,11,8,-50,-47,-48,-63,83,60,58,71,63,57,55,59,41,42,-6,-8,9,12,10,-50,-51,-52,-19,9,40,52,60,60,56,54,51,43,27,5,-2,5,11,11],"ownershipAllowedMAE":0.0479177})%"); + lines.push_back(R"%({"sample":{"board":"..............O..O./..........XO.OXO..O/...OOO.X.OX.OXXOO../...O.O..X.X.OXXX.X./..OXO.OX..X..O..X../...XOOX..XOOO.X..../....XXX..XXO.X.XOO./..........XOOXX.XX./.........OOXXOOXXX./.....O....X.XOOOOXO/...........XOOXXXO./.OO.O.X.......X.XO./.X...........O.XO../.OXX.............../XXOX.OX............/.OOXO.OO........X../.OXO.OX......X...../.XX.OO............./.................../","hintLoc":"null","initialTurnNumber":13,"metadata":"8588C1B37541177368E8B9E325934F6F:23","moveLocs":["R6","M10","M3","O5","P4","L3","M4","D13","D12","C13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.97,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxSEKIsui0","komi":21.5,"policyOptimism":0.0,"pda":-2.494,"policyMixture":[4.32e-05,4.66e-05,4.67e-05,5.38e-05,5.92e-05,5.98e-05,5.84e-05,5.94e-05,5.46e-05,5.25e-05,5.72e-05,5.94e-05,7.79e-05,0.00109,0,0.00424,5.09e-05,0,0,4.68e-05,4.79e-05,5.1e-05,5.06e-05,5.45e-05,6.36e-05,0.000291,6.36e-05,5.66e-05,5.44e-05,0,0,0.000608,0,0,0,5.14e-05,6.94e-05,0,4.52e-05,4.85e-05,4.95e-05,0,0,0,5.58e-05,0,5.31e-05,0,0,5.28e-05,0,0,0,0,0,0.000239,5.08e-05,4.58e-05,4.97e-05,4.72e-05,0,0,0,6.13e-05,5.45e-05,0,5.39e-05,0,4.82e-05,0,0,0,0,5.27e-05,0,5.18e-05,4.72e-05,5.36e-05,0,0,0,0,0,0,5.18e-05,5.17e-05,0,9.95e-05,7.12e-05,0,5.37e-05,5.12e-05,0,4.82e-05,5.3e-05,4.93e-05,7e-05,5.85e-05,0,0,0,0,5.93e-05,5.77e-05,0,0,0,0,5.39e-05,0,4.8e-05,4.84e-05,5.24e-05,4.82e-05,5.16e-05,6.46e-05,0,0,0,0,0,6.46e-05,6.31e-05,0,0,0,4.78e-05,0,4.28e-05,0,0,0,4.72e-05,5.25e-05,6.79e-05,0.537,0,0.000255,6.64e-05,7.89e-05,0.00018,0.000132,6.49e-05,0,0,0,0,0,4.82e-05,0,0,4.59e-05,5.76e-05,8.32e-05,0.000457,0.00035,0.234,0.0048,0.00318,0.0128,0.00115,0,0,0.000172,5.77e-05,0,0,0,0,0,4.74e-05,6.78e-05,0.000118,0.000221,0.000674,0.00179,0,0.00331,0.00367,0.00157,9.97e-05,0,0,9.72e-05,0,0,0,0,0,0,6.65e-05,0.000172,8.16e-05,0.000462,0.00138,0.00396,8.14e-05,0.000418,0.00026,8.11e-05,7.37e-05,0,0,0,0,0,0,0,4.84e-05,8.36e-05,0,0,9.45e-05,0,0.000197,0,7.51e-05,0.000173,0.000161,9.2e-05,0.000358,7.53e-05,0.0232,0,4.37e-05,0,0,4.8e-05,5.84e-05,0,7.04e-05,0.00031,0.00058,0.00011,7.84e-05,8.14e-05,0.000142,0.000238,0.000393,0.0542,0.000331,0,6.54e-05,0,0,5.63e-05,4.67e-05,6.91e-05,0,0,0,7.23e-05,0.000513,9.33e-05,8.1e-05,0.00016,0.000277,0.000501,0.0265,0.000592,6.42e-05,6.67e-05,5.87e-05,0,4.83e-05,4.64e-05,0,0,0,0,5.73e-05,0,0,0.000191,0.000309,0.00137,0.000644,0.000111,6.83e-05,0,6.16e-05,5.65e-05,5.24e-05,5.06e-05,4.62e-05,5.75e-05,0,0,0,0,0,0,0,0.00056,0.000821,0.0184,0,5.48e-05,5.56e-05,0,5.28e-05,0,5.02e-05,4.8e-05,5.67e-05,0,0,0,0,0,0,7.52e-05,0.0102,0.0113,0,0,5.44e-05,0,5.14e-05,5.16e-05,4.99e-05,5.06e-05,4.53e-05,4.98e-05,0,0,5.7e-05,0,0,5.42e-05,6.55e-05,0.000122,0.000161,0.0189,7.42e-05,6.47e-05,5.61e-05,5.33e-05,5.16e-05,5.04e-05,4.74e-05,4.8e-05,4.57e-05,4.94e-05,5.24e-05,5.35e-05,5.13e-05,4.86e-05,4.96e-05,5.22e-05,5.6e-05,5.8e-05,6.24e-05,5.93e-05,5.31e-05,5.19e-05,4.98e-05,4.79e-05,4.67e-05,4.86e-05,4.19e-05,3.8e-05],"winrateAvg":0.947054,"leadAvg":4.41102,"scoreMeanAvg":5.61719,"scoreStdevAvg":9.58785,"shorttermWinlossErrorAvg":0.0904109,"shorttermScoreErrorAvg":1.52792,"ownership":[91,90,88,79,74,37,1,-46,-59,-71,-12,14,85,92,96,96,96,97,96,90,91,91,95,88,84,-26,-58,-73,-73,-97,97,94,97,-96,98,95,94,96,87,93,95,100,100,100,40,-93,-83,-69,-97,-6,99,-97,-96,98,98,-51,48,82,92,96,100,98,100,17,-44,-96,-88,-97,-25,99,-97,-97,-96,27,-95,-45,71,89,99,96,99,80,81,-90,-85,-92,-97,0,93,97,27,-93,-98,-93,-92,58,65,96,96,99,99,-77,-69,-77,-95,100,100,100,-41,-99,-97,-96,-96,-95,30,41,97,98,-72,-74,-75,-19,-25,-94,-93,100,34,-99,-99,-99,-95,-94,-96,13,-10,-47,-59,-10,16,12,17,9,3,-93,100,100,-99,-100,-99,-100,-100,-97,6,6,-19,-25,-49,-12,5,9,23,98,98,97,98,98,99,-99,-99,-99,-97,21,14,6,-3,2,69,9,15,16,48,17,98,96,99,99,98,97,-99,-95,46,36,30,19,21,21,11,18,16,24,34,11,99,99,-97,-97,-97,-94,-96,31,86,86,50,85,27,-36,8,12,14,19,37,61,-10,-96,-95,-98,-94,-96,-5,-77,57,7,14,28,13,13,11,9,10,22,21,54,0,-98,-94,-96,-95,-90,-78,-97,-96,10,5,24,16,11,6,2,-14,-7,18,-15,-61,-99,-96,-95,-97,-98,-96,-97,16,88,2,39,19,6,-8,-20,-8,41,-13,-61,-85,-95,-95,-97,-97,-96,-97,93,85,97,96,41,20,11,-95,-24,-20,-98,-82,-98,-94,-93,-98,-97,-98,67,64,98,65,71,45,38,63,-96,-77,-98,-92,-91,-90,-92,-92,-94,-98,-98,6,98,98,81,67,52,39,9,-52,-77,-90,-87,-89,-89,-90,-91,-81,-67,-33,25,63,88,83,69,51,28,1,-27,-58,-69,-83,-86,-87,-89,-89],"ownershipAllowedMAE":0.0396603})%"); + lines.push_back(R"%({"sample":{"board":".................../......X..X........./...OO..O...X.XO..../..O.X.XO.O...X.O.../...........OOX.XO../...X........XOO.O../......X........O.../.................../.................../................X../.XO.............XO./.X..O..........X.XO/X.XX...X........XO./.XOX.OOOOX......OO./.OO.XXXO.......XXO./O.OOOXOXXO....XXOO./.OXXXOOOO..X....XO./XX.X.XX.........X../.OX.X............../","hintLoc":"null","initialTurnNumber":105,"metadata":"68F3705BEA1550E24D879DD1D76EFF3E:115","moveLocs":["H18","F17","E18","N13","L13","P15","Q18","O18","R8","Q14"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.99,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.05e-06,2.2e-06,2.19e-06,2.13e-06,2.38e-06,2.47e-06,2.47e-06,2.59e-06,2.55e-06,2.58e-06,2.12e-06,2.19e-06,2.13e-06,2.11e-06,2.28e-06,2.43e-06,2.44e-06,2.42e-06,1.99e-06,2.22e-06,2.36e-06,2.26e-06,2.16e-06,0,6.45e-06,0,0,2.52e-06,0,3.29e-06,2.57e-06,2.22e-06,0,2.29e-06,0,2.73e-06,3e-06,2.37e-06,2.22e-06,2.62e-06,2.35e-06,0,0,0,2.9e-06,0,2.07e-06,2.58e-06,5.35e-06,0,2.31e-06,0,0,2.61e-06,5.05e-06,2.87e-06,2.42e-06,2.43e-06,2.81e-06,0,2.92e-06,0,2.71e-06,0,0,2.15e-06,0,2.43e-06,2.55e-06,2.32e-06,0,1.82e-06,0,3.82e-06,3.09e-06,2.58e-06,2.39e-06,3.26e-06,2.96e-06,1.09e-05,9.71e-06,1.16e-05,3.89e-05,3.71e-06,2.56e-06,2.75e-06,2.72e-06,0,0,0,0,0,0,2.66e-06,2.44e-06,2.38e-06,8.72e-06,1.01e-05,0,2.03e-05,1.82e-05,2.74e-05,1.15e-05,3.39e-06,2.72e-06,2.57e-06,2.56e-06,0,0,0,0,0,2.58e-06,2.43e-06,2.3e-06,3.23e-06,9.96e-06,1.41e-05,2.44e-05,2.63e-05,0,1.08e-05,7.41e-06,2.83e-06,0,2.9e-06,0,2.33e-05,0.853,0,0.000316,6.78e-06,2.51e-06,2.3e-06,3.25e-06,8.17e-06,1.51e-05,1.84e-05,1.12e-05,1.18e-05,9.1e-06,5.39e-06,3.23e-06,2.94e-06,3.02e-06,1.06e-05,0.0643,0.0685,0.000263,0.00445,5.38e-06,2.53e-06,2.27e-06,3.12e-06,1.95e-05,8.66e-06,7.09e-06,8.25e-06,7.13e-06,4.68e-06,3.44e-06,3.76e-06,3.89e-06,3.33e-06,4.28e-06,4.94e-06,5.2e-06,5.27e-06,6.36e-06,2.91e-06,2.38e-06,2.32e-06,7.78e-06,8.52e-06,3.23e-06,3.49e-06,3.99e-06,3.66e-06,3.37e-06,3.22e-06,3.33e-06,3.37e-06,3.25e-06,3.55e-06,4.2e-06,3.35e-06,2.88e-06,0,2.68e-06,2.29e-06,2.44e-06,0,0,2.78e-06,2.89e-06,2.99e-06,3.16e-06,3.29e-06,3.16e-06,3.19e-06,3.17e-06,3.15e-06,3.1e-06,2.98e-06,2.83e-06,2.78e-06,0,0,2.27e-06,2.37e-06,0,2.67e-06,2.89e-06,0,2.69e-06,3.06e-06,2.77e-06,2.92e-06,4.04e-06,3.08e-06,3.14e-06,3.06e-06,2.99e-06,4.63e-06,0,0,2.15e-06,0,0,0,0,0,2.64e-06,2.08e-06,2.56e-06,0,3.16e-06,7.13e-06,3.06e-06,3.11e-06,3.08e-06,3e-06,4.34e-06,9.51e-05,0,0,2.13e-06,0.00143,0,0,0,0.00613,0,0,0,0,0,2.84e-06,3.18e-06,3.03e-06,2.89e-06,2.76e-06,3.05e-06,0,0,2.03e-06,2.28e-06,0,0,3.19e-05,0,0,0,0,2.48e-06,2.93e-06,3.17e-06,3.51e-06,5.99e-06,3.68e-06,2.09e-06,0,0,0,2.09e-06,0,2.14e-06,0,0,0,0,0,0,0,0,3.06e-06,2.6e-05,3.22e-05,1.35e-05,0,0,0,0,2.13e-06,2.32e-06,0,0,0,0,0,0,0,0,2.49e-06,7.95e-06,0,3.14e-05,2.05e-05,3.06e-06,5.46e-06,0,0,2.16e-06,0,0,0,0,0,0,0,2.53e-06,2.46e-06,2.83e-06,3.01e-06,8.33e-06,6.02e-06,4.12e-06,1.04e-05,2.9e-06,0,3.52e-06,2.27e-06,1.84e-06,0,0,0,0,2.21e-06,2.24e-06,2.35e-06,2.41e-06,2.34e-06,2.42e-06,2.42e-06,2.4e-06,2.24e-06,2.34e-06,2.35e-06,2.75e-06,2.4e-06,2.28e-06,2.99e-06],"winrateAvg":0.782344,"leadAvg":2.14357,"scoreMeanAvg":4.18994,"scoreStdevAvg":14.2438,"shorttermWinlossErrorAvg":0.195114,"shorttermScoreErrorAvg":2.0561,"ownership":[69,71,72,73,49,27,24,48,23,-25,-47,-53,-55,-44,-5,39,69,75,78,65,70,72,78,87,6,-22,89,8,-57,-50,-54,-58,-66,-17,83,73,79,80,57,68,75,86,86,-50,21,89,35,12,-6,-64,-42,-64,78,74,78,84,82,34,56,83,10,-57,-39,-50,89,53,83,17,11,11,-64,-18,82,81,85,81,14,0,-13,-10,-22,-32,23,33,37,41,46,77,77,-64,-64,-63,95,82,74,-8,-4,-22,-75,-36,-31,3,20,20,25,34,40,-11,86,88,-64,94,71,62,-16,-19,-24,-28,-23,-22,-65,1,13,21,75,26,-16,29,86,92,54,44,46,-22,-18,-16,-15,-12,-12,-14,-1,5,8,14,13,13,25,40,40,51,39,26,-28,-25,-4,-5,-5,-5,-6,-2,1,4,6,2,-1,9,14,12,1,4,10,-41,-35,-5,0,0,-1,-2,-2,-1,-1,-2,-4,-6,-2,-4,-14,-60,-12,10,-56,-92,36,6,16,7,4,1,0,-4,-6,-8,-12,-12,-15,-32,-60,42,34,-77,-92,-22,9,65,24,19,7,7,-2,-8,-9,-12,-18,-15,-57,9,8,62,-90,-89,-93,-93,-16,33,37,-23,25,15,-7,-9,-10,-9,-5,18,-15,77,65,-85,-91,-81,-93,58,92,92,92,93,-40,-7,-11,-11,-7,-7,30,79,76,74,-87,-83,-82,-89,-89,-88,-87,92,87,3,-6,-14,-14,-17,-40,-89,-88,78,75,-85,-89,-82,-82,-80,-88,89,85,81,87,-8,-13,-39,-43,-91,-90,79,79,75,-95,-87,-100,-100,-100,90,89,88,88,36,10,-79,-52,-60,-73,-76,-78,80,67,-100,-100,-99,-100,-99,-100,-99,-1,32,22,-3,-43,-57,-63,-61,-66,-78,49,47,-99,-97,-100,-99,-100,-94,-62,-29,7,11,-5,-29,-51,-60,-61,-58,-41,-28,27],"ownershipAllowedMAE":0.0320397})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.....O......O.X..../...X............O../............O....../..X............O.../.................../..............X.X../.................../.............O.X.../...............OX../....X............../............O....../.................../..X................/....O..XO....XXXX../...O...X....XO.OO../.............O...../.................../","hintLoc":"null","initialTurnNumber":31,"metadata":"C35FE72FD4A5B8D1BFC601FCA51C7187:41","moveLocs":["J5","H5","N4","B3","E6","D7","F7","J6","N5","H7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.19,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[6.65e-06,7.39e-06,7.35e-06,7.77e-06,7.46e-06,7.61e-06,7.23e-06,7.24e-06,7.27e-06,7.19e-06,7.15e-06,7.43e-06,8.01e-06,7.53e-06,7.31e-06,7.39e-06,7.66e-06,7.57e-06,6.6e-06,7.57e-06,9.64e-06,1.2e-05,3.37e-05,2.02e-05,9.77e-06,9.47e-06,9.6e-06,9.62e-06,9.53e-06,9.45e-06,9.03e-06,9.89e-06,9.74e-06,9.03e-06,1.05e-05,9.91e-06,8.26e-06,7.23e-06,7.36e-06,1e-05,6.35e-05,9.6e-05,1.02e-05,0,9.91e-06,1.19e-05,1.18e-05,1.13e-05,1.06e-05,9.02e-06,0,9.09e-06,0,1.14e-05,9.73e-06,9.01e-06,7.16e-06,7.34e-06,1.16e-05,7.87e-05,0,4.79e-05,1.01e-05,1.23e-05,1.22e-05,1.24e-05,1.13e-05,1.03e-05,9.19e-06,8.25e-06,9e-06,9.45e-06,1.01e-05,0,8.94e-06,7.28e-06,7.6e-06,1.22e-05,0.000158,0.000411,2.99e-05,7.03e-05,1.7e-05,1.18e-05,1.19e-05,1.16e-05,1.12e-05,9.75e-06,0,8.95e-06,9.73e-06,9.46e-06,9.52e-06,9.52e-06,7.27e-06,7.61e-06,6.62e-05,0,6.03e-05,1.21e-05,2.2e-05,2.25e-05,1.29e-05,1.23e-05,1.2e-05,1.14e-05,1.04e-05,9.53e-06,1.03e-05,9.45e-06,0,9.49e-06,9.72e-06,7.31e-06,7.58e-06,1.12e-05,9.18e-05,6.13e-05,2.05e-05,3.48e-05,2.62e-05,1.42e-05,1.23e-05,1.2e-05,1.15e-05,1.12e-05,1.07e-05,1.46e-05,1.03e-05,9.95e-06,1.39e-05,1.01e-05,7.45e-06,7.54e-06,1.12e-05,2.05e-05,1.61e-05,1.65e-05,2.56e-05,2.62e-05,1.56e-05,1.24e-05,1.21e-05,1.17e-05,1.17e-05,1.15e-05,1.03e-05,0,1.03e-05,0,1.02e-05,7.44e-06,7.44e-06,1.02e-05,1.81e-05,1.23e-05,1.47e-05,2.3e-05,2.44e-05,1.59e-05,1.29e-05,1.21e-05,1.19e-05,1.16e-05,1.09e-05,9.28e-06,9.81e-06,0.000204,2.24e-05,9.85e-06,7.6e-06,7.48e-06,1.06e-05,1.96e-05,1.17e-05,1.67e-05,2.42e-05,2.75e-05,1.82e-05,1.5e-05,1.27e-05,1.19e-05,1.13e-05,9.1e-06,0,1.64e-05,0,0.0182,1.23e-05,7.53e-06,7.7e-06,1.22e-05,3.93e-05,1.45e-05,9.09e-06,1.55e-05,3.3e-05,2.01e-05,1.49e-05,1.25e-05,1.19e-05,1.08e-05,9.45e-06,8.52e-06,4.59e-05,0,0,9.71e-06,7.19e-06,7.87e-06,3.45e-05,8.38e-05,1.16e-05,0,0.491,0.00862,4.71e-05,2.15e-05,1.21e-05,1.16e-05,9.88e-06,8.65e-06,9.88e-06,4.32e-05,0.00137,0.247,9.2e-06,7.21e-06,7.86e-06,0.000168,6.8e-05,0,2.55e-05,0,2.69e-05,0,9.26e-06,1.38e-05,1.15e-05,8.94e-06,0,9.61e-06,2.55e-05,0.000288,0.000137,1.26e-05,7.54e-06,8.35e-06,8.22e-05,0.000215,0.000816,0,6.51e-06,0.22,7.41e-06,0,2.79e-05,1.08e-05,8.39e-06,7.36e-06,9.15e-06,4.49e-05,0.000114,0.000106,2.17e-05,7.62e-06,8.27e-06,9.31e-05,0,0.00151,7.29e-06,1.02e-05,8.29e-06,0,0,9.68e-06,3.24e-05,7.54e-06,0,9.36e-06,7.86e-06,7.66e-06,8.56e-06,3.37e-05,7.75e-06,8.61e-06,4.34e-05,0.000517,7.4e-06,0,1.06e-05,8.56e-06,0,0,9.18e-06,0.000151,8.6e-06,0,0,0,0,0,3.38e-05,7.93e-06,8.71e-06,0,0.000468,0,8.11e-06,0.000448,1.16e-05,0,0.00196,0.000136,0.000336,9.29e-05,0,0,7.63e-06,0,0,1.12e-05,8.15e-06,7.84e-06,0.000325,2.73e-05,9.24e-06,5.55e-05,7.84e-05,0.000613,2.16e-05,3.47e-05,0.000252,1.68e-05,9.07e-06,8.48e-06,0,6.48e-06,6.61e-06,6.66e-06,8.24e-06,7.34e-06,6.31e-06,7.92e-06,7.37e-06,8.13e-06,8.57e-06,8.64e-06,8.46e-06,8.07e-06,8.27e-06,8.02e-06,7.98e-06,7.52e-06,7.05e-06,6.9e-06,6.71e-06,7.04e-06,6.98e-06,6.87e-06,6.49e-06,6.16e-06],"winrateAvg":0.323789,"leadAvg":-1.93849,"scoreMeanAvg":-2.92882,"scoreStdevAvg":14.51,"shorttermWinlossErrorAvg":0.121247,"shorttermScoreErrorAvg":1.21393,"ownership":[-21,-14,-8,0,10,19,21,18,17,17,20,26,28,22,16,14,20,24,27,-27,-21,-11,-5,4,27,24,17,17,18,17,31,34,27,9,16,19,27,31,-32,-33,-33,-24,-27,59,18,7,15,16,2,27,76,28,-16,26,17,43,35,-40,-41,-48,-81,-17,5,10,9,11,12,12,19,38,26,20,23,75,43,38,-46,-53,-51,-32,-13,7,4,4,7,8,12,22,78,27,25,29,34,37,31,-46,-52,-82,-31,-15,-5,1,4,5,6,6,11,15,16,10,70,20,12,14,-40,-43,-30,-17,-13,-3,1,3,4,4,4,6,8,9,-4,5,8,-5,-7,-34,-35,-27,-21,-13,-6,2,4,4,4,4,4,4,-2,-60,-20,-67,-33,-25,-32,-35,-30,-27,-20,-9,3,5,4,4,5,5,2,8,-8,-9,-36,-45,-40,-35,-37,-34,-33,-28,-10,10,6,2,3,5,8,14,67,1,-48,-32,-49,-48,-41,-43,-41,-43,-27,-12,28,4,-3,-1,3,7,13,24,37,51,-75,-63,-51,-49,-52,-50,-54,-75,60,16,-5,-6,-5,2,9,20,17,3,-33,-19,-49,-50,-57,-56,-64,-83,12,73,-4,-80,-36,-10,2,15,73,19,3,-11,-34,-46,-46,-62,-64,-54,-2,71,39,39,-69,-82,-15,0,7,27,1,1,-10,-24,-37,-41,-63,-69,-83,5,38,3,-16,-85,44,-2,14,25,74,21,-13,-27,-37,-43,-28,-60,-58,-10,22,70,18,-24,-85,44,11,18,17,73,-65,-66,-66,-65,-9,-11,-45,-72,-1,66,32,0,-27,-85,0,0,1,-3,-5,76,-24,74,75,13,17,-38,-15,2,38,9,0,-24,-39,-23,-3,-7,7,34,76,71,72,63,58,27,-21,-12,6,18,13,-5,-22,-32,-24,-13,1,18,36,49,62,64,62,56,46],"ownershipAllowedMAE":0.0321779})%"); + lines.push_back(R"%({"sample":{"board":".................../..X.OX............./...OOX.O..XX.XXX.../.X..OX.OX.XO.OOOXX./.OX.OO.O..O....OOOO/.O.O.....X.O.OOXXX./....X........XXO.../..O.OX.....X......./..OOXX..X......XX../.XXOXO.XOO..O.X.X../.XOXO.X.XO.....XO../...XO...XOX...XXO../...X.XO..OOO.OOXOX./..X.XOXX....O.O.XO./...XOOOXXXXXOOXX.O./.XX.XO.XOXO.XXOO.../X..XXOOOOX....OXO../.XXOO..O.OX.O....../........O........../","hintLoc":"null","initialTurnNumber":158,"metadata":"CBF1FFBFF31EA2B70DA3EC8E00DE3EC4:168","moveLocs":["C17","G13","F13","C14","A16","A18","B18","A17","D19","D18"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.71,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":8.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.98e-06,3.13e-06,0.831,0,0.068,2.44e-05,8.92e-05,4.12e-05,1.79e-05,4.54e-06,3.79e-06,3.22e-06,2.78e-06,2.94e-06,2.83e-06,2.74e-06,2.81e-06,2.84e-06,2.54e-06,0,0,0,0,0,0,9.43e-06,0.00601,0.00198,0.000444,8.96e-06,3.59e-06,3.35e-06,3.05e-06,2.96e-06,2.97e-06,3.59e-06,3.8e-06,3.13e-06,0,2.74e-06,0,0,0,0,2.77e-06,0,0.0292,3.98e-06,0,0,4.13e-06,0,0,0,4.03e-06,3.41e-06,3.05e-06,0,0,2.99e-06,2.25e-06,0,0,3.53e-06,0,0,8.35e-06,0,0,3.68e-05,0,0,0,0,0,3.65e-06,3.45e-06,0,0,3.2e-06,0,0,0.000107,0,0.000148,0.00475,0,3.02e-06,0.000426,5.77e-06,2.65e-06,0,0,0,0,3.05e-06,0,0,0,3.07e-06,3.43e-06,0.00433,0.000681,0.00857,0,0.000473,0,1.44e-05,0,0,0,0,0,2.23e-06,2.86e-06,2.84e-06,3.31e-06,3.35e-06,0,0,0,8e-06,0.000453,2.67e-05,1.85e-05,0.0152,0.0266,0,0,0,4.13e-06,2.8e-06,2.71e-06,2.83e-06,3.21e-06,0,2.86e-06,0,0,3.22e-06,4.47e-06,4.61e-06,1.26e-05,3.61e-05,0,2.39e-05,3.13e-06,2.82e-06,2.88e-06,2.9e-06,2.85e-06,2.68e-06,2.85e-06,3.61e-06,0,0,0,0,2.74e-06,2.98e-06,0,6.88e-06,4.95e-06,3.9e-06,5.85e-06,4.37e-06,2.68e-06,0,0,2.96e-06,2.9e-06,2.62e-06,0,0,0,0,0,2.76e-06,0,0,0,3.18e-06,9.91e-06,0,3.07e-06,0,2.48e-06,0,3.02e-06,3e-06,2.46e-06,0,0,0,0,3.91e-06,0,2.64e-06,0,0,2.93e-06,3.38e-06,7.35e-06,3e-06,2.42e-06,0,0,2.48e-05,3.21e-06,2.59e-06,2.64e-06,2.62e-06,0,0,2.83e-06,2.96e-06,2.78e-06,0,0,0,3.11e-06,4.51e-05,4.77e-06,0,0,0,5.84e-06,3.17e-06,2.53e-06,2.86e-06,2.83e-06,0,2.74e-06,0,0,2.99e-06,2.93e-06,0,0,0,9.22e-06,0,0,0,0,0,3.11e-06,2.56e-06,2.55e-06,0,2.89e-06,0,0,0,0,2.76e-06,2.6e-06,2.38e-06,3.29e-06,0,0,0,0.000319,0,0,3.09e-06,2.48e-06,2.46e-06,2.58e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,3.9e-06,0,2.95e-06,2.53e-06,0,0,2.52e-06,0,0,2.56e-06,0,0,0,0,2.82e-06,0,0,0,0,1.02e-05,3.53e-06,2.74e-06,0,2.51e-06,2.42e-06,0,0,0,0,0,0,0,2.76e-06,2.85e-06,3.16e-06,1e-05,0,0,0,3.23e-06,2.68e-06,2.56e-06,0,0,0,0,2.6e-05,2.72e-06,0,0,0,0,3.06e-06,0,6.21e-06,6.79e-06,3.19e-06,3.14e-06,2.79e-06,2.73e-06,2.74e-06,2.59e-06,2.89e-06,1.46e-05,6.17e-06,1.82e-05,8.96e-05,3.34e-06,0,7.66e-05,1.04e-05,5.17e-06,2.92e-06,2.87e-06,2.83e-06,2.76e-06,2.68e-06,2.74e-06,2.51e-06,3.75e-06],"winrateAvg":0.132161,"leadAvg":-8.23857,"scoreMeanAvg":-11.355,"scoreStdevAvg":19.7158,"shorttermWinlossErrorAvg":0.237129,"shorttermScoreErrorAvg":5.71954,"ownership":[33,34,25,20,25,16,28,20,3,-25,-50,-65,-75,-80,-79,-76,-65,-54,-35,35,27,31,79,78,5,44,26,10,-37,-63,-75,-82,-83,-84,-81,-76,-25,-19,31,29,27,75,76,3,40,72,-26,-40,-92,-92,-14,-90,-90,-91,-80,-45,-7,27,26,29,45,75,-2,42,73,-82,-42,-92,30,10,42,43,45,-80,-80,10,56,76,33,69,75,75,38,72,-33,-25,35,20,18,30,39,43,44,46,46,57,76,75,75,-10,-26,5,19,-26,-78,-5,44,4,41,40,-83,-83,-82,27,34,51,41,-34,-96,-96,31,-9,-18,-21,-5,-24,-28,-88,-89,-71,-81,-31,-1,12,38,69,-20,-20,-96,-35,-28,-22,-14,-11,-79,-43,-40,-70,-85,-75,-33,-25,-26,-3,69,69,-96,-95,-66,-53,-74,10,4,-9,-1,-20,-62,-99,-99,-71,-54,-54,-95,-95,70,-95,-66,-81,-94,95,96,35,11,70,-17,-98,-96,-99,-63,-57,-82,-96,-92,-98,-17,-73,-97,-86,-88,96,63,47,25,-4,-61,-98,23,-37,-36,-89,-90,-95,-98,-13,-71,-79,-76,-88,96,48,66,43,5,-97,-97,24,7,-3,-94,-94,-94,-98,-11,-78,-64,-81,46,96,96,96,78,93,93,-97,33,6,45,-96,-96,-99,-25,-22,94,-89,-89,-50,15,6,42,95,91,94,3,-27,94,58,-97,-97,-96,-99,94,94,93,-89,-89,-90,-90,-90,94,95,-12,-9,42,95,85,-98,-100,-100,-94,-97,94,48,-88,92,-89,-32,-62,-62,-59,97,98,71,88,89,-100,-98,-95,-96,-96,95,94,94,94,-91,-52,6,-5,35,97,90,97,92,91,-98,-100,-100,81,84,85,92,94,84,85,-55,14,77,52,85,93,93,92,92,-97,-95,-74,-56,57,87,90,91,91,53,-13,-8,26,61,78,88,92,92,92],"ownershipAllowedMAE":0.0572004})%"); + lines.push_back(R"%({"sample":{"board":".XXO.............O./X.X.O......O.O.OOX./OXX.OXOO.O...XOOOX./.X.O.XOXO.X.X.XOXO./.XO..OX.X.X.X.XOXX./OXOOO.O.X.OOXOOXX../.OX..O.OOXXXO..O.XX/.OXOOXX.X...O.O.OOX/.OOXXOX....XOX...XO/.XX.......OX...OX.O/....X..X..XX.X...O./....O.X.XXOX.XOOO../..X.X.XXOOOOOOXXXO./.O.XOOXOOOX.OXXOOX./OX.XOXOO.XXOOX.XOO./.OXXXXXOOOOXXX.XO../O.OXOOOXOXOX.O.XOX./.OOOXO.XXXOX..X.XO./..........X....X.../","hintLoc":"null","initialTurnNumber":217,"metadata":"6BF190EF766A26E89AA3F8E51C83E331:227","moveLocs":["H12","H11","K12","J11","M12","L12","H15","K14","B7","B8"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.7,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0,0,0,0,3.3e-06,2.64e-06,2.45e-06,2.27e-06,2.19e-06,2.77e-06,2.58e-06,3.12e-06,4.24e-06,3.07e-06,2.93e-06,2.71e-06,5.65e-06,0,3.91e-06,0,0,0,5.23e-06,0,2.84e-06,2.52e-06,2.39e-06,2.55e-06,3.06e-06,6.08e-06,0,3.5e-05,0,2.57e-06,0,0,0,0.000603,0,0,0,3.66e-06,0,0,0,0,2.56e-06,0,0.000207,0.000258,0.00187,0,0,0,0,0,4.99e-05,2.65e-06,0,3.24e-06,0,2.77e-06,0,0,2.21e-06,0,3.98e-06,0,9.14e-06,0,5.84e-06,0,0,0,0,0.000914,3.85e-06,0,0,2.45e-06,2.53e-06,0,2.2e-06,0,0,2.92e-06,0,3.91e-06,0,2.88e-05,0,0,0,0,7.06e-05,0,0,0,0,0,2.27e-06,0,3.44e-06,0,0,0,0,0,0,0,0,0,7.3e-05,0.00082,4.42e-06,0,0,4.78e-06,2.14e-06,0,2.88e-06,0,0,0,0,0,0,6.11e-06,4.37e-06,0,0.0367,0,0,3.14e-06,0,0,0,0,0,0,0,0,0,0,0,0,0.000904,0,3.02e-06,0,0,0,6.35e-06,0,0,0,0,0,0,0,0,2.78e-06,4.77e-06,0,0,0,0.00256,2.85e-05,4.43e-06,0,0,0.000236,0,0,0.00142,0.000257,1.14e-05,2.69e-06,2.58e-06,2.59e-06,3.1e-06,0,0,2.02e-05,0.00201,0.172,0,0,4.1e-06,0,3.45e-05,0.000197,0.000188,2.47e-05,0,5.92e-06,2.76e-06,0,3.91e-06,3.94e-06,0,0,6.24e-06,0,0.000407,1.82e-05,4.19e-06,0,2.71e-06,0.00162,0,0.109,8.79e-05,0,4.25e-06,0,0,0,0,0,0,1.49e-05,0,0,0,0,2.92e-06,2.71e-06,5.18e-06,0,0,3.76e-05,0,9.74e-06,0,0,0,0,0,0,0,0,0,0,0,0,3.06e-06,4e-06,0,0.00211,0,0,0,0,0,0,0,0,1.83e-06,0,0,0,0,0,0,2.21e-05,0,0,0.000177,0,0,0,0,0,1.36e-06,0,0,0,0,0,2.39e-06,0,0,0,3.91e-06,2.92e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,2.56e-06,0,0,0.037,0.000861,0,2.27e-06,0,0,0,0,0,0,0,0,0,0,2.53e-06,0,2.6e-06,0,0,0,0.283,2.42e-06,0,0,0,0,0,0.000416,0,0,0,0,0,2.78e-06,2.58e-06,0,0,0,0,0.342,2.24e-06,2.21e-06,2.21e-06,2.5e-06,8.87e-05,1.12e-05,8.59e-05,5.35e-06,4.7e-06,0.000599,0,0.000524,5.54e-05,2.56e-06,2.49e-06,0,4.36e-06,0.000225,3.7e-06,8.12e-06],"winrateAvg":0.984366,"leadAvg":3.72096,"scoreMeanAvg":3.87012,"scoreStdevAvg":3.20636,"shorttermWinlossErrorAvg":0.0743079,"shorttermScoreErrorAvg":1.08119,"ownership":[-100,-100,-100,96,96,98,99,99,98,97,97,97,98,98,97,96,75,78,-11,-100,-100,-100,-71,100,99,99,99,99,98,92,99,-29,99,98,99,99,-98,-49,-99,-100,-100,-24,100,99,100,100,99,100,10,-19,-35,-73,99,99,99,-99,-98,-99,-100,9,100,99,99,100,100,100,5,-100,-48,-100,-68,-96,99,-99,-99,-99,-73,-100,100,99,99,100,100,100,-100,-59,-100,-99,-100,-50,-97,99,-99,-99,-99,40,-100,100,100,100,100,100,50,-100,-100,-99,-99,-100,98,98,-99,-99,-98,-98,42,100,99,100,99,100,30,99,99,-100,-100,-100,96,95,97,99,18,-98,-98,77,100,99,100,100,-100,-100,99,-100,-100,-100,96,96,-26,99,94,99,99,-97,-5,100,100,-99,-99,-99,-100,-100,-100,-100,-100,-100,96,-58,31,84,97,96,98,-34,-99,-99,-97,-99,-99,-99,-100,-100,-100,-99,-100,-23,-49,25,98,93,96,98,-82,-93,-97,-98,-100,-99,-100,-100,-100,-100,-100,-100,-62,-99,-29,48,95,100,98,-63,-96,-94,-97,-97,-99,-100,-100,-100,-100,100,-100,18,-99,99,100,100,99,99,11,93,-98,-98,-100,-100,-100,-100,100,100,100,100,100,100,-100,-100,-100,99,98,87,94,-2,-100,-99,-99,-100,100,100,100,-98,-4,100,-100,-100,99,99,98,98,99,11,7,-100,-99,-100,100,100,-3,-98,-98,100,100,-100,-100,-100,99,99,94,98,100,-100,-100,-100,-100,-100,100,100,100,100,-100,-100,-100,-100,-100,99,90,79,100,100,100,-100,98,98,99,-99,100,-99,100,-100,-100,-99,-100,-100,99,62,73,100,100,100,100,98,98,-54,-99,-99,-99,100,-100,-100,-100,-100,-99,-99,63,54,100,100,100,99,98,20,-22,-28,-80,-98,-99,-99,-99,-99,-99,-99,-90,-75,1],"ownershipAllowedMAE":0.0223779})%"); + lines.push_back(R"%({"sample":{"board":".XXO.OXXX..XXX...X./.XO.OOX.X.X.XX..X.X/..XOOXXX...XXX.XOXO/.XXOOOOOX.XX...XOOO/.OXOXXOXXXO....XO.O/.XOX.XXXOOO...OOXO./.XOXXOXOO..OXXO.XO./..O.O.OX...OX.O.X../.O.O.OO.O..X..OX.../.XX....O...OOOX.X../.O.XX.XOXOO..XX.OO./...XO.OX.XXOO..O..X/.O...OOXX.OXOXXOXX./XO..X..XXXXX.OXOOOX/.XXX.OOOXOOOO.O..X./.O.X....OOXXXOO.X../..XOO..O.XXOOX.OOX./..X.....XOX..X.OX../................X../","hintLoc":"null","initialTurnNumber":225,"metadata":"09B6D689B49F3C635D39CB73D057A176:235","moveLocs":["A10","F12","D12","Q4","P3","S11","T12","Q5","T9","T2"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.96,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui1","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.05e-06,0,0,0,3.62e-06,0,0,0,0,3.88e-06,3.65e-06,0,0,0,3.47e-06,4.05e-06,4.13e-06,0,0,3.99e-06,0,0,3.62e-06,0,0,0,0,0,3.78e-06,0,0,0,0,3.78e-06,4.32e-05,0,0.000125,0,6.83e-06,0.000111,0,0,0,0,0,0,1.14e-05,4.85e-06,3.78e-06,0,0,0,4.33e-06,0,0,0,0,7.61e-05,0,0,0,0,0,0,0,0,1.07e-05,0,0,4e-06,4.92e-06,4.91e-06,0,0,0,0,5.1e-06,0,0,0,0,0,0,0,0,0,0,1.05e-05,0.0868,0.00887,5.18e-05,0,0,2.73e-06,0,5.49e-06,0,0,0,0,0,0,0,0,0,0,2.4e-05,0.00571,0.000298,0,0,0,0,2.86e-06,4.3e-06,0,0,0,0,0.00255,0,0,0,4.29e-06,4.87e-06,0,0,0,0,5.24e-06,0,0,4.74e-06,4.92e-06,6.25e-06,0,0,0,0,0,0,4.24e-06,4.48e-06,4.75e-06,0,0,7.78e-06,0,0.000137,0,0.000168,0,4.87e-06,0,5.21e-06,0,3.95e-06,0,0,3.94e-06,0,4.34e-06,6.98e-06,0,0.0371,7.61e-05,0,0,0,0,0.496,0,0,0,4.23e-06,4.49e-06,4.67e-06,4.57e-06,0,4.19e-06,4.08e-06,3.99e-06,0,0,0,0,0.0353,0,0.00186,9.73e-06,4.9e-06,0,4.27e-05,0,0,2.39e-05,0,0,0,0,0,4.02e-06,0.0224,0,0,0.0247,0,0,0,5.2e-06,5.48e-06,1.06e-05,0,0,5.82e-06,0,0,0,0,0,0,0,0.0641,0.0479,0,0.0836,0.0147,0,0.0237,0,7.48e-06,0.0373,4.41e-05,0,0,0,0,3.32e-06,0,0,0,0,0,0,0,0,0,0,0,2.91e-05,5.67e-05,0,5e-06,4.33e-06,0,0,0,0,0,1.27e-05,0,0,0,0,0,0,6.27e-05,0,0,0,4.82e-06,0,0,0,0,0,0,0,0,4.11e-05,0,0,0.00107,0,0.000821,1.57e-05,0,4.42e-06,0,5.71e-06,4.92e-06,4.41e-06,4.17e-06,0,0,0,0,0,0,0,0,0,0.0005,0.000301,6.22e-06,1.38e-05,0,0,0,5.87e-06,5.47e-06,0,2.17e-05,0,0,0,0,0,0,0,0,0,1.17e-05,4.36e-06,1.07e-05,0,0.000375,5.86e-06,6.94e-06,7.74e-06,0.00129,0,0,0,4.43e-06,0.000112,0,0.00105,0,0,0.000339,0,3.58e-06,4.36e-06,5.56e-06,7.55e-06,5.4e-06,4.91e-06,5.12e-06,5.23e-06,4.41e-06,4.23e-06,4.16e-06,4.58e-06,8.91e-06,1.88e-05,2.4e-05,2.1e-05,0,5.08e-05,4.36e-06,9.52e-06],"winrateAvg":0.844831,"leadAvg":1.97681,"scoreMeanAvg":2.64517,"scoreStdevAvg":7.73048,"shorttermWinlossErrorAvg":0.278501,"shorttermScoreErrorAvg":2.87598,"ownership":[-98,-98,-99,-96,-97,-96,-100,-100,-100,-100,-100,-100,-100,-100,-91,-79,-59,-55,-29,-98,-98,-96,-97,-96,-96,-100,-100,-100,-100,-100,-100,-100,-100,-88,-71,-70,-22,-33,-98,-98,-98,-95,-95,-100,-100,-100,-99,-100,-100,-100,-100,-100,-76,-98,99,-21,99,-97,-98,-99,-95,-95,-95,-95,-96,-100,-99,-100,-100,-69,-43,-32,-97,99,99,99,-97,-96,-99,-95,-99,-100,-95,-100,-100,-100,97,-36,-30,-37,27,-98,99,99,99,-88,-97,99,-98,-98,-100,-100,-100,97,98,97,24,-24,5,98,99,91,99,99,-53,-96,99,-97,-98,23,-100,98,98,94,90,94,-55,-57,99,96,91,99,99,-35,-61,99,99,99,27,100,96,97,91,86,93,-54,32,99,96,91,95,99,88,97,86,99,83,100,100,99,100,90,84,38,36,90,99,91,92,90,96,94,-51,-51,-4,-7,27,73,100,98,94,92,100,100,100,92,92,91,92,95,88,88,-15,-59,-59,23,19,100,97,99,100,99,98,91,91,94,97,97,96,75,52,13,-59,25,24,99,96,97,97,97,100,100,97,93,97,69,44,-85,42,84,9,-2,-49,99,99,96,96,97,98,97,100,94,92,97,-88,-88,-87,-83,84,-1,-28,-83,-22,95,95,96,97,97,97,97,99,93,97,97,96,-96,-84,-95,-94,-94,-25,99,100,100,96,100,100,100,100,99,99,-95,21,-98,-95,-87,-86,-93,-94,-36,35,62,96,100,100,-98,-98,-98,99,99,-96,-97,-97,-97,-90,-92,-95,85,85,59,58,97,2,-98,-98,-94,-94,-95,99,99,98,-99,-98,-91,-91,-96,4,45,33,43,-25,-94,-91,-98,-96,-94,-95,28,99,-99,-99,-99,-92,-92,-65,-29,16,25,10,-16,-66,-93,-95,-94,-88,-67,-14,-35,-99,-99,-99],"ownershipAllowedMAE":0.0272321})%"); + lines.push_back(R"%({"sample":{"board":".................../...........OOX...../.OOOO.O..OXOXX.X.O./O.OXXXO..OOXXO...../.OX.......X...XX.X./XX.XO............../...XO.........X.O../...XO............../..X................/.XXOO............X./XOXXO......O..XXXX./.OOOOXXX.XXO.OXOOXO/.OX..XOOXX.X.OOO.O./OXOOOOOXX.X...XO..O/OXXOOXXOOO...X.O.O./.XXO...XX.X.XOOOO../.XOXOOOOO..XO.O..../.XOXXXX......O...../.................../","hintLoc":"null","initialTurnNumber":152,"metadata":"8A91372E94FC54120CBB12CCFDE6BB44:162","moveLocs":["K4","G4","N10","B12","B13","M13","N12","K13","L5","F4"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.09,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":-0.781,"policyMixture":[2.95e-06,3.13e-06,3.07e-06,2.9e-06,3.3e-06,4.04e-06,3.81e-06,3.48e-06,3.87e-06,5.9e-06,2.02e-05,3.45e-05,0.0119,1.79e-05,4.6e-06,4.17e-06,2.88e-06,3.12e-06,2.25e-06,3.41e-06,3.4e-06,3.45e-06,4.43e-06,1.11e-05,1.26e-05,1.11e-05,9.55e-06,8.01e-06,0.000163,0.004,0,0,0,3.9e-06,4.23e-06,4.06e-06,4.03e-06,2.94e-06,4.1e-06,0,0,0,0,0.000623,0,1.63e-05,2.27e-05,0,0,0,0,0,4.03e-06,0,3.7e-06,0,3.11e-06,0,0,0,0,0,0,0,8.85e-05,2.86e-05,0,0,0,0,0,4.21e-06,3.29e-06,3.69e-06,3.92e-06,2.96e-06,2.17e-05,0,0,1.23e-05,2.87e-05,0.00592,0.000508,0.000306,0.000128,0.0186,0,0.000556,6.01e-05,1.11e-05,0,0,3.09e-06,0,3.01e-06,0,0,2.47e-06,0,0,0.000115,0.000646,0.000788,0.00201,0.00106,0.00133,0.000647,0.00145,4.85e-05,6.96e-06,4.33e-06,4.12e-06,3.57e-06,2.88e-06,2.51e-06,0,5e-06,0,0,4.34e-05,0.000816,0.00099,0.00208,0,0.000535,0,0.0116,7.91e-05,0,4.41e-06,0,3.97e-06,2.71e-06,5.99e-06,0,1.08e-05,0,0,9.31e-05,0.00105,0.0026,0.00675,0.00462,0.233,0.00475,0,4.39e-05,9.64e-06,4.13e-06,3.49e-06,3.97e-06,2.9e-06,4.82e-06,4.83e-06,0,0.000422,1.01e-05,0.000491,0.00154,0.104,0.136,0.0474,0.0264,0.00139,6.84e-05,2.91e-05,8.82e-06,4.35e-06,3.64e-06,3.56e-06,2.79e-06,6.4e-06,0,0,0,0,0.000213,0.00582,0.013,0.0197,0.0369,0.00238,0.00176,0,9.68e-05,8.81e-06,3.7e-06,2.56e-06,0,2.87e-06,0,0,0,0,0,4.18e-05,3.67e-05,0.000173,0.000764,0.000209,0.000294,0,0.00097,0.00497,0,0,0,0,5.42e-06,4.44e-06,0,0,0,0,0,0,0,2.7e-05,0,0,0,0.000341,0,0,0,0,0,0,4.62e-06,0,0,0.00014,0.00203,0,0,0,0,0,2.96e-06,0,2.32e-05,0,0,0,3.34e-06,0,0,0,0,0,0,0,0,0,0,0,0.00074,0,7.82e-06,0.266,3.69e-05,0,0,3.57e-06,3.66e-06,0,0,0,0,0,0,3.65e-06,0.000799,0,0,0,0,3.68e-05,0.0017,0,3.72e-06,0,2.98e-06,0,3.01e-06,9.14e-06,0,0,0,0,0,0,0,0,0,0,1.78e-05,0,0,0,0,0,3.2e-06,2.88e-06,3.2e-06,0,0,0,0,0,0,0,0,0.000149,1.58e-05,0,0,0,0,3.11e-06,3.26e-06,3.57e-06,2.87e-06,2.69e-06,0,0,0,0,0,0,4.65e-05,4.67e-05,9.84e-05,0.000425,0.000576,0.000233,0,5.2e-06,4.42e-06,3.54e-06,3.5e-06,2.9e-06,2.34e-06,2.59e-06,2.88e-06,2.4e-06,2.23e-06,2.96e-06,5.29e-06,2.02e-05,2.31e-05,2.36e-05,1.16e-05,3.89e-05,1.34e-05,7.87e-06,4.95e-06,3.41e-06,2.62e-06,2.89e-06,2.79e-06,1.32e-05],"winrateAvg":0.00396804,"leadAvg":-4.50863,"scoreMeanAvg":-4.74585,"scoreStdevAvg":4.12029,"shorttermWinlossErrorAvg":0.019629,"shorttermScoreErrorAvg":0.713383,"ownership":[99,99,99,99,98,97,97,97,97,96,93,73,-48,-61,-96,-97,-98,-98,-98,99,99,99,99,98,98,98,97,97,97,96,96,95,-100,-97,-98,-98,-98,-98,99,100,100,100,100,22,100,91,89,99,96,95,-100,-100,-95,-100,-99,-98,-98,99,94,100,-99,-99,-98,99,63,64,99,99,-100,-100,-43,-84,-97,-99,-99,-99,-70,92,-99,-97,-22,-39,35,47,49,6,-53,-46,-33,-37,-100,-100,-99,-100,-99,-100,-100,-99,-100,98,-7,22,36,35,33,20,17,38,-16,-57,-98,-99,-99,-99,-99,-100,-99,-100,98,22,19,30,39,91,63,87,46,-62,-100,-99,-98,-99,-99,-99,-99,-99,-100,97,33,18,18,19,19,-6,5,-92,-83,-96,-98,-99,-99,-99,-98,-99,-100,47,66,25,11,-4,-7,-1,8,12,-44,-86,-95,-98,-98,-99,-99,-93,-100,-100,100,100,30,4,-6,-10,-18,-2,3,-91,-75,-93,-97,-98,-100,-96,-93,100,-100,-99,100,12,-25,-19,21,-23,4,88,-2,16,-100,-100,-100,-100,-29,78,100,100,100,100,-94,-94,-94,-86,-100,-100,88,56,100,-100,100,100,-100,82,91,100,98,97,-30,-94,100,100,-100,-100,-98,-99,-6,100,100,100,100,100,82,90,-100,100,100,100,100,100,-100,-100,-84,-100,-89,-87,21,-23,100,100,100,100,72,-100,-100,100,100,99,95,96,96,96,-100,-87,-58,-72,42,100,100,100,100,-58,-100,-100,100,100,100,100,-100,-100,-100,-100,-54,-65,100,100,100,100,100,100,-98,-100,-100,-100,100,100,100,100,100,5,-51,-83,84,82,100,99,100,100,100,-99,-100,-100,-100,-100,-100,-100,19,47,10,-50,33,50,98,98,99,99,99,99,-100,-100,-100,-100,-99,-96,-52,-18,9,-9,-12,2,56,82,97,98,99,99,99],"ownershipAllowedMAE":0.0246548})%"); + lines.push_back(R"%({"sample":{"board":"............/............/..OOX....X../...XX.O.OX../.O.....OXX../...OX.OXO.../..XXO.OX..../...OO..X..../...X....XO../.........O../............/............/","hintLoc":"null","initialTurnNumber":30,"metadata":"197CBA0243F422E225C03846E288A973:40","moveLocs":["C8","C5","B7","B6","C7","L6","J2","K7","K2","L8"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.88,"xSize":12,"ySize":12},"rules":"koPOSITIONALscoreAREAtaxSEKIsui1button1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[8.95e-06,1.03e-05,9.58e-06,1.01e-05,1.16e-05,1.18e-05,1.23e-05,1.35e-05,1.26e-05,1.23e-05,1.16e-05,9.02e-06,9.97e-06,1.09e-05,9.93e-06,1.31e-05,7.23e-05,0.000948,0.0194,0.113,0.000305,1.33e-05,2e-05,1.17e-05,9.77e-06,1.12e-05,0,0,0,1.17e-05,0.00119,0.55,0.0604,0,1.17e-05,1.16e-05,9.83e-06,1.28e-05,1.02e-05,0,0,1.09e-05,0,9.43e-06,0,0,0.109,1.21e-05,1.07e-05,0,0,1.04e-05,9.53e-06,0.000129,2.01e-05,0,0,0,0,1.25e-05,1.06e-05,0,0,0,0,1.49e-05,0,0,0,0,1.27e-05,2.1e-05,1.23e-05,0,0,0,0,1.34e-05,0,0,1.27e-05,1.21e-05,0,1.04e-05,1.07e-05,0.000124,0,0,0,2.72e-05,0.000228,0,1.01e-05,0.132,1.08e-05,1.1e-05,1.03e-05,1.76e-05,1.38e-05,0,3.57e-05,8.85e-05,1.44e-05,1e-05,0,0,1.61e-05,1.2e-05,9.91e-06,1.23e-05,1.36e-05,1.28e-05,5.91e-05,0.00417,2.5e-05,1.19e-05,3.54e-05,0,0.000208,1.53e-05,1.01e-05,1.17e-05,1.24e-05,1.4e-05,3.38e-05,4.17e-05,2.81e-05,1.13e-05,0,0,0.00773,1.58e-05,8.85e-06,9.84e-06,9.51e-06,1e-05,1.03e-05,1.02e-05,1.06e-05,1.03e-05,8.99e-06,9.22e-06,1.17e-05,9.66e-06,1.13e-05],"winrateAvg":0.5035,"leadAvg":-0.100966,"scoreMeanAvg":0.108198,"scoreStdevAvg":11.385,"shorttermWinlossErrorAvg":0.232078,"shorttermScoreErrorAvg":1.40681,"ownership":[3,4,-1,-10,-26,-20,-10,-21,-40,-49,-49,-43,2,-1,10,-15,-32,-33,11,-32,-49,-57,-48,-38,-2,5,21,18,-91,-15,55,-46,-31,-71,-45,-26,-10,-6,-41,-91,-91,-11,88,-2,5,-70,-18,3,-39,-3,-91,-85,-46,-21,80,83,-70,-71,71,29,-48,-91,-91,-70,-68,23,89,-74,77,78,72,60,-39,4,-91,-91,93,62,89,-73,-4,37,81,69,15,1,92,93,93,24,-15,-71,-32,-29,78,68,34,60,54,-3,37,10,18,-35,-71,70,67,55,42,40,35,21,13,-23,-9,-38,-29,70,34,36,39,35,27,15,-8,-20,-32,-50,-79,-77,21,15,34,30,22,9,-7,-24,-38,-53,-62,-57,-55,-14],"ownershipAllowedMAE":0.0665351})%"); + lines.push_back(R"%({"sample":{"board":".X.X.OO........X.../OOXXXXO.X...XXX.X../.OXOOOOOXXXXOX.XOO./XOXO...XOOOOOOXXXO./.XOO...O....XXOOO../X.XXO..OXXXX.XX.O../.XXOO.XXXOXOXOXOOO./......XOOOOOX.XXOX./.O.OOXXXO.O.OXX.XO./..OO.OXXOOXOOOXX.O./.XOXOOOXXOXXXOOX.../.OXXXO.OOXO.....O../.XO..OOXOX.XO....O./.XOXXXXXXXX.OO.OOX./.OOXX.XX.XXO.O.OXX./..OX......XXOXXXX../OOOOX..X.XXOOOOX.../.OXXXX.XX.XX.O.OX../OX.X.X....X...O..../","hintLoc":"null","initialTurnNumber":269,"metadata":"3859A323A4D06ED64A0DD11E82C9AA20:279","moveLocs":["C1","M6","N5","B1","S2","R1","C1","O8","P8","B1"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.57,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":10.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.38e-06,0,0,0,1.96e-05,0,0,9.33e-06,0.000133,2.51e-05,3.46e-05,7.43e-06,5.59e-06,5.27e-06,5.74e-06,0,1.04e-05,1.28e-05,6.55e-06,0,0,0,0,0,0,0,9.73e-06,0,8.06e-06,3.04e-05,3.54e-05,0,0,0,0,0,0.000239,1.01e-05,1.45e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7.14e-06,0,0,0,0,6.17e-06,6.9e-06,1.02e-05,0,0,0,0,0,0,0,0,0,0,0,5.74e-06,0,0,0,0,7.65e-06,1.29e-05,1.13e-05,0,1.92e-05,5.9e-06,6.32e-06,0.000136,0,0,0,0,0,6.92e-06,6.72e-06,0,0,0,0,0,2.13e-05,0.000107,0,0,0,0,0,0,0,0,5.55e-06,0,6.46e-06,5.06e-06,5.67e-06,0,0,0,0,1.51e-05,0,0,0,0,0,0,0,0,0,0,0,0,4.51e-06,5.99e-05,1.86e-05,1.07e-05,9.86e-06,1.76e-05,9.81e-06,0,0,0,0,0,0,0,0,0,0,0,0,4.89e-06,2.79e-05,0,6.53e-06,0,0,0,0,0,0,2.74e-06,0,6.72e-06,0,0,0,0,0,0,4.62e-06,0.0244,0.126,0,0,2.24e-05,0,0,0,0,0,0,0,0,0,0,0,0.000199,0,5.13e-06,0.000979,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9.66e-06,7.42e-06,5.47e-06,0.0352,0,0,0,0,0,0.000234,0,0,0,0,0.00413,0.000115,0,0,7.72e-05,0,6.77e-06,6.65e-06,0.00141,0,0,0.00544,0.0256,0,0,0,0,0,4.59e-06,0,0,2.29e-05,1.44e-05,1.19e-05,7.73e-06,0,4.94e-05,0.0015,0,0,0,0,0,0,0,0,0,0,0,0,0,8.08e-06,0,0,0,0.000189,1.61e-05,0,0,0,0,5.31e-06,0,0,5.58e-06,0,0,0,0,0,3.9e-05,0,0,0,1.29e-05,9.81e-06,5.64e-06,0,0,5.7e-06,5.75e-06,5.4e-06,5.52e-06,5.66e-06,5.73e-06,0,0,0,0,0,0,0,8.54e-06,3.53e-05,0,0,0,0,0,5.6e-06,5.4e-06,0,5.41e-06,0,0,0,0,0,0,0,1.49e-05,0.773,3.59e-05,4.48e-06,0,0,0,0,0,5.27e-06,0,0,5.2e-06,0,0,6.53e-06,0,6.43e-06,0,0,0,5.54e-05,0,0,0,0,0,0,5.15e-06,5.03e-06,5.12e-06,5.11e-06,0,5.17e-06,6.57e-06,5.99e-06,0,5.77e-05,0,4.75e-05,5.32e-06,1.76e-05],"winrateAvg":0.997472,"leadAvg":13.1949,"scoreMeanAvg":13.3591,"scoreStdevAvg":6.9474,"shorttermWinlossErrorAvg":0.023361,"shorttermScoreErrorAvg":2.8648,"ownership":[98,98,98,98,99,100,100,40,15,-79,-81,-96,-99,-99,-99,-100,-79,-55,-23,99,99,98,98,98,99,100,35,-98,-84,-94,-98,-100,-100,-100,-99,-99,-10,17,92,99,98,100,100,100,100,100,-98,-98,-98,-99,87,-100,-100,-100,96,96,22,77,98,98,100,90,71,77,72,78,81,83,84,86,88,-100,-100,-100,96,82,73,70,100,100,87,52,52,81,-34,-4,-40,-52,-100,-100,100,100,100,97,96,68,68,67,71,100,0,-31,79,-100,-100,-100,-100,-99,-100,-100,18,100,99,98,65,65,65,100,100,-20,-100,-100,-100,99,-100,99,-100,-99,-100,100,100,100,99,65,78,83,93,-8,-37,-100,99,99,99,99,99,-100,-100,-100,-100,100,99,99,75,98,94,100,100,-100,-100,-100,99,99,99,99,99,-100,-100,-80,-82,100,98,29,54,100,100,93,92,-100,-100,99,99,46,99,99,99,-100,-100,-8,100,93,-44,-93,99,-100,92,91,92,-100,-99,99,44,43,47,99,99,-100,-44,88,87,-92,-92,-100,-100,-100,91,16,25,-24,-100,41,46,62,48,98,-72,96,85,82,-85,-94,22,-74,-41,90,91,-100,-33,-100,-69,-100,100,80,53,3,71,97,58,-40,-92,28,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,100,77,100,99,-70,27,-26,28,27,-100,-100,-100,-100,-100,-100,-100,-100,100,100,100,40,99,-70,-72,-37,26,24,23,-100,-100,-100,-100,-100,-100,-100,-100,-100,100,-73,-71,-70,-71,-41,-24,28,24,22,21,-100,-100,-100,-100,-100,-100,-100,100,100,100,100,-72,-70,11,-20,24,28,-98,-100,-100,-100,-100,-100,-100,-100,-100,-100,15,100,91,92,-69,4,-27,27,23,15,-100,-99,-100,-100,-100,-100,-100,-100,-83,-14,79,98,30,-69,-33,-28],"ownershipAllowedMAE":0.0494657})%"); + lines.push_back(R"%({"sample":{"board":".................../..OXOXX....XX.XXX../..XOOOXOXO.OX.OXOX./.O.O.XOX.X.OXOXOO../.XO...O....OOOXO.../..X.XO........XX.../...OX.......OOOXX../.O.O.........XXOX../O.OXO.......O.OOX../.OXX..........OX.../.X.X...........X.../.X.X..X............/.OXX.OX....X......./..OX.OX.O.O..X..X../..OX.OX.....OX.X.../.XXX.O.O....OXOXO../..O.XO......OXXOO../.....O.......OOXXX./.................../","hintLoc":"null","initialTurnNumber":126,"metadata":"3CD33CD3DD6588BC6B28A2DC2FD90B86:136","moveLocs":["E12","D14","E15","J14","G13","H15","J16","F10","J13","K13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui0","komi":39.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[1.98e-06,2.08e-06,3.58e-05,2.57e-06,3.86e-06,2.36e-06,2.08e-06,2.4e-06,2.58e-06,2.48e-06,2.22e-06,2.05e-06,1.85e-06,1.88e-06,1.84e-06,1.74e-06,1.77e-06,1.89e-06,1.73e-06,2.06e-06,6.21e-05,0,0,0,0,0,3.18e-06,3.77e-06,9.26e-06,3.38e-06,0,0,2.1e-06,0,0,0,1.91e-06,1.94e-06,2.08e-06,1.26e-05,0,0,0,0,0,0,0,0,0.000162,0,0,2.34e-06,0,0,0,0,1.77e-06,2.59e-06,0,0.000416,0,1.97e-06,0,0,0,0,0,2.78e-06,0,0,0,0,0,0,1.89e-06,1.76e-06,2.36e-06,0,0,0.0622,0,3.54e-06,0,0,0.00297,3.84e-06,3.12e-06,0,0,0,0,0,1.88e-06,1.85e-06,1.71e-06,2.72e-06,2.17e-06,0,0,0,0,3.15e-06,5.98e-05,0,0.0156,1.6e-05,2.24e-06,3.15e-06,4.29e-06,0,0,1.8e-06,1.77e-06,1.73e-06,2.77e-06,2.82e-05,1.24e-05,0,0,3.55e-06,0,0.01,0,0,2.04e-05,3.02e-06,0,0,0,0,0,1.85e-06,1.77e-06,3.29e-06,0,9.89e-06,0,0,4.26e-06,6.11e-05,0.0177,0.648,0.031,7.81e-06,0.000592,5.46e-06,0,0,0,0,1.82e-06,1.76e-06,0,0,0,0,0,0.00216,0.0597,0.0212,0.00067,2.82e-05,1.55e-05,1.21e-05,0,6.31e-06,0,0,0,1.83e-06,1.76e-06,1.11e-05,0,0,0,2.94e-05,0,0.00668,0.00531,0.000176,4.35e-05,2.54e-05,1.84e-05,8.83e-06,1.49e-05,0,0,1.8e-06,1.8e-06,1.66e-06,1.16e-05,0,1.85e-06,0,3.3e-06,0.00102,0.0889,0.0226,0.000139,3.98e-05,1.32e-05,8.6e-06,4.35e-06,4.27e-06,3.67e-06,0,1.88e-06,1.84e-06,1.68e-06,2.77e-06,0,1.8e-06,0,2.28e-06,0.00028,0,4.02e-06,3.69e-05,3.23e-05,4.67e-06,3.01e-06,3e-06,2.82e-06,2.35e-06,2.07e-06,1.89e-06,1.83e-06,1.72e-06,1.7e-06,0,0,0,2.01e-06,0,0,2.6e-06,4.05e-05,0.000128,2.1e-05,0,2.31e-06,2.32e-06,1.94e-06,1.97e-06,1.87e-06,1.8e-06,1.73e-06,1.69e-06,1.79e-06,0,0,1.86e-06,0,0,2.62e-06,0,2.29e-05,0,0.000198,3.02e-06,0,1.85e-06,1.84e-06,0,1.89e-06,1.87e-06,1.67e-06,1.76e-06,0,0,1.9e-06,0,0,9.06e-06,5.52e-05,1.39e-05,1.69e-05,5.71e-06,0,0,1.82e-06,0,2.14e-06,1.93e-06,1.83e-06,1.81e-06,0,0,0,1.99e-06,0,0.000168,0,5.75e-06,6.29e-06,1.6e-05,2.67e-06,0,0,0,0,0,2.01e-06,1.9e-06,1.78e-06,2.38e-06,0,2.69e-06,0,0,1.11e-05,1.19e-05,3.02e-06,3.53e-06,3.75e-06,3.17e-06,0,0,0,0,0,2.16e-06,1.8e-06,1.9e-06,2.35e-06,2.5e-06,3.05e-06,7.59e-06,0,2.37e-06,2.83e-06,2.82e-06,2.94e-06,3.04e-06,8.91e-05,0.000174,0,0,0,0,0,2.06e-06,1.7e-06,2.08e-06,2.36e-06,2.61e-06,2.29e-06,2.33e-06,2.25e-06,2.14e-06,1.95e-06,2.01e-06,1.99e-06,2.64e-06,3.26e-06,3.16e-06,4.12e-06,2.17e-06,1.8e-06,1.95e-06,1.83e-06,3.96e-06],"winrateAvg":0.0721031,"leadAvg":-4.41098,"scoreMeanAvg":-5.91101,"scoreStdevAvg":9.19942,"shorttermWinlossErrorAvg":0.14223,"shorttermScoreErrorAvg":2.20167,"ownership":[98,98,98,97,53,23,-50,-70,-73,-56,-49,-68,-86,-91,-95,-98,-99,-99,-99,97,97,99,97,100,-77,-76,-75,-67,-43,-5,-97,-97,-65,-100,-100,-100,-99,-99,97,98,97,100,100,99,-77,-77,-87,25,15,95,-98,47,42,-100,-98,-99,-99,95,99,98,100,21,-41,63,-87,-88,-88,24,96,-98,96,-100,-98,-98,-98,-99,90,80,99,-64,-85,4,63,63,0,17,37,96,96,96,-100,-98,-99,-99,-99,78,80,74,86,-85,49,3,7,72,44,50,65,63,-42,-100,-100,-99,-99,-99,75,69,82,85,-85,-18,-78,-31,-69,69,37,49,96,96,95,-100,-100,-99,-99,69,81,80,85,-85,-45,-41,-34,-54,-14,12,21,87,83,82,86,-100,-99,-99,60,26,79,-100,-9,-35,-27,-21,-20,-6,7,24,91,82,85,86,-100,-99,-98,-38,26,-100,-100,-50,26,-16,-11,-12,-6,-2,4,19,21,84,-99,-98,-97,-97,-87,-100,-100,-100,-40,-5,-19,-17,-5,-5,-6,-5,6,-6,-13,-99,-95,-96,-95,-99,-100,-100,-100,-18,46,-58,-10,-1,-6,-9,-19,-11,-3,-51,-77,-92,-94,-94,-99,-99,-100,-100,-3,98,-55,-6,9,-10,-5,-79,-34,-43,-57,-74,-90,-94,-94,-99,-99,-99,-100,-12,98,-55,12,86,41,82,-50,-1,-99,-69,-82,-99,-95,-95,-99,-99,-99,-100,0,98,-56,17,64,76,69,69,95,-99,-97,-99,-96,-95,-95,-91,-100,-100,-100,5,98,-23,96,85,85,81,79,95,-99,-98,-99,-93,-95,-95,-82,-54,14,1,-51,98,79,91,91,90,88,88,95,-99,-99,-94,-93,-94,-94,-67,-51,-23,7,-6,98,90,92,92,91,90,89,89,89,89,-95,-95,-95,-93,-53,-33,-12,10,70,73,90,91,91,91,90,89,85,59,-19,-29,-79,-85,-90],"ownershipAllowedMAE":0.0363199})%"); + lines.push_back(R"%({"sample":{"board":"...X.O....X......../..XOXXOOOX.X......./..XOOO.OXX..X..X.../...XXO.XOOXX.XX.X../.XX.OXX.XOOOX...O../.XOOOO..OXXOOOOOXX./XOXXXO.O....OX.XO../.OO.XXO...X...X.XX./.O.XXOO...XOOX...../OX.XOO...X.OOOO.O../..XOX..X.X.OXX...../X.XOO...O.XX..OX.../.XO.O.X.OX..OX...../.X.O...XXOXXO.XX.../..XOXX..OOOOXXXO.X./..XOOOX.OX.O..XOOO./.OO...X.X...OXOXXXO/...OX....O...OOO.O./.................../","hintLoc":"null","initialTurnNumber":144,"metadata":"2DA7C12D27D99042A5158DC4B6318854:154","moveLocs":["N8","K8","M7","Q9","P9","Q10","Q11","P11","H10","J10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui0","komi":7.5,"policyOptimism":0.0,"pda":2.281,"policyMixture":[3.42e-05,4.27e-05,5.14e-05,0,0.000181,0,3.39e-05,3.56e-05,3.59e-05,3.37e-05,0,3.34e-05,3.44e-05,3.36e-05,3.42e-05,3.43e-05,3.49e-05,3.61e-05,3.43e-05,3.65e-05,4.79e-05,0,0,0,0,0,0,0,0,3.34e-05,0,3.25e-05,3.35e-05,3.38e-05,3.67e-05,3.67e-05,3.83e-05,3.63e-05,3.64e-05,4.32e-05,0,0,0,0,3.72e-05,0,0,0,3.28e-05,3.29e-05,0,3.32e-05,3.48e-05,0,5.11e-05,3.91e-05,3.64e-05,3.61e-05,0.000322,0.000687,0,0,0,3.2e-05,0,0,0,0,0,0,0,0,4.69e-05,0,5.02e-05,3.65e-05,3.59e-05,0,0,8.06e-05,0,0,0,0.000526,0,0,0,0,0,3.45e-05,5.68e-05,0.000749,0,8.43e-05,3.8e-05,3.73e-05,0,0,0,0,0,4.97e-05,0.000217,0,0,0,0,0,0,0,0,0,0,6.07e-05,0,0,0,0,0,0,4.86e-05,0,0.00752,0.00427,0.00219,6.5e-05,0,0,0.00552,0,0,4.97e-05,5.02e-05,4e-05,0,0,0.00177,0,0,0,8.25e-05,0.0111,0.00423,0,0.000111,7.55e-05,0.000207,0,0.000135,0,0,4.15e-05,5.83e-05,0,0.000922,0,0,0,0,0.000183,0.00782,0.00113,0,0,0,0,0,0,0.0279,5.06e-05,4.53e-05,0,0,0.00667,0,0,0,5.68e-05,0,0,0,0.000248,0,0,0,0,0,0,6.58e-05,5.79e-05,0.00173,0.000784,0,0,0,7.88e-05,0.199,0,0.00021,0,3.94e-05,0,0,0,0,0,0.000186,0.000336,6.17e-05,0,0.000561,0,0,0,6.41e-05,0.0107,0.0366,0,0,0,0,0,0.000233,0,0,0.000744,0.00617,7.12e-05,4.6e-05,0,0,3.55e-05,0,0.0179,0,0.0108,0,0,0.000116,0,0,0,0.03,0.0499,0.0105,0.0152,0.000105,7.69e-05,0,0.000116,0,0.000275,0.109,0.0197,0,0,0,0,0,0,4.88e-05,0,0,0.00746,0.00228,7.58e-05,9.51e-05,5.1e-05,0,0,0,0,0.0647,0.0563,0,0,0,0,0,0,0,0,4.72e-05,0,0.00178,8.23e-05,8.2e-05,0,0,0,0,0,0.0183,0,0,4.2e-05,0,4.46e-05,4.91e-05,0,0,0,0,8.85e-05,3.85e-05,0,0,4.36e-05,0.00145,0.00973,0,0.00289,0,0.000916,4.37e-05,3.89e-05,0,0,0,0,0,0,0,3.59e-05,3.85e-05,3.82e-05,0,0,0.0156,0.078,0.0494,0.0635,0,5.35e-05,4.31e-05,3.88e-05,0,0,0,0.000225,0,3.98e-05,3.32e-05,3.77e-05,4.22e-05,0.000132,0.0106,0.000357,0.00435,0.00141,0.000863,7.82e-05,4.47e-05,4.06e-05,3.71e-05,3.43e-05,3.47e-05,3.42e-05,3.73e-05,3.46e-05,3.63e-05,4.57e-05],"winrateAvg":0.283496,"leadAvg":-3.39542,"scoreMeanAvg":-4.45539,"scoreStdevAvg":21.8508,"shorttermWinlossErrorAvg":0.431406,"shorttermScoreErrorAvg":6.981,"ownership":[-86,-75,-67,-64,92,95,91,82,-4,-51,-100,-99,-99,-99,-98,-98,-97,-96,-95,-91,-88,-97,96,90,91,96,96,97,-100,-99,-100,-99,-99,-99,-98,-97,-96,-95,-95,-96,-97,95,95,95,89,96,-99,-100,-99,-99,-100,-99,-99,-100,-97,-95,-93,-96,-96,-93,-94,-89,94,72,60,95,96,-100,-100,-80,-100,-100,-31,-99,-95,-92,-97,-98,-98,12,89,57,54,66,56,96,96,97,-86,11,20,59,56,-88,-91,-96,-98,90,91,89,88,66,49,58,-38,-40,97,97,98,98,98,-98,-98,-91,-97,-87,-94,-93,-94,88,83,91,-22,-12,-9,25,97,-31,20,-89,-88,-95,-92,-91,-86,-87,-90,-93,-93,97,39,-16,-40,-76,-13,60,-3,-87,-83,-98,-98,-91,-90,-86,-92,-93,-94,98,97,25,6,-47,-77,96,96,-87,-86,-60,-70,-83,-86,-89,-94,-92,-93,97,97,53,65,-79,-79,1,96,96,96,97,-82,-61,-75,-76,-92,-92,-95,98,76,73,67,-79,-78,-79,-9,96,62,58,97,-82,-70,-68,-67,-96,-95,-95,98,98,18,-36,-76,-71,-80,-80,-78,95,62,96,-82,-65,-60,-50,-90,-97,80,80,98,16,-79,-78,-73,-79,8,94,95,-33,50,-9,-63,-35,-28,-77,-97,5,98,59,49,-48,-79,-77,99,8,16,94,-13,-83,-84,-45,-24,-6,-33,-76,-89,98,-60,-65,-62,-12,99,99,99,99,-83,-82,-82,93,-13,-42,37,31,13,-88,98,98,97,-71,22,98,46,78,99,12,7,-81,94,94,94,70,72,96,96,87,32,-4,-66,-2,-9,45,65,83,98,10,100,93,93,93,95,88,91,91,95,0,12,0,16,38,89,80,88,94,100,100,100,97,98,95,89,90,90,69,44,14,11,22,45,64,80,87,94,97,98,98,97,97,96],"ownershipAllowedMAE":0.0553858})%"); + lines.push_back(R"%({"sample":{"board":".................../.......O..O..OO..../.....O.X.OX..OXXX../.OOO..OO.OX..OXOOO./.OXXOOXXXX..XXOO.../XXXXXXOO......X..../XOOO.XXOXX....OOO../OX..OXXX.X.....XX../..X..XOOXOXXX..XO../..XOOO.OXOOX.XOOXX./.XXXXO..O.OOXOOXOX./..XOOXX....O.OXXOX./.XXO.OXO.XX.OOX.OX./OOXO.OXOOXOOOX.XOX./.O.OOOXXOOXOXX.XOX./OOO..OX...XO..XOXX./XXOX.OX.OOX.O.XOX../..X.XOX..OX..OXOOO./.X...X.....XO.X..../","hintLoc":"null","initialTurnNumber":206,"metadata":"9C471111D06AEC3C3F5909779EEF789E:216","moveLocs":["M18","K18","N16","J12","S13","S14","T14","T15","O13","S12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":5.5,"policyOptimism":0.893,"pda":-1.849,"policyMixture":[0.000178,0.000214,0.000201,0.0002,0.000201,0.000189,0.000194,0.000248,0.000219,0.000477,0.00092,0.00158,0.00307,0.00276,0.00046,0.00251,0.00145,0.000314,0.0002,0.000212,0.000252,0.00055,0.000684,0.000626,0.000743,0.000428,0,0.000309,0,0,0,0.134,0,0,0.0647,0.000996,0.00248,0.000257,0.000207,0.000303,0.000304,0.0023,0.00467,0,0.00054,0,0.000387,0,0,0.000212,0.0148,0,0,0,0,0.00213,0.000244,0.00032,0,0,0,0.0129,0.0071,0,0,0.0398,0,0,0.000208,0,0,0,0,0,0,0.000264,0.00246,0,0,0,0,0,0,0,0,0,0.000192,0.000182,0,0,0,0,0.000176,0.000329,0,0,0,0,0,0,0,0,0,0.000266,0.000182,0.000182,0.000183,0.00019,0.000234,0,0.000294,0.000491,0,0,0,0,0,0,0.000431,0,0,0,0,0,0.000189,0.000186,0.000203,0,0,0,0,0,0.000174,0,0,0.000976,0.00832,0,0,0,0,0,0,0.000193,0.000182,0.000216,0.000458,0.000571,0,0,0,0.00132,0.000328,0.000216,0,0.000704,0.00532,0,0,0,0.00245,0,0,0,0,0.00026,0.000445,0,0,0.212,0.000361,0.000195,0.00019,0,0,0,0,0.0019,0,0.0002,0,0,0,0.000212,0,0,0,0,0,0.000204,0.000184,0,0,0,0,0,0.0189,0.000443,0,0.000185,0,0,0,0,0,0,0,0,0.000178,0.000202,0.000176,0,0,0,0,0,0.128,0.000752,0.000199,0.000177,0,0.000174,0,0,0,0,0,0.000177,0.000224,0,0,0,0.000184,0,0,0,0.000421,0,0,0.000202,0,0,0,0.000203,0,0,0.000177,0,0,0,0,0.000175,0,0,0,0,0,0,0,0,0,0.000191,0,0,0,0.000177,0,0,0.00273,0,0,0,0,0,0,0,0,0,0,0,0.000203,0,0,0,0.000175,0,0,0,0.0232,0.000157,0,0,0.000263,0.0158,0.000975,0,0,0.0278,0.00024,0,0,0,0,0.000176,0,0,0,0,0.00023,0,0,0.0106,0,0,0,0.0613,0,0.00667,0,0,0,0.000178,0.000178,0.000213,0.000194,0,0.000198,0,0,0,0.0139,0.00416,0,0,0.00107,0.000943,0,0,0,0,0,0.000179,0.00017,0,0.000103,0.000193,0.000229,0,0.0008,0.0199,0.0317,0.039,0.000392,0,0,0.0307,0,0.000186,0.000179,0.000178,0.000169,0.000143],"winrateAvg":0.998735,"leadAvg":11.7167,"scoreMeanAvg":11.6682,"scoreStdevAvg":3.36736,"shorttermWinlossErrorAvg":0.0125816,"shorttermScoreErrorAvg":0.992554,"ownership":[99,99,99,99,99,99,99,98,96,78,34,-41,-39,0,76,95,97,98,98,99,99,99,99,99,99,99,100,98,100,100,-96,-75,99,99,97,98,98,99,98,99,99,99,99,100,99,98,98,100,-99,-93,-52,99,98,98,98,99,99,95,100,100,100,99,99,100,100,-50,100,-99,-97,-100,99,98,100,100,100,99,9,100,-100,-100,99,99,-100,-100,-100,-100,-99,-98,-100,-100,100,100,97,99,100,-100,-100,-100,-100,-100,-100,-99,-99,-100,-99,-99,-98,-96,-91,-89,54,88,100,95,-100,76,77,74,-25,-100,-100,-99,-100,-100,-99,-97,-95,-99,100,100,100,87,95,-97,-98,6,33,95,-100,-100,-100,-49,-100,-99,-97,-94,-13,-2,-96,-97,88,21,-98,-96,-100,-3,79,-99,100,100,-50,100,-100,-100,-100,-27,9,-96,-93,-98,-49,-98,-98,-100,100,100,100,98,100,90,100,100,-100,-83,-89,100,100,-100,-100,-94,-96,-100,-100,-100,-100,100,-23,26,100,99,100,100,-85,100,100,-100,-99,-100,-99,-93,-97,-100,100,100,-99,-99,-74,98,98,98,100,74,100,-100,-100,-99,-100,-100,49,-100,-100,100,100,100,-99,100,97,97,96,99,100,100,-100,-100,-99,-100,-100,100,100,-100,100,100,100,-99,100,100,97,100,100,100,-100,-100,-100,-100,-100,-100,100,100,85,100,100,100,-99,-99,100,100,96,100,-100,-100,-100,-100,-100,-100,-100,100,100,100,-22,55,100,-99,-32,32,99,95,100,-49,-66,-100,-98,-100,-100,-99,-99,-99,100,-99,52,100,-99,-38,100,100,96,96,98,-31,-100,-98,-100,-99,-99,-99,-99,-100,-99,-100,100,-99,-34,59,100,96,97,95,97,-100,-98,-98,-99,-99,-99,-100,-100,-99,-99,-99,-97,-48,28,92,97,95,96,-42,-100,-99,-99,-99,-99],"ownershipAllowedMAE":0.0294611})%"); + lines.push_back(R"%({"sample":{"board":"................../................../................../...O..........O.../................../................../................../................../................../................../..............X.../................../...X............../.............XOO../............OOX.../...X..........X.../................../................../","hintLoc":"null","initialTurnNumber":12,"metadata":"7E9FCB5D898FB550BD5DE953E44417D7:22","moveLocs":["O6","Q7","Q8","R3","N2","M3","R2","R4","M2","P7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.48,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreTERRITORYtaxNONEsui0","komi":8.0,"policyOptimism":0.0,"pda":-0.895,"policyMixture":[1.65e-05,1.93e-05,1.94e-05,1.96e-05,1.95e-05,1.92e-05,1.93e-05,1.95e-05,1.97e-05,1.97e-05,1.96e-05,1.94e-05,1.93e-05,1.96e-05,1.95e-05,1.97e-05,1.92e-05,1.66e-05,1.96e-05,2.65e-05,2.84e-05,2.99e-05,3.07e-05,3.06e-05,2.8e-05,2.74e-05,2.72e-05,2.73e-05,2.76e-05,2.85e-05,3.15e-05,3.23e-05,3.12e-05,2.92e-05,2.63e-05,1.92e-05,1.96e-05,2.8e-05,0.000198,0.00019,0.000115,0.000163,6.45e-05,3.43e-05,3.43e-05,3.51e-05,3.63e-05,7.49e-05,0.000167,0.000127,0.000188,0.00018,2.92e-05,1.99e-05,1.98e-05,2.96e-05,0.000205,0,0.000156,7.37e-05,3.69e-05,3.29e-05,3.29e-05,3.3e-05,3.33e-05,4.3e-05,8.91e-05,0.000178,0,0.000238,3.35e-05,2.01e-05,1.95e-05,3.13e-05,0.000144,0.000179,6.16e-05,3.07e-05,3.08e-05,3.05e-05,3.09e-05,3.08e-05,3.12e-05,3.24e-05,3.4e-05,8.51e-05,0.000233,0.000232,5.47e-05,2.02e-05,1.9e-05,3.07e-05,0.000183,0.000104,3.13e-05,3.08e-05,3.1e-05,3.12e-05,3.1e-05,3.16e-05,3.18e-05,3.2e-05,3.27e-05,3.8e-05,0.000156,0.000278,5.02e-05,2.02e-05,1.91e-05,2.81e-05,9.94e-05,6.11e-05,3.1e-05,3.09e-05,3.11e-05,3.12e-05,3.19e-05,3.22e-05,3.24e-05,3.29e-05,3.38e-05,4.11e-05,0.000159,0.000274,3.29e-05,2.05e-05,1.93e-05,2.75e-05,3.88e-05,3.44e-05,3.06e-05,3.09e-05,3.1e-05,3.13e-05,3.19e-05,3.24e-05,3.27e-05,3.47e-05,4.1e-05,5.65e-05,0.00013,0.000215,3.17e-05,2.04e-05,1.96e-05,2.73e-05,3.49e-05,3.34e-05,3.09e-05,3.1e-05,3.16e-05,3.19e-05,3.21e-05,3.36e-05,4.1e-05,5.22e-05,8.78e-05,0.000108,0.000187,0.000118,2.69e-05,1.99e-05,1.95e-05,2.67e-05,3.26e-05,3.49e-05,3.06e-05,3.12e-05,3.24e-05,3.4e-05,3.88e-05,5.07e-05,9.34e-05,0.000135,0.000191,8.41e-05,2.26e-05,2.13e-05,2.76e-05,1.96e-05,1.92e-05,2.61e-05,3.14e-05,3.13e-05,3.02e-05,3.15e-05,3.39e-05,5.46e-05,9.03e-05,0.000106,0.00014,0.000259,0.000114,0.00214,0,0,3.58e-05,2.08e-05,1.94e-05,2.58e-05,2.9e-05,2.54e-05,2.84e-05,3.27e-05,5.49e-05,0.000127,0.000185,0.000208,0.000238,0.0102,0.000135,0.742,0,0,2.65e-05,1.83e-05,1.94e-05,2.57e-05,2.56e-05,0,2.6e-05,3.31e-05,9.56e-05,0.000183,0.000283,0.00053,0.0009,0.0339,2.57e-05,0,3.5e-05,2.09e-05,2.26e-05,1.79e-05,1.9e-05,2.38e-05,2.71e-05,2.41e-05,2.75e-05,3.29e-05,7.91e-05,0.000209,0.000385,0.000719,0.000221,0.171,3.23e-05,0,0,0,1.93e-05,1.83e-05,1.88e-05,2.29e-05,2.62e-05,2.65e-05,2.8e-05,3.79e-05,0.000126,0.000259,0.000559,0.0018,0.000146,6.36e-05,0,0,0,1.71e-05,0,1.73e-05,1.89e-05,2.2e-05,2.36e-05,0,2.67e-05,4.79e-05,0.000135,0.000147,0.000192,0.0134,0.00541,0,2.58e-05,2.17e-05,0,3.01e-05,0,1.82e-05,1.85e-05,1.95e-05,2.2e-05,2.34e-05,2.78e-05,3.02e-05,3.13e-05,3.15e-05,3.15e-05,3.44e-05,3.96e-05,0,0,1.77e-05,2.75e-05,8.47e-05,0,2.52e-05,1.62e-05,1.82e-05,1.78e-05,1.92e-05,1.92e-05,1.94e-05,2.01e-05,2.03e-05,2.07e-05,2.05e-05,2.07e-05,1.81e-05,1.76e-05,1.78e-05,2.06e-05,1.98e-05,2.09e-05,1.77e-05,1.56e-05],"winrateAvg":0.857644,"leadAvg":4.92416,"scoreMeanAvg":7.14766,"scoreStdevAvg":14.6429,"shorttermWinlossErrorAvg":0.0994121,"shorttermScoreErrorAvg":1.46984,"ownership":[17,16,17,18,16,13,9,7,6,6,7,10,14,19,23,24,25,26,15,14,19,20,20,12,10,9,8,8,9,11,14,23,25,27,24,25,13,16,19,35,30,16,12,11,8,8,11,13,15,31,38,31,27,24,12,14,29,80,32,20,10,9,8,8,10,12,20,30,81,38,25,21,8,12,24,29,18,13,9,7,7,7,9,11,14,19,30,31,21,15,3,1,3,14,10,7,6,5,6,6,7,9,10,13,16,16,7,6,-1,-2,2,2,4,4,3,4,5,5,7,8,9,9,6,2,-3,-4,-3,-3,-1,-1,1,1,2,2,3,4,5,7,9,10,4,-9,-10,-10,-6,-5,-6,-4,-2,0,1,1,1,2,3,6,12,18,-6,-7,-8,-11,-8,-8,-9,-7,-3,-1,0,0,-1,-2,-2,2,16,45,16,-7,-12,-3,-12,-11,-9,-11,-5,-1,-1,-2,-4,-7,-9,-9,14,60,-34,-32,12,14,-18,-21,-24,-21,-9,-4,-3,-4,-7,-11,-18,-44,-21,-60,82,83,46,42,-24,-26,-38,-76,-17,-9,-5,-5,-7,-14,-22,-40,-38,-74,-14,66,72,58,-29,-30,-37,-33,-17,-8,-5,-3,-5,-12,-20,-52,-26,-73,84,85,77,72,-34,-37,-41,-26,-25,-11,-7,-2,-4,-5,-11,-20,10,8,-77,17,84,72,-39,-40,-45,-81,-27,-14,-9,-4,-1,8,-4,19,-32,-35,-78,-12,84,50,-41,-44,-50,-51,-38,-22,-13,-8,-7,-17,-34,-80,-80,-72,-74,-16,-23,34,-42,-44,-45,-42,-33,-22,-12,-8,-11,-21,-40,-56,-71,-72,-59,-42,-17,-1],"ownershipAllowedMAE":0.0273356})%"); + lines.push_back(R"%({"sample":{"board":"..X......X........./.XO...OXX.XO.....O./.XOXXXXOOXOO.X.OOX./.OXO...XO.O.X..OX.X/.O.O...XOXOOX..OX../.OO..X.XO.OXO.OOX../O.O.XXOOX.OX.OXXOO./OOXXO...X.OX.OXOXX./XXX.O.X......XX..../..O..XO.X........../..OOX..X.........../..XOXOOO.........../..XX..X.........O../...............XO../.................../..XXX........O..O../.XOOX.O..O........./.X..OO............./.................../","hintLoc":"null","initialTurnNumber":123,"metadata":"926EDBD3CAA5C70469F660F3D0B098C6:133","moveLocs":["H11","G9","J11","K11","H12","H10","K12","P3","O3","P4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0","komi":6.5,"policyOptimism":0.476,"pda":0.0,"policyMixture":[4.62e-06,6.07e-06,0,5.67e-06,5.68e-06,5.04e-06,5.5e-06,5.45e-06,5.7e-06,0,4.6e-06,4.91e-06,4.69e-06,4.87e-06,4.88e-06,5.35e-06,5.02e-06,4.87e-06,4.98e-06,4.95e-06,0,0,0.00252,5.89e-06,5.63e-06,0,0,0,0,0,0,4.64e-06,4.77e-06,4.7e-06,5.18e-06,5.01e-06,0,7.31e-06,4.63e-06,0,0,0,0,0,0,0,0,0,0,0,4.79e-06,0,4.55e-06,0,0,0,5.38e-06,4.61e-06,0,0,0,5.04e-06,5.21e-06,5.36e-06,0,0,6.51e-06,0,4.39e-06,0,4.16e-06,4.3e-06,0,0,6.6e-05,0,4.49e-06,0,2.38e-05,0,5.07e-06,9.26e-06,4.94e-06,0,0,0,0,0,0,4.65e-06,4.25e-06,0,0,9.16e-06,1.08e-05,3.83e-06,0,0,4.89e-06,5.23e-06,0,2.93e-05,0,0,4.32e-06,0,0,0,4.48e-06,0,0,0,8.48e-05,5.87e-06,0,3.46e-06,0,0.028,0,0,0,0,0,7.91e-06,0,0,4.23e-06,0,0,0,0,0,1.45e-05,0,0,0,0,0,1.27e-05,6.66e-06,0,0,0,0,0,5.21e-06,0,0,0,0,0,1.87e-05,0,0,0,1.4e-05,0,6.28e-06,0,0,0,0,3.83e-05,7.58e-06,4.24e-05,0,0,9.48e-06,4.81e-05,0.117,8.41e-06,1.3e-05,1.92e-05,0,1.66e-05,0.00473,0,0,0,0,6.41e-05,6.62e-06,7.37e-06,7.35e-06,7.88e-06,8.03e-06,3.12e-05,2.48e-05,1.02e-05,1.03e-05,9.05e-06,1.17e-05,0,0,0,2.33e-05,0,0,6.26e-06,1.28e-05,7.73e-06,7.88e-06,8.56e-06,9.55e-06,1.05e-05,1.23e-05,1.91e-05,1.17e-05,5.27e-06,5.68e-06,1.42e-05,0,0,0,0,0,0,1.57e-05,2.7e-05,1.18e-05,1.16e-05,1.49e-05,2.22e-05,3.26e-05,1.03e-05,6.48e-06,6.22e-06,5.16e-06,5.07e-06,5.7e-06,0,0,3.97e-05,3.17e-05,0,7.74e-06,1.34e-05,2.4e-05,2.37e-05,2.19e-05,3.83e-05,4.81e-05,1.92e-05,2.63e-05,0,5.29e-06,4.99e-06,4.67e-06,5.08e-06,5.72e-06,6.01e-06,6.03e-06,6.4e-06,7.19e-06,1.45e-05,2.28e-05,1.8e-05,1.9e-05,2.95e-05,9.24e-05,0.00268,3.03e-05,0,0,4.87e-06,4.9e-06,4.57e-06,5e-06,4.95e-06,4.86e-06,5.43e-06,8.57e-06,3.31e-05,2.44e-05,1.09e-05,1.03e-05,1.12e-05,1.84e-05,5.39e-05,0.0727,0.29,1.72e-05,7.51e-06,9.06e-06,4.58e-06,4.57e-06,4.78e-06,0,0,0,5.93e-06,6.51e-06,8.09e-06,7.12e-06,7.09e-06,7.95e-06,2.44e-05,6.84e-06,0,0,1.75e-05,0,1.29e-05,5.47e-06,4.56e-06,0,0,0,0,4.85e-06,0,5.84e-06,5.8e-06,0,6.62e-06,1.13e-05,6.62e-06,0,0,5.13e-05,0.228,0.000772,4.98e-06,4.58e-06,0,6.42e-06,5.71e-06,0,0,4.73e-06,5.45e-06,5.89e-06,5.94e-06,6.7e-06,6.42e-06,7.75e-05,0.0231,0.227,0.000209,0.000403,1.19e-05,5.39e-06,4.39e-06,5.09e-06,5.73e-06,5.9e-06,4.56e-06,4.36e-06,4.66e-06,4.71e-06,4.69e-06,4.95e-06,4.8e-06,4.98e-06,4.98e-06,5.91e-06,5.01e-06,5.62e-06,5.51e-06,5.7e-06,4.46e-06,4.29e-06],"winrateAvg":0.529154,"leadAvg":0.17594,"scoreMeanAvg":0.716791,"scoreStdevAvg":8.68631,"shorttermWinlossErrorAvg":0.200794,"shorttermScoreErrorAvg":1.03234,"ownership":[-72,-85,-88,-88,-95,-96,-93,-89,-77,-82,2,23,65,78,79,76,64,46,24,-51,-88,20,14,-95,-98,-93,-91,-91,-75,-78,99,87,79,81,86,56,56,-32,1,-88,38,-99,-99,-99,-100,97,97,-77,99,99,90,75,85,95,95,-76,-45,15,99,40,98,21,-44,-76,-95,97,46,99,94,78,79,86,96,-91,-76,-83,95,99,94,98,38,6,-41,-94,97,48,99,99,78,81,89,96,-91,-85,-83,98,98,98,67,-11,-97,-35,-94,97,92,99,-31,93,93,96,96,-92,-90,-87,98,98,98,79,-97,-98,91,92,91,96,99,-28,18,93,-98,-98,-85,-84,-87,98,98,-91,-89,-74,-85,-43,92,91,99,99,-29,12,92,-98,-64,-96,-95,-71,-91,-90,-91,-82,-75,-87,-96,93,93,-18,47,-9,-14,-97,-97,-65,-47,7,-41,-90,-86,-82,-84,-87,-98,-94,-96,-96,-7,6,-4,-12,-25,-32,-17,-7,8,4,-92,-92,-83,-83,-98,-34,-96,-96,-36,-13,-3,-5,-7,-16,-17,-4,10,30,24,-94,-94,-100,-85,-98,35,36,37,-3,4,-3,-4,-9,-17,-20,-1,28,47,46,-96,-97,-100,-100,-47,-9,-58,-4,-1,-2,-1,-2,-8,-21,-20,-6,91,71,63,-96,-96,-93,-57,-36,-22,-15,-5,-8,-2,3,5,5,-16,-21,-56,92,81,73,-97,-96,-91,-64,-39,-10,10,4,1,9,11,21,37,7,-6,-18,28,82,75,-98,-98,-100,-100,-100,-25,18,10,19,18,28,33,44,91,-48,7,92,79,70,-97,-99,-13,-15,-99,-12,89,47,39,91,47,45,54,92,-47,1,40,64,62,-86,-99,-70,-11,87,87,82,78,78,75,67,55,69,48,35,-7,26,40,51,-78,-59,-18,4,37,76,80,78,75,70,63,56,47,44,18,11,16,30,42],"ownershipAllowedMAE":0.0316331,"maxHistory":4})%"); + lines.push_back(R"%({"sample":{"board":".......OOX.....X.../.OOXXXXOX.XOXXXOXXO/.OXXOOOOX...XOOOXO./.OXO.OOXXX..XXO.O../O.OXOO.O.....OOO.O./.OOXXO........X..../.XOXXO..........X../..X..XO.XX....XX.X./..X..X.OOXXX..XOXO./.........OXO...OO../.........OXO.O.O.../..X..X....OX......./...X.XO..O.X...OO../..XOOOO......X.X.../..X...XXXXXX...OX../..XO..OOO.OOO.XOX../..OO.....O..XO.X.../.................../.................../","hintLoc":"null","initialTurnNumber":152,"metadata":"B2B8D293C09176564C9CD7F9D6A4C89E:162","moveLocs":["E16","K18","K17","D16","S16","T16","E16","O5","P5","D16"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":2.03,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":-2.5,"policyOptimism":0.0,"pda":-1.545,"policyMixture":[6.22e-06,6.68e-06,6.53e-06,6.64e-06,6.64e-06,6.57e-06,1.01e-05,0,0,0,6.03e-06,6.47e-06,6.15e-06,6.05e-06,0.00024,0,2.84e-05,1.26e-05,1.94e-05,6.59e-06,0,0,0,0,0,0,0,0,6.05e-06,0,0,0,0,0,0,0,0,0,6.38e-06,0,0,0,0,0,0,0,0,0,6.34e-06,6.35e-06,0,0,0,0,0,0,0,7.15e-06,0,0,0,0,0,0,0,0,0,7.12e-06,6.62e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,7.85e-06,0,8.49e-06,6.73e-06,7.15e-06,7.19e-06,8.25e-06,0,0,0,8.98e-06,0,6.47e-06,0.000123,0,0,0,0,0,9.86e-05,0.0165,0.000318,7.29e-06,7.16e-06,7.87e-06,7.77e-06,8.44e-06,0,7.22e-06,0.000221,7.82e-06,7.34e-06,6.85e-06,0,0,0,0,0,0.00204,0.179,2.43e-05,6.85e-06,7.04e-06,7.56e-06,7.49e-06,7.42e-06,7.2e-06,6.77e-06,0,7.6e-06,8e-06,8.7e-06,7.39e-06,0,7.28e-06,6.62e-06,0,0,3.59e-05,0,0,6.14e-06,6.88e-06,6.91e-06,7.26e-06,0,0,9.27e-06,0,8.11e-06,7.54e-06,7.21e-06,0,7.06e-06,7.19e-06,0,0.00787,0,0,0,0,0,8.94e-06,7.82e-06,0,0,0,0,0.0388,6.5e-06,6.82e-06,7.07e-06,7.17e-06,7.6e-06,2.33e-05,0.00154,4.39e-05,0.00167,0,0,0,1.23e-05,0.000346,0.0155,0,0,0.162,9.43e-06,6.38e-06,7.17e-06,7.13e-06,6.83e-06,6.96e-06,8.42e-06,2.05e-05,0.00738,1.52e-05,0,0,0,2.1e-05,0,1.14e-05,0,6.27e-06,0.129,9.57e-06,6.72e-06,7.08e-06,0,6.24e-06,6.51e-06,0,7.07e-05,1.53e-05,0.00275,8.03e-06,0,0,1.22e-05,7.04e-05,0.00444,7.71e-06,0.000179,0.0462,1.25e-05,6.36e-06,6.32e-06,5.9e-06,0,6.45e-06,0,0,9.01e-06,3.08e-05,0,4.05e-05,0,7.99e-06,2.6e-05,0.00785,0,0,0.00196,9.85e-06,6.57e-06,6.36e-06,0,0,0,0,0,7.27e-06,6.83e-06,7.68e-06,6.49e-06,7.14e-06,1.04e-05,0,9.51e-06,0,8.59e-06,0.185,9.89e-06,7.24e-06,7.04e-06,0,0.00547,1.7e-05,0.0497,0,0,0,0,0,0,2.18e-05,0,0,6.28e-06,0,9.52e-06,8.73e-06,7.9e-06,7.74e-06,0,0,0.000111,0.0137,0,0,0,0.00335,0,0,0,0.104,0,6.45e-06,0,7.48e-06,7.09e-06,7e-06,0.000104,0,0,7.8e-06,1.41e-05,7.41e-06,5.77e-06,2.26e-05,0,1.31e-05,9.84e-06,0,0,8.17e-06,0,6.96e-06,7.06e-06,6.58e-06,7.42e-06,1e-05,8.97e-06,7.2e-06,7.67e-06,7.8e-06,7.05e-06,7.35e-06,7.42e-06,8.59e-06,1.09e-05,0.000122,0.00118,0.00776,9.92e-06,7.61e-06,7.29e-06,6.77e-06,6.55e-06,6.72e-06,7.98e-06,6.84e-06,6.47e-06,6.46e-06,6.21e-06,6.3e-06,6.29e-06,6.8e-06,6.92e-06,7.42e-06,7.23e-06,8.58e-06,7.1e-06,7.4e-06,7.24e-06,6.89e-06,6.75e-06,6.4e-06,1.31e-05],"winrateAvg":0.509445,"leadAvg":-0.101439,"scoreMeanAvg":-0.405673,"scoreStdevAvg":10.7497,"shorttermWinlossErrorAvg":0.267015,"shorttermScoreErrorAvg":1.73042,"ownership":[97,96,45,35,3,9,37,90,90,-94,-94,-96,-96,-94,-84,-84,-15,22,67,98,99,99,-12,-13,-11,-12,91,-99,-95,-98,-93,-98,-99,-99,99,-7,-4,96,98,99,-15,-15,87,91,92,91,-99,-99,-91,-95,-99,98,99,99,-5,97,96,98,99,-21,-11,-10,92,92,-98,-99,-99,-56,-53,-98,-98,99,98,98,97,98,98,98,98,-90,94,92,64,69,-1,-44,-37,-28,36,98,98,98,84,98,82,73,97,97,-90,-90,92,54,7,-14,-30,-33,-23,10,34,-64,26,-13,9,26,38,4,97,-92,-91,92,81,-11,-27,-46,-38,-33,-18,-9,-39,-49,-79,-23,-15,-25,3,-97,-89,-81,-86,88,28,-97,-97,-68,-52,-47,-44,-91,-91,-10,-55,-20,-39,-87,-96,-77,-71,-87,20,88,86,-97,-97,-97,-36,-34,-91,84,-10,27,-9,-71,-81,-77,-61,-50,-13,-1,33,55,71,-97,44,-5,-1,-13,85,86,14,19,-81,-86,-76,-51,-47,-29,2,11,28,73,-97,45,24,74,47,86,65,42,28,-85,-90,-97,-72,-63,-83,-3,24,6,51,56,-82,-11,6,35,60,59,39,30,-83,-86,-92,-93,39,-83,94,36,11,72,-31,-84,-31,11,45,83,83,32,14,-78,-89,-95,94,94,93,93,11,-24,-10,-42,-52,-28,-79,-45,-89,0,-24,-14,-48,-86,-95,-11,11,-34,-87,-85,-84,-84,-83,-83,23,60,-98,-89,-98,-67,-47,-29,-18,-95,98,46,44,97,97,97,-8,96,96,95,-33,-98,-96,-98,-85,-64,13,7,97,98,83,85,88,91,93,98,88,70,26,46,-52,-98,-89,-79,-71,28,76,83,92,89,87,89,90,90,89,73,58,35,5,-29,-78,-73,-77,-75,57,75,82,86,87,86,86,85,83,77,68,51,25,-2,-31,-45,-66,-71,-73],"ownershipAllowedMAE":0.0365165})%"); + lines.push_back(R"%({"sample":{"board":"................../....OX.......OX.../..OOXO..X...O...../...XXX.....O..XX../.X.XO..........O../.OOOXXXXXX..XXXO../...OOOOOO..OXOOXO./.OXOX.......OOXXO./.O.X..X.........../.XX............O../.OX....X........../.O.X.XXOO.....O.../....O.OX.O.....X../.O....OX..XOO...../..OOOOXOX.XXXOOO../.OXXXXX......XXXO./.X................/................../","hintLoc":"null","initialTurnNumber":84,"metadata":"F85BB17E87EDAC44B1A73DBC7135C3C6:94","moveLocs":["H9","J8","G9","M11","M10","L11","L10","J9","H10","M7"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.63,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreAREAtaxALLsui0","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.28e-06,4.74e-06,5.17e-06,5.5e-06,5.46e-06,0.000889,5.1e-06,4.65e-06,4.76e-06,4.6e-06,4.61e-06,4.86e-06,4.72e-06,5.25e-06,3.68e-05,5.6e-06,5.66e-06,3.94e-06,5.16e-06,5.18e-06,5.32e-06,5.7e-06,0,0,0.000213,5.4e-06,1.1e-05,9.07e-06,5.87e-06,8.63e-06,4.97e-06,0,0,0.00737,8.79e-06,5.53e-06,4.82e-06,5.4e-06,0,0,0,0,4.56e-05,5.64e-06,0,1.83e-05,7.42e-06,4.5e-06,0,8.45e-06,9.54e-05,1.15e-05,9.38e-06,5.31e-06,4.8e-06,1.13e-05,5.09e-06,0,0,0,5.15e-06,5.12e-06,5.42e-06,5.39e-06,5.66e-06,0,5.2e-06,3.06e-05,0,0,4.5e-05,5.66e-06,4.85e-06,0,5.58e-06,0,0,4.54e-06,4.53e-06,4.29e-06,4.44e-06,4.94e-06,6.65e-06,5.93e-06,5.95e-06,6.19e-06,0.00303,0,6.88e-06,5.8e-06,4.38e-06,0,0,0,0,0,0,0,0,0,9.95e-06,0.00018,0,0,0,0,5.03e-06,4.87e-06,4.44e-06,4.18e-06,4.27e-06,0,0,0,0,0,0,7.19e-06,0.00177,0,0,0,0,0,0,4.08e-06,4.36e-06,0,0,0,0,4.92e-06,4.73e-06,4.83e-06,5.03e-06,0.000194,0,0,0,0,0,0,0,4.18e-06,4.29e-06,0,4.72e-06,0,4.88e-06,5.89e-06,0,0,1.96e-05,1.97e-05,0,0,5.18e-06,4.81e-06,5.14e-06,5.04e-06,4.44e-06,4.28e-06,4.53e-06,0,0,4.93e-06,8.47e-06,8.61e-05,0,0,0,1.46e-05,8.04e-06,4.99e-06,9.4e-06,5.16e-06,4.76e-06,0,4.52e-06,4.4e-06,4.26e-06,0,0,5.21e-06,1.96e-05,1.67e-05,0.0429,0,0,0.345,0.152,0.000491,9.18e-06,5.37e-06,4.72e-06,4.69e-06,4.4e-06,4.45e-06,4.22e-06,0,4.84e-06,0,0.133,0,0,0,0,2.87e-05,0.037,0,2.04e-05,5.26e-06,0,4.81e-06,4.6e-06,4.45e-06,4.63e-06,4.19e-06,4.21e-06,4.64e-06,0,5.09e-06,0,0,0.00105,0,0.258,4.01e-05,5.46e-06,8.06e-06,5.35e-06,0,4.75e-06,4.39e-06,4.31e-06,0,4.28e-06,4.06e-06,4.42e-06,4.06e-06,0,0,0.0155,6.15e-06,0,0,0,4.56e-06,4.57e-06,4.6e-06,5.16e-06,4.47e-06,4.47e-06,4.45e-06,0,0,0,0,0,0,0,7.17e-06,0,0,0,0,0,0,5.1e-06,4.68e-06,4.58e-06,0,0,0,0,0,0,4.85e-05,5.23e-06,4.45e-06,4.45e-06,4.47e-06,1.02e-05,0,0,0,0,4.14e-06,5.06e-06,0,4.75e-06,4.47e-06,4.23e-06,4.39e-06,4.64e-06,4.45e-06,4.53e-06,4.62e-06,4.58e-06,4.68e-06,5.24e-06,5.3e-06,4.93e-06,5.51e-06,5.96e-06,5.12e-06,4.05e-06,4.62e-06,4.59e-06,4.29e-06,4.33e-06,4.26e-06,4.14e-06,4.17e-06,4.12e-06,4.19e-06,4.21e-06,4.26e-06,4.54e-06,4.82e-06,4.8e-06,4.74e-06,5.09e-06,4.3e-06,6.88e-06],"winrateAvg":0.658724,"leadAvg":2.30855,"scoreMeanAvg":2.50987,"scoreStdevAvg":11.2138,"shorttermWinlossErrorAvg":0.342116,"shorttermScoreErrorAvg":3.44775,"ownership":[-1,-1,-6,-14,-32,-39,-58,-59,-52,-35,-20,-7,2,-5,-32,-36,-37,-37,-1,-1,3,-25,-20,-82,-67,-64,-62,-37,-15,-7,6,18,-54,-23,-35,-34,-8,2,15,15,-99,-72,-80,-72,-91,-30,-32,-5,21,-24,-33,-49,-43,-28,-11,-17,-56,-99,-99,-99,-80,-76,-55,-40,-20,23,-12,-39,-70,-69,-12,-8,21,-60,-5,-99,-96,-98,-86,-78,-67,-49,-30,-22,-24,-12,25,85,31,29,46,99,99,99,-99,-100,-100,-100,-100,-99,-43,-32,-63,-61,-59,86,78,59,87,91,87,99,99,99,99,99,98,8,-22,-1,-63,71,75,53,94,77,83,97,59,99,40,69,75,57,24,-17,-54,-52,72,72,52,55,94,85,70,97,61,23,43,52,42,87,-2,-19,57,62,34,50,65,79,85,84,64,23,25,38,50,38,86,86,-53,-22,-18,4,23,31,49,95,81,79,70,93,27,39,49,22,21,-41,-48,35,41,35,25,31,41,68,70,70,85,93,60,28,64,-5,-6,57,58,39,10,-22,22,33,85,64,61,61,87,86,62,53,87,24,86,-80,19,62,25,-1,21,37,54,33,50,54,72,95,76,70,80,84,86,-87,-3,-14,-98,46,47,30,46,50,54,47,52,54,95,95,95,95,-99,-85,-97,-72,-99,-99,-99,71,70,70,45,42,-7,57,-99,-99,-99,-99,-99,-94,-93,-92,-93,-93,-92,-94,-94,-94,48,24,-6,-69,-68,-95,-97,-97,-97,-95,-94,-92,-92,-90,-88,-84,-76,-45,-23,14,-42,-59,-79,-87,-94,-95,-95,-94,-93,-91,-89,-85,-78,-69,-56,-40,-26,-10],"ownershipAllowedMAE":0.0367632})%"); + lines.push_back(R"%({"sample":{"board":".................../..X.XXO...X.....X../....XO.O.XOXX.XXOX./..O..XO.X.O..XOO.../...OX...........O../....X.....XOOOOOXO./..O.......XXXXXOXO./...X..........XX.../..OO.O.......O.XXO./.O.O.X........OOXO./.OXOX.O.........O../.OXOX...X...X.O.O../OXOOX.X..X.O.XXX.../.XXX.X.O..XO.XO.X../.X.X....OOO....O.X./..XOOOOOXXXXXX.OX../.OXXOXOOOXOOXOO.OXO/.OOOXXXOXX.OO....O./.......O.........../","hintLoc":"null","initialTurnNumber":154,"metadata":"B71C540E3CFD7EFC9C79075F1A88D118:164","moveLocs":["G10","L7","M9","L9","O9","M10","L10","K9","S12","R12"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui0","komi":7.0,"policyOptimism":0.158,"pda":0.0,"policyMixture":[1.63e-05,1.75e-05,1.71e-05,1.76e-05,1.72e-05,1.78e-05,1.81e-05,1.75e-05,1.75e-05,1.81e-05,1.71e-05,1.8e-05,1.74e-05,1.69e-05,1.72e-05,1.75e-05,1.72e-05,1.87e-05,1.63e-05,1.93e-05,1.88e-05,0,1.71e-05,0,0,0,1.67e-05,1.91e-05,1.79e-05,0,1.79e-05,1.77e-05,1.7e-05,1.74e-05,1.76e-05,0,1.91e-05,1.93e-05,1.93e-05,2.36e-05,2.02e-05,1.79e-05,0,0,1.91e-05,0,1.8e-05,0,0,0,0,1.71e-05,0,0,0,0,1.91e-05,1.93e-05,2.34e-05,0,2.34e-05,1.89e-05,0,0,1.88e-05,0,2e-05,0,2.21e-05,1.7e-05,0,0,0,2.38e-05,2.2e-05,1.91e-05,1.97e-05,4.66e-05,2.15e-05,0,0,1.92e-05,2.22e-05,2.14e-05,2.08e-05,1.96e-05,2.31e-05,2.37e-05,1.71e-05,1.89e-05,1.81e-05,1.64e-05,0,1.69e-05,1.78e-05,1.93e-05,2.27e-05,0.000178,0.000449,0,2.09e-05,2.46e-05,2.43e-05,2.31e-05,2.01e-05,0,0,0,0,0,0,1.41e-05,0,1.65e-05,1.81e-05,2.9e-05,0,0.000258,2.29e-05,3.88e-05,6.57e-05,5.29e-05,2.52e-05,2.1e-05,0,0,0,0,0,0,0.697,0,1.56e-05,1.91e-05,6.39e-05,0.000217,0,0.000119,0.000125,0.000108,0.000179,6.46e-05,4.73e-05,2.05e-05,1.95e-05,1.9e-05,1.83e-05,0,0,0,0,0.00036,1.76e-05,1.96e-05,0,0,6.02e-05,0,0.000799,0.00019,0.000238,0.000255,0.0553,0.00549,5.84e-05,0,1.97e-05,0,0,0,2.01e-05,1.67e-05,0,0,0,2.2e-05,0,0,0.0205,0.000143,0.0238,0,0,0.0289,4.62e-05,0,0,0,0,1.82e-05,1.64e-05,0,0,0,0,2.08e-05,0,0.000114,0.0123,0,0,0,4.01e-05,0,2.9e-05,0.0657,0,0.00363,3.79e-05,1.79e-05,0,0,0,0,1.85e-05,2.33e-05,2.44e-05,0,0.00015,0.00389,0.00068,0,1.92e-05,0,5.1e-05,0,0.000328,3.21e-05,0,0,0,0,0,1.62e-05,0,2.72e-05,1.96e-05,0,0,0,1.89e-05,0,0,0,2.19e-05,0.00136,2.15e-05,1.9e-05,0,0,0,1.68e-05,0,1.72e-05,0,1.77e-05,0.000142,0,0,1.84e-05,0,0,1.93e-05,0,1.98e-05,2.12e-05,1.71e-05,0,1.53e-05,0,1.87e-05,1.69e-05,0.00172,0.000301,0,0,0,0.000115,1.68e-05,1.8e-05,1.98e-05,0,2.04e-05,0,1.88e-05,1.86e-05,2.14e-05,0,0,0,0,0,0,0,0,0,0,0,0,1.84e-05,0,0,0.0461,0.0256,1.85e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.97e-05,0,0,0,1.74e-05,0,0,0,0,0,0,0,0,0,1.83e-05,0,0,1.96e-05,2.03e-05,2.01e-05,2.16e-05,0,2e-05,1.56e-05,1.68e-05,1.59e-05,1.64e-05,1.61e-05,1.58e-05,1.57e-05,0,1.75e-05,1.74e-05,1.88e-05,1.83e-05,1.72e-05,1.78e-05,1.71e-05,1.66e-05,1.77e-05,1.8e-05,1.71e-05,1.62e-05],"winrateAvg":0.791129,"leadAvg":2.56034,"scoreMeanAvg":2.92107,"scoreStdevAvg":9.22172,"shorttermWinlossErrorAvg":0.222404,"shorttermScoreErrorAvg":1.78113,"ownership":[-53,-69,-80,-89,-90,-84,-75,-72,-79,-86,-89,-92,-92,-92,-91,-90,-84,-77,-68,-36,-56,-91,-67,-96,-96,-60,-70,-82,-86,-93,-91,-94,-92,-94,-90,-89,-66,-63,-15,-8,-1,3,-96,-71,-69,-55,-78,-94,26,-98,-98,-93,-98,-97,6,-71,-23,11,45,79,3,-65,-92,-52,-69,-94,-25,23,-3,-24,-93,84,85,4,36,8,44,49,60,71,-94,-57,-64,-57,-46,-35,-39,21,38,18,55,81,91,53,58,66,72,60,-16,-94,-40,-43,-38,-33,-41,-99,92,93,92,92,91,71,92,78,82,85,92,-4,-28,-5,-14,-16,-19,-34,-99,-99,-99,-99,-99,92,-50,92,87,88,91,12,-46,6,13,11,-2,-4,-21,-52,-66,-62,-64,-99,-99,-40,-31,90,94,95,99,99,46,69,-18,-9,-1,-8,-57,-61,-60,-9,-38,-99,-99,88,84,96,99,99,99,4,-93,-93,-20,13,8,-74,-49,-74,-54,2,2,-98,87,78,95,99,98,99,-95,-65,0,-7,37,83,84,-90,-87,-93,-31,-4,83,81,57,81,99,97,99,-94,-65,-52,-24,-52,19,64,40,-96,-39,68,41,83,55,13,83,-92,99,99,-94,-84,-89,10,-5,-38,96,96,-29,-96,-96,-96,-19,-34,-17,-60,-92,-92,-91,-91,-94,-5,98,50,28,29,96,-25,-96,80,-25,-93,-57,-49,-50,-92,-70,-92,43,-14,-18,95,99,99,99,31,-65,-13,43,96,-16,-89,-51,4,16,-71,100,100,100,100,100,-92,-91,-92,-91,-90,-90,33,96,-67,-54,-31,57,99,-57,-57,100,98,100,100,100,-92,95,95,-91,97,97,93,96,-51,60,97,99,99,100,99,99,99,100,-91,-92,-35,96,96,96,95,96,93,93,61,98,98,99,99,99,99,99,100,21,-60,-35,28,85,94,95,95,93,87,79],"ownershipAllowedMAE":0.0420673})%"); + lines.push_back(R"%({"sample":{"board":".OO.O.X.X.O...O..../XOXO.OOX.XOOOOXO.../.XXXOOXOX.OX.XXO.../..XXOXXOXXXXX..OX../.OXXOX.OOOOOXOO.O../..XOOX..O..XXXXOO../.X.XOX.XOOXX..XXO../.X.XX...OXOXOOXXO../..XO..X.OXOOXXXOO../....XXO.OX..OOOXXO./.O.OXOO.OXOO...XOO./.X.OX...OOXXXX.XO../...OOO..XXOO.OX.XX./.XXXO.O.XO.O.OOX.../.OX.XO.XXXXOXXO.X../.X..XOX.OXOXXO.OXX./..XX.OX.OOOOX.OXX.X/.....XXOO.OX.XOOOX./......XXO........O./","hintLoc":"null","initialTurnNumber":236,"metadata":"7A38DEAA8D840F2C50ED9F0BED253688:246","moveLocs":["B10","A9","D10","C9","H7","F8","G12","N9","A10","L14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[0.000113,0,0,0,0,0.000451,0,0.0174,0,0.00102,0,0.000218,0.00314,0.00548,0,0.00334,0.00126,0.000243,0.000192,0,0,0,0,0,0,0,0,0.155,0,0,0,0,0,0,0,0.000247,0.000212,0.000215,0.361,0,0,0,0,0,0,0,0,0.000553,0,0,0.141,0,0,0,0.000222,0.000211,0.000196,0.000246,0.000226,0,0,0,0,0,0,0,0,0,0,0,0.0977,0.00368,0,0,0.000214,0.000202,0.000235,0,0,0,0,0,0.000781,0,0,0,0,0,0,0,0,0,0,0.000207,0.000199,0.000224,0.000236,0,0,0,0,0.00186,0.00162,0,0,0,0,0,0,0,0,0,0.000194,0.0002,0.000233,0,0.00025,0,0,0,0.000294,0,0,0,0,0,3.89e-05,3.55e-05,0,0,0,0.000192,0.000204,0.000232,0,0.000251,0,0,0.000275,0,0.000298,0,0,0,0,0,0,0,0,0,0.000231,0.000223,0.000245,0.000263,0,0,0.000266,0.000273,0,0.00041,0,0,0,0,0,0,0,0,0,0.00188,0.000247,0,0,0.000905,0,0,0,0,0.000263,0,0,0.00234,0.00209,0,0,0,0,0,0,0.000243,0,0,0,0,0,0,0,0.000268,0,0,0,0,0,0.000281,0.00271,0,0,0,0.00197,0.0145,0,0.000432,0,0,0,0.000243,0.00193,0,0,0,0,0,0,0.00616,0,0,0.00787,0.00463,0.00173,0.0021,0.00231,0,0,0,0.000371,0,0,0,0,0,0.000516,0,0,0.00312,0,0,0.000417,0.000289,0,0,0,0,0,0,0.000281,0,0,0.0213,0,0.000221,0,0,0,0.000182,0.000309,0.000275,0.000262,0,0,0.000258,0,0,0.0109,0,0,0,0,0,0,0,0,0.017,0,0.000256,0.00031,0.000231,0,0.000259,0.000274,0,0,0,0.0108,0,0,0,0,0,0,0,0,0,0,0.000232,0.000223,0.000239,0,0,0.0262,0,0,0.00362,0,0,0,0,0,0.00175,0,0,0,0.000278,0,0.000217,0.000231,0.000233,0.000264,0.00109,0,0,0,0,0.000308,0,0,0.0108,0,0,0,0,0,0.00354,0.00021,0.000217,0.000221,0.000234,0.000255,0.000209,0,0,0,0.0017,0.00463,0.000462,0.00207,0.00088,0.00134,0.00022,0.0102,0,0.000899,0.000214],"winrateAvg":0.0014347,"leadAvg":-24.8407,"scoreMeanAvg":-24.0859,"scoreStdevAvg":4.92935,"shorttermWinlossErrorAvg":0.00855153,"shorttermScoreErrorAvg":1.47691,"ownership":[-100,-100,-98,-99,-96,-96,-97,-96,-97,81,99,98,98,98,98,98,98,98,98,-100,-99,-100,-97,-98,-96,-96,-97,-97,-97,99,99,99,99,-92,100,98,98,98,-100,-100,-100,-100,-97,-96,-100,97,-97,57,99,-98,-7,-91,-91,100,99,98,98,-99,-99,-100,-100,-96,-100,-100,100,-97,-98,-98,-98,-98,3,85,100,98,99,98,-99,-97,-100,-100,-96,-100,-3,100,100,100,100,100,-98,100,100,99,100,99,99,-99,-99,-100,-96,-95,-100,45,45,100,99,100,-98,-98,-98,-98,100,100,99,99,-98,-100,-99,-100,-95,-100,-70,-94,100,100,-98,-98,-96,-96,-98,-98,100,99,99,-97,-100,-98,-100,-100,-99,-100,-28,100,98,100,-98,-95,-96,-98,-98,100,99,98,-97,-97,-100,-96,-98,-98,-100,-15,100,98,99,99,-98,-97,-98,100,100,98,96,-98,-99,33,-100,-99,-100,100,61,100,98,99,99,100,100,100,-98,-98,99,77,100,100,100,100,-100,100,100,62,100,98,100,100,100,64,-26,-98,98,98,3,52,-52,44,100,-99,100,59,-1,100,100,-88,-88,-87,-90,-89,-98,98,-49,-41,32,-8,-52,100,100,100,-5,-100,-100,-100,94,94,27,94,-97,-97,-99,-99,-85,-57,-100,-100,-100,100,97,99,-53,-100,-46,-46,94,95,94,94,-99,-97,-96,-95,-96,-96,-100,-96,-97,97,-39,-100,-99,-100,-99,94,91,90,94,-59,-99,-97,-96,-98,-100,-98,-96,-98,94,-100,-73,95,-99,94,91,91,94,92,92,-99,-99,-96,-99,-99,-100,-100,-48,94,-100,15,95,94,94,95,91,94,95,-99,-99,-95,-97,-99,-99,-99,-99,-97,-99,-100,95,95,95,94,90,92,89,95,95,95,-95,-71,-99,-99,-99,-98,-98,-98,-100,-99,94,93,92,93,92,93,92,86,60,60,-36],"ownershipAllowedMAE":0.0270189})%"); + lines.push_back(R"%({"sample":{"board":".................../.........XOO......./......X..XO.O..X.../.XO.O..XXOXO......./..XO....OOX....X.../..X.......X......../.................../.................../.................../................O../.................../.................../................O../.................../............XX.X.../...........X.OX..../..O..........OOXX../...........O...OO../.................../","hintLoc":"null","initialTurnNumber":41,"metadata":"8B460664AFE4EF005DB2CF707CC45490:51","moveLocs":["K13","C17","L13","N15","P16","P15","Q16","R16","O16","N13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxSEKIsui1","komi":6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.44e-06,5.86e-06,5.99e-06,5.86e-06,6.49e-06,6.7e-06,6.6e-06,7.47e-06,8.92e-06,5.15e-05,6.73e-06,5.79e-06,6.21e-06,6.58e-06,7.2e-06,7.25e-06,6.83e-06,6.26e-06,5.4e-06,5.8e-06,7.42e-06,2.39e-05,8.42e-06,1.2e-05,1.24e-05,1.67e-05,0.00279,0.000113,0,0,0,5.78e-06,8.26e-06,1.84e-05,2.99e-05,1.16e-05,9.89e-06,6.06e-06,6.11e-06,2.22e-05,0,0.0196,7.97e-06,3.77e-05,0,6.95e-06,3.89e-05,0,0,4.75e-06,0,5.82e-06,1.78e-05,0,0.455,8.96e-06,6.68e-06,6.48e-06,0,0,3.76e-05,0,1.09e-05,7.73e-06,0,0,0,0,0,7.7e-06,0,0,0,0,1.83e-05,6.31e-06,6.13e-06,7.72e-06,0,0,7.15e-06,3.55e-05,0.000511,0.000385,0,0,0,0.0011,0,0.162,0,0,0.114,1.1e-05,6.5e-06,6e-06,7.51e-06,0,0.000125,1.94e-05,0.000381,0.166,6.73e-05,8.33e-06,7.22e-05,0,0.00114,8.87e-05,4.35e-05,8.67e-06,7.45e-06,1.88e-05,1.48e-05,6.48e-06,6.19e-06,8.45e-06,1.13e-05,6.51e-05,0.000127,0.000167,0.00642,0.00355,8.52e-05,0,0,0.00311,0,5.94e-05,0.000151,8.34e-05,7.95e-05,1.75e-05,6.51e-06,6.2e-06,9.11e-06,1.46e-05,4.76e-05,8.52e-05,7.48e-05,6.76e-05,5.32e-05,1.13e-05,6.87e-06,6.91e-06,1.6e-05,0.000134,6.85e-05,2.82e-05,5.27e-05,7.47e-05,1.13e-05,6.47e-06,6.13e-06,9.29e-06,1.69e-05,3.14e-05,3.96e-05,3.29e-05,2.9e-05,2.37e-05,1.92e-05,1.32e-05,2.01e-05,4.54e-05,6.96e-05,3.95e-05,2.33e-05,1.05e-05,8.94e-06,9.35e-06,6.24e-06,6.1e-06,9.42e-06,1.94e-05,3.15e-05,2.28e-05,1.71e-05,1.56e-05,1.53e-05,1.77e-05,2.2e-05,3.4e-05,3.61e-05,3.6e-05,2.31e-05,1.23e-05,8.61e-06,0,6.97e-06,6.08e-06,6.18e-06,9.54e-06,2.64e-05,3.74e-05,1.59e-05,1.28e-05,1.24e-05,1.23e-05,1.36e-05,1.94e-05,2.34e-05,1.92e-05,1.94e-05,1.63e-05,1.1e-05,9.03e-06,7.14e-06,7.19e-06,5.81e-06,6.22e-06,9.57e-06,2.32e-05,3.65e-05,1.28e-05,1.17e-05,1.16e-05,1.17e-05,1.2e-05,1.29e-05,1.34e-05,1.6e-05,1.79e-05,1.52e-05,1.39e-05,8.91e-06,7.17e-06,7.23e-06,5.83e-06,6.22e-06,9.57e-06,2.08e-05,4.18e-05,1.16e-05,1.14e-05,1.13e-05,1.14e-05,1.16e-05,1.18e-05,1.2e-05,1.08e-05,2.48e-05,1.25e-05,9.17e-06,7.93e-06,0,7.46e-06,5.95e-06,6.17e-06,9.38e-06,2.69e-05,5.06e-05,1.08e-05,1.11e-05,1.11e-05,1.12e-05,1.15e-05,1.14e-05,9.93e-06,1e-05,7.34e-06,7.47e-06,0.0583,1.1e-05,8.71e-06,9.65e-06,5.98e-06,6.14e-06,9.35e-06,1.27e-05,3.81e-05,9.82e-06,1.06e-05,1.09e-05,1.11e-05,1.16e-05,1.11e-05,9.89e-06,7.53e-06,0,0,7.35e-06,0,1.12e-05,1.02e-05,6.24e-06,6.03e-06,8.02e-06,8.95e-06,1.16e-05,2.87e-05,1.92e-05,1.15e-05,1.1e-05,1.07e-05,1.17e-05,9.9e-06,0,6.5e-06,0,0,1.42e-05,2.1e-05,9.29e-06,6.25e-06,6.01e-06,6.8e-06,0,8.98e-06,1.08e-05,1.09e-05,1.01e-05,9.94e-06,1e-05,1e-05,3.2e-05,7.81e-06,5.44e-06,0,0,0,0,1.1e-05,6.9e-06,5.85e-06,6.23e-06,6.66e-06,7.88e-06,8.78e-06,8.54e-06,8.5e-06,8.23e-06,7.99e-06,8.88e-06,7.96e-06,0,5.93e-06,6.35e-06,5.49e-06,0,0,8.36e-06,6.73e-06,5.59e-06,5.75e-06,5.98e-06,5.96e-06,5.99e-06,5.98e-06,6e-06,6.03e-06,5.96e-06,5.83e-06,5.88e-06,5.65e-06,6.13e-06,6.07e-06,6.21e-06,5.06e-06,5.42e-06,6.09e-06,5.92e-06,6.56e-06],"winrateAvg":0.422202,"leadAvg":-0.342597,"scoreMeanAvg":-0.681334,"scoreStdevAvg":13.814,"shorttermWinlossErrorAvg":0.139073,"shorttermScoreErrorAvg":1.18016,"ownership":[-61,-57,-51,-45,-43,-48,-49,-39,-27,22,44,78,78,67,52,32,13,-5,-18,-64,-62,-59,-41,-43,-48,-66,-38,-47,-69,89,89,82,67,56,25,19,-13,-30,-67,-66,-77,-14,-30,-42,-85,-69,-68,-69,88,79,90,75,55,11,15,-48,-39,-68,-79,-32,-36,2,-34,-45,-82,-82,56,-57,78,27,88,87,88,-75,-54,-46,-65,-68,-84,1,-25,-41,-16,-16,54,54,-54,18,-63,55,-75,-77,-50,-50,-44,-53,-59,-84,-31,-24,-14,-1,2,21,-13,-55,-24,-49,-50,-29,-34,-34,-32,-33,-36,-36,-28,-19,-11,-10,-3,15,21,60,60,7,-74,-25,-16,-22,-19,-16,-17,-21,-21,-13,-7,-1,-3,-1,6,5,14,10,-4,-12,-14,-11,-9,-10,0,1,-11,-12,-7,-3,0,0,0,3,5,6,3,-4,-17,-9,-6,-3,8,20,20,-5,-6,-3,-1,1,0,0,2,3,4,2,-3,-6,-5,0,8,68,41,33,-2,-2,0,1,1,0,0,0,2,2,1,-2,-4,-3,0,6,32,43,38,0,0,-1,1,0,0,0,0,0,0,-1,-3,-4,-2,1,9,29,41,36,3,3,1,2,-1,-1,-1,-1,-1,-2,-3,-6,-4,-9,-3,7,65,37,25,9,9,6,5,-1,-1,-1,-1,-2,-3,-8,-9,-29,-25,29,-24,-15,7,8,18,17,8,9,1,1,0,-1,-3,-5,-10,-38,-87,-88,-79,-85,-26,-8,-11,30,32,22,8,14,7,3,1,-2,-2,-16,-79,-25,78,-83,-71,-32,-26,-19,41,45,76,27,16,11,5,2,1,4,18,2,25,79,78,-76,-76,-17,-14,45,53,49,37,23,14,8,5,6,18,20,74,51,67,73,75,75,-1,3,48,47,44,34,23,13,7,4,8,14,31,43,58,64,68,63,39,36,11],"ownershipAllowedMAE":0.0318064})%"); + lines.push_back(R"%({"sample":{"board":"...............O.../..XXOOXO...XXO.XOO./..XOOXXO..OOXO.XO../..XO.XO.O.OXXX.XXO./...OOXO.XXOO.....O./..XOXOO.....X..X.OX/..XXXXOO........XX./......XXO.XX......./......XO.OOX......./.OO...O....OX..X.../.XO.OO.....OX....../.X..XO.....OX....../X.XX.XO....OX....../OXOO.X.....OX....../OO....XOO..OXO...XX/...O.XO..X.....XXXO/.O.O.XXOO..XXXXOOOO/.XOXX..XO...OOO..../..OX.X............./","hintLoc":"null","initialTurnNumber":107,"metadata":"BD9255FCB231C262894FA820230D6AF8:117","moveLocs":["K13","M2","K3","B12","E11","J13","K14","A14","B13","A13"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.32,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxALLsui1","komi":15.5,"policyOptimism":0.0,"pda":1.891,"policyMixture":[6.36e-05,7.86e-05,7.04e-05,0.00349,0.0127,0.00705,0.014,0.00723,0.00729,0.119,8.45e-05,6.3e-05,6.16e-05,6.27e-05,0.000558,0,0.000456,8.89e-05,5.5e-05,0.000151,8.05e-05,0,0,0,0,0,0,0.00916,0.000231,0.000123,0,0,0,6.38e-05,0,0,0,0.000564,0.000254,0.000253,0,0,0,0,0,0,8.24e-05,9e-05,0,0,0,0,6.14e-05,0,0,5.88e-05,0.000624,0.00146,0.00108,0,0,7.34e-05,0,0,7.96e-05,0,0.000171,0,0,0,0,5.49e-05,0,0,0,8.64e-05,0.0011,0.522,0.00717,0,0,0,0,6.21e-05,0,0,0,0,5.85e-05,5.97e-05,5.67e-05,5.52e-05,5.81e-05,0,0.000182,0,0.00238,0,0,0,0,0,5.75e-05,5.68e-05,0,5.71e-05,5.74e-05,0,5.86e-05,5.58e-05,0,5.81e-05,0,0,0,0,0,0,0,0,0,0,0,0,5.72e-05,5.93e-05,5.77e-05,5.69e-05,5.54e-05,5.46e-05,0,0,6.23e-05,0.00108,0,0.235,6.41e-05,6.22e-05,6.7e-05,0,0,0,5.67e-05,0,0,5.62e-05,5.46e-05,5.43e-05,5.34e-05,5.46e-05,5.65e-05,5.69e-05,0.000815,0.00515,0.000501,8.71e-05,0,7.6e-05,0,0,0.000255,0,0,0,5.57e-05,5.54e-05,5.38e-05,5.29e-05,5.3e-05,5.57e-05,5.64e-05,0.000268,0,0,0.00629,0.000779,0.000959,0,0.00471,5.9e-05,5.42e-05,5.51e-05,0,0,5.32e-05,5.27e-05,0,5.34e-05,5.61e-05,5.6e-05,6.47e-05,0,0,0.0064,0,0,0.00025,6.19e-05,5.71e-05,5.56e-05,5.32e-05,0,0,5.29e-05,5.29e-05,5.29e-05,5.35e-05,5.48e-05,5.54e-05,6.16e-05,0,0.000298,0.000839,0,0,0.000163,6.19e-05,5.96e-05,5.65e-05,5.38e-05,0,0,5.3e-05,5.24e-05,5.32e-05,5.28e-05,5.55e-05,5.54e-05,0,5.94e-05,0,0,6.29e-05,0,0,0.000132,5.8e-05,6.02e-05,5.7e-05,0,0,5.26e-05,5.29e-05,5.28e-05,5.3e-05,5.48e-05,5.54e-05,0,0,0,0,5.91e-05,0,0.000861,0.000193,6.45e-05,6.63e-05,6.27e-05,0,0,5.47e-05,5.24e-05,5.3e-05,5.36e-05,5.45e-05,5.46e-05,0,0,0.000629,8.87e-05,5.76e-05,5.94e-05,0,0,0,0.000262,5.91e-05,0,0,0,5.44e-05,5.24e-05,5.11e-05,0,0,0.000106,0.000639,0.00121,0,5.58e-05,0,0,0.000832,9.15e-05,0,5.52e-05,7.85e-05,5.7e-05,5.52e-05,5.56e-05,0,0,0,0,6.75e-05,0,0.00186,0,5.54e-05,0,0,0,0,0,5.86e-05,0,0,0,0,0,0,0,0,5.56e-05,0,0,0,0,4.81e-05,5.76e-05,0,0,8.68e-05,0.000116,0,0,0,0,0.000338,0.000244,5.45e-05,5.82e-05,5.48e-05,0.00116,0,0,3.36e-05,0,6.2e-05,7.82e-05,8.95e-05,6.32e-05,5.95e-05,5.84e-05,5.56e-05,5.58e-05,5.6e-05,5.64e-05,5.66e-05,5.82e-05,5.48e-05,4.34e-05],"winrateAvg":0.99824,"leadAvg":5.8643,"scoreMeanAvg":5.95926,"scoreStdevAvg":4.00083,"shorttermWinlossErrorAvg":0.0142578,"shorttermScoreErrorAvg":0.838531,"ownership":[-98,-98,-96,-42,9,95,98,95,48,-47,-62,-80,-63,44,78,99,98,99,99,-98,-98,-99,-99,99,99,98,100,53,24,-16,-100,-100,72,6,-100,99,99,99,-96,-98,-99,99,99,98,98,100,81,55,99,99,-100,69,-39,-100,99,99,99,-89,-97,-99,99,99,99,100,72,98,13,99,-100,-100,-100,-85,-100,-100,99,99,-3,-98,-52,99,99,99,100,-27,-99,-99,99,99,41,-97,-97,-93,52,99,77,89,-70,-99,99,-99,100,100,70,-37,-99,30,57,-99,-98,-99,-100,-31,99,-96,93,-99,-99,-99,-99,-99,100,100,100,-99,-82,-87,-98,-99,-99,-100,-100,-100,-96,91,95,-57,-45,-87,-96,-97,-97,100,22,-100,-100,-99,-99,-100,-100,-100,-99,-98,79,69,31,-4,-95,-49,-97,98,99,100,100,-100,-100,-100,-100,-100,-100,-100,-99,9,100,100,44,7,-2,99,97,99,99,99,100,-100,-100,-100,-100,-100,-100,-100,-44,-95,100,79,100,100,98,98,98,98,99,100,-100,-100,-100,-100,-100,-100,-100,-47,-95,-64,12,-94,100,98,98,98,98,97,100,-100,-100,-100,-100,-100,-100,-100,-48,-9,-97,-96,-93,-99,99,97,97,96,90,100,-100,-100,-100,-100,-100,-100,-100,99,-13,99,99,0,-98,-10,92,96,95,38,100,-100,-99,-100,-100,-100,-100,-100,99,99,98,65,13,-86,-97,100,99,-53,-11,100,-100,-99,-99,-100,-100,-100,-100,99,99,99,100,21,-100,-3,-5,82,-95,-33,9,-40,-98,-99,-100,-100,-100,100,99,99,99,100,-38,-100,-100,99,99,-95,-74,-100,-100,-100,-100,100,100,100,100,99,98,99,-100,-100,-99,-97,-95,99,11,-42,100,100,100,100,99,99,99,99,99,99,99,-100,-99,-100,-86,21,51,32,31,54,96,98,99,99,99,99,99],"ownershipAllowedMAE":0.0301411})%"); + lines.push_back(R"%({"sample":{"board":".................../................XO./...............XO../..O..O..O......XOO./...............XO.O/..............OXXO./................XX./........X........../.................../.................../.................../....O............../.................../...X.............../..OX...X.........../......XXO......X.../..O.XXOX.........../....OOO............/.................../","hintLoc":"null","initialTurnNumber":38,"metadata":"1D628149CD6189DC87567309786C5F97:48","moveLocs":["C6","D3","D9","R6","S5","S6","R5","Q6","Q9","P4"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxNONEsui1","komi":7.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[2.85e-06,3.23e-06,3.06e-06,3.1e-06,3.14e-06,3.04e-06,3.07e-06,3.08e-06,3.1e-06,3.07e-06,3.09e-06,3.05e-06,3.05e-06,2.96e-06,3.02e-06,3.18e-06,2.96e-06,3.06e-06,2.62e-06,3.27e-06,4.33e-06,4.58e-06,8.51e-06,1.22e-05,5.57e-06,1.83e-05,1.85e-05,6.33e-06,4.8e-06,4.45e-06,4.17e-06,3.97e-06,3.38e-06,3.91e-06,3.47e-06,0,0,3.2e-06,3.24e-06,5.37e-06,9.77e-05,9.02e-05,7.05e-05,6.32e-05,5.59e-05,5.11e-05,3.96e-05,2.89e-05,2.83e-05,7.24e-06,4.43e-06,3.6e-06,2.8e-06,0,0,2.87e-06,3.22e-06,3.41e-06,2.96e-05,0,0.000165,6.46e-05,0,5.52e-05,4.7e-05,0,4.05e-05,3.05e-05,1.08e-05,4.43e-06,3.58e-06,2.65e-06,0,0,0,3.07e-06,3.23e-06,7.67e-06,6.58e-05,6.34e-05,5.11e-05,6.65e-05,4.29e-05,4.74e-05,4.3e-05,2.57e-05,1.35e-05,4.87e-06,4.4e-06,3.9e-06,3.1e-06,0,0,0,0,3.2e-06,6.57e-06,4.07e-05,3.62e-05,2.46e-05,1.25e-05,1.29e-05,9.04e-06,7.37e-06,7.33e-06,5.23e-06,4.61e-06,4.56e-06,3.58e-06,0,0,0,0,3.32e-06,3.12e-06,4.56e-06,3.71e-05,2.78e-05,1.79e-05,1.55e-05,7.87e-06,4.64e-06,3.94e-06,4.43e-06,5.14e-06,4.66e-06,4.39e-06,4e-06,3.76e-06,2.81e-06,0,0,3.42e-06,3.09e-06,4.32e-06,2.79e-05,3.44e-05,1.87e-05,1.44e-05,7.33e-06,4.03e-06,0,3.85e-06,4.97e-06,4.74e-06,4.5e-06,4.27e-06,4e-06,3.3e-06,2.92e-06,2.92e-06,3.18e-06,3.02e-06,4.07e-06,1.32e-05,2.31e-05,1.36e-05,9.34e-06,5.75e-06,4.47e-06,3.97e-06,4.54e-06,5.02e-06,4.93e-06,4.59e-06,4.51e-06,4.37e-06,4.1e-06,3.68e-06,3.61e-06,3.09e-06,3e-06,3.97e-06,5.02e-06,4.53e-06,4.74e-06,1.12e-05,4.8e-06,5.18e-06,5.92e-06,6e-06,5.06e-06,6.09e-06,6.19e-06,5.22e-06,4.47e-06,4.3e-06,4.57e-06,3.93e-06,3.11e-06,2.95e-06,3.86e-06,4.22e-06,0,4.54e-06,4.23e-06,4.65e-06,5.27e-06,9.87e-06,9.48e-06,8.52e-06,1.29e-05,1.88e-05,1.42e-05,4.38e-06,0,4.33e-06,4.53e-06,3.13e-06,3e-06,3.56e-06,3.69e-06,4.05e-06,0,3.78e-06,4.67e-06,4.84e-06,6.72e-06,8.49e-06,1.25e-05,1.77e-05,2.54e-05,2.66e-05,1.29e-05,4.49e-06,7.04e-06,4.61e-06,3.42e-06,2.97e-06,3.46e-06,3.01e-06,3.11e-06,3.3e-06,3.95e-06,4.06e-06,4.49e-06,4.8e-06,5.3e-06,1.3e-05,2.06e-05,2.58e-05,1.43e-05,1.81e-05,4.06e-06,3.36e-06,4.06e-06,3.33e-06,3.08e-06,3.62e-06,0,0,3.1e-06,3.39e-06,3.41e-06,3.57e-06,4.19e-06,1.17e-05,1.48e-05,2.48e-05,2.58e-05,3.11e-05,7.31e-06,0,0,0,4.18e-06,3.16e-06,4.78e-06,0,0,3.05e-06,3.24e-06,2.67e-06,0,4.18e-06,4.59e-06,7.27e-06,1.89e-05,2.82e-05,1.12e-05,0.0178,0.168,0,0,3.46e-06,3.35e-06,4.89e-06,3.91e-06,3.67e-06,3.32e-06,3.22e-06,0,0,0,4.2e-06,1.64e-05,2.53e-05,3.64e-05,2.99e-05,0,0,3.83e-06,3.55e-06,3.16e-06,3.25e-06,8.59e-06,0,0,0,0,0,0,4.43e-06,4.44e-06,8.02e-06,1.78e-05,2.68e-05,5.94e-06,0.798,0.0123,0.00015,6.64e-06,3.12e-06,3.3e-06,3.94e-06,5.9e-06,3.29e-06,0,0,0,4.3e-06,4.04e-06,4.55e-06,4.62e-06,4.75e-06,5.51e-06,1.18e-05,5.51e-05,0.000111,1.63e-05,4.16e-06,3.18e-06,2.85e-06,3.29e-06,2.97e-06,3.04e-06,2.96e-06,2.9e-06,2.87e-06,2.93e-06,3.22e-06,3.17e-06,3.11e-06,3.02e-06,3.07e-06,3.13e-06,3.33e-06,3.51e-06,3.26e-06,3.22e-06,2.82e-06,3.45e-06],"winrateAvg":0.456102,"leadAvg":-0.327171,"scoreMeanAvg":-0.64203,"scoreStdevAvg":13.5285,"shorttermWinlossErrorAvg":0.102665,"shorttermScoreErrorAvg":0.831341,"ownership":[37,34,31,26,24,23,22,21,18,12,3,-8,-21,-35,-40,-28,22,26,72,38,38,32,28,24,24,23,21,19,16,3,-6,-19,-29,-60,-14,-15,85,81,39,45,39,34,30,39,31,30,35,22,7,-3,-10,-24,-55,-93,87,86,86,38,47,80,18,31,79,33,32,76,16,0,1,-11,-17,-46,-94,87,86,85,30,35,26,25,17,17,14,10,13,5,2,-5,-11,-19,-33,-94,87,80,84,17,15,2,3,2,5,2,1,1,0,-3,-6,-10,-13,19,-93,-94,79,32,5,4,0,0,-1,-1,-2,-2,-11,-4,-5,-7,-10,-11,-18,-50,-93,-93,-34,-4,-5,-7,-11,-4,-4,-6,-12,-66,-13,-8,-8,-10,-11,-14,-26,-45,-50,-51,-13,-13,-12,1,-8,-5,-6,-6,-13,-6,-7,-8,-8,-9,-14,-22,-29,-31,-35,-22,-25,-27,-20,-12,-14,-8,-9,-9,-7,-6,-8,-8,-8,-12,-23,-23,-16,-18,-29,-30,-31,-72,-18,-14,-13,-10,-9,-8,-7,-8,-6,-2,0,-66,-12,-1,0,-34,-36,-40,-9,19,-14,-16,-12,-9,-8,-8,-7,-4,4,11,-5,-3,11,16,-35,-35,-41,-37,-22,-24,-19,-14,-8,-4,-7,-6,-1,8,6,12,18,26,33,-27,-45,-89,-89,-39,-34,-28,-29,-13,-8,-8,-8,-5,-7,-2,57,57,59,21,-9,6,34,-89,-34,-45,-57,-89,-29,-13,-7,-2,2,7,15,-21,-79,-79,1,25,32,14,22,4,-52,-89,-90,26,-6,-3,4,17,40,57,-88,-72,-63,-52,48,62,95,95,-59,-60,94,-89,-24,-5,-1,3,3,-4,-59,-59,-76,-67,-61,63,81,89,94,94,94,94,-16,-4,-4,2,1,-3,-14,-38,-53,-67,-67,-67,76,84,89,91,88,70,48,21,2,2,1,1,-3,-15,-33,-50,-62,-67,-67],"ownershipAllowedMAE":0.0234072})%"); + lines.push_back(R"%({"sample":{"board":"..............O..../.OO.........OOXOOO./..XO.......OXXXXOX./..XO.......O.XOOXX./.XOO.X.O.OOXX.OXX../..XX.XO...X..OO..../..X...OX...X.OXXX../.X.XO.O...X..OXOX../X.XXOX....XO..O.XO./.XOOO.O...X.O.XXOX./.OO..OXXOO.XXX.OO../OXX.X.XOX.OOOOO..../......X...OXXX...../..X...XXXXXO.O.O.../.O...OXOOOOOOX..O../O.OOO.OX..XXOX.O.X./XOXX.XO.XXXOXX.XO../XX...XX...OOOOXO.../.................../","hintLoc":"null","initialTurnNumber":36,"metadata":"92F79AC14996A63D5730A5FAE424323E:46","moveLocs":["A7","A9","B7","F16","J14","J15","B16","T18","T11","S9"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.18,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreTERRITORYtaxSEKIsui0","komi":3.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.8e-06,6.24e-06,6.38e-06,8.69e-06,7.69e-06,5.72e-06,5.6e-06,5.46e-06,5.64e-06,6.22e-06,4.98e-05,4.99e-05,4.3e-05,0.000951,0,0.00359,5.57e-06,4.78e-06,4.56e-06,1.86e-05,0,0,0.011,0.00985,2.67e-05,1.42e-05,7.42e-06,9.36e-06,2.74e-05,0.00193,0.000196,0,0,0,0,0,0,0,9.48e-06,1.19e-05,0,0,2.46e-05,3.61e-05,8.61e-06,7.35e-06,6.96e-06,1.89e-05,0.000139,0,0,0,0,0,0,0,5.5e-06,5.96e-06,0,0,0,0.0211,0,0.00785,5.43e-06,5.45e-06,6.05e-06,8e-05,0,6.69e-06,0,0,0,0,0,5.48e-06,5.09e-06,0,0,0,0.000193,0,0.000361,0,0,0,0,0,0,5.41e-06,0,0,0,5.1e-06,5.28e-06,5.65e-06,5.42e-06,0,0,1.54e-05,0,0,4.77e-06,0,3.47e-05,0,5.26e-06,4.8e-06,0,0,4.87e-06,4.94e-06,5.04e-06,5.03e-06,5.47e-06,5.98e-06,0,5.33e-06,7.03e-05,0.0325,0,0,7.67e-06,7.85e-06,4.87e-06,0,5.31e-06,0,0,0,0,4.99e-06,5.29e-06,5.12e-06,0,4.6e-06,0,0,8.1e-06,0,3.34e-05,8.9e-06,6.34e-06,0,5.42e-06,4.7e-06,0,0,0,0,0.697,6.44e-06,0,5.1e-06,0,0,0,0,1.17e-05,0.000136,3.77e-05,6.62e-06,0,0,5.03e-06,4.98e-06,0,4.34e-06,0,0,0,5.47e-06,0,0,0,0,8.79e-06,0,0.00185,1.12e-05,6.81e-06,0,5.24e-06,0,5.5e-06,0,0,0,0,1.39e-05,0,0,0,5.1e-06,9.85e-06,0,0,0,0,0,1.28e-05,0,0,0,5.48e-06,0,0,0,0.0365,0,0,0,6.72e-06,0,2.41e-05,0,0,0,1.3e-05,0,0,0,0,0,4.82e-06,4.96e-06,4.52e-06,5.66e-06,0,0,4.66e-06,5.59e-06,6.1e-06,5.28e-06,0,5.37e-06,5.63e-06,5.83e-06,0,0,0,0,3.32e-05,5.8e-06,5.03e-06,4.58e-06,5.38e-06,5.18e-06,5.14e-06,0,5.18e-06,5.43e-06,5.11e-06,0,0,0,0,0,0,5.85e-06,0,1.34e-05,0,4.97e-06,4.94e-06,5e-06,5.41e-06,0,5.28e-06,5.33e-06,5.13e-06,0,0,0,0,0,0,0,0,0,6.05e-06,5.44e-06,0,5.4e-06,4.93e-06,0,5.46e-06,0,0,0,6.63e-06,0,0,0.0994,0.000198,0,0,0,0,5.31e-06,0,5.48e-06,0,5.2e-06,0,0,0,0,4.83e-06,0,0,5.2e-06,0,0,0,0,0,0,0.0732,0,0,1.06e-05,5.09e-06,0,0,4.88e-06,5.07e-06,5.13e-06,0,0,5.92e-06,5.97e-06,0.000228,0,0,0,0,0,0,2.11e-05,6.68e-06,6.82e-06,3.89e-06,4.82e-06,4.88e-06,4.84e-06,4.78e-06,4.96e-06,5.12e-06,5.24e-06,5.43e-06,5.96e-06,6.46e-06,5.95e-06,5.71e-06,7.24e-06,6.4e-06,8.33e-06,6.58e-06,6.79e-06,5.07e-06,7.29e-06],"winrateAvg":0.322924,"leadAvg":-0.444265,"scoreMeanAvg":-1.09721,"scoreStdevAvg":7.49141,"shorttermWinlossErrorAvg":0.268271,"shorttermScoreErrorAvg":1.38293,"ownership":[75,80,88,90,90,89,89,89,90,91,93,94,95,93,94,94,95,94,95,61,91,91,91,87,89,88,89,90,91,91,95,96,96,-97,95,95,95,96,7,-11,-97,95,82,88,88,90,90,92,93,98,-96,-97,-97,-97,95,-100,63,-20,-97,-97,95,24,94,83,90,93,94,96,98,53,-97,-93,-93,-100,-100,-61,-81,-97,95,95,-6,-87,51,99,99,99,99,-97,-98,-96,-94,-100,-100,-97,-95,-96,-97,-100,-100,-61,-89,98,51,-74,47,-97,-96,-96,-93,-94,-97,-97,-97,-95,-98,-99,-100,-62,16,-36,97,-71,-48,-64,-84,-99,-95,-93,-100,-100,-100,-97,-95,-97,-100,-99,-99,96,74,97,22,14,-21,-99,-96,-96,-93,-100,-98,-100,-97,-91,-98,-94,-99,-99,97,38,52,8,1,-19,-99,-94,-96,-96,-96,-99,-100,-85,-91,69,-94,97,97,97,72,81,-14,15,17,-99,-97,-95,-97,-99,-99,99,-83,-19,97,98,98,25,43,88,-98,-98,97,97,34,-99,-99,-99,40,99,99,98,17,98,-95,-95,-5,-89,57,-98,-64,-65,51,100,100,100,100,100,96,91,84,52,-95,-95,-92,-89,-85,-87,-98,-88,0,23,100,97,97,97,99,95,91,87,83,-91,-89,-95,-91,-92,-93,-98,-98,-99,-98,-98,99,98,99,98,100,95,91,87,-90,-86,-90,-90,-90,-88,-99,97,98,98,99,99,98,92,98,98,100,94,89,-87,-89,-85,-85,-87,-93,-87,-96,-77,-46,-97,-96,99,93,97,100,95,88,90,-96,-88,-98,-98,-92,-99,-86,-90,-98,-97,-97,97,93,93,94,91,99,94,92,-96,-96,-94,-97,-97,-99,-99,-91,-88,71,97,97,96,96,92,98,97,95,94,-95,-94,-95,-96,-97,-96,-93,-84,-44,-8,65,71,80,92,95,95,96,95,96],"ownershipAllowedMAE":0.0257203})%"); + lines.push_back(R"%({"sample":{"board":"..........XXXXO.../..O......XXXOXOXO./..OXX..XXXOOOOXX../...O..XOOOO..OOX../...O........OXXX../...OO.......O.OOO./..OXX.........XXO./.OXX.XX.........../.OXOX......X.XOO../O.OOXOX...OOX.XOO./OOOXXXOO..XOOXXOX./OXXO.XO.O...OOXX../XXOOOXXOX...XXOXX./.XXXXOOO.OX.XOOXXO/..XOOOXO.OO.XXOOO./.OOXXXXXXO.OXO.OXO/.OX.XXXOO.OXXXOXXO/.OXX.X...O.O..O.X./","hintLoc":"null","initialTurnNumber":216,"metadata":"EF2456F944CD974FBA3C50EF91F85D36:226","moveLocs":["P3","B4","E7","O3","L10","K9","P3","A2","S4","O11"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.49,"xSize":18,"ySize":18},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":-7.0,"policyOptimism":0.669,"pda":0.0,"policyMixture":[0.000143,0.000162,0.000221,0.000328,0.00022,0.000167,0.000157,0.000145,0.000135,0.000133,0,0,0,0,0,0.000157,0.000156,0.000143,0.000152,0.000167,0,0.00147,0.000212,0.000194,0.000189,0.000152,0.000139,0,0,0,0,0,0,0,0,0.00016,0.000147,0.000182,0,0,0,0.000214,0.000188,0,0,0,0,0,0,0,0,0,0.000168,0.000177,0.000152,0.000644,0.00138,0,0.000328,0.000227,0,0,0,0,0,0.000148,0.000153,0,0,0,0.000184,0.000201,0.00014,0.000184,0.000214,0,0.000166,0.000216,0.000215,0.000199,0.000179,0.000172,0.00017,0.000175,0,0,0,0,0.00336,0.000236,0.000136,0.000201,0.0588,0,0,0.000996,0.000203,0.000203,0.00022,0.000222,0.000231,0.000222,0,0.104,0,0,0,0.000215,0.000149,0.0163,0,0,0,0.000185,0.000187,0.00019,0.00024,0.000304,0.000657,0.00184,0.00519,0.0233,0,0,0,0.000192,0.000229,0,0,0,0.000159,0,0,0.000181,0.000245,0.000226,0.000194,0.000232,0.058,0,0.000842,0.00091,0.0062,0.000204,0.0294,0,0,0,0,0.000161,0.000173,0.000177,0.000241,0.00134,0,0,0.000206,0,0,0,0.000205,0.000398,0,0,0,0,0,0,0,0.00291,0.00333,0,0,0,0,0.000174,0,0,0,0.00144,0,0,0,0,0,0,0,0,0.00239,0.0018,0,0,0,0,0,0,0,0.000206,0,0,0,0.000135,0,0,0,0,0,0.000197,0.000225,0.000189,0,0,0,0,0.000148,0.000152,0,0,0.000132,0.000151,0.000137,0,0,0,0,0.000191,0.000455,0.000179,0,0,0.000132,0,0,0.000136,0.000192,0,0,0,0,0,0,0,0.00989,0,0,0.000162,0,0.000129,0.000129,0,0,0,0.573,0,0,0,0,0,0,0,0.0695,0,0,0.000187,0,0,0.00013,0.000131,0.000139,0,9.18e-05,0,0,0,0,0,0,0,0,0,0,0,0,0.000133,0,0.000133,0,0,0,0,0,2.55e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.31e-05,0,0.000153,0.000166,0.000145,0,0,0,0.000174,0.000136,0,0.00014,0,0.000154,6.1e-05],"winrateAvg":0.000238092,"leadAvg":-38.1398,"scoreMeanAvg":-38.2103,"scoreStdevAvg":4.82791,"shorttermWinlossErrorAvg":0.0025122,"shorttermScoreErrorAvg":1.24769,"ownership":[92,91,74,54,-2,-24,-59,-78,-91,-98,-100,-100,-100,-100,-98,-98,-73,-55,95,93,99,-6,-52,-61,-63,-84,-94,-100,-100,-100,100,-100,-99,-100,-33,-37,96,97,99,-85,-85,-27,-75,-100,-100,-100,100,100,100,100,-100,-100,-69,-24,97,97,97,99,-7,-4,-81,99,99,99,100,88,97,100,99,-99,-62,-18,97,97,97,99,41,6,8,24,36,42,50,65,99,-99,-99,-99,-53,14,97,98,96,99,99,-3,-3,2,7,16,27,43,99,2,98,98,98,35,98,97,98,-92,-92,11,-33,-12,-8,-1,7,25,60,68,63,59,98,78,98,100,-92,-92,-93,-100,-100,-32,-16,-5,-5,21,76,88,82,85,84,82,98,99,-92,98,-100,-89,-24,2,-1,-2,-65,-59,-10,-68,98,98,88,79,99,99,99,99,-100,-49,-53,30,25,98,98,99,-68,-63,-100,98,98,13,99,99,99,-100,-100,-100,98,98,60,65,34,98,99,-100,-100,98,-59,0,99,-100,-100,-100,-100,-100,98,96,98,54,44,49,98,98,-100,-100,-58,-72,-100,-100,-100,-100,-100,-100,-100,100,35,43,-1,-3,-100,-100,-100,-100,-100,-90,-98,-100,-100,-100,-100,99,99,99,83,100,-53,-47,-100,-100,-100,-100,-100,-92,-99,-93,-100,99,99,99,-100,99,-19,100,100,-16,-100,-100,-100,-100,-99,-99,-95,-92,-93,-100,-100,-100,-100,-100,-100,100,71,69,-100,-100,-100,-100,-100,-98,-92,-92,-100,-100,-100,-100,-100,99,99,99,99,-100,-100,-100,-98,-100,-100,-98,-96,-93,-100,-100,-100,-100,-55,5,89,99,79,76,-52,-98,-97,-99,-100,-99],"ownershipAllowedMAE":0.0348158})%"); + lines.push_back(R"%({"sample":{"board":".................../..OOOO.O.........../.OXOXXO.X..OOOOXX../.OXXXOX..XO.XXXOX../.OX.XOXO.XO.O.OOX../.O.XXO.OX.XX.OOX.../.X.XOO.O.XOO.OXX.../..X..O.XOXXOOX...X./.XO.OXOOOX.OXX..OXX/.OO.OXOXXX.OOXOXOOX/....XXX....O.OX.OXO/.....XXX.XX.O.X.OX./.OOX..XXXOX....XOX./.XOXOOOXOO.....XXOX/.OXO.OOOO..O..XOOO./.OXOOOXXXOX....X.O./.OXOXXX..XOX...X.O./.XXXO.....O.....X../..X................/","hintLoc":"null","initialTurnNumber":184,"metadata":"4F09D4FB0DB216956E0114CA9BEBCF20:194","moveLocs":["K5","K2","M4","M2","L1","D8","P4","O5","N3","N2"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.86,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[7.59e-06,8e-06,7.98e-06,8.09e-06,7.96e-06,8.04e-06,8.14e-06,8.18e-06,8.36e-06,7.97e-06,8.27e-06,8.16e-06,8.07e-06,8.44e-06,8.46e-06,8.17e-06,8.47e-06,8.2e-06,7.75e-06,8.05e-06,8.01e-06,0,0,0,0,8.44e-06,0,8.26e-06,8.46e-06,8.6e-06,8.34e-06,7.76e-06,8.48e-06,8.96e-06,8.46e-06,8.7e-06,8.35e-06,8.26e-06,7.93e-06,0,0,0,0,0,0,8.68e-06,0,9.06e-06,8.59e-06,0,0,0,0,0,0,8.33e-06,8.1e-06,8.05e-06,0,0,0,0,0,0,9.4e-06,9.04e-06,0,0,8.52e-06,0,0,0,0,0,8.12e-06,8.11e-06,9.6e-06,0,0,0,0,0,0,0,8.13e-06,0,0,8.76e-06,0,8.58e-06,0,0,0,9.21e-06,8.46e-06,1.06e-05,0,6.8e-05,0,0,0,9.06e-06,0,0,0,0,0,8.88e-06,0,0,0,8e-05,1.41e-05,9.1e-06,1.7e-05,0,9.27e-06,0,0,0,8.22e-06,0,8.57e-06,0,0,0,8.05e-06,0,0,0,0.0115,7.51e-05,1.01e-05,1.86e-05,7.11e-06,0,1.12e-05,8.63e-06,0,8.34e-06,0,0,0,0,0,0,0,0.00109,0.000987,0.00847,0,1.27e-05,0.000217,0,0,8.2e-06,0,0,0,0,0,0,7.94e-06,0,0,0,0.00448,0.00201,0,0,0,0.000556,0,0,9.01e-06,0,0,0,0,0,0,7.89e-06,0,0,0,0,0,0,0,0,1.2e-05,8.76e-06,9.73e-06,5.17e-05,0,0,0,7.62e-06,1.15e-05,1.55e-05,7.03e-05,0,7.85e-06,0,0,1.16e-05,0,0,0,9.32e-06,9.09e-06,1.13e-05,0,8.26e-06,0,0,0,7.81e-06,0,0,8.65e-06,0,1.13e-05,0,1.42e-05,0,0,0.00109,9.13e-06,0,0,0,4.07e-05,8.66e-06,0,0,0,0,0,1.86e-05,1.25e-05,0.00229,1.41e-05,0,0,0,2.95e-05,8.63e-06,0,0,0,0,0,0,0,0,0,9.26e-06,2.4e-05,0.00577,0.000428,0.0128,0,0,0,0,7.44e-06,0,0,0,7.05e-06,0,0,0,0,0,0.00104,0,0.000162,0,0,0,0,0,0.00583,7.63e-06,0,0,0,0,0,0,0,0,0,0,0,0.016,0.577,0,0,8.39e-06,0,7.69e-06,9.23e-06,0,0,0,0,0,0,1.09e-05,0.0902,0,0,0,0,0.000162,0.0107,0,1e-05,0,7.95e-06,0.00081,0,0,0,0,0.000227,8.97e-05,0.0166,8.21e-05,0,0,0,0,0.199,0.00919,1.09e-05,0,0.000139,8.6e-06,8.09e-06,2.34e-05,0,1e-05,0.0181,5.81e-05,7.87e-05,3.83e-05,8.76e-05,0.000655,0,1.62e-05,1.07e-05,9.94e-06,9.94e-06,9.16e-06,9.08e-06,1.02e-05,7.76e-06,8.95e-06],"winrateAvg":0.557812,"leadAvg":0.574671,"scoreMeanAvg":1.05253,"scoreStdevAvg":13.744,"shorttermWinlossErrorAvg":0.373515,"shorttermScoreErrorAvg":4.2274,"ownership":[99,99,99,99,98,96,89,54,26,7,22,45,62,52,32,-27,-43,-76,-82,99,99,100,100,100,100,95,97,-15,4,5,65,78,85,17,-5,-92,-84,-90,98,99,16,99,14,17,96,-38,-88,-14,41,97,97,97,97,-98,-98,-95,-93,95,99,12,11,11,95,-16,-13,-58,-96,96,94,92,93,93,97,-99,-97,-95,90,98,13,10,11,95,-16,95,-1,-97,95,18,96,95,97,97,-99,-96,-96,65,97,62,10,14,95,27,94,-97,-95,-94,-87,-3,96,97,-96,-93,-94,-94,26,8,12,9,95,95,66,95,-38,-98,97,97,91,96,-96,-96,-84,-93,-93,12,12,9,35,82,95,90,86,90,-98,-99,97,97,-82,-83,-83,-81,-95,-93,35,14,93,65,92,-99,91,90,90,-99,-28,97,-81,-82,-70,-72,-68,-95,-95,76,93,94,43,92,-99,90,-99,-99,-99,10,97,97,-81,-71,-82,-68,-67,-95,58,22,-15,-2,-99,-99,-99,-98,-97,-89,48,97,77,79,-88,-76,-69,-89,-90,52,0,-25,-95,-76,-99,-99,-99,-98,-98,-98,14,94,18,-89,-80,-70,-89,-88,78,86,86,-94,9,-10,-99,-99,-99,91,-97,-4,46,9,-44,-89,-69,-87,-59,84,83,86,-94,89,89,88,-99,90,90,5,40,48,5,-66,-89,-89,-32,-61,79,82,-83,88,89,88,88,88,89,91,89,93,39,-75,-78,-20,-25,-32,-38,61,82,-83,88,89,89,-89,-89,-89,91,75,93,71,62,60,-80,-46,-31,-34,24,81,-83,89,-88,-89,-90,-73,-66,-67,76,-63,73,-44,-20,-81,-55,-30,-35,16,-82,-84,-84,-81,-86,-74,-46,-56,-67,73,-66,-68,-60,-70,-74,-79,-40,-42,-24,-61,-83,-83,-83,-81,-63,-44,-37,-22,72,-21,-51,-62,-68,-70,-66,-58,-48],"ownershipAllowedMAE":0.0494701})%"); + lines.push_back(R"%({"sample":{"board":".................../...X.........X...../..XO.X......XOXXXX./..XOXOO......OOOO../...X.....X.O......./........X........../..OXX.OOOXX..O.X.../...OX....OOX......./...OOXXXX..O.OOX.../.....OOO..O...X.X../............X..X.../...........OOX...../.............X.XX../..O...O.....OO.O.../.O.O.X.........OX../.XO.O..O...X..XOX../.XXOO.XO.X.OO.OXX../XOOXXX.XO......O.../..X....O.........../","hintLoc":"null","initialTurnNumber":106,"metadata":"D4704A36C1562BE867E452874AC69D70:116","moveLocs":["M13","K17","N11","N10","N12","O10","O12","P12","P13","O14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.01,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreTERRITORYtaxSEKIsui1","komi":6.0,"policyOptimism":0.852,"pda":0.0,"policyMixture":[1.96e-06,1.95e-06,1.8e-06,1.9e-06,1.93e-06,2.19e-06,2.21e-06,2.3e-06,2.38e-06,2.35e-06,2.42e-06,2.31e-06,2.56e-06,2.07e-06,2.16e-06,1.99e-06,1.89e-06,2.12e-06,1.92e-06,1.98e-06,1.89e-06,1.9e-06,0,2.4e-06,2.45e-06,2.69e-06,4.42e-06,6.22e-06,3.5e-06,4.42e-06,5.14e-05,1.19e-05,0,2.15e-06,2.17e-06,2.02e-06,2.09e-06,1.92e-06,1.84e-06,1.93e-06,0,0,2.16e-06,0,1.99e-05,9.34e-05,0.253,0,8.04e-05,0.00475,0,0,0,0,0,0,2.18e-06,1.93e-06,1.94e-06,0,0,0,0,0,0.016,0.0298,0.0155,0.309,0.000474,0.137,0,0,0,0,2.6e-06,2.32e-06,1.97e-06,2.01e-06,2.06e-06,0,2.53e-06,3.27e-05,0.0014,0.0346,5.09e-06,0,1.08e-05,0,0.0012,4.46e-06,2.8e-06,2.4e-06,2.6e-06,2.68e-06,2.3e-06,2.02e-06,2.25e-06,2.72e-06,2.26e-06,2.27e-06,5.64e-06,0.0209,0.000121,0,2.47e-06,1.93e-06,2.44e-06,3.7e-06,0,6.21e-06,3.05e-06,4.61e-06,2.73e-06,2.44e-06,2.02e-06,2.35e-06,0,0,0,8.77e-06,0,0,0,0,0,0,1.95e-06,0,0,0,3.37e-06,2.72e-06,2.28e-06,2e-06,2.34e-06,3.94e-06,0,0,2.52e-06,2.29e-06,2.03e-06,0.134,0,0,0,0,0,0,4.3e-05,3.08e-06,2.58e-06,2.36e-06,1.95e-06,2.45e-06,2.66e-06,0,0,0,0,0,0,0.000101,4.19e-05,0,0,0,0,0,2.48e-06,2.38e-06,2.18e-06,1.91e-06,2.27e-06,2.64e-06,2.63e-06,7.37e-06,0,0,0,3.19e-06,0.00103,0,7.75e-06,0,0,0,2.08e-06,0,2.2e-06,2.05e-06,1.84e-06,2.13e-06,2.26e-06,2.23e-06,2.54e-06,2.24e-06,1.95e-06,2.29e-06,2.81e-06,5.25e-06,0.0123,0.026,0,0.00228,2.23e-06,0,1.99e-06,1.96e-06,1.86e-06,1.79e-06,2.09e-06,2.17e-06,2.19e-06,2.26e-06,2.21e-06,2.27e-06,2.34e-06,2.59e-06,2.82e-06,2.87e-06,0,0,0,2.14e-06,1.99e-06,1.95e-06,1.95e-06,1.8e-06,1.87e-06,2.12e-06,2.1e-06,2.21e-06,2.2e-06,2.23e-06,2.24e-06,2.29e-06,2.4e-06,2.55e-06,2.6e-06,2.95e-06,7.98e-06,0,2.12e-06,0,0,2.01e-06,1.92e-06,2.05e-06,2.12e-06,0,2.13e-06,2.25e-06,2.07e-06,0,2.24e-06,2.33e-06,2.56e-06,2.73e-06,2.68e-06,0,0,2.54e-06,0,2.42e-06,1.94e-06,1.82e-06,2.32e-06,0,0,0,2.26e-06,0,2.87e-06,2.55e-06,2.32e-06,2.48e-06,2.42e-06,2.27e-06,2.24e-06,4.38e-06,2.5e-06,0,0,1.97e-06,1.92e-06,1.9e-06,0,0,0,0,2.21e-06,2.2e-06,0,2.25e-06,2.26e-06,2.3e-06,0,1.11e-05,9.83e-06,0,0,0,1.98e-06,1.88e-06,2.01e-06,0,0,0,0,2.14e-06,0,0,2.39e-06,0,2.48e-06,0,0,8.69e-05,0,0,0,1.94e-06,1.87e-06,0,0,0,0,0,0,4.29e-06,0,0,2.3e-06,2.16e-06,2.2e-06,2.22e-06,2.5e-06,1.94e-05,0,2.16e-06,1.93e-06,1.91e-06,2.15e-06,2.18e-06,0,1.92e-06,1.92e-06,1.86e-06,2.3e-06,0,1.98e-06,2.08e-06,1.93e-06,1.94e-06,1.92e-06,1.94e-06,2.04e-06,2.08e-06,2.03e-06,1.98e-06,1.86e-06,3.65e-06],"winrateAvg":0.253355,"leadAvg":-3.08289,"scoreMeanAvg":-4.28531,"scoreStdevAvg":14.0778,"shorttermWinlossErrorAvg":0.242445,"shorttermScoreErrorAvg":3.17609,"ownership":[-87,-90,-91,-84,-66,-44,-22,-6,5,8,-2,-23,-46,-72,-84,-87,-88,-88,-83,-84,-88,-92,-94,-74,-40,-18,-8,5,11,1,-23,-73,-85,-84,-90,-91,-85,-81,-78,-89,-98,-68,-67,-75,-9,-8,-20,37,-3,21,-77,34,-94,-93,-93,-94,-59,-63,-76,-98,-64,-73,27,27,-28,-27,-26,-25,6,-22,37,37,38,39,-4,-44,-40,-41,-51,-91,-25,-16,-19,-39,-54,-89,-20,40,10,18,7,-1,-4,-29,-30,-7,-9,-18,-47,-42,-23,-23,-31,-86,-80,-34,2,8,35,-13,-24,-28,-37,-29,23,29,69,-83,-84,-46,16,14,12,-88,-88,-89,-22,34,-64,-66,-49,-37,-25,46,58,67,95,-84,-41,-21,-13,-20,68,67,-88,-86,-86,87,74,43,-21,-17,62,70,80,95,95,-54,-50,-50,-49,-6,64,85,-88,86,87,-50,-3,-13,-23,72,77,80,81,81,94,93,93,11,18,91,76,86,86,-64,-43,-89,-57,-39,77,80,80,78,74,69,62,53,42,41,43,10,-41,-26,-40,-92,-79,-73,-58,81,82,80,74,69,64,58,52,46,46,49,81,79,-93,-70,-80,-85,-81,-73,84,85,81,71,63,59,59,54,52,52,53,59,-50,-93,-26,-98,-98,-88,-81,87,89,97,71,46,32,87,56,55,55,59,53,85,84,19,71,-29,-89,-85,77,95,91,95,10,-27,9,61,58,57,58,58,63,59,63,72,-97,-91,-86,63,-93,91,80,80,-11,3,92,66,60,61,41,63,62,48,71,-96,-90,-82,-80,-93,-92,84,81,-48,-81,92,71,38,64,94,93,56,80,-96,-96,-74,-74,-94,-94,-92,-95,-95,-95,-27,-29,82,60,68,78,78,59,35,30,-9,-62,-65,-94,-94,-95,-93,-86,-61,-35,37,39,57,66,72,70,60,38,14,-5,-17,-47],"ownershipAllowedMAE":0.0543987})%"); + lines.push_back(R"%({"sample":{"board":"......X............/...X.X.XOOOOOOXXXX./..X.OXXOOXXXXOOXOO./...O.OOXXX..O.OOX../.XO...XOOXX.XOOXXX./.........OXXOOX.O../........O.OXXX...../..XO..X...O......../..O.O............../..O................/..XX.............../...OO............../...XO............../.O.XO...........X../.......O.........../...O..X...O...OX.../.....X..X......X.../.................../.................../","hintLoc":"null","initialTurnNumber":91,"metadata":"32FFE7EB5D302728F045FE1B5E60A572:101","moveLocs":["B14","B16","J19","M11","K10","J12","H13","C14","D14","L11"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.38,"xSize":19,"ySize":19},"rules":"koPOSITIONALscoreAREAtaxNONEsui0button1","komi":-6.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.68e-05,6.5e-05,7.11e-05,8e-05,9.35e-05,6.66e-05,0,7.05e-05,0,4.07e-05,6.13e-05,4.82e-05,4.65e-05,6.62e-05,6.32e-05,6.02e-05,5.7e-05,6.24e-05,5.7e-05,6.34e-05,8.4e-05,7.63e-05,0,0.00229,0,0,0,0,0,0,0,0,0,0,0,0,0,8.61e-05,6.24e-05,7.18e-05,0,8.11e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7.81e-05,6.21e-05,0,7.35e-05,0,9.6e-05,0,0,0,0,0,4.87e-05,5.86e-05,0,4.08e-05,0,0,0,7.6e-05,0.000132,7.77e-05,0,0,6.1e-05,7.41e-05,0.00129,0,0,0,0,0,6.58e-05,0,0,0,0,0,0,0.000126,8.33e-05,0,0,0,7.22e-05,0.000304,0.000228,7.64e-05,5.86e-05,0,0,0,0,0,0,0.0204,0,0.000676,8.8e-05,8.49e-05,0.000164,0.00392,0.000119,6.99e-05,9.05e-05,0.000613,0,0,8.3e-05,0,0,0,0,0.00071,0.000107,8.47e-05,8.57e-05,7.41e-05,7.91e-05,0.000182,0,0,6.28e-05,8.29e-05,0,0.297,0,0.00011,0,0.000851,9.34e-05,7.74e-05,0.000104,0.000315,0.000601,0.00014,7.64e-05,7.27e-05,8.27e-05,0,5.96e-05,0,8.07e-05,0.000108,0.000146,0.000109,0.588,0,0,0.000278,0.000224,0.000226,0.000661,0.0012,0.000301,7.79e-05,6.48e-05,6.47e-05,0,6.28e-05,7.05e-05,8.91e-05,0.000111,0.000447,0.000156,0,9.38e-05,9.04e-05,0.000135,0.000281,0.000403,0.000858,0.00433,0.000776,8.04e-05,6.22e-05,6.81e-05,0,0,7.59e-05,8.29e-05,9.54e-05,0.000112,0.000138,9.67e-05,0.000301,0.000596,0.000484,0.000578,0.000554,0.000942,0.00303,0.000775,8.14e-05,6.33e-05,6.82e-05,7.14e-05,0,0,7.12e-05,8.85e-05,0.000103,0.000115,0.0002,0.000314,0.000525,0.000592,0.00067,0.000653,0.000869,0.00158,0.00075,8.02e-05,6.3e-05,6.7e-05,7.32e-05,0,0,6.57e-05,8.79e-05,0.000103,0.000111,0.000187,0.000378,0.000489,0.000518,0.000672,0.000648,0.000999,0.00333,0.000377,7.72e-05,6.29e-05,0,6.7e-05,0,0,7.52e-05,9.32e-05,9.43e-05,0.000106,0.000205,0.000367,0.000366,0.000295,0.000489,0.00071,0.000764,0,0.00057,7.29e-05,6.42e-05,7e-05,7.64e-05,8.55e-05,9.28e-05,8.97e-05,9.83e-05,0,0.000107,0.000487,0.000112,0.000128,0.000205,0.000125,0.000279,0.00446,0.00094,0.000104,7.34e-05,6.61e-05,7.98e-05,8.29e-05,0,0.000113,8.52e-05,0,0.00165,0.000571,0.000172,0,0.000106,0.000247,9.92e-05,0,0,0.000116,9.99e-05,6.89e-05,6.62e-05,8.18e-05,0.000122,0.000824,0.00339,0,8.5e-05,0.000348,0,0.0012,0.000189,0.000178,0.000184,0.000112,0.000685,0,9.91e-05,9.22e-05,6.71e-05,6.55e-05,8.09e-05,0.000171,0.0023,0.0126,0.000112,0.000138,9.85e-05,0.000178,0.000724,0.000552,0.000118,0.000109,0.000124,0.000122,0.000167,9.8e-05,8.68e-05,6.61e-05,5.65e-05,6.85e-05,7.39e-05,7.85e-05,7.55e-05,7.27e-05,7.21e-05,7.56e-05,7.63e-05,7.92e-05,7.91e-05,7.52e-05,7.42e-05,7.57e-05,7.62e-05,7.42e-05,7.29e-05,6.79e-05,5.6e-05,4.63e-05],"winrateAvg":0.00499185,"leadAvg":-14.7235,"scoreMeanAvg":-15.4415,"scoreStdevAvg":12.0527,"shorttermWinlossErrorAvg":0.0150961,"shorttermScoreErrorAvg":1.62905,"ownership":[-87,-88,-89,-86,-84,-70,-64,38,95,95,94,93,85,33,11,-82,-93,-94,-96,-86,-85,-88,-94,43,-75,-11,-15,95,95,95,96,96,96,-98,-97,-97,-98,-96,-87,-91,-94,-13,78,-73,-71,94,95,-97,-98,-98,-97,96,96,-98,-94,-95,-96,-83,-94,-22,89,68,73,71,-97,-97,-98,-86,-66,65,68,96,96,-97,-96,-89,-44,-94,78,68,54,48,38,61,59,-98,-98,-15,-13,95,96,-96,-97,-97,-52,-28,14,12,91,63,61,61,54,56,70,-98,-98,95,95,-85,-41,-25,-34,-44,14,9,19,73,70,57,64,89,89,61,64,-98,-98,-98,-75,-56,-44,-39,-37,43,45,5,97,74,61,35,77,2,11,63,-23,-55,-54,-46,-40,-40,-36,-33,66,68,97,90,98,60,57,56,23,51,-83,-86,-39,-32,-32,-30,-34,-30,-27,72,81,97,71,68,53,45,39,25,62,-4,-31,-22,-22,-24,-24,-13,-27,-26,71,72,56,56,71,50,35,28,18,9,-11,-9,-13,-14,-18,-23,-33,-34,-30,70,71,75,97,97,45,28,18,11,4,-3,-7,-9,-10,-16,-24,-32,-42,-37,72,69,74,58,97,41,16,12,7,2,0,-3,-7,-11,-20,-27,-28,-48,-45,70,86,71,59,97,27,12,12,4,0,4,-1,-5,-10,-18,-40,-89,-60,-55,63,61,66,69,33,4,-9,52,-1,-7,9,2,-2,-7,-26,-45,-70,-72,-62,51,53,43,89,28,-19,-73,-13,-20,-6,55,10,-4,-6,25,-93,-75,-71,-66,42,40,46,-2,10,-73,-55,-47,-75,-3,6,2,-2,-9,-7,-93,-76,-72,-68,34,28,18,6,2,-41,-45,-51,-42,-19,-13,-4,-10,-14,-32,-58,-71,-67,-69,27,21,14,4,-13,-29,-41,-41,-34,-22,-9,-3,-5,-14,-30,-46,-59,-65,-67],"ownershipAllowedMAE":0.0359664})%"); + lines.push_back(R"%({"sample":{"board":".......O.........../...O..OXXX....X..../.OO.OO.OX....X...../.X.X.X.O.X.....OO../...X............X../.X.OXXX.......OOX../XOO.OOX........X.../.X....O......O...../.....O..........X../.................../..X................/.................../...O.O.........XO../..........X..O.XO../.................../.................../","hintLoc":"null","initialTurnNumber":52,"metadata":"8199ABF0103EB5272D8EF93954F6A219:62","moveLocs":["Q5","Q2","P10","O10","P13","Q12","P2","R2","O11","Q15"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.11,"xSize":19,"ySize":16},"rules":"koPOSITIONALscoreAREAtaxALLsui0button1","komi":6.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.57e-06,4.32e-06,4.18e-06,4.34e-06,4.4e-06,4.77e-06,4.91e-06,0,5.2e-06,4.35e-06,4.84e-06,4.97e-06,4.96e-06,5.21e-06,5.99e-06,0.0053,6.4e-06,7.91e-06,4.57e-06,6.51e-06,6.5e-06,5.82e-06,0,4.46e-06,4.67e-06,0,0,0,0,4.96e-06,6.18e-06,7.01e-06,5.78e-06,0,0,0.151,0.000245,7.17e-06,0.0198,0,0,5.3e-06,0,0,7.21e-06,0,0,4.19e-06,5.61e-06,6.85e-06,6.69e-06,0,6.39e-06,0.00764,6.02e-06,3.26e-05,6.31e-06,5.44e-06,0,4.46e-06,0,4.66e-06,0,0.000985,0,5.76e-06,0,6.21e-06,8.59e-06,8.91e-06,6.22e-06,0,0,0,0.00566,6.67e-06,4.82e-06,4.12e-06,4.35e-06,0,4.29e-06,4.26e-06,4.62e-06,7.68e-06,1.11e-05,7.74e-06,9.08e-06,1.47e-05,1.73e-05,0.392,5.04e-06,0,0,0.0913,1.44e-05,5.05e-06,0,1.04e-05,0,0,0,0,5.44e-06,1.12e-05,1.72e-05,5.31e-05,3.95e-05,0.102,0,0,0,0,1.2e-05,6.11e-06,0,0,0,5.62e-06,0,0,0,8.28e-06,5.5e-05,5.57e-05,6.65e-05,0.00031,2.52e-05,0,0,0,2.11e-05,7.08e-06,4.94e-06,5.25e-06,0,3.18e-05,1.94e-05,1.18e-05,7.2e-06,0,0.00287,0.000116,0.000139,9.26e-05,0.000139,9.07e-06,0,7.22e-06,6.61e-06,1.04e-05,6.57e-06,4.98e-06,4.86e-06,6.65e-06,2.29e-05,1.05e-05,9.3e-06,0,6.88e-06,1.09e-05,0.000422,0.000121,0.00011,4.25e-05,1.85e-05,1.18e-05,0.00244,1.01e-05,0,6.66e-06,5.37e-06,5.01e-06,9.62e-06,8.19e-06,1.37e-05,7.56e-05,1.41e-05,0.000278,3.33e-05,8.65e-05,0.000111,8.96e-05,5.54e-05,2.09e-05,1.55e-05,1.3e-05,2.85e-05,1.27e-05,1.65e-05,5.57e-06,5.24e-06,7.41e-06,0,1.28e-05,0.000144,1.74e-05,5.03e-05,4.68e-05,5.54e-05,8.58e-05,7.89e-05,5.08e-05,2.91e-05,1.31e-05,9.59e-06,1.02e-05,0.00126,0.000143,5.58e-06,5.03e-06,3.19e-05,1.12e-05,3.61e-05,0.0185,5e-05,7.93e-05,4.99e-05,2.89e-05,5.01e-05,4.28e-05,3.65e-05,1.6e-05,1.31e-05,6.09e-06,0,0.0373,1.05e-05,5.22e-06,5.36e-06,1.9e-05,8.66e-05,0,1.29e-05,0,0.000234,8.56e-05,6.8e-05,1.31e-05,8.8e-06,1.33e-05,4.51e-05,9.16e-05,5.58e-06,0,0,5.33e-06,4.74e-06,4.93e-06,9.81e-06,1.92e-05,2.04e-05,8.28e-05,3e-05,7.06e-05,0.000154,4.95e-05,7.99e-06,0,8.37e-06,5.41e-05,0,0.151,0,0,4.74e-06,4.62e-06,5e-06,6.96e-06,8.23e-06,1.07e-05,1.33e-05,1.37e-05,1.14e-05,1.3e-05,9.7e-06,7.66e-06,6.36e-06,1.24e-05,1.44e-05,0.0051,0,0,0,4.63e-06,4.59e-06,4.37e-06,5e-06,4.88e-06,4.97e-06,5.09e-06,5.04e-06,5.09e-06,5.09e-06,5.07e-06,4.98e-06,5.15e-06,5.54e-06,5.64e-06,5.69e-06,5.42e-06,5.05e-06,4.37e-06,4.18e-06,4.24e-06,7.77e-06],"winrateAvg":0.500067,"leadAvg":-0.175659,"scoreMeanAvg":-0.0759764,"scoreStdevAvg":12.1931,"shorttermWinlossErrorAvg":0.150927,"shorttermScoreErrorAvg":1.05064,"ownership":[68,84,89,91,91,89,76,78,-49,-77,-79,-74,-66,-54,-11,16,43,42,41,61,73,88,93,92,89,91,-92,-91,-91,-74,-73,-70,-64,-74,61,32,42,41,-44,93,91,10,93,93,82,87,-91,-77,-57,-50,-58,-86,1,53,51,50,37,-45,-72,23,-90,50,-77,-47,87,5,-86,-40,-33,-29,-51,-68,68,68,26,18,-64,-47,-56,-90,-77,-65,-24,7,12,-8,-19,-25,-41,-46,8,68,-79,-20,-14,-74,-83,-36,45,-90,-90,-90,-23,-3,-8,-16,-27,-56,-87,69,69,-79,-46,-36,-78,58,55,40,72,71,-90,-23,-9,-9,-13,-20,-28,15,-85,-87,-73,-61,-49,-64,-74,-1,-1,21,64,75,-2,18,-6,-9,-16,-14,18,-19,-43,-59,-56,-46,-42,-29,-4,14,26,81,37,29,-4,-3,-6,-12,-18,-21,-48,-38,-86,-39,-34,-28,-32,-6,5,14,28,7,16,2,0,-4,-8,-12,-19,-29,-36,2,-4,-11,-18,-24,-54,4,7,20,14,9,4,1,-2,-6,-9,-16,-27,-38,35,30,14,-2,6,33,18,3,26,14,7,4,1,-4,-6,-9,-11,-33,-81,-20,50,43,13,19,35,83,48,83,19,7,0,3,-9,-12,-9,-16,-37,-82,86,69,65,20,26,37,50,46,42,20,-5,-3,-17,-68,-19,-16,27,-45,-82,85,80,75,25,28,35,36,35,24,14,-3,-14,-26,-37,-30,-14,0,-48,86,86,81,78,28,31,33,34,31,23,11,-2,-14,-24,-30,-27,-20,-17,7,32,77,81,79],"ownershipAllowedMAE":0.0378723})%"); + lines.push_back(R"%({"sample":{"board":".................../.................../.................../..O.............O../...............X.../.........X...O...../.................../.................../.................../.................../.................../.................../.................../.................../...X.............../................X../...XO............../.................../.................../","hintLoc":"null","initialTurnNumber":9,"metadata":"397F0C82BF620D5E18E1A0861C9709FA:19","moveLocs":["D4","C3","H12","R15","S15","Q16","E10","P13","C4","E4"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":0.1,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":-8.0,"policyOptimism":0.47,"pda":-0.421,"policyMixture":[7.19e-05,8.09e-05,8.21e-05,8.78e-05,8.75e-05,8.76e-05,8.73e-05,8.75e-05,8.74e-05,8.68e-05,8.61e-05,8.59e-05,8.68e-05,8.9e-05,9.35e-05,9.12e-05,8.85e-05,8.36e-05,6.97e-05,8.01e-05,9.45e-05,0.000107,0.000118,0.000122,0.000124,0.000123,0.000124,0.000125,0.000124,0.000122,0.000121,0.000125,0.000322,0.00242,0.000376,0.000513,0.000107,8.4e-05,7.81e-05,0.000101,0.000112,0.000286,0.00168,0.00201,0.0016,0.00181,0.00175,0.00169,0.00126,0.00097,0.00187,0.00217,0.00279,0.00938,0.0828,0.00436,8.58e-05,8.32e-05,0.000101,0,0.000139,0.00201,0.00203,0.00165,0.00196,0.00185,0.00186,0.00133,0.000267,0.000312,0.00162,0.000177,0,0,0.0032,0.000102,8.21e-05,0.000113,0.000116,0.000141,0.000197,0.000154,0.000594,0.000778,0.00142,0.000992,0.000292,0.000138,0.000124,0.000107,9.98e-05,0,0,0,8.55e-05,8.4e-05,0.000117,0.000135,0.000251,0.00013,0.000132,0.000136,0.000284,0.000169,0,0.000215,0.000142,0.00011,0,0.00143,0.000503,0.00305,0.00538,0.000106,8.39e-05,0.000114,0.000136,0.000141,0.00013,0.000129,0.000122,0.000114,0.000123,0.000134,0.000154,0.000134,0.00012,0.000251,0,0.000595,0.00467,0.00367,8.7e-05,8.49e-05,0.000113,0.000127,0.000133,0.000127,0.000122,0.000108,0,0.000112,0.00014,0.000136,0.00014,0.000376,0.000132,0.000136,0.000149,0.000612,0.000116,8.63e-05,8.53e-05,0.000115,0.000141,0.000123,0.00011,0.000118,0.000117,0.000107,0.000118,0.000129,0.000134,0.000135,0.000153,0.000137,0.000153,0.000182,0.00069,0.00012,8.52e-05,8.6e-05,0.000118,0.000211,0.000115,0,0.000106,0.000122,0.000123,0.000126,0.000126,0.000129,0.000132,0.000133,0.000133,0.000137,0.000176,0.000457,0.000118,8.47e-05,8.52e-05,0.000118,0.000351,0.000123,0.000107,0.000114,0.000122,0.000125,0.000126,0.000126,0.000129,0.00013,0.000131,0.000132,0.000135,0.000173,0.000223,0.000118,8.44e-05,8.42e-05,0.00012,0.000485,0.000151,0.000122,0.000123,0.000123,0.000124,0.000125,0.000127,0.000128,0.000128,0.000129,0.000131,0.000135,0.000174,0.000214,0.000118,8.43e-05,8.46e-05,0.000168,0.00152,0.000362,0.000128,0.000123,0.000124,0.000124,0.000125,0.000126,0.000127,0.000128,0.000129,0.000131,0.000137,0.000269,0.000687,0.00012,8.43e-05,8.52e-05,0.00139,0.00187,0.00119,0.000141,0.000127,0.000125,0.000125,0.000125,0.000126,0.000127,0.000129,0.000129,0.000134,0.000136,0.00124,0.000939,0.000131,8.42e-05,9.09e-05,0.00744,0.194,0,0.0103,0.000214,0.000126,0.000125,0.000126,0.000127,0.000129,0.000131,0.000132,0.000136,0.000194,0.00294,0.00311,0.000132,8.54e-05,9.39e-05,0.00629,0,0,0,0.00508,0.000178,0.000133,0.000132,0.00014,0.000159,0.000181,0.00016,0.00142,0.00206,0.00496,0,0.000207,8.55e-05,8.18e-05,0.542,0,0,0,0.000864,0.000205,0.000194,0.00017,0.000165,0.000205,0.000275,0.000226,0.000815,0.00268,0.00334,0.00363,0.000123,8.39e-05,7.54e-05,9.39e-05,0.000152,0.000989,0.000929,0.000234,0.000111,0.000111,0.000113,0.000114,0.000116,0.000118,0.00012,0.000123,0.000137,0.000127,0.000122,0.000111,8.12e-05,6.66e-05,8.18e-05,7.88e-05,7.91e-05,8.16e-05,7.65e-05,8.09e-05,8.3e-05,8.28e-05,8.38e-05,8.47e-05,8.52e-05,8.57e-05,8.6e-05,8.61e-05,8.46e-05,8.21e-05,8.14e-05,7.06e-05,3.79e-05],"winrateAvg":0.00274318,"leadAvg":-21.3805,"scoreMeanAvg":-23.125,"scoreStdevAvg":15.1182,"shorttermWinlossErrorAvg":0.00774842,"shorttermScoreErrorAvg":1.53601,"ownership":[37,33,27,18,9,3,1,0,-1,-1,-2,-3,-4,-3,-2,3,9,11,11,41,38,30,22,7,3,2,0,-1,-2,-4,-5,-6,-3,-3,3,8,10,10,43,47,40,28,3,5,3,2,-2,-3,-5,-7,-9,-16,-22,-21,8,10,5,43,49,79,9,4,3,2,3,-1,-4,-6,-9,-11,-18,-31,-89,26,-4,-1,37,41,31,18,11,3,2,0,1,-10,-6,-10,-15,-14,-35,-90,-91,5,-19,28,29,22,18,10,5,3,0,-7,-62,-12,-11,-7,29,-16,-42,-44,-47,-24,22,23,21,16,12,7,3,6,-1,-10,-4,-8,-10,-16,-76,-34,-28,-20,-25,17,18,15,15,14,10,12,62,6,-3,-5,-5,-10,-16,-25,-22,-23,-23,-19,15,17,15,16,17,10,9,11,2,-1,-3,-5,-6,-12,-16,-17,-17,-17,-15,16,17,16,21,68,15,9,7,2,-2,-4,-5,-7,-10,-13,-15,-13,-15,-13,18,19,17,14,16,9,5,4,1,-2,-3,-5,-6,-8,-11,-13,-12,-14,-12,21,21,17,13,10,5,2,1,-1,-3,-4,-4,-5,-7,-9,-13,-15,-17,-15,22,25,19,12,6,2,-2,-2,-3,-4,-4,-5,-5,-7,-9,-13,-20,-23,-20,18,23,22,17,0,-5,-6,-5,-5,-5,-5,-5,-5,-7,-10,-16,-23,-30,-28,6,26,39,-19,-10,-18,-13,-9,-8,-7,-6,-6,-6,-8,-12,-19,-34,-42,-37,-10,-23,50,49,-73,-48,-21,-14,-10,-8,-7,-7,-6,-7,-10,-8,-80,-50,-43,-32,-23,-61,-62,-7,-33,-20,-13,-9,-8,-7,-7,-7,-10,-7,-30,-43,-47,-43,-33,-52,-45,-41,-27,-30,-20,-13,-10,-8,-7,-6,-6,-6,-11,-24,-32,-40,-41,-35,-39,-39,-36,-31,-26,-20,-14,-9,-7,-5,-4,-4,-6,-11,-19,-28,-33,-37],"ownershipAllowedMAE":0.0389634})%"); + lines.push_back(R"%({"sample":{"board":"................/.............O../...O.....XO..OX./....O......OXOX./..X......X.OOX../...O.......XX.X./................/................/................/................/...........O..../................/.OXXX.....OOXX../.XOOOX....OX..../.O...OX....X..../................/","hintLoc":"null","initialTurnNumber":40,"metadata":"4AEA55684368836CA23E6010D7EE5692:50","moveLocs":["E2","D2","B5","A3","G4","O7","L8","K7","O6","N6"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.1,"xSize":16,"ySize":16},"rules":"koPOSITIONALscoreTERRITORYtaxNONEsui0","komi":3.0,"policyOptimism":0.536,"pda":1.158,"policyMixture":[1.85e-06,3.01e-06,3.25e-06,3.02e-06,2.74e-06,2.54e-06,2.44e-06,2.45e-06,3.21e-06,5.37e-06,4.04e-06,3.33e-06,2.95e-06,2.99e-06,2.84e-06,2.08e-06,2.91e-06,5.12e-05,7.23e-05,6.04e-05,6.64e-05,7.29e-06,6.51e-06,5.05e-06,8.63e-05,0.113,0.0378,0.000225,5.35e-06,0,1.03e-05,2.41e-06,2.86e-06,0.000139,0.00376,0,8.54e-06,7.51e-05,1.88e-05,2.45e-05,5.72e-06,0,0,7.85e-05,3.23e-05,0,0,1.99e-06,2.98e-06,0.000251,3.37e-05,1.4e-05,0,1.27e-05,3.3e-05,8.49e-06,7.5e-06,5.29e-06,0.000108,0,0,0,0,1.7e-06,3.2e-06,1.57e-05,0,0.000458,1.74e-05,1.67e-05,3.81e-05,1.35e-05,5.09e-06,0,0.0012,0,0,0,2.01e-06,1.93e-06,3.2e-06,2.87e-05,0.00308,0,5.35e-05,0.000135,3.7e-05,1.92e-05,6.37e-06,4.62e-06,5.54e-06,0,0,2.55e-06,0,1.9e-06,2.99e-06,8.77e-05,0.00207,4.2e-05,6.4e-05,5.66e-05,3.82e-05,2.4e-05,1.9e-05,9.45e-06,6.2e-06,3.18e-06,3.41e-06,3.54e-06,3.32e-06,2.06e-06,2.78e-06,5.74e-05,0.000246,0.00013,3.92e-05,4.56e-05,4.35e-05,3.66e-05,5.16e-05,1e-05,5.41e-06,7.72e-06,5.82e-06,9.29e-06,5.3e-06,2.44e-06,2.53e-06,7.6e-06,6.09e-05,5.5e-05,3.27e-05,4.05e-05,4.07e-05,4.57e-05,1.84e-05,0.000111,0,6.35e-06,5.46e-05,5.53e-05,8.35e-06,2.86e-06,2.47e-06,7.22e-06,1.26e-05,1.31e-05,1.04e-05,3.25e-05,3.06e-05,6.25e-05,1.35e-05,0,0.00886,4.63e-06,0.0181,0,0.00783,2.92e-06,2.5e-06,4.16e-06,1.51e-05,6.3e-06,6.2e-06,1.24e-05,1.02e-05,4.37e-05,2.39e-05,1.39e-05,6.83e-06,0,0,0,0.799,3.26e-06,2.91e-06,0,3.56e-06,2.51e-06,3.09e-06,4.03e-06,4.72e-06,9.56e-06,3.39e-05,4.3e-05,1.75e-05,7.31e-06,6.29e-06,4.04e-05,6.45e-05,3.27e-06,2.85e-06,0,0,0,0,2.43e-06,0,3.87e-06,2.26e-05,4.2e-06,0,0,0,0,4.5e-06,2.77e-06,0,0,0,0,0,0,2.33e-06,3.9e-06,7.89e-06,4.59e-06,0,0,2.86e-06,2.88e-06,3.2e-06,2.15e-06,2.07e-06,0,2.16e-06,0,0,0,0,3.22e-06,5.44e-06,6.18e-06,0.000179,0,2.68e-06,3.94e-06,2.95e-06,2.22e-06,1.93e-06,2.09e-06,2.2e-06,2.33e-06,2.96e-06,5.31e-06,2.25e-06,2.35e-06,2.87e-06,3.05e-06,3.28e-06,2.4e-06,2.21e-06,2.29e-06,2.16e-06,1.75e-06,7.3e-06],"winrateAvg":0.121752,"leadAvg":-3.66652,"scoreMeanAvg":-5.25848,"scoreStdevAvg":12.3397,"shorttermWinlossErrorAvg":0.0916733,"shorttermScoreErrorAvg":1.02664,"ownership":[9,17,25,34,30,16,2,-8,-8,7,41,63,70,52,30,-6,4,6,33,42,35,17,4,-5,-17,-6,51,75,76,82,-15,-38,-4,-3,-2,82,43,4,5,-6,-16,-54,84,79,83,83,-93,-60,-11,-13,11,29,83,27,4,-7,-14,-28,-2,85,81,83,-94,-85,-13,-19,-37,12,40,15,2,-9,-24,-74,-12,84,84,-94,-92,-89,-8,-14,18,69,23,6,0,-7,-13,-25,-24,-94,-95,-91,-95,-81,-3,4,17,26,10,5,-1,-5,-10,-19,-27,-39,-44,-13,-49,-62,-2,-1,5,10,5,1,-2,-5,-7,-17,-30,-19,-21,-27,-36,-39,-5,-4,-4,-3,-1,-2,-2,-1,3,11,-63,0,2,-11,-26,-31,-6,-7,-6,-6,-7,-5,-4,4,19,63,-12,21,25,28,-20,-38,-5,2,3,-18,-18,-16,-16,-5,5,22,56,79,78,-90,-90,-52,13,-49,-43,-39,-32,16,-37,-12,-3,11,41,50,10,-37,-78,-73,47,93,-87,-87,-88,-84,-92,-35,-5,20,76,78,-95,-95,-86,-79,95,93,97,97,97,-89,-67,-14,-2,23,77,-87,-85,-86,-85,-83,95,97,96,97,6,4,-84,-35,-13,10,26,-86,-76,-77,-82,-83,96,96,96,82,43,-29,-47,-38,-13,7,6,-24,-61,-74,-80,-82],"ownershipAllowedMAE":0.03769})%"); + lines.push_back(R"%({"sample":{"board":".O...X............./.XOOOOX..O.X.OOXX../..OXOXXOOXXXOX.OX../.OOXX..XXO..O..OX../.X.X.....XXO...O.../.X......O.......X../...X......O......../..O.....O.......O../.XO................/.OX.X.X............/.X.....X....O...O../...XXO..........XO./....O.........O.XO./..X............OXO./...X..O........XOO./..XOXXOX...O...XXX./..XO.O.O....OOOOXOX/..O.O.O......XXXXO./.....O............./","hintLoc":"null","initialTurnNumber":112,"metadata":"19483C3CF8D8A84E0B00182B2F36C021:122","moveLocs":["S12","S11","Q12","R13","Q14","Q13","P14","P13","O14","M14"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":1.49,"xSize":19,"ySize":19},"rules":"koSIMPLEscoreAREAtaxNONEsui1","komi":7.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[9.83e-06,0,3.64e-05,6.19e-06,9.37e-06,0,4.78e-06,4.4e-06,4.97e-06,4.64e-06,4.77e-06,4.57e-06,4.91e-06,5.28e-06,5.39e-06,5.01e-06,4.62e-06,4.97e-06,4.69e-06,0.000179,0,0,0,0,0,0,4.7e-06,5.45e-06,0,4.78e-06,0,0.00352,0,0,0,0,4.85e-06,5.12e-06,2.11e-05,6.98e-06,0,0,0,0,0,0,0,0,0,0,0,0,1.37e-05,0,0,4.62e-06,5.06e-06,0.00011,0,0,0,0,4.48e-06,4.69e-06,0,0,0,8.11e-06,0.000546,0,0.227,3.98e-05,0,0,5.83e-06,5.86e-06,4.71e-06,0,4.89e-06,0,4.33e-06,4.72e-06,4.96e-06,4.91e-06,5.38e-06,0,0,0,0.000298,1.03e-05,0.00026,0,0.0135,0.095,5.92e-06,4.87e-06,0,4.65e-06,4.43e-06,4.45e-06,5.04e-06,5.74e-06,5.34e-06,0,5.92e-06,1.03e-05,0,2.17e-05,0,0,0,0,0.391,4.91e-06,4.56e-06,4.42e-06,4.5e-06,0,4.84e-06,5.58e-06,7.74e-06,4.72e-05,5.98e-06,7.23e-05,0,4.6e-05,0.0362,0.168,0,0,0,0.0615,5.02e-06,4.66e-06,4.54e-06,0,4.76e-06,4.78e-06,5.77e-06,1.44e-05,9.13e-06,0,6.31e-05,1.93e-05,3.09e-05,1.1e-05,1.14e-05,5.41e-06,0,0,0,4.43e-06,4.72e-06,0,0,4.85e-06,5.15e-06,5.29e-06,5.73e-06,6.99e-06,1.1e-05,4.24e-05,2.82e-05,1.56e-05,7.09e-06,5.94e-06,5.07e-06,4.79e-06,1.27e-05,0,4.73e-06,4.93e-06,0,0,4.43e-06,0,5.02e-06,0,4.77e-06,2.35e-05,9.78e-05,4.18e-05,2.21e-05,8.88e-06,5.58e-06,5.11e-06,4.81e-06,8.91e-06,5.28e-06,4.53e-06,4.6e-06,0,4.16e-06,4.53e-06,4.63e-06,5.04e-06,4.62e-06,0,7.75e-06,9.55e-05,3.62e-05,1.99e-05,0,5.94e-06,5.04e-06,5.54e-06,0,5.12e-06,4.39e-06,4.51e-06,4.54e-06,4.63e-06,0,0,0,5.51e-06,5.87e-06,1.62e-05,1.94e-05,1.37e-05,6.39e-06,6.99e-06,5.7e-06,5.62e-06,5.68e-06,0,0,4.34e-06,4.41e-06,4.63e-06,4.41e-06,4.83e-06,0,5.37e-06,4.18e-05,4.24e-05,1.96e-05,7.04e-06,6.29e-06,6.02e-06,5.83e-06,6.06e-06,0,6.82e-06,0,0,4.34e-06,4.5e-06,4.66e-06,0,4.47e-06,5.12e-06,1.75e-05,8.03e-05,1.68e-05,6.56e-06,6.18e-06,6.07e-06,5.96e-06,7.06e-06,1.01e-05,0.000148,0,0,0,4.42e-06,4.5e-06,4.29e-06,4.01e-06,0,4.68e-06,8.97e-06,0,6.98e-06,5.23e-06,5.82e-06,5.83e-06,6.05e-06,5.74e-06,1.14e-05,5.37e-06,0,0,0,4.61e-06,4.58e-06,4.61e-06,0,0,0,0,0,0,5.3e-06,5.61e-06,5.68e-06,0,4.83e-06,4.96e-06,4.79e-06,0,0,0,4.52e-06,4.62e-06,5.25e-06,0,0,7.65e-06,0,0,0,5.34e-06,5.59e-06,6.32e-06,5.47e-06,0,0,0,0,0,0,0,4.63e-06,5.54e-06,0,2.38e-05,0,0,0,4.85e-06,5.13e-06,5.18e-06,5.07e-06,1.04e-05,6.02e-06,0,0,0,0,0,4.72e-06,4.47e-06,4.49e-06,4.93e-06,4.9e-06,4.15e-06,0,4.19e-06,4.53e-06,4.62e-06,4.77e-06,5.36e-06,5.32e-06,5.01e-06,4.72e-06,4.48e-06,4.43e-06,4.35e-06,4.45e-06,4.99e-06,5.92e-06],"winrateAvg":0.39628,"leadAvg":-1.00724,"scoreMeanAvg":-1.35166,"scoreStdevAvg":9.04713,"shorttermWinlossErrorAvg":0.253765,"shorttermScoreErrorAvg":1.51261,"ownership":[90,94,91,91,49,-87,-87,-94,-93,-88,-85,-16,24,60,22,-4,-89,-93,-92,90,89,96,96,96,96,-99,-96,-95,-86,-90,-98,47,88,88,-97,-97,-94,-91,85,92,96,-97,96,-99,-99,-93,-93,-99,-98,-98,95,-36,70,72,-97,-93,-90,-1,96,96,-97,-97,-66,-51,-98,-99,-81,-78,52,95,-39,11,71,-97,-87,-81,-45,-97,19,-97,-51,-26,-8,-10,0,-93,-91,96,29,-35,-59,68,-51,-54,-57,-89,-97,-71,-62,-15,-16,-1,16,74,-9,35,95,-15,-97,-98,-98,-97,-42,-19,-88,-84,-80,-94,-37,-11,10,3,47,44,94,46,8,24,97,97,97,12,6,-85,-82,-65,-77,-51,-23,28,39,86,44,47,32,29,43,62,54,97,9,48,-90,-94,-65,-72,-63,-39,-14,9,22,20,29,30,32,43,56,70,79,93,60,-94,-92,-95,-67,-92,-57,-94,-25,10,-2,14,21,38,50,57,68,75,81,82,-94,-97,-92,-85,-51,-22,-48,-90,-35,-19,4,18,86,53,59,69,98,93,91,-93,-94,-92,-99,-98,29,-9,-18,-9,-5,3,14,26,42,59,87,82,99,95,-90,-93,-89,-24,25,9,-10,5,2,6,9,14,21,30,95,84,82,99,95,-84,-91,-98,-39,-14,13,12,25,18,14,15,17,15,7,-3,87,81,99,91,-67,-78,-93,-95,-20,22,96,43,31,26,25,27,10,-16,-20,-98,99,99,61,-35,-87,-96,96,-15,-15,98,23,45,37,47,93,45,7,-39,-98,-98,-98,-89,-20,-12,-95,98,33,99,96,99,56,47,43,63,93,93,92,93,-98,-94,-96,9,6,97,95,100,99,100,82,64,46,47,9,56,-98,-98,-98,-98,-95,-96,39,90,91,96,98,100,96,82,64,47,20,-6,-55,-67,-93,-96,-96,-96,-96],"ownershipAllowedMAE":0.0328656})%"); + lines.push_back(R"%({"sample":{"board":"..........X.XX.XO./.X..XO...O.XOX.XOO/...X......OOOOXXXO/.XXOOO.OO..OXXX.O./OOOX...XXOOXX..OO./.X.OOX..OXXXXOOOX./..XXX....OOXOXOXX./.OO...O.OX.OOXXX../.....XX...O..OOX../..X...........XX../................../...O.O............/...............X../..........XOO...../...X......XXO.O.../............XO..../...........X.XO.../.............O..../","hintLoc":"null","initialTurnNumber":109,"metadata":"A41ACDDDF97AA35CF124BC85629BA173:119","moveLocs":["F4","H7","C6","B5","E9","F8","G8","G7","F9","J10"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.17,"xSize":18,"ySize":18},"rules":"koSIMPLEscoreAREAtaxALLsui0button1","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[3.67e-06,4.74e-06,5.11e-06,6.41e-06,9.07e-06,4.97e-06,4.95e-06,4.92e-06,4.58e-06,6.48e-06,0,0,0,0,5.13e-06,0,0,3.22e-06,5.44e-06,0,1.87e-05,6.17e-05,0,0,4.64e-06,5.33e-06,4.63e-06,0,6.5e-06,0,0,0,4.82e-06,0,0,0,4.78e-06,1.3e-05,0.000254,0,9.47e-05,4.49e-06,5.2e-06,4.45e-06,4.37e-06,4.57e-06,0,0,0,0,0,0,0,0,6e-06,0,0,0,0,0,5.38e-06,0,0,4.74e-06,4.39e-06,0,0,0,0,3.72e-06,0,6.19e-06,0,0,0,0,5.45e-06,7.45e-06,0.0921,0,0,0,0,0,0,3.9e-06,3.76e-06,0,0,4.16e-06,8.32e-06,0,7.78e-06,0,0,0,0.00383,0.00146,0,0,0,0,0,0,0,0,0,4.39e-06,4.64e-06,5.16e-06,0,0,0,5.24e-05,0.0535,0.0476,0.357,0,0,0,0,0,0,0,0,4.42e-06,4.73e-06,0,0,6.7e-06,5.2e-06,0.000102,0,0.167,0,0,3.44e-05,0,0,0,0,0,3.97e-06,4.13e-06,4.98e-06,4.85e-06,6.69e-06,0.000404,8.33e-05,0,0,0.0291,0,0.201,0,4.25e-06,6.03e-06,0,0,0,4.17e-06,4.07e-06,5.02e-06,7.67e-06,0,7.57e-06,0,0,9.05e-05,1.46e-05,0.000103,3.62e-05,9.82e-06,1.47e-05,1.33e-05,1.08e-05,0,0,4.66e-06,4.1e-06,5.12e-06,6.58e-06,7.62e-06,4.77e-06,0.0366,0,0,0.00322,9.76e-06,0.000395,0.000263,0.000106,9.26e-05,2.11e-05,6.18e-06,5.77e-06,5.83e-06,4.23e-06,5.19e-06,6.76e-06,4.76e-06,0,6.1e-06,0,0,0,9.72e-06,0.000101,0.000103,0.00013,2.42e-05,8.09e-06,4.74e-05,2.28e-05,6.64e-06,4.63e-06,5.23e-06,2.25e-05,0,5.1e-06,9.27e-06,0.00254,2.51e-05,6.78e-06,2.5e-05,3.35e-05,8.18e-05,6.77e-06,5.36e-06,5.52e-06,8e-06,0,7.44e-06,4.57e-06,5.22e-06,0,3.69e-05,3.45e-05,7.48e-05,1.4e-05,1.25e-05,2.58e-05,1.97e-05,6.56e-06,0,0,0,4.23e-06,4.98e-06,8.51e-06,7.39e-06,4.54e-06,4.74e-06,7.63e-06,1.86e-05,0,4.91e-05,0,7.14e-06,2.86e-05,3.1e-05,5.65e-06,0,0,0,4.01e-06,0,5.34e-06,5.78e-06,4.51e-06,4.76e-06,3.5e-05,2.7e-05,0.000305,6e-05,1.4e-05,1.54e-05,3.5e-05,1.53e-05,7.14e-06,5.66e-06,4.88e-06,0,0,4.02e-06,4.68e-06,4.83e-06,4.38e-06,4.5e-06,7.13e-06,1.69e-05,2.78e-05,9.97e-05,2.38e-05,8.49e-06,7.46e-06,7.83e-06,6.99e-06,6.03e-06,0,9.56e-06,0,0,4.41e-06,4.59e-06,4.3e-06,3.66e-06,4.68e-06,4.94e-06,5.41e-06,5.24e-06,5.08e-06,4.82e-06,4.72e-06,4.7e-06,4.78e-06,4.73e-06,5.07e-06,4.79e-06,0,4.37e-06,4.02e-06,4.23e-06,3.72e-06,5.42e-06],"winrateAvg":0.614543,"leadAvg":0.863702,"scoreMeanAvg":1.50239,"scoreStdevAvg":13.2223,"shorttermWinlossErrorAvg":0.225852,"shorttermScoreErrorAvg":1.88949,"ownership":[-84,-84,-83,-70,-31,1,48,56,50,22,-32,-23,-92,-94,-58,-95,54,-13,-82,-85,-84,-78,-82,74,46,67,63,96,70,-31,96,-94,-74,-96,57,55,-73,-82,-80,-82,48,65,65,77,80,93,97,97,96,95,-97,-96,-97,54,-10,-85,-84,96,96,97,65,96,97,93,95,97,-97,-97,-97,-29,54,55,86,86,87,81,87,23,42,11,13,96,95,-97,-97,-45,-19,53,53,-51,20,-72,-39,88,89,-42,12,29,95,-95,-96,-97,-97,56,54,55,-99,-80,6,-34,-80,-79,-77,-34,18,46,92,96,96,-97,94,-99,57,-99,-99,-95,22,54,51,-25,-37,-35,57,11,95,-7,93,95,95,-99,-99,-99,-97,-95,21,15,8,-7,-23,-85,-85,-30,-65,1,95,54,30,39,32,-99,-95,-93,16,8,-27,26,82,81,-25,-39,-28,-2,25,24,16,-31,-98,-99,-91,-88,22,18,27,51,76,43,52,-34,-35,-8,6,17,20,-4,-31,-60,-79,-77,24,35,53,85,42,69,-77,-77,-23,-13,-8,14,16,5,-10,-41,-71,-62,5,31,80,33,9,-11,-15,-25,-17,-19,-10,13,30,3,1,-83,-57,-38,-19,-57,1,-5,-8,6,-10,-13,-17,-30,-82,88,88,24,20,11,1,-19,-43,-42,-45,-75,-1,54,8,-5,-13,-32,-82,-82,88,75,90,44,13,11,-46,-48,-52,-17,-5,13,6,-3,-15,-25,-47,-37,-38,88,72,40,37,27,-47,-45,-44,-27,-6,4,2,-9,-18,-33,-36,-67,5,1,84,58,45,39,-46,-43,-36,-21,-6,3,1,-7,-19,-30,-37,-23,0,60,57,60,54,47],"ownershipAllowedMAE":0.0396368})%"); + lines.push_back(R"%({"sample":{"board":".................../...........XXOO..../.XXX.X.....X.XO.OO./.XOOOX..O.OOXX.X.../.O...........X..X../.OXX..X.....O.XXOO./..OX.X..XO..XXOXX../...O.OOOOO.OXOOX.../...O...XXO.OXOXXO../..O.X....X.XOOOO.../..OX.X..X..XO.OXX../..XOX.O.XO.XOXOX.../..XOOO....OX.X.X.O./..XXO....XO.XXX.XO./..XO.O.X.XOOOXOO.O./..XOO.OO.OX.OOX.O.O/..XXXO.X.O.O.XX.XO./..XOOXX.....OOXX.XX/..............OX.../","hintLoc":"null","initialTurnNumber":177,"metadata":"1296CF95BA0859108CB9A8BCCF8C3FE1:187","moveLocs":["R10","S10","O14","Q6","K18","S11","P15","S13","P16","B13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.33,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0","komi":6.5,"policyOptimism":0.0,"pda":-2.702,"policyMixture":[5.74e-05,6.12e-05,6.36e-05,6.72e-05,8.07e-05,7.95e-05,7.66e-05,7.64e-05,7.34e-05,6.79e-05,6.63e-05,6.33e-05,6.36e-05,6.2e-05,5.94e-05,5.95e-05,5.9e-05,6.03e-05,5.67e-05,5.91e-05,6.41e-05,6.96e-05,0.000104,0.00104,0.00107,0.00115,0.000132,8.46e-05,0,6.86e-05,0,0,0,0,6.2e-05,6.24e-05,6.12e-05,6.1e-05,6.16e-05,0,0,0,0.000953,0,0.000216,0.000115,8e-05,7.34e-05,6.94e-05,0,0,0,0,6.8e-05,0,0,6.36e-05,6.25e-05,0,0,0,0,0,0.000132,8.78e-05,0,7.13e-05,0,0,0,0,0,0,7.27e-05,6.56e-05,7.53e-05,5.92e-05,0,0.000107,5.93e-05,8.4e-05,0.000703,0.00126,8.34e-05,7.78e-05,6.97e-05,6.35e-05,6.63e-05,6.54e-05,0,0,0.0187,0,0.0016,7.3e-05,7.03e-05,0,0,0,0.00101,0.000132,0,8.91e-05,7.5e-05,6.85e-05,6.59e-05,6.66e-05,0,0,0,0,0,0,0.000104,0.000157,0,0,0,0.00446,0,0.000114,7.01e-05,0,0,6.49e-05,7.17e-05,0,0,0,0,0,0,0.000716,8.48e-05,0.000235,0.575,0,6.92e-05,0,0,0,0,0,0.000103,0,0,0,0,0,0.000827,0.13,0.000508,7.42e-05,7.56e-05,8.01e-05,0,7.24e-05,7.89e-05,0.000205,0,0,0,0.000782,0,0,0,0,0,0,0,0.000882,6.88e-05,7.36e-05,0,7.65e-05,0,7.28e-05,0.000187,0.0263,0.000311,0,0.00579,0,0,0,0,0,0,0,0.00174,7.29e-05,7.47e-05,0,0,0,0,8.61e-05,0.000174,0,0.00608,0.000839,0,0,6.32e-05,0,0,0,0.00386,0.0022,7.14e-05,7.8e-05,0,0,0,7e-05,0,0.000127,0,0,8e-05,0,0,0,0,0,0.000659,0.0216,0.00348,7.13e-05,6.92e-05,0,0,0,0,6.78e-05,7.89e-05,0.000189,7.77e-05,0,0,0.00466,0,6.61e-05,0,9.18e-05,0,0.000244,6.71e-05,6.08e-05,0,0,0,5.97e-05,7.25e-05,7.78e-05,7.46e-05,0,0,0.00631,0,0,0,0,0,0,0.0016,6.09e-05,5.94e-05,0,0,6.25e-05,0,7.18e-05,0,8.21e-05,0,0,0,0,0,0,0,0.0182,0,6.92e-05,5.78e-05,5.76e-05,0,0,0,6.61e-05,0,0,7.75e-05,0,0,6.29e-05,0,0,0,0.113,0,5.82e-05,0,5.66e-05,5.76e-05,0,0,0,0,0.000146,0,8.72e-05,0,6.71e-05,0,0.00994,0,0,0.00203,0,0,0.00136,5.67e-05,5.79e-05,0,0,0,0,0,9.68e-05,9.33e-05,8.08e-05,7.34e-05,6.4e-05,0,0,0,0,0.00647,0,0,5.68e-05,5.92e-05,5.99e-05,5.99e-05,6.52e-05,7.09e-05,7.34e-05,7.28e-05,7.39e-05,7.05e-05,6.57e-05,6.55e-05,7.41e-05,0.000477,0,0,0.00074,0.00874,9.73e-05,5.43e-05],"winrateAvg":0.0225557,"leadAvg":-4.30302,"scoreMeanAvg":-4.34779,"scoreStdevAvg":5.63594,"shorttermWinlossErrorAvg":0.0758115,"shorttermScoreErrorAvg":1.36294,"ownership":[-98,-97,-95,-89,-75,-45,-21,24,62,85,95,95,97,97,98,99,99,98,97,-99,-98,-98,-96,-87,-75,-28,-12,62,97,96,94,94,100,100,99,99,98,97,-98,-100,-100,-100,-93,-99,-36,-6,53,91,97,94,96,96,100,48,100,100,91,-88,-100,-90,-89,-87,-100,-35,18,93,81,99,99,95,95,100,-7,57,80,83,-82,-29,-97,-94,-91,-85,-29,-5,8,62,77,94,97,96,100,-12,-16,73,54,-34,-19,-99,-99,-87,-82,-94,1,14,48,75,92,100,100,-98,-98,65,71,-2,10,-14,96,-98,-18,-91,38,46,-7,100,90,99,99,99,100,-98,-98,-98,-59,61,22,98,99,38,100,100,100,100,100,91,100,99,100,100,-98,-10,-59,-93,77,87,95,100,50,57,11,-88,-91,100,21,100,99,100,-97,-98,99,-99,-95,61,87,99,57,-22,10,17,3,-90,-98,-34,-99,100,100,100,100,99,-99,-98,33,20,99,-6,1,-26,2,-10,-98,-36,-60,-100,100,64,100,-100,-100,-99,-98,-31,-23,-100,98,-7,51,90,-8,-97,67,25,-100,99,-100,99,-100,-98,-97,-97,-65,-94,-100,98,98,97,37,-16,2,4,99,-100,-74,-100,-41,-100,-98,-97,-98,-92,-98,-100,-100,97,73,33,21,3,-25,99,19,-100,-100,-100,-100,-100,-97,-97,-96,-99,-100,90,88,97,62,-13,32,-25,99,99,99,-100,-96,-97,-98,-97,-97,-98,-99,-100,89,89,79,96,96,52,99,94,98,99,99,-99,-97,-97,-97,-97,-99,-99,-100,-100,-100,81,-47,-94,15,98,93,99,44,-99,-99,-98,-99,-97,-98,-99,-99,-100,-98,-98,-99,-99,-66,-27,47,67,90,98,98,-99,-99,-99,-99,-99,-99,-99,-99,-99,-98,-92,-60,-40,-6,25,59,81,73,0,2,-99,-99,-99,-99],"ownershipAllowedMAE":0.0421455,"maxHistory":1})%"); + lines.push_back(R"%({"sample":{"board":".................../........XOXXXX..XO./.......O.OOOO..XX../..X..X.OX.....OOOO./.................../.................../.......O.......XO../.........XXOOOOXO../.......OOOOXXXXO.../...X....XXXX..XO.../.........O...XOXO../.....XXXOXOOOOOX.../....XOXO.XO.XXX.XX./....X.O.OX.X.O.XOO./...XOO.OXXX....OXO./..X....OXO..XO.O.../..XOO.OX.XXXOO.O.../...XO...X...XOX..../.................../","hintLoc":"null","initialTurnNumber":79,"metadata":"1B7A775CEC6BB29D59C01CED740543B2:89","moveLocs":["L19","M19","J17","C2","P18","P17","O19","Q19","O17","K19"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":2.16,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreAREAtaxSEKIsui0button1","komi":4.5,"policyOptimism":0.197,"pda":0.0,"policyMixture":[8.73e-06,1.08e-05,1.12e-05,1.22e-05,1.18e-05,1.5e-05,1.27e-05,1.19e-05,1.29e-05,0,0,0,8.39e-06,0,0.237,0,1.51e-05,0.0115,1.09e-05,1.15e-05,2.04e-05,2.89e-05,8.18e-05,0.00116,0.0914,0.000656,0.000107,0,0,0,0,0,0,0,7.17e-06,0,0,1.27e-05,1.23e-05,3.97e-05,0.000156,0.000836,0.0298,0.000331,1.54e-05,0,0,0,0,0,0,0,0,0,0,0.00178,1.12e-05,1.33e-05,0.000284,0,0.000997,4.59e-05,0,1.54e-05,0,0,9.61e-06,8.67e-06,8.7e-06,8.83e-06,9.24e-06,0,0,0,0,1.06e-05,1.31e-05,0.00552,0.0861,0.00066,0.000776,0.000106,3.84e-05,1.38e-05,1.14e-05,1.03e-05,9.62e-06,9.31e-06,9.44e-06,9.22e-06,9.23e-06,9.03e-06,9.35e-06,8.39e-06,9.08e-06,1.27e-05,0.00135,0.0257,0.03,0.000455,0.000421,4.53e-05,1.61e-05,1.55e-05,1.2e-05,1.04e-05,9.84e-06,9.77e-06,9.17e-06,1e-05,1.05e-05,9.18e-06,9.4e-06,9.16e-06,1.21e-05,0.00012,0.00648,0.0101,0.000844,0.000206,2.17e-05,0,1.62e-05,1.38e-05,1.24e-05,1.08e-05,9.64e-06,9.79e-06,1.09e-05,0,0,9.49e-06,9.72e-06,1.23e-05,0.000249,0.135,0.0272,0.00397,0.000175,2.26e-05,1.19e-05,1.32e-05,0,0,0,0,0,0,0,0,9.71e-06,1.01e-05,1.17e-05,9.31e-05,0.0645,0.0465,0.000233,0.000206,2.05e-05,0,0,0,0,0,0,0,0,0,1.05e-05,1.11e-05,9.99e-06,1.09e-05,2.67e-05,0.000101,0,5.43e-05,3.43e-05,2.66e-05,0.0223,0,0,0,0,8.71e-06,9.04e-06,0,0,1.1e-05,1.22e-05,1.08e-05,1.02e-05,1.56e-05,1.65e-05,1.87e-05,2.1e-05,1.46e-05,1.08e-05,1.54e-05,0.000254,0,1.01e-05,8.24e-06,8.28e-06,0,0,0,0,1.23e-05,1.25e-05,9.74e-06,1.4e-05,1.47e-05,1.48e-05,1.77e-05,0,0,0,0,0,0,0,0,0,0,0,1.75e-05,1.13e-05,1.04e-05,9.59e-06,1.28e-05,1.31e-05,1.34e-05,0,0,0,0,1.07e-05,0,0,1.67e-05,0,0,0,0,0,0,1.11e-05,9.28e-06,1.26e-05,1.37e-05,6.39e-05,0,1.51e-05,0,1.33e-05,0,0,8.77e-06,0,0.000137,0,0.000648,0,0,0,1.03e-05,9.47e-06,1.22e-05,1.01e-05,0,0,0,6.88e-06,0,0,0,0,1.19e-05,1.02e-05,9.73e-06,8.91e-06,0,0,0,9e-06,9.22e-06,1.06e-05,0,0.033,9.91e-06,0.000455,0.0019,0,0,0,7.98e-06,9.76e-06,0,0,8.16e-06,0,9.23e-06,9.6e-06,9.49e-06,8.96e-06,8.76e-06,0,0,0,1.08e-05,0,0,0,0,0,0,0,0,9.63e-06,0,9.17e-06,9.73e-06,9.34e-06,8.94e-06,9.16e-06,0,0,0,2.83e-05,0.115,0.000133,0,8.98e-06,1.01e-05,1.77e-05,0,0,0,9.77e-06,9.7e-06,9.33e-06,9.53e-06,8.3e-06,8.73e-06,9.71e-06,1.13e-05,1.19e-05,1.11e-05,2.11e-05,1.35e-05,9.89e-06,9.7e-06,9.55e-06,1.08e-05,1.18e-05,1.06e-05,9.74e-06,9.78e-06,9.14e-06,9.59e-06,8.32e-06,1.47e-05],"winrateAvg":0.388286,"leadAvg":-0.687643,"scoreMeanAvg":-1.18186,"scoreStdevAvg":9.63061,"shorttermWinlossErrorAvg":0.278394,"shorttermScoreErrorAvg":2.11956,"ownership":[-46,-45,-40,-32,-19,3,29,43,38,-8,-9,-34,-26,-21,-20,-35,-17,-7,18,-48,-47,-42,-35,-22,-18,33,69,33,99,-34,-34,-32,-32,-21,-27,-37,29,26,-46,-54,-50,-40,-24,-17,26,100,100,100,100,100,100,99,-37,-37,-37,-16,61,-41,-48,-82,-36,-36,-70,17,99,47,72,78,83,87,92,100,100,99,99,66,-31,-34,-16,-26,-15,-17,-13,27,53,64,72,78,82,86,88,88,88,82,78,-20,-22,-17,-10,-9,-7,-1,29,61,69,74,78,82,83,86,85,83,85,79,-12,-16,-16,-9,-7,-4,5,86,71,73,76,72,81,83,82,75,95,84,78,-9,-11,0,-5,-3,-6,-8,36,75,64,65,91,91,91,91,75,94,82,69,-15,-20,-13,-3,-8,-1,20,85,86,86,87,-97,-97,-97,-97,88,80,61,47,-28,-32,-40,-76,-19,-11,0,34,-97,-97,-97,-97,-92,-92,-96,88,66,55,3,-41,-53,-52,-50,-39,-37,-40,-57,-80,-76,-90,-90,-89,-93,-82,-94,71,8,-24,-52,-58,-58,-55,-60,-99,-99,-99,-62,-100,-83,-85,-84,-83,-82,-95,-36,-37,-60,-62,-66,-65,-67,-97,-31,-99,7,-82,-100,-84,-95,-98,-97,-97,-92,-95,-96,-64,-70,-73,-72,-79,-97,-28,59,10,8,-100,-95,-99,35,89,65,-92,88,88,3,-79,-80,-80,-94,65,64,56,61,-100,-100,-100,-51,1,41,81,99,87,89,49,-86,-90,-96,-9,45,58,57,62,-100,-87,-87,-44,-46,98,89,99,93,70,66,-90,-93,-96,66,64,57,65,-73,-72,-100,-100,-100,98,99,85,99,87,79,73,-91,-92,-96,-96,66,24,-1,-32,-94,-83,-73,-9,-12,98,26,86,76,78,77,-91,-91,-87,-21,7,21,6,-36,-64,-78,-61,-34,3,12,27,55,71,75,78],"ownershipAllowedMAE":0.0460034})%"); + lines.push_back(R"%({"sample":{"board":"........X..OX....../.....XOO.O.O..XO.X./.OOO.XXOO.O.O.X.O../.OXXX..XXX.X.X...O./OXO.......X....XXXX/.XO............XOOO/.OXO......OOOO.XO../..X.....OOXOX.OOXOO/.........XXX....XXX/.......X....XXOO.../....XXX..XO.XXXOOX./...OOOO..XO.OXXO.OO/.XXX......X.OOOXO.O/..O..OX........XXO./.OOO.........OOX.XX/.XXO......O..OXOXO./..XXOOO.......XOOO./....XXO.X.X.X.XXO../................O../","hintLoc":"null","initialTurnNumber":170,"metadata":"8D6E7FC65E9DA8C04FA13A7F42E40678:180","moveLocs":["C10","H6","F5","G5","E6","G7","E5","E4","J5","E7"],"movePlas":["B","W","B","W","B","W","B","W","B","W"],"nextPla":"B","weight":0.49,"xSize":19,"ySize":19},"rules":"koSITUATIONALscoreTERRITORYtaxALLsui0","komi":5.0,"policyOptimism":0.0,"pda":0.0,"policyMixture":[5.09e-05,6.25e-05,0.000176,0.000138,0.00143,0.00157,0.0138,0.000298,0,0.0187,7.31e-05,0,0,0.000516,0.000151,6.13e-05,5.39e-05,5.34e-05,4.85e-05,5.1e-05,6.07e-05,6.8e-05,0.000436,0.000319,0,0,0,4.76e-05,0,8e-05,0,6.15e-05,0.000552,0,0,5.5e-05,0,5.23e-05,5.26e-05,0,0,0,0.000102,0,0,0,0,0.0376,0,0.00789,0,7.61e-05,0,5.57e-05,0,5.26e-05,5.11e-05,5.17e-05,0,0,0,0,6.27e-05,9.22e-05,0,0,0,0.000125,0,0.000251,0,5.42e-05,5.43e-05,5.15e-05,0,5.14e-05,0,0,0,6.95e-05,6.69e-05,8.19e-05,0.000102,6.85e-05,6.21e-05,7.03e-05,0,7.42e-05,0.00014,6.53e-05,5.9e-05,0,0,0,0,4.47e-05,0,0,0.137,0.00841,0.00033,0.000191,0.000101,9.07e-05,0.000217,6.11e-05,6.02e-05,5.87e-05,6.08e-05,5.46e-05,0,0,0,0,5.51e-05,0,0,0,0.00559,0.00147,0.000218,0.000378,8.36e-05,0.00227,0,0,0,0,0.00055,0,0,5.55e-05,5.44e-05,6.71e-05,0.00105,0,0.0317,0.000384,0.000187,0.00017,8.56e-05,0,0,0,0,0,0.00215,0,0,0,0,0,6.52e-05,0.000728,8.15e-05,8.78e-05,0.000103,8.14e-05,7.63e-05,7.01e-05,7.18e-05,0,0,0,5.67e-05,5.62e-05,0.000317,0.000902,0,0,0,7.17e-05,0.000131,0,9.67e-05,7.12e-05,6.09e-05,5.93e-05,0,6.07e-05,5.62e-05,6.3e-05,5.26e-05,0,0,0,0,5.27e-05,5.83e-05,5.25e-05,6.65e-05,0.0018,0.00313,0.00011,0,0,0,6.28e-05,6.11e-05,0,0,6.51e-05,0,0,0,0,0,0,5.33e-05,6.69e-05,9.11e-05,0.000215,0,0,0,0,7.53e-05,6.73e-05,0,0,8.56e-05,0,0,0,0,0,0,0,9.22e-05,0,0,0,0,0,0,6.03e-05,0.000114,0.000178,0,7.2e-05,0,0,0,0,0,0,0,7.22e-05,6.01e-05,0,0.652,0,0,0,0,0.000113,0.00154,9.94e-05,7.51e-05,5.83e-05,6.1e-05,5.65e-05,0,0,0,0.000361,0.000177,0,0,0,0,0,0,7.67e-05,0,0.000289,0.000437,9.63e-05,6.37e-05,0,0,0,5.58e-05,0,0,0.000482,0,0,0,0,5.41e-05,0.0001,0.0108,0.000346,0.0303,0,0.000448,8.36e-05,0,0,0,0,0,5.43e-05,6.35e-05,5.76e-05,0,0,0,0,0,6.85e-05,0.000501,0.00943,0.000104,0.000116,9.94e-05,7.2e-05,0,0,0,0,5.58e-05,7e-05,8.93e-05,9.22e-05,6.96e-05,0,0,0,7.49e-05,0,7.22e-05,0,6.26e-05,0,5.49e-05,0,0,0,5.26e-05,5.14e-05,5.47e-05,6.67e-05,6.3e-05,7.85e-05,5.9e-05,8.04e-05,9.01e-05,7.67e-05,6.57e-05,5.73e-05,5.35e-05,5.54e-05,5.32e-05,5.65e-05,5.65e-05,5.85e-05,0,5.28e-05,4.85e-05,5.14e-05],"winrateAvg":0.94297,"leadAvg":4.00751,"scoreMeanAvg":5.06991,"scoreStdevAvg":9.52928,"shorttermWinlossErrorAvg":0.113909,"shorttermScoreErrorAvg":1.50607,"ownership":[77,62,36,13,-46,-38,9,80,71,82,85,92,-24,-20,-89,-92,-93,-94,-94,89,79,79,52,15,-95,91,92,87,92,84,92,66,-24,-99,-90,-94,-96,-95,96,99,99,99,0,-95,-95,92,92,-26,89,16,84,-26,-99,-95,-92,-95,-96,98,99,-85,-87,-88,-61,-83,-97,-96,-96,-15,-93,-48,-98,-87,-96,-96,-93,-97,99,97,98,28,-6,-15,-16,-27,-31,-43,-94,-25,-24,-24,-42,-100,-100,-100,-100,97,93,97,-12,-3,-14,-10,0,-6,19,19,31,37,24,-1,-100,-99,-99,-99,65,95,-83,14,-26,-20,-1,11,11,43,98,99,99,98,54,-100,-99,-99,-99,19,-7,-85,-45,-30,-19,-6,7,55,56,-97,99,-76,10,99,99,-99,-99,-98,-28,-45,-58,-40,-31,-23,-18,-24,-11,-97,-97,-97,-77,-5,68,47,-98,-99,-98,-53,-65,-92,-18,-38,-41,-56,-96,-65,-73,-34,-68,-96,-96,100,100,32,11,0,-56,-68,9,26,-94,-95,-95,-39,-45,-94,32,-30,-96,-97,-97,100,100,10,68,-47,-50,28,97,97,97,98,13,-1,-94,37,20,99,-97,-98,100,99,100,100,-4,-76,-78,-79,98,96,98,62,22,-43,-62,55,100,100,100,99,100,99,100,51,36,96,-71,-67,97,96,97,10,0,2,24,52,82,99,99,99,99,99,47,96,97,98,-66,-64,97,48,-51,1,18,37,51,100,100,99,99,98,98,-26,-84,-84,98,97,33,71,30,3,17,82,37,39,100,-82,100,99,100,99,-63,-70,-84,-84,98,98,98,20,-16,32,-18,18,-2,14,-82,100,100,100,99,-60,-57,-79,-64,-71,-57,98,7,-86,-64,-89,-79,-88,-77,-82,-83,100,99,99,-60,-61,-67,-67,1,75,82,26,-26,-76,-85,-86,-83,-70,-21,45,100,99,99],"ownershipAllowedMAE":0.0410597})%"); + lines.push_back(R"%({"sample":{"board":"............./....XOO....../.....XXOOO.../..X.X..XXOX../....OXXX.XOO./...XXOOOXXO../....OXOOOO.../X.XOOXOX...../OXXOXXXOOOOO./.OXX.XX..XOX./OOOOXXXOOXXO./.O.OOOXOX.XO./.XX.OXXX...X./","hintLoc":"null","initialTurnNumber":81,"metadata":"BB0A2089E626B3C3D5791BDD76F92C46:91","moveLocs":["J9","H12","J12","F13","H13","A4","K1","L1","A5","E13"],"movePlas":["W","B","W","B","W","B","W","B","W","B"],"nextPla":"W","weight":1.47,"xSize":13,"ySize":13},"rules":"koSITUATIONALscoreAREAtaxNONEsui0","komi":5.5,"policyOptimism":0.0,"pda":0.0,"policyMixture":[4.77e-05,7e-05,6.29e-05,5.75e-05,0,0,0.214,0,4.63e-05,5.03e-05,4.62e-05,4.65e-05,4.67e-05,6.39e-05,0.000324,0.0322,0.000312,0,0,0,0.000709,0,4.71e-05,4.71e-05,4.68e-05,4.63e-05,5.63e-05,0.000511,0.0164,0.00155,6.91e-05,0,0,0,0,0,4.68e-05,4.68e-05,4.5e-05,5.55e-05,0.0227,0,5.16e-05,0,0.000284,0.000115,0,0,0,0,4.68e-05,4.5e-05,5.81e-05,8.5e-05,0.000363,0.0445,0,0,0,0,0,5.05e-05,0,0,4.55e-05,5.2e-05,7.98e-05,8.81e-05,0,0,0,0,0,4.82e-05,4.96e-05,0,4.5e-05,4.57e-05,0.0237,0.0415,6.75e-05,6.54e-05,0,0,0,0,0,0,4.75e-05,4.57e-05,4.48e-05,0,0.000515,0,0,0,0,0,0,4.59e-05,4.75e-05,4.56e-05,4.56e-05,4.73e-05,0,0,0,0,0,0,0,0,0,0,0,0,5.09e-05,0.0649,0,0,0,0,0,0,0.00671,0.0289,0,0,0,0.201,0,0,0,0,0,0,0,0,0,0,0,0,9.58e-05,2.55e-05,0,0.0006,0,0,0,0,0,0,3.92e-05,0,0,0.153,0.135,0,0,0.00067,0,0,0,0,0.00667,0,0,0,4.8e-05,7.01e-05],"winrateAvg":0.410003,"leadAvg":-0.495964,"scoreMeanAvg":-0.620842,"scoreStdevAvg":4.05349,"shorttermWinlossErrorAvg":0.366292,"shorttermScoreErrorAvg":0.963408,"ownership":[-88,-88,-89,-89,-95,-93,-16,93,91,96,97,97,97,-87,-88,-89,-88,-94,85,93,92,99,97,97,97,97,-88,-88,-90,-89,-92,-95,-94,99,99,99,97,97,98,-89,-89,-98,-94,-98,-90,-90,-91,-92,99,96,98,98,-91,-93,-93,-93,-90,-92,-91,-91,87,87,100,100,99,-93,-94,-94,-98,-98,100,100,100,86,97,100,99,99,-94,-95,-96,-98,-98,-99,100,100,100,100,99,99,99,-97,-97,-100,-98,-98,-100,100,99,99,99,99,99,98,-29,-100,-100,-98,-100,-100,-100,100,100,100,100,100,97,-33,74,-100,-100,-100,-100,-100,20,74,-94,100,94,95,70,70,71,73,-100,-100,-100,95,95,-94,-94,92,89,-31,67,3,72,73,76,-100,96,-97,-96,-94,91,24,-52,-56,-60,4,73,-100,-100,-100,-98,-96,-95,-95,-14],"ownershipAllowedMAE":0.0347043})%"); + return lines; +} diff --git a/cpp/tests/gtp/excludeterritorymode.txt b/cpp/tests/gtp/excludeterritorymode.txt new file mode 100644 index 0000000000..3dae39b880 --- /dev/null +++ b/cpp/tests/gtp/excludeterritorymode.txt @@ -0,0 +1,13 @@ +boardsize 7 +kata-set-rules {"ko":"SIMPLE","scoring":"TERRITORY","tax":"NONE","suicide":false,"hasButton":false,"friendlyPassOk":false,"whiteHandicapBonus":"0"} +komi 0 +set_position w d7 b e7 b f7 b g7 w a6 w b6 w c6 w d6 b e6 b g6 b a5 b b5 b c5 b d5 w e5 b f5 b g5 w a4 b c4 w d4 w e4 w f4 w g4 w a3 w b3 b c3 w d3 b e3 w g3 w a2 b b2 b c2 w d2 b f2 w g2 w a1 b c1 w d1 w e1 b f1 b g1 +showboard +kata-get-param excludeTerritoryAdjacentToAtari +kata-set-param excludeTerritoryAdjacentToAtari true +kata-get-param excludeTerritoryAdjacentToAtari +kata-set-param excludeTerritoryAdjacentToAtari false +kata-get-param excludeTerritoryAdjacentToAtari +kata-set-param excludeTerritoryAdjacentToAtari auto +kata-get-param excludeTerritoryAdjacentToAtari +showboard diff --git a/cpp/tests/results/gtp/excludeterritorymode.txt.log b/cpp/tests/results/gtp/excludeterritorymode.txt.log new file mode 100644 index 0000000000..4e3c7a787d --- /dev/null +++ b/cpp/tests/results/gtp/excludeterritorymode.txt.log @@ -0,0 +1,125 @@ +: Running with following config: +allowResignation = true +cudaUseFP16 = false +cudaUseNHWC = false +forDeterministicTesting = true +lagBuffer = 1.0 +logAllGTPCommunication = true +logFile = tests/results/gtp/excludeterritorymode.txt.log +logSearchInfo = true +logSearchInfoForChosenMove = false +logTimeStamp = false +logToStderr = false +maxPlayouts = 10000 +maxTimePondering = 60.0 +maxVisits = 100 +nnRandSeed = forTesting +nnRandomize = false +numSearchThreads = 1 +openclUseFP16 = false +ponderingEnabled = false +resignConsecTurns = 3 +resignThreshold = -0.90 +rootSymmetryPruning = false +rules = tromp-taylor +searchFactorAfterOnePass = 0.50 +searchFactorAfterTwoPass = 0.25 +searchFactorWhenWinning = 0.40 +searchFactorWhenWinningThreshold = 0.95 +searchRandSeed = forTesting +trtUseFP16 = false + +: GTP Engine starting... +: KataGo v1.17.2 +: Using TrompTaylor rules initially, unless GTP/GUI overrides this +: Using 1 CPU thread(s) for search +: nnRandSeed0 = forTesting +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false +: Initializing neural net buffer to be size 19 * 19 exactly +: Cuda backend thread 0: Found GPU NVIDIA RTX A5000 memory 25285623808 compute capability major 8 minor 6 +: Cuda backend thread 0: Model version 8 useFP16 = false useNHWC = false +: Cuda backend thread 0: Model name: g170-b6c96-s175395328-d26788732 (convnet, 1027911 params) +: Loaded neural net with nnXLen 19 nnYLen 19 +: Initializing board with boardXSize 19 boardYSize 19 +: Loaded config configs/gtp_example.cfg and/or command-line and query overrides +: Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz +: Config override: cudaUseFP16 = false +: Config override: cudaUseNHWC = false +: Config override: forDeterministicTesting = true +: Config override: logDir = +: Config override: logFile = tests/results/gtp/excludeterritorymode.txt.log +: Config override: logTimeStamp = false +: Config override: maxPlayouts = 10000 +: Config override: maxVisits = 100 +: Config override: nnRandSeed = forTesting +: Config override: nnRandomize = false +: Config override: numSearchThreads = 1 +: Config override: openclUseFP16 = false +: Config override: rootSymmetryPruning = false +: Config override: searchRandSeed = forTesting +: Config override: trtUseFP16 = false +: Model name: g170-b6c96-s175395328-d26788732 +: GTP ready, beginning main protocol loop +: Controller: boardsize 7 +: GPU -1 finishing, processed 0 rows 0 batches +: Cleaned up old neural net and bot +: nnRandSeed0 = forTesting +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false +: Initializing neural net buffer to be size 7 * 7 exactly +: Cuda backend thread 0: Found GPU NVIDIA RTX A5000 memory 25285623808 compute capability major 8 minor 6 +: Cuda backend thread 0: Model version 8 useFP16 = false useNHWC = false +: Cuda backend thread 0: Model name: g170-b6c96-s175395328-d26788732 (convnet, 1027911 params) +: Loaded neural net with nnXLen 7 nnYLen 7 +: Initializing board with boardXSize 7 boardYSize 7 +: = +: Controller: kata-set-rules {"ko":"SIMPLE","scoring":"TERRITORY","tax":"NONE","suicide":false,"hasButton":false,"friendlyPassOk":false,"whiteHandicapBonus":"0"} +: Changed rules to koSIMPLEscoreTERRITORYtaxNONEsui0 +: = +: Controller: komi 0 +: = +: Controller: set_position w d7 b e7 b f7 b g7 w a6 w b6 w c6 w d6 b e6 b g6 b a5 b b5 b c5 b d5 w e5 b f5 b g5 w a4 b c4 w d4 w e4 w f4 w g4 w a3 w b3 b c3 w d3 b e3 w g3 w a2 b b2 b c2 w d2 b f2 w g2 w a1 b c1 w d1 w e1 b f1 b g1 +: = +: Controller: showboard +: = MoveNum: 0 HASH: 96B915DAA172730D4E0FA7F87274D70E + A B C D E F G + 7 . . . O X X X + 6 O O O O X . X + 5 X X X X O X X + 4 O . X O O O O + 3 O O X O X . O + 2 O X X O . X O + 1 O . X O O X X +Next player: Black +Rules: {"friendlyPassOk":false,"hasButton":false,"ko":"SIMPLE","komi":0.0,"scoring":"TERRITORY","suicide":false,"tax":"NONE","whiteHandicapBonus":"0"} +B stones captured: 0 +W stones captured: 0 +: Controller: kata-get-param excludeTerritoryAdjacentToAtari +: = "auto" +: Controller: kata-set-param excludeTerritoryAdjacentToAtari true +: = +: Controller: kata-get-param excludeTerritoryAdjacentToAtari +: = "true" +: Controller: kata-set-param excludeTerritoryAdjacentToAtari false +: = +: Controller: kata-get-param excludeTerritoryAdjacentToAtari +: = "false" +: Controller: kata-set-param excludeTerritoryAdjacentToAtari auto +: = +: Controller: kata-get-param excludeTerritoryAdjacentToAtari +: = "auto" +: Controller: showboard +: = MoveNum: 0 HASH: 96B915DAA172730D4E0FA7F87274D70E + A B C D E F G + 7 . . . O X X X + 6 O O O O X . X + 5 X X X X O X X + 4 O . X O O O O + 3 O O X O X . O + 2 O X X O . X O + 1 O . X O O X X +Next player: Black +Rules: {"friendlyPassOk":false,"hasButton":false,"ko":"SIMPLE","komi":0.0,"scoring":"TERRITORY","suicide":false,"tax":"NONE","whiteHandicapBonus":"0"} +B stones captured: 0 +W stones captured: 0 +: GPU -1 finishing, processed 0 rows 0 batches +: All cleaned up, quitting diff --git a/cpp/tests/results/gtp/excludeterritorymode.txt.stderr b/cpp/tests/results/gtp/excludeterritorymode.txt.stderr new file mode 100644 index 0000000000..69d316c7af --- /dev/null +++ b/cpp/tests/results/gtp/excludeterritorymode.txt.stderr @@ -0,0 +1,9 @@ +KataGo v1.17.2 +Using TrompTaylor rules initially, unless GTP/GUI overrides this +Initializing board with boardXSize 19 boardYSize 19 +Loaded config configs/gtp_example.cfg and/or command-line and query overrides +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz +Model name: g170-b6c96-s175395328-d26788732 +GTP ready, beginning main protocol loop +Initializing board with boardXSize 7 boardYSize 7 +Changed rules to koSIMPLEscoreTERRITORYtaxNONEsui0 diff --git a/cpp/tests/results/gtp/excludeterritorymode.txt.stdout b/cpp/tests/results/gtp/excludeterritorymode.txt.stdout new file mode 100644 index 0000000000..243c6ea95f --- /dev/null +++ b/cpp/tests/results/gtp/excludeterritorymode.txt.stdout @@ -0,0 +1,50 @@ += + += + += + += + += MoveNum: 0 HASH: 96B915DAA172730D4E0FA7F87274D70E + A B C D E F G + 7 . . . O X X X + 6 O O O O X . X + 5 X X X X O X X + 4 O . X O O O O + 3 O O X O X . O + 2 O X X O . X O + 1 O . X O O X X +Next player: Black +Rules: {"friendlyPassOk":false,"hasButton":false,"ko":"SIMPLE","komi":0.0,"scoring":"TERRITORY","suicide":false,"tax":"NONE","whiteHandicapBonus":"0"} +B stones captured: 0 +W stones captured: 0 + += "auto" + += + += "true" + += + += "false" + += + += "auto" + += MoveNum: 0 HASH: 96B915DAA172730D4E0FA7F87274D70E + A B C D E F G + 7 . . . O X X X + 6 O O O O X . X + 5 X X X X O X X + 4 O . X O O O O + 3 O O X O X . O + 2 O X X O . X O + 1 O . X O O X X +Next player: Black +Rules: {"friendlyPassOk":false,"hasButton":false,"ko":"SIMPLE","komi":0.0,"scoring":"TERRITORY","suicide":false,"tax":"NONE","whiteHandicapBonus":"0"} +B stones captured: 0 +W stones captured: 0 + diff --git a/cpp/tests/results/gtp/excludeterritoryscore.log b/cpp/tests/results/gtp/excludeterritoryscore.log new file mode 100644 index 0000000000..aaea56562c --- /dev/null +++ b/cpp/tests/results/gtp/excludeterritoryscore.log @@ -0,0 +1,111 @@ +: Running with following config: +allowResignation = true +cudaUseFP16 = false +cudaUseNHWC = false +forDeterministicTesting = true +lagBuffer = 1.0 +logAllGTPCommunication = true +logFile = tests/results/gtp/excludeterritoryscore.log +logSearchInfo = true +logSearchInfoForChosenMove = false +logTimeStamp = false +logToStderr = false +maxPlayouts = 10000 +maxTimePondering = 60.0 +maxVisits = 100 +nnRandSeed = forTesting +nnRandomize = false +numSearchThreads = 1 +openclUseFP16 = false +ponderingEnabled = false +preventCleanupPhase = false +resignConsecTurns = 3 +resignThreshold = -0.90 +rootSymmetryPruning = false +rules = tromp-taylor +searchFactorAfterOnePass = 0.50 +searchFactorAfterTwoPass = 0.25 +searchFactorWhenWinning = 0.40 +searchFactorWhenWinningThreshold = 0.95 +searchRandSeed = forTesting +trtUseFP16 = false + +: GTP Engine starting... +: KataGo v1.17.2 +: Using TrompTaylor rules initially, unless GTP/GUI overrides this +: Using 1 CPU thread(s) for search +: nnRandSeed0 = forTesting +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false +: Initializing neural net buffer to be size 19 * 19 exactly +: Cuda backend thread 0: Found GPU NVIDIA RTX A5000 memory 25285623808 compute capability major 8 minor 6 +: Cuda backend thread 0: Model version 8 useFP16 = false useNHWC = false +: Cuda backend thread 0: Model name: g170-b6c96-s175395328-d26788732 (convnet, 1027911 params) +: Loaded neural net with nnXLen 19 nnYLen 19 +: Initializing board with boardXSize 19 boardYSize 19 +: Loaded config configs/gtp_example.cfg and/or command-line and query overrides +: Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz +: Config override: cudaUseFP16 = false +: Config override: cudaUseNHWC = false +: Config override: forDeterministicTesting = true +: Config override: logDir = +: Config override: logFile = tests/results/gtp/excludeterritoryscore.log +: Config override: logTimeStamp = false +: Config override: maxPlayouts = 10000 +: Config override: maxVisits = 100 +: Config override: nnRandSeed = forTesting +: Config override: nnRandomize = false +: Config override: numSearchThreads = 1 +: Config override: openclUseFP16 = false +: Config override: preventCleanupPhase = false +: Config override: rootSymmetryPruning = false +: Config override: searchRandSeed = forTesting +: Config override: trtUseFP16 = false +: Model name: g170-b6c96-s175395328-d26788732 +: GTP ready, beginning main protocol loop +: Controller: boardsize 7 +: GPU -1 finishing, processed 0 rows 0 batches +: Cleaned up old neural net and bot +: nnRandSeed0 = forTesting +: After dedups: nnModelFile0 = tests/models/g170-b6c96-s175395328-d26788732.bin.gz useFP16 false +: Initializing neural net buffer to be size 7 * 7 exactly +: Cuda backend thread 0: Found GPU NVIDIA RTX A5000 memory 25285623808 compute capability major 8 minor 6 +: Cuda backend thread 0: Model version 8 useFP16 = false useNHWC = false +: Cuda backend thread 0: Model name: g170-b6c96-s175395328-d26788732 (convnet, 1027911 params) +: Loaded neural net with nnXLen 7 nnYLen 7 +: Initializing board with boardXSize 7 boardYSize 7 +: = +: Controller: kata-set-rules {"ko":"SIMPLE","scoring":"TERRITORY","tax":"NONE","suicide":false,"hasButton":false,"friendlyPassOk":false,"whiteHandicapBonus":"0"} +: Changed rules to koSIMPLEscoreTERRITORYtaxNONEsui0 +: = +: Controller: komi 0 +: = +: Controller: set_position w d7 b e7 b f7 b g7 w a6 w b6 w c6 w d6 b e6 b g6 b a5 b b5 b c5 b d5 w e5 b f5 b g5 w a4 b c4 w d4 w e4 w f4 w g4 w a3 w b3 b c3 w d3 b e3 w g3 w a2 b b2 b c2 w d2 b f2 w g2 w a1 b c1 w d1 w e1 b f1 b g1 +: = +: Controller: play b pass +: = +: Controller: play w pass +: = +: Controller: play b pass +: = +: Controller: play w pass +: = +: Controller: play b pass +: = +: Controller: play w pass +: = +: Controller: final_score +: = W+2.0 +: Controller: printsgf - +: = (;FF[4]GM[1]SZ[7]PB[]PW[]HA[0]KM[0]RU[koSIMPLEscoreTERRITORYtaxNONEsui0]RE[W+2]AB[ea][fa][ga][eb][gb][ac][bc][cc][dc][fc][gc][cd][ce][ee][bf][cf][ff][cg][fg][gg]AW[da][ab][bb][cb][db][ec][ad][dd][ed][fd][gd][ae][be][de][ge][af][df][gf][ag][dg][eg];B[];W[];B[];W[];B[];W[]C[result=W+2]) +: Controller: kata-set-param excludeTerritoryAdjacentToAtari true +: = +: Controller: final_score +: = W+3.0 +: Controller: printsgf - +: = (;FF[4]GM[1]SZ[7]PB[]PW[]HA[0]KM[0]RU[koSIMPLEscoreTERRITORYtaxNONEsui0]RE[W+3]AB[ea][fa][ga][eb][gb][ac][bc][cc][dc][fc][gc][cd][ce][ee][bf][cf][ff][cg][fg][gg]AW[da][ab][bb][cb][db][ec][ad][dd][ed][fd][gd][ae][be][de][ge][af][df][gf][ag][dg][eg];B[];W[];B[];W[];B[];W[]C[result=W+3]) +: Controller: kata-set-param excludeTerritoryAdjacentToAtari false +: = +: Controller: final_score +: = W+2.0 +: GPU -1 finishing, processed 0 rows 0 batches +: All cleaned up, quitting diff --git a/cpp/tests/results/gtp/excludeterritoryscore.stderr b/cpp/tests/results/gtp/excludeterritoryscore.stderr new file mode 100644 index 0000000000..69d316c7af --- /dev/null +++ b/cpp/tests/results/gtp/excludeterritoryscore.stderr @@ -0,0 +1,9 @@ +KataGo v1.17.2 +Using TrompTaylor rules initially, unless GTP/GUI overrides this +Initializing board with boardXSize 19 boardYSize 19 +Loaded config configs/gtp_example.cfg and/or command-line and query overrides +Loaded model tests/models/g170-b6c96-s175395328-d26788732.bin.gz +Model name: g170-b6c96-s175395328-d26788732 +GTP ready, beginning main protocol loop +Initializing board with boardXSize 7 boardYSize 7 +Changed rules to koSIMPLEscoreTERRITORYtaxNONEsui0 diff --git a/cpp/tests/results/gtp/excludeterritoryscore.stdout b/cpp/tests/results/gtp/excludeterritoryscore.stdout new file mode 100644 index 0000000000..b99744131c --- /dev/null +++ b/cpp/tests/results/gtp/excludeterritoryscore.stdout @@ -0,0 +1,34 @@ += + += + += + += + += + += + += + += + += + += + += W+2.0 + += (;FF[4]GM[1]SZ[7]PB[]PW[]HA[0]KM[0]RU[koSIMPLEscoreTERRITORYtaxNONEsui0]RE[W+2]AB[ea][fa][ga][eb][gb][ac][bc][cc][dc][fc][gc][cd][ce][ee][bf][cf][ff][cg][fg][gg]AW[da][ab][bb][cb][db][ec][ad][dd][ed][fd][gd][ae][be][de][ge][af][df][gf][ag][dg][eg];B[];W[];B[];W[];B[];W[]C[result=W+2]) + += + += W+3.0 + += (;FF[4]GM[1]SZ[7]PB[]PW[]HA[0]KM[0]RU[koSIMPLEscoreTERRITORYtaxNONEsui0]RE[W+3]AB[ea][fa][ga][eb][gb][ac][bc][cc][dc][fc][gc][cd][ce][ee][bf][cf][ff][cg][fg][gg]AW[da][ab][bb][cb][db][ec][ad][dd][ed][fd][gd][ae][be][de][ge][af][df][gf][ag][dg][eg];B[];W[];B[];W[];B[];W[]C[result=W+3]) + += + += W+2.0 + diff --git a/cpp/tests/results/gtp/humansl.log b/cpp/tests/results/gtp/humansl.log index abcbaffcf6..700e3d5aed 100644 --- a/cpp/tests/results/gtp/humansl.log +++ b/cpp/tests/results/gtp/humansl.log @@ -472,7 +472,7 @@ whiteOwnership 0.1769083 0.1553447 0.2164454 0.2194278 0.1888992 0.0994612 0.0712061 0.0341133 0.0123989 -0.0080449 -0.0024268 0.0299050 0.0140132 -0.0804372 -0.1732652 -0.3272057 -0.4675705 -0.5340660 -0.5650671 0.2079775 0.1772159 0.1668886 0.1635177 0.1686190 0.1211975 0.0785596 0.0311163 -0.0007647 -0.0073765 0.0140151 0.0324351 0.0129053 -0.0684741 -0.1544852 -0.3148718 -0.4033215 -0.4870633 -0.5389509 : Controller: kata-get-params -: = {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"false","analysisWideRootNoise":"0.04","antiMirror":"false","chosenMovePrune":0.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.7,"chosenMoveTemperatureEarly":0.85,"chosenMoveTemperatureHalflife":80.0,"chosenMoveTemperatureOnlyBelowProb":0.01,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"10","delayMoveScale":"2","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.0,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":true,"humanSLChosenMovePiklLambda":100000000.0,"humanSLChosenMoveProp":1.0,"humanSLCpuctExploration":0.5,"humanSLCpuctPermanent":0.2,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"preaz_12k","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":1125899906842624,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":1e+20,"maxVisits":40,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":0.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":2,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":true,"searchFactorAfterOnePass":1.0,"searchFactorAfterTwoPass":1.0,"staticScoreUtilityFactor":0.3,"subtreeValueBiasFactor":0.0,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":false,"useNoisePruning":false,"useNonBuggyLcb":true,"useUncertainty":false,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} +: = {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"false","analysisWideRootNoise":"0.04","antiMirror":"false","chosenMovePrune":0.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.7,"chosenMoveTemperatureEarly":0.85,"chosenMoveTemperatureHalflife":80.0,"chosenMoveTemperatureOnlyBelowProb":0.01,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"10","delayMoveScale":"2","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.0,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"excludeTerritoryAdjacentToAtari":"auto","fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":true,"humanSLChosenMovePiklLambda":100000000.0,"humanSLChosenMoveProp":1.0,"humanSLCpuctExploration":0.5,"humanSLCpuctPermanent":0.2,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"preaz_12k","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":1125899906842624,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":1e+20,"maxVisits":40,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":0.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":2,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":true,"searchFactorAfterOnePass":1.0,"searchFactorAfterTwoPass":1.0,"staticScoreUtilityFactor":0.3,"subtreeValueBiasFactor":0.0,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":false,"useNoisePruning":false,"useNonBuggyLcb":true,"useUncertainty":false,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} : Controller: kata-get-param humanSLProfile : = preaz_12k : Controller: kata-set-param humanSLProfile preaz_5d diff --git a/cpp/tests/results/gtp/humansl.stdout b/cpp/tests/results/gtp/humansl.stdout index 2df4083551..60daff5f1c 100644 --- a/cpp/tests/results/gtp/humansl.stdout +++ b/cpp/tests/results/gtp/humansl.stdout @@ -68,7 +68,7 @@ whiteOwnership 0.1769083 0.1553447 0.2164454 0.2194278 0.1888992 0.0994612 0.0712061 0.0341133 0.0123989 -0.0080449 -0.0024268 0.0299050 0.0140132 -0.0804372 -0.1732652 -0.3272057 -0.4675705 -0.5340660 -0.5650671 0.2079775 0.1772159 0.1668886 0.1635177 0.1686190 0.1211975 0.0785596 0.0311163 -0.0007647 -0.0073765 0.0140151 0.0324351 0.0129053 -0.0684741 -0.1544852 -0.3148718 -0.4033215 -0.4870633 -0.5389509 -= {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"false","analysisWideRootNoise":"0.04","antiMirror":"false","chosenMovePrune":0.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.7,"chosenMoveTemperatureEarly":0.85,"chosenMoveTemperatureHalflife":80.0,"chosenMoveTemperatureOnlyBelowProb":0.01,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"10","delayMoveScale":"2","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.0,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":true,"humanSLChosenMovePiklLambda":100000000.0,"humanSLChosenMoveProp":1.0,"humanSLCpuctExploration":0.5,"humanSLCpuctPermanent":0.2,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"preaz_12k","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":1125899906842624,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":1e+20,"maxVisits":40,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":0.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":2,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":true,"searchFactorAfterOnePass":1.0,"searchFactorAfterTwoPass":1.0,"staticScoreUtilityFactor":0.3,"subtreeValueBiasFactor":0.0,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":false,"useNoisePruning":false,"useNonBuggyLcb":true,"useUncertainty":false,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} += {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"false","analysisWideRootNoise":"0.04","antiMirror":"false","chosenMovePrune":0.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.7,"chosenMoveTemperatureEarly":0.85,"chosenMoveTemperatureHalflife":80.0,"chosenMoveTemperatureOnlyBelowProb":0.01,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"10","delayMoveScale":"2","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.0,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"excludeTerritoryAdjacentToAtari":"auto","fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":true,"humanSLChosenMovePiklLambda":100000000.0,"humanSLChosenMoveProp":1.0,"humanSLCpuctExploration":0.5,"humanSLCpuctPermanent":0.2,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"preaz_12k","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":1125899906842624,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":1e+20,"maxVisits":40,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":0.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":2,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":true,"searchFactorAfterOnePass":1.0,"searchFactorAfterTwoPass":1.0,"staticScoreUtilityFactor":0.3,"subtreeValueBiasFactor":0.0,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":false,"useNoisePruning":false,"useNonBuggyLcb":true,"useUncertainty":false,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} = preaz_12k diff --git a/cpp/tests/results/gtp/misc.txt.log b/cpp/tests/results/gtp/misc.txt.log index a814e21d79..6fbb75a596 100644 --- a/cpp/tests/results/gtp/misc.txt.log +++ b/cpp/tests/results/gtp/misc.txt.log @@ -61,7 +61,7 @@ trtUseFP16 = false : Model name: g170-b6c96-s175395328-d26788732 : GTP ready, beginning main protocol loop : Controller: kata-list-params -: = analysisWideRootNoise analysisIgnorePreRootHistory genmoveAntiMirror antiMirror humanSLProfile allowResignation ponderingEnabled delayMoveScale delayMoveMax alwaysComputePassAliveUnderSuicideRules chosenMovePrune chosenMoveSubtract chosenMoveTemperature chosenMoveTemperatureEarly chosenMoveTemperatureHalflife chosenMoveTemperatureOnlyBelowProb conservativePass cpuctExploration cpuctExplorationBase cpuctExplorationLog cpuctUtilityStdevPrior cpuctUtilityStdevPriorWeight cpuctUtilityStdevScale drawEquivalentWinsForWhite dynamicScoreCenterScale dynamicScoreCenterZeroWeight dynamicScoreUtilityFactor enableMorePassingHacks enablePassingHacks endgameTurnTimeDecay fillDameBeforePass fpuLossProp fpuParentWeight fpuParentWeightByVisitedPolicy fpuParentWeightByVisitedPolicyPow fpuReductionMax futileVisitsThreshold graphSearchCatchUpLeakProb graphSearchRepBound humanSLChosenMoveIgnorePass humanSLChosenMovePiklLambda humanSLChosenMoveProp humanSLCpuctExploration humanSLCpuctPermanent humanSLOppExploreProbWeightful humanSLOppExploreProbWeightless humanSLPlaExploreProbWeightful humanSLPlaExploreProbWeightless humanSLRootExploreProbWeightful humanSLRootExploreProbWeightless ignoreAllHistory ignorePreRootHistory lagBuffer lcbStdevs maxPlayouts maxPlayoutsPondering maxTime maxTimePondering maxVisits maxVisitsPondering midgameTimeFactor midgameTurnPeakTime minPlayoutsPerThread minVisitPropForLCB nnPolicyTemperature noResultUtilityForWhite noisePruneUtilityScale noisePruningCap numSearchThreads numVirtualLossesPerThread obviousMovesPolicyEntropyTolerance obviousMovesPolicySurpriseTolerance obviousMovesTimeFactor overallocateTimeFactor playoutDoublingAdvantage playoutDoublingAdvantagePla policyOptimism rootDesiredPerChildVisitsCoeff rootDirichletNoiseTotalConcentration rootDirichletNoiseWeight rootEndingBonusPoints rootFpuLossProp rootFpuReductionMax rootNoiseEnabled rootNumSymmetriesToSample rootPolicyOptimism rootPolicyTemperature rootPolicyTemperatureEarly rootPruneUselessMoves rootSymmetryPruning searchFactorAfterOnePass searchFactorAfterTwoPass staticScoreUtilityFactor subtreeValueBiasFactor subtreeValueBiasFreeProp subtreeValueBiasTableNumShards subtreeValueBiasWeightExponent treeReuseCarryOverTimeFactor uncertaintyCoeff uncertaintyExponent uncertaintyMaxWeight useGraphSearch useLcbForSelection useNoisePruning useNonBuggyLcb useUncertainty valueWeightExponent wideRootNoise winLossUtilityFactor +: = analysisWideRootNoise analysisIgnorePreRootHistory genmoveAntiMirror antiMirror humanSLProfile allowResignation ponderingEnabled delayMoveScale delayMoveMax alwaysComputePassAliveUnderSuicideRules chosenMovePrune chosenMoveSubtract chosenMoveTemperature chosenMoveTemperatureEarly chosenMoveTemperatureHalflife chosenMoveTemperatureOnlyBelowProb conservativePass cpuctExploration cpuctExplorationBase cpuctExplorationLog cpuctUtilityStdevPrior cpuctUtilityStdevPriorWeight cpuctUtilityStdevScale drawEquivalentWinsForWhite dynamicScoreCenterScale dynamicScoreCenterZeroWeight dynamicScoreUtilityFactor enableMorePassingHacks enablePassingHacks endgameTurnTimeDecay excludeTerritoryAdjacentToAtari fillDameBeforePass fpuLossProp fpuParentWeight fpuParentWeightByVisitedPolicy fpuParentWeightByVisitedPolicyPow fpuReductionMax futileVisitsThreshold graphSearchCatchUpLeakProb graphSearchRepBound humanSLChosenMoveIgnorePass humanSLChosenMovePiklLambda humanSLChosenMoveProp humanSLCpuctExploration humanSLCpuctPermanent humanSLOppExploreProbWeightful humanSLOppExploreProbWeightless humanSLPlaExploreProbWeightful humanSLPlaExploreProbWeightless humanSLRootExploreProbWeightful humanSLRootExploreProbWeightless ignoreAllHistory ignorePreRootHistory lagBuffer lcbStdevs maxPlayouts maxPlayoutsPondering maxTime maxTimePondering maxVisits maxVisitsPondering midgameTimeFactor midgameTurnPeakTime minPlayoutsPerThread minVisitPropForLCB nnPolicyTemperature noResultUtilityForWhite noisePruneUtilityScale noisePruningCap numSearchThreads numVirtualLossesPerThread obviousMovesPolicyEntropyTolerance obviousMovesPolicySurpriseTolerance obviousMovesTimeFactor overallocateTimeFactor playoutDoublingAdvantage playoutDoublingAdvantagePla policyOptimism rootDesiredPerChildVisitsCoeff rootDirichletNoiseTotalConcentration rootDirichletNoiseWeight rootEndingBonusPoints rootFpuLossProp rootFpuReductionMax rootNoiseEnabled rootNumSymmetriesToSample rootPolicyOptimism rootPolicyTemperature rootPolicyTemperatureEarly rootPruneUselessMoves rootSymmetryPruning searchFactorAfterOnePass searchFactorAfterTwoPass staticScoreUtilityFactor subtreeValueBiasFactor subtreeValueBiasFreeProp subtreeValueBiasTableNumShards subtreeValueBiasWeightExponent treeReuseCarryOverTimeFactor uncertaintyCoeff uncertaintyExponent uncertaintyMaxWeight useGraphSearch useLcbForSelection useNoisePruning useNonBuggyLcb useUncertainty valueWeightExponent wideRootNoise winLossUtilityFactor : Controller: komi 50.5 : = : Controller: get_komi diff --git a/cpp/tests/results/gtp/misc.txt.stdout b/cpp/tests/results/gtp/misc.txt.stdout index 6bb906ada1..ff82daf666 100644 --- a/cpp/tests/results/gtp/misc.txt.stdout +++ b/cpp/tests/results/gtp/misc.txt.stdout @@ -1,4 +1,4 @@ -= analysisWideRootNoise analysisIgnorePreRootHistory genmoveAntiMirror antiMirror humanSLProfile allowResignation ponderingEnabled delayMoveScale delayMoveMax alwaysComputePassAliveUnderSuicideRules chosenMovePrune chosenMoveSubtract chosenMoveTemperature chosenMoveTemperatureEarly chosenMoveTemperatureHalflife chosenMoveTemperatureOnlyBelowProb conservativePass cpuctExploration cpuctExplorationBase cpuctExplorationLog cpuctUtilityStdevPrior cpuctUtilityStdevPriorWeight cpuctUtilityStdevScale drawEquivalentWinsForWhite dynamicScoreCenterScale dynamicScoreCenterZeroWeight dynamicScoreUtilityFactor enableMorePassingHacks enablePassingHacks endgameTurnTimeDecay fillDameBeforePass fpuLossProp fpuParentWeight fpuParentWeightByVisitedPolicy fpuParentWeightByVisitedPolicyPow fpuReductionMax futileVisitsThreshold graphSearchCatchUpLeakProb graphSearchRepBound humanSLChosenMoveIgnorePass humanSLChosenMovePiklLambda humanSLChosenMoveProp humanSLCpuctExploration humanSLCpuctPermanent humanSLOppExploreProbWeightful humanSLOppExploreProbWeightless humanSLPlaExploreProbWeightful humanSLPlaExploreProbWeightless humanSLRootExploreProbWeightful humanSLRootExploreProbWeightless ignoreAllHistory ignorePreRootHistory lagBuffer lcbStdevs maxPlayouts maxPlayoutsPondering maxTime maxTimePondering maxVisits maxVisitsPondering midgameTimeFactor midgameTurnPeakTime minPlayoutsPerThread minVisitPropForLCB nnPolicyTemperature noResultUtilityForWhite noisePruneUtilityScale noisePruningCap numSearchThreads numVirtualLossesPerThread obviousMovesPolicyEntropyTolerance obviousMovesPolicySurpriseTolerance obviousMovesTimeFactor overallocateTimeFactor playoutDoublingAdvantage playoutDoublingAdvantagePla policyOptimism rootDesiredPerChildVisitsCoeff rootDirichletNoiseTotalConcentration rootDirichletNoiseWeight rootEndingBonusPoints rootFpuLossProp rootFpuReductionMax rootNoiseEnabled rootNumSymmetriesToSample rootPolicyOptimism rootPolicyTemperature rootPolicyTemperatureEarly rootPruneUselessMoves rootSymmetryPruning searchFactorAfterOnePass searchFactorAfterTwoPass staticScoreUtilityFactor subtreeValueBiasFactor subtreeValueBiasFreeProp subtreeValueBiasTableNumShards subtreeValueBiasWeightExponent treeReuseCarryOverTimeFactor uncertaintyCoeff uncertaintyExponent uncertaintyMaxWeight useGraphSearch useLcbForSelection useNoisePruning useNonBuggyLcb useUncertainty valueWeightExponent wideRootNoise winLossUtilityFactor += analysisWideRootNoise analysisIgnorePreRootHistory genmoveAntiMirror antiMirror humanSLProfile allowResignation ponderingEnabled delayMoveScale delayMoveMax alwaysComputePassAliveUnderSuicideRules chosenMovePrune chosenMoveSubtract chosenMoveTemperature chosenMoveTemperatureEarly chosenMoveTemperatureHalflife chosenMoveTemperatureOnlyBelowProb conservativePass cpuctExploration cpuctExplorationBase cpuctExplorationLog cpuctUtilityStdevPrior cpuctUtilityStdevPriorWeight cpuctUtilityStdevScale drawEquivalentWinsForWhite dynamicScoreCenterScale dynamicScoreCenterZeroWeight dynamicScoreUtilityFactor enableMorePassingHacks enablePassingHacks endgameTurnTimeDecay excludeTerritoryAdjacentToAtari fillDameBeforePass fpuLossProp fpuParentWeight fpuParentWeightByVisitedPolicy fpuParentWeightByVisitedPolicyPow fpuReductionMax futileVisitsThreshold graphSearchCatchUpLeakProb graphSearchRepBound humanSLChosenMoveIgnorePass humanSLChosenMovePiklLambda humanSLChosenMoveProp humanSLCpuctExploration humanSLCpuctPermanent humanSLOppExploreProbWeightful humanSLOppExploreProbWeightless humanSLPlaExploreProbWeightful humanSLPlaExploreProbWeightless humanSLRootExploreProbWeightful humanSLRootExploreProbWeightless ignoreAllHistory ignorePreRootHistory lagBuffer lcbStdevs maxPlayouts maxPlayoutsPondering maxTime maxTimePondering maxVisits maxVisitsPondering midgameTimeFactor midgameTurnPeakTime minPlayoutsPerThread minVisitPropForLCB nnPolicyTemperature noResultUtilityForWhite noisePruneUtilityScale noisePruningCap numSearchThreads numVirtualLossesPerThread obviousMovesPolicyEntropyTolerance obviousMovesPolicySurpriseTolerance obviousMovesTimeFactor overallocateTimeFactor playoutDoublingAdvantage playoutDoublingAdvantagePla policyOptimism rootDesiredPerChildVisitsCoeff rootDirichletNoiseTotalConcentration rootDirichletNoiseWeight rootEndingBonusPoints rootFpuLossProp rootFpuReductionMax rootNoiseEnabled rootNumSymmetriesToSample rootPolicyOptimism rootPolicyTemperature rootPolicyTemperatureEarly rootPruneUselessMoves rootSymmetryPruning searchFactorAfterOnePass searchFactorAfterTwoPass staticScoreUtilityFactor subtreeValueBiasFactor subtreeValueBiasFreeProp subtreeValueBiasTableNumShards subtreeValueBiasWeightExponent treeReuseCarryOverTimeFactor uncertaintyCoeff uncertaintyExponent uncertaintyMaxWeight useGraphSearch useLcbForSelection useNoisePruning useNonBuggyLcb useUncertainty valueWeightExponent wideRootNoise winLossUtilityFactor = diff --git a/cpp/tests/results/gtp/setparams.txt.log b/cpp/tests/results/gtp/setparams.txt.log index cf4a695482..e16ca61394 100644 --- a/cpp/tests/results/gtp/setparams.txt.log +++ b/cpp/tests/results/gtp/setparams.txt.log @@ -269,7 +269,7 @@ D16 : T -1.32c W -1.18c S -0.10c ( -0.5 L -0.4) LCB -20.75c P 5.50% WF 6 : Controller: kata-set-param playoutDoublingAdvantage 1 : = : Controller: kata-get-params -: = {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} +: = {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"excludeTerritoryAdjacentToAtari":"auto","fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} : Controller: genmove w : MoveNum: 1 HASH: 87712726FD65E13B89C878D9CA82BF83 A B C D E F G H J K L M N O P Q R S T @@ -321,7 +321,7 @@ D4 : T 42.34c W 44.11c S 2.22c (+11.1 L +10.1) LCB -107.41c P 4.14% WF 2 : Controller: kata-set-param dynamicPlayoutDoublingAdvantageCapPerOppLead 0.045 : ? Could not set params: Cannot be overridden in kata-set-param: dynamicPlayoutDoublingAdvantageCapPerOppLead : Controller: kata-get-params -: = {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} +: = {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"excludeTerritoryAdjacentToAtari":"auto","fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} : Controller: genmove w : MoveNum: 1 HASH: 87712726FD65E13B89C878D9CA82BF83 A B C D E F G H J K L M N O P Q R S T diff --git a/cpp/tests/results/gtp/setparams.txt.stdout b/cpp/tests/results/gtp/setparams.txt.stdout index 2779351e7d..d25f26fcbf 100644 --- a/cpp/tests/results/gtp/setparams.txt.stdout +++ b/cpp/tests/results/gtp/setparams.txt.stdout @@ -30,7 +30,7 @@ = -= {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} += {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"excludeTerritoryAdjacentToAtari":"auto","fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} = D3 @@ -38,7 +38,7 @@ ? Could not set params: Cannot be overridden in kata-set-param: dynamicPlayoutDoublingAdvantageCapPerOppLead -= {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} += {"allowResignation":"true","alwaysComputePassAliveUnderSuicideRules":"auto","analysisIgnorePreRootHistory":"true","analysisWideRootNoise":"0.9","antiMirror":"false","chosenMovePrune":1.0,"chosenMoveSubtract":0.0,"chosenMoveTemperature":0.1,"chosenMoveTemperatureEarly":0.5,"chosenMoveTemperatureHalflife":19.0,"chosenMoveTemperatureOnlyBelowProb":1.0,"conservativePass":true,"cpuctExploration":1.0,"cpuctExplorationBase":500.0,"cpuctExplorationLog":0.45,"cpuctUtilityStdevPrior":0.4,"cpuctUtilityStdevPriorWeight":2.0,"cpuctUtilityStdevScale":0.85,"delayMoveMax":"1e+06","delayMoveScale":"0","drawEquivalentWinsForWhite":0.5,"dynamicScoreCenterScale":0.75,"dynamicScoreCenterZeroWeight":0.2,"dynamicScoreUtilityFactor":0.3,"enableMorePassingHacks":true,"enablePassingHacks":true,"endgameTurnTimeDecay":100.0,"excludeTerritoryAdjacentToAtari":"auto","fillDameBeforePass":true,"fpuLossProp":0.0,"fpuParentWeight":0.0,"fpuParentWeightByVisitedPolicy":true,"fpuParentWeightByVisitedPolicyPow":2.0,"fpuReductionMax":0.2,"futileVisitsThreshold":0.0,"genmoveAntiMirror":"true","graphSearchCatchUpLeakProb":0.0,"graphSearchRepBound":11,"humanSLChosenMoveIgnorePass":false,"humanSLChosenMovePiklLambda":1000000000.0,"humanSLChosenMoveProp":0.0,"humanSLCpuctExploration":1.0,"humanSLCpuctPermanent":0.0,"humanSLOppExploreProbWeightful":0.0,"humanSLOppExploreProbWeightless":0.0,"humanSLPlaExploreProbWeightful":0.0,"humanSLPlaExploreProbWeightless":0.0,"humanSLProfile":"","humanSLRootExploreProbWeightful":0.0,"humanSLRootExploreProbWeightless":0.0,"ignoreAllHistory":false,"ignorePreRootHistory":false,"lagBuffer":1.0,"lcbStdevs":5.0,"maxPlayouts":10000,"maxPlayoutsPondering":1125899906842624,"maxTime":1e+20,"maxTimePondering":60.0,"maxVisits":100,"maxVisitsPondering":1125899906842624,"midgameTimeFactor":1.0,"midgameTurnPeakTime":130.0,"minPlayoutsPerThread":8.0,"minVisitPropForLCB":0.15,"nnPolicyTemperature":1.0,"noResultUtilityForWhite":0.0,"noisePruneUtilityScale":0.15,"noisePruningCap":1e+50,"numSearchThreads":1,"numVirtualLossesPerThread":1.0,"obviousMovesPolicyEntropyTolerance":0.3,"obviousMovesPolicySurpriseTolerance":0.15,"obviousMovesTimeFactor":1.0,"overallocateTimeFactor":1.0,"playoutDoublingAdvantage":1.0,"playoutDoublingAdvantagePla":"E","policyOptimism":1.0,"ponderingEnabled":"false","rootDesiredPerChildVisitsCoeff":0.0,"rootDirichletNoiseTotalConcentration":10.83,"rootDirichletNoiseWeight":0.25,"rootEndingBonusPoints":0.5,"rootFpuLossProp":0.0,"rootFpuReductionMax":0.1,"rootNoiseEnabled":false,"rootNumSymmetriesToSample":1,"rootPolicyOptimism":0.2,"rootPolicyTemperature":1.0,"rootPolicyTemperatureEarly":1.0,"rootPruneUselessMoves":true,"rootSymmetryPruning":false,"searchFactorAfterOnePass":0.5,"searchFactorAfterTwoPass":0.25,"staticScoreUtilityFactor":0.1,"subtreeValueBiasFactor":0.45,"subtreeValueBiasFreeProp":0.8,"subtreeValueBiasTableNumShards":65536,"subtreeValueBiasWeightExponent":0.85,"treeReuseCarryOverTimeFactor":0.0,"uncertaintyCoeff":0.25,"uncertaintyExponent":1.0,"uncertaintyMaxWeight":8.0,"useGraphSearch":true,"useLcbForSelection":true,"useNoisePruning":true,"useNonBuggyLcb":true,"useUncertainty":true,"valueWeightExponent":0.25,"wideRootNoise":0.0,"winLossUtilityFactor":1.0} = D3 diff --git a/cpp/tests/results/runOutputTests.txt b/cpp/tests/results/runOutputTests.txt index 344c0442a5..2ea8b7d88a 100644 --- a/cpp/tests/results/runOutputTests.txt +++ b/cpp/tests/results/runOutputTests.txt @@ -17838,6 +17838,1161 @@ encorephase 0 finished 1 numTurnsThisPhase 10 numApproxValidTurnsThisPhase 5 128561E9F61B0F5A24149506AFB8ABEB History that net sees null null null null null +Running NN inputs excludeTerritoryAdjacentToAtari tests +----------------------------------------------------------------- +NN Inputs Area Feature exclude territory adjacent to atari +----------------------------------------------------------------- +VERSION 6 +=========================================== +goToEncore2 = 0 +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +8AA6060B40EF85B0DAD6A5625B59EE91 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 1510BE48CE15260600577817AE33FF1D +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +G2 F1 4FBFC5E76E90585B164FB5BD5595298E +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 F1 A3 E0949D391C6024CB29042848E89C27E5 +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +G2 F1 A3 G7 0145ECE8DA3C4C68918F95C4331E884D +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X X +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X X +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 F1 A3 G7 B7 60E772BB472004F0E2695F03A4A418BB +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . O5. O X X X4 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O3O X O X . O +0 0 0 0 0 0 0 O X X O . X O1 +0 0 0 0 0 0 0 O . X O O X2X + +Channel: 19 +0 0 0 0 0 0 0 . O5. O X X X4 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O3O X O X . O +0 0 0 0 0 0 0 O X X O . X O1 +0 0 0 0 0 0 0 O . X O O X2X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +G2 F1 A3 G7 B7 E2 701318CDCA36F81CB3B44F40AAB72A71 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . O4. O X X X3 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O2O X O X . O +0 0 0 0 0 0 0 O X X O X5X O +0 0 0 0 0 0 0 O . X O O X1X + +Channel: 19 +0 0 0 0 0 0 0 . O4. O X X X3 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O2O X O X . O +0 0 0 0 0 0 0 O X X O X5X O +0 0 0 0 0 0 0 O . X O O X1X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 -100 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 F1 A3 G7 B7 E2 F3 5C074E53C2D13E8B958CEAC939F1881F +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . O3. O X X X2 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O1O X O . O5O +0 0 0 0 0 0 0 O X X O .4. O +0 0 0 0 0 0 0 O . X O O . . + +Channel: 19 +0 0 0 0 0 0 0 . O3. O X X X2 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O1O X O . O5O +0 0 0 0 0 0 0 O X X O .4. O +0 0 0 0 0 0 0 O . X O O . . + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 100 100 100 + 100 -100 -100 100 100 100 100 + 100 0 -100 100 100 100 100 + + +=========================================== +goToEncore2 = 1 +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +8AA6060B40EF85B0DAD6A5625B59EE91 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 1 +pass pass 0A3CB6344EDDF77CEAFFCD2823544664 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass 34AD8462245C34FF447FEB8A233E2E11 +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +1 1 0 1 0 0 1 . O X O X . O +1 0 0 1 0 0 0 O X X O . X . +1 0 0 1 1 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 . O X O X . O +0 1 1 0 0 1 0 O X X O . X . +0 0 1 0 0 0 1 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 E86D42DDBFD06F2DE85155CC35839921 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 . O X O X . O +0 1 1 0 0 1 0 O X X O . X O5 +0 0 1 0 0 0 1 O . X O O . X + +Channel: 19 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +1 1 0 1 0 0 1 . O X O X . O +1 0 0 1 0 0 0 O X X O . X O5 +1 0 0 1 1 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 F1B4478E0A23E91488E6FB552DF2E90E +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +1 1 0 1 0 0 1 . O X O X . O +1 0 0 1 0 0 0 O X X O . X O4 +1 0 0 1 1 0 0 O . X O O X5X + +Channel: 19 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 . O X O X . O +0 1 1 0 0 1 0 O X X O . X O4 +0 0 1 0 0 0 1 O . X O O X5X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 1DE961AC6DA56DE0C1020593732C41D9 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O5O X O X . O +0 1 1 0 0 1 0 O X X O . X O3 +0 0 1 0 0 0 1 O . X O O X4X + +Channel: 19 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O5O X O X . O +1 0 0 1 0 0 0 O X X O . X O3 +1 0 0 1 1 0 0 O . X O O X4X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 BF4E6E81BE8FFD270F26DB2C4B7948CD +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . . . O X X X5 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O4O X O X . O +1 0 0 1 0 0 0 O X X O . X O2 +1 0 0 1 1 0 0 O . X O O X3X + +Channel: 19 +0 0 0 0 1 1 0 . . . O X X X5 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O4O X O X . O +0 1 1 0 0 1 0 O X X O . X O2 +0 0 1 0 0 0 1 O . X O O X3X + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 B7 9D9A8E2E36E54DDB0A6F72D83F147E87 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 0 . O5. O X X X4 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O3O X O X . O +0 1 1 0 0 1 0 O X X O . X O1 +0 0 1 0 0 0 1 O . X O O X2X + +Channel: 19 +1 1 1 1 0 0 0 . O5. O X X X4 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O3O X O X . O +1 0 0 1 0 0 0 O X X O . X O1 +1 0 0 1 1 0 0 O . X O O X2X + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 B7 E2 CE189AA4AE8549532D1D01A8D2D0EAF1 +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . O4. O X X X3 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O2O X O X . O +1 0 0 1 0 0 0 O X X O X5X O +1 0 0 1 1 0 0 O . X O O X1X + +Channel: 19 +0 0 0 0 1 1 0 . O4. O X X X3 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O2O X O X . O +0 1 1 0 0 1 0 O X X O X5X O +0 0 1 0 0 0 1 O . X O O X1X + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 B7 E2 F3 A17AB2C6B31477A07D8AC712A241EE23 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 0 . O3. O X X X2 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 0 0 0 O1O X O . O5O +0 1 1 0 0 0 0 O X X O .4. O +0 0 1 0 0 0 0 O . X O O . . + +Channel: 19 +1 1 1 1 0 0 0 . O3. O X X X2 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 1 1 1 O1O X O . O5O +1 0 0 1 1 1 1 O X X O .4. O +1 0 0 1 1 1 1 O . X O O . . + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 100 100 100 + 100 -100 -100 100 100 100 100 + 100 0 -100 100 100 100 100 + + +VERSION 7 +=========================================== +goToEncore2 = 0 +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +8AA6060B40EF85B0DAD6A5625B59EE91 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 1510BE48CE15260600577817AE33FF1D +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +G2 F1 4FBFC5E76E90585B164FB5BD5595298E +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 F1 A3 E0949D391C6024CB29042848E89C27E5 +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +G2 F1 A3 G7 0145ECE8DA3C4C68918F95C4331E884D +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X X +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X X +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O O X O X . O +0 0 0 0 0 0 0 O X X O . X O +0 0 0 0 0 0 0 O . X O O X X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 F1 A3 G7 B7 60E772BB472004F0E2695F03A4A418BB +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . O5. O X X X4 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O3O X O X . O +0 0 0 0 0 0 0 O X X O . X O1 +0 0 0 0 0 0 0 O . X O O X2X + +Channel: 19 +0 0 0 0 0 0 0 . O5. O X X X4 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O3O X O X . O +0 0 0 0 0 0 0 O X X O . X O1 +0 0 0 0 0 0 0 O . X O O X2X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +G2 F1 A3 G7 B7 E2 701318CDCA36F81CB3B44F40AAB72A71 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . O4. O X X X3 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O2O X O X . O +0 0 0 0 0 0 0 O X X O X5X O +0 0 0 0 0 0 0 O . X O O X1X + +Channel: 19 +0 0 0 0 0 0 0 . O4. O X X X3 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O2O X O X . O +0 0 0 0 0 0 0 O X X O X5X O +0 0 0 0 0 0 0 O . X O O X1X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 -100 -100 100 + 100 0 -100 100 100 -100 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -2 +Encore phase: 0 +G2 F1 A3 G7 B7 E2 F3 5C074E53C2D13E8B958CEAC939F1881F +Channel: 5: -0.225 +Channel: 18 +0 0 0 0 0 0 0 . O3. O X X X2 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O1O X O . O5O +0 0 0 0 0 0 0 O X X O .4. O +0 0 0 0 0 0 0 O . X O O . . + +Channel: 19 +0 0 0 0 0 0 0 . O3. O X X X2 +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 O1O X O . O5O +0 0 0 0 0 0 0 O X X O .4. O +0 0 0 0 0 0 0 O . X O O . . + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 100 100 100 + 100 -100 -100 100 100 100 100 + 100 0 -100 100 100 100 100 + + +=========================================== +goToEncore2 = 1 +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 0 +8AA6060B40EF85B0DAD6A5625B59EE91 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 1 +pass pass 0A3CB6344EDDF77CEAFFCD2823544664 +Channel: 5: 0.275 +Channel: 18 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 0 0 0 . . . O X X . +0 0 0 0 0 0 0 O O O O X . X +0 0 0 0 0 0 0 X X X X O X X +0 0 0 0 0 0 0 O . X O O O O +0 0 0 0 0 0 0 . O X O X . O +0 0 0 0 0 0 0 O X X O . X . +0 0 0 0 0 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass 34AD8462245C34FF447FEB8A233E2E11 +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +1 1 0 1 0 0 1 . O X O X . O +1 0 0 1 0 0 0 O X X O . X . +1 0 0 1 1 0 0 O . X O O . X + +Channel: 19 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 . O X O X . O +0 1 1 0 0 1 0 O X X O . X . +0 0 1 0 0 0 1 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 E86D42DDBFD06F2DE85155CC35839921 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 . O X O X . O +0 1 1 0 0 1 0 O X X O . X O5 +0 0 1 0 0 0 1 O . X O O . X + +Channel: 19 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +1 1 0 1 0 0 1 . O X O X . O +1 0 0 1 0 0 0 O X X O . X O5 +1 0 0 1 1 0 0 O . X O O . X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 F1B4478E0A23E91488E6FB552DF2E90E +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +1 1 0 1 0 0 1 . O X O X . O +1 0 0 1 0 0 0 O X X O . X O4 +1 0 0 1 1 0 0 O . X O O X5X + +Channel: 19 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 . O X O X . O +0 1 1 0 0 1 0 O X X O . X O4 +0 0 1 0 0 0 1 O . X O O X5X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 100 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 1DE961AC6DA56DE0C1020593732C41D9 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 1 . . . O X X . +0 0 0 0 1 1 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O5O X O X . O +0 1 1 0 0 1 0 O X X O . X O3 +0 0 1 0 0 0 1 O . X O O X4X + +Channel: 19 +1 1 1 1 0 0 0 . . . O X X . +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O5O X O X . O +1 0 0 1 0 0 0 O X X O . X O3 +1 0 0 1 1 0 0 O . X O O X4X + + 100 100 100 100 -100 -100 -100 + 100 100 100 100 -100 -100 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 BF4E6E81BE8FFD270F26DB2C4B7948CD +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . . . O X X X5 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O4O X O X . O +1 0 0 1 0 0 0 O X X O . X O2 +1 0 0 1 1 0 0 O . X O O X3X + +Channel: 19 +0 0 0 0 1 1 0 . . . O X X X5 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O4O X O X . O +0 1 1 0 0 1 0 O X X O . X O2 +0 0 1 0 0 0 1 O . X O O X3X + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 B7 9D9A8E2E36E54DDB0A6F72D83F147E87 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 0 . O5. O X X X4 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O3O X O X . O +0 1 1 0 0 1 0 O X X O . X O1 +0 0 1 0 0 0 1 O . X O O X2X + +Channel: 19 +1 1 1 1 0 0 0 . O5. O X X X4 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O3O X O X . O +1 0 0 1 0 0 0 O X X O . X O1 +1 0 0 1 1 0 0 O . X O O X2X + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 B7 E2 CE189AA4AE8549532D1D01A8D2D0EAF1 +Channel: 5: 0.275 +Channel: 18 +1 1 1 1 0 0 0 . O4. O X X X3 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 0 0 1 O2O X O X . O +1 0 0 1 0 0 0 O X X O X5X O +1 0 0 1 1 0 0 O . X O O X1X + +Channel: 19 +0 0 0 0 1 1 0 . O4. O X X X3 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 1 0 0 O2O X O X . O +0 1 1 0 0 1 0 O X X O X5X O +0 0 1 0 0 0 1 O . X O O X1X + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 -100 0 100 + 100 -100 -100 100 0 -100 0 + 100 0 -100 100 100 0 -100 + +Rules: koPOSITIONALscoreTERRITORYtaxNONEsui0komi6.5 +Komi and Bonus: 6.5 -1 +Encore phase: 2 +pass pass pass pass G2 F1 A3 G7 B7 E2 F3 A17AB2C6B31477A07D8AC712A241EE23 +Channel: 5: -0.275 +Channel: 18 +0 0 0 0 1 1 0 . O3. O X X X2 +0 0 0 0 1 0 1 O O O O X . X +1 1 1 1 0 1 1 X X X X O X X +0 0 1 0 0 0 0 O . X O O O O +0 0 1 0 0 0 0 O1O X O . O5O +0 1 1 0 0 0 0 O X X O .4. O +0 0 1 0 0 0 0 O . X O O . . + +Channel: 19 +1 1 1 1 0 0 0 . O3. O X X X2 +1 1 1 1 0 0 0 O O O O X . X +0 0 0 0 1 0 0 X X X X O X X +1 0 0 1 1 1 1 O . X O O O O +0 1 0 1 1 1 1 O1O X O . O5O +1 0 0 1 1 1 1 O X X O .4. O +1 0 0 1 1 1 1 O . X O O . . + + 100 100 100 100 -100 -100 0 + 100 100 100 100 -100 0 -100 +-100 -100 -100 -100 100 -100 -100 + 100 0 -100 100 100 100 100 + 0 100 -100 100 100 100 100 + 100 -100 -100 100 100 100 100 + 100 0 -100 100 100 100 100 + + +Score and area with dead chain in atari adjacent to territory, and a ko mouth ===================== +excludeTerritoryAdjacentToAtari = 0 +SCORE NOW 6.5 +OOOOOXX +OOOOXXX +OOOOOXX +OOOOOXX +OOOO.XX +OOOOOXX +OOOOOXX + +excludeTerritoryAdjacentToAtari = 1 +SCORE NOW 5.5 +OOO.OXX +OOOOXXX +OOOOOXX +OOOOOXX +OOOO.XX +OOOOOXX +OOOOOXX + Running neuralnetless search tests =================================================================== Basic search with debugSkipNeuralNet and chosen move randomization @@ -20733,6 +21888,7 @@ wideRootNoise: 0 enablePassingHacks: 0 enableMorePassingHacks: 0 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -20843,6 +21999,7 @@ wideRootNoise: 0 enablePassingHacks: 0 enableMorePassingHacks: 0 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -20953,6 +22110,7 @@ wideRootNoise: 0 enablePassingHacks: 1 enableMorePassingHacks: 1 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -21063,6 +22221,7 @@ wideRootNoise: 0.04 enablePassingHacks: 1 enableMorePassingHacks: 1 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -21173,6 +22332,7 @@ wideRootNoise: 0 enablePassingHacks: 0 enableMorePassingHacks: 0 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -21283,6 +22443,7 @@ wideRootNoise: 0 enablePassingHacks: 0 enableMorePassingHacks: 0 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -21393,6 +22554,7 @@ wideRootNoise: 0 enablePassingHacks: 0 enableMorePassingHacks: 0 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 @@ -21503,6 +22665,7 @@ wideRootNoise: 0 enablePassingHacks: 0 enableMorePassingHacks: 0 alwaysComputePassAliveUnderSuicideRules: auto +excludeTerritoryAdjacentToAtari: auto playoutDoublingAdvantage: 0 playoutDoublingAdvantagePla: 0 avoidRepeatedPatternUtility: 0 diff --git a/cpp/tests/testbackendreference.cpp b/cpp/tests/testbackendreference.cpp new file mode 100644 index 0000000000..4696843991 --- /dev/null +++ b/cpp/tests/testbackendreference.cpp @@ -0,0 +1,530 @@ +#include "../tests/tests.h" + +#include "../core/fileutils.h" +#include "../neuralnet/nneval.h" +#include "../dataio/sgf.h" + +#include "../external/nlohmann_json/json.hpp" + +//------------------------ +#include "../core/using.h" +//------------------------ +using json = nlohmann::json; + +// Absolute-output check of a backend against compiled-in reference data blended across a +// sampling of neural nets from the training run (see backendreferencedata.cpp for the data +// schema). Unlike runBackendErrorTest, whose reference is by default the same backend's own +// unbatched fp32 outputs, this can catch a backend that is systematically wrong in fp16 and +// fp32 alike, so the two are complementary. +// +// The reference blend is what a net from the run looks like, so only nets from the run are +// expected to pass. Human-imitation nets and nets trained for other special purposes deviate +// from the run's own trajectory by more than a backend bug would, and can fail on their own +// merits. Nets too small for any threshold to be meaningful are exempted outright rather than +// checked, see MIN_EFF_PARAMS_TO_CHECK. +// +// The detection floor is the spread of legitimate nets across the run on each metric, so +// thresholds are necessarily far looser than runBackendErrorTest's. +// Metrics and thresholds must stay valid for every net the run still uses, as nets improve: +// - Policy KL(candidate || smoothed mixture): improving nets sharpen within the mixture's +// support, so this stays bounded, and it fires when the backend puts mass on moves no +// reference net ever considered. +// - Binary KL of the candidate's winrate vs the reference average winrate. +// - Mean absolute error vs the reference averages for lead, score mean, score stdev, and +// (loosely) the shortterm winloss/score error predictions. +// - Consensus top move: on positions where the mixture is confident, any reasonable net +// assigns the consensus move substantial mass. +// - Ownership MAE vs the mixture mean, bounded by a multiple of the max MAE that any +// reference net itself achieved. +// +// Positions may individually override the policy optimism and pda used for their eval (the +// function arguments are just the defaults), and may cap the history planes via maxHistory. +// Backends implement the blend of the two policy output channels themselves, so varying +// optimism across positions exercises that blend. + +struct BackendRefPosData { + Sgf::PositionSample sample; + Rules rules; + double policyOptimism = 0.0; + double pda = 0.0; + int maxHistory = 1000; + //Full averaged policy across reference nets, length xSize*ySize+1, row-major y*xSize+x with + //pass as the last entry. + std::vector policyMixture; + bool hasPolicyMixture = false; + double winrateAvg = 0.0; + bool hasWinrateAvg = false; + double leadAvg = 0.0; + bool hasLeadAvg = false; + double scoreMeanAvg = 0.0; + bool hasScoreMeanAvg = false; + double scoreStdevAvg = 0.0; + bool hasScoreStdevAvg = false; + double stWinlossErrorAvg = 0.0; + bool hasStWinlossErrorAvg = false; + double stScoreErrorAvg = 0.0; + bool hasStScoreErrorAvg = false; + std::vector ownership; + bool hasOwnership = false; + double ownershipAllowedMAE = 0.0; +}; + +// Base limits, calibrated August 2026 against 31 nets spanning 2020-2026: kata1-b6c96 through +// b28c512nbt, b40c768nbt and experimental transformers, including the worst and earliest net +// of each size class. Each was evaluated on the compiled-in positions against the compiled-in +// reference blend. Limits are set so that with the size lenience below, every legitimate net +// measured at most ~2/3 of each limit. +// Before checking, continuous limits are scaled up by the overall lenience (the size lenience +// below times the caller's lenienceFactor) and consensusMinProb is scaled down by it. +struct BackendRefLimits { + double mixtureSmoothing = 1e-5; // epsilon of uniform-over-legal mixed into the mixture + double avgPolicyKL = 0.24; // mean over positions of KL(candidate || smoothed mixture), nats + double p95PolicyKL = 0.60; // 95th percentile over positions + double consensusTopProb = 0.80; // mixture top prob >= this marks a consensus position + double consensusMinProb = 0.10; // candidate must assign at least this to the consensus move + int maxConsensusViolations = 3; + double avgWinrateKL = 0.040; // binary KL of candidate winrate vs reference average, nats + double p95WinrateKL = 0.19; + //Lead, score stdev, and the shortterm error predictions get extra slack beyond the + //calibration: they are canaries that don't drive play the way policy/winrate do, and the + //second-order ones could shift with future training hyperparameter changes. + double avgLeadAE = 1.8; // abs error vs reference average, points + double p95LeadAE = 5.3; + double avgScoreMeanAE = 1.55; + double p95ScoreMeanAE = 4.7; + double avgScoreStdevAE = 5.1; + double p95ScoreStdevAE = 9.9; + double avgStWinlossErrorAE = 0.096; // abs error vs reference average shorttermWinlossError + double p95StWinlossErrorAE = 0.33; + double avgStScoreErrorAE = 1.3; // abs error vs reference average shorttermScoreError, points + double p95StScoreErrorAE = 3.9; + //Ownership is checked via the ratio of the candidate's per-position MAE to the stored + //per-position allowed MAE, which normalizes for how much positions legitimately vary + //(settled positions have tiny cross-net spread, complex middlegames large), then + //thresholded avg/p95 like the other metrics. The denominator is padded and floored: + //fully-decided positions have allowed MAE as small as ~0.0004, which would hugely amplify + //benign numerics like a tiny uniform offset on saturated outputs. + double ownershipMAEPad = 0.005; + double ownershipMAEFloor = 0.015; + double avgOwnershipRatio = 1.35; + double p95OwnershipRatio = 1.6; +}; + +// Smaller/weaker nets legitimately deviate more from the blended reference. Measured mean +// policy KL vs the blend rises smoothly as parameter count shrinks: ~1.4x at 47M params, ~5x +// at 10M, ~11x at 1M, relative to the largest nets. Nested bottleneck nets behave like larger +// plain nets per parameter, and transformers larger still, so their parameters are counted at +// a multiple. The exponent is deliberately a bit steeper than the measured scaling: small nets +// only play rating games rather than generating training data, so extra buffer against +// stochastic variation is cheap there, while nets at or above the current main-run size stay +// near lenience 1. +static double computeBackendRefEffParams(const NNEvaluator* nnEval) { + double effParams = (double)nnEval->getNumModelParameters(); + if(nnEval->modelHasAnyNestedBottleneckBlocks()) + effParams *= 2.0; + if(nnEval->modelHasAnyTransformerBlocks()) + effParams *= 2.0; + return effParams; +} + +static double computeBackendRefSizeLenience(const NNEvaluator* nnEval) { + return std::max(1.0, pow(1.4e8 / std::max(1.0, computeBackendRefEffParams(nnEval)), 0.75)); +} + +//Size classes at or below b6c96 include the run's very first nets, barely better than random. +//No thresholds can both pass those and stay meaningful, so below this the checks are advisory. +static constexpr double MIN_EFF_PARAMS_TO_CHECK = 2e6; + +static bool parseBackendRefScalar(const json& obj, const char* key, double& out) { + if(obj.find(key) == obj.end() || obj[key].is_null()) + return false; + out = obj[key].get(); + return true; +} + +static BackendRefPosData parseBackendRefPosData(const string& line, double defaultPolicyOptimism, double defaultPda) { + BackendRefPosData data; + json obj = json::parse(line); + data.sample = Sgf::PositionSample::ofJsonLine(obj["sample"].dump()); + data.rules = Rules::parseRules(obj["rules"].get()); + data.rules.komi = (float)obj["komi"].get(); + data.policyOptimism = defaultPolicyOptimism; + if(parseBackendRefScalar(obj,"policyOptimism",data.policyOptimism)) { + if(!(data.policyOptimism >= 0.0 && data.policyOptimism <= 1.0)) + throw StringError("Backend reference data: policyOptimism out of range"); + } + data.pda = defaultPda; + if(parseBackendRefScalar(obj,"pda",data.pda)) { + if(!(data.pda >= -4.0 && data.pda <= 4.0)) + throw StringError("Backend reference data: pda out of range"); + } + if(obj.find("maxHistory") != obj.end() && !obj["maxHistory"].is_null()) { + data.maxHistory = obj["maxHistory"].get(); + if(data.maxHistory < 0 || data.maxHistory > 1000) + throw StringError("Backend reference data: maxHistory out of range"); + } + if(obj.find("policyMixture") != obj.end() && !obj["policyMixture"].is_null()) { + data.policyMixture = obj["policyMixture"].get>(); + if(data.policyMixture.size() != (size_t)(data.sample.board.x_size * data.sample.board.y_size + 1)) + throw StringError("Backend reference data: policyMixture size does not match board size"); + for(const double& p: data.policyMixture) { + if(!(p >= 0.0 && p <= 1.0 + 1e-6)) + throw StringError("Backend reference data: bad policyMixture prob"); + } + data.hasPolicyMixture = true; + } + data.hasWinrateAvg = parseBackendRefScalar(obj,"winrateAvg",data.winrateAvg); + data.hasLeadAvg = parseBackendRefScalar(obj,"leadAvg",data.leadAvg); + data.hasScoreMeanAvg = parseBackendRefScalar(obj,"scoreMeanAvg",data.scoreMeanAvg); + data.hasScoreStdevAvg = parseBackendRefScalar(obj,"scoreStdevAvg",data.scoreStdevAvg); + data.hasStWinlossErrorAvg = parseBackendRefScalar(obj,"shorttermWinlossErrorAvg",data.stWinlossErrorAvg); + data.hasStScoreErrorAvg = parseBackendRefScalar(obj,"shorttermScoreErrorAvg",data.stScoreErrorAvg); + if(obj.find("ownership") != obj.end() && !obj["ownership"].is_null()) { + if(obj.find("ownershipAllowedMAE") == obj.end() || obj["ownershipAllowedMAE"].is_null()) + throw StringError("Backend reference data: ownership provided without ownershipAllowedMAE"); + //Stored as white ownership times 100, integers in [-100,100]. + data.ownership = obj["ownership"].get>(); + data.ownershipAllowedMAE = obj["ownershipAllowedMAE"].get(); + if(data.ownership.size() != (size_t)(data.sample.board.x_size * data.sample.board.y_size)) + throw StringError("Backend reference data: ownership size does not match board size"); + for(double& o: data.ownership) { + if(!(o >= -100.0 && o <= 100.0)) + throw StringError("Backend reference data: ownership value out of range"); + o *= 0.01; + } + if(!(data.ownershipAllowedMAE > 0.0)) + throw StringError("Backend reference data: ownershipAllowedMAE must be positive"); + data.hasOwnership = true; + } + return data; +} + +static double backendRefAvg(const std::vector& vec) { + if(vec.size() <= 0) + return 0.0; + double sum = 0; + for(const double& x: vec) + sum += x; + return sum / (double)vec.size(); +} +static double backendRefPercentile(std::vector vec, double frac) { + if(vec.size() <= 0) + return 0.0; + std::sort(vec.begin(),vec.end()); + return vec[(size_t)((double)(vec.size()-1) * frac)]; +} +static double backendRefMax(const std::vector& vec) { + if(vec.size() <= 0) + return 0.0; + return *std::max_element(vec.begin(),vec.end()); +} +static void backendRefReportStats(const string& name, const std::vector& vec, Logger& logger) { + auto rpad = [](const string& s, size_t n) { + if(s.size() < n) + return s + std::string(n - s.size(),' '); + return s; + }; + logger.write( + rpad("backend reference " + name + ":", 46) + + Global::strprintf( + " %8.5f %8.5f %8.5f %8.5f", + backendRefAvg(vec), backendRefPercentile(vec,0.95), backendRefPercentile(vec,0.99), backendRefMax(vec) + ) + ); +} + +bool Tests::runBackendReferenceTest( + NNEvaluator* nnEval, + Logger& logger, + bool verbose, + double policyOptimismForTest, + double pdaForTest, + double nnPolicyTemperatureForTest, + double lenienceFactor, + const string& referenceDataFileOverride, + const string& dumpCandidateFileName +) { + BackendRefLimits limits; + const double lenience = computeBackendRefSizeLenience(nnEval) * lenienceFactor; + const double consensusMinProbUsed = std::max(0.005, limits.consensusMinProb / lenience); + + std::vector jsonLines; + if(referenceDataFileOverride != "") { + for(const string& line: FileUtils::readFileLines(referenceDataFileOverride,'\n')) { + if(Global::trim(line) != "") + jsonLines.push_back(line); + } + if(verbose) + logger.write("Loaded " + Global::uint64ToString((uint64_t)jsonLines.size()) + " backend reference positions from: " + referenceDataFileOverride); + } + else + jsonLines = TestCommon::getBackendReferenceJsonData(); + + std::vector refData; + for(const string& line: jsonLines) + refData.push_back(parseBackendRefPosData(line, policyOptimismForTest, pdaForTest)); + + if(refData.size() <= 0) { + logger.write("Backend reference test: no reference positions, skipping"); + return true; + } + + std::ofstream dumpOut; + if(dumpCandidateFileName != "") { + FileUtils::open(dumpOut,dumpCandidateFileName); + if(!dumpOut) + throw StringError("Unable to open dump file: " + dumpCandidateFileName); + } + + // Per-position aggregates + std::vector policyKL; + std::vector winrateKL; + std::vector leadAE; + std::vector scoreMeanAE; + std::vector scoreStdevAE; + std::vector stWinlossErrorAE; + std::vector stScoreErrorAE; + std::vector consensusProbs; // candidate prob on the consensus move, over consensus positions + std::vector ownershipMAERatio; // candidate MAE / stored allowed MAE, over ownership positions + int numConsensusViolations = 0; + + for(size_t posIdx = 0; posIdx < refData.size(); posIdx++) { + const BackendRefPosData& data = refData[posIdx]; + + //Featurize per the model's own declared BoardHistoryModes preferences. Nets with different modes + //thus see slightly different inputs on the same position - part of the model-family spread the + //calibrated thresholds must absorb. + const BoardHistoryModes modelModes( + nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari()); + BoardHistory hist; + Player nextPla = C_EMPTY; + bool histOkay = data.sample.tryGetCurrentBoardHistory(data.rules, nextPla, hist, modelModes); + if(!histOkay) + throw StringError("Backend reference test: reference position " + Global::uint64ToString((uint64_t)posIdx) + " has illegal moves"); + const Board& board = hist.getRecentBoard(0); + + MiscNNInputParams nnInputParams; + nnInputParams.symmetry = (int)(BoardHistory::getSituationRulesAndKoHash(board,hist,hist.presumedNextMovePla,0.5).hash0 & 7); + nnInputParams.policyOptimism = data.policyOptimism; + nnInputParams.playoutDoublingAdvantage = data.pda; + nnInputParams.maxHistory = data.maxHistory; + nnInputParams.nnPolicyTemperature = (float)nnPolicyTemperatureForTest; + nnInputParams.passAliveSuicideRulesOverride = modelModes.alwaysComputePassAliveUnderSuicideRules ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = modelModes.excludeTerritoryAdjacentToAtari ? 1 : 0; + + NNResultBuf buf; + const bool skipCache = true; + const bool includeOwnerMap = true; + SGFMetadata sgfMeta = SGFMetadata::getProfile("preaz_5k"); + nnEval->evaluate(board,hist,hist.presumedNextMovePla,&sgfMeta,nnInputParams,buf,skipCache,includeOwnerMap); + const std::shared_ptr& out = buf.result; + + int numLegal = 0; + for(int i = 0; ipolicyProbs[i] >= 0) + numLegal += 1; + } + testAssert(numLegal > 0); + + const int mixtureLen = board.x_size * board.y_size + 1; + auto mixtureIdxOfLoc = [&](Loc loc) { + if(loc == Board::PASS_LOC) + return mixtureLen-1; + return Location::getY(loc,board.x_size) * board.x_size + Location::getX(loc,board.x_size); + }; + + if(data.hasPolicyMixture) { + const double eps = limits.mixtureSmoothing; + double klSum = 0.0; + for(int i = 0; ipolicyProbs[i]; + if(c <= 1e-30) + continue; + Loc loc = NNPos::posToLoc(i, board.x_size, board.y_size, out->nnXLen, out->nnYLen); + double m = data.policyMixture[mixtureIdxOfLoc(loc)]; + m = (1.0-eps)*m + eps/numLegal; + klSum += c * (log(c) - log(m)); + } + policyKL.push_back(klSum); + + int topIdx = 0; + for(int i = 1; i data.policyMixture[topIdx]) + topIdx = i; + } + if(data.policyMixture[topIdx] >= limits.consensusTopProb) { + Loc topLoc = (topIdx == mixtureLen-1) ? Board::PASS_LOC : Location::getLoc(topIdx % board.x_size, topIdx / board.x_size, board.x_size); + int candPos = out->getPos(topLoc,board); + double candidateProb = out->policyProbs[candPos]; + if(candidateProb < 0) + throw StringError("Backend reference test: consensus move is illegal on reference position " + Global::uint64ToString((uint64_t)posIdx)); + consensusProbs.push_back(candidateProb); + if(candidateProb < consensusMinProbUsed) + numConsensusViolations += 1; + } + } + + double winrate = 0.5*(1.0 + out->whiteWinProb - out->whiteLossProb); + double scoreStdev = sqrt(std::max(0.0, (double)out->whiteScoreMeanSq - (double)out->whiteScoreMean*(double)out->whiteScoreMean)); + if(data.hasWinrateAvg) { + auto clamp01 = [](double x) { return std::min(1.0-1e-6, std::max(1e-6, x)); }; + double r = clamp01(data.winrateAvg); + double c = clamp01(winrate); + winrateKL.push_back(r*log(r/c) + (1.0-r)*log((1.0-r)/(1.0-c))); + } + if(data.hasLeadAvg) + leadAE.push_back(std::abs((double)out->whiteLead - data.leadAvg)); + if(data.hasScoreMeanAvg) + scoreMeanAE.push_back(std::abs((double)out->whiteScoreMean - data.scoreMeanAvg)); + if(data.hasScoreStdevAvg) + scoreStdevAE.push_back(std::abs(scoreStdev - data.scoreStdevAvg)); + //Model versions below 9 lack these heads entirely (the outputs would be softplus-of-zero + //garbage rather than real predictions), so skip the checks for such models. + if(data.hasStWinlossErrorAvg && nnEval->supportsShorttermError() && out->shorttermWinlossError >= 0) + stWinlossErrorAE.push_back(std::abs((double)out->shorttermWinlossError - data.stWinlossErrorAvg)); + if(data.hasStScoreErrorAvg && nnEval->supportsShorttermError() && out->shorttermScoreError >= 0) + stScoreErrorAE.push_back(std::abs((double)out->shorttermScoreError - data.stScoreErrorAvg)); + + testAssert(out->whiteOwnerMap != NULL); + if(data.hasOwnership) { + double maeSum = 0.0; + for(int y = 0; ynnXLen); + maeSum += std::abs(data.ownership[y*board.x_size+x] - (double)out->whiteOwnerMap[pos]); + } + } + double mae = maeSum / (board.x_size * board.y_size); + ownershipMAERatio.push_back(mae / std::max(data.ownershipAllowedMAE + limits.ownershipMAEPad, limits.ownershipMAEFloor)); + } + + if(dumpCandidateFileName != "") { + json dump; + dump["posIdx"] = (int64_t)posIdx; + dump["sample"] = json::parse(Sgf::PositionSample::toJsonLine(data.sample)); + dump["rules"] = data.rules.toStringNoKomi(); + dump["komi"] = data.rules.komi; + //Effective values used, including ones that came from the defaults. + dump["policyOptimism"] = data.policyOptimism; + dump["pda"] = data.pda; + dump["maxHistory"] = data.maxHistory; + dump["symmetryUsed"] = nnInputParams.symmetry; + dump["modelName"] = nnEval->getInternalModelName(); + dump["modelVersion"] = nnEval->getModelVersion(); + //Full policy in the same layout as policyMixture: row-major y*xSize+x, pass last. + std::vector policy(mixtureLen, 0.0); + for(int i = 0; ipolicyProbs[i]; + if(c < 0) + continue; + Loc loc = NNPos::posToLoc(i, board.x_size, board.y_size, out->nnXLen, out->nnYLen); + policy[mixtureIdxOfLoc(loc)] = c; + } + dump["policy"] = policy; + dump["whiteWinProb"] = out->whiteWinProb; + dump["whiteLossProb"] = out->whiteLossProb; + dump["whiteNoResultProb"] = out->whiteNoResultProb; + dump["winrate"] = winrate; + dump["whiteLead"] = out->whiteLead; + dump["whiteScoreMean"] = out->whiteScoreMean; + dump["scoreStdev"] = scoreStdev; + //Null for models that lack these heads, so blending excludes them. + if(nnEval->supportsShorttermError()) { + dump["shorttermWinlossError"] = out->shorttermWinlossError; + dump["shorttermScoreError"] = out->shorttermScoreError; + } + else { + dump["shorttermWinlossError"] = nullptr; + dump["shorttermScoreError"] = nullptr; + } + std::vector ownership; + for(int y = 0; ywhiteOwnerMap[NNPos::xyToPos(x,y,out->nnXLen)]); + dump["ownership"] = ownership; + dumpOut << dump.dump() << "\n"; + } + } + + if(dumpCandidateFileName != "") { + dumpOut.close(); + logger.write("Dumped candidate outputs for " + Global::uint64ToString((uint64_t)refData.size()) + " positions to: " + dumpCandidateFileName); + } + + if(verbose) { + logger.write( + "Backend reference test: " + Global::uint64ToString((uint64_t)refData.size()) + " positions (" + + Global::uint64ToString((uint64_t)policyKL.size()) + " policy mixture, " + + Global::uint64ToString((uint64_t)consensusProbs.size()) + " consensus, " + + Global::uint64ToString((uint64_t)winrateKL.size()) + " winrate, " + + Global::uint64ToString((uint64_t)stWinlossErrorAE.size()) + " shortterm, " + + Global::uint64ToString((uint64_t)ownershipMAERatio.size()) + " ownership) on model " + + nnEval->getInternalModelName()); + logger.write(Global::strprintf( + "Lenience: %.3f (size lenience %.3f x factor %.3f)", + lenience, computeBackendRefSizeLenience(nnEval), lenienceFactor)); + logger.write("Reporting avg, 95%, 99%, max over positions:"); + backendRefReportStats("policyKL (nats)", policyKL, logger); + backendRefReportStats("winrateKL (nats)", winrateKL, logger); + backendRefReportStats("leadAE (points)", leadAE, logger); + backendRefReportStats("scoreMeanAE (points)", scoreMeanAE, logger); + backendRefReportStats("scoreStdevAE (points)", scoreStdevAE, logger); + backendRefReportStats("stWinlossErrorAE", stWinlossErrorAE, logger); + backendRefReportStats("stScoreErrorAE (points)", stScoreErrorAE, logger); + backendRefReportStats("ownershipMAERatio", ownershipMAERatio, logger); + if(consensusProbs.size() > 0) + logger.write(Global::strprintf( + "backend reference min consensus move prob: %8.5f (%d of %d below %.5f, %d allowed)", + *std::min_element(consensusProbs.begin(),consensusProbs.end()), + numConsensusViolations, (int)consensusProbs.size(), consensusMinProbUsed, limits.maxConsensusViolations)); + } + + bool success = true; + auto failCheck = [&](const string& msg) { + //Always log failures even when not verbose, so that contribute logs record which check tripped. + logger.write("Backend reference test failed check for " + nnEval->getInternalModelName() + ": " + msg); + success = false; + }; + auto checkLimit = [&](double value, double limit, const char* name) { + if(!(value <= limit)) + failCheck(Global::strprintf("%s %.5f > limit %.5f", name, value, limit)); + }; + auto checkViolations = [&](int count, int maxAllowed, const char* name) { + if(count > maxAllowed) + failCheck(Global::strprintf("%s %d > allowed %d", name, count, maxAllowed)); + }; + + auto p95 = [&](const std::vector& v) { return backendRefPercentile(v, 0.95); }; + checkLimit(backendRefAvg(policyKL), limits.avgPolicyKL * lenience, "avg policyKL"); + checkLimit(p95(policyKL), limits.p95PolicyKL * lenience, "p95 policyKL"); + checkViolations(numConsensusViolations, limits.maxConsensusViolations, "consensus move violations"); + checkLimit(backendRefAvg(winrateKL), limits.avgWinrateKL * lenience, "avg winrateKL"); + checkLimit(p95(winrateKL), limits.p95WinrateKL * lenience, "p95 winrateKL"); + checkLimit(backendRefAvg(leadAE), limits.avgLeadAE * lenience, "lead MAE"); + checkLimit(p95(leadAE), limits.p95LeadAE * lenience, "p95 leadAE"); + checkLimit(backendRefAvg(scoreMeanAE), limits.avgScoreMeanAE * lenience, "scoreMean MAE"); + checkLimit(p95(scoreMeanAE), limits.p95ScoreMeanAE * lenience, "p95 scoreMeanAE"); + checkLimit(backendRefAvg(scoreStdevAE), limits.avgScoreStdevAE * lenience, "scoreStdev MAE"); + checkLimit(p95(scoreStdevAE), limits.p95ScoreStdevAE * lenience, "p95 scoreStdevAE"); + checkLimit(backendRefAvg(stWinlossErrorAE), limits.avgStWinlossErrorAE * lenience, "stWinlossError MAE"); + checkLimit(p95(stWinlossErrorAE), limits.p95StWinlossErrorAE * lenience, "p95 stWinlossErrorAE"); + checkLimit(backendRefAvg(stScoreErrorAE), limits.avgStScoreErrorAE * lenience, "stScoreError MAE"); + checkLimit(p95(stScoreErrorAE), limits.p95StScoreErrorAE * lenience, "p95 stScoreErrorAE"); + checkLimit(backendRefAvg(ownershipMAERatio), limits.avgOwnershipRatio * lenience, "avg ownershipMAERatio"); + checkLimit(p95(ownershipMAERatio), limits.p95OwnershipRatio * lenience, "p95 ownershipMAERatio"); + + bool failuresExempted = false; + if(!success && computeBackendRefEffParams(nnEval) < MIN_EFF_PARAMS_TO_CHECK) { + logger.write("Backend reference test: failed checks ignored for " + nnEval->getInternalModelName() + ", model is below the minimum size for checking"); + success = true; + failuresExempted = true; + } + + if(verbose) { + if(failuresExempted) + logger.write("Backend reference test PASSED (checks not applicable at this model size)"); + else + logger.write(string("Backend reference test ") + (success ? "PASSED" : "FAILED")); + } + return success; +} diff --git a/cpp/tests/testboardarea.cpp b/cpp/tests/testboardarea.cpp index 7248b3f294..32421fa5d1 100644 --- a/cpp/tests/testboardarea.cpp +++ b/cpp/tests/testboardarea.cpp @@ -1826,7 +1826,7 @@ Group tax //============================================================================ - auto printIndependentLifeAreas = [&out](const Board& board, Color result[Board::MAX_ARR_SIZE]) { + auto printIndependentLifeAreasWithMode = [&out](const Board& board, Color result[Board::MAX_ARR_SIZE], bool excludeTerritoryAdjacentToAtari) { bool keepTerritoriesBuf[4] = {false, true, false, true}; bool keepStonesBuf[4] = {false, false, true, true}; @@ -1836,7 +1836,7 @@ Group tax bool keepStones = keepStonesBuf[mode/2]; int whiteMinusBlackIndependentLifeRegionCount = 0; Board copy(board); - copy.calculateIndependentLifeArea(result,whiteMinusBlackIndependentLifeRegionCount,keepTerritories,keepStones,multiStoneSuicideLegal); + copy.calculateIndependentLifeArea(result,whiteMinusBlackIndependentLifeRegionCount,keepTerritories,keepStones,excludeTerritoryAdjacentToAtari,multiStoneSuicideLegal); out << "Keep Territories " << keepTerritories << " " << "Keep Stones " << keepStones << " " << "Suicide " << multiStoneSuicideLegal << endl; @@ -1857,6 +1857,12 @@ Group tax copy.checkConsistency(); } }; + //Legacy rules version 2 behavior (excludeTerritoryAdjacentToAtari off) - the "IndependentLife" + //tests below use this. The "(v3 excludeTerritoryAdjacentToAtari)" tests at the end cover + //excludeTerritoryAdjacentToAtari = true. + auto printIndependentLifeAreas = [&printIndependentLifeAreasWithMode](const Board& board, Color result[Board::MAX_ARR_SIZE]) { + printIndependentLifeAreasWithMode(board,result,false); + }; //============================================================================ @@ -2954,5 +2960,592 @@ whiteMinusBlackIndependentLifeRegionCount 0 )%%"; expect(name,out,expected); } + + //============================================================================ + //Rules version 3 behavior with excludeTerritoryAdjacentToAtari on - same boards as the + //corresponding tests above, but empty points adjacent to chains in atari do not count. + { + const char* name = "IndependentLife 1 (v3 excludeTerritoryAdjacentToAtari)"; + Color result[Board::MAX_ARR_SIZE]; + Board board = Board::parseBoard(19,19,R"%%( +.oooxooo.ox..xo.o.. +o.xoxo.xoox..xoooxx +oooxxxooxxx..xxxxoo +xxx.xxxxx.x.....xo. +..xxx....xx.....xoo +................xxx +xxxxxxxxxxxxxx..xoo +.............x..xo. +..oo.........x.xxox +oo.o.......ooxxooox +xoooo...ooooxoox.x. +.xo.o...o.ox.xoxxxx +xoooo...ooooxoooooo +oo.........oooooooo +xxxxxxxxxxxxxxxxxxx +oooooox....xooooooo +xxxo.ox....xo.ooxxx +..xooox.xx.xooo.x.. +..xo.ox....xo.oox.. +)%%"); + + printIndependentLifeAreasWithMode(board,result,true); + + string expected = R"%%( +Keep Territories 0 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOO............... +OOOO............... +OOO................ +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +OOOOOO............. +XXXOOO............. +XXXOOO............. +XXXOOO............. + +Keep Territories 0 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOO............... +OOOO............... +OOO................ +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +OOOOOO............. +XXXOOO............. +XXXOOO............. +XXXOOO............. + +Keep Territories 1 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOO.......XX..O... +OOOO.......XX...... +OOO........XX...... +...X.....X.XXXXX... +XX...XXXX..XXXXX... +XXXXXXXXXXXXXXXX... +..............XX... +..............XX... +..............X.... +..O................ +O.................X +OO.O.....O......... +O.................. +................... +................... +OOOOOO.XXXX........ +XXXOOO.XXXX..O..... +XXXOOO.X..X......XX +XXXOOO.XXXX..O...XX + +Keep Territories 1 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOO.......XX..O... +OOOO.......XX...... +OOO........XX...... +...X.....X.XXXXX... +XX...XXXX..XXXXX... +XXXXXXXXXXXXXXXX... +..............XX... +..............XX... +..............X.... +..O................ +O.................X +OO.O.....O......... +O.................. +................... +................... +OOOOOO.XXXX........ +XXXOOO.XXXX..O..... +XXXOOO.X..X......XX +XXXOOO.XXXX..O...XX + +Keep Territories 0 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOOXOOO.OX..XO.O.. +OOOOXO.XOOX..XOOOXX +OOOXXXOOXXX..XXXXOO +XXX.XXXXX.X.....XO. +..XXX....XX.....XOO +................XXX +XXXXXXXXXXXXXX..XOO +.............X..XO. +..OO.........X.XXOX +OO.O.......OOXXOOOX +.OOOO...OOOOXOOX.X. +..O.O...O.OX.XOXXXX +.OOOO...OOOOXOOOOOO +OO.........OOOOOOOO +XXXXXXXXXXXXXXXXXXX +OOOOOOX....XOOOOOOO +XXXOOOX....XO.OOXXX +XXXOOOX.XX.XOOO.X.. +XXXOOOX....XO.OOX.. + +Keep Territories 0 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOOXOOO.OX..XO.O.. +OOOOXO.XOOX..XOOOXX +OOOXXXOOXXX..XXXXOO +XXX.XXXXX.X.....XO. +..XXX....XX.....XOO +................XXX +XXXXXXXXXXXXXX..XOO +.............X..XO. +..OO.........X.XXOX +OO.O.......OOXXOOOX +.OOOO...OOOOXOOX.X. +..O.O...O.OX.XOXXXX +.OOOO...OOOOXOOOOOO +OO.........OOOOOOOO +XXXXXXXXXXXXXXXXXXX +OOOOOOX....XOOOOOOO +XXXOOOX....XO.OOXXX +XXXOOOX.XX.XOOO.X.. +XXXOOOX....XO.OOX.. + +Keep Territories 1 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOOXOOO.OXXXXOOO.. +OOOOXO.XOOXXXXOOOXX +OOOXXXOOXXXXXXXXXOO +XXXXXXXXXXXXXXXXXO. +XXXXXXXXXXXXXXXXXOO +XXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXOO +.............XXXXO. +..OO.........XXXXOX +OOOO.......OOXXOOOX +OOOOO...OOOOXOOX.XX +OOOOO...OOOX.XOXXXX +OOOOO...OOOOXOOOOOO +OO.........OOOOOOOO +XXXXXXXXXXXXXXXXXXX +OOOOOOXXXXXXOOOOOOO +XXXOOOXXXXXXOOOOXXX +XXXOOOXXXXXXOOO.XXX +XXXOOOXXXXXXOOOOXXX + +Keep Territories 1 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 1 +OOOOXOOO.OXXXXOOO.. +OOOOXO.XOOXXXXOOOXX +OOOXXXOOXXXXXXXXXOO +XXXXXXXXXXXXXXXXXO. +XXXXXXXXXXXXXXXXXOO +XXXXXXXXXXXXXXXXXXX +XXXXXXXXXXXXXXXXXOO +.............XXXXO. +..OO.........XXXXOX +OOOO.......OOXXOOOX +OOOOO...OOOOXOOX.XX +OOOOO...OOOX.XOXXXX +OOOOO...OOOOXOOOOOO +OO.........OOOOOOOO +XXXXXXXXXXXXXXXXXXX +OOOOOOXXXXXXOOOOOOO +XXXOOOXXXXXXOOOOXXX +XXXOOOXXXXXXOOO.XXX +XXXOOOXXXXXXOOOOXXX + +)%%"; + expect(name,out,expected); + } + + { + const char* name = "IndependentLife 2 (v3 excludeTerritoryAdjacentToAtari)"; + Color result[Board::MAX_ARR_SIZE]; + Board board = Board::parseBoard(19,19,R"%%( +x.o.ox.......xo.ox. +xo..ox.......xo..ox +o..ox.........xo..o +..ox.....o.....xo.. +oox.............xoo +xx...............xx +................... +..xx.............xx +xxoox......xxx..xoo +oo.ox...xxxooox.xo. +xoooox.xooooxooxxoo +.xo.ox.xo.ox.xoxoo. +xoooox.xooooxooxo.x +ooxxx...xxxoooxxoo. +xx.........xxx..xoo +xxx..xxx.......xxxx +oooxxooox...xxxoooo +xxoooxxoox.xooo.oxx +.xo.o.xo.oxxo.ooox. +)%%"); + + printIndependentLifeAreasWithMode(board,result,true); + + string expected = R"%%( +Keep Territories 0 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 4 +..............OOO.. +..............OOOO. +...............OOOO +................OOO +.................OO +................... +................... +................... +..OO.............OO +OOOO.............OO +OOOOO............OO +OOOOO...........OOO +OOOOO...........OOO +OO..............OOO +.................OO +................... +...............OOOO +............OOOOOOO +............OOOOOOO + +Keep Territories 0 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 3 +..............OOO.. +..............OOOO. +...............OOOO +................OOO +.................OO +................... +................... +................... +..OO............... +OOOO............... +OOOOO.............. +OOOOO.............. +OOOOO.............. +OO................. +................... +................... +...............OOOO +............OOOOOOO +............OOOOOOO + +Keep Territories 1 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 4 +...O..........OOO.. +..OO..........OOOO. +.OO............OOOO +OO..............OOO +.................OO +................... +................... +................... +..OO.............OO +OOOO.............OO +OOOOO............OO +OOOOO...........OOO +OOOOO...........OOO +OO..............OOO +.................OO +................... +...............OOOO +............OOOOOOO +...O........OOOOOOO + +Keep Territories 1 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 3 +...O..........OOO.. +..OO..........OOOO. +.OO............OOOO +OO..............OOO +.................OO +................... +................... +................... +..OO............... +OOOO..............O +OOOOO.............. +OOOOO.............. +OOOOO.............. +OO................. +................... +................... +...............OOOO +............OOOOOOO +...O........OOOOOOO + +Keep Territories 0 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 4 +X.O.OX.......XOOOX. +XO..OX.......XOOOOX +O..OX.........XOOOO +..OX.....O.....XOOO +OOX.............XOO +XX...............XX +................... +..XX.............XX +XXOOX......XXX..XOO +OOOOX...XXXOOOX.XOO +OOOOOX.XOOOOXOOXXOO +OOOOOX.XO.OX.XOXOOO +OOOOOX.XOOOOXOOXOOO +OOXXX...XXXOOOXXOOO +XX.........XXX..XOO +XXX..XXX.......XXXX +OOOXXOOOX...XXXOOOO +XXOOOXXOOX.XOOOOOOO +.XO.O.XO.OXXOOOOOOO + +Keep Territories 0 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 3 +X.O.OX.......XOOOX. +XO..OX.......XOOOOX +O..OX.........XOOOO +..OX.....O.....XOOO +OOX.............XOO +XX...............XX +................... +..XX.............XX +XXOOX......XXX..XOO +OOOOX...XXXOOOX.XO. +OOOOOX.XOOOOXOOXXOO +OOOOOX.XO.OX.XOXOO. +OOOOOX.XOOOOXOOXO.X +OOXXX...XXXOOOXXOO. +XX.........XXX..XOO +XXX..XXX.......XXXX +OOOXXOOOX...XXXOOOO +XXOOOXXOOX.XOOOOOOO +.XO.O.XO.OXXOOOOOOO + +Keep Territories 1 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 4 +X.OOOX.......XOOOX. +XOOOOX.......XOOOOX +OOOOX.........XOOOO +OOOX.....O.....XOOO +OOX.............XOO +XX...............XX +................... +..XX.............XX +XXOOX......XXX..XOO +OOOOX...XXXOOOX.XOO +OOOOOX.XOOOOXOOXXOO +OOOOOX.XO.OX.XOXOOO +OOOOOX.XOOOOXOOXOOO +OOXXX...XXXOOOXXOOO +XX.........XXX..XOO +XXX..XXX.......XXXX +OOOXXOOOX...XXXOOOO +XXOOOXXOOX.XOOOOOOO +.XOOO.XO.OXXOOOOOOO + +Keep Territories 1 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 3 +X.OOOX.......XOOOX. +XOOOOX.......XOOOOX +OOOOX.........XOOOO +OOOX.....O.....XOOO +OOX.............XOO +XX...............XX +................... +..XX.............XX +XXOOX......XXX..XOO +OOOOX...XXXOOOX.XOO +OOOOOX.XOOOOXOOXXOO +OOOOOX.XO.OX.XOXOO. +OOOOOX.XOOOOXOOXO.X +OOXXX...XXXOOOXXOO. +XX.........XXX..XOO +XXX..XXX.......XXXX +OOOXXOOOX...XXXOOOO +XXOOOXXOOX.XOOOOOOO +.XOOO.XO.OXXOOOOOOO + +)%%"; + expect(name,out,expected); + } + + { + const char* name = "IndependentLife 7 (v3 excludeTerritoryAdjacentToAtari)"; + Color result[Board::MAX_ARR_SIZE]; + + { + Board board = Board::parseBoard(15,5,R"%%( +.xo.oox....xo.o +xxxooox....xoox +.xo.oxx...xxxo. +xoooox....xoooo +ooxxxx....xo.o. +)%%"); + printIndependentLifeAreasWithMode(board,result,true); + } + + string expected = R"%%( +Keep Territories 0 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount -1 +......XXXXXX... +......XXXXXX... +.....XXXXXXXX.. +.....XXXXXX.... +..XXXXXXXXX.... + +Keep Territories 0 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount -1 +......XXXXXX... +......XXXXXX... +.....XXXXXXXX.. +.....XXXXXX.... +..XXXXXXXXX.... + +Keep Territories 1 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount -1 +X.....XXXXXX... +......XXXXXX... +...O.XXXXXXXX.. +.....XXXXXX.... +..XXXXXXXXX.O.O + +Keep Territories 1 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount -1 +X.....XXXXXX... +......XXXXXX... +...O.XXXXXXXX.. +.....XXXXXX.... +..XXXXXXXXX.O.O + +Keep Territories 0 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount -1 +.XO.OOXXXXXXO.O +XXXOOOXXXXXXOOX +.XO.OXXXXXXXXO. +XOOOOXXXXXXOOOO +OOXXXXXXXXXO.O. + +Keep Territories 0 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount -1 +.XO.OOXXXXXXO.O +XXXOOOXXXXXXOOX +.XO.OXXXXXXXXO. +XOOOOXXXXXXOOOO +OOXXXXXXXXXO.O. + +Keep Territories 1 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount -1 +XXO.OOXXXXXXO.O +XXXOOOXXXXXXOOX +.XOOOXXXXXXXXO. +XOOOOXXXXXXOOOO +OOXXXXXXXXXOOOO + +Keep Territories 1 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount -1 +XXO.OOXXXXXXO.O +XXXOOOXXXXXXOOX +.XOOOXXXXXXXXO. +XOOOOXXXXXXOOOO +OOXXXXXXXXXOOOO + +)%%"; + expect(name,out,expected); + } + + { + const char* name = "IndependentLife 10 (v3 excludeTerritoryAdjacentToAtari)"; + Color result[Board::MAX_ARR_SIZE]; + + { + Board board = Board::parseBoard(15,5,R"%%( +............x.o +...........xxx. +........xxxx.xx +....oxxxxooxxxo +....x....xo.xo. +)%%"); + printIndependentLifeAreasWithMode(board,result,true); + } + + string expected = R"%%( +Keep Territories 0 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 0 +............... +............... +............... +............... +............... + +Keep Territories 0 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 0 +............... +............... +............... +............... +............... + +Keep Territories 1 Keep Stones 0 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 0 +.............XX +..............X +............X.. +..............X +.....XXX.....XX + +Keep Territories 1 Keep Stones 0 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 0 +............... +............... +............X.. +............... +.....XXX....... + +Keep Territories 0 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 0 +............X.. +...........XXX. +........XXXX.XX +....OXXXXOOXXX. +....X....XO.X.. + +Keep Territories 0 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 0 +............X.O +...........XXX. +........XXXX.XX +....OXXXXOOXXXO +....X....XO.XO. + +Keep Territories 1 Keep Stones 1 Suicide 0 +whiteMinusBlackIndependentLifeRegionCount 0 +............XXX +...........XXXX +........XXXXXXX +....OXXXXOOXXXX +....XXXX.XO.XXX + +Keep Territories 1 Keep Stones 1 Suicide 1 +whiteMinusBlackIndependentLifeRegionCount 0 +............X.O +...........XXX. +........XXXXXXX +....OXXXXOOXXXO +....XXXX.XO.XO. +)%%"; + expect(name,out,expected); + } + } diff --git a/cpp/tests/testboardbasic.cpp b/cpp/tests/testboardbasic.cpp index 9a3b5efe61..fcab83739e 100644 --- a/cpp/tests/testboardbasic.cpp +++ b/cpp/tests/testboardbasic.cpp @@ -1971,7 +1971,7 @@ void Tests::runBoardHandicapTest() { Board board = Board(19,19); Player nextPla = P_BLACK; Rules rules = Rules::parseRules("chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); testAssert(hist.computeNumHandicapStones() == 0); testAssert(hist.computeWhiteHandicapBonus() == 0); @@ -1993,7 +1993,7 @@ void Tests::runBoardHandicapTest() { Board board = Board(19,19); Player nextPla = P_BLACK; Rules rules = Rules::parseRules("chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.setAssumeMultipleStartingBlackMovesAreHandicap(true); testAssert(hist.computeNumHandicapStones() == 0); @@ -2012,7 +2012,7 @@ void Tests::runBoardHandicapTest() { Board board = Board(19,19); Player nextPla = P_BLACK; Rules rules = Rules::parseRules("aga"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.setAssumeMultipleStartingBlackMovesAreHandicap(true); testAssert(hist.computeNumHandicapStones() == 0); @@ -2031,7 +2031,7 @@ void Tests::runBoardHandicapTest() { Board board = Board(19,19); Player nextPla = P_BLACK; Rules rules = Rules::parseRules("aga"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.setAssumeMultipleStartingBlackMovesAreHandicap(true); testAssert(hist.computeNumHandicapStones() == 0); @@ -2062,7 +2062,7 @@ void Tests::runBoardHandicapTest() { Board board = Board(19,19); Player nextPla = P_BLACK; Rules rules = Rules::parseRules("chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.setAssumeMultipleStartingBlackMovesAreHandicap(true); testAssert(hist.computeNumHandicapStones() == 0); @@ -2457,7 +2457,7 @@ oxxxxx.xo rules.koRule = rand.nextBool(0.5) ? Rules::KO_SITUATIONAL : Rules::KO_POSITIONAL; if(rand.nextBool(0.2)) rules.taxRule = rand.nextBool(0.5) ? Rules::TAX_SEKI : rand.nextBool(0.5) ? Rules::TAX_NONE : Rules::TAX_ALL; - BoardHistory hist(board,pla,rules,initialEncorePhase,false); + BoardHistory hist(board,pla,rules,initialEncorePhase,BoardHistoryModes(false,false)); hist.setInitialTurnNumber(rand.nextInt(0,40)); hist.setAssumeMultipleStartingBlackMovesAreHandicap(rand.nextBool(0.5)); @@ -2470,7 +2470,7 @@ oxxxxx.xo double passProb = rand.nextDouble(0.05,0.80); int numSteps = rand.nextInt(6,15); for(int i = 0; igetRoot(); Board board(initialBoard); - BoardHistory hist(board,initialPla,rules,0,book->alwaysComputePassAliveUnderSuicideRules); + BoardHistory hist(board,initialPla,rules,0,book->historyModes); int branchLen = rand.nextUInt(10); for(int turnIdx = 0; turnIdx + +#include "../book/book.h" +#include "../neuralnet/nneval.h" +#include "../program/setup.h" +#include "../search/search.h" + +using namespace std; +using namespace TestCommon; + +//Tests for BoardHistoryModes::excludeTerritoryAdjacentToAtari and its plumbing. +//Prints only a single completion line on success - all checks are testAsserts. +void Tests::runExcludeTerritoryAtariModeTests() { + //A whole-board seki with an unfilled ko mouth. The top-right black group's only liberty is its + //eye at (5,1), so the group is in atari and under rules v3 (excludeTerritoryAdjacentToAtari) + //the eye is not a point for black under territory scoring with TaxRule NONE, while under + //rules v2 it is. + Board board = Board::parseBoard(7,7,R"%%( +...oxxx +oooox.x +xxxxoxx +o.xoooo +ooxox.o +oxxo.xo +o.xooxx +)%%"); + + Rules terrNoTaxRules; + terrNoTaxRules.koRule = Rules::KO_SIMPLE; + terrNoTaxRules.scoringRule = Rules::SCORING_TERRITORY; + terrNoTaxRules.taxRule = Rules::TAX_NONE; + terrNoTaxRules.multiStoneSuicideLegal = false; + terrNoTaxRules.komi = -0.5f; + + const Loc eyeLoc = Location::getLoc(5,1,board.x_size); + testAssert(board.colors[eyeLoc] == C_EMPTY); + testAssert(board.getNumLiberties(Location::getLoc(5,0,board.x_size)) == 1); + + //Sanity check that this position really does discriminate the two computations. + { + Color areaV2[Board::MAX_ARR_SIZE]; + Color areaV3[Board::MAX_ARR_SIZE]; + int count; + board.calculateIndependentLifeArea(areaV2,count,true,false,false,false); + board.calculateIndependentLifeArea(areaV3,count,true,false,true,false); + testAssert(areaV2[eyeLoc] == C_BLACK); + testAssert(areaV3[eyeLoc] == C_EMPTY); + } + + //Basic flag behavior and effect on scoring + { + BoardHistory hist(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,false)); + testAssert(!hist.modes.excludeTerritoryAdjacentToAtari); + + BoardHistory histFlagged(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,false)); + histFlagged.setModes(BoardHistoryModes(false,true)); + testAssert(histFlagged.modes.excludeTerritoryAdjacentToAtari); + + //The flag changes the situation-and-rules hash under territory scoring with TaxRule NONE + Hash128 hashOff = BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5); + Hash128 hashOn = BoardHistory::getSituationRulesAndKoHash(board,histFlagged,P_BLACK,0.5); + testAssert(hashOff != hashOn); + + //And changes territory scoring by exactly the ko mouth point (black loses 1 point) + BoardHistory histScore(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,false)); + Board boardCopy = board; + histScore.endAndScoreGameNow(boardCopy); + BoardHistory histScoreFlagged(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,true)); + Board boardCopy2 = board; + histScoreFlagged.endAndScoreGameNow(boardCopy2); + testAssert(histScore.isScored && histScoreFlagged.isScored); + testAssert(histScoreFlagged.finalWhiteMinusBlackScore == histScore.finalWhiteMinusBlackScore + 1.0f); + + //Copying and clear() preserve the flag + BoardHistory copied(histFlagged); + testAssert(copied.modes.excludeTerritoryAdjacentToAtari); + BoardHistory assigned; + assigned = histFlagged; + testAssert(assigned.modes.excludeTerritoryAdjacentToAtari); + BoardHistory cleared(histFlagged); + cleared.clear(board,P_BLACK,terrNoTaxRules,0); + testAssert(cleared.modes.excludeTerritoryAdjacentToAtari); + testAssert(histFlagged.copyToInitial().modes.excludeTerritoryAdjacentToAtari); + } + + //Under any other scoring/tax rules, the flag is a no-op for hashing and scoring + { + //Area scoring with TaxRule NONE + Rules areaRules = terrNoTaxRules; + areaRules.scoringRule = Rules::SCORING_AREA; + BoardHistory hist(board,P_BLACK,areaRules,0,BoardHistoryModes(false,false)); + BoardHistory histFlagged(board,P_BLACK,areaRules,0,BoardHistoryModes(false,true)); + testAssert( + BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5) == + BoardHistory::getSituationRulesAndKoHash(board,histFlagged,P_BLACK,0.5) + ); + Board boardCopy = board; + hist.endAndScoreGameNow(boardCopy); + Board boardCopy2 = board; + histFlagged.endAndScoreGameNow(boardCopy2); + testAssert(hist.finalWhiteMinusBlackScore == histFlagged.finalWhiteMinusBlackScore); + + //Territory scoring with TaxRule SEKI + Rules terrSekiRules = terrNoTaxRules; + terrSekiRules.taxRule = Rules::TAX_SEKI; + BoardHistory hist2(board,P_BLACK,terrSekiRules,0,BoardHistoryModes(false,false)); + BoardHistory hist2Flagged(board,P_BLACK,terrSekiRules,0,BoardHistoryModes(false,true)); + testAssert( + BoardHistory::getSituationRulesAndKoHash(board,hist2,P_BLACK,0.5) == + BoardHistory::getSituationRulesAndKoHash(board,hist2Flagged,P_BLACK,0.5) + ); + Board boardCopy3 = board; + hist2.endAndScoreGameNow(boardCopy3); + Board boardCopy4 = board; + hist2Flagged.endAndScoreGameNow(boardCopy4); + testAssert(hist2.finalWhiteMinusBlackScore == hist2Flagged.finalWhiteMinusBlackScore); + } + + //The two flags hash independently + { + BoardHistory hist(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,false)); + Hash128 h00 = BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5,BoardHistoryModes(false,false)); + Hash128 h01 = BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5,BoardHistoryModes(false,true)); + Hash128 h10 = BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5,BoardHistoryModes(true,false)); + Hash128 h11 = BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5,BoardHistoryModes(true,true)); + testAssert(h00 != h01 && h00 != h10 && h00 != h11); + testAssert(h01 != h10 && h01 != h11 && h10 != h11); + } + + //MiscNNInputParams override behavior for the nn cache hash + { + BoardHistory hist(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,false)); + BoardHistory histFlagged(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,true)); + + MiscNNInputParams noOverride; + MiscNNInputParams forceOn; + forceOn.excludeTerritoryAdjAtariOverride = 1; + MiscNNInputParams forceOff; + forceOff.excludeTerritoryAdjAtariOverride = 0; + + testAssert(!noOverride.getExcludeTerritoryAdjacentToAtari(hist)); + testAssert(noOverride.getExcludeTerritoryAdjacentToAtari(histFlagged)); + testAssert(forceOn.getExcludeTerritoryAdjacentToAtari(hist)); + testAssert(!forceOff.getExcludeTerritoryAdjacentToAtari(histFlagged)); + + //Hash reflects the effective featurization: flag-off + force-on == flag-on + no-override, etc. + Hash128 offPlain = NNInputs::getHash(board,hist,P_BLACK,noOverride); + Hash128 onPlain = NNInputs::getHash(board,histFlagged,P_BLACK,noOverride); + Hash128 offForcedOn = NNInputs::getHash(board,hist,P_BLACK,forceOn); + Hash128 onForcedOff = NNInputs::getHash(board,histFlagged,P_BLACK,forceOff); + testAssert(offPlain != onPlain); + testAssert(offForcedOn == onPlain); + testAssert(onForcedOff == offPlain); + } + + //Search maintains the invariant that its root history's modes always match what its params + //and nnEval resolve to, regardless of the history set into it. + { + Logger logger(nullptr,false,false); + NNEvaluator* nnEval = TestSearchCommon::startNNEval( + "",logger,"excludeTerritoryAtariModeTest",NNPos::MAX_BOARD_LEN,NNPos::MAX_BOARD_LEN, + 0,true,false,false,true,false + ); + //With no loaded model, auto resolves to false + testAssert(!nnEval->modelPreferExcludeTerritoryAdjacentToAtari()); + + SearchParams params = SearchParams::forTestsV2(); + testAssert(params.excludeTerritoryAdjacentToAtari == enabled_t::Auto); + + { + Search search(params,nnEval,&logger,"excludeTerritoryAtariStampTestSeed"); + testAssert(!search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + testAssert(!Search::resolveExcludeTerritoryAdjacentToAtari(params,nnEval)); + + //Setting a history with the flag on gets re-stamped to the search's own resolution + BoardHistory histFlagged(board,P_BLACK,terrNoTaxRules,0,BoardHistoryModes(false,true)); + search.setPosition(P_BLACK,board,histFlagged); + testAssert(!search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + + //Forcing the param stamps the flag on, even though the last set position had it off + SearchParams paramsOn = params; + paramsOn.excludeTerritoryAdjacentToAtari = enabled_t::True; + testAssert(Search::resolveExcludeTerritoryAdjacentToAtari(paramsOn,nnEval)); + search.setParams(paramsOn); + testAssert(search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + + //And even the no-clearing param setter keeps the invariant + search.setParamsNoClearing(params); + testAssert(!search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + search.setParamsNoClearing(paramsOn); + testAssert(search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + + //setPlayerAndClearHistory and setKomiIfNew preserve it too + search.setPlayerAndClearHistory(P_WHITE); + testAssert(search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + search.setKomiIfNew(5.5f); + testAssert(search.getRootHist().modes.excludeTerritoryAdjacentToAtari); + } + + nnEval->killServerThreads(); + delete nnEval; + } + + //Books record the BoardHistoryModes and stamp them on their histories. + //Books flagged with this mode require book version >= 4, the version that introduced it, so that + //binaries predating the mode reject them cleanly rather than ignoring the unrecognized header key + //and mis-hashing the whole book. + { + Rules bookRules = Rules::parseRules("chinese"); + Board initialBoard(9,9); + BookParams bparams; + for(bool mode : {false,true}) { + Book book(Book::LATEST_BOOK_VERSION, initialBoard, bookRules, P_BLACK, 3, BoardHistoryModes(false,mode), bparams); + testAssert(book.historyModes.excludeTerritoryAdjacentToAtari == mode); + testAssert(book.getInitialHist().modes.excludeTerritoryAdjacentToAtari == mode); + + std::ostringstream saved; + book.saveToStream(saved); + { + std::istringstream headerIn(saved.str()); + testAssert(Book::readHistoryModesOfHeader(headerIn) == BoardHistoryModes(false,mode)); + } + std::istringstream loadIn(saved.str()); + Book* loaded = Book::loadFromStream(loadIn); + testAssert(loaded->historyModes.excludeTerritoryAdjacentToAtari == mode); + testAssert(loaded->bookVersion == Book::LATEST_BOOK_VERSION); + testAssert(loaded->getInitialHist().modes.excludeTerritoryAdjacentToAtari == mode); + delete loaded; + } + + //Flagging a book with a mode at a version predating that mode is an error. Version 3 introduced + //alwaysComputePassAliveUnderSuicideRules and version 4 introduced this mode, so a version-3 book + //may carry the former but not the latter. + auto constructThrows = [&](int version, const BoardHistoryModes& modes) { + bool threw = false; + try { + Book book(version, initialBoard, bookRules, P_BLACK, 3, modes, bparams); + } + catch(const StringError&) { + threw = true; + } + return threw; + }; + testAssert(constructThrows(2,BoardHistoryModes(false,true))); + testAssert(constructThrows(3,BoardHistoryModes(false,true))); + testAssert(constructThrows(2,BoardHistoryModes(true,false))); + testAssert(!constructThrows(3,BoardHistoryModes(true,false))); + testAssert(!constructThrows(4,BoardHistoryModes(false,true))); + testAssert(Book::LATEST_BOOK_VERSION >= 4); + + //A book file with the header key absent entirely loads as mode false. + { + Book book(Book::LATEST_BOOK_VERSION, initialBoard, bookRules, P_BLACK, 3, BoardHistoryModes(), bparams); + std::ostringstream saved; + book.saveToStream(saved); + + string contents = saved.str(); + const string key = "\"excludeTerritoryAdjacentToAtari\":false,"; + size_t keyPos = contents.find(key); + testAssert(keyPos != string::npos); + contents.erase(keyPos, key.size()); + + { + std::istringstream headerIn(contents); + testAssert(Book::readHistoryModesOfHeader(headerIn) == BoardHistoryModes()); + } + std::istringstream loadIn(contents); + Book* loaded = Book::loadFromStream(loadIn); + testAssert(!loaded->historyModes.excludeTerritoryAdjacentToAtari); + delete loaded; + } + } + + //The nn cache cannot mix results across featurization modes: under territory scoring with + //TaxRule NONE the two modes hash differently (distinct cache entries), and under other rules + //the mode is a genuine no-op and deliberately shares cache entries. + { + Logger logger(nullptr,false,false); + NNEvaluator* nnEval = TestSearchCommon::startNNEval( + "",logger,"excludeTerritoryAtariCacheTest",NNPos::MAX_BOARD_LEN,NNPos::MAX_BOARD_LEN, + 0,true,false,false,true,false + ); + + MiscNNInputParams noOverride; + MiscNNInputParams forceOn; + forceOn.excludeTerritoryAdjAtariOverride = 1; + + auto sameOutputs = [](const NNOutput& a, const NNOutput& b) { + if(a.whiteWinProb != b.whiteWinProb || a.whiteLossProb != b.whiteLossProb || a.whiteScoreMean != b.whiteScoreMean) + return false; + for(int i = 0; ievaluate(board,hist,P_BLACK,noOverride,buf,false,false); + std::shared_ptr outPlain = std::move(buf.result); + nnEval->evaluate(board,hist,P_BLACK,forceOn,buf,false,false); + std::shared_ptr outForcedOn = std::move(buf.result); + nnEval->evaluate(board,hist,P_BLACK,noOverride,buf,false,false); + std::shared_ptr outPlainAgain = std::move(buf.result); + + //The debug-skip evaluator returns fresh random outputs on every cache miss, so distinct + //entries differ and a repeated query only matches if it hit the cache. + testAssert(!sameOutputs(*outPlain,*outForcedOn)); + testAssert(sameOutputs(*outPlain,*outPlainAgain)); + } + + //Area scoring: the override is a no-op and must share the cache entry. + { + Rules areaRules = terrNoTaxRules; + areaRules.scoringRule = Rules::SCORING_AREA; + BoardHistory hist(board,P_BLACK,areaRules,0,BoardHistoryModes(false,false)); + NNResultBuf buf; + nnEval->evaluate(board,hist,P_BLACK,noOverride,buf,false,false); + std::shared_ptr outPlain = std::move(buf.result); + nnEval->evaluate(board,hist,P_BLACK,forceOn,buf,false,false); + std::shared_ptr outForcedOn = std::move(buf.result); + testAssert(sameOutputs(*outPlain,*outForcedOn)); + } + + nnEval->killServerThreads(); + delete nnEval; + } + + //A pass-alive white group with both phenomena at once: a dead black throw-in stone in atari + //(A5, with liberty A4) inside its pass-alive territory, and a ko mouth (D7, the sole liberty + //of the isolated white ko stone E7). The exclusion applies only to chains of the territory + //owner's own color, so the throw-in does NOT block A4/A5 from counting for white, while the + //own-color ko stone in atari DOES block the mouth D7 - the only point the modes disagree on. + { + Board tboard = Board::parseBoard(7,7,R"%%( +.oo.ox. +oo.oxx. +xoooox. +.oooox. +oooo.x. +o.ooox. +ooooox. +)%%"); + const Loc throwInLoc = Location::getLoc(0,2,tboard.x_size); + const Loc libertyLoc = Location::getLoc(0,3,tboard.x_size); + const Loc mouthLoc = Location::getLoc(3,0,tboard.x_size); + const Loc koStoneLoc = Location::getLoc(4,0,tboard.x_size); + testAssert(tboard.colors[throwInLoc] == C_BLACK); + testAssert(tboard.getNumLiberties(throwInLoc) == 1); + testAssert(tboard.colors[koStoneLoc] == C_WHITE); + testAssert(tboard.getNumLiberties(koStoneLoc) == 1); + + Color areaV2[Board::MAX_ARR_SIZE]; + Color areaV3[Board::MAX_ARR_SIZE]; + int count; + tboard.calculateIndependentLifeArea(areaV2,count,true,false,false,false); + tboard.calculateIndependentLifeArea(areaV3,count,true,false,true,false); + //Opposing-color atari does not block the territory... + testAssert(areaV2[libertyLoc] == C_WHITE); + testAssert(areaV3[libertyLoc] == C_WHITE); + testAssert(areaV2[throwInLoc] == C_WHITE); + testAssert(areaV3[throwInLoc] == C_WHITE); + //...but the own-color ko stone in atari blocks the ko mouth, and nothing else differs. + testAssert(areaV2[mouthLoc] == C_WHITE); + testAssert(areaV3[mouthLoc] == C_EMPTY); + for(int i = 0; i rowBinV2(numSpatial*nnXLen*nnYLen); + std::vector rowBinV3(numSpatial*nnXLen*nnYLen); + std::vector rowGlobalV2(NNInputs::NUM_FEATURES_GLOBAL_V7); + std::vector rowGlobalV3(NNInputs::NUM_FEATURES_GLOBAL_V7); + MiscNNInputParams nnInputParams; + BoardHistory histV2(board,P_BLACK,terrNoTaxRules,2,BoardHistoryModes(false,false)); + BoardHistory histV3(board,P_BLACK,terrNoTaxRules,2,BoardHistoryModes(false,true)); + NNInputs::fillRowV7(board,histV2,P_BLACK,nnInputParams,nnXLen,nnYLen,false,rowBinV2.data(),rowGlobalV2.data()); + NNInputs::fillRowV7(board,histV3,P_BLACK,nnInputParams,nnXLen,nnYLen,false,rowBinV3.data(),rowGlobalV3.data()); + int eyePos = NNPos::locToPos(eyeLoc,board.x_size,nnXLen,nnYLen); + //Feature 18 is the current player's territory; black is to move, so the eye is feature 18 under v2. + testAssert(rowBinV2[18*nnXLen*nnYLen + eyePos] == 1.0f); + testAssert(rowBinV3[18*nnXLen*nnYLen + eyePos] == 0.0f); + //The eye is the sole atari-adjacent counted point on this board, so it is the only difference. + for(int i = 0; i tokens = Global::split(headerPrefix); //Header layout: name, version, numInputChannels, numInputGlobalChannels, 7 postprocess params, - //metaEncoderVersion, preferPassAliveUnderSuicideRules, 6 unused option slots, then the trunk. + //metaEncoderVersion, preferPassAliveUnderSuicideRules, preferExcludeTerritoryAdjacentToAtari, + //5 unused option slots, then the trunk. + const size_t passAliveSlot = 12; + const size_t excludeTerritorySlot = 13; testAssert(tokens.size() > 19); testAssert(tokens[1] == "17"); testAssert(tokens[11] == "0"); - testAssert(tokens[12] == "0"); + testAssert(tokens[passAliveSlot] == "0"); + testAssert(tokens[excludeTerritorySlot] == "0"); testAssert(tokens[19] == "trunk"); - auto parseWithSlot = [&](const string& slotValue) { + auto parseWithSlot = [&](size_t slot, const string& slotValue) { vector patched = tokens; - patched[12] = slotValue; + patched[slot] = slotValue; string contents = Global::concat(patched," ") + " " + rest; std::istringstream in(contents); return ModelDesc(in,"",true); }; + auto parseThrows = [&](size_t slot, const string& slotValue) { + bool threw = false; + try { + ModelDesc desc = parseWithSlot(slot,slotValue); + } + catch(const StringError&) { + threw = true; + } + return threw; + }; { - ModelDesc desc = parseWithSlot("0"); + ModelDesc desc = parseWithSlot(passAliveSlot,"0"); testAssert(desc.modelVersion == 17); testAssert(!desc.preferPassAliveUnderSuicideRules); + testAssert(!desc.preferExcludeTerritoryAdjacentToAtari); } { - ModelDesc desc = parseWithSlot("1"); + ModelDesc desc = parseWithSlot(passAliveSlot,"1"); testAssert(desc.modelVersion == 17); testAssert(desc.preferPassAliveUnderSuicideRules); + testAssert(!desc.preferExcludeTerritoryAdjacentToAtari); } { - bool threw = false; - try { - ModelDesc desc = parseWithSlot("2"); - } - catch(const StringError&) { - threw = true; - } - testAssert(threw); + ModelDesc desc = parseWithSlot(excludeTerritorySlot,"1"); + testAssert(desc.modelVersion == 17); + testAssert(!desc.preferPassAliveUnderSuicideRules); + testAssert(desc.preferExcludeTerritoryAdjacentToAtari); } + testAssert(parseThrows(passAliveSlot,"2")); + testAssert(parseThrows(excludeTerritorySlot,"2")); cout << "model declaration parsing okay" << endl; } } diff --git a/cpp/tests/testnnevalcanary.cpp b/cpp/tests/testnnevalcanary.cpp index b08b078f5e..7553e6e380 100644 --- a/cpp/tests/testnnevalcanary.cpp +++ b/cpp/tests/testnnevalcanary.cpp @@ -49,8 +49,8 @@ void Tests::runCanaryTests(NNEvaluator* nnEval, int symmetry, bool print) { BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); int turnIdx = 18; - //Featurize per the model's own declared pass-alive computation mode. - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, nnEval->modelPreferPassAliveUnderSuicideRules()); + //Featurize per the model's own declared BoardHistoryModes preferences. + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -85,8 +85,8 @@ void Tests::runCanaryTests(NNEvaluator* nnEval, int symmetry, bool print) { BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); int turnIdx = 36; - //Featurize per the model's own declared pass-alive computation mode. - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, nnEval->modelPreferPassAliveUnderSuicideRules()); + //Featurize per the model's own declared BoardHistoryModes preferences. + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -120,8 +120,8 @@ void Tests::runCanaryTests(NNEvaluator* nnEval, int symmetry, bool print) { BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); int turnIdx = 23; - //Featurize per the model's own declared pass-alive computation mode. - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, nnEval->modelPreferPassAliveUnderSuicideRules()); + //Featurize per the model's own declared BoardHistoryModes preferences. + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -156,8 +156,8 @@ void Tests::runCanaryTests(NNEvaluator* nnEval, int symmetry, bool print) { BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); int turnIdx = 23; - //Featurize per the model's own declared pass-alive computation mode. - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, nnEval->modelPreferPassAliveUnderSuicideRules()); + //Featurize per the model's own declared BoardHistoryModes preferences. + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); hist.setKomi(-7); MiscNNInputParams nnInputParams; @@ -189,8 +189,8 @@ void Tests::runCanaryTests(NNEvaluator* nnEval, int symmetry, bool print) { BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); int turnIdx = 23; - //Featurize per the model's own declared pass-alive computation mode. - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, nnEval->modelPreferPassAliveUnderSuicideRules()); + //Featurize per the model's own declared BoardHistoryModes preferences. + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); hist.setKomi(21); MiscNNInputParams nnInputParams; @@ -225,8 +225,8 @@ void Tests::runCanaryTests(NNEvaluator* nnEval, int symmetry, bool print) { BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); int turnIdx = 7; - //Featurize per the model's own declared pass-alive computation mode. - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, nnEval->modelPreferPassAliveUnderSuicideRules()); + //Featurize per the model's own declared BoardHistoryModes preferences. + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, BoardHistoryModes(nnEval->modelPreferPassAliveUnderSuicideRules(), nnEval->modelPreferExcludeTerritoryAdjacentToAtari())); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -660,8 +660,9 @@ bool Tests::runBackendErrorTest( nnInputParams.policyOptimism = policyOptimismForTest; nnInputParams.playoutDoublingAdvantage = pdaForTest; nnInputParams.nnPolicyTemperature = (float)nnPolicyTemperatureForTest; - //Featurize per the model's own declared pass-alive computation mode. + //Featurize per the model's own declared BoardHistoryModes preferences. nnInputParams.passAliveSuicideRulesOverride = nnE->modelPreferPassAliveUnderSuicideRules() ? 1 : 0; + nnInputParams.excludeTerritoryAdjAtariOverride = nnE->modelPreferExcludeTerritoryAdjacentToAtari() ? 1 : 0; NNResultBuf buf; bool skipCache = true; diff --git a/cpp/tests/testnninputs.cpp b/cpp/tests/testnninputs.cpp index 049b2b5767..e5b618cbb0 100644 --- a/cpp/tests/testnninputs.cpp +++ b/cpp/tests/testnninputs.cpp @@ -200,7 +200,7 @@ void Tests::runNNInputsV3V4Tests() { BoardHistory hist; Rules initialRules = Rules::getTrompTaylorish(); initialRules = sgf->getRulesOrFailAllowUnspecified(initialRules); - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); vector& moves = sgf->moves; for(size_t i = 0; igetRulesOrFailAllowUnspecified(initialRules); - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); vector& moves = sgf->moves; for(size_t i = 0; igetRulesOrFailAllowUnspecified(initialRules); - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); vector& moves = sgf->moves; for(size_t i = 0; igetRulesOrFailAllowUnspecified(initialRules); - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); vector& moves = sgf->moves; for(size_t i = 0; igetRulesOrFailAllowUnspecified(initialRules); - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); int nnXLen = 6; int nnYLen = 6; @@ -714,7 +714,7 @@ xxx..xx BoardHistory hist; Rules initialRules; initialRules = sgf->getRulesOrFailAllowUnspecified(initialRules); - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); vector& moves = sgf->moves; int nnXLen = 13; @@ -789,7 +789,7 @@ o.xoo.x rules.komi = 6.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichRules]; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); auto run = [&](bool inputsUseNHWC) { Player nextPla = hist.moveHistory.size() > 0 ? getOpp(hist.moveHistory[hist.moveHistory.size()-1].pla) : hist.initialPla; @@ -890,7 +890,7 @@ o.xoo.x Board board = Board(9,1); Player nextPla = P_BLACK; Rules initialRules = Rules::getSimpleTerritory(); - BoardHistory hist(board,nextPla,initialRules,0,false); + BoardHistory hist(board,nextPla,initialRules,0,BoardHistoryModes(false,false)); auto run = [&](bool inputsUseNHWC) { Hash128 hash; @@ -974,7 +974,7 @@ o.xoo.x Board board = Board(size,size); Player nextPla = P_BLACK; Rules initialRules = rules[i]; - BoardHistory hist(board,nextPla,initialRules,0,false); + BoardHistory hist(board,nextPla,initialRules,0,BoardHistoryModes(false,false)); cout << "----------------------------------------" << endl; cout << "Black makes 3 moves in a row" << endl; if(i >= 3) { @@ -1188,7 +1188,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1206,7 +1206,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1225,7 +1225,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1243,7 +1243,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1262,7 +1262,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1296,7 +1296,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1332,7 +1332,7 @@ ooxooxo cout << "---------------------------------------------------" << endl; cout << rules.toString() << endl; Board board(origBoard); - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); testScoring(board,hist,false); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C7",board),P_WHITE,NULL); @@ -1412,7 +1412,7 @@ ooxooxo Player nextPla; BoardHistory hist; Rules rules = sgf->getRulesOrFailAllowUnspecified(rulesToUse); - sgf->setupInitialBoardAndHist(rules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(rules, board, nextPla, hist,BoardHistoryModes(false,false)); int nnXLen = 9; int nnYLen = 9; @@ -1483,3 +1483,178 @@ ooxooxo } } +//================================================================================================================== + +void Tests::runExcludeTerritoryAtariNNInputsTests() { + cout << "Running NN inputs excludeTerritoryAdjacentToAtari tests" << endl; + ostringstream out; + out << std::setprecision(5); + + //Twin of the territory TAX_NONE case of "NN Inputs V6 Area Feature and Komi" above (same board, + //move sequence, and input versions), but with excludeTerritoryAdjacentToAtari on (rules version + //3). Under this mode, empty points adjacent to chains in atari (the seki ko mouth, and black's + //eye once black's top right group falls into atari) do not count as territory in features 18/19 + //or in scoring, and the nn input hash differs from the mode-off hash. The other rules combos of + //that test are omitted here since the mode is a no-op under them. + { + const char* name = "NN Inputs Area Feature exclude territory adjacent to atari"; + cout << "-----------------------------------------------------------------" << endl; + cout << name << endl; + cout << "-----------------------------------------------------------------" << endl; + + for(int version = 6; version <= 7; version++) { + cout << "VERSION " << version << endl; + int nnXLen = 7; + int nnYLen = 7; + double drawEquivalentWinsForWhite = 0.5; + static_assert(NNModelVersion::latestInputsVersionImplemented == 7, ""); + int numFeaturesBin = version == 6 ? NNInputs::NUM_FEATURES_SPATIAL_V6 : NNInputs::NUM_FEATURES_SPATIAL_V7; + int numFeaturesGlobal = version == 6 ? NNInputs::NUM_FEATURES_GLOBAL_V6 : NNInputs::NUM_FEATURES_GLOBAL_V7; + float* rowBin = new float[numFeaturesBin * nnXLen * nnYLen]; + float* rowGlobal = new float[numFeaturesGlobal]; + + for(int goToEncore2 = 0; goToEncore2 <= 1; goToEncore2++) { + Board board = Board::parseBoard(7,7,R"%%( +...oxx. +oooox.x +xxxxoxx +o.xoooo +.oxox.o +oxxo.x. +o.xoo.x +)%%"); + Rules rules; + rules.koRule = Rules::KO_POSITIONAL; + rules.scoringRule = Rules::SCORING_TERRITORY; + rules.komi = 6.5f; + rules.multiStoneSuicideLegal = false; + rules.taxRule = Rules::TAX_NONE; + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,true)); + + auto run = [&](bool inputsUseNHWC) { + Player nextPla = hist.moveHistory.size() > 0 ? getOpp(hist.moveHistory[hist.moveHistory.size()-1].pla) : hist.initialPla; + MiscNNInputParams nnInputParams; + nnInputParams.drawEquivalentWinsForWhite = drawEquivalentWinsForWhite; + Hash128 hash = NNInputs::getHash(board,hist,nextPla,nnInputParams); + if(version == 6) + NNInputs::fillRowV6(board,hist,nextPla,nnInputParams,nnXLen,nnYLen,inputsUseNHWC,rowBin,rowGlobal); + else + NNInputs::fillRowV7(board,hist,nextPla,nnInputParams,nnXLen,nnYLen,inputsUseNHWC,rowBin,rowGlobal); + out << hash << endl; + printNNInputGlobal(out,version,rowGlobal,5); + int c = 18; + printNNInputHWAndBoard(out,version,board,hist,nnXLen,nnYLen,inputsUseNHWC,rowBin,c); + c = 19; + printNNInputHWAndBoard(out,version,board,hist,nnXLen,nnYLen,inputsUseNHWC,rowBin,c); + return getAndClear(out); + }; + auto printScoring = [&]() { + Board b(board); + BoardHistory h(hist); + Color area[Board::MAX_ARR_SIZE]; + float scoring[Board::MAX_ARR_SIZE]; + h.endAndScoreGameNow(b,area); + NNInputs::fillScoring(b,area,false,scoring); + for(int y = 0; y +#include + +#include "../core/fileutils.h" +#include "../core/makedir.h" +#include "../neuralnet/desc.h" +#include "../neuralnet/modelversion.h" +#include "../neuralnet/nninputs.h" +#include "../neuralnet/onnxmodelbuilder.h" + +#include "onnx.pb.h" + +using namespace std; + +namespace { + +// Metadata for a plausible model of the given version, matching the requirements in +// docs/ONNX_Model_Files.md: the postProcess and metaEncoder keys are included exactly at the +// versions where they are required. +map makeMeta(int modelVersion, int numPolicyChannels) { + map meta; + meta["katago.metadataVersion"] = "1"; + meta["katago.name"] = "onnxfiletest"; + meta["katago.modelVersion"] = Global::intToString(modelVersion); + meta["katago.numInputChannels"] = Global::intToString(NNModelVersion::getNumSpatialFeatures(modelVersion)); + meta["katago.numInputGlobalChannels"] = Global::intToString(NNModelVersion::getNumGlobalFeatures(modelVersion)); + meta["katago.numInputMetaChannels"] = "0"; + meta["katago.numPolicyChannels"] = Global::intToString(numPolicyChannels); + meta["katago.numValueChannels"] = "3"; + int numScoreValueChannels = modelVersion >= 9 ? 6 : modelVersion >= 8 ? 4 : modelVersion >= 4 ? 2 : 1; + meta["katago.numScoreValueChannels"] = Global::intToString(numScoreValueChannels); + meta["katago.numOwnershipChannels"] = "1"; + if(modelVersion >= 15) { + meta["katago.metaEncoderVersion"] = "0"; + meta["katago.preferPassAliveUnderSuicideRules"] = "false"; + meta["katago.preferExcludeTerritoryAdjacentToAtari"] = "false"; + } + if(modelVersion >= 13) { + meta["katago.postProcess.tdScoreMultiplier"] = "20"; + meta["katago.postProcess.scoreMeanMultiplier"] = "20"; + meta["katago.postProcess.scoreStdevMultiplier"] = "20"; + meta["katago.postProcess.leadMultiplier"] = "20"; + meta["katago.postProcess.varianceTimeMultiplier"] = "40"; + meta["katago.postProcess.shorttermValueErrorMultiplier"] = "0.25"; + meta["katago.postProcess.shorttermScoreErrorMultiplier"] = "150"; + } + meta["katago.build.nnXLen"] = "19"; + meta["katago.build.nnYLen"] = "19"; + meta["katago.build.requireExactNNLen"] = "false"; + return meta; +} + +void setTensor(onnx::ValueInfoProto* vi, const string& name, int channels, int h, int w) { + vi->set_name(name); + onnx::TypeProto::Tensor* t = vi->mutable_type()->mutable_tensor_type(); + t->set_elem_type(onnx::TensorProto::FLOAT); + onnx::TensorShapeProto* shape = t->mutable_shape(); + shape->add_dim()->set_dim_param("batch"); + shape->add_dim()->set_dim_value(channels); + shape->add_dim()->set_dim_value(h); + shape->add_dim()->set_dim_value(w); +} + +// A structurally-conforming model for the given metadata: the right graph inputs and outputs, with +// every input except the final InputMask consumed by a node, as the input-declaration-order rule requires. +onnx::ModelProto makeModel(const map& meta) { + onnx::ModelProto model; + model.set_ir_version(onnx::IR_VERSION_2023_5_5); + onnx::OperatorSetIdProto* opset = model.add_opset_import(); + opset->set_domain(""); + opset->set_version(20); + for(const auto& kv: meta) { + onnx::StringStringEntryProto* p = model.add_metadata_props(); + p->set_key(kv.first); + p->set_value(kv.second); + } + const int nnXLen = Global::stringToInt(meta.at("katago.build.nnXLen")); + const int nnYLen = Global::stringToInt(meta.at("katago.build.nnYLen")); + const int spatialCh = Global::stringToInt(meta.at("katago.numInputChannels")); + const int globalCh = Global::stringToInt(meta.at("katago.numInputGlobalChannels")); + const int metaCh = Global::stringToInt(meta.at("katago.numInputMetaChannels")); + const int policyCh = Global::stringToInt(meta.at("katago.numPolicyChannels")); + const int valueCh = Global::stringToInt(meta.at("katago.numValueChannels")); + const int scoreCh = Global::stringToInt(meta.at("katago.numScoreValueChannels")); + const int ownershipCh = Global::stringToInt(meta.at("katago.numOwnershipChannels")); + + onnx::GraphProto* graph = model.mutable_graph(); + graph->set_name("onnxfiletest"); + setTensor(graph->add_input(), "InputSpatial", spatialCh, nnYLen, nnXLen); + setTensor(graph->add_input(), "InputGlobal", globalCh, 1, 1); + if(metaCh > 0) + setTensor(graph->add_input(), "InputMeta", metaCh, 1, 1); + setTensor(graph->add_input(), "InputMask", 1, nnYLen, nnXLen); + setTensor(graph->add_output(), "OutputPolicyPass", policyCh, 1, 1); + setTensor(graph->add_output(), "OutputPolicy", policyCh, nnYLen, nnXLen); + setTensor(graph->add_output(), "OutputValue", valueCh, 1, 1); + setTensor(graph->add_output(), "OutputScoreValue", scoreCh, 1, 1); + setTensor(graph->add_output(), "OutputOwnership", ownershipCh, nnYLen, nnXLen); + + for(int i = 0; i < graph->input_size(); i++) { + const string& name = graph->input(i).name(); + if(name == "InputMask") + continue; + onnx::NodeProto* node = graph->add_node(); + node->set_op_type("Identity"); + node->set_name(name + "/id"); + node->add_input(name); + node->add_output(name + "/idout"); + } + return model; +} + +void setMeta(onnx::ModelProto& model, const string& key, const string& value) { + for(int i = 0; i < model.metadata_props_size(); i++) { + if(model.metadata_props(i).key() == key) { + model.mutable_metadata_props(i)->set_value(value); + return; + } + } + onnx::StringStringEntryProto* p = model.add_metadata_props(); + p->set_key(key); + p->set_value(value); +} + +void removeMeta(onnx::ModelProto& model, const string& key) { + for(int i = 0; i < model.metadata_props_size(); i++) { + if(model.metadata_props(i).key() == key) { + model.mutable_metadata_props()->DeleteSubrange(i, 1); + return; + } + } + testAssert(false); +} + +onnx::ValueInfoProto* findIO(onnx::ModelProto& model, bool isInput, const string& name) { + onnx::GraphProto* graph = model.mutable_graph(); + const int n = isInput ? graph->input_size() : graph->output_size(); + for(int i = 0; i < n; i++) { + onnx::ValueInfoProto* vi = isInput ? graph->mutable_input(i) : graph->mutable_output(i); + if(vi->name() == name) + return vi; + } + testAssert(false); + return NULL; +} + +void writeModelFile(const onnx::ModelProto& model, const string& path) { + string bytes; + testAssert(model.SerializeToString(&bytes)); + ofstream out; + FileUtils::open(out, path, ios::out | ios::binary); + out.write(bytes.data(), (streamsize)bytes.size()); + out.close(); + testAssert(!out.fail()); +} + +void expectError(const std::function& f, const string& substring, const string& label) { + try { + f(); + } + catch(const StringError& e) { + if(string(e.what()).find(substring) == string::npos) + throw StringError("Test '" + label + "': error did not contain '" + substring + "', got: " + e.what()); + return; + } + throw StringError("Test '" + label + "': expected an error containing '" + substring + "'"); +} + +OnnxModelBuilder::LoadResult writeAndLoad(const onnx::ModelProto& model, const string& path, ModelDesc& descBuf) { + writeModelFile(model, path); + return OnnxModelBuilder::load(path, "", descBuf, NULL); +} + +void expectLoadError(const onnx::ModelProto& model, const string& path, const string& substring, const string& label) { + expectError( + [&]() { + ModelDesc desc; + writeAndLoad(model, path, desc); + }, + substring, label); +} + +} // namespace + +void Tests::runOnnxModelFileTests(const string& scratchDir, const string& modelFile) { + cout << "Running onnx model file tests" << endl; + MakeDir::make(scratchDir); + const string path = scratchDir + "/onnxmodelfiletest.onnx"; + + // ---- isOnnxFileName ---- + testAssert(OnnxModelBuilder::isOnnxFileName("foo.onnx")); + testAssert(OnnxModelBuilder::isOnnxFileName("FOO.ONNX")); + testAssert(OnnxModelBuilder::isOnnxFileName("foo.onnx.gz")); + testAssert(!OnnxModelBuilder::isOnnxFileName("foo.bin.gz")); + testAssert(!OnnxModelBuilder::isOnnxFileName("foo.gz")); + testAssert(!OnnxModelBuilder::isOnnxFileName("foo.onnxx")); + testAssert(!OnnxModelBuilder::isOnnxFileName("fooonnx")); + + // ---- checkRuntimeParams ---- + { + OnnxModelBuilder::LoadResult lr; + lr.buildParams.nnXLen = 19; + lr.buildParams.nnYLen = 19; + lr.buildParams.requireExactNNLen = false; + OnnxModelBuilder::checkRuntimeParams(lr, "m.onnx", 19, 19, false); + // A masked graph in an exact-size run is merely conservative, so it is allowed. + OnnxModelBuilder::checkRuntimeParams(lr, "m.onnx", 19, 19, true); + expectError( + [&]() { OnnxModelBuilder::checkRuntimeParams(lr, "m.onnx", 13, 13, false); }, + "was emitted for a 19x19 board buffer", "board size mismatch"); + lr.buildParams.requireExactNNLen = true; + OnnxModelBuilder::checkRuntimeParams(lr, "m.onnx", 19, 19, true); + expectError( + [&]() { OnnxModelBuilder::checkRuntimeParams(lr, "m.onnx", 19, 19, false); }, + "requireExactNNLen", "exact graph in masked run"); + } + + // ---- Happy path, model version 15 ---- + { + onnx::ModelProto model = makeModel(makeMeta(15, 2)); + ModelDesc desc; + OnnxModelBuilder::LoadResult lr = writeAndLoad(model, path, desc); + testAssert(desc.name == "onnxfiletest"); + testAssert(desc.modelVersion == 15); + testAssert(desc.numInputChannels == NNModelVersion::getNumSpatialFeatures(15)); + testAssert(desc.numInputGlobalChannels == NNModelVersion::getNumGlobalFeatures(15)); + testAssert(desc.numInputMetaChannels == 0); + testAssert(desc.numPolicyChannels == 2); + testAssert(desc.numValueChannels == 3); + testAssert(desc.numScoreValueChannels == 6); + testAssert(desc.numOwnershipChannels == 1); + testAssert(desc.metaEncoderVersion == 0); + testAssert(desc.preferPassAliveUnderSuicideRules == false); + testAssert(desc.preferExcludeTerritoryAdjacentToAtari == false); + testAssert(desc.postProcessParams.tdScoreMultiplier == 20.0); + testAssert(desc.postProcessParams.varianceTimeMultiplier == 40.0); + testAssert(desc.postProcessParams.shorttermValueErrorMultiplier == 0.25); + testAssert(desc.postProcessParams.shorttermScoreErrorMultiplier == 150.0); + testAssert(desc.postProcessParams.outputScaleMultiplier == 1.0f); + // Arch summary is present-but-unknown: the getters report the recorded zeros rather than + // walking the (empty) layer structure. + testAssert(desc.archSummary.present); + testAssert(desc.getTrunkSpatialConvDepth() == 0.0); + testAssert(desc.getNumParameters() == 0); + testAssert(!desc.hasAnyTransformerBlocks()); + testAssert(!desc.hasAnyNestedBottleneckBlocks()); + testAssert(desc.sha256.size() == 64); + testAssert(lr.metadataVersion == 1); + testAssert(lr.sourceSha256 == ""); + testAssert(lr.buildParams.nnXLen == 19 && lr.buildParams.nnYLen == 19); + testAssert(!lr.buildParams.requireExactNNLen); + testAssert(!lr.buildParams.transformerNHWC); + testAssert(!lr.buildParams.scale8Applied); + testAssert(lr.trunkTipAndHeadNodeNames.empty()); + testAssert(lr.rmsNormNodeNames.empty()); + testAssert(!lr.danglingInputNotDeclaredLast); + + // The reported sha256 is the file's own hash, so verifying against it succeeds. + ModelDesc desc2; + OnnxModelBuilder::load(path, desc.sha256, desc2, NULL); + expectError( + [&]() { + ModelDesc d; + OnnxModelBuilder::load(path, string(64, 'a'), d, NULL); + }, + "does not match the expected sha256", "wrong expected sha256"); + } + + // ---- Optional keys ---- + { + onnx::ModelProto model = makeModel(makeMeta(15, 2)); + setMeta(model, "katago.info.sourceSha256", "abc123"); + setMeta(model, "katago.postProcess.outputScaleMultiplier", "8"); + setMeta(model, "katago.build.requireExactNNLen", "true"); + setMeta(model, "katago.build.transformerNHWC", "true"); + setMeta(model, "katago.build.scale8Applied", "true"); + setMeta(model, "katago.info.arch.trunkSpatialConvDepth", "14.5"); + setMeta(model, "katago.info.arch.numParameters", "123456789012"); + setMeta(model, "katago.info.arch.hasAnyTransformerBlocks", "true"); + setMeta(model, "katago.info.arch.hasAnyNestedBottleneckBlocks", "true"); + setMeta(model, "katago.fp32Nodes.trunkTipAndHead", "node/a\nnode/b"); + setMeta(model, "katago.fp32Nodes.rmsNorm", "\nnode/c\n"); + // Only the must-understand namespace is policed: a reporting key from a newer writer and a key + // belonging to some other tool both have to load. + setMeta(model, "katago.info.someReportingKeyFromTheFuture", "ignored"); + setMeta(model, "some.other.tools.key", "ignored"); + ModelDesc desc; + OnnxModelBuilder::LoadResult lr = writeAndLoad(model, path, desc); + testAssert(lr.sourceSha256 == "abc123"); + testAssert(desc.postProcessParams.outputScaleMultiplier == 8.0f); + testAssert(lr.buildParams.requireExactNNLen); + testAssert(lr.buildParams.transformerNHWC); + testAssert(lr.buildParams.scale8Applied); + testAssert(desc.getTrunkSpatialConvDepth() == 14.5); + testAssert(desc.getNumParameters() == 123456789012LL); + testAssert(desc.hasAnyTransformerBlocks()); + testAssert(desc.hasAnyNestedBottleneckBlocks()); + testAssert(lr.trunkTipAndHeadNodeNames == (vector{"node/a", "node/b"})); + testAssert(lr.rmsNormNodeNames == (vector{"node/c"})); + } + + // ---- Old model version: version-gated keys become optional and default ---- + { + onnx::ModelProto model = makeModel(makeMeta(8, 1)); + ModelDesc desc; + writeAndLoad(model, path, desc); + testAssert(desc.modelVersion == 8); + testAssert(desc.numPolicyChannels == 1); + testAssert(desc.numScoreValueChannels == 4); + testAssert(desc.metaEncoderVersion == 0); + testAssert(!desc.preferPassAliveUnderSuicideRules); + testAssert(!desc.preferExcludeTerritoryAdjacentToAtari); + const ModelPostProcessParams dflt; + testAssert(desc.postProcessParams.tdScoreMultiplier == dflt.tdScoreMultiplier); + testAssert(desc.postProcessParams.leadMultiplier == dflt.leadMultiplier); + testAssert(desc.postProcessParams.shorttermValueErrorMultiplier == dflt.shorttermValueErrorMultiplier); + testAssert(desc.postProcessParams.shorttermScoreErrorMultiplier == dflt.shorttermScoreErrorMultiplier); + testAssert(desc.postProcessParams.outputScaleMultiplier == dflt.outputScaleMultiplier); + } + + // ---- 4 policy channels are allowed from model version 16 on ---- + { + onnx::ModelProto model = makeModel(makeMeta(16, 4)); + ModelDesc desc; + writeAndLoad(model, path, desc); + testAssert(desc.numPolicyChannels == 4); + } + + // ---- HumanSL-style model with an InputMeta input ---- + { + map meta = makeMeta(15, 2); + meta["katago.metaEncoderVersion"] = "1"; + meta["katago.numInputMetaChannels"] = Global::intToString(NNModelVersion::getNumInputMetaChannels(1)); + onnx::ModelProto model = makeModel(meta); + ModelDesc desc; + OnnxModelBuilder::LoadResult lr = writeAndLoad(model, path, desc); + testAssert(desc.metaEncoderVersion == 1); + testAssert(desc.numInputMetaChannels == NNModelVersion::getNumInputMetaChannels(1)); + testAssert(!lr.danglingInputNotDeclaredLast); + } + + // ---- The rules-related model options reach the ModelDesc when set ---- + { + map meta = makeMeta(15, 2); + meta["katago.preferPassAliveUnderSuicideRules"] = "true"; + meta["katago.preferExcludeTerritoryAdjacentToAtari"] = "true"; + onnx::ModelProto model = makeModel(meta); + ModelDesc desc; + writeAndLoad(model, path, desc); + testAssert(desc.preferPassAliveUnderSuicideRules); + testAssert(desc.preferExcludeTerritoryAdjacentToAtari); + } + + // ---- Metadata error paths ---- + const onnx::ModelProto base = makeModel(makeMeta(15, 2)); + auto withMeta = [&](const string& key, const string& value) { + onnx::ModelProto m = base; + setMeta(m, key, value); + return m; + }; + auto withoutMeta = [&](const string& key) { + onnx::ModelProto m = base; + removeMeta(m, key); + return m; + }; + expectLoadError(withoutMeta("katago.metadataVersion"), path, "carries no KataGo metadata", "metadata block missing"); + expectLoadError(withMeta("katago.metadataVersion", "99"), path, "understands up to version", "metadata version too new"); + expectLoadError(withMeta("katago.metadataVersion", "0"), path, "no longer reads", "metadata version too old"); + expectLoadError(withMeta("katago.metadataVersion", "banana"), path, "is not an integer", "metadata version not an int"); + expectLoadError(withoutMeta("katago.numValueChannels"), path, "missing required key", "required key missing"); + expectLoadError(withMeta("katago.numValueChannels", "4"), path, "requires 3", "wrong channel count"); + expectLoadError(withMeta("katago.modelVersion", "2"), path, "no longer supported", "model version too old"); + expectLoadError( + withMeta("katago.modelVersion", Global::intToString(NNModelVersion::latestModelVersionImplemented + 1)), + path, "requires a newer KataGo", "model version too new"); + expectLoadError(withMeta("katago.name", ""), path, "name is empty", "empty name"); + expectLoadError(withMeta("katago.name", "bad/name"), path, "alphanumeric", "name with bad chars"); + expectLoadError(withMeta("katago.name", string(97, 'x')), path, "too long", "name too long"); + expectLoadError(withMeta("katago.numPolicyChannels", "4"), path, "not supported for model version", "4 policy channels before v16"); + expectLoadError(withMeta("katago.postProcess.leadMultiplier", "0"), path, "positive finite", "zero multiplier"); + expectLoadError(withMeta("katago.postProcess.leadMultiplier", "-5"), path, "positive finite", "negative multiplier"); + expectLoadError(withoutMeta("katago.postProcess.leadMultiplier"), path, "missing required key", "postProcess required at v13+"); + expectLoadError(withMeta("katago.metaEncoderVersion", "2"), path, "not implemented", "unknown metaEncoderVersion"); + expectLoadError(withMeta("katago.numInputMetaChannels", "5"), path, "numInputMetaChannels", "meta channels without encoder"); + expectLoadError(withMeta("katago.build.nnXLen", "1"), path, "outside the supported range", "board size too small"); + expectLoadError( + withMeta("katago.build.nnXLen", Global::intToString(NNPos::MAX_BOARD_LEN + 1)), + path, "outside the supported range", "board size too large"); + expectLoadError(withoutMeta("katago.build.nnXLen"), path, "missing required key", "build params missing"); + expectLoadError(withMeta("katago.preferPassAliveUnderSuicideRules", "maybe"), path, "is not a boolean", "bad boolean"); + expectLoadError( + withoutMeta("katago.preferExcludeTerritoryAdjacentToAtari"), + path, "missing required key", "rules model option missing at v15+"); + expectLoadError( + withMeta("katago.someKeyFromTheFuture", "surprise"), + path, "does not know: katago.someKeyFromTheFuture", "unknown must-understand key"); + // A misspelled key is an unknown key, which is the whole point of policing the namespace: the + // required-key check alone would only report the real key as missing. + expectLoadError( + withMeta("katago.preferPassAliveUnderSuicideRule", "true"), + path, "does not know: katago.preferPassAliveUnderSuicideRule", "misspelled key"); + + // ---- Graph/metadata mismatch error paths ---- + { + onnx::ModelProto m = base; + testAssert(m.graph().input(m.graph().input_size() - 1).name() == "InputMask"); + m.mutable_graph()->mutable_input()->RemoveLast(); + expectLoadError(m, path, "no input named 'InputMask'", "missing graph input"); + } + { + onnx::ModelProto m = base; + setTensor(m.mutable_graph()->add_input(), "Bogus", 3, 1, 1); + expectLoadError(m, path, "unexpected input", "extra graph input"); + } + { + onnx::ModelProto m = base; + setTensor(m.mutable_graph()->add_output(), "OutputBogus", 3, 1, 1); + expectLoadError(m, path, "unexpected output", "extra graph output"); + } + { + onnx::ModelProto m = base; + findIO(m, false, "OutputValue")->mutable_type()->mutable_tensor_type()->set_elem_type(onnx::TensorProto::INT32); + expectLoadError(m, path, "binds float32", "wrong element type"); + } + { + onnx::ModelProto m = base; + onnx::TensorShapeProto::Dimension* dim = + findIO(m, true, "InputSpatial")->mutable_type()->mutable_tensor_type()->mutable_shape()->mutable_dim(0); + dim->clear_dim_param(); + dim->set_dim_value(1); + expectLoadError(m, path, "fixed batch dimension", "fixed batch"); + } + { + onnx::ModelProto m = base; + findIO(m, false, "OutputPolicy")->mutable_type()->mutable_tensor_type()->mutable_shape()->mutable_dim(2)->set_dim_value(13); + expectLoadError(m, path, "height dimension 13", "wrong spatial size"); + } + { + onnx::ModelProto m = base; + findIO(m, true, "InputGlobal")->mutable_type()->mutable_tensor_type()->mutable_shape()->mutable_dim()->RemoveLast(); + expectLoadError(m, path, "expected rank 4", "wrong rank"); + } + { + onnx::ModelProto m = base; + onnx::TensorShapeProto::Dimension* dim = + findIO(m, true, "InputSpatial")->mutable_type()->mutable_tensor_type()->mutable_shape()->mutable_dim(1); + dim->clear_dim_value(); + dim->set_dim_param("c"); + expectLoadError(m, path, "symbolic channel", "symbolic channel dim"); + } + { + onnx::ModelProto m = base; + onnx::ValueInfoProto maskCopy = *findIO(m, true, "InputMask"); + *m.mutable_graph()->add_input() = maskCopy; + expectLoadError(m, path, "more than once", "duplicate input"); + } + + // ---- Input declaration order and the dangling-input flag ---- + { + // InputMask declared first: it is consumed by nothing and sits ahead of consumed inputs, the + // exact hazard for the OpenVINO execution provider. + onnx::ModelProto m = base; + m.mutable_graph()->mutable_input()->SwapElements(0, m.graph().input_size() - 1); + ModelDesc desc; + OnnxModelBuilder::LoadResult lr = writeAndLoad(m, path, desc); + testAssert(lr.danglingInputNotDeclaredLast); + } + { + // Initializers redundantly declared as graph inputs (a legacy ONNX convention) are weights, not + // IO: they must not count as unexpected inputs. + onnx::ModelProto m = base; + onnx::TensorProto* init = m.mutable_graph()->add_initializer(); + init->set_name("SomeWeight"); + init->set_data_type(onnx::TensorProto::FLOAT); + init->add_dims(1); + init->add_float_data(1.0f); + setTensor(m.mutable_graph()->add_input(), "SomeWeight", 1, 1, 1); + // Keep InputMask last and consume the weight, so the declaration-order rule is still satisfied. + m.mutable_graph()->mutable_input()->SwapElements(m.graph().input_size() - 2, m.graph().input_size() - 1); + onnx::NodeProto* node = m.mutable_graph()->add_node(); + node->set_op_type("Identity"); + node->set_name("SomeWeight/id"); + node->add_input("SomeWeight"); + node->add_output("SomeWeight/idout"); + ModelDesc desc; + OnnxModelBuilder::LoadResult lr = writeAndLoad(m, path, desc); + testAssert(!lr.danglingInputNotDeclaredLast); + } + + // ---- Not an ONNX file at all ---- + { + ofstream out; + FileUtils::open(out, path, ios::out | ios::binary); + out << "this is not an onnx file"; + out.close(); + expectError( + [&]() { + ModelDesc desc; + OnnxModelBuilder::load(path, "", desc, NULL); + }, + "could not be parsed as an ONNX ModelProto", "garbage file"); + } + + // ---- Round trip through the real emitter ---- + if(modelFile != "") { + cout << "Running onnx dump/load round trip on " << modelFile << endl; + ModelDesc srcDesc; + ModelDesc::loadFromFileMaybeGZipped(modelFile, srcDesc, ""); + OnnxModelBuilder::BuildParams buildParams; + buildParams.nnXLen = 19; + buildParams.nnYLen = 19; + buildParams.requireExactNNLen = false; + buildParams.transformerNHWC = true; + buildParams.scale8Applied = srcDesc.applyScale8ToReduceActivations(); + OnnxModelBuilder::Result result = OnnxModelBuilder::build(srcDesc, buildParams, NULL); + { + ofstream out; + FileUtils::open(out, path, ios::out | ios::binary); + out.write(result.serializedModel.data(), (streamsize)result.serializedModel.size()); + out.close(); + testAssert(!out.fail()); + } + ModelDesc desc; + OnnxModelBuilder::LoadResult lr = OnnxModelBuilder::load(path, "", desc, NULL); + testAssert(desc.name == srcDesc.name); + testAssert(desc.modelVersion == srcDesc.modelVersion); + testAssert(desc.numInputChannels == srcDesc.numInputChannels); + testAssert(desc.numInputGlobalChannels == srcDesc.numInputGlobalChannels); + testAssert(desc.numInputMetaChannels == srcDesc.numInputMetaChannels); + testAssert(desc.numPolicyChannels == srcDesc.numPolicyChannels); + testAssert(desc.numValueChannels == srcDesc.numValueChannels); + testAssert(desc.numScoreValueChannels == srcDesc.numScoreValueChannels); + testAssert(desc.numOwnershipChannels == srcDesc.numOwnershipChannels); + testAssert(desc.metaEncoderVersion == srcDesc.metaEncoderVersion); + testAssert(desc.preferPassAliveUnderSuicideRules == srcDesc.preferPassAliveUnderSuicideRules); + testAssert(desc.preferExcludeTerritoryAdjacentToAtari == srcDesc.preferExcludeTerritoryAdjacentToAtari); + const ModelPostProcessParams& a = desc.postProcessParams; + const ModelPostProcessParams& b = srcDesc.postProcessParams; + testAssert(a.tdScoreMultiplier == b.tdScoreMultiplier); + testAssert(a.scoreMeanMultiplier == b.scoreMeanMultiplier); + testAssert(a.scoreStdevMultiplier == b.scoreStdevMultiplier); + testAssert(a.leadMultiplier == b.leadMultiplier); + testAssert(a.varianceTimeMultiplier == b.varianceTimeMultiplier); + testAssert(a.shorttermValueErrorMultiplier == b.shorttermValueErrorMultiplier); + testAssert(a.shorttermScoreErrorMultiplier == b.shorttermScoreErrorMultiplier); + testAssert(a.outputScaleMultiplier == b.outputScaleMultiplier); + testAssert(lr.metadataVersion >= 1); + testAssert(lr.sourceSha256 == srcDesc.sha256); + testAssert(lr.buildParams.nnXLen == buildParams.nnXLen && lr.buildParams.nnYLen == buildParams.nnYLen); + testAssert(lr.buildParams.requireExactNNLen == buildParams.requireExactNNLen); + // build() normalizes NHWC to false for models with no transformer blocks. + testAssert(lr.buildParams.transformerNHWC == srcDesc.hasAnyTransformerBlocks()); + testAssert(lr.buildParams.scale8Applied == buildParams.scale8Applied); + testAssert(lr.trunkTipAndHeadNodeNames == result.trunkTipAndHeadNodeNames); + testAssert(lr.rmsNormNodeNames == result.rmsNormNodeNames); + testAssert(!lr.danglingInputNotDeclaredLast); + // The arch summary recorded in the metadata reproduces what walking the layer structure gives. + testAssert(desc.getTrunkSpatialConvDepth() == srcDesc.getTrunkSpatialConvDepth()); + testAssert(desc.getNumParameters() == srcDesc.getNumParameters()); + testAssert(desc.hasAnyTransformerBlocks() == srcDesc.hasAnyTransformerBlocks()); + testAssert(desc.hasAnyNestedBottleneckBlocks() == srcDesc.hasAnyNestedBottleneckBlocks()); + } + + cout << "Onnx model file tests passed" << endl; +} + +#else // no TensorRT or ONNX backend + +void Tests::runOnnxModelFileTests(const std::string& scratchDir, const std::string& modelFile) { + (void)scratchDir; + (void)modelFile; + throw StringError( + "runonnxmodelfiletests requires a build with the TensorRT or ONNX backend, since those are the " + "backends that read .onnx model files."); +} + +#endif diff --git a/cpp/tests/testownership.cpp b/cpp/tests/testownership.cpp index f487148cfb..4fcbb40b8d 100644 --- a/cpp/tests/testownership.cpp +++ b/cpp/tests/testownership.cpp @@ -41,7 +41,7 @@ void Tests::runOwnershipTests(const string& configFile, const string& modelFile) auto runOnBoard = [&](const Board& board, const Rules& rules) { Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); int64_t numVisits = 100; vector ownership = PlayUtils::computeOwnership(bot,board,hist,nextPla,numVisits); cout << "=================================================================================" << endl; diff --git a/cpp/tests/testpassalivesuicide.cpp b/cpp/tests/testpassalivesuicide.cpp index e209aac1e8..8247aeac19 100644 --- a/cpp/tests/testpassalivesuicide.cpp +++ b/cpp/tests/testpassalivesuicide.cpp @@ -43,13 +43,13 @@ oox. //Basic flag behavior and effect on scoring { - BoardHistory hist(board,P_BLACK,rules,0,false); - testAssert(!hist.alwaysComputePassAliveUnderSuicideRules); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + testAssert(!hist.modes.alwaysComputePassAliveUnderSuicideRules); testAssert(!hist.suicideLegalForPassAlive()); - BoardHistory histFlagged(board,P_BLACK,rules,0,false); - histFlagged.setAlwaysComputePassAliveUnderSuicideRules(true); - testAssert(histFlagged.alwaysComputePassAliveUnderSuicideRules); + BoardHistory histFlagged(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + histFlagged.setModes(BoardHistoryModes(true,false)); + testAssert(histFlagged.modes.alwaysComputePassAliveUnderSuicideRules); testAssert(histFlagged.suicideLegalForPassAlive()); //The flag changes the situation-and-rules hash exactly when the rules don't already have suicide legal @@ -58,11 +58,11 @@ oox. testAssert(hashOff != hashOn); //And changes area scoring on this position - BoardHistory histScore(board,P_BLACK,rules,0,false); + BoardHistory histScore(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); Board boardCopy = board; histScore.endAndScoreGameNow(boardCopy); - BoardHistory histScoreFlagged(board,P_BLACK,rules,0,false); - histScoreFlagged.setAlwaysComputePassAliveUnderSuicideRules(true); + BoardHistory histScoreFlagged(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + histScoreFlagged.setModes(BoardHistoryModes(true,false)); Board boardCopy2 = board; histScoreFlagged.endAndScoreGameNow(boardCopy2); testAssert(histScore.isScored && histScoreFlagged.isScored); @@ -71,11 +71,11 @@ oox. //And changes territory scoring too (the countTerritoryAreaScoreWhiteMinusBlack path) Rules japRules = Rules::parseRules("japanese"); testAssert(!japRules.multiStoneSuicideLegal); - BoardHistory histTerrScore(board,P_BLACK,japRules,0,false); + BoardHistory histTerrScore(board,P_BLACK,japRules,0,BoardHistoryModes(false,false)); Board boardCopy3 = board; histTerrScore.endAndScoreGameNow(boardCopy3); - BoardHistory histTerrScoreFlagged(board,P_BLACK,japRules,0,false); - histTerrScoreFlagged.setAlwaysComputePassAliveUnderSuicideRules(true); + BoardHistory histTerrScoreFlagged(board,P_BLACK,japRules,0,BoardHistoryModes(false,false)); + histTerrScoreFlagged.setModes(BoardHistoryModes(true,false)); Board boardCopy4 = board; histTerrScoreFlagged.endAndScoreGameNow(boardCopy4); testAssert(histTerrScore.isScored && histTerrScoreFlagged.isScored); @@ -83,23 +83,23 @@ oox. //Copying and clear() preserve the flag BoardHistory copied(histFlagged); - testAssert(copied.alwaysComputePassAliveUnderSuicideRules); + testAssert(copied.modes.alwaysComputePassAliveUnderSuicideRules); BoardHistory assigned; assigned = histFlagged; - testAssert(assigned.alwaysComputePassAliveUnderSuicideRules); + testAssert(assigned.modes.alwaysComputePassAliveUnderSuicideRules); BoardHistory cleared(histFlagged); cleared.clear(board,P_BLACK,rules,0); - testAssert(cleared.alwaysComputePassAliveUnderSuicideRules); - testAssert(histFlagged.copyToInitial().alwaysComputePassAliveUnderSuicideRules); + testAssert(cleared.modes.alwaysComputePassAliveUnderSuicideRules); + testAssert(histFlagged.copyToInitial().modes.alwaysComputePassAliveUnderSuicideRules); } //When the rules already have suicide legal, the flag is a no-op for hashing and scoring { Rules tromp = Rules::parseRules("tromp-taylor"); testAssert(tromp.multiStoneSuicideLegal); - BoardHistory hist(board,P_BLACK,tromp,0,false); - BoardHistory histFlagged(board,P_BLACK,tromp,0,false); - histFlagged.setAlwaysComputePassAliveUnderSuicideRules(true); + BoardHistory hist(board,P_BLACK,tromp,0,BoardHistoryModes(false,false)); + BoardHistory histFlagged(board,P_BLACK,tromp,0,BoardHistoryModes(false,false)); + histFlagged.setModes(BoardHistoryModes(true,false)); testAssert(hist.suicideLegalForPassAlive() && histFlagged.suicideLegalForPassAlive()); Hash128 hashOff = BoardHistory::getSituationRulesAndKoHash(board,hist,P_BLACK,0.5); Hash128 hashOn = BoardHistory::getSituationRulesAndKoHash(board,histFlagged,P_BLACK,0.5); @@ -108,9 +108,9 @@ oox. //MiscNNInputParams override behavior for the nn cache hash { - BoardHistory hist(board,P_BLACK,rules,0,false); - BoardHistory histFlagged(board,P_BLACK,rules,0,false); - histFlagged.setAlwaysComputePassAliveUnderSuicideRules(true); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + BoardHistory histFlagged(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + histFlagged.setModes(BoardHistoryModes(true,false)); MiscNNInputParams noOverride; MiscNNInputParams forceOn; @@ -149,61 +149,61 @@ oox. { Search search(params,nnEval,&logger,"passAliveStampTestSeed"); - testAssert(!search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(!search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); testAssert(!Search::resolveAlwaysComputePassAliveUnderSuicideRules(params,nnEval)); //Setting a history with the flag on gets re-stamped to the search's own resolution - BoardHistory histFlagged(board,P_BLACK,rules,0,false); - histFlagged.setAlwaysComputePassAliveUnderSuicideRules(true); + BoardHistory histFlagged(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + histFlagged.setModes(BoardHistoryModes(true,false)); search.setPosition(P_BLACK,board,histFlagged); - testAssert(!search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(!search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); //Forcing the param stamps the flag on, even though the last set position had it off SearchParams paramsOn = params; paramsOn.alwaysComputePassAliveUnderSuicideRules = enabled_t::True; testAssert(Search::resolveAlwaysComputePassAliveUnderSuicideRules(paramsOn,nnEval)); search.setParams(paramsOn); - testAssert(search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); //And even the no-clearing param setter keeps the invariant search.setParamsNoClearing(params); - testAssert(!search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(!search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); search.setParamsNoClearing(paramsOn); - testAssert(search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); //setPlayerAndClearHistory and setKomiIfNew preserve it too search.setPlayerAndClearHistory(P_WHITE); - testAssert(search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); search.setKomiIfNew(5.5f); - testAssert(search.getRootHist().alwaysComputePassAliveUnderSuicideRules); + testAssert(search.getRootHist().modes.alwaysComputePassAliveUnderSuicideRules); } nnEval->killServerThreads(); delete nnEval; } - //Books record the pass-alive computation mode and stamp it on their histories. + //Books record the BoardHistoryModes and stamp them on their histories. //Mode-true books require book version >= 3 (so old binaries reject them cleanly) { Rules bookRules = Rules::parseRules("chinese"); Board initialBoard(9,9); BookParams bparams; for(bool mode : {false,true}) { - Book book(Book::LATEST_BOOK_VERSION, initialBoard, bookRules, P_BLACK, 3, mode, bparams); - testAssert(book.alwaysComputePassAliveUnderSuicideRules == mode); - testAssert(book.getInitialHist().alwaysComputePassAliveUnderSuicideRules == mode); + Book book(Book::LATEST_BOOK_VERSION, initialBoard, bookRules, P_BLACK, 3, BoardHistoryModes(mode,false), bparams); + testAssert(book.historyModes.alwaysComputePassAliveUnderSuicideRules == mode); + testAssert(book.getInitialHist().modes.alwaysComputePassAliveUnderSuicideRules == mode); std::ostringstream saved; book.saveToStream(saved); { std::istringstream headerIn(saved.str()); - testAssert(Book::readAlwaysComputePassAliveUnderSuicideRulesOfHeader(headerIn) == mode); + testAssert(Book::readHistoryModesOfHeader(headerIn) == BoardHistoryModes(mode,false)); } std::istringstream loadIn(saved.str()); Book* loaded = Book::loadFromStream(loadIn); - testAssert(loaded->alwaysComputePassAliveUnderSuicideRules == mode); + testAssert(loaded->historyModes.alwaysComputePassAliveUnderSuicideRules == mode); testAssert(loaded->bookVersion == Book::LATEST_BOOK_VERSION); - testAssert(loaded->getInitialHist().alwaysComputePassAliveUnderSuicideRules == mode); + testAssert(loaded->getInitialHist().modes.alwaysComputePassAliveUnderSuicideRules == mode); delete loaded; } @@ -211,7 +211,7 @@ oox. { bool threw = false; try { - Book book(2, initialBoard, bookRules, P_BLACK, 3, true, bparams); + Book book(2, initialBoard, bookRules, P_BLACK, 3, BoardHistoryModes(true,false), bparams); } catch(const StringError&) { threw = true; @@ -221,7 +221,7 @@ oox. //A pre-migration book file (header key absent entirely, version 2) loads as mode false. { - Book book(2, initialBoard, bookRules, P_BLACK, 3, false, bparams); + Book book(2, initialBoard, bookRules, P_BLACK, 3, BoardHistoryModes(), bparams); std::ostringstream saved; book.saveToStream(saved); @@ -233,12 +233,12 @@ oox. { std::istringstream headerIn(contents); - testAssert(!Book::readAlwaysComputePassAliveUnderSuicideRulesOfHeader(headerIn)); + testAssert(Book::readHistoryModesOfHeader(headerIn) == BoardHistoryModes()); } std::istringstream loadIn(contents); Book* loaded = Book::loadFromStream(loadIn); - testAssert(!loaded->alwaysComputePassAliveUnderSuicideRules); - testAssert(loaded->getInitialHist().alwaysComputePassAliveUnderSuicideRules == false); + testAssert(!loaded->historyModes.alwaysComputePassAliveUnderSuicideRules); + testAssert(loaded->getInitialHist().modes.alwaysComputePassAliveUnderSuicideRules == false); delete loaded; } } @@ -268,7 +268,7 @@ oox. //Suicide-illegal rules: the modes must hit distinct cache entries. { - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); NNResultBuf buf; nnEval->evaluate(board,hist,P_BLACK,noOverride,buf,false,false); std::shared_ptr outPlain = std::move(buf.result); @@ -286,7 +286,7 @@ oox. //Suicide-legal rules: the override is a no-op and must share the cache entry. { Rules tromp = Rules::parseRules("tromp-taylor"); - BoardHistory hist(board,P_BLACK,tromp,0,false); + BoardHistory hist(board,P_BLACK,tromp,0,BoardHistoryModes(false,false)); NNResultBuf buf; nnEval->evaluate(board,hist,P_BLACK,noOverride,buf,false,false); std::shared_ptr outPlain = std::move(buf.result); diff --git a/cpp/tests/testrules.cpp b/cpp/tests/testrules.cpp index d4b3efb968..653f685678 100644 --- a/cpp/tests/testrules.cpp +++ b/cpp/tests/testrules.cpp @@ -131,7 +131,7 @@ void Tests::runRulesTests() { rules.komi = 0.5f; rules.multiStoneSuicideLegal = true; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(1,1,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(2,2,board.x_size), P_WHITE, __LINE__); @@ -188,7 +188,7 @@ HASH: C5B7EC66E875EF237ADC456CEE8436EA rules.komi = 0.5f; rules.multiStoneSuicideLegal = true; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(1,1,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(2,2,board.x_size), P_WHITE, __LINE__); @@ -314,7 +314,7 @@ oooo.o Board board(baseBoard); Rules rules(baseRules); rules.koRule = Rules::KO_SIMPLE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(5,1,board.x_size), P_BLACK, __LINE__); out << "After black ko capture:" << endl; @@ -390,7 +390,7 @@ isResignation: 0 Board board(baseBoard); Rules rules(baseRules); rules.koRule = Rules::KO_POSITIONAL; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(5,1,board.x_size), P_BLACK, __LINE__); out << "After black ko capture:" << endl; @@ -474,7 +474,7 @@ Illegal: (5,1) X Board board(baseBoard); Rules rules(baseRules); rules.koRule = Rules::KO_SITUATIONAL; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(5,1,board.x_size), P_BLACK, __LINE__); out << "After black ko capture:" << endl; @@ -550,7 +550,7 @@ Illegal: (0,0) X testAssert(suc); Rules rules(baseRules); rules.koRule = Rules::KO_SPIGHT; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(5,1,board.x_size), P_BLACK, __LINE__); out << "After black ko capture:" << endl; @@ -677,7 +677,7 @@ xx.... Board board(baseBoard); Rules rules(baseRules); rules.koRule = koRulesToTest[i]; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(4,0,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -776,7 +776,7 @@ xoooxxoo rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(2,4,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(4,4,board.x_size), P_WHITE, __LINE__); @@ -815,7 +815,7 @@ ooooooo rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(3,1,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(1,2,board.x_size), P_WHITE, __LINE__); @@ -858,7 +858,7 @@ ooooooo rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(3,1,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(1,2,board.x_size), P_WHITE, __LINE__); @@ -889,7 +889,7 @@ ooooooo rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -936,7 +936,7 @@ Ko recap blocked at F5 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -1004,7 +1004,7 @@ Ko recap blocked at D3 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -1085,7 +1085,7 @@ HASH: 4F0DF41FC22ACBFAEBB9F5D2052C74DD rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -1236,7 +1236,7 @@ x.oxxxx rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichTaxRule]; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; makeMoveAssertLegal(hist, board, Location::getLoc(5,3,board.x_size), P_BLACK, __LINE__); @@ -1305,7 +1305,7 @@ x.oxxxx rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichTaxRule]; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; makeMoveAssertLegal(hist, board, Location::getLoc(5,3,board.x_size), P_BLACK, __LINE__); @@ -1374,7 +1374,7 @@ x.oxxxx rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichTaxRule]; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; makeMoveAssertLegal(hist, board, Location::getLoc(5,3,board.x_size), P_BLACK, __LINE__); @@ -1446,7 +1446,7 @@ x.oxxxx rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichTaxRule]; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; makeMoveAssertLegal(hist, board, Location::getLoc(5,3,board.x_size), P_BLACK, __LINE__); @@ -1520,7 +1520,7 @@ o.xoo.x rules.komi = -0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichTaxRule]; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; makeMoveAssertLegal(hist, board, Location::getLoc(6,5,board.x_size), P_WHITE, __LINE__); @@ -1590,7 +1590,7 @@ o.xoo.x rules.komi = -0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = taxRules[whichTaxRule]; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -1644,6 +1644,106 @@ Score: 8.5 expect(name,out,expected); } + //Same as the two "Fill seki liberties" tests above but with excludeTerritoryAdjacentToAtari on + //(rules version 3 scoring) - only TAX_NONE differs from those tests, so only it is run. + { + const char* name = "Fill seki liberties in main phase (v3 excludeTerritoryAdjacentToAtari)"; + Board board = Board::parseBoard(7,7,R"%%( +...oxx. +oooox.x +xxxxoxx +o.xoooo +.oxox.o +oxxo.x. +o.xoo.x +)%%"); + Rules rules; + rules.koRule = Rules::KO_POSITIONAL; + rules.scoringRule = Rules::SCORING_TERRITORY; + rules.komi = -0.5f; + rules.multiStoneSuicideLegal = false; + rules.taxRule = Rules::TAX_NONE; + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,true)); + + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(6,5,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(5,6,board.x_size), P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(0,4,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(6,0,board.x_size), P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(1,0,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(4,5,board.x_size), P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(5,4,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + string expected = R"%%( +Score: 1.5 +Score: 1.5 +Score: 1.5 +Score: 0.5 +Score: 2.5 +Score: 1.5 +Score: 1.5 +Score: 11.5 +)%%"; + expect(name,out,expected); + } + + { + const char* name = "Fill seki liberties in encore 2 (v3 excludeTerritoryAdjacentToAtari)"; + Board board = Board::parseBoard(7,7,R"%%( +...oxx. +oooox.x +xxxxoxx +o.xoooo +.oxox.o +oxxo.x. +o.xoo.x +)%%"); + Rules rules; + rules.koRule = Rules::KO_POSITIONAL; + rules.scoringRule = Rules::SCORING_TERRITORY; + rules.komi = -0.5f; + rules.multiStoneSuicideLegal = false; + rules.taxRule = Rules::TAX_NONE; + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,true)); + + makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); + makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); + makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); + makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(6,5,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(5,6,board.x_size), P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(0,4,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(6,0,board.x_size), P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(1,0,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(4,5,board.x_size), P_BLACK, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + makeMoveAssertLegal(hist, board, Location::getLoc(5,4,board.x_size), P_WHITE, __LINE__); + out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; + string expected = R"%%( +Score: 1.5 +Score: 1.5 +Score: 1.5 +Score: 0.5 +Score: 2.5 +Score: 2.5 +Score: 2.5 +Score: 12.5 +)%%"; + expect(name,out,expected); + } + { const char* name = "Area scoring with button"; @@ -1665,7 +1765,7 @@ Score: 8.5 rules.multiStoneSuicideLegal = false; rules.komi = 2.5f; rules.hasButton = buttonRule[whichRule]; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); out << "Score: " << finalScoreIfGameEndedNow(hist,board) << endl; makeMoveAssertLegal(hist, board, Location::getLoc(3,4,board.x_size), P_BLACK, __LINE__); @@ -1728,7 +1828,7 @@ Score: -3 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); Hash128 hasha; Hash128 hashb; Hash128 hashc; @@ -1880,7 +1980,7 @@ ooo.... rules.komi = 0.5f; rules.multiStoneSuicideLegal = true; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2004,7 +2104,7 @@ oo..... rules.komi = 0.5f; rules.multiStoneSuicideLegal = true; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -2050,7 +2150,7 @@ xxxxxxx rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -2109,7 +2209,7 @@ xxxo...oo { rules.scoringRule = Rules::SCORING_AREA; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); testAssert(hist.isGameFinished == true); @@ -2118,7 +2218,7 @@ xxxo...oo { rules.scoringRule = Rules::SCORING_AREA; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); testAssert(hist.isGameFinished == true); @@ -2127,7 +2227,7 @@ xxxo...oo { rules.scoringRule = Rules::SCORING_AREA; rules.taxRule = Rules::TAX_ALL; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); testAssert(hist.isGameFinished == true); @@ -2136,7 +2236,7 @@ xxxo...oo { rules.scoringRule = Rules::SCORING_TERRITORY; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2149,7 +2249,7 @@ xxxo...oo { rules.scoringRule = Rules::SCORING_TERRITORY; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2162,7 +2262,7 @@ xxxo...oo { rules.scoringRule = Rules::SCORING_TERRITORY; rules.taxRule = Rules::TAX_ALL; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2223,7 +2323,7 @@ xxxoxxxoo { rules.scoringRule = Rules::SCORING_AREA; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); testAssert(hist.isGameFinished == true); @@ -2232,7 +2332,7 @@ xxxoxxxoo { rules.scoringRule = Rules::SCORING_AREA; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); testAssert(hist.isGameFinished == true); @@ -2241,7 +2341,7 @@ xxxoxxxoo { rules.scoringRule = Rules::SCORING_AREA; rules.taxRule = Rules::TAX_ALL; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); testAssert(hist.isGameFinished == true); @@ -2250,7 +2350,7 @@ xxxoxxxoo { rules.scoringRule = Rules::SCORING_TERRITORY; rules.taxRule = Rules::TAX_NONE; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2263,7 +2363,7 @@ xxxoxxxoo { rules.scoringRule = Rules::SCORING_TERRITORY; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2276,7 +2376,7 @@ xxxoxxxoo { rules.scoringRule = Rules::SCORING_TERRITORY; rules.taxRule = Rules::TAX_ALL; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -2331,7 +2431,7 @@ xxo rules.taxRule = Rules::TAX_NONE; { - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); hist.printDebugInfo(out,board); @@ -2350,7 +2450,7 @@ xxo { out << "-----------------------" << endl; out << "Preventing encore" << endl; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__, true); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__, true); hist.printDebugInfo(out,board); @@ -2625,9 +2725,9 @@ Last moves pass pass pass pass rules.komi = 0.5f; rules.taxRule = Rules::TAX_SEKI; rules.multiStoneSuicideLegal = false; - stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); rules.multiStoneSuicideLegal = true; - stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 4 ..X. NPO PS0 E0 0000 0000 @@ -2769,11 +2869,11 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,false),P_BLACK,false); - stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,false),P_BLACK,false); + stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,false); + stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,false); rules.multiStoneSuicideLegal = true; - stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,false),P_BLACK,false); - stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,false),P_BLACK,false); + stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,false); + stressTest(emptyBoard22,BoardHistory(emptyBoard22,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,false); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 4 X... NPO PS0 E0 0000 0000 @@ -2846,7 +2946,7 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - stressTest(koBoard71,BoardHistory(koBoard71,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(koBoard71,BoardHistory(koBoard71,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 3 .O.OX.O NPX PS0 E0 0000000 0000000 @@ -3028,7 +3128,7 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 3 .X.. NPO PS0 E0 0000 0000 @@ -3080,7 +3180,7 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 4 X... NPO PS0 E0 0000 0000 @@ -3122,7 +3222,7 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 @@ -3172,7 +3272,7 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 3 .X.. NPO PS0 E0 0000 0000 @@ -3203,7 +3303,7 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_NONE; - stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,false),P_BLACK,true); + stressTest(koBoard41,BoardHistory(koBoard41,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,true); expected = R"%%( 5 .... NPX PS0 E0 0000 0000 4 ...X NPO PS0 E0 0000 0000 @@ -3233,7 +3333,7 @@ isResignation: 0 rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; baseRand.init("123"); - stressTest(koBoard71,BoardHistory(koBoard71,P_BLACK,rules,0,false),P_BLACK,false); + stressTest(koBoard71,BoardHistory(koBoard71,P_BLACK,rules,0,BoardHistoryModes(false,false)),P_BLACK,false); expected = R"%%( 3 .O.OX.O NPX PS0 E0 0000000 0000000 4 .O.OXX. NPO PS0 E0 0000000 0000000 @@ -3287,8 +3387,8 @@ isResignation: 0 rules.komi = 0.5f; rules.multiStoneSuicideLegal = true; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); - BoardHistory hist2(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); + BoardHistory hist2(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); auto compareHists = [&]() { out << hist.moveHistory.size() << " " << hist2.moveHistory.size() << endl; @@ -3428,7 +3528,7 @@ XXXOO.OOO rules.komi = 0.5f; rules.multiStoneSuicideLegal = false; rules.taxRule = Rules::TAX_SEKI; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -3469,7 +3569,7 @@ HASH: 5C26A060FA78FD93FFF559C72BD7C6A4 int turnIdxToSetup = (int)sgf->moves.size(); Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdxToSetup, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdxToSetup,BoardHistoryModes(false,false)); string expected = R"%%( HASH: EB867913318513FD9DE98EDE86AE8CE0 A B C D E F G H J K L M @@ -3548,7 +3648,7 @@ xoxx. rules.multiStoneSuicideLegal = false; rules.komi = 0.0f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(2,2,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -3587,7 +3687,7 @@ xoxx. rules.multiStoneSuicideLegal = false; rules.komi = 0.5f; rules.hasButton = true; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(2,2,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -3632,7 +3732,7 @@ xoxx. rules.multiStoneSuicideLegal = false; rules.komi = 0.0f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(4,3,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(4,5,board.x_size), P_WHITE, __LINE__); @@ -3665,7 +3765,7 @@ xoxx. rules.multiStoneSuicideLegal = false; rules.komi = 0.5f; rules.hasButton = true; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(4,3,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Location::getLoc(4,5,board.x_size), P_WHITE, __LINE__); @@ -3706,7 +3806,7 @@ xoxx. rules.multiStoneSuicideLegal = false; rules.komi = 0.5f; rules.hasButton = true; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Location::getLoc(2,2,board.x_size), P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -3745,7 +3845,7 @@ Illegal: (4,3) X rules.multiStoneSuicideLegal = false; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -3860,7 +3960,7 @@ Last moves pass pass pass J6 H9 H9 J6 rules.multiStoneSuicideLegal = false; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -3975,7 +4075,7 @@ Last moves pass pass pass J6 H9 H9 J7 rules.multiStoneSuicideLegal = false; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); @@ -4134,7 +4234,7 @@ Illegal: (8,3) X rules.multiStoneSuicideLegal = true; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -4307,7 +4407,7 @@ Last moves pass pass H7 G9 J6 H8 G8 J7 rules.multiStoneSuicideLegal = true; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -4645,7 +4745,7 @@ Last moves pass pass H7 G9 J6 H8 H8 J6 G8 J7 F9 H7 F9 H8 H7 pass rules.multiStoneSuicideLegal = true; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -4784,7 +4884,7 @@ Last moves pass pass pass pass H7 G9 J6 H8 H8 rules.multiStoneSuicideLegal = true; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -5011,7 +5111,7 @@ Last moves pass pass H7 G9 J6 H8 G8 H7 G8 J7 F9 rules.multiStoneSuicideLegal = true; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -5143,7 +5243,7 @@ Last moves pass pass pass pass H7 G9 F9 H8 rules.multiStoneSuicideLegal = true; rules.komi = 6.5f; rules.hasButton = false; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_BLACK, __LINE__); makeMoveAssertLegal(hist, board, Board::PASS_LOC, P_WHITE, __LINE__); @@ -5283,9 +5383,9 @@ Last moves pass pass pass pass H7 G9 F9 H7 for(int j = 0; j& args); @@ -131,6 +158,9 @@ namespace TestCommon { std::vector getMultiGameSize10x14Data(); std::vector getMultiGameRectangleData(); + //backendreferencedata.cpp (machine-generated, see that file for the JSON schema) + std::vector getBackendReferenceJsonData(); + void overrideForBackends(bool& inputsNHWC, bool& useNHWC); } diff --git a/cpp/tests/testscore.cpp b/cpp/tests/testscore.cpp index 9fc3c7ec55..262e5ffb7c 100644 --- a/cpp/tests/testscore.cpp +++ b/cpp/tests/testscore.cpp @@ -55,7 +55,7 @@ xxxxxxxxx )%%"); Rules rules = Rules::getTrompTaylorish(); - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); hist.endAndScoreGameNow(board); printScoreStats(board,hist); @@ -82,7 +82,7 @@ xxxxxxxxx Rules rules = Rules::getTrompTaylorish(); rules.komi = 7.0; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); hist.endAndScoreGameNow(board); printScoreStats(board,hist); @@ -109,7 +109,7 @@ xxxxxxxxx Rules rules = Rules::getTrompTaylorish(); rules.komi = 7.0; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); hist.endAndScoreGameNow(board); printScoreStats(board,hist); @@ -133,7 +133,7 @@ xxxxx Rules rules = Rules::getTrompTaylorish(); rules.komi = 7.0; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); hist.endAndScoreGameNow(board); printScoreStats(board,hist); diff --git a/cpp/tests/testsearchcommon.cpp b/cpp/tests/testsearchcommon.cpp index 8892180cf6..811b199d84 100644 --- a/cpp/tests/testsearchcommon.cpp +++ b/cpp/tests/testsearchcommon.cpp @@ -185,7 +185,7 @@ void TestSearchCommon::runBotOnSgf(AsyncBot* bot, const string& sgfStr, const Ru BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(defaultRules); sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, - Search::resolveAlwaysComputePassAliveUnderSuicideRules(bot->getSearch()->searchParams, bot->getSearch()->nnEvaluator)); + Search::resolveHistoryModes(bot->getSearch()->searchParams, bot->getSearch()->nnEvaluator)); hist.setKomi(overrideKomi); runBotOnPosition(bot,board,nextPla,hist,opts); } diff --git a/cpp/tests/testsearchmisc.cpp b/cpp/tests/testsearchmisc.cpp index 216173e5d6..66e3773f96 100644 --- a/cpp/tests/testsearchmisc.cpp +++ b/cpp/tests/testsearchmisc.cpp @@ -29,7 +29,7 @@ void Tests::runNNOnTinyBoard(const string& modelFile, bool inputsNHWC, bool useN Player nextPla = P_WHITE; Rules rules = Rules::getTrompTaylorish(); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); const bool logToStdout = true; const bool logToStderr = false; @@ -73,7 +73,7 @@ void Tests::runNNSymmetries(const string& modelFile, bool inputsNHWC, bool useNH Player nextPla = P_BLACK; Rules rules = Rules::getTrompTaylorish(); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); const bool logToStdout = true; const bool logToStderr = false; @@ -132,7 +132,7 @@ void Tests::runNNOnManyPoses(const string& modelFile, bool inputsNHWC, bool useN Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx,BoardHistoryModes(false,false)); nnEval->evaluate(board,hist,nextPla,nnInputParams,buf,skipCache,includeOwnerMap); winProbs.push_back(buf.result->whiteWinProb); @@ -215,7 +215,7 @@ void Tests::runNNBatchingTest(const string& modelFile, bool inputsNHWC, bool use initialRules.hasButton = initialRules.scoringRule == Rules::SCORING_AREA && rand.nextBool(0.5); initialRules.whiteHandicapBonusRule = rand.nextBool(0.5) ? Rules::WHB_ZERO : rand.nextBool(0.5) ? Rules::WHB_N : Rules::WHB_N_MINUS_ONE; initialRules.komi = 7.5f + rand.nextInt(-10,10) * 0.5f; - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, turnIdx,BoardHistoryModes(false,false)); items.emplace_back(board,hist,nextPla); } }; diff --git a/cpp/tests/testsearchnonn.cpp b/cpp/tests/testsearchnonn.cpp index 21221dbe83..a875395de3 100644 --- a/cpp/tests/testsearchnonn.cpp +++ b/cpp/tests/testsearchnonn.cpp @@ -56,7 +56,7 @@ void Tests::runNNLessSearchTests() { ......... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->runWholeSearch(nextPla); @@ -138,7 +138,7 @@ ooooooo ...o... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { //-------------------------------------- @@ -206,7 +206,7 @@ o..oo.x )%%"); Player nextPla = P_BLACK; Rules rules = Rules::getTrompTaylorish(); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("B5",board),nextPla,NULL); nextPla = getOpp(nextPla); hist.makeBoardMoveAssumeLegal(board,Location::ofString("pass",board),nextPla,NULL); @@ -379,7 +379,7 @@ o..o.oo Player nextPla = P_WHITE; Rules rules = Rules::getTrompTaylorish(); rules.multiStoneSuicideLegal = false; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { cout << "First with no pruning" << endl; @@ -441,7 +441,7 @@ o..o.oo ......... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->runWholeSearch(nextPla); @@ -512,7 +512,7 @@ o..o.oo ......... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->runWholeSearch(nextPla); @@ -553,7 +553,7 @@ o..o.oo ......... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setRootSymmetryPruningOnly({0,3,4,7}); @@ -595,7 +595,7 @@ o..o.oo ......... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setRootSymmetryPruningOnly({0,3,4,7}); @@ -652,7 +652,7 @@ xx......x } Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setRootSymmetryPruningOnly({0,3,4,7}); @@ -730,7 +730,7 @@ xx......x } Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setRootSymmetryPruningOnly({0,3,4,7}); @@ -808,7 +808,7 @@ xx......x } Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setRootSymmetryPruningOnly({0,3,4,7}); @@ -878,7 +878,7 @@ xx......x ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->runWholeSearch(nextPla); @@ -979,7 +979,7 @@ xxxxooo .xxxooo )%%"); Player nextPla = P_WHITE; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search2->setPosition(nextPla,board,hist); @@ -1069,7 +1069,7 @@ o.oo.oo .oooooo )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1140,7 +1140,7 @@ oo.oxxxxxxxxoo ooooo.oooooooo )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1205,7 +1205,7 @@ ooooo.oooooooo ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1260,7 +1260,7 @@ ooooo.oooooooo ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1316,7 +1316,7 @@ ooooo.oooooooo ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1370,7 +1370,7 @@ xxx...xxx xxxxxxxxx )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1484,7 +1484,7 @@ xxxxxxxxx ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1636,7 +1636,7 @@ ooooooo .o.oo.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { //-------------------------------------- @@ -1732,7 +1732,7 @@ oo..o..oo avoidMoveUntilByLoc[Board::PASS_LOC] = 3; Player nextPla = P_WHITE; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setAvoidMoveUntilByLoc(avoidMoveUntilByLoc,avoidMoveUntilByLoc); @@ -1800,7 +1800,7 @@ oo..o..oo avoidMoveUntilByLoc[Board::PASS_LOC] = 3; Player nextPla = P_WHITE; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setAvoidMoveUntilByLoc(avoidMoveUntilByLoc,avoidMoveUntilByLoc); @@ -1848,7 +1848,7 @@ oo..o..oo avoidMoveUntilByLoc[Board::PASS_LOC] = 10; Player nextPla = P_WHITE; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); search->setPosition(nextPla,board,hist); search->setAvoidMoveUntilByLoc(avoidMoveUntilByLoc,vector()); @@ -1907,7 +1907,7 @@ oo..o..oo ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -1974,7 +1974,7 @@ oo..o..oo ....... )%%"); Player nextPla = P_WHITE; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2041,7 +2041,7 @@ oxooox. .ooox.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2108,7 +2108,7 @@ oxooox. .ooox.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2147,7 +2147,7 @@ oxooox. .ooox.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2186,7 +2186,7 @@ oxooox. .ooox.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2225,7 +2225,7 @@ oxooox. .ooox.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2264,7 +2264,7 @@ xxoxx x.x.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2334,7 +2334,7 @@ xxoxx x.x.x )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2399,7 +2399,7 @@ x.x.x ............. )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); PrintTreeOptions options; options = options.maxDepth(1); @@ -2575,7 +2575,7 @@ x.x.x ....... )%%"); Player nextPla = P_BLACK; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); // Search 1: params A. search->setPosition(nextPla,board,hist); @@ -2642,7 +2642,7 @@ x.x.x BoardHistory hist; ExtraBlackAndKomi extraBlackAndKomi; OtherGameProperties otherGameProps; - gameInit.createGame(board,pla,hist,extraBlackAndKomi,NULL,PlaySettings(),otherGameProps,NULL,false); + gameInit.createGame(board,pla,hist,extraBlackAndKomi,NULL,PlaySettings(),otherGameProps,NULL,BoardHistoryModes()); boardSizeDistribution[std::make_pair(board.x_size,board.y_size)] += 1; } for(int x = 2; x<=8; x += 2) { diff --git a/cpp/tests/testsearchv3.cpp b/cpp/tests/testsearchv3.cpp index 02af1924d0..061ec182cd 100644 --- a/cpp/tests/testsearchv3.cpp +++ b/cpp/tests/testsearchv3.cpp @@ -28,7 +28,7 @@ static void runOwnershipAndMisc(NNEvaluator* nnEval, NNEvaluator* nnEval11, NNEv Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 40, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 40,BoardHistoryModes(false,false)); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -72,7 +72,7 @@ static void runOwnershipAndMisc(NNEvaluator* nnEval, NNEvaluator* nnEval11, NNEv Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 43, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 43,BoardHistoryModes(false,false)); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -255,7 +255,7 @@ static void runOwnershipAndMisc(NNEvaluator* nnEval, NNEvaluator* nnEval11, NNEv ....o.. ....... )%%"); - BoardHistory histA(boardA,nextPla,rules,0,false); + BoardHistory histA(boardA,nextPla,rules,0,BoardHistoryModes(false,false)); Board boardB = Board::parseBoard(11,7,R"%%( ........... @@ -266,7 +266,7 @@ static void runOwnershipAndMisc(NNEvaluator* nnEval, NNEvaluator* nnEval11, NNEv ........... ........... )%%"); - BoardHistory histB(boardB,nextPla,rules,0,false); + BoardHistory histB(boardB,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params; params.maxVisits = 200; @@ -319,7 +319,7 @@ o..o..oxo ....x.oox ......ox. )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("H8",board),nextPla,NULL); nextPla = P_BLACK; @@ -355,7 +355,7 @@ xx.o.o.o. .xxo.o.o. ..xo.o.o. )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Board::PASS_LOC,nextPla,NULL); nextPla = P_WHITE; @@ -412,7 +412,7 @@ xx.o.o.o. ......... ......... )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params; params.maxVisits = 200; @@ -455,7 +455,7 @@ xx..xoooo ..x...ox. )%%"); board.numWhiteCaptures = 3; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); MiscNNInputParams nnInputParams; NNResultBuf buf; @@ -495,7 +495,7 @@ xx..xoooo ..x...ox. )%%"); board.numWhiteCaptures = 3; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); MiscNNInputParams nnInputParams; NNResultBuf buf; diff --git a/cpp/tests/testsearchv8.cpp b/cpp/tests/testsearchv8.cpp index 7eb883918d..88eff5de3f 100644 --- a/cpp/tests/testsearchv8.cpp +++ b/cpp/tests/testsearchv8.cpp @@ -26,7 +26,7 @@ static void runV8TestsSize9(NNEvaluator* nnEval, NNEvaluator* nnEval9, NNEvaluat Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 3, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 3,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; @@ -62,7 +62,7 @@ static void runV8TestsRandomSym(NNEvaluator* nnEval, NNEvaluator* nnEval19Exact, Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 11, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 11,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; @@ -96,7 +96,7 @@ static void runV8TestsRandomSym(NNEvaluator* nnEval, NNEvaluator* nnEval19Exact, Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 8, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 8,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.rootNumSymmetriesToSample = 8; @@ -131,7 +131,7 @@ static void runV8TestsRandomSym(NNEvaluator* nnEval, NNEvaluator* nnEval19Exact, Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 8, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 8,BoardHistoryModes(false,false)); SearchParams paramsA = SearchParams::forTestsV1(); SearchParams paramsB = SearchParams::forTestsV1(); @@ -215,7 +215,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) const Player startPla = P_WHITE; const Rules rules = Rules::getTrompTaylorish(); - const BoardHistory hist(board,startPla,rules,0,false); + const BoardHistory hist(board,startPla,rules,0,BoardHistoryModes(false,false)); SearchParams baseParams = SearchParams::forTestsV1(); baseParams.maxVisits = 400; baseParams.maxVisitsPondering = 600; @@ -484,7 +484,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 400; @@ -532,7 +532,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 24, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 24,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; params.antiMirror = true; @@ -547,7 +547,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 32, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 32,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; params.antiMirror = true; @@ -562,7 +562,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 124, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 124,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; params.antiMirror = true; @@ -587,7 +587,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 29, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 29,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; params.antiMirror = true; @@ -602,7 +602,7 @@ static void runV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFailAllowUnspecified(Rules::getTrompTaylorish()); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 83, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 83,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 200; params.antiMirror = true; @@ -630,7 +630,7 @@ static void runMoreV8Tests(NNEvaluator* nnEval, Logger& logger) Player nextPla; BoardHistory hist; Rules initialRules = sgf->getRulesOrFail(); - sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 8, false); + sgf->setupBoardAndHistAssumeLegal(initialRules, board, nextPla, hist, 8,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 20; @@ -695,7 +695,7 @@ oxxxooxoooo Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { cout << "Without root ending bonus pts===================" << endl; cout << endl; @@ -720,7 +720,7 @@ oxxxooxoooo Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); rules.hasButton = true; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { cout << "Without root ending bonus pts===================" << endl; cout << endl; @@ -744,7 +744,7 @@ oxxxooxoooo Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { cout << "Without root ending bonus pts===================" << endl; cout << endl; @@ -769,7 +769,7 @@ oxxxooxoooo Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Chinese"); rules.hasButton = true; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { cout << "Without root ending bonus pts===================" << endl; cout << endl; @@ -793,7 +793,7 @@ oxxxooxoooo Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { cout << "Without root ending bonus pts===================" << endl; cout << endl; @@ -818,7 +818,7 @@ oxxxooxoooo Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,2,false); + BoardHistory hist(board,nextPla,rules,2,BoardHistoryModes(false,false)); { cout << "Without root ending bonus pts===================" << endl; cout << endl; @@ -874,7 +874,7 @@ xxxx.xxoxxx Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { AsyncBot* bot = new AsyncBot(params2, nnEval, &logger, "async bot ending bonus points seed"); runBotOnPosition(bot, board, nextPla, hist, opts); @@ -899,7 +899,7 @@ xxxx.xxoxxx ......... ......... )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 400; @@ -939,7 +939,7 @@ xxxx.xxoxxx ......... ......... )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 10000; @@ -995,7 +995,7 @@ xxxx.xxoxxx Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams paramsFast = SearchParams::forTestsV1(); paramsFast.maxVisits = 5; @@ -1151,7 +1151,7 @@ xxxx.xxoxxx Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams paramsBase = SearchParams::forTestsV1(); paramsBase.maxVisits = 500; @@ -1289,7 +1289,7 @@ oooxxox.. { Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "Base, white to play" << endl; @@ -1303,7 +1303,7 @@ oooxxox.. { Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "Fill dame before pass, white to play" << endl; @@ -1318,7 +1318,7 @@ oooxxox.. { Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "Base, black to play" << endl; @@ -1332,7 +1332,7 @@ oooxxox.. { Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "Fill dame before pass, black to play" << endl; @@ -1370,7 +1370,7 @@ oooo.o.oo Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); rules.komi = 14; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "White to play" << endl; @@ -1389,7 +1389,7 @@ oooo.o.oo { Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "White to play" << endl; @@ -1431,7 +1431,7 @@ oooo.o.oo { Rules rules = Rules::parseRules("Japanese"); rules.komi = 8; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); cout << "===================================================================" << endl; cout << "White to play" << endl; @@ -1468,7 +1468,7 @@ o....xo.. Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Chinese"); rules.komi = 4; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Board::PASS_LOC,nextPla,NULL); nextPla = P_WHITE; @@ -1502,7 +1502,7 @@ o....xo.. Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); rules.komi = 7; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Board::PASS_LOC,nextPla,NULL); nextPla = P_BLACK; @@ -1550,7 +1550,7 @@ o....xo.. Player nextPlaBase = P_BLACK; Rules rules = Rules::parseRules("Japanese"); rules.komi = 6.5; - BoardHistory histBase(boardBase,nextPlaBase,rules,0,false); + BoardHistory histBase(boardBase,nextPlaBase,rules,0,BoardHistoryModes(false,false)); SearchParams paramsBase = SearchParams::forTestsV1(); paramsBase.maxVisits = 1000; @@ -1677,7 +1677,7 @@ o....xo.. Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); rules.komi = 6.5; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params0 = SearchParams::forTestsV1(); params0.maxVisits = 1000; @@ -1767,7 +1767,7 @@ o....xo.. Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); rules.komi = 6.5; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params0 = SearchParams::forTestsV1(); params0.maxVisits = 1000; @@ -1824,7 +1824,7 @@ o....xo.. Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Japanese"); rules.komi = 25.5; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params0 = SearchParams::forTestsV1(); params0.maxVisits = 1000; @@ -1884,7 +1884,7 @@ ooox..o oxxxxxx xx..... )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 100; @@ -1922,7 +1922,7 @@ static void runMoreV8TestsRandomizedNNEvals(NNEvaluator* nnEval, Logger& logger) Player nextPla = P_BLACK; Rules rules = Rules::parseRules("AGA"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.rootNumSymmetriesToSample = 8; @@ -2020,7 +2020,7 @@ static void runV8SearchMultithreadTest(NNEvaluator* nnEval, Logger& logger) Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); rules.komi = 8.5; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 16000; @@ -2112,7 +2112,7 @@ xoxxoo........o.x.. Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); rules.komi = 6.5; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV1(); params.maxVisits = 8000; diff --git a/cpp/tests/testsearchv9.cpp b/cpp/tests/testsearchv9.cpp index a1d5860cca..bc10b08149 100644 --- a/cpp/tests/testsearchv9.cpp +++ b/cpp/tests/testsearchv9.cpp @@ -89,7 +89,7 @@ xx...x.o..x.. )%%"); Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); { SearchParams params = SearchParams::forTestsV2(); @@ -138,7 +138,7 @@ o.ox..oox { Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 75; @@ -155,7 +155,7 @@ o.ox..oox { Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 75; @@ -172,7 +172,7 @@ o.ox..oox { Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 75; @@ -189,7 +189,7 @@ o.ox..oox { Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 75; @@ -261,7 +261,7 @@ o.ox..oox { Rules rules = Rules::parseRules("Japanese"); rules.koRule = Rules::KO_SPIGHT; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("G3",board),P_BLACK,NULL); hist.makeBoardMoveAssumeLegal(board,Location::ofString("G1",board),P_WHITE,NULL); hist.makeBoardMoveAssumeLegal(board,Location::ofString("G2",board),P_BLACK,NULL); @@ -285,7 +285,7 @@ o.ox..oox { Rules rules = Rules::parseRules("Japanese"); rules.koRule = Rules::KO_SPIGHT; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("G3",board),P_BLACK,NULL); hist.makeBoardMoveAssumeLegal(board,Location::ofString("G1",board),P_WHITE,NULL); hist.makeBoardMoveAssumeLegal(board,Location::ofString("G2",board),P_BLACK,NULL); @@ -322,7 +322,7 @@ o.ox..oox ......... ......... )%%"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); vector avoidMoveUntilByLoc(Board::MAX_ARR_SIZE); avoidMoveUntilByLoc[Location::ofString("D5",board)] = 1; @@ -381,7 +381,7 @@ xoo..... cout << "Area scoring no friendly pass ok" << endl; Rules rules = Rules::parseRules("Chinese"); rules.friendlyPassOk = false; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 50; @@ -398,7 +398,7 @@ xoo..... cout << "Area scoring yes friendly pass ok" << endl; Rules rules = Rules::parseRules("Chinese"); rules.friendlyPassOk = true; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 50; @@ -415,7 +415,7 @@ xoo..... cout << "Area scoring no friendly pass ok but pass hacks" << endl; Rules rules = Rules::parseRules("Chinese"); rules.friendlyPassOk = false; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); SearchParams params = SearchParams::forTestsV2(); params.maxVisits = 50; @@ -445,7 +445,7 @@ o.....oo )%%"); Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Chinese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("E5",board),P_WHITE,NULL); nextPla = getOpp(nextPla); @@ -504,7 +504,7 @@ oo...ooo )%%"); Player nextPla = P_WHITE; Rules rules = Rules::parseRules("Japanese"); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("E4",board),P_WHITE,NULL); nextPla = getOpp(nextPla); @@ -558,7 +558,7 @@ oo...ooo Player nextPla = P_BLACK; Rules rules = Rules::parseRules("Japanese"); rules.komi = -4; - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("A1",board),P_BLACK,NULL); hist.makeBoardMoveAssumeLegal(board,Location::ofString("B2",board),P_WHITE,NULL); hist.makeBoardMoveAssumeLegal(board,Location::ofString("C3",board),P_BLACK,NULL); @@ -592,7 +592,7 @@ oo...ooo Rules rules = Rules::parseRules("Chinese"); rules.friendlyPassOk = false; rules.komi = 5.5; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("E5",board),P_BLACK,NULL); Player nextPla = P_WHITE; @@ -626,7 +626,7 @@ xxxxxxxxx Rules rules = Rules::parseRules("Chinese"); rules.friendlyPassOk = false; rules.komi = 7.5; - BoardHistory hist(board,P_WHITE,rules,0,false); + BoardHistory hist(board,P_WHITE,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("pass",board),P_WHITE,NULL); Player nextPla = P_BLACK; @@ -696,7 +696,7 @@ x.ooxxxxx Rules rules = Rules::parseRules("Chinese"); rules.friendlyPassOk = false; rules.komi = 7.5; - BoardHistory hist(board,P_BLACK,rules,0,false); + BoardHistory hist(board,P_BLACK,rules,0,BoardHistoryModes(false,false)); hist.makeBoardMoveAssumeLegal(board,Location::ofString("pass",board),P_BLACK,NULL); Player nextPla = P_WHITE; diff --git a/cpp/tests/testsgf.cpp b/cpp/tests/testsgf.cpp index 6bd06079f7..5f804fc99f 100644 --- a/cpp/tests/testsgf.cpp +++ b/cpp/tests/testsgf.cpp @@ -26,7 +26,7 @@ void Tests::runSgfTests() { Rules rules; Player pla; rules = sgf->getRulesOrFailAllowUnspecified(rules); - sgf->setupInitialBoardAndHist(rules,board,pla,hist,false); + sgf->setupInitialBoardAndHist(rules,board,pla,hist,BoardHistoryModes(false,false)); out << "placements" << endl; for(int i = 0; i < sgf->placements.size(); i++) { @@ -43,7 +43,7 @@ void Tests::runSgfTests() { out << "pla " << PlayerIO::playerToString(pla) << endl; hist.printDebugInfo(out,board); - sgf->setupBoardAndHistAssumeLegal(rules,board,pla,hist,sgf->moves.size(),false); + sgf->setupBoardAndHistAssumeLegal(rules,board,pla,hist,sgf->moves.size(),BoardHistoryModes(false,false)); out << "Final board hist " << endl; out << "pla " << PlayerIO::playerToString(pla) << endl; hist.printDebugInfo(out,board); @@ -59,7 +59,7 @@ void Tests::runSgfTests() { Rules rules2; Player pla2; rules2 = sgf2->getRulesOrFail(); - sgf->setupBoardAndHistAssumeLegal(rules2,board2,pla2,hist2,sgf2->moves.size(),false); + sgf->setupBoardAndHistAssumeLegal(rules2,board2,pla2,hist2,sgf2->moves.size(),BoardHistoryModes(false,false)); testAssert(rules2 == rules); testAssert(board2.pos_hash == board.pos_hash); testAssert(hist2.moveHistory.size() == hist.moveHistory.size()); diff --git a/cpp/tests/testsymmetries.cpp b/cpp/tests/testsymmetries.cpp index c959e56a85..1fa53a1e70 100644 --- a/cpp/tests/testsymmetries.cpp +++ b/cpp/tests/testsymmetries.cpp @@ -819,7 +819,7 @@ void Tests::runBoardSymmetryTests() { }; auto computeAndPrintMarkedSymDupArea = [&out,&printMarkedSymDupArea](const Board& board, Player pla, const std::vector* onlySymmetries) { - BoardHistory hist(board,pla,Rules::getTrompTaylorish(),0,false); + BoardHistory hist(board,pla,Rules::getTrompTaylorish(),0,BoardHistoryModes(false,false)); bool isSymDupLoc[Board::MAX_ARR_SIZE]; vector validSymmetries; vector avoidMoves; diff --git a/cpp/tests/testtime.cpp b/cpp/tests/testtime.cpp index 16f31c429f..c764fadd44 100644 --- a/cpp/tests/testtime.cpp +++ b/cpp/tests/testtime.cpp @@ -17,7 +17,7 @@ void Tests::runTimeControlsTests() { ......... ......... )%%"); - BoardHistory hist9Early(board9Early,P_BLACK,Rules(),0,false); + BoardHistory hist9Early(board9Early,P_BLACK,Rules(),0,BoardHistoryModes(false,false)); Board board9Late = Board::parseBoard(9,9,R"%%( ..xoo..x. @@ -30,7 +30,7 @@ oox.ox... .o..ox.x. ...oxxx.. )%%"); - BoardHistory hist9Late(board9Late,P_BLACK,Rules(),0,false); + BoardHistory hist9Late(board9Late,P_BLACK,Rules(),0,BoardHistoryModes(false,false)); Board board19Early = Board::parseBoard(19,19,R"%%( @@ -54,7 +54,7 @@ oox.ox... ................... ................... )%%"); - BoardHistory hist19Early(board19Early,P_BLACK,Rules(),0,false); + BoardHistory hist19Early(board19Early,P_BLACK,Rules(),0,BoardHistoryModes(false,false)); Board board19Late = Board::parseBoard(19,19,R"%%( A B C D E F G H J K L M N O P Q R S T @@ -78,7 +78,7 @@ oox.ox... 2 . O . O X . X O O X1X . . . . X X O O 1 . . O . . X .2X3. O . . . . . . . X . )%%"); - BoardHistory hist19Late(board19Late,P_BLACK,Rules(),0,false); + BoardHistory hist19Late(board19Late,P_BLACK,Rules(),0,BoardHistoryModes(false,false)); auto tryTimeControlsOnBoard = [](const string& s, const TimeControls& timeControls, const Board& board, const BoardHistory& hist, double lagBuffer) { double minTime; diff --git a/cpp/tests/testtrainingwrite.cpp b/cpp/tests/testtrainingwrite.cpp index 1c37f8c18b..871f283400 100644 --- a/cpp/tests/testtrainingwrite.cpp +++ b/cpp/tests/testtrainingwrite.cpp @@ -74,7 +74,7 @@ static void runReanalysisRowChannelsTest() { Board board(5,5); Player nextPla = P_BLACK; Rules rules = Rules::getTrompTaylorish(); - BoardHistory hist(board,nextPla,rules,0,false); + BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); vector policyTarget; policyTarget.push_back(PolicyTargetMove(Board::PASS_LOC,1)); @@ -199,7 +199,7 @@ void Tests::runTrainingWriteTests() { Board initialBoard(boardXLen,boardYLen); Player initialPla = P_BLACK; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,BoardHistoryModes(false,false)); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = 0; @@ -318,7 +318,7 @@ void Tests::runTrainingWriteTests() { Board initialBoard(5,5); Player initialPla = P_BLACK; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard,initialPla,gameRules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,gameRules,initialEncorePhase,BoardHistoryModes(false,false)); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = 0; @@ -467,7 +467,7 @@ void Tests::runSelfplayInitTestsWithNN(const string& modelFile) { Board initialBoard(11,11); Player initialPla = P_BLACK; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,BoardHistoryModes(false,false)); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = numExtraBlack; @@ -666,7 +666,7 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { } - BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,BoardHistoryModes(false,false)); if(testHint) initialHist.setInitialTurnNumber(10); @@ -807,7 +807,7 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { Board initialBoard(11,11); Player initialPla = P_BLACK; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,BoardHistoryModes(false,false)); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = 0; @@ -963,7 +963,7 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { rules.komi = komi; Player pla = P_BLACK; - BoardHistory hist(board,pla,rules,0,false); + BoardHistory hist(board,pla,rules,0,BoardHistoryModes(false,false)); int compensateKomiVisits = 50; OtherGameProperties otherGameProps; double lead = PlayUtils::computeLead(bot,bot,board,hist,pla,compensateKomiVisits,otherGameProps); @@ -999,7 +999,7 @@ void Tests::runMoreSelfplayTestsWithNN(const string& modelFile) { Board initialBoard(11,11); Player initialPla = P_BLACK; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,rules,initialEncorePhase,BoardHistoryModes(false,false)); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = 0; @@ -1421,7 +1421,7 @@ xxxxxxxx. Board board; Player nextPla; BoardHistory hist; - sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist, false); + sgf->setupInitialBoardAndHist(initialRules, board, nextPla, hist,BoardHistoryModes(false,false)); for(size_t i = 0; imoves.size(); - sgf->setupBoardAndHistAssumeLegal(rules,initialBoard,initialPla,initialHist,turnIdx,false); + sgf->setupBoardAndHistAssumeLegal(rules,initialBoard,initialPla,initialHist,turnIdx,BoardHistoryModes(false,false)); bool doEndGameIfAllPassAlive = true; bool clearBotAfterSearch = true; @@ -3308,9 +3308,9 @@ ox....... oox.x.... .o....... )%%"); - BoardHistory hist(board,P_BLACK,Rules::parseRules("tromp-taylor"),0,false); + BoardHistory hist(board,P_BLACK,Rules::parseRules("tromp-taylor"),0,BoardHistoryModes(false,false)); testStatuses(board,hist,P_BLACK); - BoardHistory hist2(board,P_WHITE,Rules::parseRules("tromp-taylor"),0,false); + BoardHistory hist2(board,P_WHITE,Rules::parseRules("tromp-taylor"),0,BoardHistoryModes(false,false)); testStatuses(board,hist2,P_WHITE); } //The neural net that we're using for this test actually produces a lot of nonsense because it doesn't @@ -3327,9 +3327,9 @@ ooxxx.o.. xo.ox.xoo .xxox.xx. )%%"); - BoardHistory hist(board,P_WHITE,Rules::parseRules("tromp-taylor"),0,false); + BoardHistory hist(board,P_WHITE,Rules::parseRules("tromp-taylor"),0,BoardHistoryModes(false,false)); testStatuses(board,hist,P_WHITE); - BoardHistory hist2(board,P_WHITE,Rules::parseRules("japanese"),0,false); + BoardHistory hist2(board,P_WHITE,Rules::parseRules("japanese"),0,BoardHistoryModes(false,false)); testStatuses(board,hist2,P_WHITE); } @@ -3385,7 +3385,7 @@ void Tests::runPassAliveSuicideGameTests() { Board initialBoard(7,7); Player initialPla = P_BLACK; int initialEncorePhase = 0; - BoardHistory initialHist(initialBoard,initialPla,gameRules,initialEncorePhase,false); + BoardHistory initialHist(initialBoard,initialPla,gameRules,initialEncorePhase,BoardHistoryModes(false,false)); ExtraBlackAndKomi extraBlackAndKomi; extraBlackAndKomi.extraBlack = 0; @@ -3433,9 +3433,9 @@ void Tests::runPassAliveSuicideGameTests() { TrainingDataWriter dataWriter(&cout,inputsVersion, maxRows, firstFileMinRandProp, 7, 7, debugOnlyWriteEvery, "passalivesuicidedwriter"); FinishedGameData* gameData = runGameWithModes("passalive-forcedtrue", enabled_t::True, enabled_t::True, true, rules); cout << "seedBase: passalive-forcedtrue" << endl; - cout << "Game-level alwaysComputePassAliveUnderSuicideRules: " << gameData->endHist.alwaysComputePassAliveUnderSuicideRules << endl; - testAssert(gameData->startHist.alwaysComputePassAliveUnderSuicideRules); - testAssert(gameData->endHist.alwaysComputePassAliveUnderSuicideRules); + cout << "Game-level alwaysComputePassAliveUnderSuicideRules: " << gameData->endHist.modes.alwaysComputePassAliveUnderSuicideRules << endl; + testAssert(gameData->startHist.modes.alwaysComputePassAliveUnderSuicideRules); + testAssert(gameData->endHist.modes.alwaysComputePassAliveUnderSuicideRules); gameData->endHist.printDebugInfo(cout,gameData->endHist.getRecentBoard(0)); dataWriter.writeGame(*gameData); dataWriter.flushIfNonempty(); @@ -3450,9 +3450,9 @@ void Tests::runPassAliveSuicideGameTests() { testAssert(!japRules.multiStoneSuicideLegal); FinishedGameData* gameData = runGameWithModes("passalive-territory", enabled_t::True, enabled_t::True, true, japRules); cout << "seedBase: passalive-territory" << endl; - cout << "Game-level alwaysComputePassAliveUnderSuicideRules: " << gameData->endHist.alwaysComputePassAliveUnderSuicideRules << endl; - testAssert(gameData->startHist.alwaysComputePassAliveUnderSuicideRules); - testAssert(gameData->endHist.alwaysComputePassAliveUnderSuicideRules); + cout << "Game-level alwaysComputePassAliveUnderSuicideRules: " << gameData->endHist.modes.alwaysComputePassAliveUnderSuicideRules << endl; + testAssert(gameData->startHist.modes.alwaysComputePassAliveUnderSuicideRules); + testAssert(gameData->endHist.modes.alwaysComputePassAliveUnderSuicideRules); gameData->endHist.printDebugInfo(cout,gameData->endHist.getRecentBoard(0)); delete gameData; } @@ -3462,9 +3462,9 @@ void Tests::runPassAliveSuicideGameTests() { { FinishedGameData* gameData = runGameWithModes("passalive-mixed", enabled_t::True, enabled_t::False, false, rules); cout << "seedBase: passalive-mixed" << endl; - cout << "Game-level alwaysComputePassAliveUnderSuicideRules: " << gameData->endHist.alwaysComputePassAliveUnderSuicideRules << endl; - testAssert(!gameData->startHist.alwaysComputePassAliveUnderSuicideRules); - testAssert(!gameData->endHist.alwaysComputePassAliveUnderSuicideRules); + cout << "Game-level alwaysComputePassAliveUnderSuicideRules: " << gameData->endHist.modes.alwaysComputePassAliveUnderSuicideRules << endl; + testAssert(!gameData->startHist.modes.alwaysComputePassAliveUnderSuicideRules); + testAssert(!gameData->endHist.modes.alwaysComputePassAliveUnderSuicideRules); gameData->endHist.printDebugInfo(cout,gameData->endHist.getRecentBoard(0)); delete gameData; } @@ -3473,8 +3473,8 @@ void Tests::runPassAliveSuicideGameTests() { { FinishedGameData* gameDataAuto = runGameWithModes("passalive-identity", enabled_t::Auto, enabled_t::Auto, true, rules); FinishedGameData* gameDataFalse = runGameWithModes("passalive-identity", enabled_t::False, enabled_t::False, true, rules); - testAssert(!gameDataAuto->endHist.alwaysComputePassAliveUnderSuicideRules); - testAssert(!gameDataFalse->endHist.alwaysComputePassAliveUnderSuicideRules); + testAssert(!gameDataAuto->endHist.modes.alwaysComputePassAliveUnderSuicideRules); + testAssert(!gameDataFalse->endHist.modes.alwaysComputePassAliveUnderSuicideRules); testAssert(gameDataAuto->endHist.moveHistory.size() == gameDataFalse->endHist.moveHistory.size()); for(size_t i = 0; iendHist.moveHistory.size(); i++) { testAssert(gameDataAuto->endHist.moveHistory[i].loc == gameDataFalse->endHist.moveHistory[i].loc); diff --git a/cpp/tests/tinymodel.cpp b/cpp/tests/tinymodel.cpp index 5e7c66ba47..7fef6775e7 100644 --- a/cpp/tests/tinymodel.cpp +++ b/cpp/tests/tinymodel.cpp @@ -117,7 +117,7 @@ NNEvaluator* TinyModelTest::runTinyModelTest(const string& baseDir, Logger& logg const Player nextPla = P_BLACK; const Rules rules = Rules::getTrompTaylorish(); - const BoardHistory hist(board,nextPla,rules,0,false); + const BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); auto runOneTest = [&]() { MiscNNInputParams nnInputParams; @@ -278,7 +278,7 @@ NNEvaluator* TinyModelTest::runTinyModelTest(const string& baseDir, Logger& logg const Player nextPla = P_BLACK; const Rules rules = Rules::getTrompTaylorish(); - const BoardHistory hist(board,nextPla,rules,0,false); + const BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); auto runOneTest = [&]() { MiscNNInputParams nnInputParams; @@ -426,7 +426,7 @@ NNEvaluator* TinyModelTest::runTinyModelTest(const string& baseDir, Logger& logg const Player nextPla = P_BLACK; const Rules rules = Rules::getTrompTaylorish(); - const BoardHistory hist(board,nextPla,rules,0,false); + const BoardHistory hist(board,nextPla,rules,0,BoardHistoryModes(false,false)); auto runOneTest = [&]() { MiscNNInputParams nnInputParams; diff --git a/docs/ONNX_Model_Files.md b/docs/ONNX_Model_Files.md new file mode 100644 index 0000000000..f5d4c4325e --- /dev/null +++ b/docs/ONNX_Model_Files.md @@ -0,0 +1,231 @@ +# ONNX Model Files + +*Applies to KataGo 1.17.3 and later. Earlier versions have neither the `dumponnx` command nor the ability to load `.onnx` model files.* + +The TensorRT and ONNX Runtime backends do not evaluate KataGo's `.bin.gz` model files directly. They translate the model into an [ONNX](https://onnx.ai/) graph in memory and hand that to TensorRT's `nvonnxparser` or to ONNX Runtime. This document covers: + +* [Dumping the graph](#dumping-the-graph) that a backend builds, with `katago dumponnx`. +* [Running a `.onnx` file](#running-a-onnx-file) as a model. +* [The model file format](#the-model-file-format), for making a model that KataGo can run from other tooling. +* [Keeping layers out of FP16](#keeping-layers-out-of-fp16) on TensorRT. +* [Checking your model](#checking-your-model). +* [Versioning](#versioning), for extending the format. + +Only the TensorRT and ONNX backends can do any of this. The CUDA, OpenCL, Eigen and Metal backends read `.bin.gz` models only. + +## Dumping the graph + +``` +katago dumponnx -model model.bin.gz -out model.onnx +``` + +Options (the defaults match an ordinary 19x19 run): + +| Option | Meaning | +|---|---| +| `-nn-x-len N`, `-nn-y-len N` | Board buffer size the graph is built for. Default 19. Must match the buffer size at run time, normally set by `maxBoardSizeForNNBuffer`. | +| `-require-exact-nnlen` | Build a graph with no board masking, matching `requireMaxBoardSize = true`. Such a graph is only correct for positions that fill the whole buffer. | +| `-transformer-nhwc true\|false` | Run the transformer trunk channel-last, matching `trtTransformerNHWC` / `onnxTransformerNHWC`. Default true. Ignored for models with no transformer blocks. | +| `-skip-scale8` | Skip the 1/8 activation rescaling that keeps convnet activations inside the FP16 range, matching `onnxSkipScale8 = true`. | + +The output is byte-for-byte what the backend builds in memory with the same settings, so it is also a way to inspect exactly what KataGo feeds to TensorRT or ONNX Runtime. + +## Running a .onnx file + +Pass the file to `-model` in place of the `.bin.gz`, on the TensorRT or ONNX backend: + +``` +katago gtp -model model.onnx -config configs/gtp_example.cfg +``` + +`.onnx.gz` works too. Loading a graph directly skips the graph-building step at startup, and lets external ONNX tooling sit in between. + +Four things are fixed when the graph is built and cannot be changed afterwards: the board buffer size, whether the graph does board masking, the transformer trunk layout, and the scale8 rescaling. The config options for them have no effect on an already-built graph, and KataGo logs a warning if you set one. Board size and masking mode are checked against what the run needs, and a mismatch is an error rather than a wrong evaluation. A masked graph is fine to use in a run where every position happens to fill the buffer, just slightly slower than a graph built for exactly that size. + +## The model file format + +An ONNX graph says nothing about what KataGo's inputs and outputs mean, which model version's feature encoding to use, or how to turn the outputs into a winrate and a score. Those parameters travel in the ModelProto's `metadata_props` under `katago.` keys. A file without them is refused, since nothing else can supply them. + +Any ONNX model that satisfies both halves of the contract below will load and run, whatever produced it. KataGo checks the contract, not the mathematics, so also see [Checking your model](#checking-your-model). + +KataGo does not look at the opset or IR version; whether the graph can be parsed is up to TensorRT or ONNX Runtime. For reference, KataGo's own emitter writes IR version 9 and opset 20, uses only standard ONNX operators, and bakes the weights in as initializers. + +Below, `X` and `Y` are the board buffer width and height declared in the metadata. They need not be equal, and 19x19 is only the common case. Positions smaller than the buffer are handled by masking, not by a second graph. + +### Graph inputs and outputs + +All tensors are float32 and NCHW, with a dynamic (symbolic) batch dimension and fixed C, H and W. Graph inputs or outputs beyond these are rejected, since KataGo has nothing to bind to them. + +| Input | Shape | Contents | +|---|---|---| +| `InputSpatial` | `[N, numInputChannels, Y, X]` | Per-point features for the model version, as computed by `NNInputs::fillRowV*` in `cpp/neuralnet/nninputs.cpp`. | +| `InputGlobal` | `[N, numInputGlobalChannels, 1, 1]` | Per-position global features, from the same code. | +| `InputMeta` | `[N, numInputMetaChannels, 1, 1]` | SGF metadata features. Present if and only if `metaEncoderVersion > 0`. | +| `InputMask` | `[N, 1, Y, X]` | 1 on-board, 0 off-board. Equal to channel 0 of `InputSpatial`. Must be declared even by a graph that ignores it, since KataGo always binds a buffer to it. | + +| Output | Shape | Contents | +|---|---|---| +| `OutputPolicyPass` | `[N, numPolicyChannels, 1, 1]` | Policy logit for the pass move. | +| `OutputPolicy` | `[N, numPolicyChannels, Y, X]` | Policy logits per point. | +| `OutputValue` | `[N, 3, 1, 1]` | Win, loss and no-result logits. | +| `OutputScoreValue` | `[N, numScoreValueChannels, 1, 1]` | Score-related outputs, listed below. | +| `OutputOwnership` | `[N, 1, Y, X]` | Per-point ownership, pre-tanh. | + +Declare the inputs in the order `InputSpatial`, `InputGlobal`, `InputMeta` (if present), `InputMask`. This works around a bug in ONNX Runtime's OpenVINO execution provider, present since ORT 1.23.0: the provider builds its name-to-index map skipping graph inputs that no node consumes, but does not adjust the indices it binds tensors by, so every input after such a one gets the wrong buffer. It fails at the first evaluation with + +``` +can't handle input tensor with name: parameter:InputSpatial, because model input +(shape=[?,22,19,19]) and tensor (shape=[1,1,19,19]) are incompatible +``` + +The general rule is that an input no node consumes must be declared last. `InputMask` is exactly that in a graph built with `requireExactNNLen`, which does no masking and so never reads it. TensorRT and the other execution providers bind by name and do not care about the order. + +Every output is raw: no softmax, tanh or softplus, and no masking of off-board points. KataGo applies all of that itself, along with `outputScaleMultiplier`. Note also: + +* Policy channel 0 is the base policy. Channel 1, where present, is the optimism policy, which KataGo blends with the base per query. Models at version 16 and up may have 4 channels. +* `OutputScoreValue` channels, for model version 9 and up, are score mean (pre-scaling), score stdev (pre-softplus), lead (pre-scaling), variance time left (pre-softplus), short-term winloss error (pre-softplus), short-term score error (pre-softplus). Older versions have fewer channels, and the count is checked against the model version at load. +* The graph never sees a symmetry. KataGo transforms the inputs and inverse-transforms the outputs around it, so the graph is a plain function of the board as given. + +`NeuralNet::getOutput` in `cpp/neuralnet/onnxbackend.cpp` and the post-processing in `cpp/neuralnet/nneval.cpp` define exactly how each output is consumed. + +### Metadata keys + +Values are strings, as ONNX metadata always is. Booleans are `true` or `false`. + +There are two namespaces: + +* **`katago.`** is must-understand. KataGo refuses to load a file carrying a key here that it does not recognize, since such a key is one whose instructions it would be ignoring. Everything that changes how a position is evaluated, an output decoded, or a game adjudicated lives here. +* **`katago.info.`** is safe to ignore. Unknown keys here are skipped, so a file written by a newer KataGo still loads on an older one. Nothing here affects evaluation. + +Keys outside `katago.` are ignored entirely and are yours to use, as are ONNX's own conventional `metadata_props`. + +Required always: + +| Key | Meaning | +|---|---| +| `katago.metadataVersion` | Version of this contract. See [Versioning](#versioning). Currently `1`. | +| `katago.name` | Model name. 1 to 96 characters of `[A-Za-z0-9_-]`, since it is used in cache filenames. | +| `katago.modelVersion` | KataGo model version, which fixes the input encoding and the output decoding. KataGo 1.17.3 accepts 3 through 17. | +| `katago.numInputChannels`, `katago.numInputGlobalChannels`, `katago.numInputMetaChannels` | Input channel counts. Each has exactly one legal value for the model version, and is checked. | +| `katago.numPolicyChannels`, `katago.numValueChannels`, `katago.numScoreValueChannels`, `katago.numOwnershipChannels` | Output channel counts, likewise checked. | +| `katago.build.nnXLen`, `katago.build.nnYLen` | Board buffer size the graph was built for. | +| `katago.build.requireExactNNLen` | `true` if the graph omits board masking, and is therefore only valid for positions that fill the buffer. | + +Required for model version 15 and up, where the `.bin.gz` header also carries them, and optional below that, defaulting to `0` and `false`: + +| Key | Meaning | +|---|---| +| `katago.metaEncoderVersion` | 0 for a normal model, 1 for a human-style-play model with an `InputMeta` input. | +| `katago.preferPassAliveUnderSuicideRules` | Whether the model expects pass-alive input features computed as if multi-stone suicide were legal. | +| `katago.preferExcludeTerritoryAdjacentToAtari` | Whether the model expects territory scoring with no seki tax to exclude empty points adjacent to a chain in atari, per rules version 3. Affects both its territory input features and how its games are adjudicated. | + +Required for model version 13 and up, again matching the `.bin.gz` header, and optional below that, defaulting to 20, 20, 20, 20, 40, 0.25 and 30 respectively: + +`katago.postProcess.tdScoreMultiplier`, `katago.postProcess.scoreMeanMultiplier`, `katago.postProcess.scoreStdevMultiplier`, `katago.postProcess.leadMultiplier`, `katago.postProcess.varianceTimeMultiplier`, `katago.postProcess.shorttermValueErrorMultiplier`, `katago.postProcess.shorttermScoreErrorMultiplier` + +Optional: + +| Key | Default | Meaning | +|---|---|---| +| `katago.postProcess.outputScaleMultiplier` | `1` | Every raw output is multiplied by this before decoding. Only needed by a graph whose activations are deliberately scaled. | +| `katago.fp32Nodes.trunkTipAndHead`, `katago.fp32Nodes.rmsNorm` | empty | Newline-separated node names that TensorRT keeps in FP32. See [Keeping layers out of FP16](#keeping-layers-out-of-fp16). | +| `katago.build.scale8Applied` | `false` | Whether the 1/8 activation rescaling was applied when the graph was built. The compensation for it lives in `outputScaleMultiplier`. | +| `katago.build.transformerNHWC` | `false` | Whether the trunk runs channel-last. TensorRT keys its timing and plan caches on this, so the two layouts do not share cache entries. | +| `katago.info.arch.trunkSpatialConvDepth`, `katago.info.arch.numParameters`, `katago.info.arch.hasAnyTransformerBlocks`, `katago.info.arch.hasAnyNestedBottleneckBlocks` | `0`, `false` | Used only for log lines and for test tolerances. Worth setting: `runnnevalcanarytests` picks its tolerances by model size and applies its most permissive ones to a model that declares no depth. | +| `katago.info.sourceSha256` | empty | The sha256 of the `.bin.gz` the graph was built from, if any. | + +### Example + +The metadata for a model version 15 net built for a 19x19 buffer, with masking, and with no output scaling or FP32 pinning: + +``` +katago.metadataVersion = 1 +katago.name = my-model +katago.modelVersion = 15 +katago.numInputChannels = 22 +katago.numInputGlobalChannels = 19 +katago.numInputMetaChannels = 0 +katago.numPolicyChannels = 2 +katago.numValueChannels = 3 +katago.numScoreValueChannels = 6 +katago.numOwnershipChannels = 1 +katago.metaEncoderVersion = 0 +katago.preferPassAliveUnderSuicideRules = false +katago.preferExcludeTerritoryAdjacentToAtari = false +katago.postProcess.tdScoreMultiplier = 20 +katago.postProcess.scoreMeanMultiplier = 20 +katago.postProcess.scoreStdevMultiplier = 20 +katago.postProcess.leadMultiplier = 20 +katago.postProcess.varianceTimeMultiplier = 40 +katago.postProcess.shorttermValueErrorMultiplier = 0.25 +katago.postProcess.shorttermScoreErrorMultiplier = 150 +katago.build.nnXLen = 19 +katago.build.nnYLen = 19 +katago.build.requireExactNNLen = false +``` + +The channel counts are the only legal ones for model version 15. The `postProcess` multipliers are not fixed by the version; they are properties of how the net was trained, so take them from the model you are converting rather than from this example. + +Adding metadata to an existing graph with the `onnx` Python package: + +```python +import onnx + +props = {"katago.metadataVersion": "1", "katago.name": "my-model", ...} + +model = onnx.load("model.onnx") +for key, value in props.items(): + entry = model.metadata_props.add() + entry.key, entry.value = key, value +onnx.save(model, "model.onnx") +``` + +For a complete working example, dump any KataGo model and read its metadata: + +``` +katago dumponnx -model model.bin.gz -out model.onnx +python -c "import onnx; print(onnx.load('model.onnx').metadata_props)" +``` + +## Checking your model + +KataGo validates the file's structure, not its behavior. A graph that satisfies the contract but computes the wrong thing will load and then play badly, so check a new model against something: + +* `katago runnnevalcanarytests -model model.onnx -config configs/gtp_example.cfg` evaluates a handful of known positions and asserts that the top policy move, winrate, score and lead are sane. This quickly catches gross errors such as misrouted inputs, a wrong output channel order, or a wrong `outputScaleMultiplier`. It evaluates a rectangular board alongside the 19x19 ones, so it needs a masked graph. +* `katago testgpuerror -model model.onnx -config configs/gtp_example.cfg` reports how far the backend's outputs drift from its own FP32 outputs, which is the quickest way to see whether a graph is numerically healthy in FP16. Adding `-reference-file ref.bin` compares against saved outputs instead, which is how to check a converted or quantized graph against the model it came from. The reference file can only be written by an Eigen build, by running the same command there with the original model. +* If you converted from a `.bin.gz`, the strongest check is to run the same command against both files and diff the output. They should evaluate identically. + +## Keeping layers out of FP16 + +`katago.fp32Nodes.trunkTipAndHead` and `katago.fp32Nodes.rmsNorm` are newline-separated lists of node names. When TensorRT builds an FP16 engine, it matches them against the network's layer names and pins each match to FP32, as a hard constraint so that TensorRT cannot fuse an FP16 path back in. It logs how many layers it pinned. + +KataGo uses them for two separate reasons. + +**Accuracy, cheaply.** `trunkTipAndHead` covers the whole region from the trunk tip through the policy and value heads. That region is a small fraction of the total compute but holds the normalizations and small final projections where precision matters most. On the two nets tested, pinning it cut the average winrate error against the same graph's FP32 outputs by 5 to 15 percent and left policy error unchanged. The same trade is usually worth making in a graph of your own. + +**Avoiding overflow.** `rmsNorm` covers only the square, reduce and square-root steps of each RMSNorm; the division, scale and mask that follow are elementwise and FP16-safe. A sum of squares over C, H and W at 19x19 reaches about 138000, well past the FP16 maximum of 65504, and overflows to infinity. KataGo hit this in the trunk-tip normalization, and the result was confident but completely wrong evaluations. + +Pinning has a limit worth knowing: a per-layer FP32 constraint sets a layer's input and output types, not the internal accumulator of a kernel that TensorRT fuses. In the overflow above the reduction was pinned successfully and still overflowed, because TensorRT fused the square into it and accumulated in FP16. The fix was arithmetic: KataGo now computes every such reduction as a mean rather than a sum, so the value stays small whatever precision it is computed in. If your graph has large FP16 reductions, make the arithmetic safe and treat pinning as a second line of defense. + +Both keys are optional: + +* Names that match nothing in the built network are an error under FP16. This means the graph was rewritten after the metadata was written, and quietly losing the protection is worse than refusing to run. +* Omitting them is allowed, since your graph may have no such hazard, but TensorRT warns when it builds an FP16 engine for a graph that declares none. + +The ONNX Runtime backend ignores these keys. It has no per-node precision control, and precision is up to the execution provider. + +## Versioning + +`katago.metadataVersion` is the version of the contract on this page. A KataGo build accepts a range of versions: + +* A file newer than the build understands is refused, since its keys may not mean what the build thinks they mean. +* A file older than the build's minimum is refused, and can be regenerated with `dumponnx`. KataGo raises that minimum only when it can no longer honor the old semantics, so old files normally keep working. + +When extending the format, first decide which namespace the new key belongs in: + +* A key that changes evaluation, decoding or adjudication goes under `katago.`, and it should be **required** rather than optional with a default. Silently defaulting a semantic flag off is the failure the must-understand namespace exists to prevent, and a default cannot be inferred from the graph. Adding one bumps the version, as does changing the meaning or units of an existing key, or changing the graph input/output contract. +* A key that only feeds log lines or diagnostics goes under `katago.info.`, with a documented default. Adding one does not bump the version: old readers skip it, and new readers fall back to the default for files that lack it. + +Refusing unknown `katago.` keys is the backstop, not the mechanism. Bump the version when the rule says to, so that an older build can report which version it needed instead of reporting a key it has never heard of. + +The key list and version constants live in `cpp/neuralnet/onnxmodelbuilder.cpp`, next to a comment pointing back at this document. Changes to one belong with changes to the other. diff --git a/docs/rules.html b/docs/rules.html index 4bb5dfa609..db0f09c201 100644 --- a/docs/rules.html +++ b/docs/rules.html @@ -226,8 +226,8 @@ -

KataGo's Supported Go Rules (Version 2)

-This page describes the full rigorous rules implemented by KataGo. Updated from rules version 1 right around the start of 2021 to fix an issue where basic double ko death was a mismatch with Japanese rules. These rules are supported in KataGo version 1.8 and later. Additionally, neural nets trained with the old rules, before 2021 or in early 2021 may fail to evaluate such situations correctly even when used with KataGo version 1.8 or later - the version *and* the net both need to be up-to-date. Also updated from version 1 are some minor wording typos. +

KataGo's Supported Go Rules (Version 3)

+This page describes the full rigorous rules implemented by KataGo. Updated from rules version 2 in 2026 to fix an issue with territory scoring when TaxRule is None, where unfilled ko mouths in sekis would count as a point of territory, and could result in pass fights over such kos. These rules are supported in KataGo version 1.17.3 and later. Additionally, neural nets trained with the old rules may fail to evaluate such situations correctly even when used with KataGo version 1.17.3 or later - the version *and* the net both need to be up-to-date.

A hope also is that this document can serve as a reference for anyone to implement any subset of such rules themselves - including a rigorous nearly-Japanese rules that bots can use for self-play or for competitive matches completely without need for outside adjudication or dispute resolution or any other protocol besides just the bots making ordinary plays. @@ -554,7 +554,7 @@

Cleanup Phase Ending and Scoring

  • (if TaxRule is None): A player's score is the sum of:
      -
    • +1 for every point in empty regions bordered by their color and not by the opposing color.
    • +
    • +1 for every empty point that is within pass-alive-territory of their color, OR that is not adjacent to any region in atari and is in an empty region bordered by their color and not by the opposing color.[12]
    • + The total number of captures of the opposing color.
    • +1 for every move made by that player during the second cleanup phase.
    • -1 for every point of their color not within independent-life-regions and that was not their color at the start of the second cleanup phase.
    • @@ -604,7 +604,7 @@

      Cleanup Phase Ending and Scoring

    • (if TaxRule is None): A player's score is the sum of:
      • -1 for every move made by that player in the main phase OR first cleanup phase.
      • -
      • +1 for every point in empty regions bordered by their color and not by the opposing color.
      • +
      • +1 for every empty point that is within pass-alive-territory of their color, OR that is not adjacent to any region in atari and is in an empty region bordered by their color and not by the opposing color.[12]
      • +1 for every point of their color that is within independent-life-regions OR that was their color at the start of the second cleanup phase.
      • If the player is white, Komi.
      • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
      • @@ -718,6 +718,16 @@

        Cleanup Phase Ending and Scoring

        A number of human rulesets allow for Black to begin with N >= 2 stones on the board when playing a game between two differently-skilled players, with these stones being placed in a ruleset-specified way, and with White making the first actual game move instead of Black. For various reasons, during handicap games many of these rulesets give White bonus points based on N, additionally on top of any komi or other settings. Some rulesets give 0 points, some give N-1 points, and some give N points. (Back) + + +
        +[12] +The condition excluding empty points adjacent to regions in atari handles sekis that contain an unfilled ko mouth. Without it (as in version 2 of these rules), the ko mouth would count as a point for whichever player kept the ko mouth open. Since filling the ko would then lose that point, players would be incentivized during the cleanup phase to try to have the game end with such kos unresolved. For "normal" fillable kos, this is not normally game-breaking since whichever player who would lose the ko is incentivized to fill it, which leaves the other player unable to fight it perpetually. However, for one-sided ko (as in certain thousand-year-ko situations), where only one side can fill, the side that can fill can continue a pass-fight over the ko almost perpetually, since the other side has no way to fill the ko and thus no recourse. +

        +Note that within an empty region bordered by only one color, any region in atari adjacent to a point of it is necessarily a region of that same color, so this condition never disqualifies territory due to dead opposing stones in atari (such as throw-ins). Under SelfPlayOpts, territory containing or bordering dead opposing stones can additionally count via the pass-alive-territory condition, without requiring those stones to be captured, since pass-alive territory is unconditionally safe - this matches how KataGo's implementation scores such positions as-is. +(Back)
        + diff --git a/docs/rulesv2.html b/docs/rulesv2.html new file mode 100644 index 0000000000..3be8769470 --- /dev/null +++ b/docs/rulesv2.html @@ -0,0 +1,727 @@ + + + + + + + + + + +

        KataGo's Supported Go Rules (Version 2)

        + +This is NOT the latest version of these rules. The latest rules can be found here. + +This page describes the full rigorous rules implemented by KataGo. Updated from rules version 1 right around the start of 2021 to fix an issue where basic double ko death was a mismatch with Japanese rules. These rules are supported in KataGo version 1.8 and later. Additionally, neural nets trained with the old rules, before 2021 or in early 2021 may fail to evaluate such situations correctly even when used with KataGo version 1.8 or later - the version *and* the net both need to be up-to-date. Also updated from version 1 are some minor wording typos. + +

        +A hope also is that this document can serve as a reference for anyone to implement any subset of such rules themselves - including a rigorous nearly-Japanese rules that bots can use for self-play or for competitive matches completely without need for outside adjudication or dispute resolution or any other protocol besides just the bots making ordinary plays. +

        +I believe the nearly-Japanese rules should correctly handle a wide variety of details, so long as both players play to rationally maximize their score. For example: + +

          +
        • Bent-four-in-the-corner will die regardless of external ko threats.
        • +
        • No territory in seki, including no territory for one-sided dame (a common quirk of simpler territory rules). +
        • Double-ko-seki and thousand-year-ko are sekis, double ko death is a death.
        • +
        • One should finish a direct ko rather than leave it open, even if there are enough ko threats to pass and still leave it open, but multi-step-ko need not be finished.
        • +
        +A known difference is with three-points-without-capturing, and a few other exotic rules beasts are also known that will cause a difference, but these should be very very rare. +

        + +


        +

        Parameters

        +
        + +Click the buttons or individually uncheck some of the boxes to hide parts of the logic for rules you don't care about. +
        +NOTE: Some online servers that claim to implement certain rules might actually differ. For example, OGS's implementation of Chinese rules uses positional superko, which differs from actual practice in Chinese Go tournaments that normally use just a simple ko rule. If you're implementing a bot to run on a server, always look up the details! +
        + +
        + + + + + + + + +
        + +
          +
        • X,Y:
          Integers indicating the board size.
        • +
        • Komi:
          Integer or half-integer indicating compensation given to White for going second.
        • +
        • KoRule:
          The variant of the rule prohibiting repetition. https://senseis.xmp.net/?KoRules +
          + + + +
          +
        • +
        • ScoringRule:
          Defines what the score of a finished game is. https://senseis.xmp.net/?Scoring +
          + + +
          +
        • +
        • TaxRule:
          Minor adjustments to scoring rule, indicating what, if any, empty points may not be scored. +
          + + + +
          +
        • +
        • MultiStoneSuicide:
          Whether suicide of multiple stones is allowed. (in these rules, a suicide move that kills only the stone just played and nothing else, leaving the board unchanged, is never allowed) +
          + + +
          +
        • +
        • Button:
          Whether a half-point is awarded to the first player to be able to pass. (e.g. slightly rewarding endgame efficiency, partially reconciling area and territory scoring). +
          + + +
          +
        • +
        • WhiteHandicapBonus:
          How many bonus points white receives during handicap games when black gets N stones. KataGo supports handicap games, but for simplicity, this rules document does NOT describe them. These checkboxes are included merely to provide a convenience reference as how this quirk of handicap game scoring differs between rulesets. +
          + + + +
          +
        • +
        • SelfPlayOpts:
          Some optimizations that KataGo uses for self-play. These theoretically could make a difference to correct play in extremely contrived situations involving things like carefully constructed superko histories, but for all practical purposes these rules modifications are compatible with the rules without these modifications and simply speed up self-play a via faster game end, even if one or both players want to prolong the game. +
          + +
          +
        • +
        + +
        + +

        +Rules +

        + +
        + +

        +Basic Definitions +

        + +
          +
        1. Go is played on an X by Y rectangular grid of points by two opposing players, Black and White.
        2. +
        3. Each point on the grid can be colored black or white or be empty. The coloring status of all points together is the grid coloring.
        4. +
        5. Points are adjacent/bordering if they are horizontally or vertically touching.
        6. +
        7. Within a set of points, two points are connected if one is adjacent to the other or is connected to a point adjacent to the other. The set itself is connected if every pair of points in it is connected within that set.
        8. +
        9. A set of points and a point not in that set are adjacent/bordering if that point is adjacent to some member of the set. Two disjoint sets of points are adjacent/bordering if one borders at least one point of the other. A set of points borders a color if it borders at least one point of that color.
        10. +
        11. A {black, white, empty, maximal-non-black, maximal-non-white} region is any maximal connected set of {black, white, empty, non-black, non-white} points, respectively. Maximal means there is no strictly larger connected set of such points that contains it. +
        + +
        + +

        +Pseudolegal moves +

        +
          +
        1. A liberty of a black or white region is any empty point that borders it.
        2. +
        3. Resolving captures of a color consists of emptying all points of regions of that color with no liberties. Every emptying of a point this way during the game adds to the total number of captures of that color.
        4. +
        5. A pseudolegal move consists of a player performing the following: +
            +
          • Coloring an empty point with the player's color.
          • +
          • Then resolving captures of the opponent's color.
          • +
          • Then resolving captures of the player's color.
          • +
          +...subject the restriction that this must NOT result in same grid coloring as prior to these steps. + +
          +...(if MultiStoneSuicide is Disallowed) and also subject to the restriction that resolving captures of the player's own color must NOT empty any points. +
          +
          +
          +For any regions emptied by the steps of resolving captures, we say that the move captures those regions. +
        6. +
        + +
        + +

        +Additional Definitions +

        + + +
          +
        1. An empty region that borders both black and white is a dame region.
        2. + +
        3. A black or white region is in atari if it is has exactly one liberty.
        4. + +
        5. A {maximal-non-white, maximal-non-black} region is a {black, white} independent-life-region if it does NOT contain any dame regions or any regions in atari.[1]
        6. +
        +
        + + +
          +
        1. A black or white region R is a pass-alive-group if there does not exist any sequence of consecutive pseudolegal moves of the opposing color that results in emptying R.[2]
        2. + +
        3. A {maximal-non-black, maximal-non-white} region R is pass-alive-territory for {Black, White} if all {black, white} regions bordering it are pass-alive-groups, and all or all but one point in R is adjacent to a {black, white} pass-alive-group, respectively.[3] +
        4. +
        +
        + +
        + +

        +Main Phase +

        + +The game begins with a main phase of play and then possibly one or two cleanup phases. + +

        +During the main phase the state consists of: +

          +
        • The grid coloring.
        • +
        • (if KoRule is Simple or Situational SuperKo): Additionally, the color of the player next to take a turn.
        • +
        • (if Button is Used): Additionally, whether or not at least one pass has occurred.
        • +
        + +

        +Starting with an empty grid, the players alternate turns, starting with Black. A turn in the main phase is either a pass or a legal move. +

          +
        • A pass cedes the turn with no effect (but may possibly end the phase, as described below).
        • + +
        • A legal move during the main phase is any pseudolegal move that... +
            +
          • (if KoRule is Simple): ...doesn't result in the state at the start of the opponent's previous turn.
          • +
          • (if KoRule is Positional or Situational SuperKo): ...doesn't result in any earlier state.
          • +
          +
        • +
        + +

        +The main phase ends after: +

          +
        1. (if Button is NotUsed): There are 2 consecutive passes.
        2. +
        3. (if Button is Used): There are 2 consecutive passes, ignoring the first pass of the game.
        4. +
        5. (if KoRule is Simple): Additionally the phase also ends if: +
            +
          1. A player passes from a state that the player has already passed from once before.[4]
          2. +
          3. OR at the start of a player's turn, the current state has already occurred twice before since the most recent pass by either player. In this case the not only the main phase ends but the entire game immediately ends as well, with a result of "no result".[5]
          4. +
          +
        6. +
        7. (if SelfPlayOpts is Enabled): Additionally, the phase also ends at the end of a turn if every point on the board belongs to a pass-alive-group or pass-alive-territory. In this case the entire game ends immediately as well and is scored exactly as if the game had ended by both players repeatedly passing with no further legal moves or other actions.
        8. +
        + +

        +After the main phase ends: +

        + + +(if ScoringRule is Territory) +
        +The game is NOT ended or scored and instead continues with two cleanup phases (see "Cleanup Phases" section below). +
        + +

        +(if ScoringRule is Area) +
        +The game ends and is scored as follows: +
          + +
        • (if SelfPlayOpts is Enabled): Before scoring, for each color, empty all points of that color within pass-alive-territory of the opposing color.
        • + +
        • (if TaxRule is None): A player's score is the sum of: +
            +
          • +1 for every point of their color.
          • +
          • +1 for every point in empty regions bordered by their color and not by the opposing color.
          • +
          • If the player is White, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass.
          • +
          +
        • + +
        • (if TaxRule is Seki): A player's score is the sum of: +
            +
          • +1 for every point of their color.
          • +
          • +1 for every empty point within independent-life-regions of their color.
          • +
          • If the player is White, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass.
          • +
          +
        • + +
        • (if TaxRule is All): A player's score is the sum of: +
            +
          • +1 for every point of their color.
          • +
          • +1 for every empty point within independent-life-regions of their color.
          • +
          • -2 points for every independent-life-region of their color.
          • +
          • If the player is White, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass.
          • +
          +
        • + +
        + + +Although handicap games are not a focus of these rules, see [11] for some notes about handicap game scoring. + + +

        +The player with the higher score wins, or the game is a draw if equal score. + +

        + +
        + +
        +

        +Cleanup Phases +

        + These phases only occur if scoringRule is Territory. + +

        +Cleanup is designed to try to match most of the ways that positions would be ruled and scored under normal Japanese rules, so long as players self-interestedly maximize their score during cleanup. Broadly, this is done by giving players 1 point of compensation per move during the (second) cleanup phase, such that the players can now capture dead stones and resolve all disputes without loss of points for filling in territory. + +

        +A variety of details are also managed to implement other quirks of Japanese rules. Including there-are-no-points-in-seki, and the Japanese conception of each position as "independent", such that ko threats in one part of the board do not affect the status of the rest of the board. For example, a bent-four-in-the-corner will still resolve as dead under optimal play with these rules even if there are unremovable ko threats on the rest of the board. A lot of the mechanism to do this is based on the Japanese rules themselves, attempting to formalize their spirit to try to make them rigorous enough for self-play. + +

        + +We do not aim for a 100% perfect match, however. For example, under this ruleset, three-points-without-capturing will (usually) entirely naturally be three points without capturing with no need for any special ruling, matching the traditional Japanese ruling (and in effect, justifying it). But the modern Japanese rules instead regard it as a seki, in which black must concede down to two points to get anything. More exotic kinds of positions will also differ between these rules and Japanese rules. + +

        Cleanup Phase Basics and Definitions

        + +
          +
        1. A ko-move for a player in a position is any pseudolegal move M where the opponent would have a pseudolegal move in response, the ko-reply, that would result in exactly the grid coloring prior to M.
        2. + +
        3. In addition to the grid coloring, points on the grid may be marked as ko-recapture-blocked.
        4. + +
        5. The state during cleanup phases consists of the grid coloring together with the ko-recapture-blocked status of all points and the color of the player next to take a turn.
        6. +
        + +

        Cleanup Phase Play

        + +

        +Cleanup lasts for two phases[6]. In each phase, starting with the grid coloring from the end of the previous phase, the players alternate turns, starting with the opponent of the player who took the last turn of the previous phase. A turn in the cleanup is either a pass, a legal move, or an unblock-ko-recapture action.[7] +

          +
        • A pass cedes the turn with no effect (but may possibly end the phase, as described below).
        • +
        • A legal move by a player during a cleanup phase is any pseudolegal move that either... +
            +
          • Is NOT a ko-move.
          • +
          • Is a ko-move that both... +
              +
            • Does NOT capture any region containing a point marked as ko-recapture-blocked.
            • +
            • AND where that player did NOT on any earlier turn during the same cleanup phase make a legal move on exactly the same point with exactly the same grid coloring.[8]
            • +
            + Then, followed by marking the point colored by the move as ko-recapture-blocked. +
          • +
          + Then, followed by unmarking all ko-recapture-blocked points whose grid color is empty. +
        • +
        • An unblock-ko-recapture action consists of a player choosing a a single-point region of the opposing color that is in atari and marked as ko-recapture-blocked, and removing that mark.
        • +
        + +

        Cleanup Phase Ending and Scoring

        + +

        +A cleanup phase ends after any of: +

          +
        1. There are two consecutive passes.
        2. +
        3. OR a player passes from a state that the player has already passed from once before during the same phase.[9]
        4. +
        5. OR at the start of a player's turn, the current state has already occurred twice before since the most recent pass by either player during this phase. In this case the not only the phase ends but the entire game immediately ends as well, with a result of "no result".
        6. +
        + +

        +After the first cleanup phase ends, the second cleanup phase begins immediately with the same grid coloring but with all ko-recapture-blocks unmarked. + +

        +After the second cleanup phase ends, the game ends and is scored as follows: +

          + +
        • (if SelfPlayOpts is Enabled): Before scoring, for each color, empty all points of that color within pass-alive-territory of the opposing color. Points emptied this way also add to the total number of captures of that point's color.
        • + +
        • (if TaxRule is None): A player's score is the sum of: +
            +
          • +1 for every point in empty regions bordered by their color and not by the opposing color.
          • +
          • + The total number of captures of the opposing color.
          • +
          • +1 for every move made by that player during the second cleanup phase.
          • +
          • -1 for every point of their color not within independent-life-regions and that was not their color at the start of the second cleanup phase.
          • +
          • If the player is white, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
          • +
          +
        • +
        • (if TaxRule is Seki): A player's score is the sum of: +
            +
          • +1 for every empty point within independent-life-regions of their color.
          • +
          • + The total number of captures of the opposing color.
          • +
          • +1 for every move made by that player during the second cleanup phase.
          • +
          • -1 for every point of their color not within independent-life-regions and that was not their color at the start of the second cleanup phase.
          • +
          • If the player is white, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
          • +
          +
        • +
        • (if TaxRule is All): A player's score is the sum of: +
            +
          • +1 for every empty point within independent-life-regions of their color.
          • +
          • + The total number of captures of the opposing color.
          • +
          • +1 for every move made by that player during the second cleanup phase.
          • +
          • -1 for every point of their color not within independent-life-regions and that was not their color at the start of the second cleanup phase.
          • +
          • -2 points for every independent-life-region of their color.
          • +
          • If the player is white, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
          • +
          +
        • +
        + +See [10] for some remarks about the scoring. +
        + +Although handicap games are not a focus of these rules, see [11] for some notes about handicap game scoring. + + +

        +The player with the higher score wins, or the game is a draw if equal score. + +


        + +

        +For computer AI training, the following equivalent formulation for a player's score could also be used if desired. +This formulation is much more similar to area scoring, in that it factors over the board as simply a sum of +1/0/-1 for each point on the board, and moves within independent-life-regions by either player do not affect this "ownership" sum whatsoever (so long as dead stones are cleaned up and borders and dame are finished). + +

          +
        • (if TaxRule is None): A player's score is the sum of: +
            +
          • -1 for every move made by that player in the main phase OR first cleanup phase.
          • +
          • +1 for every point in empty regions bordered by their color and not by the opposing color.
          • +
          • +1 for every point of their color that is within independent-life-regions OR that was their color at the start of the second cleanup phase.
          • +
          • If the player is white, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
          • +
          +
        • +
        • (if TaxRule is Seki): A player's score is the sum of: +
            +
          • -1 for every move made by that player in the main phase OR first cleanup phase.
          • +
          • +1 for every empty point within independent-life-regions of their color.
          • +
          • +1 for every point of their color that is within independent-life-regions OR that was their color at the start of the second cleanup phase.
          • +
          • If the player is white, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
          • +
          +
        • +
        • (if TaxRule is All): A player's score is the sum of: +
            +
          • -1 for every move made by that player in the main phase OR first cleanup phase.
          • +
          • +1 for every empty point within independent-life-regions of their color.
          • +
          • +1 for every point of their color that is within independent-life-regions OR that was their color at the start of the second cleanup phase.
          • +
          • -2 points for every independent-life-region of their color.
          • +
          • If the player is white, Komi.
          • +
          • (if Button is Used): +0.5 if this player was the first to pass during the main phase.
          • +
          +
        • +
        + +
        + +
        + +
        + +
        +[1] +The intent is "independent-life-regions" indicate regions that are not seki, so long as both players finish all borders and fill all dame. This is motivated by the way Japanese rules attempt to define "seki" using dame. Using the presence of dame to determine seki is actually a pretty clever solution - my original idea had only been to use ability-to-make-pass-alive-ness, but this is considerably more awkward in practice than using dame. +

        +We also include the condition of "atari" to handle groups that have no dame but still survive without two eyes by virtue of having ko mouths. This handles double ko seki. +(Back)
        + + +
        +[2] +Pass-aliveness can be computed by a straightforward algorithm: https://en.wikipedia.org/wiki/Benson%27s_algorithm_(Go). Note that a slight adjustment to the algorithm presented is technically needed if multi-stone suicide is allowed. +(Back)
        + + +
        +[3] +Under this definition, it is possible that a region with one completely interior point is pass-alive-territory but the addition of a single stone on that interior point results in the region no longer being considered pass-alive-territory because the single stone is not a pass-alive-group. We ignore this minor "flaw" since it makes for a simpler definition and algorithmic implementation. +(Back)
        + + +
        +[4] +This Spight-style termination condition ensures that sending-two-returning-one-like positions will terminate, even under area scoring where the cycle does not "cost" points. It also cuts it shorter under territory scoring, so that a badly behaving bot doesn't lose by ~infinity. +

        +The approach taken taken by many Chinese tournaments is to simply prohibit sending-two-returning-one. (Chinese written rules appear to say positional superko, but this written rule is often not used for real tournaments). This would also be easy to implement and KataGo could easily choose to support it in the future, since for all practical purposes a neural net trained under simple ko rules should work fine without modification in an engine that bans sending-two-returning-one. +

        +However, there is also sending-three-returning-one - and perhaps there are others messy cases too, that one would imagine professional players balking at allowing despite not having formally listed and prohibited them ahead of time in written rules. Spight's condition is a much cleaner way to handle them for now. +

        +Some computer tournament rules handle this by simply declaring long cycles to be draws/wins/losses depending on number of stones captured. It would be easy trivial to support these too in the future if needed and probably would not in practice require retraining a neural net either. But for now, no actual human rulesets use this rule, and even in the computer world, positional or situational superko are often more popular. +(Back)
        + + +
        +[5] +Under some real-life human rules, an unbounded cycle would not end the game in and of itself at exactly such a point, rather the game may be manually adjudicated as a no-result. But our goal here is to get a formalization of Japanese-like ko rules for computer self-play, so dictating a precise ending point is necessary. The requirement for no intervening passes makes absolutely sure that we do not no-resultify sending-two-returning-one style positions, even with weird unforeseen move orderings. +(Back)
        + + +
        +[6] +Why have two phases instead of just one? +

        +The intent is that the first phase introduces changes to the ko rules alone, allowing any positions destabilized by it to settle down. Then, the second phase additionally introduces a +1 point per move that allows players to actually begin capturing dead stones without loss of points. If both changes were introduced at once, in some cases, this leads to a highly non-intuitive "pass fight" that is absent from true Japanese rules. This can occur if a protective move becomes necessary once the ko rules change - then we may see players exchange ko threats to try to be not the second to pass and therefore to be first to play in cleanup, since being first to play in cleanup would enable making the protective move with +1 point instead of with +0 points. +

        +Introducing the ko rule and score bonus changes in separate phases eliminates this issue. +(Back)
        + + +
        +[7] +The unblock-ko-recapture action is effectively the Japanese rules's "pass for ko". We name it this way to avoid calling it a pass, since it shares little else in common with a pass with regard to the rules necessary to make cleanup work. Also, highly conveniently, an unblock-ko-recapture for a ko-move location is always mutually exclusive with a legal move for that location, which means we have no need to change the protocol for GTP or introduce new move encodings. We can continue to use the exact same 19x19 + 1 encodings in all existing protocols to represent moves. +(Back)
        + + +
        +[8] +This condition prevents a double ko seki from looping forever in the cleanup phase, at least in the simplest cases, in theory. It must depend on the exact grid coloring rather than be a general prohibition on continuing to unblock and recapture a ko or kos over and over because if the seki is temporary such that one side can capture a surrounding group to collapse it, we must make sure capturing into the ko is not prohibited at that point. +

        +Unfortunately, as stated, this rule still allows quite a large amount of game-prolonging due to double-ko-seki, which makes it not ideal for selfplay. Is there a better formulation that is still clean to state and implement, that limits the ability of the attacker to fruitlessly cycle the double-ko-seki? +(Back)
        + + +
        +[9] +This Spight-style termination condition ensures that sending-two-returning-one-type positions will terminate, even during the second cleanup phase when the cycle no longer "costs" points. +(Back)
        + + +
        +[10] +The "color at the start of the second cleanup phase" condition prevents one-sided dame from granting points to the side able to fill the dame. +

        +We go ahead and have an allowance for Button Go here too. This may seem odd, since normally the intent is as a way obtain territory-scoring granularity with area-scoring, so if already using territory-scoring, why would one want such a rule? But at least when we came to implement it in KataGo, it seemed programmatically no more complex (simpler, even) to just have it as an option always, and formulating it this way makes for more natural extension to Coupon Go if desired, which *does* make sense in territory scoring. KataGo for now does NOT actually support territory + button though. +(Back)
        + + +
        +[11] +A number of human rulesets allow for Black to begin with N >= 2 stones on the board when playing a game between two differently-skilled players, with these stones being placed in a ruleset-specified way, and with White making the first actual game move instead of Black. For various reasons, during handicap games many of these rulesets give White bonus points based on N, additionally on top of any komi or other settings. Some rulesets give 0 points, some give N-1 points, and some give N points. +(Back)
        + +
        + + + diff --git a/python/export_model_pytorch.py b/python/export_model_pytorch.py index 5567e66468..e991137880 100644 --- a/python/export_model_pytorch.py +++ b/python/export_model_pytorch.py @@ -152,12 +152,20 @@ def writestr(s): elif model_config.get("always_compute_pass_alive_under_suicide_rules"): logging.warn("Autoupgrading v15 or v16 model to v17 due to always_compute_pass_alive_under_suicide_rules") version = 17 + elif model_config.get("exclude_territory_adjacent_to_atari"): + logging.warn("Autoupgrading v15 or v16 model to v17 due to exclude_territory_adjacent_to_atari") + version = 17 if model_config.get("always_compute_pass_alive_under_suicide_rules") and version < 17: raise Exception( "always_compute_pass_alive_under_suicide_rules is set but model would be exported as version " + str(version) + " < 17, which can technically represent it but we're not outputting in practice" ) + if model_config.get("exclude_territory_adjacent_to_atari") and version < 17: + raise Exception( + "exclude_territory_adjacent_to_atari is set but model would be exported as version " + + str(version) + " < 17, which can technically represent it but we're not outputting in practice" + ) writeln(model_name) writeln(version) @@ -194,13 +202,19 @@ def writestr(s): writeln(1) else: writeln(0) + # preferExcludeTerritoryAdjacentToAtari: 1 if the model expects territory scoring with + # TaxRule NONE to exclude empty points adjacent to chains in atari (rules version 3), + # both for adjudication and for its territory input features. + if model_config.get("exclude_territory_adjacent_to_atari"): + writeln(1) + else: + writeln(0) # Write some dummy placeholders for future features writeln(0) writeln(0) writeln(0) writeln(0) writeln(0) - writeln(0) def write_weights(weights): diff --git a/python/katago/game/board.py b/python/katago/game/board.py index 7c5002986e..17c0d2ec9f 100644 --- a/python/katago/game/board.py +++ b/python/katago/game/board.py @@ -1121,7 +1121,7 @@ def calculateArea(self, result, nonPassAliveStones, safeBigTerritories, unsafeBi if result[loc] == Board.EMPTY: result[loc] = self.board[loc] - def calculateNonDameTouchingArea(self, result, keepTerritories, keepStones, isMultiStoneSuicideLegal): + def calculateNonDameTouchingArea(self, result, keepTerritories, keepStones, excludeTerritoryAdjacentToAtari, isMultiStoneSuicideLegal): #First, just compute basic area. basicArea = [Board.EMPTY for i in range(self.arrsize)] for i in range(self.arrsize): @@ -1142,7 +1142,21 @@ def calculateNonDameTouchingArea(self, result, keepTerritories, keepStones, isMu for x in range(self.x_size): loc = self.loc(x,y) if basicArea[loc] != Board.EMPTY and basicArea[loc] != self.board[loc]: - result[loc] = basicArea[loc] + #If excludeTerritoryAdjacentToAtari (rules version 3), empty points adjacent to a chain in + #atari (e.g. unfilled ko mouths in seki) don't count. Otherwise, under territory scoring + #with TaxRule NONE, possession of an unfillable ko mouth in a seki would be worth a point, + #resulting in pass fights over such kos. + #Note: only chains of the territory owner's own color block the territory (e.g. ko + #stones, or the group whose eye is its last liberty). Chains of the opposing color in + #atari (e.g. dead throw-in stones within pass-alive territory) deliberately do not. + bordersChainInAtari = False + if excludeTerritoryAdjacentToAtari and self.board[loc] == Board.EMPTY: + for i in range(4): + adj = loc + self.adj[i] + if self.board[adj] == basicArea[loc] and self.num_liberties(adj) == 1: + bordersChainInAtari = True + if not bordersChainInAtari: + result[loc] = basicArea[loc] if keepStones: for y in range(self.y_size): @@ -1378,8 +1392,8 @@ def calculateNonDameTouchingAreaHelper(self, basicArea, result): queue = [Board.PASS_LOC for i in range(self.arrsize)] #Iterate through all the regions that players own via area scoring and mark - #all the ones that are touching dame - isDameTouching = [False for i in range(self.arrsize)] + #all the ones that are touching dame OR that contain an atari stone + isSeki = [False for i in range(self.arrsize)] queueHead = 0 queueTail = 0 @@ -1392,15 +1406,17 @@ def calculateNonDameTouchingAreaHelper(self, basicArea, result): for y in range(self.y_size): for x in range(self.x_size): loc = self.loc(x,y) - if basicArea[loc] != Board.EMPTY and not isDameTouching[loc]: - #Touches dame? - if((self.board[loc+ADJ0] == Board.EMPTY and basicArea[loc+ADJ0] == Board.EMPTY) or + if basicArea[loc] != Board.EMPTY and not isSeki[loc]: + #Stone of player owning the area is in atari? Treat as seki. + #Touches dame? Treat as seki. + if((self.board[loc] == basicArea[loc] and self.num_liberties(loc) == 1) or + (self.board[loc+ADJ0] == Board.EMPTY and basicArea[loc+ADJ0] == Board.EMPTY) or (self.board[loc+ADJ1] == Board.EMPTY and basicArea[loc+ADJ1] == Board.EMPTY) or (self.board[loc+ADJ2] == Board.EMPTY and basicArea[loc+ADJ2] == Board.EMPTY) or (self.board[loc+ADJ3] == Board.EMPTY and basicArea[loc+ADJ3] == Board.EMPTY)): pla = basicArea[loc] - isDameTouching[loc] = True + isSeki[loc] = True queue[queueTail] = loc queueTail += 1 while queueHead != queueTail: @@ -1411,20 +1427,20 @@ def calculateNonDameTouchingAreaHelper(self, basicArea, result): #Look all around it, floodfill for j in range(4): adj = nextLoc + self.adj[j] - if basicArea[adj] == pla and not isDameTouching[adj]: - isDameTouching[adj] = True + if basicArea[adj] == pla and not isSeki[adj]: + isSeki[adj] = True queue[queueTail] = adj queueTail += 1 queueHead = 0 queueTail = 0 - #Now, walk through and copy all non-dame-touching basic areas into the result counting + #Now, walk through and copy all non-seki-touching basic areas into the result counting #how many there are. for y in range(self.y_size): for x in range(self.x_size): loc = self.loc(x,y) - if basicArea[loc] != Board.EMPTY and not isDameTouching[loc] and result[loc] != basicArea[loc]: + if basicArea[loc] != Board.EMPTY and not isSeki[loc] and result[loc] != basicArea[loc]: pla = basicArea[loc] result[loc] = basicArea[loc] queue[queueTail] = loc diff --git a/python/katago/game/features.py b/python/katago/game/features.py index 246eefb301..519ae6b096 100644 --- a/python/katago/game/features.py +++ b/python/katago/game/features.py @@ -232,6 +232,7 @@ def addPrevPrevLadderFeature(loc,pos,workingMoves): area, keepTerritories, keepStones, + rules.get("excludeTerritoryAdjacentToAtari",False), rules["multiStoneSuicideLegal"] ) diff --git a/python/katago/train/model_pytorch.py b/python/katago/train/model_pytorch.py index 3240420651..de327f565b 100644 --- a/python/katago/train/model_pytorch.py +++ b/python/katago/train/model_pytorch.py @@ -2438,8 +2438,15 @@ def forward(self, x, mask, mask_sum_hw, mask_sum:float, extra_outputs: Optional[ ks = k[:nb].float() ub_qnorm2 = (qs * qs).sum(dim=-1) # (B', H, S) ub_knorm2 = (ks * ks).sum(dim=-1) # (B', H, S) + # Clamp guards fully-dead heads (q/k projections decayed to exactly zero): + # sqrt(0) has an infinite derivative, and 0 * inf = NaN in backward even when + # the hinge is inactive, poisoning every gradient in the model. Below the clamp + # the gradient is exactly zero, which is fine: the penalty only pushes norms down. + # 1.0 is far below any hinge-active region (ub > cap requires this product to be + # >~1e4 even for small caps) and, unlike a tiny epsilon, stays a real floor even + # in fp16 (1e-12 underflows to 0) and keeps the backward 1/sqrt factor bounded. ub_state["ubs"].append( - scale * torch.sqrt(ub_qnorm2.amax(dim=-1) * ub_knorm2.amax(dim=-1)) # (B', H) + scale * torch.sqrt((ub_qnorm2.amax(dim=-1) * ub_knorm2.amax(dim=-1)).clamp(min=1.0)) # (B', H) ) if flex_block_mask is not None: @@ -3006,7 +3013,7 @@ def compute_attn_logit_dataless_bounds(model) -> Dict[str, float]: sinks), up to ~200x on layers that don't; see python/tmp/attn_logit_stats/. Inference backends mask off-board keys with large negative additive constants (-3e4 in fp16; - see cpp/neuralnet/cudahelpers.cu and onnxmodelbuilder.cpp), which is correct as long as + see cpp/neuralnet/cudaandrocmhelpers.inc and onnxmodelbuilder.cpp), which is correct as long as genuine logit magnitudes stay well below that scale - this bound certifies it from weights alone. """ bounds = {}