From 6fac264ee44b77e1fffc20e6450a4044e20f72a7 Mon Sep 17 00:00:00 2001 From: LTLA Date: Thu, 28 Sep 2023 15:23:55 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20Artifact?= =?UTF-8?q?DB/dolomite-matrix@dc536bf815f5504472d0c37ef2385512d35bc65b=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .buildinfo | 4 + .nojekyll | 0 .../choose_dense_chunk_sizes.html | 153 +++ .../load_hdf5_dense_array.html | 138 +++ .../dolomite_matrix/stage_DelayedArray.html | 288 ++++++ _modules/dolomite_matrix/stage_ndarray.html | 183 ++++ _modules/index.html | 105 ++ _sources/api/dolomite_matrix.rst.txt | 45 + _sources/api/modules.rst.txt | 7 + _sources/authors.md.txt | 4 + _sources/changelog.md.txt | 4 + _sources/contributing.md.txt | 4 + _sources/index.md.txt | 39 + _sources/license.md.txt | 5 + _sources/readme.md.txt | 4 + _static/alabaster.css | 703 +++++++++++++ _static/basic.css | 925 ++++++++++++++++++ _static/custom.css | 1 + _static/doctools.js | 156 +++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 199 ++++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 75 ++ _static/searchtools.js | 574 +++++++++++ _static/sphinx_highlight.js | 154 +++ api/dolomite_matrix.html | 236 +++++ api/modules.html | 139 +++ authors.html | 114 +++ changelog.html | 122 +++ contributing.html | 352 +++++++ genindex.html | 203 ++++ index.html | 157 +++ license.html | 134 +++ objects.inv | Bin 0 -> 471 bytes py-modindex.html | 141 +++ readme.html | 136 +++ search.html | 125 +++ searchindex.js | 1 + 40 files changed, 5643 insertions(+) create mode 100644 .buildinfo create mode 100644 .nojekyll create mode 100644 _modules/dolomite_matrix/choose_dense_chunk_sizes.html create mode 100644 _modules/dolomite_matrix/load_hdf5_dense_array.html create mode 100644 _modules/dolomite_matrix/stage_DelayedArray.html create mode 100644 _modules/dolomite_matrix/stage_ndarray.html create mode 100644 _modules/index.html create mode 100644 _sources/api/dolomite_matrix.rst.txt create mode 100644 _sources/api/modules.rst.txt create mode 100644 _sources/authors.md.txt create mode 100644 _sources/changelog.md.txt create mode 100644 _sources/contributing.md.txt create mode 100644 _sources/index.md.txt create mode 100644 _sources/license.md.txt create mode 100644 _sources/readme.md.txt create mode 100644 _static/alabaster.css create mode 100644 _static/basic.css create mode 100644 _static/custom.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 api/dolomite_matrix.html create mode 100644 api/modules.html create mode 100644 authors.html create mode 100644 changelog.html create mode 100644 contributing.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 license.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 readme.html create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..8fde519 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 08305ee786fae082286401822252dc1d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_modules/dolomite_matrix/choose_dense_chunk_sizes.html b/_modules/dolomite_matrix/choose_dense_chunk_sizes.html new file mode 100644 index 0000000..749f6b9 --- /dev/null +++ b/_modules/dolomite_matrix/choose_dense_chunk_sizes.html @@ -0,0 +1,153 @@ + + + + + + + dolomite_matrix.choose_dense_chunk_sizes — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for dolomite_matrix.choose_dense_chunk_sizes

+from typing import Tuple
+
+
+
+[docs] +def choose_dense_chunk_sizes(shape: Tuple[int], size: int, min_extent: int = 100, memory: int = 1e7) -> Tuple[int]: + """Chosen some chunk sizes to use for a dense HDF5 dataset. For each + dimension, we consider a slice of the array that consists of the full + extent of all other dimensions. We want this slice to occupy less than + ``memory`` in memory, and we resize the slice along the current dimension + to achieve this. The chosen chunk size is then defined as the size of the + slice along the current dimension. This ensures that efficient iteration + along each dimension will not use any more than ``memory`` bytes. + + Args: + shape: Shape of the array. + + size: Size of each array element in bytes. + + min_extent: + Minimum extent of each chunk dimension, to avoid problems + with excessively small chunk sizes when the data is large. + + memory: + Size of the (conceptual) memory buffer to use for storing blocks of + data during iteration through the array, in bytes. + + Returns: + Tuple containing the chunk dimensions. + """ + + num_elements = int(memory / size) + chunks = [] + + for d, s in enumerate(shape): + otherdim = 1 + for d2, s2 in enumerate(shape): # just calculating it again to avoid overflow issues. + if d2 != d: + otherdim *= s2 + + proposed = int(num_elements / otherdim) + if proposed > s: + proposed = s + elif proposed < min_extent: + proposed = min_extent + + chunks.append(proposed) + + return (*chunks,)
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/dolomite_matrix/load_hdf5_dense_array.html b/_modules/dolomite_matrix/load_hdf5_dense_array.html new file mode 100644 index 0000000..c99a216 --- /dev/null +++ b/_modules/dolomite_matrix/load_hdf5_dense_array.html @@ -0,0 +1,138 @@ + + + + + + + dolomite_matrix.load_hdf5_dense_array — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for dolomite_matrix.load_hdf5_dense_array

+from typing import Any
+from numpy import bool_
+from filebackedarray import Hdf5DenseArray
+from dolomite_base import acquire_file
+
+
+
+[docs] +def load_hdf5_dense_array(meta: dict[str, Any], project, **kwargs) -> Hdf5DenseArray: + """ + Load a HDF5-backed dense array. In general, this function should be + called via :py:meth:`~dolomite_base.load_object.load_object`. + + Args: + meta: Metadata for this HDF5 array. + + project: Value specifying the project of interest. This is most + typically a string containing a file path to a staging directory + but may also be an application-specific object that works with + :py:meth:`~dolomite_base.acquire_file.acquire_file`. + + kwargs: Further arguments, ignored. + + Returns: + A HDF5-backed dense array. + """ + fpath = acquire_file(project, meta["path"]) + name = meta["hdf5_dense_array"]["dataset"] + + dtype = None + if meta["array"]["type"] == "boolean": + dtype = bool_ + + return Hdf5DenseArray(fpath, name, dtype=dtype, native_order=False)
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/dolomite_matrix/stage_DelayedArray.html b/_modules/dolomite_matrix/stage_DelayedArray.html new file mode 100644 index 0000000..0a79d79 --- /dev/null +++ b/_modules/dolomite_matrix/stage_DelayedArray.html @@ -0,0 +1,288 @@ + + + + + + + dolomite_matrix.stage_DelayedArray — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for dolomite_matrix.stage_DelayedArray

