From b174f3afbffc7f9495bd8f397dded5414595cb62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 08:52:31 -0300 Subject: [PATCH 01/23] feat: create Dockerfile with specific environments configurations --- Dockerfile | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..69d63279 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +# Copyright (c) Meta, Inc. and its affiliates. +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +FROM ubuntu:22.04 + +# Installing the required packages +RUN apt update -y +RUN apt install -y git curl +RUN apt install -y python3-pip + +WORKDIR /root + +COPY . . + +# Download the ParlAI Github repo +RUN git clone https://github.com/luis-furtado/bark-with-voice-clone.git ~/bark2 + +RUN cd ~/bark2 + +# Install dependencies and dev dependencies to run tests +RUN cd ~/bark2 && \ + pip3 install . && \ + pip3 install -e '.[dev]' + +CMD ["python3", "setup.py", "--help"] \ No newline at end of file From 40bd8fb6694d7ade98f8b73925b2b957d777eb9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 09:00:47 -0300 Subject: [PATCH 02/23] refactor: improving code --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 69d63279..173205e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,13 +12,13 @@ WORKDIR /root COPY . . -# Download the ParlAI Github repo -RUN git clone https://github.com/luis-furtado/bark-with-voice-clone.git ~/bark2 +# Download the Bark Github repo +RUN git clone https://github.com/luis-furtado/bark-with-voice-clone.git ~/app -RUN cd ~/bark2 +RUN cd ~/app # Install dependencies and dev dependencies to run tests -RUN cd ~/bark2 && \ +RUN cd ~/app && \ pip3 install . && \ pip3 install -e '.[dev]' From a9b9b4192e55d1497796ea455ba0e8867e76896b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 09:28:26 -0300 Subject: [PATCH 03/23] feat: create github action and respective logics to build latest image and run docker container --- action.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 action.yml diff --git a/action.yml b/action.yml new file mode 100644 index 00000000..f66882c2 --- /dev/null +++ b/action.yml @@ -0,0 +1,29 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main + +env: + DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ env.DOCKERHUB_TOKEN }} + - name: Build Docker image + run: | + docker build -t bark:latest . + - name: Push Docker image + run: | + docker tag bark:latest ${{ env.DOCKER_USERNAME }}/bark:latest + docker push ${{ env.DOCKER_USERNAME }}/bark:latest \ No newline at end of file From 0ade811965e06b25e315824bcdd13dbaec67b704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 09:30:46 -0300 Subject: [PATCH 04/23] fix: add configure-pipe branch to run pipeline --- action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/action.yml b/action.yml index f66882c2..4e892c8f 100644 --- a/action.yml +++ b/action.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - configure-pipe env: DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} From 31bb98c53765f5679d9b3afbddb5b60dfeec6d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 09:36:37 -0300 Subject: [PATCH 05/23] fix: changing local to github actions file --- .github/workflows/github-actions.yml | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/github-actions.yml diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml new file mode 100644 index 00000000..4e892c8f --- /dev/null +++ b/.github/workflows/github-actions.yml @@ -0,0 +1,30 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main + - configure-pipe + +env: + DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ env.DOCKERHUB_TOKEN }} + - name: Build Docker image + run: | + docker build -t bark:latest . + - name: Push Docker image + run: | + docker tag bark:latest ${{ env.DOCKER_USERNAME }}/bark:latest + docker push ${{ env.DOCKER_USERNAME }}/bark:latest \ No newline at end of file From 6723494fe8720342e49cb300fddf8aab3bf6f336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 09:51:00 -0300 Subject: [PATCH 06/23] fix: update pipe environment names --- .github/workflows/github-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 4e892c8f..16f21806 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -7,8 +7,8 @@ on: - configure-pipe env: - DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} jobs: build-and-push: From 0af1d500dbcaa4b4ccce0700222a2d89cf42e9f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 09:55:32 -0300 Subject: [PATCH 07/23] fix: change dockerhub username github to push docker image --- .github/workflows/github-actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 16f21806..56fe318c 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -26,5 +26,5 @@ jobs: docker build -t bark:latest . - name: Push Docker image run: | - docker tag bark:latest ${{ env.DOCKER_USERNAME }}/bark:latest - docker push ${{ env.DOCKER_USERNAME }}/bark:latest \ No newline at end of file + docker tag bark:latest ${{ env.DOCKERHUB_USERNAME }}/bark:latest + docker push ${{ env.DOCKERHUB_USERNAME }}/bark:latest \ No newline at end of file From fb17ad8980137c6585b5b89c0f57541fe4fa8130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 13:30:44 -0300 Subject: [PATCH 08/23] feat: configuring sphinx, generating documenationn build configurations and include pipeline for build documentation --- ...ml => github-actions-build-push-image.yml} | 0 .../github-actions-generate-sphinx-doc.yml | 19 + Makefile | 20 + build/doctrees/bark.doctree | Bin 0 -> 158349 bytes build/doctrees/environment.pickle | Bin 0 -> 268009 bytes build/doctrees/index.doctree | Bin 0 -> 4969 bytes build/doctrees/modules.doctree | Bin 0 -> 2722 bytes build/html/.buildinfo | 4 + build/html/_sources/bark.rst.txt | 45 + build/html/_sources/index.rst.txt | 20 + build/html/_sources/modules.rst.txt | 7 + build/html/_static/alabaster.css | 703 ++++++++++++++ build/html/_static/basic.css | 903 ++++++++++++++++++ build/html/_static/custom.css | 1 + build/html/_static/doctools.js | 156 +++ build/html/_static/documentation_options.js | 14 + build/html/_static/file.png | Bin 0 -> 286 bytes build/html/_static/language_data.js | 199 ++++ build/html/_static/minus.png | Bin 0 -> 90 bytes build/html/_static/plus.png | Bin 0 -> 90 bytes build/html/_static/pygments.css | 83 ++ build/html/_static/searchtools.js | 566 +++++++++++ build/html/_static/sphinx_highlight.js | 144 +++ build/html/bark.html | 483 ++++++++++ build/html/genindex.html | 352 +++++++ build/html/index.html | 109 +++ build/html/modules.html | 184 ++++ build/html/objects.inv | 6 + build/html/py-modindex.html | 133 +++ build/html/search.html | 117 +++ build/html/searchindex.js | 1 + docs/bark.rst | 45 + docs/conf.py | 34 + docs/index.rst | 20 + docs/modules.rst | 7 + make.bat | 35 + pyproject.toml | 1 + 37 files changed, 4411 insertions(+) rename .github/workflows/{github-actions.yml => github-actions-build-push-image.yml} (100%) create mode 100644 .github/workflows/github-actions-generate-sphinx-doc.yml create mode 100644 Makefile create mode 100644 build/doctrees/bark.doctree create mode 100644 build/doctrees/environment.pickle create mode 100644 build/doctrees/index.doctree create mode 100644 build/doctrees/modules.doctree create mode 100644 build/html/.buildinfo create mode 100644 build/html/_sources/bark.rst.txt create mode 100644 build/html/_sources/index.rst.txt create mode 100644 build/html/_sources/modules.rst.txt create mode 100644 build/html/_static/alabaster.css create mode 100644 build/html/_static/basic.css create mode 100644 build/html/_static/custom.css create mode 100644 build/html/_static/doctools.js create mode 100644 build/html/_static/documentation_options.js create mode 100644 build/html/_static/file.png create mode 100644 build/html/_static/language_data.js create mode 100644 build/html/_static/minus.png create mode 100644 build/html/_static/plus.png create mode 100644 build/html/_static/pygments.css create mode 100644 build/html/_static/searchtools.js create mode 100644 build/html/_static/sphinx_highlight.js create mode 100644 build/html/bark.html create mode 100644 build/html/genindex.html create mode 100644 build/html/index.html create mode 100644 build/html/modules.html create mode 100644 build/html/objects.inv create mode 100644 build/html/py-modindex.html create mode 100644 build/html/search.html create mode 100644 build/html/searchindex.js create mode 100644 docs/bark.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/modules.rst create mode 100644 make.bat diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions-build-push-image.yml similarity index 100% rename from .github/workflows/github-actions.yml rename to .github/workflows/github-actions-build-push-image.yml diff --git a/.github/workflows/github-actions-generate-sphinx-doc.yml b/.github/workflows/github-actions-generate-sphinx-doc.yml new file mode 100644 index 00000000..5e4cab9c --- /dev/null +++ b/.github/workflows/github-actions-generate-sphinx-doc.yml @@ -0,0 +1,19 @@ +name: "Docs Build And Check" +on: + push: + branches: + - main + - configure-pipe + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: ammaraskar/sphinx-action@master + with: + docs-folder: "docs/" + - uses: actions/upload-artifact@v1 + with: + name: DocumentationHTML + path: build/html/ \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..b97de95f --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = docs +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/build/doctrees/bark.doctree b/build/doctrees/bark.doctree new file mode 100644 index 0000000000000000000000000000000000000000..899f286f53ee5cd7bb0884f937a1eeb6d589a771 GIT binary patch literal 158349 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

pOl%B#uiTmT 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 z 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 Hue5bnGZhOcih&x8|$W?XfRMq*u z^XHEmpML-Piu<$MIuSCS_E;FkD&#u1YoQ9V36D+wNq*s?{d)%wzj*NQUGKrY2M>Fl@2SiSSnRQoCB`#C zYNyh}Es}^E9-Vncd1tu37s;`VM|ZtJW;|&;EmRhT9y4CVahFb@V#8z%9o$QmGTvjO z0+Vw7*b8OK10zp(FBh#xxoF#KAMh!e=>O?yPjkZCHWLPLO)fU{fY}Z+CY3N5$U$US zm7xakwiQH7YfR#MBW9E0+gg|<^TB`xogWyh-jUXtj(N_gBYcJ+rU z9d~I*e*pe}d433aD*F9X0|Oq9!e# zxwov?4S02k;O$Sb`=UVGHf8Lbw|0?Y@2*{|&dTSn|K;;vzi+R(L+q+HAy|(8T{@I6 z6C?*xzgQ+#UC1`E546a|H<3f>>je2F7r(JBjLcbrP`FB}?K=MRX%fjm8gQGIPgxr0 z&)hyF!4XGznm>g2{j-wad$@+Z>>4EelbZ04UnKk^X#9ANH<&M;&IniHH&K8CfwRQ# zr`5Xny+iEhOXE+M#z3XgP($U~@Tma$kOCS{EIS9pg7wOgQuR-vy{~dyVUiPr(Kyci=vVwH< zvTgwss;k#Acm-zt$7QG2F(Bc;y-4^X2J<9PMffUu+h!3Fb9?0-mymy0b2=A47gER` z{D&fU7m>SLM(%mms8;K7{n9*vpnTcY$~sEylL@ZatsqOO$n(qjBfC+}xG;KT*EBZ< z5f?4NE~PeC;tx}oz7ZCiAF?PzuBqa!ZK}*9naPht|H!rxa(T*(N^=ZCl=i6PCkY1Y z#ev8g@fgESIn2@sqfI1bpNd9W#la0q@MpQ*8=@SKmEpC;!z*@^Dl}9G{uG7YB*)B_ zMn#hNWe1|6^0i`yN1S>R?NbftSEVaXEH{+3EXf( z8D=tF2{mjZJ^|tJwg72hyRdXkOT%f&?X9JiB^AftB`4b|^v>^4?S6f6VQI77 zp*Lt4O29;stK&B#7LPJE;;?v#WOfx*oV|`#Nu{BW>JK>^$54rQWSeNOhIl3{B10by zz)((e(X?AEGs>S&*{c%t+6=Qv;?F1u!@3EH;t{ofL<+av46GY#f`2}hXr6`2N5287 z9i&yIxnJMuSP~fjL~2=3blVT5rs4??DR0@TTtn>J4LnA}8H&;ltSQC(S-E?YzTpt` zC{*YI8`2g6@^uuZvmq$DOa2As#3K+fk`pBSZ|vN*TM18mssiAZ2nx74N}dFK$KA;} z>}Q2Bi9YD}F|B*anGq`PsdUuO?G2K27l5RXdJFIv*Jkmg`_{cLz@A&_Fj!JgGjsKC zSL)%cj3_(iX-{%9bY~y{^o5y3IIN9O1uqJzvR|{ez{!a}bI;iW{G!u4w>$a_UG>x# zawH;rT$iPY`Wt$J=H7pj!LKz8b={4Np&zM$m7T<`K%g=V0DR$Zu(C5Dc8{|J)e`*z z;aY<-4xo>~jEsliKouDFC{*Zdup}oZMBYfT!W*go8|UB*nvM`Ie1{7y0=XRCHCpqdSyH@jMf+QY$IMT_-2v%x>0Ubb2>Yjyld0b&47C)=I8;Kz*i=!!H7WeKJtdj2TY! zm8Hpzku_Qpl3&NnV4iuUc*T*BDwB9f0KY`Vr x=HG%}pzDB#;nxcdCKLzGLdwGQ`fS>Pxn8!aAkTg}{Tm?|byolY literal 0 HcmV?d00001 diff --git a/build/doctrees/modules.doctree b/build/doctrees/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..94a53d1898fb05d2f5ef6154bce22cd591d0daf1 GIT binary patch literal 2722 zcmZ8jOK%%D5O!?qX-R&hDGDTRQ50zsG_s1KhoYwzJsS0)XanRBET|r6j4+!ym5pAKVpdgQ_p@bOFPpgQ`0)Y*+QGuG@Y2Gbf;Is@#&=& zIh*EED>g$?c2;QWC9`M7BGu2&cl{iY^mAR5+AF#RT8$^)L4-PYhHV4d?0tdE`Ii9o zEBv0~_YA)m_&pB2#t#qys76#c0Kuvd|3nf-Lgms^wh)L0NbsLX=oe&7S?PE@-v^SU ztV)biOR4AaCUm)=6pXkDG8E&uq-boN1*vgqv zrFZdyA6|sPk|}10(cJ7(r z@4}=udKY7flr&8kTEAGjt$m0yn8? zFG4rhYJnU9hoD)B!6nv_cf*8ur?Xp8*cIT`nEIm3TK)mmN+3WzOfi`Z9##@St8A+M zt*ErjQ=P4g#HS;+F12OZ_Q{GOxyvqv6*WH(Gb${Z%alkHWpC3L{ACy+8H-LJ%^(>! zYT0J$giq5KoM74}9TX;6qp0@*#zwmYKaW#$fi`Lh7D`bF7k@o^7A7StGk}8Gqw)%{ zQIgCFVo#kBKI6`n_Q%-_VtZCzJFeB4Hp^KIkCJ8;05mhl3Y5p89DT^APrv;hcuveB zzh^#4Zq0waF^^6qiLWbW&IEId$_KiC#$6%dY~aWoEkx6F?T1qkvdG%rY!k?AnHX{t zj_kE^WSw!b17F4C=DP3mR{V5~zT)B+sXOofv)C#;{}(-TD^uhgV&#dI;RA~=IPfTDk|5dvq- z!O0`sePorff(V)60b*EnJ%0$t%@YD-m5X|&-Gn`+F4F}c`t>Y9^MZ;(QGw=gnImS& zFq?3>A0sGG%i&o9+Tb2b?|^V}M_OO`5X0J{U360m;k5vHFA3{!{+hqCVUPswx&*Lq zBY%Bk`Iq?rijQmp!@TDJACR6n^VY_$h> zEDknat3xMu>|?eXmxlSH`?i`L+|8I6Ii4DzMGObImJ+}s2V5DwUmE#GB>z7C2KM7k qhCae8%A(%2!*+1o5g)YTs$>Vv`v4SKrfLmonr+P(NH?#apZyPQIXy%G literal 0 HcmV?d00001 diff --git a/build/html/.buildinfo b/build/html/.buildinfo new file mode 100644 index 00000000..72a1030c --- /dev/null +++ b/build/html/.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: 3c3a45f7380646673145bdabaed7ce09 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/build/html/_sources/bark.rst.txt b/build/html/_sources/bark.rst.txt new file mode 100644 index 00000000..7204eb14 --- /dev/null +++ b/build/html/_sources/bark.rst.txt @@ -0,0 +1,45 @@ +bark package +============ + +Submodules +---------- + +bark.api module +--------------- + +.. automodule:: bark.api + :members: + :undoc-members: + :show-inheritance: + +bark.generation module +---------------------- + +.. automodule:: bark.generation + :members: + :undoc-members: + :show-inheritance: + +bark.model module +----------------- + +.. automodule:: bark.model + :members: + :undoc-members: + :show-inheritance: + +bark.model\_fine module +----------------------- + +.. automodule:: bark.model_fine + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: bark + :members: + :undoc-members: + :show-inheritance: diff --git a/build/html/_sources/index.rst.txt b/build/html/_sources/index.rst.txt new file mode 100644 index 00000000..26c953bf --- /dev/null +++ b/build/html/_sources/index.rst.txt @@ -0,0 +1,20 @@ +.. Bark documentation master file, created by + sphinx-quickstart on Tue Jun 27 10:35:37 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Bark's documentation! +================================ + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/build/html/_sources/modules.rst.txt b/build/html/_sources/modules.rst.txt new file mode 100644 index 00000000..77bc686f --- /dev/null +++ b/build/html/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +bark +==== + +.. toctree:: + :maxdepth: 4 + + bark diff --git a/build/html/_static/alabaster.css b/build/html/_static/alabaster.css new file mode 100644 index 00000000..517d0b29 --- /dev/null +++ b/build/html/_static/alabaster.css @@ -0,0 +1,703 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/build/html/_static/basic.css b/build/html/_static/basic.css new file mode 100644 index 00000000..7577acb1 --- /dev/null +++ b/build/html/_static/basic.css @@ -0,0 +1,903 @@ +/* + * 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; +} + +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; +} + +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; +} + +/* -- 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/build/html/_static/custom.css b/build/html/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/build/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/build/html/_static/doctools.js b/build/html/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/build/html/_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/build/html/_static/documentation_options.js b/build/html/_static/documentation_options.js new file mode 100644 index 00000000..2db8a09e --- /dev/null +++ b/build/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1', + 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/build/html/_static/file.png b/build/html/_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/build/html/_static/language_data.js b/build/html/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/build/html/_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/build/html/_static/minus.png b/build/html/_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/build/html/_static/plus.png b/build/html/_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/build/html/_static/pygments.css b/build/html/_static/pygments.css new file mode 100644 index 00000000..9abe04ba --- /dev/null +++ b/build/html/_static/pygments.css @@ -0,0 +1,83 @@ +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: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #ef2929 } /* 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: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/build/html/_static/searchtools.js b/build/html/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/build/html/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * 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) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + 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 = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + 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 + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + 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 +) => { + // 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); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 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); + }, + + /** + * 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/build/html/_static/sphinx_highlight.js b/build/html/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/build/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* 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))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + 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(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/build/html/bark.html b/build/html/bark.html new file mode 100644 index 00000000..3d510aa8 --- /dev/null +++ b/build/html/bark.html @@ -0,0 +1,483 @@ + + + + + + + + bark package — Bark 1 documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

