amkkk's picture
download
raw
131 kB
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "7IB-SoLfeyXr",
"outputId": "e4c1e473-0e92-45e4-9ac2-b690f788b183"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: cupy-cuda12x in /usr/local/lib/python3.12/dist-packages (13.6.0)\n",
"Requirement already satisfied: numpy<2.6,>=1.22 in /usr/local/lib/python3.12/dist-packages (from cupy-cuda12x) (2.0.2)\n",
"Requirement already satisfied: fastrlock>=0.5 in /usr/local/lib/python3.12/dist-packages (from cupy-cuda12x) (0.8.3)\n"
]
}
],
"source": [
"pip install cupy-cuda12x\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "UzqfvU7b7Lyw",
"outputId": "2f165ecb-bd07-471a-d0ad-c9c2a1a692d4"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\r0% [Working]\r \rGet:1 https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/ InRelease [3,632 B]\n",
"\r0% [Connecting to archive.ubuntu.com] [Connecting to security.ubuntu.com (91.18\r0% [Connecting to archive.ubuntu.com] [Connecting to security.ubuntu.com (91.18\r \rGet:2 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64 InRelease [1,581 B]\n",
"Get:3 https://cli.github.com/packages stable InRelease [3,917 B]\n",
"Get:4 https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/ Packages [85.0 kB]\n",
"Get:5 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64 Packages [2,361 kB]\n",
"Get:6 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]\n",
"Hit:7 http://archive.ubuntu.com/ubuntu jammy InRelease\n",
"Get:8 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]\n",
"Get:9 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy InRelease [18.1 kB]\n",
"Get:10 https://r2u.stat.illinois.edu/ubuntu jammy InRelease [6,555 B]\n",
"Hit:11 https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu jammy InRelease\n",
"Get:12 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [127 kB]\n",
"Hit:13 https://ppa.launchpadcontent.net/ubuntugis/ppa/ubuntu jammy InRelease\n",
"Get:14 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy/main amd64 Packages [39.2 kB]\n",
"Get:15 https://r2u.stat.illinois.edu/ubuntu jammy/main amd64 Packages [2,904 kB]\n",
"Get:16 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [1,300 kB]\n",
"Get:17 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,613 kB]\n",
"Get:18 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [4,059 kB]\n",
"Get:19 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [3,728 kB]\n",
"Get:20 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [6,721 kB]\n",
"Get:21 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [6,511 kB]\n",
"Get:22 https://r2u.stat.illinois.edu/ubuntu jammy/main all Packages [9,748 kB]\n",
"Fetched 39.5 MB in 8s (4,834 kB/s)\n",
"Reading package lists... Done\n",
"W: Skipping acquire of configured file 'main/source/Sources' as repository 'https://r2u.stat.illinois.edu/ubuntu jammy InRelease' does not seem to provide it (sources.list entry misspelt?)\n",
"Reading package lists... Done\n",
"Building dependency tree... Done\n",
"Reading state information... Done\n",
"The following additional packages will be installed:\n",
" cm-super-minimal dvisvgm fonts-droid-fallback fonts-lato fonts-lmodern\n",
" fonts-noto-mono fonts-texgyre fonts-urw-base35 ghostscript\n",
" libapache-pom-java libcommons-logging-java libcommons-parent-java\n",
" libfontbox-java libgs9 libgs9-common libidn12 libijs-0.35 libjbig2dec0\n",
" libkpathsea6 libpdfbox-java libptexenc1 libruby3.0 libsynctex2 libteckit0\n",
" libtexlua53 libtexluajit2 libwoff1 libzzip-0-13 lmodern pfb2t1c2pfb\n",
" poppler-data preview-latex-style rake ruby ruby-net-telnet ruby-rubygems\n",
" ruby-webrick ruby-xmlrpc ruby3.0 rubygems-integration t1utils tex-common\n",
" tex-gyre texlive-base texlive-binaries texlive-latex-base\n",
" texlive-latex-recommended texlive-pictures texlive-plain-generic tipa\n",
" xfonts-encodings xfonts-utils\n",
"Suggested packages:\n",
" fonts-noto fonts-freefont-otf | fonts-freefont-ttf ghostscript-x\n",
" libavalon-framework-java libcommons-logging-java-doc\n",
" libexcalibur-logkit-java liblog4j1.2-java poppler-utils\n",
" fonts-japanese-mincho | fonts-ipafont-mincho fonts-japanese-gothic\n",
" | fonts-ipafont-gothic fonts-arphic-ukai fonts-arphic-uming fonts-nanum ri\n",
" ruby-dev bundler debhelper perl-tk xpdf | pdf-viewer xzdec\n",
" texlive-fonts-recommended-doc texlive-latex-base-doc python3-pygments\n",
" icc-profiles libfile-which-perl libspreadsheet-parseexcel-perl\n",
" texlive-latex-extra-doc texlive-latex-recommended-doc texlive-luatex\n",
" texlive-pstricks dot2tex prerex texlive-pictures-doc vprerex\n",
" default-jre-headless tipa-doc\n",
"The following NEW packages will be installed:\n",
" cm-super cm-super-minimal dvipng dvisvgm fonts-droid-fallback fonts-lato\n",
" fonts-lmodern fonts-noto-mono fonts-texgyre fonts-urw-base35 ghostscript\n",
" libapache-pom-java libcommons-logging-java libcommons-parent-java\n",
" libfontbox-java libgs9 libgs9-common libidn12 libijs-0.35 libjbig2dec0\n",
" libkpathsea6 libpdfbox-java libptexenc1 libruby3.0 libsynctex2 libteckit0\n",
" libtexlua53 libtexluajit2 libwoff1 libzzip-0-13 lmodern pfb2t1c2pfb\n",
" poppler-data preview-latex-style rake ruby ruby-net-telnet ruby-rubygems\n",
" ruby-webrick ruby-xmlrpc ruby3.0 rubygems-integration t1utils tex-common\n",
" tex-gyre texlive texlive-base texlive-binaries texlive-fonts-recommended\n",
" texlive-latex-base texlive-latex-extra texlive-latex-recommended\n",
" texlive-pictures texlive-plain-generic tipa xfonts-encodings xfonts-utils\n",
"0 upgraded, 57 newly installed, 0 to remove and 60 not upgraded.\n",
"Need to get 195 MB of archives.\n",
"After this operation, 613 MB of additional disk space will be used.\n",
"Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 fonts-droid-fallback all 1:6.0.1r16-1.1build1 [1,805 kB]\n",
"Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 fonts-lato all 2.0-2.1 [2,696 kB]\n",
"Get:3 http://archive.ubuntu.com/ubuntu jammy/main amd64 poppler-data all 0.4.11-1 [2,171 kB]\n",
"Get:4 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tex-common all 6.17 [33.7 kB]\n",
"Get:5 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libkpathsea6 amd64 2021.20210626.59705-1ubuntu0.3 [60.6 kB]\n",
"Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libptexenc1 amd64 2021.20210626.59705-1ubuntu0.3 [39.1 kB]\n",
"Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libsynctex2 amd64 2021.20210626.59705-1ubuntu0.3 [55.8 kB]\n",
"Get:8 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libtexlua53 amd64 2021.20210626.59705-1ubuntu0.3 [120 kB]\n",
"Get:9 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libtexluajit2 amd64 2021.20210626.59705-1ubuntu0.3 [267 kB]\n",
"Get:10 http://archive.ubuntu.com/ubuntu jammy/main amd64 t1utils amd64 1.41-4build2 [61.3 kB]\n",
"Get:11 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libteckit0 amd64 2.5.11+ds1-1 [421 kB]\n",
"Get:12 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libzzip-0-13 amd64 0.13.72+dfsg.1-1.1 [27.0 kB]\n",
"Get:13 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 texlive-binaries amd64 2021.20210626.59705-1ubuntu0.3 [9,861 kB]\n",
"Get:14 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-base all 2021.20220204-1 [21.0 MB]\n",
"Get:15 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-lmodern all 2.004.5-6.1 [4,532 kB]\n",
"Get:16 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-latex-base all 2021.20220204-1 [1,128 kB]\n",
"Get:17 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-latex-recommended all 2021.20220204-1 [14.4 MB]\n",
"Get:18 http://archive.ubuntu.com/ubuntu jammy/universe amd64 cm-super-minimal all 0.3.4-17 [5,777 kB]\n",
"Get:19 http://archive.ubuntu.com/ubuntu jammy/universe amd64 pfb2t1c2pfb amd64 0.3-11 [9,342 B]\n",
"Get:20 http://archive.ubuntu.com/ubuntu jammy/universe amd64 cm-super all 0.3.4-17 [20.2 MB]\n",
"Get:21 http://archive.ubuntu.com/ubuntu jammy/main amd64 fonts-urw-base35 all 20200910-1 [6,367 kB]\n",
"Get:22 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgs9-common all 9.55.0~dfsg1-0ubuntu5.13 [753 kB]\n",
"Get:23 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libidn12 amd64 1.38-4ubuntu1 [60.0 kB]\n",
"Get:24 http://archive.ubuntu.com/ubuntu jammy/main amd64 libijs-0.35 amd64 0.35-15build2 [16.5 kB]\n",
"Get:25 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjbig2dec0 amd64 0.19-3build2 [64.7 kB]\n",
"Get:26 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgs9 amd64 9.55.0~dfsg1-0ubuntu5.13 [5,032 kB]\n",
"Get:27 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 ghostscript amd64 9.55.0~dfsg1-0ubuntu5.13 [49.4 kB]\n",
"Get:28 http://archive.ubuntu.com/ubuntu jammy/universe amd64 dvipng amd64 1.15-1.1 [78.9 kB]\n",
"Get:29 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwoff1 amd64 1.0.2-1build4 [45.2 kB]\n",
"Get:30 http://archive.ubuntu.com/ubuntu jammy/universe amd64 dvisvgm amd64 2.13.1-1 [1,221 kB]\n",
"Get:31 http://archive.ubuntu.com/ubuntu jammy/main amd64 fonts-noto-mono all 20201225-1build1 [397 kB]\n",
"Get:32 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-texgyre all 20180621-3.1 [10.2 MB]\n",
"Get:33 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libapache-pom-java all 18-1 [4,720 B]\n",
"Get:34 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libcommons-parent-java all 43-1 [10.8 kB]\n",
"Get:35 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libcommons-logging-java all 1.2-2 [60.3 kB]\n",
"Get:36 http://archive.ubuntu.com/ubuntu jammy/main amd64 rubygems-integration all 1.18 [5,336 B]\n",
"Get:37 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 ruby3.0 amd64 3.0.2-7ubuntu2.11 [50.1 kB]\n",
"Get:38 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 ruby-rubygems all 3.3.5-2ubuntu1.2 [228 kB]\n",
"Get:39 http://archive.ubuntu.com/ubuntu jammy/main amd64 ruby amd64 1:3.0~exp1 [5,100 B]\n",
"Get:40 http://archive.ubuntu.com/ubuntu jammy/main amd64 rake all 13.0.6-2 [61.7 kB]\n",
"Get:41 http://archive.ubuntu.com/ubuntu jammy/main amd64 ruby-net-telnet all 0.1.1-2 [12.6 kB]\n",
"Get:42 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 ruby-webrick all 1.7.0-3ubuntu0.2 [52.5 kB]\n",
"Get:43 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 ruby-xmlrpc all 0.3.2-1ubuntu0.1 [24.9 kB]\n",
"Get:44 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libruby3.0 amd64 3.0.2-7ubuntu2.11 [5,114 kB]\n",
"Get:45 http://archive.ubuntu.com/ubuntu jammy/main amd64 xfonts-encodings all 1:1.0.5-0ubuntu2 [578 kB]\n",
"Get:46 http://archive.ubuntu.com/ubuntu jammy/main amd64 xfonts-utils amd64 1:7.7+6build2 [94.6 kB]\n",
"Get:47 http://archive.ubuntu.com/ubuntu jammy/universe amd64 lmodern all 2.004.5-6.1 [9,471 kB]\n",
"Get:48 http://archive.ubuntu.com/ubuntu jammy/universe amd64 preview-latex-style all 12.2-1ubuntu1 [185 kB]\n",
"Get:49 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tex-gyre all 20180621-3.1 [6,209 kB]\n",
"Get:50 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-fonts-recommended all 2021.20220204-1 [4,972 kB]\n",
"Get:51 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive all 2021.20220204-1 [14.3 kB]\n",
"Get:52 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libfontbox-java all 1:1.8.16-2 [207 kB]\n",
"Get:53 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libpdfbox-java all 1:1.8.16-2 [5,199 kB]\n",
"Get:54 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-pictures all 2021.20220204-1 [8,720 kB]\n",
"Get:55 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-latex-extra all 2021.20220204-1 [13.9 MB]\n",
"Get:56 http://archive.ubuntu.com/ubuntu jammy/universe amd64 texlive-plain-generic all 2021.20220204-1 [27.5 MB]\n",
"Get:57 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tipa all 2:1.3-21 [2,967 kB]\n",
"Fetched 195 MB in 10s (19.6 MB/s)\n",
"Extracting templates from packages: 100%\n",
"Preconfiguring packages ...\n",
"Selecting previously unselected package fonts-droid-fallback.\n",
"(Reading database ... 121852 files and directories currently installed.)\n",
"Preparing to unpack .../00-fonts-droid-fallback_1%3a6.0.1r16-1.1build1_all.deb ...\n",
"Unpacking fonts-droid-fallback (1:6.0.1r16-1.1build1) ...\n",
"Selecting previously unselected package fonts-lato.\n",
"Preparing to unpack .../01-fonts-lato_2.0-2.1_all.deb ...\n",
"Unpacking fonts-lato (2.0-2.1) ...\n",
"Selecting previously unselected package poppler-data.\n",
"Preparing to unpack .../02-poppler-data_0.4.11-1_all.deb ...\n",
"Unpacking poppler-data (0.4.11-1) ...\n",
"Selecting previously unselected package tex-common.\n",
"Preparing to unpack .../03-tex-common_6.17_all.deb ...\n",
"Unpacking tex-common (6.17) ...\n",
"Selecting previously unselected package libkpathsea6:amd64.\n",
"Preparing to unpack .../04-libkpathsea6_2021.20210626.59705-1ubuntu0.3_amd64.deb ...\n",
"Unpacking libkpathsea6:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Selecting previously unselected package libptexenc1:amd64.\n",
"Preparing to unpack .../05-libptexenc1_2021.20210626.59705-1ubuntu0.3_amd64.deb ...\n",
"Unpacking libptexenc1:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Selecting previously unselected package libsynctex2:amd64.\n",
"Preparing to unpack .../06-libsynctex2_2021.20210626.59705-1ubuntu0.3_amd64.deb ...\n",
"Unpacking libsynctex2:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Selecting previously unselected package libtexlua53:amd64.\n",
"Preparing to unpack .../07-libtexlua53_2021.20210626.59705-1ubuntu0.3_amd64.deb ...\n",
"Unpacking libtexlua53:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Selecting previously unselected package libtexluajit2:amd64.\n",
"Preparing to unpack .../08-libtexluajit2_2021.20210626.59705-1ubuntu0.3_amd64.deb ...\n",
"Unpacking libtexluajit2:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Selecting previously unselected package t1utils.\n",
"Preparing to unpack .../09-t1utils_1.41-4build2_amd64.deb ...\n",
"Unpacking t1utils (1.41-4build2) ...\n",
"Selecting previously unselected package libteckit0:amd64.\n",
"Preparing to unpack .../10-libteckit0_2.5.11+ds1-1_amd64.deb ...\n",
"Unpacking libteckit0:amd64 (2.5.11+ds1-1) ...\n",
"Selecting previously unselected package libzzip-0-13:amd64.\n",
"Preparing to unpack .../11-libzzip-0-13_0.13.72+dfsg.1-1.1_amd64.deb ...\n",
"Unpacking libzzip-0-13:amd64 (0.13.72+dfsg.1-1.1) ...\n",
"Selecting previously unselected package texlive-binaries.\n",
"Preparing to unpack .../12-texlive-binaries_2021.20210626.59705-1ubuntu0.3_amd64.deb ...\n",
"Unpacking texlive-binaries (2021.20210626.59705-1ubuntu0.3) ...\n",
"Selecting previously unselected package texlive-base.\n",
"Preparing to unpack .../13-texlive-base_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-base (2021.20220204-1) ...\n",
"Selecting previously unselected package fonts-lmodern.\n",
"Preparing to unpack .../14-fonts-lmodern_2.004.5-6.1_all.deb ...\n",
"Unpacking fonts-lmodern (2.004.5-6.1) ...\n",
"Selecting previously unselected package texlive-latex-base.\n",
"Preparing to unpack .../15-texlive-latex-base_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-latex-base (2021.20220204-1) ...\n",
"Selecting previously unselected package texlive-latex-recommended.\n",
"Preparing to unpack .../16-texlive-latex-recommended_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-latex-recommended (2021.20220204-1) ...\n",
"Selecting previously unselected package cm-super-minimal.\n",
"Preparing to unpack .../17-cm-super-minimal_0.3.4-17_all.deb ...\n",
"Unpacking cm-super-minimal (0.3.4-17) ...\n",
"Selecting previously unselected package pfb2t1c2pfb.\n",
"Preparing to unpack .../18-pfb2t1c2pfb_0.3-11_amd64.deb ...\n",
"Unpacking pfb2t1c2pfb (0.3-11) ...\n",
"Selecting previously unselected package cm-super.\n",
"Preparing to unpack .../19-cm-super_0.3.4-17_all.deb ...\n",
"Unpacking cm-super (0.3.4-17) ...\n",
"Selecting previously unselected package fonts-urw-base35.\n",
"Preparing to unpack .../20-fonts-urw-base35_20200910-1_all.deb ...\n",
"Unpacking fonts-urw-base35 (20200910-1) ...\n",
"Selecting previously unselected package libgs9-common.\n",
"Preparing to unpack .../21-libgs9-common_9.55.0~dfsg1-0ubuntu5.13_all.deb ...\n",
"Unpacking libgs9-common (9.55.0~dfsg1-0ubuntu5.13) ...\n",
"Selecting previously unselected package libidn12:amd64.\n",
"Preparing to unpack .../22-libidn12_1.38-4ubuntu1_amd64.deb ...\n",
"Unpacking libidn12:amd64 (1.38-4ubuntu1) ...\n",
"Selecting previously unselected package libijs-0.35:amd64.\n",
"Preparing to unpack .../23-libijs-0.35_0.35-15build2_amd64.deb ...\n",
"Unpacking libijs-0.35:amd64 (0.35-15build2) ...\n",
"Selecting previously unselected package libjbig2dec0:amd64.\n",
"Preparing to unpack .../24-libjbig2dec0_0.19-3build2_amd64.deb ...\n",
"Unpacking libjbig2dec0:amd64 (0.19-3build2) ...\n",
"Selecting previously unselected package libgs9:amd64.\n",
"Preparing to unpack .../25-libgs9_9.55.0~dfsg1-0ubuntu5.13_amd64.deb ...\n",
"Unpacking libgs9:amd64 (9.55.0~dfsg1-0ubuntu5.13) ...\n",
"Selecting previously unselected package ghostscript.\n",
"Preparing to unpack .../26-ghostscript_9.55.0~dfsg1-0ubuntu5.13_amd64.deb ...\n",
"Unpacking ghostscript (9.55.0~dfsg1-0ubuntu5.13) ...\n",
"Selecting previously unselected package dvipng.\n",
"Preparing to unpack .../27-dvipng_1.15-1.1_amd64.deb ...\n",
"Unpacking dvipng (1.15-1.1) ...\n",
"Selecting previously unselected package libwoff1:amd64.\n",
"Preparing to unpack .../28-libwoff1_1.0.2-1build4_amd64.deb ...\n",
"Unpacking libwoff1:amd64 (1.0.2-1build4) ...\n",
"Selecting previously unselected package dvisvgm.\n",
"Preparing to unpack .../29-dvisvgm_2.13.1-1_amd64.deb ...\n",
"Unpacking dvisvgm (2.13.1-1) ...\n",
"Selecting previously unselected package fonts-noto-mono.\n",
"Preparing to unpack .../30-fonts-noto-mono_20201225-1build1_all.deb ...\n",
"Unpacking fonts-noto-mono (20201225-1build1) ...\n",
"Selecting previously unselected package fonts-texgyre.\n",
"Preparing to unpack .../31-fonts-texgyre_20180621-3.1_all.deb ...\n",
"Unpacking fonts-texgyre (20180621-3.1) ...\n",
"Selecting previously unselected package libapache-pom-java.\n",
"Preparing to unpack .../32-libapache-pom-java_18-1_all.deb ...\n",
"Unpacking libapache-pom-java (18-1) ...\n",
"Selecting previously unselected package libcommons-parent-java.\n",
"Preparing to unpack .../33-libcommons-parent-java_43-1_all.deb ...\n",
"Unpacking libcommons-parent-java (43-1) ...\n",
"Selecting previously unselected package libcommons-logging-java.\n",
"Preparing to unpack .../34-libcommons-logging-java_1.2-2_all.deb ...\n",
"Unpacking libcommons-logging-java (1.2-2) ...\n",
"Selecting previously unselected package rubygems-integration.\n",
"Preparing to unpack .../35-rubygems-integration_1.18_all.deb ...\n",
"Unpacking rubygems-integration (1.18) ...\n",
"Selecting previously unselected package ruby3.0.\n",
"Preparing to unpack .../36-ruby3.0_3.0.2-7ubuntu2.11_amd64.deb ...\n",
"Unpacking ruby3.0 (3.0.2-7ubuntu2.11) ...\n",
"Selecting previously unselected package ruby-rubygems.\n",
"Preparing to unpack .../37-ruby-rubygems_3.3.5-2ubuntu1.2_all.deb ...\n",
"Unpacking ruby-rubygems (3.3.5-2ubuntu1.2) ...\n",
"Selecting previously unselected package ruby.\n",
"Preparing to unpack .../38-ruby_1%3a3.0~exp1_amd64.deb ...\n",
"Unpacking ruby (1:3.0~exp1) ...\n",
"Selecting previously unselected package rake.\n",
"Preparing to unpack .../39-rake_13.0.6-2_all.deb ...\n",
"Unpacking rake (13.0.6-2) ...\n",
"Selecting previously unselected package ruby-net-telnet.\n",
"Preparing to unpack .../40-ruby-net-telnet_0.1.1-2_all.deb ...\n",
"Unpacking ruby-net-telnet (0.1.1-2) ...\n",
"Selecting previously unselected package ruby-webrick.\n",
"Preparing to unpack .../41-ruby-webrick_1.7.0-3ubuntu0.2_all.deb ...\n",
"Unpacking ruby-webrick (1.7.0-3ubuntu0.2) ...\n",
"Selecting previously unselected package ruby-xmlrpc.\n",
"Preparing to unpack .../42-ruby-xmlrpc_0.3.2-1ubuntu0.1_all.deb ...\n",
"Unpacking ruby-xmlrpc (0.3.2-1ubuntu0.1) ...\n",
"Selecting previously unselected package libruby3.0:amd64.\n",
"Preparing to unpack .../43-libruby3.0_3.0.2-7ubuntu2.11_amd64.deb ...\n",
"Unpacking libruby3.0:amd64 (3.0.2-7ubuntu2.11) ...\n",
"Selecting previously unselected package xfonts-encodings.\n",
"Preparing to unpack .../44-xfonts-encodings_1%3a1.0.5-0ubuntu2_all.deb ...\n",
"Unpacking xfonts-encodings (1:1.0.5-0ubuntu2) ...\n",
"Selecting previously unselected package xfonts-utils.\n",
"Preparing to unpack .../45-xfonts-utils_1%3a7.7+6build2_amd64.deb ...\n",
"Unpacking xfonts-utils (1:7.7+6build2) ...\n",
"Selecting previously unselected package lmodern.\n",
"Preparing to unpack .../46-lmodern_2.004.5-6.1_all.deb ...\n",
"Unpacking lmodern (2.004.5-6.1) ...\n",
"Selecting previously unselected package preview-latex-style.\n",
"Preparing to unpack .../47-preview-latex-style_12.2-1ubuntu1_all.deb ...\n",
"Unpacking preview-latex-style (12.2-1ubuntu1) ...\n",
"Selecting previously unselected package tex-gyre.\n",
"Preparing to unpack .../48-tex-gyre_20180621-3.1_all.deb ...\n",
"Unpacking tex-gyre (20180621-3.1) ...\n",
"Selecting previously unselected package texlive-fonts-recommended.\n",
"Preparing to unpack .../49-texlive-fonts-recommended_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-fonts-recommended (2021.20220204-1) ...\n",
"Selecting previously unselected package texlive.\n",
"Preparing to unpack .../50-texlive_2021.20220204-1_all.deb ...\n",
"Unpacking texlive (2021.20220204-1) ...\n",
"Selecting previously unselected package libfontbox-java.\n",
"Preparing to unpack .../51-libfontbox-java_1%3a1.8.16-2_all.deb ...\n",
"Unpacking libfontbox-java (1:1.8.16-2) ...\n",
"Selecting previously unselected package libpdfbox-java.\n",
"Preparing to unpack .../52-libpdfbox-java_1%3a1.8.16-2_all.deb ...\n",
"Unpacking libpdfbox-java (1:1.8.16-2) ...\n",
"Selecting previously unselected package texlive-pictures.\n",
"Preparing to unpack .../53-texlive-pictures_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-pictures (2021.20220204-1) ...\n",
"Selecting previously unselected package texlive-latex-extra.\n",
"Preparing to unpack .../54-texlive-latex-extra_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-latex-extra (2021.20220204-1) ...\n",
"Selecting previously unselected package texlive-plain-generic.\n",
"Preparing to unpack .../55-texlive-plain-generic_2021.20220204-1_all.deb ...\n",
"Unpacking texlive-plain-generic (2021.20220204-1) ...\n",
"Selecting previously unselected package tipa.\n",
"Preparing to unpack .../56-tipa_2%3a1.3-21_all.deb ...\n",
"Unpacking tipa (2:1.3-21) ...\n",
"Setting up pfb2t1c2pfb (0.3-11) ...\n",
"Setting up fonts-lato (2.0-2.1) ...\n",
"Setting up fonts-noto-mono (20201225-1build1) ...\n",
"Setting up libwoff1:amd64 (1.0.2-1build4) ...\n",
"Setting up libtexlua53:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Setting up libijs-0.35:amd64 (0.35-15build2) ...\n",
"Setting up libtexluajit2:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Setting up libfontbox-java (1:1.8.16-2) ...\n",
"Setting up rubygems-integration (1.18) ...\n",
"Setting up libzzip-0-13:amd64 (0.13.72+dfsg.1-1.1) ...\n",
"Setting up fonts-urw-base35 (20200910-1) ...\n",
"Setting up poppler-data (0.4.11-1) ...\n",
"Setting up tex-common (6.17) ...\n",
"update-language: texlive-base not installed and configured, doing nothing!\n",
"Setting up libjbig2dec0:amd64 (0.19-3build2) ...\n",
"Setting up libteckit0:amd64 (2.5.11+ds1-1) ...\n",
"Setting up libapache-pom-java (18-1) ...\n",
"Setting up ruby-net-telnet (0.1.1-2) ...\n",
"Setting up xfonts-encodings (1:1.0.5-0ubuntu2) ...\n",
"Setting up t1utils (1.41-4build2) ...\n",
"Setting up libidn12:amd64 (1.38-4ubuntu1) ...\n",
"Setting up fonts-texgyre (20180621-3.1) ...\n",
"Setting up libkpathsea6:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Setting up ruby-webrick (1.7.0-3ubuntu0.2) ...\n",
"Setting up fonts-lmodern (2.004.5-6.1) ...\n",
"Setting up fonts-droid-fallback (1:6.0.1r16-1.1build1) ...\n",
"Setting up ruby-xmlrpc (0.3.2-1ubuntu0.1) ...\n",
"Setting up libsynctex2:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Setting up libgs9-common (9.55.0~dfsg1-0ubuntu5.13) ...\n",
"Setting up libpdfbox-java (1:1.8.16-2) ...\n",
"Setting up libgs9:amd64 (9.55.0~dfsg1-0ubuntu5.13) ...\n",
"Setting up preview-latex-style (12.2-1ubuntu1) ...\n",
"Setting up libcommons-parent-java (43-1) ...\n",
"Setting up dvisvgm (2.13.1-1) ...\n",
"Setting up libcommons-logging-java (1.2-2) ...\n",
"Setting up ghostscript (9.55.0~dfsg1-0ubuntu5.13) ...\n",
"Setting up xfonts-utils (1:7.7+6build2) ...\n",
"Setting up libptexenc1:amd64 (2021.20210626.59705-1ubuntu0.3) ...\n",
"Setting up texlive-binaries (2021.20210626.59705-1ubuntu0.3) ...\n",
"update-alternatives: using /usr/bin/xdvi-xaw to provide /usr/bin/xdvi.bin (xdvi.bin) in auto mode\n",
"update-alternatives: using /usr/bin/bibtex.original to provide /usr/bin/bibtex (bibtex) in auto mode\n",
"Setting up lmodern (2.004.5-6.1) ...\n",
"Setting up texlive-base (2021.20220204-1) ...\n",
"/usr/bin/ucfr\n",
"/usr/bin/ucfr\n",
"/usr/bin/ucfr\n",
"/usr/bin/ucfr\n",
"mktexlsr: Updating /var/lib/texmf/ls-R-TEXLIVEDIST... \n",
"mktexlsr: Updating /var/lib/texmf/ls-R-TEXMFMAIN... \n",
"mktexlsr: Updating /var/lib/texmf/ls-R... \n",
"mktexlsr: Done.\n",
"tl-paper: setting paper size for dvips to a4: /var/lib/texmf/dvips/config/config-paper.ps\n",
"tl-paper: setting paper size for dvipdfmx to a4: /var/lib/texmf/dvipdfmx/dvipdfmx-paper.cfg\n",
"tl-paper: setting paper size for xdvi to a4: /var/lib/texmf/xdvi/XDvi-paper\n",
"tl-paper: setting paper size for pdftex to a4: /var/lib/texmf/tex/generic/tex-ini-files/pdftexconfig.tex\n",
"Setting up tex-gyre (20180621-3.1) ...\n",
"Setting up dvipng (1.15-1.1) ...\n",
"Setting up texlive-plain-generic (2021.20220204-1) ...\n",
"Setting up texlive-latex-base (2021.20220204-1) ...\n",
"Setting up texlive-latex-recommended (2021.20220204-1) ...\n",
"Setting up texlive-pictures (2021.20220204-1) ...\n",
"Setting up texlive-fonts-recommended (2021.20220204-1) ...\n",
"Setting up tipa (2:1.3-21) ...\n",
"Setting up cm-super-minimal (0.3.4-17) ...\n",
"Setting up texlive (2021.20220204-1) ...\n",
"Setting up texlive-latex-extra (2021.20220204-1) ...\n",
"Setting up cm-super (0.3.4-17) ...\n",
"Creating fonts. This may take some time... done.\n",
"Setting up rake (13.0.6-2) ...\n",
"Setting up libruby3.0:amd64 (3.0.2-7ubuntu2.11) ...\n",
"Setting up ruby3.0 (3.0.2-7ubuntu2.11) ...\n",
"Setting up ruby (1:3.0~exp1) ...\n",
"Setting up ruby-rubygems (3.3.5-2ubuntu1.2) ...\n",
"Processing triggers for man-db (2.10.2-1) ...\n",
"Processing triggers for mailcap (3.70+nmu1ubuntu1) ...\n",
"Processing triggers for fontconfig (2.13.1-4.2ubuntu5) ...\n",
"Processing triggers for libc-bin (2.35-0ubuntu3.8) ...\n",
"/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libur_adapter_level_zero.so.0 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libumf.so.1 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libhwloc.so.15 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libur_loader.so.0 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libur_adapter_level_zero_v2.so.0 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtcm.so.1 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libur_adapter_opencl.so.0 is not a symbolic link\n",
"\n",
"/sbin/ldconfig.real: /usr/local/lib/libtcm_debug.so.1 is not a symbolic link\n",
"\n",
"Processing triggers for tex-common (6.17) ...\n",
"Running updmap-sys. This may take some time... done.\n",
"Running mktexlsr /var/lib/texmf ... done.\n",
"Building format(s) --all.\n",
"\tThis may take some time... done.\n",
"Latex path: /usr/bin/latex\n"
]
}
],
"source": [
"\n",
"!apt-get update\n",
"\n",
"\n",
"!apt-get install -y texlive texlive-latex-extra texlive-fonts-recommended dvipng cm-super\n",
"\n",
"import shutil\n",
"print(f\"Latex path: {shutil.which('latex')}\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cHovBX6D6J66",
"outputId": "fbc39c09-3993-440c-9e79-d2401827996e"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"/usr/bin/latex\n"
]
}
],
"source": [
"import shutil\n",
"print(shutil.which('latex'))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "E3MSlk9JlAO8"
},
"outputs": [],
"source": [
"from joblib import Parallel, delayed\n",
"import multiprocessing\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "OZ_i9H1RqwyQ"
},
"outputs": [],
"source": [
"n_jobs=4"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "9-z2oAzfsblE"
},
"outputs": [],
"source": [
"import cupy as cp\n",
"xp = cp\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "jQCNGTex3_-A"
},
"outputs": [],
"source": [
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"import pandas as pd\n",
"np.set_printoptions(precision=4, suppress=True)\n",
"plt.rcParams.update({\n",
" \"text.usetex\": True,\n",
" \"font.family\": \"serif\",\n",
" \"text.latex.preamble\": r\"\\usepackage{amsmath,amssymb}\",\n",
"\n",
" \"font.size\": 16,\n",
" \"axes.labelsize\": 20,\n",
" \"axes.titlesize\": 20,\n",
" \"xtick.labelsize\": 16,\n",
" \"ytick.labelsize\": 16,\n",
" \"legend.fontsize\": 16,\n",
"})"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ee1OBUWGfMMp",
"outputId": "fdeb8274-461c-4c97-e191-d7f9ced7ddee"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Base TPM P0:\n",
" [[0.5182 0.0409 0.1673 0.14 0.1336]\n",
" [0.2182 0.2481 0.0743 0.2203 0.2391]\n",
" [0.2022 0.0965 0.3248 0.0842 0.2922]\n",
" [0.2028 0.2985 0.0747 0.2572 0.1668]\n",
" [0.1393 0.0998 0.2995 0.3506 0.1109]]\n",
"\n",
"Feature f: [ 1. 1. 0. -1. -1.]\n"
]
}
],
"source": [
"m = 5 #state size\n",
"rng = np.random.default_rng(123)\n",
"P0 = rng.random((m, m)) #the TPM which is used to design all other TPMS\n",
"P0 = P0 / P0.sum(axis=1, keepdims=True)\n",
"assert np.allclose(P0.sum(axis=1), 1.0, atol=1e-8)\n",
"f = np.array([1.0, 1.0, 0.0, -1.0, -1.0])\n",
"print(\"Base TPM P0:\\n\", P0)\n",
"print(\"\\nFeature f:\", f)\n",
"init_dist = np.ones(m) / m"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "GOlesvLNfPpZ"
},
"outputs": [],
"source": [
"def build_P_theta(theta, P0, f):\n",
"\n",
" # move inputs to GPU\n",
" P0g = xp.asarray(P0)\n",
" fg = xp.asarray(f)\n",
"\n",
" # tilted matrix\n",
" tilde = P0g * xp.exp(theta * fg[xp.newaxis, :])\n",
"\n",
" # dominant eigenpair via SVD (GPU-safe)\n",
" U, S, Vh = xp.linalg.svd(tilde.T)\n",
"\n",
" rho = S[0]\n",
" v = xp.abs(U[:, 0])\n",
"\n",
" # construct normalized kernel\n",
" Ptheta = (tilde * v[xp.newaxis, :]) / (rho * v[:, xp.newaxis])\n",
" Ptheta = xp.maximum(Ptheta, 0)\n",
" Ptheta = Ptheta / Ptheta.sum(axis=1, keepdims=True)\n",
"\n",
" # return CPU arrays for Markov simulation\n",
" return cp.asnumpy(Ptheta), float(rho.get()), cp.asnumpy(v)\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Qfm-eP-ohkuB",
"outputId": "4429a77f-1283-4a23-a49a-8d5a16b08700"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0.8604 0.0356 0.0629 0.0219 0.0193]\n",
" [0.5368 0.3197 0.0414 0.051 0.0512]\n",
" [0.5621 0.1406 0.2046 0.022 0.0707]\n",
" [0.4889 0.3771 0.0408 0.0583 0.035 ]\n",
" [0.4612 0.1731 0.2246 0.1092 0.0319]]\n"
]
}
],
"source": [
"theta0 = 0.5\n",
"P_null, _, _ = build_P_theta(theta0, P0, f)\n",
"print(P_null)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "8dKz-dtfjrqx"
},
"outputs": [],
"source": [
"class MarkovGenerator:\n",
" def __init__(self, TPM, init_dist):\n",
" self.TPM = TPM\n",
" self.m = TPM.shape[0]\n",
" self.state = np.random.choice(self.m, p=init_dist)\n",
"\n",
" def current_state(self):\n",
" return self.state\n",
"\n",
" def step(self):\n",
" self.state = np.random.choice(self.m, p=self.TPM[self.state])\n",
" return self.state"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"id": "bUPHVTdLg-oW"
},
"outputs": [],
"source": [
"class SequentialTestFixedNull:\n",
"\n",
" def __init__(self, m, alpha, P_null):\n",
"\n",
" self.m = m\n",
" self.alpha = alpha\n",
" self.P_null = xp.asarray(P_null)\n",
" self.reset()\n",
"\n",
" def reset(self):\n",
" self.t = 0\n",
" self.Nx = xp.zeros(self.m)\n",
" self.Nxy = xp.zeros((self.m, self.m))\n",
"\n",
" def update_counts(self, u, v):\n",
" self.Nx[u] += 1\n",
" self.Nxy[u, v] += 1\n",
"\n",
" def empirical_Q(self):\n",
"\n",
" Qhat = xp.zeros((self.m, self.m))\n",
"\n",
" for x in range(self.m):\n",
" if self.Nx[x] > 0:\n",
" Qhat[x] = self.Nxy[x] / self.Nx[x]\n",
" else:\n",
" Qhat[x] = 1.0 / self.m\n",
"\n",
" return Qhat\n",
"\n",
"\n",
" def compute_psi(self):\n",
" return xp.sum(xp.log(np.e * (1 + self.Nx / (self.m - 1))))\n",
"\n",
" def compute_beta(self, psi):\n",
" return xp.log(1 / self.alpha) + (self.m - 1) * psi\n",
"\n",
" def compute_Lt(self, Qhat):\n",
"\n",
" eps = 1e-15\n",
"\n",
" kl_rows = xp.sum(\n",
" Qhat * xp.log((Qhat + eps) / (self.P_null + eps)),\n",
" axis=1,\n",
" )\n",
"\n",
" mask = self.Nx > 0\n",
" return xp.sum(self.Nx[mask] * kl_rows[mask])\n",
"\n",
" def step(self, u, v):\n",
"\n",
" self.t += 1\n",
"\n",
" self.update_counts(u, v)\n",
"\n",
" Qhat = self.empirical_Q()\n",
"\n",
" psi_t = self.compute_psi()\n",
" beta_t = self.compute_beta(psi_t)\n",
"\n",
" Lt = self.compute_Lt(Qhat)\n",
"\n",
" stop = Lt >= beta_t\n",
"\n",
" return stop, Lt, beta_t\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "BDOIcUNbhvE9"
},
"outputs": [],
"source": [
"\n",
"\n",
"class FieldsSequentialTestKT:\n",
"\n",
" def __init__(self, m, alpha, P_null):\n",
" self.m = m\n",
" self.alpha = alpha\n",
" self.P_null = xp.asarray(P_null)\n",
" self.reset()\n",
"\n",
" def reset(self):\n",
" self.Nxy = xp.zeros((self.m, self.m))\n",
" self.logM = 0.0\n",
"\n",
" def step(self, u, v):\n",
"\n",
" row_sum = self.Nxy[u].sum()\n",
"\n",
" qhat_uv = (self.Nxy[u, v] + 0.5) / (\n",
" row_sum + self.m * 0.5\n",
" )\n",
"\n",
" self.logM += xp.log(qhat_uv / self.P_null[u, v])\n",
"\n",
"\n",
" self.Nxy[u, v] += 1\n",
"\n",
" stop = self.logM >= xp.log(1 / self.alpha)\n",
"\n",
" return stop, self.logM\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"id": "NUdgcom6hx-C"
},
"outputs": [],
"source": [
"\n",
"class FieldsModifiedJeffreys:\n",
" def __init__(self, m, alpha, P_null, prior_alpha=0.25, b=0.3):\n",
" self.m = m\n",
" self.alpha = alpha\n",
" self.P_null = xp.asarray(P_null)\n",
" self.prior_alpha = prior_alpha\n",
" self.b = b\n",
" self.reset()\n",
"\n",
" def reset(self):\n",
" self.Nxy = xp.zeros((self.m, self.m))\n",
" self.logM = 0.0\n",
" self.t = 0\n",
" def _get_stationary_distribution(self, P):\n",
"\n",
" m = P.shape[0]\n",
"\n",
" A = xp.vstack([P.T - xp.eye(m), xp.ones(m)])\n",
" b = xp.zeros(m + 1)\n",
" b[-1] = 1.0\n",
"\n",
" pi, *_ = xp.linalg.lstsq(A, b, rcond=None)\n",
"\n",
" return xp.clip(pi, 1e-12, 1.0)\n",
"\n",
"\n",
" def _stationary_derivatives(self, P, pi):\n",
"\n",
" m = P.shape[0]\n",
"\n",
" Z = xp.linalg.inv(\n",
" xp.eye(m) - P.T + xp.outer(xp.ones(m), pi)\n",
" )\n",
"\n",
" D = xp.zeros((m, m, m))\n",
"\n",
" for u in range(m):\n",
" for y in range(m):\n",
" e = xp.zeros(m)\n",
" e[y] = pi[u]\n",
" D[u, y] = Z @ e\n",
"\n",
" return D\n",
"\n",
"\n",
" def _jeffreys_predictor(self, u, v):\n",
"\n",
" n_u = self.Nxy[u].sum()\n",
" n_uv = self.Nxy[u, v]\n",
" m = self.m\n",
" k = m - 1\n",
"\n",
" eta_bar = (n_uv + 0.5) / (n_u + m / 2.0)\n",
"\n",
" if n_u < m:\n",
" return eta_bar\n",
"\n",
" row_sums = self.Nxy.sum(axis=1, keepdims=True) + 1e-12\n",
" P_hat = self.Nxy / row_sums\n",
"\n",
" pi = self._get_stationary_distribution(P_hat)\n",
"\n",
" try:\n",
" Z = xp.linalg.inv(\n",
" xp.eye(m)\n",
" - P_hat.T\n",
" + xp.outer(xp.ones(m), pi)\n",
" )\n",
" except xp.linalg.LinAlgError:\n",
" return eta_bar\n",
" _, svals, _ = xp.linalg.svd(Z)\n",
" cond_Z = svals[0] / svals[-1]\n",
" if cond_Z > 1e8:\n",
" return eta_bar\n",
"\n",
" D = xp.zeros((m, m, m))\n",
" for uu in range(m):\n",
" for yy in range(m):\n",
" e = xp.zeros(m)\n",
" e[yy] = pi[uu]\n",
" D[uu, yy] = Z @ e\n",
"\n",
" correction = 0.0\n",
" denom = 2 * n_u + k + 1\n",
"\n",
" for y in range(m):\n",
" delta = 1.0 if y == v else 0.0\n",
" weight = P_hat[u, y] * (delta - P_hat[u, v])\n",
"\n",
" for t in range(m):\n",
" correction += (\n",
" k\n",
" * weight\n",
" * (D[u, y, t] / (pi[t] + 1e-12))\n",
" )\n",
"\n",
" q = eta_bar + correction / denom\n",
" return xp.clip(q, 1e-12, 1.0 - 1e-12)\n",
"\n",
"\n",
" def _alpha_predictor(self, u, v):\n",
"\n",
" n_u = self.Nxy[u].sum()\n",
" n_uv = self.Nxy[u, v]\n",
"\n",
" return (n_uv + self.prior_alpha) / (\n",
" n_u + self.m * self.prior_alpha\n",
" )\n",
"\n",
"\n",
" def step(self, u, v):\n",
"\n",
" self.t += 1\n",
"\n",
" qJ = self._jeffreys_predictor(u, v)\n",
" qA = self._alpha_predictor(u, v)\n",
"\n",
" mix_w = self.t ** (-self.b)\n",
"\n",
" qhat_uv = (1 - mix_w) * qJ + mix_w * qA\n",
"\n",
" qhat_uv = xp.clip(qhat_uv, 1e-12, 1.0 - 1e-12)\n",
"\n",
"\n",
" self.logM += xp.log(qhat_uv / self.P_null[u, v])\n",
"\n",
"\n",
" self.Nxy[u, v] += 1\n",
"\n",
" stop = self.logM >= xp.log(1.0 / self.alpha)\n",
"\n",
" return stop, self.logM\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"id": "SKFtTDuslOZ2"
},
"outputs": [],
"source": [
"def run_single_trial(theta_q, alpha, P0, f, init_dist, m, T_max):\n",
"\n",
" # build alt TPM\n",
" P_alt, _, _ = build_P_theta(theta_q, P0, f)\n",
"\n",
" gen = MarkovGenerator(P_alt, init_dist)\n",
"\n",
" our_test = SequentialTestFixedNull(m, alpha, P_null)\n",
" fields_test = FieldsSequentialTestKT(m, alpha, P_null)\n",
" mj_test = FieldsModifiedJeffreys(m, alpha, P_null)\n",
"\n",
" x_prev = gen.current_state()\n",
"\n",
" t_y = t_f = t_mj = T_max\n",
"\n",
" stop_y = stop_f = stop_mj = False\n",
"\n",
" for t in range(1, T_max + 1):\n",
"\n",
" x = gen.step()\n",
"\n",
" if not stop_y:\n",
" stop_y, _, _ = our_test.step(x_prev, x)\n",
" if stop_y:\n",
" t_y = t\n",
"\n",
" if not stop_f:\n",
" stop_f, _ = fields_test.step(x_prev, x)\n",
" if stop_f:\n",
" t_f = t\n",
"\n",
" if not stop_mj:\n",
" stop_mj, _ = mj_test.step(x_prev, x)\n",
" if stop_mj:\n",
" t_mj = t\n",
"\n",
" if stop_y and stop_f and stop_mj:\n",
" break\n",
"\n",
" x_prev = x\n",
"\n",
" return t_y, t_f, t_mj\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"id": "v4mO952RhFto",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 191
},
"outputId": "a3d1d883-39a8-43e7-fe99-ec982a347e63"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"=== STARTING alpha = 2.061153622438558e-09 ===\n",
"\n",
"=== STARTING alpha = 1.1253517471925912e-07 ===\n",
"\n",
"=== STARTING alpha = 6.14421235332821e-06 ===\n",
"\n",
"=== STARTING alpha = 0.00033546262790251185 ===\n",
"\n",
"=== STARTING alpha = 0.01831563888873418 ===\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<IPython.core.display.Javascript object>"
],
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<IPython.core.display.Javascript object>"
],
"application/javascript": [
"download(\"download_24d7a1c7-2bdd-4dcb-8fd3-4f6708b8c8ac\", \"alpha_sweep_three_tests_raw.csv\", 19313)"
]
},
"metadata": {}
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"from google.colab import files\n",
"\n",
"\n",
"\n",
"theta0 = 0.2\n",
"theta_q_fixed = -0.6\n",
"m = 5\n",
"num_trials = 100\n",
"T_max = 10**5\n",
"\n",
"alphas = np.exp(-np.array([20, 16, 12, 8, 4]))\n",
"\n",
"\n",
"P_null, _, _ = build_P_theta(theta0, P0, f)\n",
"P_alt, _, _ = build_P_theta(theta_q_fixed, P0, f)\n",
"\n",
"\n",
"\n",
"avg_tau_ours = []\n",
"avg_tau_fields = []\n",
"avg_tau_mj = []\n",
"\n",
"std_tau_ours = []\n",
"std_tau_fields = []\n",
"std_tau_mj = []\n",
"\n",
"rows = []\n",
"\n",
"\n",
"\n",
"for alpha in alphas:\n",
"\n",
" print(f\"\\n=== STARTING alpha = {alpha} ===\", flush=True)\n",
"\n",
" results = Parallel(\n",
" n_jobs=n_jobs,\n",
" backend=\"loky\",\n",
" )(\n",
" delayed(run_single_trial)(\n",
" theta_q_fixed,\n",
" alpha,\n",
" P0,\n",
" f,\n",
" init_dist,\n",
" m,\n",
" T_max,\n",
" )\n",
" for _ in range(num_trials)\n",
" )\n",
"\n",
" taus_y, taus_f, taus_mj = zip(*results)\n",
"\n",
" taus_y = list(taus_y)\n",
" taus_f = list(taus_f)\n",
" taus_mj = list(taus_mj)\n",
"\n",
" for trial, (ty, tf, tmj) in enumerate(results):\n",
" rows.append(\n",
" {\n",
" \"theta_q\": theta_q_fixed,\n",
" \"alpha\": alpha,\n",
" \"trial\": trial,\n",
" \"tau_ours\": ty,\n",
" \"tau_fields\": tf,\n",
" \"tau_modified_jeffreys\": tmj,\n",
" }\n",
" )\n",
"\n",
" avg_tau_ours.append(np.mean(taus_y))\n",
" avg_tau_fields.append(np.mean(taus_f))\n",
" avg_tau_mj.append(np.mean(taus_mj))\n",
"\n",
" std_tau_ours.append(np.std(taus_y))\n",
" std_tau_fields.append(np.std(taus_f))\n",
" std_tau_mj.append(np.std(taus_mj))\n",
"\n",
"\n",
"\n",
"\n",
"df = pd.DataFrame(rows)\n",
"df.to_csv(\"alpha_sweep_three_tests_raw.csv\", index=False)\n",
"files.download(\"alpha_sweep_three_tests_raw.csv\")\n",
"\n",
"\n",
"\n",
"log_inv_alpha = np.log(1 / np.array(alphas))\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"id": "Fof6cNVog4ss",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 577
},
"outputId": "b7a4e9af-0cb5-4b5f-d399-f6d84efa14b5"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA8AAAAIwCAYAAABJMwI2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAyFhJREFUeJzs3Xl4G/WBP/73yJZvy5Js5yJ2HDkHhHDZDhRKS0NkSLulB9jJtrSwYYlNoF0Wdombbo+l7Tax237bbpeCnZZjodtN7Hb3V9ou1DKFlrZAEgFtSIHEyn0Qx5Isxaesmd8fY400HsmWbMkjx+/X8/iRNZc+MyMlevtzCZIkSSAiIiIiIiK6wBn0LgARERERERHRTGAAJiIiIiIiojmBAZiIiIiIiIjmBAZgIiIiIiIimhMYgImIiIiIiGhOYAAmIiIiIiKiOYEBmIiIiIiIiOYEBmAiIiIiIiKaEzL1LgARERHRbOR0OrF3715YrVbY7XaYzWa9i0RERJNgDTARUZrwer1obGxEfX09amtrUVtbi6amJni9XgBAU1OTvgUkIgBAR0cHamtr4Xa70dDQALvdjra2NjgcjoSOU1tbi8rKSlgsloT3JSKiqREkSZL0LgQR0VzncDjQ1NSEnTt3oqqqSlnudDrR1NSE5uZmVFdX40L+J7u+vh5OpxPd3d16FyUpLrTzIVlbWxuam5s197W6uhoAsG/fvoSP19jYiM7OTtjt9qSVk4iIomMNMBGRzrxeL+rr69He3q4KvwBQVVWFzs5O1NfXx9y/ra0NLpcr1cVMOafTCZfLpdR4p7N4rvlsOh+KX2NjI5qbm6Ous9lsCR9vw4YN0y0SERElgAGYiEhnbW1tqKmpmfDLc2tra8x1F0oNY3d3Nzwez6zoRxnPNZ9N50PxcTqdAKD5QxUg1/y2t7fPdJGIiChBDMBERDrbs2fPpCFpogF2LqS+g7MlLMZ7zWfL+VB83G43gKnV9BIRUXpgACYiSgOhmqWJROsf6HK54tqXkofXnIiIaPZiACYi0lltbS1cLhdaWlom3G7btm2q516vF7W1taksGo3Da06UOh0dHaivr0dlZSUEQYDFYkF1dbVqNHwiouniKNBERGmgsrISLpcLDQ0NaGpqmrSJZVtbG9rb2+F2u+F0OlFVVQWr1aqs7+zs1Ozj9Xqxfft2VFZWwuv1ore3F5WVlWhoaNBsV19fD5fLBZfLBY/HA5fLhV27dinrAWjKOdX9gPAfAdxuN7q6upQ+lpHHdLvdygi7HR0dAOR+ti6XC+3t7TGbG7tcLrS2tqK4uBjd3d1obGxEVVUVWlpaYDab0d7ejtbW1qRe8+meT6g8Xq8XbW1tqnXNzc1R+6ACckuCXbt2Kfc48nzj0dTUhI6ODrhcLpjNZthsNs2oxvX19Up5q6qqlPWh6xk6z9D60Ps6UaFzjbyv0d6voddL9L2dyPupo6MDra2tyr0f3xojdDwA8Hg8Mc+pqakJxcXFAIDe3l6sWbMGdrsdFosl5ijQk93TZH1G4r3W032PReN0OpVzqKqqQnNzM+x2O7xeLzZv3oyOjg6YzWbVZwmQr2djYyObpBNRYiQiItJdd3e3ZDabJQASAMlsNkt1dXVSa2ur5PF4Yu7X2dkpAZC6u7snPH5nZ6dUVVWlOVZra6tkt9ujvsbWrVslAFJra6u0b98+1br29nbJbDZLnZ2dSduvublZAqDZJ/KYnZ2dUnNzs2adzWaLet7t7e2SzWZTnV9VVZVkt9tVrzvZ9YsU7zWfzvmYzWbJ4/Fo1rW3t0sAot6v1tZWqaqqSrXM4/FINptNam9vj/PsZDabTXOsSFVVVapjxnoPVVVVac4hHqH7Nv4aR7sm03lvJ/p+Ct37aMesq6uTYn2t2rdvn2Sz2TTvhX379kkNDQ1KWcZL5J5O9zMSz7VO5nss8vVD/+5Ffi4jhf5tDH0uJEm+dvF8DomIxmMAJiJKI6Ev7aEvhKGfhoaGqNvHE8Y8Hs+E22zdulWqq6uLeezW1tao+zU0NKi+kE53v9AX2miBMbQuWjm7u7ujBojQeY8vR7wBNpZ495/u+URbJ0lS1HOaKAy0trZKZrN5wrJG2ydW0JMkSfV+3LdvX8zgEi2MTSZ0/tECVeiPCqHznOp7eyrvp9D5xLouobJFYzabY34eQgFw/Oslek+nck6JXOtkv8ciX398uB0vFO4BSFu3bpUkSX4Pxgr1REQTYR9gIqI00tDQgM7OTkiShH379inNEtva2tDY2DilY27evBlVVVUxmwk2Njaio6Mj5sBO0ZplAlD65TU1NSV1v4lE638baoY8vo9gaKTmmpqaqOUKNRHV00TnE9m8OpLZbNZMw7R582bY7fao93jDhg3wer0JnW+o6Wuo+XUkp9OpKbfD4Yg6L3Ks98BEmpqaYDabUVdXF3W92WxWrs1039uJvJ8mE6t5cej9HqsZeKymw1O9p4mcU6LXOpnvMQCq+c0bGhpiXsM1a9Yov4deY/fu3VP6N4SIiAGYiChNVVVVYevWrfB4PLDb7Whra5vS6MMdHR2aEBgp9IU21Fc3XjabDTabLeFpmKa6X2jf8UJfmkN9MGOtH6+3tzfh10+2ic6nsrIy7uM4nc6YITB0vD179iRUtoaGBmzfvl2zfNeuXarAFAqg1dXVSuCMtHXr1oRe1+l0xny/hj4PoXOa7nt7Ku+nRDkcjin1j53qPU3knBK51sl+jzmdTtW/Zxs3boy5beTrut1uJfhOpW85EVGm3gUgIprrXC7XpIO4tLe3w2KxYNeuXQl9mQ7Vyk02H63ZbJ5SuJ5OkJ3KfrFqRaMJ1T6O/+IeOs90GM15ovOJdw7h0Pm4XK6oNbYA0NraOmFQjKaxsRFtbW1wOBzKtfR6vcogTpH27duHzZs3o62tTSlDVVUVdu7cmXD4Cw2EFM92wPTe24m8n6Yq2qBZ8ewDTO2eJnJO8V7rVLzHIv8oYTabJyxH5D32er1oaWmJOtAfEVE8GICJiHTW3NyM1tbWCbcxm82w2+1xh1Sv1xt3gAptn6war3RhNpuVWszIGsvQ86k0z51Iotc8WUKvWVVVldQasVDNbmhEXkBudhrtNUKjaQNyjWdopODq6mq0trYmXK5ozamnaja+t1N1T6OJ51qnojyRrztZcB4f6hsaGpL++SWiuYNNoImIdOZyueLqbxialiYeu3fvBhBuOhjP8ROtIQTir0FK1n6JMpvNaGxsRGNjI1paWtDY2Ig1a9YoYS2ZQtd8poXucTJDY0hTUxMcDofy/unu7taE/FDgDbHb7di6dSv27duHrVu3JtxPMzR10mRS/d5OFpvNlnAAT+U9jZTotU5VeSb7t2D8e459f4loOhiAiYjSQKxmhZFcLheqq6sn3W58ILDb7RM2Nw6tixyQJh6h+X4TrYmZ6n5T1dDQgNbWVmzdulV5TLZEB0xKtrq6uklbB0ylyXnkYFjRBr8C5HOP1ce2ubkZXq83oesTmv91on1C55Kq93YyTdZyI9Z5puqeRkrkWie7PJEDW0VrVh9J788XEV1YGICJiNJAU1PThF8uQ7Vw45sfRquZGd+nuLW1FS6XK+bxW1tbYbfbYwbSWPuFRqhubm5O6n7JNJV+zZOJ55rPtJ07d8LlcsUMIB0dHVPu7xpqRr5r166Y75GJ/oBjs9kSahoeen/EquVra2tTrvV039szIXQ+sUZIjnXPUnlPx5ctnmud7PJEdkuYaPAsh8Oh+cNf6LMXb+sZIqJIDMBERGmgvb0dra2typQpkRwOBxobG6M227XZbKiqqlKtixy0KLRNe3s76uvrNU0YOzo64HK5JmwSvGfPHs1+bW1t2L17N7q6upK230TNREProm0z0Rfg0IixoRFnQ7XP0xHPNY9V1vHrEj2fWNuYzWZ0dnaivr5eEwadTifcbveUm5w3NjbGHPwqUktLi2bZVKfv6urqwu7duzWhMXTvQqFsqu/tqV7/0LpE9gv1j25qatKU0eFwKKORj79vid7TqZ5TvNc62e+x0L0D5HvV0tKilDM02FZoZPHm5mbV1F+dnZ1wOByorKzE3r17435NIiIAECRJkvQuBBHRXNbU1KTUhjocDqVWK1SbEhqIKFYtmtfrRX19PWw2GyorK2G326N+EXW5XGhublam1+nt7UVxcXHMJsEOhwO1tbXo7u5W1bKFvrBv27Ytapmmsl9tba0STm02G+x2O1pbW5Vzi1wX+uJsNpuVL+Mulwtmsxk1NTVobW1VvrQ7nc6YzcanOkoxMPk1T8X5hPrjOp1OZV1TU5MqeEfOr1xZWan0G59uDWh1dTW6urpi3m+v14uqqip0dHTAbDYrQcZms8WcY3Yy488ldE+jHS/e9/ZUr7/VakV9fT327t0Lr9er7NfZ2Qmn04mmpiZlXVVVlbJftPMJ3ZfQtqH3UOhejb/Ok93T6X5GEr3WyX6PhY63d+9epUY39EemjRs3qsrgdDqxefNmZWT3pqYmToVERAljACYioqgig2wizXunul+ydXR0oLOzE01NTZov+y6XC62trWhra0N7e/uUQxoRERHNLpwGiYiILjgulwubN2+Gx+PRrAvNOdra2ora2lo0NTUxABMREc0R7ANMREQXHIfDEdfUN/FOA0NEREQXBgZgIiK64Njt9rgGx4k2eBURERFduBiAiYgoqtBARolOMzLV/ZIpNHBYaDCqaDo6OtDa2jrhCNhERER0YeEgWEREpBIaVTbaiLep2C+VQoNdAVBN49Pd3Y3a2lr2/SUiIppjGICJiIiIiIhoTmATaCIiIiIiIpoTOA1SmhBFEadOnUJhYSEEQdC7OERERERERLOCJEnw+/1YtGgRDIaJ63gZgNPEqVOnUFZWpncxiIiIiIiIZqXjx49j8eLFE27DAJwmCgsLAcg3zWQy6VyaMFEU4fF4YLFYJv1rCqUG74H+eA/0x3ugL15//fEe6I/3QH+8B/pK5+vv8/lQVlamZKqJMACniVCzZ5PJlHYBeHR0FCaTKe3e6HMF74H+eA/0x3ugL15//fEe6I/3QH+8B/qaDdc/nq6k6VnyBDQ1NUEQBDQ1NcW1vcPhQG1tLSorKyEIAiwWC2pra9HR0ZHSfYmIiIiIiEhfs7IG2OVywel0Yvv27XA6nQDkcDqZxsZGtLW1qZZ5vV44HA44HA7Y7faY81VOZ18iIiIiIiLS36yqAW5sbIQgCKisrER9fb0SfuPR0tKiCrDt7e3weDzo7OyE2WwGIIfoxsbGpO5LRERERERE6WFWBWC32w0AsNlssNvtCe0b2US6ubkZdXV1MJvNsNvt2Llzp7Kura0NLpcrafsSERERERFRephVAbi9vR2SJKG7uzuh5sbj++jW1dVN+DyyOfV09iUiIiIiIqL0MasC8FTt2bNH9dxqtWq2CTVlBoB9+/YlZV8iIiIiIiJKH3MiAI/vKxwZWEMig21kLe509iUiIiIiIqL0MScCcDwig22or/FM7EtEREREREQzY04E4OmEUgZaIiIiIiKiC8OsnAd4OqI1YR7P6/Umfd/xhoeHMTw8rDz3+XwAAFEUIYpiXMeYCaIoQpKktCrTXMN7oD/eA/3xHuiL119/vAf64z3QH++BvtL5+idSpjkXgOMJqLGC7nT2HW/79u14+OGHNcs9Hg9GR0fjOsZMEEURfr8fkiTBYJgTDQbSDu+B/ngP9Md7oC9ef/3xHuiP90B/vAf6Sufr7/f74952zgXgdLFt2zY8+OCDynOfz4eysjJYLBaYTCYdS6YmiiIEQYDFYkm7N/pcwXugP94D/fEe6IvXX3+8B/rjPdAf74G+0vn6Z2bGH2vnRACONnXReJG1u5HbT2ffiWRnZyM7O1uz3GAwpN0bShCEtCzXXMJ7oD/eA/3xHuiL119/vAf64z3QH++BvtL1+idSnvQqeYrU1taqnkdryuxyuZTfq6qqkrIvERERERERpY85EYDHh9LIwApoQ21k6J3OvkRERERERJQ+5kQAttvtque7du1SPXc4HDG3n86+RERERERElD7mRAAGgK1btyq/t7S0oKOjA4AcYDdv3qysq6urg81mS9q+RERERERElB5mVQB2OBywWCwQBAGCIKjWOZ1OZXl1dbVm3+bmZtTV1SnP6+vrIQgCamtrlWbMVVVVaG9vT+q+RERERERElB5mVQAG4puLN5b29nZ0dnbCbrcrNbVmsxl2ux3t7e3Yt29fSvYlIiIiIiIi/c2qaZDsdjskSZr2MabaT3c6+xIREREREZG+Zl0NMBEREREREdFUMAATERERERHRnMAATERERERERHPCrOoDPBeIoghRFPUuhkIURUiSlFZlmmt4D/THe6A/3gN98frrj/dAf7wH+uM90Fc6X/9EysQArLNHHnkEjzzyCILBIADA4/FgdHRU51KFiaIIv98PSZJgMLDBgB54D/THe6A/3gN98frrj/dAf7wH+uM90Fc6X3+/3x/3toI03WGVKSl8Ph+Kiorg8XhgMpn0Lo5CFEV4PB5YLJa0e6PPFbwH+uM90B/vgb54/fXHe6A/3gP98R7oK52vv8/ng8ViQV9f36RZijXAacZgMKTdG0oQhLQs11zCe6A/3gP98R7oi9dff7wH+uM90B/vgb7S9fonUp70KjkRERERERFRijAAExERERER0ZzAAExERERERERzAgMwERERERERzQkcBIuIiIiIiIgAAGd9QzjrH9YsF0URPl8/TIMZUQedmleYjXmmnJko4rQwABMREREREREA4CevHsP3uw4mvN/965bjgdoVKShRcjEAExEREREREQDg9mvKUbtqvmb5nY+/it7+AIrzjXjqrms06+cVZs9E8aaNAZiIiIiIiIgAAPNMOVGbMhszDMrj6ouKZrpYScNBsIiIiIiIiGhOYAAmIiIiIiKiOYEBmIiIiIiIiOYEBmAiIiIiIiKaExiAiYiIiIiIaE7gKNBpRhRFiKKodzEUoihCkqS0KtNcw3ugP94D/fEe6IvXX3+8B/rjPdAf74G+pIjHdLsHiZSHAVhnjzzyCB555BEEg0EAgMfjwejoqM6lChNFEX6/H5IkwWBggwE98B7oj/dAf7wH+uL11x/vgf54D/THe6AvaSxkSqIIt9utc2nU/H5/3NsyAOvsvvvuw3333Qefz4eioiJYLBaYTCa9i6UQRRGCIMBisfAfGp3w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bZyengIAqtUqHjx4IDiqcIeHh6JDmEu1Wg3Hx8dwXRcLC1y5TATWgXisA7Fmofzv3z+baXnaE+Bpjn1WsA7EYx2INcry9459dHSEe/fudb3f8fFx19syARbs2rVruHbtGo6OjrC8vIxIJIKlpSXRYYVaWVkRHcJcqtVqkCQJkUhkar94TjvWgXisA7FmofxPTk7w2muvQZIkSJIkOpy+uK47tbHPCtaBeKwDsUZd/t6xl5aWcPHixa73O3eu+7SWCfCEWVhYmNgvF5Ma1zyQJGmi3xvzgHUgHutArGkvfy/uaU2A63tcpjH+WcA6EI91INY4yt87bq/tTU/b9hwVERERERER0RRiAkxERERERERzgQkwERERERERzQVeA0xEREQ0Bm+cvIE3vv9Gz/tdfvQyHn/08RFEREQ0f5gAExEREY2B8bcGfvevf7fn/V742At44WMvjCAiIqL5wwSYiIiIaAwSP5LAp57+VNP9z5vPo3qvisgjEXxJ+1LT45cfvTyG6IiI5gMTYCIiIqIxuHzxMi5fbE5mH1542P/3xy79WOi+9cuPEBFR/5gAExERERHRWFiWhf39faysrEDTNMiyLDqkidGqbEzThOM4LK8h4SzQRERERDQUuVwOsVgMkUjEv+m63nSLRqOBbUah/nksy+prP9M0RxJboVBALBaDJEmQJAm6rve0f7FY9PeNxWJIpVIjidMzjDIpFovQdR2Hh4dIJpPQNA2FQmFkZQwMty4zmYx/vPqyLxaLA8dZKBT8stnY2ICmabh586b/eQIARVFw5coV2LY98PPNPZcmwt27d10A7t27d0WHEvDp3/+w+5Evf8T99O9/WHQoc+v09NR944033NPTU9GhzC3WgXisA7Fmofzffvtt17Is9+233xYdSpNP73z6rK3d+XTLbWq1mnt6eurWarUxRta/dDrtAnCz2WzLbSqViquqqgvArVargcfi8birKMrAcWSzWReAWy6Xe9ovn8+7ANxSqeTfN4o6yOfzrqZpoWXQjve6NE0bWiydhJWJp1N95fP50MdVVXVVVe06hn7qoF3c/QLgyrI8lGO1KhtZll0Abj6f97fr5708TOM4D/V7ru4ll2IPMBERERENVTQaBYC2wzUVRUG5XIaiKE29WpZlwbZtOI4zUByapvW138bGxkDP262VlRUkEgkAZ72A3bBtG6qq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\n"
},
"metadata": {}
}
],
"source": [
"import matplotlib.ticker as mticker\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.rcParams.update({\n",
" \"text.usetex\": True,\n",
" \"font.family\": \"serif\",\n",
"\n",
" \"text.latex.preamble\": r\"\"\"\n",
" \\usepackage{amsmath,amssymb}\n",
" \\usepackage{bm}\n",
" \\usepackage{sfmath}\n",
" \\boldmath\n",
" \"\"\",\n",
"\n",
"\n",
" \"font.size\": 20,\n",
" \"axes.labelsize\": 26,\n",
" \"axes.titlesize\": 28,\n",
" \"xtick.labelsize\": 20,\n",
" \"ytick.labelsize\": 20,\n",
" \"legend.fontsize\": 20,\n",
"})\n",
"\n",
"plt.figure(figsize=(10, 6))\n",
"avg_tau_ours = np.asarray(avg_tau_ours)\n",
"avg_tau_fields = np.asarray(avg_tau_fields)\n",
"avg_tau_mj = np.asarray(avg_tau_mj)\n",
"\n",
"std_tau_ours = np.asarray(std_tau_ours)\n",
"std_tau_fields = np.asarray(std_tau_fields)\n",
"std_tau_mj = np.asarray(std_tau_mj)\n",
"\n",
"plt.errorbar(\n",
" log_inv_alpha,\n",
" avg_tau_ours,\n",
" yerr=std_tau_ours,\n",
" fmt=\"o-\",\n",
" linewidth=2,\n",
" capsize=5,\n",
" label=\"Our Algorithm\",\n",
")\n",
"\n",
"plt.errorbar(\n",
" log_inv_alpha,\n",
" avg_tau_fields,\n",
" yerr=std_tau_fields,\n",
" fmt=\"s--\",\n",
" linewidth=2,\n",
" capsize=5,\n",
" label=\"Fields Add 1/2\",\n",
")\n",
"\n",
"plt.errorbar(\n",
" log_inv_alpha,\n",
" avg_tau_mj,\n",
" yerr=std_tau_mj,\n",
" fmt=\"d-.\",\n",
" linewidth=2,\n",
" capsize=5,\n",
" label=\"Fields Modified Jeffreys\",\n",
")\n",
"\n",
"plt.xlabel(r\"$\\log(1/\\alpha)$\", fontsize=20)\n",
"plt.ylabel(r\"$\\mathbb{E}_Q[\\tau_\\alpha]$\", fontsize=20)\n",
"plt.title(\n",
" r\"Stopping time vs confidence $\\alpha$\",\n",
" fontsize=20,\n",
")\n",
"\n",
"plt.yscale(\"log\")\n",
"\n",
"ax = plt.gca()\n",
"\n",
"\n",
"\n",
"\n",
"yticks = [5, 10, 20, 30, 50, 100]\n",
"ax.set_yticks(yticks)\n",
"\n",
"ax.set_yticklabels([rf\"$\\mathbf{{{y}}}$\" for y in yticks])\n",
"\n",
"\n",
"\n",
"ax.set_ylim(\n",
" min(yticks) * 0.9,\n",
" max(yticks) * 1.1,\n",
")\n",
"\n",
"plt.grid(True, which=\"both\", alpha=0.25)\n",
"\n",
"plt.tight_layout()\n",
"\n",
"\n",
"\n",
"leg = plt.legend(\n",
" loc=\"lower right\",\n",
" frameon=True,\n",
" prop={\"weight\": \"bold\", \"size\": 20},\n",
")\n",
"\n",
"leg.get_frame().set_alpha(0.95)\n",
"\n",
"plt.show()\n",
"\n"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"gpuType": "T4",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}

Xet Storage Details

Size:
131 kB
·
Xet hash:
3cbb7407425a9724ad34570b81ad49b5a4484c07b88776841e2d1f4bd705dc91

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.