+from typing import Tuple, Optional, Any
+from delayedarray import DelayedArray, chunk_shape, is_sparse, extract_dense_array, extract_sparse_array, is_pristine
+from numpy import ceil, prod
+from dolomite_base import stage_object
+import os
+
+from .choose_dense_chunk_sizes import choose_dense_chunk_sizes
+from ._utils import _choose_file_dtype, _translate_array_type, _open_writeable_hdf5_handle
+
+
+def _choose_block_shape(x: DelayedArray, block_size: int) -> Tuple[int, ...]:
+    # Block shapes are calculated by scaling up the chunks (from last to first,
+    # i.e., the fastest changing to the slowest) until the block size is exceeded.
+    full_shape = x.shape
+    ndim = len(full_shape)
+    block_shape = list(chunk_shape(x))
+    block_elements = int(block_size / x.dtype.itemsize)
+
+    for i in range(ndim - 1, -1, -1):
+        current_elements = prod(block_shape) # just recompute it, avoid potential overflow issues.
+        if current_elements >= block_elements:
+            break
+        scaling = int(block_elements / current_elements)
+        if scaling == 1:
+            break
+        block_shape[i] = min(full_shape[i], scaling * block_shape[i])
+
+    return (*block_shape,)
+
+
+def _stage_DelayedArray_dense(
+    x: DelayedArray,
+    dir: str,
+    path: str,
+    is_child: bool = False,
+    chunks: Optional[Tuple[int, ...]] = None,
+    cache_size: int = 1e8,
+    block_size: int = 1e8,
+    **kwargs
+) -> dict[str, Any]:
+    os.mkdir(os.path.join(dir, path))
+    newpath = path + "/array.h5"
+
+    # Coming up with a decent chunk size.
+    if chunks is None:
+        chunks = choose_dense_chunk_sizes(x.shape, x.dtype.itemsize)
+    else:
+        capped = []
+        for i, d in enumerate(x.shape):
+            capped.append(min(d, chunks[i]))
+        chunks = (*capped,)
+
+    # Transposing it so that we save it in the right order.
+    t = x.T
+    chunks = (*list(reversed(chunks)),)
+
+    # Saving the matrix in a blockwise fashion. We progress along the fastest
+    # changing dimension (i.e., the last one), and we shift along the other
+    # dimensions once we need to wrap around.
+    full_shape = t.shape
+    ndim = len(full_shape)
+    block_shape = _choose_block_shape(t, block_size)
+
+    fpath = os.path.join(dir, newpath)
+    with _open_writeable_hdf5_handle(fpath, cache_size) as fhandle:
+        dset = fhandle.create_dataset("data", shape=t.shape, chunks=chunks, dtype=_choose_file_dtype(t.dtype), compression="gzip")
+
+        num_chunks = []
+        subset_as_slices = []
+        for i, s in enumerate(full_shape):
+            b = block_shape[i]
+            num_chunks.append(int(ceil(s / b)))
+            subset_as_slices.append(slice(0, b))
+
+        starts = [0] * len(num_chunks)
+        counter = [0] * len(num_chunks)
+        subset_as_ranges = [None] * len(num_chunks)
+
+        running = True
+        while running:
+            for i, sl in enumerate(subset_as_slices):
+                subset_as_ranges[i] = range(*(sl.indices(full_shape[i])))
+            curblock = extract_dense_array(t, subset_as_ranges)
+            dset[(*subset_as_slices,)] = curblock
+
+            for i in range(ndim - 1, -1, -1):
+                starts[i] += 1
+                block_extent = block_shape[i]
+                if starts[i] < num_chunks[i]:
+                    new_start = starts[i] * block_extent
+                    subset_as_slices[i] = slice(new_start, min(new_start + block_extent, full_shape[i]))
+                    break
+                if i == 0:
+                    running = False
+                    break
+                starts[i] = 0
+                subset_as_slices[i] = slice(0, block_extent)
+
+    return {
+        "$schema": "hdf5_dense_array/v1.json",
+        "path": newpath,
+        "is_child": is_child,
+        "array": {
+            "type": _translate_array_type(x.dtype),
+            "dimensions": list(x.shape),
+        },
+        "hdf5_dense_array": {
+            "dataset": "data",
+        }
+    }
+
+
+
+[docs] +@stage_object.register +def stage_DelayedArray( + x: DelayedArray, + dir: str, + path: str, + is_child: bool = False, + chunks: Optional[Tuple[int, ...]] = None, + cache_size: int = 1e8, + block_size: int = 1e8, + **kwargs +) -> dict[str, Any]: + """Method for saving :py:class:`~numpy.ndarray` objects to file, see + :py:meth:`~dolomite_base.stage_object.stage_object` for details. + + Args: + x: Array to be saved. + + dir: Staging directory. + + path: Relative path inside ``dir`` to save the object. + + is_child: Is ``x`` a child of another object? + + chunks: + Chunk dimensions. If not provided, we choose some chunk sizes with + `:py:meth:`~dolomite_matrix.choose_dense_chunk_sizes.choose_dense_chunk_sizes`. + + cache_size: + Size of the HDF5 cache size, in bytes. Larger values improve speed + at the cost of memory. + + block_size: + Size of each block in bytes. Saving is performed by iterating over + ``x``, extracting one block at a time, and saving it to the HDF5 + file. Larger values improve speed at the cost of memory. + + kwargs: Further arguments, ignored. + + Returns: + Metadata that can be edited by calling methods and then saved with + :py:meth:`~dolomite_base.write_metadata.write_metadata`. + """ + # Seeing if we can call specialized method for the seed in pristine objects. + if is_pristine(x) and isinstance(x, DelayedArray): + candidate = stage_object.dispatch(type(x.seed)) + if stage_object.dispatch(Any) != candidate: + return candidate( + x.seed, + dir=dir, + path=path, + is_child=is_child, + chunks=chunks, + cache_size=cache_size, + block_size=block_size, + **kwargs + ) + + if is_sparse(x): + pass + else: + return _stage_DelayedArray_dense( + x, + dir=dir, + path=path, + is_child=is_child, + chunks=chunks, + cache_size=cache_size, + block_size=block_size, + **kwargs + )
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/dolomite_matrix/stage_ndarray.html b/_modules/dolomite_matrix/stage_ndarray.html new file mode 100644 index 0000000..b508e78 --- /dev/null +++ b/_modules/dolomite_matrix/stage_ndarray.html @@ -0,0 +1,183 @@ + + + + + + + dolomite_matrix.stage_ndarray — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for dolomite_matrix.stage_ndarray