bark package

+
+

Submodules

+
+
+

bark.api module

+
+
+bark.api.generate_audio(text: str, history_prompt: Dict | str | None = None, text_temp: float = 0.7, waveform_temp: float = 0.7, silent: bool = False, output_full: bool = False)
+

Generate audio array from input text.

+
+
Parameters:
+
    +
  • text – text to be turned into audio

  • +
  • history_prompt – history choice for audio cloning

  • +
  • text_temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • waveform_temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • silent – disable progress bar

  • +
  • output_full – return full generation to be used as a history prompt

  • +
+
+
Returns:
+

numpy audio array at sample frequency 24khz

+
+
+
+ +
+
+bark.api.save_as_prompt(filepath, full_generation)
+
+ +
+
+bark.api.semantic_to_waveform(semantic_tokens: ndarray, history_prompt: Dict | str | None = None, temp: float = 0.7, silent: bool = False, output_full: bool = False)
+

Generate audio array from semantic input.

+
+
Parameters:
+
    +
  • semantic_tokens – semantic token output from text_to_semantic

  • +
  • history_prompt – history choice for audio cloning

  • +
  • temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • silent – disable progress bar

  • +
  • output_full – return full generation to be used as a history prompt

  • +
+
+
Returns:
+

numpy audio array at sample frequency 24khz

+
+
+
+ +
+
+bark.api.text_to_semantic(text: str, history_prompt: Dict | str | None = None, temp: float = 0.7, silent: bool = False)
+

Generate semantic array from text.

+
+
Parameters:
+
    +
  • text – text to be turned into audio

  • +
  • history_prompt – history choice for audio cloning

  • +
  • temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • silent – disable progress bar

  • +
+
+
Returns:
+

numpy semantic array to be fed into semantic_to_waveform

+
+
+
+ +
+
+

bark.generation module

+
+
+class bark.generation.InferenceContext(benchmark=False)
+

Bases: object

+
+ +
+
+bark.generation.autocast()
+
+ +
+
+bark.generation.clean_models(model_key=None)
+
+ +
+
+bark.generation.codec_decode(fine_tokens)
+

Turn quantized audio codes into audio array using encodec.

+
+ +
+
+bark.generation.generate_coarse(x_semantic, history_prompt=None, temp=0.7, top_k=None, top_p=None, silent=False, max_coarse_history=630, sliding_window_len=60, use_kv_caching=False)
+

Generate coarse audio codes from semantic tokens.

+
+ +
+
+bark.generation.generate_fine(x_coarse_gen, history_prompt=None, temp=0.5, silent=True)
+

Generate full audio codes from coarse audio codes.

+
+ +
+
+bark.generation.generate_text_semantic(text, history_prompt=None, temp=0.7, top_k=None, top_p=None, silent=False, min_eos_p=0.2, max_gen_duration_s=None, allow_early_stop=True, use_kv_caching=False)
+

Generate semantic tokens from text.

+
+ +
+
+bark.generation.load_codec_model(use_gpu=True, force_reload=False)
+
+ +
+
+bark.generation.load_model(use_gpu=True, use_small=False, force_reload=False, model_type='text')
+
+ +
+
+bark.generation.preload_models(text_use_gpu=True, text_use_small=False, coarse_use_gpu=True, coarse_use_small=False, fine_use_gpu=True, fine_use_small=False, codec_use_gpu=True, force_reload=False)
+

Load all the necessary models for the pipeline.

+
+ +
+
+

bark.model module

+

Much of this code is adapted from Andrej Karpathy’s NanoGPT +(https://github.com/karpathy/nanoGPT)

+
+
+class bark.model.Block(config, layer_idx)
+

Bases: Module

+
+
+forward(x, past_kv=None, use_cache=False)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model.CausalSelfAttention(config)
+

Bases: Module

+
+
+forward(x, past_kv=None, use_cache=False)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model.GPT(config)
+

Bases: Module

+
+
+forward(idx, merge_context=False, past_kv=None, position_ids=None, use_cache=False)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+
+get_num_params(non_embedding=True)
+

Return the number of parameters in the model. +For non-embedding count (default), the position embeddings get subtracted. +The token embeddings would too, except due to the parameter sharing these +params are actually used as weights in the final layer, so we include them.

+
+ +
+ +
+
+class bark.model.GPTConfig(block_size: int = 1024, input_vocab_size: int = 10048, output_vocab_size: int = 10048, n_layer: int = 12, n_head: int = 12, n_embd: int = 768, dropout: float = 0.0, bias: bool = True)
+

Bases: object

+
+
+bias: bool = True
+
+ +
+
+block_size: int = 1024
+
+ +
+
+dropout: float = 0.0
+
+ +
+
+input_vocab_size: int = 10048
+
+ +
+
+n_embd: int = 768
+
+ +
+
+n_head: int = 12
+
+ +
+
+n_layer: int = 12
+
+ +
+
+output_vocab_size: int = 10048
+
+ +
+ +
+
+class bark.model.LayerNorm(ndim, bias)
+

Bases: Module

+

LayerNorm but with an optional bias. PyTorch doesn’t support simply bias=False

+
+
+forward(input)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model.MLP(config)
+

Bases: Module

+
+
+forward(x)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+

bark.model_fine module

+

Much of this code is adapted from Andrej Karpathy’s NanoGPT +(https://github.com/karpathy/nanoGPT)

+
+
+class bark.model_fine.FineBlock(config)
+

Bases: Module

+
+
+forward(x)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model_fine.FineGPT(config)
+

Bases: GPT

+
+
+forward(pred_idx, idx)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+
+get_num_params(non_embedding=True)
+

Return the number of parameters in the model. +For non-embedding count (default), the position embeddings get subtracted. +The token embeddings would too, except due to the parameter sharing these +params are actually used as weights in the final layer, so we include them.

+
+ +
+ +
+
+class bark.model_fine.FineGPTConfig(block_size: int = 1024, input_vocab_size: int = 10048, output_vocab_size: int = 10048, n_layer: int = 12, n_head: int = 12, n_embd: int = 768, dropout: float = 0.0, bias: bool = True, n_codes_total: int = 8, n_codes_given: int = 1)
+

Bases: GPTConfig

+
+
+n_codes_given: int = 1
+
+ +
+
+n_codes_total: int = 8
+
+ +
+ +
+
+class bark.model_fine.NonCausalSelfAttention(config)
+

Bases: Module

+
+
+forward(x)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+

Module contents

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/build/html/genindex.html b/build/html/genindex.html new file mode 100644 index 00000000..da7002d7 --- /dev/null +++ b/build/html/genindex.html @@ -0,0 +1,352 @@ + + + + + + + Index — Bark 1 documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ A + | B + | C + | D + | F + | G + | I + | L + | M + | N + | O + | P + | S + | T + +
+

A

+ + +
+ +

B

+ + + +
    +
  • + bark + +
  • +
  • + bark.api + +
  • +
  • + bark.generation + +
  • +
+ +

C

+ + + +
+ +

D

+ + +
+ +

F

+ + +
+ +

G

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + +
+ +

S

+ + + +
+ +

T

+ + +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/build/html/index.html b/build/html/index.html new file mode 100644 index 00000000..c9a2bc34 --- /dev/null +++ b/build/html/index.html @@ -0,0 +1,109 @@ + + + + + + + + Welcome to Bark’s documentation! — Bark 1 documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Welcome to Bark’s documentation!

+
+
+
+
+

Indices and tables

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/build/html/modules.html b/build/html/modules.html new file mode 100644 index 00000000..32d7c1ee --- /dev/null +++ b/build/html/modules.html @@ -0,0 +1,184 @@ + + + + + + + + bark — Bark 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/html/objects.inv b/build/html/objects.inv new file mode 100644 index 00000000..f3e1eef5 --- /dev/null +++ b/build/html/objects.inv @@ -0,0 +1,6 @@ +# Sphinx inventory version 2 +# Project: Bark +# Version: +# The remainder of this file is compressed using zlib. +xڝKn0>vkfh @Ĉل)R GNU$~ȅaQ\|Oran[tֽsQqP?S\ t*=\AZlz#IYS|{9v` dumINuTk6 AF5 5x?eUBOV9+F0?; <\Zp>m$C5sJYj 5udBN .!e|oic[++㍘3dy>$Lߊ> ݨubvY)@T&bCW0lO2]Obm57۪7y= 7)sO <ygi$yO7_?d.|p!!`|ɋڡI=yB/d[|bI +O]meEr k\ӪL!UCŏ%'x.iQOҶX-Y?ାwÂtŨ/Q9ޠhB,Fګ=Nn.k_ {", \ No newline at end of file diff --git a/build/html/py-modindex.html b/build/html/py-modindex.html new file mode 100644 index 00000000..1d5f95c7 --- /dev/null +++ b/build/html/py-modindex.html @@ -0,0 +1,133 @@ + + + + + + + Python Module Index — Bark 1 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ b +
+ + + + + + + + + + + + + + + + + + + +
 
+ b
+ bark +
    + bark.api +
    + bark.generation +
    + bark.model +
    + bark.model_fine +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/build/html/search.html b/build/html/search.html new file mode 100644 index 00000000..e0617ee2 --- /dev/null +++ b/build/html/search.html @@ -0,0 +1,117 @@ + + + + + + + Search — Bark 1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/build/html/searchindex.js b/build/html/searchindex.js new file mode 100644 index 00000000..e18b5c48 --- /dev/null +++ b/build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["bark", "index", "modules"], "filenames": ["bark.rst", "index.rst", "modules.rst"], "titles": ["bark package", "Welcome to Bark\u2019s documentation!", "bark"], "terms": {"generate_audio": [0, 2], "text": 0, "str": 0, "history_prompt": 0, "dict": 0, "none": 0, "text_temp": 0, "float": 0, "0": 0, "7": 0, "waveform_temp": 0, "silent": 0, "bool": 0, "fals": 0, "output_ful": 0, "audio": 0, "arrai": 0, "from": 0, "input": 0, "paramet": 0, "turn": 0, "histori": 0, "choic": 0, "clone": 0, "temperatur": 0, "1": 0, "more": 0, "divers": 0, "conserv": 0, "disabl": 0, "progress": 0, "bar": 0, "return": 0, "full": 0, "us": 0, "prompt": 0, "numpi": 0, "sampl": 0, "frequenc": 0, "24khz": 0, "save_as_prompt": [0, 2], "filepath": 0, "full_gener": 0, "semantic_to_waveform": [0, 2], "semantic_token": 0, "ndarrai": 0, "temp": 0, "semant": 0, "token": 0, "output": 0, "text_to_semant": [0, 2], "fed": 0, "class": 0, "inferencecontext": [0, 2], "benchmark": 0, "base": 0, "object": 0, "autocast": [0, 2], "clean_model": [0, 2], "model_kei": 0, "codec_decod": [0, 2], "fine_token": 0, "quantiz": 0, "code": 0, "encodec": 0, "generate_coars": [0, 2], "x_semant": 0, "top_k": 0, "top_p": 0, "max_coarse_histori": 0, "630": 0, "sliding_window_len": 0, "60": 0, "use_kv_cach": 0, "coars": 0, "generate_fin": [0, 2], "x_coarse_gen": 0, "5": 0, "true": 0, "generate_text_semant": [0, 2], "min_eos_p": 0, "2": 0, "max_gen_duration_": 0, "allow_early_stop": 0, "load_codec_model": [0, 2], "use_gpu": 0, "force_reload": 0, "load_model": [0, 2], "use_smal": 0, "model_typ": 0, "preload_model": [0, 2], "text_use_gpu": 0, "text_use_smal": 0, "coarse_use_gpu": 0, "coarse_use_smal": 0, "fine_use_gpu": 0, "fine_use_smal": 0, "codec_use_gpu": 0, "load": 0, "all": 0, "necessari": 0, "pipelin": 0, "much": 0, "thi": 0, "i": 0, "adapt": 0, "andrej": 0, "karpathi": 0, "": 0, "nanogpt": 0, "http": 0, "github": 0, "com": 0, "block": [0, 2], "config": 0, "layer_idx": 0, "forward": [0, 2], "x": 0, "past_kv": 0, "use_cach": 0, "defin": 0, "comput": 0, "perform": 0, "everi": 0, "call": 0, "should": 0, "overridden": 0, "subclass": 0, "although": 0, "recip": 0, "pass": 0, "need": 0, "within": 0, "function": 0, "one": 0, "instanc": 0, "afterward": 0, "instead": 0, "sinc": 0, "former": 0, "take": 0, "care": 0, "run": 0, "regist": 0, "hook": 0, "while": 0, "latter": 0, "ignor": 0, "them": 0, "causalselfattent": [0, 2], "gpt": [0, 2], "idx": 0, "merge_context": 0, "position_id": 0, "get_num_param": [0, 2], "non_embed": 0, "number": 0, "For": 0, "non": 0, "embed": 0, "count": 0, "default": 0, "posit": 0, "get": 0, "subtract": 0, "The": 0, "would": 0, "too": 0, "except": 0, "due": 0, "share": 0, "param": 0, "ar": 0, "actual": 0, "weight": 0, "final": 0, "layer": 0, "so": 0, "we": 0, "includ": 0, "gptconfig": [0, 2], "block_siz": [0, 2], "int": 0, "1024": 0, "input_vocab_s": [0, 2], "10048": 0, "output_vocab_s": [0, 2], "n_layer": [0, 2], "12": 0, "n_head": [0, 2], "n_embd": [0, 2], "768": 0, "dropout": [0, 2], "bia": [0, 2], "layernorm": [0, 2], "ndim": 0, "an": 0, "option": 0, "pytorch": 0, "doesn": 0, "t": 0, "support": 0, "simpli": 0, "mlp": [0, 2], "fineblock": [0, 2], "finegpt": [0, 2], "pred_idx": 0, "finegptconfig": [0, 2], "n_codes_tot": [0, 2], "8": 0, "n_codes_given": [0, 2], "noncausalselfattent": [0, 2], "index": 1, "modul": [1, 2], "search": 1, "page": 1, "packag": 2, "submodul": 2, "api": 2, "gener": 2, "model": 2, "model_fin": 2, "content": 2}, "objects": {"": [[0, 0, 0, "-", "bark"]], "bark": [[0, 0, 0, "-", "api"], [0, 0, 0, "-", "generation"], [0, 0, 0, "-", "model"], [0, 0, 0, "-", "model_fine"]], "bark.api": [[0, 1, 1, "", "generate_audio"], [0, 1, 1, "", "save_as_prompt"], [0, 1, 1, "", "semantic_to_waveform"], [0, 1, 1, "", "text_to_semantic"]], "bark.generation": [[0, 2, 1, "", "InferenceContext"], [0, 1, 1, "", "autocast"], [0, 1, 1, "", "clean_models"], [0, 1, 1, "", "codec_decode"], [0, 1, 1, "", "generate_coarse"], [0, 1, 1, "", "generate_fine"], [0, 1, 1, "", "generate_text_semantic"], [0, 1, 1, "", "load_codec_model"], [0, 1, 1, "", "load_model"], [0, 1, 1, "", "preload_models"]], "bark.model": [[0, 2, 1, "", "Block"], [0, 2, 1, "", "CausalSelfAttention"], [0, 2, 1, "", "GPT"], [0, 2, 1, "", "GPTConfig"], [0, 2, 1, "", "LayerNorm"], [0, 2, 1, "", "MLP"]], "bark.model.Block": [[0, 3, 1, "", "forward"]], "bark.model.CausalSelfAttention": [[0, 3, 1, "", "forward"]], "bark.model.GPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model.GPTConfig": [[0, 4, 1, "", "bias"], [0, 4, 1, "", "block_size"], [0, 4, 1, "", "dropout"], [0, 4, 1, "", "input_vocab_size"], [0, 4, 1, "", "n_embd"], [0, 4, 1, "", "n_head"], [0, 4, 1, "", "n_layer"], [0, 4, 1, "", "output_vocab_size"]], "bark.model.LayerNorm": [[0, 3, 1, "", "forward"]], "bark.model.MLP": [[0, 3, 1, "", "forward"]], "bark.model_fine": [[0, 2, 1, "", "FineBlock"], [0, 2, 1, "", "FineGPT"], [0, 2, 1, "", "FineGPTConfig"], [0, 2, 1, "", "NonCausalSelfAttention"]], "bark.model_fine.FineBlock": [[0, 3, 1, "", "forward"]], "bark.model_fine.FineGPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model_fine.FineGPTConfig": [[0, 4, 1, "", "n_codes_given"], [0, 4, 1, "", "n_codes_total"]], "bark.model_fine.NonCausalSelfAttention": [[0, 3, 1, "", "forward"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"bark": [0, 1, 2], "packag": 0, "submodul": 0, "api": 0, "modul": 0, "gener": 0, "model": 0, "model_fin": 0, "content": 0, "welcom": 1, "": 1, "document": 1, "indic": 1, "tabl": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"bark package": [[0, "bark-package"]], "Submodules": [[0, "submodules"]], "bark.api module": [[0, "module-bark.api"]], "bark.generation module": [[0, "module-bark.generation"]], "bark.model module": [[0, "module-bark.model"]], "bark.model_fine module": [[0, "module-bark.model_fine"]], "Module contents": [[0, "module-bark"]], "Welcome to Bark\u2019s documentation!": [[1, "welcome-to-bark-s-documentation"]], "Indices and tables": [[1, "indices-and-tables"]], "bark": [[2, "bark"]]}, "indexentries": {"block (class in bark.model)": [[0, "bark.model.Block"]], "causalselfattention (class in bark.model)": [[0, "bark.model.CausalSelfAttention"]], "fineblock (class in bark.model_fine)": [[0, "bark.model_fine.FineBlock"]], "finegpt (class in bark.model_fine)": [[0, "bark.model_fine.FineGPT"]], "finegptconfig (class in bark.model_fine)": [[0, "bark.model_fine.FineGPTConfig"]], "gpt (class in bark.model)": [[0, "bark.model.GPT"]], "gptconfig (class in bark.model)": [[0, "bark.model.GPTConfig"]], "inferencecontext (class in bark.generation)": [[0, "bark.generation.InferenceContext"]], "layernorm (class in bark.model)": [[0, "bark.model.LayerNorm"]], "mlp (class in bark.model)": [[0, "bark.model.MLP"]], "noncausalselfattention (class in bark.model_fine)": [[0, "bark.model_fine.NonCausalSelfAttention"]], "autocast() (in module bark.generation)": [[0, "bark.generation.autocast"]], "bark": [[0, "module-bark"]], "bark.api": [[0, "module-bark.api"]], "bark.generation": [[0, "module-bark.generation"]], "bark.model": [[0, "module-bark.model"]], "bark.model_fine": [[0, "module-bark.model_fine"]], "bias (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.bias"]], "block_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.block_size"]], "clean_models() (in module bark.generation)": [[0, "bark.generation.clean_models"]], "codec_decode() (in module bark.generation)": [[0, "bark.generation.codec_decode"]], "dropout (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.dropout"]], "forward() (bark.model.block method)": [[0, "bark.model.Block.forward"]], "forward() (bark.model.causalselfattention method)": [[0, "bark.model.CausalSelfAttention.forward"]], "forward() (bark.model.gpt method)": [[0, "bark.model.GPT.forward"]], "forward() (bark.model.layernorm method)": [[0, "bark.model.LayerNorm.forward"]], "forward() (bark.model.mlp method)": [[0, "bark.model.MLP.forward"]], "forward() (bark.model_fine.fineblock method)": [[0, "bark.model_fine.FineBlock.forward"]], "forward() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.forward"]], "forward() (bark.model_fine.noncausalselfattention method)": [[0, "bark.model_fine.NonCausalSelfAttention.forward"]], "generate_audio() (in module bark.api)": [[0, "bark.api.generate_audio"]], "generate_coarse() (in module bark.generation)": [[0, "bark.generation.generate_coarse"]], "generate_fine() (in module bark.generation)": [[0, "bark.generation.generate_fine"]], "generate_text_semantic() (in module bark.generation)": [[0, "bark.generation.generate_text_semantic"]], "get_num_params() (bark.model.gpt method)": [[0, "bark.model.GPT.get_num_params"]], "get_num_params() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.get_num_params"]], "input_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.input_vocab_size"]], "load_codec_model() (in module bark.generation)": [[0, "bark.generation.load_codec_model"]], "load_model() (in module bark.generation)": [[0, "bark.generation.load_model"]], "module": [[0, "module-bark"], [0, "module-bark.api"], [0, "module-bark.generation"], [0, "module-bark.model"], [0, "module-bark.model_fine"]], "n_codes_given (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_given"]], "n_codes_total (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_total"]], "n_embd (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_embd"]], "n_head (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_head"]], "n_layer (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_layer"]], "output_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.output_vocab_size"]], "preload_models() (in module bark.generation)": [[0, "bark.generation.preload_models"]], "save_as_prompt() (in module bark.api)": [[0, "bark.api.save_as_prompt"]], "semantic_to_waveform() (in module bark.api)": [[0, "bark.api.semantic_to_waveform"]], "text_to_semantic() (in module bark.api)": [[0, "bark.api.text_to_semantic"]]}}) \ No newline at end of file diff --git a/docs/bark.rst b/docs/bark.rst new file mode 100644 index 00000000..7204eb14 --- /dev/null +++ b/docs/bark.rst @@ -0,0 +1,45 @@ +bark package +============ + +Submodules +---------- + +bark.api module +--------------- + +.. automodule:: bark.api + :members: + :undoc-members: + :show-inheritance: + +bark.generation module +---------------------- + +.. automodule:: bark.generation + :members: + :undoc-members: + :show-inheritance: + +bark.model module +----------------- + +.. automodule:: bark.model + :members: + :undoc-members: + :show-inheritance: + +bark.model\_fine module +----------------------- + +.. automodule:: bark.model_fine + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: bark + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..dc14b5f0 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,34 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup ----------------------------------------------------- +import os +import sys + +sys.path.insert(0, os.path.abspath('../bark')) + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'Bark' +copyright = '2023, Luis' +author = 'Luis' +release = '1' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon'] + +templates_path = ['_templates'] +exclude_patterns = [] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..26c953bf --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,20 @@ +.. Bark documentation master file, created by + sphinx-quickstart on Tue Jun 27 10:35:37 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Bark's documentation! +================================ + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 00000000..77bc686f --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,7 @@ +bark +==== + +.. toctree:: + :maxdepth: 4 + + bark diff --git a/make.bat b/make.bat new file mode 100644 index 00000000..feb2d4ea --- /dev/null +++ b/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=docs +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/pyproject.toml b/pyproject.toml index 07cfd444..73bac952 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ dependencies = [ "torch", "tqdm", "transformers", + "sphinx", ] [project.urls] From b4c8766e1abc01a2f8c753b56af6d4e04a13ea37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 13:38:35 -0300 Subject: [PATCH 09/23] fix: change directory to docs files --- .github/workflows/github-actions-generate-sphinx-doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-actions-generate-sphinx-doc.yml b/.github/workflows/github-actions-generate-sphinx-doc.yml index 5e4cab9c..6c219251 100644 --- a/.github/workflows/github-actions-generate-sphinx-doc.yml +++ b/.github/workflows/github-actions-generate-sphinx-doc.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v1 - uses: ammaraskar/sphinx-action@master with: - docs-folder: "docs/" + docs-folder: "../../docs/" - uses: actions/upload-artifact@v1 with: name: DocumentationHTML From b876bfbeff3ea0e26fe7b5d7f3d06ee1430ff9f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 13:45:46 -0300 Subject: [PATCH 10/23] fix: clone Makefile inside of Sphinx doc --- .../github-actions-generate-sphinx-doc.yml | 4 ++-- docs/Makefile | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 docs/Makefile diff --git a/.github/workflows/github-actions-generate-sphinx-doc.yml b/.github/workflows/github-actions-generate-sphinx-doc.yml index 6c219251..b369091b 100644 --- a/.github/workflows/github-actions-generate-sphinx-doc.yml +++ b/.github/workflows/github-actions-generate-sphinx-doc.yml @@ -1,4 +1,4 @@ -name: "Docs Build And Check" +name: Docs Build And Check on: push: branches: @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v1 - uses: ammaraskar/sphinx-action@master with: - docs-folder: "../../docs/" + docs-folder: "docs/" - uses: actions/upload-artifact@v1 with: name: DocumentationHTML diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..b97de95f --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = docs +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) From a6b92225528000f112d58d1621e5f519792b36d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 13:50:08 -0300 Subject: [PATCH 11/23] add make.bat file for doc --- docs/make.bat | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 docs/make.bat diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..feb2d4ea --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=docs +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd From 0db4773d663905bfddcc5609d6d3329462348fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 13:52:18 -0300 Subject: [PATCH 12/23] fix: change sourcedir of makefile --- docs/Makefile | 2 +- docs/make.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index b97de95f..ed880990 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -5,7 +5,7 @@ # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build -SOURCEDIR = docs +SOURCEDIR = . BUILDDIR = build # Put it first so that "make" without argument is like "make help". diff --git a/docs/make.bat b/docs/make.bat index feb2d4ea..8f56bebd 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -7,7 +7,7 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) -set SOURCEDIR=docs +set SOURCEDIR=. set BUILDDIR=build %SPHINXBUILD% >NUL 2>NUL From c6cd9360db6e916bbf34d740be30478f1248d483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 13:57:43 -0300 Subject: [PATCH 13/23] refactor: improving code --- Makefile | 20 - build/doctrees/bark.doctree | Bin 158349 -> 0 bytes build/doctrees/environment.pickle | Bin 268009 -> 0 bytes build/doctrees/index.doctree | Bin 4969 -> 0 bytes build/doctrees/modules.doctree | Bin 2722 -> 0 bytes build/html/.buildinfo | 4 - build/html/_sources/bark.rst.txt | 45 - build/html/_sources/index.rst.txt | 20 - build/html/_sources/modules.rst.txt | 7 - build/html/_static/alabaster.css | 703 --------------- build/html/_static/basic.css | 903 -------------------- build/html/_static/custom.css | 1 - build/html/_static/doctools.js | 156 ---- build/html/_static/documentation_options.js | 14 - build/html/_static/file.png | Bin 286 -> 0 bytes build/html/_static/language_data.js | 199 ----- build/html/_static/minus.png | Bin 90 -> 0 bytes build/html/_static/plus.png | Bin 90 -> 0 bytes build/html/_static/pygments.css | 83 -- build/html/_static/searchtools.js | 566 ------------ build/html/_static/sphinx_highlight.js | 144 ---- build/html/bark.html | 483 ----------- build/html/genindex.html | 352 -------- build/html/index.html | 109 --- build/html/modules.html | 184 ---- build/html/objects.inv | 6 - build/html/py-modindex.html | 133 --- build/html/search.html | 117 --- build/html/searchindex.js | 1 - make.bat | 35 - suno_bark.egg-info/PKG-INFO | 174 ++++ suno_bark.egg-info/SOURCES.txt | 155 ++++ suno_bark.egg-info/dependency_links.txt | 1 + suno_bark.egg-info/requires.txt | 27 + suno_bark.egg-info/top_level.txt | 1 + 35 files changed, 358 insertions(+), 4285 deletions(-) delete mode 100644 Makefile delete mode 100644 build/doctrees/bark.doctree delete mode 100644 build/doctrees/environment.pickle delete mode 100644 build/doctrees/index.doctree delete mode 100644 build/doctrees/modules.doctree delete mode 100644 build/html/.buildinfo delete mode 100644 build/html/_sources/bark.rst.txt delete mode 100644 build/html/_sources/index.rst.txt delete mode 100644 build/html/_sources/modules.rst.txt delete mode 100644 build/html/_static/alabaster.css delete mode 100644 build/html/_static/basic.css delete mode 100644 build/html/_static/custom.css delete mode 100644 build/html/_static/doctools.js delete mode 100644 build/html/_static/documentation_options.js delete mode 100644 build/html/_static/file.png delete mode 100644 build/html/_static/language_data.js delete mode 100644 build/html/_static/minus.png delete mode 100644 build/html/_static/plus.png delete mode 100644 build/html/_static/pygments.css delete mode 100644 build/html/_static/searchtools.js delete mode 100644 build/html/_static/sphinx_highlight.js delete mode 100644 build/html/bark.html delete mode 100644 build/html/genindex.html delete mode 100644 build/html/index.html delete mode 100644 build/html/modules.html delete mode 100644 build/html/objects.inv delete mode 100644 build/html/py-modindex.html delete mode 100644 build/html/search.html delete mode 100644 build/html/searchindex.js delete mode 100644 make.bat create mode 100644 suno_bark.egg-info/PKG-INFO create mode 100644 suno_bark.egg-info/SOURCES.txt create mode 100644 suno_bark.egg-info/dependency_links.txt create mode 100644 suno_bark.egg-info/requires.txt create mode 100644 suno_bark.egg-info/top_level.txt diff --git a/Makefile b/Makefile deleted file mode 100644 index b97de95f..00000000 --- a/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = docs -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/build/doctrees/bark.doctree b/build/doctrees/bark.doctree deleted file mode 100644 index 899f286f53ee5cd7bb0884f937a1eeb6d589a771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158349 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

