diff --git a/.github/workflows/asan.yml b/.github/workflows/asan.yml index 5571eb8af37..2165e9f65fe 100644 --- a/.github/workflows/asan.yml +++ b/.github/workflows/asan.yml @@ -21,8 +21,8 @@ jobs: strategy: fail-fast: false matrix: - #os: [windows-latest, ubuntu-latest, macos-latest] - os: [ubuntu-latest, macos-latest] # Temporarily remove windows asan + #os: [windows-latest, ubuntu-latest, macos-13] + os: [ubuntu-latest, macos-13] # Temporarily remove windows asan preset: [vcpkg-asan-debug, vcpkg-ubsan-debug] exclude: # UBSan not supported by MSVC on Windows diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml index 2670782379f..8a32cd59496 100644 --- a/.github/workflows/build_macos.yml +++ b/.github/workflows/build_macos.yml @@ -27,7 +27,7 @@ jobs: - name: Install dependencies run: brew install cmake boost flatbuffers ninja - name: Configure - run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DWARNINGS=Off -DVW_BUILD_VW_C_WRAPPER=Off -DBUILD_TESTING=On -DBUILD_EXPERIMENTAL_BINDING=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On -DVW_INSTALL=Off + run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DWARNINGS=Off -DVW_BUILD_VW_C_WRAPPER=Off -DBUILD_TESTING=On -DBUILD_EXPERIMENTAL_BINDING=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On -DVW_INSTALL=Off -DSTD_INV_SQRT=ON - name: Build run: cmake --build build --target all - name: Unit tests diff --git a/.github/workflows/build_vw_slim.yml b/.github/workflows/build_vw_slim.yml index 3a8f8371340..9acaf124411 100644 --- a/.github/workflows/build_vw_slim.yml +++ b/.github/workflows/build_vw_slim.yml @@ -22,10 +22,45 @@ jobs: - uses: actions/checkout@v1 with: submodules: recursive - - name: Build VW Slim + + - name: Install dependencies + shell: bash + run: | + sudo apt update + sudo apt install -y xxd + + - name: Configure VW Slim shell: bash - run: ./.scripts/linux/build-slim.sh + run: | + rm -rf build + cmake -S . -B build -G Ninja \ + -DBUILD_TESTING=On \ + -DVW_FEAT_FLATBUFFERS=Off \ + -DRAPIDJSON_SYS_DEP=Off \ + -DFMT_SYS_DEP=Off \ + -DSPDLOG_SYS_DEP=Off \ + -DVW_ZLIB_SYS_DEP=Off \ + -DVW_BOOST_MATH_SYS_DEP=Off + + - name: Build VW and VW Slim + shell: bash + run: cmake --build build --target vw_cli_bin vw_slim vw_slim_test + - name: Test VW Slim shell: bash working-directory: build run: ctest --output-on-failure --no-tests=error --tests-regex "VowpalWabbitSlim|ExploreSlim|CommandLineOptionsSlim" --parallel 2 + + - name: Generate test data with new VW executable + shell: bash + working-directory: vowpalwabbit/slim/test/data/ + run: ./generate-data.sh ../../../../build/vowpalwabbit/cli/vw + + - name: Build VW Slim again + shell: bash + run: cmake --build build --target vw_slim vw_slim_test + + - name: Test VW Slim again + shell: bash + working-directory: build + run: ctest --output-on-failure --no-tests=error --tests-regex "VowpalWabbitSlim|ExploreSlim|CommandLineOptionsSlim" --parallel 2 diff --git a/.github/workflows/dotnet_nugets.yml b/.github/workflows/dotnet_nugets.yml index 3beaa1821f0..8b2466fe1e4 100644 --- a/.github/workflows/dotnet_nugets.yml +++ b/.github/workflows/dotnet_nugets.yml @@ -23,7 +23,7 @@ jobs: config: - { os: "windows-latest", runtime_id: "win-x64" } - { os: "ubuntu-latest", runtime_id: "linux-x64" } - - { os: "macos-latest", runtime_id: "osx-x64" } + - { os: "macos-13", runtime_id: "osx-x64" } runs-on: ${{matrix.config.os}} steps: # Setup for build @@ -143,7 +143,7 @@ jobs: config: - { os: "windows-latest", runtime_id: "win-x64" } - { os: "ubuntu-latest", runtime_id: "linux-x64" } - - { os: "macos-latest", runtime_id: "osx-x64" } + - { os: "macos-13", runtime_id: "osx-x64" } runs-on: ${{matrix.config.os}} steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index c7c35bda6bc..f24630265cb 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -21,7 +21,7 @@ jobs: submodules: recursive - name: Build C++ VW binary run: | - cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_EXPERIMENTAL_BINDING=On -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On + cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_EXPERIMENTAL_BINDING=On -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On -DSTD_INV_SQRT=ON cmake --build build - name: Upload vw binary uses: actions/upload-artifact@v2 diff --git a/.github/workflows/vcpkg_build.yml b/.github/workflows/vcpkg_build.yml index 629b2ff11c9..9a763817d60 100644 --- a/.github/workflows/vcpkg_build.yml +++ b/.github/workflows/vcpkg_build.yml @@ -23,7 +23,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-13, windows-latest] preset: [vcpkg-debug, vcpkg-release] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/vendor_build.yml b/.github/workflows/vendor_build.yml index e15b5ae89ab..0d17809b8fe 100644 --- a/.github/workflows/vendor_build.yml +++ b/.github/workflows/vendor_build.yml @@ -49,6 +49,7 @@ jobs: -DWARNINGS=On -DWARNING_AS_ERROR=On -DVW_CXX_STANDARD=17 + -DSTD_INV_SQRT=ON - name: Build run: cmake --build build - name: Unit tests @@ -85,6 +86,7 @@ jobs: -DVW_ZLIB_SYS_DEP=Off -DVW_BOOST_MATH_SYS_DEP=Off -DVW_INSTALL=Off + -DSTD_INV_SQRT=ON - name: Build run: cmake --build "${{ env.CMAKE_BUILD_DIR }}" --config ${{ matrix.build_type }} - name: Test run_tests.py @@ -118,6 +120,7 @@ jobs: -DVW_ZLIB_SYS_DEP=Off -DVW_BOOST_MATH_SYS_DEP=Off -DVW_INSTALL=Off + -DSTD_INV_SQRT=ON - name: Build run: cmake --build build - name: Unit tests diff --git a/.scripts/linux/build-slim.sh b/.scripts/linux/build-slim.sh deleted file mode 100755 index 04cc7d3f399..00000000000 --- a/.scripts/linux/build-slim.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -e -set -x - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_DIR=$SCRIPT_DIR/../../ -cd $REPO_DIR - -rm -rf build -cmake -S . -B build -G Ninja \ - -DBUILD_TESTING=On \ - -DVW_FEAT_FLATBUFFERS=Off \ - -DRAPIDJSON_SYS_DEP=Off \ - -DFMT_SYS_DEP=Off \ - -DSPDLOG_SYS_DEP=Off \ - -DVW_ZLIB_SYS_DEP=Off \ - -DVW_BOOST_MATH_SYS_DEP=Off - -cmake --build build --target vw_slim vw_slim_test diff --git a/.scripts/linux/build-static-java.sh b/.scripts/linux/build-static-java.sh index 21d334cb8fe..826685fb8a5 100755 --- a/.scripts/linux/build-static-java.sh +++ b/.scripts/linux/build-static-java.sh @@ -12,6 +12,6 @@ cd build # /usr/local/bin/gcc + g++ is 9.2.0 version cmake -E env LDFLAGS="-Wl,--exclude-libs,ALL -static-libgcc -static-libstdc++" cmake .. -DCMAKE_BUILD_TYPE=Release -DWARNINGS=Off -DBUILD_JAVA=On -DBUILD_DOCS=Off -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On\ -DBUILD_PYTHON=Off -DSTATIC_LINK_VW_JAVA=On -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \ - -DBUILD_TESTING=Off -DVW_ZLIB_SYS_DEP=Off -DBUILD_SHARED_LIBS=Off -DVW_BUILD_LAS_WITH_SIMD=Off + -DBUILD_TESTING=Off -DVW_ZLIB_SYS_DEP=Off -DBUILD_SHARED_LIBS=Off -DVW_BUILD_LAS_WITH_SIMD=Off -DSTD_INV_SQRT=ON NUM_PROCESSORS=$(nproc) make vw_jni -j ${NUM_PROCESSORS} diff --git a/.scripts/linux/build-with-coverage.sh b/.scripts/linux/build-with-coverage.sh index bac8db23bac..83b4acc49d1 100755 --- a/.scripts/linux/build-with-coverage.sh +++ b/.scripts/linux/build-with-coverage.sh @@ -6,5 +6,5 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" REPO_DIR=$SCRIPT_DIR/../../ cd $REPO_DIR -cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DVW_GCOV=ON -DWARNINGS=OFF -DBUILD_JAVA=Off -DBUILD_PYTHON=Off -DBUILD_TESTING=On -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On +cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DVW_GCOV=ON -DWARNINGS=OFF -DBUILD_JAVA=Off -DBUILD_PYTHON=Off -DBUILD_TESTING=On -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On -DSTD_INV_SQRT=ON cmake --build build diff --git a/.scripts/linux/build.sh b/.scripts/linux/build.sh index ab886b0a349..50a61fe5d7b 100755 --- a/.scripts/linux/build.sh +++ b/.scripts/linux/build.sh @@ -9,5 +9,5 @@ cd $REPO_DIR # If parameter 1 is not supplied, it defaults to Release BUILD_CONFIGURATION=${1:-Release} -cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=${BUILD_CONFIGURATION} -DWARNINGS=Off -DWARNING_AS_ERROR=On -DVW_BUILD_VW_C_WRAPPER=Off -DBUILD_JAVA=On -DBUILD_PYTHON=Off -DBUILD_TESTING=On -DBUILD_EXPERIMENTAL_BINDING=On -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On +cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=${BUILD_CONFIGURATION} -DWARNINGS=Off -DWARNING_AS_ERROR=On -DVW_BUILD_VW_C_WRAPPER=Off -DBUILD_JAVA=On -DBUILD_PYTHON=Off -DBUILD_TESTING=On -DBUILD_EXPERIMENTAL_BINDING=On -DVW_FEAT_FLATBUFFERS=On -DVW_FEAT_CSV=On -DVW_FEAT_CB_GRAPH_FEEDBACK=On -DSTD_INV_SQRT=ON cmake --build build --target all diff --git a/.vscode/settings.json b/.vscode/settings.json index f7a94e718de..9844de0b25c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,8 @@ ], "url": "./test/vwtest.schema.json" } - ] + ], + "files.associations": { + "limits": "cpp" + } } diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b373508f90..2b367e7eb20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -178,6 +178,7 @@ option(VW_BUILD_VW_C_WRAPPER "Enable building the c_wrapper project" ON) option(vw_BUILD_NET_CORE "Build .NET Core targets" OFF) option(vw_BUILD_NET_FRAMEWORK "Build .NET Framework targets" OFF) option(VW_BUILD_WASM "Add WASM target" OFF) +option(STD_INV_SQRT "Use standard library inverse square root" OFF) if(VW_INSTALL AND NOT VW_ZLIB_SYS_DEP) message(WARNING "Installing with a vendored version of zlib is not recommended. Use VW_ZLIB_SYS_DEP to use a system dependency or specify VW_INSTALL=OFF to silence this warning.") diff --git a/CMakePresets.json b/CMakePresets.json index 976fc83b0f4..f2c37850241 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -100,6 +100,10 @@ "VW_FEAT_CB_GRAPH_FEEDBACK": { "type": "BOOL", "value": "On" + }, + "STD_INV_SQRT": { + "type": "BOOL", + "value": "On" } } }, @@ -208,6 +212,10 @@ "VCPKG_TARGET_TRIPLET": { "type": "STRING", "value": "wasm32-emscripten" + }, + "STD_INV_SQRT": { + "type": "BOOL", + "value": "On" } } }, diff --git a/ext_libs/string-view-lite/nonstd/string_view.hpp b/ext_libs/string-view-lite/nonstd/string_view.hpp index 7e3d6a166cd..66fec50076a 100644 --- a/ext_libs/string-view-lite/nonstd/string_view.hpp +++ b/ext_libs/string-view-lite/nonstd/string_view.hpp @@ -128,6 +128,8 @@ #if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS +#include + namespace nonstd { template< class CharT, class Traits, class Allocator = std::allocator > diff --git a/python/docs/source/tutorials/python_simplified_dftovw_tuto.ipynb b/python/docs/source/tutorials/python_simplified_dftovw_tuto.ipynb new file mode 100644 index 00000000000..85f9c1efc99 --- /dev/null +++ b/python/docs/source/tutorials/python_simplified_dftovw_tuto.ipynb @@ -0,0 +1,307 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "51f41eaf-f24f-44fc-8178-3270efa46ec4", + "metadata": {}, + "source": [ + "# Simple pandas to vowpalwabbit conversion tutorial" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b9a21a43-39ad-4213-9c7f-814bbafd8a54", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from vowpalwabbit.dftovw import DFtoVW\n", + "from vowpalwabbit import Workspace" + ] + }, + { + "cell_type": "markdown", + "id": "fc831353-b5aa-4bb0-a928-c47b340397a5", + "metadata": {}, + "source": [ + "### Building simple examples using `DftoVW.from_column_names`" + ] + }, + { + "cell_type": "markdown", + "id": "c60089f1-ce41-49ee-a3a9-74f0fb2cb34f", + "metadata": {}, + "source": [ + "Let's create the following pandas dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a31118c2-b315-4129-b28a-2ea37d2dae50", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(\n", + " [\n", + " {\n", + " \"income\": 0,\n", + " \"age\": 27,\n", + " \"marital-status\": \"Separated\",\n", + " \"education\": \"HS-grad\",\n", + " \"occupation\": \"Handlers-cleaners\",\n", + " \"hours-per-week\": 25,\n", + " },\n", + " {\n", + " \"income\": 1,\n", + " \"age\": 34,\n", + " \"marital-status\": \"Married-civ-spouse\",\n", + " \"education\": \"Bachelors\",\n", + " \"occupation\": \"Prof-specialty\",\n", + " \"hours-per-week\": 40,\n", + " },\n", + " {\n", + " \"income\": 0,\n", + " \"age\": 44,\n", + " \"marital-status\": \"Never-married\",\n", + " \"education\": \"Assoc-voc\",\n", + " \"occupation\": \"Priv-house-serv\",\n", + " \"hours-per-week\": 25,\n", + " },\n", + " {\n", + " \"income\": 1,\n", + " \"age\": 38,\n", + " \"marital-status\": \"Married-civ-spouse\",\n", + " \"education\": \"Bachelors\",\n", + " \"occupation\": \"Prof-specialty\",\n", + " \"hours-per-week\": 60,\n", + " },\n", + " {\n", + " \"income\": 0,\n", + " \"age\": 34,\n", + " \"marital-status\": \"Married-civ-spouse\",\n", + " \"education\": \"HS-grad\",\n", + " \"occupation\": \"Other-service\",\n", + " \"hours-per-week\": 36,\n", + " },\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "473e5c72-ab6c-4d72-a466-7352ec604393", + "metadata": {}, + "source": [ + "The user builds the examples using the class method `DftoVW.from_column_names`. The method is called using the dataframe object (`df`) and its various column names. The conversion to vowpal wabbit examples is then performed by calling the `convert_df` method:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2be83f6c-ecaa-45cb-bb3f-2f47827d6016", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['0 | age:27 marital-status=Separated education=HS-grad occupation=Handlers-cleaners hours-per-week:25',\n", + " '1 | age:34 marital-status=Married-civ-spouse education=Bachelors occupation=Prof-specialty hours-per-week:40',\n", + " '0 | age:44 marital-status=Never-married education=Assoc-voc occupation=Priv-house-serv hours-per-week:25',\n", + " '1 | age:38 marital-status=Married-civ-spouse education=Bachelors occupation=Prof-specialty hours-per-week:60',\n", + " '0 | age:34 marital-status=Married-civ-spouse education=HS-grad occupation=Other-service hours-per-week:36']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "converter = DFtoVW.from_column_names(\n", + " df=df,\n", + " y=\"income\",\n", + " x=[\"age\", \"marital-status\", \"education\", \"occupation\", \"hours-per-week\"],\n", + ")\n", + "examples = converter.convert_df()\n", + "examples" + ] + }, + { + "cell_type": "markdown", + "id": "6109f95e-cd17-485b-947d-8c2c33a5843a", + "metadata": {}, + "source": [ + "Note that the vowpal wabbit format for categorical features is `feature_name=feature_value` whereas for numerical features the format is `feature_name:feature_value`. When using `DFtoVW` class, the appropriate format will be inferred from the dataframe columns types.\n", + "\n", + "We then train the model on these examples:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c0269980-78b3-4123-84eb-27e0fba929b4", + "metadata": {}, + "outputs": [], + "source": [ + "model = Workspace(P=1, enable_logging=True)\n", + "\n", + "for ex in examples:\n", + " model.learn(ex)\n", + "model.finish()" + ] + }, + { + "cell_type": "markdown", + "id": "50470ca2-f33d-495e-a3f9-46ae1a618e6d", + "metadata": {}, + "source": [ + "### Building more complex examples" + ] + }, + { + "cell_type": "markdown", + "id": "30a526a6-7f8f-48e4-8dca-f9058a0d87fb", + "metadata": {}, + "source": [ + "The class method `DFtoVW.from_column_names` represents a quick and simple way to build the examples, but if the user needs more control over the way the examples are created, she or he can either use the class `Feature` or the class `Namespace` for building features, and any of the label class available (see below) based on the nature of the task. \n", + "\n", + "- When using `Namespace` class (see https://github.com/VowpalWabbit/vowpal_wabbit/wiki/Namespaces for the meaning) the user specifies the name of the namespace with the `name` field, and will pass one or a list of `Feature` object to the `features` field.\n", + "\n", + "- The `Feature` class has a `value` field, which is the name of the column. The user can also rename the feature using the `rename_feature` field or choose to enforce a specific type (`\"numerical\"` or `\"categorical\"`) using `as_type` field.\n", + "\n", + "Regarding the labels, multiple classes are available:\n", + "- `SimpleLabel` for regression\n", + "- `MulticlassLabel` and `Multilabel` for classification\n", + "- `ContextualbanditLabel`.\n", + "\n", + "In the following examples we'll build 2 namespaces based on socio-demographic features and the job features." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "90a69d90-a0a6-42d4-8867-5d1b0e73f4ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['0 |ns_sociodemo age:27 marital-status=Separated education=HS-grad |ns_job occupation=Handlers-cleaners hours-per-week:25',\n", + " '1 |ns_sociodemo age:34 marital-status=Married-civ-spouse education=Bachelors |ns_job occupation=Prof-specialty hours-per-week:40',\n", + " '0 |ns_sociodemo age:44 marital-status=Never-married education=Assoc-voc |ns_job occupation=Priv-house-serv hours-per-week:25',\n", + " '1 |ns_sociodemo age:38 marital-status=Married-civ-spouse education=Bachelors |ns_job occupation=Prof-specialty hours-per-week:60',\n", + " '0 |ns_sociodemo age:34 marital-status=Married-civ-spouse education=HS-grad |ns_job occupation=Other-service hours-per-week:36']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from vowpalwabbit.dftovw import SimpleLabel, Namespace, Feature\n", + "\n", + "ns_sociodemo = Namespace(\n", + " features=[Feature(col) for col in [\"age\", \"marital-status\", \"education\"]],\n", + " name=\"ns_sociodemo\",\n", + ")\n", + "ns_job = Namespace(\n", + " features=[Feature(col) for col in [\"occupation\", \"hours-per-week\"]], name=\"ns_job\"\n", + ")\n", + "label = SimpleLabel(\"income\")\n", + "\n", + "converter_advanced = DFtoVW(df=df, namespaces=[ns_sociodemo, ns_job], label=label)\n", + "examples_advanced = converter_advanced.convert_df()\n", + "examples_advanced[:5]" + ] + }, + { + "cell_type": "markdown", + "id": "071326d7-f969-4db1-a73e-3cee225921f4", + "metadata": {}, + "source": [ + "We train the model by also including interactions between the variables of the 2 namespaces:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f0ed661f-d9a0-4ebb-93b8-f5747347c7b4", + "metadata": {}, + "outputs": [], + "source": [ + "model_advanced = Workspace(\n", + " # arg_str=\"--interactions ns_sociodemo:ns_job\", P=1, enable_logging=True\n", + " arg_str=\"--redefine a:=ns_job b:=ns_sociodemo -q ab \",\n", + " P=1,\n", + " enable_logging=True,\n", + ")\n", + "\n", + "for ex in examples_advanced:\n", + " model_advanced.learn(ex)\n", + "\n", + "model_advanced.finish()" + ] + }, + { + "cell_type": "markdown", + "id": "5bb2208e-9d0e-44ef-8d91-faccedf41ac0", + "metadata": {}, + "source": [ + "Finally, we can get the estimated weights associated to each namespace and feature:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "06aabeab-2365-4f86-bf60-7043b0e59190", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('ns_job', 'occupation', 0.0),\n", + " ('ns_job', 'hours-per-week', 0.0019117757910862565),\n", + " ('ns_sociodemo', 'age', 0.001858704723417759),\n", + " ('ns_sociodemo', 'marital-status', 0.0),\n", + " ('ns_sociodemo', 'education', 0.0)]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[\n", + " (ns.name, feature.name, model_advanced.get_weight_from_name(feature.name, ns.name))\n", + " for ns in [ns_job, ns_sociodemo]\n", + " for feature in ns.features\n", + "]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/setup.py b/setup.py index 5cf49116393..d7cd252db36 100644 --- a/setup.py +++ b/setup.py @@ -82,6 +82,7 @@ def build_cmake(self, ext): "-DBUILD_TESTING=Off", "-DWARNINGS=Off", "-DVW_FEAT_CB_GRAPH_FEEDBACK=On", + "-DSTD_INV_SQRT=On", ] # This doesn't work as expected for Python3.6 and 3.7 on Windows. diff --git a/vowpalwabbit/core/CMakeLists.txt b/vowpalwabbit/core/CMakeLists.txt index db03a2ed0b7..e6107a988fd 100644 --- a/vowpalwabbit/core/CMakeLists.txt +++ b/vowpalwabbit/core/CMakeLists.txt @@ -440,6 +440,10 @@ if (MSVC_IDE) target_sources(vw_core PRIVATE $ ) endif() +if(STD_INV_SQRT) + target_compile_definitions(vw_core PUBLIC STD_INV_SQRT) +endif() + # Clang-cl on Windows has issues with our usage of SIMD types. Turn it off explicitly for Windows + clang-cl to mitigate. # See issue # if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") diff --git a/vowpalwabbit/core/src/reductions/gd.cc b/vowpalwabbit/core/src/reductions/gd.cc index d98b994306a..8e84e061cf0 100644 --- a/vowpalwabbit/core/src/reductions/gd.cc +++ b/vowpalwabbit/core/src/reductions/gd.cc @@ -136,6 +136,53 @@ void sync_weights(VW::workspace& all) all.sd->contraction = 1.; } +VW_WARNING_STATE_PUSH +VW_WARNING_DISABLE_UNUSED_FUNCTION +inline float quake_inv_sqrt(float x) +{ + // Carmack/Quake/SGI fast method: + float xhalf = 0.5f * x; + static_assert(sizeof(int) == sizeof(float), "Floats and ints are converted between, they must be the same size."); + int i = reinterpret_cast(x); // store floating-point bits in integer + i = 0x5f3759d5 - (i >> 1); // initial guess for Newton's method + x = reinterpret_cast(i); // convert new bits into float + x = x * (1.5f - xhalf * x * x); // One round of Newton's method + return x; +} +VW_WARNING_STATE_POP + +static inline float inv_sqrt(float x) +{ +// Standard library used in CI because SSE2 path has floating point differences in github machines +#if defined(STD_INV_SQRT) + return 1.f / std::sqrt(x); +#endif +#if !defined(VW_NO_INLINE_SIMD) +# if defined(__ARM_NEON__) + // Propagate into vector + float32x2_t v1 = vdup_n_f32(x); + // Estimate + float32x2_t e1 = vrsqrte_f32(v1); + // N-R iteration 1 + float32x2_t e2 = vmul_f32(e1, vrsqrts_f32(v1, vmul_f32(e1, e1))); + // N-R iteration 2 + float32x2_t e3 = vmul_f32(e2, vrsqrts_f32(v1, vmul_f32(e2, e2))); + // Extract result + return vget_lane_f32(e3, 0); +# elif defined(__SSE2__) + __m128 eta = _mm_load_ss(&x); + eta = _mm_rsqrt_ss(eta); + _mm_store_ss(&x, eta); +# else + x = quake_inv_sqrt(x); +# endif +#else + x = quake_inv_sqrt(x); +#endif + + return x; +} + VW_WARNING_STATE_PUSH VW_WARNING_DISABLE_COND_CONST_EXPR template @@ -580,7 +627,7 @@ inline float compute_rate_decay(power_data& s, float& fw) float rate_decay = 1.f; if (adaptive) { - if (sqrt_rate) { rate_decay = 1.0f / std::sqrt(w[adaptive]); } + if (sqrt_rate) { rate_decay = inv_sqrt(w[adaptive]); } else { rate_decay = powf(w[adaptive], s.minus_power_t); } } if VW_STD17_CONSTEXPR (normalized != 0) diff --git a/vowpalwabbit/slim/include/vw/slim/vw_slim_predict.h b/vowpalwabbit/slim/include/vw/slim/vw_slim_predict.h index 0d58099c214..6b8f2bc3574 100644 --- a/vowpalwabbit/slim/include/vw/slim/vw_slim_predict.h +++ b/vowpalwabbit/slim/include/vw/slim/vw_slim_predict.h @@ -44,31 +44,32 @@ class namespace_copy_guard VW::example_predict& _ex; unsigned char _ns; bool _remove_ns; + size_t _old_size; }; class feature_offset_guard { public: - feature_offset_guard(VW::example_predict& ex, uint64_t ft_offset); + feature_offset_guard(VW::example_predict& ex, uint64_t ft_index_offset); ~feature_offset_guard(); private: VW::example_predict& _ex; - uint64_t _old_ft_offset; + uint64_t _old_ft_index_offset; }; -class stride_shift_guard +class feature_scale_guard { public: - stride_shift_guard(VW::example_predict& ex, uint64_t shift); - ~stride_shift_guard(); + feature_scale_guard(VW::example_predict& ex, uint64_t ft_index_scale); + ~feature_scale_guard(); private: VW::example_predict& _ex; - uint64_t _shift; + uint64_t _ft_index_scale; }; -/** +/* * @brief Vowpal Wabbit slim predictor. Supports: regression, multi-class classification and contextual bandits. */ template @@ -152,7 +153,7 @@ class vw_predict } // TODO: take --cb_type dr into account - uint64_t num_weights = 0; + uint64_t feature_scale = 0; if (_command_line_arguments.find("--cb_explore_adf") != std::string::npos) { @@ -164,7 +165,7 @@ class vw_predict _bag_size = static_cast(bag_size); _exploration = vw_predict_exploration::bag; - num_weights = _bag_size; + feature_scale = _bag_size; // check for additional minimum epsilon greedy _minimum_epsilon = 0.f; @@ -212,10 +213,10 @@ class vw_predict RETURN_ON_FAIL(mp.read("resume", gd_resume)); if (gd_resume) { return E_VW_PREDICT_ERR_GD_RESUME_NOT_SUPPORTED; } - // read sparse weights into dense - _stride_shift = (uint32_t)ceil_log_2(num_weights); + _feature_scale_bits = (uint32_t)ceil_log_2(feature_scale); - RETURN_ON_FAIL(mp.read_weights(_weights, _num_bits, _stride_shift)); + // stride shift always 0 bits + RETURN_ON_FAIL(mp.read_weights(_weights, _num_bits, 0)); // TODO: check that permutations is not enabled (or parse it) @@ -261,7 +262,7 @@ class vw_predict // add constant feature ns_copy_guard = std::unique_ptr(new namespace_copy_guard(ex, VW::details::CONSTANT_NAMESPACE)); - ns_copy_guard->feature_push_back(1.f, (VW::details::CONSTANT << _stride_shift) + ex.ft_offset); + ns_copy_guard->feature_push_back(1.f, (VW::details::CONSTANT << _feature_scale_bits) + ex.ft_offset); } if (_contains_wildcard) @@ -291,9 +292,9 @@ class vw_predict out_scores.resize(num_actions); - VW::example_predict* action = actions; - for (size_t i = 0; i < num_actions; i++, action++) + for (size_t i = 0; i < num_actions; i++) { + VW::example_predict* action = &actions[i]; std::vector> ns_copy_guards; // shared feature copying @@ -358,19 +359,21 @@ class vw_predict { std::vector top_actions(num_actions); - // apply stride shifts - std::vector> stride_shift_guards; - stride_shift_guards.push_back( - std::unique_ptr(new stride_shift_guard(shared, _stride_shift))); + // apply feature scale + uint64_t feature_scale = static_cast(1) << _feature_scale_bits; + std::vector> feature_scale_guards; + feature_scale_guards.push_back( + std::unique_ptr(new feature_scale_guard(shared, feature_scale))); VW::example_predict* actions_end = actions + num_actions; for (VW::example_predict* action = actions; action != actions_end; ++action) { - stride_shift_guards.push_back( - std::unique_ptr(new stride_shift_guard(*action, _stride_shift))); + feature_scale_guards.push_back( + std::unique_ptr(new feature_scale_guard(*action, feature_scale))); } for (size_t i = 0; i < _bag_size; i++) { + // apply feature offset std::vector> feature_offset_guards; for (VW::example_predict* action = actions; action != actions_end; ++action) { @@ -487,7 +490,8 @@ class vw_predict size_t _bag_size; uint32_t _num_bits; - uint32_t _stride_shift; + // log2 of feature scale, rounded upwards to next integer + uint32_t _feature_scale_bits; bool _model_loaded; }; } // namespace vw_slim diff --git a/vowpalwabbit/slim/src/vw_slim_predict.cc b/vowpalwabbit/slim/src/vw_slim_predict.cc index 5c094149fe1..dda0deb3513 100644 --- a/vowpalwabbit/slim/src/vw_slim_predict.cc +++ b/vowpalwabbit/slim/src/vw_slim_predict.cc @@ -17,14 +17,23 @@ namespace_copy_guard::namespace_copy_guard(VW::example_predict& ex, unsigned cha { _ex.indices.push_back(_ns); _remove_ns = true; + _old_size = 0; + } + else + { + _remove_ns = false; + _old_size = _ex.feature_space[_ns].size(); } - else { _remove_ns = false; } } namespace_copy_guard::~namespace_copy_guard() { - _ex.indices.pop_back(); - if (_remove_ns) { _ex.feature_space[_ns].clear(); } + if (_remove_ns) + { + _ex.feature_space[_ns].clear(); + _ex.indices.pop_back(); + } + else { _ex.feature_space[_ns].truncate_to(_old_size); } } void namespace_copy_guard::feature_push_back(VW::feature_value v, VW::feature_index idx) @@ -32,32 +41,33 @@ void namespace_copy_guard::feature_push_back(VW::feature_value v, VW::feature_in _ex.feature_space[_ns].push_back(v, idx); } -feature_offset_guard::feature_offset_guard(VW::example_predict& ex, uint64_t ft_offset) - : _ex(ex), _old_ft_offset(ex.ft_offset) +feature_offset_guard::feature_offset_guard(VW::example_predict& ex, uint64_t ft_index_offset) + : _ex(ex), _old_ft_index_offset(ex.ft_offset) { - _ex.ft_offset = ft_offset; + _ex.ft_offset = ft_index_offset; } -feature_offset_guard::~feature_offset_guard() { _ex.ft_offset = _old_ft_offset; } +feature_offset_guard::~feature_offset_guard() { _ex.ft_offset = _old_ft_index_offset; } -stride_shift_guard::stride_shift_guard(VW::example_predict& ex, uint64_t shift) : _ex(ex), _shift(shift) +feature_scale_guard::feature_scale_guard(VW::example_predict& ex, uint64_t ft_index_scale) + : _ex(ex), _ft_index_scale(ft_index_scale) { - if (_shift > 0) + if (_ft_index_scale > 1) { for (auto ns : _ex.indices) { - for (auto& f : _ex.feature_space[ns]) { f.index() <<= _shift; } + for (auto& f : _ex.feature_space[ns]) { f.index() *= _ft_index_scale; } } } } -stride_shift_guard::~stride_shift_guard() +feature_scale_guard::~feature_scale_guard() { - if (_shift > 0) + if (_ft_index_scale > 1) { for (auto ns : _ex.indices) { - for (auto& f : _ex.feature_space[ns]) { f.index() >>= _shift; } + for (auto& f : _ex.feature_space[ns]) { f.index() /= _ft_index_scale; } } } } diff --git a/vowpalwabbit/slim/test/data.h b/vowpalwabbit/slim/test/data.h index 5011d0ca5e9..5f598c0df43 100644 --- a/vowpalwabbit/slim/test/data.h +++ b/vowpalwabbit/slim/test/data.h @@ -1,330 +1,228 @@ -unsigned char regression_data_1_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char regression_data_1_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4a, 0x0d, 0xa8, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0x94, 0x7b, 0xbe, 0x5c, 0xc5, 0x01, 0x00, 0x55, 0xea, 0x9d, 0x3f}; -unsigned int regression_data_1_model_len = 100; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x49, 0x8e, + 0xa9, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x94, 0x7b, 0xbe, 0x5c, 0xc5, 0x01, 0x00, 0x3c, 0xea, 0x9d, 0x3f}; +unsigned int regression_data_1_model_len = 70; unsigned char regression_data_1_pred[] = { - 0x30, 0x2e, 0x39, 0x38, 0x38, 0x30, 0x33, 0x30, 0x0a, 0x30, 0x2e, 0x30, 0x30, 0x35, 0x32, 0x39, 0x35, 0x0a}; + 0x30, 0x2e, 0x39, 0x38, 0x38, 0x30, 0x32, 0x38, 0x0a, 0x30, 0x2e, 0x30, 0x30, 0x35, 0x32, 0x39, 0x36, 0x0a}; unsigned int regression_data_1_pred_len = 18; -unsigned char regression_data_no_constant_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, +unsigned char regression_data_no_constant_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, - 0x73, 0x68, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4a, 0x0d, 0xa8, 0x7d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x8c, 0x1e, 0x0d, 0x3d}; -unsigned int regression_data_no_constant_model_len = 92; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x6e, 0x6f, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf1, 0x40, 0x85, 0xfb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe6, 0x1f, 0x0d, 0x3d}; +unsigned int regression_data_no_constant_model_len = 75; unsigned char regression_data_no_constant_pred[] = { - 0x30, 0x2e, 0x30, 0x33, 0x34, 0x34, 0x35, 0x33, 0x0a, 0x30, 0x2e, 0x31, 0x37, 0x32, 0x32, 0x36, 0x35, 0x0a}; + 0x30, 0x2e, 0x30, 0x33, 0x34, 0x34, 0x35, 0x34, 0x0a, 0x30, 0x2e, 0x31, 0x37, 0x32, 0x32, 0x37, 0x31, 0x0a}; unsigned int regression_data_no_constant_pred_len = 18; -unsigned char regression_data_ignore_linear_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, +unsigned char regression_data_ignore_linear_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, - 0x73, 0x68, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x61, 0x20, 0x2d, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x6c, - 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x62, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0xec, 0x9d, 0x02, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, - 0x93, 0x0f, 0x3f, 0x5c, 0xc5, 0x01, 0x00, 0xb0, 0xd8, 0xe0, 0x3e, 0x5f, 0xd6, 0x02, 0x00, 0xca, 0xe5, 0x15, 0xbe}; -unsigned int regression_data_ignore_linear_model_len = 144; -unsigned char regression_data_ignore_linear_pred[] = { - 0x31, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a}; -unsigned int regression_data_ignore_linear_pred_len = 18; -unsigned char regression_data_2_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x61, 0x62, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x17, 0xa5, 0x23, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x0f, 0x3f, 0x5c, 0xc5, 0x01, 0x00, 0xac, 0xd7, + 0xe0, 0x3e, 0x5f, 0xd6, 0x02, 0x00, 0x1d, 0xe5, 0x15, 0xbe}; +unsigned int regression_data_ignore_linear_model_len = 97; +unsigned char regression_data_ignore_linear_pred[] = {0x31, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x0a}; +unsigned int regression_data_ignore_linear_pred_len = 11; +unsigned char regression_data_2_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4a, 0x0d, 0xa8, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, - 0xee, 0xb4, 0x3e, 0xb2, 0x69, 0x01, 0x00, 0xcf, 0xee, 0x34, 0x3e, 0x5c, 0xc5, 0x01, 0x00, 0x60, 0x22, 0x96, 0x3e, - 0x5f, 0xd6, 0x02, 0x00, 0xd5, 0x2d, 0xc8, 0xbd}; -unsigned int regression_data_2_model_len = 116; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x49, 0x8e, + 0xa9, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xef, 0xb4, 0x3e, 0xb2, 0x69, 0x01, 0x00, 0x4c, 0xef, 0x34, 0x3e, + 0x5c, 0xc5, 0x01, 0x00, 0x66, 0x21, 0x96, 0x3e, 0x5f, 0xd6, 0x02, 0x00, 0x88, 0x2c, 0xc8, 0xbd}; +unsigned int regression_data_2_model_len = 86; unsigned char regression_data_2_pred[] = {0x31, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x30, 0x0a}; unsigned int regression_data_2_pred_len = 11; -unsigned char regression_data_3_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char regression_data_3_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, - 0x20, 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x43, 0x94, 0xd3, 0x3c, 0x00, 0xb2, 0x69, 0x01, 0x00, 0xfe, 0x91, 0x3e, 0x3f, 0x5c, - 0xc5, 0x01, 0x00, 0xfe, 0x91, 0x3e, 0x3f, 0x05, 0x7e, 0x02, 0x00, 0xfb, 0x42, 0x2f, 0xbe, 0x33, 0x1d, 0x03, 0x00, - 0xfb, 0x42, 0x2f, 0xbe}; -unsigned int regression_data_3_model_len = 131; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, + 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc5, 0xa5, 0x6a, 0x34, 0x00, 0xb2, + 0x69, 0x01, 0x00, 0xaa, 0x92, 0x3e, 0x3f, 0x5c, 0xc5, 0x01, 0x00, 0xaa, 0x92, 0x3e, 0x3f, 0x05, 0x7e, 0x02, 0x00, + 0x19, 0x44, 0x2f, 0xbe, 0x33, 0x1d, 0x03, 0x00, 0x19, 0x44, 0x2f, 0xbe}; +unsigned int regression_data_3_model_len = 101; unsigned char regression_data_3_pred[] = { - 0x30, 0x2e, 0x38, 0x30, 0x34, 0x32, 0x31, 0x34, 0x0a, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x35, 0x39, 0x39, 0x0a}; + 0x30, 0x2e, 0x38, 0x30, 0x34, 0x32, 0x31, 0x38, 0x0a, 0x30, 0x2e, 0x31, 0x31, 0x39, 0x35, 0x38, 0x35, 0x0a}; unsigned int regression_data_3_pred_len = 18; -unsigned char regression_data_4_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char regression_data_4_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x62, 0x63, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x25, 0x5b, 0x51, 0xe0, 0x00, 0x2b, 0x21, 0x00, 0x00, 0x86, - 0xc6, 0x9d, 0x3c, 0x74, 0x14, 0x01, 0x00, 0x37, 0xab, 0xc9, 0xbd, 0x77, 0x14, 0x01, 0x00, 0x37, 0x50, 0x43, 0x3d, - 0xb2, 0x69, 0x01, 0x00, 0xb2, 0x63, 0xab, 0x3d, 0x5c, 0xc5, 0x01, 0x00, 0xb2, 0x63, 0xab, 0x3d, 0x05, 0x7e, 0x02, - 0x00, 0x78, 0xd1, 0xa0, 0x3b, 0x62, 0xd6, 0x02, 0x00, 0x00, 0xb8, 0x4f, 0x3d}; -unsigned int regression_data_4_model_len = 159; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x62, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x3d, + 0xa8, 0xc1, 0x00, 0x2b, 0x21, 0x00, 0x00, 0x22, 0xc4, 0x9d, 0x3c, 0x74, 0x14, 0x01, 0x00, 0x16, 0xaf, 0xc9, 0xbd, + 0x77, 0x14, 0x01, 0x00, 0x17, 0x53, 0x43, 0x3d, 0xb2, 0x69, 0x01, 0x00, 0x06, 0x67, 0xab, 0x3d, 0x5c, 0xc5, 0x01, + 0x00, 0x06, 0x67, 0xab, 0x3d, 0x05, 0x7e, 0x02, 0x00, 0x3e, 0xd6, 0xa0, 0x3b, 0x62, 0xd6, 0x02, 0x00, 0xd4, 0xb7, + 0x4f, 0x3d}; +unsigned int regression_data_4_model_len = 129; unsigned char regression_data_4_pred[] = { - 0x30, 0x2e, 0x36, 0x33, 0x35, 0x36, 0x32, 0x30, 0x0a, 0x30, 0x2e, 0x31, 0x31, 0x37, 0x38, 0x31, 0x33, 0x0a}; + 0x30, 0x2e, 0x36, 0x33, 0x35, 0x36, 0x33, 0x37, 0x0a, 0x30, 0x2e, 0x31, 0x31, 0x37, 0x38, 0x30, 0x38, 0x0a}; unsigned int regression_data_4_pred_len = 18; -unsigned char regression_data_5_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char regression_data_5_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x62, 0x63, 0x64, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0b, 0x1f, 0xb3, 0x77, 0x00, 0x74, 0x14, 0x01, 0x00, - 0x2d, 0x4f, 0x94, 0xbd, 0x77, 0x14, 0x01, 0x00, 0x87, 0x9e, 0x37, 0x3d, 0xc5, 0x22, 0x01, 0x00, 0x2d, 0x4f, 0x94, - 0xbc, 0xc6, 0x22, 0x01, 0x00, 0xd8, 0xd4, 0xf4, 0x3b, 0xb2, 0x69, 0x01, 0x00, 0x7d, 0xcf, 0xde, 0x3d, 0x5c, 0xc5, - 0x01, 0x00, 0x7d, 0xcf, 0xde, 0x3d, 0x05, 0x7e, 0x02, 0x00, 0x59, 0x79, 0x78, 0x3c, 0x62, 0xd6, 0x02, 0x00, 0xa7, - 0x34, 0x53, 0x3d}; -unsigned int regression_data_5_model_len = 168; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x62, 0x63, 0x64, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, + 0xd9, 0x47, 0xa4, 0x00, 0x74, 0x14, 0x01, 0x00, 0x1f, 0x4f, 0x94, 0xbd, 0x77, 0x14, 0x01, 0x00, 0x43, 0xa0, 0x37, + 0x3d, 0xc5, 0x22, 0x01, 0x00, 0x1f, 0x4f, 0x94, 0xbc, 0xc6, 0x22, 0x01, 0x00, 0xb0, 0xd5, 0xf4, 0x3b, 0xb2, 0x69, + 0x01, 0x00, 0x8a, 0xcd, 0xde, 0x3d, 0x5c, 0xc5, 0x01, 0x00, 0x8a, 0xcd, 0xde, 0x3d, 0x05, 0x7e, 0x02, 0x00, 0xa4, + 0x7a, 0x78, 0x3c, 0x62, 0xd6, 0x02, 0x00, 0xfb, 0x39, 0x53, 0x3d}; +unsigned int regression_data_5_model_len = 138; unsigned char regression_data_5_pred[] = { - 0x30, 0x2e, 0x37, 0x36, 0x31, 0x32, 0x34, 0x37, 0x0a, 0x30, 0x2e, 0x30, 0x34, 0x30, 0x31, 0x34, 0x38, 0x0a}; + 0x30, 0x2e, 0x37, 0x36, 0x31, 0x32, 0x36, 0x34, 0x0a, 0x30, 0x2e, 0x30, 0x34, 0x30, 0x31, 0x34, 0x38, 0x0a}; unsigned int regression_data_5_pred_len = 18; -unsigned char regression_data_6_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char regression_data_6_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, - 0x20, 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x9b, 0x9d, 0xc6, 0xde, 0x00, 0x33, 0x1d, 0x3b, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x20, - 0xdc, 0x90, 0x3b, 0x5c, 0xc5, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x19, 0xd8, 0x3d, 0x05, 0x7e, 0xde, 0x95, - 0x00, 0x00, 0x00, 0x00, 0x20, 0xdc, 0x90, 0x3b, 0xb2, 0x69, 0x25, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x19, 0xd8, - 0x3d}; -unsigned int regression_data_6_model_len = 147; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, + 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x00, 0x04, 0x00, 0x00, 0x00, 0x77, 0xbd, 0xf7, 0x46, 0x00, 0x33, + 0x1d, 0x3b, 0xf5, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xf2, 0x90, 0x3b, 0x5c, 0xc5, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb9, 0x21, 0xd8, 0x3d, 0x05, 0x7e, 0xde, 0x95, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xf2, 0x90, 0x3b, 0xb2, 0x69, 0x25, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x21, 0xd8, 0x3d}; +unsigned int regression_data_6_model_len = 117; unsigned char regression_data_6_pred[] = { - 0x30, 0x2e, 0x32, 0x32, 0x38, 0x37, 0x31, 0x38, 0x0a, 0x30, 0x2e, 0x32, 0x34, 0x36, 0x34, 0x30, 0x31, 0x0a}; + 0x30, 0x2e, 0x32, 0x32, 0x38, 0x37, 0x36, 0x30, 0x0a, 0x30, 0x2e, 0x32, 0x34, 0x36, 0x34, 0x35, 0x34, 0x0a}; unsigned int regression_data_6_pred_len = 18; -unsigned char regression_data_7_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char regression_data_7_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4a, 0x0d, 0xa8, 0x7d, 0x00, 0x88, 0xd8, 0x00, 0x00, 0xdb, - 0xe8, 0x3c, 0x3e, 0x5c, 0xc5, 0x01, 0x00, 0xdb, 0xe8, 0x3c, 0x3e, 0xd2, 0x52, 0x02, 0x00, 0xb2, 0x6a, 0x14, 0x3e, - 0xe8, 0x78, 0x03, 0x00, 0xf9, 0xc3, 0x89, 0xbd}; -unsigned int regression_data_7_model_len = 116; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x49, 0x8e, + 0xa9, 0xc7, 0x00, 0x88, 0xd8, 0x00, 0x00, 0xc8, 0xe9, 0x3c, 0x3e, 0x5c, 0xc5, 0x01, 0x00, 0xc8, 0xe9, 0x3c, 0x3e, + 0xd2, 0x52, 0x02, 0x00, 0xc8, 0x6e, 0x14, 0x3e, 0xe8, 0x78, 0x03, 0x00, 0xe0, 0xc1, 0x89, 0xbd}; +unsigned int regression_data_7_model_len = 86; unsigned char regression_data_7_pred[] = { - 0x30, 0x2e, 0x36, 0x35, 0x38, 0x38, 0x34, 0x31, 0x0a, 0x30, 0x2e, 0x30, 0x39, 0x39, 0x38, 0x39, 0x31, 0x0a}; + 0x30, 0x2e, 0x36, 0x35, 0x38, 0x38, 0x37, 0x39, 0x0a, 0x30, 0x2e, 0x30, 0x39, 0x39, 0x39, 0x31, 0x34, 0x0a}; unsigned int regression_data_7_pred_len = 18; -unsigned char multiclass_data_4_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, +unsigned char multiclass_data_4_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, - 0x20, 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x20, 0x2d, - 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc7, 0x53, 0x35, 0xf9, 0x00, 0xb2, - 0x69, 0x01, 0x00, 0x9a, 0x5c, 0xe3, 0x3e, 0xb7, 0x69, 0x01, 0x00, 0x48, 0x97, 0x17, 0x3d, 0x5c, 0xc5, 0x01, 0x00, - 0x9a, 0x5c, 0xe3, 0x3e, 0x03, 0x7e, 0x02, 0x00, 0xde, 0x2e, 0x13, 0xbe, 0x16, 0x15, 0x03, 0x00, 0x18, 0x41, 0x44, - 0xbc, 0x35, 0x1d, 0x03, 0x00, 0xde, 0x2e, 0x13, 0xbe}; -unsigned int multiclass_data_4_model_len = 174; -unsigned char multiclass_data_4_pred[] = {0x32, 0x3a, 0x30, 0x2e, 0x30, 0x33, 0x38, 0x36, 0x32, 0x32, 0x33, 0x2c, 0x31, - 0x3a, 0x30, 0x2e, 0x34, 0x36, 0x39, 0x38, 0x33, 0x2c, 0x30, 0x3a, 0x30, 0x2e, 0x39, 0x30, 0x31, 0x30, 0x33, 0x38, - 0x0a, 0x0a}; -unsigned int multiclass_data_4_pred_len = 34; -unsigned char multiclass_data_5_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x36, 0x2e, 0x31, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, + 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, + 0x6b, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x91, 0xfa, 0x13, 0x4a, 0x00, 0xb2, 0x69, 0x01, 0x00, 0xe2, 0x5e, 0xe3, 0x3e, 0xb7, 0x69, 0x01, 0x00, + 0x98, 0x94, 0x17, 0x3d, 0x5c, 0xc5, 0x01, 0x00, 0xe2, 0x5e, 0xe3, 0x3e, 0x03, 0x7e, 0x02, 0x00, 0x21, 0x30, 0x13, + 0xbe, 0x16, 0x15, 0x03, 0x00, 0x29, 0x40, 0x44, 0xbc, 0x35, 0x1d, 0x03, 0x00, 0x21, 0x30, 0x13, 0xbe}; +unsigned int multiclass_data_4_model_len = 144; +unsigned char multiclass_data_4_pred[] = {0x33, 0x3a, 0x30, 0x2e, 0x30, 0x33, 0x38, 0x36, 0x30, 0x35, 0x2c, 0x32, 0x3a, + 0x30, 0x2e, 0x34, 0x36, 0x39, 0x38, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x39, 0x30, 0x31, 0x30, 0x33, 0x35, 0x0a, + 0x0a}; +unsigned int multiclass_data_4_pred_len = 33; +unsigned char multiclass_data_5_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, - 0x20, 0x6d, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, - 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x58, 0xf3, - 0xe1, 0x52, 0x00, 0xa9, 0x91, 0x00, 0x00, 0x54, 0x4d, 0x34, 0x3e, 0xae, 0x91, 0x00, 0x00, 0x68, 0x58, 0x70, 0x3c, - 0x5c, 0xc5, 0x01, 0x00, 0x54, 0x4d, 0x34, 0x3e, 0x11, 0x76, 0x03, 0x00, 0x02, 0xc7, 0x03, 0x3d, 0x5f, 0xd7, 0x03, - 0x00, 0xb9, 0x4e, 0xc1, 0x3c}; -unsigned int multiclass_data_5_model_len = 151; -unsigned char multiclass_data_5_pred[] = {0x30, 0x3a, 0x30, 0x2e, 0x35, 0x35, 0x31, 0x37, 0x38, 0x34, 0x2c, 0x33, 0x3a, - 0x30, 0x2e, 0x35, 0x35, 0x31, 0x37, 0x38, 0x34, 0x2c, 0x34, 0x3a, 0x30, 0x2e, 0x35, 0x36, 0x30, 0x33, 0x35, 0x39, - 0x2c, 0x37, 0x3a, 0x30, 0x2e, 0x35, 0x36, 0x30, 0x33, 0x35, 0x39, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x35, 0x37, 0x35, - 0x33, 0x38, 0x31, 0x2c, 0x35, 0x3a, 0x30, 0x2e, 0x35, 0x39, 0x32, 0x35, 0x33, 0x31, 0x2c, 0x32, 0x3a, 0x30, 0x2e, - 0x35, 0x39, 0x38, 0x39, 0x37, 0x38, 0x2c, 0x36, 0x3a, 0x30, 0x2e, 0x36, 0x32, 0x34, 0x37, 0x30, 0x33, 0x0a, 0x0a}; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, + 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, + 0x6b, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2c, 0x43, 0x9b, 0xba, 0x00, 0xa9, 0x91, 0x00, 0x00, 0x31, 0xc8, 0xc0, 0x3e, + 0xae, 0x91, 0x00, 0x00, 0x78, 0x85, 0x00, 0x3d, 0x5c, 0xc5, 0x01, 0x00, 0x31, 0xc8, 0xc0, 0x3e, 0x11, 0x76, 0x03, + 0x00, 0x68, 0xf2, 0x6b, 0xbe, 0x5f, 0xd7, 0x03, 0x00, 0x01, 0x06, 0xab, 0xbe}; +unsigned int multiclass_data_5_model_len = 121; +unsigned char multiclass_data_5_pred[] = {0x33, 0x3a, 0x30, 0x2e, 0x31, 0x32, 0x37, 0x34, 0x39, 0x32, 0x2c, 0x33, 0x3a, + 0x30, 0x2e, 0x34, 0x33, 0x38, 0x33, 0x33, 0x31, 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x34, 0x36, 0x31, 0x35, 0x32, 0x32, + 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x36, 0x36, 0x38, 0x37, 0x34, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x37, 0x39, 0x35, + 0x35, 0x35, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x37, 0x39, 0x35, 0x35, 0x35, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, + 0x38, 0x39, 0x39, 0x31, 0x36, 0x35, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x38, 0x39, 0x39, 0x31, 0x36, 0x35, 0x0a, 0x0a}; unsigned int multiclass_data_5_pred_len = 89; -unsigned char cb_data_5_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, 0x5f, - 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, - 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, - 0x20, 0x2d, 0x2d, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, 0x30, 0x2e, 0x33, 0x20, 0x2d, 0x2d, 0x6c, 0x61, - 0x6d, 0x62, 0x64, 0x61, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x70, 0x73, 0x69, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x63, 0x62, - 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x70, 0x73, 0x20, - 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, - 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, - 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x48, 0x31, - 0x09, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb2, 0x69, 0x01, 0x00, 0x87, 0xb4, 0x0d, 0x3d, 0xb7, 0x69, 0x01, 0x00, 0x08, 0xc2, 0x9d, 0x3d, 0x5c, 0xc5, 0x01, - 0x00, 0xec, 0xa1, 0x6c, 0x3f, 0x03, 0x7e, 0x02, 0x00, 0xa3, 0x99, 0x78, 0xbe, 0x16, 0x15, 0x03, 0x00, 0x1a, 0xbd, - 0xa5, 0xbc, 0x35, 0x1d, 0x03, 0x00, 0x1b, 0x69, 0x2e, 0xbc}; -unsigned int cb_data_5_model_len = 271; -unsigned char cb_data_5_pred[] = {0x32, 0x3a, 0x30, 0x2e, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x2c, 0x30, 0x3a, - 0x30, 0x2e, 0x31, 0x0a, 0x0a, 0x32, 0x3a, 0x30, 0x2e, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x2c, 0x30, 0x3a, +unsigned char cb_data_5_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, + 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, 0x20, + 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x74, 0x72, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, + 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, + 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, + 0x6e, 0x20, 0x30, 0x2e, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x39, 0x32, 0x30, 0x39, 0x32, 0x39, + 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x00, 0x04, 0x00, 0x00, + 0x00, 0xf8, 0x33, 0x84, 0x29, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb2, 0x69, 0x01, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xb7, 0x69, 0x01, 0x00, 0x3c, 0x8e, 0x63, 0x3c, + 0x5c, 0xc5, 0x01, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0x03, 0x7e, 0x02, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0x16, 0x15, 0x03, + 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0x35, 0x1d, 0x03, 0x00, 0xaa, 0xaa, 0x2a, 0x3e}; +unsigned int cb_data_5_model_len = 236; +unsigned char cb_data_5_pred[] = {0x30, 0x3a, 0x30, 0x2e, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x2c, 0x32, 0x3a, + 0x30, 0x2e, 0x31, 0x0a, 0x0a, 0x30, 0x3a, 0x30, 0x2e, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x31, 0x0a, 0x0a}; unsigned int cb_data_5_pred_len = 38; -unsigned char cb_data_6_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, 0x5f, - 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, - 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, - 0x20, 0x2d, 0x2d, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x2d, 0x32, 0x20, 0x2d, 0x2d, 0x70, 0x73, 0x69, 0x20, - 0x31, 0x20, 0x2d, 0x2d, 0x73, 0x6f, 0x66, 0x74, 0x6d, 0x61, 0x78, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, - 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x70, 0x73, 0x20, 0x2d, 0x2d, 0x63, - 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, - 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, - 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4f, 0x24, 0x56, 0xa0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x69, 0x01, - 0x00, 0xb3, 0x32, 0x51, 0x3d, 0xb7, 0x69, 0x01, 0x00, 0x10, 0x4e, 0xd3, 0x3c, 0x5c, 0xc5, 0x01, 0x00, 0x64, 0x7a, - 0x9e, 0x3e, 0x03, 0x7e, 0x02, 0x00, 0xac, 0x65, 0x84, 0xbb, 0x16, 0x15, 0x03, 0x00, 0x98, 0x88, 0xb0, 0xb9, 0x35, - 0x1d, 0x03, 0x00, 0x94, 0x6a, 0xdb, 0x3a}; -unsigned int cb_data_6_model_len = 268; -unsigned char cb_data_6_pred[] = {0x32, 0x3a, 0x30, 0x2e, 0x33, 0x33, 0x37, 0x36, 0x31, 0x34, 0x2c, 0x31, 0x3a, 0x30, - 0x2e, 0x33, 0x33, 0x33, 0x33, 0x31, 0x35, 0x2c, 0x30, 0x3a, 0x30, 0x2e, 0x33, 0x32, 0x39, 0x30, 0x37, 0x31, 0x0a, - 0x0a, 0x32, 0x3a, 0x30, 0x2e, 0x34, 0x31, 0x30, 0x39, 0x37, 0x31, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x33, 0x32, 0x37, - 0x37, 0x31, 0x31, 0x2c, 0x30, 0x3a, 0x30, 0x2e, 0x32, 0x36, 0x31, 0x33, 0x31, 0x39, 0x0a, 0x0a}; -unsigned int cb_data_6_pred_len = 68; -unsigned char cb_data_7_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, 0x5f, - 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, - 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, - 0x20, 0x2d, 0x2d, 0x62, 0x61, 0x67, 0x20, 0x33, 0x20, 0x2d, 0x2d, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x31, - 0x20, 0x2d, 0x2d, 0x70, 0x73, 0x69, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, - 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x70, 0x73, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, - 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x63, - 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x83, 0x4b, 0x89, 0xbc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x54, 0x00, 0x00, 0x00, 0x4e, - 0xaa, 0xbc, 0x59, 0x54, 0x00, 0x00, 0xe9, 0x6a, 0xae, 0xbc, 0x5a, 0x54, 0x00, 0x00, 0x2e, 0x68, 0xa5, 0xbc, 0xd4, - 0x74, 0x00, 0x00, 0x9f, 0xa9, 0xf3, 0xbb, 0xd5, 0x74, 0x00, 0x00, 0xaf, 0xba, 0xf5, 0xbb, 0xd6, 0x74, 0x00, 0x00, - 0xb7, 0x94, 0x29, 0xbc, 0xc8, 0xa6, 0x01, 0x00, 0x39, 0x8e, 0xdf, 0x3c, 0xc9, 0xa6, 0x01, 0x00, 0x9e, 0xb1, 0xdf, - 0x3c, 0xca, 0xa6, 0x01, 0x00, 0xe6, 0x26, 0x0f, 0x3d, 0xdc, 0xa6, 0x01, 0x00, 0x8b, 0x17, 0xa0, 0x3d, 0xdd, 0xa6, - 0x01, 0x00, 0xd2, 0xc3, 0xa2, 0x3d, 0xde, 0xa6, 0x01, 0x00, 0x96, 0x56, 0x9d, 0x3d, 0x0c, 0xf8, 0x01, 0x00, 0xbc, - 0x6e, 0x7f, 0xbe, 0x0d, 0xf8, 0x01, 0x00, 0x9b, 0xd2, 0x82, 0xbe, 0x0e, 0xf8, 0x01, 0x00, 0x6c, 0x1a, 0x78, 0xbe, - 0x70, 0x15, 0x03, 0x00, 0x4a, 0x2e, 0x70, 0x3f, 0x71, 0x15, 0x03, 0x00, 0x7b, 0x25, 0x74, 0x3f, 0x72, 0x15, 0x03, - 0x00, 0x9c, 0x07, 0x6c, 0x3f}; -unsigned int cb_data_7_model_len = 361; -unsigned char cb_data_7_pred[] = {0x32, 0x3a, 0x31, 0x2c, 0x31, 0x3a, 0x30, 0x2c, 0x30, 0x3a, 0x30, 0x0a, 0x0a, 0x32, - 0x3a, 0x31, 0x2c, 0x31, 0x3a, 0x30, 0x2c, 0x30, 0x3a, 0x30, 0x0a, 0x0a}; +unsigned char cb_data_6_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, + 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, 0x20, + 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, 0x74, 0x72, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, + 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, + 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, + 0x20, 0x2d, 0x32, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x20, + 0x2d, 0x2d, 0x73, 0x6f, 0x66, 0x74, 0x6d, 0x61, 0x78, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0xe4, 0xbd, 0x5d, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x69, 0x01, + 0x00, 0x0d, 0x57, 0x2a, 0x3e, 0xb7, 0x69, 0x01, 0x00, 0xbd, 0x1e, 0x63, 0x3c, 0x5c, 0xc5, 0x01, 0x00, 0x0d, 0x57, + 0x2a, 0x3e, 0x03, 0x7e, 0x02, 0x00, 0x0d, 0x57, 0x2a, 0x3e, 0x16, 0x15, 0x03, 0x00, 0xbd, 0x1e, 0x63, 0x3c, 0x35, + 0x1d, 0x03, 0x00, 0x0d, 0x57, 0x2a, 0x3e}; +unsigned int cb_data_6_model_len = 230; +unsigned char cb_data_6_pred[] = {0x30, 0x3a, 0x30, 0x2e, 0x36, 0x36, 0x34, 0x37, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x32, + 0x34, 0x34, 0x39, 0x39, 0x38, 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x30, 0x33, 0x30, 0x32, 0x0a, 0x0a, 0x30, + 0x3a, 0x30, 0x2e, 0x38, 0x36, 0x36, 0x38, 0x31, 0x33, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x31, 0x37, 0x33, 0x31, + 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x30, 0x31, 0x35, 0x38, 0x37, 0x36, 0x0a, 0x0a}; +unsigned int cb_data_6_pred_len = 65; +unsigned char cb_data_7_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x62, 0x61, 0x67, 0x20, 0x33, + 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, + 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, + 0x74, 0x72, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, + 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x72, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, 0x37, 0x35, 0x38, 0x39, 0x30, 0x36, 0x30, 0x31, 0x32, + 0x31, 0x34, 0x36, 0x33, 0x30, 0x32, 0x31, 0x32, 0x34, 0x30, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6c, 0x85, 0x14, 0x21, + 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x54, + 0x00, 0x00, 0xbe, 0x9c, 0x29, 0x3c, 0x59, 0x54, 0x00, 0x00, 0x94, 0xad, 0x2e, 0x3c, 0x5a, 0x54, 0x00, 0x00, 0x3c, + 0x8e, 0x63, 0x3c, 0xd4, 0x74, 0x00, 0x00, 0xba, 0x19, 0x98, 0x3c, 0xd5, 0x74, 0x00, 0x00, 0xe5, 0x51, 0xbd, 0x3c, + 0xd6, 0x74, 0x00, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xc8, 0xa6, 0x01, 0x00, 0xc8, 0x50, 0x3c, 0x3d, 0xc9, 0xa6, 0x01, + 0x00, 0xf4, 0x52, 0x56, 0x3d, 0xca, 0xa6, 0x01, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xdc, 0xa6, 0x01, 0x00, 0x29, 0x7f, + 0xea, 0x3c, 0xdd, 0xa6, 0x01, 0x00, 0xe5, 0x3e, 0xe4, 0x3c, 0xde, 0xa6, 0x01, 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0x0c, + 0xf8, 0x01, 0x00, 0x1f, 0x6b, 0xfe, 0x3d, 0x0d, 0xf8, 0x01, 0x00, 0x31, 0x02, 0x03, 0x3e, 0x0e, 0xf8, 0x01, 0x00, + 0xaa, 0xaa, 0x2a, 0x3e, 0x70, 0x15, 0x03, 0x00, 0x5c, 0xdf, 0xaf, 0x3e, 0x71, 0x15, 0x03, 0x00, 0x28, 0x2f, 0xab, + 0x3e, 0x72, 0x15, 0x03, 0x00, 0xaa, 0xaa, 0x2a, 0x3e}; +unsigned int cb_data_7_model_len = 346; +unsigned char cb_data_7_pred[] = {0x30, 0x3a, 0x31, 0x2c, 0x31, 0x3a, 0x30, 0x2c, 0x32, 0x3a, 0x30, 0x0a, 0x0a, 0x30, + 0x3a, 0x31, 0x2c, 0x31, 0x3a, 0x30, 0x2c, 0x32, 0x3a, 0x30, 0x0a, 0x0a}; unsigned int cb_data_7_pred_len = 26; -unsigned char cb_data_8_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, 0x5f, - 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, - 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, - 0x20, 0x2d, 0x2d, 0x62, 0x61, 0x67, 0x20, 0x35, 0x20, 0x2d, 0x2d, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, - 0x30, 0x2e, 0x32, 0x37, 0x20, 0x2d, 0x2d, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x70, - 0x73, 0x69, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x70, 0x73, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, - 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, - 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb1, 0xf7, 0x2d, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xa8, 0x00, 0x00, 0x71, 0x18, 0x9b, 0xbc, 0xb1, 0xa8, - 0x00, 0x00, 0x7d, 0x0d, 0xb6, 0xbc, 0xb2, 0xa8, 0x00, 0x00, 0x54, 0x87, 0xbb, 0xbc, 0xb3, 0xa8, 0x00, 0x00, 0x42, - 0x3d, 0xab, 0xbc, 0xb4, 0xa8, 0x00, 0x00, 0x43, 0xee, 0xa1, 0xbc, 0xa8, 0xe9, 0x00, 0x00, 0xb6, 0x76, 0x38, 0xbc, - 0xa9, 0xe9, 0x00, 0x00, 0x20, 0xb2, 0x39, 0xbc, 0xaa, 0xe9, 0x00, 0x00, 0x5a, 0x46, 0x45, 0xbc, 0xab, 0xe9, 0x00, - 0x00, 0x7e, 0x0e, 0x49, 0xbc, 0xac, 0xe9, 0x00, 0x00, 0xa1, 0x9a, 0x5a, 0xbc, 0xe0, 0x2a, 0x02, 0x00, 0x51, 0x4e, - 0x63, 0x3f, 0xe1, 0x2a, 0x02, 0x00, 0x4d, 0xe9, 0x79, 0x3f, 0xe2, 0x2a, 0x02, 0x00, 0x14, 0xcd, 0x7e, 0x3f, 0xe3, - 0x2a, 0x02, 0x00, 0x41, 0xca, 0x70, 0x3f, 0xe4, 0x2a, 0x02, 0x00, 0xe8, 0xb9, 0x68, 0x3f, 0x90, 0x4d, 0x03, 0x00, - 0x6b, 0x97, 0x17, 0x3d, 0x91, 0x4d, 0x03, 0x00, 0xd1, 0x6f, 0x17, 0x3d, 0x92, 0x4d, 0x03, 0x00, 0x0f, 0xd3, 0x1d, - 0x3d, 0x93, 0x4d, 0x03, 0x00, 0xed, 0xa8, 0x23, 0x3d, 0x94, 0x4d, 0x03, 0x00, 0x44, 0xa8, 0x2b, 0x3d, 0xb8, 0x4d, - 0x03, 0x00, 0x8f, 0x87, 0x97, 0x3d, 0xb9, 0x4d, 0x03, 0x00, 0x2a, 0x98, 0xa6, 0x3d, 0xba, 0x4d, 0x03, 0x00, 0x7a, - 0xdf, 0xa9, 0x3d, 0xbb, 0x4d, 0x03, 0x00, 0xc9, 0x85, 0xa0, 0x3d, 0xbc, 0x4d, 0x03, 0x00, 0xc9, 0x1d, 0x9b, 0x3d, - 0x18, 0xf0, 0x03, 0x00, 0xda, 0xa7, 0x68, 0xbe, 0x19, 0xf0, 0x03, 0x00, 0xc3, 0x88, 0x88, 0xbe, 0x1a, 0xf0, 0x03, - 0x00, 0x95, 0xa5, 0x8c, 0xbe, 0x1b, 0xf0, 0x03, 0x00, 0x5c, 0x6c, 0x80, 0xbe, 0x1c, 0xf0, 0x03, 0x00, 0xea, 0xf0, - 0x72, 0xbe}; -unsigned int cb_data_8_model_len = 472; -unsigned char cb_data_8_pred[] = {0x32, 0x3a, 0x30, 0x2e, 0x38, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x2c, - 0x30, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x0a, 0x0a, 0x32, 0x3a, 0x30, 0x2e, 0x38, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, - 0x30, 0x39, 0x2c, 0x30, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x0a, 0x0a}; +unsigned char cb_data_8_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x62, 0x61, 0x67, 0x20, 0x35, + 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, + 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6d, + 0x74, 0x72, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, + 0x2d, 0x2d, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, 0x30, 0x2e, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x31, 0x30, 0x37, 0x32, 0x38, 0x38, 0x33, 0x36, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x20, + 0x31, 0x36, 0x37, 0x30, 0x39, 0x32, 0x38, 0x30, 0x35, 0x30, 0x37, 0x32, 0x38, 0x33, 0x33, 0x33, 0x35, 0x35, 0x36, + 0x30, 0x00, 0x04, 0x00, 0x00, 0x00, 0x77, 0x5b, 0xb6, 0xc8, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xa8, 0x00, 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0xb1, 0xa8, 0x00, + 0x00, 0xa8, 0xfd, 0x2c, 0x3c, 0xb2, 0xa8, 0x00, 0x00, 0x94, 0xad, 0x2e, 0x3c, 0xb3, 0xa8, 0x00, 0x00, 0x3c, 0x8e, + 0x63, 0x3c, 0xb4, 0xa8, 0x00, 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0xa8, 0xe9, 0x00, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xa9, + 0xe9, 0x00, 0x00, 0xfb, 0x83, 0xb3, 0x3c, 0xaa, 0xe9, 0x00, 0x00, 0xe5, 0x51, 0xbd, 0x3c, 0xab, 0xe9, 0x00, 0x00, + 0xaa, 0xaa, 0x2a, 0x3e, 0xac, 0xe9, 0x00, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xe0, 0x2a, 0x02, 0x00, 0xaa, 0xaa, 0x2a, + 0x3e, 0xe1, 0x2a, 0x02, 0x00, 0xe0, 0x91, 0xac, 0x3e, 0xe2, 0x2a, 0x02, 0x00, 0x28, 0x2f, 0xab, 0x3e, 0xe3, 0x2a, + 0x02, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xe4, 0x2a, 0x02, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0x90, 0x4d, 0x03, 0x00, 0xaa, + 0xaa, 0x2a, 0x3e, 0x91, 0x4d, 0x03, 0x00, 0x08, 0x2e, 0x4f, 0x3d, 0x92, 0x4d, 0x03, 0x00, 0xf4, 0x52, 0x56, 0x3d, + 0x93, 0x4d, 0x03, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0x94, 0x4d, 0x03, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0xb8, 0x4d, 0x03, + 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0xb9, 0x4d, 0x03, 0x00, 0xd5, 0x17, 0xe6, 0x3c, 0xba, 0x4d, 0x03, 0x00, 0xe5, 0x3e, + 0xe4, 0x3c, 0xbb, 0x4d, 0x03, 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0xbc, 0x4d, 0x03, 0x00, 0x3c, 0x8e, 0x63, 0x3c, 0x18, + 0xf0, 0x03, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0x19, 0xf0, 0x03, 0x00, 0x40, 0xbe, 0x01, 0x3e, 0x1a, 0xf0, 0x03, 0x00, + 0x31, 0x02, 0x03, 0x3e, 0x1b, 0xf0, 0x03, 0x00, 0xaa, 0xaa, 0x2a, 0x3e, 0x1c, 0xf0, 0x03, 0x00, 0xaa, 0xaa, 0x2a, + 0x3e}; +unsigned int cb_data_8_model_len = 471; +unsigned char cb_data_8_pred[] = {0x30, 0x3a, 0x30, 0x2e, 0x38, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x2c, + 0x32, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x0a, 0x0a, 0x30, 0x3a, 0x30, 0x2e, 0x38, 0x32, 0x2c, 0x31, 0x3a, 0x30, 0x2e, + 0x30, 0x39, 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x30, 0x39, 0x0a, 0x0a}; unsigned int cb_data_8_pred_len = 44; -unsigned char cb_data_9_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x68, 0x61, 0x73, 0x68, 0x5f, - 0x73, 0x65, 0x65, 0x64, 0x20, 0x30, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, - 0x61, 0x62, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, - 0x20, 0x2d, 0x2d, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x20, 0x30, 0x2e, 0x33, 0x20, 0x2d, 0x2d, 0x6c, 0x61, - 0x6d, 0x62, 0x64, 0x61, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x70, 0x73, 0x69, 0x20, 0x31, 0x20, 0x2d, 0x2d, 0x63, 0x62, - 0x5f, 0x61, 0x64, 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x72, 0x20, 0x2d, - 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, - 0x65, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x6c, 0x69, - 0x6e, 0x6b, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2a, 0x6d, 0x36, - 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0xfc, 0x00, 0x00, 0x5d, 0x18, 0x2c, 0x38, 0x07, 0xfc, 0x00, 0x00, 0x9f, 0x19, 0xe6, 0x33, 0x2c, 0x2a, 0x02, 0x00, - 0xe3, 0x3a, 0x8e, 0x36, 0x6a, 0x3a, 0x02, 0x00, 0xaf, 0x53, 0x0a, 0xb8, 0x64, 0xd3, 0x02, 0x00, 0x62, 0x48, 0xa4, - 0x38, 0x6e, 0xd3, 0x02, 0x00, 0x0b, 0x9f, 0x2a, 0x3d, 0xb8, 0x8a, 0x03, 0x00, 0x44, 0xf5, 0xff, 0x3e, 0xb9, 0x8a, - 0x03, 0x00, 0xfd, 0xff, 0x7f, 0x3f}; -unsigned int cb_data_9_model_len = 286; +unsigned char cb_data_9_model[] = {0x06, 0x00, 0x00, 0x00, 0x39, 0x2e, 0x39, 0x2e, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x36, 0x70, 0xc2, 0xbf, 0x29, 0x5e, 0x62, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x61, 0x64, + 0x66, 0x20, 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x66, 0x20, + 0x2d, 0x2d, 0x63, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x72, 0x20, 0x2d, 0x2d, 0x63, 0x73, 0x6f, 0x61, + 0x61, 0x5f, 0x6c, 0x64, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2d, 0x2d, 0x63, + 0x73, 0x6f, 0x61, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x20, 0x2d, 0x2d, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, + 0x20, 0x30, 0x2e, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x39, 0x32, 0x30, 0x39, 0x32, 0x39, 0x20, + 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x61, 0x62, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0f, 0xd3, 0x3b, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0xfc, 0x00, 0x00, 0x4e, 0x66, 0xa0, 0x3d, 0x07, 0xfc, 0x00, 0x00, 0x30, 0xa5, 0xa0, 0x3d, 0x2c, + 0x2a, 0x02, 0x00, 0x92, 0xdd, 0xd5, 0x3b, 0x2d, 0x2a, 0x02, 0x00, 0x90, 0x31, 0xd6, 0x3b, 0x6a, 0x3a, 0x02, 0x00, + 0x06, 0xa3, 0x94, 0xbc, 0x6b, 0x3a, 0x02, 0x00, 0xcb, 0x5a, 0x95, 0xbc, 0x64, 0xd3, 0x02, 0x00, 0x60, 0x13, 0x23, + 0xbc, 0x65, 0xd3, 0x02, 0x00, 0x09, 0xc9, 0x1f, 0xbc, 0x6e, 0xd3, 0x02, 0x00, 0xf8, 0xc2, 0x14, 0x3d, 0x6f, 0xd3, + 0x02, 0x00, 0x23, 0xab, 0x14, 0x3d, 0xb8, 0x8a, 0x03, 0x00, 0x66, 0x24, 0xdf, 0x3e, 0xb9, 0x8a, 0x03, 0x00, 0xa7, + 0x00, 0xdf, 0x3e}; +unsigned int cb_data_9_model_len = 283; unsigned char cb_data_9_pred[] = {0x30, 0x3a, 0x30, 0x2e, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x31, 0x0a, 0x0a, 0x30, 0x3a, 0x30, 0x2e, 0x38, 0x2c, 0x31, 0x3a, 0x30, 0x2e, 0x31, 0x2c, 0x32, 0x3a, 0x30, 0x2e, 0x31, 0x0a, 0x0a}; unsigned int cb_data_9_pred_len = 38; -unsigned char cb_data_epsilon_0_skype_jb_model[] = {0x06, 0x00, 0x00, 0x00, 0x38, 0x2E, 0x34, 0x2E, 0x30, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x20, 0x2D, 0x2D, 0x71, 0x75, - 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x36, 0x38, 0x20, 0x2D, 0x2D, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, - 0x74, 0x69, 0x63, 0x20, 0x31, 0x38, 0x20, 0x2D, 0x2D, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, - 0x33, 0x38, 0x20, 0x2D, 0x2D, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x20, 0x34, 0x38, 0x20, 0x2D, - 0x2D, 0x63, 0x62, 0x5F, 0x65, 0x78, 0x70, 0x6C, 0x6F, 0x72, 0x65, 0x5F, 0x61, 0x64, 0x66, 0x20, 0x2D, 0x2D, 0x65, - 0x70, 0x73, 0x69, 0x6C, 0x6F, 0x6E, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x2D, 0x2D, 0x63, - 0x62, 0x5F, 0x61, 0x64, 0x66, 0x20, 0x2D, 0x2D, 0x63, 0x62, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x70, 0x73, - 0x20, 0x2D, 0x2D, 0x63, 0x73, 0x6F, 0x61, 0x61, 0x5F, 0x6C, 0x64, 0x66, 0x20, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x6C, - 0x69, 0x6E, 0x65, 0x20, 0x2D, 0x2D, 0x63, 0x73, 0x6F, 0x61, 0x61, 0x5F, 0x72, 0x61, 0x6E, 0x6B, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x50, 0x5F, 0x61, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x6C, 0x90, 0x3C, 0x11, 0x00, 0x00, 0x00, 0xC9, 0x0B, 0xD1, - 0x3C, 0x22, 0x00, 0x00, 0x00, 0x16, 0xDA, 0x91, 0x3B, 0x24, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0x3C, 0x30, 0x00, - 0x00, 0x00, 0xFF, 0xC4, 0x63, 0x3B, 0x31, 0x00, 0x00, 0x00, 0x24, 0x2A, 0x91, 0xB9, 0x34, 0x00, 0x00, 0x00, 0x34, - 0x71, 0x24, 0x3D, 0x40, 0x00, 0x00, 0x00, 0x08, 0x54, 0xF9, 0x3C, 0x42, 0x00, 0x00, 0x00, 0x0F, 0x4A, 0x55, 0x3C, - 0x50, 0x00, 0x00, 0x00, 0x52, 0x60, 0x14, 0x3C, 0x51, 0x00, 0x00, 0x00, 0x71, 0x7B, 0x23, 0x3C, 0x52, 0x00, 0x00, - 0x00, 0x4E, 0xD3, 0x10, 0x3C, 0x53, 0x00, 0x00, 0x00, 0x4A, 0x47, 0x17, 0x3C, 0x54, 0x00, 0x00, 0x00, 0x4E, 0x6F, - 0x16, 0x3C, 0x55, 0x00, 0x00, 0x00, 0x24, 0x25, 0x1B, 0x3C, 0x56, 0x00, 0x00, 0x00, 0x52, 0xF4, 0x1A, 0x3C, 0x57, - 0x00, 0x00, 0x00, 0x5E, 0x4A, 0x28, 0x3C, 0x58, 0x00, 0x00, 0x00, 0x3A, 0xFA, 0x24, 0x3C, 0x59, 0x00, 0x00, 0x00, - 0x2E, 0x47, 0x2B, 0x3C, 0x07, 0x04, 0x00, 0x00, 0xEA, 0x0E, 0x1A, 0x3D, 0x17, 0x04, 0x00, 0x00, 0xF6, 0x83, 0x64, - 0xBA, 0x27, 0x04, 0x00, 0x00, 0x08, 0xA3, 0xA2, 0xBA, 0x60, 0x19, 0x00, 0x00, 0xCF, 0xB0, 0x93, 0x3B, 0x61, 0x19, - 0x00, 0x00, 0xD0, 0xE4, 0x8C, 0x3B, 0x62, 0x19, 0x00, 0x00, 0xE0, 0x96, 0x98, 0x3B, 0x63, 0x19, 0x00, 0x00, 0x85, - 0xE5, 0x8A, 0x3B, 0x64, 0x19, 0x00, 0x00, 0x06, 0xC2, 0xA5, 0x3B, 0x65, 0x19, 0x00, 0x00, 0x70, 0x22, 0xB7, 0x3B, - 0x66, 0x19, 0x00, 0x00, 0x6F, 0xA2, 0x90, 0x3B, 0x67, 0x19, 0x00, 0x00, 0xAF, 0x6D, 0xAF, 0x3B, 0x68, 0x19, 0x00, - 0x00, 0x5C, 0x03, 0x9F, 0x3B, 0x69, 0x19, 0x00, 0x00, 0x7C, 0x12, 0xBA, 0x3B, 0x90, 0x1A, 0x00, 0x00, 0xCE, 0x61, - 0xEB, 0x3B, 0x91, 0x1A, 0x00, 0x00, 0xDE, 0x5C, 0xEC, 0x3B, 0x92, 0x1A, 0x00, 0x00, 0xA8, 0x99, 0xE6, 0x3B, 0x93, - 0x1A, 0x00, 0x00, 0x3B, 0x98, 0xDF, 0x3B, 0x94, 0x1A, 0x00, 0x00, 0x17, 0xA7, 0x00, 0x3C, 0x95, 0x1A, 0x00, 0x00, - 0x54, 0xC4, 0x00, 0x3C, 0x96, 0x1A, 0x00, 0x00, 0x3D, 0xF9, 0x07, 0x3C, 0x97, 0x1A, 0x00, 0x00, 0x72, 0xBB, 0xF9, - 0x3B, 0x9A, 0x1A, 0x00, 0x00, 0xC5, 0x53, 0x06, 0x3C, 0x9B, 0x1A, 0x00, 0x00, 0x0B, 0x26, 0xFA, 0x3B, 0xD0, 0x35, - 0x00, 0x00, 0x01, 0xA2, 0x73, 0x3A, 0xD1, 0x35, 0x00, 0x00, 0x2E, 0x1B, 0x76, 0xB9, 0xD2, 0x35, 0x00, 0x00, 0x0A, - 0xD5, 0xFB, 0x38, 0xD3, 0x35, 0x00, 0x00, 0x3F, 0xE2, 0x59, 0x3A, 0xD4, 0x35, 0x00, 0x00, 0x05, 0x35, 0xA8, 0xB9, - 0xD5, 0x35, 0x00, 0x00, 0xED, 0x75, 0xC1, 0xB8, 0xD6, 0x35, 0x00, 0x00, 0xE9, 0x66, 0x84, 0xBA, 0xD7, 0x35, 0x00, - 0x00, 0xA3, 0x93, 0x5B, 0xBA, 0xDE, 0x35, 0x00, 0x00, 0xD8, 0xEB, 0x28, 0x3A, 0xDF, 0x35, 0x00, 0x00, 0xF2, 0xA3, - 0x28, 0x3A, 0xF4, 0x38, 0x00, 0x00, 0x07, 0xE5, 0xB3, 0x3B, 0xF5, 0x38, 0x00, 0x00, 0xF3, 0x63, 0xB1, 0x3B, 0xF8, - 0x38, 0x00, 0x00, 0xC5, 0xF0, 0xC0, 0x3B, 0xF9, 0x38, 0x00, 0x00, 0x40, 0x85, 0xBE, 0x3B, 0xFA, 0x38, 0x00, 0x00, - 0xEB, 0xCB, 0xAE, 0x3B, 0xFB, 0x38, 0x00, 0x00, 0x64, 0xBC, 0xC0, 0x3B, 0xFC, 0x38, 0x00, 0x00, 0xB8, 0x35, 0x94, - 0x3B, 0xFD, 0x38, 0x00, 0x00, 0xB2, 0x87, 0x9D, 0x3B, 0xFE, 0x38, 0x00, 0x00, 0x86, 0x21, 0xA4, 0x3B, 0xFF, 0x38, - 0x00, 0x00, 0x4F, 0x11, 0xA1, 0x3B, 0xC0, 0x4B, 0x00, 0x00, 0x9C, 0x97, 0x14, 0x3A, 0xC1, 0x4B, 0x00, 0x00, 0x8C, - 0x68, 0x75, 0x3A, 0xC2, 0x4B, 0x00, 0x00, 0x31, 0xC2, 0x20, 0x3A, 0xC3, 0x4B, 0x00, 0x00, 0xEF, 0x20, 0xB5, 0x39, - 0xC4, 0x4B, 0x00, 0x00, 0xC0, 0x6A, 0x4C, 0x39, 0xC5, 0x4B, 0x00, 0x00, 0x37, 0x8A, 0x7B, 0xB9, 0xC6, 0x4B, 0x00, - 0x00, 0x0C, 0x50, 0xB6, 0x3A, 0xC7, 0x4B, 0x00, 0x00, 0x7F, 0x54, 0xE2, 0x39, 0xC8, 0x4B, 0x00, 0x00, 0x0F, 0x8B, - 0x8A, 0x3A, 0xC9, 0x4B, 0x00, 0x00, 0xD3, 0x50, 0xB2, 0x3A, 0x70, 0x4D, 0x00, 0x00, 0x98, 0x6D, 0xA5, 0xB9, 0x71, - 0x4D, 0x00, 0x00, 0x69, 0x76, 0xA5, 0xB9, 0x72, 0x4D, 0x00, 0x00, 0xD1, 0xBD, 0xA5, 0x39, 0x73, 0x4D, 0x00, 0x00, - 0x88, 0x23, 0xA5, 0xB9, 0x74, 0x4D, 0x00, 0x00, 0xFD, 0x72, 0xA5, 0xB9, 0x75, 0x4D, 0x00, 0x00, 0x1E, 0x79, 0xA5, - 0xB9, 0x76, 0x4D, 0x00, 0x00, 0x79, 0x77, 0xA5, 0xB9, 0x77, 0x4D, 0x00, 0x00, 0x6C, 0x77, 0xA5, 0xB9, 0x7A, 0x4D, - 0x00, 0x00, 0x06, 0x78, 0xA5, 0xB9, 0x7B, 0x4D, 0x00, 0x00, 0xEF, 0x6D, 0xA5, 0xB9, 0x84, 0x51, 0x00, 0x00, 0x1A, - 0x82, 0x57, 0x3C, 0x85, 0x51, 0x00, 0x00, 0x52, 0xA5, 0x54, 0x3C, 0x88, 0x51, 0x00, 0x00, 0x54, 0xD8, 0x4D, 0x3C, - 0x89, 0x51, 0x00, 0x00, 0x9F, 0xE9, 0x3D, 0x3C, 0x8A, 0x51, 0x00, 0x00, 0xD7, 0xA9, 0x4A, 0x3C, 0x8B, 0x51, 0x00, - 0x00, 0x90, 0x5C, 0x4D, 0x3C, 0x8C, 0x51, 0x00, 0x00, 0x7F, 0x1A, 0x4B, 0x3C, 0x8D, 0x51, 0x00, 0x00, 0x01, 0x70, - 0x51, 0x3C, 0x8E, 0x51, 0x00, 0x00, 0x36, 0x65, 0x2E, 0x3C, 0x8F, 0x51, 0x00, 0x00, 0xAF, 0x53, 0x4F, 0x3C, 0x90, - 0x64, 0x00, 0x00, 0xA4, 0x16, 0x13, 0x3C, 0x91, 0x64, 0x00, 0x00, 0x1C, 0x79, 0xE7, 0x3B, 0x92, 0x64, 0x00, 0x00, - 0xCE, 0xB9, 0x07, 0x3C, 0x93, 0x64, 0x00, 0x00, 0xC9, 0x54, 0x0D, 0x3C, 0x94, 0x64, 0x00, 0x00, 0x94, 0x39, 0x0A, - 0x3C, 0x95, 0x64, 0x00, 0x00, 0xAB, 0xD9, 0x14, 0x3C, 0x96, 0x64, 0x00, 0x00, 0xC1, 0x47, 0x0C, 0x3C, 0x97, 0x64, - 0x00, 0x00, 0x45, 0x0E, 0x1C, 0x3C, 0x98, 0x64, 0x00, 0x00, 0xD0, 0xA3, 0x16, 0x3C, 0x99, 0x64, 0x00, 0x00, 0xE3, - 0xBB, 0x17, 0x3C, 0xB0, 0x67, 0x00, 0x00, 0x2F, 0x90, 0x8C, 0x3B, 0xB1, 0x67, 0x00, 0x00, 0x77, 0xB4, 0x3C, 0x3B, - 0xB2, 0x67, 0x00, 0x00, 0xD3, 0x3E, 0x8C, 0x3B, 0xB3, 0x67, 0x00, 0x00, 0x7A, 0xD7, 0x09, 0x3B, 0xB4, 0x67, 0x00, - 0x00, 0xC6, 0x3C, 0x59, 0x3B, 0xB5, 0x67, 0x00, 0x00, 0x69, 0x4B, 0x0A, 0x3B, 0xB6, 0x67, 0x00, 0x00, 0x77, 0xDD, - 0x48, 0x3B, 0xB7, 0x67, 0x00, 0x00, 0x78, 0xE8, 0xA1, 0x3A, 0xBE, 0x67, 0x00, 0x00, 0x81, 0x47, 0x87, 0x3B, 0xBF, - 0x67, 0x00, 0x00, 0x97, 0x87, 0x8E, 0x3B, 0x5C, 0xC5, 0x01, 0x00, 0x15, 0x90, 0xFD, 0x3C, 0x50, 0x57, 0x02, 0x00, - 0x9C, 0xC7, 0x2C, 0x3C, 0x51, 0x57, 0x02, 0x00, 0x5B, 0x0E, 0x14, 0x3C, 0x52, 0x57, 0x02, 0x00, 0xE4, 0x30, 0x24, - 0x3C, 0x53, 0x57, 0x02, 0x00, 0x0E, 0x23, 0x0D, 0x3C, 0x54, 0x57, 0x02, 0x00, 0x15, 0xCC, 0x42, 0x3C, 0x55, 0x57, - 0x02, 0x00, 0x8D, 0x14, 0x3F, 0x3C, 0x56, 0x57, 0x02, 0x00, 0x84, 0x3F, 0x44, 0x3C, 0x57, 0x57, 0x02, 0x00, 0xA2, - 0x59, 0x0D, 0x3C, 0x5C, 0x57, 0x02, 0x00, 0xA6, 0x7B, 0x44, 0x3C, 0x5D, 0x57, 0x02, 0x00, 0xC9, 0xC8, 0x32, 0x3C, - 0x60, 0x70, 0x02, 0x00, 0x56, 0x18, 0x0D, 0xBA, 0x61, 0x70, 0x02, 0x00, 0x00, 0x10, 0x39, 0x34, 0x62, 0x70, 0x02, - 0x00, 0xE1, 0x7E, 0x9B, 0x39, 0x63, 0x70, 0x02, 0x00, 0x41, 0xFD, 0x0C, 0xBA, 0x64, 0x70, 0x02, 0x00, 0xF0, 0xBE, - 0x0C, 0xBA, 0x65, 0x70, 0x02, 0x00, 0xC3, 0xC2, 0x0C, 0xBA, 0x66, 0x70, 0x02, 0x00, 0xCA, 0x22, 0x0D, 0xBA, 0x67, - 0x70, 0x02, 0x00, 0x54, 0xC2, 0x0C, 0xBA, 0x6C, 0x70, 0x02, 0x00, 0x48, 0x2C, 0x0D, 0xBA, 0x6D, 0x70, 0x02, 0x00, - 0xDC, 0x44, 0x0D, 0xBA, 0x30, 0x89, 0x02, 0x00, 0x39, 0x9F, 0x00, 0xB9, 0x31, 0x89, 0x02, 0x00, 0x23, 0x11, 0x03, - 0xBB, 0x32, 0x89, 0x02, 0x00, 0x19, 0xA2, 0x02, 0xBB, 0x33, 0x89, 0x02, 0x00, 0xFF, 0xF0, 0xD6, 0xBA, 0x34, 0x89, - 0x02, 0x00, 0x0C, 0x23, 0x03, 0xBB, 0x35, 0x89, 0x02, 0x00, 0x4C, 0xC7, 0x02, 0xBB, 0x36, 0x89, 0x02, 0x00, 0x36, - 0xE6, 0x9D, 0x39, 0x37, 0x89, 0x02, 0x00, 0x38, 0xE8, 0x3F, 0xB9, 0x3C, 0x89, 0x02, 0x00, 0xDD, 0x62, 0xD9, 0x39, - 0x3D, 0x89, 0x02, 0x00, 0x88, 0xE6, 0x03, 0xBB}; -unsigned int cb_data_epsilon_0_skype_jb_model_len = 1368; -unsigned char cb_data_epsilon_0_skype_jb_pred[] = {0x00}; -unsigned int cb_data_epsilon_0_skype_jb_pred_len = 1; \ No newline at end of file diff --git a/vowpalwabbit/slim/test/data/cb_data_5.model b/vowpalwabbit/slim/test/data/cb_data_5.model index b62b3d410df..140b6f4740b 100644 Binary files a/vowpalwabbit/slim/test/data/cb_data_5.model and b/vowpalwabbit/slim/test/data/cb_data_5.model differ diff --git a/vowpalwabbit/slim/test/data/cb_data_5.pred b/vowpalwabbit/slim/test/data/cb_data_5.pred index a95a5317690..37724df1fb5 100644 --- a/vowpalwabbit/slim/test/data/cb_data_5.pred +++ b/vowpalwabbit/slim/test/data/cb_data_5.pred @@ -1,4 +1,4 @@ -2:0.8,1:0.1,0:0.1 +0:0.8,1:0.1,2:0.1 -2:0.8,1:0.1,0:0.1 +0:0.8,1:0.1,2:0.1 diff --git a/vowpalwabbit/slim/test/data/cb_data_6.model b/vowpalwabbit/slim/test/data/cb_data_6.model index d5d86532721..a3c9537945a 100644 Binary files a/vowpalwabbit/slim/test/data/cb_data_6.model and b/vowpalwabbit/slim/test/data/cb_data_6.model differ diff --git a/vowpalwabbit/slim/test/data/cb_data_6.pred b/vowpalwabbit/slim/test/data/cb_data_6.pred index 7f05b1bbb53..3a9347e2e86 100644 --- a/vowpalwabbit/slim/test/data/cb_data_6.pred +++ b/vowpalwabbit/slim/test/data/cb_data_6.pred @@ -1,4 +1,4 @@ -2:0.337614,1:0.333315,0:0.329071 +0:0.6647,1:0.244998,2:0.090302 -2:0.410971,1:0.327711,0:0.261319 +0:0.866813,1:0.11731,2:0.015876 diff --git a/vowpalwabbit/slim/test/data/cb_data_7.model b/vowpalwabbit/slim/test/data/cb_data_7.model index ffb0fa23261..3cfd196c90d 100644 Binary files a/vowpalwabbit/slim/test/data/cb_data_7.model and b/vowpalwabbit/slim/test/data/cb_data_7.model differ diff --git a/vowpalwabbit/slim/test/data/cb_data_7.pred b/vowpalwabbit/slim/test/data/cb_data_7.pred index dd30d21e58d..57b426532cc 100644 --- a/vowpalwabbit/slim/test/data/cb_data_7.pred +++ b/vowpalwabbit/slim/test/data/cb_data_7.pred @@ -1,4 +1,4 @@ -2:1,1:0,0:0 +0:1,1:0,2:0 -2:1,1:0,0:0 +0:1,1:0,2:0 diff --git a/vowpalwabbit/slim/test/data/cb_data_8.model b/vowpalwabbit/slim/test/data/cb_data_8.model index 7cbdf184d7f..c2a367b2246 100644 Binary files a/vowpalwabbit/slim/test/data/cb_data_8.model and b/vowpalwabbit/slim/test/data/cb_data_8.model differ diff --git a/vowpalwabbit/slim/test/data/cb_data_8.pred b/vowpalwabbit/slim/test/data/cb_data_8.pred index cad4def2485..c04ca26f912 100644 --- a/vowpalwabbit/slim/test/data/cb_data_8.pred +++ b/vowpalwabbit/slim/test/data/cb_data_8.pred @@ -1,4 +1,4 @@ -2:0.82,1:0.09,0:0.09 +0:0.82,1:0.09,2:0.09 -2:0.82,1:0.09,0:0.09 +0:0.82,1:0.09,2:0.09 diff --git a/vowpalwabbit/slim/test/data/cb_data_9.model b/vowpalwabbit/slim/test/data/cb_data_9.model index 483fe597573..885283780f1 100644 Binary files a/vowpalwabbit/slim/test/data/cb_data_9.model and b/vowpalwabbit/slim/test/data/cb_data_9.model differ diff --git a/vowpalwabbit/slim/test/data/generate-data.sh b/vowpalwabbit/slim/test/data/generate-data.sh old mode 100644 new mode 100755 index ad4adbd996b..e8b1b65c462 --- a/vowpalwabbit/slim/test/data/generate-data.sh +++ b/vowpalwabbit/slim/test/data/generate-data.sh @@ -4,96 +4,101 @@ VW=${1:-vw} echo > $DATA_H -$VW --quiet -d regression_data_1.txt -f regression_data_1.model -c -k --passes 100 --holdout_off +$VW --quiet -d regression_data_1.txt -f regression_data_1.model -c -k --passes 100 --holdout_off --predict_only_model $VW --quiet -d regression_data_1.txt -i regression_data_1.model -t -p regression_data_1.pred xxd -i regression_data_1.model >> $DATA_H xxd -i regression_data_1.pred >> $DATA_H -$VW --quiet -d regression_data_1.txt -f regression_data_no_constant.model -c -k --passes 100 --holdout_off --noconstant +$VW --quiet -d regression_data_1.txt -f regression_data_no_constant.model -c -k --passes 100 --holdout_off --noconstant --predict_only_model $VW --quiet -d regression_data_1.txt -i regression_data_no_constant.model -t -p regression_data_no_constant.pred xxd -i regression_data_no_constant.model >> $DATA_H xxd -i regression_data_no_constant.pred >> $DATA_H -$VW --quiet -d regression_data_2.txt -f regression_data_ignore_linear.model -c -k --passes 100 --holdout_off --ignore_linear a --ignore_linear b +$VW --quiet -d regression_data_2.txt -f regression_data_ignore_linear.model -c -k --passes 100 --holdout_off --ignore_linear a --ignore_linear b --predict_only_model $VW --quiet -d regression_data_2.txt -i regression_data_ignore_linear.model -t -p regression_data_ignore_linear.pred xxd -i regression_data_ignore_linear.model >> $DATA_H xxd -i regression_data_ignore_linear.pred >> $DATA_H -$VW --quiet -d regression_data_2.txt -f regression_data_2.model -c -k --passes 100 --holdout_off +$VW --quiet -d regression_data_2.txt -f regression_data_2.model -c -k --passes 100 --holdout_off --predict_only_model $VW --quiet -d regression_data_2.txt -i regression_data_2.model -t -p regression_data_2.pred xxd -i regression_data_2.model >> $DATA_H xxd -i regression_data_2.pred >> $DATA_H # testing interactions order 2 -$VW --quiet -d regression_data_3.txt -f regression_data_3.model -c -k --passes 100 --holdout_off -q ab +$VW --quiet -d regression_data_3.txt -f regression_data_3.model -c -k --passes 100 --holdout_off -q ab --predict_only_model $VW --quiet -d regression_data_3.txt -i regression_data_3.model -t -p regression_data_3.pred xxd -i regression_data_3.model >> $DATA_H xxd -i regression_data_3.pred >> $DATA_H # testing interactions order 3 -$VW --quiet -d regression_data_4.txt -f regression_data_4.model -c -k --passes 2 --holdout_off --interactions abc +$VW --quiet -d regression_data_4.txt -f regression_data_4.model -c -k --passes 2 --holdout_off --interactions abc --predict_only_model $VW --quiet -d regression_data_4.txt -i regression_data_4.model -t -p regression_data_4.pred xxd -i regression_data_4.model >> $DATA_H xxd -i regression_data_4.pred >> $DATA_H # testing interactions order 4 -$VW --quiet -d regression_data_4.txt -f regression_data_5.model -c -k --passes 2 --holdout_off --interactions abcd +$VW --quiet -d regression_data_4.txt -f regression_data_5.model -c -k --passes 2 --holdout_off --interactions abcd --predict_only_model $VW --quiet -d regression_data_4.txt -i regression_data_5.model -t -p regression_data_5.pred xxd -i regression_data_5.model >> $DATA_H xxd -i regression_data_5.pred >> $DATA_H # testing large models -$VW --quiet -d regression_data_3.txt -f regression_data_6.model -c -k --passes 2 --holdout_off -q ab -b 33 --sparse_weights +$VW --quiet -d regression_data_3.txt -f regression_data_6.model -c -k --passes 2 --holdout_off -q ab -b 33 --sparse_weights --predict_only_model $VW --quiet -d regression_data_3.txt -i regression_data_6.model -t -p regression_data_6.pred --sparse_weights xxd -i regression_data_6.model >> $DATA_H xxd -i regression_data_6.pred >> $DATA_H # testing feature hashing -$VW --quiet -d regression_data_7.txt -f regression_data_7.model -c -k --passes 2 --holdout_off +$VW --quiet -d regression_data_7.txt -f regression_data_7.model -c -k --passes 2 --holdout_off --predict_only_model $VW --quiet -d regression_data_7.txt -i regression_data_7.model -t -p regression_data_7.pred xxd -i regression_data_7.model >> $DATA_H xxd -i regression_data_7.pred >> $DATA_H # multi-class classification -$VW --quiet -d multiclass_data_4.txt --csoaa_ldf m --csoaa_rank -q ab -k -c --holdout_off --passes 100 -f multiclass_data_4.model +$VW --quiet -d multiclass_data_4.txt --csoaa_ldf m --csoaa_rank -q ab -k -c --holdout_off --passes 100 -f multiclass_data_4.model --predict_only_model $VW --quiet -d multiclass_data_4.txt -i multiclass_data_4.model -t -p multiclass_data_4.pred -# manual creation of (sort by action id) multiclass_data_4.pred.manual xxd -i multiclass_data_4.model >> $DATA_H xxd -i multiclass_data_4.pred >> $DATA_H +$VW --quiet -d multiclass_data_5.txt --csoaa_ldf m --csoaa_rank -k -c --holdout_off --passes 100 -f multiclass_data_5.model --predict_only_model +$VW --quiet -d multiclass_data_5.txt -i multiclass_data_5.model -t -p multiclass_data_5.pred + +xxd -i multiclass_data_5.model >> $DATA_H +xxd -i multiclass_data_5.pred >> $DATA_H + # epsilon greedy -$VW --quiet -d cb_data_5.txt --cb_explore_adf --epsilon 0.3 -q ab -k -c --holdout_off --passes 100 -f cb_data_5.model +$VW --quiet -d cb_data_5.txt --cb_explore_adf --epsilon 0.3 -q ab -k -c --holdout_off --passes 100 -f cb_data_5.model --predict_only_model $VW --quiet -d cb_data_5.txt -i cb_data_5.model -p cb_data_5.pred xxd -i cb_data_5.model >> $DATA_H xxd -i cb_data_5.pred >> $DATA_H # softmax -$VW --quiet -d cb_data_5.txt --cb_explore_adf --softmax --lambda -2 -q ab -k -c --holdout_off --passes 5 -f cb_data_6.model +$VW --quiet -d cb_data_5.txt --cb_explore_adf --softmax --lambda -2 -q ab -k -c --holdout_off --passes 5 -f cb_data_6.model --predict_only_model $VW --quiet -d cb_data_5.txt -i cb_data_6.model -p cb_data_6.pred xxd -i cb_data_6.model >> $DATA_H xxd -i cb_data_6.pred >> $DATA_H # bag -$VW --quiet -d cb_data_5.txt --cb_explore_adf --bag 3 -q ab -k -c --holdout_off --passes 100 -f cb_data_7.model +$VW --quiet -d cb_data_5.txt --cb_explore_adf --bag 3 -q ab -k -c --holdout_off --passes 100 -f cb_data_7.model --predict_only_model $VW --quiet -d cb_data_5.txt -i cb_data_7.model -p cb_data_7.pred xxd -i cb_data_7.model >> $DATA_H xxd -i cb_data_7.pred >> $DATA_H # bag + epsilon greedy -$VW --quiet -d cb_data_5.txt --cb_explore_adf --bag 5 --epsilon 0.27 -q ab -k -c --holdout_off --passes 100 -f cb_data_8.model +$VW --quiet -d cb_data_5.txt --cb_explore_adf --bag 5 --epsilon 0.27 -q ab -k -c --holdout_off --passes 100 -f cb_data_8.model --predict_only_model $VW --quiet -d cb_data_5.txt -i cb_data_8.model -p cb_data_8.pred xxd -i cb_data_8.model >> $DATA_H @@ -101,7 +106,7 @@ xxd -i cb_data_8.pred >> $DATA_H # epsilon greedy + dr # TODO: results are confusing (for both dr & mtr) as they don't match ips in a simple example -$VW --quiet -d cb_data_5.txt --cb_explore_adf --epsilon 0.3 --cb_type dr -q ab -k -c --holdout_off --passes 1000 -f cb_data_9.model +$VW --quiet -d cb_data_5.txt --cb_explore_adf --epsilon 0.3 --cb_type dr -q ab -k -c --holdout_off --passes 1000 -f cb_data_9.model --predict_only_model $VW --quiet -d cb_data_5.txt -i cb_data_9.model -p cb_data_9.pred xxd -i cb_data_9.model >> $DATA_H diff --git a/vowpalwabbit/slim/test/data/multiclass_data_4.model b/vowpalwabbit/slim/test/data/multiclass_data_4.model index 34351571b78..b994afe6658 100644 Binary files a/vowpalwabbit/slim/test/data/multiclass_data_4.model and b/vowpalwabbit/slim/test/data/multiclass_data_4.model differ diff --git a/vowpalwabbit/slim/test/data/multiclass_data_4.pred b/vowpalwabbit/slim/test/data/multiclass_data_4.pred index 151607bbf2d..60ff4928422 100644 --- a/vowpalwabbit/slim/test/data/multiclass_data_4.pred +++ b/vowpalwabbit/slim/test/data/multiclass_data_4.pred @@ -1,2 +1,2 @@ -2:0.0386223,1:0.46983,0:0.901038 +3:0.038605,2:0.46982,1:0.901035 diff --git a/vowpalwabbit/slim/test/data/multiclass_data_5.pred b/vowpalwabbit/slim/test/data/multiclass_data_5.pred index 9d4795324c6..5d98d4b54fb 100644 --- a/vowpalwabbit/slim/test/data/multiclass_data_5.pred +++ b/vowpalwabbit/slim/test/data/multiclass_data_5.pred @@ -1,2 +1,2 @@ -0:0.551784,3:0.551784,4:0.560359,7:0.560359,1:0.575381,5:0.592531,2:0.598978,6:0.624703 +3:0.127492,3:0.438331,2:0.461522,2:0.668748,1:0.795552,1:0.795552,1:0.899165,1:0.899165 diff --git a/vowpalwabbit/slim/test/data/regression_data_1.model b/vowpalwabbit/slim/test/data/regression_data_1.model index 3a2f6112659..e60c4fb0010 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_1.model and b/vowpalwabbit/slim/test/data/regression_data_1.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_1.pred b/vowpalwabbit/slim/test/data/regression_data_1.pred index 961a1add22d..8f23c2b166d 100644 --- a/vowpalwabbit/slim/test/data/regression_data_1.pred +++ b/vowpalwabbit/slim/test/data/regression_data_1.pred @@ -1,2 +1,2 @@ -0.988030 -0.005295 +0.988028 +0.005296 diff --git a/vowpalwabbit/slim/test/data/regression_data_2.model b/vowpalwabbit/slim/test/data/regression_data_2.model index d730bd5c5a4..449d4841333 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_2.model and b/vowpalwabbit/slim/test/data/regression_data_2.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_3.model b/vowpalwabbit/slim/test/data/regression_data_3.model index 31245ca1032..83e1c26faa4 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_3.model and b/vowpalwabbit/slim/test/data/regression_data_3.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_3.pred b/vowpalwabbit/slim/test/data/regression_data_3.pred index d6d02d56323..e6e7359d503 100644 --- a/vowpalwabbit/slim/test/data/regression_data_3.pred +++ b/vowpalwabbit/slim/test/data/regression_data_3.pred @@ -1,2 +1,2 @@ -0.804214 -0.119599 +0.804218 +0.119585 diff --git a/vowpalwabbit/slim/test/data/regression_data_4.model b/vowpalwabbit/slim/test/data/regression_data_4.model index db5bea2f152..57c7fe2fae2 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_4.model and b/vowpalwabbit/slim/test/data/regression_data_4.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_4.pred b/vowpalwabbit/slim/test/data/regression_data_4.pred index 3c459e7518d..9259ea0dbb1 100644 --- a/vowpalwabbit/slim/test/data/regression_data_4.pred +++ b/vowpalwabbit/slim/test/data/regression_data_4.pred @@ -1,2 +1,2 @@ -0.635620 -0.117813 +0.635637 +0.117808 diff --git a/vowpalwabbit/slim/test/data/regression_data_5.model b/vowpalwabbit/slim/test/data/regression_data_5.model index 193591c1cbd..3e8c18fcf99 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_5.model and b/vowpalwabbit/slim/test/data/regression_data_5.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_5.pred b/vowpalwabbit/slim/test/data/regression_data_5.pred index 04ee51f85e8..1aad0fa2718 100644 --- a/vowpalwabbit/slim/test/data/regression_data_5.pred +++ b/vowpalwabbit/slim/test/data/regression_data_5.pred @@ -1,2 +1,2 @@ -0.761247 +0.761264 0.040148 diff --git a/vowpalwabbit/slim/test/data/regression_data_6.model b/vowpalwabbit/slim/test/data/regression_data_6.model index 566fcac1776..43c6a9a5dd5 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_6.model and b/vowpalwabbit/slim/test/data/regression_data_6.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_6.pred b/vowpalwabbit/slim/test/data/regression_data_6.pred index a2204c96afa..44277405900 100644 --- a/vowpalwabbit/slim/test/data/regression_data_6.pred +++ b/vowpalwabbit/slim/test/data/regression_data_6.pred @@ -1,2 +1,2 @@ -0.228718 -0.246401 +0.228760 +0.246454 diff --git a/vowpalwabbit/slim/test/data/regression_data_7.model b/vowpalwabbit/slim/test/data/regression_data_7.model index 0f2dae856a3..5584d879469 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_7.model and b/vowpalwabbit/slim/test/data/regression_data_7.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_7.pred b/vowpalwabbit/slim/test/data/regression_data_7.pred index f7f8dd0188d..c6638c10565 100644 --- a/vowpalwabbit/slim/test/data/regression_data_7.pred +++ b/vowpalwabbit/slim/test/data/regression_data_7.pred @@ -1,2 +1,2 @@ -0.658841 -0.099891 +0.658879 +0.099914 diff --git a/vowpalwabbit/slim/test/data/regression_data_ignore_linear.model b/vowpalwabbit/slim/test/data/regression_data_ignore_linear.model index 68d808987f7..b891f0a195f 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_ignore_linear.model and b/vowpalwabbit/slim/test/data/regression_data_ignore_linear.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_ignore_linear.pred b/vowpalwabbit/slim/test/data/regression_data_ignore_linear.pred index f225669ada0..5e715fea88b 100644 --- a/vowpalwabbit/slim/test/data/regression_data_ignore_linear.pred +++ b/vowpalwabbit/slim/test/data/regression_data_ignore_linear.pred @@ -1,2 +1,2 @@ 1.000000 -0.000000 +0 diff --git a/vowpalwabbit/slim/test/data/regression_data_no_constant.model b/vowpalwabbit/slim/test/data/regression_data_no_constant.model index 1175c06f544..71ed9b947f1 100644 Binary files a/vowpalwabbit/slim/test/data/regression_data_no_constant.model and b/vowpalwabbit/slim/test/data/regression_data_no_constant.model differ diff --git a/vowpalwabbit/slim/test/data/regression_data_no_constant.pred b/vowpalwabbit/slim/test/data/regression_data_no_constant.pred index 89b02b9f031..ec553b2b5e9 100644 --- a/vowpalwabbit/slim/test/data/regression_data_no_constant.pred +++ b/vowpalwabbit/slim/test/data/regression_data_no_constant.pred @@ -1,2 +1,2 @@ -0.034453 -0.172265 +0.034454 +0.172271 diff --git a/vowpalwabbit/slim/test/ut_util.cc b/vowpalwabbit/slim/test/ut_util.cc index 431a38d4649..65e8be040b2 100644 --- a/vowpalwabbit/slim/test/ut_util.cc +++ b/vowpalwabbit/slim/test/ut_util.cc @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -85,7 +86,6 @@ test_data get_test_data(const char* model_filename) TEST_DATA(model_filename, regression_data_ignore_linear); TEST_DATA(model_filename, multiclass_data_4); TEST_DATA(model_filename, multiclass_data_5); - TEST_DATA(model_filename, cb_data_epsilon_0_skype_jb); TEST_DATA(model_filename, cb_data_5); TEST_DATA(model_filename, cb_data_6); TEST_DATA(model_filename, cb_data_7); @@ -214,7 +214,7 @@ void run_predict_in_memory( // compare output std::vector preds_expected = read_floats(td.pred, td.pred_len); - EXPECT_THAT(preds, Pointwise(FloatNear(1e-5f), preds_expected)); + EXPECT_THAT(preds, Pointwise(FloatNear(1e-4f), preds_expected)); } enum class predict_param_weight_type @@ -343,11 +343,11 @@ TEST_P(invalid_model_test, Run) } invalid_model_param invalid_model_param[] = { - {"regression_data_1", regression_data_1_model, regression_data_1_model_len, {84, 92}, + {"regression_data_1", regression_data_1_model, regression_data_1_model_len, {54, 62}, predict_param_weight_type::SPARSE}, // 2 weights - {"regression_data_1", regression_data_1_model, regression_data_1_model_len, {84, 92}, + {"regression_data_1", regression_data_1_model, regression_data_1_model_len, {54, 62}, predict_param_weight_type::DENSE}, // 2 weights - {"regression_data_6", regression_data_6_model, regression_data_6_model_len, {99, 111, 123, 135}, + {"regression_data_6", regression_data_6_model, regression_data_6_model_len, {69, 81, 93, 105}, predict_param_weight_type::SPARSE} // 4 weights }; @@ -384,7 +384,9 @@ TEST(VowpalWabbitSlim, MulticlassData4) std::vector preds_expected = {0.901038f, 0.46983f, 0.0386223f}; // compare output - EXPECT_THAT(out_scores, Pointwise(FloatNear(1e-5f), preds_expected)); + std::sort(out_scores.begin(), out_scores.end()); + std::sort(preds_expected.begin(), preds_expected.end()); + EXPECT_THAT(out_scores, Pointwise(FloatNear(1e-4f), preds_expected)); } TEST(VowpalWabbitSlim, MulticlassData5) @@ -429,51 +431,13 @@ TEST(VowpalWabbitSlim, MulticlassData5) ASSERT_EQ(S_VW_PREDICT_OK, vw.predict(shared, ex, 8, out_scores)); - // 0:0.551784,3:0.551784,4:0.560359,7:0.560359,1:0.575381,5:0.592531,2:0.598978,6:0.624703 - std::vector preds_expected = { - 0.551784f, 0.575380862f, 0.598977983f, 0.5517838f, 0.560358882f, 0.592531085f, 0.624703348f, 0.560358882f}; + // 3:0.127492,3:0.438331,2:0.461522,2:0.668748,1:0.795552,1:0.795552,1:0.899165,1:0.899165 + std::vector preds_expected = {0.127492, 0.438331, 0.461522, 0.668748, 0.795552, 0.795552, 0.899165, 0.899165}; // compare output - EXPECT_THAT(out_scores, Pointwise(FloatNear(1e-5f), preds_expected)); -} - -void cb_data_epsilon_0_skype_jb_test_runner(int call_type, int modality, int network_type, int platform, - const std::vector& ranking_expected, const std::vector& pdf_expected) -{ - // load model. - vw_predict vw; - test_data td = get_test_data("cb_data_epsilon_0_skype_jb"); - ASSERT_EQ(0, vw.load((const char*)td.model, td.model_len)); - - // we have loaded the model and can push the features - VW::example_predict features; - vw_slim::example_predict_builder bOa(&features, "64"); // NOLINT - bOa.push_feature(static_cast(call_type), 1.f); - vw_slim::example_predict_builder bOb(&features, "16"); // NOLINT - bOb.push_feature(static_cast(modality), 1.f); - vw_slim::example_predict_builder bOc(&features, "32"); // NOLINT - bOc.push_feature(static_cast(network_type), 1.f); - vw_slim::example_predict_builder bOd(&features, "48"); // NOLINT - bOd.push_feature(static_cast(platform), 1.f); - - // push actions - const int min_delay_actions = 10; - VW::example_predict actions[min_delay_actions]; - for (int i = 0; i < min_delay_actions; i++) - { - vw_slim::example_predict_builder bOe(&actions[i], "80"); // NOLINT - bOe.push_feature(i, 1.f); - } - - // predict CB value - std::vector pdfs; - std::vector rankings; - int result = vw.predict("eid", features, actions, min_delay_actions, pdfs, rankings); - - // compare output with expected. - EXPECT_EQ(result, 0); - EXPECT_THAT(pdfs, Pointwise(FloatNear(1e-5f), pdf_expected)); - EXPECT_THAT(rankings, Pointwise(Eq(), ranking_expected)); + std::sort(out_scores.begin(), out_scores.end()); + std::sort(preds_expected.begin(), preds_expected.end()); + EXPECT_THAT(out_scores, Pointwise(FloatNear(1e-4f), preds_expected)); } TEST(VowpalWabbitSlim, InteractionNumBitsBug) @@ -522,52 +486,6 @@ TEST(VowpalWabbitSlim, InteractionNumBitsBug) EXPECT_EQ(rankings[0], 3); } -TEST(VowpalWabbitSlim, CbDataEpsilon0SkypeJb) -{ - // Since the model is epsilon=0, the first entry should always be 0. - std::vector pdf_expected = {1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; - - // {0, 1, 2, 0} => 1 - std::vector ranking_expected = {1, 0, 2, 3, 4, 5, 7, 6, 8, 9}; - cb_data_epsilon_0_skype_jb_test_runner(0, 1, 2, 0, ranking_expected, pdf_expected); - - // {0, 1, 4, 0} => 1 - ranking_expected = {1, 0, 2, 3, 4, 5, 6, 8, 7, 9}; - cb_data_epsilon_0_skype_jb_test_runner(0, 1, 4, 0, ranking_expected, pdf_expected); - - // {0, 0, 2, 0} => 1 - ranking_expected = {1, 2, 0, 3, 4, 5, 6, 7, 8, 9}; - cb_data_epsilon_0_skype_jb_test_runner(0, 0, 2, 0, ranking_expected, pdf_expected); - - // {0, 0, 4, 0} => 1 - ranking_expected = {1, 3, 2, 0, 4, 6, 5, 8, 7, 9}; - cb_data_epsilon_0_skype_jb_test_runner(0, 0, 4, 0, ranking_expected, pdf_expected); - - // {2, 0, 4, 0} => 3 - ranking_expected = {3, 1, 0, 2, 5, 4, 7, 6, 8, 9}; - cb_data_epsilon_0_skype_jb_test_runner(2, 0, 4, 0, ranking_expected, pdf_expected); - - // {0, 1, 999, 0} => 2 - ranking_expected = {2, 4, 6, 1, 0, 5, 3, 7, 8, 9}; - cb_data_epsilon_0_skype_jb_test_runner(0, 1, 999, 0, ranking_expected, pdf_expected); - - // {0, 0, 999, 0} => 2 - ranking_expected = {2, 4, 6, 1, 3, 5, 0, 7, 8, 9}; - cb_data_epsilon_0_skype_jb_test_runner(0, 0, 999, 0, ranking_expected, pdf_expected); - - // {2, 0, 999, 0} => 2 - ranking_expected = {2, 5, 4, 3, 6, 1, 0, 7, 8, 9}; - cb_data_epsilon_0_skype_jb_test_runner(2, 0, 999, 0, ranking_expected, pdf_expected); - - // {999, 0, 4, 0} => 1 - ranking_expected = {0, 1, 4, 2, 6, 3, 8, 7, 5, 9}; - cb_data_epsilon_0_skype_jb_test_runner(999, 0, 4, 0, ranking_expected, pdf_expected); - - // {999, 0, 2, 0} => 2 - ranking_expected = {0, 1, 4, 2, 7, 3, 6, 8, 5, 9}; - cb_data_epsilon_0_skype_jb_test_runner(999, 0, 2, 0, ranking_expected, pdf_expected); -} - void clear(VW::example_predict& ex) { for (auto ns : ex.indices) { ex.feature_space[ns].clear(); } @@ -670,38 +588,38 @@ TEST_P(cb_predict_test, CBRunPredict) //} #endif - EXPECT_THAT(histogram, Pointwise(FloatNear(1e-2f), GetParam().ranking_pdf_expected)); + EXPECT_THAT(histogram, Pointwise(FloatNear(2e-2f), GetParam().ranking_pdf_expected)); } cb_predict_param cb_predict_params[] = { - {"CB Epsilon Greedy", "cb_data_5", 10000, {0.1f, 0.1f, 0.8f}, + {"CB Epsilon Greedy", "cb_data_5", 10000, {0.8f, 0.1f, 0.1f}, { - // see top action 2 w / 0.8 - 0.1f, 0.09f, 0.80f, // slot 0 - // most of the time we should see action 2 - // in 10% we should see the top action 0 swapped from top-slot to here - 0.0f, 0.90f, 0.09f, // slot 1 - // most of the time we should see action 1 - // in 20% we should see the top action 2 swapped from top-slot to here - 0.89f, 0.0f, 0.10f, // slot 2 + 0.8f, 0.1f, 0.1f, // slot 0 + // most of the time we should see action 0 + 0.1f, 0.9f, 0.0f, // slot 1 + // most of the time we should see action 1 + // in 10% we should see the top action 0 swapped from top-slot to here + 0.1f, 0.0f, 0.9f, // slot 2 + // most of the time we should see action 2 + // in 10% we should see the top action 0 swapped from top-slot to here }}, - {"CB Softmax", "cb_data_6", 1000, {0.329f, 0.333f, 0.337f}, + {"CB Softmax", "cb_data_6", 1000, {0.664f, 0.245f, 0.090f}, { - 0.328f, 0.354f, 0.316f, // slot 0 - 0.000f, 0.644f, 0.354f, // slot 1 - 0.671f, 0.000f, 0.328f, // slot 2 + 0.664f, 0.245f, 0.090f, // slot 0 + 0.245f, 0.755f, 0.000f, // slot 1 + 0.090f, 0.000f, 0.910f, // slot 2 }}, - {"CB Bag", "cb_data_7", 5, {0.0f, 0.0f, 1.0f}, + {"CB Bag", "cb_data_7", 5, {1.0f, 0.0f, 0.0f}, { - 0.0f, 0.0f, 1.0f, // slot 0 + 1.0f, 0.0f, 0.0f, // slot 0 0.0f, 1.0f, 0.0f, // slot 1 - 1.0f, 0.0f, 0.0f, // slot 2 + 0.0f, 0.0f, 1.0f, // slot 2 }}, - {"CB Bag Epsilon Greedy", "cb_data_8", 10000, {0.09f, 0.09f, 0.82f}, + {"CB Bag Epsilon Greedy", "cb_data_8", 10000, {0.82f, 0.09f, 0.09f}, { - 0.091f, 0.086f, 0.82f, // slot 0 - 0.00f, 0.91f, 0.086f, // slot 1 - 0.90f, 0.00f, 0.09f, // slot 2 + 0.82f, 0.09f, 0.09f, // slot 0 + 0.09f, 0.91f, 0.00f, // slot 1 + 0.09f, 0.00f, 0.91f, // slot 2 }}, };