+from typing import Tuple, Optional, Any
+from numpy import ndarray, bool_, uint8
+from dolomite_base import stage_object
+import os
+
+from .choose_dense_chunk_sizes import choose_dense_chunk_sizes
+from ._utils import _translate_array_type, _open_writeable_hdf5_handle, _choose_file_dtype
+
+
+
+[docs] +@stage_object.register +def stage_ndarray( + x: ndarray, + dir: str, + path: str, + is_child: bool = False, + chunks: Optional[Tuple[int, ...]] = None, + cache_size: int = 1e8, + **kwargs +) -> dict[str, Any]: + """Method for saving :py:class:`~numpy.ndarray` objects to file, see + :py:meth:`~dolomite_base.stage_object.stage_object` for details. + + Args: + x: Array to be saved. + + dir: Staging directory. + + path: Relative path inside ``dir`` to save the object. + + is_child: Is ``x`` a child of another object? + + chunks: + Chunk dimensions. If not provided, we choose some chunk sizes with + `:py:meth:`~dolomite_matrix.choose_dense_chunk_sizes.choose_dense_chunk_sizes`. + + cache_size: + Size of the HDF5 cache size, in bytes. Larger values improve speed + at the cost of memory. + + kwargs: Further arguments, ignored. + + Returns: + Metadata that can be edited by calling methods and then saved with + :py:meth:`~dolomite_base.write_metadata.write_metadata`. + """ + os.mkdir(os.path.join(dir, path)) + newpath = path + "/array.h5" + + # Coming up with a decent chunk size. + if chunks is None: + chunks = choose_dense_chunk_sizes(x.shape, x.dtype.itemsize) + else: + capped = [] + for i, d in enumerate(x.shape): + capped.append(min(d, chunks[i])) + chunks = (*capped,) + + # Transposing it so that we save it in the right order. + t = x.T + chunks = (*list(reversed(chunks)),) + + fpath = os.path.join(dir, newpath) + with _open_writeable_hdf5_handle(fpath, cache_size) as fhandle: + fhandle.create_dataset("data", data=t, chunks=chunks, dtype=_choose_file_dtype(t.dtype), compression="gzip") + + return { + "$schema": "hdf5_dense_array/v1.json", + "path": newpath, + "is_child": is_child, + "array": { + "type": _translate_array_type(x.dtype), + "dimensions": list(x.shape), + }, + "hdf5_dense_array": { + "dataset": "data", + } + }
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..647084b --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,105 @@ + + + + + + + Overview: module code — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/_sources/api/dolomite_matrix.rst.txt b/_sources/api/dolomite_matrix.rst.txt new file mode 100644 index 0000000..16d3a15 --- /dev/null +++ b/_sources/api/dolomite_matrix.rst.txt @@ -0,0 +1,45 @@ +dolomite\_matrix package +======================== + +Submodules +---------- + +dolomite\_matrix.choose\_dense\_chunk\_sizes module +--------------------------------------------------- + +.. automodule:: dolomite_matrix.choose_dense_chunk_sizes + :members: + :undoc-members: + :show-inheritance: + +dolomite\_matrix.load\_hdf5\_dense\_array module +------------------------------------------------ + +.. automodule:: dolomite_matrix.load_hdf5_dense_array + :members: + :undoc-members: + :show-inheritance: + +dolomite\_matrix.stage\_DelayedArray module +------------------------------------------- + +.. automodule:: dolomite_matrix.stage_DelayedArray + :members: + :undoc-members: + :show-inheritance: + +dolomite\_matrix.stage\_ndarray module +-------------------------------------- + +.. automodule:: dolomite_matrix.stage_ndarray + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: dolomite_matrix + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/modules.rst.txt b/_sources/api/modules.rst.txt new file mode 100644 index 0000000..29e3ff5 --- /dev/null +++ b/_sources/api/modules.rst.txt @@ -0,0 +1,7 @@ +dolomite_matrix +=============== + +.. toctree:: + :maxdepth: 4 + + dolomite_matrix diff --git a/_sources/authors.md.txt b/_sources/authors.md.txt new file mode 100644 index 0000000..ced47d0 --- /dev/null +++ b/_sources/authors.md.txt @@ -0,0 +1,4 @@ +```{include} ../AUTHORS.md +:relative-docs: docs/ +:relative-images: +``` diff --git a/_sources/changelog.md.txt b/_sources/changelog.md.txt new file mode 100644 index 0000000..6e2f0fb --- /dev/null +++ b/_sources/changelog.md.txt @@ -0,0 +1,4 @@ +```{include} ../CHANGELOG.md +:relative-docs: docs/ +:relative-images: +``` diff --git a/_sources/contributing.md.txt b/_sources/contributing.md.txt new file mode 100644 index 0000000..fc1b213 --- /dev/null +++ b/_sources/contributing.md.txt @@ -0,0 +1,4 @@ +```{include} ../CONTRIBUTING.md +:relative-docs: docs/ +:relative-images: +``` diff --git a/_sources/index.md.txt b/_sources/index.md.txt new file mode 100644 index 0000000..e1d7baf --- /dev/null +++ b/_sources/index.md.txt @@ -0,0 +1,39 @@ +# dolomite-matrix + +Add a short description here! + + +## Note + +> This is the main page of your project's [Sphinx] documentation. It is +> formatted in [Markdown]. Add additional pages by creating md-files in +> `docs` or rst-files (formatted in [reStructuredText]) and adding links to +> them in the `Contents` section below. +> +> Please check [Sphinx] and [MyST] for more information +> about how to document your project and how to configure your preferences. + + +## Contents + +```{toctree} +:maxdepth: 2 + +Overview +Contributions & Help +License +Authors +Changelog +Module Reference +``` + +## Indices and tables + +* {ref}`genindex` +* {ref}`modindex` +* {ref}`search` + +[Sphinx]: http://www.sphinx-doc.org/ +[Markdown]: https://daringfireball.net/projects/markdown/ +[reStructuredText]: http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html +[MyST]: https://myst-parser.readthedocs.io/en/latest/ diff --git a/_sources/license.md.txt b/_sources/license.md.txt new file mode 100644 index 0000000..b231201 --- /dev/null +++ b/_sources/license.md.txt @@ -0,0 +1,5 @@ +# License + +```{literalinclude} ../LICENSE.txt +:language: text +``` diff --git a/_sources/readme.md.txt b/_sources/readme.md.txt new file mode 100644 index 0000000..2cb706b --- /dev/null +++ b/_sources/readme.md.txt @@ -0,0 +1,4 @@ +```{include} ../README.md +:relative-docs: docs/ +:relative-images: +``` diff --git a/_static/alabaster.css b/_static/alabaster.css new file mode 100644 index 0000000..f98defb --- /dev/null +++ b/_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: 1200px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 300px; +} + +div.sphinxsidebar { + width: 300px; + 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: 1200px; + 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/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..30fee9d --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..3864a1c --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.post1.dev1+gdc536bf', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..0d49244 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/api/dolomite_matrix.html b/api/dolomite_matrix.html new file mode 100644 index 0000000..2775624 --- /dev/null +++ b/api/dolomite_matrix.html @@ -0,0 +1,236 @@ + + + + + + + + dolomite_matrix package — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

dolomite_matrix package

+
+

Submodules

+
+
+

dolomite_matrix.choose_dense_chunk_sizes module

+
+
+dolomite_matrix.choose_dense_chunk_sizes.choose_dense_chunk_sizes(shape: Tuple[int], size: int, min_extent: int = 100, memory: int = 10000000.0) Tuple[int][source]
+

Chosen some chunk sizes to use for a dense HDF5 dataset. For each +dimension, we consider a slice of the array that consists of the full +extent of all other dimensions. We want this slice to occupy less than +memory in memory, and we resize the slice along the current dimension +to achieve this. The chosen chunk size is then defined as the size of the +slice along the current dimension. This ensures that efficient iteration +along each dimension will not use any more than memory bytes.