pOl%B#uiTmT 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 z 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 Hue5bnGZhOcih&x8|$W?XfRMq*u z^XHEmpML-Piu<$MIuSCS_E;FkD&#u1YoQ9V36D+wNq*s?{d)%wzj*NQUGKrY2M>Fl@2SiSSnRQoCB`#C zYNyh}Es}^E9-Vncd1tu37s;`VM|ZtJW;|&;EmRhT9y4CVahFb@V#8z%9o$QmGTvjO z0+Vw7*b8OK10zp(FBh#xxoF#KAMh!e=>O?yPjkZCHWLPLO)fU{fY}Z+CY3N5$U$US zm7xakwiQH7YfR#MBW9E0+gg|<^TB`xogWyh-jUXtj(N_gBYcJ+rU z9d~I*e*pe}d433aD*F9X0|Oq9!e# zxwov?4S02k;O$Sb`=UVGHf8Lbw|0?Y@2*{|&dTSn|K;;vzi+R(L+q+HAy|(8T{@I6 z6C?*xzgQ+#UC1`E546a|H<3f>>je2F7r(JBjLcbrP`FB}?K=MRX%fjm8gQGIPgxr0 z&)hyF!4XGznm>g2{j-wad$@+Z>>4EelbZ04UnKk^X#9ANH<&M;&IniHH&K8CfwRQ# zr`5Xny+iEhOXE+M#z3XgP($U~@Tma$kOCS{EIS9pg7wOgQuR-vy{~dyVUiPr(Kyci=vVwH< zvTgwss;k#Acm-zt$7QG2F(Bc;y-4^X2J<9PMffUu+h!3Fb9?0-mymy0b2=A47gER` z{D&fU7m>SLM(%mms8;K7{n9*vpnTcY$~sEylL@ZatsqOO$n(qjBfC+}xG;KT*EBZ< z5f?4NE~PeC;tx}oz7ZCiAF?PzuBqa!ZK}*9naPht|H!rxa(T*(N^=ZCl=i6PCkY1Y z#ev8g@fgESIn2@sqfI1bpNd9W#la0q@MpQ*8=@SKmEpC;!z*@^Dl}9G{uG7YB*)B_ zMn#hNWe1|6^0i`yN1S>R?NbftSEVaXEH{+3EXf( z8D=tF2{mjZJ^|tJwg72hyRdXkOT%f&?X9JiB^AftB`4b|^v>^4?S6f6VQI77 zp*Lt4O29;stK&B#7LPJE;;?v#WOfx*oV|`#Nu{BW>JK>^$54rQWSeNOhIl3{B10by zz)((e(X?AEGs>S&*{c%t+6=Qv;?F1u!@3EH;t{ofL<+av46GY#f`2}hXr6`2N5287 z9i&yIxnJMuSP~fjL~2=3blVT5rs4??DR0@TTtn>J4LnA}8H&;ltSQC(S-E?YzTpt` zC{*YI8`2g6@^uuZvmq$DOa2As#3K+fk`pBSZ|vN*TM18mssiAZ2nx74N}dFK$KA;} z>}Q2Bi9YD}F|B*anGq`PsdUuO?G2K27l5RXdJFIv*Jkmg`_{cLz@A&_Fj!JgGjsKC zSL)%cj3_(iX-{%9bY~y{^o5y3IIN9O1uqJzvR|{ez{!a}bI;iW{G!u4w>$a_UG>x# zawH;rT$iPY`Wt$J=H7pj!LKz8b={4Np&zM$m7T<`K%g=V0DR$Zu(C5Dc8{|J)e`*z z;aY<-4xo>~jEsliKouDFC{*Zdup}oZMBYfT!W*go8|UB*nvM`Ie1{7y0=XRCHCpqdSyH@jMf+QY$IMT_-2v%x>0Ubb2>Yjyld0b&47C)=I8;Kz*i=!!H7WeKJtdj2TY! zm8Hpzku_Qpl3&NnV4iuUc*T*BDwB9f0KY`Vr x=HG%}pzDB#;nxcdCKLzGLdwGQ`fS>Pxn8!aAkTg}{Tm?|byolY diff --git a/build/doctrees/modules.doctree b/build/doctrees/modules.doctree deleted file mode 100644 index 94a53d1898fb05d2f5ef6154bce22cd591d0daf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2722 zcmZ8jOK%%D5O!?qX-R&hDGDTRQ50zsG_s1KhoYwzJsS0)XanRBET|r6j4+!ym5pAKVpdgQ_p@bOFPpgQ`0)Y*+QGuG@Y2Gbf;Is@#&=& zIh*EED>g$?c2;QWC9`M7BGu2&cl{iY^mAR5+AF#RT8$^)L4-PYhHV4d?0tdE`Ii9o zEBv0~_YA)m_&pB2#t#qys76#c0Kuvd|3nf-Lgms^wh)L0NbsLX=oe&7S?PE@-v^SU ztV)biOR4AaCUm)=6pXkDG8E&uq-boN1*vgqv zrFZdyA6|sPk|}10(cJ7(r z@4}=udKY7flr&8kTEAGjt$m0yn8? zFG4rhYJnU9hoD)B!6nv_cf*8ur?Xp8*cIT`nEIm3TK)mmN+3WzOfi`Z9##@St8A+M zt*ErjQ=P4g#HS;+F12OZ_Q{GOxyvqv6*WH(Gb${Z%alkHWpC3L{ACy+8H-LJ%^(>! zYT0J$giq5KoM74}9TX;6qp0@*#zwmYKaW#$fi`Lh7D`bF7k@o^7A7StGk}8Gqw)%{ zQIgCFVo#kBKI6`n_Q%-_VtZCzJFeB4Hp^KIkCJ8;05mhl3Y5p89DT^APrv;hcuveB zzh^#4Zq0waF^^6qiLWbW&IEId$_KiC#$6%dY~aWoEkx6F?T1qkvdG%rY!k?AnHX{t zj_kE^WSw!b17F4C=DP3mR{V5~zT)B+sXOofv)C#;{}(-TD^uhgV&#dI;RA~=IPfTDk|5dvq- z!O0`sePorff(V)60b*EnJ%0$t%@YD-m5X|&-Gn`+F4F}c`t>Y9^MZ;(QGw=gnImS& zFq?3>A0sGG%i&o9+Tb2b?|^V}M_OO`5X0J{U360m;k5vHFA3{!{+hqCVUPswx&*Lq zBY%Bk`Iq?rijQmp!@TDJACR6n^VY_$h> zEDknat3xMu>|?eXmxlSH`?i`L+|8I6Ii4DzMGObImJ+}s2V5DwUmE#GB>z7C2KM7k qhCae8%A(%2!*+1o5g)YTs$>Vv`v4SKrfLmonr+P(NH?#apZyPQIXy%G diff --git a/build/html/.buildinfo b/build/html/.buildinfo deleted file mode 100644 index 72a1030c..00000000 --- a/build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# 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: 3c3a45f7380646673145bdabaed7ce09 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/build/html/_sources/bark.rst.txt b/build/html/_sources/bark.rst.txt deleted file mode 100644 index 7204eb14..00000000 --- a/build/html/_sources/bark.rst.txt +++ /dev/null @@ -1,45 +0,0 @@ -bark package -============ - -Submodules ----------- - -bark.api module ---------------- - -.. automodule:: bark.api - :members: - :undoc-members: - :show-inheritance: - -bark.generation module ----------------------- - -.. automodule:: bark.generation - :members: - :undoc-members: - :show-inheritance: - -bark.model module ------------------ - -.. automodule:: bark.model - :members: - :undoc-members: - :show-inheritance: - -bark.model\_fine module ------------------------ - -.. automodule:: bark.model_fine - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: bark - :members: - :undoc-members: - :show-inheritance: diff --git a/build/html/_sources/index.rst.txt b/build/html/_sources/index.rst.txt deleted file mode 100644 index 26c953bf..00000000 --- a/build/html/_sources/index.rst.txt +++ /dev/null @@ -1,20 +0,0 @@ -.. Bark documentation master file, created by - sphinx-quickstart on Tue Jun 27 10:35:37 2023. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to Bark's documentation! -================================ - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/build/html/_sources/modules.rst.txt b/build/html/_sources/modules.rst.txt deleted file mode 100644 index 77bc686f..00000000 --- a/build/html/_sources/modules.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -bark -==== - -.. toctree:: - :maxdepth: 4 - - bark diff --git a/build/html/_static/alabaster.css b/build/html/_static/alabaster.css deleted file mode 100644 index 517d0b29..00000000 --- a/build/html/_static/alabaster.css +++ /dev/null @@ -1,703 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/build/html/_static/basic.css b/build/html/_static/basic.css deleted file mode 100644 index 7577acb1..00000000 --- a/build/html/_static/basic.css +++ /dev/null @@ -1,903 +0,0 @@ -/* - * 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; -} - -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; -} - -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; -} - -/* -- 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/build/html/_static/custom.css b/build/html/_static/custom.css deleted file mode 100644 index 2a924f1d..00000000 --- a/build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/build/html/_static/doctools.js b/build/html/_static/doctools.js deleted file mode 100644 index d06a71d7..00000000 --- a/build/html/_static/doctools.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * 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/build/html/_static/documentation_options.js b/build/html/_static/documentation_options.js deleted file mode 100644 index 2db8a09e..00000000 --- a/build/html/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1', - 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/build/html/_static/file.png b/build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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( diff --git a/build/html/_static/language_data.js b/build/html/_static/language_data.js deleted file mode 100644 index 250f5665..00000000 --- a/build/html/_static/language_data.js +++ /dev/null @@ -1,199 +0,0 @@ -/* - * 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/build/html/_static/minus.png b/build/html/_static/minus.png deleted file mode 100644 index d96755fdaf8bb2214971e0db9c1fd3077d7c419d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/build/html/_static/plus.png b/build/html/_static/plus.png deleted file mode 100644 index 7107cec93a979b9a5f64843235a16651d563ce2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/build/html/_static/pygments.css b/build/html/_static/pygments.css deleted file mode 100644 index 9abe04ba..00000000 --- a/build/html/_static/pygments.css +++ /dev/null @@ -1,83 +0,0 @@ -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: #f8f8f8; } -.highlight .c { color: #8f5902; font-style: italic } /* Comment */ -.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ -.highlight .g { color: #000000 } /* Generic */ -.highlight .k { color: #004461; font-weight: bold } /* Keyword */ -.highlight .l { color: #000000 } /* Literal */ -.highlight .n { color: #000000 } /* Name */ -.highlight .o { color: #582800 } /* Operator */ -.highlight .x { color: #000000 } /* Other */ -.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ -.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #8f5902 } /* Comment.Preproc */ -.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #a40000 } /* Generic.Deleted */ -.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #ef2929 } /* 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: #745334 } /* Generic.Prompt */ -.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ -.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ -.highlight .ld { color: #000000 } /* Literal.Date */ -.highlight .m { color: #990000 } /* Literal.Number */ -.highlight .s { color: #4e9a06 } /* Literal.String */ -.highlight .na { color: #c4a000 } /* Name.Attribute */ -.highlight .nb { color: #004461 } /* Name.Builtin */ -.highlight .nc { color: #000000 } /* Name.Class */ -.highlight .no { color: #000000 } /* Name.Constant */ -.highlight .nd { color: #888888 } /* Name.Decorator */ -.highlight .ni { color: #ce5c00 } /* Name.Entity */ -.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #000000 } /* Name.Function */ -.highlight .nl { color: #f57900 } /* Name.Label */ -.highlight .nn { color: #000000 } /* Name.Namespace */ -.highlight .nx { color: #000000 } /* Name.Other */ -.highlight .py { color: #000000 } /* Name.Property */ -.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #000000 } /* Name.Variable */ -.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ -.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ -.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ -.highlight .mb { color: #990000 } /* Literal.Number.Bin */ -.highlight .mf { color: #990000 } /* Literal.Number.Float */ -.highlight .mh { color: #990000 } /* Literal.Number.Hex */ -.highlight .mi { color: #990000 } /* Literal.Number.Integer */ -.highlight .mo { color: #990000 } /* Literal.Number.Oct */ -.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ -.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ -.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ -.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ -.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ -.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ -.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ -.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ -.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ -.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ -.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ -.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ -.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #000000 } /* Name.Function.Magic */ -.highlight .vc { color: #000000 } /* Name.Variable.Class */ -.highlight .vg { color: #000000 } /* Name.Variable.Global */ -.highlight .vi { color: #000000 } /* Name.Variable.Instance */ -.highlight .vm { color: #000000 } /* Name.Variable.Magic */ -.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/build/html/_static/searchtools.js b/build/html/_static/searchtools.js deleted file mode 100644 index 97d56a74..00000000 --- a/build/html/_static/searchtools.js +++ /dev/null @@ -1,566 +0,0 @@ -/* - * 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) => { - const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; - const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; - const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; - const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - - 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 = docUrlRoot + dirname; - linkUrl = requestUrl; - } else { - // normal html builders - requestUrl = docUrlRoot + 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 + ")"; - else if (showSearchSummary) - fetch(requestUrl) - .then((responseData) => responseData.text()) - .then((data) => { - if (data) - listItem.appendChild( - Search.makeSearchSummary(data, searchTerms) - ); - }); - 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 -) => { - // 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); - setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), - 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); - }, - - /** - * 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/build/html/_static/sphinx_highlight.js b/build/html/_static/sphinx_highlight.js deleted file mode 100644 index aae669d7..00000000 --- a/build/html/_static/sphinx_highlight.js +++ /dev/null @@ -1,144 +0,0 @@ -/* 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))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - 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(SphinxHighlight.highlightSearchWords); -_ready(SphinxHighlight.initEscapeListener); diff --git a/build/html/bark.html b/build/html/bark.html deleted file mode 100644 index 3d510aa8..00000000 --- a/build/html/bark.html +++ /dev/null @@ -1,483 +0,0 @@ - - - - - - - - bark package — Bark 1 documentation - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

