From 010e289ead09bc9657f1c0735de001ba835621c6 Mon Sep 17 00:00:00 2001 From: maedoc Date: Wed, 3 Apr 2024 13:31:06 +0000 Subject: [PATCH] deploy: b4f27ec073d56eb85c0825fbc20687da64a39d45 --- .buildinfo | 4 + .doctrees/environment.pickle | Bin 0 -> 470502 bytes .doctrees/index.doctree | Bin 0 -> 12483 bytes .doctrees/modules.doctree | Bin 0 -> 271386 bytes .doctrees/tutorial.doctree | Bin 0 -> 2412 bytes .nojekyll | 0 _sources/index.rst.txt | 101 +++ _sources/modules.rst.txt | 66 ++ _sources/tutorial.rst.txt | 7 + _static/basic.css | 925 +++++++++++++++++++++++ _static/doctools.js | 156 ++++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/graphviz.css | 19 + _static/language_data.js | 199 +++++ _static/minus.png | Bin 0 -> 90 bytes _static/nature.css | 252 +++++++ _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 75 ++ _static/searchtools.js | 574 +++++++++++++++ _static/sphinx_highlight.js | 154 ++++ genindex.html | 574 +++++++++++++++ index.html | 266 +++++++ modules.html | 1184 ++++++++++++++++++++++++++++++ objects.inv | Bin 0 -> 1039 bytes py-modindex.html | 137 ++++ search.html | 101 +++ searchindex.js | 1 + tutorial.html | 111 +++ 29 files changed, 4919 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/modules.doctree create mode 100644 .doctrees/tutorial.doctree create mode 100644 .nojekyll create mode 100644 _sources/index.rst.txt create mode 100644 _sources/modules.rst.txt create mode 100644 _sources/tutorial.rst.txt create mode 100644 _static/basic.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/graphviz.css create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/nature.css create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 genindex.html create mode 100644 index.html create mode 100644 modules.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 tutorial.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..c7f5bd5 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: aad91a3136a843675289893ef2cca4e9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..19b0620b1e0e7513d2b2ae40af47c5cee64b01ea GIT binary patch literal 470502 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�(SqWE@M}0_33kT5`*x@&MeUJq)-5t|fDpln3Be-(kR~;97F!QV+m6!KQ_yhz)Qtc@rK#GuqsS zsN8nL;j&KQGwW+tc*xPr{a`;+&afNcx=?gyL@#Cmi`o1%T;e0BO)V;K792)z#kjR(1ZEgXh2|9M`sTg$l(q;RLWFyucFG8go)2)o^V znVrVMz{|1hw|t=c$cHP--K;8%`T$Xhb)Ex**YghShcltjxU7YC(h2K2iWhGM4b1dL z7I5!k+>#}Hbq7c^6T_amT#hOU}t!>Wu_YwEfCeM;FEI=U~yfhmw=T*3r z?1aKuK;8TdU5~Hfafp3rX~Snc#JS-T%Dl4|F7RwXlKXwQSBK~lLH@0;FzVZgnzY3$ z)a^5vneIY4TpGn0+6I@CV?M^sxdlL%c7Q&B7`Za2?C`8O8A;7vG%^>;ql z?Tb0Ex8ywxdmUjVnE7I5a*Vq!dTYNqHy^^uvd!0dxHvb%>utkDW&lMdB|NCt5X3Ln z3@xHCi2|G~buV&Y%jph1OQ%nrp?cry^5G%T8Mr%AJBQp@VF z3M8=(^4f+K3ZSOlGJ9~66c%)li_e1K4*|RmQ=%nj&{b5;zEa1&k~0*ha+z8%V%G)! z5qv)>3&nVFV!(mZzzCcYRxsGsH7kjqTcTFQpz5!sS4?Twy7Uq&l`D$uVg8J1r}Mm1 zB83!j4U%aDp`iY|LAa$vEI<>Rs(>T3!ZihsP_wK4mJ(&c8C1|MSiG^P1hd*u?Ssi@ zx56@J1{(Pb=yDmhR^(o&zTu@Y;YA|kK{zSD_JhrI(^87gU|4YsD_US`+vO5FzmhZh zN>~(xD`?gmnH|eA$pRztPzhGWq_T9yP>GblH)q5$bElCtwG<+3cA3+}-c^L@Z>l~~ zv@+nQGYnU&B;4gdPQ9gfCScT6(0j0AI?b@C35kRiOHj!Yg-n4>@H^x96IeQ$h9PuX z_;WcepNI8AcxEDhhN^>UP5*o=e_qRGLq$fw%%WgvmNS+I!$P6Lt~|3yJmnc%>}dOc DzDA=! literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e5387729d67ab247fac76ee6d711cd6b17e6674b GIT binary patch literal 12483 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 O4w=HjY7p^JUH3nURdJO7 literal 0 HcmV?d00001 diff --git a/.doctrees/modules.doctree b/.doctrees/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5c336624f2b6d37a350c14794c63730cc2735fc8 GIT binary patch literal 271386 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 literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..635d80e --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,101 @@ +.. vbjax documentation master file, created by + sphinx-quickstart on Tue Dec 5 11:11:08 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +*********************************** +Welcome to vbjax's documentation! +*********************************** + +Introduction +############ +`vbjax` is a Jax-based package for working with virtual brain style models. + +Installation +############ + +Installs with `pip install "vbjax"`, but you can use the source, + +.. code-block:: bash + + git clone https://github.com/ins-amu/vbjax + cd vbjax + pip install .[dev] + + +The primary additional dependency of vbjax is +[JAX](github.com/google/jax), which itself depends only on +NumPy, SciPy & opt-einsum, so it should be safe to add to your +existing projects. + +gee pee you +------------ + +**CUDA** + +If you have a CUDA-enabled GPU, you install the requisite dependencies like so + +.. code-block:: bash + + pip install --upgrade "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html + + +**M1/M2** 🍎 + +On newer Apple machines w/ M1 or M2 GPUs, JAX supports using the GPU experimentally +by installing just two extra packages: + +.. code-block:: bash + + pip install ml-dtypes==0.2.0 jax-metal + + +About a third of vbjax tests fail due to absence of certain operations like n-dim +scatter/gather & FFTs, and it may not be faster because these CPUs already have +excellent memory bandwidth & latency hiding. + +**CUDA** 🐳 + +*BUT* because GPU software stack versions make aligning stars look like child's play, +container images are available and auto-built w/ +[GitHub Actions](.github/workflows/docker-image.yml), so you can use w/ Docker + +.. code-block:: bash + + docker run --rm -it ghcr.io/ins-amu/vbjax:main python3 -c 'import vbjax; print(vbjax.__version__)' + + +The images are built on Nvidia runtime images, so `--gpus all` is enough +for Jax to discover the GPU(s). + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + +Tutorial +######## + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + tutorial + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +Modules +######## + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + modules + diff --git a/_sources/modules.rst.txt b/_sources/modules.rst.txt new file mode 100644 index 0000000..79a7fdf --- /dev/null +++ b/_sources/modules.rst.txt @@ -0,0 +1,66 @@ +neural_mass +----------- + +.. automodule:: vbjax.neural_mass + :members: + :undoc-members: + :show-inheritance: + +monitor +-------- + +.. automodule:: vbjax.monitor + :members: + :undoc-members: + :show-inheritance: + +loops +----- + +.. automodule:: vbjax.loops + :members: + :undoc-members: + :show-inheritance: + +connectome +---------- + +.. automodule:: vbjax.connectome + :members: + :undoc-members: + :show-inheritance: + +layers +------ + +.. automodule:: vbjax.layers + :members: + :undoc-members: + :show-inheritance: + + + + +sparse +------ + +.. automodule:: vbjax.sparse + :members: + :undoc-members: + :show-inheritance: + +util +---- + +.. automodule:: vbjax.util + :members: + :undoc-members: + :show-inheritance: + +shtlc +----- + +.. automodule:: vbjax.shtlc + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/tutorial.rst.txt b/_sources/tutorial.rst.txt new file mode 100644 index 0000000..3a5efeb --- /dev/null +++ b/_sources/tutorial.rst.txt @@ -0,0 +1,7 @@ +Examples +======== + +.. automodule:: 00_intro + +.. automodule:: 01_sweep + diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..30fee9d --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..44860e8 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1.dev1+gb4f27ec', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/graphviz.css b/_static/graphviz.css new file mode 100644 index 0000000..8d81c02 --- /dev/null +++ b/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/nature.css b/_static/nature.css new file mode 100644 index 0000000..84c584a --- /dev/null +++ b/_static/nature.css @@ -0,0 +1,252 @@ +/* + * nature.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- nature theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Arial, sans-serif; + font-size: 100%; + background-color: #fff; + color: #555; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.document { + background-color: #eee; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; + font-size: 0.9em; +} + +div.footer { + color: #555; + width: 100%; + padding: 13px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #444; + text-decoration: underline; +} + +div.related { + background-color: #6BA81E; + line-height: 32px; + color: #fff; + text-shadow: 0px 1px 0 #444; + font-size: 0.9em; +} + +div.related a { + color: #E2F3CC; +} + +div.sphinxsidebar { + font-size: 0.75em; + line-height: 1.5em; +} + +div.sphinxsidebarwrapper{ + padding: 20px 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Arial, sans-serif; + color: #222; + font-size: 1.2em; + font-weight: normal; + margin: 0; + padding: 5px 10px; + background-color: #ddd; + text-shadow: 1px 1px 0 white +} + +div.sphinxsidebar h4{ + font-size: 1.1em; +} + +div.sphinxsidebar h3 a { + color: #444; +} + + +div.sphinxsidebar p { + color: #888; + padding: 5px 20px; +} + +div.sphinxsidebar p.topless { +} + +div.sphinxsidebar ul { + margin: 10px 20px; + padding: 0; + color: #000; +} + +div.sphinxsidebar a { + color: #444; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar .searchformwrapper { + margin-left: 20px; + margin-right: 20px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #005B81; + text-decoration: none; +} + +a:hover { + color: #E32E00; + text-decoration: underline; +} + +a:visited { + color: #551A8B; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Arial, sans-serif; + background-color: #BED4EB; + font-weight: normal; + color: #212224; + margin: 30px 0px 10px 0px; + padding: 5px 0 5px 10px; + text-shadow: 0px 1px 0 white +} + +div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 150%; background-color: #C8D5E3; } +div.body h3 { font-size: 120%; background-color: #D8DEE3; } +div.body h4 { font-size: 110%; background-color: #D8DEE3; } +div.body h5 { font-size: 100%; background-color: #D8DEE3; } +div.body h6 { font-size: 100%; background-color: #D8DEE3; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + line-height: 1.5em; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 10px; + line-height: 1.2em; + border: 1px solid #C6C9CB; + font-size: 1.1em; + margin: 1.5em 0 1.5em 0; + -webkit-box-shadow: 1px 1px 1px #d8d8d8; + -moz-box-shadow: 1px 1px 1px #d8d8d8; +} + +code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ + font-size: 1.1em; + font-family: monospace; +} + +.viewcode-back { + font-family: Arial, sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + background-color: #ddd; + color: #222; + border: 1px solid #C6C9CB; +} \ No newline at end of file diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..9c2afde --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #ffffff; } +.highlight .c { color: #888888 } /* Comment */ +.highlight .err { color: #FF0000; background-color: #FFAAAA } /* Error */ +.highlight .k { color: #008800; font-weight: bold } /* Keyword */ +.highlight .o { color: #333333 } /* Operator */ +.highlight .ch { color: #888888 } /* Comment.Hashbang */ +.highlight .cm { color: #888888 } /* Comment.Multiline */ +.highlight .cp { color: #557799 } /* Comment.Preproc */ +.highlight .cpf { color: #888888 } /* Comment.PreprocFile */ +.highlight .c1 { color: #888888 } /* Comment.Single */ +.highlight .cs { color: #cc0000; font-weight: bold } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #003388; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #333399; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #6600EE; font-weight: bold } /* Literal.Number */ +.highlight .s { background-color: #fff0f0 } /* Literal.String */ +.highlight .na { color: #0000CC } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #BB0066; font-weight: bold } /* Name.Class */ +.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #880000; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #FF0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0066BB; font-weight: bold } /* Name.Function */ +.highlight .nl { color: #997700; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #007700 } /* Name.Tag */ +.highlight .nv { color: #996633 } /* Name.Variable */ +.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #6600EE; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #6600EE; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #005588; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #4400EE; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { background-color: #fff0f0 } /* Literal.String.Affix */ +.highlight .sb { background-color: #fff0f0 } /* Literal.String.Backtick */ +.highlight .sc { color: #0044DD } /* Literal.String.Char */ +.highlight .dl { background-color: #fff0f0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #DD4422 } /* Literal.String.Doc */ +.highlight .s2 { background-color: #fff0f0 } /* Literal.String.Double */ +.highlight .se { color: #666666; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */ +.highlight .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */ +.highlight .si { background-color: #eeeeee } /* Literal.String.Interpol */ +.highlight .sx { color: #DD2200; background-color: #fff0f0 } /* Literal.String.Other */ +.highlight .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */ +.highlight .s1 { background-color: #fff0f0 } /* Literal.String.Single */ +.highlight .ss { color: #AA6600 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0066BB; font-weight: bold } /* Name.Function.Magic */ +.highlight .vc { color: #336699 } /* Name.Variable.Class */ +.highlight .vg { color: #dd7700; font-weight: bold } /* Name.Variable.Global */ +.highlight .vi { color: #3333BB } /* Name.Variable.Instance */ +.highlight .vm { color: #996633 } /* Name.Variable.Magic */ +.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..ffc526d --- /dev/null +++ b/genindex.html @@ -0,0 +1,574 @@ + + + + + + + Index — vbjax 0.1.dev1+gb4f27ec documentation + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | G + | H + | I + | J + | K + | M + | N + | R + | S + | T + | U + | V + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