+
+
Parameters:
+
    +
  • shape – Shape of the array.

  • +
  • size – Size of each array element in bytes.

  • +
  • min_extent – Minimum extent of each chunk dimension, to avoid problems +with excessively small chunk sizes when the data is large.

  • +
  • memory – Size of the (conceptual) memory buffer to use for storing blocks of +data during iteration through the array, in bytes.

  • +
+
+
Returns:
+

Tuple containing the chunk dimensions.

+
+
+
+ +
+
+

dolomite_matrix.load_hdf5_dense_array module

+
+
+dolomite_matrix.load_hdf5_dense_array.load_hdf5_dense_array(meta: dict[str, Any], project, **kwargs) Hdf5DenseArray[source]
+

Load a HDF5-backed dense array. In general, this function should be +called via load_object().

+
+
Parameters:
+
    +
  • meta – Metadata for this HDF5 array.

  • +
  • project – Value specifying the project of interest. This is most +typically a string containing a file path to a staging directory +but may also be an application-specific object that works with +acquire_file().

  • +
  • kwargs – Further arguments, ignored.

  • +
+
+
Returns:
+

A HDF5-backed dense array.

+
+
+
+ +
+
+

dolomite_matrix.stage_DelayedArray module

+
+
+dolomite_matrix.stage_DelayedArray.stage_DelayedArray(x: DelayedArray, dir: str, path: str, is_child: bool = False, chunks: Tuple[int, ...] | None = None, cache_size: int = 100000000.0, block_size: int = 100000000.0, **kwargs) dict[str, Any][source]
+

Method for saving ndarray objects to file, see +stage_object() for details.

+
+
Parameters:
+
    +
  • x – Array to be saved.

  • +
  • dir – Staging directory.

  • +
  • path – Relative path inside dir to save the object.

  • +
  • is_child – Is x a child of another object?

  • +
  • chunks – Chunk dimensions. If not provided, we choose some chunk sizes with +:py:meth:`~dolomite_matrix.choose_dense_chunk_sizes.choose_dense_chunk_sizes.

  • +
  • cache_size – Size of the HDF5 cache size, in bytes. Larger values improve speed +at the cost of memory.

  • +
  • block_size – Size of each block in bytes. Saving is performed by iterating over +x, extracting one block at a time, and saving it to the HDF5 +file. Larger values improve speed at the cost of memory.

  • +
  • kwargs – Further arguments, ignored.

  • +
+
+
Returns:
+

Metadata that can be edited by calling methods and then saved with +write_metadata().

+
+
+
+ +
+
+

dolomite_matrix.stage_ndarray module

+
+
+dolomite_matrix.stage_ndarray.stage_ndarray(x: ndarray, dir: str, path: str, is_child: bool = False, chunks: Tuple[int, ...] | None = None, cache_size: int = 100000000.0, **kwargs) dict[str, Any][source]
+

Method for saving ndarray objects to file, see +stage_object() for details.

+
+
Parameters:
+
    +
  • x – Array to be saved.

  • +
  • dir – Staging directory.

  • +
  • path – Relative path inside dir to save the object.

  • +
  • is_child – Is x a child of another object?

  • +
  • chunks – Chunk dimensions. If not provided, we choose some chunk sizes with +:py:meth:`~dolomite_matrix.choose_dense_chunk_sizes.choose_dense_chunk_sizes.

  • +
  • cache_size – Size of the HDF5 cache size, in bytes. Larger values improve speed +at the cost of memory.

  • +
  • kwargs – Further arguments, ignored.

  • +
+
+
Returns:
+

Metadata that can be edited by calling methods and then saved with +write_metadata().

+
+
+
+ +
+
+

Module contents

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/modules.html b/api/modules.html new file mode 100644 index 0000000..d6e6e8c --- /dev/null +++ b/api/modules.html @@ -0,0 +1,139 @@ + + + + + + + + dolomite_matrix — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/authors.html b/authors.html new file mode 100644 index 0000000..fc7f2fe --- /dev/null +++ b/authors.html @@ -0,0 +1,114 @@ + + + + + + + + Contributors — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Contributors

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/changelog.html b/changelog.html new file mode 100644 index 0000000..83c4ff9 --- /dev/null +++ b/changelog.html @@ -0,0 +1,122 @@ + + + + + + + + Changelog — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Changelog

+
+

Version 0.1 (development)

+
    +
  • Feature A added

  • +
  • FIX: nasty bug #1729 fixed

  • +
  • add your changes here!

  • +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/contributing.html b/contributing.html new file mode 100644 index 0000000..2d90099 --- /dev/null +++ b/contributing.html @@ -0,0 +1,352 @@ + + + + + + + + Contributing — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Contributing

+

Welcome to dolomite-matrix contributor’s guide.

+

This document focuses on getting any potential contributor familiarized with +the development processes, but other kinds of contributions are also appreciated.

+

If you are new to using git or have never collaborated in a project previously, +please have a look at contribution-guide.org. Other resources are also +listed in the excellent guide created by FreeCodeCamp [1].

+

Please notice, all users and contributors are expected to be open, +considerate, reasonable, and respectful. When in doubt, +Python Software Foundation’s Code of Conduct is a good reference in terms of +behavior guidelines.

+
+

Issue Reports

+

If you experience bugs or general issues with dolomite-matrix, please have a look +on the issue tracker. +If you don’t see anything useful there, please feel free to fire an issue report.

+
+

Tip

+

Please don’t forget to include the closed issues in your search. +Sometimes a solution was already reported, and the problem is considered +solved.

+
+

New issue reports should include information about your programming environment +(e.g., operating system, Python version) and steps to reproduce the problem. +Please try also to simplify the reproduction steps to a very minimal example +that still illustrates the problem you are facing. By removing other factors, +you help us to identify the root cause of the issue.

+
+
+

Documentation Improvements

+

You can help improve dolomite-matrix docs by making them more readable and coherent, or +by adding missing information and correcting mistakes.

+

dolomite-matrix documentation uses Sphinx as its main documentation compiler. +This means that the docs are kept in the same repository as the project code, and +that any documentation update is done in the same way was a code contribution.

+

When working on documentation changes in your local machine, you can +compile them using tox :

+
tox -e docs
+
+
+