bark package

-
-

Submodules

-
-
-

bark.api module

-
-
-bark.api.generate_audio(text: str, history_prompt: Dict | str | None = None, text_temp: float = 0.7, waveform_temp: float = 0.7, silent: bool = False, output_full: bool = False)
-

Generate audio array from input text.

-
-
Parameters:
-
    -
  • text – text to be turned into audio

  • -
  • history_prompt – history choice for audio cloning

  • -
  • text_temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • -
  • waveform_temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • -
  • silent – disable progress bar

  • -
  • output_full – return full generation to be used as a history prompt

  • -
-
-
Returns:
-

numpy audio array at sample frequency 24khz

-
-
-
- -
-
-bark.api.save_as_prompt(filepath, full_generation)
-
- -
-
-bark.api.semantic_to_waveform(semantic_tokens: ndarray, history_prompt: Dict | str | None = None, temp: float = 0.7, silent: bool = False, output_full: bool = False)
-

Generate audio array from semantic input.

-
-
Parameters:
-
    -
  • semantic_tokens – semantic token output from text_to_semantic

  • -
  • history_prompt – history choice for audio cloning

  • -
  • temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • -
  • silent – disable progress bar

  • -
  • output_full – return full generation to be used as a history prompt

  • -
-
-
Returns:
-

numpy audio array at sample frequency 24khz

-
-
-
- -
-
-bark.api.text_to_semantic(text: str, history_prompt: Dict | str | None = None, temp: float = 0.7, silent: bool = False)
-

Generate semantic array from text.

-
-
Parameters:
-
    -
  • text – text to be turned into audio

  • -
  • history_prompt – history choice for audio cloning

  • -
  • temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • -
  • silent – disable progress bar

  • -
-
-
Returns:
-

numpy semantic array to be fed into semantic_to_waveform

-
-
-
- -
-
-

bark.generation module

-
-
-class bark.generation.InferenceContext(benchmark=False)
-

Bases: object

-
- -
-
-bark.generation.autocast()
-
- -
-
-bark.generation.clean_models(model_key=None)
-
- -
-
-bark.generation.codec_decode(fine_tokens)
-

Turn quantized audio codes into audio array using encodec.

-
- -
-
-bark.generation.generate_coarse(x_semantic, history_prompt=None, temp=0.7, top_k=None, top_p=None, silent=False, max_coarse_history=630, sliding_window_len=60, use_kv_caching=False)
-

Generate coarse audio codes from semantic tokens.

-
- -
-
-bark.generation.generate_fine(x_coarse_gen, history_prompt=None, temp=0.5, silent=True)
-

Generate full audio codes from coarse audio codes.

-
- -
-
-bark.generation.generate_text_semantic(text, history_prompt=None, temp=0.7, top_k=None, top_p=None, silent=False, min_eos_p=0.2, max_gen_duration_s=None, allow_early_stop=True, use_kv_caching=False)
-

Generate semantic tokens from text.

-
- -
-
-bark.generation.load_codec_model(use_gpu=True, force_reload=False)
-
- -
-
-bark.generation.load_model(use_gpu=True, use_small=False, force_reload=False, model_type='text')
-
- -
-
-bark.generation.preload_models(text_use_gpu=True, text_use_small=False, coarse_use_gpu=True, coarse_use_small=False, fine_use_gpu=True, fine_use_small=False, codec_use_gpu=True, force_reload=False)
-

Load all the necessary models for the pipeline.

-
- -
-
-

bark.model module

-