G

+ + +
+ +

H

+ + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

K

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + +
+ +

V

+ + + +
    +
  • + vbjax.monitor + +
  • +
  • + vbjax.neural_mass + +
  • +
  • + vbjax.shtlc + +
  • +
  • + vbjax.sparse + +
  • +
  • + vbjax.util + +
  • +
+ +

X

+ + +
+ +

Y

+ + + +
+ + + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..265d9fb --- /dev/null +++ b/index.html @@ -0,0 +1,266 @@ + + + + + + + + Welcome to vbjax’s documentation! — vbjax 0.1.dev1+gb4f27ec documentation + + + + + + + + + + + + +
+
+
+
+ +
+

Welcome to vbjax’s documentation!

+
+

Introduction

+

vbjax is a Jax-based package for working with virtual brain style models.

+
+
+

Installation

+

Installs with pip install "vbjax", but you can use the source,

+
git clone https://github.com/ins-amu/vbjax
+cd vbjax
+pip install .[dev]
+
+
+

The primary additional dependency of vbjax is +[JAX](github.com/google/jax), which itself depends only on +NumPy, SciPy & opt-einsum, so it should be safe to add to your +existing projects.

+
+

gee pee you

+

CUDA

+

If you have a CUDA-enabled GPU, you install the requisite dependencies like so

+
pip install --upgrade "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
+
+
+

M1/M2 🍎

+

On newer Apple machines w/ M1 or M2 GPUs, JAX supports using the GPU experimentally +by installing just two extra packages:

+
pip install ml-dtypes==0.2.0 jax-metal
+
+
+

About a third of vbjax tests fail due to absence of certain operations like n-dim +scatter/gather & FFTs, and it may not be faster because these CPUs already have +excellent memory bandwidth & latency hiding.

+

CUDA 🐳

+

BUT because GPU software stack versions make aligning stars look like child’s play, +container images are available and auto-built w/ +[GitHub Actions](.github/workflows/docker-image.yml), so you can use w/ Docker

+
docker run --rm -it ghcr.io/ins-amu/vbjax:main python3 -c 'import vbjax; print(vbjax.__version__)'
+
+
+

The images are built on Nvidia runtime images, so --gpus all is enough +for Jax to discover the GPU(s).

+
+
+
+
+
+

Tutorial

+
+

Contents:

+ +
+ +
+
+

Modules

