From 63050bcc3eec25b8a14529e0bd9251ca6297fb5a Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 May 2024 14:31:14 +0800 Subject: [PATCH] prob dist --- README.md | 11 + poetry.lock | 115 +++----- prob_dist.ipynb | 752 ++++++++++++++++++------------------------------ pyproject.toml | 2 +- 4 files changed, 328 insertions(+), 552 deletions(-) diff --git a/README.md b/README.md index 0fb988d..0cc1689 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,17 @@ I've also merged some of the recent PR's for enum, integer, null, union. They ar pip install git+https://github.com/wassname/prob_jsonformer.git ~~~ + + +| method | KL_div_loss | time | +| :---------------------------- | ----------: | -------: | +| method0: sampling | -0.147245 | 21.5937 | +| method1: hindsight | -0.145874 | 0.631365 | +| method3: gen tree (this work) | -0.147246 | 0.066084 | + +KL_div_loss is the KL divergence between the true distribution and the generated distribution. Lower is better as it indicated a faithful sampling of the distribution. Time is in seconds. + + ## Example ```python diff --git a/poetry.lock b/poetry.lock index 4a2786a..ca5ee90 100644 --- a/poetry.lock +++ b/poetry.lock @@ -57,17 +57,6 @@ six = ">=1.12.0" astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - [[package]] name = "bitsandbytes" version = "0.38.1" @@ -323,6 +312,20 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "executing" version = "2.0.1" @@ -501,42 +504,40 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.12.3" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, - {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "jaxtyping" @@ -763,58 +764,21 @@ files = [ [[package]] name = "networkx" -version = "3.1" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] - -[[package]] -name = "numpy" -version = "1.24.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, -] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numpy" @@ -1116,17 +1080,6 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "platformdirs" version = "4.2.1" @@ -2144,4 +2097,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9,<4.0" -content-hash = "7dc5b5ce8859c474fbf5706b8b3729058bcb7a55d2201fa6aef6aa348587d5e2" +content-hash = "de9ff88e0262687eae944edc9546130665af3bf7b325daa50bdbd78b6a23381f" diff --git a/prob_dist.ipynb b/prob_dist.ipynb index 918e459..2ba7482 100644 --- a/prob_dist.ipynb +++ b/prob_dist.ipynb @@ -37,8 +37,7 @@ "text": [ "/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/.venv/lib/python3.9/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", " warnings.warn(\n", - "/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/.venv/lib/python3.9/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", - " warnings.warn(\n", + "Loading checkpoint shards: 100%|██████████| 4/4 [00:02<00:00, 1.42it/s]\n", "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n" ] }, @@ -53,10 +52,16 @@ "source": [ "from transformers import AutoModelForCausalLM, AutoTokenizer\n", "import torch\n", + "\n", "from prob_jsonformer import Jsonformer\n", "\n", "print(\"Loading model and tokenizer...\")\n", "model_name = \"databricks/dolly-v2-3b\"\n", + "model_name = \"NousResearch/Meta-Llama-3-8B-Instruct\".lower()\n", + "# model_name = \"failspy/Llama-3-8B-Instruct-abliterated\"\n", + "# model_name = \"cognitivecomputations/Llama-3-8B-Instruct-abliterated-v2\"\n", + "# model_name = \"nvidia/Llama3-ChatQA-1.5-8B\" # 4b\n", + "# model_name = \"CohereForAI/c4ai-command-r-v01-4bit\" # 35b/4 = 8.75b\n", "model = AutoModelForCausalLM.from_pretrained(\n", " model_name,\n", " use_cache=True,\n", @@ -70,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -90,60 +95,32 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from prob_jsonformer.prob_choice_tree import prob_choice_tree\n", - "import pandas as pd" + "import pandas as pd\n", + "import torch.nn.functional as F\n", + "from tqdm.auto import tqdm" ] }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 110, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.047619\n", - "1 0.047619\n", - "2 0.047619\n", - "3 0.047619\n", - "4 0.047619\n", - "5 0.047619\n", - "6 0.047619\n", - "7 0.047619\n", - "8 0.047619\n", - "9 0.047619\n", - "10 0.047619\n", - "11 0.047619\n", - "12 0.047619\n", - "13 0.047619\n", - "14 0.047619\n", - "15 0.047619\n", - "16 0.047619\n", - "17 0.047619\n", - "18 0.047619\n", - "19 0.047619\n", - "20 0.047619\n", - "dtype: float64" - ] - }, - "execution_count": 135, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "def method0(choices):\n", + "def method0(choices, n=400):\n", " \"\"\"\n", " just generate many times\n", " \"\"\"\n", "\n", - " toks = tokenizer.encode(prompt, return_tensors=\"pt\").to(\"cuda:0\")\n", + " toks = tokenizer.encode(prompt, return_tensors=\"pt\").to(model.device)\n", " data = []\n", - " for _ in range(100):\n", + " i = 0\n", + " while i>>\n", - "Generated `21` not in choices ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']\n", - "Failed to convert to float `\n", - "-\n", - "Failed to convert to float `\n", - "B\n", - "Failed to convert to float `\n", - "[\n", - "CPU times: user 3.8 s, sys: 22.6 ms, total: 3.82 s\n", - "Wall time: 3.81 s\n" - ] - }, { "data": { "text/html": [ @@ -312,311 +238,102 @@ " \n", " \n", " \n", - " 0\n", - " 0.115385\n", - " \n", - " \n", - " 1\n", - " 0.038462\n", - " \n", - " \n", - " 2\n", - " 0.012821\n", - " \n", - " \n", - " 3\n", - " 0.025641\n", - " \n", - " \n", " 4\n", - " 0.051282\n", + " 0.0950\n", " \n", " \n", " 5\n", - " 0.025641\n", - " \n", - " \n", - " 6\n", - " 0.051282\n", + " 0.0600\n", " \n", " \n", " 7\n", - " 0.051282\n", + " 0.1000\n", " \n", " \n", " 8\n", - " 0.012821\n", + " 0.0950\n", " \n", " \n", " 10\n", - " 0.128205\n", + " 0.0475\n", " \n", " \n", " 11\n", - " 0.051282\n", + " 0.0400\n", " \n", " \n", " 12\n", - " 0.025641\n", + " 0.1325\n", + " \n", + " \n", + " 13\n", + " 0.0425\n", + " \n", + " \n", + " 14\n", + " 0.3750\n", " \n", " \n", " 15\n", - " 0.064103\n", - " \n", - " \n", - " 16\n", - " 0.025641\n", - " \n", - " \n", - " 17\n", - " 0.012821\n", - " \n", - " \n", - " 18\n", - " 0.025641\n", - " \n", - " \n", - " 19\n", - " 0.076923\n", - " \n", - " \n", - " 20\n", - " 0.205128\n", + " 0.0125\n", " \n", " \n", "\n", "" ], "text/plain": [ - " 0\n", - "0 0.115385\n", - "1 0.038462\n", - "2 0.012821\n", - "3 0.025641\n", - "4 0.051282\n", - "5 0.025641\n", - "6 0.051282\n", - "7 0.051282\n", - "8 0.012821\n", - "10 0.128205\n", - "11 0.051282\n", - "12 0.025641\n", - "15 0.064103\n", - "16 0.025641\n", - "17 0.012821\n", - "18 0.025641\n", - "19 0.076923\n", - "20 0.205128" + " 0\n", + "4 0.0950\n", + "5 0.0600\n", + "7 0.1000\n", + "8 0.0950\n", + "10 0.0475\n", + "11 0.0400\n", + "12 0.1325\n", + "13 0.0425\n", + "14 0.3750\n", + "15 0.0125" ] }, - "execution_count": 145, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ - "%%time\n", - "r0 = method0(choices)\n", - "r0.plot.hist()\n", + "t0 = pd.Timestamp.now()\n", + "r0 = method0(choices, n=400)\n", + "t0 = pd.Timestamp.now() - t0\n", "r0" ] }, { "cell_type": "code", - "execution_count": 146, + "execution_count": 112, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 489 ms, sys: 0 ns, total: 489 ms\n", - "Wall time: 481 ms\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0
00.011559
10.011833
20.015434
30.019974
40.029968
50.050995
60.027298
70.024841
80.028168
90.022278
100.037292
110.019974
120.029510
130.012108
140.012688
150.011642
160.003839
170.004059
180.003311
190.003721
200.007942
\n", - "
" - ], - "text/plain": [ - " 0\n", - "0 0.011559\n", - "1 0.011833\n", - "2 0.015434\n", - "3 0.019974\n", - "4 0.029968\n", - "5 0.050995\n", - "6 0.027298\n", - "7 0.024841\n", - "8 0.028168\n", - "9 0.022278\n", - "10 0.037292\n", - "11 0.019974\n", - "12 0.029510\n", - "13 0.012108\n", - "14 0.012688\n", - "15 0.011642\n", - "16 0.003839\n", - "17 0.004059\n", - "18 0.003311\n", - "19 0.003721\n", - "20 0.007942" - ] - }, - "execution_count": 146, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "%%time\n", + "t1 = pd.Timestamp.now()\n", "r1 = method1(choices)\n", - "r1.plot.hist()\n", - "r1\n" + "t1 = pd.Timestamp.now() - t1\n" ] }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "t3 = pd.Timestamp.now()\n", + "r3 = method3(choices)\n", + "t3 = pd.Timestamp.now() - t3" + ] + }, + { + "cell_type": "code", + "execution_count": 114, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 57.6 ms, sys: 5.43 ms, total: 63 ms\n", - "Wall time: 48.5 ms\n" - ] - }, { "data": { "text/html": [ @@ -638,168 +355,196 @@ " \n", " \n", " \n", - " prob\n", - " \n", - " \n", - " choice\n", - " \n", + " method0: sampling\n", + " method1: hindsight\n", + " method3: generation tree\n", + " ideal\n", " \n", " \n", " \n", " \n", " 0\n", - " 0.00838\n", + " 0.0000\n", + " 0.000254\n", + " 0.0365\n", + " 0.047619\n", " \n", " \n", " 1\n", - " 0.00122\n", + " 0.0000\n", + " 0.001112\n", + " 0.0667\n", + " 0.047619\n", " \n", " \n", " 2\n", - " 0.00229\n", + " 0.0000\n", + " 0.000399\n", + " 0.0710\n", + " 0.047619\n", " \n", " \n", " 3\n", - " 0.00362\n", + " 0.0000\n", + " 0.003589\n", + " 0.0653\n", + " 0.047619\n", " \n", " \n", " 4\n", - " 0.01500\n", + " 0.0950\n", + " 0.011404\n", + " 0.0786\n", + " 0.047619\n", " \n", " \n", " 5\n", - " 0.04450\n", + " 0.0600\n", + " 0.017389\n", + " 0.0999\n", + " 0.047619\n", " \n", " \n", " 6\n", - " 0.03930\n", + " 0.0000\n", + " 0.005472\n", + " 0.0662\n", + " 0.047619\n", " \n", " \n", " 7\n", - " 0.12900\n", + " 0.1000\n", + " 0.025301\n", + " 0.0858\n", + " 0.047619\n", " \n", " \n", " 8\n", - " 0.02750\n", + " 0.0950\n", + " 0.023400\n", + " 0.0682\n", + " 0.047619\n", " \n", " \n", " 9\n", - " 0.09860\n", + " 0.0000\n", + " 0.004829\n", + " 0.0745\n", + " 0.047619\n", " \n", " \n", " 10\n", - " 0.06270\n", + " 0.0475\n", + " 0.014874\n", + " 0.0327\n", + " 0.047619\n", " \n", " \n", " 11\n", - " 0.06700\n", + " 0.0400\n", + " 0.017941\n", + " 0.0187\n", + " 0.047619\n", " \n", " \n", " 12\n", - " 0.04800\n", + " 0.1325\n", + " 0.047269\n", + " 0.0307\n", + " 0.047619\n", " \n", " \n", " 13\n", - " 0.06470\n", + " 0.0425\n", + " 0.012525\n", + " 0.0279\n", + " 0.047619\n", " \n", " \n", " 14\n", - " 0.05620\n", + " 0.3750\n", + " 0.167584\n", + " 0.0274\n", + " 0.047619\n", " \n", " \n", " 15\n", - " 0.07020\n", + " 0.0125\n", + " 0.016854\n", + " 0.0312\n", + " 0.047619\n", " \n", " \n", " 16\n", - " 0.01910\n", + " 0.0000\n", + " 0.004066\n", + " 0.0344\n", + " 0.047619\n", " \n", " \n", " 17\n", - " 0.09010\n", + " 0.0000\n", + " 0.013756\n", + " 0.0235\n", + " 0.047619\n", " \n", " \n", " 18\n", - " 0.08470\n", + " 0.0000\n", + " 0.006917\n", + " 0.0225\n", + " 0.047619\n", " \n", " \n", " 19\n", - " 0.04930\n", + " 0.0000\n", + " 0.000435\n", + " 0.0109\n", + " 0.047619\n", " \n", " \n", " 20\n", - " 0.01900\n", + " 0.0000\n", + " 0.000004\n", + " 0.0277\n", + " 0.047619\n", " \n", " \n", "\n", "" ], "text/plain": [ - " prob\n", - "choice \n", - "0 0.00838\n", - "1 0.00122\n", - "2 0.00229\n", - "3 0.00362\n", - "4 0.01500\n", - "5 0.04450\n", - "6 0.03930\n", - "7 0.12900\n", - "8 0.02750\n", - "9 0.09860\n", - "10 0.06270\n", - "11 0.06700\n", - "12 0.04800\n", - "13 0.06470\n", - "14 0.05620\n", - "15 0.07020\n", - "16 0.01910\n", - "17 0.09010\n", - "18 0.08470\n", - "19 0.04930\n", - "20 0.01900" + " method0: sampling method1: hindsight method3: generation tree ideal\n", + "0 0.0000 0.000254 0.0365 0.047619\n", + "1 0.0000 0.001112 0.0667 0.047619\n", + "2 0.0000 0.000399 0.0710 0.047619\n", + "3 0.0000 0.003589 0.0653 0.047619\n", + "4 0.0950 0.011404 0.0786 0.047619\n", + "5 0.0600 0.017389 0.0999 0.047619\n", + "6 0.0000 0.005472 0.0662 0.047619\n", + "7 0.1000 0.025301 0.0858 0.047619\n", + "8 0.0950 0.023400 0.0682 0.047619\n", + "9 0.0000 0.004829 0.0745 0.047619\n", + "10 0.0475 0.014874 0.0327 0.047619\n", + "11 0.0400 0.017941 0.0187 0.047619\n", + "12 0.1325 0.047269 0.0307 0.047619\n", + "13 0.0425 0.012525 0.0279 0.047619\n", + "14 0.3750 0.167584 0.0274 0.047619\n", + "15 0.0125 0.016854 0.0312 0.047619\n", + "16 0.0000 0.004066 0.0344 0.047619\n", + "17 0.0000 0.013756 0.0235 0.047619\n", + "18 0.0000 0.006917 0.0225 0.047619\n", + "19 0.0000 0.000435 0.0109 0.047619\n", + "20 0.0000 0.000004 0.0277 0.047619" ] }, - "execution_count": 147, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGdCAYAAADuR1K7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtyklEQVR4nO3df3BUVZ7//1dDSAcwHUTID0gglATk9y8BAzMGBQ2QUqJbyjBqkEFGZ2EnCjJDHNEPUrtBEYQVBFyF6LoYZeWHJSrGCKIQRCBRgoowQgKSBFw1TTLSxPT9/uGXHluSmHS6+3Yuz0fVLatvn3v6fU5F+lWnz+22GYZhCAAAwCJamV0AAACAPxFuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApYSZXUCwud1unTp1SpGRkbLZbGaXAwAAGsEwDJ09e1ZdunRRq1YNr81ccuHm1KlTSkhIMLsMAADggxMnTig+Pr7BNpdcuImMjJT00+Q4HA6TqwEAAI3hdDqVkJDgeR9vyCUXbi58FOVwOAg3AAC0MI3ZUsKGYgAAYCmEGwAAYCmEGwAAYCmX3J4bAAACqba2VjU1NWaX0SK1adNGrVu3bnY/hBsAAPykqqpKJ0+elGEYZpfSItlsNsXHx+uyyy5rVj+EGwAA/KC2tlYnT55Uu3bt1LlzZ74otokMw9CZM2d08uRJJSUlNWsFh3ADAIAf1NTUyDAMde7cWW3btjW7nBapc+fOOn78uGpqapoVbthQDACAH7Fi4zt/zR3hBgAAWArhBgAA+F1iYqKWLVtmymuHzJ6bRYsWKSsrS5mZmQ1OxoYNGzR//nwdP35cSUlJevzxxzVx4sTgFQoAQBMkztsa1Nc7vigtqK8XikJi5ebjjz/WmjVrNHDgwAbb7d69W1OmTNH06dNVWFio9PR0paenq7i4OEiVAgBwaTt//rzZJfwq08NNVVWV7rjjDv3Xf/2XLr/88gbbLl++XOPHj9fcuXPVp08fLVy4UEOHDtWKFSuCVC0AANYyZswYzZo1S7NmzVJUVJQ6deqk+fPne76rJzExUQsXLlRGRoYcDof++Mc/SpJee+019evXT3a7XYmJiVqyZMlFfZ89e1ZTpkxR+/bt1bVrV61cuTIoYzI93MycOVNpaWkaN27cr7YtKCi4qF1qaqoKCgrqvcblcsnpdHodAADgn1544QWFhYVp7969Wr58uZYuXarnnnvO8/yTTz6pQYMGqbCwUPPnz9f+/ft1++2363e/+50OHjyo//f//p/mz5+vnJwcr34XL17suW7evHnKzMxUXl5ewMdj6p6b3NxcHThwQB9//HGj2peXlysmJsbrXExMjMrLy+u9Jjs7WwsWLGhWnU0R7M9W/YHPZwHg0paQkKCnnnpKNptNvXv31sGDB/XUU09pxowZkqTrr79ec+bM8bS/4447NHbsWM2fP1+S1KtXL3322WdavHix7r77bk+70aNHa968eZ42u3bt0lNPPaUbbrghoOMxbeXmxIkTyszM1P/8z/8oIiIiYK+TlZWlyspKz3HixImAvRYAAC3RNddc4/UdM8nJyTpy5Ihqa2slSVdffbVX+88//1yjR4/2Ojd69Givay7083PJycn6/PPP/V3+RUxbudm/f79Onz6toUOHes7V1tZq586dWrFihVwu10XfThgbG6uKigqvcxUVFYqNja33dex2u+x2u3+LBwDgEtK+fXuzS2gS01Zuxo4dq4MHD6qoqMhzXH311brjjjtUVFRU59cuJycnKz8/3+tcXl7eRckQAAA03kcffeT1eM+ePQ3+vlOfPn20a9cur3O7du1Sr169vK7Zs2fPRf326dPHT1XXz7SVm8jISPXv39/rXPv27XXFFVd4zmdkZKhr167Kzs6WJGVmZiolJUVLlixRWlqacnNztW/fPj377LNBrx8AAKsoLS3V7Nmzde+99+rAgQN6+umn67z76YI5c+Zo+PDhWrhwoSZPnqyCggKtWLFCzzzzjFe7Xbt26YknnlB6erry8vK0YcMGbd0a+L2pIfMlfnUpLS1Vq1b/XFwaNWqU1q9fr4cfflgPPfSQkpKStHnz5otCEgAAaLyMjAz98MMPGjFihFq3bq3MzEzPLd91GTp0qF599VU98sgjWrhwoeLi4vTYY495bSaWfgpB+/bt04IFC+RwOLR06VKlpqYGeDSSzbhwI/slwul0KioqSpWVlXI4HH7vn7ulAODSdO7cOR07dkw9evQI6I0y/jZmzBgNHjzYtJ9K+LmG5rAp79+mf88NAACAPxFuAACApYT0nhsAABBYO3bsMLsEv2PlBgAAWArhBgAAWArhBgAAP7rEbkL2K3/NHeEGAAA/uPDNvOfPnze5kpbrwtzV983IjcWGYgAA/CAsLEzt2rXTmTNn1KZNG68vocWvc7vdOnPmjNq1a6ewsObFE8INAAB+YLPZFBcXp2PHjqmkpMTsclqkVq1aqVu3bl6/UO4Lwg0AAH4SHh6upKQkPpryUXh4uF9WvAg3AAD4UatWrVrUzy9YER8IAgAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASzE13KxatUoDBw6Uw+GQw+FQcnKy3nrrrXrb5+TkyGazeR0RERFBrBgAAIS6MDNfPD4+XosWLVJSUpIMw9ALL7ygSZMmqbCwUP369avzGofDocOHD3se22y2YJULAABaAFPDzU033eT1+N///d+1atUq7dmzp95wY7PZFBsbG4zyAABACxQye25qa2uVm5ur6upqJScn19uuqqpK3bt3V0JCgiZNmqRDhw412K/L5ZLT6fQ6AACAdZkebg4ePKjLLrtMdrtd9913nzZt2qS+ffvW2bZ3795au3attmzZopdeeklut1ujRo3SyZMn6+0/OztbUVFRniMhISFQQwEAACHAZhiGYWYB58+fV2lpqSorK/W///u/eu655/T+++/XG3B+rqamRn369NGUKVO0cOHCOtu4XC65XC7PY6fTqYSEBFVWVsrhcPhtHBckztvq9z4D7fiiNLNLAACgQU6nU1FRUY16/zZ1z40khYeHq2fPnpKkYcOG6eOPP9by5cu1Zs2aX722TZs2GjJkiI4ePVpvG7vdLrvd7rd6AQBAaDP9Y6lfcrvdXistDamtrdXBgwcVFxcX4KoAAEBLYerKTVZWliZMmKBu3brp7NmzWr9+vXbs2KFt27ZJkjIyMtS1a1dlZ2dLkh577DFdc8016tmzp77//nstXrxYJSUluueee8wcBgAACCGmhpvTp08rIyNDZWVlioqK0sCBA7Vt2zbdcMMNkqTS0lK1avXPxaXvvvtOM2bMUHl5uS6//HINGzZMu3fvbtT+HAAAcGkwfUNxsDVlQ5Iv2FAMAID/NeX9O+T23AAAADQH4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFgK4QYAAFiKqeFm1apVGjhwoBwOhxwOh5KTk/XWW281eM2GDRt01VVXKSIiQgMGDNCbb74ZpGoBAEBLYGq4iY+P16JFi7R//37t27dP119/vSZNmqRDhw7V2X737t2aMmWKpk+frsLCQqWnpys9PV3FxcVBrhwAAIQqm2EYhtlF/FzHjh21ePFiTZ8+/aLnJk+erOrqar3xxhuec9dcc40GDx6s1atXN6p/p9OpqKgoVVZWyuFw+K3uCxLnbfV7n4F2fFGa2SUAANCgprx/h8yem9raWuXm5qq6ulrJycl1tikoKNC4ceO8zqWmpqqgoKDefl0ul5xOp9cBAACsK8zsAg4ePKjk5GSdO3dOl112mTZt2qS+ffvW2ba8vFwxMTFe52JiYlReXl5v/9nZ2VqwYIFfa7YaVpuCoyXOc0vUEv82APiX6Ss3vXv3VlFRkT766CP96U9/0tSpU/XZZ5/5rf+srCxVVlZ6jhMnTvitbwAAEHpMX7kJDw9Xz549JUnDhg3Txx9/rOXLl2vNmjUXtY2NjVVFRYXXuYqKCsXGxtbbv91ul91u92/RAAAgZJm+cvNLbrdbLperzueSk5OVn5/vdS4vL6/ePToAAODSY+rKTVZWliZMmKBu3brp7NmzWr9+vXbs2KFt27ZJkjIyMtS1a1dlZ2dLkjIzM5WSkqIlS5YoLS1Nubm52rdvn5599lkzhwEAAEKIqeHm9OnTysjIUFlZmaKiojRw4EBt27ZNN9xwgySptLRUrVr9c3Fp1KhRWr9+vR5++GE99NBDSkpK0ubNm9W/f3+zhgAAAEKMqeHm+eefb/D5HTt2XHTutttu02233RagigAAQEsXcntuAAAAmoNwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALMXUcJOdna3hw4crMjJS0dHRSk9P1+HDhxu8JicnRzabzeuIiIgIUsUAACDUmRpu3n//fc2cOVN79uxRXl6eampqdOONN6q6urrB6xwOh8rKyjxHSUlJkCoGAAChLszMF3/77be9Hufk5Cg6Olr79+/XtddeW+91NptNsbGxgS4PAAC0QCG156ayslKS1LFjxwbbVVVVqXv37kpISNCkSZN06NChetu6XC45nU6vAwAAWFfIhBu32637779fo0ePVv/+/ett17t3b61du1ZbtmzRSy+9JLfbrVGjRunkyZN1ts/OzlZUVJTnSEhICNQQAABACAiZcDNz5kwVFxcrNze3wXbJycnKyMjQ4MGDlZKSoo0bN6pz585as2ZNne2zsrJUWVnpOU6cOBGI8gEAQIgwdc/NBbNmzdIbb7yhnTt3Kj4+vknXtmnTRkOGDNHRo0frfN5ut8tut/ujTAAA0AL4tHLz1Vdf+eXFDcPQrFmztGnTJr333nvq0aNHk/uora3VwYMHFRcX55eaAABAy+ZTuOnZs6euu+46vfTSSzp37pzPLz5z5ky99NJLWr9+vSIjI1VeXq7y8nL98MMPnjYZGRnKysryPH7sscf0zjvv6KuvvtKBAwd05513qqSkRPfcc4/PdQAAAOvwKdwcOHBAAwcO1OzZsxUbG6t7771Xe/fubXI/q1atUmVlpcaMGaO4uDjP8corr3jalJaWqqyszPP4u+++04wZM9SnTx9NnDhRTqdTu3fvVt++fX0ZCgAAsBibYRiGrxf/+OOPev3115WTk6O3335bvXr10h/+8Afddddd6ty5sz/r9Bun06moqChVVlbK4XD4vf/EeVv93icudnxRmtklNBl/G8HREv82APy6prx/N+tuqbCwMN16663asGGDHn/8cR09elQPPvigEhISlJGR4bXiAgAAEAzNCjf79u3Tv/7rvyouLk5Lly7Vgw8+qL///e/Ky8vTqVOnNGnSJH/VCQAA0Cg+3Qq+dOlSrVu3TocPH9bEiRP14osvauLEiWrV6qes1KNHD+Xk5CgxMdGftQIAAPwqn8LNqlWr9Ic/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EAg+hZsHHnhAbdq0UWlpqdq1a+c5P3ny5It+6RsAACCYfNpz884772jbtm0X/VRCUlKSSkpK/FIYAACAL3xauamurvZasbng22+/5XecAACAqXwKN7/97W/14osveh7bbDa53W498cQTuu666/xWHAAAQFP59LHUE088obFjx2rfvn06f/68/vKXv+jQoUP69ttvtWvXLn/XCAAA0Gg+rdz0799fX375pX7zm99o0qRJqq6u1q233qrCwkJdeeWV/q4RAACg0Zq8clNTU6Px48dr9erV+tvf/haImgAAAHzW5JWbNm3a6NNPPw1ELQAAAM3m08dSd955p55//nl/1wIAANBsPm0o/vHHH7V27Vq9++67GjZs2EW/KbV06VK/FAcAANBUTQo3X331lRITE1VcXKyhQ4dKkr788kuvNjabzX/VAQAANFGTwk1SUpLKysq0fft2ST/93MJ//ud/KiYmJiDFAQAANFWT9tz88le/33rrLVVXV/u1IAAAgObwaUPxBb8MOwAAAGZrUrix2WwX7alhjw0AAAglTdpzYxiG7r77bs+PY547d0733XffRXdLbdy40X8VAgAANEGTws3UqVO9Ht95551+LQYAAKC5mhRu1q1bF6g6AAAA/KJZG4oBAABCDeEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYiqnhZufOnbrpppvUpUsX2Ww2bd68ucH2O3bs8Pwy+c+P8vLy4BQMAABCnqnhprq6WoMGDdLKlSubdN3hw4dVVlbmOaKjowNUIQAAaGma9MOZ/jZhwgRNmDChyddFR0erQ4cO/i8IAAC0eC1yz83gwYMVFxenG264Qbt27WqwrcvlktPp9DoAAIB1tahwExcXp9WrV+u1117Ta6+9poSEBI0ZM0YHDhyo95rs7GxFRUV5joSEhCBWDAAAgs1mGIZhdhGSZLPZtGnTJqWnpzfpupSUFHXr1k3//d//XefzLpdLLpfL89jpdCohIUGVlZVyOBzNKblOifO2+r1PAAg1xxelmV0CLjFOp1NRUVGNev82dc+NP4wYMUIffvhhvc/b7XbZ7fYgVgQAAMzUoj6WqktRUZHi4uLMLgMAAIQIU1duqqqqdPToUc/jY8eOqaioSB07dlS3bt2UlZWlr7/+Wi+++KIkadmyZerRo4f69eunc+fO6bnnntN7772nd955x6whAACAEGNquNm3b5+uu+46z+PZs2dLkqZOnaqcnByVlZWptLTU8/z58+c1Z84cff3112rXrp0GDhyod99916sPAABwaQuZDcXB0pQNSb5gQzGASwEbihFsTXn/bvF7bgAAAH6OcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACzF1HCzc+dO3XTTTerSpYtsNps2b978q9fs2LFDQ4cOld1uV8+ePZWTkxPwOgEAQMthariprq7WoEGDtHLlyka1P3bsmNLS0nTdddepqKhI999/v+655x5t27YtwJUCAICWIszMF58wYYImTJjQ6ParV69Wjx49tGTJEklSnz599OGHH+qpp55SampqoMoEAAAtSIvac1NQUKBx48Z5nUtNTVVBQUG917hcLjmdTq8DAABYl6krN01VXl6umJgYr3MxMTFyOp364Ycf1LZt24uuyc7O1oIFC4JVIgBcEhLnbTW7BJ8cX5RmdglN1hLn2ux5blErN77IyspSZWWl5zhx4oTZJQEAgABqUSs3sbGxqqio8DpXUVEhh8NR56qNJNntdtnt9mCUBwAAQkCLWrlJTk5Wfn6+17m8vDwlJyebVBEAAAg1poabqqoqFRUVqaioSNJPt3oXFRWptLRU0k8fKWVkZHja33ffffrqq6/0l7/8RV988YWeeeYZvfrqq3rggQfMKB8AAIQgU8PNvn37NGTIEA0ZMkSSNHv2bA0ZMkSPPPKIJKmsrMwTdCSpR48e2rp1q/Ly8jRo0CAtWbJEzz33HLeBAwAAD1P33IwZM0aGYdT7fF3fPjxmzBgVFhYGsCoAANCStag9NwAAAL+GcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACwlJMLNypUrlZiYqIiICI0cOVJ79+6tt21OTo5sNpvXEREREcRqAQBAKDM93LzyyiuaPXu2Hn30UR04cECDBg1SamqqTp8+Xe81DodDZWVlnqOkpCSIFQMAgFBmerhZunSpZsyYoWnTpqlv375avXq12rVrp7Vr19Z7jc1mU2xsrOeIiYkJYsUAACCUmRpuzp8/r/3792vcuHGec61atdK4ceNUUFBQ73VVVVXq3r27EhISNGnSJB06dKjeti6XS06n0+sAAADWZWq4+eabb1RbW3vRyktMTIzKy8vrvKZ3795au3attmzZopdeeklut1ujRo3SyZMn62yfnZ2tqKgoz5GQkOD3cQAAgNBh+sdSTZWcnKyMjAwNHjxYKSkp2rhxozp37qw1a9bU2T4rK0uVlZWe48SJE0GuGAAABFOYmS/eqVMntW7dWhUVFV7nKyoqFBsb26g+2rRpoyFDhujo0aN1Pm+322W325tdKwAAaBlMXbkJDw/XsGHDlJ+f7znndruVn5+v5OTkRvVRW1urgwcPKi4uLlBlAgCAFsTUlRtJmj17tqZOnaqrr75aI0aM0LJly1RdXa1p06ZJkjIyMtS1a1dlZ2dLkh577DFdc8016tmzp77//nstXrxYJSUluueee8wcBgAACBGmh5vJkyfrzJkzeuSRR1ReXq7Bgwfr7bff9mwyLi0tVatW/1xg+u677zRjxgyVl5fr8ssv17Bhw7R792717dvXrCEAAIAQYjMMwzC7iGByOp2KiopSZWWlHA6H3/tPnLfV730CAPzj+KI0s0tospb4vhKIeW7K+3eLu1sKAACgIYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKSERblauXKnExERFRERo5MiR2rt3b4PtN2zYoKuuukoREREaMGCA3nzzzSBVCgAAQp3p4eaVV17R7Nmz9eijj+rAgQMaNGiQUlNTdfr06Trb7969W1OmTNH06dNVWFio9PR0paenq7i4OMiVAwCAUGR6uFm6dKlmzJihadOmqW/fvlq9erXatWuntWvX1tl++fLlGj9+vObOnas+ffpo4cKFGjp0qFasWBHkygEAQCgKM/PFz58/r/379ysrK8tzrlWrVho3bpwKCgrqvKagoECzZ8/2OpeamqrNmzfX2d7lcsnlcnkeV1ZWSpKcTmczq6+b2/WPgPQLAGi+QP3bH0gt8X0lEPN8oU/DMH61ranh5ptvvlFtba1iYmK8zsfExOiLL76o85ry8vI625eXl9fZPjs7WwsWLLjofEJCgo9VAwBaqqhlZldwaQjkPJ89e1ZRUVENtjE13ARDVlaW10qP2+3Wt99+qyuuuEI2m61ZfTudTiUkJOjEiRNyOBzNLdUymJf6MTd1Y17qx9zUjXmpn1XnxjAMnT17Vl26dPnVtqaGm06dOql169aqqKjwOl9RUaHY2Ng6r4mNjW1Se7vdLrvd7nWuQ4cOvhddB4fDYak/IH9hXurH3NSNeakfc1M35qV+VpybX1uxucDUDcXh4eEaNmyY8vPzPefcbrfy8/OVnJxc5zXJycle7SUpLy+v3vYAAODSYvrHUrNnz9bUqVN19dVXa8SIEVq2bJmqq6s1bdo0SVJGRoa6du2q7OxsSVJmZqZSUlK0ZMkSpaWlKTc3V/v27dOzzz5r5jAAAECIMD3cTJ48WWfOnNEjjzyi8vJyDR48WG+//bZn03BpaalatfrnAtOoUaO0fv16Pfzww3rooYeUlJSkzZs3q3///kGv3W6369FHH73oY69LHfNSP+ambsxL/ZibujEv9WNuJJvRmHuqAAAAWgjTv8QPAADAnwg3AADAUgg3AADAUgg3AADAUgg3P7Ny5UolJiYqIiJCI0eO1N69extsv2HDBl111VWKiIjQgAED9Oabb3o9bxiGHnnkEcXFxalt27YaN26cjhw5EsghBIw/56ampkZ//etfNWDAALVv315dunRRRkaGTp06Fehh+J2//2Z+7r777pPNZtOyZcv8XHVwBGJuPv/8c918882KiopS+/bt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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%time\n", - "r3 = method3(choices)\n", - "r3.plot.hist()\n", - "r3" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 139, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGhCAYAAABCse9yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8bElEQVR4nO3de1yUdd7/8fdwHBBFAuVQ5JCHkA3PykKuWnGL5m2ZpWnlgVJbS9M1TU3TWlNpI29t7catzTLvDrb7U6s1MY+1mYfApDRNM0k2OaSuEB7Qhe/vDx9OTqLJAHIBr+fjcT2cme81n+szMzLznu91zYzNGGMEAABgYR413QAAAMCvIbAAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADL86rpBqpCWVmZDh8+rIYNG8pms9V0OwAA4AoYY/TTTz8pIiJCHh6Xn0OpE4Hl8OHDioyMrOk2AACAG3JycnTddddddp06EVgaNmwo6dwNbtSoUQ13AwAArkRRUZEiIyOdr+OXUycCy/ndQI0aNSKwAABQy1zJ4RwcdAsAACyPwAIAACyPwAIAACyvThzDcqVKS0t19uzZmm4DFeDt7S1PT8+abgMAUMPqRWAxxigvL0/Hjx+v6VbghsaNGyssLIzv2AGAeqxeBJbzYaVp06by9/fnha+WMMbo5MmTKigokCSFh4fXcEcAgJpS5wNLaWmpM6wEBwfXdDuoID8/P0lSQUGBmjZtyu4hAKin6vxBt+ePWfH396/hTuCu848dxx8BQP1V5wPLeewGqr147AAA9SawAACA2ovAAm3atEk2m61aPkVls9m0cuXKKq8LAKhf6vxBt5fjmLLqqm4vO6XPVd1eeXr06KF27dpp/vz5NbL9Y8eOaezYsfrggw/k4eGhu+++WwsWLFBAQECN9AMAqB2YYcFVdf/992v37t1au3at/vGPf+iTTz7RqFGjarotAIDFEVgsrEePHho7dqzGjx+voKAghYaG6pVXXtGJEyeUnJyshg0bqkWLFlq9erXzOrt27VLv3r0VEBCg0NBQDRkyREeOHJEkDR8+XB9//LEWLFggm80mm82m7Oxs53UzMzPVqVMn+fv7KyEhQd98841LP2lpaWrevLl8fHx04403aunSpS7j+/fvV7du3WS32xUTE6O1a9e6jO/Zs0fp6en661//qri4OHXt2lV//vOf9c477+jw4cNVfO8BAOoSAovFLVmyRCEhIdq+fbvGjh2r0aNHa8CAAUpISNCOHTvUs2dPDRkyRCdPntTx48d16623qn379srIyFB6erry8/M1cOBASdKCBQsUHx+vkSNHKjc3V7m5uYqMjHRua9q0aXrhhReUkZEhLy8vPfjgg86xFStWaNy4cXr88ce1a9cuPfzww0pOTtbGjRslSWVlZerfv798fHy0bds2LVq0SJMnT3a5LVu2bFHjxo3VqVMn52WJiYny8PDQtm3bqvNuBADUcvX6GJbaoG3btpo+fbokaerUqUpJSVFISIhGjhwpSZoxY4bS0tL05Zdfat26dWrfvr3mzJnjvP7ixYsVGRmpffv2qVWrVvLx8ZG/v7/CwsIu2tbs2bPVvXt3SdKUKVPUp08fnT59Wna7XampqRo+fLgeeeQRSdKECRO0detWpaam6pZbbtG6deu0d+9erVmzRhEREZKkOXPmqHfv3s76eXl5atq0qcs2vby8dM011ygvL68K7zUAwNVw4bGg1X2cJjMsFtemTRvnaU9PTwUHBys2NtZ5WWhoqKRz3wSblZWljRs3KiAgwLlER0dLkg4cOFChbZ3/GvzzX4u/Z88e3XzzzS7r33zzzdqzZ49zPDIy0hlWJCk+Pr5CtxUAgEthhsXivL29Xc7bbDaXy85/qVpZWZmKi4vVt29fPffccxfVuZLf4blU3aoSFhbmDEDn/ec//9GxY8fKnfEBAOA8ZljqkA4dOmj37t1yOBxq0aKFy9KgQQNJko+Pj0pLSytcu3Xr1tq8ebPLZZs3b1ZMTIxzPCcnR7m5uc7xrVu3uqwfHx+v48ePKzMz03nZhg0bVFZWpri4uAr3BACoPwgsdcijjz6qY8eOafDgwfr888914MABrVmzRsnJyc6Q4nA4tG3bNmVnZ+vIkSNXPIMyadIkvf7660pLS9P+/fs1b948LV++XBMnTpR07uDZVq1aadiwYcrKytI///lPTZs2zaVG69at1atXL40cOVLbt2/X5s2bNWbMGA0aNMhlVxIAAL9Ur3cJWeGL3KpSRESENm/erMmTJ6tnz54qKSlRs2bN1KtXL3l4nMumEydO1LBhwxQTE6NTp07p4MGDV1S7X79+WrBggVJTUzVu3DhFRUXptddeU48ePSRJHh4eWrFihR566CF16dJFDodDL774onr16uVS580339SYMWN02223Ob847sUXX6zS+wEAUPfYjDGmppuorKKiIgUGBqqwsFCNGjVyGTt9+rQOHjyoqKgo2e32GuoQlcFjCADWVNlPCV3u9fuX2CUEAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACbdq0STabTcePH6/y2jabTStXrqzyugCA+oXAUs/06NFD48ePr7Htz549WwkJCfL391fjxo1rrA8AQO1Sr39LSE8HXuXtFV7d7VnQmTNnNGDAAMXHx+vVV1+t6XYAALUEMywW1qNHD40dO1bjx49XUFCQQkND9corr+jEiRNKTk5Ww4YN1aJFC61evdp5nV27dql3794KCAhQaGiohgwZoiNHjkiShg8fro8//lgLFiyQzWaTzWZTdna287qZmZnq1KmT/P39lZCQoG+++caln7S0NDVv3lw+Pj668cYbtXTpUpfx/fv3q1u3brLb7YqJidHatWsvuk3PPPOM/vCHPyg2NrYK7ykAQF1HYLG4JUuWKCQkRNu3b9fYsWM1evRoDRgwQAkJCdqxY4d69uypIUOG6OTJkzp+/LhuvfVWtW/fXhkZGUpPT1d+fr4GDhwoSVqwYIHi4+M1cuRI5ebmKjc3V5GRkc5tTZs2TS+88IIyMjLk5eWlBx980Dm2YsUKjRs3To8//rh27dqlhx9+WMnJydq4caMkqaysTP3795ePj4+2bdumRYsWafLkyVf3zgIA1Fn1e5dQLdC2bVtNnz5dkjR16lSlpKQoJCREI0eOlCTNmDFDaWlp+vLLL7Vu3Tq1b99ec+bMcV5/8eLFioyM1L59+9SqVSv5+PjI399fYWFhF21r9uzZ6t69uyRpypQp6tOnj06fPi273a7U1FQNHz5cjzzyiCRpwoQJ2rp1q1JTU3XLLbdo3bp12rt3r9asWaOIiAhJ0pw5c9S7d+9qvX8AAPUDMywW16ZNG+dpT09PBQcHu+xOCQ0NlSQVFBQoKytLGzduVEBAgHOJjo6WJB04cKBC2woPD3fWlaQ9e/bo5ptvdln/5ptv1p49e5zjkZGRzrAiSfHx8RW6rQAAXAozLBbn7e3tct5ms7lcZrPZJJ3bJVNcXKy+ffvqueeeu6jO+QBypdu6sC4AADWNGZY6pEOHDtq9e7ccDodatGjhsjRo0ECS5OPjo9LS0grXbt26tTZv3uxy2ebNmxUTE+Mcz8nJUW5urnN869atlbg1AAD8jMBShzz66KM6duyYBg8erM8//1wHDhzQmjVrlJyc7AwpDodD27ZtU3Z2to4cOXLFMyiTJk3S66+/rrS0NO3fv1/z5s3T8uXLNXHiRElSYmKiWrVqpWHDhikrK0v//Oc/NW3atIvqHDp0SDt37tShQ4dUWlqqnTt3aufOnSouLq66OwIAUOcQWOqQiIgIbd68WaWlperZs6diY2M1fvx4NW7cWB4e5x7qiRMnytPTUzExMWrSpIkOHTp0RbX79eunBQsWKDU1Vb/5zW/0l7/8Ra+99pp69OghSfLw8NCKFSt06tQpdenSRSNGjNDs2bMvqjNjxgy1b99eM2fOVHFxsdq3b+/8VBMAAJdiM8aYmm6isoqKihQYGKjCwkI1atTIZez06dM6ePCgoqKiZLfba6hDVAaPIQBYk2PKKufp7JQ+Fb7+5V6/f4kZFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFmjTpk2y2Ww6fvx4lde22WxauXJlldcFANQvbgWWl156SQ6HQ3a7XXFxcdq+ffsl133llVf0u9/9TkFBQQoKClJiYuJF6xtjNGPGDIWHh8vPz0+JiYnav3+/O63hV/To0UPjx4+vse3fcccduv7662W32xUeHq4hQ4bo8OHDNdYPAKB28KroFZYtW6YJEyZo0aJFiouL0/z585WUlKRvvvlGTZs2vWj9TZs2afDgwUpISJDdbtdzzz2nnj17avfu3br22mslSX/605/04osvasmSJYqKitJTTz2lpKQkff3119X62zGxS2KrrXZ5vhr21VXdnhXdcsstevLJJxUeHq4ffvhBEydO1D333KPPPvusplsDAFhYhWdY5s2bp5EjRyo5OVkxMTFatGiR/P39tXjx4nLXf/PNN/XII4+oXbt2io6O1l//+leVlZVp/fr1ks7NrsyfP1/Tp0/XnXfeqTZt2uiNN97Q4cOH6/2uhB49emjs2LEaP368goKCFBoaqldeeUUnTpxQcnKyGjZsqBYtWmj16tXO6+zatUu9e/dWQECAQkNDNWTIEB05ckSSNHz4cH388cdasGCBbDabbDabsrOzndfNzMxUp06d5O/vr4SEBH3zzTcu/aSlpal58+by8fHRjTfeqKVLl7qM79+/X926dZPdbldMTIzWrl170W36wx/+oN/+9rdq1qyZEhISNGXKFG3dulVnz56twnsOAFDXVCiwnDlzRpmZmUpMTPy5gIeHEhMTtWXLliuqcfLkSZ09e1bXXHONJOngwYPKy8tzqRkYGKi4uLhL1iwpKVFRUZHLUlctWbJEISEh2r59u8aOHavRo0drwIABSkhI0I4dO9SzZ08NGTJEJ0+e1PHjx3Xrrbeqffv2ysjIUHp6uvLz8zVw4EBJ0oIFCxQfH6+RI0cqNzdXubm5ioyMdG5r2rRpeuGFF5SRkSEvLy89+OCDzrEVK1Zo3Lhxevzxx7Vr1y49/PDDSk5O1saNGyVJZWVl6t+/v3x8fLRt2zYtWrRIkydPvuxtO3bsmN58800lJCTI29u7Gu49AEBdUaHAcuTIEZWWlio0NNTl8tDQUOXl5V1RjcmTJysiIsIZUM5fryI1586dq8DAQOdy4YtuXdO2bVtNnz5dLVu21NSpU2W32xUSEqKRI0eqZcuWmjFjho4ePaovv/xSCxcuVPv27TVnzhxFR0erffv2Wrx4sTZu3Kh9+/YpMDBQPj4+8vf3V1hYmMLCwuTp6enc1uzZs9W9e3fFxMRoypQp+uyzz3T69GlJUmpqqoYPH65HHnlErVq10oQJE9S/f3+lpqZKktatW6e9e/fqjTfeUNu2bdWtWzfNmTOn3Ns0efJkNWjQQMHBwTp06JDee++96r8jAQC12lX9lFBKSoreeecdrVixolLHpkydOlWFhYXOJScnpwq7tJY2bdo4T3t6eio4OFixsT8fe3M+6BUUFCgrK0sbN25UQECAc4mOjpYkHThwoELbCg8Pd9aVpD179ujmm292Wf/mm2/Wnj17nOORkZGKiIhwjsfHx5e7nUmTJumLL77QRx99JE9PTw0dOlTGmF/tDwBQf1XooNuQkBB5enoqPz/f5fL8/HyFhYVd9rqpqalKSUnRunXrXF4Yz18vPz/f+SJ5/ny7du3KreXr6ytfX9+KtF5r/XJXic1mc7nMZrNJOrdLpri4WH379tVzzz13UZ0L79sr2daFdataSEiIQkJC1KpVK7Vu3VqRkZHaunXrJQMOAAAVmmHx8fFRx44dnQfMSnIeQHu5F5s//elPmjVrltLT09WpUyeXsaioKIWFhbnULCoq0rZt23gBq6AOHTpo9+7dcjgcatGihcvSoEEDSecew9LS0grXbt26tTZv3uxy2ebNmxUTE+Mcz8nJUW5urnN869atv1r3fCAqKSmpcE8AgPqjwruEJkyYoFdeeUVLlizRnj17NHr0aOenViRp6NChmjp1qnP95557Tk899ZQWL14sh8OhvLw85eXlqbi4WNK5d/Ljx4/Xs88+q/fff19fffWVhg4dqoiICPXr169qbmU98eijj+rYsWMaPHiwPv/8cx04cEBr1qxRcnKyM6Q4HA5t27ZN2dnZOnLkyBXPoEyaNEmvv/660tLStH//fs2bN0/Lly/XxIkTJUmJiYlq1aqVhg0bpqysLP3zn//UtGnTXGps27ZNCxcu1M6dO/X9999rw4YNGjx4sJo3b044BQBcVoUDy7333qvU1FTNmDFD7dq1086dO5Wenu48luLQoUMu77LT0tJ05swZ3XPPPQoPD3cu5w/WlKQnnnhCY8eO1ahRo9S5c2cVFxcrPT29Wr+DpS6KiIjQ5s2bVVpaqp49eyo2Nlbjx49X48aN5eFx7qGeOHGiPD09FRMToyZNmujQoUNXVLtfv35asGCBUlNT9Zvf/EZ/+ctf9Nprr6lHjx6Szn1abMWKFTp16pS6dOmiESNGaPbs2S41/P39tXz5ct1222268cYb9dBDD6lNmzb6+OOP680uPgCAe2ymDhztWFRUpMDAQBUWFqpRo0YuY6dPn9bBgwcVFRVFAKqleAwBwJocU1Y5T2en9Knw9S/3+v1L/JYQAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAKLhfXo0UPjx4+/5LjD4dD8+fOrdJvVURMAgMryqukGcGnLly+Xt7d3TbcBAECNq9eBZU9066u6vdZ791Ro/WuuuaaaOgEAoHZhl5CFXbhLqKCgQH379pWfn5+ioqL05ptvXrT+8ePHNWLECDVp0kSNGjXSrbfeqqysLOf4gQMHdOeddyo0NFQBAQHq3Lmz1q1bd7VuDgAAbiOw1BLDhw9XTk6ONm7cqL///e/63//9XxUUFLisM2DAABUUFGj16tXKzMxUhw4ddNttt+nYsWOSpOLiYt1+++1av369vvjiC/Xq1Ut9+/bVoUOHauImAQBwxer1LqHaYt++fVq9erW2b9+uzp07S5JeffVVtW798y6tTz/9VNu3b1dBQYF8fX0lSampqVq5cqX+/ve/a9SoUWrbtq3atm3rvM6sWbO0YsUKvf/++xozZszVvVEAAFQAgaUW2LNnj7y8vNSxY0fnZdHR0WrcuLHzfFZWloqLixUcHOxy3VOnTunAgQOSzs2wPP3001q1apVyc3P1n//8R6dOnWKGBQBgeQSWOqK4uFjh4eHatGnTRWPng83EiRO1du1apaamqkWLFvLz89M999yjM2fOXN1mAQCoIAJLLRAdHa3//Oc/yszMdO4S+uabb3T8+HHnOh06dFBeXp68vLzkcDjKrbN582YNHz5cd911l6RzISc7O7uauwcAoPI46LYWuPHGG9WrVy89/PDD2rZtmzIzMzVixAj5+fk510lMTFR8fLz69eunjz76SNnZ2frss880bdo0ZWRkSJJatmyp5cuXa+fOncrKytJ9992nsrKymrpZAABcMQJLLfHaa68pIiJC3bt3V//+/TVq1Cg1bdrUOW6z2fThhx+qW7duSk5OVqtWrTRo0CB9//33Cg0NlSTNmzdPQUFBSkhIUN++fZWUlKQOHTrU1E0CAOCK2YwxpqabqKyioiIFBgaqsLBQjRo1chk7ffq0Dh48qKioKNnt9hrqEJXBYwgA1uSYssp5OjulT4Wvf7nX719ihgUAAFgegQUAAFgegQUAAFgegQUAAFgegQUAAFhevQksdeDDUPUWjx0AoM4HFm9vb0nSyZMna7gTuOv8Y3f+sQQA1D91/qv5PT091bhxYxUUFEiS/P39ZbPZargrXAljjE6ePKmCggI1btxYnp6eNd0SAKCG1PnAIklhYWGS5AwtqF0aN27sfAwBAPVTvQgsNptN4eHhatq0qc6ePVvT7aACvL29mVkBANSPwHKep6cnL34AANRCdf6gWwAAUPsRWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAA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KipKTz31lCIiIpyhCAAA1G8VDiz33nuvfvzxR82YMUN5eXlq166d0tPTnQfNHjp0SB4eP3/4KCEhQW+99ZamT5+uJ598Ui1bttTKlSt10003Odd54okndOLECY0aNUrHjx9X165dlZ6eLrvdXgU3EQAA1HZufTX/mDFjLrkLaNOmTRddNmDAAA0YMOCS9Ww2m/74xz/qj3/8ozvtVJivr69mzpx50W4l6tN7Xa1P73Wzfm3uvbrr03vdq28z5ko+SwQAAFBz3PotIQAAgKuJwAIAACyPwAIAACyPwIKrikOmAADucOtTQrXNkSNHtHjxYm3ZssX5+0RhYWFKSEjQ8OHD1aRJkxrusP7w9fVVVlaWWrduXdOtoBJyc3OVlpamTz/9VLm5ufLw8NANN9ygfv36afjw4fL09KzpFgHUMXX+U0Kff/65kpKS5O/vr8TEROf3xeTn52v9+vU6efKk1qxZo06dOlXL9nNycjRz5kwtXrzY7RqnTp1SZmamrrnmGsXExLiMnT59Wu+++66GDh3qVu09e/Zo69atio+PV3R0tPbu3asFCxaopKREDzzwgG699Va36l740wkXWrBggR544AEFBwdLkubNm+dW/V86ceKE3n33XX377bcKDw/X4MGDndtwx44dOxQUFKSoqChJ0tKlS7Vo0SIdOnRIzZo105gxYzRo0CC3648dO1YDBw7U7373O7drXM7ChQu1fft23X777Ro0aJCWLl2quXPnqqysTP3799cf//hHeXm5934lIyNDiYmJatGihfz8/LRlyxbdd999OnPmjNasWaOYmBilp6erYcOGVXyrAFjV9u3bL5oUiI+PV5cuXapuI7/6a0O1XFxcnBk1apQpKyu7aKysrMyMGjXK/Pa3v6227e/cudN4eHi4ff1vvvnGNGvWzNhsNuPh4WG6devm8kOReXl5btdfvXq18fHxMddcc42x2+1m9erVpkmTJiYxMdHceuutxtPT06xfv96t2jabzbRr18706NHDZbHZbKZz586mR48e5pZbbnGrtjHGtG7d2hw9etQYY8yhQ4eMw+EwgYGBpnPnzuaaa64xTZs2Nd99953b9du0aWPWrl1rjDHmlVdeMX5+fuaxxx4zaWlpZvz48SYgIMC8+uqrbtc//3i2bNnSpKSkmNzcXLdr/dKsWbNMw4YNzd13323CwsJMSkqKCQ4ONs8++6yZM2eOadKkiZkxY4bb9W+++Wbz9NNPO88vXbrUxMXFGWOMOXbsmGnXrp157LHHKnUbSkpKzLJly8z48ePNoEGDzKBBg8z48ePNu+++a0pKSipV+9fk5eWZZ555plI1cnJyzE8//XTR5WfOnDEff/xxpWofOXLEbNiwwfn//8cffzQpKSnmmWeeMV9//XWlal9KVFSU2bdvX5XWLCsrMxs2bDAvv/yy+eCDD8yZM2cqVS8nJ8f8+OOPzvOffPKJue+++0zXrl3N/ffff9GP9lZEamqqyc7OrlR/v+aDDz4wTz31lPn000+NMcasX7/e9O7d2yQlJZm//OUvla5/8uRJ8+qrr5rk5GTTq1cvc/vtt5sxY8aYdevWVapufn6+6dq1q7HZbKZZs2amS5cupkuXLs7Xra5du5r8/PxK92+MMXU+sNjtdrNnz55Lju/Zs8fY7Xa367/33nuXXf7nf/6nUoGlX79+pk+fPubHH380+/fvN3369DFRUVHm+++/N8ZULrDEx8ebadOmGWOMefvtt01QUJB58sknneNTpkwx//Vf/+VW7blz55qoqKiLAo+Xl5fZvXu3WzUvZLPZnH8E999/v0lISDDHjx83xhjz008/mcTERDN48GC36/v5+TmfoNq3b29efvlll/E333zTxMTEuF3fZrOZdevWmXHjxpmQkBDj7e1t7rjjDvPBBx+Y0tJSt+saY0zz5s3N//t//88Ycy4we3p6mv/7v/9zji9fvty0aNHC7fp+fn7mwIEDzvOlpaXG29vb5OXlGWOM+eijj0xERITb9ffv329uuOEGY7fbTffu3c3AgQPNwIEDTffu3Y3dbjctWrQw+/fvd7v+r6nMm4zDhw+bzp07Gw8PD+Pp6WmGDBniElwq8/dqjDHbtm0zgYGBxmazmaCgIJORkWGioqJMy5YtTfPmzY2fn5/JzMx0u/6CBQvKXTw9Pc3UqVOd593Ru3dv59/o0aNHTVxcnLHZbKZJkybGw8PDREdHm4KCArd779Kli/nggw+MMcasXLnSeHh4mDvuuMNMnjzZ3HXXXcbb29s5XlE2m814enqaxMRE884771R5aF60aJHx8vIyHTt2NI0aNTJLly41DRs2NCNGjDAPP/yw8fPzM/Pnz3e7/v79+02zZs1M06ZNTWRkpLHZbKZPnz4mLi7OeHp6mgEDBpizZ8+6Vfvuu+828fHxZu/evReN7d271yQkJJh77rnH7d4vVOcDi8PhMEuWLLnk+JIlS0yzZs3crn/+nbLNZrvkUpknqKZNm5ovv/zSeb6srMz8/ve/N9dff705cOBApZ4AGzVq5HziLy0tNV5eXmbHjh3O8a+++sqEhoa63fv27dtNq1atzOOPP+5891QdgeWGG24wH330kcv45s2bTWRkpNv1g4ODTUZGhjHm3GOwc+dOl/Fvv/3W+Pn5uV3/wv7PnDljli1bZpKSkoynp6eJiIgwTz75pNsvyn5+fs5Aa4wx3t7eZteuXc7z2dnZxt/f3+3emzVr5nwXaMy5F2mbzWZOnjxpjDHm4MGDlXoTkJiYaO68805TWFh40VhhYaG58847Tc+ePd2un5WVddll2bJlbv9NDR061MTFxZnPP//crF271nTs2NF06tTJHDt2zBhzLrDYbDa3e09MTDQjRowwRUVF5vnnnzfXXXedGTFihHM8OTnZ9OvXz+36NpvNXHfddcbhcLgsNpvNXHvttcbhcJioqCi3a5//Pz969GgTExPjnAXNyckxHTt2NL///e/d7r1BgwbOenFxcSYlJcVl/M9//rNp3769272/9tpr5s477zTe3t4mODjYjBs3znz11Vdu93uhmJgY55uiDRs2GLvdbl566SXn+GuvvWZat27tdv3evXubhx9+2LmnISUlxfTu3dsYY8y+ffuMw+EwM2fOdKt2QECAy+vGL2VkZJiAgAC3av9SnQ8sCxcuNL6+vuaxxx4z7733ntm6davZunWree+998xjjz1m/Pz8XP5jVFRERIRZuXLlJce/+OKLSgWWhg0bljvN++ijj5rrrrvOfPLJJ5UKLN9++63zfEBAgMs75+zs7Eq98BhzbrZj6NChpk2bNuarr74y3t7eVRZYzr8bi4iIuOiJo7K9P/DAA+ahhx4yxhgzYMAAM336dJfxOXPmmNjYWLfrX/jkfaHvv//ezJw50zRr1sztxzUqKsqsXr3aGHPuycjDw8O8++67zvFVq1YZh8PhXuPGmHHjxpmbbrrJrF692mzYsMHccsstpkePHs7x9PR007x5c7fr+/n5XfaF4Msvv6x0WLzUm4zzl7t730dERJht27Y5z58+fdr07dvXtGvXzhw9erTSMyxBQUHO54MzZ84YDw8Pl+1lZmaaa6+91u36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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGhCAYAAABCse9yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABTNklEQVR4nO3deVxU9f4/8NfMsIMggrIYMigKUigqQqCp5SSY10TN7XpFyV0xubgvgWYKGZGaXilvLnkrrXvVShMXFEtDUNxyXwlUFpevIKig8Pn94Y+jI6DMgHLA1/PxOA9nzuec9/mcgzPzmnM+M6MQQggQERERyZiypjtARERE9CwMLERERCR7DCxEREQkewwsREREJHsMLERERCR7DCxEREQkewwsREREJHsMLERERCR7BjXdgepQUlKCq1evol69elAoFDXdHSIiIqoEIQRu374NR0dHKJVPP4dSJwLL1atX4eTkVNPdICIiIj1kZGTglVdeeeoydSKw1KtXD8DDHba0tKzh3hAREVFl5OXlwcnJSXodf5o6EVhKLwNZWloysBAREdUylRnOwUG3REREJHsMLERERCR7DCxEREQke3ViDEtlFRcX4/79+zXdDaKXmqGhIVQqVU13g4hqmZcisAghkJWVhVu3btV0V4gIQP369WFvb8/vTSKiSnspAktpWGnUqBHMzMz4JElUQ4QQuHPnDnJycgAADg4ONdwjIqot6nxgKS4ulsKKjY1NTXeH6KVnamoKAMjJyUGjRo14eYiIKqXOD7otHbNiZmZWwz0holKlj0eOKSOiyqrzgaUULwMRyQcfj0Skq5cmsBAREVHtxcBCAIDExEQoFIrn8kkqhUKBTZs2VXtdOXryOK5evRr169ev0T4REdUFdX7Q7dOop295odtLi+7xQrdXkS5dusDLywuLFi2qke3fvHkTEyZMwC+//AKlUom+ffti8eLFsLCwqJH+PE8DBgzAO++8U9PdICKq9XiGhV64wYMH48SJE9ixYwc2b96M3377DaNGjarpbj0XpqamaNSoUU13g4io1mNgkbEuXbpgwoQJCAsLg7W1Nezs7LBixQoUFBQgJCQE9erVg6urK7Zu3aq13vHjx9G9e3dYWFjAzs4OQ4YMwfXr1wEAw4YNw549e7B48WIoFAooFAqkpaVJ66ampsLb2xtmZmbw9/fHmTNntGov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cL3c3FxYWFjAyMgIPXr0wBdffIG3334bAKT1dKkZFRUFKysraXJyctJlN4iIiKiWeSHfdFuvXj0cOXIEBw4cwPz58xEeHl7ux28ra8aMGcjNzZWmjIyM6ussERERyY5OH2u2tbWFSqVCdna21vzs7GzY29tXuJ5SqYSrqysAwMvLC6dOnUJUVBS6dOkirZednQ0HBwetml5eXuXWMzY2lr7NlYiIiOo+nc6wGBkZoV27dkhISJDmlZSUICEhAX5+fpWuU1JSgsLCQgCAi4sL7O3ttWrm5eUhOTlZp5pERERUd+n8xXHh4eEYOnQovL294ePjg0WLFqGgoAAhISEAgODgYDRu3BhRUVEAHo438fb2RrNmzVBYWIhff/0Va9euxfLlywE8/DhuWFgYPv74YzRv3hwuLi748MMP4ejoiKCgoGrbUR0/DEVEzxEfj0SkK50Dy4ABA3Dt2jVEREQgKysLXl5eiI+PlwbNpqenQ6l8dOKmoKAA48aNw+XLl2Fqagp3d3f85z//wYABA6Rlpk6dioKCAowaNQq3bt1Cx44dER8fXy0fdzQ0NAQA3LlzR+uL1oio5ty5cwfAo8cnEdGz6Pw9LHL0rM9xZ2Zm4tatW2jUqBHMzMygUChqoJdEJITAnTt3kJOTg/r162uNW6Oaxe9hoZqgy/ewvBS/JVQ6sLeib+Mloherfv36Tx2oT0T0pJcisCgUCjg4OKBRo0a4f/9+TXeH6KVmaGgIlUpV090golrmpQgspVQqFZ8oiYiIaqEX8sVxRERERFXBwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyp1dgWbZsGdRqNUxMTODr64uUlJQKl12xYgXeeOMNWFtbw9raGhqNpszyw4YNg0Kh0JoCAwP16RoRERHVQToHlvXr1yM8PByRkZE4dOgQWrdujYCAAOTk5JS7fGJiIgYNGoTdu3cjKSkJTk5O6NatG65cuaK1XGBgIDIzM6Xp+++/12+PiIiIqM7RObDExsZi5MiRCAkJgYeHB+Li4mBmZoaVK1eWu/y3336LcePGwcvLC+7u7vj3v/+NkpISJCQkaC1nbGwMe3t7abK2ttZvj4iIiKjO0SmwFBUVITU1FRqN5lEBpRIajQZJSUmVqnHnzh3cv38fDRo00JqfmJiIRo0awc3NDWPHjsWNGzd06RoRERHVYQa6LHz9+nUUFxfDzs5Oa76dnR1Onz5dqRrTpk2Do6OjVugJDAxEnz594OLiggsXLmDmzJno3r07kpKSoFKpytQoLCxEYWGhdD8vL0+X3SAiIqJaRqfAUlXR0dFYt24dEhMTYWJiIs0fOHCgdNvT0xOtWrVCs2bNkJiYiK5du5apExUVhblz576QPhMREVHN0+mSkK2tLVQqFbKzs7XmZ2dnw97e/qnrxsTEIDo6Gtu3b0erVq2eumzTpk1ha2uL8+fPl9s+Y8YM5ObmSlNGRoYuu0FERES1jE6BxcjICO3atdMaMFs6gNbPz6/C9RYuXIh58+YhPj4e3t7ez9zO5cuXcePGDTg4OJTbbmxsDEtLS62JiIiI6i6dPyUUHh6OFStWYM2aNTh16hTGjh2LgoIChISEAACCg4MxY8YMaflPPvkEH374IVauXAm1Wo2srCxkZWUhPz8fAJCfn48pU6Zg//79SEtLQ0JCAnr16gVXV1cEBARU024SERFRbabzGJYBAwbg2rVriIiIQFZWFry8vBAfHy8NxE1PT4dS+SgHLV++HEVFRXjvvfe06kRGRmLOnDlQqVQ4duwY1qxZg1u3bsHR0RHdunXDvHnzYGxsXMXdIyIiorpAIYQQNd2JqsrLy4OVlRVyc3N5eYiISA/q6Vuk22nRPWqwJ/Qy0eX1m78lRERERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESyx8BCREREssfAQkRERLLHwEJERESy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vvtOfPfdd2LXrl3ljkOrijr/PSxEVHtdunRJ63sdSr8XR64ePHiAO3fuwNLSssL2K1euwNnZ+bls/86dO1CpVDA2Nq62mqmpqdi7dy+Cg4NhbW1dbXWfVFBQAJVKBRMTkyrXEkIgJycHJSUlsLW1haGhYTX08MW7d+8e7t+/X23faXTu3DkUFhbC3d1d7+9hqkn8an4iki0XFxf4+fnBz89PCisZGRl4//33n9s2q1LfwMCgwrACPPyG4Llz5+rbtWe6ceMGxo4dW60127Vrh4kTJ8La2vq5HvubN29i3Lhx1VJLoVDAzs4ODg4OUlh5nn1/XrVNTExQr169aqvfvHlzvPbaa2XCSlXr3717F3v37sXJkyfLtN27dw/ffPON3rUfxzMsRFSrHD16FG3btkVxcXGtq1+b+/6867PvtbP+2bNn0a1bN6Snp0OhUKBjx474/vvv4ejoCODht8o7OjpWS99r3zkhIqrTfv7556e2X7x4Ubb1a3Pfn3d99r1u1p82bRpee+01HDx4ELdu3UJYWBg6duyIxMRENGnSRO+65eEZFiKSFaVSCYVC8dRf9lYoFHq/Y3ue9Wtz3593ffa9bta3s7PDzp074enpCeDh+KFx48bh119/xe7du2Fubl5tZ1g4hoWIZMXBwQEbNmxASUlJudOhQ4dkW7829/1512ff62b9u3fvao2JUSgUWL58OXr27InOnTvj7NmzVer74xhYiEhW2rVrh9TU1Arbn/VOsSbr1+a+P+/67HvdrO/u7o6DBw+Wmb906VL06tUL7777rl51y8MxLEQkK1OmTEFBQUGF7a6urti9e7cs69fmvj/v+ux73azfu3dvfP/99xgyZEiZtqVLl6KkpARxcXF61X4Sx7AQERGR7PGSEBEREckeAwsRERHJHgMLERERyR4DCxEREckeAwsRERHJHgMLERERyR4DCxEREckeAwsRERHJ3v8DUJyrbu6YcLwAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -810,14 +555,17 @@ ], "source": [ "df = pd.concat([r0, r1, r3, ideal_dist], axis=1)\n", - "df.columns = ['method0', 'method1', 'method3', 'ideal']\n", + "df.columns = ['method0: sampling', 'method1: hindsight', 'method3: generation tree', 'ideal']\n", + "\n", + "\n", "df = df.sort_index().fillna(0)\n", - "df.plot.bar()" + "df.plot.bar()\n", + "df" ] }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 115, "metadata": {}, "outputs": [ { @@ -830,13 +578,13 @@ { "data": { "text/plain": [ - "method0 0.769524\n", - "method1 0.618316\n", - "method3 0.592971\n", + "method0: sampling 1.143571\n", + "method1: hindsight 0.844554\n", + "method3: generation tree 0.494957\n", "dtype: float64" ] }, - "execution_count": 143, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } @@ -850,42 +598,106 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
KL_div_loss and time for each method (lower is better)
 KL_div_losstime
method  
method0: sampling-0.14724521.593707
method1: hindsight-0.1458740.631365
method3: generation tree-0.1472460.066084
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = []\n", + "times = dict(zip(df.columns, [t0, t1, t3]))\n", + "for k in df.columns[:3]:\n", + " input = torch.tensor(df[k].values)\n", + " target = torch.tensor(df['ideal'].values)\n", + " # https://pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html#torch.nn.KLDivLoss\n", + " s = F.kl_div(input, target , reduction='batchmean', log_target=False).item()\n", + " t = times[k].total_seconds()\n", + " data.append({'method': k, 'KL_div_loss': s, 'time': t})\n", + "dfr = pd.DataFrame(data).set_index('method')\n", + "# color values with cmap\n", + "dfs = dfr.style.background_gradient(cmap='YlOrRd')\n", + "dfs.set_caption('KL_div_loss and time for each method (lower is better)')\n", + "dfs" + ] + }, + { + "cell_type": "code", + "execution_count": 131, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "MSE coverage (smaller is better)\n" + "| method | KL_div_loss | time |\n", + "|:-------------------------|--------------:|----------:|\n", + "| method0: sampling | -0.147245 | 21.5937 |\n", + "| method1: hindsight | -0.145874 | 0.631365 |\n", + "| method3: generation tree | -0.147246 | 0.066084 |\n" ] - }, - { - "data": { - "text/plain": [ - "method0 1.056788\n", - "method1 0.662643\n", - "method3 0.720881\n", - "dtype: float64" - ] - }, - "execution_count": 144, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "print('MSE coverage (smaller is better)')\n", - "ratios.pow(2).mean().pow(0.5)" + "print(dfr.to_markdown())" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -895,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ diff --git a/pyproject.toml b/pyproject.toml index 0c1e899..89a000e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,9 +9,9 @@ readme = "README.md" python = "^3.9,<4.0" termcolor = "^2.3.0" jaxtyping = "^0.2.28" -pandas = "^2.2.2" [tool.poetry.group.dev.dependencies] +pandas = "^2.2.2" ipykernel = "^6.22.0" torch = "^2.0.0" accelerate = "^0.18.0"