Much of this code is adapted from Andrej Karpathy’s NanoGPT -(https://github.com/karpathy/nanoGPT)

-
-
-class bark.model.Block(config, layer_idx)
-

Bases: Module

-
-
-forward(x, past_kv=None, use_cache=False)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
- -
-
-class bark.model.CausalSelfAttention(config)
-

Bases: Module

-
-
-forward(x, past_kv=None, use_cache=False)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
- -
-
-class bark.model.GPT(config)
-

Bases: Module

-
-
-forward(idx, merge_context=False, past_kv=None, position_ids=None, use_cache=False)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
-
-get_num_params(non_embedding=True)
-

Return the number of parameters in the model. -For non-embedding count (default), the position embeddings get subtracted. -The token embeddings would too, except due to the parameter sharing these -params are actually used as weights in the final layer, so we include them.

-
- -
- -
-
-class bark.model.GPTConfig(block_size: int = 1024, input_vocab_size: int = 10048, output_vocab_size: int = 10048, n_layer: int = 12, n_head: int = 12, n_embd: int = 768, dropout: float = 0.0, bias: bool = True)
-

Bases: object

-
-
-bias: bool = True
-
- -
-
-block_size: int = 1024
-
- -
-
-dropout: float = 0.0
-
- -
-
-input_vocab_size: int = 10048
-
- -
-
-n_embd: int = 768
-
- -
-
-n_head: int = 12
-
- -
-
-n_layer: int = 12
-
- -
-
-output_vocab_size: int = 10048
-
- -
- -
-
-class bark.model.LayerNorm(ndim, bias)
-

Bases: Module

-

LayerNorm but with an optional bias. PyTorch doesn’t support simply bias=False

-
-
-forward(input)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
- -
-
-class bark.model.MLP(config)
-

Bases: Module

-
-
-forward(x)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
- -
-
-

bark.model_fine module

-

Much of this code is adapted from Andrej Karpathy’s NanoGPT -(https://github.com/karpathy/nanoGPT)

-
-
-class bark.model_fine.FineBlock(config)
-

Bases: Module

-
-
-forward(x)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
- -
-
-class bark.model_fine.FineGPT(config)
-

Bases: GPT

-
-
-forward(pred_idx, idx)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
-
-get_num_params(non_embedding=True)
-

Return the number of parameters in the model. -For non-embedding count (default), the position embeddings get subtracted. -The token embeddings would too, except due to the parameter sharing these -params are actually used as weights in the final layer, so we include them.

-
- -
- -
-
-class bark.model_fine.FineGPTConfig(block_size: int = 1024, input_vocab_size: int = 10048, output_vocab_size: int = 10048, n_layer: int = 12, n_head: int = 12, n_embd: int = 768, dropout: float = 0.0, bias: bool = True, n_codes_total: int = 8, n_codes_given: int = 1)
-

Bases: GPTConfig

-
-
-n_codes_given: int = 1
-
- -
-
-n_codes_total: int = 8
-
- -
- -
-
-class bark.model_fine.NonCausalSelfAttention(config)
-

Bases: Module

-
-
-forward(x)
-

Defines the computation performed at every call.

-

Should be overridden by all subclasses.

-
-

Note

-

Although the recipe for forward pass needs to be defined within -this function, one should call the Module instance afterwards -instead of this since the former takes care of running the -registered hooks while the latter silently ignores them.

-
-
- -
- -
-
-

Module contents

-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/build/html/genindex.html b/build/html/genindex.html deleted file mode 100644 index da7002d7..00000000 --- a/build/html/genindex.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - - Index — Bark 1 documentation - - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Index

- -
- A - | B - | C - | D - | F - | G - | I - | L - | M - | N - | O - | P - | S - | T - -
-

A

- - -
- -

B

- - - -
    -
  • - bark - -
  • -
  • - bark.api - -
  • -
  • - bark.generation - -
  • -
- -

C

- - - -
- -

D

- - -
- -

F

- - -
- -

G

- - - -
- -

I

- - - -
- -

L

- - - -
- -

M

- - -
- -

N

- - - -
- -

O

- - -
- -

P

- - -
- -

S

- - - -
- -

T

- - -
- - - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/build/html/index.html b/build/html/index.html deleted file mode 100644 index c9a2bc34..00000000 --- a/build/html/index.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - Welcome to Bark’s documentation! — Bark 1 documentation - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

Welcome to Bark’s documentation!

-
-
-
-
-

Indices and tables

- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/build/html/modules.html b/build/html/modules.html deleted file mode 100644 index 32d7c1ee..00000000 --- a/build/html/modules.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - bark — Bark 1 documentation - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build/html/objects.inv b/build/html/objects.inv deleted file mode 100644 index f3e1eef5..00000000 --- a/build/html/objects.inv +++ /dev/null @@ -1,6 +0,0 @@ -# Sphinx inventory version 2 -# Project: Bark -# Version: -# The remainder of this file is compressed using zlib. -xڝKn0>vkfh @Ĉل)R GNU$~ȅaQ\|Oran[tֽsQqP?S\ t*=\AZlz#IYS|{9v` dumINuTk6 AF5 5x?eUBOV9+F0?; <\Zp>m$C5sJYj 5udBN .!e|oic[++㍘3dy>$Lߊ> ݨubvY)@T&bCW0lO2]Obm57۪7y= 7)sO <ygi$yO7_?d.|p!!`|ɋڡI=yB/d[|bI -O]meEr k\ӪL!UCŏ%'x.iQOҶX-Y?ାwÂtŨ/Q9ޠhB,Fګ=Nn.k_ {", \ No newline at end of file diff --git a/build/html/py-modindex.html b/build/html/py-modindex.html deleted file mode 100644 index 1d5f95c7..00000000 --- a/build/html/py-modindex.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - Python Module Index — Bark 1 documentation - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Python Module Index

- -
- b -
- - - - - - - - - - - - - - - - - - - -
 
- b
- bark -
    - bark.api -
    - bark.generation -
    - bark.model -
    - bark.model_fine -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/build/html/search.html b/build/html/search.html deleted file mode 100644 index e0617ee2..00000000 --- a/build/html/search.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - Search — Bark 1 documentation - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

Search

- - - - -

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

- - -
- - - -
- - - -
- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/build/html/searchindex.js b/build/html/searchindex.js deleted file mode 100644 index e18b5c48..00000000 --- a/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"docnames": ["bark", "index", "modules"], "filenames": ["bark.rst", "index.rst", "modules.rst"], "titles": ["bark package", "Welcome to Bark\u2019s documentation!", "bark"], "terms": {"generate_audio": [0, 2], "text": 0, "str": 0, "history_prompt": 0, "dict": 0, "none": 0, "text_temp": 0, "float": 0, "0": 0, "7": 0, "waveform_temp": 0, "silent": 0, "bool": 0, "fals": 0, "output_ful": 0, "audio": 0, "arrai": 0, "from": 0, "input": 0, "paramet": 0, "turn": 0, "histori": 0, "choic": 0, "clone": 0, "temperatur": 0, "1": 0, "more": 0, "divers": 0, "conserv": 0, "disabl": 0, "progress": 0, "bar": 0, "return": 0, "full": 0, "us": 0, "prompt": 0, "numpi": 0, "sampl": 0, "frequenc": 0, "24khz": 0, "save_as_prompt": [0, 2], "filepath": 0, "full_gener": 0, "semantic_to_waveform": [0, 2], "semantic_token": 0, "ndarrai": 0, "temp": 0, "semant": 0, "token": 0, "output": 0, "text_to_semant": [0, 2], "fed": 0, "class": 0, "inferencecontext": [0, 2], "benchmark": 0, "base": 0, "object": 0, "autocast": [0, 2], "clean_model": [0, 2], "model_kei": 0, "codec_decod": [0, 2], "fine_token": 0, "quantiz": 0, "code": 0, "encodec": 0, "generate_coars": [0, 2], "x_semant": 0, "top_k": 0, "top_p": 0, "max_coarse_histori": 0, "630": 0, "sliding_window_len": 0, "60": 0, "use_kv_cach": 0, "coars": 0, "generate_fin": [0, 2], "x_coarse_gen": 0, "5": 0, "true": 0, "generate_text_semant": [0, 2], "min_eos_p": 0, "2": 0, "max_gen_duration_": 0, "allow_early_stop": 0, "load_codec_model": [0, 2], "use_gpu": 0, "force_reload": 0, "load_model": [0, 2], "use_smal": 0, "model_typ": 0, "preload_model": [0, 2], "text_use_gpu": 0, "text_use_smal": 0, "coarse_use_gpu": 0, "coarse_use_smal": 0, "fine_use_gpu": 0, "fine_use_smal": 0, "codec_use_gpu": 0, "load": 0, "all": 0, "necessari": 0, "pipelin": 0, "much": 0, "thi": 0, "i": 0, "adapt": 0, "andrej": 0, "karpathi": 0, "": 0, "nanogpt": 0, "http": 0, "github": 0, "com": 0, "block": [0, 2], "config": 0, "layer_idx": 0, "forward": [0, 2], "x": 0, "past_kv": 0, "use_cach": 0, "defin": 0, "comput": 0, "perform": 0, "everi": 0, "call": 0, "should": 0, "overridden": 0, "subclass": 0, "although": 0, "recip": 0, "pass": 0, "need": 0, "within": 0, "function": 0, "one": 0, "instanc": 0, "afterward": 0, "instead": 0, "sinc": 0, "former": 0, "take": 0, "care": 0, "run": 0, "regist": 0, "hook": 0, "while": 0, "latter": 0, "ignor": 0, "them": 0, "causalselfattent": [0, 2], "gpt": [0, 2], "idx": 0, "merge_context": 0, "position_id": 0, "get_num_param": [0, 2], "non_embed": 0, "number": 0, "For": 0, "non": 0, "embed": 0, "count": 0, "default": 0, "posit": 0, "get": 0, "subtract": 0, "The": 0, "would": 0, "too": 0, "except": 0, "due": 0, "share": 0, "param": 0, "ar": 0, "actual": 0, "weight": 0, "final": 0, "layer": 0, "so": 0, "we": 0, "includ": 0, "gptconfig": [0, 2], "block_siz": [0, 2], "int": 0, "1024": 0, "input_vocab_s": [0, 2], "10048": 0, "output_vocab_s": [0, 2], "n_layer": [0, 2], "12": 0, "n_head": [0, 2], "n_embd": [0, 2], "768": 0, "dropout": [0, 2], "bia": [0, 2], "layernorm": [0, 2], "ndim": 0, "an": 0, "option": 0, "pytorch": 0, "doesn": 0, "t": 0, "support": 0, "simpli": 0, "mlp": [0, 2], "fineblock": [0, 2], "finegpt": [0, 2], "pred_idx": 0, "finegptconfig": [0, 2], "n_codes_tot": [0, 2], "8": 0, "n_codes_given": [0, 2], "noncausalselfattent": [0, 2], "index": 1, "modul": [1, 2], "search": 1, "page": 1, "packag": 2, "submodul": 2, "api": 2, "gener": 2, "model": 2, "model_fin": 2, "content": 2}, "objects": {"": [[0, 0, 0, "-", "bark"]], "bark": [[0, 0, 0, "-", "api"], [0, 0, 0, "-", "generation"], [0, 0, 0, "-", "model"], [0, 0, 0, "-", "model_fine"]], "bark.api": [[0, 1, 1, "", "generate_audio"], [0, 1, 1, "", "save_as_prompt"], [0, 1, 1, "", "semantic_to_waveform"], [0, 1, 1, "", "text_to_semantic"]], "bark.generation": [[0, 2, 1, "", "InferenceContext"], [0, 1, 1, "", "autocast"], [0, 1, 1, "", "clean_models"], [0, 1, 1, "", "codec_decode"], [0, 1, 1, "", "generate_coarse"], [0, 1, 1, "", "generate_fine"], [0, 1, 1, "", "generate_text_semantic"], [0, 1, 1, "", "load_codec_model"], [0, 1, 1, "", "load_model"], [0, 1, 1, "", "preload_models"]], "bark.model": [[0, 2, 1, "", "Block"], [0, 2, 1, "", "CausalSelfAttention"], [0, 2, 1, "", "GPT"], [0, 2, 1, "", "GPTConfig"], [0, 2, 1, "", "LayerNorm"], [0, 2, 1, "", "MLP"]], "bark.model.Block": [[0, 3, 1, "", "forward"]], "bark.model.CausalSelfAttention": [[0, 3, 1, "", "forward"]], "bark.model.GPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model.GPTConfig": [[0, 4, 1, "", "bias"], [0, 4, 1, "", "block_size"], [0, 4, 1, "", "dropout"], [0, 4, 1, "", "input_vocab_size"], [0, 4, 1, "", "n_embd"], [0, 4, 1, "", "n_head"], [0, 4, 1, "", "n_layer"], [0, 4, 1, "", "output_vocab_size"]], "bark.model.LayerNorm": [[0, 3, 1, "", "forward"]], "bark.model.MLP": [[0, 3, 1, "", "forward"]], "bark.model_fine": [[0, 2, 1, "", "FineBlock"], [0, 2, 1, "", "FineGPT"], [0, 2, 1, "", "FineGPTConfig"], [0, 2, 1, "", "NonCausalSelfAttention"]], "bark.model_fine.FineBlock": [[0, 3, 1, "", "forward"]], "bark.model_fine.FineGPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model_fine.FineGPTConfig": [[0, 4, 1, "", "n_codes_given"], [0, 4, 1, "", "n_codes_total"]], "bark.model_fine.NonCausalSelfAttention": [[0, 3, 1, "", "forward"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"bark": [0, 1, 2], "packag": 0, "submodul": 0, "api": 0, "modul": 0, "gener": 0, "model": 0, "model_fin": 0, "content": 0, "welcom": 1, "": 1, "document": 1, "indic": 1, "tabl": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"bark package": [[0, "bark-package"]], "Submodules": [[0, "submodules"]], "bark.api module": [[0, "module-bark.api"]], "bark.generation module": [[0, "module-bark.generation"]], "bark.model module": [[0, "module-bark.model"]], "bark.model_fine module": [[0, "module-bark.model_fine"]], "Module contents": [[0, "module-bark"]], "Welcome to Bark\u2019s documentation!": [[1, "welcome-to-bark-s-documentation"]], "Indices and tables": [[1, "indices-and-tables"]], "bark": [[2, "bark"]]}, "indexentries": {"block (class in bark.model)": [[0, "bark.model.Block"]], "causalselfattention (class in bark.model)": [[0, "bark.model.CausalSelfAttention"]], "fineblock (class in bark.model_fine)": [[0, "bark.model_fine.FineBlock"]], "finegpt (class in bark.model_fine)": [[0, "bark.model_fine.FineGPT"]], "finegptconfig (class in bark.model_fine)": [[0, "bark.model_fine.FineGPTConfig"]], "gpt (class in bark.model)": [[0, "bark.model.GPT"]], "gptconfig (class in bark.model)": [[0, "bark.model.GPTConfig"]], "inferencecontext (class in bark.generation)": [[0, "bark.generation.InferenceContext"]], "layernorm (class in bark.model)": [[0, "bark.model.LayerNorm"]], "mlp (class in bark.model)": [[0, "bark.model.MLP"]], "noncausalselfattention (class in bark.model_fine)": [[0, "bark.model_fine.NonCausalSelfAttention"]], "autocast() (in module bark.generation)": [[0, "bark.generation.autocast"]], "bark": [[0, "module-bark"]], "bark.api": [[0, "module-bark.api"]], "bark.generation": [[0, "module-bark.generation"]], "bark.model": [[0, "module-bark.model"]], "bark.model_fine": [[0, "module-bark.model_fine"]], "bias (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.bias"]], "block_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.block_size"]], "clean_models() (in module bark.generation)": [[0, "bark.generation.clean_models"]], "codec_decode() (in module bark.generation)": [[0, "bark.generation.codec_decode"]], "dropout (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.dropout"]], "forward() (bark.model.block method)": [[0, "bark.model.Block.forward"]], "forward() (bark.model.causalselfattention method)": [[0, "bark.model.CausalSelfAttention.forward"]], "forward() (bark.model.gpt method)": [[0, "bark.model.GPT.forward"]], "forward() (bark.model.layernorm method)": [[0, "bark.model.LayerNorm.forward"]], "forward() (bark.model.mlp method)": [[0, "bark.model.MLP.forward"]], "forward() (bark.model_fine.fineblock method)": [[0, "bark.model_fine.FineBlock.forward"]], "forward() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.forward"]], "forward() (bark.model_fine.noncausalselfattention method)": [[0, "bark.model_fine.NonCausalSelfAttention.forward"]], "generate_audio() (in module bark.api)": [[0, "bark.api.generate_audio"]], "generate_coarse() (in module bark.generation)": [[0, "bark.generation.generate_coarse"]], "generate_fine() (in module bark.generation)": [[0, "bark.generation.generate_fine"]], "generate_text_semantic() (in module bark.generation)": [[0, "bark.generation.generate_text_semantic"]], "get_num_params() (bark.model.gpt method)": [[0, "bark.model.GPT.get_num_params"]], "get_num_params() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.get_num_params"]], "input_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.input_vocab_size"]], "load_codec_model() (in module bark.generation)": [[0, "bark.generation.load_codec_model"]], "load_model() (in module bark.generation)": [[0, "bark.generation.load_model"]], "module": [[0, "module-bark"], [0, "module-bark.api"], [0, "module-bark.generation"], [0, "module-bark.model"], [0, "module-bark.model_fine"]], "n_codes_given (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_given"]], "n_codes_total (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_total"]], "n_embd (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_embd"]], "n_head (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_head"]], "n_layer (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_layer"]], "output_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.output_vocab_size"]], "preload_models() (in module bark.generation)": [[0, "bark.generation.preload_models"]], "save_as_prompt() (in module bark.api)": [[0, "bark.api.save_as_prompt"]], "semantic_to_waveform() (in module bark.api)": [[0, "bark.api.semantic_to_waveform"]], "text_to_semantic() (in module bark.api)": [[0, "bark.api.text_to_semantic"]]}}) \ No newline at end of file diff --git a/make.bat b/make.bat deleted file mode 100644 index feb2d4ea..00000000 --- a/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=docs -set BUILDDIR=build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/suno_bark.egg-info/PKG-INFO b/suno_bark.egg-info/PKG-INFO new file mode 100644 index 00000000..aed8351a --- /dev/null +++ b/suno_bark.egg-info/PKG-INFO @@ -0,0 +1,174 @@ +Metadata-Version: 2.1 +Name: suno-bark +Version: 0.0.1a0 +Summary: Bark text to audio model +Author-email: Suno Inc +Project-URL: source, https://github.com/suno-ai/bark +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Provides-Extra: dev +License-File: LICENSE.md + +# 🐶 BARK AI: but with the ability to use voice cloning on custom audio samples + +If you want to clone a voice just follow the `clone_voice.ipynb` notebook. If you want to generate audio from text, follow the `generate.ipynb` notebook. + +To create a voice clone sample, you need an audio sample of around 5-6 seconds + +You will get the best results by making generations with your cloned voice until you find one that is really close to the source. Then use that as the new history prompt (comes from the model so should theoretically be more consistent) + +- [BARK text to speech @ SERP AI](https://serp.ai/tools/bark-text-to-speech-ai-voice-clone-app/) + +# Shoutouts +- Huge shoutout to [gitmylo](https://github.com/gitmylo/bark-voice-cloning-HuBERT-quantizer/) for the solution to the semantic token generation for better voice clones and finetunes + +------------------------------------------------------------------- +# Original README.md +## 🤖 Usage + +```python +from bark import SAMPLE_RATE, generate_audio, preload_models +from IPython.display import Audio + +# download and load all models +preload_models() + +# generate audio from text +text_prompt = """ + Hello, my name is Serpy. And, uh — and I like pizza. [laughs] + But I also have other interests such as playing tic tac toe. +""" +audio_array = generate_audio(text_prompt) + +# play text in notebook +Audio(audio_array, rate=SAMPLE_RATE) +``` + +[pizza.webm](https://user-images.githubusercontent.com/5068315/230490503-417e688d-5115-4eee-9550-b46a2b465ee3.webm) + + +To save `audio_array` as a WAV file: + +```python +from scipy.io.wavfile import write as write_wav + +write_wav("/path/to/audio.wav", SAMPLE_RATE, audio_array) +``` + +### 🌎 Foreign Language + +Bark supports various languages out-of-the-box and automatically determines language from input text. When prompted with code-switched text, Bark will attempt to employ the native accent for the respective languages. English quality is best for the time being, and we expect other languages to further improve with scaling. + +```python +text_prompt = """ + Buenos días Miguel. Tu colega piensa que tu alemán es extremadamente malo. + But I suppose your english isn't terrible. +""" +audio_array = generate_audio(text_prompt) +``` + +[miguel.webm](https://user-images.githubusercontent.com/5068315/230684752-10baadfe-1e7c-46a2-8323-43282aef2c8c.webm) + +### 🎶 Music + +Bark can generate all types of audio, and, in principle, doesn't see a difference between speech and music. Sometimes Bark chooses to generate text as music, but you can help it out by adding music notes around your lyrics. + +```python +text_prompt = """ + ♪ In the jungle, the mighty jungle, the lion barks tonight ♪ +""" +audio_array = generate_audio(text_prompt) +``` + +[lion.webm](https://user-images.githubusercontent.com/5068315/230684766-97f5ea23-ad99-473c-924b-66b6fab24289.webm) + +### 🎤 Voice Presets and Voice/Audio Cloning + +Bark has the capability to fully clone voices - including tone, pitch, emotion and prosody. The model also attempts to preserve music, ambient noise, etc. from input audio. However, to mitigate misuse of this technology, we limit the audio history prompts to a limited set of Suno-provided, fully synthetic options to choose from for each language. Specify following the pattern: `{lang_code}_speaker_{0-9}`. + +```python +text_prompt = """ + I have a silky smooth voice, and today I will tell you about + the exercise regimen of the common sloth. +""" +audio_array = generate_audio(text_prompt, history_prompt="en_speaker_1") +``` + + +[sloth.webm](https://user-images.githubusercontent.com/5068315/230684883-a344c619-a560-4ff5-8b99-b4463a34487b.webm) + +*Note: since Bark recognizes languages automatically from input text, it is possible to use for example a german history prompt with english text. This usually leads to english audio with a german accent.* + +### 👥 Speaker Prompts + +You can provide certain speaker prompts such as NARRATOR, MAN, WOMAN, etc. Please note that these are not always respected, especially if a conflicting audio history prompt is given. + +```python +text_prompt = """ + WOMAN: I would like an oatmilk latte please. + MAN: Wow, that's expensive! +""" +audio_array = generate_audio(text_prompt) +``` + +[latte.webm](https://user-images.githubusercontent.com/5068315/230684864-12d101a1-a726-471d-9d56-d18b108efcb8.webm) + + +## 💻 Installation + +``` +pip install git+https://github.com/suno-ai/bark.git +``` + +or + +``` +git clone https://github.com/suno-ai/bark +cd bark && pip install . +``` + +## 🛠️ Hardware and Inference Speed + +Bark has been tested and works on both CPU and GPU (`pytorch 2.0+`, CUDA 11.7 and CUDA 12.0). +Running Bark requires running >100M parameter transformer models. +On modern GPUs and PyTorch nightly, Bark can generate audio in roughly realtime. On older GPUs, default colab, or CPU, inference time might be 10-100x slower. + +## ⚙️ Details + +Similar to [Vall-E](https://arxiv.org/abs/2301.02111) and some other amazing work in the field, Bark uses GPT-style +models to generate audio from scratch. Different from Vall-E, the initial text prompt is embedded into high-level semantic tokens without the use of phonemes. It can therefore generalize to arbitrary instructions beyond speech that occur in the training data, such as music lyrics, sound effects or other non-speech sounds. A subsequent second model is used to convert the generated semantic tokens into audio codec tokens to generate the full waveform. To enable the community to use Bark via public code we used the fantastic +[EnCodec codec](https://github.com/facebookresearch/encodec) from Facebook to act as an audio representation. + +Below is a list of some known non-speech sounds + +- `[laughter]` +- `[laughs]` +- `[sighs]` +- `[music]` +- `[gasps]` +- `[clears throat]` +- `—` or `...` for hesitations +- `♪` for song lyrics +- capitalization for emphasis of a word +- `MAN/WOMAN:` for bias towards speaker + +**Supported Languages** + +| Language | Status | +| --- | --- | +| English (en) | ✅ | +| German (de) | ✅ | +| Spanish (es) | ✅ | +| French (fr) | ✅ | +| Hindi (hi) | ✅ | +| Italian (it) | ✅ | +| Japanese (ja) | ✅ | +| Korean (ko) | ✅ | +| Polish (pl) | ✅ | +| Portuguese (pt) | ✅ | +| Russian (ru) | ✅ | +| Turkish (tr) | ✅ | +| Chinese, simplified (zh) | ✅ | +| Arabic | Coming soon! | +| Bengali | Coming soon! | +| Telugu | Coming soon! | diff --git a/suno_bark.egg-info/SOURCES.txt b/suno_bark.egg-info/SOURCES.txt new file mode 100644 index 00000000..fc06b883 --- /dev/null +++ b/suno_bark.egg-info/SOURCES.txt @@ -0,0 +1,155 @@ +LICENSE.md +README.md +pyproject.toml +setup.py +bark/__init__.py +bark/api.py +bark/generation.py +bark/model.py +bark/model_fine.py +bark/assets/prompts/announcer.npz +bark/assets/prompts/de_speaker_0.npz +bark/assets/prompts/de_speaker_1.npz +bark/assets/prompts/de_speaker_2.npz +bark/assets/prompts/de_speaker_3.npz +bark/assets/prompts/de_speaker_4.npz +bark/assets/prompts/de_speaker_5.npz +bark/assets/prompts/de_speaker_6.npz +bark/assets/prompts/de_speaker_7.npz +bark/assets/prompts/de_speaker_8.npz +bark/assets/prompts/de_speaker_9.npz +bark/assets/prompts/en_speaker_0.npz +bark/assets/prompts/en_speaker_1.npz +bark/assets/prompts/en_speaker_2.npz +bark/assets/prompts/en_speaker_3.npz +bark/assets/prompts/en_speaker_4.npz +bark/assets/prompts/en_speaker_5.npz +bark/assets/prompts/en_speaker_6.npz +bark/assets/prompts/en_speaker_7.npz +bark/assets/prompts/en_speaker_8.npz +bark/assets/prompts/en_speaker_9.npz +bark/assets/prompts/es_speaker_0.npz +bark/assets/prompts/es_speaker_1.npz +bark/assets/prompts/es_speaker_2.npz +bark/assets/prompts/es_speaker_3.npz +bark/assets/prompts/es_speaker_4.npz +bark/assets/prompts/es_speaker_5.npz +bark/assets/prompts/es_speaker_6.npz +bark/assets/prompts/es_speaker_7.npz +bark/assets/prompts/es_speaker_8.npz +bark/assets/prompts/es_speaker_9.npz +bark/assets/prompts/fr_speaker_0.npz +bark/assets/prompts/fr_speaker_1.npz +bark/assets/prompts/fr_speaker_2.npz +bark/assets/prompts/fr_speaker_3.npz +bark/assets/prompts/fr_speaker_4.npz +bark/assets/prompts/fr_speaker_5.npz +bark/assets/prompts/fr_speaker_6.npz +bark/assets/prompts/fr_speaker_7.npz +bark/assets/prompts/fr_speaker_8.npz +bark/assets/prompts/fr_speaker_9.npz +bark/assets/prompts/hi_speaker_0.npz +bark/assets/prompts/hi_speaker_1.npz +bark/assets/prompts/hi_speaker_2.npz +bark/assets/prompts/hi_speaker_3.npz +bark/assets/prompts/hi_speaker_4.npz +bark/assets/prompts/hi_speaker_5.npz +bark/assets/prompts/hi_speaker_6.npz +bark/assets/prompts/hi_speaker_7.npz +bark/assets/prompts/hi_speaker_8.npz +bark/assets/prompts/hi_speaker_9.npz +bark/assets/prompts/it_speaker_0.npz +bark/assets/prompts/it_speaker_1.npz +bark/assets/prompts/it_speaker_2.npz +bark/assets/prompts/it_speaker_3.npz +bark/assets/prompts/it_speaker_4.npz +bark/assets/prompts/it_speaker_5.npz +bark/assets/prompts/it_speaker_6.npz +bark/assets/prompts/it_speaker_7.npz +bark/assets/prompts/it_speaker_8.npz +bark/assets/prompts/it_speaker_9.npz +bark/assets/prompts/ja_speaker_0.npz +bark/assets/prompts/ja_speaker_1.npz +bark/assets/prompts/ja_speaker_2.npz +bark/assets/prompts/ja_speaker_3.npz +bark/assets/prompts/ja_speaker_4.npz +bark/assets/prompts/ja_speaker_5.npz +bark/assets/prompts/ja_speaker_6.npz +bark/assets/prompts/ja_speaker_7.npz +bark/assets/prompts/ja_speaker_8.npz +bark/assets/prompts/ja_speaker_9.npz +bark/assets/prompts/ko_speaker_0.npz +bark/assets/prompts/ko_speaker_1.npz +bark/assets/prompts/ko_speaker_2.npz +bark/assets/prompts/ko_speaker_3.npz +bark/assets/prompts/ko_speaker_4.npz +bark/assets/prompts/ko_speaker_5.npz +bark/assets/prompts/ko_speaker_6.npz +bark/assets/prompts/ko_speaker_7.npz +bark/assets/prompts/ko_speaker_8.npz +bark/assets/prompts/ko_speaker_9.npz +bark/assets/prompts/pl_speaker_0.npz +bark/assets/prompts/pl_speaker_1.npz +bark/assets/prompts/pl_speaker_2.npz +bark/assets/prompts/pl_speaker_3.npz +bark/assets/prompts/pl_speaker_4.npz +bark/assets/prompts/pl_speaker_5.npz +bark/assets/prompts/pl_speaker_6.npz +bark/assets/prompts/pl_speaker_7.npz +bark/assets/prompts/pl_speaker_8.npz +bark/assets/prompts/pl_speaker_9.npz +bark/assets/prompts/pt_speaker_0.npz +bark/assets/prompts/pt_speaker_1.npz +bark/assets/prompts/pt_speaker_2.npz +bark/assets/prompts/pt_speaker_3.npz +bark/assets/prompts/pt_speaker_4.npz +bark/assets/prompts/pt_speaker_5.npz +bark/assets/prompts/pt_speaker_6.npz +bark/assets/prompts/pt_speaker_7.npz +bark/assets/prompts/pt_speaker_8.npz +bark/assets/prompts/pt_speaker_9.npz +bark/assets/prompts/ru_speaker_0.npz +bark/assets/prompts/ru_speaker_1.npz +bark/assets/prompts/ru_speaker_2.npz +bark/assets/prompts/ru_speaker_3.npz +bark/assets/prompts/ru_speaker_4.npz +bark/assets/prompts/ru_speaker_5.npz +bark/assets/prompts/ru_speaker_6.npz +bark/assets/prompts/ru_speaker_7.npz +bark/assets/prompts/ru_speaker_8.npz +bark/assets/prompts/ru_speaker_9.npz +bark/assets/prompts/speaker_0.npz +bark/assets/prompts/speaker_1.npz +bark/assets/prompts/speaker_2.npz +bark/assets/prompts/speaker_3.npz +bark/assets/prompts/speaker_4.npz +bark/assets/prompts/speaker_5.npz +bark/assets/prompts/speaker_6.npz +bark/assets/prompts/speaker_7.npz +bark/assets/prompts/speaker_8.npz +bark/assets/prompts/speaker_9.npz +bark/assets/prompts/tr_speaker_0.npz +bark/assets/prompts/tr_speaker_1.npz +bark/assets/prompts/tr_speaker_2.npz +bark/assets/prompts/tr_speaker_3.npz +bark/assets/prompts/tr_speaker_4.npz +bark/assets/prompts/tr_speaker_5.npz +bark/assets/prompts/tr_speaker_6.npz +bark/assets/prompts/tr_speaker_7.npz +bark/assets/prompts/tr_speaker_8.npz +bark/assets/prompts/tr_speaker_9.npz +bark/assets/prompts/zh_speaker_0.npz +bark/assets/prompts/zh_speaker_1.npz +bark/assets/prompts/zh_speaker_2.npz +bark/assets/prompts/zh_speaker_3.npz +bark/assets/prompts/zh_speaker_4.npz +bark/assets/prompts/zh_speaker_5.npz +bark/assets/prompts/zh_speaker_6.npz +bark/assets/prompts/zh_speaker_7.npz +bark/assets/prompts/zh_speaker_8.npz +bark/assets/prompts/zh_speaker_9.npz +suno_bark.egg-info/PKG-INFO +suno_bark.egg-info/SOURCES.txt +suno_bark.egg-info/dependency_links.txt +suno_bark.egg-info/requires.txt +suno_bark.egg-info/top_level.txt \ No newline at end of file diff --git a/suno_bark.egg-info/dependency_links.txt b/suno_bark.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/suno_bark.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/suno_bark.egg-info/requires.txt b/suno_bark.egg-info/requires.txt new file mode 100644 index 00000000..c952cb33 --- /dev/null +++ b/suno_bark.egg-info/requires.txt @@ -0,0 +1,27 @@ +boto3 +encodec +funcy +numpy +scipy +tokenizers +torch +tqdm +transformers +sphinx + +[dev] +bandit +black +codecov +flake8 +huggingface-hub +hypothesis<7,>=6.14 +isort<6,>=5.0.0 +jupyter +mypy +nbconvert +nbformat +pydocstyle +pylint +pytest +pytest-cov diff --git a/suno_bark.egg-info/top_level.txt b/suno_bark.egg-info/top_level.txt new file mode 100644 index 00000000..16da1460 --- /dev/null +++ b/suno_bark.egg-info/top_level.txt @@ -0,0 +1 @@ +bark From cd97d77139bc9601fe3c203e9619ad22bdce03b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 14:01:55 -0300 Subject: [PATCH 14/23] add build directory to generate doc --- build/html/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 build/html/.gitkeep diff --git a/build/html/.gitkeep b/build/html/.gitkeep new file mode 100644 index 00000000..e69de29b From f43bf9640791cbb9a0c434303e06f719f57aa283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 16:51:08 -0300 Subject: [PATCH 15/23] feat: create unit test pipeline --- ...build-push-image.yml => build-push-image.yml} | 0 ...te-sphinx-doc.yml => generate-sphinx-doc.yml} | 0 .github/workflows/unit-test.yml | 16 ++++++++++++++++ 3 files changed, 16 insertions(+) rename .github/workflows/{github-actions-build-push-image.yml => build-push-image.yml} (100%) rename .github/workflows/{github-actions-generate-sphinx-doc.yml => generate-sphinx-doc.yml} (100%) create mode 100644 .github/workflows/unit-test.yml diff --git a/.github/workflows/github-actions-build-push-image.yml b/.github/workflows/build-push-image.yml similarity index 100% rename from .github/workflows/github-actions-build-push-image.yml rename to .github/workflows/build-push-image.yml diff --git a/.github/workflows/github-actions-generate-sphinx-doc.yml b/.github/workflows/generate-sphinx-doc.yml similarity index 100% rename from .github/workflows/github-actions-generate-sphinx-doc.yml rename to .github/workflows/generate-sphinx-doc.yml diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml new file mode 100644 index 00000000..98e62376 --- /dev/null +++ b/.github/workflows/unit-test.yml @@ -0,0 +1,16 @@ +steps: +- uses: actions/checkout@v3 +- name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11.3' +- name: Install dependencies + run: | + apt update -y + apt install -y python3-pip + + pip3 install . + pip3 install -e '.[dev]' +- name: Test with pytest + run: | + pytest From 32ee387ff12d29ff41b9906e73fc93401f864bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 16:53:35 -0300 Subject: [PATCH 16/23] fix: update unit test pipeline --- .github/workflows/unit-test.yml | 40 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 98e62376..2d319d4d 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -1,16 +1,26 @@ -steps: -- uses: actions/checkout@v3 -- name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.11.3' -- name: Install dependencies - run: | - apt update -y - apt install -y python3-pip +name: Unit Test +on: + push: + branches: + - main + - configure-pipe - pip3 install . - pip3 install -e '.[dev]' -- name: Test with pytest - run: | - pytest +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11.3' + - name: Install dependencies + run: | + apt update -y + apt install -y python3-pip + + pip3 install . + pip3 install -e '.[dev]' + - name: Test with pytest + run: | + pytest From 06cfc68b46c12f7880508942a9836e26fccab177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 16:58:36 -0300 Subject: [PATCH 17/23] fix: sudo in apt get --- .github/workflows/unit-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 2d319d4d..86872bff 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -16,8 +16,8 @@ jobs: python-version: '3.11.3' - name: Install dependencies run: | - apt update -y - apt install -y python3-pip + sudo apt update -y + sudo apt install -y python3-pip pip3 install . pip3 install -e '.[dev]' From 12e296ae94cb96f6e8e5f44fc84cde79f6f1ade1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 17:07:46 -0300 Subject: [PATCH 18/23] feat: first test --- bark/test_sample.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 bark/test_sample.py diff --git a/bark/test_sample.py b/bark/test_sample.py new file mode 100644 index 00000000..dcc82513 --- /dev/null +++ b/bark/test_sample.py @@ -0,0 +1,5 @@ +def func(x): + return x + 1 + +def test_answer(): + assert func(4) == 5 \ No newline at end of file From 9bf6969e51c6946c7be8f6a0cbb9de95a8b80551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 17:13:31 -0300 Subject: [PATCH 19/23] fix: adjust directory of html build documentation --- .github/workflows/generate-sphinx-doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate-sphinx-doc.yml b/.github/workflows/generate-sphinx-doc.yml index b369091b..4ab540d5 100644 --- a/.github/workflows/generate-sphinx-doc.yml +++ b/.github/workflows/generate-sphinx-doc.yml @@ -16,4 +16,4 @@ jobs: - uses: actions/upload-artifact@v1 with: name: DocumentationHTML - path: build/html/ \ No newline at end of file + path: docs/build/html/ \ No newline at end of file From 2029f97b5d5e05b2b6fe74fef30359892e4a6193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 17:16:21 -0300 Subject: [PATCH 20/23] fix: sphinx generation doc --- docs/build/doctrees/bark.doctree | Bin 0 -> 156718 bytes docs/build/doctrees/environment.pickle | Bin 0 -> 266473 bytes docs/build/doctrees/index.doctree | Bin 0 -> 4969 bytes docs/build/doctrees/modules.doctree | Bin 0 -> 2722 bytes docs/build/html/.buildinfo | 4 + docs/build/html/_sources/bark.rst.txt | 45 + docs/build/html/_sources/index.rst.txt | 20 + docs/build/html/_sources/modules.rst.txt | 7 + docs/build/html/_static/alabaster.css | 703 ++++++++++++++ docs/build/html/_static/basic.css | 903 ++++++++++++++++++ docs/build/html/_static/custom.css | 1 + docs/build/html/_static/doctools.js | 156 +++ .../html/_static/documentation_options.js | 14 + docs/build/html/_static/file.png | Bin 0 -> 286 bytes docs/build/html/_static/language_data.js | 199 ++++ docs/build/html/_static/minus.png | Bin 0 -> 90 bytes docs/build/html/_static/plus.png | Bin 0 -> 90 bytes docs/build/html/_static/pygments.css | 83 ++ docs/build/html/_static/searchtools.js | 566 +++++++++++ docs/build/html/_static/sphinx_highlight.js | 144 +++ docs/build/html/bark.html | 483 ++++++++++ docs/build/html/genindex.html | 352 +++++++ docs/build/html/index.html | 109 +++ docs/build/html/modules.html | 184 ++++ docs/build/html/objects.inv | 6 + docs/build/html/py-modindex.html | 133 +++ docs/build/html/search.html | 117 +++ docs/build/html/searchindex.js | 1 + 28 files changed, 4230 insertions(+) create mode 100644 docs/build/doctrees/bark.doctree create mode 100644 docs/build/doctrees/environment.pickle create mode 100644 docs/build/doctrees/index.doctree create mode 100644 docs/build/doctrees/modules.doctree create mode 100644 docs/build/html/.buildinfo create mode 100644 docs/build/html/_sources/bark.rst.txt create mode 100644 docs/build/html/_sources/index.rst.txt create mode 100644 docs/build/html/_sources/modules.rst.txt create mode 100644 docs/build/html/_static/alabaster.css create mode 100644 docs/build/html/_static/basic.css create mode 100644 docs/build/html/_static/custom.css create mode 100644 docs/build/html/_static/doctools.js create mode 100644 docs/build/html/_static/documentation_options.js create mode 100644 docs/build/html/_static/file.png create mode 100644 docs/build/html/_static/language_data.js create mode 100644 docs/build/html/_static/minus.png create mode 100644 docs/build/html/_static/plus.png create mode 100644 docs/build/html/_static/pygments.css create mode 100644 docs/build/html/_static/searchtools.js create mode 100644 docs/build/html/_static/sphinx_highlight.js create mode 100644 docs/build/html/bark.html create mode 100644 docs/build/html/genindex.html create mode 100644 docs/build/html/index.html create mode 100644 docs/build/html/modules.html create mode 100644 docs/build/html/objects.inv create mode 100644 docs/build/html/py-modindex.html create mode 100644 docs/build/html/search.html create mode 100644 docs/build/html/searchindex.js diff --git a/docs/build/doctrees/bark.doctree b/docs/build/doctrees/bark.doctree new file mode 100644 index 0000000000000000000000000000000000000000..005e0b944998d76e22da56ce5c2872b9ed4c3c23 GIT binary patch literal 156718 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 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d844d8064e08416bee9b04e70b35080c66c1b9ed GIT binary patch literal 4969 zcmds5-Hsbc6`o{bd+hn2Yyzv@XnT=%Gg)FgKcGc(gO=q6Mhp^K7PttVa(CHP<91i4 zt9r(Bf!LJ@%0Nkgwik&zcme5bnGZhOcih&x8|$W?XfRMq*u z^XHEmpML-Piu<$MIuSCS_E;FkD&#u1YoQ9V36D+wNq*s?{d)%wzj*NQUGKrY2M>Fl@2SiSSnRQoCB`#C zYNyh}Es}^E9-Vncd1tu37s;`VM|ZtJW;|&;EmRhT9y4CVahFb@V#8z%9o$QmGTvjO z0+Vw7*b8OK10zp(FBh#xxoF#KAMh!e=>O?yPjkZCHWLPLO)fU{fY}Z+CY3N5$U$US zm7xakwiQH7YfR#MBW9E0+gg|<^TB`xogWyh-jUXtj(N_gBYcJ+rU z9d~I*e*pe}d433aD*F9X0|Oq9!e# zxwov?4S02k;O$Sb`=UVGHf8Lbw|0?Y@2*{|&dTSn|K;;vzi+R(L+q+HAy|(8T{@I6 z6C?*xzgQ+#UC1`E546a|H<3f>>je2F7r(JBjLcbrP`FB}?K=MRX%fjm8gQGIPgxr0 z&)hyF!4XGznm>g2{j-wad$@+Z>>4EelbZ04UnKk^X#9ANH<&M;&IniHH&K8CfwRQ# zr`5Xny+iEhOXE+M#z3XgP($U~@Tma$kOCS{EIS9pg7wOgQuR-vy{~dyVUiPr(Kyci=vVwH< zvTgwss;k#Acm-zt$7QG2F(Bc;y-4^X2J<9PMffUu+h!3Fb9?0-mymy0b2=A47gER` z{D&fU7m>SLM(%mms8;K7{n9*vpnTcY$~sEylL@ZatsqOO$n(qjBfC+}xG;KT*EBZ< z5f?4NE~PeC;tx}oz7ZCiAF?PzuBqa!ZK}*9naPht|H!rxa(T*(N^=ZCl=i6PCkY1Y z#ev8g@fgESIn2@sqfI1bpNd9W#la0q@MpQ*8=@SKmEpC;!z*@^Dl}9G{uG7YB*)B_ zMn#hNWe1|6^0i`yN1S>R?NbftSEVaXEH{+3EXf( z8D=tF2{mjZJ^|tJwg72hyRdXkOT%f&?X9JiB^AftB`4b|^v>^4?S6f6VQI77 zp*Lt4O29;stK&B#7LPJE;;?v#WOfx*oV|`#Nu{BW>JK>^$54rQWSeNOhIl3{B10by zz)((e(X?AEGs>S&*{c%t+6=Qv;?F1u!@3EH;t{ofL<+av46GY#f`2}hXr6`2N5287 z9i&yIxnJMuSP~fjL~2=3blVT5rs4??DR0@TTtn>J4LnA}8H&;ltSQC(S-E?YzTpt` zC{*YI8`2g6@^uuZvmq$DOa2As#3K+fk`pBSZ|vN*TM18mssiAZ2nx74N}dFK$KA;} z>}Q2Bi9YD}F|B*anGq`PsdUuO?G2K27l5RXdJFIv*Jkmg`_{cLz@A&_Fj!JgGjsKC zSL)%cj3_(iX-{%9bY~y{^o5y3IIN9O1uqJzvR|{ez{!a}bI;iW{G!u4w>$a_UG>x# zawH;rT$iPY`Wt$J=H7pj!LKz8b={4Np&zM$m7T<`K%g=V0DR$Zu(C5Dc8{|J)e`*z z;aY<-4xo>~jEsliKouDFC{*Zdup}oZMBYfT!W*go8|UB*nvM`Ie1{7y0=XRCHCpqdSyH@jMf+QY$IMT_-2v%x>0Ubb2>Yjyld0b&47C)=I8;Kz*i=!!H7WeKJtdj2TY! zm8Hpzku_Qpl3&NnV4iuUc*T*BDwB9f0KY`Vr x=HG%}pzDB#;nxcdCKLzGLdwGQ`fS>Pxn8!aAkTg}{Tm?|byolY literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/modules.doctree b/docs/build/doctrees/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..94a53d1898fb05d2f5ef6154bce22cd591d0daf1 GIT binary patch literal 2722 zcmZ8jOK%%D5O!?qX-R&hDGDTRQ50zsG_s1KhoYwzJsS0)XanRBET|r6j4+!ym5pAKVpdgQ_p@bOFPpgQ`0)Y*+QGuG@Y2Gbf;Is@#&=& zIh*EED>g$?c2;QWC9`M7BGu2&cl{iY^mAR5+AF#RT8$^)L4-PYhHV4d?0tdE`Ii9o zEBv0~_YA)m_&pB2#t#qys76#c0Kuvd|3nf-Lgms^wh)L0NbsLX=oe&7S?PE@-v^SU ztV)biOR4AaCUm)=6pXkDG8E&uq-boN1*vgqv zrFZdyA6|sPk|}10(cJ7(r z@4}=udKY7flr&8kTEAGjt$m0yn8? zFG4rhYJnU9hoD)B!6nv_cf*8ur?Xp8*cIT`nEIm3TK)mmN+3WzOfi`Z9##@St8A+M zt*ErjQ=P4g#HS;+F12OZ_Q{GOxyvqv6*WH(Gb${Z%alkHWpC3L{ACy+8H-LJ%^(>! zYT0J$giq5KoM74}9TX;6qp0@*#zwmYKaW#$fi`Lh7D`bF7k@o^7A7StGk}8Gqw)%{ zQIgCFVo#kBKI6`n_Q%-_VtZCzJFeB4Hp^KIkCJ8;05mhl3Y5p89DT^APrv;hcuveB zzh^#4Zq0waF^^6qiLWbW&IEId$_KiC#$6%dY~aWoEkx6F?T1qkvdG%rY!k?AnHX{t zj_kE^WSw!b17F4C=DP3mR{V5~zT)B+sXOofv)C#;{}(-TD^uhgV&#dI;RA~=IPfTDk|5dvq- z!O0`sePorff(V)60b*EnJ%0$t%@YD-m5X|&-Gn`+F4F}c`t>Y9^MZ;(QGw=gnImS& zFq?3>A0sGG%i&o9+Tb2b?|^V}M_OO`5X0J{U360m;k5vHFA3{!{+hqCVUPswx&*Lq zBY%Bk`Iq?rijQmp!@TDJACR6n^VY_$h> zEDknat3xMu>|?eXmxlSH`?i`L+|8I6Ii4DzMGObImJ+}s2V5DwUmE#GB>z7C2KM7k qhCae8%A(%2!*+1o5g)YTs$>Vv`v4SKrfLmonr+P(NH?#apZyPQIXy%G literal 0 HcmV?d00001 diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo new file mode 100644 index 00000000..72a1030c --- /dev/null +++ b/docs/build/html/.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: 3c3a45f7380646673145bdabaed7ce09 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/_sources/bark.rst.txt b/docs/build/html/_sources/bark.rst.txt new file mode 100644 index 00000000..7204eb14 --- /dev/null +++ b/docs/build/html/_sources/bark.rst.txt @@ -0,0 +1,45 @@ +bark package +============ + +Submodules +---------- + +bark.api module +--------------- + +.. automodule:: bark.api + :members: + :undoc-members: + :show-inheritance: + +bark.generation module +---------------------- + +.. automodule:: bark.generation + :members: + :undoc-members: + :show-inheritance: + +bark.model module +----------------- + +.. automodule:: bark.model + :members: + :undoc-members: + :show-inheritance: + +bark.model\_fine module +----------------------- + +.. automodule:: bark.model_fine + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: bark + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt new file mode 100644 index 00000000..26c953bf --- /dev/null +++ b/docs/build/html/_sources/index.rst.txt @@ -0,0 +1,20 @@ +.. Bark documentation master file, created by + sphinx-quickstart on Tue Jun 27 10:35:37 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Bark's documentation! +================================ + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/build/html/_sources/modules.rst.txt b/docs/build/html/_sources/modules.rst.txt new file mode 100644 index 00000000..77bc686f --- /dev/null +++ b/docs/build/html/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +bark +==== + +.. toctree:: + :maxdepth: 4 + + bark diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css new file mode 100644 index 00000000..517d0b29 --- /dev/null +++ b/docs/build/html/_static/alabaster.css @@ -0,0 +1,703 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css new file mode 100644 index 00000000..7577acb1 --- /dev/null +++ b/docs/build/html/_static/basic.css @@ -0,0 +1,903 @@ +/* + * 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; +} + +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; +} + +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; +} + +/* -- 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/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/docs/build/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/build/html/_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/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js new file mode 100644 index 00000000..2db8a09e --- /dev/null +++ b/docs/build/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1', + 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/docs/build/html/_static/file.png b/docs/build/html/_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/docs/build/html/_static/language_data.js b/docs/build/html/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/docs/build/html/_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/docs/build/html/_static/minus.png b/docs/build/html/_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/docs/build/html/_static/plus.png b/docs/build/html/_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/docs/build/html/_static/pygments.css b/docs/build/html/_static/pygments.css new file mode 100644 index 00000000..9abe04ba --- /dev/null +++ b/docs/build/html/_static/pygments.css @@ -0,0 +1,83 @@ +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: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #ef2929 } /* 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: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/build/html/_static/searchtools.js b/docs/build/html/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/docs/build/html/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * 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) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + 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 = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + 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 + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + 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 +) => { + // 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); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 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); + }, + + /** + * 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/docs/build/html/_static/sphinx_highlight.js b/docs/build/html/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/docs/build/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* 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))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + 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(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/build/html/bark.html b/docs/build/html/bark.html new file mode 100644 index 00000000..0e7f3c69 --- /dev/null +++ b/docs/build/html/bark.html @@ -0,0 +1,483 @@ + + + + + + + + bark package — Bark 1 documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