+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/modules.html b/modules.html new file mode 100644 index 0000000..72dafda --- /dev/null +++ b/modules.html @@ -0,0 +1,1184 @@ + + + + + + + + neural_mass — vbjax 0.1.dev1+gb4f27ec documentation + + + + + + + + + + + + +
+
+
+
+ +
+

neural_mass

+
+
+class JRTheta(A, B, a, b, v0, nu_max, r, J, a_1, a_2, a_3, a_4, mu, I)
+

Bases: tuple

+
+
+A
+

Alias for field number 0

+
+ +
+
+B
+

Alias for field number 1

+
+ +
+
+I
+

Alias for field number 13

+
+ +
+
+J
+

Alias for field number 7

+
+ +
+
+a
+

Alias for field number 2

+
+ +
+
+a_1
+

Alias for field number 8

+
+ +
+
+a_2
+

Alias for field number 9

+
+ +
+
+a_3
+

Alias for field number 10

+
+ +
+
+a_4
+

Alias for field number 11

+
+ +
+
+b
+

Alias for field number 3

+
+ +
+
+mu
+

Alias for field number 12

+
+ +
+
+nu_max
+

Alias for field number 5

+
+ +
+
+r
+

Alias for field number 6

+
+ +
+
+v0
+

Alias for field number 4

+
+ +
+ +
+
+class JRState(y0, y1, y2, y3, y4, y5)
+

Bases: tuple

+
+
+y0
+

Alias for field number 0

+
+ +
+
+y1
+

Alias for field number 1

+
+ +
+
+y2
+

Alias for field number 2

+
+ +
+
+y3
+

Alias for field number 3

+
+ +
+
+y4
+

Alias for field number 4

+
+ +
+
+y5
+

Alias for field number 5

+
+ +
+ +
+
+jr_dfun(ys, c, p)
+
+ +
+
+class BVEPTheta(tau0, I1, x0)
+

Bases: tuple

+
+
+I1
+

Alias for field number 1

+
+ +
+
+tau0
+

Alias for field number 0

+
+ +
+
+x0
+

Alias for field number 2

+
+ +
+ +
+
+bvep_dfun(ys, c, p: BVEPTheta)
+
+ +
+
+class MPRTheta(tau, I, Delta, J, eta, cr, cv)
+

Bases: tuple

+
+
+Delta
+

Alias for field number 2

+
+ +
+
+I
+

Alias for field number 1

+
+ +
+
+J
+

Alias for field number 3

+
+ +
+
+cr
+

Alias for field number 5

+
+ +
+
+cv
+

Alias for field number 6

+
+ +
+
+eta
+

Alias for field number 4

+
+ +
+
+tau
+

Alias for field number 0

+
+ +
+ +
+
+class MPRState(r, V)
+

Bases: tuple

+
+
+V
+

Alias for field number 1

+
+ +
+
+r
+

Alias for field number 0

+
+ +
+ +
+
+mpr_dfun(ys, c, p)
+
+ +
+
+mpr_r_positive(rv, _)
+
+ +
+
+class BOLDTheta(tau_s, tau_f, tau_o, alpha, te, v0, e0, epsilon, nu_0, r_0, recip_tau_s, recip_tau_f, recip_tau_o, recip_alpha, recip_e0, k1, k2, k3)
+

Bases: tuple

+
+
+alpha
+

Alias for field number 3

+
+ +
+
+e0
+

Alias for field number 6

+
+ +
+
+epsilon
+

Alias for field number 7

+
+ +
+
+k1
+

Alias for field number 15

+
+ +
+
+k2
+

Alias for field number 16

+
+ +
+
+k3
+

Alias for field number 17

+
+ +
+
+nu_0
+

Alias for field number 8

+
+ +
+
+r_0
+

Alias for field number 9

+
+ +
+
+recip_alpha
+

Alias for field number 13

+
+ +
+
+recip_e0
+

Alias for field number 14

+
+ +
+
+recip_tau_f
+

Alias for field number 11

+
+ +
+
+recip_tau_o
+

Alias for field number 12

+
+ +
+
+recip_tau_s
+

Alias for field number 10

+
+ +
+
+tau_f
+

Alias for field number 1

+
+ +
+
+tau_o
+

Alias for field number 2

+
+ +
+
+tau_s
+

Alias for field number 0

+
+ +
+
+te
+

Alias for field number 4

+
+ +
+
+v0
+

Alias for field number 5

+
+ +
+ +
+
+compute_bold_theta(tau_s=0.65, tau_f=0.41, tau_o=0.98, alpha=0.32, te=0.04, v0=4.0, e0=0.4, epsilon=0.5, nu_0=40.3, r_0=25.0)
+
+ +
+
+bold_dfun(sfvq, x, p: BOLDTheta)
+
+ +
+
+class DCMTheta(A, B, C)
+

Bases: tuple

+
+
+A
+

Alias for field number 0

+
+ +
+
+B
+

Alias for field number 1

+
+ +
+
+C
+

Alias for field number 2

+
+ +
+ +
+
+dcm_dfun(x, u, p: DCMTheta)
+

Implements the classical bilinear DCM +dot{x} = (A + sum_j u_j B_j ) x + C u

+
+ +
+
+DopaTheta
+

alias of dopaTheta

+
+ +
+
+class DopaState(r, V, u, Sa, Sg, Dp)
+

Bases: tuple

+
+
+Dp
+

Alias for field number 5

+
+ +
+
+Sa
+

Alias for field number 3

+
+ +
+
+Sg
+

Alias for field number 4

+
+ +
+
+V
+

Alias for field number 1

+
+ +
+
+r
+

Alias for field number 0

+
+ +
+
+u
+

Alias for field number 2

+
+ +
+ +
+
+dopa_dfun(y, cy, p: dopaTheta)
+

Adaptive QIF model with dopamine modulation.

+
+ +
+
+dopa_net_dfun(y, p)
+

Canonical form for network of dopa nodes.

+
+ +
+
+dopa_r_positive(y, _)
+
+ +
+
+dopa_gfun_mulr(y, p)
+

Provide a multiplicative r, additive V gfun.

+
+ +
+
+dopa_gfun_add(y, p)
+

Provides an additive noise gfun.

+
+ +
+
+

monitor

+
+
+make_offline(step_fn, sample_fn, *args)
+

Compute monitor samples in an offline or batch fashion.

+
+ +
+
+make_timeavg(shape)
+

Make a time average monitor.

+
+ +
+
+compute_sarvas_gain(q, r, o, att, Ds=0, Dc=0) Array
+
+ +
+
+make_gain(gain, shape=None)
+

Make a gain-matrix monitor suitable for sEEG, EEG & MEG.

+
+ +
+
+make_bold(shape, dt, p: BOLDTheta)
+

Make a BOLD fMRI monitor.

+
+ +
+
+make_cov(shape)
+
+ +
+
+make_fc(shape)
+
+ +
+
+make_fft(shape, period)
+
+ +
+
+

loops

+

Functions for building time stepping loops.

+
+
+heun_step(x, dfun, dt, *args, add=0, adhoc=None, return_euler=False)
+

Use a Heun scheme to step state with a right hand sides dfun(.) +and additional forcing term add.

+
+ +
+
+make_sde(dt, dfun, gfun, adhoc=None, return_euler=False, unroll=10)
+

Use a stochastic Heun scheme to integrate autonomous stochastic +differential equations (SDEs).

+
+
Parameters:
+
+
dtfloat

Time step

+
+
dfunfunction

Function of the form dfun(x, p) that computes drift coefficients of +the stochastic differential equation.

+
+
gfunfunction or float

Function of the form gfun(x, p) that computes diffusion coefficients +of the stochastic differential equation. If a numerical value is +provided, this is used as a constant diffusion coefficient for additive +linear SDE.

+
+
adhocfunction or None

Function of the form f(x, p) that allows making adhoc corrections +to states after a step.

+
+
return_euler: bool, default False

Return solution with local Euler estimates.

+
+
unroll: int, default 10

Force unrolls the time stepping loop.

+
+
+
+
Returns:
+
+
stepfunction

Function of the form step(x, z_t, p) that takes one step in time +according to the Heun scheme.

+
+
loopfunction

Function of the form loop(x0, zs, p) that iteratively calls step +for all z.

+
+
+
+
+

Notes

+