and use Python’s built-in web server for a preview in your web browser +(http://localhost:8000):

+
python3 -m http.server --directory 'docs/_build/html'
+
+
+
+
+

Code Contributions

+
+

Submit an issue

+

Before you work on any non-trivial code contribution it’s best to first create +a report in the issue tracker to start a discussion on the subject. +This often provides additional considerations and avoids unnecessary work.

+
+
+

Create an environment

+

Before you start coding, we recommend creating an isolated virtual environment +to avoid any problems with your installed Python packages. +This can easily be done via either virtualenv:

+
virtualenv <PATH TO VENV>
+source <PATH TO VENV>/bin/activate
+
+
+

or Miniconda:

+
conda create -n dolomite-matrix python=3 six virtualenv pytest pytest-cov
+conda activate dolomite-matrix
+
+
+
+
+

Clone the repository

+
    +
  1. Create an user account on GitHub if you do not already have one.

  2. +
  3. Fork the project repository: click on the Fork button near the top of the +page. This creates a copy of the code under your account on GitHub.

  4. +
  5. Clone this copy to your local disk:

    +
    git clone git@github.com:YourLogin/dolomite-matrix.git
    +cd dolomite-matrix
    +
    +
    +
  6. +
  7. You should run:

    +
    pip install -U pip setuptools -e .
    +
    +
    +

    to be able to import the package under development in the Python REPL.

    +
  8. +
  9. Install pre-commit:

    +
    pip install pre-commit
    +pre-commit install
    +
    +
    +

    dolomite-matrix comes with a lot of hooks configured to automatically help the +developer to check the code being written.

    +
  10. +
+
+
+

Implement your changes

+
    +
  1. Create a branch to hold your changes:

    +
    git checkout -b my-feature
    +
    +
    +

    and start making changes. Never work on the main branch!

    +
  2. +
  3. Start your work on this branch. Don’t forget to add docstrings to new +functions, modules and classes, especially if they are part of public APIs.

  4. +
  5. Add yourself to the list of contributors in AUTHORS.rst.

  6. +
  7. When you’re done editing, do:

    +
    git add <MODIFIED FILES>
    +git commit
    +
    +
    +

    to record your changes in git.

    +

    Please make sure to see the validation messages from pre-commit and fix +any eventual issues. +This should automatically use flake8/black to check/fix the code style +in a way that is compatible with the project.

    +
    +

    Important

    +

    Don’t forget to add unit tests and documentation in case your +contribution adds an additional feature and is not just a bugfix.

    +

    Moreover, writing a descriptive commit message is highly recommended. +In case of doubt, you can check the commit history with:

    +
    git log --graph --decorate --pretty=oneline --abbrev-commit --all
    +
    +
    +

    to look for recurring communication patterns.

    +
    +
  8. +
  9. Please check that your changes don’t break any unit tests with:

    +
    tox
    +
    +
    +

    (after having installed tox with pip install tox or pipx).

    +

    You can also use tox to run several other pre-configured tasks in the +repository. Try tox -av to see a list of the available checks.

    +
  10. +
+
+
+

Submit your contribution

+
    +
  1. If everything works fine, push your local branch to the remote server with:

    +
    git push -u origin my-feature
    +
    +
    +
  2. +
  3. Go to the web page of your fork and click “Create pull request” +to send your changes for review.

    +
  4. +
+
+
+

Troubleshooting

+

The following tips can be used when facing problems to build or test the +package:

+
    +
  1. Make sure to fetch all the tags from the upstream repository. +The command git describe --abbrev=0 --tags should return the version you +are expecting. If you are trying to run CI scripts in a fork repository, +make sure to push all the tags. +You can also try to remove all the egg files or the complete egg folder, i.e., +.eggs, as well as the *.egg-info folders in the src folder or +potentially in the root of your project.

  2. +
  3. Sometimes tox misses out when new dependencies are added, especially to +setup.cfg and docs/requirements.txt. If you find any problems with +missing dependencies when running a command with tox, try to recreate the +tox environment using the -r flag. For example, instead of:

    +
    tox -e docs
    +
    +
    +

    Try running:

    +
    tox -r -e docs
    +
    +
    +
  4. +
  5. Make sure to have a reliable tox installation that uses the correct +Python version (e.g., 3.7+). When in doubt you can run:

    +
    tox --version
    +# OR
    +which tox
    +
    +
    +

    If you have trouble and are seeing weird errors upon running tox, you can +also try to create a dedicated virtual environment with a tox binary +freshly installed. For example:

    +
    virtualenv .venv
    +source .venv/bin/activate
    +.venv/bin/pip install tox
    +.venv/bin/tox -e all
    +
    +
    +
  6. +
  7. Pytest can drop you in an interactive session in the case an error occurs. +In order to do that you need to pass a --pdb option (for example by +running tox -- -k <NAME OF THE FALLING TEST> --pdb). +You can also setup breakpoints manually instead of using the --pdb option.

  8. +
+
+
+
+

Maintainer tasks

+
+

Releases

+

If you are part of the group of maintainers and have correct user permissions +on PyPI, the following steps can be used to release a new version for +dolomite-matrix:

+
    +
  1. Make sure all unit tests are successful.

  2. +
  3. Tag the current commit on the main branch with a release tag, e.g., v1.2.3.

  4. +
  5. Push the new tag to the upstream repository, +e.g., git push upstream v1.2.3

  6. +
  7. Clean up the dist and build folders with tox -e clean +(or rm -rf dist build) +to avoid confusion with old builds and Sphinx docs.

  8. +
  9. Run tox -e build and check that the files in dist have +the correct version (no .dirty or git hash) according to the git tag. +Also check the sizes of the distributions, if they are too big (e.g., > +500KB), unwanted clutter may have been accidentally included.

  10. +
  11. Run tox -e publish -- --repository pypi and check that everything was +uploaded to PyPI correctly.

  12. +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..1daa645 --- /dev/null +++ b/genindex.html @@ -0,0 +1,203 @@ + + + + + + + Index — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ C + | D + | L + | M + | S + +
+

C

+ + +
+ +

D

+ + + +
    +
  • + dolomite_matrix + +
  • +
  • + dolomite_matrix.choose_dense_chunk_sizes + +
  • +
  • + dolomite_matrix.load_hdf5_dense_array + +
  • +
    +
  • + dolomite_matrix.stage_DelayedArray + +
  • +
  • + dolomite_matrix.stage_ndarray + +
  • +
+ +

L

+ + +
+ +

M

+ + +
+ +

S

+ + + +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..b404842 --- /dev/null +++ b/index.html @@ -0,0 +1,157 @@ + + + + + + + + dolomite-matrix — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

dolomite-matrix

+

Add a short description here!

+
+

Note

+
+

This is the main page of your project’s Sphinx documentation. It is +formatted in Markdown. Add additional pages by creating md-files in +docs or rst-files (formatted in reStructuredText) and adding links to +them in the Contents section below.

+

Please check Sphinx and MyST for more information +about how to document your project and how to configure your preferences.

+
+
+
+

Contents

+ +
+
+

Indices and tables

+ +
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/license.html b/license.html new file mode 100644 index 0000000..4c2b591 --- /dev/null +++ b/license.html @@ -0,0 +1,134 @@ + + + + + + + + License — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

License

+
The MIT License (MIT)
+
+Copyright (c) 2023 LTLA
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..364a4d06e1ba60e5a0776bfff305a9eb59723c89 GIT binary patch literal 471 zcmV;|0Vw_>AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkpZ)|UE zX>?^RZDDkBX?O}FAXa5^b7^mGIv_AEFfMR!b96B-WMy_SD`#Y5H8VD1W(p%9RA^-& za%F8{X>Md?av*PJAarPHb0B7EY-J#6b0A}HZE$jBb8}^6Aa!$TZf78RY-wUH3V7PJ zQ_W6N)(9ZJf^~|L(<3N^5?r)MUv@P@}udwL4p7q=EK0t-#JsRjy-u_ARW6PD4(>hxT ze^@uU9ee+@=UlHg%@WuLU4BYm)VSPSV*UyK8yKhYJU9+T-evTYxa*5>LKLDpF@LYDXN2(3_g3}M87 NrulZb6K|AZ2$6co*_Z$T literal 0 HcmV?d00001 diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 0000000..8af82c0 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,141 @@ + + + + + + + Python Module Index — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ d +
+ + + + + + + + + + + + + + + + + + + +
 
+ d
+ dolomite_matrix +
    + dolomite_matrix.choose_dense_chunk_sizes +
    + dolomite_matrix.load_hdf5_dense_array +
    + dolomite_matrix.stage_DelayedArray +
    + dolomite_matrix.stage_ndarray +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/readme.html b/readme.html new file mode 100644 index 0000000..0a11a71 --- /dev/null +++ b/readme.html @@ -0,0 +1,136 @@ + + + + + + + + dolomite-matrix — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Project generated with PyScaffold

+
+

dolomite-matrix

+
+

Add a short description here!

+
+

A longer description of your project goes here…

+ +
+

Note

+

This project has been set up using PyScaffold 4.5. For details and usage +information on PyScaffold see https://pyscaffold.org/.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 0000000..7a9374c --- /dev/null +++ b/search.html @@ -0,0 +1,125 @@ + + + + + + + Search — dolomite-matrix 0.0.post1.dev1+gdc536bf documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..dca87dc --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api/dolomite_matrix", "api/modules", "authors", "changelog", "contributing", "index", "license", "readme"], "filenames": ["api/dolomite_matrix.rst", "api/modules.rst", "authors.md", "changelog.md", "contributing.md", "index.md", "license.md", "readme.md"], "titles": ["dolomite_matrix package", "dolomite_matrix", "Contributors", "Changelog", "Contributing", "dolomite-matrix", "License", "dolomite-matrix"], "terms": {"shape": 0, "tupl": 0, "int": 0, "size": [0, 4], "min_ext": 0, "100": 0, "memori": 0, "10000000": 0, "0": [0, 4, 5], "sourc": [0, 4], "chosen": 0, "some": 0, "chunk": 0, "us": [0, 4, 6, 7], "dens": 0, "hdf5": 0, "dataset": 0, "For": [0, 4, 7], "each": 0, "dimens": 0, "we": [0, 4], "consid": [0, 4], "slice": 0, "arrai": 0, "consist": 0, "full": 0, "extent": 0, "all": [0, 4, 6], "other": [0, 4, 6], "want": [0, 4, 7], "thi": [0, 4, 5, 6, 7], "occupi": 0, "less": 0, "than": 0, "resiz": 0, "along": 0, "current": [0, 4], "achiev": 0, "The": [0, 4, 6], "i": [0, 4, 5, 6], "defin": 0, "ensur": 0, "effici": 0, "iter": 0, "ani": [0, 4, 6], "more": [0, 4, 5], "byte": 0, "paramet": 0, "element": 0, "minimum": 0, "avoid": [0, 4], "problem": [0, 4], "excess": 0, "small": 0, "when": [0, 4], "data": 0, "larg": 0, "conceptu": 0, "buffer": 0, "store": 0, "block": 0, "dure": 0, "through": 0, "return": [0, 4], "contain": 0, "meta": 0, "dict": 0, "str": 0, "project": [0, 4, 5, 7], "kwarg": 0, "hdf5densearrai": 0, "load": 0, "back": 0, "In": [0, 4], "gener": [0, 4], "function": [0, 4], "should": [0, 4], "call": 0, "via": [0, 4], "load_object": 0, "metadata": 0, "valu": 0, "specifi": 0, "interest": [0, 4], "most": 0, "typic": 0, "string": 0, "file": [0, 4, 5, 6], "path": [0, 4], "stage": 0, "directori": [0, 4], "mai": [0, 4], "also": [0, 4], "an": [0, 6], "applic": 0, "specif": [0, 4], "object": 0, "work": [0, 4], "acquire_fil": 0, "further": 0, "argument": 0, "ignor": 0, "A": [0, 3, 6, 7], "x": 0, "delayedarrai": 0, "dir": 0, "is_child": 0, "bool": 0, "fals": 0, "none": 0, "cache_s": 0, "100000000": 0, "block_siz": 0, "method": [0, 4], "save": 0, "ndarrai": 0, "see": [0, 4, 7], "stage_object": 0, "detail": [0, 4, 7], "rel": 0, "insid": 0, "child": 0, "anoth": 0, "If": [0, 4], "provid": [0, 4, 6], "choos": 0, "py": 0, "meth": 0, "cach": 0, "larger": 0, "improv": [0, 5], "speed": 0, "cost": 0, "perform": 0, "over": 0, "extract": 0, "one": [0, 4], "time": 0, "can": [0, 4], "edit": [0, 4], "write_metadata": 0, "packag": [1, 4, 5], "submodul": 1, "choose_dense_chunk_s": 1, "modul": [1, 4, 5], "load_hdf5_dense_arrai": 1, "stage_delayedarrai": 1, "stage_ndarrai": 1, "content": [1, 4], "aaron": 2, "lun": 2, "infinit": 2, "monkei": 2, "keyboard": 2, "gmail": 2, "com": [2, 4, 7], "featur": [3, 4], "ad": [3, 4, 5], "fix": [3, 4], "nasti": 3, "bug": [3, 4], "1729": 3, "add": [3, 4, 5, 7], "your": [3, 5, 7], "chang": 3, "here": [3, 5, 7], "suppos": 4, "TO": [4, 6], "BE": [4, 6], "exampl": [4, 7], "modifi": [4, 6], "IT": 4, "accord": 4, "need": 4, "assum": 4, "you": [4, 7], "ar": [4, 7], "servic": 4, "promot": 4, "model": 4, "similar": 4, "github": [4, 7], "": [4, 5], "fork": 4, "pull": 4, "request": 4, "workflow": 4, "while": 4, "true": 4, "major": 4, "like": 4, "gitlab": 4, "bitbucket": 4, "might": [4, 7], "case": 4, "privat": 4, "e": 4, "g": 4, "gerrit": 4, "notic": [4, 6], "refer": [4, 5], "url": [4, 7], "text": 4, "terminologi": 4, "instead": 4, "merg": [4, 6], "pleas": [4, 5, 7], "make": 4, "sure": 4, "check": [4, 5], "have": 4, "assumpt": 4, "mind": 4, "updat": [4, 7], "thing": 4, "accordingli": [4, 7], "correct": 4, "link": [4, 5], "replac": 4, "bottom": 4, "look": 4, "pyscaffold": [4, 7], "contributor": 4, "guid": 4, "especi": 4, "open": 4, "veri": 4, "templat": 4, "few": 4, "extra": 4, "decid": 4, "includ": [4, 6], "mention": 4, "label": [4, 7], "tracker": 4, "autom": 4, "welcom": 4, "dolomit": 4, "matrix": 4, "focus": 4, "get": 4, "potenti": 4, "familiar": 4, "develop": [4, 5], "process": 4, "kind": [4, 6], "appreci": 4, "new": 4, "git": 4, "never": 4, "collabor": 4, "previous": 4, "org": [4, 7], "resourc": 4, "list": 4, "excel": 4, "freecodecamp": 4, "1": [4, 5], "user": 4, "expect": 4, "consider": 4, "reason": 4, "respect": 4, "doubt": 4, "python": 4, "softwar": [4, 6], "foundat": 4, "conduct": 4, "good": 4, "term": 4, "behavior": 4, "guidelin": 4, "experi": 4, "don": 4, "t": 4, "anyth": 4, "feel": 4, "free": [4, 6], "fire": 4, "forget": 4, "close": 4, "search": [4, 5], "sometim": 4, "solut": 4, "wa": 4, "alreadi": 4, "solv": 4, "inform": [4, 5, 7], "about": [4, 5], "program": 4, "oper": 4, "system": 4, "version": [4, 5, 7], "step": 4, "reproduc": 4, "try": 4, "simplifi": 4, "reproduct": 4, "minim": 4, "still": 4, "illustr": 4, "face": 4, "By": 4, "remov": 4, "factor": 4, "help": [4, 5], "u": 4, "identifi": 4, "root": 4, "caus": 4, "doc": [4, 5], "them": [4, 5], "readabl": 4, "coher": 4, "miss": 4, "mistak": 4, "sphinx": [4, 5], "its": 4, "main": [4, 5, 7], "compil": 4, "mean": 4, "kept": 4, "same": 4, "done": 4, "wai": 4, "which": 4, "markup": 4, "languag": 4, "restructuredtext": [4, 5], "commonmark": 4, "myst": [4, 5], "extens": 4, "host": 4, "follow": [4, 6], "tip": 4, "web": 4, "interfac": 4, "quick": 4, "propos": 4, "mechan": 4, "tricki": 4, "normal": 4, "perfectli": 4, "fine": 4, "quit": 4, "handi": 4, "out": [4, 6], "navig": 4, "folder": 4, "find": 4, "would": 4, "click": 4, "littl": 4, "pencil": 4, "icon": 4, "top": 4, "editor": 4, "onc": 4, "finish": 4, "write": 4, "messag": 4, "form": 4, "page": [4, 5], "describ": 4, "made": 4, "what": 4, "motiv": 4, "behind": 4, "local": 4, "machin": 4, "tox": 4, "built": [4, 7], "server": [4, 7], "preview": 4, "browser": 4, "http": [4, 7], "localhost": 4, "8000": 4, "python3": 4, "m": 4, "_build": 4, "html": 4, "explan": 4, "intern": 4, "architectur": 4, "descript": [4, 5, 7], "design": 4, "principl": 4, "least": 4, "summari": 4, "concept": 4, "easi": 4, "start": 4, "quickli": 4, "befor": 4, "non": 4, "trivial": 4, "best": 4, "first": 4, "discuss": 4, "subject": [4, 6], "often": 4, "addit": [4, 5], "unnecessari": 4, "recommend": 4, "isol": 4, "virtual": 4, "instal": 4, "easili": 4, "either": 4, "virtualenv": 4, "venv": 4, "bin": 4, "activ": 4, "miniconda": 4, "conda": [4, 7], "n": 4, "3": 4, "six": 4, "pytest": 4, "cov": 4, "account": 4, "do": [4, 6], "button": 4, "copi": [4, 6], "under": 4, "disk": 4, "yourlogin": 4, "cd": 4, "run": 4, "pip": 4, "setuptool": 4, "abl": 4, "import": 4, "repl": 4, "pre": 4, "commit": 4, "item": 4, "come": 4, "lot": 4, "hook": 4, "configur": [4, 5], "automat": 4, "being": 4, "written": 4, "branch": [4, 7], "hold": 4, "checkout": 4, "b": 4, "my": 4, "docstr": 4, "class": 4, "thei": 4, "part": 4, "public": 4, "api": [4, 7], "yourself": 4, "author": [4, 5, 6], "rst": [4, 5], "re": 4, "record": 4, "valid": 4, "from": [4, 6], "eventu": 4, "flake8": 4, "black": 4, "style": [4, 7], "compat": 4, "unit": 4, "test": 4, "just": 4, "bugfix": 4, "moreov": 4, "highli": 4, "histori": 4, "log": 4, "graph": 4, "decor": 4, "pretti": 4, "onelin": 4, "abbrev": 4, "recur": 4, "commun": 4, "pattern": 4, "break": 4, "after": 4, "pipx": 4, "sever": 4, "av": 4, "avail": 4, "everyth": 4, "push": 4, "remot": 4, "origin": 4, "go": 4, "send": 4, "review": 4, "uncom": 4, "paragraph": 4, "pr": 4, "draft": 4, "mark": 4, "readi": 4, "feedback": 4, "continu": 4, "integr": 4, "ci": [4, 7], "requir": 4, "build": 4, "fetch": 4, "tag": 4, "upstream": 4, "command": 4, "script": 4, "egg": 4, "complet": 4, "well": 4, "info": 4, "src": 4, "depend": 4, "setup": 4, "cfg": 4, "txt": 4, "recreat": 4, "r": [4, 7], "flag": 4, "reliabl": 4, "7": 4, "OR": [4, 6], "troubl": 4, "weird": 4, "error": 4, "upon": 4, "dedic": 4, "binari": 4, "freshli": 4, "drop": 4, "interact": 4, "session": 4, "occur": 4, "order": 4, "pass": 4, "pdb": 4, "option": 4, "k": 4, "name": 4, "OF": [4, 6], "THE": [4, 6], "fall": 4, "breakpoint": 4, "manual": 4, "section": [4, 5], "pypi": [4, 7], "publicli": 4, "differ": 4, "index": [4, 5], "instruct": 4, "group": 4, "permiss": [4, 6], "success": 4, "v1": 4, "2": 4, "clean": 4, "up": [4, 7], "dist": 4, "rm": 4, "rf": 4, "confus": 4, "old": 4, "dirti": 4, "hash": 4, "distribut": [4, 6], "too": 4, "big": 4, "500kb": 4, "unwant": 4, "clutter": 4, "been": [4, 7], "accident": 4, "publish": [4, 6], "upload": 4, "correctli": 4, "definit": 4, "even": 4, "though": 4, "focu": 4, "idea": 4, "collect": 4, "appli": 4, "sort": 4, "compani": 4, "proprietari": 4, "base": 4, "short": [5, 7], "document": [5, 6], "It": 5, "format": 5, "markdown": 5, "creat": 5, "md": 5, "below": 5, "how": 5, "prefer": 5, "overview": 5, "contribut": 5, "issu": 5, "report": 5, "code": 5, "maintain": 5, "task": 5, "licens": 5, "changelog": 5, "dolomite_matrix": 5, "mit": 6, "copyright": 6, "c": 6, "2023": 6, "ltla": 6, "herebi": 6, "grant": 6, "charg": 6, "person": 6, "obtain": 6, "associ": 6, "deal": 6, "without": 6, "restrict": 6, "limit": 6, "right": 6, "sublicens": 6, "sell": 6, "permit": 6, "whom": 6, "furnish": 6, "so": 6, "condit": 6, "abov": 6, "shall": 6, "substanti": 6, "portion": 6, "AS": 6, "warranti": 6, "express": 6, "impli": 6, "BUT": 6, "NOT": 6, "merchant": 6, "fit": 6, "FOR": 6, "particular": 6, "purpos": 6, "AND": 6, "noninfring": 6, "IN": 6, "NO": 6, "event": 6, "holder": 6, "liabl": 6, "claim": 6, "damag": 6, "liabil": 6, "whether": 6, "action": 6, "contract": 6, "tort": 6, "otherwis": 6, "aris": 6, "connect": 6, "WITH": 6, "These": 7, "badg": 7, "readm": 7, "statu": 7, "cirru": 7, "svg": 7, "readthedoc": 7, "latest": 7, "io": 7, "en": 7, "stabl": 7, "coveral": 7, "img": 7, "shield": 7, "v": 7, "forg": 7, "vn": 7, "anaconda": 7, "monthli": 7, "download": 7, "pepi": 7, "tech": 7, "month": 7, "twitter": 7, "social": 7, "longer": 7, "goe": 7, "ha": 7, "set": 7, "4": 7, "5": 7, "usag": 7}, "objects": {"": [[0, 0, 0, "-", "dolomite_matrix"]], "dolomite_matrix": [[0, 0, 0, "-", "choose_dense_chunk_sizes"], [0, 0, 0, "-", "load_hdf5_dense_array"], [0, 0, 0, "-", "stage_DelayedArray"], [0, 0, 0, "-", "stage_ndarray"]], "dolomite_matrix.choose_dense_chunk_sizes": [[0, 1, 1, "", "choose_dense_chunk_sizes"]], "dolomite_matrix.load_hdf5_dense_array": [[0, 1, 1, "", "load_hdf5_dense_array"]], "dolomite_matrix.stage_DelayedArray": [[0, 1, 1, "", "stage_DelayedArray"]], "dolomite_matrix.stage_ndarray": [[0, 1, 1, "", "stage_ndarray"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"dolomite_matrix": [0, 1], "packag": 0, "submodul": 0, "choose_dense_chunk_s": 0, "modul": 0, "load_hdf5_dense_arrai": 0, "stage_delayedarrai": 0, "stage_ndarrai": 0, "content": [0, 5], "contributor": 2, "changelog": 3, "version": 3, "0": 3, "1": 3, "develop": 3, "todo": 4, "contribut": 4, "issu": 4, "report": 4, "document": 4, "improv": 4, "code": 4, "submit": 4, "an": 4, "creat": 4, "environ": 4, "clone": 4, "repositori": 4, "implement": 4, "your": 4, "chang": 4, "troubleshoot": 4, "maintain": 4, "task": 4, "releas": 4, "dolomit": [5, 7], "matrix": [5, 7], "note": [5, 7], "indic": 5, "tabl": 5, "licens": 6}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"dolomite_matrix package": [[0, "dolomite-matrix-package"]], "Submodules": [[0, "submodules"]], "dolomite_matrix.choose_dense_chunk_sizes module": [[0, "module-dolomite_matrix.choose_dense_chunk_sizes"]], "dolomite_matrix.load_hdf5_dense_array module": [[0, "module-dolomite_matrix.load_hdf5_dense_array"]], "dolomite_matrix.stage_DelayedArray module": [[0, "module-dolomite_matrix.stage_DelayedArray"]], "dolomite_matrix.stage_ndarray module": [[0, "module-dolomite_matrix.stage_ndarray"]], "Module contents": [[0, "module-dolomite_matrix"]], "dolomite_matrix": [[1, "dolomite-matrix"]], "Contributors": [[2, "contributors"]], "Changelog": [[3, "changelog"]], "Version 0.1 (development)": [[3, "version-0-1-development"]], "Todo": [[4, "id1"], [4, "id2"], [4, "id3"], [4, "id5"], [4, "id6"], [4, "id7"], [4, "id8"], [4, "id9"], [4, "id10"], [4, "id11"], [4, "id12"]], "Contributing": [[4, "contributing"]], "Issue Reports": [[4, "issue-reports"]], "Documentation Improvements": [[4, "documentation-improvements"]], "Code Contributions": [[4, "code-contributions"]], "Submit an issue": [[4, "submit-an-issue"]], "Create an environment": [[4, "create-an-environment"]], "Clone the repository": [[4, "clone-the-repository"]], "Implement your changes": [[4, "implement-your-changes"]], "Submit your contribution": [[4, "submit-your-contribution"]], "Troubleshooting": [[4, "troubleshooting"]], "Maintainer tasks": [[4, "maintainer-tasks"]], "Releases": [[4, "releases"]], "dolomite-matrix": [[5, "dolomite-matrix"], [7, "dolomite-matrix"]], "Note": [[5, "note"], [7, "note"]], "Contents": [[5, "contents"]], "Indices and tables": [[5, "indices-and-tables"]], "License": [[6, "license"]]}, "indexentries": {"choose_dense_chunk_sizes() (in module dolomite_matrix.choose_dense_chunk_sizes)": [[0, "dolomite_matrix.choose_dense_chunk_sizes.choose_dense_chunk_sizes"]], "dolomite_matrix": [[0, "module-dolomite_matrix"]], "dolomite_matrix.choose_dense_chunk_sizes": [[0, "module-dolomite_matrix.choose_dense_chunk_sizes"]], "dolomite_matrix.load_hdf5_dense_array": [[0, "module-dolomite_matrix.load_hdf5_dense_array"]], "dolomite_matrix.stage_delayedarray": [[0, "module-dolomite_matrix.stage_DelayedArray"]], "dolomite_matrix.stage_ndarray": [[0, "module-dolomite_matrix.stage_ndarray"]], "load_hdf5_dense_array() (in module dolomite_matrix.load_hdf5_dense_array)": [[0, "dolomite_matrix.load_hdf5_dense_array.load_hdf5_dense_array"]], "module": [[0, "module-dolomite_matrix"], [0, "module-dolomite_matrix.choose_dense_chunk_sizes"], [0, "module-dolomite_matrix.load_hdf5_dense_array"], [0, "module-dolomite_matrix.stage_DelayedArray"], [0, "module-dolomite_matrix.stage_ndarray"]], "stage_delayedarray() (in module dolomite_matrix.stage_delayedarray)": [[0, "dolomite_matrix.stage_DelayedArray.stage_DelayedArray"]], "stage_ndarray() (in module dolomite_matrix.stage_ndarray)": [[0, "dolomite_matrix.stage_ndarray.stage_ndarray"]]}}) \ No newline at end of file