bark package

+
+

Submodules

+
+
+

bark.api module

+
+
+bark.api.generate_audio(text: str, history_prompt: str | None = None, text_temp: float = 0.7, waveform_temp: float = 0.7, silent: bool = False, output_full: bool = False)
+

Generate audio array from input text.

+
+
Parameters:
+
    +
  • text – text to be turned into audio

  • +
  • history_prompt – history choice for audio cloning

  • +
  • text_temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • waveform_temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • silent – disable progress bar

  • +
  • output_full – return full generation to be used as a history prompt

  • +
+
+
Returns:
+

numpy audio array at sample frequency 24khz

+
+
+
+ +
+
+bark.api.save_as_prompt(filepath, full_generation)
+
+ +
+
+bark.api.semantic_to_waveform(semantic_tokens: ndarray, history_prompt: str | None = None, temp: float = 0.7, silent: bool = False, output_full: bool = False)
+

Generate audio array from semantic input.

+
+
Parameters:
+
    +
  • semantic_tokens – semantic token output from text_to_semantic

  • +
  • history_prompt – history choice for audio cloning

  • +
  • temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • silent – disable progress bar

  • +
  • output_full – return full generation to be used as a history prompt

  • +
+
+
Returns:
+

numpy audio array at sample frequency 24khz