In both cases, a Jax compatible parameter set p is provided, either an array +or some pytree compatible structure.

+

Note that the integrator does not sample normally distributed noise, so this +must be provided by the user.

+
>>> import vbjax as vb
+>>> _, sde = vb.make_sde(1.0, lambda x, p: -x, 0.1)
+>>> sde(1.0, vb.randn(4), None)
+Array([ 0.5093468 ,  0.30794007,  0.07600437, -0.03876263], dtype=float32)
+
+
+
+ +
+
+make_ode(dt, dfun, adhoc=None)
+

Use a Heun scheme to integrate autonomous ordinary differential +equations (ODEs).

+
+
Parameters:
+
+
dtfloat

Time step

+
+
dfunfunction

Function of the form dfun(x, p) that computes derivatives of the +ordinary differential equations.

+
+
adhocfunction or None

Function of the form f(x, p) that allows making adhoc corrections +to states after a step.

+
+
+
+
Returns:
+
+
stepfunction

Function of the form step(x, t, p) that takes one step in time +according to the Heun scheme.

+
+
loopfunction

Function of the form loop(x0, ts, p) that iteratively calls step +for all time steps ts.

+
+
+
+
+

Notes

+

In both cases, a Jax compatible parameter set p is provided, either an array +or some pytree compatible structure.

+
>>> import vbjax as vb, jax.numpy as np
+>>> _, ode = vb.make_ode(1.0, lambda x, p: -x)
+>>> ode(1.0, np.r_[:4], None)
+Array([0.5   , 0.25  , 0.125 , 0.0625], dtype=float32, weak_type=True)
+
+
+
+ +
+
+make_dde(dt, nh, dfun, unroll=10, adhoc=None)
+

Invokes make_sdde w/ gfun 0.

+
+ +
+
+make_sdde(dt, nh, dfun, gfun, unroll=1, zero_delays=False, adhoc=None)
+

Use a stochastic Heun scheme to integrate autonomous +stochastic delay differential equations (SDEs).

+
+
Parameters:
+
+
dtfloat

Time step

+
+
nhint

Maximum delay in time steps.

+
+
dfunfunction

Function of the form dfun(xt, x, t, p) that computes drift coefficients of +the stochastic differential equation.

+
+
gfunfunction or float

Function of the form gfun(x, p) that computes diffusion coefficients +of the stochastic differential equation. If a numerical value is +provided, this is used as a constant diffusion coefficient for additive +linear SDE.

+
+
adhocfunction or None

Function of the form f(x,p) that allows making adhoc corrections after +each step.

+
+
+
+
Returns:
+
+
stepfunction

Function of the form step((x_t,t), z_t, p) that takes one step in time +according to the Heun scheme.

+
+
loopfunction

Function of the form loop((xs, t), p) that iteratively calls step +for each xs[nh:] and starting time index t.

+
+
+
+
+

Notes

+
    +
  • A Jax compatible parameter set p is provided, either an array +or some pytree compatible structure.

  • +
  • The integrator does not sample normally distributed noise, so this +must be provided by the user.

  • +
  • The history buffer passed to the user functions, on the corrector +stage of the Heun method, does not contain the predictor stage, for +performance reasons, unless zero_delays is set to True. +A good compromise can be to set all zero delays to dt.

  • +
+
>>> import vbjax as vb, jax.numpy as np
+>>> _, sdde = vb.make_sdde(1.0, 2, lambda xt, x, t, p: -xt[t-2], 0.0)
+>>> x,t = sdde(np.ones(6)+10, None)
+>>> x
+Array([ 11.,  11.,  11.,   0., -11., -22.], dtype=float32)
+
+
+
+ +
+
+make_continuation(run_chunk, chunk_len, max_lag, n_from, n_svar, stochastic=True)
+

Helper function to lower memory usage for longer simulations with time delays. +WIP

+

Takes a function

+
+

run_chunk(buf, params) -> (buf, chunk_states)

+
+

and returns another

+
+

continue_chunk(buf, params, rng_key) -> (buf, chunk_states)

+
+

The continue_chunk function wraps run_chunk and manages +moving the latest states to the first part of buf and filling +the rest with samples from N(0,1) if required.

+
+ +
+
+

connectome

+

Utilities for connectomes.

+
+
+make_conn_latent_mvnorm(SCs, nc=10, return_full=False)
+

Make a latent multivariate normal distribution over connectomes.

+
+
Parameters:
+
+
SCs(nconn, n, n) array

Array of connectomes in a given parcellation.

+
+
ncint, optional

Number of components to use for the latent space.

+
+
return_full: bool, optional

Whether or not to return extra information on the SVD.

+
+
+
+
Returns:
+
+
u_mean(nc, ), array_like

Mean of distribution in latent space.

+
+
u_cov(nc, nc), array_like

Covariance of distribution in latent space.

+
+
xfmfunction

Maps latent vector to full connectome.

+
+
u_cov(nc, nc) array

Covariance of the multivariate normal. Returned if return_full=True.

+
+
u(nconn, nconn) array

Left singular vectors corresponding to connectomes embedded. +Returned if return_full=True.

+
+
s(nconn) array

Singular values. Returned if return_full=True.

+
+
vt(nconn, n*n) array

Right singular vectors. Returned if return_full=True.

+
+
nconfint

Number of confusions induced by dimensionality reduction. +Returned if return_full=True.

+
+
+
+
+
+ +
+
+

layers

+
+
+make_dense_layers(in_dim, latent_dims=[10], out_dim=None, init_scl=0.1, extra_in=0, act_fn=<PjitFunction of <function leaky_relu>>, key=Array([ 0, 42], dtype=uint32))
+

Make a dense neural network with the given latent layer sizes.

+
+ +
+
+

sparse

+
+
+make_spmv(A, is_symmetric=False, use_scipy=False)
+

Make a closure for a general sparse matrix-vector multiplication.

+
+
Parameters:
+
+
Ascipy.sparse.csr_matrix

Constant sparse matrix.

+
+
is_symmetricbool, optional, default False

Whether matrix is symmetric.

+
+
use_scipy: bool, optional, default False

Use scipy.

+
+
+
+
Returns:
+
+
spmvfunction

Function implementing spase matrix vector multiply with +support for gradients in Jax.

+
+
+
+
+
+ +
+
+csr_to_jax_bcoo(A: csr_matrix)
+

Convert CSR format to batched COO format.

+
+ +
+
+make_sg_spmv(A: csr_matrix, use_pmap=False, sharding: PositionalSharding = None)
+

Make a SpMV kernel w/ generic scatter-gather operations.

+
+ +
+
+

util

+
+
+to_np(x: Array) ndarray
+
+ +
+
+to_jax(x: ndarray)
+

Move NumPy array to JAX via DLPack.

+
+ +
+
+tuple_meshgrid(tup)
+

Applies meshgrid to arrays in a named tuple.

+
+ +
+
+tuple_ravel(tup)
+

Flatten arrays in fields of tuple.

+
+ +
+
+tuple_shard(tup, n)
+

Shard arrays in fields of tuple.

+
+ +
+
+

shtlc

+

SHT based local coupling functions.

+
+
+make_grid_shtns(lmax, nlat, nlon, D)
+

Create shtns object and grid as in make_grid.

+
+ +
+
+make_lm(lmax: int)
+
+ +
+
+make_grid(nlat, nlon)
+

Create grid for SHT, phi latitude, theta longitude.

+
+ +
+
+grid_pairwise_distance(theta, phi)
+

Compute pairwise distances on grid. Memory intensive for large grids.

+
+ +
+
+randn_relaxed(sht)
+

For shtns sht return random spatial array captured by sht.

+
+ +
+
+kernel_diff(D, l)
+

Compute diffusion kernel, l in shtns order.

+
+ +
+
+kernel_dist_origin(theta, phi)
+

Compute distance to origin on grid.

+
+ +
+
+kernel_sh_normalized(sht, k)
+
+ +
+
+kernel_laplace(sht, theta, phi, size)
+

Compute spatial & spectral coefficients for Laplacian kernel.

+
+ +
+
+kernel_gaussian(sht, theta, phi, size)
+

Compute spatial & spectral coefficients for Gaussian kernel.

+
+ +
+
+kernel_mexican_hat(sht, theta, phi, size)
+

