├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── documentation-update.md │ ├── feature_request.md │ └── testing-update.md └── workflows │ ├── pr-messages.yml │ ├── python-package.yml │ └── release-messages.yml ├── .gitignore ├── README.md ├── docs ├── .buildinfo ├── .doctrees │ ├── environment.pickle │ ├── getting_started.doctree │ ├── index.doctree │ ├── load_ests.doctree │ └── prog_client.doctree ├── _sources │ ├── getting_started.rst.txt │ ├── index.rst.txt │ ├── load_ests.rst.txt │ └── prog_client.rst.txt ├── _static │ ├── basic.css │ ├── doctools.js │ ├── documentation_options.js │ ├── language_data.js │ └── searchtools.js ├── genindex.html ├── getting_started.html ├── index.html ├── load_ests.html ├── objects.inv ├── prog_client.html ├── search.html └── searchindex.js ├── examples ├── __init__.py ├── online_prog.py └── option_scoring.py ├── forms ├── PaaS_Corporate CLA.pdf └── PaaS_Individual CLA.pdf ├── license.pdf ├── scripts └── test_copyright.py ├── setup.py ├── specs ├── prog_server.postman_collection.json └── swagger.yaml ├── src ├── prog_client │ ├── __init__.py │ └── session.py └── prog_server │ ├── __init__.py │ ├── __main__.py │ ├── app.py │ ├── controllers.py │ └── models │ ├── __init__.py │ ├── load_ests.py │ ├── prediction_handler.py │ ├── prog_server.py │ └── session.py └── tests ├── __init__.py ├── __main__.py ├── examples.py └── integration.py /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **Relevant Requirements** 14 | Indicate any enhancement issues (i.e., requirements) that are impacted by this issue. 15 | 16 | **To Reproduce** 17 | Steps to reproduce the behavior: 18 | 1. Go to '...' 19 | 2. Click on '....' 20 | 3. Scroll down to '....' 21 | 4. See error 22 | 23 | **Expected behavior** 24 | A clear and concise description of what you expected to happen. 25 | 26 | **Screenshots** 27 | If applicable, add screenshots to help explain your problem. 28 | 29 | **Desktop (please complete the following information):** 30 | - OS: [e.g. iOS] 31 | - Python Version [e.g. 3.7] 32 | 33 | **Additional context** 34 | Add any other context about the problem here. 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation-update.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Documentation update 3 | about: An update to the documentation 4 | title: '' 5 | labels: documentation 6 | assignees: '' 7 | 8 | --- 9 | 10 | ** Location where change is recommended ** 11 | 12 | ** Recommended change ** 13 | 14 | ** Reason ** 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Requirement Text** 11 | What must this feature do, specifically - this is the thing to test to. E.g., Ability to simulate model until a specified event has been met. 12 | 13 | **Background Information** 14 | Optional 15 | 16 | **Suggested Solution** 17 | Optional, Solution that is proposed. Requirement can be met with other solutions 18 | 19 | **DoD** 20 | What need to be completed for this feature to be complete. E.g., 21 | - [ ] Implement ability to simulate to specified event 22 | - [ ] Add to example 23 | - [ ] Add to tutorial 24 | - [ ] Add tests 25 | - [ ] Add to change notes for next release 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/testing-update.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Testing update 3 | about: An update to tests or the CI/CD pipeline 4 | title: '' 5 | labels: CI/CD 6 | assignees: '' 7 | 8 | --- 9 | 10 | ** Test to Update ** 11 | 12 | ** Change Recommended ** 13 | 14 | ** Reason ** 15 | -------------------------------------------------------------------------------- /.github/workflows/pr-messages.yml: -------------------------------------------------------------------------------- 1 | name: Print PR Message - Non Release 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - 'dev' 7 | types: [opened] 8 | 9 | jobs: 10 | benchmark_branch: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Auto Comment 14 | uses: wow-actions/auto-comment@v1 15 | with: 16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 17 | pullRequestOpened: > 18 | Thank you for opening this PR. Each PR into dev requires a code review. For the code review, look at the following: 19 | 20 | - [ ] Reviewer should look for bugs, efficiency, readability, testing, and coverage in examples (if relevant). 21 | 22 | - [ ] Ensure that each PR adding a new feature should include a test verifying that feature. 23 | 24 | - [ ] All tests must be passing. 25 | 26 | - [ ] All errors from static analysis must be resolved. 27 | 28 | - [ ] Review the test coverage reports (if there is a change) - will be added as comment on PR if there is a change 29 | 30 | - [ ] Review the software benchmarking results (if there is a change) - will be added as comment on PR 31 | 32 | - [ ] Any added dependencies are included in requirements.txt, setup.py, and dev_guide.rst (this document) 33 | 34 | - [ ] All warnings from static analysis must be reviewed and resolved - if deemed appropriate. 35 | -------------------------------------------------------------------------------- /.github/workflows/python-package.yml: -------------------------------------------------------------------------------- 1 | # Copyright © 2021 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. 2 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 3 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 4 | 5 | name: Python package 6 | 7 | on: 8 | push: 9 | pull_request: 10 | paths: 11 | - prog_server 12 | 13 | jobs: 14 | test: 15 | runs-on: ubuntu-latest 16 | strategy: 17 | matrix: 18 | python-version: ['3.7', '3.8', '3.9', '3.10'] 19 | steps: 20 | - uses: actions/checkout@v2 21 | - name: Set up Python ${{ matrix.python-version }} 22 | uses: actions/setup-python@v2 23 | with: 24 | python-version: ${{ matrix.python-version }} 25 | - name: Install dependencies 26 | run: | 27 | python -m pip install --upgrade pip 28 | python -m pip install -e . 29 | - name: Run tests 30 | run: python -m tests 31 | copyright: 32 | runs-on: ubuntu-latest 33 | strategy: 34 | matrix: 35 | python-version: ['3.9'] 36 | steps: 37 | - uses: actions/checkout@v2 38 | - name: Set up Python ${{ matrix.python-version }} 39 | uses: actions/setup-python@v2 40 | with: 41 | python-version: ${{ matrix.python-version }} 42 | - name: Run copyright check 43 | run: | 44 | python scripts/test_copyright.py 45 | coverage: 46 | runs-on: ubuntu-latest 47 | strategy: 48 | matrix: 49 | python-version: ['3.9'] 50 | steps: 51 | - uses: actions/checkout@v2 52 | - name: Set up Python ${{ matrix.python-version }} 53 | uses: actions/setup-python@v2 54 | with: 55 | python-version: ${{ matrix.python-version }} 56 | - name: Install dependencies 57 | run: | 58 | python -m pip install --upgrade pip 59 | python -m pip install -e . 60 | pip install coverage 61 | - name: Run coverage 62 | run: | 63 | coverage run -m tests 64 | coverage xml 65 | - name: "Upload coverage to Codecov" 66 | uses: codecov/codecov-action@v2 67 | with: 68 | fail_ci_if_error: true 69 | -------------------------------------------------------------------------------- /.github/workflows/release-messages.yml: -------------------------------------------------------------------------------- 1 | name: Print PR Message - Release 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - 'release/**' 7 | types: [opened] 8 | 9 | jobs: 10 | benchmark_branch: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Auto Comment 14 | uses: wow-actions/auto-comment@v1 15 | with: 16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 17 | pullRequestOpened: > 18 | Thank you for opening this PR. Since this is a release branch, the PR must complete the release checklist, below: 19 | 20 | - [ ] Check that each new feature has corresponding tests 21 | 22 | - [ ] Confirm all dependencies are in the following: requirements.txt, setup.py, the bottom of dev_guide.rst 23 | 24 | - [ ] Confirm that all issues associated with the release have been closed (i.e., requirements have been met) or assigned to another release 25 | 26 | - [ ] Run unit tests `python -m tests` 27 | 28 | - [ ] If present, run manual tests `python -m tests.test_manual` 29 | 30 | - [ ] Review the template(s) 31 | 32 | - [ ] Review static-analysis/linter results 33 | 34 | - [ ] Review the tutorial 35 | 36 | - [ ] Run and review the examples 37 | 38 | - [ ] Check that all examples are tested 39 | 40 | - [ ] Check new files in PR for any accidentally added 41 | 42 | - [ ] Check documents 43 | 44 | - [ ] Check that all desired examples are in docs 45 | 46 | - [ ] General review: see if any updates are required 47 | 48 | - [ ] Rebuild sphinx documents: `sphinx-build sphinx_config/ docs/` 49 | 50 | - [ ] Write release notes 51 | 52 | - [ ] Update version number in src/\*/__init__.py and setup.py 53 | 54 | - [ ] For releases adding new features- ensure that NASA release process has been followed. 55 | 56 | - [ ] Confirm that on GitHub Releases page, the next release has been started and that a schedule is present including at least Release Date, Release Review Date, and Release Branch Opening Date.` 57 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | src/prog_server.egg-info/ 7 | 8 | dist/ 9 | 10 | build/ 11 | 12 | .vscode/ 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prognostics As-A-Service (PaaS) Sandbox 2 | [![CodeFactor](https://www.codefactor.io/repository/github/nasa/prog_server/badge)](https://www.codefactor.io/repository/github/nasa/prog_server) 3 | [![GitHub License](https://img.shields.io/badge/License-NOSA-green)](https://github.com/nasa/prog_server/blob/master/license.pdf) 4 | [![GitHub Releases](https://img.shields.io/github/release/nasa/prog_server.svg)](https://github.com/nasa/prog_server/releases) 5 | 6 | The NASA Prognostics As-A-Service (PaaS) Sandbox is a simplified implementation of a Software Oriented Architecture (SOA) for performing prognostics (estimation of time until events and future system states) of engineering systems. The PaaS Sandbox is a wrapper around the [Prognostics Python Package (ProgPy)](https://nasa.github.io/progpy/), allowing one or more users to access the features of these packages through a REST API. The package is intended to be used as a research tool to prototype and benchmark Prognostics As-A-Service (PaaS) architectures and work on the challenges facing such architectures, including Generality, Communication, Security, Environmental Complexity, Utility, and Trust. 7 | 8 | This is designed to be used with the [Prognostics Python Package (ProgPy)](https://nasa.github.io/progpy/). 9 | 10 | ## Installation 11 | `pip install prog_server` 12 | 13 | ## [Documentation](https://nasa.github.io/progpy/prog_server_guide.html) 14 | See documentation [here](https://nasa.github.io/progpy/prog_server_guide.html) 15 | 16 | ## Citing this repository 17 | Use the following to cite this repository: 18 | 19 | ``` 20 | @misc{2024_nasa_prog_server, 21 | author = {Christopher Teubert and Jason Watkins and Katelyn Jarvis}, 22 | title = {Prognostics As-A-Service (PaaS) Sandbox}, 23 | month = May, 24 | year = 2024, 25 | version = {1.7}, 26 | url = {https://github.com/nasa/prog_server} 27 | } 28 | ``` 29 | 30 | The corresponding reference should look like this: 31 | 32 | C. Teubert, J. Watkins, K. Jarvis, Prognostics As-A-Service (PaaS) Sandbox, v1.7, May 2024. URL https://github.com/nasa/prog_server. 33 | 34 | ## Notices 35 | Copyright © 2021 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. 36 | 37 | ## Disclaimers 38 | No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS." 39 | 40 | Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 41 | -------------------------------------------------------------------------------- /docs/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 1c92f19c8c53f10ab66da278b8beacdb 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /docs/.doctrees/environment.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/prog_server/f5753795ebbfb7794cb7a62a6e4bf23c925b6fd5/docs/.doctrees/environment.pickle -------------------------------------------------------------------------------- /docs/.doctrees/getting_started.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/prog_server/f5753795ebbfb7794cb7a62a6e4bf23c925b6fd5/docs/.doctrees/getting_started.doctree -------------------------------------------------------------------------------- /docs/.doctrees/index.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/prog_server/f5753795ebbfb7794cb7a62a6e4bf23c925b6fd5/docs/.doctrees/index.doctree -------------------------------------------------------------------------------- /docs/.doctrees/load_ests.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/prog_server/f5753795ebbfb7794cb7a62a6e4bf23c925b6fd5/docs/.doctrees/load_ests.doctree -------------------------------------------------------------------------------- /docs/.doctrees/prog_client.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nasa/prog_server/f5753795ebbfb7794cb7a62a6e4bf23c925b6fd5/docs/.doctrees/prog_client.doctree -------------------------------------------------------------------------------- /docs/_sources/getting_started.rst.txt: -------------------------------------------------------------------------------- 1 | Getting Started 2 | =============== 3 | 4 | Documentation moved to https://nasa.github.io/progpy 5 | -------------------------------------------------------------------------------- /docs/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | Prognostics As-A-Service (PaaS) Sandbox 2 | ============================================================= 3 | 4 | Documentation moved to https://nasa.github.io/progpy 5 | -------------------------------------------------------------------------------- /docs/_sources/load_ests.rst.txt: -------------------------------------------------------------------------------- 1 | Load Estimators 2 | ################ 3 | 4 | Documentation moved to https://nasa.github.io/progpy 5 | -------------------------------------------------------------------------------- /docs/_sources/prog_client.rst.txt: -------------------------------------------------------------------------------- 1 | prog_client 2 | ================================== 3 | 4 | Documentation moved to https://nasa.github.io/progpy 5 | -------------------------------------------------------------------------------- /docs/_static/basic.css: -------------------------------------------------------------------------------- 1 | /* 2 | * basic.css 3 | * ~~~~~~~~~ 4 | * 5 | * Sphinx stylesheet -- basic theme. 6 | * 7 | * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | /* -- main layout ----------------------------------------------------------- */ 13 | 14 | div.clearer { 15 | clear: both; 16 | } 17 | 18 | div.section::after { 19 | display: block; 20 | content: ''; 21 | clear: left; 22 | } 23 | 24 | /* -- relbar ---------------------------------------------------------------- */ 25 | 26 | div.related { 27 | width: 100%; 28 | font-size: 90%; 29 | } 30 | 31 | div.related h3 { 32 | display: none; 33 | } 34 | 35 | div.related ul { 36 | margin: 0; 37 | padding: 0 0 0 10px; 38 | list-style: none; 39 | } 40 | 41 | div.related li { 42 | display: inline; 43 | } 44 | 45 | div.related li.right { 46 | float: right; 47 | margin-right: 5px; 48 | } 49 | 50 | /* -- sidebar --------------------------------------------------------------- */ 51 | 52 | div.sphinxsidebarwrapper { 53 | padding: 10px 5px 0 10px; 54 | } 55 | 56 | div.sphinxsidebar { 57 | float: left; 58 | width: 230px; 59 | margin-left: -100%; 60 | font-size: 90%; 61 | word-wrap: break-word; 62 | overflow-wrap : break-word; 63 | } 64 | 65 | div.sphinxsidebar ul { 66 | list-style: none; 67 | } 68 | 69 | div.sphinxsidebar ul ul, 70 | div.sphinxsidebar ul.want-points { 71 | margin-left: 20px; 72 | list-style: square; 73 | } 74 | 75 | div.sphinxsidebar ul ul { 76 | margin-top: 0; 77 | margin-bottom: 0; 78 | } 79 | 80 | div.sphinxsidebar form { 81 | margin-top: 10px; 82 | } 83 | 84 | div.sphinxsidebar input { 85 | border: 1px solid #98dbcc; 86 | font-family: sans-serif; 87 | font-size: 1em; 88 | } 89 | 90 | div.sphinxsidebar #searchbox form.search { 91 | overflow: hidden; 92 | } 93 | 94 | div.sphinxsidebar #searchbox input[type="text"] { 95 | float: left; 96 | width: 80%; 97 | padding: 0.25em; 98 | box-sizing: border-box; 99 | } 100 | 101 | div.sphinxsidebar #searchbox input[type="submit"] { 102 | float: left; 103 | width: 20%; 104 | border-left: none; 105 | padding: 0.25em; 106 | box-sizing: border-box; 107 | } 108 | 109 | 110 | img { 111 | border: 0; 112 | max-width: 100%; 113 | } 114 | 115 | /* -- search page ----------------------------------------------------------- */ 116 | 117 | ul.search { 118 | margin: 10px 0 0 20px; 119 | padding: 0; 120 | } 121 | 122 | ul.search li { 123 | padding: 5px 0 5px 20px; 124 | background-image: url(file.png); 125 | background-repeat: no-repeat; 126 | background-position: 0 7px; 127 | } 128 | 129 | ul.search li a { 130 | font-weight: bold; 131 | } 132 | 133 | ul.search li p.context { 134 | color: #888; 135 | margin: 2px 0 0 30px; 136 | text-align: left; 137 | } 138 | 139 | ul.keywordmatches li.goodmatch a { 140 | font-weight: bold; 141 | } 142 | 143 | /* -- index page ------------------------------------------------------------ */ 144 | 145 | table.contentstable { 146 | width: 90%; 147 | margin-left: auto; 148 | margin-right: auto; 149 | } 150 | 151 | table.contentstable p.biglink { 152 | line-height: 150%; 153 | } 154 | 155 | a.biglink { 156 | font-size: 1.3em; 157 | } 158 | 159 | span.linkdescr { 160 | font-style: italic; 161 | padding-top: 5px; 162 | font-size: 90%; 163 | } 164 | 165 | /* -- general index --------------------------------------------------------- */ 166 | 167 | table.indextable { 168 | width: 100%; 169 | } 170 | 171 | table.indextable td { 172 | text-align: left; 173 | vertical-align: top; 174 | } 175 | 176 | table.indextable ul { 177 | margin-top: 0; 178 | margin-bottom: 0; 179 | list-style-type: none; 180 | } 181 | 182 | table.indextable > tbody > tr > td > ul { 183 | padding-left: 0em; 184 | } 185 | 186 | table.indextable tr.pcap { 187 | height: 10px; 188 | } 189 | 190 | table.indextable tr.cap { 191 | margin-top: 10px; 192 | background-color: #f2f2f2; 193 | } 194 | 195 | img.toggler { 196 | margin-right: 3px; 197 | margin-top: 3px; 198 | cursor: pointer; 199 | } 200 | 201 | div.modindex-jumpbox { 202 | border-top: 1px solid #ddd; 203 | border-bottom: 1px solid #ddd; 204 | margin: 1em 0 1em 0; 205 | padding: 0.4em; 206 | } 207 | 208 | div.genindex-jumpbox { 209 | border-top: 1px solid #ddd; 210 | border-bottom: 1px solid #ddd; 211 | margin: 1em 0 1em 0; 212 | padding: 0.4em; 213 | } 214 | 215 | /* -- domain module index --------------------------------------------------- */ 216 | 217 | table.modindextable td { 218 | padding: 2px; 219 | border-collapse: collapse; 220 | } 221 | 222 | /* -- general body styles --------------------------------------------------- */ 223 | 224 | div.body { 225 | min-width: 450px; 226 | max-width: 800px; 227 | } 228 | 229 | div.body p, div.body dd, div.body li, div.body blockquote { 230 | -moz-hyphens: auto; 231 | -ms-hyphens: auto; 232 | -webkit-hyphens: auto; 233 | hyphens: auto; 234 | } 235 | 236 | a.headerlink { 237 | visibility: hidden; 238 | } 239 | 240 | a.brackets:before, 241 | span.brackets > a:before{ 242 | content: "["; 243 | } 244 | 245 | a.brackets:after, 246 | span.brackets > a:after { 247 | content: "]"; 248 | } 249 | 250 | h1:hover > a.headerlink, 251 | h2:hover > a.headerlink, 252 | h3:hover > a.headerlink, 253 | h4:hover > a.headerlink, 254 | h5:hover > a.headerlink, 255 | h6:hover > a.headerlink, 256 | dt:hover > a.headerlink, 257 | caption:hover > a.headerlink, 258 | p.caption:hover > a.headerlink, 259 | div.code-block-caption:hover > a.headerlink { 260 | visibility: visible; 261 | } 262 | 263 | div.body p.caption { 264 | text-align: inherit; 265 | } 266 | 267 | div.body td { 268 | text-align: left; 269 | } 270 | 271 | .first { 272 | margin-top: 0 !important; 273 | } 274 | 275 | p.rubric { 276 | margin-top: 30px; 277 | font-weight: bold; 278 | } 279 | 280 | img.align-left, figure.align-left, .figure.align-left, object.align-left { 281 | clear: left; 282 | float: left; 283 | margin-right: 1em; 284 | } 285 | 286 | img.align-right, figure.align-right, .figure.align-right, object.align-right { 287 | clear: right; 288 | float: right; 289 | margin-left: 1em; 290 | } 291 | 292 | img.align-center, figure.align-center, .figure.align-center, object.align-center { 293 | display: block; 294 | margin-left: auto; 295 | margin-right: auto; 296 | } 297 | 298 | img.align-default, figure.align-default, .figure.align-default { 299 | display: block; 300 | margin-left: auto; 301 | margin-right: auto; 302 | } 303 | 304 | .align-left { 305 | text-align: left; 306 | } 307 | 308 | .align-center { 309 | text-align: center; 310 | } 311 | 312 | .align-default { 313 | text-align: center; 314 | } 315 | 316 | .align-right { 317 | text-align: right; 318 | } 319 | 320 | /* -- sidebars -------------------------------------------------------------- */ 321 | 322 | div.sidebar, 323 | aside.sidebar { 324 | margin: 0 0 0.5em 1em; 325 | border: 1px solid #ddb; 326 | padding: 7px; 327 | background-color: #ffe; 328 | width: 40%; 329 | float: right; 330 | clear: right; 331 | overflow-x: auto; 332 | } 333 | 334 | p.sidebar-title { 335 | font-weight: bold; 336 | } 337 | 338 | div.admonition, div.topic, blockquote { 339 | clear: left; 340 | } 341 | 342 | /* -- topics ---------------------------------------------------------------- */ 343 | 344 | div.topic { 345 | border: 1px solid #ccc; 346 | padding: 7px; 347 | margin: 10px 0 10px 0; 348 | } 349 | 350 | p.topic-title { 351 | font-size: 1.1em; 352 | font-weight: bold; 353 | margin-top: 10px; 354 | } 355 | 356 | /* -- admonitions ----------------------------------------------------------- */ 357 | 358 | div.admonition { 359 | margin-top: 10px; 360 | margin-bottom: 10px; 361 | padding: 7px; 362 | } 363 | 364 | div.admonition dt { 365 | font-weight: bold; 366 | } 367 | 368 | p.admonition-title { 369 | margin: 0px 10px 5px 0px; 370 | font-weight: bold; 371 | } 372 | 373 | div.body p.centered { 374 | text-align: center; 375 | margin-top: 25px; 376 | } 377 | 378 | /* -- content of sidebars/topics/admonitions -------------------------------- */ 379 | 380 | div.sidebar > :last-child, 381 | aside.sidebar > :last-child, 382 | div.topic > :last-child, 383 | div.admonition > :last-child { 384 | margin-bottom: 0; 385 | } 386 | 387 | div.sidebar::after, 388 | aside.sidebar::after, 389 | div.topic::after, 390 | div.admonition::after, 391 | blockquote::after { 392 | display: block; 393 | content: ''; 394 | clear: both; 395 | } 396 | 397 | /* -- tables ---------------------------------------------------------------- */ 398 | 399 | table.docutils { 400 | margin-top: 10px; 401 | margin-bottom: 10px; 402 | border: 0; 403 | border-collapse: collapse; 404 | } 405 | 406 | table.align-center { 407 | margin-left: auto; 408 | margin-right: auto; 409 | } 410 | 411 | table.align-default { 412 | margin-left: auto; 413 | margin-right: auto; 414 | } 415 | 416 | table caption span.caption-number { 417 | font-style: italic; 418 | } 419 | 420 | table caption span.caption-text { 421 | } 422 | 423 | table.docutils td, table.docutils th { 424 | padding: 1px 8px 1px 5px; 425 | border-top: 0; 426 | border-left: 0; 427 | border-right: 0; 428 | border-bottom: 1px solid #aaa; 429 | } 430 | 431 | table.footnote td, table.footnote th { 432 | border: 0 !important; 433 | } 434 | 435 | th { 436 | text-align: left; 437 | padding-right: 5px; 438 | } 439 | 440 | table.citation { 441 | border-left: solid 1px gray; 442 | margin-left: 1px; 443 | } 444 | 445 | table.citation td { 446 | border-bottom: none; 447 | } 448 | 449 | th > :first-child, 450 | td > :first-child { 451 | margin-top: 0px; 452 | } 453 | 454 | th > :last-child, 455 | td > :last-child { 456 | margin-bottom: 0px; 457 | } 458 | 459 | /* -- figures --------------------------------------------------------------- */ 460 | 461 | div.figure, figure { 462 | margin: 0.5em; 463 | padding: 0.5em; 464 | } 465 | 466 | div.figure p.caption, figcaption { 467 | padding: 0.3em; 468 | } 469 | 470 | div.figure p.caption span.caption-number, 471 | figcaption span.caption-number { 472 | font-style: italic; 473 | } 474 | 475 | div.figure p.caption span.caption-text, 476 | figcaption span.caption-text { 477 | } 478 | 479 | /* -- field list styles ----------------------------------------------------- */ 480 | 481 | table.field-list td, table.field-list th { 482 | border: 0 !important; 483 | } 484 | 485 | .field-list ul { 486 | margin: 0; 487 | padding-left: 1em; 488 | } 489 | 490 | .field-list p { 491 | margin: 0; 492 | } 493 | 494 | .field-name { 495 | -moz-hyphens: manual; 496 | -ms-hyphens: manual; 497 | -webkit-hyphens: manual; 498 | hyphens: manual; 499 | } 500 | 501 | /* -- hlist styles ---------------------------------------------------------- */ 502 | 503 | table.hlist { 504 | margin: 1em 0; 505 | } 506 | 507 | table.hlist td { 508 | vertical-align: top; 509 | } 510 | 511 | /* -- object description styles --------------------------------------------- */ 512 | 513 | .sig { 514 | font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; 515 | } 516 | 517 | .sig-name, code.descname { 518 | background-color: transparent; 519 | font-weight: bold; 520 | } 521 | 522 | .sig-name { 523 | font-size: 1.1em; 524 | } 525 | 526 | code.descname { 527 | font-size: 1.2em; 528 | } 529 | 530 | .sig-prename, code.descclassname { 531 | background-color: transparent; 532 | } 533 | 534 | .optional { 535 | font-size: 1.3em; 536 | } 537 | 538 | .sig-paren { 539 | font-size: larger; 540 | } 541 | 542 | .sig-param.n { 543 | font-style: italic; 544 | } 545 | 546 | /* C++ specific styling */ 547 | 548 | .sig-inline.c-texpr, 549 | .sig-inline.cpp-texpr { 550 | font-family: unset; 551 | } 552 | 553 | .sig.c .k, .sig.c .kt, 554 | .sig.cpp .k, .sig.cpp .kt { 555 | color: #0033B3; 556 | } 557 | 558 | .sig.c .m, 559 | .sig.cpp .m { 560 | color: #1750EB; 561 | } 562 | 563 | .sig.c .s, .sig.c .sc, 564 | .sig.cpp .s, .sig.cpp .sc { 565 | color: #067D17; 566 | } 567 | 568 | 569 | /* -- other body styles ----------------------------------------------------- */ 570 | 571 | ol.arabic { 572 | list-style: decimal; 573 | } 574 | 575 | ol.loweralpha { 576 | list-style: lower-alpha; 577 | } 578 | 579 | ol.upperalpha { 580 | list-style: upper-alpha; 581 | } 582 | 583 | ol.lowerroman { 584 | list-style: lower-roman; 585 | } 586 | 587 | ol.upperroman { 588 | list-style: upper-roman; 589 | } 590 | 591 | :not(li) > ol > li:first-child > :first-child, 592 | :not(li) > ul > li:first-child > :first-child { 593 | margin-top: 0px; 594 | } 595 | 596 | :not(li) > ol > li:last-child > :last-child, 597 | :not(li) > ul > li:last-child > :last-child { 598 | margin-bottom: 0px; 599 | } 600 | 601 | ol.simple ol p, 602 | ol.simple ul p, 603 | ul.simple ol p, 604 | ul.simple ul p { 605 | margin-top: 0; 606 | } 607 | 608 | ol.simple > li:not(:first-child) > p, 609 | ul.simple > li:not(:first-child) > p { 610 | margin-top: 0; 611 | } 612 | 613 | ol.simple p, 614 | ul.simple p { 615 | margin-bottom: 0; 616 | } 617 | 618 | dl.footnote > dt, 619 | dl.citation > dt { 620 | float: left; 621 | margin-right: 0.5em; 622 | } 623 | 624 | dl.footnote > dd, 625 | dl.citation > dd { 626 | margin-bottom: 0em; 627 | } 628 | 629 | dl.footnote > dd:after, 630 | dl.citation > dd:after { 631 | content: ""; 632 | clear: both; 633 | } 634 | 635 | dl.field-list { 636 | display: grid; 637 | grid-template-columns: fit-content(30%) auto; 638 | } 639 | 640 | dl.field-list > dt { 641 | font-weight: bold; 642 | word-break: break-word; 643 | padding-left: 0.5em; 644 | padding-right: 5px; 645 | } 646 | 647 | dl.field-list > dt:after { 648 | content: ":"; 649 | } 650 | 651 | dl.field-list > dd { 652 | padding-left: 0.5em; 653 | margin-top: 0em; 654 | margin-left: 0em; 655 | margin-bottom: 0em; 656 | } 657 | 658 | dl { 659 | margin-bottom: 15px; 660 | } 661 | 662 | dd > :first-child { 663 | margin-top: 0px; 664 | } 665 | 666 | dd ul, dd table { 667 | margin-bottom: 10px; 668 | } 669 | 670 | dd { 671 | margin-top: 3px; 672 | margin-bottom: 10px; 673 | margin-left: 30px; 674 | } 675 | 676 | dl > dd:last-child, 677 | dl > dd:last-child > :last-child { 678 | margin-bottom: 0; 679 | } 680 | 681 | dt:target, span.highlighted { 682 | background-color: #fbe54e; 683 | } 684 | 685 | rect.highlighted { 686 | fill: #fbe54e; 687 | } 688 | 689 | dl.glossary dt { 690 | font-weight: bold; 691 | font-size: 1.1em; 692 | } 693 | 694 | .versionmodified { 695 | font-style: italic; 696 | } 697 | 698 | .system-message { 699 | background-color: #fda; 700 | padding: 5px; 701 | border: 3px solid red; 702 | } 703 | 704 | .footnote:target { 705 | background-color: #ffa; 706 | } 707 | 708 | .line-block { 709 | display: block; 710 | margin-top: 1em; 711 | margin-bottom: 1em; 712 | } 713 | 714 | .line-block .line-block { 715 | margin-top: 0; 716 | margin-bottom: 0; 717 | margin-left: 1.5em; 718 | } 719 | 720 | .guilabel, .menuselection { 721 | font-family: sans-serif; 722 | } 723 | 724 | .accelerator { 725 | text-decoration: underline; 726 | } 727 | 728 | .classifier { 729 | font-style: oblique; 730 | } 731 | 732 | .classifier:before { 733 | font-style: normal; 734 | margin: 0 0.5em; 735 | content: ":"; 736 | display: inline-block; 737 | } 738 | 739 | abbr, acronym { 740 | border-bottom: dotted 1px; 741 | cursor: help; 742 | } 743 | 744 | /* -- code displays --------------------------------------------------------- */ 745 | 746 | pre { 747 | overflow: auto; 748 | overflow-y: hidden; /* fixes display issues on Chrome browsers */ 749 | } 750 | 751 | pre, div[class*="highlight-"] { 752 | clear: both; 753 | } 754 | 755 | span.pre { 756 | -moz-hyphens: none; 757 | -ms-hyphens: none; 758 | -webkit-hyphens: none; 759 | hyphens: none; 760 | white-space: nowrap; 761 | } 762 | 763 | div[class*="highlight-"] { 764 | margin: 1em 0; 765 | } 766 | 767 | td.linenos pre { 768 | border: 0; 769 | background-color: transparent; 770 | color: #aaa; 771 | } 772 | 773 | table.highlighttable { 774 | display: block; 775 | } 776 | 777 | table.highlighttable tbody { 778 | display: block; 779 | } 780 | 781 | table.highlighttable tr { 782 | display: flex; 783 | } 784 | 785 | table.highlighttable td { 786 | margin: 0; 787 | padding: 0; 788 | } 789 | 790 | table.highlighttable td.linenos { 791 | padding-right: 0.5em; 792 | } 793 | 794 | table.highlighttable td.code { 795 | flex: 1; 796 | overflow: hidden; 797 | } 798 | 799 | .highlight .hll { 800 | display: block; 801 | } 802 | 803 | div.highlight pre, 804 | table.highlighttable pre { 805 | margin: 0; 806 | } 807 | 808 | div.code-block-caption + div { 809 | margin-top: 0; 810 | } 811 | 812 | div.code-block-caption { 813 | margin-top: 1em; 814 | padding: 2px 5px; 815 | font-size: small; 816 | } 817 | 818 | div.code-block-caption code { 819 | background-color: transparent; 820 | } 821 | 822 | table.highlighttable td.linenos, 823 | span.linenos, 824 | div.highlight span.gp { /* gp: Generic.Prompt */ 825 | user-select: none; 826 | -webkit-user-select: text; /* Safari fallback only */ 827 | -webkit-user-select: none; /* Chrome/Safari */ 828 | -moz-user-select: none; /* Firefox */ 829 | -ms-user-select: none; /* IE10+ */ 830 | } 831 | 832 | div.code-block-caption span.caption-number { 833 | padding: 0.1em 0.3em; 834 | font-style: italic; 835 | } 836 | 837 | div.code-block-caption span.caption-text { 838 | } 839 | 840 | div.literal-block-wrapper { 841 | margin: 1em 0; 842 | } 843 | 844 | code.xref, a code { 845 | background-color: transparent; 846 | font-weight: bold; 847 | } 848 | 849 | h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { 850 | background-color: transparent; 851 | } 852 | 853 | .viewcode-link { 854 | float: right; 855 | } 856 | 857 | .viewcode-back { 858 | float: right; 859 | font-family: sans-serif; 860 | } 861 | 862 | div.viewcode-block:target { 863 | margin: -1px -10px; 864 | padding: 0 10px; 865 | } 866 | 867 | /* -- math display ---------------------------------------------------------- */ 868 | 869 | img.math { 870 | vertical-align: middle; 871 | } 872 | 873 | div.body div.math p { 874 | text-align: center; 875 | } 876 | 877 | span.eqno { 878 | float: right; 879 | } 880 | 881 | span.eqno a.headerlink { 882 | position: absolute; 883 | z-index: 1; 884 | } 885 | 886 | div.math:hover a.headerlink { 887 | visibility: visible; 888 | } 889 | 890 | /* -- printout stylesheet --------------------------------------------------- */ 891 | 892 | @media print { 893 | div.document, 894 | div.documentwrapper, 895 | div.bodywrapper { 896 | margin: 0 !important; 897 | width: 100%; 898 | } 899 | 900 | div.sphinxsidebar, 901 | div.related, 902 | div.footer, 903 | #top-link { 904 | display: none; 905 | } 906 | } -------------------------------------------------------------------------------- /docs/_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * doctools.js 3 | * ~~~~~~~~~~~ 4 | * 5 | * Sphinx JavaScript utilities for all documentation. 6 | * 7 | * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | /** 13 | * select a different prefix for underscore 14 | */ 15 | $u = _.noConflict(); 16 | 17 | /** 18 | * make the code below compatible with browsers without 19 | * an installed firebug like debugger 20 | if (!window.console || !console.firebug) { 21 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", 22 | "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", 23 | "profile", "profileEnd"]; 24 | window.console = {}; 25 | for (var i = 0; i < names.length; ++i) 26 | window.console[names[i]] = function() {}; 27 | } 28 | */ 29 | 30 | /** 31 | * small helper function to urldecode strings 32 | * 33 | * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL 34 | */ 35 | jQuery.urldecode = function(x) { 36 | if (!x) { 37 | return x 38 | } 39 | return decodeURIComponent(x.replace(/\+/g, ' ')); 40 | }; 41 | 42 | /** 43 | * small helper function to urlencode strings 44 | */ 45 | jQuery.urlencode = encodeURIComponent; 46 | 47 | /** 48 | * This function returns the parsed url parameters of the 49 | * current request. Multiple values per key are supported, 50 | * it will always return arrays of strings for the value parts. 51 | */ 52 | jQuery.getQueryParameters = function(s) { 53 | if (typeof s === 'undefined') 54 | s = document.location.search; 55 | var parts = s.substr(s.indexOf('?') + 1).split('&'); 56 | var result = {}; 57 | for (var i = 0; i < parts.length; i++) { 58 | var tmp = parts[i].split('=', 2); 59 | var key = jQuery.urldecode(tmp[0]); 60 | var value = jQuery.urldecode(tmp[1]); 61 | if (key in result) 62 | result[key].push(value); 63 | else 64 | result[key] = [value]; 65 | } 66 | return result; 67 | }; 68 | 69 | /** 70 | * highlight a given string on a jquery object by wrapping it in 71 | * span elements with the given class name. 72 | */ 73 | jQuery.fn.highlightText = function(text, className) { 74 | function highlight(node, addItems) { 75 | if (node.nodeType === 3) { 76 | var val = node.nodeValue; 77 | var pos = val.toLowerCase().indexOf(text); 78 | if (pos >= 0 && 79 | !jQuery(node.parentNode).hasClass(className) && 80 | !jQuery(node.parentNode).hasClass("nohighlight")) { 81 | var span; 82 | var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); 83 | if (isInSVG) { 84 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 85 | } else { 86 | span = document.createElement("span"); 87 | span.className = className; 88 | } 89 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 90 | node.parentNode.insertBefore(span, node.parentNode.insertBefore( 91 | document.createTextNode(val.substr(pos + text.length)), 92 | node.nextSibling)); 93 | node.nodeValue = val.substr(0, pos); 94 | if (isInSVG) { 95 | var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 96 | var bbox = node.parentElement.getBBox(); 97 | rect.x.baseVal.value = bbox.x; 98 | rect.y.baseVal.value = bbox.y; 99 | rect.width.baseVal.value = bbox.width; 100 | rect.height.baseVal.value = bbox.height; 101 | rect.setAttribute('class', className); 102 | addItems.push({ 103 | "parent": node.parentNode, 104 | "target": rect}); 105 | } 106 | } 107 | } 108 | else if (!jQuery(node).is("button, select, textarea")) { 109 | jQuery.each(node.childNodes, function() { 110 | highlight(this, addItems); 111 | }); 112 | } 113 | } 114 | var addItems = []; 115 | var result = this.each(function() { 116 | highlight(this, addItems); 117 | }); 118 | for (var i = 0; i < addItems.length; ++i) { 119 | jQuery(addItems[i].parent).before(addItems[i].target); 120 | } 121 | return result; 122 | }; 123 | 124 | /* 125 | * backward compatibility for jQuery.browser 126 | * This will be supported until firefox bug is fixed. 127 | */ 128 | if (!jQuery.browser) { 129 | jQuery.uaMatch = function(ua) { 130 | ua = ua.toLowerCase(); 131 | 132 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 133 | /(webkit)[ \/]([\w.]+)/.exec(ua) || 134 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 135 | /(msie) ([\w.]+)/.exec(ua) || 136 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 137 | []; 138 | 139 | return { 140 | browser: match[ 1 ] || "", 141 | version: match[ 2 ] || "0" 142 | }; 143 | }; 144 | jQuery.browser = {}; 145 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; 146 | } 147 | 148 | /** 149 | * Small JavaScript module for the documentation. 150 | */ 151 | var Documentation = { 152 | 153 | init : function() { 154 | this.fixFirefoxAnchorBug(); 155 | this.highlightSearchWords(); 156 | this.initIndexTable(); 157 | this.initOnKeyListeners(); 158 | }, 159 | 160 | /** 161 | * i18n support 162 | */ 163 | TRANSLATIONS : {}, 164 | PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, 165 | LOCALE : 'unknown', 166 | 167 | // gettext and ngettext don't access this so that the functions 168 | // can safely bound to a different name (_ = Documentation.gettext) 169 | gettext : function(string) { 170 | var translated = Documentation.TRANSLATIONS[string]; 171 | if (typeof translated === 'undefined') 172 | return string; 173 | return (typeof translated === 'string') ? translated : translated[0]; 174 | }, 175 | 176 | ngettext : function(singular, plural, n) { 177 | var translated = Documentation.TRANSLATIONS[singular]; 178 | if (typeof translated === 'undefined') 179 | return (n == 1) ? singular : plural; 180 | return translated[Documentation.PLURALEXPR(n)]; 181 | }, 182 | 183 | addTranslations : function(catalog) { 184 | for (var key in catalog.messages) 185 | this.TRANSLATIONS[key] = catalog.messages[key]; 186 | this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); 187 | this.LOCALE = catalog.locale; 188 | }, 189 | 190 | /** 191 | * add context elements like header anchor links 192 | */ 193 | addContextElements : function() { 194 | $('div[id] > :header:first').each(function() { 195 | $('\u00B6'). 196 | attr('href', '#' + this.id). 197 | attr('title', _('Permalink to this headline')). 198 | appendTo(this); 199 | }); 200 | $('dt[id]').each(function() { 201 | $('\u00B6'). 202 | attr('href', '#' + this.id). 203 | attr('title', _('Permalink to this definition')). 204 | appendTo(this); 205 | }); 206 | }, 207 | 208 | /** 209 | * workaround a firefox stupidity 210 | * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 211 | */ 212 | fixFirefoxAnchorBug : function() { 213 | if (document.location.hash && $.browser.mozilla) 214 | window.setTimeout(function() { 215 | document.location.href += ''; 216 | }, 10); 217 | }, 218 | 219 | /** 220 | * highlight the search words provided in the url in the text 221 | */ 222 | highlightSearchWords : function() { 223 | var params = $.getQueryParameters(); 224 | var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; 225 | if (terms.length) { 226 | var body = $('div.body'); 227 | if (!body.length) { 228 | body = $('body'); 229 | } 230 | window.setTimeout(function() { 231 | $.each(terms, function() { 232 | body.highlightText(this.toLowerCase(), 'highlighted'); 233 | }); 234 | }, 10); 235 | $('') 237 | .appendTo($('#searchbox')); 238 | } 239 | }, 240 | 241 | /** 242 | * init the domain index toggle buttons 243 | */ 244 | initIndexTable : function() { 245 | var togglers = $('img.toggler').click(function() { 246 | var src = $(this).attr('src'); 247 | var idnum = $(this).attr('id').substr(7); 248 | $('tr.cg-' + idnum).toggle(); 249 | if (src.substr(-9) === 'minus.png') 250 | $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); 251 | else 252 | $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); 253 | }).css('display', ''); 254 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { 255 | togglers.click(); 256 | } 257 | }, 258 | 259 | /** 260 | * helper function to hide the search marks again 261 | */ 262 | hideSearchWords : function() { 263 | $('#searchbox .highlight-link').fadeOut(300); 264 | $('span.highlighted').removeClass('highlighted'); 265 | var url = new URL(window.location); 266 | url.searchParams.delete('highlight'); 267 | window.history.replaceState({}, '', url); 268 | }, 269 | 270 | /** 271 | * helper function to focus on search bar 272 | */ 273 | focusSearchBar : function() { 274 | $('input[name=q]').first().focus(); 275 | }, 276 | 277 | /** 278 | * make the url absolute 279 | */ 280 | makeURL : function(relativeURL) { 281 | return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; 282 | }, 283 | 284 | /** 285 | * get the current relative url 286 | */ 287 | getCurrentURL : function() { 288 | var path = document.location.pathname; 289 | var parts = path.split(/\//); 290 | $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { 291 | if (this === '..') 292 | parts.pop(); 293 | }); 294 | var url = parts.join('/'); 295 | return path.substring(url.lastIndexOf('/') + 1, path.length - 1); 296 | }, 297 | 298 | initOnKeyListeners: function() { 299 | // only install a listener if it is really needed 300 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && 301 | !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) 302 | return; 303 | 304 | $(document).keydown(function(event) { 305 | var activeElementType = document.activeElement.tagName; 306 | // don't navigate when in search box, textarea, dropdown or button 307 | if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' 308 | && activeElementType !== 'BUTTON') { 309 | if (event.altKey || event.ctrlKey || event.metaKey) 310 | return; 311 | 312 | if (!event.shiftKey) { 313 | switch (event.key) { 314 | case 'ArrowLeft': 315 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) 316 | break; 317 | var prevHref = $('link[rel="prev"]').prop('href'); 318 | if (prevHref) { 319 | window.location.href = prevHref; 320 | return false; 321 | } 322 | break; 323 | case 'ArrowRight': 324 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) 325 | break; 326 | var nextHref = $('link[rel="next"]').prop('href'); 327 | if (nextHref) { 328 | window.location.href = nextHref; 329 | return false; 330 | } 331 | break; 332 | case 'Escape': 333 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) 334 | break; 335 | Documentation.hideSearchWords(); 336 | return false; 337 | } 338 | } 339 | 340 | // some keyboard layouts may need Shift to get / 341 | switch (event.key) { 342 | case '/': 343 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) 344 | break; 345 | Documentation.focusSearchBar(); 346 | return false; 347 | } 348 | } 349 | }); 350 | } 351 | }; 352 | 353 | // quick alias for translations 354 | _ = Documentation.gettext; 355 | 356 | $(document).ready(function() { 357 | Documentation.init(); 358 | }); 359 | -------------------------------------------------------------------------------- /docs/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | var DOCUMENTATION_OPTIONS = { 2 | URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), 3 | VERSION: '1.3.0', 4 | LANGUAGE: 'None', 5 | COLLAPSE_INDEX: false, 6 | BUILDER: 'html', 7 | FILE_SUFFIX: '.html', 8 | LINK_SUFFIX: '.html', 9 | HAS_SOURCE: true, 10 | SOURCELINK_SUFFIX: '.txt', 11 | NAVIGATION_WITH_KEYS: false, 12 | SHOW_SEARCH_SUMMARY: true, 13 | ENABLE_SEARCH_SHORTCUTS: true, 14 | }; -------------------------------------------------------------------------------- /docs/_static/language_data.js: -------------------------------------------------------------------------------- 1 | /* 2 | * language_data.js 3 | * ~~~~~~~~~~~~~~~~ 4 | * 5 | * This script contains the language-specific data used by searchtools.js, 6 | * namely the list of stopwords, stemmer, scorer and splitter. 7 | * 8 | * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. 9 | * :license: BSD, see LICENSE for details. 10 | * 11 | */ 12 | 13 | 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"]; 14 | 15 | 16 | /* Non-minified version is copied as a separate JS file, is available */ 17 | 18 | /** 19 | * Porter Stemmer 20 | */ 21 | var Stemmer = function() { 22 | 23 | var step2list = { 24 | ational: 'ate', 25 | tional: 'tion', 26 | enci: 'ence', 27 | anci: 'ance', 28 | izer: 'ize', 29 | bli: 'ble', 30 | alli: 'al', 31 | entli: 'ent', 32 | eli: 'e', 33 | ousli: 'ous', 34 | ization: 'ize', 35 | ation: 'ate', 36 | ator: 'ate', 37 | alism: 'al', 38 | iveness: 'ive', 39 | fulness: 'ful', 40 | ousness: 'ous', 41 | aliti: 'al', 42 | iviti: 'ive', 43 | biliti: 'ble', 44 | logi: 'log' 45 | }; 46 | 47 | var step3list = { 48 | icate: 'ic', 49 | ative: '', 50 | alize: 'al', 51 | iciti: 'ic', 52 | ical: 'ic', 53 | ful: '', 54 | ness: '' 55 | }; 56 | 57 | var c = "[^aeiou]"; // consonant 58 | var v = "[aeiouy]"; // vowel 59 | var C = c + "[^aeiouy]*"; // consonant sequence 60 | var V = v + "[aeiou]*"; // vowel sequence 61 | 62 | var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 63 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 64 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 65 | var s_v = "^(" + C + ")?" + v; // vowel in stem 66 | 67 | this.stemWord = function (w) { 68 | var stem; 69 | var suffix; 70 | var firstch; 71 | var origword = w; 72 | 73 | if (w.length < 3) 74 | return w; 75 | 76 | var re; 77 | var re2; 78 | var re3; 79 | var re4; 80 | 81 | firstch = w.substr(0,1); 82 | if (firstch == "y") 83 | w = firstch.toUpperCase() + w.substr(1); 84 | 85 | // Step 1a 86 | re = /^(.+?)(ss|i)es$/; 87 | re2 = /^(.+?)([^s])s$/; 88 | 89 | if (re.test(w)) 90 | w = w.replace(re,"$1$2"); 91 | else if (re2.test(w)) 92 | w = w.replace(re2,"$1$2"); 93 | 94 | // Step 1b 95 | re = /^(.+?)eed$/; 96 | re2 = /^(.+?)(ed|ing)$/; 97 | if (re.test(w)) { 98 | var fp = re.exec(w); 99 | re = new RegExp(mgr0); 100 | if (re.test(fp[1])) { 101 | re = /.$/; 102 | w = w.replace(re,""); 103 | } 104 | } 105 | else if (re2.test(w)) { 106 | var fp = re2.exec(w); 107 | stem = fp[1]; 108 | re2 = new RegExp(s_v); 109 | if (re2.test(stem)) { 110 | w = stem; 111 | re2 = /(at|bl|iz)$/; 112 | re3 = new RegExp("([^aeiouylsz])\\1$"); 113 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 114 | if (re2.test(w)) 115 | w = w + "e"; 116 | else if (re3.test(w)) { 117 | re = /.$/; 118 | w = w.replace(re,""); 119 | } 120 | else if (re4.test(w)) 121 | w = w + "e"; 122 | } 123 | } 124 | 125 | // Step 1c 126 | re = /^(.+?)y$/; 127 | if (re.test(w)) { 128 | var fp = re.exec(w); 129 | stem = fp[1]; 130 | re = new RegExp(s_v); 131 | if (re.test(stem)) 132 | w = stem + "i"; 133 | } 134 | 135 | // Step 2 136 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 137 | if (re.test(w)) { 138 | var fp = re.exec(w); 139 | stem = fp[1]; 140 | suffix = fp[2]; 141 | re = new RegExp(mgr0); 142 | if (re.test(stem)) 143 | w = stem + step2list[suffix]; 144 | } 145 | 146 | // Step 3 147 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 148 | if (re.test(w)) { 149 | var fp = re.exec(w); 150 | stem = fp[1]; 151 | suffix = fp[2]; 152 | re = new RegExp(mgr0); 153 | if (re.test(stem)) 154 | w = stem + step3list[suffix]; 155 | } 156 | 157 | // Step 4 158 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 159 | re2 = /^(.+?)(s|t)(ion)$/; 160 | if (re.test(w)) { 161 | var fp = re.exec(w); 162 | stem = fp[1]; 163 | re = new RegExp(mgr1); 164 | if (re.test(stem)) 165 | w = stem; 166 | } 167 | else if (re2.test(w)) { 168 | var fp = re2.exec(w); 169 | stem = fp[1] + fp[2]; 170 | re2 = new RegExp(mgr1); 171 | if (re2.test(stem)) 172 | w = stem; 173 | } 174 | 175 | // Step 5 176 | re = /^(.+?)e$/; 177 | if (re.test(w)) { 178 | var fp = re.exec(w); 179 | stem = fp[1]; 180 | re = new RegExp(mgr1); 181 | re2 = new RegExp(meq1); 182 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 183 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 184 | w = stem; 185 | } 186 | re = /ll$/; 187 | re2 = new RegExp(mgr1); 188 | if (re.test(w) && re2.test(w)) { 189 | re = /.$/; 190 | w = w.replace(re,""); 191 | } 192 | 193 | // and turn initial Y back to y 194 | if (firstch == "y") 195 | w = firstch.toLowerCase() + w.substr(1); 196 | return w; 197 | } 198 | } 199 | 200 | 201 | 202 | 203 | var splitChars = (function() { 204 | var result = {}; 205 | var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, 206 | 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, 207 | 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, 208 | 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, 209 | 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, 210 | 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, 211 | 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, 212 | 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, 213 | 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, 214 | 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; 215 | var i, j, start, end; 216 | for (i = 0; i < singles.length; i++) { 217 | result[singles[i]] = true; 218 | } 219 | var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], 220 | [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], 221 | [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], 222 | [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], 223 | [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], 224 | [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], 225 | [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], 226 | [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], 227 | [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], 228 | [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], 229 | [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], 230 | [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], 231 | [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], 232 | [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], 233 | [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], 234 | [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], 235 | [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], 236 | [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], 237 | [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], 238 | [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], 239 | [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], 240 | [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], 241 | [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], 242 | [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], 243 | [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], 244 | [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], 245 | [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], 246 | [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], 247 | [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], 248 | [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], 249 | [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], 250 | [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], 251 | [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], 252 | [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], 253 | [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], 254 | [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], 255 | [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], 256 | [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], 257 | [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], 258 | [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], 259 | [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], 260 | [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], 261 | [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], 262 | [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], 263 | [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], 264 | [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], 265 | [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], 266 | [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], 267 | [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; 268 | for (i = 0; i < ranges.length; i++) { 269 | start = ranges[i][0]; 270 | end = ranges[i][1]; 271 | for (j = start; j <= end; j++) { 272 | result[j] = true; 273 | } 274 | } 275 | return result; 276 | })(); 277 | 278 | function splitQuery(query) { 279 | var result = []; 280 | var start = -1; 281 | for (var i = 0; i < query.length; i++) { 282 | if (splitChars[query.charCodeAt(i)]) { 283 | if (start !== -1) { 284 | result.push(query.slice(start, i)); 285 | start = -1; 286 | } 287 | } else if (start === -1) { 288 | start = i; 289 | } 290 | } 291 | if (start !== -1) { 292 | result.push(query.slice(start)); 293 | } 294 | return result; 295 | } 296 | 297 | 298 | -------------------------------------------------------------------------------- /docs/_static/searchtools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * searchtools.js 3 | * ~~~~~~~~~~~~~~~~ 4 | * 5 | * Sphinx JavaScript utilities for the full-text search. 6 | * 7 | * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | if (!Scorer) { 13 | /** 14 | * Simple result scoring code. 15 | */ 16 | var Scorer = { 17 | // Implement the following function to further tweak the score for each result 18 | // The function takes a result array [filename, title, anchor, descr, score] 19 | // and returns the new score. 20 | /* 21 | score: function(result) { 22 | return result[4]; 23 | }, 24 | */ 25 | 26 | // query matches the full name of an object 27 | objNameMatch: 11, 28 | // or matches in the last dotted part of the object name 29 | objPartialMatch: 6, 30 | // Additive scores depending on the priority of the object 31 | objPrio: {0: 15, // used to be importantResults 32 | 1: 5, // used to be objectResults 33 | 2: -5}, // used to be unimportantResults 34 | // Used when the priority is not in the mapping. 35 | objPrioDefault: 0, 36 | 37 | // query found in title 38 | title: 15, 39 | partialTitle: 7, 40 | // query found in terms 41 | term: 5, 42 | partialTerm: 2 43 | }; 44 | } 45 | 46 | if (!splitQuery) { 47 | function splitQuery(query) { 48 | return query.split(/\s+/); 49 | } 50 | } 51 | 52 | /** 53 | * Search Module 54 | */ 55 | var Search = { 56 | 57 | _index : null, 58 | _queued_query : null, 59 | _pulse_status : -1, 60 | 61 | htmlToText : function(htmlString) { 62 | var virtualDocument = document.implementation.createHTMLDocument('virtual'); 63 | var htmlElement = $(htmlString, virtualDocument); 64 | htmlElement.find('.headerlink').remove(); 65 | docContent = htmlElement.find('[role=main]')[0]; 66 | if(docContent === undefined) { 67 | console.warn("Content block not found. Sphinx search tries to obtain it " + 68 | "via '[role=main]'. Could you check your theme or template."); 69 | return ""; 70 | } 71 | return docContent.textContent || docContent.innerText; 72 | }, 73 | 74 | init : function() { 75 | var params = $.getQueryParameters(); 76 | if (params.q) { 77 | var query = params.q[0]; 78 | $('input[name="q"]')[0].value = query; 79 | this.performSearch(query); 80 | } 81 | }, 82 | 83 | loadIndex : function(url) { 84 | $.ajax({type: "GET", url: url, data: null, 85 | dataType: "script", cache: true, 86 | complete: function(jqxhr, textstatus) { 87 | if (textstatus != "success") { 88 | document.getElementById("searchindexloader").src = url; 89 | } 90 | }}); 91 | }, 92 | 93 | setIndex : function(index) { 94 | var q; 95 | this._index = index; 96 | if ((q = this._queued_query) !== null) { 97 | this._queued_query = null; 98 | Search.query(q); 99 | } 100 | }, 101 | 102 | hasIndex : function() { 103 | return this._index !== null; 104 | }, 105 | 106 | deferQuery : function(query) { 107 | this._queued_query = query; 108 | }, 109 | 110 | stopPulse : function() { 111 | this._pulse_status = 0; 112 | }, 113 | 114 | startPulse : function() { 115 | if (this._pulse_status >= 0) 116 | return; 117 | function pulse() { 118 | var i; 119 | Search._pulse_status = (Search._pulse_status + 1) % 4; 120 | var dotString = ''; 121 | for (i = 0; i < Search._pulse_status; i++) 122 | dotString += '.'; 123 | Search.dots.text(dotString); 124 | if (Search._pulse_status > -1) 125 | window.setTimeout(pulse, 500); 126 | } 127 | pulse(); 128 | }, 129 | 130 | /** 131 | * perform a search for something (or wait until index is loaded) 132 | */ 133 | performSearch : function(query) { 134 | // create the required interface elements 135 | this.out = $('#search-results'); 136 | this.title = $('

' + _('Searching') + '

').appendTo(this.out); 137 | this.dots = $('').appendTo(this.title); 138 | this.status = $('

 

').appendTo(this.out); 139 | this.output = $('