+
+
+
+ +
+
+bark.api.text_to_semantic(text: str, history_prompt: str | None = None, temp: float = 0.7, silent: bool = False)
+

Generate semantic array from text.

+
+
Parameters:
+
    +
  • text – text to be turned into audio

  • +
  • history_prompt – history choice for audio cloning

  • +
  • temp – generation temperature (1.0 more diverse, 0.0 more conservative)

  • +
  • silent – disable progress bar

  • +
+
+
Returns:
+

numpy semantic array to be fed into semantic_to_waveform

+
+
+
+ +
+
+

bark.generation module

+
+
+class bark.generation.InferenceContext(benchmark=False)
+

Bases: object

+
+ +
+
+bark.generation.autocast()
+
+ +
+
+bark.generation.clean_models(model_key=None)
+
+ +
+
+bark.generation.codec_decode(fine_tokens)
+

Turn quantized audio codes into audio array using encodec.

+
+ +
+
+bark.generation.generate_coarse(x_semantic, history_prompt=None, temp=0.7, top_k=None, top_p=None, silent=False, max_coarse_history=630, sliding_window_len=60, use_kv_caching=False)
+

Generate coarse audio codes from semantic tokens.

+
+ +
+
+bark.generation.generate_fine(x_coarse_gen, history_prompt=None, temp=0.5, silent=True)
+

Generate full audio codes from coarse audio codes.

+
+ +
+
+bark.generation.generate_text_semantic(text, history_prompt=None, temp=0.7, top_k=None, top_p=None, silent=False, min_eos_p=0.2, max_gen_duration_s=None, allow_early_stop=True, use_kv_caching=False)
+

Generate semantic tokens from text.

+
+ +
+
+bark.generation.load_codec_model(use_gpu=True, force_reload=False)
+
+ +
+
+bark.generation.load_model(use_gpu=True, use_small=False, force_reload=False, model_type='text', path=None)
+
+ +
+
+bark.generation.preload_models(text_use_gpu=True, text_use_small=False, coarse_use_gpu=True, coarse_use_small=False, fine_use_gpu=True, fine_use_small=False, codec_use_gpu=True, force_reload=False, path=None)
+

Load all the necessary models for the pipeline.

+
+ +
+
+

bark.model module

+