Compute spatial & spectral coefficients for Mexican hat kernel.

+
+ +
+
+kernel_conv_prep(sht, k)
+

Prepares evaluated kernel for SHT convolution.

+
+ +
+
+kernel_estimate_shtns(sht, k, x0)
+

Estimate effective kernel for kernel k with state x0 for shtns object sht.

+
+ +
+
+make_shtdiff_np(lmax, nlat, nlon, D, return_L=False, np=<module 'numpy' from '/opt/hostedtoolcache/Python/3.12.2/x64/lib/python3.12/site-packages/numpy/__init__.py'>)
+

Construct SHT diff implementation in plain NumPy.

+
+ +
+
+make_shtdiff(nlat, lmax=None, nlon=None, D=0.0004, return_L=False)
+

Construct SHT diff implementation with Jax.

+
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..c6f8c3938cd144e52e020318733a62854c10ecff GIT binary patch literal 1039 zcmV+q1n~PKAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGk*VrpS{ z3L_v^WpZQrV+tc6RA^-&a%F8{X>Md?av*PJAarPH zb0B7EY-J#6b0A}HZE$jBb8}^6Aa!$TZf78RY-wUH3V7PB+0Aa_HV_B!yPrZudkqmM zyO+H+n>{3G(4bjtkHlCUOWg1aB&FJW+Slmo^+_sOR$>+CI7VgJE;)fucVtLZ}$ZMNp;>C440)y1m+4-yuhQI6lGfs8Io+dCiaSZv$5 zI&1H$^?AA1ItKO_Q$g?qrci}0p?oc|AkOX!9UMR@Rtk%a zCzzy2XrZy*>Fi^{q#wnw#%$>F5CyS^BpcAKD01rP#v4UoweJaPTT{?B6BKbe{B~=! zLxRlOBJ|BN>9C7nq=i)ScRNwy=J(%jKew1+^tBlaElGQI0!(NR8gh<$Gc2Xj3V6xm zA!#%H@yRuw*F1j3C$n{w3Ao&Yns)KLQnGBuWzEK_jMs*Ua4u3@avAn@3 zki~n_+W7M6k#volow!?bV#jG?^;_&H{PyDmWz;hhzcMn#4F`XuU?1Qq!?eCihC4fP z8#uAz33$9=@h>bLS-KBA*9r8wMnCKA2F%;|lU!6%({kL3lvMq;uJ99i1s)Mir`Y{?zkizaF% z1L*jdPAHX58C+eGD4sDoG~=L0s z16@iQDA@*r0n#*E-02#eY#|eLYUTI_2aNuPs>Dwl)5BUJq4Fs{P-Bb9@Ue6;ojU1? zmTv^7oQ!B-w|F`O#8mP=ZUUlCQD!fPBXU!FUlMj4VIxzpJpnFOUDl>xWMgwNjcIxP z5iC7PQ~NF$9R4<`UA}xzV1yn`u}Uq(A7(Y^v{SgNQdS=fY=)eRbu}M7w5#sMkE_>a z%GYC~lNNuXsmC|G*;j{d{PX?qR1M8Ki!L8tPyVzTqW>o;>@VgYrcw{nd7Cni-91e` z9YJ++yIP%8`a#6wKDWbcoFyfMShweJIyRZ7>GwxyaFx3}T=2o1c56O1wf?jNJDh^F J`WGr~55W?*@Dl(4 literal 0 HcmV?d00001 diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 0000000..9824320 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,137 @@ + + + + + + + Python Module Index — vbjax 0.1.dev1+gb4f27ec documentation + + + + + + + + + + + + + + +
+
+
+
+ + +

Python Module Index

+ +
+ v +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ v
+ vbjax +
    + vbjax.connectome +
    + vbjax.layers +
    + vbjax.loops +
    + vbjax.monitor +
    + vbjax.neural_mass +
    + vbjax.shtlc +
    + vbjax.sparse +
    + vbjax.util +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 0000000..e2f02f9 --- /dev/null +++ b/search.html @@ -0,0 +1,101 @@ + + + + + + + Search — vbjax 0.1.dev1+gb4f27ec documentation + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..691b62c --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["index", "modules", "tutorial"], "filenames": ["index.rst", "modules.rst", "tutorial.rst"], "titles": ["Welcome to vbjax\u2019s documentation!", "neural_mass", "Examples"], "terms": {"i": [0, 1], "jax": [0, 1], "base": [0, 1], "packag": [0, 1], "work": 0, "virtual": 0, "brain": 0, "style": 0, "model": [0, 1], "pip": 0, "can": [0, 1], "us": [0, 1], "sourc": 0, "git": 0, "clone": 0, "http": 0, "github": 0, "com": 0, "ins": 0, "amu": 0, "cd": 0, "dev": 0, "The": [0, 1], "primari": 0, "addit": [0, 1], "depend": 0, "googl": 0, "which": 0, "itself": 0, "onli": 0, "numpi": [0, 1], "scipi": [0, 1], "opt": [0, 1], "einsum": 0, "so": [0, 1], "should": 0, "safe": 0, "add": [0, 1], "your": 0, "exist": 0, "project": 0, "cuda": 0, "If": [0, 1], "have": 0, "enabl": 0, "gpu": 0, "requisit": 0, "like": 0, "upgrad": 0, "cuda11_pip": 0, "f": [0, 1], "storag": 0, "googleapi": 0, "releas": 0, "jax_cuda_releas": 0, "html": 0, "m1": 0, "m2": 0, "On": 0, "newer": 0, "appl": 0, "machin": 0, "w": [0, 1], "support": [0, 1], "experiment": 0, "just": 0, "two": 0, "extra": [0, 1], "ml": 0, "dtype": [0, 1], "0": [0, 1], "2": [0, 1], "metal": 0, "about": 0, "third": 0, "test": 0, "fail": 0, "due": 0, "absenc": 0, "certain": 0, "oper": [0, 1], "n": [0, 1], "dim": 0, "scatter": [0, 1], "gather": [0, 1], "fft": 0, "mai": 0, "faster": 0, "becaus": 0, "cpu": 0, "alreadi": 0, "excel": 0, "memori": [0, 1], "bandwidth": 0, "latenc": 0, "hide": 0, "BUT": 0, "softwar": 0, "stack": 0, "version": 0, "make": [0, 1], "align": 0, "star": 0, "look": 0, "child": 0, "plai": 0, "contain": [0, 1], "imag": 0, "ar": 0, "avail": 0, "auto": 0, "built": 0, "action": 0, "workflow": 0, "docker": 0, "yml": 0, "run": 0, "rm": 0, "ghcr": 0, "io": 0, "main": 0, "python3": [0, 1], "c": [0, 1], "import": [0, 1], "print": 0, "__version__": 0, "nvidia": 0, "runtim": 0, "all": [0, 1], "enough": 0, "discov": 0, "exampl": 0, "index": [0, 1], "search": 0, "page": 0, "neural_mass": 0, "jrtheta": [0, 1], "jrstate": [0, 1], "jr_dfun": [0, 1], "bveptheta": [0, 1], "bvep_dfun": [0, 1], "mprtheta": [0, 1], "mprstate": [0, 1], "mpr_dfun": [0, 1], "mpr_r_posit": [0, 1], "boldtheta": [0, 1], "compute_bold_theta": [0, 1], "bold_dfun": [0, 1], "dcmtheta": [0, 1], "dcm_dfun": [0, 1], "dopatheta": [0, 1], "dopast": [0, 1], "dopa_dfun": [0, 1], "dopa_net_dfun": [0, 1], "dopa_r_posit": [0, 1], "dopa_gfun_mulr": [0, 1], "dopa_gfun_add": [0, 1], "monitor": 0, "make_offlin": [0, 1], "make_timeavg": [0, 1], "compute_sarvas_gain": [0, 1], "make_gain": [0, 1], "make_bold": [0, 1], "make_cov": [0, 1], "make_fc": [0, 1], "make_fft": [0, 1], "loop": 0, "heun_step": [0, 1], "make_sd": [0, 1], "make_od": [0, 1], "make_dd": [0, 1], "make_sdd": [0, 1], "make_continu": [0, 1], "connectom": 0, "make_conn_latent_mvnorm": [0, 1], "layer": 0, "make_dense_lay": [0, 1], "spars": 0, "make_spmv": [0, 1], "csr_to_jax_bcoo": [0, 1], "make_sg_spmv": [0, 1], "util": 0, "to_np": [0, 1], "to_jax": [0, 1], "tuple_meshgrid": [0, 1], "tuple_ravel": [0, 1], "tuple_shard": [0, 1], "shtlc": 0, "make_grid_shtn": [0, 1], "make_lm": [0, 1], "make_grid": [0, 1], "grid_pairwise_dist": [0, 1], "randn_relax": [0, 1], "kernel_diff": [0, 1], "kernel_dist_origin": [0, 1], "kernel_sh_norm": [0, 1], "kernel_laplac": [0, 1], "kernel_gaussian": [0, 1], "kernel_mexican_hat": [0, 1], "kernel_conv_prep": [0, 1], "kernel_estimate_shtn": [0, 1], "make_shtdiff_np": [0, 1], "make_shtdiff": [0, 1], "class": 1, "A": 1, "b": 1, "v0": 1, "nu_max": 1, "r": 1, "j": 1, "a_1": 1, "a_2": 1, "a_3": 1, "a_4": 1, "mu": 1, "tupl": 1, "alia": 1, "field": 1, "number": 1, "1": 1, "13": 1, "7": 1, "8": 1, "9": 1, "10": 1, "11": 1, "3": 1, "12": 1, "5": 1, "6": 1, "4": 1, "y0": 1, "y1": 1, "y2": 1, "y3": 1, "y4": 1, "y5": 1, "y": 1, "p": 1, "tau0": 1, "i1": 1, "x0": 1, "tau": 1, "delta": 1, "eta": 1, "cr": 1, "cv": 1, "v": 1, "rv": 1, "_": 1, "tau_": 1, "tau_f": 1, "tau_o": 1, "alpha": 1, "te": 1, "e0": 1, "epsilon": 1, "nu_0": 1, "r_0": 1, "recip_tau_": 1, "recip_tau_f": 1, "recip_tau_o": 1, "recip_alpha": 1, "recip_e0": 1, "k1": 1, "k2": 1, "k3": 1, "15": 1, "16": 1, "17": 1, "14": 1, "65": 1, "41": 1, "98": 1, "32": 1, "04": 1, "40": 1, "25": 1, "sfvq": 1, "x": 1, "u": 1, "implement": 1, "classic": 1, "bilinear": 1, "dcm": 1, "dot": 1, "sum_j": 1, "u_j": 1, "b_j": 1, "sa": 1, "sg": 1, "dp": 1, "cy": 1, "adapt": 1, "qif": 1, "dopamin": 1, "modul": 1, "canon": 1, "form": 1, "network": 1, "dopa": 1, "node": 1, "provid": 1, "multipl": 1, "gfun": 1, "an": 1, "nois": 1, "step_fn": 1, "sample_fn": 1, "arg": 1, "comput": 1, "sampl": 1, "offlin": 1, "batch": 1, "fashion": 1, "shape": 1, "time": 1, "averag": 1, "q": 1, "o": 1, "att": 1, "d": 1, "dc": 1, "arrai": 1, "gain": 1, "none": 1, "matrix": 1, "suitabl": 1, "seeg": 1, "eeg": 1, "meg": 1, "dt": 1, "bold": 1, "fmri": 1, "period": 1, "function": 1, "build": 1, "step": 1, "dfun": 1, "adhoc": 1, "return_eul": 1, "fals": 1, "heun": 1, "scheme": 1, "state": 1, "right": 1, "hand": 1, "side": 1, "forc": 1, "term": 1, "unrol": 1, "stochast": 1, "integr": 1, "autonom": 1, "differenti": 1, "equat": 1, "sde": 1, "paramet": 1, "float": 1, "drift": 1, "coeffici": 1, "diffus": 1, "numer": 1, "valu": 1, "thi": 1, "constant": 1, "linear": 1, "allow": 1, "correct": 1, "after": 1, "bool": 1, "default": 1, "return": 1, "solut": 1, "local": 1, "euler": 1, "estim": 1, "int": 1, "z_t": 1, "take": 1, "one": 1, "accord": 1, "z": 1, "iter": 1, "call": 1, "note": 1, "In": 1, "both": 1, "case": 1, "compat": 1, "set": 1, "either": 1, "some": 1, "pytre": 1, "structur": 1, "doe": 1, "normal": 1, "distribut": 1, "must": 1, "user": 1, "vbjax": 1, "vb": 1, "lambda": 1, "randn": 1, "5093468": 1, "30794007": 1, "07600437": 1, "03876263": 1, "float32": 1, "ordinari": 1, "od": 1, "deriv": 1, "t": 1, "np": 1, "r_": 1, "125": 1, "0625": 1, "weak_typ": 1, "true": 1, "nh": 1, "invok": 1, "zero_delai": 1, "delai": 1, "maximum": 1, "xt": 1, "each": 1, "x_t": 1, "start": 1, "histori": 1, "buffer": 1, "pass": 1, "corrector": 1, "stage": 1, "method": 1, "predictor": 1, "perform": 1, "reason": 1, "unless": 1, "good": 1, "compromis": 1, "zero": 1, "sdde": 1, "ones": 1, "22": 1, "run_chunk": 1, "chunk_len": 1, "max_lag": 1, "n_from": 1, "n_svar": 1, "helper": 1, "lower": 1, "usag": 1, "longer": 1, "simul": 1, "wip": 1, "buf": 1, "param": 1, "chunk_stat": 1, "anoth": 1, "continue_chunk": 1, "rng_kei": 1, "wrap": 1, "manag": 1, "move": 1, "latest": 1, "first": 1, "part": 1, "fill": 1, "rest": 1, "from": 1, "requir": 1, "sc": 1, "nc": 1, "return_ful": 1, "latent": 1, "multivari": 1, "over": 1, "nconn": 1, "given": 1, "parcel": 1, "option": 1, "compon": 1, "space": 1, "whether": 1, "inform": 1, "svd": 1, "u_mean": 1, "array_lik": 1, "mean": 1, "u_cov": 1, "covari": 1, "xfm": 1, "map": 1, "vector": 1, "full": 1, "left": 1, "singular": 1, "correspond": 1, "embed": 1, "": 1, "vt": 1, "nconf": 1, "confus": 1, "induc": 1, "dimension": 1, "reduct": 1, "in_dim": 1, "latent_dim": 1, "out_dim": 1, "init_scl": 1, "extra_in": 1, "act_fn": 1, "pjitfunct": 1, "leaky_relu": 1, "kei": 1, "42": 1, "uint32": 1, "dens": 1, "neural": 1, "size": 1, "is_symmetr": 1, "use_scipi": 1, "closur": 1, "gener": 1, "csr_matrix": 1, "symmetr": 1, "spmv": 1, "spase": 1, "multipli": 1, "gradient": 1, "convert": 1, "csr": 1, "format": 1, "coo": 1, "use_pmap": 1, "shard": 1, "positionalshard": 1, "kernel": 1, "ndarrai": 1, "via": 1, "dlpack": 1, "tup": 1, "appli": 1, "meshgrid": 1, "name": 1, "flatten": 1, "sht": 1, "coupl": 1, "lmax": 1, "nlat": 1, "nlon": 1, "creat": 1, "shtn": 1, "object": 1, "grid": 1, "phi": 1, "latitud": 1, "theta": 1, "longitud": 1, "pairwis": 1, "distanc": 1, "intens": 1, "larg": 1, "For": 1, "random": 1, "spatial": 1, "captur": 1, "l": 1, "order": 1, "origin": 1, "k": 1, "spectral": 1, "laplacian": 1, "gaussian": 1, "mexican": 1, "hat": 1, "prepar": 1, "evalu": 1, "convolut": 1, "effect": 1, "return_l": 1, "hostedtoolcach": 1, "python": 1, "x64": 1, "lib": 1, "site": 1, "__init__": 1, "py": 1, "construct": 1, "diff": 1, "plain": 1, "0004": 1}, "objects": {"vbjax": [[1, 0, 0, "-", "connectome"], [1, 0, 0, "-", "layers"], [1, 0, 0, "-", "loops"], [1, 0, 0, "-", "monitor"], [1, 0, 0, "-", "neural_mass"], [1, 0, 0, "-", "shtlc"], [1, 0, 0, "-", "sparse"], [1, 0, 0, "-", "util"]], "vbjax.connectome": [[1, 1, 1, "", "make_conn_latent_mvnorm"]], "vbjax.layers": [[1, 1, 1, "", "make_dense_layers"]], "vbjax.loops": [[1, 1, 1, "", "heun_step"], [1, 1, 1, "", "make_continuation"], [1, 1, 1, "", "make_dde"], [1, 1, 1, "", "make_ode"], [1, 1, 1, "", "make_sdde"], [1, 1, 1, "", "make_sde"]], "vbjax.monitor": [[1, 1, 1, "", "compute_sarvas_gain"], [1, 1, 1, "", "make_bold"], [1, 1, 1, "", "make_cov"], [1, 1, 1, "", "make_fc"], [1, 1, 1, "", "make_fft"], [1, 1, 1, "", "make_gain"], [1, 1, 1, "", "make_offline"], [1, 1, 1, "", "make_timeavg"]], "vbjax.neural_mass": [[1, 2, 1, "", "BOLDTheta"], [1, 2, 1, "", "BVEPTheta"], [1, 2, 1, "", "DCMTheta"], [1, 2, 1, "", "DopaState"], [1, 3, 1, "", "DopaTheta"], [1, 2, 1, "", "JRState"], [1, 2, 1, "", "JRTheta"], [1, 2, 1, "", "MPRState"], [1, 2, 1, "", "MPRTheta"], [1, 1, 1, "", "bold_dfun"], [1, 1, 1, "", "bvep_dfun"], [1, 1, 1, "", "compute_bold_theta"], [1, 1, 1, "", "dcm_dfun"], [1, 1, 1, "", "dopa_dfun"], [1, 1, 1, "", "dopa_gfun_add"], [1, 1, 1, "", "dopa_gfun_mulr"], [1, 1, 1, "", "dopa_net_dfun"], [1, 1, 1, "", "dopa_r_positive"], [1, 1, 1, "", "jr_dfun"], [1, 1, 1, "", "mpr_dfun"], [1, 1, 1, "", "mpr_r_positive"]], "vbjax.neural_mass.BOLDTheta": [[1, 3, 1, "", "alpha"], [1, 3, 1, "", "e0"], [1, 3, 1, "", "epsilon"], [1, 3, 1, "", "k1"], [1, 3, 1, "", "k2"], [1, 3, 1, "", "k3"], [1, 3, 1, "", "nu_0"], [1, 3, 1, "", "r_0"], [1, 3, 1, "", "recip_alpha"], [1, 3, 1, "", "recip_e0"], [1, 3, 1, "", "recip_tau_f"], [1, 3, 1, "", "recip_tau_o"], [1, 3, 1, "", "recip_tau_s"], [1, 3, 1, "", "tau_f"], [1, 3, 1, "", "tau_o"], [1, 3, 1, "", "tau_s"], [1, 3, 1, "", "te"], [1, 3, 1, "", "v0"]], "vbjax.neural_mass.BVEPTheta": [[1, 3, 1, "", "I1"], [1, 3, 1, "", "tau0"], [1, 3, 1, "", "x0"]], "vbjax.neural_mass.DCMTheta": [[1, 3, 1, "", "A"], [1, 3, 1, "", "B"], [1, 3, 1, "", "C"]], "vbjax.neural_mass.DopaState": [[1, 3, 1, "", "Dp"], [1, 3, 1, "", "Sa"], [1, 3, 1, "", "Sg"], [1, 3, 1, "", "V"], [1, 3, 1, "", "r"], [1, 3, 1, "", "u"]], "vbjax.neural_mass.JRState": [[1, 3, 1, "", "y0"], [1, 3, 1, "", "y1"], [1, 3, 1, "", "y2"], [1, 3, 1, "", "y3"], [1, 3, 1, "", "y4"], [1, 3, 1, "", "y5"]], "vbjax.neural_mass.JRTheta": [[1, 3, 1, "", "A"], [1, 3, 1, "", "B"], [1, 3, 1, "", "I"], [1, 3, 1, "", "J"], [1, 3, 1, "", "a"], [1, 3, 1, "", "a_1"], [1, 3, 1, "", "a_2"], [1, 3, 1, "", "a_3"], [1, 3, 1, "", "a_4"], [1, 3, 1, "", "b"], [1, 3, 1, "", "mu"], [1, 3, 1, "", "nu_max"], [1, 3, 1, "", "r"], [1, 3, 1, "", "v0"]], "vbjax.neural_mass.MPRState": [[1, 3, 1, "", "V"], [1, 3, 1, "", "r"]], "vbjax.neural_mass.MPRTheta": [[1, 3, 1, "", "Delta"], [1, 3, 1, "", "I"], [1, 3, 1, "", "J"], [1, 3, 1, "", "cr"], [1, 3, 1, "", "cv"], [1, 3, 1, "", "eta"], [1, 3, 1, "", "tau"]], "vbjax.shtlc": [[1, 1, 1, "", "grid_pairwise_distance"], [1, 1, 1, "", "kernel_conv_prep"], [1, 1, 1, "", "kernel_diff"], [1, 1, 1, "", "kernel_dist_origin"], [1, 1, 1, "", "kernel_estimate_shtns"], [1, 1, 1, "", "kernel_gaussian"], [1, 1, 1, "", "kernel_laplace"], [1, 1, 1, "", "kernel_mexican_hat"], [1, 1, 1, "", "kernel_sh_normalized"], [1, 1, 1, "", "make_grid"], [1, 1, 1, "", "make_grid_shtns"], [1, 1, 1, "", "make_lm"], [1, 1, 1, "", "make_shtdiff"], [1, 1, 1, "", "make_shtdiff_np"], [1, 1, 1, "", "randn_relaxed"]], "vbjax.sparse": [[1, 1, 1, "", "csr_to_jax_bcoo"], [1, 1, 1, "", "make_sg_spmv"], [1, 1, 1, "", "make_spmv"]], "vbjax.util": [[1, 1, 1, "", "to_jax"], [1, 1, 1, "", "to_np"], [1, 1, 1, "", "tuple_meshgrid"], [1, 1, 1, "", "tuple_ravel"], [1, 1, 1, "", "tuple_shard"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"]}, "titleterms": {"welcom": 0, "vbjax": 0, "": 0, "document": 0, "introduct": 0, "instal": 0, "gee": 0, "pee": 0, "you": 0, "tutori": 0, "content": 0, "modul": 0, "neural_mass": 1, "monitor": 1, "loop": 1, "connectom": 1, "layer": 1, "spars": 1, "util": 1, "shtlc": 1, "exampl": 2}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Welcome to vbjax\u2019s documentation!": [[0, "welcome-to-vbjax-s-documentation"]], "Introduction": [[0, "introduction"]], "Installation": [[0, "installation"]], "gee pee you": [[0, "gee-pee-you"]], "Tutorial": [[0, "tutorial"]], "Contents:": [[0, null], [0, null]], "Modules": [[0, "modules"]], "neural_mass": [[1, "module-vbjax.neural_mass"]], "monitor": [[1, "module-vbjax.monitor"]], "loops": [[1, "module-vbjax.loops"]], "connectome": [[1, "module-vbjax.connectome"]], "layers": [[1, "module-vbjax.layers"]], "sparse": [[1, "module-vbjax.sparse"]], "util": [[1, "module-vbjax.util"]], "shtlc": [[1, "module-vbjax.shtlc"]], "Examples": [[2, "examples"]]}, "indexentries": {"a (dcmtheta attribute)": [[1, "vbjax.neural_mass.DCMTheta.A"]], "a (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.A"], [1, "vbjax.neural_mass.JRTheta.a"]], "b (dcmtheta attribute)": [[1, "vbjax.neural_mass.DCMTheta.B"]], "b (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.B"], [1, "vbjax.neural_mass.JRTheta.b"]], "boldtheta (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.BOLDTheta"]], "bveptheta (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.BVEPTheta"]], "c (dcmtheta attribute)": [[1, "vbjax.neural_mass.DCMTheta.C"]], "dcmtheta (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.DCMTheta"]], "delta (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.Delta"]], "dopastate (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.DopaState"]], "dopatheta (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.DopaTheta"]], "dp (dopastate attribute)": [[1, "vbjax.neural_mass.DopaState.Dp"]], "i (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.I"]], "i (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.I"]], "i1 (bveptheta attribute)": [[1, "vbjax.neural_mass.BVEPTheta.I1"]], "j (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.J"]], "j (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.J"]], "jrstate (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.JRState"]], "jrtheta (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.JRTheta"]], "mprstate (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.MPRState"]], "mprtheta (class in vbjax.neural_mass)": [[1, "vbjax.neural_mass.MPRTheta"]], "sa (dopastate attribute)": [[1, "vbjax.neural_mass.DopaState.Sa"]], "sg (dopastate attribute)": [[1, "vbjax.neural_mass.DopaState.Sg"]], "v (dopastate attribute)": [[1, "vbjax.neural_mass.DopaState.V"]], "v (mprstate attribute)": [[1, "vbjax.neural_mass.MPRState.V"]], "a_1 (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.a_1"]], "a_2 (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.a_2"]], "a_3 (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.a_3"]], "a_4 (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.a_4"]], "alpha (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.alpha"]], "bold_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.bold_dfun"]], "bvep_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.bvep_dfun"]], "compute_bold_theta() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.compute_bold_theta"]], "compute_sarvas_gain() (in module vbjax.monitor)": [[1, "vbjax.monitor.compute_sarvas_gain"]], "cr (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.cr"]], "csr_to_jax_bcoo() (in module vbjax.sparse)": [[1, "vbjax.sparse.csr_to_jax_bcoo"]], "cv (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.cv"]], "dcm_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.dcm_dfun"]], "dopa_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.dopa_dfun"]], "dopa_gfun_add() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.dopa_gfun_add"]], "dopa_gfun_mulr() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.dopa_gfun_mulr"]], "dopa_net_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.dopa_net_dfun"]], "dopa_r_positive() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.dopa_r_positive"]], "e0 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.e0"]], "epsilon (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.epsilon"]], "eta (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.eta"]], "grid_pairwise_distance() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.grid_pairwise_distance"]], "heun_step() (in module vbjax.loops)": [[1, "vbjax.loops.heun_step"]], "jr_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.jr_dfun"]], "k1 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.k1"]], "k2 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.k2"]], "k3 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.k3"]], "kernel_conv_prep() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_conv_prep"]], "kernel_diff() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_diff"]], "kernel_dist_origin() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_dist_origin"]], "kernel_estimate_shtns() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_estimate_shtns"]], "kernel_gaussian() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_gaussian"]], "kernel_laplace() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_laplace"]], "kernel_mexican_hat() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_mexican_hat"]], "kernel_sh_normalized() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.kernel_sh_normalized"]], "make_bold() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_bold"]], "make_conn_latent_mvnorm() (in module vbjax.connectome)": [[1, "vbjax.connectome.make_conn_latent_mvnorm"]], "make_continuation() (in module vbjax.loops)": [[1, "vbjax.loops.make_continuation"]], "make_cov() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_cov"]], "make_dde() (in module vbjax.loops)": [[1, "vbjax.loops.make_dde"]], "make_dense_layers() (in module vbjax.layers)": [[1, "vbjax.layers.make_dense_layers"]], "make_fc() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_fc"]], "make_fft() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_fft"]], "make_gain() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_gain"]], "make_grid() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.make_grid"]], "make_grid_shtns() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.make_grid_shtns"]], "make_lm() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.make_lm"]], "make_ode() (in module vbjax.loops)": [[1, "vbjax.loops.make_ode"]], "make_offline() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_offline"]], "make_sdde() (in module vbjax.loops)": [[1, "vbjax.loops.make_sdde"]], "make_sde() (in module vbjax.loops)": [[1, "vbjax.loops.make_sde"]], "make_sg_spmv() (in module vbjax.sparse)": [[1, "vbjax.sparse.make_sg_spmv"]], "make_shtdiff() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.make_shtdiff"]], "make_shtdiff_np() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.make_shtdiff_np"]], "make_spmv() (in module vbjax.sparse)": [[1, "vbjax.sparse.make_spmv"]], "make_timeavg() (in module vbjax.monitor)": [[1, "vbjax.monitor.make_timeavg"]], "module": [[1, "module-vbjax.connectome"], [1, "module-vbjax.layers"], [1, "module-vbjax.loops"], [1, "module-vbjax.monitor"], [1, "module-vbjax.neural_mass"], [1, "module-vbjax.shtlc"], [1, "module-vbjax.sparse"], [1, "module-vbjax.util"]], "mpr_dfun() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.mpr_dfun"]], "mpr_r_positive() (in module vbjax.neural_mass)": [[1, "vbjax.neural_mass.mpr_r_positive"]], "mu (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.mu"]], "nu_0 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.nu_0"]], "nu_max (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.nu_max"]], "r (dopastate attribute)": [[1, "vbjax.neural_mass.DopaState.r"]], "r (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.r"]], "r (mprstate attribute)": [[1, "vbjax.neural_mass.MPRState.r"]], "r_0 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.r_0"]], "randn_relaxed() (in module vbjax.shtlc)": [[1, "vbjax.shtlc.randn_relaxed"]], "recip_alpha (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.recip_alpha"]], "recip_e0 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.recip_e0"]], "recip_tau_f (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.recip_tau_f"]], "recip_tau_o (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.recip_tau_o"]], "recip_tau_s (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.recip_tau_s"]], "tau (mprtheta attribute)": [[1, "vbjax.neural_mass.MPRTheta.tau"]], "tau0 (bveptheta attribute)": [[1, "vbjax.neural_mass.BVEPTheta.tau0"]], "tau_f (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.tau_f"]], "tau_o (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.tau_o"]], "tau_s (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.tau_s"]], "te (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.te"]], "to_jax() (in module vbjax.util)": [[1, "vbjax.util.to_jax"]], "to_np() (in module vbjax.util)": [[1, "vbjax.util.to_np"]], "tuple_meshgrid() (in module vbjax.util)": [[1, "vbjax.util.tuple_meshgrid"]], "tuple_ravel() (in module vbjax.util)": [[1, "vbjax.util.tuple_ravel"]], "tuple_shard() (in module vbjax.util)": [[1, "vbjax.util.tuple_shard"]], "u (dopastate attribute)": [[1, "vbjax.neural_mass.DopaState.u"]], "v0 (boldtheta attribute)": [[1, "vbjax.neural_mass.BOLDTheta.v0"]], "v0 (jrtheta attribute)": [[1, "vbjax.neural_mass.JRTheta.v0"]], "vbjax.connectome": [[1, "module-vbjax.connectome"]], "vbjax.layers": [[1, "module-vbjax.layers"]], "vbjax.loops": [[1, "module-vbjax.loops"]], "vbjax.monitor": [[1, "module-vbjax.monitor"]], "vbjax.neural_mass": [[1, "module-vbjax.neural_mass"]], "vbjax.shtlc": [[1, "module-vbjax.shtlc"]], "vbjax.sparse": [[1, "module-vbjax.sparse"]], "vbjax.util": [[1, "module-vbjax.util"]], "x0 (bveptheta attribute)": [[1, "vbjax.neural_mass.BVEPTheta.x0"]], "y0 (jrstate attribute)": [[1, "vbjax.neural_mass.JRState.y0"]], "y1 (jrstate attribute)": [[1, "vbjax.neural_mass.JRState.y1"]], "y2 (jrstate attribute)": [[1, "vbjax.neural_mass.JRState.y2"]], "y3 (jrstate attribute)": [[1, "vbjax.neural_mass.JRState.y3"]], "y4 (jrstate attribute)": [[1, "vbjax.neural_mass.JRState.y4"]], "y5 (jrstate attribute)": [[1, "vbjax.neural_mass.JRState.y5"]]}}) \ No newline at end of file diff --git a/tutorial.html b/tutorial.html new file mode 100644 index 0000000..234b0f4 --- /dev/null +++ b/tutorial.html @@ -0,0 +1,111 @@ + + + + + + + + Examples — vbjax 0.1.dev1+gb4f27ec documentation + + + + + + + + + + + + + +
+
+
+
+ +
+

Examples

+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file