Much of this code is adapted from Andrej Karpathy’s NanoGPT +(https://github.com/karpathy/nanoGPT)

+
+
+class bark.model.Block(config, layer_idx)
+

Bases: Module

+
+
+forward(x, past_kv=None, use_cache=False)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model.CausalSelfAttention(config)
+

Bases: Module

+
+
+forward(x, past_kv=None, use_cache=False)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model.GPT(config)
+

Bases: Module

+
+
+forward(idx, merge_context=False, past_kv=None, position_ids=None, use_cache=False, labels=None)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+
+get_num_params(non_embedding=True)
+

Return the number of parameters in the model. +For non-embedding count (default), the position embeddings get subtracted. +The token embeddings would too, except due to the parameter sharing these +params are actually used as weights in the final layer, so we include them.

+
+ +
+ +
+
+class bark.model.GPTConfig(block_size: int = 1024, input_vocab_size: int = 10048, output_vocab_size: int = 10048, n_layer: int = 12, n_head: int = 12, n_embd: int = 768, dropout: float = 0.0, bias: bool = True)
+

Bases: object

+
+
+bias: bool = True
+
+ +
+
+block_size: int = 1024
+
+ +
+
+dropout: float = 0.0
+
+ +
+
+input_vocab_size: int = 10048
+
+ +
+
+n_embd: int = 768
+
+ +
+
+n_head: int = 12
+
+ +
+
+n_layer: int = 12
+
+ +
+
+output_vocab_size: int = 10048
+
+ +
+ +
+
+class bark.model.LayerNorm(ndim, bias)
+

Bases: Module

+

LayerNorm but with an optional bias. PyTorch doesn’t support simply bias=False

+
+
+forward(input)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model.MLP(config)
+

Bases: Module

+
+
+forward(x)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+

bark.model_fine module

+

Much of this code is adapted from Andrej Karpathy’s NanoGPT +(https://github.com/karpathy/nanoGPT)

+
+
+class bark.model_fine.FineBlock(config)
+

Bases: Module

+
+
+forward(x)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+class bark.model_fine.FineGPT(config)
+

Bases: GPT

+
+
+forward(pred_idx, idx)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+
+get_num_params(non_embedding=True)
+

Return the number of parameters in the model. +For non-embedding count (default), the position embeddings get subtracted. +The token embeddings would too, except due to the parameter sharing these +params are actually used as weights in the final layer, so we include them.

+
+ +
+ +
+
+class bark.model_fine.FineGPTConfig(block_size: int = 1024, input_vocab_size: int = 10048, output_vocab_size: int = 10048, n_layer: int = 12, n_head: int = 12, n_embd: int = 768, dropout: float = 0.0, bias: bool = True, n_codes_total: int = 8, n_codes_given: int = 1)
+

Bases: GPTConfig

+
+
+n_codes_given: int = 1
+
+ +
+
+n_codes_total: int = 8
+
+ +
+ +
+
+class bark.model_fine.NonCausalSelfAttention(config)
+

Bases: Module

+
+
+forward(x)
+

Defines the computation performed at every call.

+

Should be overridden by all subclasses.

+
+

Note

+

Although the recipe for forward pass needs to be defined within +this function, one should call the Module instance afterwards +instead of this since the former takes care of running the +registered hooks while the latter silently ignores them.

+
+
+ +
+ +
+
+

Module contents

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html new file mode 100644 index 00000000..da7002d7 --- /dev/null +++ b/docs/build/html/genindex.html @@ -0,0 +1,352 @@ + + + + + + + Index — Bark 1 documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ A + | B + | C + | D + | F + | G + | I + | L + | M + | N + | O + | P + | S + | T + +
+

A

+ + +
+ +

B

+ + + +
    +
  • + bark + +
  • +
  • + bark.api + +
  • +
  • + bark.generation + +
  • +
+ +

C

+ + + +
+ +

D

+ + +
+ +

F

+ + +
+ +

G

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + +
+ +

S

+ + + +
+ +

T

+ + +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/build/html/index.html b/docs/build/html/index.html new file mode 100644 index 00000000..c9a2bc34 --- /dev/null +++ b/docs/build/html/index.html @@ -0,0 +1,109 @@ + + + + + + + + Welcome to Bark’s documentation! — Bark 1 documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Welcome to Bark’s documentation!

+
+
+
+
+

Indices and tables

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html new file mode 100644 index 00000000..32d7c1ee --- /dev/null +++ b/docs/build/html/modules.html @@ -0,0 +1,184 @@ + + + + + + + + bark — Bark 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv new file mode 100644 index 00000000..f3e1eef5 --- /dev/null +++ b/docs/build/html/objects.inv @@ -0,0 +1,6 @@ +# Sphinx inventory version 2 +# Project: Bark +# Version: +# The remainder of this file is compressed using zlib. +xڝKn0>vkfh @Ĉل)R GNU$~ȅaQ\|Oran[tֽsQqP?S\ t*=\AZlz#IYS|{9v` dumINuTk6 AF5 5x?eUBOV9+F0?; <\Zp>m$C5sJYj 5udBN .!e|oic[++㍘3dy>$Lߊ> ݨubvY)@T&bCW0lO2]Obm57۪7y= 7)sO <ygi$yO7_?d.|p!!`|ɋڡI=yB/d[|bI +O]meEr k\ӪL!UCŏ%'x.iQOҶX-Y?ାwÂtŨ/Q9ޠhB,Fګ=Nn.k_ {", \ No newline at end of file diff --git a/docs/build/html/py-modindex.html b/docs/build/html/py-modindex.html new file mode 100644 index 00000000..1d5f95c7 --- /dev/null +++ b/docs/build/html/py-modindex.html @@ -0,0 +1,133 @@ + + + + + + + Python Module Index — Bark 1 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ b +
+ + + + + + + + + + + + + + + + + + + +
 
+ b
+ bark +
    + bark.api +
    + bark.generation +
    + bark.model +
    + bark.model_fine +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/build/html/search.html b/docs/build/html/search.html new file mode 100644 index 00000000..e0617ee2 --- /dev/null +++ b/docs/build/html/search.html @@ -0,0 +1,117 @@ + + + + + + + Search — Bark 1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js new file mode 100644 index 00000000..7c286f86 --- /dev/null +++ b/docs/build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["bark", "index", "modules"], "filenames": ["bark.rst", "index.rst", "modules.rst"], "titles": ["bark package", "Welcome to Bark\u2019s documentation!", "bark"], "terms": {"generate_audio": [0, 2], "text": 0, "str": 0, "history_prompt": 0, "none": 0, "text_temp": 0, "float": 0, "0": 0, "7": 0, "waveform_temp": 0, "silent": 0, "bool": 0, "fals": 0, "output_ful": 0, "audio": 0, "arrai": 0, "from": 0, "input": 0, "paramet": 0, "turn": 0, "histori": 0, "choic": 0, "clone": 0, "temperatur": 0, "1": 0, "more": 0, "divers": 0, "conserv": 0, "disabl": 0, "progress": 0, "bar": 0, "return": 0, "full": 0, "us": 0, "prompt": 0, "numpi": 0, "sampl": 0, "frequenc": 0, "24khz": 0, "save_as_prompt": [0, 2], "filepath": 0, "full_gener": 0, "semantic_to_waveform": [0, 2], "semantic_token": 0, "ndarrai": 0, "temp": 0, "semant": 0, "token": 0, "output": 0, "text_to_semant": [0, 2], "fed": 0, "class": 0, "inferencecontext": [0, 2], "benchmark": 0, "base": 0, "object": 0, "autocast": [0, 2], "clean_model": [0, 2], "model_kei": 0, "codec_decod": [0, 2], "fine_token": 0, "quantiz": 0, "code": 0, "encodec": 0, "generate_coars": [0, 2], "x_semant": 0, "top_k": 0, "top_p": 0, "max_coarse_histori": 0, "630": 0, "sliding_window_len": 0, "60": 0, "use_kv_cach": 0, "coars": 0, "generate_fin": [0, 2], "x_coarse_gen": 0, "5": 0, "true": 0, "generate_text_semant": [0, 2], "min_eos_p": 0, "2": 0, "max_gen_duration_": 0, "allow_early_stop": 0, "load_codec_model": [0, 2], "use_gpu": 0, "force_reload": 0, "load_model": [0, 2], "use_smal": 0, "model_typ": 0, "path": 0, "preload_model": [0, 2], "text_use_gpu": 0, "text_use_smal": 0, "coarse_use_gpu": 0, "coarse_use_smal": 0, "fine_use_gpu": 0, "fine_use_smal": 0, "codec_use_gpu": 0, "load": 0, "all": 0, "necessari": 0, "pipelin": 0, "much": 0, "thi": 0, "i": 0, "adapt": 0, "andrej": 0, "karpathi": 0, "": 0, "nanogpt": 0, "http": 0, "github": 0, "com": 0, "block": [0, 2], "config": 0, "layer_idx": 0, "forward": [0, 2], "x": 0, "past_kv": 0, "use_cach": 0, "defin": 0, "comput": 0, "perform": 0, "everi": 0, "call": 0, "should": 0, "overridden": 0, "subclass": 0, "although": 0, "recip": 0, "pass": 0, "need": 0, "within": 0, "function": 0, "one": 0, "instanc": 0, "afterward": 0, "instead": 0, "sinc": 0, "former": 0, "take": 0, "care": 0, "run": 0, "regist": 0, "hook": 0, "while": 0, "latter": 0, "ignor": 0, "them": 0, "causalselfattent": [0, 2], "gpt": [0, 2], "idx": 0, "merge_context": 0, "position_id": 0, "label": 0, "get_num_param": [0, 2], "non_embed": 0, "number": 0, "For": 0, "non": 0, "embed": 0, "count": 0, "default": 0, "posit": 0, "get": 0, "subtract": 0, "The": 0, "would": 0, "too": 0, "except": 0, "due": 0, "share": 0, "param": 0, "ar": 0, "actual": 0, "weight": 0, "final": 0, "layer": 0, "so": 0, "we": 0, "includ": 0, "gptconfig": [0, 2], "block_siz": [0, 2], "int": 0, "1024": 0, "input_vocab_s": [0, 2], "10048": 0, "output_vocab_s": [0, 2], "n_layer": [0, 2], "12": 0, "n_head": [0, 2], "n_embd": [0, 2], "768": 0, "dropout": [0, 2], "bia": [0, 2], "layernorm": [0, 2], "ndim": 0, "an": 0, "option": 0, "pytorch": 0, "doesn": 0, "t": 0, "support": 0, "simpli": 0, "mlp": [0, 2], "fineblock": [0, 2], "finegpt": [0, 2], "pred_idx": 0, "finegptconfig": [0, 2], "n_codes_tot": [0, 2], "8": 0, "n_codes_given": [0, 2], "noncausalselfattent": [0, 2], "index": 1, "modul": [1, 2], "search": 1, "page": 1, "packag": 2, "submodul": 2, "api": 2, "gener": 2, "model": 2, "model_fin": 2, "content": 2}, "objects": {"": [[0, 0, 0, "-", "bark"]], "bark": [[0, 0, 0, "-", "api"], [0, 0, 0, "-", "generation"], [0, 0, 0, "-", "model"], [0, 0, 0, "-", "model_fine"]], "bark.api": [[0, 1, 1, "", "generate_audio"], [0, 1, 1, "", "save_as_prompt"], [0, 1, 1, "", "semantic_to_waveform"], [0, 1, 1, "", "text_to_semantic"]], "bark.generation": [[0, 2, 1, "", "InferenceContext"], [0, 1, 1, "", "autocast"], [0, 1, 1, "", "clean_models"], [0, 1, 1, "", "codec_decode"], [0, 1, 1, "", "generate_coarse"], [0, 1, 1, "", "generate_fine"], [0, 1, 1, "", "generate_text_semantic"], [0, 1, 1, "", "load_codec_model"], [0, 1, 1, "", "load_model"], [0, 1, 1, "", "preload_models"]], "bark.model": [[0, 2, 1, "", "Block"], [0, 2, 1, "", "CausalSelfAttention"], [0, 2, 1, "", "GPT"], [0, 2, 1, "", "GPTConfig"], [0, 2, 1, "", "LayerNorm"], [0, 2, 1, "", "MLP"]], "bark.model.Block": [[0, 3, 1, "", "forward"]], "bark.model.CausalSelfAttention": [[0, 3, 1, "", "forward"]], "bark.model.GPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model.GPTConfig": [[0, 4, 1, "", "bias"], [0, 4, 1, "", "block_size"], [0, 4, 1, "", "dropout"], [0, 4, 1, "", "input_vocab_size"], [0, 4, 1, "", "n_embd"], [0, 4, 1, "", "n_head"], [0, 4, 1, "", "n_layer"], [0, 4, 1, "", "output_vocab_size"]], "bark.model.LayerNorm": [[0, 3, 1, "", "forward"]], "bark.model.MLP": [[0, 3, 1, "", "forward"]], "bark.model_fine": [[0, 2, 1, "", "FineBlock"], [0, 2, 1, "", "FineGPT"], [0, 2, 1, "", "FineGPTConfig"], [0, 2, 1, "", "NonCausalSelfAttention"]], "bark.model_fine.FineBlock": [[0, 3, 1, "", "forward"]], "bark.model_fine.FineGPT": [[0, 3, 1, "", "forward"], [0, 3, 1, "", "get_num_params"]], "bark.model_fine.FineGPTConfig": [[0, 4, 1, "", "n_codes_given"], [0, 4, 1, "", "n_codes_total"]], "bark.model_fine.NonCausalSelfAttention": [[0, 3, 1, "", "forward"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"bark": [0, 1, 2], "packag": 0, "submodul": 0, "api": 0, "modul": 0, "gener": 0, "model": 0, "model_fin": 0, "content": 0, "welcom": 1, "": 1, "document": 1, "indic": 1, "tabl": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"bark package": [[0, "bark-package"]], "Submodules": [[0, "submodules"]], "bark.api module": [[0, "module-bark.api"]], "bark.generation module": [[0, "module-bark.generation"]], "bark.model module": [[0, "module-bark.model"]], "bark.model_fine module": [[0, "module-bark.model_fine"]], "Module contents": [[0, "module-bark"]], "Welcome to Bark\u2019s documentation!": [[1, "welcome-to-bark-s-documentation"]], "Indices and tables": [[1, "indices-and-tables"]], "bark": [[2, "bark"]]}, "indexentries": {"block (class in bark.model)": [[0, "bark.model.Block"]], "causalselfattention (class in bark.model)": [[0, "bark.model.CausalSelfAttention"]], "fineblock (class in bark.model_fine)": [[0, "bark.model_fine.FineBlock"]], "finegpt (class in bark.model_fine)": [[0, "bark.model_fine.FineGPT"]], "finegptconfig (class in bark.model_fine)": [[0, "bark.model_fine.FineGPTConfig"]], "gpt (class in bark.model)": [[0, "bark.model.GPT"]], "gptconfig (class in bark.model)": [[0, "bark.model.GPTConfig"]], "inferencecontext (class in bark.generation)": [[0, "bark.generation.InferenceContext"]], "layernorm (class in bark.model)": [[0, "bark.model.LayerNorm"]], "mlp (class in bark.model)": [[0, "bark.model.MLP"]], "noncausalselfattention (class in bark.model_fine)": [[0, "bark.model_fine.NonCausalSelfAttention"]], "autocast() (in module bark.generation)": [[0, "bark.generation.autocast"]], "bark": [[0, "module-bark"]], "bark.api": [[0, "module-bark.api"]], "bark.generation": [[0, "module-bark.generation"]], "bark.model": [[0, "module-bark.model"]], "bark.model_fine": [[0, "module-bark.model_fine"]], "bias (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.bias"]], "block_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.block_size"]], "clean_models() (in module bark.generation)": [[0, "bark.generation.clean_models"]], "codec_decode() (in module bark.generation)": [[0, "bark.generation.codec_decode"]], "dropout (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.dropout"]], "forward() (bark.model.block method)": [[0, "bark.model.Block.forward"]], "forward() (bark.model.causalselfattention method)": [[0, "bark.model.CausalSelfAttention.forward"]], "forward() (bark.model.gpt method)": [[0, "bark.model.GPT.forward"]], "forward() (bark.model.layernorm method)": [[0, "bark.model.LayerNorm.forward"]], "forward() (bark.model.mlp method)": [[0, "bark.model.MLP.forward"]], "forward() (bark.model_fine.fineblock method)": [[0, "bark.model_fine.FineBlock.forward"]], "forward() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.forward"]], "forward() (bark.model_fine.noncausalselfattention method)": [[0, "bark.model_fine.NonCausalSelfAttention.forward"]], "generate_audio() (in module bark.api)": [[0, "bark.api.generate_audio"]], "generate_coarse() (in module bark.generation)": [[0, "bark.generation.generate_coarse"]], "generate_fine() (in module bark.generation)": [[0, "bark.generation.generate_fine"]], "generate_text_semantic() (in module bark.generation)": [[0, "bark.generation.generate_text_semantic"]], "get_num_params() (bark.model.gpt method)": [[0, "bark.model.GPT.get_num_params"]], "get_num_params() (bark.model_fine.finegpt method)": [[0, "bark.model_fine.FineGPT.get_num_params"]], "input_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.input_vocab_size"]], "load_codec_model() (in module bark.generation)": [[0, "bark.generation.load_codec_model"]], "load_model() (in module bark.generation)": [[0, "bark.generation.load_model"]], "module": [[0, "module-bark"], [0, "module-bark.api"], [0, "module-bark.generation"], [0, "module-bark.model"], [0, "module-bark.model_fine"]], "n_codes_given (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_given"]], "n_codes_total (bark.model_fine.finegptconfig attribute)": [[0, "bark.model_fine.FineGPTConfig.n_codes_total"]], "n_embd (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_embd"]], "n_head (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_head"]], "n_layer (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.n_layer"]], "output_vocab_size (bark.model.gptconfig attribute)": [[0, "bark.model.GPTConfig.output_vocab_size"]], "preload_models() (in module bark.generation)": [[0, "bark.generation.preload_models"]], "save_as_prompt() (in module bark.api)": [[0, "bark.api.save_as_prompt"]], "semantic_to_waveform() (in module bark.api)": [[0, "bark.api.semantic_to_waveform"]], "text_to_semantic() (in module bark.api)": [[0, "bark.api.text_to_semantic"]]}}) \ No newline at end of file From 4337601dd32e85ad66c0ac22b7a06c349561c5d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 17:17:18 -0300 Subject: [PATCH 21/23] fix: improving code --- action.yml | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 action.yml diff --git a/action.yml b/action.yml deleted file mode 100644 index 4e892c8f..00000000 --- a/action.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Build and Push Docker Image - -on: - push: - branches: - - main - - configure-pipe - -env: - DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Login to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ env.DOCKERHUB_USERNAME }} - password: ${{ env.DOCKERHUB_TOKEN }} - - name: Build Docker image - run: | - docker build -t bark:latest . - - name: Push Docker image - run: | - docker tag bark:latest ${{ env.DOCKER_USERNAME }}/bark:latest - docker push ${{ env.DOCKER_USERNAME }}/bark:latest \ No newline at end of file From eba204bda6cbdaac630af75aa6bc9bc03de2e70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Tue, 27 Jun 2023 17:21:36 -0300 Subject: [PATCH 22/23] feat: add lint pipe --- .github/workflows/lint.yml | 19 +++++++++++++++++++ setup.cfg | 6 ++++++ 2 files changed, 25 insertions(+) create mode 100644 .github/workflows/lint.yml create mode 100644 setup.cfg diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..3b3159fa --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,19 @@ +name: Python Linter +on: + push: + branches: + - main + - configure-pipe + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Python Linter + uses: sunnysid3up/python-linter@master + with: + source: "bark" + mypy-options: "--ignore-missing-imports --show-error-codes" + pylint-options: "--rcfile=setup.cfg" + isort-options: "-w 100" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..ddff1e6e --- /dev/null +++ b/setup.cfg @@ -0,0 +1,6 @@ +[isort] +include_trailing_comma=True +lines_between_sections=0 +lines_between_types=0 +line_length=100 +multi_line_output=3 \ No newline at end of file From 03caf588452f8e0c169c49b8c3ad14bd5dbc83c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Furtado?= Date: Thu, 29 Jun 2023 15:01:14 -0300 Subject: [PATCH 23/23] fix: change to run pipes on all branches --- .github/workflows/build-push-image.yml | 6 ++---- .github/workflows/generate-sphinx-doc.yml | 3 +-- .github/workflows/lint.yml | 3 +-- .github/workflows/unit-test.yml | 3 +-- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-push-image.yml b/.github/workflows/build-push-image.yml index 56fe318c..5e568ede 100644 --- a/.github/workflows/build-push-image.yml +++ b/.github/workflows/build-push-image.yml @@ -1,10 +1,8 @@ name: Build and Push Docker Image - -on: +on: push: branches: - - main - - configure-pipe + - '*' env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} diff --git a/.github/workflows/generate-sphinx-doc.yml b/.github/workflows/generate-sphinx-doc.yml index 4ab540d5..140e510c 100644 --- a/.github/workflows/generate-sphinx-doc.yml +++ b/.github/workflows/generate-sphinx-doc.yml @@ -2,8 +2,7 @@ name: Docs Build And Check on: push: branches: - - main - - configure-pipe + - '*' jobs: docs: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3b3159fa..0136d2e7 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -2,8 +2,7 @@ name: Python Linter on: push: branches: - - main - - configure-pipe + - '*' jobs: docs: diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 86872bff..ed02bc46 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -2,8 +2,7 @@ name: Unit Test on: push: branches: - - main - - configure-pipe + - '*' jobs: docs: